{
  "id": "e3a54f139dd895a14e6a2c35e646bbae",
  "_format": "hh-sol-build-info-1",
  "solcVersion": "0.6.12",
  "solcLongVersion": "0.6.12+commit.27d51765",
  "input": {
    "language": "Solidity",
    "sources": {
      "contracts/builders/ControlledTokenBuilder.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\npragma experimental ABIEncoderV2;\n\nimport \"../token/ControlledTokenProxyFactory.sol\";\nimport \"../token/TicketProxyFactory.sol\";\n\n/* solium-disable security/no-block-members */\ncontract ControlledTokenBuilder {\n\n  event CreatedControlledToken(address indexed token);\n  event CreatedTicket(address indexed token);\n\n  ControlledTokenProxyFactory public controlledTokenProxyFactory;\n  TicketProxyFactory public ticketProxyFactory;\n\n  struct ControlledTokenConfig {\n    string name;\n    string symbol;\n    uint8 decimals;\n    TokenControllerInterface controller;\n  }\n\n  constructor (\n    ControlledTokenProxyFactory _controlledTokenProxyFactory,\n    TicketProxyFactory _ticketProxyFactory\n  ) public {\n    require(address(_controlledTokenProxyFactory) != address(0), \"ControlledTokenBuilder/controlledTokenProxyFactory-not-zero\");\n    require(address(_ticketProxyFactory) != address(0), \"ControlledTokenBuilder/ticketProxyFactory-not-zero\");\n    controlledTokenProxyFactory = _controlledTokenProxyFactory;\n    ticketProxyFactory = _ticketProxyFactory;\n  }\n\n  function createControlledToken(\n    ControlledTokenConfig calldata config\n  ) external returns (ControlledToken) {\n    ControlledToken token = controlledTokenProxyFactory.create();\n\n    token.initialize(\n      config.name,\n      config.symbol,\n      config.decimals,\n      config.controller\n    );\n\n    emit CreatedControlledToken(address(token));\n\n    return token;\n  }\n\n  function createTicket(\n    ControlledTokenConfig calldata config\n  ) external returns (Ticket) {\n    Ticket token = ticketProxyFactory.create();\n\n    token.initialize(\n      config.name,\n      config.symbol,\n      config.decimals,\n      config.controller\n    );\n\n    emit CreatedTicket(address(token));\n\n    return token;\n  }\n}\n"
      },
      "contracts/token/ControlledTokenProxyFactory.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"./ControlledToken.sol\";\nimport \"../external/openzeppelin/ProxyFactory.sol\";\n\n/// @title Controlled ERC20 Token Factory\n/// @notice Minimal proxy pattern for creating new Controlled ERC20 Tokens\ncontract ControlledTokenProxyFactory is ProxyFactory {\n\n  /// @notice Contract template for deploying proxied tokens\n  ControlledToken public instance;\n\n  /// @notice Initializes the Factory with an instance of the Controlled ERC20 Token\n  constructor () public {\n    instance = new ControlledToken();\n  }\n\n  /// @notice Creates a new Controlled ERC20 Token as a proxy of the template instance\n  /// @return A reference to the new proxied Controlled ERC20 Token\n  function create() external returns (ControlledToken) {\n    return ControlledToken(deployMinimal(address(instance), \"\"));\n  }\n}\n"
      },
      "contracts/token/TicketProxyFactory.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\";\n\nimport \"./Ticket.sol\";\nimport \"../external/openzeppelin/ProxyFactory.sol\";\n\n/// @title Controlled ERC20 Token Factory\n/// @notice Minimal proxy pattern for creating new Controlled ERC20 Tokens\ncontract TicketProxyFactory is ProxyFactory {\n\n  /// @notice Contract template for deploying proxied tokens\n  Ticket public instance;\n\n  /// @notice Initializes the Factory with an instance of the Controlled ERC20 Token\n  constructor () public {\n    instance = new Ticket();\n  }\n\n  /// @notice Creates a new Controlled ERC20 Token as a proxy of the template instance\n  /// @return A reference to the new proxied Controlled ERC20 Token\n  function create() external returns (Ticket) {\n    return Ticket(deployMinimal(address(instance), \"\"));\n  }\n}\n"
      },
      "contracts/token/ControlledToken.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\";\n\nimport \"./TokenControllerInterface.sol\";\nimport \"./ControlledTokenInterface.sol\";\n\n/// @title Controlled ERC20 Token\n/// @notice ERC20 Tokens with a controller for minting & burning\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\n\n  /// @dev Emitted when an instance is initialized\n  event Initialized(\n    string _name,\n    string _symbol,\n    uint8 _decimals,\n    TokenControllerInterface _controller\n  );\n\n  /// @notice Interface to the contract responsible for controlling mint/burn\n  TokenControllerInterface public override controller;\n\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\n  /// @param _name The name of the Token\n  /// @param _symbol The symbol for the Token\n  /// @param _decimals The number of decimals for the Token\n  /// @param _controller Address of the Controller contract for minting & burning\n  function initialize(\n    string memory _name,\n    string memory _symbol,\n    uint8 _decimals,\n    TokenControllerInterface _controller\n  )\n    public\n    virtual\n    initializer\n  {\n    require(address(_controller) != address(0), \"ControlledToken/controller-not-zero\");\n    __ERC20_init(_name, _symbol);\n    __ERC20Permit_init(\"PoolTogether ControlledToken\");\n    controller = _controller;\n    _setupDecimals(_decimals);\n\n    emit Initialized(\n      _name,\n      _symbol,\n      _decimals,\n      _controller\n    );\n  }\n\n  /// @notice Allows the controller to mint tokens for a user account\n  /// @dev May be overridden to provide more granular control over minting\n  /// @param _user Address of the receiver of the minted tokens\n  /// @param _amount Amount of tokens to mint\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\n    _mint(_user, _amount);\n  }\n\n  /// @notice Allows the controller to burn tokens from a user account\n  /// @dev May be overridden to provide more granular control over burning\n  /// @param _user Address of the holder account to burn tokens from\n  /// @param _amount Amount of tokens to burn\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\n    _burn(_user, _amount);\n  }\n\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\n  /// @dev May be overridden to provide more granular control over operator-burning\n  /// @param _operator Address of the operator performing the burn action via the controller contract\n  /// @param _user Address of the holder account to burn tokens from\n  /// @param _amount Amount of tokens to burn\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\n    if (_operator != _user) {\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \"ControlledToken/exceeds-allowance\");\n      _approve(_user, _operator, decreasedAllowance);\n    }\n    _burn(_user, _amount);\n  }\n\n  /// @dev Function modifier to ensure that the caller is the controller contract\n  modifier onlyController {\n    require(_msgSender() == address(controller), \"ControlledToken/only-controller\");\n    _;\n  }\n\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\n  /// This includes minting and burning.\n  /// May be overridden to provide more granular control over operator-burning\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\n  /// @param amount Amount of tokens being transferred\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\n    controller.beforeTokenTransfer(from, to, amount);\n  }\n}\n"
      },
      "contracts/external/openzeppelin/ProxyFactory.sol": {
        "content": "pragma solidity 0.6.12;\n\n// solium-disable security/no-inline-assembly\n// solium-disable security/no-low-level-calls\ncontract ProxyFactory {\n\n  event ProxyCreated(address proxy);\n\n  function deployMinimal(address _logic, bytes memory _data) public returns (address proxy) {\n    // Adapted from https://github.com/optionality/clone-factory/blob/32782f82dfc5a00d103a7e61a17a5dedbd1e8e9d/contracts/CloneFactory.sol\n    bytes20 targetBytes = bytes20(_logic);\n    assembly {\n      let clone := mload(0x40)\n      mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\n      mstore(add(clone, 0x14), targetBytes)\n      mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\n      proxy := create(0, clone, 0x37)\n    }\n\n    emit ProxyCreated(address(proxy));\n\n    if(_data.length > 0) {\n      (bool success,) = proxy.call(_data);\n      require(success, \"ProxyFactory/constructor-call-failed\");\n    }\n  }\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.5 <0.8.0;\n\nimport \"../token/ERC20/ERC20Upgradeable.sol\";\nimport \"./IERC20PermitUpgradeable.sol\";\nimport \"../cryptography/ECDSAUpgradeable.sol\";\nimport \"../utils/CountersUpgradeable.sol\";\nimport \"./EIP712Upgradeable.sol\";\nimport \"../proxy/Initializable.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\n    using CountersUpgradeable for CountersUpgradeable.Counter;\n\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\n\n    // solhint-disable-next-line var-name-mixedcase\n    bytes32 private _PERMIT_TYPEHASH;\n\n    /**\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n     *\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n     */\n    function __ERC20Permit_init(string memory name) internal initializer {\n        __Context_init_unchained();\n        __EIP712_init_unchained(name, \"1\");\n        __ERC20Permit_init_unchained(name);\n    }\n\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\n        _PERMIT_TYPEHASH = keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n    }\n\n    /**\n     * @dev See {IERC20Permit-permit}.\n     */\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\n        // solhint-disable-next-line not-rely-on-time\n        require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n        bytes32 structHash = keccak256(\n            abi.encode(\n                _PERMIT_TYPEHASH,\n                owner,\n                spender,\n                value,\n                _nonces[owner].current(),\n                deadline\n            )\n        );\n\n        bytes32 hash = _hashTypedDataV4(structHash);\n\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\n        require(signer == owner, \"ERC20Permit: invalid signature\");\n\n        _nonces[owner].increment();\n        _approve(owner, spender, value);\n    }\n\n    /**\n     * @dev See {IERC20Permit-nonces}.\n     */\n    function nonces(address owner) public view override returns (uint256) {\n        return _nonces[owner].current();\n    }\n\n    /**\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n     */\n    // solhint-disable-next-line func-name-mixedcase\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n        return _domainSeparatorV4();\n    }\n    uint256[49] private __gap;\n}\n"
      },
      "contracts/token/TokenControllerInterface.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity >=0.5.0 <0.7.0;\n\n/// @title Controlled ERC20 Token Interface\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\ninterface TokenControllerInterface {\n\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\n  /// This includes minting and burning.\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\n  /// @param amount Amount of tokens being transferred\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\n}\n"
      },
      "contracts/token/ControlledTokenInterface.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\n\nimport \"./TokenControllerInterface.sol\";\n\n/// @title Controlled ERC20 Token\n/// @notice ERC20 Tokens with a controller for minting & burning\ninterface ControlledTokenInterface is IERC20Upgradeable {\n\n  /// @notice Interface to the contract responsible for controlling mint/burn\n  function controller() external view returns (TokenControllerInterface);\n\n  /// @notice Allows the controller to mint tokens for a user account\n  /// @dev May be overridden to provide more granular control over minting\n  /// @param _user Address of the receiver of the minted tokens\n  /// @param _amount Amount of tokens to mint\n  function controllerMint(address _user, uint256 _amount) external;\n\n  /// @notice Allows the controller to burn tokens from a user account\n  /// @dev May be overridden to provide more granular control over burning\n  /// @param _user Address of the holder account to burn tokens from\n  /// @param _amount Amount of tokens to burn\n  function controllerBurn(address _user, uint256 _amount) external;\n\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\n  /// @dev May be overridden to provide more granular control over operator-burning\n  /// @param _operator Address of the operator performing the burn action via the controller contract\n  /// @param _user Address of the holder account to burn tokens from\n  /// @param _amount Amount of tokens to burn\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"../../utils/ContextUpgradeable.sol\";\nimport \"./IERC20Upgradeable.sol\";\nimport \"../../math/SafeMathUpgradeable.sol\";\nimport \"../../proxy/Initializable.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin guidelines: functions revert instead\n * of returning `false` on failure. This behavior is nonetheless conventional\n * and does not conflict with the expectations of ERC20 applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\n    using SafeMathUpgradeable for uint256;\n\n    mapping (address => uint256) private _balances;\n\n    mapping (address => mapping (address => uint256)) private _allowances;\n\n    uint256 private _totalSupply;\n\n    string private _name;\n    string private _symbol;\n    uint8 private _decimals;\n\n    /**\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\n     * a default value of 18.\n     *\n     * To select a different value for {decimals}, use {_setupDecimals}.\n     *\n     * All three of these values are immutable: they can only be set once during\n     * construction.\n     */\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\n        __Context_init_unchained();\n        __ERC20_init_unchained(name_, symbol_);\n    }\n\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\n        _name = name_;\n        _symbol = symbol_;\n        _decimals = 18;\n    }\n\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() public view virtual returns (string memory) {\n        return _name;\n    }\n\n    /**\n     * @dev Returns the symbol of the token, usually a shorter version of the\n     * name.\n     */\n    function symbol() public view virtual returns (string memory) {\n        return _symbol;\n    }\n\n    /**\n     * @dev Returns the number of decimals used to get its user representation.\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\n     *\n     * Tokens usually opt for a value of 18, imitating the relationship between\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\n     * called.\n     *\n     * NOTE: This information is only used for _display_ purposes: it in\n     * no way affects any of the arithmetic of the contract, including\n     * {IERC20-balanceOf} and {IERC20-transfer}.\n     */\n    function decimals() public view virtual returns (uint8) {\n        return _decimals;\n    }\n\n    /**\n     * @dev See {IERC20-totalSupply}.\n     */\n    function totalSupply() public view virtual override returns (uint256) {\n        return _totalSupply;\n    }\n\n    /**\n     * @dev See {IERC20-balanceOf}.\n     */\n    function balanceOf(address account) public view virtual override returns (uint256) {\n        return _balances[account];\n    }\n\n    /**\n     * @dev See {IERC20-transfer}.\n     *\n     * Requirements:\n     *\n     * - `recipient` cannot be the zero address.\n     * - the caller must have a balance of at least `amount`.\n     */\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n        _transfer(_msgSender(), recipient, amount);\n        return true;\n    }\n\n    /**\n     * @dev See {IERC20-allowance}.\n     */\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\n        return _allowances[owner][spender];\n    }\n\n    /**\n     * @dev See {IERC20-approve}.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     */\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\n        _approve(_msgSender(), spender, amount);\n        return true;\n    }\n\n    /**\n     * @dev See {IERC20-transferFrom}.\n     *\n     * Emits an {Approval} event indicating the updated allowance. This is not\n     * required by the EIP. See the note at the beginning of {ERC20}.\n     *\n     * Requirements:\n     *\n     * - `sender` and `recipient` cannot be the zero address.\n     * - `sender` must have a balance of at least `amount`.\n     * - the caller must have allowance for ``sender``'s tokens of at least\n     * `amount`.\n     */\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\n        _transfer(sender, recipient, amount);\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \"ERC20: transfer amount exceeds allowance\"));\n        return true;\n    }\n\n    /**\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\n     *\n     * This is an alternative to {approve} that can be used as a mitigation for\n     * problems described in {IERC20-approve}.\n     *\n     * Emits an {Approval} event indicating the updated allowance.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     */\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\n        return true;\n    }\n\n    /**\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\n     *\n     * This is an alternative to {approve} that can be used as a mitigation for\n     * problems described in {IERC20-approve}.\n     *\n     * Emits an {Approval} event indicating the updated allowance.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     * - `spender` must have allowance for the caller of at least\n     * `subtractedValue`.\n     */\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \"ERC20: decreased allowance below zero\"));\n        return true;\n    }\n\n    /**\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\n     *\n     * This is internal function is equivalent to {transfer}, and can be used to\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\n     *\n     * Emits a {Transfer} event.\n     *\n     * Requirements:\n     *\n     * - `sender` cannot be the zero address.\n     * - `recipient` cannot be the zero address.\n     * - `sender` must have a balance of at least `amount`.\n     */\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\n        require(sender != address(0), \"ERC20: transfer from the zero address\");\n        require(recipient != address(0), \"ERC20: transfer to the zero address\");\n\n        _beforeTokenTransfer(sender, recipient, amount);\n\n        _balances[sender] = _balances[sender].sub(amount, \"ERC20: transfer amount exceeds balance\");\n        _balances[recipient] = _balances[recipient].add(amount);\n        emit Transfer(sender, recipient, amount);\n    }\n\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n     * the total supply.\n     *\n     * Emits a {Transfer} event with `from` set to the zero address.\n     *\n     * Requirements:\n     *\n     * - `to` cannot be the zero address.\n     */\n    function _mint(address account, uint256 amount) internal virtual {\n        require(account != address(0), \"ERC20: mint to the zero address\");\n\n        _beforeTokenTransfer(address(0), account, amount);\n\n        _totalSupply = _totalSupply.add(amount);\n        _balances[account] = _balances[account].add(amount);\n        emit Transfer(address(0), account, amount);\n    }\n\n    /**\n     * @dev Destroys `amount` tokens from `account`, reducing the\n     * total supply.\n     *\n     * Emits a {Transfer} event with `to` set to the zero address.\n     *\n     * Requirements:\n     *\n     * - `account` cannot be the zero address.\n     * - `account` must have at least `amount` tokens.\n     */\n    function _burn(address account, uint256 amount) internal virtual {\n        require(account != address(0), \"ERC20: burn from the zero address\");\n\n        _beforeTokenTransfer(account, address(0), amount);\n\n        _balances[account] = _balances[account].sub(amount, \"ERC20: burn amount exceeds balance\");\n        _totalSupply = _totalSupply.sub(amount);\n        emit Transfer(account, address(0), amount);\n    }\n\n    /**\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n     *\n     * This internal function is equivalent to `approve`, and can be used to\n     * e.g. set automatic allowances for certain subsystems, etc.\n     *\n     * Emits an {Approval} event.\n     *\n     * Requirements:\n     *\n     * - `owner` cannot be the zero address.\n     * - `spender` cannot be the zero address.\n     */\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\n        require(owner != address(0), \"ERC20: approve from the zero address\");\n        require(spender != address(0), \"ERC20: approve to the zero address\");\n\n        _allowances[owner][spender] = amount;\n        emit Approval(owner, spender, amount);\n    }\n\n    /**\n     * @dev Sets {decimals} to a value other than the default one of 18.\n     *\n     * WARNING: This function should only be called from the constructor. Most\n     * applications that interact with token contracts will not expect\n     * {decimals} to ever change, and may work incorrectly if it does.\n     */\n    function _setupDecimals(uint8 decimals_) internal virtual {\n        _decimals = decimals_;\n    }\n\n    /**\n     * @dev Hook that is called before any transfer of tokens. This includes\n     * minting and burning.\n     *\n     * Calling conditions:\n     *\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n     * will be to transferred to `to`.\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n     * - `from` and `to` are never both zero.\n     *\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n     */\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\n    uint256[44] private __gap;\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20PermitUpgradeable {\n    /**\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\n     * given `owner`'s signed approval.\n     *\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n     * ordering also apply here.\n     *\n     * Emits an {Approval} event.\n     *\n     * Requirements:\n     *\n     * - `spender` cannot be the zero address.\n     * - `deadline` must be a timestamp in the future.\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n     * over the EIP712-formatted function arguments.\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\n     *\n     * For more information on the signature format, see the\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n     * section].\n     */\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\n\n    /**\n     * @dev Returns the current nonce for `owner`. This value must be\n     * included whenever a signature is generated for {permit}.\n     *\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\n     * prevents a signature from being used multiple times.\n     */\n    function nonces(address owner) external view returns (uint256);\n\n    /**\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\n     */\n    // solhint-disable-next-line func-name-mixedcase\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSAUpgradeable {\n    /**\n     * @dev Returns the address that signed a hashed message (`hash`) with\n     * `signature`. This address can then be used for verification purposes.\n     *\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n     * this function rejects them by requiring the `s` value to be in the lower\n     * half order, and the `v` value to be either 27 or 28.\n     *\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n     * verification to be secure: it is possible to craft signatures that\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n     * this is by receiving a hash of the original message (which may otherwise\n     * be too long), and then calling {toEthSignedMessageHash} on it.\n     */\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n        // Check the signature length\n        if (signature.length != 65) {\n            revert(\"ECDSA: invalid signature length\");\n        }\n\n        // Divide the signature in r, s and v variables\n        bytes32 r;\n        bytes32 s;\n        uint8 v;\n\n        // ecrecover takes the signature parameters, and the only way to get them\n        // currently is to use assembly.\n        // solhint-disable-next-line no-inline-assembly\n        assembly {\n            r := mload(add(signature, 0x20))\n            s := mload(add(signature, 0x40))\n            v := byte(0, mload(add(signature, 0x60)))\n        }\n\n        return recover(hash, v, r, s);\n    }\n\n    /**\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\n     * `r` and `s` signature fields separately.\n     */\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n        //\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n        // these malleable signatures as well.\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \"ECDSA: invalid signature 's' value\");\n        require(v == 27 || v == 28, \"ECDSA: invalid signature 'v' value\");\n\n        // If the signature is valid (and not malleable), return the signer address\n        address signer = ecrecover(hash, v, r, s);\n        require(signer != address(0), \"ECDSA: invalid signature\");\n\n        return signer;\n    }\n\n    /**\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n     * replicates the behavior of the\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\n     * JSON-RPC method.\n     *\n     * See {recover}.\n     */\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n        // 32 is the length in bytes of hash,\n        // enforced by the type signature above\n        return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n    }\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"../math/SafeMathUpgradeable.sol\";\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\n * directly accessed.\n */\nlibrary CountersUpgradeable {\n    using SafeMathUpgradeable for uint256;\n\n    struct Counter {\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\n        uint256 _value; // default: 0\n    }\n\n    function current(Counter storage counter) internal view returns (uint256) {\n        return counter._value;\n    }\n\n    function increment(Counter storage counter) internal {\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\n        counter._value += 1;\n    }\n\n    function decrement(Counter storage counter) internal {\n        counter._value = counter._value.sub(1);\n    }\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\nimport \"../proxy/Initializable.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * _Available since v3.4._\n */\nabstract contract EIP712Upgradeable is Initializable {\n    /* solhint-disable var-name-mixedcase */\n    bytes32 private _HASHED_NAME;\n    bytes32 private _HASHED_VERSION;\n    bytes32 private constant _TYPE_HASH = keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\");\n    /* solhint-enable var-name-mixedcase */\n\n    /**\n     * @dev Initializes the domain separator and parameter caches.\n     *\n     * The meaning of `name` and `version` is specified in\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n     *\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n     * - `version`: the current major version of the signing domain.\n     *\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n     * contract upgrade].\n     */\n    function __EIP712_init(string memory name, string memory version) internal initializer {\n        __EIP712_init_unchained(name, version);\n    }\n\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\n        bytes32 hashedName = keccak256(bytes(name));\n        bytes32 hashedVersion = keccak256(bytes(version));\n        _HASHED_NAME = hashedName;\n        _HASHED_VERSION = hashedVersion;\n    }\n\n    /**\n     * @dev Returns the domain separator for the current chain.\n     */\n    function _domainSeparatorV4() internal view returns (bytes32) {\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\n    }\n\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\n        return keccak256(\n            abi.encode(\n                typeHash,\n                name,\n                version,\n                _getChainId(),\n                address(this)\n            )\n        );\n    }\n\n    /**\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n     * function returns the hash of the fully encoded EIP712 message for this domain.\n     *\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n     *\n     * ```solidity\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n     *     keccak256(\"Mail(address to,string contents)\"),\n     *     mailTo,\n     *     keccak256(bytes(mailContents))\n     * )));\n     * address signer = ECDSA.recover(digest, signature);\n     * ```\n     */\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n        return keccak256(abi.encodePacked(\"\\x19\\x01\", _domainSeparatorV4(), structHash));\n    }\n\n    function _getChainId() private view returns (uint256 chainId) {\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\n        // solhint-disable-next-line no-inline-assembly\n        assembly {\n            chainId := chainid()\n        }\n    }\n\n    /**\n     * @dev The hash of the name parameter for the EIP712 domain.\n     *\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n     * are a concern.\n     */\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\n        return _HASHED_NAME;\n    }\n\n    /**\n     * @dev The hash of the version parameter for the EIP712 domain.\n     *\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n     * are a concern.\n     */\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\n        return _HASHED_VERSION;\n    }\n    uint256[50] private __gap;\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\n// solhint-disable-next-line compiler-version\npragma solidity >=0.4.24 <0.8.0;\n\nimport \"../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n */\nabstract contract Initializable {\n\n    /**\n     * @dev Indicates that the contract has been initialized.\n     */\n    bool private _initialized;\n\n    /**\n     * @dev Indicates that the contract is in the process of being initialized.\n     */\n    bool private _initializing;\n\n    /**\n     * @dev Modifier to protect an initializer function from being invoked twice.\n     */\n    modifier initializer() {\n        require(_initializing || _isConstructor() || !_initialized, \"Initializable: contract is already initialized\");\n\n        bool isTopLevelCall = !_initializing;\n        if (isTopLevelCall) {\n            _initializing = true;\n            _initialized = true;\n        }\n\n        _;\n\n        if (isTopLevelCall) {\n            _initializing = false;\n        }\n    }\n\n    /// @dev Returns true if and only if the function is running in the constructor\n    function _isConstructor() private view returns (bool) {\n        return !AddressUpgradeable.isContract(address(this));\n    }\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\nimport \"../proxy/Initializable.sol\";\n\n/*\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with GSN meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n    function __Context_init() internal initializer {\n        __Context_init_unchained();\n    }\n\n    function __Context_init_unchained() internal initializer {\n    }\n    function _msgSender() internal view virtual returns (address payable) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes memory) {\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\n        return msg.data;\n    }\n    uint256[50] private __gap;\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20Upgradeable {\n    /**\n     * @dev Returns the amount of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the amount of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address recipient, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\n     * allowance mechanism. `amount` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary SafeMathUpgradeable {\n    /**\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\n     *\n     * _Available since v3.4._\n     */\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n        uint256 c = a + b;\n        if (c < a) return (false, 0);\n        return (true, c);\n    }\n\n    /**\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\n     *\n     * _Available since v3.4._\n     */\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n        if (b > a) return (false, 0);\n        return (true, a - b);\n    }\n\n    /**\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n     *\n     * _Available since v3.4._\n     */\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n        // benefit is lost if 'b' is also tested.\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n        if (a == 0) return (true, 0);\n        uint256 c = a * b;\n        if (c / a != b) return (false, 0);\n        return (true, c);\n    }\n\n    /**\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\n     *\n     * _Available since v3.4._\n     */\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n        if (b == 0) return (false, 0);\n        return (true, a / b);\n    }\n\n    /**\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n     *\n     * _Available since v3.4._\n     */\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n        if (b == 0) return (false, 0);\n        return (true, a % b);\n    }\n\n    /**\n     * @dev Returns the addition of two unsigned integers, reverting on\n     * overflow.\n     *\n     * Counterpart to Solidity's `+` operator.\n     *\n     * Requirements:\n     *\n     * - Addition cannot overflow.\n     */\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\n        uint256 c = a + b;\n        require(c >= a, \"SafeMath: addition overflow\");\n        return c;\n    }\n\n    /**\n     * @dev Returns the subtraction of two unsigned integers, reverting on\n     * overflow (when the result is negative).\n     *\n     * Counterpart to Solidity's `-` operator.\n     *\n     * Requirements:\n     *\n     * - Subtraction cannot overflow.\n     */\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n        require(b <= a, \"SafeMath: subtraction overflow\");\n        return a - b;\n    }\n\n    /**\n     * @dev Returns the multiplication of two unsigned integers, reverting on\n     * overflow.\n     *\n     * Counterpart to Solidity's `*` operator.\n     *\n     * Requirements:\n     *\n     * - Multiplication cannot overflow.\n     */\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n        if (a == 0) return 0;\n        uint256 c = a * b;\n        require(c / a == b, \"SafeMath: multiplication overflow\");\n        return c;\n    }\n\n    /**\n     * @dev Returns the integer division of two unsigned integers, reverting on\n     * division by zero. The result is rounded towards zero.\n     *\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\n     * uses an invalid opcode to revert (consuming all remaining gas).\n     *\n     * Requirements:\n     *\n     * - The divisor cannot be zero.\n     */\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\n        require(b > 0, \"SafeMath: division by zero\");\n        return a / b;\n    }\n\n    /**\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n     * reverting when dividing by zero.\n     *\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\n     * invalid opcode to revert (consuming all remaining gas).\n     *\n     * Requirements:\n     *\n     * - The divisor cannot be zero.\n     */\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n        require(b > 0, \"SafeMath: modulo by zero\");\n        return a % b;\n    }\n\n    /**\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n     * overflow (when the result is negative).\n     *\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\n     * message unnecessarily. For custom revert reasons use {trySub}.\n     *\n     * Counterpart to Solidity's `-` operator.\n     *\n     * Requirements:\n     *\n     * - Subtraction cannot overflow.\n     */\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n        require(b <= a, errorMessage);\n        return a - b;\n    }\n\n    /**\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\n     * division by zero. The result is rounded towards zero.\n     *\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\n     *\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\n     * uses an invalid opcode to revert (consuming all remaining gas).\n     *\n     * Requirements:\n     *\n     * - The divisor cannot be zero.\n     */\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n        require(b > 0, errorMessage);\n        return a / b;\n    }\n\n    /**\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n     * reverting with custom message when dividing by zero.\n     *\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\n     * message unnecessarily. For custom revert reasons use {tryMod}.\n     *\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\n     * invalid opcode to revert (consuming all remaining gas).\n     *\n     * Requirements:\n     *\n     * - The divisor cannot be zero.\n     */\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n        require(b > 0, errorMessage);\n        return a % b;\n    }\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.2 <0.8.0;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     * ====\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies on extcodesize, which returns 0 for contracts in\n        // construction, since the code is only stored at the end of the\n        // constructor execution.\n\n        uint256 size;\n        // solhint-disable-next-line no-inline-assembly\n        assembly { size := extcodesize(account) }\n        return size > 0;\n    }\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\n        (bool success, ) = recipient.call{ value: amount }(\"\");\n        require(success, \"Address: unable to send value, recipient may have reverted\");\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain`call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason, it is bubbled up by this\n     * function (like regular Solidity function calls).\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n      return functionCall(target, data, \"Address: low-level call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n     * `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\n        require(isContract(target), \"Address: call to non-contract\");\n\n        // solhint-disable-next-line avoid-low-level-calls\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\n        return _verifyCallResult(success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\n        require(isContract(target), \"Address: static call to non-contract\");\n\n        // solhint-disable-next-line avoid-low-level-calls\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return _verifyCallResult(success, returndata, errorMessage);\n    }\n\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\n        if (success) {\n            return returndata;\n        } else {\n            // Look for revert reason and bubble it up if present\n            if (returndata.length > 0) {\n                // The easiest way to bubble the revert reason is using memory via assembly\n\n                // solhint-disable-next-line no-inline-assembly\n                assembly {\n                    let returndata_size := mload(returndata)\n                    revert(add(32, returndata), returndata_size)\n                }\n            } else {\n                revert(errorMessage);\n            }\n        }\n    }\n}\n"
      },
      "contracts/token/Ticket.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"sortition-sum-tree-factory/contracts/SortitionSumTreeFactory.sol\";\nimport \"@pooltogether/uniform-random-number/contracts/UniformRandomNumber.sol\";\n\nimport \"./ControlledToken.sol\";\nimport \"./TicketInterface.sol\";\n\ncontract Ticket is ControlledToken, TicketInterface {\n  using SortitionSumTreeFactory for SortitionSumTreeFactory.SortitionSumTrees;\n\n  bytes32 constant private TREE_KEY = keccak256(\"PoolTogether/Ticket\");\n  uint256 constant private MAX_TREE_LEAVES = 5;\n\n  /// @dev Emitted when an instance is initialized\n  event Initialized(\n    string _name,\n    string _symbol,\n    uint8 _decimals,\n    TokenControllerInterface _controller\n  );\n\n  // Ticket-weighted odds\n  SortitionSumTreeFactory.SortitionSumTrees internal sortitionSumTrees;\n\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\n  /// @param _name The name of the Token\n  /// @param _symbol The symbol for the Token\n  /// @param _decimals The number of decimals for the Token\n  /// @param _controller Address of the Controller contract for minting & burning\n  function initialize(\n    string memory _name,\n    string memory _symbol,\n    uint8 _decimals,\n    TokenControllerInterface _controller\n  )\n    public\n    virtual\n    override\n    initializer\n  {\n    require(address(_controller) != address(0), \"Ticket/controller-not-zero\");\n    ControlledToken.initialize(_name, _symbol, _decimals, _controller);\n    sortitionSumTrees.createTree(TREE_KEY, MAX_TREE_LEAVES);\n    emit Initialized(\n      _name,\n      _symbol,\n      _decimals,\n      _controller\n    );\n  }\n\n  /// @notice Returns the user's chance of winning.\n  function chanceOf(address user) external view returns (uint256) {\n    return sortitionSumTrees.stakeOf(TREE_KEY, bytes32(uint256(user)));\n  }\n\n  /// @notice Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\n  /// @param randomNumber The random number to use to select a user.\n  /// @return The winner\n  function draw(uint256 randomNumber) external view override returns (address) {\n    uint256 bound = totalSupply();\n    address selected;\n    if (bound == 0) {\n      selected = address(0);\n    } else {\n      uint256 token = UniformRandomNumber.uniform(randomNumber, bound);\n      selected = address(uint256(sortitionSumTrees.draw(TREE_KEY, token)));\n    }\n    return selected;\n  }\n\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\n  /// This includes minting and burning.\n  /// May be overridden to provide more granular control over operator-burning\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\n  /// @param amount Amount of tokens being transferred\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\n    super._beforeTokenTransfer(from, to, amount);\n\n    // optimize: ignore transfers to self\n    if (from == to) {\n      return;\n    }\n\n    if (from != address(0)) {\n      uint256 fromBalance = balanceOf(from).sub(amount);\n      sortitionSumTrees.set(TREE_KEY, fromBalance, bytes32(uint256(from)));\n    }\n\n    if (to != address(0)) {\n      uint256 toBalance = balanceOf(to).add(amount);\n      sortitionSumTrees.set(TREE_KEY, toBalance, bytes32(uint256(to)));\n    }\n  }\n\n}"
      },
      "sortition-sum-tree-factory/contracts/SortitionSumTreeFactory.sol": {
        "content": "/**\n *  @reviewers: [@clesaege, @unknownunknown1, @ferittuncer]\n *  @auditors: []\n *  @bounties: [<14 days 10 ETH max payout>]\n *  @deployments: []\n */\n\npragma solidity ^0.6.0;\n\n/**\n *  @title SortitionSumTreeFactory\n *  @author Enrique Piqueras - <epiquerass@gmail.com>\n *  @dev A factory of trees that keep track of staked values for sortition.\n */\nlibrary SortitionSumTreeFactory {\n    /* Structs */\n\n    struct SortitionSumTree {\n        uint K; // The maximum number of childs per node.\n        // We use this to keep track of vacant positions in the tree after removing a leaf. This is for keeping the tree as balanced as possible without spending gas on moving nodes around.\n        uint[] stack;\n        uint[] nodes;\n        // Two-way mapping of IDs to node indexes. Note that node index 0 is reserved for the root node, and means the ID does not have a node.\n        mapping(bytes32 => uint) IDsToNodeIndexes;\n        mapping(uint => bytes32) nodeIndexesToIDs;\n    }\n\n    /* Storage */\n\n    struct SortitionSumTrees {\n        mapping(bytes32 => SortitionSumTree) sortitionSumTrees;\n    }\n\n    /* internal */\n\n    /**\n     *  @dev Create a sortition sum tree at the specified key.\n     *  @param _key The key of the new tree.\n     *  @param _K The number of children each node in the tree should have.\n     */\n    function createTree(SortitionSumTrees storage self, bytes32 _key, uint _K) internal {\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\n        require(tree.K == 0, \"Tree already exists.\");\n        require(_K > 1, \"K must be greater than one.\");\n        tree.K = _K;\n        tree.stack = new uint[](0);\n        tree.nodes = new uint[](0);\n        tree.nodes.push(0);\n    }\n\n    /**\n     *  @dev Set a value of a tree.\n     *  @param _key The key of the tree.\n     *  @param _value The new value.\n     *  @param _ID The ID of the value.\n     *  `O(log_k(n))` where\n     *  `k` is the maximum number of childs per node in the tree,\n     *   and `n` is the maximum number of nodes ever appended.\n     */\n    function set(SortitionSumTrees storage self, bytes32 _key, uint _value, bytes32 _ID) internal {\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\n        uint treeIndex = tree.IDsToNodeIndexes[_ID];\n\n        if (treeIndex == 0) { // No existing node.\n            if (_value != 0) { // Non zero value.\n                // Append.\n                // Add node.\n                if (tree.stack.length == 0) { // No vacant spots.\n                    // Get the index and append the value.\n                    treeIndex = tree.nodes.length;\n                    tree.nodes.push(_value);\n\n                    // Potentially append a new node and make the parent a sum node.\n                    if (treeIndex != 1 && (treeIndex - 1) % tree.K == 0) { // Is first child.\n                        uint parentIndex = treeIndex / tree.K;\n                        bytes32 parentID = tree.nodeIndexesToIDs[parentIndex];\n                        uint newIndex = treeIndex + 1;\n                        tree.nodes.push(tree.nodes[parentIndex]);\n                        delete tree.nodeIndexesToIDs[parentIndex];\n                        tree.IDsToNodeIndexes[parentID] = newIndex;\n                        tree.nodeIndexesToIDs[newIndex] = parentID;\n                    }\n                } else { // Some vacant spot.\n                    // Pop the stack and append the value.\n                    treeIndex = tree.stack[tree.stack.length - 1];\n                    tree.stack.pop();\n                    tree.nodes[treeIndex] = _value;\n                }\n\n                // Add label.\n                tree.IDsToNodeIndexes[_ID] = treeIndex;\n                tree.nodeIndexesToIDs[treeIndex] = _ID;\n\n                updateParents(self, _key, treeIndex, true, _value);\n            }\n        } else { // Existing node.\n            if (_value == 0) { // Zero value.\n                // Remove.\n                // Remember value and set to 0.\n                uint value = tree.nodes[treeIndex];\n                tree.nodes[treeIndex] = 0;\n\n                // Push to stack.\n                tree.stack.push(treeIndex);\n\n                // Clear label.\n                delete tree.IDsToNodeIndexes[_ID];\n                delete tree.nodeIndexesToIDs[treeIndex];\n\n                updateParents(self, _key, treeIndex, false, value);\n            } else if (_value != tree.nodes[treeIndex]) { // New, non zero value.\n                // Set.\n                bool plusOrMinus = tree.nodes[treeIndex] <= _value;\n                uint plusOrMinusValue = plusOrMinus ? _value - tree.nodes[treeIndex] : tree.nodes[treeIndex] - _value;\n                tree.nodes[treeIndex] = _value;\n\n                updateParents(self, _key, treeIndex, plusOrMinus, plusOrMinusValue);\n            }\n        }\n    }\n\n    /* internal Views */\n\n    /**\n     *  @dev Query the leaves of a tree. Note that if `startIndex == 0`, the tree is empty and the root node will be returned.\n     *  @param _key The key of the tree to get the leaves from.\n     *  @param _cursor The pagination cursor.\n     *  @param _count The number of items to return.\n     *  @return startIndex The index at which leaves start\n     *  @return values The values of the returned leaves\n     *  @return hasMore Whether there are more for pagination.\n     *  `O(n)` where\n     *  `n` is the maximum number of nodes ever appended.\n     */\n    function queryLeafs(\n        SortitionSumTrees storage self,\n        bytes32 _key,\n        uint _cursor,\n        uint _count\n    ) internal view returns(uint startIndex, uint[] memory values, bool hasMore) {\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\n\n        // Find the start index.\n        for (uint i = 0; i < tree.nodes.length; i++) {\n            if ((tree.K * i) + 1 >= tree.nodes.length) {\n                startIndex = i;\n                break;\n            }\n        }\n\n        // Get the values.\n        uint loopStartIndex = startIndex + _cursor;\n        values = new uint[](loopStartIndex + _count > tree.nodes.length ? tree.nodes.length - loopStartIndex : _count);\n        uint valuesIndex = 0;\n        for (uint j = loopStartIndex; j < tree.nodes.length; j++) {\n            if (valuesIndex < _count) {\n                values[valuesIndex] = tree.nodes[j];\n                valuesIndex++;\n            } else {\n                hasMore = true;\n                break;\n            }\n        }\n    }\n\n    /**\n     *  @dev Draw an ID from a tree using a number. Note that this function reverts if the sum of all values in the tree is 0.\n     *  @param _key The key of the tree.\n     *  @param _drawnNumber The drawn number.\n     *  @return ID The drawn ID.\n     *  `O(k * log_k(n))` where\n     *  `k` is the maximum number of childs per node in the tree,\n     *   and `n` is the maximum number of nodes ever appended.\n     */\n    function draw(SortitionSumTrees storage self, bytes32 _key, uint _drawnNumber) internal view returns(bytes32 ID) {\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\n        uint treeIndex = 0;\n        uint currentDrawnNumber = _drawnNumber % tree.nodes[0];\n\n        while ((tree.K * treeIndex) + 1 < tree.nodes.length)  // While it still has children.\n            for (uint i = 1; i <= tree.K; i++) { // Loop over children.\n                uint nodeIndex = (tree.K * treeIndex) + i;\n                uint nodeValue = tree.nodes[nodeIndex];\n\n                if (currentDrawnNumber >= nodeValue) currentDrawnNumber -= nodeValue; // Go to the next child.\n                else { // Pick this child.\n                    treeIndex = nodeIndex;\n                    break;\n                }\n            }\n        \n        ID = tree.nodeIndexesToIDs[treeIndex];\n    }\n\n    /** @dev Gets a specified ID's associated value.\n     *  @param _key The key of the tree.\n     *  @param _ID The ID of the value.\n     *  @return value The associated value.\n     */\n    function stakeOf(SortitionSumTrees storage self, bytes32 _key, bytes32 _ID) internal view returns(uint value) {\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\n        uint treeIndex = tree.IDsToNodeIndexes[_ID];\n\n        if (treeIndex == 0) value = 0;\n        else value = tree.nodes[treeIndex];\n    }\n\n    function total(SortitionSumTrees storage self, bytes32 _key) internal view returns (uint) {\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\n        if (tree.nodes.length == 0) {\n            return 0;\n        } else {\n            return tree.nodes[0];\n        }\n    }\n\n    /* Private */\n\n    /**\n     *  @dev Update all the parents of a node.\n     *  @param _key The key of the tree to update.\n     *  @param _treeIndex The index of the node to start from.\n     *  @param _plusOrMinus Wether to add (true) or substract (false).\n     *  @param _value The value to add or substract.\n     *  `O(log_k(n))` where\n     *  `k` is the maximum number of childs per node in the tree,\n     *   and `n` is the maximum number of nodes ever appended.\n     */\n    function updateParents(SortitionSumTrees storage self, bytes32 _key, uint _treeIndex, bool _plusOrMinus, uint _value) private {\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\n\n        uint parentIndex = _treeIndex;\n        while (parentIndex != 0) {\n            parentIndex = (parentIndex - 1) / tree.K;\n            tree.nodes[parentIndex] = _plusOrMinus ? tree.nodes[parentIndex] + _value : tree.nodes[parentIndex] - _value;\n        }\n    }\n}\n"
      },
      "@pooltogether/uniform-random-number/contracts/UniformRandomNumber.sol": {
        "content": "/**\nCopyright 2019 PoolTogether LLC\n\nThis file is part of PoolTogether.\n\nPoolTogether is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation under version 3 of the License.\n\nPoolTogether is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @author Brendan Asselstine\n * @notice A library that uses entropy to select a random number within a bound.  Compensates for modulo bias.\n * @dev Thanks to https://medium.com/hownetworks/dont-waste-cycles-with-modulo-bias-35b6fdafcf94\n */\nlibrary UniformRandomNumber {\n  /// @notice Select a random number without modulo bias using a random seed and upper bound\n  /// @param _entropy The seed for randomness\n  /// @param _upperBound The upper bound of the desired number\n  /// @return A random number less than the _upperBound\n  function uniform(uint256 _entropy, uint256 _upperBound) internal pure returns (uint256) {\n    require(_upperBound > 0, \"UniformRand/min-bound\");\n    uint256 min = -_upperBound % _upperBound;\n    uint256 random = _entropy;\n    while (true) {\n      if (random >= min) {\n        break;\n      }\n      random = uint256(keccak256(abi.encodePacked(random)));\n    }\n    return random % _upperBound;\n  }\n}"
      },
      "contracts/token/TicketInterface.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity >=0.5.0 <0.7.0;\n\n/// @title Interface that allows a user to draw an address using an index\ninterface TicketInterface {\n  /// @notice Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\n  /// @param randomNumber The random number to use to select a user.\n  /// @return The winner\n  function draw(uint256 randomNumber) external view returns (address);\n}"
      },
      "contracts/builders/MultipleWinnersBuilder.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\npragma experimental ABIEncoderV2;\n\nimport \"./ControlledTokenBuilder.sol\";\nimport \"../prize-strategy/multiple-winners/MultipleWinnersProxyFactory.sol\";\n\n/* solium-disable security/no-block-members */\ncontract MultipleWinnersBuilder {\n\n  event MultipleWinnersCreated(address indexed prizeStrategy);\n\n  struct MultipleWinnersConfig {\n    RNGInterface rngService;\n    uint256 prizePeriodStart;\n    uint256 prizePeriodSeconds;\n    string ticketName;\n    string ticketSymbol;\n    string sponsorshipName;\n    string sponsorshipSymbol;\n    uint256 ticketCreditLimitMantissa;\n    uint256 ticketCreditRateMantissa;\n    uint256 numberOfWinners;\n    MultipleWinners.PrizeSplitConfig[] prizeSplits;\n    bool splitExternalErc20Awards;\n  }\n\n  MultipleWinnersProxyFactory public multipleWinnersProxyFactory;\n  ControlledTokenBuilder public controlledTokenBuilder;\n\n  constructor (\n    MultipleWinnersProxyFactory _multipleWinnersProxyFactory,\n    ControlledTokenBuilder _controlledTokenBuilder\n  ) public {\n    require(address(_multipleWinnersProxyFactory) != address(0), \"MultipleWinnersBuilder/multipleWinnersProxyFactory-not-zero\");\n    require(address(_controlledTokenBuilder) != address(0), \"MultipleWinnersBuilder/token-builder-not-zero\");\n    multipleWinnersProxyFactory = _multipleWinnersProxyFactory;\n    controlledTokenBuilder = _controlledTokenBuilder;\n  }\n\n  function createMultipleWinners(\n    PrizePool prizePool,\n    MultipleWinnersConfig memory prizeStrategyConfig,\n    uint8 decimals,\n    address owner\n  ) external returns (MultipleWinners) {\n    MultipleWinners mw = multipleWinnersProxyFactory.create();\n\n    Ticket ticket = _createTicket(\n      prizeStrategyConfig.ticketName,\n      prizeStrategyConfig.ticketSymbol,\n      decimals,\n      prizePool\n    );\n\n    ControlledToken sponsorship = _createSponsorship(\n      prizeStrategyConfig.sponsorshipName,\n      prizeStrategyConfig.sponsorshipSymbol,\n      decimals,\n      prizePool\n    );\n\n    mw.initializeMultipleWinners(\n      prizeStrategyConfig.prizePeriodStart,\n      prizeStrategyConfig.prizePeriodSeconds,\n      prizePool,\n      ticket,\n      sponsorship,\n      prizeStrategyConfig.rngService,\n      prizeStrategyConfig.numberOfWinners\n    );\n\n    mw.setPrizeSplits(prizeStrategyConfig.prizeSplits);\n\n    if (prizeStrategyConfig.splitExternalErc20Awards) {\n      mw.setSplitExternalErc20Awards(true);\n    }\n\n    mw.transferOwnership(owner);\n\n    emit MultipleWinnersCreated(address(mw));\n\n    return mw;\n  }\n\n  function _createTicket(\n    string memory name,\n    string memory token,\n    uint8 decimals,\n    PrizePool prizePool\n  ) internal returns (Ticket) {\n    return controlledTokenBuilder.createTicket(\n      ControlledTokenBuilder.ControlledTokenConfig(\n        name,\n        token,\n        decimals,\n        prizePool\n      )\n    );\n  }\n\n  function _createSponsorship(\n    string memory name,\n    string memory token,\n    uint8 decimals,\n    PrizePool prizePool\n  ) internal returns (ControlledToken) {\n    return controlledTokenBuilder.createControlledToken(\n      ControlledTokenBuilder.ControlledTokenConfig(\n        name,\n        token,\n        decimals,\n        prizePool\n      )\n    );\n  }\n}\n"
      },
      "contracts/prize-strategy/multiple-winners/MultipleWinnersProxyFactory.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"./MultipleWinners.sol\";\nimport \"../../external/openzeppelin/ProxyFactory.sol\";\n\n/// @title Creates a minimal proxy to the MultipleWinners prize strategy.  Very cheap to deploy.\ncontract MultipleWinnersProxyFactory is ProxyFactory {\n\n  MultipleWinners public instance;\n\n  constructor () public {\n    instance = new MultipleWinners();\n  }\n\n  function create() external returns (MultipleWinners) {\n    return MultipleWinners(deployMinimal(address(instance), \"\"));\n  }\n\n}"
      },
      "contracts/prize-strategy/multiple-winners/MultipleWinners.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity 0.6.12;\npragma experimental ABIEncoderV2;\n\nimport \"../PrizeSplit.sol\";\nimport \"../PeriodicPrizeStrategy.sol\";\n\ncontract MultipleWinners is PeriodicPrizeStrategy, PrizeSplit {\n\n  // Maximum number number of winners per award distribution period\n  uint256 internal __numberOfWinners;\n  \n  // Toggle for distributing external ERC 20 awards to all winners\n  bool public splitExternalErc20Awards;\n\n  // Mapping of addresses isBlocked status. Can prevent an address from selected during award distribution\n  mapping(address => bool) public isBlocklisted;\n\n  // Carry over the awarded prize for the next drawing when selected winners is less than __numberOfWinners\n  bool public carryOverBlocklist;\n\n  // Limit ticket.draw() retry attempts when a blocked address is selected in _distribute.\n  uint256 public blocklistRetryCount;\n\n  /**\n    * @notice Emitted when splitExternalErc20Awards is toggled.\n    * @dev Emitted when splitExternalErc20Awards is toggled between awarding external ERC20 to main or all winners.\n  */\n  event SplitExternalErc20AwardsSet(bool splitExternalErc20Awards);\n\n  /**\n    * @notice Emitted when numberOfWinners is set.\n    * @dev Emitted when numberOfWinners is set, which limits the maximum number of potentially selected winners.\n    * @param numberOfWinners Maximum potentially selected winners\n  */\n  event NumberOfWinnersSet(uint256 numberOfWinners);\n\n  /**\n    * @notice Emitted when carryOverBlocklist is toggled.\n    * @dev Emitted when carryOverBlocklist is toggled for distribution of the primary and secondary prizes.\n    * @param carry Awarded prize carry over status\n  */\n  event BlocklistCarrySet(bool carry);\n\n  /**\n    * @notice Emitted when a user is blocked/unblocked from receiving a prize award.\n    * @dev Emitted when a contract owner blocks/unblocks user from award selection in _distribute.\n    * @param user Address of user to block or unblock\n    * @param isBlocked User blocked status\n  */\n  event BlocklistSet(address indexed user, bool isBlocked);\n\n  /**\n    * @notice Emitted when a new draw retry limit is set.\n    * @dev Emitted when a new draw retry limit is set. Retry limit is set to limit gas spendings if a blocked user continues to be drawn.\n    * @param count Number of winner selection retry attempts \n  */\n  event BlocklistRetryCountSet(uint256 count);\n\n  /**\n    * @notice Emitted when the winner selection retry limit is reached during award distribution.\n    * @dev Emitted when the maximum number of users has not been selected after the blocklistRetryCount is reached.\n    * @param numberOfWinners Total number of winners selected before the blocklistRetryCount is reached.\n  */\n  event RetryMaxLimitReached(uint256 numberOfWinners);\n\n  /**\n    * @notice Emitted when no winner can be selected during the prize distribution. \n    * @dev Emitted when no winner can be selected in _distribute due to ticket.totalSupply() equaling zero.\n  */\n  event NoWinners();\n\n  function initializeMultipleWinners (\n    uint256 _prizePeriodStart,\n    uint256 _prizePeriodSeconds,\n    PrizePool _prizePool,\n    TicketInterface _ticket,\n    IERC20Upgradeable _sponsorship,\n    RNGInterface _rng,\n    uint256 _numberOfWinners\n  ) public initializer {\n    IERC20Upgradeable[] memory _externalErc20Awards;\n\n    PeriodicPrizeStrategy.initialize(\n      _prizePeriodStart,\n      _prizePeriodSeconds,\n      _prizePool,\n      _ticket,\n      _sponsorship,\n      _rng,\n      _externalErc20Awards\n    );\n\n    _setNumberOfWinners(_numberOfWinners);\n  }\n\n  /**\n    * @notice Block/unblock a user from winning during prize distribution.\n    * @dev Block/unblock a user from winning award in prize distribution by updating the isBlocklisted mapping.\n    * @param _user Address of blocked user\n    * @param _isBlocked Blocked Status (true or false) of user\n  */\n  function setBlocklisted(address _user, bool _isBlocked) external onlyOwner requireAwardNotInProgress returns (bool) {\n    isBlocklisted[_user] = _isBlocked;\n\n    emit BlocklistSet(_user, _isBlocked);\n\n    return true;\n  }\n\n  /**\n    * @notice Toggle if an unawarded prize amount should be kept for the next draw or evenly distrubted to selected winners. \n    * @dev Toggles if the main prize (prizePool.captureAwardBalance) and secondary prizes (LootBox) should be kept for the next draw or evenly distrubted if maximum number of winners is not selected. \n    * @param _carry Award carry over status (true or false)\n  */\n  function setCarryBlocklist(bool _carry) external onlyOwner requireAwardNotInProgress returns (bool) {\n    carryOverBlocklist = _carry;\n\n    emit BlocklistCarrySet(_carry);\n\n    return true;\n  }\n\n  /**\n    * @notice Sets the number of attempts for winner selection if a blocked address is chosen.\n    * @dev Limits winner selection (ticket.draw) retries to avoid to gas limit reached errors. Increases the probability of not reaching the maximum number of winners if to low.\n    * @param _count Number of retry attempts\n  */\n  function setBlocklistRetryCount(uint256 _count) external onlyOwner requireAwardNotInProgress returns (bool) {\n    blocklistRetryCount = _count;\n\n    emit BlocklistRetryCountSet(_count);\n\n    return true;\n  }\n  \n  /**\n    * @notice Toggle external ERC20 awards for all prize winners.\n    * @dev Toggle external ERC20 awards for all prize winners. If unset will distribute external ERC20 awards to main winner.\n    * @param _splitExternalErc20Awards Toggle splitting external ERC20 awards.\n  */\n  function setSplitExternalErc20Awards(bool _splitExternalErc20Awards) external onlyOwner requireAwardNotInProgress {\n    splitExternalErc20Awards = _splitExternalErc20Awards;\n\n    emit SplitExternalErc20AwardsSet(splitExternalErc20Awards);\n  }\n\n  /**\n    * @notice Sets maximum number of winners.\n    * @dev Sets maximum number of winners per award distribution period.\n    * @param count Number of winners.\n  */\n  function setNumberOfWinners(uint256 count) external onlyOwner requireAwardNotInProgress {\n    _setNumberOfWinners(count);\n  }\n\n   /**\n    * @dev Set the maximum number of winners. Must be greater than 0.\n    * @param count Number of winners.\n  */\n  function _setNumberOfWinners(uint256 count) internal {\n    require(count > 0, \"MultipleWinners/winners-gte-one\");\n\n    __numberOfWinners = count;\n    emit NumberOfWinnersSet(count);\n  }\n\n  /**\n    * @notice Maximum number of winners per award distribution period\n    * @dev Read maximum number of winners per award distribution period from internal __numberOfWinners variable.\n    * @return __numberOfWinners The total number of winners per prize award.\n  */\n  function numberOfWinners() external view returns (uint256) {\n    return __numberOfWinners;\n  }\n\n  /**\n    * @notice Award ticket or sponsorship tokens to prize split recipient.\n    * @dev Award ticket or sponsorship tokens to prize split recipient via the linked PrizePool contract.\n    * @param target Recipient of minted tokens\n    * @param amount Amount of minted tokens\n    * @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\n  */\n  function _awardPrizeSplitAmount(address target, uint256 amount, uint8 tokenIndex) override internal {\n    _awardToken(target, amount, tokenIndex);\n  }\n\n  /**\n    * @notice Distributes captured award balance to winners\n    * @dev Distributes the captured award balance to the main winner and secondary winners if __numberOfWinners greater than 1.\n    * @param randomNumber Random number seed used to select winners\n  */\n  function _distribute(uint256 randomNumber) internal override {\n    uint256 prize = prizePool.captureAwardBalance();\n    \n    // distributes prize to prize splits and returns remaining award.\n    prize = _distributePrizeSplits(prize);\n\n    if (IERC20Upgradeable(address(ticket)).totalSupply() == 0) {\n      emit NoWinners();\n      return;\n    }\n\n    bool _carryOverBlocklistPrizes = carryOverBlocklist;\n\n    // main winner is simply the first that is drawn\n    uint256 numberOfWinners = __numberOfWinners;\n    address[] memory winners = new address[](numberOfWinners);\n    uint256 nextRandom = randomNumber;\n    uint256 winnerCount = 0;\n    uint256 retries = 0;\n    uint256 _retryCount = blocklistRetryCount;\n    while (winnerCount < numberOfWinners) {\n      address winner = ticket.draw(nextRandom);\n\n      if (!isBlocklisted[winner]) {\n        winners[winnerCount++] = winner;\n      } else if (++retries >= _retryCount) {\n        emit RetryMaxLimitReached(winnerCount);\n        if(winnerCount == 0) {\n          emit NoWinners();\n        }\n        break;\n      }\n\n      // add some arbitrary numbers to the previous random number to ensure no matches with the UniformRandomNumber lib\n      bytes32 nextRandomHash = keccak256(abi.encodePacked(nextRandom + 499 + winnerCount*521));\n      nextRandom = uint256(nextRandomHash);\n    }\n\n    // main winner gets all external ERC721 tokens\n    _awardExternalErc721s(winners[0]);\n\n    // yield prize is split up among all winners\n    uint256 prizeShare = _carryOverBlocklistPrizes ? prize.div(numberOfWinners) : prize.div(winnerCount);\n    if (prizeShare > 0) {\n      for (uint i = 0; i < winnerCount; i++) {\n        _awardTickets(winners[i], prizeShare);\n      }\n    }\n\n    if (splitExternalErc20Awards) {\n      address currentToken = externalErc20s.start();\n      while (currentToken != address(0) && currentToken != externalErc20s.end()) {\n        uint256 balance = IERC20Upgradeable(currentToken).balanceOf(address(prizePool));\n        uint256 split = _carryOverBlocklistPrizes ? balance.div(numberOfWinners) : balance.div(winnerCount);\n        if (split > 0) {\n          for (uint256 i = 0; i < winnerCount; i++) {\n            prizePool.awardExternalERC20(winners[i], currentToken, split);\n          }\n        }\n        currentToken = externalErc20s.next(currentToken);\n      }\n    } else {\n      _awardExternalErc20s(winners[0]);\n    }\n  }\n}\n"
      },
      "contracts/prize-strategy/PrizeSplit.sol": {
        "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.6.12;\npragma experimental ABIEncoderV2;\n\nimport \"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\n\n/**\n  * @title Abstract prize split contract for adding unique award distribution to static addresses. \n  * @author Kames Geraghty (PoolTogether Inc)\n*/\nabstract contract PrizeSplit is OwnableUpgradeable {\n  using SafeMathUpgradeable for uint256;\n  \n  PrizeSplitConfig[] internal _prizeSplits;\n\n  /**\n    * @notice The prize split configuration struct.\n    * @dev The prize split configuration struct used to award prize splits during distribution.\n    * @param target Address of recipient receiving the prize split distribution\n    * @param percentage Percentage of prize split using a 0-1000 range for single decimal precision i.e. 125 = 12.5%\n    * @param token Position of controlled token in prizePool.tokens (i.e. ticket or sponsorship)\n  */\n  struct PrizeSplitConfig {\n      address target;\n      uint16 percentage;\n      uint8 token;\n  }\n\n  /**\n    * @notice Emitted when a PrizeSplitConfig config is added or updated.\n    * @dev Emitted when aPrizeSplitConfig config is added or updated in setPrizeSplits or setPrizeSplit.\n    * @param target Address of prize split recipient\n    * @param percentage Percentage of prize split. Must be between 0 and 1000 for single decimal precision\n    * @param token Index (0 or 1) of token in the prizePool.tokens mapping\n    * @param index Index of prize split in the prizeSplts array\n  */\n  event PrizeSplitSet(address indexed target, uint16 percentage, uint8 token, uint256 index);\n\n  /**\n    * @notice Emitted when a PrizeSplitConfig config is removed.\n    * @dev Emitted when a PrizeSplitConfig config is removed from the _prizeSplits array.\n    * @param target Index of a previously active prize split config\n  */\n  event PrizeSplitRemoved(uint256 indexed target);\n\n  /**\n    * @notice Mints ticket or sponsorship tokens to prize split recipient.\n    * @dev Mints ticket or sponsorship tokens to prize split recipient via the linked PrizePool contract.\n    * @param target Recipient of minted tokens\n    * @param amount Amount of minted tokens\n    * @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\n  */\n  function _awardPrizeSplitAmount(address target, uint256 amount, uint8 tokenIndex) virtual internal;\n\n  /**\n    * @notice Read all prize splits configs.\n    * @dev Read all PrizeSplitConfig structs stored in _prizeSplits.\n    * @return _prizeSplits Array of PrizeSplitConfig structs\n  */\n  function prizeSplits() external view returns (PrizeSplitConfig[] memory) {\n    return _prizeSplits;\n  }\n\n  /**\n    * @notice Read prize split config from active PrizeSplits.\n    * @dev Read PrizeSplitConfig struct from _prizeSplits array.\n    * @param prizeSplitIndex Index position of PrizeSplitConfig\n    * @return PrizeSplitConfig Single prize split config\n  */\n  function prizeSplit(uint256 prizeSplitIndex) external view returns (PrizeSplitConfig memory) {\n    return _prizeSplits[prizeSplitIndex];\n  }\n\n  /**\n    * @notice Set and remove prize split(s) configs.\n    * @dev Set and remove prize split configs by passing a new PrizeSplitConfig structs array. Will remove existing PrizeSplitConfig(s) if passed array length is less than existing _prizeSplits length.\n    * @param newPrizeSplits Array of PrizeSplitConfig structs\n  */\n  function setPrizeSplits(PrizeSplitConfig[] calldata newPrizeSplits) external onlyOwner {\n    uint256 newPrizeSplitsLength = newPrizeSplits.length;\n\n    // Add and/or update prize split configs using newPrizeSplits PrizeSplitConfig structs array.\n    for (uint256 index = 0; index < newPrizeSplitsLength; index++) {\n      PrizeSplitConfig memory split = newPrizeSplits[index];\n      require(split.token <= 1, \"MultipleWinners/invalid-prizesplit-token\");\n      require(split.target != address(0), \"MultipleWinners/invalid-prizesplit-target\");\n      \n      if (_prizeSplits.length <= index) {\n        _prizeSplits.push(split);\n      } else {\n        PrizeSplitConfig memory currentSplit = _prizeSplits[index];\n        if (split.target != currentSplit.target || split.percentage != currentSplit.percentage || split.token != currentSplit.token) {\n          _prizeSplits[index] = split;\n        } else {\n          continue;\n        }\n      }\n\n      // Emit the added/updated prize split config.\n      emit PrizeSplitSet(split.target, split.percentage, split.token, index);\n    }\n\n    // Remove old prize splits configs. Match storage _prizesSplits.length with the passed newPrizeSplits.length\n    while (_prizeSplits.length > newPrizeSplitsLength) {\n      uint256 _index = _prizeSplits.length.sub(1);\n      _prizeSplits.pop();\n      emit PrizeSplitRemoved(_index);\n    }\n\n    // Total prize split do not exceed 100%\n    uint256 totalPercentage = _totalPrizeSplitPercentageAmount();\n    require(totalPercentage <= 1000, \"MultipleWinners/invalid-prizesplit-percentage-total\");\n  }\n\n  /**\n    * @notice Updates a previously set prize split config.\n    * @dev Updates a prize split config by passing a new PrizeSplitConfig struct and current index position. Limited to contract owner.\n    * @param prizeStrategySplit PrizeSplitConfig config struct\n    * @param prizeSplitIndex Index position of PrizeSplitConfig to update\n  */\n  function setPrizeSplit(PrizeSplitConfig memory prizeStrategySplit, uint8 prizeSplitIndex) external onlyOwner {\n    require(prizeSplitIndex < _prizeSplits.length, \"MultipleWinners/nonexistent-prizesplit\");\n    require(prizeStrategySplit.token <= 1, \"MultipleWinners/invalid-prizesplit-token\");\n    require(prizeStrategySplit.target != address(0), \"MultipleWinners/invalid-prizesplit-target\");\n    \n    // Update the prize split config\n    _prizeSplits[prizeSplitIndex] = prizeStrategySplit;\n\n    // Total prize split do not exceed 100%\n    uint256 totalPercentage = _totalPrizeSplitPercentageAmount();\n    require(totalPercentage <= 1000, \"MultipleWinners/invalid-prizesplit-percentage-total\");\n\n    // Emit updated prize split config\n    emit PrizeSplitSet(prizeStrategySplit.target, prizeStrategySplit.percentage, prizeStrategySplit.token, prizeSplitIndex);\n  }\n\n  /**\n  * @notice Calculate single prize split distribution amount.\n  * @dev Calculate single prize split distribution amount using the total prize amount and prize split percentage.\n  * @param amount Total prize award distribution amount\n  * @param percentage Percentage with single decimal precision using 0-1000 ranges\n  */\n  function _getPrizeSplitAmount(uint256 amount, uint16 percentage) internal pure returns (uint256) {\n    return (amount * percentage).div(1000);\n  }\n\n  /**\n  * @notice Calculates total prize split percentage amount.\n  * @dev Calculates total PrizeSplitConfig percentage(s) amount. Used to check the total does not exceed 100% of award distribution.\n  * @return Total prize split(s) percentage amount\n  */\n  function _totalPrizeSplitPercentageAmount() internal view returns (uint256) {\n    uint256 _tempTotalPercentage;\n    uint256 prizeSplitsLength = _prizeSplits.length;\n    for (uint8 index = 0; index < prizeSplitsLength; index++) {\n      PrizeSplitConfig memory split = _prizeSplits[index];\n      _tempTotalPercentage = _tempTotalPercentage.add(split.percentage);\n    }\n    return _tempTotalPercentage;\n  }\n\n  /**\n  * @notice Distributes prize split(s).\n  * @dev Distributes prize split(s) by awarding ticket or sponsorship tokens.\n  * @param prize Starting prize award amount\n  * @return Total prize award distribution amount exlcuding the awarded prize split(s)\n  */\n  function _distributePrizeSplits(uint256 prize) internal returns (uint256) {\n    // Store temporary total prize amount for multiple calculations using initial prize amount.\n    uint256 _prizeTemp = prize;\n    uint256 prizeSplitsLength = _prizeSplits.length;\n    for (uint256 index = 0; index < prizeSplitsLength; index++) {\n      PrizeSplitConfig memory split = _prizeSplits[index];\n      uint256 _splitAmount = _getPrizeSplitAmount(_prizeTemp, split.percentage);\n\n      // Award the prize split distribution amount.\n      _awardPrizeSplitAmount(split.target, _splitAmount, split.token);\n\n      // Update the remaining prize amount after distributing the prize split percentage.\n      prize = prize.sub(_splitAmount);\n    }\n\n    return prize;\n  }\n\n}"
      },
      "contracts/prize-strategy/PeriodicPrizeStrategy.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\";\nimport \"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\";\nimport \"@pooltogether/fixed-point/contracts/FixedPoint.sol\";\n\nimport \"../token/TokenListener.sol\";\nimport \"../token/TokenControllerInterface.sol\";\nimport \"../token/ControlledToken.sol\";\nimport \"../token/TicketInterface.sol\";\nimport \"../prize-pool/PrizePool.sol\";\nimport \"../Constants.sol\";\nimport \"./PeriodicPrizeStrategyListenerInterface.sol\";\nimport \"./PeriodicPrizeStrategyListenerLibrary.sol\";\nimport \"./BeforeAwardListener.sol\";\n\n/* solium-disable security/no-block-members */\nabstract contract PeriodicPrizeStrategy is Initializable,\n                                           OwnableUpgradeable,\n                                           TokenListener {\n\n  using SafeMathUpgradeable for uint256;\n  using SafeMathUpgradeable for uint16;\n  using SafeCastUpgradeable for uint256;\n  using SafeERC20Upgradeable for IERC20Upgradeable;\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\n  using AddressUpgradeable for address;\n  using ERC165CheckerUpgradeable for address;\n\n  uint256 internal constant ETHEREUM_BLOCK_TIME_ESTIMATE_MANTISSA = 13.4 ether;\n\n  event PrizePoolOpened(\n    address indexed operator,\n    uint256 indexed prizePeriodStartedAt\n  );\n\n  event RngRequestFailed();\n\n  event PrizePoolAwardStarted(\n    address indexed operator,\n    address indexed prizePool,\n    uint32 indexed rngRequestId,\n    uint32 rngLockBlock\n  );\n\n  event PrizePoolAwardCancelled(\n    address indexed operator,\n    address indexed prizePool,\n    uint32 indexed rngRequestId,\n    uint32 rngLockBlock\n  );\n\n  event PrizePoolAwarded(\n    address indexed operator,\n    uint256 randomNumber\n  );\n\n  event RngServiceUpdated(\n    RNGInterface indexed rngService\n  );\n\n  event TokenListenerUpdated(\n    TokenListenerInterface indexed tokenListener\n  );\n\n  event RngRequestTimeoutSet(\n    uint32 rngRequestTimeout\n  );\n\n  event PrizePeriodSecondsUpdated(\n    uint256 prizePeriodSeconds\n  );\n\n  event BeforeAwardListenerSet(\n    BeforeAwardListenerInterface indexed beforeAwardListener\n  );\n\n  event PeriodicPrizeStrategyListenerSet(\n    PeriodicPrizeStrategyListenerInterface indexed periodicPrizeStrategyListener\n  );\n\n  event ExternalErc721AwardAdded(\n    IERC721Upgradeable indexed externalErc721,\n    uint256[] tokenIds\n  );\n\n  event ExternalErc20AwardAdded(\n    IERC20Upgradeable indexed externalErc20\n  );\n\n  event ExternalErc721AwardRemoved(\n    IERC721Upgradeable indexed externalErc721Award\n  );\n\n  event ExternalErc20AwardRemoved(\n    IERC20Upgradeable indexed externalErc20Award\n  );\n\n  event Initialized(\n    uint256 prizePeriodStart,\n    uint256 prizePeriodSeconds,\n    PrizePool indexed prizePool,\n    TicketInterface ticket,\n    IERC20Upgradeable sponsorship,\n    RNGInterface rng,\n    IERC20Upgradeable[] externalErc20Awards\n  );\n\n  struct RngRequest {\n    uint32 id;\n    uint32 lockBlock;\n    uint32 requestedAt;\n  }\n\n  /// @notice Semver Version\n  string constant public VERSION = \"3.4.5\";\n\n  // Comptroller\n  TokenListenerInterface public tokenListener;\n\n  // Contract Interfaces\n  PrizePool public prizePool;\n  TicketInterface public ticket;\n  IERC20Upgradeable public sponsorship;\n  RNGInterface public rng;\n\n  // Current RNG Request\n  RngRequest internal rngRequest;\n\n  /// @notice RNG Request Timeout.  In fact, this is really a \"complete award\" timeout.\n  /// If the rng completes the award can still be cancelled.\n  uint32 public rngRequestTimeout;\n\n  // Prize period\n  uint256 public prizePeriodSeconds;\n  uint256 public prizePeriodStartedAt;\n\n  // External tokens awarded as part of prize\n  MappedSinglyLinkedList.Mapping internal externalErc20s;\n  MappedSinglyLinkedList.Mapping internal externalErc721s;\n\n  // External NFT token IDs to be awarded\n  //   NFT Address => TokenIds\n  mapping (IERC721Upgradeable => uint256[]) internal externalErc721TokenIds;\n\n  /// @notice A listener that is called before the prize is awarded\n  BeforeAwardListenerInterface public beforeAwardListener;\n\n  /// @notice A listener that is called after the prize is awarded\n  PeriodicPrizeStrategyListenerInterface public periodicPrizeStrategyListener;\n\n  /// @notice Initializes a new strategy\n  /// @param _prizePeriodStart The starting timestamp of the prize period.\n  /// @param _prizePeriodSeconds The duration of the prize period in seconds\n  /// @param _prizePool The prize pool to award\n  /// @param _ticket The ticket to use to draw winners\n  /// @param _sponsorship The sponsorship token\n  /// @param _rng The RNG service to use\n  function initialize (\n    uint256 _prizePeriodStart,\n    uint256 _prizePeriodSeconds,\n    PrizePool _prizePool,\n    TicketInterface _ticket,\n    IERC20Upgradeable _sponsorship,\n    RNGInterface _rng,\n    IERC20Upgradeable[] memory externalErc20Awards\n  ) public initializer {\n    require(address(_prizePool) != address(0), \"PeriodicPrizeStrategy/prize-pool-not-zero\");\n    require(address(_ticket) != address(0), \"PeriodicPrizeStrategy/ticket-not-zero\");\n    require(address(_sponsorship) != address(0), \"PeriodicPrizeStrategy/sponsorship-not-zero\");\n    require(address(_rng) != address(0), \"PeriodicPrizeStrategy/rng-not-zero\");\n    prizePool = _prizePool;\n    ticket = _ticket;\n    rng = _rng;\n    sponsorship = _sponsorship;\n    _setPrizePeriodSeconds(_prizePeriodSeconds);\n\n    __Ownable_init();\n\n    externalErc20s.initialize();\n    for (uint256 i = 0; i < externalErc20Awards.length; i++) {\n      _addExternalErc20Award(externalErc20Awards[i]);\n    }\n\n    prizePeriodSeconds = _prizePeriodSeconds;\n    prizePeriodStartedAt = _prizePeriodStart;\n\n    externalErc721s.initialize();\n\n    // 30 min timeout\n    _setRngRequestTimeout(1800);\n\n    emit Initialized(\n      _prizePeriodStart,\n      _prizePeriodSeconds,\n      _prizePool,\n      _ticket,\n      _sponsorship,\n      _rng,\n      externalErc20Awards\n    );\n    emit PrizePoolOpened(_msgSender(), prizePeriodStartedAt);\n  }\n\n  function _distribute(uint256 randomNumber) internal virtual;\n\n  /// @notice Calculates and returns the currently accrued prize\n  /// @return The current prize size\n  function currentPrize() public view returns (uint256) {\n    return prizePool.awardBalance();\n  }\n\n  /// @notice Allows the owner to set the token listener\n  /// @param _tokenListener A contract that implements the token listener interface.\n  function setTokenListener(TokenListenerInterface _tokenListener) external onlyOwner requireAwardNotInProgress {\n    require(address(0) == address(_tokenListener) || address(_tokenListener).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \"PeriodicPrizeStrategy/token-listener-invalid\");\n\n    tokenListener = _tokenListener;\n\n    emit TokenListenerUpdated(tokenListener);\n  }\n\n  /// @notice Estimates the remaining blocks until the prize given a number of seconds per block\n  /// @param secondsPerBlockMantissa The number of seconds per block to use for the calculation.  Should be a fixed point 18 number like Ether.\n  /// @return The estimated number of blocks remaining until the prize can be awarded.\n  function estimateRemainingBlocksToPrize(uint256 secondsPerBlockMantissa) public view returns (uint256) {\n    return FixedPoint.divideUintByMantissa(\n      _prizePeriodRemainingSeconds(),\n      secondsPerBlockMantissa\n    );\n  }\n\n  /// @notice Returns the number of seconds remaining until the prize can be awarded.\n  /// @return The number of seconds remaining until the prize can be awarded.\n  function prizePeriodRemainingSeconds() external view returns (uint256) {\n    return _prizePeriodRemainingSeconds();\n  }\n\n  /// @notice Returns the number of seconds remaining until the prize can be awarded.\n  /// @return The number of seconds remaining until the prize can be awarded.\n  function _prizePeriodRemainingSeconds() internal view returns (uint256) {\n    uint256 endAt = _prizePeriodEndAt();\n    uint256 time = _currentTime();\n    if (time > endAt) {\n      return 0;\n    }\n    return endAt.sub(time);\n  }\n\n  /// @notice Returns whether the prize period is over\n  /// @return True if the prize period is over, false otherwise\n  function isPrizePeriodOver() external view returns (bool) {\n    return _isPrizePeriodOver();\n  }\n\n  /// @notice Returns whether the prize period is over\n  /// @return True if the prize period is over, false otherwise\n  function _isPrizePeriodOver() internal view returns (bool) {\n    return _currentTime() >= _prizePeriodEndAt();\n  }\n\n  /// @notice Awards collateral as tickets to a user\n  /// @param user Recipient of minted tokens\n  /// @param amount Amount of minted tokens\n  function _awardTickets(address user, uint256 amount) internal {\n    prizePool.award(user, amount, address(ticket));\n  }\n  \n  /// @notice Mints ticket or sponsorship tokens for user.\n  /// @dev Mints ticket or sponsorship tokens by looking up the address in the prizePool.tokens mapping. \n  /// @param user Recipient of minted tokens\n  /// @param amount Amount of minted tokens\n  /// @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\n  function _awardToken(address user, uint256 amount, uint8 tokenIndex) internal {\n    ControlledTokenInterface[] memory _controlledTokens = prizePool.tokens();\n    require(tokenIndex <= _controlledTokens.length, \"PeriodicPrizeStrategy/award-invalid-token-index\");\n    ControlledTokenInterface _token = _controlledTokens[tokenIndex];\n    prizePool.award(user, amount, address(_token));\n  }\n\n  /// @notice Awards all external tokens with non-zero balances to the given user.  The external tokens must be held by the PrizePool contract.\n  /// @param winner The user to transfer the tokens to\n  function _awardAllExternalTokens(address winner) internal {\n    _awardExternalErc20s(winner);\n    _awardExternalErc721s(winner);\n  }\n\n  /// @notice Awards all external ERC20 tokens with non-zero balances to the given user.\n  /// The external tokens must be held by the PrizePool contract.\n  /// @param winner The user to transfer the tokens to\n  function _awardExternalErc20s(address winner) internal {\n    address currentToken = externalErc20s.start();\n    while (currentToken != address(0) && currentToken != externalErc20s.end()) {\n      uint256 balance = IERC20Upgradeable(currentToken).balanceOf(address(prizePool));\n      if (balance > 0) {\n        prizePool.awardExternalERC20(winner, currentToken, balance);\n      }\n      currentToken = externalErc20s.next(currentToken);\n    }\n  }\n\n  /// @notice Awards all external ERC721 tokens to the given user.\n  /// The external tokens must be held by the PrizePool contract.\n  /// @dev The list of ERC721s is reset after every award\n  /// @param winner The user to transfer the tokens to\n  function _awardExternalErc721s(address winner) internal {\n    address currentToken = externalErc721s.start();\n    while (currentToken != address(0) && currentToken != externalErc721s.end()) {\n      uint256 balance = IERC721Upgradeable(currentToken).balanceOf(address(prizePool));\n      if (balance > 0) {\n        prizePool.awardExternalERC721(winner, currentToken, externalErc721TokenIds[IERC721Upgradeable(currentToken)]);\n        _removeExternalErc721AwardTokens(IERC721Upgradeable(currentToken));\n      }\n      currentToken = externalErc721s.next(currentToken);\n    }\n    externalErc721s.clearAll();\n  }\n\n  /// @notice Returns the timestamp at which the prize period ends\n  /// @return The timestamp at which the prize period ends.\n  function prizePeriodEndAt() external view returns (uint256) {\n    // current prize started at is non-inclusive, so add one\n    return _prizePeriodEndAt();\n  }\n\n  /// @notice Returns the timestamp at which the prize period ends\n  /// @return The timestamp at which the prize period ends.\n  function _prizePeriodEndAt() internal view returns (uint256) {\n    // current prize started at is non-inclusive, so add one\n    return prizePeriodStartedAt.add(prizePeriodSeconds);\n  }\n\n  /// @notice Called by the PrizePool for transfers of controlled tokens\n  /// @dev Note that this is only for *transfers*, not mints or burns\n  /// @param controlledToken The type of collateral that is being sent\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external override onlyPrizePool {\n    require(from != to, \"PeriodicPrizeStrategy/transfer-to-self\");\n\n    if (controlledToken == address(ticket)) {\n      _requireAwardNotInProgress();\n    }\n\n    if (address(tokenListener) != address(0)) {\n      tokenListener.beforeTokenTransfer(from, to, amount, controlledToken);\n    }\n  }\n\n  /// @notice Called by the PrizePool when minting controlled tokens\n  /// @param controlledToken The type of collateral that is being minted\n  function beforeTokenMint(\n    address to,\n    uint256 amount,\n    address controlledToken,\n    address referrer\n  )\n    external\n    override\n    onlyPrizePool\n  {\n    if (controlledToken == address(ticket)) {\n      _requireAwardNotInProgress();\n    }\n    if (address(tokenListener) != address(0)) {\n      tokenListener.beforeTokenMint(to, amount, controlledToken, referrer);\n    }\n  }\n\n  /// @notice returns the current time.  Used for testing.\n  /// @return The current time (block.timestamp)\n  function _currentTime() internal virtual view returns (uint256) {\n    return block.timestamp;\n  }\n\n  /// @notice returns the current time.  Used for testing.\n  /// @return The current time (block.timestamp)\n  function _currentBlock() internal virtual view returns (uint256) {\n    return block.number;\n  }\n\n  /// @notice Starts the award process by starting random number request.  The prize period must have ended.\n  /// @dev The RNG-Request-Fee is expected to be held within this contract before calling this function\n  function startAward() external requireCanStartAward {\n    (address feeToken, uint256 requestFee) = rng.getRequestFee();\n    if (feeToken != address(0) && requestFee > 0) {\n      IERC20Upgradeable(feeToken).safeApprove(address(rng), requestFee);\n    }\n\n    (uint32 requestId, uint32 lockBlock) = rng.requestRandomNumber();\n    rngRequest.id = requestId;\n    rngRequest.lockBlock = lockBlock;\n    rngRequest.requestedAt = _currentTime().toUint32();\n\n    emit PrizePoolAwardStarted(_msgSender(), address(prizePool), requestId, lockBlock);\n  }\n\n  /// @notice Can be called by anyone to unlock the tickets if the RNG has timed out.\n  function cancelAward() public {\n    require(isRngTimedOut(), \"PeriodicPrizeStrategy/rng-not-timedout\");\n    uint32 requestId = rngRequest.id;\n    uint32 lockBlock = rngRequest.lockBlock;\n    delete rngRequest;\n    emit RngRequestFailed();\n    emit PrizePoolAwardCancelled(msg.sender, address(prizePool), requestId, lockBlock);\n  }\n\n  /// @notice Completes the award process and awards the winners.  The random number must have been requested and is now available.\n  function completeAward() external requireCanCompleteAward {\n    uint256 randomNumber = rng.randomNumber(rngRequest.id);\n    delete rngRequest;\n\n    if (address(beforeAwardListener) != address(0)) {\n      beforeAwardListener.beforePrizePoolAwarded(randomNumber, prizePeriodStartedAt);\n    }\n    _distribute(randomNumber);\n    if (address(periodicPrizeStrategyListener) != address(0)) {\n      periodicPrizeStrategyListener.afterPrizePoolAwarded(randomNumber, prizePeriodStartedAt);\n    }\n\n    // to avoid clock drift, we should calculate the start time based on the previous period start time.\n    prizePeriodStartedAt = _calculateNextPrizePeriodStartTime(_currentTime());\n\n    emit PrizePoolAwarded(_msgSender(), randomNumber);\n    emit PrizePoolOpened(_msgSender(), prizePeriodStartedAt);\n  }\n\n  /// @notice Allows the owner to set a listener that is triggered immediately before the award is distributed\n  /// @dev The listener must implement ERC165 and the BeforeAwardListenerInterface\n  /// @param _beforeAwardListener The address of the listener contract\n  function setBeforeAwardListener(BeforeAwardListenerInterface _beforeAwardListener) external onlyOwner requireAwardNotInProgress {\n    require(\n      address(0) == address(_beforeAwardListener) || address(_beforeAwardListener).supportsInterface(BeforeAwardListenerLibrary.ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER),\n      \"PeriodicPrizeStrategy/beforeAwardListener-invalid\"\n    );\n\n    beforeAwardListener = _beforeAwardListener;\n\n    emit BeforeAwardListenerSet(_beforeAwardListener);\n  }\n\n  /// @notice Allows the owner to set a listener for prize strategy callbacks.\n  /// @param _periodicPrizeStrategyListener The address of the listener contract\n  function setPeriodicPrizeStrategyListener(PeriodicPrizeStrategyListenerInterface _periodicPrizeStrategyListener) external onlyOwner requireAwardNotInProgress {\n    require(\n      address(0) == address(_periodicPrizeStrategyListener) || address(_periodicPrizeStrategyListener).supportsInterface(PeriodicPrizeStrategyListenerLibrary.ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER),\n      \"PeriodicPrizeStrategy/prizeStrategyListener-invalid\"\n    );\n\n    periodicPrizeStrategyListener = _periodicPrizeStrategyListener;\n\n    emit PeriodicPrizeStrategyListenerSet(_periodicPrizeStrategyListener);\n  }\n\n  function _calculateNextPrizePeriodStartTime(uint256 currentTime) internal view returns (uint256) {\n    uint256 elapsedPeriods = currentTime.sub(prizePeriodStartedAt).div(prizePeriodSeconds);\n    return prizePeriodStartedAt.add(elapsedPeriods.mul(prizePeriodSeconds));\n  }\n\n  /// @notice Calculates when the next prize period will start\n  /// @param currentTime The timestamp to use as the current time\n  /// @return The timestamp at which the next prize period would start\n  function calculateNextPrizePeriodStartTime(uint256 currentTime) external view returns (uint256) {\n    return _calculateNextPrizePeriodStartTime(currentTime);\n  }\n\n  /// @notice Returns whether an award process can be started\n  /// @return True if an award can be started, false otherwise.\n  function canStartAward() external view returns (bool) {\n    return _isPrizePeriodOver() && !isRngRequested();\n  }\n\n  /// @notice Returns whether an award process can be completed\n  /// @return True if an award can be completed, false otherwise.\n  function canCompleteAward() external view returns (bool) {\n    return isRngRequested() && isRngCompleted();\n  }\n\n  /// @notice Returns whether a random number has been requested\n  /// @return True if a random number has been requested, false otherwise.\n  function isRngRequested() public view returns (bool) {\n    return rngRequest.id != 0;\n  }\n\n  /// @notice Returns whether the random number request has completed.\n  /// @return True if a random number request has completed, false otherwise.\n  function isRngCompleted() public view returns (bool) {\n    return rng.isRequestComplete(rngRequest.id);\n  }\n\n  /// @notice Returns the block number that the current RNG request has been locked to\n  /// @return The block number that the RNG request is locked to\n  function getLastRngLockBlock() external view returns (uint32) {\n    return rngRequest.lockBlock;\n  }\n\n  /// @notice Returns the current RNG Request ID\n  /// @return The current Request ID\n  function getLastRngRequestId() external view returns (uint32) {\n    return rngRequest.id;\n  }\n\n  /// @notice Sets the RNG service that the Prize Strategy is connected to\n  /// @param rngService The address of the new RNG service interface\n  function setRngService(RNGInterface rngService) external onlyOwner requireAwardNotInProgress {\n    require(!isRngRequested(), \"PeriodicPrizeStrategy/rng-in-flight\");\n\n    rng = rngService;\n    emit RngServiceUpdated(rngService);\n  }\n\n  /// @notice Allows the owner to set the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\n  /// @param _rngRequestTimeout The RNG request timeout in seconds.\n  function setRngRequestTimeout(uint32 _rngRequestTimeout) external onlyOwner requireAwardNotInProgress {\n    _setRngRequestTimeout(_rngRequestTimeout);\n  }\n\n  /// @notice Sets the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\n  /// @param _rngRequestTimeout The RNG request timeout in seconds.\n  function _setRngRequestTimeout(uint32 _rngRequestTimeout) internal {\n    require(_rngRequestTimeout > 60, \"PeriodicPrizeStrategy/rng-timeout-gt-60-secs\");\n    rngRequestTimeout = _rngRequestTimeout;\n    emit RngRequestTimeoutSet(rngRequestTimeout);\n  }\n\n  /// @notice Allows the owner to set the prize period in seconds.\n  /// @param _prizePeriodSeconds The new prize period in seconds.  Must be greater than zero.\n  function setPrizePeriodSeconds(uint256 _prizePeriodSeconds) external onlyOwner requireAwardNotInProgress {\n    _setPrizePeriodSeconds(_prizePeriodSeconds);\n  }\n\n  /// @notice Sets the prize period in seconds.\n  /// @param _prizePeriodSeconds The new prize period in seconds.  Must be greater than zero.\n  function _setPrizePeriodSeconds(uint256 _prizePeriodSeconds) internal {\n    require(_prizePeriodSeconds > 0, \"PeriodicPrizeStrategy/prize-period-greater-than-zero\");\n    prizePeriodSeconds = _prizePeriodSeconds;\n\n    emit PrizePeriodSecondsUpdated(prizePeriodSeconds);\n  }\n\n  /// @notice Gets the current list of External ERC20 tokens that will be awarded with the current prize\n  /// @return An array of External ERC20 token addresses\n  function getExternalErc20Awards() external view returns (address[] memory) {\n    return externalErc20s.addressArray();\n  }\n\n  /// @notice Adds an external ERC20 token type as an additional prize that can be awarded\n  /// @dev Only the Prize-Strategy owner/creator can assign external tokens,\n  /// and they must be approved by the Prize-Pool\n  /// @param _externalErc20 The address of an ERC20 token to be awarded\n  function addExternalErc20Award(IERC20Upgradeable _externalErc20) external onlyOwnerOrListener requireAwardNotInProgress {\n    _addExternalErc20Award(_externalErc20);\n  }\n\n  function _addExternalErc20Award(IERC20Upgradeable _externalErc20) internal {\n    require(address(_externalErc20).isContract(), \"PeriodicPrizeStrategy/erc20-null\");\n    require(prizePool.canAwardExternal(address(_externalErc20)), \"PeriodicPrizeStrategy/cannot-award-external\");\n    (bool succeeded, bytes memory returnValue) = address(_externalErc20).staticcall(abi.encodeWithSignature(\"totalSupply()\"));\n    require(succeeded, \"PeriodicPrizeStrategy/erc20-invalid\");\n    externalErc20s.addAddress(address(_externalErc20));\n    emit ExternalErc20AwardAdded(_externalErc20);\n  }\n\n  function addExternalErc20Awards(IERC20Upgradeable[] calldata _externalErc20s) external onlyOwnerOrListener requireAwardNotInProgress {\n    for (uint256 i = 0; i < _externalErc20s.length; i++) {\n      _addExternalErc20Award(_externalErc20s[i]);\n    }\n  }\n\n  /// @notice Removes an external ERC20 token type as an additional prize that can be awarded\n  /// @dev Only the Prize-Strategy owner/creator can remove external tokens\n  /// @param _externalErc20 The address of an ERC20 token to be removed\n  /// @param _prevExternalErc20 The address of the previous ERC20 token in the `externalErc20s` list.\n  /// If the ERC20 is the first address, then the previous address is the SENTINEL address: 0x0000000000000000000000000000000000000001\n  function removeExternalErc20Award(IERC20Upgradeable _externalErc20, IERC20Upgradeable _prevExternalErc20) external onlyOwner requireAwardNotInProgress {\n    externalErc20s.removeAddress(address(_prevExternalErc20), address(_externalErc20));\n    emit ExternalErc20AwardRemoved(_externalErc20);\n  }\n\n  /// @notice Gets the current list of External ERC721 tokens that will be awarded with the current prize\n  /// @return An array of External ERC721 token addresses\n  function getExternalErc721Awards() external view returns (address[] memory) {\n    return externalErc721s.addressArray();\n  }\n\n  /// @notice Gets the current list of External ERC721 tokens that will be awarded with the current prize\n  /// @return An array of External ERC721 token addresses\n  function getExternalErc721AwardTokenIds(IERC721Upgradeable _externalErc721) external view returns (uint256[] memory) {\n    return externalErc721TokenIds[_externalErc721];\n  }\n\n  /// @notice Adds an external ERC721 token as an additional prize that can be awarded\n  /// @dev Only the Prize-Strategy owner/creator can assign external tokens,\n  /// and they must be approved by the Prize-Pool\n  /// NOTE: The NFT must already be owned by the Prize-Pool\n  /// @param _externalErc721 The address of an ERC721 token to be awarded\n  /// @param _tokenIds An array of token IDs of the ERC721 to be awarded\n  function addExternalErc721Award(IERC721Upgradeable _externalErc721, uint256[] calldata _tokenIds) external onlyOwnerOrListener requireAwardNotInProgress {\n    require(prizePool.canAwardExternal(address(_externalErc721)), \"PeriodicPrizeStrategy/cannot-award-external\");\n    require(address(_externalErc721).supportsInterface(Constants.ERC165_INTERFACE_ID_ERC721), \"PeriodicPrizeStrategy/erc721-invalid\");\n    \n    if (!externalErc721s.contains(address(_externalErc721))) {\n      externalErc721s.addAddress(address(_externalErc721));\n    }\n\n    for (uint256 i = 0; i < _tokenIds.length; i++) {\n      _addExternalErc721Award(_externalErc721, _tokenIds[i]);\n    }\n\n    emit ExternalErc721AwardAdded(_externalErc721, _tokenIds);\n  }\n\n  function _addExternalErc721Award(IERC721Upgradeable _externalErc721, uint256 _tokenId) internal {\n    require(IERC721Upgradeable(_externalErc721).ownerOf(_tokenId) == address(prizePool), \"PeriodicPrizeStrategy/unavailable-token\");\n    for (uint256 i = 0; i < externalErc721TokenIds[_externalErc721].length; i++) {\n      if (externalErc721TokenIds[_externalErc721][i] == _tokenId) {\n        revert(\"PeriodicPrizeStrategy/erc721-duplicate\");\n      }\n    }\n    externalErc721TokenIds[_externalErc721].push(_tokenId);\n  }\n\n  /// @notice Removes an external ERC721 token as an additional prize that can be awarded\n  /// @dev Only the Prize-Strategy owner/creator can remove external tokens\n  /// @param _externalErc721 The address of an ERC721 token to be removed\n  /// @param _prevExternalErc721 The address of the previous ERC721 token in the list.\n  /// If no previous, then pass the SENTINEL address: 0x0000000000000000000000000000000000000001\n  function removeExternalErc721Award(\n    IERC721Upgradeable _externalErc721,\n    IERC721Upgradeable _prevExternalErc721\n  )\n    external\n    onlyOwner\n    requireAwardNotInProgress\n  {\n    externalErc721s.removeAddress(address(_prevExternalErc721), address(_externalErc721));\n    _removeExternalErc721AwardTokens(_externalErc721);\n  }\n\n  function _removeExternalErc721AwardTokens(\n    IERC721Upgradeable _externalErc721\n  )\n    internal\n  {\n    delete externalErc721TokenIds[_externalErc721];\n    emit ExternalErc721AwardRemoved(_externalErc721);\n  }\n\n  function _requireAwardNotInProgress() internal view {\n    uint256 currentBlock = _currentBlock();\n    require(rngRequest.lockBlock == 0 || currentBlock < rngRequest.lockBlock, \"PeriodicPrizeStrategy/rng-in-flight\");\n  }\n\n  function isRngTimedOut() public view returns (bool) {\n    if (rngRequest.requestedAt == 0) {\n      return false;\n    } else {\n      return _currentTime() > uint256(rngRequestTimeout).add(rngRequest.requestedAt);\n    }\n  }\n\n  modifier onlyOwnerOrListener() {\n    require(_msgSender() == owner() ||\n            _msgSender() == address(periodicPrizeStrategyListener) ||\n            _msgSender() == address(beforeAwardListener),\n            \"PeriodicPrizeStrategy/only-owner-or-listener\");\n    _;\n  }\n\n  modifier requireAwardNotInProgress() {\n    _requireAwardNotInProgress();\n    _;\n  }\n\n  modifier requireCanStartAward() {\n    require(_isPrizePeriodOver(), \"PeriodicPrizeStrategy/prize-period-not-over\");\n    require(!isRngRequested(), \"PeriodicPrizeStrategy/rng-already-requested\");\n    _;\n  }\n\n  modifier requireCanCompleteAward() {\n    require(isRngRequested(), \"PeriodicPrizeStrategy/rng-not-requested\");\n    require(isRngCompleted(), \"PeriodicPrizeStrategy/rng-not-complete\");\n    _;\n  }\n\n  modifier onlyPrizePool() {\n    require(_msgSender() == address(prizePool), \"PeriodicPrizeStrategy/only-prize-pool\");\n    _;\n  }\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/Initializable.sol\";\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n    address private _owner;\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Initializes the contract setting the deployer as the initial owner.\n     */\n    function __Ownable_init() internal initializer {\n        __Context_init_unchained();\n        __Ownable_init_unchained();\n    }\n\n    function __Ownable_init_unchained() internal initializer {\n        address msgSender = _msgSender();\n        _owner = msgSender;\n        emit OwnershipTransferred(address(0), msgSender);\n    }\n\n    /**\n     * @dev Returns the address of the current owner.\n     */\n    function owner() public view virtual returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n        _;\n    }\n\n    /**\n     * @dev Leaves the contract without owner. It will not be possible to call\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\n     *\n     * NOTE: Renouncing ownership will leave the contract without an owner,\n     * thereby removing any functionality that is only available to the owner.\n     */\n    function renounceOwnership() public virtual onlyOwner {\n        emit OwnershipTransferred(_owner, address(0));\n        _owner = address(0);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public virtual onlyOwner {\n        require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n        emit OwnershipTransferred(_owner, newOwner);\n        _owner = newOwner;\n    }\n    uint256[49] private __gap;\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCastUpgradeable {\n\n    /**\n     * @dev Returns the downcasted uint128 from uint256, reverting on\n     * overflow (when the input is greater than largest uint128).\n     *\n     * Counterpart to Solidity's `uint128` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 128 bits\n     */\n    function toUint128(uint256 value) internal pure returns (uint128) {\n        require(value < 2**128, \"SafeCast: value doesn\\'t fit in 128 bits\");\n        return uint128(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint64 from uint256, reverting on\n     * overflow (when the input is greater than largest uint64).\n     *\n     * Counterpart to Solidity's `uint64` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 64 bits\n     */\n    function toUint64(uint256 value) internal pure returns (uint64) {\n        require(value < 2**64, \"SafeCast: value doesn\\'t fit in 64 bits\");\n        return uint64(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint32 from uint256, reverting on\n     * overflow (when the input is greater than largest uint32).\n     *\n     * Counterpart to Solidity's `uint32` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 32 bits\n     */\n    function toUint32(uint256 value) internal pure returns (uint32) {\n        require(value < 2**32, \"SafeCast: value doesn\\'t fit in 32 bits\");\n        return uint32(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint16 from uint256, reverting on\n     * overflow (when the input is greater than largest uint16).\n     *\n     * Counterpart to Solidity's `uint16` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 16 bits\n     */\n    function toUint16(uint256 value) internal pure returns (uint16) {\n        require(value < 2**16, \"SafeCast: value doesn\\'t fit in 16 bits\");\n        return uint16(value);\n    }\n\n    /**\n     * @dev Returns the downcasted uint8 from uint256, reverting on\n     * overflow (when the input is greater than largest uint8).\n     *\n     * Counterpart to Solidity's `uint8` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 8 bits.\n     */\n    function toUint8(uint256 value) internal pure returns (uint8) {\n        require(value < 2**8, \"SafeCast: value doesn\\'t fit in 8 bits\");\n        return uint8(value);\n    }\n\n    /**\n     * @dev Converts a signed int256 into an unsigned uint256.\n     *\n     * Requirements:\n     *\n     * - input must be greater than or equal to 0.\n     */\n    function toUint256(int256 value) internal pure returns (uint256) {\n        require(value >= 0, \"SafeCast: value must be positive\");\n        return uint256(value);\n    }\n\n    /**\n     * @dev Returns the downcasted int128 from int256, reverting on\n     * overflow (when the input is less than smallest int128 or\n     * greater than largest int128).\n     *\n     * Counterpart to Solidity's `int128` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 128 bits\n     *\n     * _Available since v3.1._\n     */\n    function toInt128(int256 value) internal pure returns (int128) {\n        require(value >= -2**127 && value < 2**127, \"SafeCast: value doesn\\'t fit in 128 bits\");\n        return int128(value);\n    }\n\n    /**\n     * @dev Returns the downcasted int64 from int256, reverting on\n     * overflow (when the input is less than smallest int64 or\n     * greater than largest int64).\n     *\n     * Counterpart to Solidity's `int64` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 64 bits\n     *\n     * _Available since v3.1._\n     */\n    function toInt64(int256 value) internal pure returns (int64) {\n        require(value >= -2**63 && value < 2**63, \"SafeCast: value doesn\\'t fit in 64 bits\");\n        return int64(value);\n    }\n\n    /**\n     * @dev Returns the downcasted int32 from int256, reverting on\n     * overflow (when the input is less than smallest int32 or\n     * greater than largest int32).\n     *\n     * Counterpart to Solidity's `int32` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 32 bits\n     *\n     * _Available since v3.1._\n     */\n    function toInt32(int256 value) internal pure returns (int32) {\n        require(value >= -2**31 && value < 2**31, \"SafeCast: value doesn\\'t fit in 32 bits\");\n        return int32(value);\n    }\n\n    /**\n     * @dev Returns the downcasted int16 from int256, reverting on\n     * overflow (when the input is less than smallest int16 or\n     * greater than largest int16).\n     *\n     * Counterpart to Solidity's `int16` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 16 bits\n     *\n     * _Available since v3.1._\n     */\n    function toInt16(int256 value) internal pure returns (int16) {\n        require(value >= -2**15 && value < 2**15, \"SafeCast: value doesn\\'t fit in 16 bits\");\n        return int16(value);\n    }\n\n    /**\n     * @dev Returns the downcasted int8 from int256, reverting on\n     * overflow (when the input is less than smallest int8 or\n     * greater than largest int8).\n     *\n     * Counterpart to Solidity's `int8` operator.\n     *\n     * Requirements:\n     *\n     * - input must fit into 8 bits.\n     *\n     * _Available since v3.1._\n     */\n    function toInt8(int256 value) internal pure returns (int8) {\n        require(value >= -2**7 && value < 2**7, \"SafeCast: value doesn\\'t fit in 8 bits\");\n        return int8(value);\n    }\n\n    /**\n     * @dev Converts an unsigned uint256 into a signed int256.\n     *\n     * Requirements:\n     *\n     * - input must be less than or equal to maxInt256.\n     */\n    function toInt256(uint256 value) internal pure returns (int256) {\n        require(value < 2**255, \"SafeCast: value doesn't fit in an int256\");\n        return int256(value);\n    }\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.2 <0.8.0;\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165CheckerUpgradeable {\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\n\n    /*\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\n     */\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\n\n    /**\n     * @dev Returns true if `account` supports the {IERC165} interface,\n     */\n    function supportsERC165(address account) internal view returns (bool) {\n        // Any contract that implements ERC165 must explicitly indicate support of\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\n    }\n\n    /**\n     * @dev Returns true if `account` supports the interface defined by\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\n     *\n     * See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n        // query support of both ERC165 as per the spec and support of _interfaceId\n        return supportsERC165(account) &&\n            _supportsERC165Interface(account, interfaceId);\n    }\n\n    /**\n     * @dev Returns a boolean array where each value corresponds to the\n     * interfaces passed in and whether they're supported or not. This allows\n     * you to batch check interfaces for a contract where your expectation\n     * is that some interfaces may not be supported.\n     *\n     * See {IERC165-supportsInterface}.\n     *\n     * _Available since v3.4._\n     */\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n        // query support of ERC165 itself\n        if (supportsERC165(account)) {\n            // query support of each interface in interfaceIds\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\n            }\n        }\n\n        return interfaceIdsSupported;\n    }\n\n    /**\n     * @dev Returns true if `account` supports all the interfaces defined in\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n     *\n     * Batch-querying can lead to gas savings by skipping repeated checks for\n     * {IERC165} support.\n     *\n     * See {IERC165-supportsInterface}.\n     */\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n        // query support of ERC165 itself\n        if (!supportsERC165(account)) {\n            return false;\n        }\n\n        // query support of each interface in _interfaceIds\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\n                return false;\n            }\n        }\n\n        // all interfaces supported\n        return true;\n    }\n\n    /**\n     * @notice Query if a contract implements an interface, does not check ERC165 support\n     * @param account The address of the contract to query for support of an interface\n     * @param interfaceId The interface identifier, as specified in ERC-165\n     * @return true if the contract at account indicates support of the interface with\n     * identifier interfaceId, false otherwise\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\n     * the behavior of this method is undefined. This precondition can be checked\n     * with {supportsERC165}.\n     * Interface identification is specified in ERC-165.\n     */\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\n        // success determines whether the staticcall succeeded and result determines\n        // whether the contract at account indicates support of _interfaceId\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\n\n        return (success && result);\n    }\n\n    /**\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\n     * @param account The address of the contract to query for support of an interface\n     * @param interfaceId The interface identifier, as specified in ERC-165\n     * @return success true if the STATICCALL succeeded, false otherwise\n     * @return result true if the STATICCALL succeeded and the contract at account\n     * indicates support of the interface with identifier interfaceId, false otherwise\n     */\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\n        private\n        view\n        returns (bool, bool)\n    {\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\n        if (result.length < 32) return (false, false);\n        return (success, abi.decode(result, (bool)));\n    }\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"./IERC20Upgradeable.sol\";\nimport \"../../math/SafeMathUpgradeable.sol\";\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20Upgradeable {\n    using SafeMathUpgradeable for uint256;\n    using AddressUpgradeable for address;\n\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n    }\n\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n    }\n\n    /**\n     * @dev Deprecated. This function has issues similar to the ones found in\n     * {IERC20-approve}, and its usage is discouraged.\n     *\n     * Whenever possible, use {safeIncreaseAllowance} and\n     * {safeDecreaseAllowance} instead.\n     */\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\n        // safeApprove should only be called when setting an initial allowance,\n        // or when resetting it to zero. To increase and decrease it, use\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n        // solhint-disable-next-line max-line-length\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\n            \"SafeERC20: approve from non-zero to non-zero allowance\"\n        );\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n    }\n\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n    }\n\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \"SafeERC20: decreased allowance below zero\");\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     */\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n        // the target address contains contract code and also asserts for success in the low-level call.\n\n        bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n        if (returndata.length > 0) { // Return data is optional\n            // solhint-disable-next-line max-line-length\n            require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n        }\n    }\n}\n"
      },
      "@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity >=0.6.0;\n\n/// @title Random Number Generator Interface\n/// @notice Provides an interface for requesting random numbers from 3rd-party RNG services (Chainlink VRF, Starkware VDF, etc..)\ninterface RNGInterface {\n\n  /// @notice Emitted when a new request for a random number has been submitted\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\n  /// @param sender The indexed address of the sender of the request\n  event RandomNumberRequested(uint32 indexed requestId, address indexed sender);\n\n  /// @notice Emitted when an existing request for a random number has been completed\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\n  /// @param randomNumber The random number produced by the 3rd-party service\n  event RandomNumberCompleted(uint32 indexed requestId, uint256 randomNumber);\n\n  /// @notice Gets the last request id used by the RNG service\n  /// @return requestId The last request id used in the last request\n  function getLastRequestId() external view returns (uint32 requestId);\n\n  /// @notice Gets the Fee for making a Request against an RNG service\n  /// @return feeToken The address of the token that is used to pay fees\n  /// @return requestFee The fee required to be paid to make a request\n  function getRequestFee() external view returns (address feeToken, uint256 requestFee);\n\n  /// @notice Sends a request for a random number to the 3rd-party service\n  /// @dev Some services will complete the request immediately, others may have a time-delay\n  /// @dev Some services require payment in the form of a token, such as $LINK for Chainlink VRF\n  /// @return requestId The ID of the request used to get the results of the RNG service\n  /// @return lockBlock The block number at which the RNG service will start generating time-delayed randomness.  The calling contract\n  /// should \"lock\" all activity until the result is available via the `requestId`\n  function requestRandomNumber() external returns (uint32 requestId, uint32 lockBlock);\n\n  /// @notice Checks if the request for randomness from the 3rd-party service has completed\n  /// @dev For time-delayed requests, this function is used to check/confirm completion\n  /// @param requestId The ID of the request used to get the results of the RNG service\n  /// @return isCompleted True if the request has completed and a random number is available, false otherwise\n  function isRequestComplete(uint32 requestId) external view returns (bool isCompleted);\n\n  /// @notice Gets the random number produced by the 3rd-party service\n  /// @param requestId The ID of the request used to get the results of the RNG service\n  /// @return randomNum The random number\n  function randomNumber(uint32 requestId) external returns (uint256 randomNum);\n}\n"
      },
      "@pooltogether/fixed-point/contracts/FixedPoint.sol": {
        "content": "/**\nCopyright 2020 PoolTogether Inc.\n\nThis file is part of PoolTogether.\n\nPoolTogether is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation under version 3 of the License.\n\nPoolTogether is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\";\n\n/**\n * @author Brendan Asselstine\n * @notice Provides basic fixed point math calculations.\n *\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\n */\nlibrary FixedPoint {\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\n\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\n    uint256 internal constant SCALE = 1e18;\n\n    /**\n        * Calculates a Fixed18 mantissa given the numerator and denominator\n        *\n        * The mantissa = (numerator * 1e18) / denominator\n        *\n        * @param numerator The mantissa numerator\n        * @param denominator The mantissa denominator\n        * @return The mantissa of the fraction\n        */\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\n        uint256 mantissa = numerator.mul(SCALE);\n        mantissa = mantissa.div(denominator);\n        return mantissa;\n    }\n\n    /**\n        * Multiplies a Fixed18 number by an integer.\n        *\n        * @param b The whole integer to multiply\n        * @param mantissa The Fixed18 number\n        * @return An integer that is the result of multiplying the params.\n        */\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\n        uint256 result = mantissa.mul(b);\n        result = result.div(SCALE);\n        return result;\n    }\n\n    /**\n    * Divides an integer by a fixed point 18 mantissa\n    *\n    * @param dividend The integer to divide\n    * @param mantissa The fixed point 18 number to serve as the divisor\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\n    */\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\n        uint256 result = SCALE.mul(dividend);\n        result = result.div(mantissa);\n        return result;\n    }\n}\n"
      },
      "contracts/token/TokenListener.sol": {
        "content": "pragma solidity ^0.6.4;\n\nimport \"./TokenListenerInterface.sol\";\nimport \"./TokenListenerLibrary.sol\";\nimport \"../Constants.sol\";\n\nabstract contract TokenListener is TokenListenerInterface {\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\n    return (\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \n      interfaceId == TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER\n    );\n  }\n}\n"
      },
      "contracts/prize-pool/PrizePool.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\";\nimport \"@pooltogether/fixed-point/contracts/FixedPoint.sol\";\n\nimport \"../external/compound/ICompLike.sol\";\nimport \"../registry/RegistryInterface.sol\";\nimport \"../reserve/ReserveInterface.sol\";\nimport \"../token/TokenListenerInterface.sol\";\nimport \"../token/TokenListenerLibrary.sol\";\nimport \"../token/ControlledToken.sol\";\nimport \"../token/TokenControllerInterface.sol\";\nimport \"../utils/MappedSinglyLinkedList.sol\";\nimport \"./PrizePoolInterface.sol\";\n\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\n  using SafeMathUpgradeable for uint256;\n  using SafeCastUpgradeable for uint256;\n  using SafeERC20Upgradeable for IERC20Upgradeable;\n  using SafeERC20Upgradeable for IERC721Upgradeable;\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\n  using ERC165CheckerUpgradeable for address;\n\n  /// @dev Emitted when an instance is initialized\n  event Initialized(\n    address reserveRegistry,\n    uint256 maxExitFeeMantissa\n  );\n\n  /// @dev Event emitted when controlled token is added\n  event ControlledTokenAdded(\n    ControlledTokenInterface indexed token\n  );\n\n  /// @dev Emitted when reserve is captured.\n  event ReserveFeeCaptured(\n    uint256 amount\n  );\n\n  event AwardCaptured(\n    uint256 amount\n  );\n\n  /// @dev Event emitted when assets are deposited\n  event Deposited(\n    address indexed operator,\n    address indexed to,\n    address indexed token,\n    uint256 amount,\n    address referrer\n  );\n\n  /// @dev Event emitted when interest is awarded to a winner\n  event Awarded(\n    address indexed winner,\n    address indexed token,\n    uint256 amount\n  );\n\n  /// @dev Event emitted when external ERC20s are awarded to a winner\n  event AwardedExternalERC20(\n    address indexed winner,\n    address indexed token,\n    uint256 amount\n  );\n\n  /// @dev Event emitted when external ERC20s are transferred out\n  event TransferredExternalERC20(\n    address indexed to,\n    address indexed token,\n    uint256 amount\n  );\n\n  /// @dev Event emitted when external ERC721s are awarded to a winner\n  event AwardedExternalERC721(\n    address indexed winner,\n    address indexed token,\n    uint256[] tokenIds\n  );\n\n  /// @dev Event emitted when assets are withdrawn instantly\n  event InstantWithdrawal(\n    address indexed operator,\n    address indexed from,\n    address indexed token,\n    uint256 amount,\n    uint256 redeemed,\n    uint256 exitFee\n  );\n\n  event ReserveWithdrawal(\n    address indexed to,\n    uint256 amount\n  );\n\n  /// @dev Event emitted when the Liquidity Cap is set\n  event LiquidityCapSet(\n    uint256 liquidityCap\n  );\n\n  /// @dev Event emitted when the Credit plan is set\n  event CreditPlanSet(\n    address token,\n    uint128 creditLimitMantissa,\n    uint128 creditRateMantissa\n  );\n\n  /// @dev Event emitted when the Prize Strategy is set\n  event PrizeStrategySet(\n    address indexed prizeStrategy\n  );\n\n  /// @dev Emitted when credit is minted\n  event CreditMinted(\n    address indexed user,\n    address indexed token,\n    uint256 amount\n  );\n\n  /// @dev Emitted when credit is burned\n  event CreditBurned(\n    address indexed user,\n    address indexed token,\n    uint256 amount\n  );\n\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\n  event ErrorAwardingExternalERC721(bytes error);\n\n\n  struct CreditPlan {\n    uint128 creditLimitMantissa;\n    uint128 creditRateMantissa;\n  }\n\n  struct CreditBalance {\n    uint192 balance;\n    uint32 timestamp;\n    bool initialized;\n  }\n\n  /// @notice Semver Version\n  string constant public VERSION = \"3.4.5\";\n\n  /// @dev Reserve to which reserve fees are sent\n  RegistryInterface public reserveRegistry;\n\n  /// @dev An array of all the controlled tokens\n  ControlledTokenInterface[] internal _tokens;\n\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\n  TokenListenerInterface public prizeStrategy;\n\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\n  /// For example, if the maxExitFeeMantissa is \"0.1 ether\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\n  uint256 public maxExitFeeMantissa;\n\n  /// @dev The total funds that have been allocated to the reserve\n  uint256 public reserveTotalSupply;\n\n  /// @dev The total amount of funds that the prize pool can hold.\n  uint256 public liquidityCap;\n\n  /// @dev the The awardable balance\n  uint256 internal _currentAwardBalance;\n\n  /// @dev Stores the credit plan for each token.\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\n\n  /// @dev Stores each users balance of credit per token.\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\n\n  /// @notice Initializes the Prize Pool\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\n  /// @param _maxExitFeeMantissa The maximum exit fee size\n  function initialize (\n    RegistryInterface _reserveRegistry,\n    ControlledTokenInterface[] memory _controlledTokens,\n    uint256 _maxExitFeeMantissa\n  )\n    public\n    initializer\n  {\n    require(address(_reserveRegistry) != address(0), \"PrizePool/reserveRegistry-not-zero\");\n    uint256 controlledTokensLength = _controlledTokens.length;\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\n\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\n      _addControlledToken(controlledToken, i);\n    }\n    __Ownable_init();\n    __ReentrancyGuard_init();\n    _setLiquidityCap(uint256(-1));\n\n    reserveRegistry = _reserveRegistry;\n    maxExitFeeMantissa = _maxExitFeeMantissa;\n\n    emit Initialized(\n      address(_reserveRegistry),\n      maxExitFeeMantissa\n    );\n  }\n\n  /// @dev Returns the address of the underlying ERC20 asset\n  /// @return The address of the asset\n  function token() external override view returns (address) {\n    return address(_token());\n  }\n\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\n  /// @return The underlying balance of assets\n  function balance() external returns (uint256) {\n    return _balance();\n  }\n\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\n  /// @param _externalToken The address of the token to check\n  /// @return True if the token may be awarded, false otherwise\n  function canAwardExternal(address _externalToken) external view returns (bool) {\n    return _canAwardExternal(_externalToken);\n  }\n\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\n  /// @param to The address receiving the newly minted tokens\n  /// @param amount The amount of assets to deposit\n  /// @param controlledToken The address of the type of token the user is minting\n  /// @param referrer The referrer of the deposit\n  function depositTo(\n    address to,\n    uint256 amount,\n    address controlledToken,\n    address referrer\n  )\n    external override\n    nonReentrant\n    onlyControlledToken(controlledToken)\n    canAddLiquidity(amount)\n  {\n    address operator = _msgSender();\n\n    _mint(to, amount, controlledToken, referrer);\n\n    _token().safeTransferFrom(operator, address(this), amount);\n    _supply(amount);\n\n    emit Deposited(operator, to, controlledToken, amount, referrer);\n  }\n\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\n  /// @param from The address to redeem tokens from.\n  /// @param amount The amount of tokens to redeem for assets.\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\n  /// @return The actual exit fee paid\n  function withdrawInstantlyFrom(\n    address from,\n    uint256 amount,\n    address controlledToken,\n    uint256 maximumExitFee\n  )\n    external override\n    nonReentrant\n    onlyControlledToken(controlledToken)\n    returns (uint256)\n  {\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\n    require(exitFee <= maximumExitFee, \"PrizePool/exit-fee-exceeds-user-maximum\");\n\n    // burn the credit\n    _burnCredit(from, controlledToken, burnedCredit);\n\n    // burn the tickets\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\n\n    // redeem the tickets less the fee\n    uint256 amountLessFee = amount.sub(exitFee);\n    uint256 redeemed = _redeem(amountLessFee);\n\n    _token().safeTransfer(from, redeemed);\n\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\n\n    return exitFee;\n  }\n\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\n  /// @param exitFee The exit fee to check against the limit\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\n    if (exitFee > maxFee) {\n      exitFee = maxFee;\n    }\n    return exitFee;\n  }\n\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\n  /// @param from The address the tokens are being transferred from (0 if minting)\n  /// @param to The address the tokens are being transferred to (0 if burning)\n  /// @param amount The amount of tokens being trasferred\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\n    if (from != address(0)) {\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\n      // first accrue credit for their old balance\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\n\n      if (from != to) {\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\n      }\n\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\n    }\n    if (to != address(0) && to != from) {\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\n    }\n    // if we aren't minting\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\n    }\n  }\n\n  /// @notice Returns the balance that is available to award.\n  /// @dev captureAwardBalance() should be called first\n  /// @return The total amount of assets to be awarded for the current prize\n  function awardBalance() external override view returns (uint256) {\n    return _currentAwardBalance;\n  }\n\n  /// @notice Captures any available interest as award balance.\n  /// @dev This function also captures the reserve fees.\n  /// @return The total amount of assets to be awarded for the current prize\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\n    uint256 tokenTotalSupply = _tokenTotalSupply();\n\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\n    uint256 currentBalance = _balance();\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\n\n    if (unaccountedPrizeBalance > 0) {\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\n      if (reserveFee > 0) {\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\n        emit ReserveFeeCaptured(reserveFee);\n      }\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\n\n      emit AwardCaptured(unaccountedPrizeBalance);\n    }\n\n    return _currentAwardBalance;\n  }\n\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\n\n    uint256 amount = reserveTotalSupply;\n    reserveTotalSupply = 0;\n    uint256 redeemed = _redeem(amount);\n\n    _token().safeTransfer(address(to), redeemed);\n\n    emit ReserveWithdrawal(to, amount);\n\n    return redeemed;\n  }\n\n  /// @notice Called by the prize strategy to award prizes.\n  /// @dev The amount awarded must be less than the awardBalance()\n  /// @param to The address of the winner that receives the award\n  /// @param amount The amount of assets to be awarded\n  /// @param controlledToken The address of the asset token being awarded\n  function award(\n    address to,\n    uint256 amount,\n    address controlledToken\n  )\n    external override\n    onlyPrizeStrategy\n    onlyControlledToken(controlledToken)\n  {\n    if (amount == 0) {\n      return;\n    }\n\n    require(amount <= _currentAwardBalance, \"PrizePool/award-exceeds-avail\");\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\n\n    _mint(to, amount, controlledToken, address(0));\n\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\n\n    emit Awarded(to, controlledToken, amount);\n  }\n\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\n  /// @param to The address of the winner that receives the award\n  /// @param amount The amount of external assets to be awarded\n  /// @param externalToken The address of the external asset token being awarded\n  function transferExternalERC20(\n    address to,\n    address externalToken,\n    uint256 amount\n  )\n    external override\n    onlyPrizeStrategy\n  {\n    if (_transferOut(to, externalToken, amount)) {\n      emit TransferredExternalERC20(to, externalToken, amount);\n    }\n  }\n\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\n  /// @param to The address of the winner that receives the award\n  /// @param amount The amount of external assets to be awarded\n  /// @param externalToken The address of the external asset token being awarded\n  function awardExternalERC20(\n    address to,\n    address externalToken,\n    uint256 amount\n  )\n    external override\n    onlyPrizeStrategy\n  {\n    if (_transferOut(to, externalToken, amount)) {\n      emit AwardedExternalERC20(to, externalToken, amount);\n    }\n  }\n\n  function _transferOut(\n    address to,\n    address externalToken,\n    uint256 amount\n  )\n    internal\n    returns (bool)\n  {\n    require(_canAwardExternal(externalToken), \"PrizePool/invalid-external-token\");\n\n    if (amount == 0) {\n      return false;\n    }\n\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\n\n    return true;\n  }\n\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\n  /// @param to The user who is receiving the tokens\n  /// @param amount The amount of tokens they are receiving\n  /// @param controlledToken The token that is going to be minted\n  /// @param referrer The user who referred the minting\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\n    if (address(prizeStrategy) != address(0)) {\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\n    }\n    ControlledToken(controlledToken).controllerMint(to, amount);\n  }\n\n  /// @notice Called by the prize strategy to award external ERC721 prizes\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\n  /// @param to The address of the winner that receives the award\n  /// @param externalToken The address of the external NFT token being awarded\n  /// @param tokenIds An array of NFT Token IDs to be transferred\n  function awardExternalERC721(\n    address to,\n    address externalToken,\n    uint256[] calldata tokenIds\n  )\n    external override\n    onlyPrizeStrategy\n  {\n    require(_canAwardExternal(externalToken), \"PrizePool/invalid-external-token\");\n\n    if (tokenIds.length == 0) {\n      return;\n    }\n\n    for (uint256 i = 0; i < tokenIds.length; i++) {\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\n\n      }\n      catch(bytes memory error){\n        emit ErrorAwardingExternalERC721(error);\n      }\n      \n    }\n\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\n  }\n\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\n  /// @param amount The prize amount\n  /// @return The size of the reserve portion of the prize\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\n    if (address(reserve) == address(0)) {\n      return 0;\n    }\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\n    if (reserveRateMantissa == 0) {\n      return 0;\n    }\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\n  }\n\n  /// @notice Calculates the early exit fee for the given amount\n  /// @param from The user who is withdrawing\n  /// @param controlledToken The type of collateral being withdrawn\n  /// @param amount The amount of collateral to be withdrawn\n  /// @return exitFee The exit fee\n  /// @return burnedCredit The user's credit that was burned\n  function calculateEarlyExitFee(\n    address from,\n    address controlledToken,\n    uint256 amount\n  )\n    external override\n    returns (\n      uint256 exitFee,\n      uint256 burnedCredit\n    )\n  {\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\n  }\n\n  /// @dev Calculates the early exit fee for the given amount\n  /// @param amount The amount of collateral to be withdrawn\n  /// @return Exit fee\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\n    return _limitExitFee(\n      amount,\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\n    );\n  }\n\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\n  /// @param _principal The principal amount on which interest is accruing\n  /// @param _interest The amount of interest that must accrue\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\n  function estimateCreditAccrualTime(\n    address _controlledToken,\n    uint256 _principal,\n    uint256 _interest\n  )\n    external override\n    view\n    returns (uint256 durationSeconds)\n  {\n    durationSeconds =_estimateCreditAccrualTime(\n      _controlledToken,\n      _principal,\n      _interest\n    );\n  }\n\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\n  /// @param _principal The principal amount on which interest is accruing\n  /// @param _interest The amount of interest that must accrue\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\n  function _estimateCreditAccrualTime(\n    address _controlledToken,\n    uint256 _principal,\n    uint256 _interest\n  )\n    internal\n    view\n    returns (uint256 durationSeconds)\n  {\n    // interest = credit rate * principal * time\n    // => time = interest / (credit rate * principal)\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\n    if (accruedPerSecond == 0) {\n      return 0;\n    }\n    return _interest.div(accruedPerSecond);\n  }\n\n  /// @notice Burns a users credit.\n  /// @param user The user whose credit should be burned\n  /// @param credit The amount of credit to burn\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\n\n    emit CreditBurned(user, controlledToken, credit);\n  }\n\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\n  /// @param user The user for whom to accrue credit\n  /// @param controlledToken The controlled token whose balance we are checking\n  /// @param controlledTokenBalance The balance to use for the user\n  /// @param extra Additional credit to be added\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\n    _updateCreditBalance(\n      user,\n      controlledToken,\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\n    );\n  }\n\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\n    uint256 newBalance;\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\n    if (!creditBalance.initialized) {\n      newBalance = 0;\n    } else {\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\n    }\n    return newBalance;\n  }\n\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\n\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\n      balance: newBalance.toUint128(),\n      timestamp: _currentTime().toUint32(),\n      initialized: true\n    });\n\n    if (oldBalance < newBalance) {\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\n    } \n    else if (newBalance < oldBalance) {\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\n    }\n  }\n\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\n  /// @param controlledToken The controlled token that the user holds\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\n  /// @param creditBalance The new credit balance to be checked\n  /// @return The users new credit balance.  Will not exceed the credit limit.\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\n      controlledTokenBalance,\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\n    );\n    if (creditBalance > creditLimit) {\n      creditBalance = creditLimit;\n    }\n\n    return creditBalance;\n  }\n\n  /// @notice Calculates the accrued interest for a user\n  /// @param user The user whose credit should be calculated.\n  /// @param controlledToken The controlled token that the user holds\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\n  /// @return The credit that has accrued since the last credit update.\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\n\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\n      return 0;\n    }\n\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\n  }\n\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\n  /// @param user The user whose credit balance should be returned\n  /// @return The balance of the users credit\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\n    return _tokenCreditBalances[controlledToken][user].balance;\n  }\n\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\n  /// @param _controlledToken The controlled token for whom to set the credit plan\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\n  function setCreditPlanOf(\n    address _controlledToken,\n    uint128 _creditRateMantissa,\n    uint128 _creditLimitMantissa\n  )\n    external override\n    onlyControlledToken(_controlledToken)\n    onlyOwner\n  {\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\n      creditLimitMantissa: _creditLimitMantissa,\n      creditRateMantissa: _creditRateMantissa\n    });\n\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\n  }\n\n  /// @notice Returns the credit rate of a controlled token\n  /// @param controlledToken The controlled token to retrieve the credit rates for\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\n  function creditPlanOf(\n    address controlledToken\n  )\n    external override\n    view\n    returns (\n      uint128 creditLimitMantissa,\n      uint128 creditRateMantissa\n    )\n  {\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\n  }\n\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\n  /// @param from The user who is withdrawing\n  /// @param controlledToken The token they are withdrawing\n  /// @param amount The amount of funds they are withdrawing\n  /// @return earlyExitFee The additional exit fee that should be charged.\n  /// @return creditBurned The amount of credit that will be burned\n  function _calculateEarlyExitFeeLessBurnedCredit(\n    address from,\n    address controlledToken,\n    uint256 amount\n  )\n    internal\n    returns (\n      uint256 earlyExitFee,\n      uint256 creditBurned\n    )\n  {\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\n    require(controlledTokenBalance >= amount, \"PrizePool/insuff-funds\");\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\n    /*\n    The credit is used *last*.  Always charge the fees up-front.\n\n    How to calculate:\n\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\n\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\n    */\n\n    // Determine available usable credit based on withdraw amount\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\n\n    uint256 availableCredit;\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\n    }\n\n    // Determine amount of credit to burn and amount of fees required\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\n    earlyExitFee = totalExitFee.sub(creditBurned);\n  }\n\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\n  /// @param _liquidityCap The new liquidity cap for the prize pool\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\n    _setLiquidityCap(_liquidityCap);\n  }\n\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\n    liquidityCap = _liquidityCap;\n    emit LiquidityCapSet(_liquidityCap);\n  }\n\n  /// @notice Adds a new controlled token\n  /// @param _controlledToken The controlled token to add.\n  /// @param index The index to add the controlledToken\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\n    require(_controlledToken.controller() == this, \"PrizePool/token-ctrlr-mismatch\");\n    \n    _tokens[index] = _controlledToken;\n    emit ControlledTokenAdded(_controlledToken);\n  }\n\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\n  /// @param _prizeStrategy The new prize strategy\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\n    _setPrizeStrategy(_prizeStrategy);\n  }\n\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\n  /// @param _prizeStrategy The new prize strategy\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\n    require(address(_prizeStrategy) != address(0), \"PrizePool/prizeStrategy-not-zero\");\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \"PrizePool/prizeStrategy-invalid\");\n    prizeStrategy = _prizeStrategy;\n\n    emit PrizeStrategySet(address(_prizeStrategy));\n  }\n\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\n  /// @return An array of controlled token addresses\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\n    return _tokens;\n  }\n\n  /// @dev Gets the current time as represented by the current block\n  /// @return The timestamp of the current block\n  function _currentTime() internal virtual view returns (uint256) {\n    return block.timestamp;\n  }\n\n  /// @notice The total of all controlled tokens\n  /// @return The current total of all tokens\n  function accountedBalance() external override view returns (uint256) {\n    return _tokenTotalSupply();\n  }\n\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\n  /// @param to The address to delegate to \n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\n    if (compLike.balanceOf(address(this)) > 0) {\n      compLike.delegate(to);\n    }\n  }\n  \n  /// @notice Required for ERC721 safe token transfers from smart contracts.\n  /// @param operator The address that acts on behalf of the owner\n  /// @param from The current owner of the NFT\n  /// @param tokenId The NFT to transfer\n  /// @param data Additional data with no specified format, sent in call to `_to`.\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\n  }\n\n  /// @notice The total of all controlled tokens\n  /// @return The current total of all tokens\n  function _tokenTotalSupply() internal view returns (uint256) {\n    uint256 total = reserveTotalSupply;\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \n    uint256 tokensLength = tokens.length;\n    \n    for(uint256 i = 0; i < tokensLength; i++){\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\n    }\n\n    return total;\n  }\n\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\n    uint256 tokenTotalSupply = _tokenTotalSupply();\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\n  }\n\n  /// @dev Checks if a specific token is controlled by the Prize Pool\n  /// @param controlledToken The address of the token to check\n  /// @return True if the token is a controlled token, false otherwise\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\n    uint256 tokensLength = tokens.length;\n\n    for(uint256 i = 0; i < tokensLength; i++) {\n      if(tokens[i] == controlledToken) return true;\n    }\n    return false;\n  }\n  \n  /// @dev Checks if a specific token is controlled by the Prize Pool\n  /// @param controlledToken The address of the token to check\n  /// @return True if the token is a controlled token, false otherwise\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\n    return _isControlled(controlledToken);\n  }\n\n  /// @notice Determines whether the passed token can be transferred out as an external award.\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\n  /// prize strategy should not be allowed to move those tokens.\n  /// @param _externalToken The address of the token to check\n  /// @return True if the token may be awarded, false otherwise\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\n\n  /// @notice Returns the ERC20 asset token used for deposits.\n  /// @return The ERC20 asset token\n  function _token() internal virtual view returns (IERC20Upgradeable);\n\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\n  /// @return The underlying balance of asset tokens\n  function _balance() internal virtual returns (uint256);\n\n  /// @notice Supplies asset tokens to the yield source.\n  /// @param mintAmount The amount of asset tokens to be supplied\n  function _supply(uint256 mintAmount) internal virtual;\n\n  /// @notice Redeems asset tokens from the yield source.\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\n  /// @return The actual amount of tokens that were redeemed.\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\n\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\n  /// @param controlledToken The address of the token to check\n  modifier onlyControlledToken(address controlledToken) {\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \"PrizePool/unknown-token\");\n    _;\n  }\n\n  /// @dev Function modifier to ensure caller is the prize-strategy\n  modifier onlyPrizeStrategy() {\n    require(_msgSender() == address(prizeStrategy), \"PrizePool/only-prizeStrategy\");\n    _;\n  }\n\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\n  modifier canAddLiquidity(uint256 _amount) {\n    require(_canAddLiquidity(_amount), \"PrizePool/exceeds-liquidity-cap\");\n    _;\n  }\n\n  modifier onlyReserve() {\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\n    require(address(reserve) == msg.sender, \"PrizePool/only-reserve\");\n    _;\n  }\n}\n"
      },
      "contracts/Constants.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nlibrary Constants {\n  bytes4 public constant ERC165_INTERFACE_ID_ERC165 = 0x01ffc9a7;\n  bytes4 public constant ERC165_INTERFACE_ID_ERC721 = 0x80ac58cd;\n}"
      },
      "contracts/prize-strategy/PeriodicPrizeStrategyListenerInterface.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\";\n\n/* solium-disable security/no-block-members */\ninterface PeriodicPrizeStrategyListenerInterface is IERC165Upgradeable {\n  function afterPrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\n}\n"
      },
      "contracts/prize-strategy/PeriodicPrizeStrategyListenerLibrary.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nlibrary PeriodicPrizeStrategyListenerLibrary {\n  /*\n    *     bytes4(keccak256('afterPrizePoolAwarded(uint256,uint256)')) == 0x575072c6\n    */\n  bytes4 public constant ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER = 0x575072c6;\n}\n"
      },
      "contracts/prize-strategy/BeforeAwardListener.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"./BeforeAwardListenerInterface.sol\";\nimport \"../Constants.sol\";\nimport \"./BeforeAwardListenerLibrary.sol\";\n\nabstract contract BeforeAwardListener is BeforeAwardListenerInterface {\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\n    return (\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \n      interfaceId == BeforeAwardListenerLibrary.ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER\n    );\n  }\n}"
      },
      "@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\n * checks.\n *\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\n * in bugs, because programmers usually assume that an overflow raises an\n * error, which is the standard behavior in high level programming languages.\n * `SafeMath` restores this intuition by reverting the transaction when an\n * operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n */\nlibrary OpenZeppelinSafeMath_V3_3_0 {\n    /**\n     * @dev Returns the addition of two unsigned integers, reverting on\n     * overflow.\n     *\n     * Counterpart to Solidity's `+` operator.\n     *\n     * Requirements:\n     *\n     * - Addition cannot overflow.\n     */\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\n        uint256 c = a + b;\n        require(c >= a, \"SafeMath: addition overflow\");\n\n        return c;\n    }\n\n    /**\n     * @dev Returns the subtraction of two unsigned integers, reverting on\n     * overflow (when the result is negative).\n     *\n     * Counterpart to Solidity's `-` operator.\n     *\n     * Requirements:\n     *\n     * - Subtraction cannot overflow.\n     */\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n        return sub(a, b, \"SafeMath: subtraction overflow\");\n    }\n\n    /**\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n     * overflow (when the result is negative).\n     *\n     * Counterpart to Solidity's `-` operator.\n     *\n     * Requirements:\n     *\n     * - Subtraction cannot overflow.\n     */\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n        require(b <= a, errorMessage);\n        uint256 c = a - b;\n\n        return c;\n    }\n\n    /**\n     * @dev Returns the multiplication of two unsigned integers, reverting on\n     * overflow.\n     *\n     * Counterpart to Solidity's `*` operator.\n     *\n     * Requirements:\n     *\n     * - Multiplication cannot overflow.\n     */\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n        // benefit is lost if 'b' is also tested.\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n        if (a == 0) {\n            return 0;\n        }\n\n        uint256 c = a * b;\n        require(c / a == b, \"SafeMath: multiplication overflow\");\n\n        return c;\n    }\n\n    /**\n     * @dev Returns the integer division of two unsigned integers. Reverts on\n     * division by zero. The result is rounded towards zero.\n     *\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\n     * uses an invalid opcode to revert (consuming all remaining gas).\n     *\n     * Requirements:\n     *\n     * - The divisor cannot be zero.\n     */\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\n        return div(a, b, \"SafeMath: division by zero\");\n    }\n\n    /**\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\n     * division by zero. The result is rounded towards zero.\n     *\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\n     * uses an invalid opcode to revert (consuming all remaining gas).\n     *\n     * Requirements:\n     *\n     * - The divisor cannot be zero.\n     */\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n        require(b > 0, errorMessage);\n        uint256 c = a / b;\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\n\n        return c;\n    }\n\n    /**\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n     * Reverts when dividing by zero.\n     *\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\n     * invalid opcode to revert (consuming all remaining gas).\n     *\n     * Requirements:\n     *\n     * - The divisor cannot be zero.\n     */\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n        return mod(a, b, \"SafeMath: modulo by zero\");\n    }\n\n    /**\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n     * Reverts with custom message when dividing by zero.\n     *\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\n     * invalid opcode to revert (consuming all remaining gas).\n     *\n     * Requirements:\n     *\n     * - The divisor cannot be zero.\n     */\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\n        require(b != 0, errorMessage);\n        return a % b;\n    }\n}\n"
      },
      "contracts/token/TokenListenerInterface.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity >=0.5.0 <0.7.0;\n\nimport \"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\";\n\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\ninterface TokenListenerInterface is IERC165Upgradeable {\n  /// @notice Called when tokens are minted.\n  /// @param to The address of the receiver of the minted tokens.\n  /// @param amount The amount of tokens being minted\n  /// @param controlledToken The address of the token that is being minted\n  /// @param referrer The address that referred the minting.\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\n\n  /// @notice Called when tokens are transferred or burned.\n  /// @param from The address of the sender of the token transfer\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\n  /// @param amount The amount of tokens transferred\n  /// @param controlledToken The address of the token that was transferred\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\n}\n"
      },
      "contracts/token/TokenListenerLibrary.sol": {
        "content": "pragma solidity 0.6.12;\n\nlibrary TokenListenerLibrary {\n  /*\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\n    *\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\n    */\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\n}"
      },
      "@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165Upgradeable {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\nimport \"../proxy/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n    // Booleans are more expensive than uint256 or any type that takes up a full\n    // word because each write operation emits an extra SLOAD to first read the\n    // slot's contents, replace the bits taken up by the boolean, and then write\n    // back. This is the compiler's defense against contract upgrades and\n    // pointer aliasing, and it cannot be disabled.\n\n    // The values being non-zero value makes deployment a bit more expensive,\n    // but in exchange the refund on every call to nonReentrant will be lower in\n    // amount. Since refunds are capped to a percentage of the total\n    // transaction's gas, it is best to keep them low in cases like this one, to\n    // increase the likelihood of the full refund coming into effect.\n    uint256 private constant _NOT_ENTERED = 1;\n    uint256 private constant _ENTERED = 2;\n\n    uint256 private _status;\n\n    function __ReentrancyGuard_init() internal initializer {\n        __ReentrancyGuard_init_unchained();\n    }\n\n    function __ReentrancyGuard_init_unchained() internal initializer {\n        _status = _NOT_ENTERED;\n    }\n\n    /**\n     * @dev Prevents a contract from calling itself, directly or indirectly.\n     * Calling a `nonReentrant` function from another `nonReentrant`\n     * function is not supported. It is possible to prevent this from happening\n     * by making the `nonReentrant` function external, and make it call a\n     * `private` function that does the actual work.\n     */\n    modifier nonReentrant() {\n        // On the first call to nonReentrant, _notEntered will be true\n        require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n        // Any calls to nonReentrant after this point will fail\n        _status = _ENTERED;\n\n        _;\n\n        // By storing the original value once again, a refund is triggered (see\n        // https://eips.ethereum.org/EIPS/eip-2200)\n        _status = _NOT_ENTERED;\n    }\n    uint256[49] private __gap;\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.2 <0.8.0;\n\nimport \"../../introspection/IERC165Upgradeable.sol\";\n\n/**\n * @dev Required interface of an ERC721 compliant contract.\n */\ninterface IERC721Upgradeable is IERC165Upgradeable {\n    /**\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n    /**\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n     */\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n    /**\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n     */\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n    /**\n     * @dev Returns the number of tokens in ``owner``'s account.\n     */\n    function balanceOf(address owner) external view returns (uint256 balance);\n\n    /**\n     * @dev Returns the owner of the `tokenId` token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function ownerOf(uint256 tokenId) external view returns (address owner);\n\n    /**\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must exist and be owned by `from`.\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\n\n    /**\n     * @dev Transfers `tokenId` token from `from` to `to`.\n     *\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must be owned by `from`.\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 tokenId) external;\n\n    /**\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n     * The approval is cleared when the token is transferred.\n     *\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n     *\n     * Requirements:\n     *\n     * - The caller must own the token or be an approved operator.\n     * - `tokenId` must exist.\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address to, uint256 tokenId) external;\n\n    /**\n     * @dev Returns the account approved for `tokenId` token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function getApproved(uint256 tokenId) external view returns (address operator);\n\n    /**\n     * @dev Approve or remove `operator` as an operator for the caller.\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n     *\n     * Requirements:\n     *\n     * - The `operator` cannot be the caller.\n     *\n     * Emits an {ApprovalForAll} event.\n     */\n    function setApprovalForAll(address operator, bool _approved) external;\n\n    /**\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n     *\n     * See {setApprovalForAll}\n     */\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\n\n    /**\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\n      *\n      * Requirements:\n      *\n      * - `from` cannot be the zero address.\n      * - `to` cannot be the zero address.\n      * - `tokenId` token must exist and be owned by `from`.\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n      *\n      * Emits a {Transfer} event.\n      */\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721ReceiverUpgradeable {\n    /**\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n     * by `operator` from `from`, this function is called.\n     *\n     * It must return its Solidity selector to confirm the token transfer.\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n     *\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\n     */\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\n}\n"
      },
      "contracts/external/compound/ICompLike.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\n\ninterface ICompLike is IERC20Upgradeable {\n  function getCurrentVotes(address account) external view returns (uint96);\n  function delegate(address delegatee) external;\n}\n"
      },
      "contracts/registry/RegistryInterface.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity >=0.5.0 <0.7.0;\n\n/// @title Interface that allows a user to draw an address using an index\ninterface RegistryInterface {\n  function lookup() external view returns (address);\n}\n"
      },
      "contracts/reserve/ReserveInterface.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity >=0.5.0 <0.7.0;\n\n/// @title Interface that allows a user to draw an address using an index\ninterface ReserveInterface {\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\n}\n"
      },
      "contracts/utils/MappedSinglyLinkedList.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\n/// @notice An efficient implementation of a singly linked list of addresses\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\nlibrary MappedSinglyLinkedList {\n\n  /// @notice The special value address used to denote the end of the list\n  address public constant SENTINEL = address(0x1);\n\n  /// @notice The data structure to use for the list.\n  struct Mapping {\n    uint256 count;\n\n    mapping(address => address) addressMap;\n  }\n\n  /// @notice Initializes the list.\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\n  function initialize(Mapping storage self) internal {\n    require(self.count == 0, \"Already init\");\n    self.addressMap[SENTINEL] = SENTINEL;\n  }\n\n  function start(Mapping storage self) internal view returns (address) {\n    return self.addressMap[SENTINEL];\n  }\n\n  function next(Mapping storage self, address current) internal view returns (address) {\n    return self.addressMap[current];\n  }\n\n  function end(Mapping storage) internal pure returns (address) {\n    return SENTINEL;\n  }\n\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\n    for (uint256 i = 0; i < addresses.length; i++) {\n      addAddress(self, addresses[i]);\n    }\n  }\n\n  /// @notice Adds an address to the front of the list.\n  /// @param self The Mapping struct that this function is attached to\n  /// @param newAddress The address to shift to the front of the list\n  function addAddress(Mapping storage self, address newAddress) internal {\n    require(newAddress != SENTINEL && newAddress != address(0), \"Invalid address\");\n    require(self.addressMap[newAddress] == address(0), \"Already added\");\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\n    self.addressMap[SENTINEL] = newAddress;\n    self.count = self.count + 1;\n  }\n\n  /// @notice Removes an address from the list\n  /// @param self The Mapping struct that this function is attached to\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\n  /// @param addr The address to remove from the list.\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\n    require(addr != SENTINEL && addr != address(0), \"Invalid address\");\n    require(self.addressMap[prevAddress] == addr, \"Invalid prevAddress\");\n    self.addressMap[prevAddress] = self.addressMap[addr];\n    delete self.addressMap[addr];\n    self.count = self.count - 1;\n  }\n\n  /// @notice Determines whether the list contains the given address\n  /// @param self The Mapping struct that this function is attached to\n  /// @param addr The address to check\n  /// @return True if the address is contained, false otherwise.\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\n  }\n\n  /// @notice Returns an address array of all the addresses in this list\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\n  /// @param self The Mapping struct that this function is attached to\n  /// @return An array of all the addresses\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\n    address[] memory array = new address[](self.count);\n    uint256 count;\n    address currentAddress = self.addressMap[SENTINEL];\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\n      array[count] = currentAddress;\n      currentAddress = self.addressMap[currentAddress];\n      count++;\n    }\n    return array;\n  }\n\n  /// @notice Removes every address from the list\n  /// @param self The Mapping struct that this function is attached to\n  function clearAll(Mapping storage self) internal {\n    address currentAddress = self.addressMap[SENTINEL];\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\n      address nextAddress = self.addressMap[currentAddress];\n      delete self.addressMap[currentAddress];\n      currentAddress = nextAddress;\n    }\n    self.addressMap[SENTINEL] = SENTINEL;\n    self.count = 0;\n  }\n}\n"
      },
      "contracts/prize-pool/PrizePoolInterface.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"../token/TokenListenerInterface.sol\";\nimport \"../token/ControlledTokenInterface.sol\";\n\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\ninterface PrizePoolInterface {\n\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\n  /// @param to The address receiving the newly minted tokens\n  /// @param amount The amount of assets to deposit\n  /// @param controlledToken The address of the type of token the user is minting\n  /// @param referrer The referrer of the deposit\n  function depositTo(\n    address to,\n    uint256 amount,\n    address controlledToken,\n    address referrer\n  )\n    external;\n\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\n  /// @param from The address to redeem tokens from.\n  /// @param amount The amount of tokens to redeem for assets.\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\n  /// @return The actual exit fee paid\n  function withdrawInstantlyFrom(\n    address from,\n    uint256 amount,\n    address controlledToken,\n    uint256 maximumExitFee\n  ) external returns (uint256);\n\n\n  function withdrawReserve(address to) external returns (uint256);\n\n  /// @notice Returns the balance that is available to award.\n  /// @dev captureAwardBalance() should be called first\n  /// @return The total amount of assets to be awarded for the current prize\n  function awardBalance() external view returns (uint256);\n\n  /// @notice Captures any available interest as award balance.\n  /// @dev This function also captures the reserve fees.\n  /// @return The total amount of assets to be awarded for the current prize\n  function captureAwardBalance() external returns (uint256);\n\n  /// @notice Called by the prize strategy to award prizes.\n  /// @dev The amount awarded must be less than the awardBalance()\n  /// @param to The address of the winner that receives the award\n  /// @param amount The amount of assets to be awarded\n  /// @param controlledToken The address of the asset token being awarded\n  function award(\n    address to,\n    uint256 amount,\n    address controlledToken\n  )\n    external;\n\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\n  /// @param to The address of the winner that receives the award\n  /// @param amount The amount of external assets to be awarded\n  /// @param externalToken The address of the external asset token being awarded\n  function transferExternalERC20(\n    address to,\n    address externalToken,\n    uint256 amount\n  )\n    external;\n\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\n  /// @param to The address of the winner that receives the award\n  /// @param amount The amount of external assets to be awarded\n  /// @param externalToken The address of the external asset token being awarded\n  function awardExternalERC20(\n    address to,\n    address externalToken,\n    uint256 amount\n  )\n    external;\n\n  /// @notice Called by the prize strategy to award external ERC721 prizes\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\n  /// @param to The address of the winner that receives the award\n  /// @param externalToken The address of the external NFT token being awarded\n  /// @param tokenIds An array of NFT Token IDs to be transferred\n  function awardExternalERC721(\n    address to,\n    address externalToken,\n    uint256[] calldata tokenIds\n  )\n    external;\n\n  /// @notice Calculates the early exit fee for the given amount\n  /// @param from The user who is withdrawing\n  /// @param controlledToken The type of collateral being withdrawn\n  /// @param amount The amount of collateral to be withdrawn\n  /// @return exitFee The exit fee\n  /// @return burnedCredit The user's credit that was burned\n  function calculateEarlyExitFee(\n    address from,\n    address controlledToken,\n    uint256 amount\n  )\n    external\n    returns (\n      uint256 exitFee,\n      uint256 burnedCredit\n    );\n\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\n  /// @param _principal The principal amount on which interest is accruing\n  /// @param _interest The amount of interest that must accrue\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\n  function estimateCreditAccrualTime(\n    address _controlledToken,\n    uint256 _principal,\n    uint256 _interest\n  )\n    external\n    view\n    returns (uint256 durationSeconds);\n\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\n  /// @param user The user whose credit balance should be returned\n  /// @return The balance of the users credit\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\n\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\n  /// @param _controlledToken The controlled token for whom to set the credit plan\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\n  function setCreditPlanOf(\n    address _controlledToken,\n    uint128 _creditRateMantissa,\n    uint128 _creditLimitMantissa\n  )\n    external;\n\n  /// @notice Returns the credit rate of a controlled token\n  /// @param controlledToken The controlled token to retrieve the credit rates for\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\n  function creditPlanOf(\n    address controlledToken\n  )\n    external\n    view\n    returns (\n      uint128 creditLimitMantissa,\n      uint128 creditRateMantissa\n    );\n\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\n  /// @param _liquidityCap The new liquidity cap for the prize pool\n  function setLiquidityCap(uint256 _liquidityCap) external;\n\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\n\n  /// @dev Returns the address of the underlying ERC20 asset\n  /// @return The address of the asset\n  function token() external view returns (address);\n\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\n  /// @return An array of controlled token addresses\n  function tokens() external view returns (ControlledTokenInterface[] memory);\n\n  /// @notice The total of all controlled tokens\n  /// @return The current total of all tokens\n  function accountedBalance() external view returns (uint256);\n}\n"
      },
      "contracts/prize-strategy/BeforeAwardListenerInterface.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\";\n\n/// @notice The interface for the Periodic Prize Strategy before award listener.  This listener will be called immediately before the award is distributed.\ninterface BeforeAwardListenerInterface is IERC165Upgradeable {\n  /// @notice Called immediately before the award is distributed\n  function beforePrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\n}\n"
      },
      "contracts/prize-strategy/BeforeAwardListenerLibrary.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nlibrary BeforeAwardListenerLibrary {\n  /*\n    *     bytes4(keccak256('beforePrizePoolAwarded(uint256,uint256)')) == 0x4cdf9c3e\n    */\n  bytes4 public constant ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER = 0x4cdf9c3e;\n}"
      },
      "contracts/builders/PoolWithMultipleWinnersBuilder.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\npragma experimental ABIEncoderV2;\n\nimport \"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\";\nimport \"@pooltogether/yield-source-interface/contracts/IYieldSource.sol\";\n\nimport \"../registry/RegistryInterface.sol\";\nimport \"../prize-pool/compound/CompoundPrizePoolProxyFactory.sol\";\nimport \"../prize-pool/yield-source/YieldSourcePrizePoolProxyFactory.sol\";\nimport \"../prize-pool/stake/StakePrizePoolProxyFactory.sol\";\nimport \"./MultipleWinnersBuilder.sol\";\n\ncontract PoolWithMultipleWinnersBuilder {\n  using SafeCastUpgradeable for uint256;\n\n  event CompoundPrizePoolWithMultipleWinnersCreated(\n    CompoundPrizePool indexed prizePool,\n    MultipleWinners indexed prizeStrategy\n  );\n\n  event YieldSourcePrizePoolWithMultipleWinnersCreated(\n    YieldSourcePrizePool indexed prizePool,\n    MultipleWinners indexed prizeStrategy\n  );\n\n  event StakePrizePoolWithMultipleWinnersCreated(\n    StakePrizePool indexed prizePool,\n    MultipleWinners indexed prizeStrategy\n  );\n\n  /// @notice The configuration used to initialize the Compound Prize Pool\n  struct CompoundPrizePoolConfig {\n    CTokenInterface cToken;\n    uint256 maxExitFeeMantissa;\n  }\n\n  /// @notice The configuration used to initialize the Compound Prize Pool\n  struct YieldSourcePrizePoolConfig {\n    IYieldSource yieldSource;\n    uint256 maxExitFeeMantissa;\n  }\n\n  struct StakePrizePoolConfig {\n    IERC20Upgradeable token;\n    uint256 maxExitFeeMantissa;\n  }\n\n  RegistryInterface public reserveRegistry;\n  CompoundPrizePoolProxyFactory public compoundPrizePoolProxyFactory;\n  YieldSourcePrizePoolProxyFactory public yieldSourcePrizePoolProxyFactory;\n  StakePrizePoolProxyFactory public stakePrizePoolProxyFactory;\n  MultipleWinnersBuilder public multipleWinnersBuilder;\n\n  constructor (\n    RegistryInterface _reserveRegistry,\n    CompoundPrizePoolProxyFactory _compoundPrizePoolProxyFactory,\n    YieldSourcePrizePoolProxyFactory _yieldSourcePrizePoolProxyFactory,\n    StakePrizePoolProxyFactory _stakePrizePoolProxyFactory,\n    MultipleWinnersBuilder _multipleWinnersBuilder\n  ) public {\n    require(address(_reserveRegistry) != address(0), \"GlobalBuilder/reserveRegistry-not-zero\");\n    require(address(_compoundPrizePoolProxyFactory) != address(0), \"GlobalBuilder/compoundPrizePoolProxyFactory-not-zero\");\n    require(address(_yieldSourcePrizePoolProxyFactory) != address(0), \"GlobalBuilder/yieldSourcePrizePoolProxyFactory-not-zero\");\n    require(address(_stakePrizePoolProxyFactory) != address(0), \"GlobalBuilder/stakePrizePoolProxyFactory-not-zero\");\n    require(address(_multipleWinnersBuilder) != address(0), \"GlobalBuilder/multipleWinnersBuilder-not-zero\");\n    reserveRegistry = _reserveRegistry;\n    compoundPrizePoolProxyFactory = _compoundPrizePoolProxyFactory;\n    yieldSourcePrizePoolProxyFactory = _yieldSourcePrizePoolProxyFactory;\n    stakePrizePoolProxyFactory = _stakePrizePoolProxyFactory;\n    multipleWinnersBuilder = _multipleWinnersBuilder;\n  }\n\n  function createCompoundMultipleWinners(\n    CompoundPrizePoolConfig memory prizePoolConfig,\n    MultipleWinnersBuilder.MultipleWinnersConfig memory prizeStrategyConfig,\n    uint8 decimals\n  ) external returns (CompoundPrizePool) {\n    CompoundPrizePool prizePool = compoundPrizePoolProxyFactory.create();\n    MultipleWinners prizeStrategy = multipleWinnersBuilder.createMultipleWinners(\n      prizePool,\n      prizeStrategyConfig,\n      decimals,\n      msg.sender\n    );\n    prizePool.initialize(\n      reserveRegistry,\n      _tokens(prizeStrategy),\n      prizePoolConfig.maxExitFeeMantissa,\n      CTokenInterface(prizePoolConfig.cToken)\n    );\n    prizePool.setPrizeStrategy(prizeStrategy);\n    prizePool.setCreditPlanOf(\n      address(prizeStrategy.ticket()),\n      prizeStrategyConfig.ticketCreditRateMantissa.toUint128(),\n      prizeStrategyConfig.ticketCreditLimitMantissa.toUint128()\n    );\n    prizePool.transferOwnership(msg.sender);\n    emit CompoundPrizePoolWithMultipleWinnersCreated(prizePool, prizeStrategy);\n    return prizePool;\n  }\n\n  function createYieldSourceMultipleWinners(\n    YieldSourcePrizePoolConfig memory prizePoolConfig,\n    MultipleWinnersBuilder.MultipleWinnersConfig memory prizeStrategyConfig,\n    uint8 decimals\n  ) external returns (YieldSourcePrizePool) {\n    YieldSourcePrizePool prizePool = yieldSourcePrizePoolProxyFactory.create();\n    MultipleWinners prizeStrategy = multipleWinnersBuilder.createMultipleWinners(\n      prizePool,\n      prizeStrategyConfig,\n      decimals,\n      msg.sender\n    );\n    prizePool.initializeYieldSourcePrizePool(\n      reserveRegistry,\n      _tokens(prizeStrategy),\n      prizePoolConfig.maxExitFeeMantissa,\n      prizePoolConfig.yieldSource\n    );\n    prizePool.setPrizeStrategy(prizeStrategy);\n    prizePool.setCreditPlanOf(\n      address(prizeStrategy.ticket()),\n      prizeStrategyConfig.ticketCreditRateMantissa.toUint128(),\n      prizeStrategyConfig.ticketCreditLimitMantissa.toUint128()\n    );\n    prizePool.transferOwnership(msg.sender);\n    emit YieldSourcePrizePoolWithMultipleWinnersCreated(prizePool, prizeStrategy);\n    return prizePool;\n  }\n\n  function createStakeMultipleWinners(\n    StakePrizePoolConfig memory prizePoolConfig,\n    MultipleWinnersBuilder.MultipleWinnersConfig memory prizeStrategyConfig,\n    uint8 decimals\n  ) external returns (StakePrizePool) {\n    StakePrizePool prizePool = stakePrizePoolProxyFactory.create();\n    MultipleWinners prizeStrategy = multipleWinnersBuilder.createMultipleWinners(\n      prizePool,\n      prizeStrategyConfig,\n      decimals,\n      msg.sender\n    );\n    prizePool.initialize(\n      reserveRegistry,\n      _tokens(prizeStrategy),\n      prizePoolConfig.maxExitFeeMantissa,\n      prizePoolConfig.token\n    );\n    prizePool.setPrizeStrategy(prizeStrategy);\n    prizePool.setCreditPlanOf(\n      address(prizeStrategy.ticket()),\n      prizeStrategyConfig.ticketCreditRateMantissa.toUint128(),\n      prizeStrategyConfig.ticketCreditLimitMantissa.toUint128()\n    );\n    prizePool.transferOwnership(msg.sender);\n    emit StakePrizePoolWithMultipleWinnersCreated(prizePool, prizeStrategy);\n    return prizePool;\n  }\n\n  function _tokens(MultipleWinners _multipleWinners) internal view returns (ControlledTokenInterface[] memory) {\n    ControlledTokenInterface[] memory tokens = new ControlledTokenInterface[](2);\n    tokens[0] = ControlledTokenInterface(address(_multipleWinners.ticket()));\n    tokens[1] = ControlledTokenInterface(address(_multipleWinners.sponsorship()));\n    return tokens;\n  }\n\n}\n"
      },
      "@pooltogether/yield-source-interface/contracts/IYieldSource.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.4.0 <0.8.0;\n\n/// @title Defines the functions used to interact with a yield source.  The Prize Pool inherits this contract.\n/// @notice Prize Pools subclasses need to implement this interface so that yield can be generated.\ninterface IYieldSource {\n\n  /// @notice Returns the ERC20 asset token used for deposits.\n  /// @return The ERC20 asset token\n  function depositToken() external view returns (address);\n\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\n  /// @return The underlying balance of asset tokens\n  function balanceOfToken(address addr) external returns (uint256);\n\n  /// @notice Supplies tokens to the yield source.  Allows assets to be supplied on other user's behalf using the `to` param.\n  /// @param amount The amount of `token()` to be supplied\n  /// @param to The user whose balance will receive the tokens\n  function supplyTokenTo(uint256 amount, address to) external;\n\n  /// @notice Redeems tokens from the yield source.\n  /// @param amount The amount of `token()` to withdraw.  Denominated in `token()` as above.\n  /// @return The actual amount of tokens that were redeemed.\n  function redeemToken(uint256 amount) external returns (uint256);\n\n}\n"
      },
      "contracts/prize-pool/compound/CompoundPrizePoolProxyFactory.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"./CompoundPrizePool.sol\";\nimport \"../../external/openzeppelin/ProxyFactory.sol\";\n\n/// @title Compound Prize Pool Proxy Factory\n/// @notice Minimal proxy pattern for creating new Compound Prize Pools\ncontract CompoundPrizePoolProxyFactory is ProxyFactory {\n\n  /// @notice Contract template for deploying proxied Prize Pools\n  CompoundPrizePool public instance;\n\n  /// @notice Initializes the Factory with an instance of the Compound Prize Pool\n  constructor () public {\n    instance = new CompoundPrizePool();\n  }\n\n  /// @notice Creates a new Compound Prize Pool as a proxy of the template instance\n  /// @return A reference to the new proxied Compound Prize Pool\n  function create() external returns (CompoundPrizePool) {\n    return CompoundPrizePool(deployMinimal(address(instance), \"\"));\n  }\n}\n"
      },
      "contracts/prize-pool/yield-source/YieldSourcePrizePoolProxyFactory.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"./YieldSourcePrizePool.sol\";\nimport \"../../external/openzeppelin/ProxyFactory.sol\";\n\n/// @title Yield Source Prize Pool Proxy Factory\n/// @notice Minimal proxy pattern for creating new Yield Source Prize Pools\ncontract YieldSourcePrizePoolProxyFactory is ProxyFactory {\n\n  /// @notice Contract template for deploying proxied Prize Pools\n  YieldSourcePrizePool public instance;\n\n  /// @notice Initializes the Factory with an instance of the Yield Source Prize Pool\n  constructor () public {\n    instance = new YieldSourcePrizePool();\n  }\n\n  /// @notice Creates a new Yield Source Prize Pool as a proxy of the template instance\n  /// @return A reference to the new proxied Yield Source Prize Pool\n  function create() external returns (YieldSourcePrizePool) {\n    return YieldSourcePrizePool(deployMinimal(address(instance), \"\"));\n  }\n}\n"
      },
      "contracts/prize-pool/stake/StakePrizePoolProxyFactory.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"./StakePrizePool.sol\";\nimport \"../../external/openzeppelin/ProxyFactory.sol\";\n\n/// @title Stake Prize Pool Proxy Factory\n/// @notice Minimal proxy pattern for creating new Stake Prize Pools\ncontract StakePrizePoolProxyFactory is ProxyFactory {\n\n  /// @notice Contract template for deploying proxied Prize Pools\n  StakePrizePool public instance;\n\n  /// @notice Initializes the Factory with an instance of the Stake Prize Pool\n  constructor () public {\n    instance = new StakePrizePool();\n  }\n\n  /// @notice Creates a new Stake Prize Pool as a proxy of the template instance\n  /// @return A reference to the new proxied Stake Prize Pool\n  function create() external returns (StakePrizePool) {\n    return StakePrizePool(deployMinimal(address(instance), \"\"));\n  }\n}\n"
      },
      "contracts/prize-pool/compound/CompoundPrizePool.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\";\nimport \"@pooltogether/fixed-point/contracts/FixedPoint.sol\";\n\nimport \"../../external/compound/CTokenInterface.sol\";\nimport \"../PrizePool.sol\";\n\n/// @title Prize Pool with Compound's cToken\n/// @notice Manages depositing and withdrawing assets from the Prize Pool\ncontract CompoundPrizePool is PrizePool {\n  using SafeMathUpgradeable for uint256;\n  using SafeERC20Upgradeable for IERC20Upgradeable;\n\n  event CompoundPrizePoolInitialized(address indexed cToken);\n\n  /// @notice Interface for the Yield-bearing cToken by Compound\n  CTokenInterface public cToken;\n\n  /// @notice Initializes the Prize Pool and Yield Service with the required contract connections\n  /// @param _controlledTokens Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\n  /// @param _maxExitFeeMantissa The maximum exit fee size, relative to the withdrawal amount\n  /// @param _cToken Address of the Compound cToken interface\n  function initialize (\n    RegistryInterface _reserveRegistry,\n    ControlledTokenInterface[] memory _controlledTokens,\n    uint256 _maxExitFeeMantissa,\n    CTokenInterface _cToken\n  )\n    public\n    initializer\n  {\n    PrizePool.initialize(\n      _reserveRegistry,\n      _controlledTokens,\n      _maxExitFeeMantissa\n    );\n    cToken = _cToken;\n\n    emit CompoundPrizePoolInitialized(address(cToken));\n  }\n\n  /// @dev Gets the balance of the underlying assets held by the Yield Service\n  /// @return The underlying balance of asset tokens\n  function _balance() internal override returns (uint256) {\n    return cToken.balanceOfUnderlying(address(this));\n  }\n\n  /// @dev Allows a user to supply asset tokens in exchange for yield-bearing tokens\n  /// to be held in escrow by the Yield Service\n  /// @param amount The amount of asset tokens to be supplied\n  function _supply(uint256 amount) internal override {\n    _token().safeApprove(address(cToken), amount);\n    require(cToken.mint(amount) == 0, \"CompoundPrizePool/mint-failed\");\n  }\n\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as a prize enhancement\n  /// @param _externalToken The address of the token to check\n  /// @return True if the token may be awarded, false otherwise\n  function _canAwardExternal(address _externalToken) internal override view returns (bool) {\n    return _externalToken != address(cToken);\n  }\n\n  /// @dev Allows a user to redeem yield-bearing tokens in exchange for the underlying\n  /// asset tokens held in escrow by the Yield Service\n  /// @param amount The amount of underlying tokens to be redeemed\n  /// @return The actual amount of tokens transferred\n  function _redeem(uint256 amount) internal override returns (uint256) {\n    IERC20Upgradeable assetToken = _token();\n    uint256 before = assetToken.balanceOf(address(this));\n    require(cToken.redeemUnderlying(amount) == 0, \"CompoundPrizePool/redeem-failed\");\n    uint256 diff = assetToken.balanceOf(address(this)).sub(before);\n    return diff;\n  }\n\n  /// @dev Gets the underlying asset token used by the Yield Service\n  /// @return A reference to the interface of the underling asset token\n  function _token() internal override view returns (IERC20Upgradeable) {\n    return IERC20Upgradeable(cToken.underlying());\n  }\n}\n"
      },
      "contracts/external/compound/CTokenInterface.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\n\ninterface CTokenInterface is IERC20Upgradeable {\n    function decimals() external view returns (uint8);\n    function totalSupply() external override view returns (uint256);\n    function underlying() external view returns (address);\n    function balanceOfUnderlying(address owner) external returns (uint256);\n    function supplyRatePerBlock() external returns (uint256);\n    function exchangeRateCurrent() external returns (uint256);\n    function mint(uint256 mintAmount) external returns (uint256);\n    function redeem(uint256 amount) external returns (uint256);\n    function balanceOf(address user) external override view returns (uint256);\n    function redeemUnderlying(uint256 redeemAmount) external returns (uint256);\n}\n"
      },
      "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\";\n\nimport \"@pooltogether/yield-source-interface/contracts/IYieldSource.sol\";\n\nimport \"../PrizePool.sol\";\n\ncontract YieldSourcePrizePool is PrizePool {\n\n  using SafeERC20Upgradeable for IERC20Upgradeable;\n  using AddressUpgradeable for address;\n\n  IYieldSource public yieldSource;\n\n  event YieldSourcePrizePoolInitialized(address indexed yieldSource);\n\n  /// @notice Initializes the Prize Pool and Yield Service with the required contract connections\n  /// @param _controlledTokens Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\n  /// @param _maxExitFeeMantissa The maximum exit fee size, relative to the withdrawal amount\n  /// @param _yieldSource Address of the yield source\n  function initializeYieldSourcePrizePool (\n    RegistryInterface _reserveRegistry,\n    ControlledTokenInterface[] memory _controlledTokens,\n    uint256 _maxExitFeeMantissa,\n    IYieldSource _yieldSource\n  )\n    public\n    initializer\n  {\n    require(address(_yieldSource).isContract(), \"YieldSourcePrizePool/yield-source-not-contract-address\");\n    PrizePool.initialize(\n      _reserveRegistry,\n      _controlledTokens,\n      _maxExitFeeMantissa\n    );\n    yieldSource = _yieldSource;\n\n    // A hack to determine whether it's an actual yield source\n    (bool succeeded,) = address(_yieldSource).staticcall(abi.encode(_yieldSource.depositToken.selector));\n    require(succeeded, \"YieldSourcePrizePool/invalid-yield-source\");\n\n    emit YieldSourcePrizePoolInitialized(address(_yieldSource));\n  }\n\n  /// @notice Determines whether the passed token can be transferred out as an external award.\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\n  /// prize strategy should not be allowed to move those tokens.\n  /// @param _externalToken The address of the token to check\n  /// @return True if the token may be awarded, false otherwise\n  function _canAwardExternal(address _externalToken) internal override view returns (bool) {\n    return _externalToken != address(yieldSource);\n  }\n\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\n  /// @return The underlying balance of asset tokens\n  function _balance() internal override returns (uint256) {\n    return yieldSource.balanceOfToken(address(this));\n  }\n\n  function _token() internal override view returns (IERC20Upgradeable) {\n    return IERC20Upgradeable(yieldSource.depositToken());\n  }\n\n  /// @notice Supplies asset tokens to the yield source.\n  /// @param mintAmount The amount of asset tokens to be supplied\n  function _supply(uint256 mintAmount) internal override {\n    _token().safeApprove(address(yieldSource), mintAmount);\n    yieldSource.supplyTokenTo(mintAmount, address(this));\n  }\n\n  /// @notice Redeems asset tokens from the yield source.\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\n  /// @return The actual amount of tokens that were redeemed.\n  function _redeem(uint256 redeemAmount) internal override returns (uint256) {\n    return yieldSource.redeemToken(redeemAmount);\n  }\n}"
      },
      "contracts/prize-pool/stake/StakePrizePool.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\n\nimport \"../PrizePool.sol\";\n\ncontract StakePrizePool is PrizePool {\n\n  IERC20Upgradeable private stakeToken;\n\n  event StakePrizePoolInitialized(address indexed stakeToken);\n\n  /// @notice Initializes the Prize Pool and Yield Service with the required contract connections\n  /// @param _controlledTokens Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\n  /// @param _maxExitFeeMantissa The maximum exit fee size, relative to the withdrawal amount\n  /// @param _stakeToken Address of the stake token\n  function initialize (\n    RegistryInterface _reserveRegistry,\n    ControlledTokenInterface[] memory _controlledTokens,\n    uint256 _maxExitFeeMantissa,\n    IERC20Upgradeable _stakeToken\n  )\n    public\n    initializer\n  {\n    PrizePool.initialize(\n      _reserveRegistry,\n      _controlledTokens,\n      _maxExitFeeMantissa\n    );\n\n    require(address(_stakeToken) != address(0), \"StakePrizePool/stake-token-not-zero-address\");\n    stakeToken = _stakeToken;\n\n    emit StakePrizePoolInitialized(address(stakeToken));\n  }\n\n  /// @notice Determines whether the passed token can be transferred out as an external award.\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\n  /// prize strategy should not be allowed to move those tokens.\n  /// @param _externalToken The address of the token to check\n  /// @return True if the token may be awarded, false otherwise\n  function _canAwardExternal(address _externalToken) internal override view returns (bool) {\n    return address(stakeToken) != _externalToken;\n  }\n\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\n  /// @return The underlying balance of asset tokens\n  function _balance() internal override returns (uint256) {\n    return stakeToken.balanceOf(address(this));\n  }\n\n  function _token() internal override view returns (IERC20Upgradeable) {\n    return stakeToken;\n  }\n\n  /// @notice Supplies asset tokens to the yield source.\n  /// @param mintAmount The amount of asset tokens to be supplied\n  function _supply(uint256 mintAmount) internal override {\n    // no-op because nothing else needs to be done\n  }\n\n  /// @notice Redeems asset tokens from the yield source.\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\n  /// @return The actual amount of tokens that were redeemed.\n  function _redeem(uint256 redeemAmount) internal override returns (uint256) {\n    return redeemAmount;\n  }\n}\n"
      },
      "contracts/token-faucet/TokenFaucetProxyFactory.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"./TokenFaucet.sol\";\nimport \"../external/openzeppelin/ProxyFactory.sol\";\n\n/// @title Stake Prize Pool Proxy Factory\n/// @notice Minimal proxy pattern for creating new TokenFaucet contracts\ncontract TokenFaucetProxyFactory is ProxyFactory {\n\n  /// @notice Contract template for deploying proxied Comptrollers\n  TokenFaucet public instance;\n\n  /// @notice Initializes the Factory with an instance of the TokenFaucet\n  constructor () public {\n    instance = new TokenFaucet();\n  }\n\n  /// @notice Creates a new TokenFaucet\n  /// @param _asset The asset to disburse to users\n  /// @param _measure The token to use to measure a users portion\n  /// @param _dripRatePerSecond The amount of the asset to drip each second\n  /// @return A reference to the new proxied TokenFaucet\n  function create(\n    IERC20Upgradeable _asset,\n    IERC20Upgradeable _measure,\n    uint256 _dripRatePerSecond\n  ) public returns (TokenFaucet) {\n    TokenFaucet tokenFaucet = TokenFaucet(deployMinimal(address(instance), \"\"));\n    tokenFaucet.initialize(\n      _asset, _measure, _dripRatePerSecond\n    );\n    tokenFaucet.transferOwnership(msg.sender);\n    return tokenFaucet;\n  }\n\n  /// @notice Creates a new TokenFaucet and immediately deposits funds\n  /// @param _asset The asset to disburse to users\n  /// @param _measure The token to use to measure a users portion\n  /// @param _dripRatePerSecond The amount of the asset to drip each second\n  /// @param _amount The amount of assets to deposit into the faucet\n  /// @return A reference to the new proxied TokenFaucet\n  function createAndDeposit(\n    IERC20Upgradeable _asset,\n    IERC20Upgradeable _measure,\n    uint256 _dripRatePerSecond,\n    uint256 _amount\n  ) external returns (TokenFaucet) {\n    TokenFaucet faucet = create(_asset, _measure, _dripRatePerSecond);\n    _asset.transferFrom(msg.sender, address(faucet), _amount);\n  }\n\n  /// @notice Runs claim on all passed comptrollers for a user.\n  /// @param user The user to claim for\n  /// @param tokenFaucets The tokenFaucets to call claim on.\n  function claimAll(address user, TokenFaucet[] calldata tokenFaucets) external {\n    for (uint256 i = 0; i < tokenFaucets.length; i++) {\n      tokenFaucets[i].claim(user);\n    }\n  }\n}\n"
      },
      "contracts/token-faucet/TokenFaucet.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\";\nimport \"@pooltogether/fixed-point/contracts/FixedPoint.sol\";\nimport \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\n\nimport \"../utils/ExtendedSafeCast.sol\";\nimport \"../token/TokenListener.sol\";\n\n/// @title Disburses a token at a fixed rate per second to holders of another token.\n/// @notice The tokens are dripped at a \"drip rate per second\".  This is the number of tokens that\n/// are dripped each second.  A user's share of the dripped tokens is based on how many 'measure' tokens they hold.\n/* solium-disable security/no-block-members */\ncontract TokenFaucet is OwnableUpgradeable, TokenListener {\n  using SafeMathUpgradeable for uint256;\n  using SafeCastUpgradeable for uint256;\n  using ExtendedSafeCast for uint256;\n\n  event Initialized(\n    IERC20Upgradeable indexed asset,\n    IERC20Upgradeable indexed measure,\n    uint256 dripRatePerSecond\n  );\n\n  event Dripped(\n    uint256 newTokens\n  );\n\n  event Deposited(\n    address indexed user,\n    uint256 amount\n  );\n\n  event Withdrawn(\n    address indexed to,\n    uint256 amount\n  );\n\n  event Claimed(\n    address indexed user,\n    uint256 newTokens\n  );\n\n  event DripRateChanged(\n    uint256 dripRatePerSecond\n  );\n\n  struct UserState {\n    uint128 lastExchangeRateMantissa;\n    uint128 balance;\n  }\n\n  /// @notice The token that is being disbursed\n  IERC20Upgradeable public asset;\n\n  /// @notice The token that is user to measure a user's portion of disbursed tokens\n  IERC20Upgradeable public measure;\n\n  /// @notice The total number of tokens that are disbursed each second\n  uint256 public dripRatePerSecond;\n\n  /// @notice The cumulative exchange rate of measure token supply : dripped tokens\n  uint112 public exchangeRateMantissa;\n\n  /// @notice The total amount of tokens that have been dripped but not claimed\n  uint112 public totalUnclaimed;\n\n  /// @notice The timestamp at which the tokens were last dripped\n  uint32 public lastDripTimestamp;\n\n  /// @notice The data structure that tracks when a user last received tokens\n  mapping(address => UserState) public userStates;\n\n  /// @notice Initializes a new Comptroller V2\n  /// @param _asset The asset to disburse to users\n  /// @param _measure The token to use to measure a users portion\n  /// @param _dripRatePerSecond The amount of the asset to drip each second\n  function initialize (\n    IERC20Upgradeable _asset,\n    IERC20Upgradeable _measure,\n    uint256 _dripRatePerSecond\n  ) public initializer {\n    __Ownable_init();\n    lastDripTimestamp = _currentTime();\n    asset = _asset;\n    measure = _measure;\n    setDripRatePerSecond(_dripRatePerSecond);\n\n    emit Initialized(\n      asset,\n      measure,\n      dripRatePerSecond\n    );\n  }\n\n  /// @notice Safely deposits asset tokens into the faucet.  Must be pre-approved\n  /// This should be used instead of transferring directly because the drip function must\n  /// be called before receiving new assets.\n  /// @param amount The amount of asset tokens to add (must be approved already)\n  function deposit(uint256 amount) external {\n    drip();\n    asset.transferFrom(msg.sender, address(this), amount);\n\n    emit Deposited(msg.sender, amount);\n  }\n\n  /// @notice Allows the owner to withdraw tokens that have not been dripped yet.\n  /// @param to The address to withdraw to\n  /// @param amount The amount to withdraw\n  function withdrawTo(address to, uint256 amount) external onlyOwner {\n    drip();\n    uint256 assetTotalSupply = asset.balanceOf(address(this));\n    uint256 availableTotalSupply = assetTotalSupply.sub(totalUnclaimed);\n    require(amount <= availableTotalSupply, \"TokenFaucet/insufficient-funds\");\n    asset.transfer(to, amount);\n\n    emit Withdrawn(to, amount);\n  }\n\n  /// @notice Transfers all unclaimed tokens to the user\n  /// @param user The user to claim tokens for\n  /// @return The amount of tokens that were claimed.\n  function claim(address user) external returns (uint256) {\n    drip();\n    _captureNewTokensForUser(user);\n    uint256 balance = userStates[user].balance;\n    userStates[user].balance = 0;\n    totalUnclaimed = uint256(totalUnclaimed).sub(balance).toUint112();\n    asset.transfer(user, balance);\n\n    emit Claimed(user, balance);\n\n    return balance;\n  }\n\n  /// @notice Drips new tokens.\n  /// @dev Should be called immediately before any measure token mints/transfers/burns\n  /// @return The number of new tokens dripped.\n  function drip() public returns (uint256) {\n    uint256 currentTimestamp = _currentTime();\n\n    // this should only run once per block.\n    if (lastDripTimestamp == uint32(currentTimestamp)) {\n      return 0;\n    }\n\n    uint256 assetTotalSupply = asset.balanceOf(address(this));\n    uint256 availableTotalSupply = assetTotalSupply.sub(totalUnclaimed);\n    uint256 newSeconds = currentTimestamp.sub(lastDripTimestamp);\n    uint256 nextExchangeRateMantissa = exchangeRateMantissa;\n    uint256 newTokens;\n    uint256 measureTotalSupply = measure.totalSupply();\n\n    if (measureTotalSupply > 0 && availableTotalSupply > 0) {\n      newTokens = newSeconds.mul(dripRatePerSecond);\n      if (newTokens > availableTotalSupply) {\n        newTokens = availableTotalSupply;\n      }\n      uint256 indexDeltaMantissa = FixedPoint.calculateMantissa(newTokens, measureTotalSupply);\n      nextExchangeRateMantissa = nextExchangeRateMantissa.add(indexDeltaMantissa);\n\n      emit Dripped(\n        newTokens\n      );\n    }\n\n    exchangeRateMantissa = nextExchangeRateMantissa.toUint112();\n    totalUnclaimed = uint256(totalUnclaimed).add(newTokens).toUint112();\n    lastDripTimestamp = currentTimestamp.toUint32();\n\n    return newTokens;\n  }\n\n  /// @notice Allows the owner to set the drip rate per second.  This is the number of tokens that are dripped each second.\n  /// @param _dripRatePerSecond The new drip rate in tokens per second\n  function setDripRatePerSecond(uint256 _dripRatePerSecond) public onlyOwner {\n    require(_dripRatePerSecond > 0, \"TokenFaucet/dripRate-gt-zero\");\n\n    // ensure we're all caught up\n    drip();\n\n    dripRatePerSecond = _dripRatePerSecond;\n\n    emit DripRateChanged(dripRatePerSecond);\n  }\n\n  /// @notice Captures new tokens for a user\n  /// @dev This must be called before changes to the user's balance (i.e. before mint, transfer or burns)\n  /// @param user The user to capture tokens for\n  /// @return The number of new tokens\n  function _captureNewTokensForUser(\n    address user\n  ) private returns (uint128) {\n    UserState storage userState = userStates[user];\n    if (exchangeRateMantissa == userState.lastExchangeRateMantissa) {\n      // ignore if exchange rate is same\n      return 0;\n    }\n    uint256 deltaExchangeRateMantissa = uint256(exchangeRateMantissa).sub(userState.lastExchangeRateMantissa);\n    uint256 userMeasureBalance = measure.balanceOf(user);\n    uint128 newTokens = FixedPoint.multiplyUintByMantissa(userMeasureBalance, deltaExchangeRateMantissa).toUint128();\n\n    userStates[user] = UserState({\n      lastExchangeRateMantissa: exchangeRateMantissa,\n      balance: uint256(userState.balance).add(newTokens).toUint128()\n    });\n\n    return newTokens;\n  }\n\n  /// @notice Should be called before a user mints new \"measure\" tokens.\n  /// @param to The user who is minting the tokens\n  /// @param token The token they are minting\n  function beforeTokenMint(\n    address to,\n    uint256,\n    address token,\n    address\n  )\n    external\n    override\n  {\n    if (token == address(measure)) {\n      drip();\n      _captureNewTokensForUser(to);\n    }\n  }\n\n  /// @notice Should be called before \"measure\" tokens are transferred or burned\n  /// @param from The user who is sending the tokens\n  /// @param to The user who is receiving the tokens\n  /// @param token The token token they are burning\n  function beforeTokenTransfer(\n    address from,\n    address to,\n    uint256,\n    address token\n  )\n    external\n    override\n  {\n    // must be measure and not be minting\n    if (token == address(measure) && from != address(0)) {\n      drip();\n      _captureNewTokensForUser(to);\n      _captureNewTokensForUser(from);\n    }\n  }\n\n  /// @notice returns the current time.  Allows for override in testing.\n  /// @return The current time (block.timestamp)\n  function _currentTime() internal virtual view returns (uint32) {\n    return block.timestamp.toUint32();\n  }\n\n}\n"
      },
      "contracts/utils/ExtendedSafeCast.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nlibrary ExtendedSafeCast {\n\n  /**\n    * @dev Converts an unsigned uint256 into a unsigned uint112.\n    *\n    * Requirements:\n    *\n    * - input must be less than or equal to maxUint112.\n    */\n  function toUint112(uint256 value) internal pure returns (uint112) {\n    require(value < 2**112, \"SafeCast: value doesn't fit in an uint112\");\n    return uint112(value);\n  }\n\n  /**\n    * @dev Converts an unsigned uint256 into a unsigned uint96.\n    *\n    * Requirements:\n    *\n    * - input must be less than or equal to maxUint96.\n    */\n  function toUint96(uint256 value) internal pure returns (uint96) {\n    require(value < 2**96, \"SafeCast: value doesn't fit in an uint96\");\n    return uint96(value);\n  }\n\n}"
      },
      "contracts/test/TokenFaucetHarness.sol": {
        "content": "pragma solidity 0.6.12;\npragma experimental ABIEncoderV2;\n\nimport \"../token-faucet/TokenFaucet.sol\";\n\n/* solium-disable security/no-block-members */\ncontract TokenFaucetHarness is TokenFaucet {\n\n  uint32 internal time;\n\n  function setCurrentTime(uint32 _time) external {\n    time = _time;\n  }\n\n  function _currentTime() internal override view returns (uint32) {\n    return time;\n  }\n\n}"
      },
      "contracts/prize-strategy/PeriodicPrizeStrategyListener.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"./PeriodicPrizeStrategyListenerInterface.sol\";\nimport \"./PeriodicPrizeStrategyListenerLibrary.sol\";\nimport \"../Constants.sol\";\n\nabstract contract PeriodicPrizeStrategyListener is PeriodicPrizeStrategyListenerInterface {\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\n    return (\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \n      interfaceId == PeriodicPrizeStrategyListenerLibrary.ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER\n    );\n  }\n}"
      },
      "contracts/test/PeriodicPrizeStrategyListenerStub.sol": {
        "content": "pragma solidity 0.6.12;\n\nimport \"../prize-strategy/PeriodicPrizeStrategyListener.sol\";\n\n/* solium-disable security/no-block-members */\ncontract PeriodicPrizeStrategyListenerStub is PeriodicPrizeStrategyListener {\n\n  event Awarded();\n\n  function afterPrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external override {\n    emit Awarded();\n  }\n}"
      },
      "contracts/test/PeriodicPrizeStrategyHarness.sol": {
        "content": "pragma solidity 0.6.12;\n\nimport \"../prize-strategy/PeriodicPrizeStrategy.sol\";\nimport \"./PeriodicPrizeStrategyDistributorInterface.sol\";\n\n/* solium-disable security/no-block-members */\ncontract PeriodicPrizeStrategyHarness is PeriodicPrizeStrategy {\n\n  PeriodicPrizeStrategyDistributorInterface distributor;\n\n  function setDistributor(PeriodicPrizeStrategyDistributorInterface _distributor) external {\n    distributor = _distributor;\n  }\n\n  uint256 internal time;\n  function setCurrentTime(uint256 _time) external {\n    time = _time;\n  }\n\n  function _currentTime() internal override view returns (uint256) {\n    return time;\n  }\n\n  function setRngRequest(uint32 requestId, uint32 lockBlock) external {\n    rngRequest.id = requestId;\n    rngRequest.lockBlock = lockBlock;\n  }\n\n  function _distribute(uint256 randomNumber) internal override {\n    distributor.distribute(randomNumber);\n  }\n\n  function forceBeforeAwardListener(BeforeAwardListenerInterface listener) external {\n    beforeAwardListener = listener;\n  }\n}"
      },
      "contracts/test/PeriodicPrizeStrategyDistributorInterface.sol": {
        "content": "pragma solidity 0.6.12;\n\nimport \"../prize-strategy/PeriodicPrizeStrategy.sol\";\n\n/* solium-disable security/no-block-members */\ninterface PeriodicPrizeStrategyDistributorInterface {\n  function distribute(uint256 randomNumber) external;\n}"
      },
      "contracts/test/BeforeAwardListenerStub.sol": {
        "content": "pragma solidity 0.6.12;\n\nimport \"../prize-strategy/BeforeAwardListener.sol\";\n\n/* solium-disable security/no-block-members */\ncontract BeforeAwardListenerStub is BeforeAwardListener {\n\n  event Awarded();\n\n  function beforePrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external override {\n    emit Awarded();\n  }\n}"
      },
      "@openzeppelin/contracts-upgradeable/introspection/ERC165Upgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"./IERC165Upgradeable.sol\";\nimport \"../proxy/Initializable.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts may inherit from this and call {_registerInterface} to declare\n * their support of an interface.\n */\nabstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {\n    /*\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\n     */\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\n\n    /**\n     * @dev Mapping of interface ids to whether or not it's supported.\n     */\n    mapping(bytes4 => bool) private _supportedInterfaces;\n\n    function __ERC165_init() internal initializer {\n        __ERC165_init_unchained();\n    }\n\n    function __ERC165_init_unchained() internal initializer {\n        // Derived contracts need only register support for their own interfaces,\n        // we register support for ERC165 itself here\n        _registerInterface(_INTERFACE_ID_ERC165);\n    }\n\n    /**\n     * @dev See {IERC165-supportsInterface}.\n     *\n     * Time complexity O(1), guaranteed to always use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return _supportedInterfaces[interfaceId];\n    }\n\n    /**\n     * @dev Registers the contract as an implementer of the interface defined by\n     * `interfaceId`. Support of the actual ERC165 interface is automatic and\n     * registering its interface id is not required.\n     *\n     * See {IERC165-supportsInterface}.\n     *\n     * Requirements:\n     *\n     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).\n     */\n    function _registerInterface(bytes4 interfaceId) internal virtual {\n        require(interfaceId != 0xffffffff, \"ERC165: invalid interface id\");\n        _supportedInterfaces[interfaceId] = true;\n    }\n    uint256[49] private __gap;\n}\n"
      },
      "contracts/yield-source/CTokenYieldSource.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport \"@pooltogether/fixed-point/contracts/FixedPoint.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport \"@pooltogether/yield-source-interface/contracts/IYieldSource.sol\";\n\nimport \"../external/compound/CTokenInterface.sol\";\n\n/// @title Defines the functions used to interact with a yield source.  The Prize Pool inherits this contract.\n/// @dev THIS CONTRACT IS EXPERIMENTAL!  USE AT YOUR OWN RISK\n/// @notice Prize Pools subclasses need to implement this interface so that yield can be generated.\ncontract CTokenYieldSource is IYieldSource {\n  using SafeMathUpgradeable for uint256;\n\n  event CTokenYieldSourceInitialized(address indexed cToken);\n\n  mapping(address => uint256) public balances;\n\n  /// @notice Interface for the Yield-bearing cToken by Compound\n  CTokenInterface public cToken;\n\n  /// @notice Initializes the Yield Service with the Compound cToken\n  /// @param _cToken Address of the Compound cToken interface\n  constructor (\n    CTokenInterface _cToken\n  )\n    public\n  {\n    cToken = _cToken;\n\n    emit CTokenYieldSourceInitialized(address(cToken));\n  }\n\n  /// @notice Returns the ERC20 asset token used for deposits.\n  /// @return The ERC20 asset token\n  function depositToken() public override view returns (address) {\n    return _tokenAddress();\n  }\n\n  function _tokenAddress() internal view returns (address) {\n    return cToken.underlying();\n  }\n\n  function _token() internal view returns (IERC20Upgradeable) {\n    return IERC20Upgradeable(_tokenAddress());\n  }\n\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\n  /// @return The underlying balance of asset tokens\n  function balanceOfToken(address addr) external override returns (uint256) {\n    uint256 totalUnderlying = cToken.balanceOfUnderlying(address(this));\n    uint256 total = cToken.balanceOf(address(this));\n    if (total == 0) {\n      return 0;\n    }\n    return balances[addr].mul(totalUnderlying).div(total);\n  }\n\n  /// @notice Supplies asset tokens to the yield source.\n  /// @param amount The amount of asset tokens to be supplied\n  function supplyTokenTo(uint256 amount, address to) external override {\n    _token().transferFrom(msg.sender, address(this), amount);\n    IERC20Upgradeable(cToken.underlying()).approve(address(cToken), amount);\n    uint256 cTokenBalanceBefore = cToken.balanceOf(address(this));\n    require(cToken.mint(amount) == 0, \"CTokenYieldSource/mint-failed\");\n    uint256 cTokenDiff = cToken.balanceOf(address(this)).sub(cTokenBalanceBefore);\n    balances[to] = balances[to].add(cTokenDiff);\n  }\n\n  /// @notice Redeems asset tokens from the yield source.\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\n  /// @return The actual amount of tokens that were redeemed.\n  function redeemToken(uint256 redeemAmount) external override returns (uint256) {\n    uint256 cTokenBalanceBefore = cToken.balanceOf(address(this));\n    uint256 balanceBefore = _token().balanceOf(address(this));\n    require(cToken.redeemUnderlying(redeemAmount) == 0, \"CTokenYieldSource/redeem-failed\");\n    uint256 cTokenDiff = cTokenBalanceBefore.sub(cToken.balanceOf(address(this)));\n    uint256 diff = _token().balanceOf(address(this)).sub(balanceBefore);\n    balances[msg.sender] = balances[msg.sender].sub(cTokenDiff);\n    _token().transfer(msg.sender, diff);\n    return diff;\n  }\n}\n"
      },
      "contracts/test/PrizeSplitHarness.sol": {
        "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.6.12;\npragma experimental ABIEncoderV2;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\n\nimport \"../token/ControlledToken.sol\";\nimport \"../prize-strategy/PrizeSplit.sol\";\n\n/* solium-disable security/no-block-members */\ncontract PrizeSplitHarness is PrizeSplit {\n\n  ControlledToken[] internal externalErc20s;\n\n  constructor () public {\n    __Ownable_init();\n  }\n\n  function initialize(ControlledToken[] calldata tokens) public {\n    for (uint256 index = 0; index < tokens.length; index++) {\n      externalErc20s.push(tokens[index]);\n    }\n  }\n\n  function _awardPrizeSplitAmount(address target, uint256 amount, uint8 tokenIndex) override internal{\n    require(tokenIndex == 0 || tokenIndex == 1, \"PrizeSplitHarness/invalid-prizesplit-token-type\");\n    ControlledToken _token = externalErc20s[tokenIndex];\n    _token.controllerMint(target, amount);\n  }\n\n  function distribute(uint256 prizeAmount) external returns (uint256) {\n    prizeAmount = _distributePrizeSplits(prizeAmount);\n\n    return prizeAmount;\n  }\n\n  function beforeTokenTransfer(address from, address to, uint256 amount) external {\n    return;\n  }\n}"
      },
      "contracts/reserve/Reserve.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity >=0.5.0 <0.7.0;\n\nimport \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\n\nimport \"./ReserveInterface.sol\";\nimport \"../prize-pool/PrizePoolInterface.sol\";\n\n/// @title Interface that allows a user to draw an address using an index\ncontract Reserve is OwnableUpgradeable, ReserveInterface {\n\n  event ReserveRateMantissaSet(uint256 rateMantissa);\n\n  uint256 public rateMantissa;\n\n  constructor () public {\n    __Ownable_init();\n  }\n\n  function setRateMantissa(\n    uint256 _rateMantissa\n  )\n    external\n    onlyOwner\n  {\n    rateMantissa = _rateMantissa;\n\n    emit ReserveRateMantissaSet(rateMantissa);\n  }\n\n  function withdrawReserve(address prizePool, address to) external onlyOwner returns (uint256) {\n    return PrizePoolInterface(prizePool).withdrawReserve(to);\n  }\n\n  function reserveRateMantissa(address) external view override returns (uint256) {\n    return rateMantissa;\n  }\n}\n"
      },
      "contracts/test/PrizePoolHarness.sol": {
        "content": "pragma solidity 0.6.12;\n\nimport \"../prize-pool/PrizePool.sol\";\nimport \"./YieldSourceStub.sol\";\n\ncontract PrizePoolHarness is PrizePool {\n\n  uint256 public currentTime;\n\n  YieldSourceStub stubYieldSource;\n\n  function initializeAll(\n    RegistryInterface _reserveRegistry,\n    ControlledTokenInterface[] memory _controlledTokens,\n    uint256 _maxExitFeeMantissa,\n    YieldSourceStub _stubYieldSource\n  )\n    public\n  {\n    PrizePool.initialize(\n      _reserveRegistry,\n      _controlledTokens,\n      _maxExitFeeMantissa\n    );\n    stubYieldSource = _stubYieldSource;\n  }\n\n  function supply(uint256 mintAmount) external {\n    _supply(mintAmount);\n  }\n\n  function redeem(uint256 redeemAmount) external {\n    _redeem(redeemAmount);\n  }\n\n  function setCurrentTime(uint256 _currentTime) external {\n    currentTime = _currentTime;\n  }\n\n  function _currentTime() internal override view returns (uint256) {\n    return currentTime;\n  }\n\n  function _canAwardExternal(address _externalToken) internal override view returns (bool) {\n    return stubYieldSource.canAwardExternal(_externalToken);\n  }\n\n  function _token() internal override view returns (IERC20Upgradeable) {\n    return stubYieldSource.token();\n  }\n\n  function _balance() internal override returns (uint256) {\n    return stubYieldSource.balance();\n  }\n\n  function _supply(uint256 mintAmount) internal override {\n    return stubYieldSource.supply(mintAmount);\n  }\n\n  function _redeem(uint256 redeemAmount) internal override returns (uint256) {\n    return stubYieldSource.redeem(redeemAmount);\n  }\n}\n"
      },
      "contracts/test/YieldSourceStub.sol": {
        "content": "pragma solidity 0.6.12;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\n\ninterface YieldSourceStub {\n  function canAwardExternal(address _externalToken) external view returns (bool);\n\n  function token() external view returns (IERC20Upgradeable);\n\n  function balance() external returns (uint256);\n\n  function supply(uint256 mintAmount) external;\n\n  function redeem(uint256 redeemAmount) external returns (uint256);\n}\n"
      },
      "contracts/test/StakePrizePoolHarness.sol": {
        "content": "pragma solidity 0.6.12;\n\nimport \"../prize-pool/stake/StakePrizePool.sol\";\n\n/* solium-disable security/no-block-members */\ncontract StakePrizePoolHarness is StakePrizePool {\n\n  uint256 public currentTime;\n\n  function setCurrentTime(uint256 _currentTime) external {\n    currentTime = _currentTime;\n  }\n\n  function _currentTime() internal override view returns (uint256) {\n    return currentTime;\n  }\n\n  function supply(uint256 mintAmount) external {\n    //_supply(mintAmount);\n  }\n\n  function redeem(uint256 redeemAmount) external returns (uint256) {\n    return redeemAmount;\n  }\n}"
      },
      "contracts/test/StakePrizePoolHarnessProxyFactory.sol": {
        "content": "pragma solidity 0.6.12;\n\nimport \"./StakePrizePoolHarness.sol\";\nimport \"../external/openzeppelin/ProxyFactory.sol\";\n\n/// @title Stake Prize Pool Proxy Factory\n/// @notice Minimal proxy pattern for creating new Stake Prize Pools\ncontract StakePrizePoolHarnessProxyFactory is ProxyFactory {\n\n  /// @notice Contract template for deploying proxied Prize Pools\n  StakePrizePoolHarness public instance;\n\n  /// @notice Initializes the Factory with an instance of the Stake Prize Pool\n  constructor () public {\n    instance = new StakePrizePoolHarness();\n  }\n\n  /// @notice Creates a new Stake Prize Pool as a proxy of the template instance\n  /// @return A reference to the new proxied Stake Prize Pool\n  function create() external returns (StakePrizePoolHarness) {\n    return StakePrizePoolHarness(deployMinimal(address(instance), \"\"));\n  }\n}\n"
      },
      "contracts/test/YieldSourcePrizePoolHarness.sol": {
        "content": "pragma solidity 0.6.12;\n\nimport \"../prize-pool/yield-source/YieldSourcePrizePool.sol\";\n\n/* solium-disable security/no-block-members */\ncontract YieldSourcePrizePoolHarness is YieldSourcePrizePool {\n\n  uint256 public currentTime;\n\n  function setCurrentTime(uint256 _currentTime) external {\n    currentTime = _currentTime;\n  }\n\n  function _currentTime() internal override view returns (uint256) {\n    return currentTime;\n  }\n\n  function supply(uint256 mintAmount) external {\n    _supply(mintAmount);\n  }\n\n  function redeem(uint256 redeemAmount) external returns (uint256) {\n    return _redeem(redeemAmount);\n  }\n}\n"
      },
      "contracts/test/YieldSourcePrizePoolHarnessProxyFactory.sol": {
        "content": "pragma solidity 0.6.12;\n\nimport \"./YieldSourcePrizePoolHarness.sol\";\nimport \"../external/openzeppelin/ProxyFactory.sol\";\n\n/// @title YieldSource Prize Pool Proxy Factory\n/// @notice Minimal proxy pattern for creating new YieldSource Prize Pools\ncontract YieldSourcePrizePoolHarnessProxyFactory is ProxyFactory {\n\n  /// @notice Contract template for deploying proxied Prize Pools\n  YieldSourcePrizePoolHarness public instance;\n\n  /// @notice Initializes the Factory with an instance of the YieldSource Prize Pool\n  constructor () public {\n    instance = new YieldSourcePrizePoolHarness();\n  }\n\n  /// @notice Creates a new YieldSource Prize Pool as a proxy of the template instance\n  /// @return A reference to the new proxied YieldSource Prize Pool\n  function create() external returns (YieldSourcePrizePoolHarness) {\n    return YieldSourcePrizePoolHarness(deployMinimal(address(instance), \"\"));\n  }\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\nimport \"../../utils/ContextUpgradeable.sol\";\nimport \"./IERC721Upgradeable.sol\";\nimport \"./IERC721MetadataUpgradeable.sol\";\nimport \"./IERC721EnumerableUpgradeable.sol\";\nimport \"./IERC721ReceiverUpgradeable.sol\";\nimport \"../../introspection/ERC165Upgradeable.sol\";\nimport \"../../math/SafeMathUpgradeable.sol\";\nimport \"../../utils/AddressUpgradeable.sol\";\nimport \"../../utils/EnumerableSetUpgradeable.sol\";\nimport \"../../utils/EnumerableMapUpgradeable.sol\";\nimport \"../../utils/StringsUpgradeable.sol\";\nimport \"../../proxy/Initializable.sol\";\n\n/**\n * @title ERC721 Non-Fungible Token Standard basic implementation\n * @dev see https://eips.ethereum.org/EIPS/eip-721\n */\ncontract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable, IERC721EnumerableUpgradeable {\n    using SafeMathUpgradeable for uint256;\n    using AddressUpgradeable for address;\n    using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet;\n    using EnumerableMapUpgradeable for EnumerableMapUpgradeable.UintToAddressMap;\n    using StringsUpgradeable for uint256;\n\n    // Equals to `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`\n    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`\n    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;\n\n    // Mapping from holder address to their (enumerable) set of owned tokens\n    mapping (address => EnumerableSetUpgradeable.UintSet) private _holderTokens;\n\n    // Enumerable mapping from token ids to their owners\n    EnumerableMapUpgradeable.UintToAddressMap private _tokenOwners;\n\n    // Mapping from token ID to approved address\n    mapping (uint256 => address) private _tokenApprovals;\n\n    // Mapping from owner to operator approvals\n    mapping (address => mapping (address => bool)) private _operatorApprovals;\n\n    // Token name\n    string private _name;\n\n    // Token symbol\n    string private _symbol;\n\n    // Optional mapping for token URIs\n    mapping (uint256 => string) private _tokenURIs;\n\n    // Base URI\n    string private _baseURI;\n\n    /*\n     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231\n     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e\n     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3\n     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc\n     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465\n     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5\n     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd\n     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e\n     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde\n     *\n     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^\n     *        0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd\n     */\n    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;\n\n    /*\n     *     bytes4(keccak256('name()')) == 0x06fdde03\n     *     bytes4(keccak256('symbol()')) == 0x95d89b41\n     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd\n     *\n     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f\n     */\n    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;\n\n    /*\n     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd\n     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59\n     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7\n     *\n     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63\n     */\n    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;\n\n    /**\n     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n     */\n    function __ERC721_init(string memory name_, string memory symbol_) internal initializer {\n        __Context_init_unchained();\n        __ERC165_init_unchained();\n        __ERC721_init_unchained(name_, symbol_);\n    }\n\n    function __ERC721_init_unchained(string memory name_, string memory symbol_) internal initializer {\n        _name = name_;\n        _symbol = symbol_;\n\n        // register the supported interfaces to conform to ERC721 via ERC165\n        _registerInterface(_INTERFACE_ID_ERC721);\n        _registerInterface(_INTERFACE_ID_ERC721_METADATA);\n        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);\n    }\n\n    /**\n     * @dev See {IERC721-balanceOf}.\n     */\n    function balanceOf(address owner) public view virtual override returns (uint256) {\n        require(owner != address(0), \"ERC721: balance query for the zero address\");\n        return _holderTokens[owner].length();\n    }\n\n    /**\n     * @dev See {IERC721-ownerOf}.\n     */\n    function ownerOf(uint256 tokenId) public view virtual override returns (address) {\n        return _tokenOwners.get(tokenId, \"ERC721: owner query for nonexistent token\");\n    }\n\n    /**\n     * @dev See {IERC721Metadata-name}.\n     */\n    function name() public view virtual override returns (string memory) {\n        return _name;\n    }\n\n    /**\n     * @dev See {IERC721Metadata-symbol}.\n     */\n    function symbol() public view virtual override returns (string memory) {\n        return _symbol;\n    }\n\n    /**\n     * @dev See {IERC721Metadata-tokenURI}.\n     */\n    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\n        require(_exists(tokenId), \"ERC721Metadata: URI query for nonexistent token\");\n\n        string memory _tokenURI = _tokenURIs[tokenId];\n        string memory base = baseURI();\n\n        // If there is no base URI, return the token URI.\n        if (bytes(base).length == 0) {\n            return _tokenURI;\n        }\n        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).\n        if (bytes(_tokenURI).length > 0) {\n            return string(abi.encodePacked(base, _tokenURI));\n        }\n        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.\n        return string(abi.encodePacked(base, tokenId.toString()));\n    }\n\n    /**\n    * @dev Returns the base URI set via {_setBaseURI}. This will be\n    * automatically added as a prefix in {tokenURI} to each token's URI, or\n    * to the token ID if no specific URI is set for that token ID.\n    */\n    function baseURI() public view virtual returns (string memory) {\n        return _baseURI;\n    }\n\n    /**\n     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.\n     */\n    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {\n        return _holderTokens[owner].at(index);\n    }\n\n    /**\n     * @dev See {IERC721Enumerable-totalSupply}.\n     */\n    function totalSupply() public view virtual override returns (uint256) {\n        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds\n        return _tokenOwners.length();\n    }\n\n    /**\n     * @dev See {IERC721Enumerable-tokenByIndex}.\n     */\n    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {\n        (uint256 tokenId, ) = _tokenOwners.at(index);\n        return tokenId;\n    }\n\n    /**\n     * @dev See {IERC721-approve}.\n     */\n    function approve(address to, uint256 tokenId) public virtual override {\n        address owner = ERC721Upgradeable.ownerOf(tokenId);\n        require(to != owner, \"ERC721: approval to current owner\");\n\n        require(_msgSender() == owner || ERC721Upgradeable.isApprovedForAll(owner, _msgSender()),\n            \"ERC721: approve caller is not owner nor approved for all\"\n        );\n\n        _approve(to, tokenId);\n    }\n\n    /**\n     * @dev See {IERC721-getApproved}.\n     */\n    function getApproved(uint256 tokenId) public view virtual override returns (address) {\n        require(_exists(tokenId), \"ERC721: approved query for nonexistent token\");\n\n        return _tokenApprovals[tokenId];\n    }\n\n    /**\n     * @dev See {IERC721-setApprovalForAll}.\n     */\n    function setApprovalForAll(address operator, bool approved) public virtual override {\n        require(operator != _msgSender(), \"ERC721: approve to caller\");\n\n        _operatorApprovals[_msgSender()][operator] = approved;\n        emit ApprovalForAll(_msgSender(), operator, approved);\n    }\n\n    /**\n     * @dev See {IERC721-isApprovedForAll}.\n     */\n    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\n        return _operatorApprovals[owner][operator];\n    }\n\n    /**\n     * @dev See {IERC721-transferFrom}.\n     */\n    function transferFrom(address from, address to, uint256 tokenId) public virtual override {\n        //solhint-disable-next-line max-line-length\n        require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: transfer caller is not owner nor approved\");\n\n        _transfer(from, to, tokenId);\n    }\n\n    /**\n     * @dev See {IERC721-safeTransferFrom}.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {\n        safeTransferFrom(from, to, tokenId, \"\");\n    }\n\n    /**\n     * @dev See {IERC721-safeTransferFrom}.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {\n        require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: transfer caller is not owner nor approved\");\n        _safeTransfer(from, to, tokenId, _data);\n    }\n\n    /**\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n     *\n     * `_data` is additional data, it has no specified format and it is sent in call to `to`.\n     *\n     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\n     * implement alternative mechanisms to perform token transfer, such as signature-based.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must exist and be owned by `from`.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {\n        _transfer(from, to, tokenId);\n        require(_checkOnERC721Received(from, to, tokenId, _data), \"ERC721: transfer to non ERC721Receiver implementer\");\n    }\n\n    /**\n     * @dev Returns whether `tokenId` exists.\n     *\n     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\n     *\n     * Tokens start existing when they are minted (`_mint`),\n     * and stop existing when they are burned (`_burn`).\n     */\n    function _exists(uint256 tokenId) internal view virtual returns (bool) {\n        return _tokenOwners.contains(tokenId);\n    }\n\n    /**\n     * @dev Returns whether `spender` is allowed to manage `tokenId`.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\n        require(_exists(tokenId), \"ERC721: operator query for nonexistent token\");\n        address owner = ERC721Upgradeable.ownerOf(tokenId);\n        return (spender == owner || getApproved(tokenId) == spender || ERC721Upgradeable.isApprovedForAll(owner, spender));\n    }\n\n    /**\n     * @dev Safely mints `tokenId` and transfers it to `to`.\n     *\n     * Requirements:\n     d*\n     * - `tokenId` must not exist.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _safeMint(address to, uint256 tokenId) internal virtual {\n        _safeMint(to, tokenId, \"\");\n    }\n\n    /**\n     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\n     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n     */\n    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {\n        _mint(to, tokenId);\n        require(_checkOnERC721Received(address(0), to, tokenId, _data), \"ERC721: transfer to non ERC721Receiver implementer\");\n    }\n\n    /**\n     * @dev Mints `tokenId` and transfers it to `to`.\n     *\n     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\n     *\n     * Requirements:\n     *\n     * - `tokenId` must not exist.\n     * - `to` cannot be the zero address.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _mint(address to, uint256 tokenId) internal virtual {\n        require(to != address(0), \"ERC721: mint to the zero address\");\n        require(!_exists(tokenId), \"ERC721: token already minted\");\n\n        _beforeTokenTransfer(address(0), to, tokenId);\n\n        _holderTokens[to].add(tokenId);\n\n        _tokenOwners.set(tokenId, to);\n\n        emit Transfer(address(0), to, tokenId);\n    }\n\n    /**\n     * @dev Destroys `tokenId`.\n     * The approval is cleared when the token is burned.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _burn(uint256 tokenId) internal virtual {\n        address owner = ERC721Upgradeable.ownerOf(tokenId); // internal owner\n\n        _beforeTokenTransfer(owner, address(0), tokenId);\n\n        // Clear approvals\n        _approve(address(0), tokenId);\n\n        // Clear metadata (if any)\n        if (bytes(_tokenURIs[tokenId]).length != 0) {\n            delete _tokenURIs[tokenId];\n        }\n\n        _holderTokens[owner].remove(tokenId);\n\n        _tokenOwners.remove(tokenId);\n\n        emit Transfer(owner, address(0), tokenId);\n    }\n\n    /**\n     * @dev Transfers `tokenId` from `from` to `to`.\n     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\n     *\n     * Requirements:\n     *\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must be owned by `from`.\n     *\n     * Emits a {Transfer} event.\n     */\n    function _transfer(address from, address to, uint256 tokenId) internal virtual {\n        require(ERC721Upgradeable.ownerOf(tokenId) == from, \"ERC721: transfer of token that is not own\"); // internal owner\n        require(to != address(0), \"ERC721: transfer to the zero address\");\n\n        _beforeTokenTransfer(from, to, tokenId);\n\n        // Clear approvals from the previous owner\n        _approve(address(0), tokenId);\n\n        _holderTokens[from].remove(tokenId);\n        _holderTokens[to].add(tokenId);\n\n        _tokenOwners.set(tokenId, to);\n\n        emit Transfer(from, to, tokenId);\n    }\n\n    /**\n     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {\n        require(_exists(tokenId), \"ERC721Metadata: URI set of nonexistent token\");\n        _tokenURIs[tokenId] = _tokenURI;\n    }\n\n    /**\n     * @dev Internal function to set the base URI for all token IDs. It is\n     * automatically added as a prefix to the value returned in {tokenURI},\n     * or to the token ID if {tokenURI} is empty.\n     */\n    function _setBaseURI(string memory baseURI_) internal virtual {\n        _baseURI = baseURI_;\n    }\n\n    /**\n     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\n     * The call is not executed if the target address is not a contract.\n     *\n     * @param from address representing the previous owner of the given token ID\n     * @param to target address that will receive the tokens\n     * @param tokenId uint256 ID of the token to be transferred\n     * @param _data bytes optional data to send along with the call\n     * @return bool whether the call correctly returned the expected magic value\n     */\n    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)\n        private returns (bool)\n    {\n        if (!to.isContract()) {\n            return true;\n        }\n        bytes memory returndata = to.functionCall(abi.encodeWithSelector(\n            IERC721ReceiverUpgradeable(to).onERC721Received.selector,\n            _msgSender(),\n            from,\n            tokenId,\n            _data\n        ), \"ERC721: transfer to non ERC721Receiver implementer\");\n        bytes4 retval = abi.decode(returndata, (bytes4));\n        return (retval == _ERC721_RECEIVED);\n    }\n\n    function _approve(address to, uint256 tokenId) private {\n        _tokenApprovals[tokenId] = to;\n        emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId); // internal owner\n    }\n\n    /**\n     * @dev Hook that is called before any token transfer. This includes minting\n     * and burning.\n     *\n     * Calling conditions:\n     *\n     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be\n     * transferred to `to`.\n     * - When `from` is zero, `tokenId` will be minted for `to`.\n     * - When `to` is zero, ``from``'s `tokenId` will be burned.\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     *\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n     */\n    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }\n    uint256[41] private __gap;\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721MetadataUpgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.2 <0.8.0;\n\nimport \"./IERC721Upgradeable.sol\";\n\n/**\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n * @dev See https://eips.ethereum.org/EIPS/eip-721\n */\ninterface IERC721MetadataUpgradeable is IERC721Upgradeable {\n\n    /**\n     * @dev Returns the token collection name.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the token collection symbol.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\n     */\n    function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721EnumerableUpgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.2 <0.8.0;\n\nimport \"./IERC721Upgradeable.sol\";\n\n/**\n * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension\n * @dev See https://eips.ethereum.org/EIPS/eip-721\n */\ninterface IERC721EnumerableUpgradeable is IERC721Upgradeable {\n\n    /**\n     * @dev Returns the total amount of tokens stored by the contract.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.\n     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.\n     */\n    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);\n\n    /**\n     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.\n     * Use along with {totalSupply} to enumerate all tokens.\n     */\n    function tokenByIndex(uint256 index) external view returns (uint256);\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/utils/EnumerableSetUpgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Library for managing\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\n * types.\n *\n * Sets have the following properties:\n *\n * - Elements are added, removed, and checked for existence in constant time\n * (O(1)).\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\n *\n * ```\n * contract Example {\n *     // Add the library methods\n *     using EnumerableSet for EnumerableSet.AddressSet;\n *\n *     // Declare a set state variable\n *     EnumerableSet.AddressSet private mySet;\n * }\n * ```\n *\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\n * and `uint256` (`UintSet`) are supported.\n */\nlibrary EnumerableSetUpgradeable {\n    // To implement this library for multiple types with as little code\n    // repetition as possible, we write it in terms of a generic Set type with\n    // bytes32 values.\n    // The Set implementation uses private functions, and user-facing\n    // implementations (such as AddressSet) are just wrappers around the\n    // underlying Set.\n    // This means that we can only create new EnumerableSets for types that fit\n    // in bytes32.\n\n    struct Set {\n        // Storage of set values\n        bytes32[] _values;\n\n        // Position of the value in the `values` array, plus 1 because index 0\n        // means a value is not in the set.\n        mapping (bytes32 => uint256) _indexes;\n    }\n\n    /**\n     * @dev Add a value to a set. O(1).\n     *\n     * Returns true if the value was added to the set, that is if it was not\n     * already present.\n     */\n    function _add(Set storage set, bytes32 value) private returns (bool) {\n        if (!_contains(set, value)) {\n            set._values.push(value);\n            // The value is stored at length-1, but we add 1 to all indexes\n            // and use 0 as a sentinel value\n            set._indexes[value] = set._values.length;\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * @dev Removes a value from a set. O(1).\n     *\n     * Returns true if the value was removed from the set, that is if it was\n     * present.\n     */\n    function _remove(Set storage set, bytes32 value) private returns (bool) {\n        // We read and store the value's index to prevent multiple reads from the same storage slot\n        uint256 valueIndex = set._indexes[value];\n\n        if (valueIndex != 0) { // Equivalent to contains(set, value)\n            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\n            // the array, and then remove the last element (sometimes called as 'swap and pop').\n            // This modifies the order of the array, as noted in {at}.\n\n            uint256 toDeleteIndex = valueIndex - 1;\n            uint256 lastIndex = set._values.length - 1;\n\n            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs\n            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.\n\n            bytes32 lastvalue = set._values[lastIndex];\n\n            // Move the last value to the index where the value to delete is\n            set._values[toDeleteIndex] = lastvalue;\n            // Update the index for the moved value\n            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based\n\n            // Delete the slot where the moved value was stored\n            set._values.pop();\n\n            // Delete the index for the deleted slot\n            delete set._indexes[value];\n\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * @dev Returns true if the value is in the set. O(1).\n     */\n    function _contains(Set storage set, bytes32 value) private view returns (bool) {\n        return set._indexes[value] != 0;\n    }\n\n    /**\n     * @dev Returns the number of values on the set. O(1).\n     */\n    function _length(Set storage set) private view returns (uint256) {\n        return set._values.length;\n    }\n\n   /**\n    * @dev Returns the value stored at position `index` in the set. O(1).\n    *\n    * Note that there are no guarantees on the ordering of values inside the\n    * array, and it may change when more values are added or removed.\n    *\n    * Requirements:\n    *\n    * - `index` must be strictly less than {length}.\n    */\n    function _at(Set storage set, uint256 index) private view returns (bytes32) {\n        require(set._values.length > index, \"EnumerableSet: index out of bounds\");\n        return set._values[index];\n    }\n\n    // Bytes32Set\n\n    struct Bytes32Set {\n        Set _inner;\n    }\n\n    /**\n     * @dev Add a value to a set. O(1).\n     *\n     * Returns true if the value was added to the set, that is if it was not\n     * already present.\n     */\n    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\n        return _add(set._inner, value);\n    }\n\n    /**\n     * @dev Removes a value from a set. O(1).\n     *\n     * Returns true if the value was removed from the set, that is if it was\n     * present.\n     */\n    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\n        return _remove(set._inner, value);\n    }\n\n    /**\n     * @dev Returns true if the value is in the set. O(1).\n     */\n    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\n        return _contains(set._inner, value);\n    }\n\n    /**\n     * @dev Returns the number of values in the set. O(1).\n     */\n    function length(Bytes32Set storage set) internal view returns (uint256) {\n        return _length(set._inner);\n    }\n\n   /**\n    * @dev Returns the value stored at position `index` in the set. O(1).\n    *\n    * Note that there are no guarantees on the ordering of values inside the\n    * array, and it may change when more values are added or removed.\n    *\n    * Requirements:\n    *\n    * - `index` must be strictly less than {length}.\n    */\n    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\n        return _at(set._inner, index);\n    }\n\n    // AddressSet\n\n    struct AddressSet {\n        Set _inner;\n    }\n\n    /**\n     * @dev Add a value to a set. O(1).\n     *\n     * Returns true if the value was added to the set, that is if it was not\n     * already present.\n     */\n    function add(AddressSet storage set, address value) internal returns (bool) {\n        return _add(set._inner, bytes32(uint256(uint160(value))));\n    }\n\n    /**\n     * @dev Removes a value from a set. O(1).\n     *\n     * Returns true if the value was removed from the set, that is if it was\n     * present.\n     */\n    function remove(AddressSet storage set, address value) internal returns (bool) {\n        return _remove(set._inner, bytes32(uint256(uint160(value))));\n    }\n\n    /**\n     * @dev Returns true if the value is in the set. O(1).\n     */\n    function contains(AddressSet storage set, address value) internal view returns (bool) {\n        return _contains(set._inner, bytes32(uint256(uint160(value))));\n    }\n\n    /**\n     * @dev Returns the number of values in the set. O(1).\n     */\n    function length(AddressSet storage set) internal view returns (uint256) {\n        return _length(set._inner);\n    }\n\n   /**\n    * @dev Returns the value stored at position `index` in the set. O(1).\n    *\n    * Note that there are no guarantees on the ordering of values inside the\n    * array, and it may change when more values are added or removed.\n    *\n    * Requirements:\n    *\n    * - `index` must be strictly less than {length}.\n    */\n    function at(AddressSet storage set, uint256 index) internal view returns (address) {\n        return address(uint160(uint256(_at(set._inner, index))));\n    }\n\n\n    // UintSet\n\n    struct UintSet {\n        Set _inner;\n    }\n\n    /**\n     * @dev Add a value to a set. O(1).\n     *\n     * Returns true if the value was added to the set, that is if it was not\n     * already present.\n     */\n    function add(UintSet storage set, uint256 value) internal returns (bool) {\n        return _add(set._inner, bytes32(value));\n    }\n\n    /**\n     * @dev Removes a value from a set. O(1).\n     *\n     * Returns true if the value was removed from the set, that is if it was\n     * present.\n     */\n    function remove(UintSet storage set, uint256 value) internal returns (bool) {\n        return _remove(set._inner, bytes32(value));\n    }\n\n    /**\n     * @dev Returns true if the value is in the set. O(1).\n     */\n    function contains(UintSet storage set, uint256 value) internal view returns (bool) {\n        return _contains(set._inner, bytes32(value));\n    }\n\n    /**\n     * @dev Returns the number of values on the set. O(1).\n     */\n    function length(UintSet storage set) internal view returns (uint256) {\n        return _length(set._inner);\n    }\n\n   /**\n    * @dev Returns the value stored at position `index` in the set. O(1).\n    *\n    * Note that there are no guarantees on the ordering of values inside the\n    * array, and it may change when more values are added or removed.\n    *\n    * Requirements:\n    *\n    * - `index` must be strictly less than {length}.\n    */\n    function at(UintSet storage set, uint256 index) internal view returns (uint256) {\n        return uint256(_at(set._inner, index));\n    }\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/utils/EnumerableMapUpgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev Library for managing an enumerable variant of Solidity's\n * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]\n * type.\n *\n * Maps have the following properties:\n *\n * - Entries are added, removed, and checked for existence in constant time\n * (O(1)).\n * - Entries are enumerated in O(n). No guarantees are made on the ordering.\n *\n * ```\n * contract Example {\n *     // Add the library methods\n *     using EnumerableMap for EnumerableMap.UintToAddressMap;\n *\n *     // Declare a set state variable\n *     EnumerableMap.UintToAddressMap private myMap;\n * }\n * ```\n *\n * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are\n * supported.\n */\nlibrary EnumerableMapUpgradeable {\n    // To implement this library for multiple types with as little code\n    // repetition as possible, we write it in terms of a generic Map type with\n    // bytes32 keys and values.\n    // The Map implementation uses private functions, and user-facing\n    // implementations (such as Uint256ToAddressMap) are just wrappers around\n    // the underlying Map.\n    // This means that we can only create new EnumerableMaps for types that fit\n    // in bytes32.\n\n    struct MapEntry {\n        bytes32 _key;\n        bytes32 _value;\n    }\n\n    struct Map {\n        // Storage of map keys and values\n        MapEntry[] _entries;\n\n        // Position of the entry defined by a key in the `entries` array, plus 1\n        // because index 0 means a key is not in the map.\n        mapping (bytes32 => uint256) _indexes;\n    }\n\n    /**\n     * @dev Adds a key-value pair to a map, or updates the value for an existing\n     * key. O(1).\n     *\n     * Returns true if the key was added to the map, that is if it was not\n     * already present.\n     */\n    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {\n        // We read and store the key's index to prevent multiple reads from the same storage slot\n        uint256 keyIndex = map._indexes[key];\n\n        if (keyIndex == 0) { // Equivalent to !contains(map, key)\n            map._entries.push(MapEntry({ _key: key, _value: value }));\n            // The entry is stored at length-1, but we add 1 to all indexes\n            // and use 0 as a sentinel value\n            map._indexes[key] = map._entries.length;\n            return true;\n        } else {\n            map._entries[keyIndex - 1]._value = value;\n            return false;\n        }\n    }\n\n    /**\n     * @dev Removes a key-value pair from a map. O(1).\n     *\n     * Returns true if the key was removed from the map, that is if it was present.\n     */\n    function _remove(Map storage map, bytes32 key) private returns (bool) {\n        // We read and store the key's index to prevent multiple reads from the same storage slot\n        uint256 keyIndex = map._indexes[key];\n\n        if (keyIndex != 0) { // Equivalent to contains(map, key)\n            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one\n            // in the array, and then remove the last entry (sometimes called as 'swap and pop').\n            // This modifies the order of the array, as noted in {at}.\n\n            uint256 toDeleteIndex = keyIndex - 1;\n            uint256 lastIndex = map._entries.length - 1;\n\n            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs\n            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.\n\n            MapEntry storage lastEntry = map._entries[lastIndex];\n\n            // Move the last entry to the index where the entry to delete is\n            map._entries[toDeleteIndex] = lastEntry;\n            // Update the index for the moved entry\n            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based\n\n            // Delete the slot where the moved entry was stored\n            map._entries.pop();\n\n            // Delete the index for the deleted slot\n            delete map._indexes[key];\n\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * @dev Returns true if the key is in the map. O(1).\n     */\n    function _contains(Map storage map, bytes32 key) private view returns (bool) {\n        return map._indexes[key] != 0;\n    }\n\n    /**\n     * @dev Returns the number of key-value pairs in the map. O(1).\n     */\n    function _length(Map storage map) private view returns (uint256) {\n        return map._entries.length;\n    }\n\n   /**\n    * @dev Returns the key-value pair stored at position `index` in the map. O(1).\n    *\n    * Note that there are no guarantees on the ordering of entries inside the\n    * array, and it may change when more entries are added or removed.\n    *\n    * Requirements:\n    *\n    * - `index` must be strictly less than {length}.\n    */\n    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {\n        require(map._entries.length > index, \"EnumerableMap: index out of bounds\");\n\n        MapEntry storage entry = map._entries[index];\n        return (entry._key, entry._value);\n    }\n\n    /**\n     * @dev Tries to returns the value associated with `key`.  O(1).\n     * Does not revert if `key` is not in the map.\n     */\n    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {\n        uint256 keyIndex = map._indexes[key];\n        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)\n        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based\n    }\n\n    /**\n     * @dev Returns the value associated with `key`.  O(1).\n     *\n     * Requirements:\n     *\n     * - `key` must be in the map.\n     */\n    function _get(Map storage map, bytes32 key) private view returns (bytes32) {\n        uint256 keyIndex = map._indexes[key];\n        require(keyIndex != 0, \"EnumerableMap: nonexistent key\"); // Equivalent to contains(map, key)\n        return map._entries[keyIndex - 1]._value; // All indexes are 1-based\n    }\n\n    /**\n     * @dev Same as {_get}, with a custom error message when `key` is not in the map.\n     *\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\n     * message unnecessarily. For custom revert reasons use {_tryGet}.\n     */\n    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {\n        uint256 keyIndex = map._indexes[key];\n        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)\n        return map._entries[keyIndex - 1]._value; // All indexes are 1-based\n    }\n\n    // UintToAddressMap\n\n    struct UintToAddressMap {\n        Map _inner;\n    }\n\n    /**\n     * @dev Adds a key-value pair to a map, or updates the value for an existing\n     * key. O(1).\n     *\n     * Returns true if the key was added to the map, that is if it was not\n     * already present.\n     */\n    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {\n        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));\n    }\n\n    /**\n     * @dev Removes a value from a set. O(1).\n     *\n     * Returns true if the key was removed from the map, that is if it was present.\n     */\n    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {\n        return _remove(map._inner, bytes32(key));\n    }\n\n    /**\n     * @dev Returns true if the key is in the map. O(1).\n     */\n    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {\n        return _contains(map._inner, bytes32(key));\n    }\n\n    /**\n     * @dev Returns the number of elements in the map. O(1).\n     */\n    function length(UintToAddressMap storage map) internal view returns (uint256) {\n        return _length(map._inner);\n    }\n\n   /**\n    * @dev Returns the element stored at position `index` in the set. O(1).\n    * Note that there are no guarantees on the ordering of values inside the\n    * array, and it may change when more values are added or removed.\n    *\n    * Requirements:\n    *\n    * - `index` must be strictly less than {length}.\n    */\n    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {\n        (bytes32 key, bytes32 value) = _at(map._inner, index);\n        return (uint256(key), address(uint160(uint256(value))));\n    }\n\n    /**\n     * @dev Tries to returns the value associated with `key`.  O(1).\n     * Does not revert if `key` is not in the map.\n     *\n     * _Available since v3.4._\n     */\n    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {\n        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));\n        return (success, address(uint160(uint256(value))));\n    }\n\n    /**\n     * @dev Returns the value associated with `key`.  O(1).\n     *\n     * Requirements:\n     *\n     * - `key` must be in the map.\n     */\n    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {\n        return address(uint160(uint256(_get(map._inner, bytes32(key)))));\n    }\n\n    /**\n     * @dev Same as {get}, with a custom error message when `key` is not in the map.\n     *\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\n     * message unnecessarily. For custom revert reasons use {tryGet}.\n     */\n    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {\n        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));\n    }\n}\n"
      },
      "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity >=0.6.0 <0.8.0;\n\n/**\n * @dev String operations.\n */\nlibrary StringsUpgradeable {\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` representation.\n     */\n    function toString(uint256 value) internal pure returns (string memory) {\n        // Inspired by OraclizeAPI's implementation - MIT licence\n        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol\n\n        if (value == 0) {\n            return \"0\";\n        }\n        uint256 temp = value;\n        uint256 digits;\n        while (temp != 0) {\n            digits++;\n            temp /= 10;\n        }\n        bytes memory buffer = new bytes(digits);\n        uint256 index = digits - 1;\n        temp = value;\n        while (temp != 0) {\n            buffer[index--] = bytes1(uint8(48 + temp % 10));\n            temp /= 10;\n        }\n        return string(buffer);\n    }\n}\n"
      },
      "contracts/test/NFT.sol": {
        "content": "pragma solidity 0.6.12;\nimport \"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\";\n\ncontract NFT is ERC721Upgradeable {\n  function initialize (\n    string memory name_, string memory symbol_\n  ) external initializer {\n    __ERC721_init(name_, symbol_);\n    _safeMint(msg.sender, 0);\n  }\n\n  function simulateSafeTransferFrom(address from, address to, uint256 tokenId) public {\n    ERC721Upgradeable.safeTransferFrom(from, to, tokenId);\n  }\n}"
      },
      "contracts/test/Dai.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\";\n\nimport \"../external/maker/DaiInterface.sol\";\n\ncontract Dai is DaiInterface {\n  using SafeMathUpgradeable for uint256;\n  using AddressUpgradeable for address;\n\n  mapping (address => uint256) private _balances;\n\n  mapping (address => mapping (address => uint256)) private _allowances;\n\n  uint256 private _totalSupply;\n\n  string private _name;\n  string private _symbol;\n  uint8 private _decimals;\n\n  /**\n    * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\n    * a default value of 18.\n    *\n    * To select a different value for {decimals}, use {_setupDecimals}.\n    *\n    * All three of these values are immutable: they can only be set once during\n    * construction.\n    */\n  constructor (uint256 chainId_) public {\n    string memory version = \"1\";\n\n    _name = \"Dai Stablecoin\";\n    _symbol = \"DAI\";\n    _decimals = 18;\n\n    DOMAIN_SEPARATOR = keccak256(\n      abi.encode(\n        keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n        keccak256(bytes(_name)),\n        keccak256(bytes(version)),\n        chainId_,\n        address(this)\n      )\n    );\n  }\n\n  /**\n    * @dev Returns the name of the token.\n    */\n  function name() public view returns (string memory) {\n      return _name;\n  }\n\n  /**\n    * @dev Returns the symbol of the token, usually a shorter version of the\n    * name.\n    */\n  function symbol() public view returns (string memory) {\n      return _symbol;\n  }\n\n  /**\n    * @dev Returns the number of decimals used to get its user representation.\n    * For example, if `decimals` equals `2`, a balance of `505` tokens should\n    * be displayed to a user as `5,05` (`505 / 10 ** 2`).\n    *\n    * Tokens usually opt for a value of 18, imitating the relationship between\n    * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\n    * called.\n    *\n    * NOTE: This information is only used for _display_ purposes: it in\n    * no way affects any of the arithmetic of the contract, including\n    * {IERC20-balanceOf} and {IERC20-transfer}.\n    */\n  function decimals() public view returns (uint8) {\n      return _decimals;\n  }\n\n  /**\n    * @dev See {IERC20-totalSupply}.\n    */\n  function totalSupply() public view override returns (uint256) {\n      return _totalSupply;\n  }\n\n  /**\n    * @dev See {IERC20-balanceOf}.\n    */\n  function balanceOf(address account) public view override returns (uint256) {\n      return _balances[account];\n  }\n\n  /**\n    * @dev See {IERC20-transfer}.\n    *\n    * Requirements:\n    *\n    * - `recipient` cannot be the zero address.\n    * - the caller must have a balance of at least `amount`.\n    */\n  function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n      _transfer(msg.sender, recipient, amount);\n      return true;\n  }\n\n  /**\n    * @dev See {IERC20-allowance}.\n    */\n  function allowance(address owner, address spender) public view virtual override returns (uint256) {\n      return _allowances[owner][spender];\n  }\n\n  /**\n    * @dev See {IERC20-approve}.\n    *\n    * Requirements:\n    *\n    * - `spender` cannot be the zero address.\n    */\n  function approve(address spender, uint256 amount) public virtual override returns (bool) {\n      _approve(msg.sender, spender, amount);\n      return true;\n  }\n\n  /**\n    * @dev See {IERC20-transferFrom}.\n    *\n    * Emits an {Approval} event indicating the updated allowance. This is not\n    * required by the EIP. See the note at the beginning of {ERC20};\n    *\n    * Requirements:\n    * - `sender` and `recipient` cannot be the zero address.\n    * - `sender` must have a balance of at least `amount`.\n    * - the caller must have allowance for ``sender``'s tokens of at least\n    * `amount`.\n    */\n  function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\n      _transfer(sender, recipient, amount);\n      _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, \"ERC20: transfer amount exceeds allowance\"));\n      return true;\n  }\n\n  /**\n    * @dev Atomically increases the allowance granted to `spender` by the caller.\n    *\n    * This is an alternative to {approve} that can be used as a mitigation for\n    * problems described in {IERC20-approve}.\n    *\n    * Emits an {Approval} event indicating the updated allowance.\n    *\n    * Requirements:\n    *\n    * - `spender` cannot be the zero address.\n    */\n  function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n      _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));\n      return true;\n  }\n\n  /**\n    * @dev Atomically decreases the allowance granted to `spender` by the caller.\n    *\n    * This is an alternative to {approve} that can be used as a mitigation for\n    * problems described in {IERC20-approve}.\n    *\n    * Emits an {Approval} event indicating the updated allowance.\n    *\n    * Requirements:\n    *\n    * - `spender` cannot be the zero address.\n    * - `spender` must have allowance for the caller of at least\n    * `subtractedValue`.\n    */\n  function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n      _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, \"ERC20: decreased allowance below zero\"));\n      return true;\n  }\n\n  /**\n    * @dev Moves tokens `amount` from `sender` to `recipient`.\n    *\n    * This is internal function is equivalent to {transfer}, and can be used to\n    * e.g. implement automatic token fees, slashing mechanisms, etc.\n    *\n    * Emits a {Transfer} event.\n    *\n    * Requirements:\n    *\n    * - `sender` cannot be the zero address.\n    * - `recipient` cannot be the zero address.\n    * - `sender` must have a balance of at least `amount`.\n    */\n  function _transfer(address sender, address recipient, uint256 amount) internal virtual {\n      require(sender != address(0), \"ERC20: transfer from the zero address\");\n      require(recipient != address(0), \"ERC20: transfer to the zero address\");\n\n      _beforeTokenTransfer(sender, recipient, amount);\n\n      _balances[sender] = _balances[sender].sub(amount, \"ERC20: transfer amount exceeds balance\");\n      _balances[recipient] = _balances[recipient].add(amount);\n      emit Transfer(sender, recipient, amount);\n  }\n\n  /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n    * the total supply.\n    *\n    * Emits a {Transfer} event with `from` set to the zero address.\n    *\n    * Requirements\n    *\n    * - `to` cannot be the zero address.\n    */\n  function _mint(address account, uint256 amount) internal virtual {\n      require(account != address(0), \"ERC20: mint to the zero address\");\n\n      _beforeTokenTransfer(address(0), account, amount);\n\n      _totalSupply = _totalSupply.add(amount);\n      _balances[account] = _balances[account].add(amount);\n      emit Transfer(address(0), account, amount);\n  }\n\n  /**\n    * @dev Destroys `amount` tokens from `account`, reducing the\n    * total supply.\n    *\n    * Emits a {Transfer} event with `to` set to the zero address.\n    *\n    * Requirements\n    *\n    * - `account` cannot be the zero address.\n    * - `account` must have at least `amount` tokens.\n    */\n  function _burn(address account, uint256 amount) internal virtual {\n      require(account != address(0), \"ERC20: burn from the zero address\");\n\n      _beforeTokenTransfer(account, address(0), amount);\n\n      _balances[account] = _balances[account].sub(amount, \"ERC20: burn amount exceeds balance\");\n      _totalSupply = _totalSupply.sub(amount);\n      emit Transfer(account, address(0), amount);\n  }\n\n  /**\n    * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n    *\n    * This internal function is equivalent to `approve`, and can be used to\n    * e.g. set automatic allowances for certain subsystems, etc.\n    *\n    * Emits an {Approval} event.\n    *\n    * Requirements:\n    *\n    * - `owner` cannot be the zero address.\n    * - `spender` cannot be the zero address.\n    */\n  function _approve(address owner, address spender, uint256 amount) internal virtual {\n      require(owner != address(0), \"ERC20: approve from the zero address\");\n      require(spender != address(0), \"ERC20: approve to the zero address\");\n\n      _allowances[owner][spender] = amount;\n      emit Approval(owner, spender, amount);\n  }\n\n  /**\n    * @dev Sets {decimals} to a value other than the default one of 18.\n    *\n    * WARNING: This function should only be called from the constructor. Most\n    * applications that interact with token contracts will not expect\n    * {decimals} to ever change, and may work incorrectly if it does.\n    */\n  function _setupDecimals(uint8 decimals_) internal {\n      _decimals = decimals_;\n  }\n\n  /**\n    * @dev Hook that is called before any transfer of tokens. This includes\n    * minting and burning.\n    *\n    * Calling conditions:\n    *\n    * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n    * will be to transferred to `to`.\n    * - when `from` is zero, `amount` tokens will be minted for `to`.\n    * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n    * - `from` and `to` are never both zero.\n    *\n    * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n    */\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\n\n  mapping (address => uint)                      public nonces;\n\n  // --- EIP712 niceties ---\n  bytes32 public DOMAIN_SEPARATOR;\n  // bytes32 public constant PERMIT_TYPEHASH = keccak256(\"Permit(address holder,address spender,uint256 nonce,uint256 expiry,bool allowed)\");\n  bytes32 public constant PERMIT_TYPEHASH = 0xea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb;\n\n  // --- Approve by signature ---\n  function permit(\n    address holder, address spender, uint256 nonce, uint256 expiry,\n    bool allowed, uint8 v, bytes32 r, bytes32 s) external override\n  {\n    bytes32 digest = keccak256(\n      abi.encodePacked(\n        \"\\x19\\x01\",\n        DOMAIN_SEPARATOR,\n        keccak256(\n          abi.encode(\n            PERMIT_TYPEHASH,\n            holder,\n            spender,\n            nonce,\n            expiry,\n            allowed\n          )\n        )\n      )\n    );\n\n    require(holder != address(0), \"Dai/invalid-address-0\");\n    require(holder == ecrecover(digest, v, r, s), \"Dai/invalid-permit\");\n    require(expiry == 0 || now <= expiry, \"Dai/permit-expired\");\n    require(nonce == nonces[holder]++, \"Dai/invalid-nonce\");\n    uint wad = allowed ? uint(-1) : 0;\n    _allowances[holder][spender] = wad;\n    emit Approval(holder, spender, wad);\n  }\n\n  function mint(address to, uint256 amount) external {\n    _mint(to, amount);\n  }\n}\n"
      },
      "contracts/external/maker/DaiInterface.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\n\ninterface DaiInterface is IERC20Upgradeable {\n    // --- Approve by signature ---\n  function permit(address holder, address spender, uint256 nonce, uint256 expiry, bool allowed, uint8 v, bytes32 r, bytes32 s) external;\n  function transferFrom(address src, address dst, uint wad) external override returns (bool);\n}\n"
      },
      "contracts/test/CompoundPrizePoolHarness.sol": {
        "content": "pragma solidity 0.6.12;\n\nimport \"../prize-pool/compound/CompoundPrizePool.sol\";\n\n/* solium-disable security/no-block-members */\ncontract CompoundPrizePoolHarness is CompoundPrizePool {\n\n  uint256 public currentTime;\n\n  function setCurrentTime(uint256 _currentTime) external {\n    currentTime = _currentTime;\n  }\n\n  function _currentTime() internal override view returns (uint256) {\n    return currentTime;\n  }\n\n  function supply(uint256 mintAmount) external {\n    _supply(mintAmount);\n  }\n\n  function redeem(uint256 redeemAmount) external returns (uint256) {\n    return _redeem(redeemAmount);\n  }\n}"
      },
      "contracts/test/CompoundPrizePoolHarnessProxyFactory.sol": {
        "content": "pragma solidity 0.6.12;\n\nimport \"./CompoundPrizePoolHarness.sol\";\nimport \"../external/openzeppelin/ProxyFactory.sol\";\n\n/// @title Compound Prize Pool Proxy Factory\n/// @notice Minimal proxy pattern for creating new Compound Prize Pools\ncontract CompoundPrizePoolHarnessProxyFactory is ProxyFactory {\n\n  /// @notice Contract template for deploying proxied Prize Pools\n  CompoundPrizePoolHarness public instance;\n\n  /// @notice Initializes the Factory with an instance of the Compound Prize Pool\n  constructor () public {\n    instance = new CompoundPrizePoolHarness();\n  }\n\n  /// @notice Creates a new Compound Prize Pool as a proxy of the template instance\n  /// @return A reference to the new proxied Compound Prize Pool\n  function create() external returns (CompoundPrizePoolHarness) {\n    return CompoundPrizePoolHarness(deployMinimal(address(instance), \"\"));\n  }\n}\n"
      },
      "contracts/test/CTokenMock.sol": {
        "content": "/**\nCopyright 2019 PoolTogether LLC\n\nThis file is part of PoolTogether.\n\nPoolTogether is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation under version 3 of the License.\n\nPoolTogether is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\n*/\n\npragma solidity 0.6.12;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\";\nimport \"@pooltogether/fixed-point/contracts/FixedPoint.sol\";\nimport \"hardhat/console.sol\";\n\nimport \"./ERC20Mintable.sol\";\n\ncontract CTokenMock is ERC20Upgradeable {\n  mapping(address => uint256) internal ownerTokenAmounts;\n  ERC20Mintable public underlying;\n\n  uint256 internal __supplyRatePerBlock;\n\n  constructor (\n    ERC20Mintable _token,\n    uint256 _supplyRatePerBlock\n  ) public {\n    require(address(_token) != address(0), \"token is not defined\");\n    underlying = _token;\n    __supplyRatePerBlock = _supplyRatePerBlock;\n  }\n\n  function mint(uint256 amount) external returns (uint) {\n    uint256 newCTokens;\n    if (totalSupply() == 0) {\n      newCTokens = amount;\n    } else {\n      // they need to hold the same assets as tokens.\n      // Need to calculate the current exchange rate\n      uint256 fractionOfCredit = FixedPoint.calculateMantissa(amount, underlying.balanceOf(address(this)));\n      newCTokens = FixedPoint.multiplyUintByMantissa(totalSupply(), fractionOfCredit);\n    }\n    _mint(msg.sender, newCTokens);\n    require(underlying.transferFrom(msg.sender, address(this), amount), \"could not transfer tokens\");\n    return 0;\n  }\n\n  function getCash() external view returns (uint) {\n    return underlying.balanceOf(address(this));\n  }\n\n  function redeemUnderlying(uint256 requestedAmount) external returns (uint) {\n    uint256 cTokens = cTokenValueOf(requestedAmount);\n    _burn(msg.sender, cTokens);\n    require(underlying.transfer(msg.sender, requestedAmount), \"could not transfer tokens\");\n  }\n\n  function accrue() external {\n    uint256 newTokens = (underlying.balanceOf(address(this)) * 120) / 100;\n    underlying.mint(address(this), newTokens);\n  }\n\n  function accrueCustom(uint256 amount) external {\n    underlying.mint(address(this), amount);\n  }\n\n  function burn(uint256 amount) external {\n    underlying.burn(address(this), amount);\n  }\n\n  function cTokenValueOf(uint256 tokens) public view returns (uint256) {\n    return FixedPoint.divideUintByMantissa(tokens, exchangeRateCurrent());\n  }\n\n  function balanceOfUnderlying(address account) public view returns (uint) {\n    return FixedPoint.multiplyUintByMantissa(balanceOf(account), exchangeRateCurrent());\n  }\n\n  function exchangeRateCurrent() public view returns (uint256) {\n    if (totalSupply() == 0) {\n      return FixedPoint.SCALE;\n    } else {\n      return FixedPoint.calculateMantissa(underlying.balanceOf(address(this)), totalSupply());\n    }\n  }\n\n  function supplyRatePerBlock() external view returns (uint) {\n    return __supplyRatePerBlock;\n  }\n\n  function setSupplyRateMantissa(uint256 _supplyRatePerBlock) external {\n    __supplyRatePerBlock = _supplyRatePerBlock;\n  }\n}\n"
      },
      "hardhat/console.sol": {
        "content": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.22 <0.9.0;\n\nlibrary console {\n\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\n\n\tfunction _sendLogPayload(bytes memory payload) private view {\n\t\tuint256 payloadLength = payload.length;\n\t\taddress consoleAddress = CONSOLE_ADDRESS;\n\t\tassembly {\n\t\t\tlet payloadStart := add(payload, 32)\n\t\t\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\n\t\t}\n\t}\n\n\tfunction log() internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log()\"));\n\t}\n\n\tfunction logInt(int p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(int)\", p0));\n\t}\n\n\tfunction logUint(uint p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint)\", p0));\n\t}\n\n\tfunction logString(string memory p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n\t}\n\n\tfunction logBool(bool p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n\t}\n\n\tfunction logAddress(address p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n\t}\n\n\tfunction logBytes(bytes memory p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes)\", p0));\n\t}\n\n\tfunction logBytes1(bytes1 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes1)\", p0));\n\t}\n\n\tfunction logBytes2(bytes2 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes2)\", p0));\n\t}\n\n\tfunction logBytes3(bytes3 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes3)\", p0));\n\t}\n\n\tfunction logBytes4(bytes4 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes4)\", p0));\n\t}\n\n\tfunction logBytes5(bytes5 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes5)\", p0));\n\t}\n\n\tfunction logBytes6(bytes6 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes6)\", p0));\n\t}\n\n\tfunction logBytes7(bytes7 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes7)\", p0));\n\t}\n\n\tfunction logBytes8(bytes8 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes8)\", p0));\n\t}\n\n\tfunction logBytes9(bytes9 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes9)\", p0));\n\t}\n\n\tfunction logBytes10(bytes10 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes10)\", p0));\n\t}\n\n\tfunction logBytes11(bytes11 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes11)\", p0));\n\t}\n\n\tfunction logBytes12(bytes12 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes12)\", p0));\n\t}\n\n\tfunction logBytes13(bytes13 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes13)\", p0));\n\t}\n\n\tfunction logBytes14(bytes14 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes14)\", p0));\n\t}\n\n\tfunction logBytes15(bytes15 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes15)\", p0));\n\t}\n\n\tfunction logBytes16(bytes16 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes16)\", p0));\n\t}\n\n\tfunction logBytes17(bytes17 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes17)\", p0));\n\t}\n\n\tfunction logBytes18(bytes18 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes18)\", p0));\n\t}\n\n\tfunction logBytes19(bytes19 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes19)\", p0));\n\t}\n\n\tfunction logBytes20(bytes20 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes20)\", p0));\n\t}\n\n\tfunction logBytes21(bytes21 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes21)\", p0));\n\t}\n\n\tfunction logBytes22(bytes22 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes22)\", p0));\n\t}\n\n\tfunction logBytes23(bytes23 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes23)\", p0));\n\t}\n\n\tfunction logBytes24(bytes24 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes24)\", p0));\n\t}\n\n\tfunction logBytes25(bytes25 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes25)\", p0));\n\t}\n\n\tfunction logBytes26(bytes26 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes26)\", p0));\n\t}\n\n\tfunction logBytes27(bytes27 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes27)\", p0));\n\t}\n\n\tfunction logBytes28(bytes28 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes28)\", p0));\n\t}\n\n\tfunction logBytes29(bytes29 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes29)\", p0));\n\t}\n\n\tfunction logBytes30(bytes30 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes30)\", p0));\n\t}\n\n\tfunction logBytes31(bytes31 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes31)\", p0));\n\t}\n\n\tfunction logBytes32(bytes32 p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bytes32)\", p0));\n\t}\n\n\tfunction log(uint p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint)\", p0));\n\t}\n\n\tfunction log(string memory p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n\t}\n\n\tfunction log(bool p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n\t}\n\n\tfunction log(address p0) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n\t}\n\n\tfunction log(uint p0, uint p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint)\", p0, p1));\n\t}\n\n\tfunction log(uint p0, string memory p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string)\", p0, p1));\n\t}\n\n\tfunction log(uint p0, bool p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool)\", p0, p1));\n\t}\n\n\tfunction log(uint p0, address p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address)\", p0, p1));\n\t}\n\n\tfunction log(string memory p0, uint p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint)\", p0, p1));\n\t}\n\n\tfunction log(string memory p0, string memory p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string)\", p0, p1));\n\t}\n\n\tfunction log(string memory p0, bool p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool)\", p0, p1));\n\t}\n\n\tfunction log(string memory p0, address p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address)\", p0, p1));\n\t}\n\n\tfunction log(bool p0, uint p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint)\", p0, p1));\n\t}\n\n\tfunction log(bool p0, string memory p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string)\", p0, p1));\n\t}\n\n\tfunction log(bool p0, bool p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool)\", p0, p1));\n\t}\n\n\tfunction log(bool p0, address p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address)\", p0, p1));\n\t}\n\n\tfunction log(address p0, uint p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint)\", p0, p1));\n\t}\n\n\tfunction log(address p0, string memory p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string)\", p0, p1));\n\t}\n\n\tfunction log(address p0, bool p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool)\", p0, p1));\n\t}\n\n\tfunction log(address p0, address p1) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address)\", p0, p1));\n\t}\n\n\tfunction log(uint p0, uint p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, uint p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, uint p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, uint p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, string memory p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, string memory p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, string memory p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, string memory p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, bool p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, bool p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, bool p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, bool p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, address p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, address p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, address p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, address p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, uint p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, uint p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, uint p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, uint p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, address p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, uint p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, uint p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, uint p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, uint p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, bool p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, address p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(bool p0, address p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, uint p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, uint p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, uint p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, uint p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, string memory p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, bool p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, bool p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, address p1, uint p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, address p1, bool p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool)\", p0, p1, p2));\n\t}\n\n\tfunction log(address p0, address p1, address p2) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address)\", p0, p1, p2));\n\t}\n\n\tfunction log(uint p0, uint p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, uint p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,uint,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, string memory p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,string,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, bool p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,bool,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(uint p0, address p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(uint,address,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, uint p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,uint,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, uint p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,uint,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(bool p0, address p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, uint p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,uint,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, bool p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, uint p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, uint p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, uint p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, uint p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, bool p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, bool p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,address)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, address p2, uint p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,uint)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,string)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, address p2, bool p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,bool)\", p0, p1, p2, p3));\n\t}\n\n\tfunction log(address p0, address p1, address p2, address p3) internal view {\n\t\t_sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,address)\", p0, p1, p2, p3));\n\t}\n\n}\n"
      },
      "contracts/test/ERC20Mintable.sol": {
        "content": "pragma solidity 0.6.12;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\";\n\n/**\n * @dev Extension of {ERC20} that adds a set of accounts with the {MinterRole},\n * which have permission to mint (create) new tokens as they see fit.\n *\n * At construction, the deployer of the contract is the only minter.\n */\ncontract ERC20Mintable is ERC20Upgradeable {\n\n    constructor(string memory _name, string memory _symbol) public {\n        __ERC20_init(_name, _symbol);\n    }\n\n    /**\n     * @dev See {ERC20-_mint}.\n     *\n     * Requirements:\n     *\n     * - the caller must have the {MinterRole}.\n     */\n    function mint(address account, uint256 amount) public returns (bool) {\n        _mint(account, amount);\n        return true;\n    }\n\n    function burn(address account, uint256 amount) public returns (bool) {\n        _burn(account, amount);\n        return true;\n    }\n\n    function masterTransfer(address from, address to, uint256 amount) public {\n        _transfer(from, to, amount);\n    }\n}\n"
      },
      "contracts/test/EchidnaTokenFaucet.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"../token-faucet/TokenFaucet.sol\";\nimport \"./ERC20Mintable.sol\";\n\ncontract EchidnaTokenFaucet {\n\n  TokenFaucet public faucet;\n  ERC20Mintable public asset;\n  ERC20Mintable public measure;\n\n  uint256 totalAssetsDripped;\n  uint256 totalAssetsClaimed;\n\n  constructor() public {\n    asset = new ERC20Mintable(\"Asset Token\", \"ASSET\");\n    measure = new ERC20Mintable(\"Measure Token\", \"MEAS\");\n    faucet = new TokenFaucet();\n    faucet.initialize(asset, measure, 1 ether);\n  }\n\n  function dripAssets(uint256 amount) external {\n    uint256 actualAmount = amount > type(uint256).max / 100000 ? amount / 100000 : amount;\n    totalAssetsDripped += actualAmount;\n    assert(totalAssetsDripped >= actualAmount);\n    asset.mint(address(faucet), actualAmount);\n  }\n\n  function mint(uint256 amount) external {\n    faucet.beforeTokenMint(msg.sender, amount, address(measure), address(0));\n    measure.mint(msg.sender, amount);\n  }\n\n  function transfer(address to, uint256 amount) external {\n    uint256 balance = measure.balanceOf(msg.sender);\n    uint256 actualAmount = amount > balance ? balance : amount;\n    faucet.beforeTokenTransfer(msg.sender, to, actualAmount, address(measure));\n    measure.masterTransfer(msg.sender, to, actualAmount);\n  }\n\n  function burn(uint256 amount) external {\n    uint256 balance = measure.balanceOf(msg.sender);\n    uint256 actualAmount = amount > balance ? balance : amount;\n    faucet.beforeTokenTransfer(msg.sender, address(0), actualAmount, address(measure));\n    measure.burn(msg.sender, actualAmount);\n  }\n\n  function claim() external {\n    uint256 claimed = faucet.claim(msg.sender);\n    totalAssetsClaimed += claimed;\n    assert(totalAssetsClaimed >= claimed);\n  }\n\n  /// @dev Invariant: total unclaimed tokens should never exceed the balance held by the faucet\n  function echidna_total_unclaimed_lte_balance () external view returns (bool) {\n    return faucet.totalUnclaimed() <= asset.balanceOf(address(faucet));\n  }\n\n  /// @dev Invariant: the balance of the faucet plus claimed tokens should always equal the total tokens dripped into the faucet\n  function echidna_total_dripped_eq_claimed_plus_balance () external view returns (bool) {\n    return totalAssetsDripped == (totalAssetsClaimed + asset.balanceOf(address(faucet)));\n  }\n\n}"
      },
      "contracts/test/ERC721Mintable.sol": {
        "content": "pragma solidity 0.6.12;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\";\n\n/**\n * @dev Extension of {ERC721} for Minting/Burning\n */\ncontract ERC721Mintable is ERC721Upgradeable {\n\n    constructor () public {\n        __ERC721_init(\"ERC 721\", \"NFT\");\n    }\n\n    /**\n     * @dev See {ERC721-_mint}.\n     */\n    function mint(address to, uint256 tokenId) public {\n        _mint(to, tokenId);\n    }\n\n    /**\n     * @dev See {ERC721-_burn}.\n     */\n    function burn(uint256 tokenId) public {\n        _burn(tokenId);\n    }\n}\n"
      },
      "contracts/test/MappedSinglyLinkedListExposed.sol": {
        "content": "pragma solidity 0.6.12;\n\nimport \"../utils/MappedSinglyLinkedList.sol\";\n\ncontract MappedSinglyLinkedListExposed {\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\n\n  MappedSinglyLinkedList.Mapping list;\n\n  function initialize() external {\n    list.initialize();\n  }\n\n  function addressArray() external view returns (address[] memory) {\n    return list.addressArray();\n  }\n\n  function addAddresses(address[] calldata addresses) external {\n    list.addAddresses(addresses);\n  }\n\n  function addAddress(address newAddress) external {\n    list.addAddress(newAddress);\n  }\n\n  function removeAddress(address prevAddress, address addr) external {\n    list.removeAddress(prevAddress, addr);\n  }\n\n  function contains(address addr) external view returns (bool) {\n    return list.contains(addr);\n  }\n\n  function clearAll() external {\n    list.clearAll();\n  }\n\n}"
      },
      "contracts/registry/Registry.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity >=0.5.0 <0.7.0;\n\nimport \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\n\nimport \"./RegistryInterface.sol\";\n\n/// @title Interface that allows a user to draw an address using an index\ncontract Registry is OwnableUpgradeable, RegistryInterface {\n  address private pointer;\n\n  event Registered(address indexed pointer);\n\n  constructor () public {\n    __Ownable_init();\n  }\n\n  function register(address _pointer) external onlyOwner {\n    pointer = _pointer;\n\n    emit Registered(pointer);\n  }\n\n  function lookup() external override view returns (address) {\n    return pointer;\n  }\n}\n"
      },
      "contracts/test/MultipleWinnersHarness.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\npragma experimental ABIEncoderV2;\n\nimport \"../prize-strategy/multiple-winners/MultipleWinners.sol\";\n\n/// @title Creates a minimal proxy to the MultipleWinners prize strategy.  Very cheap to deploy.\ncontract MultipleWinnersHarness is MultipleWinners {\n\n  uint256 public currentTime;\n\n  function setCurrentTime(uint256 _currentTime) external {\n    currentTime = _currentTime;\n  }\n\n  function _currentTime() internal override view returns (uint256) {\n    return currentTime;\n  }\n\n  function distribute(uint256 randomNumber) external {\n    _distribute(randomNumber);\n  }\n\n}"
      },
      "contracts/test/MultipleWinnersHarnessProxyFactory.sol": {
        "content": "// SPDX-License-Identifier: GPL-3.0\n\npragma solidity 0.6.12;\n\nimport \"./MultipleWinnersHarness.sol\";\nimport \"../external/openzeppelin/ProxyFactory.sol\";\n\n/// @title Creates a minimal proxy to the MultipleWinners prize strategy.  Very cheap to deploy.\ncontract MultipleWinnersHarnessProxyFactory is ProxyFactory {\n\n  MultipleWinnersHarness public instance;\n\n  constructor () public {\n    instance = new MultipleWinnersHarness();\n  }\n\n  function create() external returns (MultipleWinnersHarness) {\n    return MultipleWinnersHarness(deployMinimal(address(instance), \"\"));\n  }\n\n}"
      },
      "contracts/test/RNGServiceMock.sol": {
        "content": "pragma solidity 0.6.12;\n\nimport \"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\";\n\ncontract RNGServiceMock is RNGInterface {\n\n  uint256 internal random;\n  address internal feeToken;\n  uint256 internal requestFee;\n\n  function getLastRequestId() external override view returns (uint32 requestId) {\n    return 1;\n  }\n\n  function setRequestFee(address _feeToken, uint256 _requestFee) external {\n    feeToken = _feeToken;\n    requestFee = _requestFee;\n  }\n\n  /// @return _feeToken\n  /// @return _requestFee\n  function getRequestFee() external override view returns (address _feeToken, uint256 _requestFee) {\n    return (feeToken, requestFee);\n  }\n\n  function setRandomNumber(uint256 _random) external {\n    random = _random;\n  }\n\n  function requestRandomNumber() external override returns (uint32, uint32) {\n    return (1, 1);\n  }\n\n  function isRequestComplete(uint32) external override view returns (bool) {\n    return true;\n  }\n\n  function randomNumber(uint32) external override returns (uint256) {\n    return random;\n  }\n}"
      },
      "contracts/test/ExtendedSafeCastExposed.sol": {
        "content": "pragma solidity 0.6.12;\n\nimport \"../utils/ExtendedSafeCast.sol\";\n\ncontract ExtendedSafeCastExposed {\n  function toUint112(uint256 value) external pure returns (uint112) {\n    return ExtendedSafeCast.toUint112(value);\n  }\n  function toUint96(uint256 value) external pure returns (uint96) {\n    return ExtendedSafeCast.toUint96(value);\n  }\n}"
      }
    },
    "settings": {
      "optimizer": {
        "enabled": true,
        "runs": 200
      },
      "evmVersion": "istanbul",
      "outputSelection": {
        "*": {
          "*": [
            "abi",
            "evm.bytecode",
            "evm.deployedBytecode",
            "evm.methodIdentifiers",
            "metadata",
            "devdoc",
            "userdoc",
            "storageLayout",
            "evm.gasEstimates"
          ],
          "": [
            "ast"
          ]
        }
      },
      "metadata": {
        "useLiteralContent": true
      }
    }
  },
  "output": {
    "contracts": {
      "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": {
        "OwnableUpgradeable": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "renounceOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "details": "Contract module which provides a basic access control mechanism, where there is an account (an owner) that can be granted exclusive access to specific functions. By default, the owner account will be the one that deploys the contract. This can later be changed with {transferOwnership}. This module is used through inheritance. It will make available the modifier `onlyOwner`, which can be applied to your functions to restrict their use to the owner.",
            "kind": "dev",
            "methods": {
              "owner()": {
                "details": "Returns the address of the current owner."
              },
              "renounceOwnership()": {
                "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
              },
              "transferOwnership(address)": {
                "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "owner()": "8da5cb5b",
              "renounceOwnership()": "715018a6",
              "transferOwnership(address)": "f2fde38b"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Contract module which provides a basic access control mechanism, where there is an account (an owner) that can be granted exclusive access to specific functions. By default, the owner account will be the one that deploys the contract. This can later be changed with {transferOwnership}. This module is used through inheritance. It will make available the modifier `onlyOwner`, which can be applied to your functions to restrict their use to the owner.\",\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":\"OwnableUpgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:OwnableUpgradeable",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:OwnableUpgradeable",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:OwnableUpgradeable",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 10,
                "contract": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:OwnableUpgradeable",
                "label": "_owner",
                "offset": 0,
                "slot": "51",
                "type": "t_address"
              },
              {
                "astId": 129,
                "contract": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol:OwnableUpgradeable",
                "label": "__gap",
                "offset": 0,
                "slot": "52",
                "type": "t_array(t_uint256)49_storage"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol": {
        "ECDSAUpgradeable": {
          "abi": [],
          "devdoc": {
            "details": "Elliptic Curve Digital Signature Algorithm (ECDSA) operations. These functions can be used to verify that a message was signed by the holder of the private keys of a given address.",
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220beb4321e047d0dcf9efb5ae72bcb7d0e6465e5972c450c147d781b7eccce42b564736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBE 0xB4 ORIGIN 0x1E DIV PUSH30 0xDCF9EFB5AE72BCB7D0E6465E5972C450C147D781B7ECCCE42B564736F6C PUSH4 0x4300060C STOP CALLER ",
              "sourceMap": "272:3644:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220beb4321e047d0dcf9efb5ae72bcb7d0e6465e5972c450c147d781b7eccce42b564736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBE 0xB4 ORIGIN 0x1E DIV PUSH30 0xDCF9EFB5AE72BCB7D0E6465E5972C450C147D781B7ECCCE42B564736F6C PUSH4 0x4300060C STOP CALLER ",
              "sourceMap": "272:3644:1:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "recover(bytes32,bytes memory)": "infinite",
                "recover(bytes32,uint8,bytes32,bytes32)": "infinite",
                "toEthSignedMessageHash(bytes32)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Elliptic Curve Digital Signature Algorithm (ECDSA) operations. These functions can be used to verify that a message was signed by the holder of the private keys of a given address.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":\"ECDSAUpgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol": {
        "EIP712Upgradeable": {
          "abi": [],
          "devdoc": {
            "details": "https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in their contracts using a combination of `abi.encode` and `keccak256`. This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA ({_hashTypedDataV4}). The implementation of the domain separator was designed to be as efficient as possible while still properly updating the chain id to protect against replay attacks on an eventual fork of the chain. NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. _Available since v3.4._",
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in their contracts using a combination of `abi.encode` and `keccak256`. This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA ({_hashTypedDataV4}). The implementation of the domain separator was designed to be as efficient as possible while still properly updating the chain id to protect against replay attacks on an eventual fork of the chain. NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. _Available since v3.4._\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":\"EIP712Upgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol:EIP712Upgradeable",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol:EIP712Upgradeable",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 254,
                "contract": "@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol:EIP712Upgradeable",
                "label": "_HASHED_NAME",
                "offset": 0,
                "slot": "1",
                "type": "t_bytes32"
              },
              {
                "astId": 256,
                "contract": "@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol:EIP712Upgradeable",
                "label": "_HASHED_VERSION",
                "offset": 0,
                "slot": "2",
                "type": "t_bytes32"
              },
              {
                "astId": 405,
                "contract": "@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol:EIP712Upgradeable",
                "label": "__gap",
                "offset": 0,
                "slot": "3",
                "type": "t_array(t_uint256)50_storage"
              }
            ],
            "types": {
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_bytes32": {
                "encoding": "inplace",
                "label": "bytes32",
                "numberOfBytes": "32"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol": {
        "ERC20PermitUpgradeable": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Approval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Transfer",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "DOMAIN_SEPARATOR",
              "outputs": [
                {
                  "internalType": "bytes32",
                  "name": "",
                  "type": "bytes32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                }
              ],
              "name": "allowance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "approve",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "decimals",
              "outputs": [
                {
                  "internalType": "uint8",
                  "name": "",
                  "type": "uint8"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "subtractedValue",
                  "type": "uint256"
                }
              ],
              "name": "decreaseAllowance",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "addedValue",
                  "type": "uint256"
                }
              ],
              "name": "increaseAllowance",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "name",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                }
              ],
              "name": "nonces",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "deadline",
                  "type": "uint256"
                },
                {
                  "internalType": "uint8",
                  "name": "v",
                  "type": "uint8"
                },
                {
                  "internalType": "bytes32",
                  "name": "r",
                  "type": "bytes32"
                },
                {
                  "internalType": "bytes32",
                  "name": "s",
                  "type": "bytes32"
                }
              ],
              "name": "permit",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "symbol",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transfer",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "sender",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transferFrom",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "details": "Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't need to send a transaction, and thus is not required to hold Ether at all. _Available since v3.4._",
            "kind": "dev",
            "methods": {
              "DOMAIN_SEPARATOR()": {
                "details": "See {IERC20Permit-DOMAIN_SEPARATOR}."
              },
              "allowance(address,address)": {
                "details": "See {IERC20-allowance}."
              },
              "approve(address,uint256)": {
                "details": "See {IERC20-approve}. Requirements: - `spender` cannot be the zero address."
              },
              "balanceOf(address)": {
                "details": "See {IERC20-balanceOf}."
              },
              "decimals()": {
                "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is called. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."
              },
              "decreaseAllowance(address,uint256)": {
                "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."
              },
              "increaseAllowance(address,uint256)": {
                "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address."
              },
              "name()": {
                "details": "Returns the name of the token."
              },
              "nonces(address)": {
                "details": "See {IERC20Permit-nonces}."
              },
              "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": {
                "details": "See {IERC20Permit-permit}."
              },
              "symbol()": {
                "details": "Returns the symbol of the token, usually a shorter version of the name."
              },
              "totalSupply()": {
                "details": "See {IERC20-totalSupply}."
              },
              "transfer(address,uint256)": {
                "details": "See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`."
              },
              "transferFrom(address,address,uint256)": {
                "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "DOMAIN_SEPARATOR()": "3644e515",
              "allowance(address,address)": "dd62ed3e",
              "approve(address,uint256)": "095ea7b3",
              "balanceOf(address)": "70a08231",
              "decimals()": "313ce567",
              "decreaseAllowance(address,uint256)": "a457c2d7",
              "increaseAllowance(address,uint256)": "39509351",
              "name()": "06fdde03",
              "nonces(address)": "7ecebe00",
              "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": "d505accf",
              "symbol()": "95d89b41",
              "totalSupply()": "18160ddd",
              "transfer(address,uint256)": "a9059cbb",
              "transferFrom(address,address,uint256)": "23b872dd"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't need to send a transaction, and thus is not required to hold Ether at all. _Available since v3.4._\",\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is called. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":\"ERC20PermitUpgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol:ERC20PermitUpgradeable",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol:ERC20PermitUpgradeable",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol:ERC20PermitUpgradeable",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 1372,
                "contract": "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol:ERC20PermitUpgradeable",
                "label": "_balances",
                "offset": 0,
                "slot": "51",
                "type": "t_mapping(t_address,t_uint256)"
              },
              {
                "astId": 1378,
                "contract": "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol:ERC20PermitUpgradeable",
                "label": "_allowances",
                "offset": 0,
                "slot": "52",
                "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
              },
              {
                "astId": 1380,
                "contract": "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol:ERC20PermitUpgradeable",
                "label": "_totalSupply",
                "offset": 0,
                "slot": "53",
                "type": "t_uint256"
              },
              {
                "astId": 1382,
                "contract": "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol:ERC20PermitUpgradeable",
                "label": "_name",
                "offset": 0,
                "slot": "54",
                "type": "t_string_storage"
              },
              {
                "astId": 1384,
                "contract": "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol:ERC20PermitUpgradeable",
                "label": "_symbol",
                "offset": 0,
                "slot": "55",
                "type": "t_string_storage"
              },
              {
                "astId": 1386,
                "contract": "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol:ERC20PermitUpgradeable",
                "label": "_decimals",
                "offset": 0,
                "slot": "56",
                "type": "t_uint8"
              },
              {
                "astId": 1881,
                "contract": "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol:ERC20PermitUpgradeable",
                "label": "__gap",
                "offset": 0,
                "slot": "57",
                "type": "t_array(t_uint256)44_storage"
              },
              {
                "astId": 254,
                "contract": "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol:ERC20PermitUpgradeable",
                "label": "_HASHED_NAME",
                "offset": 0,
                "slot": "101",
                "type": "t_bytes32"
              },
              {
                "astId": 256,
                "contract": "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol:ERC20PermitUpgradeable",
                "label": "_HASHED_VERSION",
                "offset": 0,
                "slot": "102",
                "type": "t_bytes32"
              },
              {
                "astId": 405,
                "contract": "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol:ERC20PermitUpgradeable",
                "label": "__gap",
                "offset": 0,
                "slot": "103",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 430,
                "contract": "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol:ERC20PermitUpgradeable",
                "label": "_nonces",
                "offset": 0,
                "slot": "153",
                "type": "t_mapping(t_address,t_struct(Counter)3637_storage)"
              },
              {
                "astId": 432,
                "contract": "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol:ERC20PermitUpgradeable",
                "label": "_PERMIT_TYPEHASH",
                "offset": 0,
                "slot": "154",
                "type": "t_bytes32"
              },
              {
                "astId": 579,
                "contract": "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol:ERC20PermitUpgradeable",
                "label": "__gap",
                "offset": 0,
                "slot": "155",
                "type": "t_array(t_uint256)49_storage"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_uint256)44_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[44]",
                "numberOfBytes": "1408"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_bytes32": {
                "encoding": "inplace",
                "label": "bytes32",
                "numberOfBytes": "32"
              },
              "t_mapping(t_address,t_mapping(t_address,t_uint256))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => uint256))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_uint256)"
              },
              "t_mapping(t_address,t_struct(Counter)3637_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct CountersUpgradeable.Counter)",
                "numberOfBytes": "32",
                "value": "t_struct(Counter)3637_storage"
              },
              "t_mapping(t_address,t_uint256)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => uint256)",
                "numberOfBytes": "32",
                "value": "t_uint256"
              },
              "t_string_storage": {
                "encoding": "bytes",
                "label": "string",
                "numberOfBytes": "32"
              },
              "t_struct(Counter)3637_storage": {
                "encoding": "inplace",
                "label": "struct CountersUpgradeable.Counter",
                "members": [
                  {
                    "astId": 3636,
                    "contract": "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol:ERC20PermitUpgradeable",
                    "label": "_value",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint256"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint8": {
                "encoding": "inplace",
                "label": "uint8",
                "numberOfBytes": "1"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol": {
        "IERC20PermitUpgradeable": {
          "abi": [
            {
              "inputs": [],
              "name": "DOMAIN_SEPARATOR",
              "outputs": [
                {
                  "internalType": "bytes32",
                  "name": "",
                  "type": "bytes32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                }
              ],
              "name": "nonces",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "deadline",
                  "type": "uint256"
                },
                {
                  "internalType": "uint8",
                  "name": "v",
                  "type": "uint8"
                },
                {
                  "internalType": "bytes32",
                  "name": "r",
                  "type": "bytes32"
                },
                {
                  "internalType": "bytes32",
                  "name": "s",
                  "type": "bytes32"
                }
              ],
              "name": "permit",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "details": "Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't need to send a transaction, and thus is not required to hold Ether at all.",
            "kind": "dev",
            "methods": {
              "DOMAIN_SEPARATOR()": {
                "details": "Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}."
              },
              "nonces(address)": {
                "details": "Returns the current nonce for `owner`. This value must be included whenever a signature is generated for {permit}. Every successful call to {permit} increases ``owner``'s nonce by one. This prevents a signature from being used multiple times."
              },
              "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": {
                "details": "Sets `value` as the allowance of `spender` over `owner`'s tokens, given `owner`'s signed approval. IMPORTANT: The same issues {IERC20-approve} has related to transaction ordering also apply here. Emits an {Approval} event. Requirements: - `spender` cannot be the zero address. - `deadline` must be a timestamp in the future. - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` over the EIP712-formatted function arguments. - the signature must use ``owner``'s current nonce (see {nonces}). For more information on the signature format, see the https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP section]."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "DOMAIN_SEPARATOR()": "3644e515",
              "nonces(address)": "7ecebe00",
              "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": "d505accf"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't need to send a transaction, and thus is not required to hold Ether at all.\",\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\"},\"nonces(address)\":{\"details\":\"Returns the current nonce for `owner`. This value must be included whenever a signature is generated for {permit}. Every successful call to {permit} increases ``owner``'s nonce by one. This prevents a signature from being used multiple times.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Sets `value` as the allowance of `spender` over `owner`'s tokens, given `owner`'s signed approval. IMPORTANT: The same issues {IERC20-approve} has related to transaction ordering also apply here. Emits an {Approval} event. Requirements: - `spender` cannot be the zero address. - `deadline` must be a timestamp in the future. - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` over the EIP712-formatted function arguments. - the signature must use ``owner``'s current nonce (see {nonces}). For more information on the signature format, see the https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP section].\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":\"IERC20PermitUpgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol": {
        "ERC165CheckerUpgradeable": {
          "abi": [],
          "devdoc": {
            "details": "Library used to query support of an interface declared via {IERC165}. Note that these functions return the actual result of the query: they do not `revert` if an interface is not supported. It is up to the caller to decide what to do in these cases.",
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122025b451bc24a387f564102c339a79e7b1e780b257e99853b9d89f843c9af1e2aa64736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x25 0xB4 MLOAD 0xBC 0x24 LOG3 DUP8 CREATE2 PUSH5 0x102C339A79 0xE7 0xB1 0xE7 DUP1 0xB2 JUMPI 0xE9 SWAP9 MSTORE8 0xB9 0xD8 SWAP16 DUP5 EXTCODECOPY SWAP11 CALL 0xE2 0xAA PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "344:5257:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122025b451bc24a387f564102c339a79e7b1e780b257e99853b9d89f843c9af1e2aa64736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x25 0xB4 MLOAD 0xBC 0x24 LOG3 DUP8 CREATE2 PUSH5 0x102C339A79 0xE7 0xB1 0xE7 DUP1 0xB2 JUMPI 0xE9 SWAP9 MSTORE8 0xB9 0xD8 SWAP16 DUP5 EXTCODECOPY SWAP11 CALL 0xE2 0xAA PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "344:5257:5:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "_callERC165SupportsInterface(address,bytes4)": "infinite",
                "_supportsERC165Interface(address,bytes4)": "infinite",
                "getSupportedInterfaces(address,bytes4[] memory)": "infinite",
                "supportsAllInterfaces(address,bytes4[] memory)": "infinite",
                "supportsERC165(address)": "infinite",
                "supportsInterface(address,bytes4)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Library used to query support of an interface declared via {IERC165}. Note that these functions return the actual result of the query: they do not `revert` if an interface is not supported. It is up to the caller to decide what to do in these cases.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":\"ERC165CheckerUpgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/introspection/ERC165Upgradeable.sol": {
        "ERC165Upgradeable": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "bytes4",
                  "name": "interfaceId",
                  "type": "bytes4"
                }
              ],
              "name": "supportsInterface",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "details": "Implementation of the {IERC165} interface. Contracts may inherit from this and call {_registerInterface} to declare their support of an interface.",
            "kind": "dev",
            "methods": {
              "supportsInterface(bytes4)": {
                "details": "See {IERC165-supportsInterface}. Time complexity O(1), guaranteed to always use less than 30 000 gas."
              }
            },
            "stateVariables": {
              "_supportedInterfaces": {
                "details": "Mapping of interface ids to whether or not it's supported."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "supportsInterface(bytes4)": "01ffc9a7"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Implementation of the {IERC165} interface. Contracts may inherit from this and call {_registerInterface} to declare their support of an interface.\",\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}. Time complexity O(1), guaranteed to always use less than 30 000 gas.\"}},\"stateVariables\":{\"_supportedInterfaces\":{\"details\":\"Mapping of interface ids to whether or not it's supported.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/introspection/ERC165Upgradeable.sol\":\"ERC165Upgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/introspection/ERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC165Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts may inherit from this and call {_registerInterface} to declare\\n * their support of an interface.\\n */\\nabstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Mapping of interface ids to whether or not it's supported.\\n     */\\n    mapping(bytes4 => bool) private _supportedInterfaces;\\n\\n    function __ERC165_init() internal initializer {\\n        __ERC165_init_unchained();\\n    }\\n\\n    function __ERC165_init_unchained() internal initializer {\\n        // Derived contracts need only register support for their own interfaces,\\n        // we register support for ERC165 itself here\\n        _registerInterface(_INTERFACE_ID_ERC165);\\n    }\\n\\n    /**\\n     * @dev See {IERC165-supportsInterface}.\\n     *\\n     * Time complexity O(1), guaranteed to always use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n        return _supportedInterfaces[interfaceId];\\n    }\\n\\n    /**\\n     * @dev Registers the contract as an implementer of the interface defined by\\n     * `interfaceId`. Support of the actual ERC165 interface is automatic and\\n     * registering its interface id is not required.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * Requirements:\\n     *\\n     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).\\n     */\\n    function _registerInterface(bytes4 interfaceId) internal virtual {\\n        require(interfaceId != 0xffffffff, \\\"ERC165: invalid interface id\\\");\\n        _supportedInterfaces[interfaceId] = true;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xc6dbbc2f50a7c104377798a37b2acd1a41c1242544b0bb7a9a7c863f0520eb50\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "@openzeppelin/contracts-upgradeable/introspection/ERC165Upgradeable.sol:ERC165Upgradeable",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "@openzeppelin/contracts-upgradeable/introspection/ERC165Upgradeable.sol:ERC165Upgradeable",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 861,
                "contract": "@openzeppelin/contracts-upgradeable/introspection/ERC165Upgradeable.sol:ERC165Upgradeable",
                "label": "_supportedInterfaces",
                "offset": 0,
                "slot": "1",
                "type": "t_mapping(t_bytes4,t_bool)"
              },
              {
                "astId": 918,
                "contract": "@openzeppelin/contracts-upgradeable/introspection/ERC165Upgradeable.sol:ERC165Upgradeable",
                "label": "__gap",
                "offset": 0,
                "slot": "2",
                "type": "t_array(t_uint256)49_storage"
              }
            ],
            "types": {
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_bytes4": {
                "encoding": "inplace",
                "label": "bytes4",
                "numberOfBytes": "4"
              },
              "t_mapping(t_bytes4,t_bool)": {
                "encoding": "mapping",
                "key": "t_bytes4",
                "label": "mapping(bytes4 => bool)",
                "numberOfBytes": "32",
                "value": "t_bool"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol": {
        "IERC165Upgradeable": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "bytes4",
                  "name": "interfaceId",
                  "type": "bytes4"
                }
              ],
              "name": "supportsInterface",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "details": "Interface of the ERC165 standard, as defined in the https://eips.ethereum.org/EIPS/eip-165[EIP]. Implementers can declare support of contract interfaces, which can then be queried by others ({ERC165Checker}). For an implementation, see {ERC165}.",
            "kind": "dev",
            "methods": {
              "supportsInterface(bytes4)": {
                "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "supportsInterface(bytes4)": "01ffc9a7"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of the ERC165 standard, as defined in the https://eips.ethereum.org/EIPS/eip-165[EIP]. Implementers can declare support of contract interfaces, which can then be queried by others ({ERC165Checker}). For an implementation, see {ERC165}.\",\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":\"IERC165Upgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol": {
        "SafeMathUpgradeable": {
          "abi": [],
          "devdoc": {
            "details": "Wrappers over Solidity's arithmetic operations with added overflow checks. Arithmetic operations in Solidity wrap on overflow. This can easily result in bugs, because programmers usually assume that an overflow raises an error, which is the standard behavior in high level programming languages. `SafeMath` restores this intuition by reverting the transaction when an operation overflows. Using this library instead of the unchecked operations eliminates an entire class of bugs, so it's recommended to use it always.",
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220d72686d7f7d9a256a042849883650f295f3a52a4609e42da036675b8cfd921bb64736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD7 0x26 DUP7 0xD7 0xF7 0xD9 LOG2 JUMP LOG0 TIMESTAMP DUP5 SWAP9 DUP4 PUSH6 0xF295F3A52A4 PUSH1 0x9E TIMESTAMP 0xDA SUB PUSH7 0x75B8CFD921BB64 PUSH20 0x6F6C634300060C00330000000000000000000000 ",
              "sourceMap": "630:6605:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220d72686d7f7d9a256a042849883650f295f3a52a4609e42da036675b8cfd921bb64736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD7 0x26 DUP7 0xD7 0xF7 0xD9 LOG2 JUMP LOG0 TIMESTAMP DUP5 SWAP9 DUP4 PUSH6 0xF295F3A52A4 PUSH1 0x9E TIMESTAMP 0xDA SUB PUSH7 0x75B8CFD921BB64 PUSH20 0x6F6C634300060C00330000000000000000000000 ",
              "sourceMap": "630:6605:8:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "add(uint256,uint256)": "infinite",
                "div(uint256,uint256)": "infinite",
                "div(uint256,uint256,string memory)": "infinite",
                "mod(uint256,uint256)": "infinite",
                "mod(uint256,uint256,string memory)": "infinite",
                "mul(uint256,uint256)": "infinite",
                "sub(uint256,uint256)": "infinite",
                "sub(uint256,uint256,string memory)": "infinite",
                "tryAdd(uint256,uint256)": "infinite",
                "tryDiv(uint256,uint256)": "infinite",
                "tryMod(uint256,uint256)": "infinite",
                "tryMul(uint256,uint256)": "infinite",
                "trySub(uint256,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Wrappers over Solidity's arithmetic operations with added overflow checks. Arithmetic operations in Solidity wrap on overflow. This can easily result in bugs, because programmers usually assume that an overflow raises an error, which is the standard behavior in high level programming languages. `SafeMath` restores this intuition by reverting the transaction when an operation overflows. Using this library instead of the unchecked operations eliminates an entire class of bugs, so it's recommended to use it always.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":\"SafeMathUpgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol": {
        "Initializable": {
          "abi": [],
          "devdoc": {
            "details": "This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}. CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.",
            "kind": "dev",
            "methods": {},
            "stateVariables": {
              "_initialized": {
                "details": "Indicates that the contract has been initialized."
              },
              "_initializing": {
                "details": "Indicates that the contract is in the process of being initialized."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}. CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\",\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"_initialized\":{\"details\":\"Indicates that the contract has been initialized.\"},\"_initializing\":{\"details\":\"Indicates that the contract is in the process of being initialized.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":\"Initializable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:Initializable",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:Initializable",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              }
            ],
            "types": {
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol": {
        "ERC20Upgradeable": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Approval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Transfer",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                }
              ],
              "name": "allowance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "approve",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "decimals",
              "outputs": [
                {
                  "internalType": "uint8",
                  "name": "",
                  "type": "uint8"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "subtractedValue",
                  "type": "uint256"
                }
              ],
              "name": "decreaseAllowance",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "addedValue",
                  "type": "uint256"
                }
              ],
              "name": "increaseAllowance",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "name",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "symbol",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transfer",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "sender",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transferFrom",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "details": "Implementation of the {IERC20} interface. This implementation is agnostic to the way tokens are created. This means that a supply mechanism has to be added in a derived contract using {_mint}. For a generic mechanism see {ERC20PresetMinterPauser}. TIP: For a detailed writeup see our guide https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How to implement supply mechanisms]. We have followed general OpenZeppelin guidelines: functions revert instead of returning `false` on failure. This behavior is nonetheless conventional and does not conflict with the expectations of ERC20 applications. Additionally, an {Approval} event is emitted on calls to {transferFrom}. This allows applications to reconstruct the allowance for all accounts just by listening to said events. Other implementations of the EIP may not emit these events, as it isn't required by the specification. Finally, the non-standard {decreaseAllowance} and {increaseAllowance} functions have been added to mitigate the well-known issues around setting allowances. See {IERC20-approve}.",
            "kind": "dev",
            "methods": {
              "allowance(address,address)": {
                "details": "See {IERC20-allowance}."
              },
              "approve(address,uint256)": {
                "details": "See {IERC20-approve}. Requirements: - `spender` cannot be the zero address."
              },
              "balanceOf(address)": {
                "details": "See {IERC20-balanceOf}."
              },
              "decimals()": {
                "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is called. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."
              },
              "decreaseAllowance(address,uint256)": {
                "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."
              },
              "increaseAllowance(address,uint256)": {
                "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address."
              },
              "name()": {
                "details": "Returns the name of the token."
              },
              "symbol()": {
                "details": "Returns the symbol of the token, usually a shorter version of the name."
              },
              "totalSupply()": {
                "details": "See {IERC20-totalSupply}."
              },
              "transfer(address,uint256)": {
                "details": "See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`."
              },
              "transferFrom(address,address,uint256)": {
                "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506109f4806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c8063395093511161007157806339509351146101d957806370a082311461020557806395d89b411461022b578063a457c2d714610233578063a9059cbb1461025f578063dd62ed3e1461028b576100a9565b806306fdde03146100ae578063095ea7b31461012b57806318160ddd1461016b57806323b872dd14610185578063313ce567146101bb575b600080fd5b6100b66102b9565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100f05781810151838201526020016100d8565b50505050905090810190601f16801561011d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101576004803603604081101561014157600080fd5b506001600160a01b03813516906020013561034f565b604080519115158252519081900360200190f35b61017361036c565b60408051918252519081900360200190f35b6101576004803603606081101561019b57600080fd5b506001600160a01b03813581169160208101359091169060400135610372565b6101c36103f9565b6040805160ff9092168252519081900360200190f35b610157600480360360408110156101ef57600080fd5b506001600160a01b038135169060200135610402565b6101736004803603602081101561021b57600080fd5b50356001600160a01b0316610450565b6100b661046b565b6101576004803603604081101561024957600080fd5b506001600160a01b0381351690602001356104cc565b6101576004803603604081101561027557600080fd5b506001600160a01b038135169060200135610534565b610173600480360360408110156102a157600080fd5b506001600160a01b0381358116916020013516610548565b60368054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156103455780601f1061031a57610100808354040283529160200191610345565b820191906000526020600020905b81548152906001019060200180831161032857829003601f168201915b5050505050905090565b600061036361035c610573565b8484610577565b50600192915050565b60355490565b600061037f848484610663565b6103ef8461038b610573565b6103ea85604051806060016040528060288152602001610929602891396001600160a01b038a166000908152603460205260408120906103c9610573565b6001600160a01b0316815260208101919091526040016000205491906107c0565b610577565b5060019392505050565b60385460ff1690565b600061036361040f610573565b846103ea8560346000610420610573565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490610857565b6001600160a01b031660009081526033602052604090205490565b60378054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156103455780601f1061031a57610100808354040283529160200191610345565b60006103636104d9610573565b846103ea8560405180606001604052806025815260200161099a6025913960346000610503610573565b6001600160a01b03908116825260208083019390935260409182016000908120918d168152925290205491906107c0565b6000610363610541610573565b8484610663565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b3390565b6001600160a01b0383166105bc5760405162461bcd60e51b81526004018080602001828103825260248152602001806109766024913960400191505060405180910390fd5b6001600160a01b0382166106015760405162461bcd60e51b81526004018080602001828103825260228152602001806108e16022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166106a85760405162461bcd60e51b81526004018080602001828103825260258152602001806109516025913960400191505060405180910390fd5b6001600160a01b0382166106ed5760405162461bcd60e51b81526004018080602001828103825260238152602001806108be6023913960400191505060405180910390fd5b6106f88383836108b8565b61073581604051806060016040528060268152602001610903602691396001600160a01b03861660009081526033602052604090205491906107c0565b6001600160a01b0380851660009081526033602052604080822093909355908416815220546107649082610857565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561084f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156108145781810151838201526020016107fc565b50505050905090810190601f1680156108415780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156108b1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208f3cfee89fb4884051ebc81791791d5d4a42d23d110ad100defad06c3a8a94a164736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9F4 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA9 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x39509351 GT PUSH2 0x71 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x1D9 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x205 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x22B JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x233 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x25F JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x28B JUMPI PUSH2 0xA9 JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xAE JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x12B JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x16B JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x185 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1BB JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB6 PUSH2 0x2B9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF0 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD8 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x11D JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x157 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x141 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x34F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x173 PUSH2 0x36C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x157 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x19B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x372 JUMP JUMPDEST PUSH2 0x1C3 PUSH2 0x3F9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x157 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x402 JUMP JUMPDEST PUSH2 0x173 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x21B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x450 JUMP JUMPDEST PUSH2 0xB6 PUSH2 0x46B JUMP JUMPDEST PUSH2 0x157 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x249 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x4CC JUMP JUMPDEST PUSH2 0x157 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x275 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x534 JUMP JUMPDEST PUSH2 0x173 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x2A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x548 JUMP JUMPDEST PUSH1 0x36 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x345 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x31A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x345 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x328 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x363 PUSH2 0x35C PUSH2 0x573 JUMP JUMPDEST DUP5 DUP5 PUSH2 0x577 JUMP JUMPDEST POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x35 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x37F DUP5 DUP5 DUP5 PUSH2 0x663 JUMP JUMPDEST PUSH2 0x3EF DUP5 PUSH2 0x38B PUSH2 0x573 JUMP JUMPDEST PUSH2 0x3EA DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x929 PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP1 PUSH2 0x3C9 PUSH2 0x573 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x7C0 JUMP JUMPDEST PUSH2 0x577 JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x38 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x363 PUSH2 0x40F PUSH2 0x573 JUMP JUMPDEST DUP5 PUSH2 0x3EA DUP6 PUSH1 0x34 PUSH1 0x0 PUSH2 0x420 PUSH2 0x573 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP13 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP1 PUSH2 0x857 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x37 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x345 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x31A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x345 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x363 PUSH2 0x4D9 PUSH2 0x573 JUMP JUMPDEST DUP5 PUSH2 0x3EA DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x99A PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x34 PUSH1 0x0 PUSH2 0x503 PUSH2 0x573 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP14 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x7C0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x363 PUSH2 0x541 PUSH2 0x573 JUMP JUMPDEST DUP5 DUP5 PUSH2 0x663 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x5BC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x976 PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x601 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x8E1 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE DUP2 MLOAD DUP6 DUP2 MSTORE SWAP2 MLOAD PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x6A8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x951 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x6ED JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x8BE PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x6F8 DUP4 DUP4 DUP4 PUSH2 0x8B8 JUMP JUMPDEST PUSH2 0x735 DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x903 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x7C0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP5 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x764 SWAP1 DUP3 PUSH2 0x857 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 SWAP3 DUP8 AND SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP5 DUP5 GT ISZERO PUSH2 0x84F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x814 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x7FC JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x841 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x8B1 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST POP POP POP JUMP INVALID GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220746F20746865207A65726F2061 PUSH5 0x6472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F766520746F20746865207A65726F20616464 PUSH19 0x65737345524332303A207472616E7366657220 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545524332 ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220616D6F756E7420657863656564 PUSH20 0x20616C6C6F77616E636545524332303A20747261 PUSH15 0x736665722066726F6D20746865207A PUSH6 0x726F20616464 PUSH19 0x65737345524332303A20617070726F76652066 PUSH19 0x6F6D20746865207A65726F2061646472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH5 0x6563726561 PUSH20 0x656420616C6C6F77616E63652062656C6F77207A PUSH6 0x726FA2646970 PUSH7 0x73582212208F3C INVALID 0xE8 SWAP16 0xB4 DUP9 BLOCKHASH MLOAD 0xEB 0xC8 OR SWAP2 PUSH26 0x1D5D4A42D23D110AD100DEFAD06C3A8A94A164736F6C63430006 0xC STOP CALLER ",
              "sourceMap": "1394:9781:10:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106100a95760003560e01c8063395093511161007157806339509351146101d957806370a082311461020557806395d89b411461022b578063a457c2d714610233578063a9059cbb1461025f578063dd62ed3e1461028b576100a9565b806306fdde03146100ae578063095ea7b31461012b57806318160ddd1461016b57806323b872dd14610185578063313ce567146101bb575b600080fd5b6100b66102b9565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100f05781810151838201526020016100d8565b50505050905090810190601f16801561011d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101576004803603604081101561014157600080fd5b506001600160a01b03813516906020013561034f565b604080519115158252519081900360200190f35b61017361036c565b60408051918252519081900360200190f35b6101576004803603606081101561019b57600080fd5b506001600160a01b03813581169160208101359091169060400135610372565b6101c36103f9565b6040805160ff9092168252519081900360200190f35b610157600480360360408110156101ef57600080fd5b506001600160a01b038135169060200135610402565b6101736004803603602081101561021b57600080fd5b50356001600160a01b0316610450565b6100b661046b565b6101576004803603604081101561024957600080fd5b506001600160a01b0381351690602001356104cc565b6101576004803603604081101561027557600080fd5b506001600160a01b038135169060200135610534565b610173600480360360408110156102a157600080fd5b506001600160a01b0381358116916020013516610548565b60368054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156103455780601f1061031a57610100808354040283529160200191610345565b820191906000526020600020905b81548152906001019060200180831161032857829003601f168201915b5050505050905090565b600061036361035c610573565b8484610577565b50600192915050565b60355490565b600061037f848484610663565b6103ef8461038b610573565b6103ea85604051806060016040528060288152602001610929602891396001600160a01b038a166000908152603460205260408120906103c9610573565b6001600160a01b0316815260208101919091526040016000205491906107c0565b610577565b5060019392505050565b60385460ff1690565b600061036361040f610573565b846103ea8560346000610420610573565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490610857565b6001600160a01b031660009081526033602052604090205490565b60378054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156103455780601f1061031a57610100808354040283529160200191610345565b60006103636104d9610573565b846103ea8560405180606001604052806025815260200161099a6025913960346000610503610573565b6001600160a01b03908116825260208083019390935260409182016000908120918d168152925290205491906107c0565b6000610363610541610573565b8484610663565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b3390565b6001600160a01b0383166105bc5760405162461bcd60e51b81526004018080602001828103825260248152602001806109766024913960400191505060405180910390fd5b6001600160a01b0382166106015760405162461bcd60e51b81526004018080602001828103825260228152602001806108e16022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166106a85760405162461bcd60e51b81526004018080602001828103825260258152602001806109516025913960400191505060405180910390fd5b6001600160a01b0382166106ed5760405162461bcd60e51b81526004018080602001828103825260238152602001806108be6023913960400191505060405180910390fd5b6106f88383836108b8565b61073581604051806060016040528060268152602001610903602691396001600160a01b03861660009081526033602052604090205491906107c0565b6001600160a01b0380851660009081526033602052604080822093909355908416815220546107649082610857565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561084f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156108145781810151838201526020016107fc565b50505050905090810190601f1680156108415780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156108b1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208f3cfee89fb4884051ebc81791791d5d4a42d23d110ad100defad06c3a8a94a164736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA9 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x39509351 GT PUSH2 0x71 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x1D9 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x205 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x22B JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x233 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x25F JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x28B JUMPI PUSH2 0xA9 JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xAE JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x12B JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x16B JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x185 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1BB JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB6 PUSH2 0x2B9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF0 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD8 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x11D JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x157 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x141 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x34F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x173 PUSH2 0x36C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x157 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x19B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x372 JUMP JUMPDEST PUSH2 0x1C3 PUSH2 0x3F9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x157 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x402 JUMP JUMPDEST PUSH2 0x173 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x21B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x450 JUMP JUMPDEST PUSH2 0xB6 PUSH2 0x46B JUMP JUMPDEST PUSH2 0x157 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x249 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x4CC JUMP JUMPDEST PUSH2 0x157 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x275 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x534 JUMP JUMPDEST PUSH2 0x173 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x2A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x548 JUMP JUMPDEST PUSH1 0x36 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x345 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x31A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x345 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x328 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x363 PUSH2 0x35C PUSH2 0x573 JUMP JUMPDEST DUP5 DUP5 PUSH2 0x577 JUMP JUMPDEST POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x35 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x37F DUP5 DUP5 DUP5 PUSH2 0x663 JUMP JUMPDEST PUSH2 0x3EF DUP5 PUSH2 0x38B PUSH2 0x573 JUMP JUMPDEST PUSH2 0x3EA DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x929 PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP1 PUSH2 0x3C9 PUSH2 0x573 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x7C0 JUMP JUMPDEST PUSH2 0x577 JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x38 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x363 PUSH2 0x40F PUSH2 0x573 JUMP JUMPDEST DUP5 PUSH2 0x3EA DUP6 PUSH1 0x34 PUSH1 0x0 PUSH2 0x420 PUSH2 0x573 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP13 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP1 PUSH2 0x857 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x37 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x345 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x31A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x345 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x363 PUSH2 0x4D9 PUSH2 0x573 JUMP JUMPDEST DUP5 PUSH2 0x3EA DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x99A PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x34 PUSH1 0x0 PUSH2 0x503 PUSH2 0x573 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP14 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x7C0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x363 PUSH2 0x541 PUSH2 0x573 JUMP JUMPDEST DUP5 DUP5 PUSH2 0x663 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x5BC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x976 PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x601 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x8E1 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE DUP2 MLOAD DUP6 DUP2 MSTORE SWAP2 MLOAD PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x6A8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x951 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x6ED JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x8BE PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x6F8 DUP4 DUP4 DUP4 PUSH2 0x8B8 JUMP JUMPDEST PUSH2 0x735 DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x903 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x7C0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP5 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x764 SWAP1 DUP3 PUSH2 0x857 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 SWAP3 DUP8 AND SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP5 DUP5 GT ISZERO PUSH2 0x84F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x814 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x7FC JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x841 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x8B1 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST POP POP POP JUMP INVALID GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220746F20746865207A65726F2061 PUSH5 0x6472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F766520746F20746865207A65726F20616464 PUSH19 0x65737345524332303A207472616E7366657220 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545524332 ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220616D6F756E7420657863656564 PUSH20 0x20616C6C6F77616E636545524332303A20747261 PUSH15 0x736665722066726F6D20746865207A PUSH6 0x726F20616464 PUSH19 0x65737345524332303A20617070726F76652066 PUSH19 0x6F6D20746865207A65726F2061646472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH5 0x6563726561 PUSH20 0x656420616C6C6F77616E63652062656C6F77207A PUSH6 0x726FA2646970 PUSH7 0x73582212208F3C INVALID 0xE8 SWAP16 0xB4 DUP9 BLOCKHASH MLOAD 0xEB 0xC8 OR SWAP2 PUSH26 0x1D5D4A42D23D110AD100DEFAD06C3A8A94A164736F6C63430006 0xC STOP CALLER ",
              "sourceMap": "1394:9781:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2517:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4593:166;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4593:166:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;3584:106;;;:::i;:::-;;;;;;;;;;;;;;;;5226:317;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5226:317:10;;;;;;;;;;;;;;;;;:::i;3435:89::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5938:215;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5938:215:10;;;;;;;;:::i;3748:125::-;;;;;;;;;;;;;;;;-1:-1:-1;3748:125:10;-1:-1:-1;;;;;3748:125:10;;:::i;2719:93::-;;;:::i;6640:266::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;6640:266:10;;;;;;;;:::i;4076:172::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4076:172:10;;;;;;;;:::i;4306:149::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4306:149:10;;;;;;;;;;:::i;2517:89::-;2594:5;2587:12;;;;;;;;-1:-1:-1;;2587:12:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2562:13;;2587:12;;2594:5;;2587:12;;2594:5;2587:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2517:89;:::o;4593:166::-;4676:4;4692:39;4701:12;:10;:12::i;:::-;4715:7;4724:6;4692:8;:39::i;:::-;-1:-1:-1;4748:4:10;4593:166;;;;:::o;3584:106::-;3671:12;;3584:106;:::o;5226:317::-;5332:4;5348:36;5358:6;5366:9;5377:6;5348:9;:36::i;:::-;5394:121;5403:6;5411:12;:10;:12::i;:::-;5425:89;5463:6;5425:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5425:19:10;;;;;;:11;:19;;;;;;5445:12;:10;:12::i;:::-;-1:-1:-1;;;;;5425:33:10;;;;;;;;;;;;-1:-1:-1;5425:33:10;;;:89;:37;:89::i;:::-;5394:8;:121::i;:::-;-1:-1:-1;5532:4:10;5226:317;;;;;:::o;3435:89::-;3508:9;;;;3435:89;:::o;5938:215::-;6026:4;6042:83;6051:12;:10;:12::i;:::-;6065:7;6074:50;6113:10;6074:11;:25;6086:12;:10;:12::i;:::-;-1:-1:-1;;;;;6074:25:10;;;;;;;;;;;;;;;;;-1:-1:-1;6074:25:10;;;:34;;;;;;;;;;;:38;:50::i;3748:125::-;-1:-1:-1;;;;;3848:18:10;3822:7;3848:18;;;:9;:18;;;;;;;3748:125::o;2719:93::-;2798:7;2791:14;;;;;;;;-1:-1:-1;;2791:14:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2766:13;;2791:14;;2798:7;;2791:14;;2798:7;2791:14;;;;;;;;;;;;;;;;;;;;;;;;6640:266;6733:4;6749:129;6758:12;:10;:12::i;:::-;6772:7;6781:96;6820:15;6781:96;;;;;;;;;;;;;;;;;:11;:25;6793:12;:10;:12::i;:::-;-1:-1:-1;;;;;6781:25:10;;;;;;;;;;;;;;;;;-1:-1:-1;6781:25:10;;;:34;;;;;;;;;;;:96;:38;:96::i;4076:172::-;4162:4;4178:42;4188:12;:10;:12::i;:::-;4202:9;4213:6;4178:9;:42::i;4306:149::-;-1:-1:-1;;;;;4421:18:10;;;4395:7;4421:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4306:149::o;828:104:19:-;915:10;828:104;:::o;9704:340:10:-;-1:-1:-1;;;;;9805:19:10;;9797:68;;;;-1:-1:-1;;;9797:68:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9883:21:10;;9875:68;;;;-1:-1:-1;;;9875:68:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9954:18:10;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10005:32;;;;;;;;;;;;;;;;;9704:340;;;:::o;7380:530::-;-1:-1:-1;;;;;7485:20:10;;7477:70;;;;-1:-1:-1;;;7477:70:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7565:23:10;;7557:71;;;;-1:-1:-1;;;7557:71:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7639:47;7660:6;7668:9;7679:6;7639:20;:47::i;:::-;7717:71;7739:6;7717:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7717:17:10;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;7697:17:10;;;;;;;:9;:17;;;;;;:91;;;;7821:20;;;;;;;:32;;7846:6;7821:24;:32::i;:::-;-1:-1:-1;;;;;7798:20:10;;;;;;;:9;:20;;;;;;;;;:55;;;;7868:35;;;;;;;7798:20;;7868:35;;;;;;;;;;;;;7380:530;;;:::o;5443:163:8:-;5529:7;5564:12;5556:6;;;;5548:29;;;;-1:-1:-1;;;5548:29:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5594:5:8;;;5443:163::o;2701:175::-;2759:7;2790:5;;;2813:6;;;;2805:46;;;;;-1:-1:-1;;;2805:46:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;2868:1;2701:175;-1:-1:-1;;;2701:175:8:o;11050:92:10:-;;;;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "509600",
                "executionCost": "543",
                "totalCost": "510143"
              },
              "external": {
                "allowance(address,address)": "1360",
                "approve(address,uint256)": "infinite",
                "balanceOf(address)": "1164",
                "decimals()": "1102",
                "decreaseAllowance(address,uint256)": "infinite",
                "increaseAllowance(address,uint256)": "infinite",
                "name()": "infinite",
                "symbol()": "infinite",
                "totalSupply()": "1043",
                "transfer(address,uint256)": "infinite",
                "transferFrom(address,address,uint256)": "infinite"
              },
              "internal": {
                "__ERC20_init(string memory,string memory)": "infinite",
                "__ERC20_init_unchained(string memory,string memory)": "infinite",
                "_approve(address,address,uint256)": "infinite",
                "_beforeTokenTransfer(address,address,uint256)": "15",
                "_burn(address,uint256)": "infinite",
                "_mint(address,uint256)": "infinite",
                "_setupDecimals(uint8)": "infinite",
                "_transfer(address,address,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {
              "allowance(address,address)": "dd62ed3e",
              "approve(address,uint256)": "095ea7b3",
              "balanceOf(address)": "70a08231",
              "decimals()": "313ce567",
              "decreaseAllowance(address,uint256)": "a457c2d7",
              "increaseAllowance(address,uint256)": "39509351",
              "name()": "06fdde03",
              "symbol()": "95d89b41",
              "totalSupply()": "18160ddd",
              "transfer(address,uint256)": "a9059cbb",
              "transferFrom(address,address,uint256)": "23b872dd"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Implementation of the {IERC20} interface. This implementation is agnostic to the way tokens are created. This means that a supply mechanism has to be added in a derived contract using {_mint}. For a generic mechanism see {ERC20PresetMinterPauser}. TIP: For a detailed writeup see our guide https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How to implement supply mechanisms]. We have followed general OpenZeppelin guidelines: functions revert instead of returning `false` on failure. This behavior is nonetheless conventional and does not conflict with the expectations of ERC20 applications. Additionally, an {Approval} event is emitted on calls to {transferFrom}. This allows applications to reconstruct the allowance for all accounts just by listening to said events. Other implementations of the EIP may not emit these events, as it isn't required by the specification. Finally, the non-standard {decreaseAllowance} and {increaseAllowance} functions have been added to mitigate the well-known issues around setting allowances. See {IERC20-approve}.\",\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is called. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":\"ERC20Upgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:ERC20Upgradeable",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:ERC20Upgradeable",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:ERC20Upgradeable",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 1372,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:ERC20Upgradeable",
                "label": "_balances",
                "offset": 0,
                "slot": "51",
                "type": "t_mapping(t_address,t_uint256)"
              },
              {
                "astId": 1378,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:ERC20Upgradeable",
                "label": "_allowances",
                "offset": 0,
                "slot": "52",
                "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
              },
              {
                "astId": 1380,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:ERC20Upgradeable",
                "label": "_totalSupply",
                "offset": 0,
                "slot": "53",
                "type": "t_uint256"
              },
              {
                "astId": 1382,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:ERC20Upgradeable",
                "label": "_name",
                "offset": 0,
                "slot": "54",
                "type": "t_string_storage"
              },
              {
                "astId": 1384,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:ERC20Upgradeable",
                "label": "_symbol",
                "offset": 0,
                "slot": "55",
                "type": "t_string_storage"
              },
              {
                "astId": 1386,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:ERC20Upgradeable",
                "label": "_decimals",
                "offset": 0,
                "slot": "56",
                "type": "t_uint8"
              },
              {
                "astId": 1881,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:ERC20Upgradeable",
                "label": "__gap",
                "offset": 0,
                "slot": "57",
                "type": "t_array(t_uint256)44_storage"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_uint256)44_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[44]",
                "numberOfBytes": "1408"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_mapping(t_address,t_mapping(t_address,t_uint256))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => uint256))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_uint256)"
              },
              "t_mapping(t_address,t_uint256)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => uint256)",
                "numberOfBytes": "32",
                "value": "t_uint256"
              },
              "t_string_storage": {
                "encoding": "bytes",
                "label": "string",
                "numberOfBytes": "32"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint8": {
                "encoding": "inplace",
                "label": "uint8",
                "numberOfBytes": "1"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol": {
        "IERC20Upgradeable": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Approval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Transfer",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                }
              ],
              "name": "allowance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "approve",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transfer",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "sender",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transferFrom",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "details": "Interface of the ERC20 standard as defined in the EIP.",
            "events": {
              "Approval(address,address,uint256)": {
                "details": "Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance."
              },
              "Transfer(address,address,uint256)": {
                "details": "Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero."
              }
            },
            "kind": "dev",
            "methods": {
              "allowance(address,address)": {
                "details": "Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."
              },
              "approve(address,uint256)": {
                "details": "Sets `amount` as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event."
              },
              "balanceOf(address)": {
                "details": "Returns the amount of tokens owned by `account`."
              },
              "totalSupply()": {
                "details": "Returns the amount of tokens in existence."
              },
              "transfer(address,uint256)": {
                "details": "Moves `amount` tokens from the caller's account to `recipient`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."
              },
              "transferFrom(address,address,uint256)": {
                "details": "Moves `amount` tokens from `sender` to `recipient` using the allowance mechanism. `amount` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "allowance(address,address)": "dd62ed3e",
              "approve(address,uint256)": "095ea7b3",
              "balanceOf(address)": "70a08231",
              "totalSupply()": "18160ddd",
              "transfer(address,uint256)": "a9059cbb",
              "transferFrom(address,address,uint256)": "23b872dd"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface of the ERC20 standard as defined in the EIP.\",\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.\"},\"approve(address,uint256)\":{\"details\":\"Sets `amount` as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the amount of tokens owned by `account`.\"},\"totalSupply()\":{\"details\":\"Returns the amount of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves `amount` tokens from the caller's account to `recipient`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Moves `amount` tokens from `sender` to `recipient` using the allowance mechanism. `amount` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":\"IERC20Upgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol": {
        "SafeERC20Upgradeable": {
          "abi": [],
          "devdoc": {
            "details": "Wrappers around ERC20 operations that throw on failure (when the token contract returns false). Tokens that return no value (and instead revert or throw on failure) are also supported, non-reverting calls are assumed to be successful. To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, which allows you to call the safe operations as `token.safeTransfer(...)`, etc.",
            "kind": "dev",
            "methods": {},
            "title": "SafeERC20",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212205dc92c5aac72d610b63e4d23fd4d6dba91b240caec06c4b796e1d2213471657664736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x5D 0xC9 0x2C GAS 0xAC PUSH19 0xD610B63E4D23FD4D6DBA91B240CAEC06C4B796 0xE1 0xD2 0x21 CALLVALUE PUSH18 0x657664736F6C634300060C00330000000000 ",
              "sourceMap": "649:3203:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212205dc92c5aac72d610b63e4d23fd4d6dba91b240caec06c4b796e1d2213471657664736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x5D 0xC9 0x2C GAS 0xAC PUSH19 0xD610B63E4D23FD4D6DBA91B240CAEC06C4B796 0xE1 0xD2 0x21 CALLVALUE PUSH18 0x657664736F6C634300060C00330000000000 ",
              "sourceMap": "649:3203:12:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "_callOptionalReturn(contract IERC20Upgradeable,bytes memory)": "infinite",
                "safeApprove(contract IERC20Upgradeable,address,uint256)": "infinite",
                "safeDecreaseAllowance(contract IERC20Upgradeable,address,uint256)": "infinite",
                "safeIncreaseAllowance(contract IERC20Upgradeable,address,uint256)": "infinite",
                "safeTransfer(contract IERC20Upgradeable,address,uint256)": "infinite",
                "safeTransferFrom(contract IERC20Upgradeable,address,address,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Wrappers around ERC20 operations that throw on failure (when the token contract returns false). Tokens that return no value (and instead revert or throw on failure) are also supported, non-reverting calls are assumed to be successful. To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"SafeERC20\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":\"SafeERC20Upgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol": {
        "ERC721Upgradeable": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "approved",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "Approval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                }
              ],
              "name": "ApprovalForAll",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "Transfer",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "approve",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "baseURI",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "getApproved",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                }
              ],
              "name": "isApprovedForAll",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "name",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "ownerOf",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "safeTransferFrom",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes",
                  "name": "_data",
                  "type": "bytes"
                }
              ],
              "name": "safeTransferFrom",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                }
              ],
              "name": "setApprovalForAll",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes4",
                  "name": "interfaceId",
                  "type": "bytes4"
                }
              ],
              "name": "supportsInterface",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "symbol",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "index",
                  "type": "uint256"
                }
              ],
              "name": "tokenByIndex",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "index",
                  "type": "uint256"
                }
              ],
              "name": "tokenOfOwnerByIndex",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "tokenURI",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "transferFrom",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "details": "see https://eips.ethereum.org/EIPS/eip-721",
            "kind": "dev",
            "methods": {
              "approve(address,uint256)": {
                "details": "See {IERC721-approve}."
              },
              "balanceOf(address)": {
                "details": "See {IERC721-balanceOf}."
              },
              "baseURI()": {
                "details": "Returns the base URI set via {_setBaseURI}. This will be automatically added as a prefix in {tokenURI} to each token's URI, or to the token ID if no specific URI is set for that token ID."
              },
              "getApproved(uint256)": {
                "details": "See {IERC721-getApproved}."
              },
              "isApprovedForAll(address,address)": {
                "details": "See {IERC721-isApprovedForAll}."
              },
              "name()": {
                "details": "See {IERC721Metadata-name}."
              },
              "ownerOf(uint256)": {
                "details": "See {IERC721-ownerOf}."
              },
              "safeTransferFrom(address,address,uint256)": {
                "details": "See {IERC721-safeTransferFrom}."
              },
              "safeTransferFrom(address,address,uint256,bytes)": {
                "details": "See {IERC721-safeTransferFrom}."
              },
              "setApprovalForAll(address,bool)": {
                "details": "See {IERC721-setApprovalForAll}."
              },
              "supportsInterface(bytes4)": {
                "details": "See {IERC165-supportsInterface}. Time complexity O(1), guaranteed to always use less than 30 000 gas."
              },
              "symbol()": {
                "details": "See {IERC721Metadata-symbol}."
              },
              "tokenByIndex(uint256)": {
                "details": "See {IERC721Enumerable-tokenByIndex}."
              },
              "tokenOfOwnerByIndex(address,uint256)": {
                "details": "See {IERC721Enumerable-tokenOfOwnerByIndex}."
              },
              "tokenURI(uint256)": {
                "details": "See {IERC721Metadata-tokenURI}."
              },
              "totalSupply()": {
                "details": "See {IERC721Enumerable-totalSupply}."
              },
              "transferFrom(address,address,uint256)": {
                "details": "See {IERC721-transferFrom}."
              }
            },
            "title": "ERC721 Non-Fungible Token Standard basic implementation",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50611993806100206000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80634f6ccce7116100a257806395d89b411161007157806395d89b4114610349578063a22cb46514610351578063b88d4fde1461037f578063c87b56dd14610445578063e985e9c5146104625761010b565b80634f6ccce7146102e15780636352211e146102fe5780636c0360eb1461031b57806370a08231146103235761010b565b806318160ddd116100de57806318160ddd1461022f57806323b872dd146102495780632f745c591461027f57806342842e0e146102ab5761010b565b806301ffc9a71461011057806306fdde031461014b578063081812fc146101c8578063095ea7b314610201575b600080fd5b6101376004803603602081101561012657600080fd5b50356001600160e01b031916610490565b604080519115158252519081900360200190f35b6101536104b3565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561018d578181015183820152602001610175565b50505050905090810190601f1680156101ba5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101e5600480360360208110156101de57600080fd5b5035610549565b604080516001600160a01b039092168252519081900360200190f35b61022d6004803603604081101561021757600080fd5b506001600160a01b0381351690602001356105ab565b005b610237610686565b60408051918252519081900360200190f35b61022d6004803603606081101561025f57600080fd5b506001600160a01b03813581169160208101359091169060400135610697565b6102376004803603604081101561029557600080fd5b506001600160a01b0381351690602001356106ee565b61022d600480360360608110156102c157600080fd5b506001600160a01b03813581169160208101359091169060400135610719565b610237600480360360208110156102f757600080fd5b5035610734565b6101e56004803603602081101561031457600080fd5b503561074a565b610153610772565b6102376004803603602081101561033957600080fd5b50356001600160a01b03166107d3565b61015361083b565b61022d6004803603604081101561036757600080fd5b506001600160a01b038135169060200135151561089c565b61022d6004803603608081101561039557600080fd5b6001600160a01b038235811692602081013590911691604082013591908101906080810160608201356401000000008111156103d057600080fd5b8201836020820111156103e257600080fd5b8035906020019184600183028401116401000000008311171561040457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506109a1945050505050565b6101536004803603602081101561045b57600080fd5b50356109ff565b6101376004803603604081101561047857600080fd5b506001600160a01b0381358116916020013516610c82565b6001600160e01b0319811660009081526033602052604090205460ff165b919050565b606a8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561053f5780601f106105145761010080835404028352916020019161053f565b820191906000526020600020905b81548152906001019060200180831161052257829003601f168201915b5050505050905090565b600061055482610cb0565b61058f5760405162461bcd60e51b815260040180806020018281038252602c815260200180611888602c913960400191505060405180910390fd5b506000908152606860205260409020546001600160a01b031690565b60006105b68261074a565b9050806001600160a01b0316836001600160a01b031614156106095760405162461bcd60e51b815260040180806020018281038252602181526020018061190c6021913960400191505060405180910390fd5b806001600160a01b031661061b610cbd565b6001600160a01b0316148061063c575061063c81610637610cbd565b610c82565b6106775760405162461bcd60e51b81526004018080602001828103825260388152602001806117db6038913960400191505060405180910390fd5b6106818383610cc1565b505050565b60006106926066610d2f565b905090565b6106a86106a2610cbd565b82610d3a565b6106e35760405162461bcd60e51b815260040180806020018281038252603181526020018061192d6031913960400191505060405180910390fd5b610681838383610dde565b6001600160a01b03821660009081526065602052604081206107109083610f2a565b90505b92915050565b610681838383604051806020016040528060008152506109a1565b600080610742606684610f36565b509392505050565b60006107138260405180606001604052806029815260200161183d6029913960669190610f52565b606d8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561053f5780601f106105145761010080835404028352916020019161053f565b60006001600160a01b03821661081a5760405162461bcd60e51b815260040180806020018281038252602a815260200180611813602a913960400191505060405180910390fd5b6001600160a01b038216600090815260656020526040902061071390610d2f565b606b8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561053f5780601f106105145761010080835404028352916020019161053f565b6108a4610cbd565b6001600160a01b0316826001600160a01b0316141561090a576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b8060696000610917610cbd565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561095b610cbd565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b6109b26109ac610cbd565b83610d3a565b6109ed5760405162461bcd60e51b815260040180806020018281038252603181526020018061192d6031913960400191505060405180910390fd5b6109f984848484610f69565b50505050565b6060610a0a82610cb0565b610a455760405162461bcd60e51b815260040180806020018281038252602f8152602001806118dd602f913960400191505060405180910390fd5b6000828152606c602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610ada5780601f10610aaf57610100808354040283529160200191610ada565b820191906000526020600020905b815481529060010190602001808311610abd57829003601f168201915b505050505090506060610aeb610772565b9050805160001415610aff575090506104ae565b815115610bc05780826040516020018083805190602001908083835b60208310610b3a5780518252601f199092019160209182019101610b1b565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310610b825780518252601f199092019160209182019101610b63565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052925050506104ae565b80610bca85610fbb565b6040516020018083805190602001908083835b60208310610bfc5780518252601f199092019160209182019101610bdd565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310610c445780518252601f199092019160209182019101610c25565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050919050565b6001600160a01b03918216600090815260696020908152604080832093909416825291909152205460ff1690565b6000610713606683611096565b3390565b600081815260686020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610cf68261074a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610713826110a2565b6000610d4582610cb0565b610d805760405162461bcd60e51b815260040180806020018281038252602c8152602001806117af602c913960400191505060405180910390fd5b6000610d8b8361074a565b9050806001600160a01b0316846001600160a01b03161480610dc65750836001600160a01b0316610dbb84610549565b6001600160a01b0316145b80610dd65750610dd68185610c82565b949350505050565b826001600160a01b0316610df18261074a565b6001600160a01b031614610e365760405162461bcd60e51b81526004018080602001828103825260298152602001806118b46029913960400191505060405180910390fd5b6001600160a01b038216610e7b5760405162461bcd60e51b815260040180806020018281038252602481526020018061178b6024913960400191505060405180910390fd5b610e86838383610681565b610e91600082610cc1565b6001600160a01b0383166000908152606560205260409020610eb390826110a6565b506001600160a01b0382166000908152606560205260409020610ed690826110b2565b50610ee3606682846110be565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061071083836110d4565b6000808080610f458686611138565b9097909650945050505050565b6000610f5f8484846111b3565b90505b9392505050565b610f74848484610dde565b610f808484848461127d565b6109f95760405162461bcd60e51b81526004018080602001828103825260328152602001806117596032913960400191505060405180910390fd5b606081610fe057506040805180820190915260018152600360fc1b60208201526104ae565b8160005b8115610ff857600101600a82049150610fe4565b60608167ffffffffffffffff8111801561101157600080fd5b506040519080825280601f01601f19166020018201604052801561103c576020820181803683370190505b50859350905060001982015b831561108d57600a840660300160f81b8282806001900393508151811061106b57fe5b60200101906001600160f81b031916908160001a905350600a84049350611048565b50949350505050565b600061071083836113e5565b5490565b600061071083836113fd565b600061071083836114c3565b6000610f5f84846001600160a01b03851661150d565b815460009082106111165760405162461bcd60e51b81526004018080602001828103825260228152602001806117376022913960400191505060405180910390fd5b82600001828154811061112557fe5b9060005260206000200154905092915050565b81546000908190831061117c5760405162461bcd60e51b81526004018080602001828103825260228152602001806118666022913960400191505060405180910390fd5b600084600001848154811061118d57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000828152600184016020526040812054828161124e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156112135781810151838201526020016111fb565b50505050905090810190601f1680156112405780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061126157fe5b9060005260206000209060020201600101549150509392505050565b6000611291846001600160a01b03166115a4565b61129d57506001610dd6565b60606113ab630a85bd0160e11b6112b2610cbd565b88878760405160240180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611319578181015183820152602001611301565b50505050905090810190601f1680156113465780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001611759603291396001600160a01b03881691906115aa565b905060008180602001905160208110156113c457600080fd5b50516001600160e01b031916630a85bd0160e11b1492505050949350505050565b60009081526001919091016020526040902054151590565b600081815260018301602052604081205480156114b9578354600019808301919081019060009087908390811061143057fe5b906000526020600020015490508087600001848154811061144d57fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061147d57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610713565b6000915050610713565b60006114cf83836113e5565b61150557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610713565b506000610713565b600082815260018401602052604081205480611572575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055610f62565b8285600001600183038154811061158557fe5b9060005260206000209060020201600101819055506000915050610f62565b3b151590565b6060610f5f8484600085856115be856115a4565b61160f576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061164e5780518252601f19909201916020918201910161162f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146116b0576040519150601f19603f3d011682016040523d82523d6000602084013e6116b5565b606091505b50915091506116c58282866116d0565b979650505050505050565b606083156116df575081610f62565b8251156116ef5782518084602001fd5b60405162461bcd60e51b81526020600482018181528451602484015284518593919283926044019190850190808383600083156112135781810151838201526020016111fb56fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64734552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564a2646970667358221220e15713a483ea2ee40a0ab20a1d884abcde4d974aa1d037b9246aed433baacdf264736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1993 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x10B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x4F6CCCE7 GT PUSH2 0xA2 JUMPI DUP1 PUSH4 0x95D89B41 GT PUSH2 0x71 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x349 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x351 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x37F JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0x445 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x462 JUMPI PUSH2 0x10B JUMP JUMPDEST DUP1 PUSH4 0x4F6CCCE7 EQ PUSH2 0x2E1 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x2FE JUMPI DUP1 PUSH4 0x6C0360EB EQ PUSH2 0x31B JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x323 JUMPI PUSH2 0x10B JUMP JUMPDEST DUP1 PUSH4 0x18160DDD GT PUSH2 0xDE JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x22F JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x249 JUMPI DUP1 PUSH4 0x2F745C59 EQ PUSH2 0x27F JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x2AB JUMPI PUSH2 0x10B JUMP JUMPDEST DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x110 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x14B JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x1C8 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x201 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x137 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x126 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH2 0x490 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x153 PUSH2 0x4B3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x18D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x175 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1BA JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1E5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x549 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x22D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x217 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x5AB JUMP JUMPDEST STOP JUMPDEST PUSH2 0x237 PUSH2 0x686 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x22D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x25F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x697 JUMP JUMPDEST PUSH2 0x237 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x295 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x6EE JUMP JUMPDEST PUSH2 0x22D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x2C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x719 JUMP JUMPDEST PUSH2 0x237 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x734 JUMP JUMPDEST PUSH2 0x1E5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x314 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x74A JUMP JUMPDEST PUSH2 0x153 PUSH2 0x772 JUMP JUMPDEST PUSH2 0x237 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x339 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x7D3 JUMP JUMPDEST PUSH2 0x153 PUSH2 0x83B JUMP JUMPDEST PUSH2 0x22D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x367 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD ISZERO ISZERO PUSH2 0x89C JUMP JUMPDEST PUSH2 0x22D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x395 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x3D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x3E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x404 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x9A1 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x153 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x45B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x9FF JUMP JUMPDEST PUSH2 0x137 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x478 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xC82 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x53F JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x514 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x53F JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x522 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x554 DUP3 PUSH2 0xCB0 JUMP JUMPDEST PUSH2 0x58F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1888 PUSH1 0x2C SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x68 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5B6 DUP3 PUSH2 0x74A JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x609 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x190C PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x61B PUSH2 0xCBD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0x63C JUMPI POP PUSH2 0x63C DUP2 PUSH2 0x637 PUSH2 0xCBD JUMP JUMPDEST PUSH2 0xC82 JUMP JUMPDEST PUSH2 0x677 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x38 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x17DB PUSH1 0x38 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x681 DUP4 DUP4 PUSH2 0xCC1 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x692 PUSH1 0x66 PUSH2 0xD2F JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x6A8 PUSH2 0x6A2 PUSH2 0xCBD JUMP JUMPDEST DUP3 PUSH2 0xD3A JUMP JUMPDEST PUSH2 0x6E3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x31 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x192D PUSH1 0x31 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x681 DUP4 DUP4 DUP4 PUSH2 0xDDE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x710 SWAP1 DUP4 PUSH2 0xF2A JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x681 DUP4 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP PUSH2 0x9A1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x742 PUSH1 0x66 DUP5 PUSH2 0xF36 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x713 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x183D PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x66 SWAP2 SWAP1 PUSH2 0xF52 JUMP JUMPDEST PUSH1 0x6D DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x53F JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x514 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x53F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x81A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1813 PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x713 SWAP1 PUSH2 0xD2F JUMP JUMPDEST PUSH1 0x6B DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x53F JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x514 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x53F JUMP JUMPDEST PUSH2 0x8A4 PUSH2 0xCBD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x90A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4552433732313A20617070726F766520746F2063616C6C657200000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x69 PUSH1 0x0 PUSH2 0x917 PUSH2 0xCBD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP8 AND DUP1 DUP3 MSTORE SWAP2 SWAP1 SWAP4 MSTORE SWAP2 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP3 ISZERO ISZERO SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE PUSH2 0x95B PUSH2 0xCBD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH2 0x9B2 PUSH2 0x9AC PUSH2 0xCBD JUMP JUMPDEST DUP4 PUSH2 0xD3A JUMP JUMPDEST PUSH2 0x9ED JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x31 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x192D PUSH1 0x31 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x9F9 DUP5 DUP5 DUP5 DUP5 PUSH2 0xF69 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0xA0A DUP3 PUSH2 0xCB0 JUMP JUMPDEST PUSH2 0xA45 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2F DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x18DD PUSH1 0x2F SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x6C PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD DUP4 MLOAD PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP7 AND ISZERO MUL ADD SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 DIV SWAP2 DUP3 ADD DUP5 SWAP1 DIV DUP5 MUL DUP2 ADD DUP5 ADD SWAP1 SWAP5 MSTORE DUP1 DUP5 MSTORE PUSH1 0x60 SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xADA JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xAAF JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xADA JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xABD JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH1 0x60 PUSH2 0xAEB PUSH2 0x772 JUMP JUMPDEST SWAP1 POP DUP1 MLOAD PUSH1 0x0 EQ ISZERO PUSH2 0xAFF JUMPI POP SWAP1 POP PUSH2 0x4AE JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0xBC0 JUMPI DUP1 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xB3A JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xB1B JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE DUP6 MLOAD SWAP2 SWAP1 SWAP4 ADD SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xB82 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xB63 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP3 POP POP POP PUSH2 0x4AE JUMP JUMPDEST DUP1 PUSH2 0xBCA DUP6 PUSH2 0xFBB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xBFC JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xBDD JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE DUP6 MLOAD SWAP2 SWAP1 SWAP4 ADD SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xC44 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xC25 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP3 POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x713 PUSH1 0x66 DUP4 PUSH2 0x1096 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x68 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 SWAP1 PUSH2 0xCF6 DUP3 PUSH2 0x74A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x713 DUP3 PUSH2 0x10A2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xD45 DUP3 PUSH2 0xCB0 JUMP JUMPDEST PUSH2 0xD80 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x17AF PUSH1 0x2C SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xD8B DUP4 PUSH2 0x74A JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0xDC6 JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xDBB DUP5 PUSH2 0x549 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0xDD6 JUMPI POP PUSH2 0xDD6 DUP2 DUP6 PUSH2 0xC82 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xDF1 DUP3 PUSH2 0x74A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xE36 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x18B4 PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xE7B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x178B PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xE86 DUP4 DUP4 DUP4 PUSH2 0x681 JUMP JUMPDEST PUSH2 0xE91 PUSH1 0x0 DUP3 PUSH2 0xCC1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0xEB3 SWAP1 DUP3 PUSH2 0x10A6 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0xED6 SWAP1 DUP3 PUSH2 0x10B2 JUMP JUMPDEST POP PUSH2 0xEE3 PUSH1 0x66 DUP3 DUP5 PUSH2 0x10BE JUMP JUMPDEST POP DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x710 DUP4 DUP4 PUSH2 0x10D4 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH2 0xF45 DUP7 DUP7 PUSH2 0x1138 JUMP JUMPDEST SWAP1 SWAP8 SWAP1 SWAP7 POP SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF5F DUP5 DUP5 DUP5 PUSH2 0x11B3 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xF74 DUP5 DUP5 DUP5 PUSH2 0xDDE JUMP JUMPDEST PUSH2 0xF80 DUP5 DUP5 DUP5 DUP5 PUSH2 0x127D JUMP JUMPDEST PUSH2 0x9F9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x32 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1759 PUSH1 0x32 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x60 DUP2 PUSH2 0xFE0 JUMPI POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1 DUP2 MSTORE PUSH1 0x3 PUSH1 0xFC SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x4AE JUMP JUMPDEST DUP2 PUSH1 0x0 JUMPDEST DUP2 ISZERO PUSH2 0xFF8 JUMPI PUSH1 0x1 ADD PUSH1 0xA DUP3 DIV SWAP2 POP PUSH2 0xFE4 JUMP JUMPDEST PUSH1 0x60 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x1011 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x103C JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP6 SWAP4 POP SWAP1 POP PUSH1 0x0 NOT DUP3 ADD JUMPDEST DUP4 ISZERO PUSH2 0x108D JUMPI PUSH1 0xA DUP5 MOD PUSH1 0x30 ADD PUSH1 0xF8 SHL DUP3 DUP3 DUP1 PUSH1 0x1 SWAP1 SUB SWAP4 POP DUP2 MLOAD DUP2 LT PUSH2 0x106B JUMPI INVALID JUMPDEST PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xF8 SHL SUB NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0xA DUP5 DIV SWAP4 POP PUSH2 0x1048 JUMP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x710 DUP4 DUP4 PUSH2 0x13E5 JUMP JUMPDEST SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x710 DUP4 DUP4 PUSH2 0x13FD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x710 DUP4 DUP4 PUSH2 0x14C3 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF5F DUP5 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x150D JUMP JUMPDEST DUP2 SLOAD PUSH1 0x0 SWAP1 DUP3 LT PUSH2 0x1116 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1737 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 PUSH1 0x0 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x1125 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP4 LT PUSH2 0x117C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1866 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP5 PUSH1 0x0 ADD DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x118D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD SWAP1 POP DUP1 PUSH1 0x0 ADD SLOAD DUP2 PUSH1 0x1 ADD SLOAD SWAP3 POP SWAP3 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP3 DUP2 PUSH2 0x124E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1213 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x11FB JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1240 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP5 PUSH1 0x0 ADD PUSH1 0x1 DUP3 SUB DUP2 SLOAD DUP2 LT PUSH2 0x1261 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD PUSH1 0x1 ADD SLOAD SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1291 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x15A4 JUMP JUMPDEST PUSH2 0x129D JUMPI POP PUSH1 0x1 PUSH2 0xDD6 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x13AB PUSH4 0xA85BD01 PUSH1 0xE1 SHL PUSH2 0x12B2 PUSH2 0xCBD JUMP JUMPDEST DUP9 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x24 ADD DUP1 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1319 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1301 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1346 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x32 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1759 PUSH1 0x32 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND SWAP2 SWAP1 PUSH2 0x15AA JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x13C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH4 0xA85BD01 PUSH1 0xE1 SHL EQ SWAP3 POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 DUP4 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP1 ISZERO PUSH2 0x14B9 JUMPI DUP4 SLOAD PUSH1 0x0 NOT DUP1 DUP4 ADD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x0 SWAP1 DUP8 SWAP1 DUP4 SWAP1 DUP2 LT PUSH2 0x1430 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP DUP1 DUP8 PUSH1 0x0 ADD DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x144D JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SWAP3 SWAP1 SWAP3 SSTORE DUP3 DUP2 MSTORE PUSH1 0x1 DUP10 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP5 ADD SWAP1 SSTORE DUP7 SLOAD DUP8 SWAP1 DUP1 PUSH2 0x147D JUMPI INVALID JUMPDEST PUSH1 0x1 SWAP1 SUB DUP2 DUP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SSTORE SWAP1 SSTORE DUP7 PUSH1 0x1 ADD PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SSTORE PUSH1 0x1 SWAP5 POP POP POP POP POP PUSH2 0x713 JUMP JUMPDEST PUSH1 0x0 SWAP2 POP POP PUSH2 0x713 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14CF DUP4 DUP4 PUSH2 0x13E5 JUMP JUMPDEST PUSH2 0x1505 JUMPI POP DUP2 SLOAD PUSH1 0x1 DUP2 DUP2 ADD DUP5 SSTORE PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 KECCAK256 SWAP1 SWAP4 ADD DUP5 SWAP1 SSTORE DUP5 SLOAD DUP5 DUP3 MSTORE DUP3 DUP7 ADD SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE PUSH2 0x713 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x713 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP1 PUSH2 0x1572 JUMPI POP POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE DUP4 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP5 DUP2 MSTORE DUP7 SLOAD PUSH1 0x1 DUP2 DUP2 ADD DUP10 SSTORE PUSH1 0x0 DUP10 DUP2 MSTORE DUP5 DUP2 KECCAK256 SWAP6 MLOAD PUSH1 0x2 SWAP1 SWAP4 MUL SWAP1 SWAP6 ADD SWAP2 DUP3 SSTORE SWAP2 MLOAD SWAP1 DUP3 ADD SSTORE DUP7 SLOAD DUP7 DUP5 MSTORE DUP2 DUP9 ADD SWAP1 SWAP3 MSTORE SWAP3 SWAP1 SWAP2 KECCAK256 SSTORE PUSH2 0xF62 JUMP JUMPDEST DUP3 DUP6 PUSH1 0x0 ADD PUSH1 0x1 DUP4 SUB DUP2 SLOAD DUP2 LT PUSH2 0x1585 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD PUSH1 0x1 ADD DUP2 SWAP1 SSTORE POP PUSH1 0x0 SWAP2 POP POP PUSH2 0xF62 JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH2 0xF5F DUP5 DUP5 PUSH1 0x0 DUP6 DUP6 PUSH2 0x15BE DUP6 PUSH2 0x15A4 JUMP JUMPDEST PUSH2 0x160F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x164E JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x162F JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x16B0 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x16B5 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x16C5 DUP3 DUP3 DUP7 PUSH2 0x16D0 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x16DF JUMPI POP DUP2 PUSH2 0xF62 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x16EF JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x1213 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x11FB JUMP INVALID GASLIMIT PUSH15 0x756D657261626C655365743A20696E PUSH5 0x6578206F75 PUSH21 0x206F6620626F756E64734552433732313A20747261 PUSH15 0x7366657220746F206E6F6E20455243 CALLDATACOPY ORIGIN BALANCE MSTORE PUSH6 0x636569766572 KECCAK256 PUSH10 0x6D706C656D656E746572 GASLIMIT MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH21 0x72616E7366657220746F20746865207A65726F2061 PUSH5 0x6472657373 GASLIMIT MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH16 0x70657261746F7220717565727920666F PUSH19 0x206E6F6E6578697374656E7420746F6B656E45 MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F76652063616C6C6572206973206E6F74206F PUSH24 0x6E6572206E6F7220617070726F76656420666F7220616C6C GASLIMIT MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH3 0x616C61 PUSH15 0x636520717565727920666F72207468 PUSH6 0x207A65726F20 PUSH2 0x6464 PUSH19 0x6573734552433732313A206F776E6572207175 PUSH6 0x727920666F72 KECCAK256 PUSH15 0x6F6E6578697374656E7420746F6B65 PUSH15 0x456E756D657261626C654D61703A20 PUSH10 0x6E646578206F7574206F PUSH7 0x20626F756E6473 GASLIMIT MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F76656420717565727920666F72206E6F6E65 PUSH25 0x697374656E7420746F6B656E4552433732313A207472616E73 PUSH7 0x6572206F662074 PUSH16 0x6B656E2074686174206973206E6F7420 PUSH16 0x776E4552433732314D65746164617461 GASPRICE KECCAK256 SSTORE MSTORE 0x49 KECCAK256 PUSH18 0x7565727920666F72206E6F6E657869737465 PUSH15 0x7420746F6B656E4552433732313A20 PUSH2 0x7070 PUSH19 0x6F76616C20746F2063757272656E74206F776E PUSH6 0x724552433732 BALANCE GASPRICE KECCAK256 PUSH21 0x72616E736665722063616C6C6572206973206E6F74 KECCAK256 PUSH16 0x776E6572206E6F7220617070726F7665 PUSH5 0xA264697066 PUSH20 0x58221220E15713A483EA2EE40A0AB20A1D884ABC 0xDE 0x4D SWAP8 0x4A LOG1 0xD0 CALLDATACOPY 0xB9 0x24 PUSH11 0xED433BAACDF264736F6C63 NUMBER STOP MOD 0xC STOP CALLER ",
              "sourceMap": "732:16973:13:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506004361061010b5760003560e01c80634f6ccce7116100a257806395d89b411161007157806395d89b4114610349578063a22cb46514610351578063b88d4fde1461037f578063c87b56dd14610445578063e985e9c5146104625761010b565b80634f6ccce7146102e15780636352211e146102fe5780636c0360eb1461031b57806370a08231146103235761010b565b806318160ddd116100de57806318160ddd1461022f57806323b872dd146102495780632f745c591461027f57806342842e0e146102ab5761010b565b806301ffc9a71461011057806306fdde031461014b578063081812fc146101c8578063095ea7b314610201575b600080fd5b6101376004803603602081101561012657600080fd5b50356001600160e01b031916610490565b604080519115158252519081900360200190f35b6101536104b3565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561018d578181015183820152602001610175565b50505050905090810190601f1680156101ba5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101e5600480360360208110156101de57600080fd5b5035610549565b604080516001600160a01b039092168252519081900360200190f35b61022d6004803603604081101561021757600080fd5b506001600160a01b0381351690602001356105ab565b005b610237610686565b60408051918252519081900360200190f35b61022d6004803603606081101561025f57600080fd5b506001600160a01b03813581169160208101359091169060400135610697565b6102376004803603604081101561029557600080fd5b506001600160a01b0381351690602001356106ee565b61022d600480360360608110156102c157600080fd5b506001600160a01b03813581169160208101359091169060400135610719565b610237600480360360208110156102f757600080fd5b5035610734565b6101e56004803603602081101561031457600080fd5b503561074a565b610153610772565b6102376004803603602081101561033957600080fd5b50356001600160a01b03166107d3565b61015361083b565b61022d6004803603604081101561036757600080fd5b506001600160a01b038135169060200135151561089c565b61022d6004803603608081101561039557600080fd5b6001600160a01b038235811692602081013590911691604082013591908101906080810160608201356401000000008111156103d057600080fd5b8201836020820111156103e257600080fd5b8035906020019184600183028401116401000000008311171561040457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506109a1945050505050565b6101536004803603602081101561045b57600080fd5b50356109ff565b6101376004803603604081101561047857600080fd5b506001600160a01b0381358116916020013516610c82565b6001600160e01b0319811660009081526033602052604090205460ff165b919050565b606a8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561053f5780601f106105145761010080835404028352916020019161053f565b820191906000526020600020905b81548152906001019060200180831161052257829003601f168201915b5050505050905090565b600061055482610cb0565b61058f5760405162461bcd60e51b815260040180806020018281038252602c815260200180611888602c913960400191505060405180910390fd5b506000908152606860205260409020546001600160a01b031690565b60006105b68261074a565b9050806001600160a01b0316836001600160a01b031614156106095760405162461bcd60e51b815260040180806020018281038252602181526020018061190c6021913960400191505060405180910390fd5b806001600160a01b031661061b610cbd565b6001600160a01b0316148061063c575061063c81610637610cbd565b610c82565b6106775760405162461bcd60e51b81526004018080602001828103825260388152602001806117db6038913960400191505060405180910390fd5b6106818383610cc1565b505050565b60006106926066610d2f565b905090565b6106a86106a2610cbd565b82610d3a565b6106e35760405162461bcd60e51b815260040180806020018281038252603181526020018061192d6031913960400191505060405180910390fd5b610681838383610dde565b6001600160a01b03821660009081526065602052604081206107109083610f2a565b90505b92915050565b610681838383604051806020016040528060008152506109a1565b600080610742606684610f36565b509392505050565b60006107138260405180606001604052806029815260200161183d6029913960669190610f52565b606d8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561053f5780601f106105145761010080835404028352916020019161053f565b60006001600160a01b03821661081a5760405162461bcd60e51b815260040180806020018281038252602a815260200180611813602a913960400191505060405180910390fd5b6001600160a01b038216600090815260656020526040902061071390610d2f565b606b8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561053f5780601f106105145761010080835404028352916020019161053f565b6108a4610cbd565b6001600160a01b0316826001600160a01b0316141561090a576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b8060696000610917610cbd565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561095b610cbd565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b6109b26109ac610cbd565b83610d3a565b6109ed5760405162461bcd60e51b815260040180806020018281038252603181526020018061192d6031913960400191505060405180910390fd5b6109f984848484610f69565b50505050565b6060610a0a82610cb0565b610a455760405162461bcd60e51b815260040180806020018281038252602f8152602001806118dd602f913960400191505060405180910390fd5b6000828152606c602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610ada5780601f10610aaf57610100808354040283529160200191610ada565b820191906000526020600020905b815481529060010190602001808311610abd57829003601f168201915b505050505090506060610aeb610772565b9050805160001415610aff575090506104ae565b815115610bc05780826040516020018083805190602001908083835b60208310610b3a5780518252601f199092019160209182019101610b1b565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310610b825780518252601f199092019160209182019101610b63565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052925050506104ae565b80610bca85610fbb565b6040516020018083805190602001908083835b60208310610bfc5780518252601f199092019160209182019101610bdd565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310610c445780518252601f199092019160209182019101610c25565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050919050565b6001600160a01b03918216600090815260696020908152604080832093909416825291909152205460ff1690565b6000610713606683611096565b3390565b600081815260686020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610cf68261074a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610713826110a2565b6000610d4582610cb0565b610d805760405162461bcd60e51b815260040180806020018281038252602c8152602001806117af602c913960400191505060405180910390fd5b6000610d8b8361074a565b9050806001600160a01b0316846001600160a01b03161480610dc65750836001600160a01b0316610dbb84610549565b6001600160a01b0316145b80610dd65750610dd68185610c82565b949350505050565b826001600160a01b0316610df18261074a565b6001600160a01b031614610e365760405162461bcd60e51b81526004018080602001828103825260298152602001806118b46029913960400191505060405180910390fd5b6001600160a01b038216610e7b5760405162461bcd60e51b815260040180806020018281038252602481526020018061178b6024913960400191505060405180910390fd5b610e86838383610681565b610e91600082610cc1565b6001600160a01b0383166000908152606560205260409020610eb390826110a6565b506001600160a01b0382166000908152606560205260409020610ed690826110b2565b50610ee3606682846110be565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061071083836110d4565b6000808080610f458686611138565b9097909650945050505050565b6000610f5f8484846111b3565b90505b9392505050565b610f74848484610dde565b610f808484848461127d565b6109f95760405162461bcd60e51b81526004018080602001828103825260328152602001806117596032913960400191505060405180910390fd5b606081610fe057506040805180820190915260018152600360fc1b60208201526104ae565b8160005b8115610ff857600101600a82049150610fe4565b60608167ffffffffffffffff8111801561101157600080fd5b506040519080825280601f01601f19166020018201604052801561103c576020820181803683370190505b50859350905060001982015b831561108d57600a840660300160f81b8282806001900393508151811061106b57fe5b60200101906001600160f81b031916908160001a905350600a84049350611048565b50949350505050565b600061071083836113e5565b5490565b600061071083836113fd565b600061071083836114c3565b6000610f5f84846001600160a01b03851661150d565b815460009082106111165760405162461bcd60e51b81526004018080602001828103825260228152602001806117376022913960400191505060405180910390fd5b82600001828154811061112557fe5b9060005260206000200154905092915050565b81546000908190831061117c5760405162461bcd60e51b81526004018080602001828103825260228152602001806118666022913960400191505060405180910390fd5b600084600001848154811061118d57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000828152600184016020526040812054828161124e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156112135781810151838201526020016111fb565b50505050905090810190601f1680156112405780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061126157fe5b9060005260206000209060020201600101549150509392505050565b6000611291846001600160a01b03166115a4565b61129d57506001610dd6565b60606113ab630a85bd0160e11b6112b2610cbd565b88878760405160240180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611319578181015183820152602001611301565b50505050905090810190601f1680156113465780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001611759603291396001600160a01b03881691906115aa565b905060008180602001905160208110156113c457600080fd5b50516001600160e01b031916630a85bd0160e11b1492505050949350505050565b60009081526001919091016020526040902054151590565b600081815260018301602052604081205480156114b9578354600019808301919081019060009087908390811061143057fe5b906000526020600020015490508087600001848154811061144d57fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061147d57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610713565b6000915050610713565b60006114cf83836113e5565b61150557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610713565b506000610713565b600082815260018401602052604081205480611572575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055610f62565b8285600001600183038154811061158557fe5b9060005260206000209060020201600101819055506000915050610f62565b3b151590565b6060610f5f8484600085856115be856115a4565b61160f576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061164e5780518252601f19909201916020918201910161162f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146116b0576040519150601f19603f3d011682016040523d82523d6000602084013e6116b5565b606091505b50915091506116c58282866116d0565b979650505050505050565b606083156116df575081610f62565b8251156116ef5782518084602001fd5b60405162461bcd60e51b81526020600482018181528451602484015284518593919283926044019190850190808383600083156112135781810151838201526020016111fb56fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64734552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564a2646970667358221220e15713a483ea2ee40a0ab20a1d884abcde4d974aa1d037b9246aed433baacdf264736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x10B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x4F6CCCE7 GT PUSH2 0xA2 JUMPI DUP1 PUSH4 0x95D89B41 GT PUSH2 0x71 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x349 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x351 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x37F JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0x445 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x462 JUMPI PUSH2 0x10B JUMP JUMPDEST DUP1 PUSH4 0x4F6CCCE7 EQ PUSH2 0x2E1 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x2FE JUMPI DUP1 PUSH4 0x6C0360EB EQ PUSH2 0x31B JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x323 JUMPI PUSH2 0x10B JUMP JUMPDEST DUP1 PUSH4 0x18160DDD GT PUSH2 0xDE JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x22F JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x249 JUMPI DUP1 PUSH4 0x2F745C59 EQ PUSH2 0x27F JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x2AB JUMPI PUSH2 0x10B JUMP JUMPDEST DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x110 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x14B JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x1C8 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x201 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x137 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x126 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH2 0x490 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x153 PUSH2 0x4B3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x18D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x175 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1BA JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1E5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x549 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x22D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x217 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x5AB JUMP JUMPDEST STOP JUMPDEST PUSH2 0x237 PUSH2 0x686 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x22D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x25F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x697 JUMP JUMPDEST PUSH2 0x237 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x295 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x6EE JUMP JUMPDEST PUSH2 0x22D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x2C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x719 JUMP JUMPDEST PUSH2 0x237 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x734 JUMP JUMPDEST PUSH2 0x1E5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x314 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x74A JUMP JUMPDEST PUSH2 0x153 PUSH2 0x772 JUMP JUMPDEST PUSH2 0x237 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x339 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x7D3 JUMP JUMPDEST PUSH2 0x153 PUSH2 0x83B JUMP JUMPDEST PUSH2 0x22D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x367 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD ISZERO ISZERO PUSH2 0x89C JUMP JUMPDEST PUSH2 0x22D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x395 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x3D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x3E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x404 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x9A1 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x153 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x45B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x9FF JUMP JUMPDEST PUSH2 0x137 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x478 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xC82 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x53F JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x514 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x53F JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x522 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x554 DUP3 PUSH2 0xCB0 JUMP JUMPDEST PUSH2 0x58F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1888 PUSH1 0x2C SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x68 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5B6 DUP3 PUSH2 0x74A JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x609 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x190C PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x61B PUSH2 0xCBD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0x63C JUMPI POP PUSH2 0x63C DUP2 PUSH2 0x637 PUSH2 0xCBD JUMP JUMPDEST PUSH2 0xC82 JUMP JUMPDEST PUSH2 0x677 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x38 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x17DB PUSH1 0x38 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x681 DUP4 DUP4 PUSH2 0xCC1 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x692 PUSH1 0x66 PUSH2 0xD2F JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x6A8 PUSH2 0x6A2 PUSH2 0xCBD JUMP JUMPDEST DUP3 PUSH2 0xD3A JUMP JUMPDEST PUSH2 0x6E3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x31 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x192D PUSH1 0x31 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x681 DUP4 DUP4 DUP4 PUSH2 0xDDE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x710 SWAP1 DUP4 PUSH2 0xF2A JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x681 DUP4 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP PUSH2 0x9A1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x742 PUSH1 0x66 DUP5 PUSH2 0xF36 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x713 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x183D PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x66 SWAP2 SWAP1 PUSH2 0xF52 JUMP JUMPDEST PUSH1 0x6D DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x53F JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x514 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x53F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x81A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1813 PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x713 SWAP1 PUSH2 0xD2F JUMP JUMPDEST PUSH1 0x6B DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x53F JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x514 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x53F JUMP JUMPDEST PUSH2 0x8A4 PUSH2 0xCBD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x90A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4552433732313A20617070726F766520746F2063616C6C657200000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x69 PUSH1 0x0 PUSH2 0x917 PUSH2 0xCBD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP8 AND DUP1 DUP3 MSTORE SWAP2 SWAP1 SWAP4 MSTORE SWAP2 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP3 ISZERO ISZERO SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE PUSH2 0x95B PUSH2 0xCBD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH2 0x9B2 PUSH2 0x9AC PUSH2 0xCBD JUMP JUMPDEST DUP4 PUSH2 0xD3A JUMP JUMPDEST PUSH2 0x9ED JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x31 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x192D PUSH1 0x31 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x9F9 DUP5 DUP5 DUP5 DUP5 PUSH2 0xF69 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0xA0A DUP3 PUSH2 0xCB0 JUMP JUMPDEST PUSH2 0xA45 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2F DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x18DD PUSH1 0x2F SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x6C PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD DUP4 MLOAD PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP7 AND ISZERO MUL ADD SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 DIV SWAP2 DUP3 ADD DUP5 SWAP1 DIV DUP5 MUL DUP2 ADD DUP5 ADD SWAP1 SWAP5 MSTORE DUP1 DUP5 MSTORE PUSH1 0x60 SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xADA JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xAAF JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xADA JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xABD JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH1 0x60 PUSH2 0xAEB PUSH2 0x772 JUMP JUMPDEST SWAP1 POP DUP1 MLOAD PUSH1 0x0 EQ ISZERO PUSH2 0xAFF JUMPI POP SWAP1 POP PUSH2 0x4AE JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0xBC0 JUMPI DUP1 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xB3A JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xB1B JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE DUP6 MLOAD SWAP2 SWAP1 SWAP4 ADD SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xB82 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xB63 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP3 POP POP POP PUSH2 0x4AE JUMP JUMPDEST DUP1 PUSH2 0xBCA DUP6 PUSH2 0xFBB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xBFC JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xBDD JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE DUP6 MLOAD SWAP2 SWAP1 SWAP4 ADD SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xC44 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xC25 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP3 POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x713 PUSH1 0x66 DUP4 PUSH2 0x1096 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x68 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 SWAP1 PUSH2 0xCF6 DUP3 PUSH2 0x74A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x713 DUP3 PUSH2 0x10A2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xD45 DUP3 PUSH2 0xCB0 JUMP JUMPDEST PUSH2 0xD80 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x17AF PUSH1 0x2C SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xD8B DUP4 PUSH2 0x74A JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0xDC6 JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xDBB DUP5 PUSH2 0x549 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0xDD6 JUMPI POP PUSH2 0xDD6 DUP2 DUP6 PUSH2 0xC82 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xDF1 DUP3 PUSH2 0x74A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xE36 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x18B4 PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xE7B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x178B PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xE86 DUP4 DUP4 DUP4 PUSH2 0x681 JUMP JUMPDEST PUSH2 0xE91 PUSH1 0x0 DUP3 PUSH2 0xCC1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0xEB3 SWAP1 DUP3 PUSH2 0x10A6 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0xED6 SWAP1 DUP3 PUSH2 0x10B2 JUMP JUMPDEST POP PUSH2 0xEE3 PUSH1 0x66 DUP3 DUP5 PUSH2 0x10BE JUMP JUMPDEST POP DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x710 DUP4 DUP4 PUSH2 0x10D4 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH2 0xF45 DUP7 DUP7 PUSH2 0x1138 JUMP JUMPDEST SWAP1 SWAP8 SWAP1 SWAP7 POP SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF5F DUP5 DUP5 DUP5 PUSH2 0x11B3 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xF74 DUP5 DUP5 DUP5 PUSH2 0xDDE JUMP JUMPDEST PUSH2 0xF80 DUP5 DUP5 DUP5 DUP5 PUSH2 0x127D JUMP JUMPDEST PUSH2 0x9F9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x32 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1759 PUSH1 0x32 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x60 DUP2 PUSH2 0xFE0 JUMPI POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1 DUP2 MSTORE PUSH1 0x3 PUSH1 0xFC SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x4AE JUMP JUMPDEST DUP2 PUSH1 0x0 JUMPDEST DUP2 ISZERO PUSH2 0xFF8 JUMPI PUSH1 0x1 ADD PUSH1 0xA DUP3 DIV SWAP2 POP PUSH2 0xFE4 JUMP JUMPDEST PUSH1 0x60 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x1011 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x103C JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP6 SWAP4 POP SWAP1 POP PUSH1 0x0 NOT DUP3 ADD JUMPDEST DUP4 ISZERO PUSH2 0x108D JUMPI PUSH1 0xA DUP5 MOD PUSH1 0x30 ADD PUSH1 0xF8 SHL DUP3 DUP3 DUP1 PUSH1 0x1 SWAP1 SUB SWAP4 POP DUP2 MLOAD DUP2 LT PUSH2 0x106B JUMPI INVALID JUMPDEST PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xF8 SHL SUB NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0xA DUP5 DIV SWAP4 POP PUSH2 0x1048 JUMP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x710 DUP4 DUP4 PUSH2 0x13E5 JUMP JUMPDEST SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x710 DUP4 DUP4 PUSH2 0x13FD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x710 DUP4 DUP4 PUSH2 0x14C3 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF5F DUP5 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x150D JUMP JUMPDEST DUP2 SLOAD PUSH1 0x0 SWAP1 DUP3 LT PUSH2 0x1116 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1737 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 PUSH1 0x0 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x1125 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP4 LT PUSH2 0x117C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1866 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP5 PUSH1 0x0 ADD DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x118D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD SWAP1 POP DUP1 PUSH1 0x0 ADD SLOAD DUP2 PUSH1 0x1 ADD SLOAD SWAP3 POP SWAP3 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP3 DUP2 PUSH2 0x124E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1213 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x11FB JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1240 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP5 PUSH1 0x0 ADD PUSH1 0x1 DUP3 SUB DUP2 SLOAD DUP2 LT PUSH2 0x1261 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD PUSH1 0x1 ADD SLOAD SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1291 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x15A4 JUMP JUMPDEST PUSH2 0x129D JUMPI POP PUSH1 0x1 PUSH2 0xDD6 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x13AB PUSH4 0xA85BD01 PUSH1 0xE1 SHL PUSH2 0x12B2 PUSH2 0xCBD JUMP JUMPDEST DUP9 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x24 ADD DUP1 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1319 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1301 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1346 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x32 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1759 PUSH1 0x32 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND SWAP2 SWAP1 PUSH2 0x15AA JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x13C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH4 0xA85BD01 PUSH1 0xE1 SHL EQ SWAP3 POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 DUP4 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP1 ISZERO PUSH2 0x14B9 JUMPI DUP4 SLOAD PUSH1 0x0 NOT DUP1 DUP4 ADD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x0 SWAP1 DUP8 SWAP1 DUP4 SWAP1 DUP2 LT PUSH2 0x1430 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP DUP1 DUP8 PUSH1 0x0 ADD DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x144D JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SWAP3 SWAP1 SWAP3 SSTORE DUP3 DUP2 MSTORE PUSH1 0x1 DUP10 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP5 ADD SWAP1 SSTORE DUP7 SLOAD DUP8 SWAP1 DUP1 PUSH2 0x147D JUMPI INVALID JUMPDEST PUSH1 0x1 SWAP1 SUB DUP2 DUP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SSTORE SWAP1 SSTORE DUP7 PUSH1 0x1 ADD PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SSTORE PUSH1 0x1 SWAP5 POP POP POP POP POP PUSH2 0x713 JUMP JUMPDEST PUSH1 0x0 SWAP2 POP POP PUSH2 0x713 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14CF DUP4 DUP4 PUSH2 0x13E5 JUMP JUMPDEST PUSH2 0x1505 JUMPI POP DUP2 SLOAD PUSH1 0x1 DUP2 DUP2 ADD DUP5 SSTORE PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 KECCAK256 SWAP1 SWAP4 ADD DUP5 SWAP1 SSTORE DUP5 SLOAD DUP5 DUP3 MSTORE DUP3 DUP7 ADD SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE PUSH2 0x713 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x713 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP1 PUSH2 0x1572 JUMPI POP POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE DUP4 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP5 DUP2 MSTORE DUP7 SLOAD PUSH1 0x1 DUP2 DUP2 ADD DUP10 SSTORE PUSH1 0x0 DUP10 DUP2 MSTORE DUP5 DUP2 KECCAK256 SWAP6 MLOAD PUSH1 0x2 SWAP1 SWAP4 MUL SWAP1 SWAP6 ADD SWAP2 DUP3 SSTORE SWAP2 MLOAD SWAP1 DUP3 ADD SSTORE DUP7 SLOAD DUP7 DUP5 MSTORE DUP2 DUP9 ADD SWAP1 SWAP3 MSTORE SWAP3 SWAP1 SWAP2 KECCAK256 SSTORE PUSH2 0xF62 JUMP JUMPDEST DUP3 DUP6 PUSH1 0x0 ADD PUSH1 0x1 DUP4 SUB DUP2 SLOAD DUP2 LT PUSH2 0x1585 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD PUSH1 0x1 ADD DUP2 SWAP1 SSTORE POP PUSH1 0x0 SWAP2 POP POP PUSH2 0xF62 JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH2 0xF5F DUP5 DUP5 PUSH1 0x0 DUP6 DUP6 PUSH2 0x15BE DUP6 PUSH2 0x15A4 JUMP JUMPDEST PUSH2 0x160F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x164E JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x162F JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x16B0 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x16B5 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x16C5 DUP3 DUP3 DUP7 PUSH2 0x16D0 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x16DF JUMPI POP DUP2 PUSH2 0xF62 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x16EF JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x1213 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x11FB JUMP INVALID GASLIMIT PUSH15 0x756D657261626C655365743A20696E PUSH5 0x6578206F75 PUSH21 0x206F6620626F756E64734552433732313A20747261 PUSH15 0x7366657220746F206E6F6E20455243 CALLDATACOPY ORIGIN BALANCE MSTORE PUSH6 0x636569766572 KECCAK256 PUSH10 0x6D706C656D656E746572 GASLIMIT MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH21 0x72616E7366657220746F20746865207A65726F2061 PUSH5 0x6472657373 GASLIMIT MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH16 0x70657261746F7220717565727920666F PUSH19 0x206E6F6E6578697374656E7420746F6B656E45 MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F76652063616C6C6572206973206E6F74206F PUSH24 0x6E6572206E6F7220617070726F76656420666F7220616C6C GASLIMIT MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH3 0x616C61 PUSH15 0x636520717565727920666F72207468 PUSH6 0x207A65726F20 PUSH2 0x6464 PUSH19 0x6573734552433732313A206F776E6572207175 PUSH6 0x727920666F72 KECCAK256 PUSH15 0x6F6E6578697374656E7420746F6B65 PUSH15 0x456E756D657261626C654D61703A20 PUSH10 0x6E646578206F7574206F PUSH7 0x20626F756E6473 GASLIMIT MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F76656420717565727920666F72206E6F6E65 PUSH25 0x697374656E7420746F6B656E4552433732313A207472616E73 PUSH7 0x6572206F662074 PUSH16 0x6B656E2074686174206973206E6F7420 PUSH16 0x776E4552433732314D65746164617461 GASPRICE KECCAK256 SSTORE MSTORE 0x49 KECCAK256 PUSH18 0x7565727920666F72206E6F6E657869737465 PUSH15 0x7420746F6B656E4552433732313A20 PUSH2 0x7070 PUSH19 0x6F76616C20746F2063757272656E74206F776E PUSH6 0x724552433732 BALANCE GASPRICE KECCAK256 PUSH21 0x72616E736665722063616C6C6572206973206E6F74 KECCAK256 PUSH16 0x776E6572206E6F7220617070726F7665 PUSH5 0xA264697066 PUSH20 0x58221220E15713A483EA2EE40A0AB20A1D884ABC 0xDE 0x4D SWAP8 0x4A LOG1 0xD0 CALLDATACOPY 0xB9 0x24 PUSH11 0xED433BAACDF264736F6C63 NUMBER STOP MOD 0xC STOP CALLER ",
              "sourceMap": "732:16973:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1176:148:6;;;;;;;;;;;;;;;;-1:-1:-1;1176:148:6;-1:-1:-1;;;;;;1176:148:6;;:::i;:::-;;;;;;;;;;;;;;;;;;5113:98:13;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7840:217;;;;;;;;;;;;;;;;-1:-1:-1;7840:217:13;;:::i;:::-;;;;-1:-1:-1;;;;;7840:217:13;;;;;;;;;;;;;;7362:417;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7362:417:13;;;;;;;;:::i;:::-;;6856:208;;;:::i;:::-;;;;;;;;;;;;;;;;8704:300;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8704:300:13;;;;;;;;;;;;;;;;;:::i;6625:160::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;6625:160:13;;;;;;;;:::i;9070:149::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;9070:149:13;;;;;;;;;;;;;;;;;:::i;7136:169::-;;;;;;;;;;;;;;;;-1:-1:-1;7136:169:13;;:::i;4876:175::-;;;;;;;;;;;;;;;;-1:-1:-1;4876:175:13;;:::i;6451:95::-;;;:::i;4601:218::-;;;;;;;;;;;;;;;;-1:-1:-1;4601:218:13;-1:-1:-1;;;;;4601:218:13;;:::i;5275:102::-;;;:::i;8124:290::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8124:290:13;;;;;;;;;;:::i;9285:282::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9285:282:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9285:282:13;;-1:-1:-1;9285:282:13;;-1:-1:-1;;;;;9285:282:13:i;5443:776::-;;;;;;;;;;;;;;;;-1:-1:-1;5443:776:13;;:::i;8480:162::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8480:162:13;;;;;;;;;;:::i;1176:148:6:-;-1:-1:-1;;;;;;1284:33:6;;1261:4;1284:33;;;:20;:33;;;;;;;;1176:148;;;;:::o;5113:98:13:-;5199:5;5192:12;;;;;;;;-1:-1:-1;;5192:12:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5167:13;;5192:12;;5199:5;;5192:12;;5199:5;5192:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5113:98;:::o;7840:217::-;7916:7;7943:16;7951:7;7943;:16::i;:::-;7935:73;;;;-1:-1:-1;;;7935:73:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8026:24:13;;;;:15;:24;;;;;;-1:-1:-1;;;;;8026:24:13;;7840:217::o;7362:417::-;7442:13;7458:34;7484:7;7458:25;:34::i;:::-;7442:50;;7516:5;-1:-1:-1;;;;;7510:11:13;:2;-1:-1:-1;;;;;7510:11:13;;;7502:57;;;;-1:-1:-1;;;7502:57:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7594:5;-1:-1:-1;;;;;7578:21:13;:12;:10;:12::i;:::-;-1:-1:-1;;;;;7578:21:13;;:80;;;;7603:55;7638:5;7645:12;:10;:12::i;:::-;7603:34;:55::i;:::-;7570:170;;;;-1:-1:-1;;;7570:170:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7751:21;7760:2;7764:7;7751:8;:21::i;:::-;7362:417;;;:::o;6856:208::-;6917:7;7036:21;:12;:19;:21::i;:::-;7029:28;;6856:208;:::o;8704:300::-;8863:41;8882:12;:10;:12::i;:::-;8896:7;8863:18;:41::i;:::-;8855:103;;;;-1:-1:-1;;;8855:103:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8969:28;8979:4;8985:2;8989:7;8969:9;:28::i;6625:160::-;-1:-1:-1;;;;;6748:20:13;;6722:7;6748:20;;;:13;:20;;;;;:30;;6772:5;6748:23;:30::i;:::-;6741:37;;6625:160;;;;;:::o;9070:149::-;9173:39;9190:4;9196:2;9200:7;9173:39;;;;;;;;;;;;:16;:39::i;7136:169::-;7211:7;;7252:22;:12;7268:5;7252:15;:22::i;:::-;-1:-1:-1;7230:44:13;7136:169;-1:-1:-1;;;7136:169:13:o;4876:175::-;4948:7;4974:70;4991:7;4974:70;;;;;;;;;;;;;;;;;:12;;:70;:16;:70::i;6451:95::-;6531:8;6524:15;;;;;;;;-1:-1:-1;;6524:15:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6499:13;;6524:15;;6531:8;;6524:15;;6531:8;6524:15;;;;;;;;;;;;;;;;;;;;;;;;4601:218;4673:7;-1:-1:-1;;;;;4700:19:13;;4692:74;;;;-1:-1:-1;;;4692:74:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4783:20:13;;;;;;:13;:20;;;;;:29;;:27;:29::i;5275:102::-;5363:7;5356:14;;;;;;;;-1:-1:-1;;5356:14:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5331:13;;5356:14;;5363:7;;5356:14;;5363:7;5356:14;;;;;;;;;;;;;;;;;;;;;;;;8124:290;8238:12;:10;:12::i;:::-;-1:-1:-1;;;;;8226:24:13;:8;-1:-1:-1;;;;;8226:24:13;;;8218:62;;;;;-1:-1:-1;;;8218:62:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;8336:8;8291:18;:32;8310:12;:10;:12::i;:::-;-1:-1:-1;;;;;8291:32:13;;;;;;;;;;;;;;;;;-1:-1:-1;8291:32:13;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;8291:53:13;;;;;;;;;;;8374:12;:10;:12::i;:::-;-1:-1:-1;;;;;8359:48:13;;8398:8;8359:48;;;;;;;;;;;;;;;;;;;;8124:290;;:::o;9285:282::-;9416:41;9435:12;:10;:12::i;:::-;9449:7;9416:18;:41::i;:::-;9408:103;;;;-1:-1:-1;;;9408:103:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9521:39;9535:4;9541:2;9545:7;9554:5;9521:13;:39::i;:::-;9285:282;;;;:::o;5443:776::-;5516:13;5549:16;5557:7;5549;:16::i;:::-;5541:76;;;;-1:-1:-1;;;5541:76:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5654:19;;;;:10;:19;;;;;;;;;5628:45;;;;;;-1:-1:-1;;5628:45:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;;:45;;;5654:19;5628:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5683:18;5704:9;:7;:9::i;:::-;5683:30;;5792:4;5786:18;5808:1;5786:23;5782:70;;;-1:-1:-1;5832:9:13;-1:-1:-1;5825:16:13;;5782:70;5954:23;;:27;5950:106;;6028:4;6034:9;6011:33;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6011:33:13;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6011:33:13;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6011:33:13;;;;;;;;;;;;;-1:-1:-1;;6011:33:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5997:48;;;;;;5950:106;6186:4;6192:18;:7;:16;:18::i;:::-;6169:42;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6169:42:13;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6169:42:13;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6169:42:13;;;;;;;;;;;;;-1:-1:-1;;6169:42:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6155:57;;;;5443:776;;;:::o;8480:162::-;-1:-1:-1;;;;;8600:25:13;;;8577:4;8600:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;8480:162::o;11001:125::-;11066:4;11089:30;:12;11111:7;11089:21;:30::i;828:104:19:-;915:10;828:104;:::o;16792:191:13:-;16857:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;16857:29:13;-1:-1:-1;;;;;16857:29:13;;;;;;;;:24;;16910:34;16857:24;16910:25;:34::i;:::-;-1:-1:-1;;;;;16901:57:13;;;;;;;;;;;16792:191;;:::o;7831:121:21:-;7900:7;7926:19;7934:3;7926:7;:19::i;11284:373:13:-;11377:4;11401:16;11409:7;11401;:16::i;:::-;11393:73;;;;-1:-1:-1;;;11393:73:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11476:13;11492:34;11518:7;11492:25;:34::i;:::-;11476:50;;11555:5;-1:-1:-1;;;;;11544:16:13;:7;-1:-1:-1;;;;;11544:16:13;;:51;;;;11588:7;-1:-1:-1;;;;;11564:31:13;:20;11576:7;11564:11;:20::i;:::-;-1:-1:-1;;;;;11564:31:13;;11544:51;:105;;;;11599:50;11634:5;11641:7;11599:34;:50::i;:::-;11536:114;11284:373;-1:-1:-1;;;;11284:373:13:o;14358:595::-;14493:4;-1:-1:-1;;;;;14455:42:13;:34;14481:7;14455:25;:34::i;:::-;-1:-1:-1;;;;;14455:42:13;;14447:96;;;;-1:-1:-1;;;14447:96:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14579:16:13;;14571:65;;;;-1:-1:-1;;;14571:65:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14647:39;14668:4;14674:2;14678:7;14647:20;:39::i;:::-;14748:29;14765:1;14769:7;14748:8;:29::i;:::-;-1:-1:-1;;;;;14788:19:13;;;;;;:13;:19;;;;;:35;;14815:7;14788:26;:35::i;:::-;-1:-1:-1;;;;;;14833:17:13;;;;;;:13;:17;;;;;:30;;14855:7;14833:21;:30::i;:::-;-1:-1:-1;14874:29:13;:12;14891:7;14900:2;14874:16;:29::i;:::-;;14938:7;14934:2;-1:-1:-1;;;;;14919:27:13;14928:4;-1:-1:-1;;;;;14919:27:13;;;;;;;;;;;14358:595;;;:::o;9261:135:22:-;9332:7;9366:22;9370:3;9382:5;9366:3;:22::i;8280:233:21:-;8360:7;;;;8419:22;8423:3;8435:5;8419:3;:22::i;:::-;8388:53;;;;-1:-1:-1;8280:233:21;-1:-1:-1;;;;;8280:233:21:o;9533:211::-;9640:7;9690:44;9695:3;9715;9721:12;9690:4;:44::i;:::-;9682:53;-1:-1:-1;9533:211:21;;;;;;:::o;10429:269:13:-;10542:28;10552:4;10558:2;10562:7;10542:9;:28::i;:::-;10588:48;10611:4;10617:2;10621:7;10630:5;10588:22;:48::i;:::-;10580:111;;;;-1:-1:-1;;;10580:111:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;221:725:25;277:13;494:10;490:51;;-1:-1:-1;520:10:25;;;;;;;;;;;;-1:-1:-1;;;520:10:25;;;;;;490:51;565:5;550:12;604:75;611:9;;604:75;;636:8;;666:2;658:10;;;;604:75;;;688:19;720:6;710:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;710:17:25;-1:-1:-1;780:5:25;;-1:-1:-1;688:39:25;-1:-1:-1;;;753:10:25;;795:114;802:9;;795:114;;870:2;863:4;:9;858:2;:14;845:29;;827:6;834:7;;;;;;;827:15;;;;;;;;;;;:47;-1:-1:-1;;;;;827:47:25;;;;;;;;-1:-1:-1;896:2:25;888:10;;;;795:114;;;-1:-1:-1;932:6:25;221:725;-1:-1:-1;;;;221:725:25:o;7599:149:21:-;7683:4;7706:35;7716:3;7736;7706:9;:35::i;4502:108::-;4584:19;;4502:108::o;8376:135:22:-;8446:4;8469:35;8477:3;8497:5;8469:7;:35::i;8079:129::-;8146:4;8169:32;8174:3;8194:5;8169:4;:32::i;7038:183:21:-;7127:4;7150:64;7155:3;7175;-1:-1:-1;;;;;7189:23:21;;7150:4;:64::i;4463:201:22:-;4557:18;;4530:7;;4557:26;-1:-1:-1;4549:73:22;;;;-1:-1:-1;;;4549:73:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4639:3;:11;;4651:5;4639:18;;;;;;;;;;;;;;;;4632:25;;4463:201;;;;:::o;4953:274:21:-;5056:19;;5020:7;;;;5056:27;-1:-1:-1;5048:74:21;;;;-1:-1:-1;;;5048:74:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5133:22;5158:3;:12;;5171:5;5158:19;;;;;;;;;;;;;;;;;;5133:44;;5195:5;:10;;;5207:5;:12;;;5187:33;;;;;4953:274;;;;;:::o;6414:315::-;6508:7;6546:17;;;:12;;;:17;;;;;;6596:12;6581:13;6573:36;;;;-1:-1:-1;;;6573:36:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6662:3;:12;;6686:1;6675:8;:12;6662:26;;;;;;;;;;;;;;;;;;:33;;;6655:40;;;6414:315;;;;;:::o;16186:600:13:-;16306:4;16331:15;:2;-1:-1:-1;;;;;16331:13:13;;:15::i;:::-;16326:58;;-1:-1:-1;16369:4:13;16362:11;;16326:58;16393:23;16419:257;-1:-1:-1;;;16541:12:13;:10;:12::i;:::-;16567:4;16585:7;16606:5;16435:186;;;;;;-1:-1:-1;;;;;16435:186:13;;;;;;-1:-1:-1;;;;;16435:186:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16435:186:13;;;;;;;-1:-1:-1;;;;;16435:186:13;;;;;;;;;;;16419:257;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16419:15:13;;;:257;:15;:257::i;:::-;16393:283;;16686:13;16713:10;16702:32;;;;;;;;;;;;;;;-1:-1:-1;16702:32:13;-1:-1:-1;;;;;;16752:26:13;-1:-1:-1;;;16752:26:13;;-1:-1:-1;;;16186:600:13;;;;;;:::o;4289:123:21:-;4360:4;4383:17;;;:12;;;;;:17;;;;;;:22;;;4289:123::o;2223:1512:22:-;2289:4;2426:19;;;:12;;;:19;;;;;;2460:15;;2456:1273;;2889:18;;-1:-1:-1;;2841:14:22;;;;2889:22;;;;2817:21;;2889:3;;:22;;3171;;;;;;;;;;;;;;3151:42;;3314:9;3285:3;:11;;3297:13;3285:26;;;;;;;;;;;;;;;;;;;:38;;;;3389:23;;;3431:1;3389:12;;;:23;;;;;;3415:17;;;3389:43;;3538:17;;3389:3;;3538:17;;;;;;;;;;;;;;;;;;;;;;3630:3;:12;;:19;3643:5;3630:19;;;;;;;;;;;3623:26;;;3671:4;3664:11;;;;;;;;2456:1273;3713:5;3706:12;;;;;1651:404;1714:4;1735:21;1745:3;1750:5;1735:9;:21::i;:::-;1730:319;;-1:-1:-1;1772:23:22;;;;;;;;:11;:23;;;;;;;;;;;;;1952:18;;1930:19;;;:12;;;:19;;;;;;:40;;;;1984:11;;1730:319;-1:-1:-1;2033:5:22;2026:12;;1847:678:21;1923:4;2056:17;;;:12;;;:17;;;;;;2088:13;2084:435;;-1:-1:-1;;2172:38:21;;;;;;;;;;;;;;;;;;2154:57;;;;;;;;:12;:57;;;;;;;;;;;;;;;;;;;;;;;;2366:19;;2346:17;;;:12;;;:17;;;;;;;:39;2399:11;;2084:435;2477:5;2441:3;:12;;2465:1;2454:8;:12;2441:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;2503:5;2496:12;;;;;737:413:18;1097:20;1135:8;;;737:413::o;3592:193::-;3695:12;3726:52;3748:6;3756:4;3762:1;3765:12;3695;4869:18;4880:6;4869:10;:18::i;:::-;4861:60;;;;;-1:-1:-1;;;4861:60:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;4992:12;5006:23;5033:6;-1:-1:-1;;;;;5033:11:18;5053:5;5061:4;5033:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5033:33:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4991:75;;;;5083:52;5101:7;5110:10;5122:12;5083:17;:52::i;:::-;5076:59;4619:523;-1:-1:-1;;;;;;;4619:523:18:o;6122:725::-;6237:12;6265:7;6261:580;;;-1:-1:-1;6295:10:18;6288:17;;6261:580;6406:17;;:21;6402:429;;6664:10;6658:17;6724:15;6711:10;6707:2;6703:19;6696:44;6613:145;6796:20;;-1:-1:-1;;;6796:20:18;;;;;;;;;;;;;;;;;6803:12;;6796:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "1309400",
                "executionCost": "1363",
                "totalCost": "1310763"
              },
              "external": {
                "approve(address,uint256)": "infinite",
                "balanceOf(address)": "infinite",
                "baseURI()": "infinite",
                "getApproved(uint256)": "infinite",
                "isApprovedForAll(address,address)": "1372",
                "name()": "infinite",
                "ownerOf(uint256)": "infinite",
                "safeTransferFrom(address,address,uint256)": "infinite",
                "safeTransferFrom(address,address,uint256,bytes)": "infinite",
                "setApprovalForAll(address,bool)": "infinite",
                "supportsInterface(bytes4)": "1193",
                "symbol()": "infinite",
                "tokenByIndex(uint256)": "infinite",
                "tokenOfOwnerByIndex(address,uint256)": "infinite",
                "tokenURI(uint256)": "infinite",
                "totalSupply()": "1096",
                "transferFrom(address,address,uint256)": "infinite"
              },
              "internal": {
                "__ERC721_init(string memory,string memory)": "infinite",
                "__ERC721_init_unchained(string memory,string memory)": "infinite",
                "_approve(address,uint256)": "infinite",
                "_beforeTokenTransfer(address,address,uint256)": "infinite",
                "_burn(uint256)": "infinite",
                "_checkOnERC721Received(address,address,uint256,bytes memory)": "infinite",
                "_exists(uint256)": "infinite",
                "_isApprovedOrOwner(address,uint256)": "infinite",
                "_mint(address,uint256)": "infinite",
                "_safeMint(address,uint256)": "infinite",
                "_safeMint(address,uint256,bytes memory)": "infinite",
                "_safeTransfer(address,address,uint256,bytes memory)": "infinite",
                "_setBaseURI(string memory)": "infinite",
                "_setTokenURI(uint256,string memory)": "infinite",
                "_transfer(address,address,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {
              "approve(address,uint256)": "095ea7b3",
              "balanceOf(address)": "70a08231",
              "baseURI()": "6c0360eb",
              "getApproved(uint256)": "081812fc",
              "isApprovedForAll(address,address)": "e985e9c5",
              "name()": "06fdde03",
              "ownerOf(uint256)": "6352211e",
              "safeTransferFrom(address,address,uint256)": "42842e0e",
              "safeTransferFrom(address,address,uint256,bytes)": "b88d4fde",
              "setApprovalForAll(address,bool)": "a22cb465",
              "supportsInterface(bytes4)": "01ffc9a7",
              "symbol()": "95d89b41",
              "tokenByIndex(uint256)": "4f6ccce7",
              "tokenOfOwnerByIndex(address,uint256)": "2f745c59",
              "tokenURI(uint256)": "c87b56dd",
              "totalSupply()": "18160ddd",
              "transferFrom(address,address,uint256)": "23b872dd"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenOfOwnerByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"see https://eips.ethereum.org/EIPS/eip-721\",\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"baseURI()\":{\"details\":\"Returns the base URI set via {_setBaseURI}. This will be automatically added as a prefix in {tokenURI} to each token's URI, or to the token ID if no specific URI is set for that token ID.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}. Time complexity O(1), guaranteed to always use less than 30 000 gas.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenByIndex(uint256)\":{\"details\":\"See {IERC721Enumerable-tokenByIndex}.\"},\"tokenOfOwnerByIndex(address,uint256)\":{\"details\":\"See {IERC721Enumerable-tokenOfOwnerByIndex}.\"},\"tokenURI(uint256)\":{\"details\":\"See {IERC721Metadata-tokenURI}.\"},\"totalSupply()\":{\"details\":\"See {IERC721Enumerable-totalSupply}.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"}},\"title\":\"ERC721 Non-Fungible Token Standard basic implementation\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\":\"ERC721Upgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/introspection/ERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC165Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts may inherit from this and call {_registerInterface} to declare\\n * their support of an interface.\\n */\\nabstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Mapping of interface ids to whether or not it's supported.\\n     */\\n    mapping(bytes4 => bool) private _supportedInterfaces;\\n\\n    function __ERC165_init() internal initializer {\\n        __ERC165_init_unchained();\\n    }\\n\\n    function __ERC165_init_unchained() internal initializer {\\n        // Derived contracts need only register support for their own interfaces,\\n        // we register support for ERC165 itself here\\n        _registerInterface(_INTERFACE_ID_ERC165);\\n    }\\n\\n    /**\\n     * @dev See {IERC165-supportsInterface}.\\n     *\\n     * Time complexity O(1), guaranteed to always use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n        return _supportedInterfaces[interfaceId];\\n    }\\n\\n    /**\\n     * @dev Registers the contract as an implementer of the interface defined by\\n     * `interfaceId`. Support of the actual ERC165 interface is automatic and\\n     * registering its interface id is not required.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * Requirements:\\n     *\\n     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).\\n     */\\n    function _registerInterface(bytes4 interfaceId) internal virtual {\\n        require(interfaceId != 0xffffffff, \\\"ERC165: invalid interface id\\\");\\n        _supportedInterfaces[interfaceId] = true;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xc6dbbc2f50a7c104377798a37b2acd1a41c1242544b0bb7a9a7c863f0520eb50\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC721Upgradeable.sol\\\";\\nimport \\\"./IERC721MetadataUpgradeable.sol\\\";\\nimport \\\"./IERC721EnumerableUpgradeable.sol\\\";\\nimport \\\"./IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"../../introspection/ERC165Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/EnumerableSetUpgradeable.sol\\\";\\nimport \\\"../../utils/EnumerableMapUpgradeable.sol\\\";\\nimport \\\"../../utils/StringsUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @title ERC721 Non-Fungible Token Standard basic implementation\\n * @dev see https://eips.ethereum.org/EIPS/eip-721\\n */\\ncontract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable, IERC721EnumerableUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n    using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet;\\n    using EnumerableMapUpgradeable for EnumerableMapUpgradeable.UintToAddressMap;\\n    using StringsUpgradeable for uint256;\\n\\n    // Equals to `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))`\\n    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`\\n    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;\\n\\n    // Mapping from holder address to their (enumerable) set of owned tokens\\n    mapping (address => EnumerableSetUpgradeable.UintSet) private _holderTokens;\\n\\n    // Enumerable mapping from token ids to their owners\\n    EnumerableMapUpgradeable.UintToAddressMap private _tokenOwners;\\n\\n    // Mapping from token ID to approved address\\n    mapping (uint256 => address) private _tokenApprovals;\\n\\n    // Mapping from owner to operator approvals\\n    mapping (address => mapping (address => bool)) private _operatorApprovals;\\n\\n    // Token name\\n    string private _name;\\n\\n    // Token symbol\\n    string private _symbol;\\n\\n    // Optional mapping for token URIs\\n    mapping (uint256 => string) private _tokenURIs;\\n\\n    // Base URI\\n    string private _baseURI;\\n\\n    /*\\n     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231\\n     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e\\n     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3\\n     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc\\n     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465\\n     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5\\n     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd\\n     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e\\n     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde\\n     *\\n     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^\\n     *        0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;\\n\\n    /*\\n     *     bytes4(keccak256('name()')) == 0x06fdde03\\n     *     bytes4(keccak256('symbol()')) == 0x95d89b41\\n     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd\\n     *\\n     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;\\n\\n    /*\\n     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd\\n     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59\\n     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7\\n     *\\n     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;\\n\\n    /**\\n     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\\n     */\\n    function __ERC721_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC165_init_unchained();\\n        __ERC721_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC721_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n\\n        // register the supported interfaces to conform to ERC721 via ERC165\\n        _registerInterface(_INTERFACE_ID_ERC721);\\n        _registerInterface(_INTERFACE_ID_ERC721_METADATA);\\n        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);\\n    }\\n\\n    /**\\n     * @dev See {IERC721-balanceOf}.\\n     */\\n    function balanceOf(address owner) public view virtual override returns (uint256) {\\n        require(owner != address(0), \\\"ERC721: balance query for the zero address\\\");\\n        return _holderTokens[owner].length();\\n    }\\n\\n    /**\\n     * @dev See {IERC721-ownerOf}.\\n     */\\n    function ownerOf(uint256 tokenId) public view virtual override returns (address) {\\n        return _tokenOwners.get(tokenId, \\\"ERC721: owner query for nonexistent token\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC721Metadata-name}.\\n     */\\n    function name() public view virtual override returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev See {IERC721Metadata-symbol}.\\n     */\\n    function symbol() public view virtual override returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev See {IERC721Metadata-tokenURI}.\\n     */\\n    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\\n        require(_exists(tokenId), \\\"ERC721Metadata: URI query for nonexistent token\\\");\\n\\n        string memory _tokenURI = _tokenURIs[tokenId];\\n        string memory base = baseURI();\\n\\n        // If there is no base URI, return the token URI.\\n        if (bytes(base).length == 0) {\\n            return _tokenURI;\\n        }\\n        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).\\n        if (bytes(_tokenURI).length > 0) {\\n            return string(abi.encodePacked(base, _tokenURI));\\n        }\\n        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.\\n        return string(abi.encodePacked(base, tokenId.toString()));\\n    }\\n\\n    /**\\n    * @dev Returns the base URI set via {_setBaseURI}. This will be\\n    * automatically added as a prefix in {tokenURI} to each token's URI, or\\n    * to the token ID if no specific URI is set for that token ID.\\n    */\\n    function baseURI() public view virtual returns (string memory) {\\n        return _baseURI;\\n    }\\n\\n    /**\\n     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.\\n     */\\n    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {\\n        return _holderTokens[owner].at(index);\\n    }\\n\\n    /**\\n     * @dev See {IERC721Enumerable-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds\\n        return _tokenOwners.length();\\n    }\\n\\n    /**\\n     * @dev See {IERC721Enumerable-tokenByIndex}.\\n     */\\n    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {\\n        (uint256 tokenId, ) = _tokenOwners.at(index);\\n        return tokenId;\\n    }\\n\\n    /**\\n     * @dev See {IERC721-approve}.\\n     */\\n    function approve(address to, uint256 tokenId) public virtual override {\\n        address owner = ERC721Upgradeable.ownerOf(tokenId);\\n        require(to != owner, \\\"ERC721: approval to current owner\\\");\\n\\n        require(_msgSender() == owner || ERC721Upgradeable.isApprovedForAll(owner, _msgSender()),\\n            \\\"ERC721: approve caller is not owner nor approved for all\\\"\\n        );\\n\\n        _approve(to, tokenId);\\n    }\\n\\n    /**\\n     * @dev See {IERC721-getApproved}.\\n     */\\n    function getApproved(uint256 tokenId) public view virtual override returns (address) {\\n        require(_exists(tokenId), \\\"ERC721: approved query for nonexistent token\\\");\\n\\n        return _tokenApprovals[tokenId];\\n    }\\n\\n    /**\\n     * @dev See {IERC721-setApprovalForAll}.\\n     */\\n    function setApprovalForAll(address operator, bool approved) public virtual override {\\n        require(operator != _msgSender(), \\\"ERC721: approve to caller\\\");\\n\\n        _operatorApprovals[_msgSender()][operator] = approved;\\n        emit ApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /**\\n     * @dev See {IERC721-isApprovedForAll}.\\n     */\\n    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\\n        return _operatorApprovals[owner][operator];\\n    }\\n\\n    /**\\n     * @dev See {IERC721-transferFrom}.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) public virtual override {\\n        //solhint-disable-next-line max-line-length\\n        require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: transfer caller is not owner nor approved\\\");\\n\\n        _transfer(from, to, tokenId);\\n    }\\n\\n    /**\\n     * @dev See {IERC721-safeTransferFrom}.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {\\n        safeTransferFrom(from, to, tokenId, \\\"\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC721-safeTransferFrom}.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {\\n        require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: transfer caller is not owner nor approved\\\");\\n        _safeTransfer(from, to, tokenId, _data);\\n    }\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * `_data` is additional data, it has no specified format and it is sent in call to `to`.\\n     *\\n     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\\n     * implement alternative mechanisms to perform token transfer, such as signature-based.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {\\n        _transfer(from, to, tokenId);\\n        require(_checkOnERC721Received(from, to, tokenId, _data), \\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n    }\\n\\n    /**\\n     * @dev Returns whether `tokenId` exists.\\n     *\\n     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\\n     *\\n     * Tokens start existing when they are minted (`_mint`),\\n     * and stop existing when they are burned (`_burn`).\\n     */\\n    function _exists(uint256 tokenId) internal view virtual returns (bool) {\\n        return _tokenOwners.contains(tokenId);\\n    }\\n\\n    /**\\n     * @dev Returns whether `spender` is allowed to manage `tokenId`.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\\n        require(_exists(tokenId), \\\"ERC721: operator query for nonexistent token\\\");\\n        address owner = ERC721Upgradeable.ownerOf(tokenId);\\n        return (spender == owner || getApproved(tokenId) == spender || ERC721Upgradeable.isApprovedForAll(owner, spender));\\n    }\\n\\n    /**\\n     * @dev Safely mints `tokenId` and transfers it to `to`.\\n     *\\n     * Requirements:\\n     d*\\n     * - `tokenId` must not exist.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function _safeMint(address to, uint256 tokenId) internal virtual {\\n        _safeMint(to, tokenId, \\\"\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\\n     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\\n     */\\n    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {\\n        _mint(to, tokenId);\\n        require(_checkOnERC721Received(address(0), to, tokenId, _data), \\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n    }\\n\\n    /**\\n     * @dev Mints `tokenId` and transfers it to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must not exist.\\n     * - `to` cannot be the zero address.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function _mint(address to, uint256 tokenId) internal virtual {\\n        require(to != address(0), \\\"ERC721: mint to the zero address\\\");\\n        require(!_exists(tokenId), \\\"ERC721: token already minted\\\");\\n\\n        _beforeTokenTransfer(address(0), to, tokenId);\\n\\n        _holderTokens[to].add(tokenId);\\n\\n        _tokenOwners.set(tokenId, to);\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /**\\n     * @dev Destroys `tokenId`.\\n     * The approval is cleared when the token is burned.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function _burn(uint256 tokenId) internal virtual {\\n        address owner = ERC721Upgradeable.ownerOf(tokenId); // internal owner\\n\\n        _beforeTokenTransfer(owner, address(0), tokenId);\\n\\n        // Clear approvals\\n        _approve(address(0), tokenId);\\n\\n        // Clear metadata (if any)\\n        if (bytes(_tokenURIs[tokenId]).length != 0) {\\n            delete _tokenURIs[tokenId];\\n        }\\n\\n        _holderTokens[owner].remove(tokenId);\\n\\n        _tokenOwners.remove(tokenId);\\n\\n        emit Transfer(owner, address(0), tokenId);\\n    }\\n\\n    /**\\n     * @dev Transfers `tokenId` from `from` to `to`.\\n     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function _transfer(address from, address to, uint256 tokenId) internal virtual {\\n        require(ERC721Upgradeable.ownerOf(tokenId) == from, \\\"ERC721: transfer of token that is not own\\\"); // internal owner\\n        require(to != address(0), \\\"ERC721: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(from, to, tokenId);\\n\\n        // Clear approvals from the previous owner\\n        _approve(address(0), tokenId);\\n\\n        _holderTokens[from].remove(tokenId);\\n        _holderTokens[to].add(tokenId);\\n\\n        _tokenOwners.set(tokenId, to);\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /**\\n     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {\\n        require(_exists(tokenId), \\\"ERC721Metadata: URI set of nonexistent token\\\");\\n        _tokenURIs[tokenId] = _tokenURI;\\n    }\\n\\n    /**\\n     * @dev Internal function to set the base URI for all token IDs. It is\\n     * automatically added as a prefix to the value returned in {tokenURI},\\n     * or to the token ID if {tokenURI} is empty.\\n     */\\n    function _setBaseURI(string memory baseURI_) internal virtual {\\n        _baseURI = baseURI_;\\n    }\\n\\n    /**\\n     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\\n     * The call is not executed if the target address is not a contract.\\n     *\\n     * @param from address representing the previous owner of the given token ID\\n     * @param to target address that will receive the tokens\\n     * @param tokenId uint256 ID of the token to be transferred\\n     * @param _data bytes optional data to send along with the call\\n     * @return bool whether the call correctly returned the expected magic value\\n     */\\n    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)\\n        private returns (bool)\\n    {\\n        if (!to.isContract()) {\\n            return true;\\n        }\\n        bytes memory returndata = to.functionCall(abi.encodeWithSelector(\\n            IERC721ReceiverUpgradeable(to).onERC721Received.selector,\\n            _msgSender(),\\n            from,\\n            tokenId,\\n            _data\\n        ), \\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n        bytes4 retval = abi.decode(returndata, (bytes4));\\n        return (retval == _ERC721_RECEIVED);\\n    }\\n\\n    function _approve(address to, uint256 tokenId) private {\\n        _tokenApprovals[tokenId] = to;\\n        emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId); // internal owner\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any token transfer. This includes minting\\n     * and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be\\n     * transferred to `to`.\\n     * - When `from` is zero, `tokenId` will be minted for `to`.\\n     * - When `to` is zero, ``from``'s `tokenId` will be burned.\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }\\n    uint256[41] private __gap;\\n}\\n\",\"keccak256\":\"0xcb44c1beb756a22dee4756a0d4d0ad21c2e811dcd39de9190797d0bda4433459\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721EnumerableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"./IERC721Upgradeable.sol\\\";\\n\\n/**\\n * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\n */\\ninterface IERC721EnumerableUpgradeable is IERC721Upgradeable {\\n\\n    /**\\n     * @dev Returns the total amount of tokens stored by the contract.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.\\n     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.\\n     */\\n    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);\\n\\n    /**\\n     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.\\n     * Use along with {totalSupply} to enumerate all tokens.\\n     */\\n    function tokenByIndex(uint256 index) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x529f3ab127aace61d7d47f3df7a6a2c42dc79bbb3a0ca459d6a861f33698aee6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721MetadataUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"./IERC721Upgradeable.sol\\\";\\n\\n/**\\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\n */\\ninterface IERC721MetadataUpgradeable is IERC721Upgradeable {\\n\\n    /**\\n     * @dev Returns the token collection name.\\n     */\\n    function name() external view returns (string memory);\\n\\n    /**\\n     * @dev Returns the token collection symbol.\\n     */\\n    function symbol() external view returns (string memory);\\n\\n    /**\\n     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\\n     */\\n    function tokenURI(uint256 tokenId) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0xa981b1f67f60771c18d39e21bad0a2f0f952e2c3faa90b45b982060fc14ee2bd\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/EnumerableMapUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Library for managing an enumerable variant of Solidity's\\n * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]\\n * type.\\n *\\n * Maps have the following properties:\\n *\\n * - Entries are added, removed, and checked for existence in constant time\\n * (O(1)).\\n * - Entries are enumerated in O(n). No guarantees are made on the ordering.\\n *\\n * ```\\n * contract Example {\\n *     // Add the library methods\\n *     using EnumerableMap for EnumerableMap.UintToAddressMap;\\n *\\n *     // Declare a set state variable\\n *     EnumerableMap.UintToAddressMap private myMap;\\n * }\\n * ```\\n *\\n * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are\\n * supported.\\n */\\nlibrary EnumerableMapUpgradeable {\\n    // To implement this library for multiple types with as little code\\n    // repetition as possible, we write it in terms of a generic Map type with\\n    // bytes32 keys and values.\\n    // The Map implementation uses private functions, and user-facing\\n    // implementations (such as Uint256ToAddressMap) are just wrappers around\\n    // the underlying Map.\\n    // This means that we can only create new EnumerableMaps for types that fit\\n    // in bytes32.\\n\\n    struct MapEntry {\\n        bytes32 _key;\\n        bytes32 _value;\\n    }\\n\\n    struct Map {\\n        // Storage of map keys and values\\n        MapEntry[] _entries;\\n\\n        // Position of the entry defined by a key in the `entries` array, plus 1\\n        // because index 0 means a key is not in the map.\\n        mapping (bytes32 => uint256) _indexes;\\n    }\\n\\n    /**\\n     * @dev Adds a key-value pair to a map, or updates the value for an existing\\n     * key. O(1).\\n     *\\n     * Returns true if the key was added to the map, that is if it was not\\n     * already present.\\n     */\\n    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {\\n        // We read and store the key's index to prevent multiple reads from the same storage slot\\n        uint256 keyIndex = map._indexes[key];\\n\\n        if (keyIndex == 0) { // Equivalent to !contains(map, key)\\n            map._entries.push(MapEntry({ _key: key, _value: value }));\\n            // The entry is stored at length-1, but we add 1 to all indexes\\n            // and use 0 as a sentinel value\\n            map._indexes[key] = map._entries.length;\\n            return true;\\n        } else {\\n            map._entries[keyIndex - 1]._value = value;\\n            return false;\\n        }\\n    }\\n\\n    /**\\n     * @dev Removes a key-value pair from a map. O(1).\\n     *\\n     * Returns true if the key was removed from the map, that is if it was present.\\n     */\\n    function _remove(Map storage map, bytes32 key) private returns (bool) {\\n        // We read and store the key's index to prevent multiple reads from the same storage slot\\n        uint256 keyIndex = map._indexes[key];\\n\\n        if (keyIndex != 0) { // Equivalent to contains(map, key)\\n            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one\\n            // in the array, and then remove the last entry (sometimes called as 'swap and pop').\\n            // This modifies the order of the array, as noted in {at}.\\n\\n            uint256 toDeleteIndex = keyIndex - 1;\\n            uint256 lastIndex = map._entries.length - 1;\\n\\n            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs\\n            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.\\n\\n            MapEntry storage lastEntry = map._entries[lastIndex];\\n\\n            // Move the last entry to the index where the entry to delete is\\n            map._entries[toDeleteIndex] = lastEntry;\\n            // Update the index for the moved entry\\n            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based\\n\\n            // Delete the slot where the moved entry was stored\\n            map._entries.pop();\\n\\n            // Delete the index for the deleted slot\\n            delete map._indexes[key];\\n\\n            return true;\\n        } else {\\n            return false;\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns true if the key is in the map. O(1).\\n     */\\n    function _contains(Map storage map, bytes32 key) private view returns (bool) {\\n        return map._indexes[key] != 0;\\n    }\\n\\n    /**\\n     * @dev Returns the number of key-value pairs in the map. O(1).\\n     */\\n    function _length(Map storage map) private view returns (uint256) {\\n        return map._entries.length;\\n    }\\n\\n   /**\\n    * @dev Returns the key-value pair stored at position `index` in the map. O(1).\\n    *\\n    * Note that there are no guarantees on the ordering of entries inside the\\n    * array, and it may change when more entries are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {\\n        require(map._entries.length > index, \\\"EnumerableMap: index out of bounds\\\");\\n\\n        MapEntry storage entry = map._entries[index];\\n        return (entry._key, entry._value);\\n    }\\n\\n    /**\\n     * @dev Tries to returns the value associated with `key`.  O(1).\\n     * Does not revert if `key` is not in the map.\\n     */\\n    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {\\n        uint256 keyIndex = map._indexes[key];\\n        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)\\n        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based\\n    }\\n\\n    /**\\n     * @dev Returns the value associated with `key`.  O(1).\\n     *\\n     * Requirements:\\n     *\\n     * - `key` must be in the map.\\n     */\\n    function _get(Map storage map, bytes32 key) private view returns (bytes32) {\\n        uint256 keyIndex = map._indexes[key];\\n        require(keyIndex != 0, \\\"EnumerableMap: nonexistent key\\\"); // Equivalent to contains(map, key)\\n        return map._entries[keyIndex - 1]._value; // All indexes are 1-based\\n    }\\n\\n    /**\\n     * @dev Same as {_get}, with a custom error message when `key` is not in the map.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {_tryGet}.\\n     */\\n    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {\\n        uint256 keyIndex = map._indexes[key];\\n        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)\\n        return map._entries[keyIndex - 1]._value; // All indexes are 1-based\\n    }\\n\\n    // UintToAddressMap\\n\\n    struct UintToAddressMap {\\n        Map _inner;\\n    }\\n\\n    /**\\n     * @dev Adds a key-value pair to a map, or updates the value for an existing\\n     * key. O(1).\\n     *\\n     * Returns true if the key was added to the map, that is if it was not\\n     * already present.\\n     */\\n    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {\\n        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the key was removed from the map, that is if it was present.\\n     */\\n    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {\\n        return _remove(map._inner, bytes32(key));\\n    }\\n\\n    /**\\n     * @dev Returns true if the key is in the map. O(1).\\n     */\\n    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {\\n        return _contains(map._inner, bytes32(key));\\n    }\\n\\n    /**\\n     * @dev Returns the number of elements in the map. O(1).\\n     */\\n    function length(UintToAddressMap storage map) internal view returns (uint256) {\\n        return _length(map._inner);\\n    }\\n\\n   /**\\n    * @dev Returns the element stored at position `index` in the set. O(1).\\n    * Note that there are no guarantees on the ordering of values inside the\\n    * array, and it may change when more values are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {\\n        (bytes32 key, bytes32 value) = _at(map._inner, index);\\n        return (uint256(key), address(uint160(uint256(value))));\\n    }\\n\\n    /**\\n     * @dev Tries to returns the value associated with `key`.  O(1).\\n     * Does not revert if `key` is not in the map.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {\\n        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));\\n        return (success, address(uint160(uint256(value))));\\n    }\\n\\n    /**\\n     * @dev Returns the value associated with `key`.  O(1).\\n     *\\n     * Requirements:\\n     *\\n     * - `key` must be in the map.\\n     */\\n    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {\\n        return address(uint160(uint256(_get(map._inner, bytes32(key)))));\\n    }\\n\\n    /**\\n     * @dev Same as {get}, with a custom error message when `key` is not in the map.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryGet}.\\n     */\\n    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {\\n        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));\\n    }\\n}\\n\",\"keccak256\":\"0x6a8e34d051fc71ce49a8a47d050c5b7e77909008c6be7d6780ee9ed87d2d3797\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/EnumerableSetUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Library for managing\\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\\n * types.\\n *\\n * Sets have the following properties:\\n *\\n * - Elements are added, removed, and checked for existence in constant time\\n * (O(1)).\\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\\n *\\n * ```\\n * contract Example {\\n *     // Add the library methods\\n *     using EnumerableSet for EnumerableSet.AddressSet;\\n *\\n *     // Declare a set state variable\\n *     EnumerableSet.AddressSet private mySet;\\n * }\\n * ```\\n *\\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\\n * and `uint256` (`UintSet`) are supported.\\n */\\nlibrary EnumerableSetUpgradeable {\\n    // To implement this library for multiple types with as little code\\n    // repetition as possible, we write it in terms of a generic Set type with\\n    // bytes32 values.\\n    // The Set implementation uses private functions, and user-facing\\n    // implementations (such as AddressSet) are just wrappers around the\\n    // underlying Set.\\n    // This means that we can only create new EnumerableSets for types that fit\\n    // in bytes32.\\n\\n    struct Set {\\n        // Storage of set values\\n        bytes32[] _values;\\n\\n        // Position of the value in the `values` array, plus 1 because index 0\\n        // means a value is not in the set.\\n        mapping (bytes32 => uint256) _indexes;\\n    }\\n\\n    /**\\n     * @dev Add a value to a set. O(1).\\n     *\\n     * Returns true if the value was added to the set, that is if it was not\\n     * already present.\\n     */\\n    function _add(Set storage set, bytes32 value) private returns (bool) {\\n        if (!_contains(set, value)) {\\n            set._values.push(value);\\n            // The value is stored at length-1, but we add 1 to all indexes\\n            // and use 0 as a sentinel value\\n            set._indexes[value] = set._values.length;\\n            return true;\\n        } else {\\n            return false;\\n        }\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the value was removed from the set, that is if it was\\n     * present.\\n     */\\n    function _remove(Set storage set, bytes32 value) private returns (bool) {\\n        // We read and store the value's index to prevent multiple reads from the same storage slot\\n        uint256 valueIndex = set._indexes[value];\\n\\n        if (valueIndex != 0) { // Equivalent to contains(set, value)\\n            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\\n            // the array, and then remove the last element (sometimes called as 'swap and pop').\\n            // This modifies the order of the array, as noted in {at}.\\n\\n            uint256 toDeleteIndex = valueIndex - 1;\\n            uint256 lastIndex = set._values.length - 1;\\n\\n            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs\\n            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.\\n\\n            bytes32 lastvalue = set._values[lastIndex];\\n\\n            // Move the last value to the index where the value to delete is\\n            set._values[toDeleteIndex] = lastvalue;\\n            // Update the index for the moved value\\n            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based\\n\\n            // Delete the slot where the moved value was stored\\n            set._values.pop();\\n\\n            // Delete the index for the deleted slot\\n            delete set._indexes[value];\\n\\n            return true;\\n        } else {\\n            return false;\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns true if the value is in the set. O(1).\\n     */\\n    function _contains(Set storage set, bytes32 value) private view returns (bool) {\\n        return set._indexes[value] != 0;\\n    }\\n\\n    /**\\n     * @dev Returns the number of values on the set. O(1).\\n     */\\n    function _length(Set storage set) private view returns (uint256) {\\n        return set._values.length;\\n    }\\n\\n   /**\\n    * @dev Returns the value stored at position `index` in the set. O(1).\\n    *\\n    * Note that there are no guarantees on the ordering of values inside the\\n    * array, and it may change when more values are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function _at(Set storage set, uint256 index) private view returns (bytes32) {\\n        require(set._values.length > index, \\\"EnumerableSet: index out of bounds\\\");\\n        return set._values[index];\\n    }\\n\\n    // Bytes32Set\\n\\n    struct Bytes32Set {\\n        Set _inner;\\n    }\\n\\n    /**\\n     * @dev Add a value to a set. O(1).\\n     *\\n     * Returns true if the value was added to the set, that is if it was not\\n     * already present.\\n     */\\n    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n        return _add(set._inner, value);\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the value was removed from the set, that is if it was\\n     * present.\\n     */\\n    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n        return _remove(set._inner, value);\\n    }\\n\\n    /**\\n     * @dev Returns true if the value is in the set. O(1).\\n     */\\n    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\\n        return _contains(set._inner, value);\\n    }\\n\\n    /**\\n     * @dev Returns the number of values in the set. O(1).\\n     */\\n    function length(Bytes32Set storage set) internal view returns (uint256) {\\n        return _length(set._inner);\\n    }\\n\\n   /**\\n    * @dev Returns the value stored at position `index` in the set. O(1).\\n    *\\n    * Note that there are no guarantees on the ordering of values inside the\\n    * array, and it may change when more values are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\\n        return _at(set._inner, index);\\n    }\\n\\n    // AddressSet\\n\\n    struct AddressSet {\\n        Set _inner;\\n    }\\n\\n    /**\\n     * @dev Add a value to a set. O(1).\\n     *\\n     * Returns true if the value was added to the set, that is if it was not\\n     * already present.\\n     */\\n    function add(AddressSet storage set, address value) internal returns (bool) {\\n        return _add(set._inner, bytes32(uint256(uint160(value))));\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the value was removed from the set, that is if it was\\n     * present.\\n     */\\n    function remove(AddressSet storage set, address value) internal returns (bool) {\\n        return _remove(set._inner, bytes32(uint256(uint160(value))));\\n    }\\n\\n    /**\\n     * @dev Returns true if the value is in the set. O(1).\\n     */\\n    function contains(AddressSet storage set, address value) internal view returns (bool) {\\n        return _contains(set._inner, bytes32(uint256(uint160(value))));\\n    }\\n\\n    /**\\n     * @dev Returns the number of values in the set. O(1).\\n     */\\n    function length(AddressSet storage set) internal view returns (uint256) {\\n        return _length(set._inner);\\n    }\\n\\n   /**\\n    * @dev Returns the value stored at position `index` in the set. O(1).\\n    *\\n    * Note that there are no guarantees on the ordering of values inside the\\n    * array, and it may change when more values are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function at(AddressSet storage set, uint256 index) internal view returns (address) {\\n        return address(uint160(uint256(_at(set._inner, index))));\\n    }\\n\\n\\n    // UintSet\\n\\n    struct UintSet {\\n        Set _inner;\\n    }\\n\\n    /**\\n     * @dev Add a value to a set. O(1).\\n     *\\n     * Returns true if the value was added to the set, that is if it was not\\n     * already present.\\n     */\\n    function add(UintSet storage set, uint256 value) internal returns (bool) {\\n        return _add(set._inner, bytes32(value));\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the value was removed from the set, that is if it was\\n     * present.\\n     */\\n    function remove(UintSet storage set, uint256 value) internal returns (bool) {\\n        return _remove(set._inner, bytes32(value));\\n    }\\n\\n    /**\\n     * @dev Returns true if the value is in the set. O(1).\\n     */\\n    function contains(UintSet storage set, uint256 value) internal view returns (bool) {\\n        return _contains(set._inner, bytes32(value));\\n    }\\n\\n    /**\\n     * @dev Returns the number of values on the set. O(1).\\n     */\\n    function length(UintSet storage set) internal view returns (uint256) {\\n        return _length(set._inner);\\n    }\\n\\n   /**\\n    * @dev Returns the value stored at position `index` in the set. O(1).\\n    *\\n    * Note that there are no guarantees on the ordering of values inside the\\n    * array, and it may change when more values are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function at(UintSet storage set, uint256 index) internal view returns (uint256) {\\n        return uint256(_at(set._inner, index));\\n    }\\n}\\n\",\"keccak256\":\"0x20714cf126a1a984613579156d3cbc726db8025d8400e1db1d2bb714edaba335\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary StringsUpgradeable {\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` representation.\\n     */\\n    function toString(uint256 value) internal pure returns (string memory) {\\n        // Inspired by OraclizeAPI's implementation - MIT licence\\n        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol\\n\\n        if (value == 0) {\\n            return \\\"0\\\";\\n        }\\n        uint256 temp = value;\\n        uint256 digits;\\n        while (temp != 0) {\\n            digits++;\\n            temp /= 10;\\n        }\\n        bytes memory buffer = new bytes(digits);\\n        uint256 index = digits - 1;\\n        temp = value;\\n        while (temp != 0) {\\n            buffer[index--] = bytes1(uint8(48 + temp % 10));\\n            temp /= 10;\\n        }\\n        return string(buffer);\\n    }\\n}\\n\",\"keccak256\":\"0x8d1ac29b8a8ed3cfebe5d8774b465441ae8931aaca549f84408e0b29a1191964\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:ERC721Upgradeable",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:ERC721Upgradeable",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:ERC721Upgradeable",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 861,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:ERC721Upgradeable",
                "label": "_supportedInterfaces",
                "offset": 0,
                "slot": "51",
                "type": "t_mapping(t_bytes4,t_bool)"
              },
              {
                "astId": 918,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:ERC721Upgradeable",
                "label": "__gap",
                "offset": 0,
                "slot": "52",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 2222,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:ERC721Upgradeable",
                "label": "_holderTokens",
                "offset": 0,
                "slot": "101",
                "type": "t_mapping(t_address,t_struct(UintSet)4634_storage)"
              },
              {
                "astId": 2224,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:ERC721Upgradeable",
                "label": "_tokenOwners",
                "offset": 0,
                "slot": "102",
                "type": "t_struct(UintToAddressMap)4011_storage"
              },
              {
                "astId": 2228,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:ERC721Upgradeable",
                "label": "_tokenApprovals",
                "offset": 0,
                "slot": "104",
                "type": "t_mapping(t_uint256,t_address)"
              },
              {
                "astId": 2234,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:ERC721Upgradeable",
                "label": "_operatorApprovals",
                "offset": 0,
                "slot": "105",
                "type": "t_mapping(t_address,t_mapping(t_address,t_bool))"
              },
              {
                "astId": 2236,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:ERC721Upgradeable",
                "label": "_name",
                "offset": 0,
                "slot": "106",
                "type": "t_string_storage"
              },
              {
                "astId": 2238,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:ERC721Upgradeable",
                "label": "_symbol",
                "offset": 0,
                "slot": "107",
                "type": "t_string_storage"
              },
              {
                "astId": 2242,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:ERC721Upgradeable",
                "label": "_tokenURIs",
                "offset": 0,
                "slot": "108",
                "type": "t_mapping(t_uint256,t_string_storage)"
              },
              {
                "astId": 2244,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:ERC721Upgradeable",
                "label": "_baseURI",
                "offset": 0,
                "slot": "109",
                "type": "t_string_storage"
              },
              {
                "astId": 3145,
                "contract": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:ERC721Upgradeable",
                "label": "__gap",
                "offset": 0,
                "slot": "110",
                "type": "t_array(t_uint256)41_storage"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_bytes32)dyn_storage": {
                "base": "t_bytes32",
                "encoding": "dynamic_array",
                "label": "bytes32[]",
                "numberOfBytes": "32"
              },
              "t_array(t_struct(MapEntry)3685_storage)dyn_storage": {
                "base": "t_struct(MapEntry)3685_storage",
                "encoding": "dynamic_array",
                "label": "struct EnumerableMapUpgradeable.MapEntry[]",
                "numberOfBytes": "32"
              },
              "t_array(t_uint256)41_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[41]",
                "numberOfBytes": "1312"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_bytes32": {
                "encoding": "inplace",
                "label": "bytes32",
                "numberOfBytes": "32"
              },
              "t_bytes4": {
                "encoding": "inplace",
                "label": "bytes4",
                "numberOfBytes": "4"
              },
              "t_mapping(t_address,t_bool)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => bool)",
                "numberOfBytes": "32",
                "value": "t_bool"
              },
              "t_mapping(t_address,t_mapping(t_address,t_bool))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => bool))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_bool)"
              },
              "t_mapping(t_address,t_struct(UintSet)4634_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct EnumerableSetUpgradeable.UintSet)",
                "numberOfBytes": "32",
                "value": "t_struct(UintSet)4634_storage"
              },
              "t_mapping(t_bytes32,t_uint256)": {
                "encoding": "mapping",
                "key": "t_bytes32",
                "label": "mapping(bytes32 => uint256)",
                "numberOfBytes": "32",
                "value": "t_uint256"
              },
              "t_mapping(t_bytes4,t_bool)": {
                "encoding": "mapping",
                "key": "t_bytes4",
                "label": "mapping(bytes4 => bool)",
                "numberOfBytes": "32",
                "value": "t_bool"
              },
              "t_mapping(t_uint256,t_address)": {
                "encoding": "mapping",
                "key": "t_uint256",
                "label": "mapping(uint256 => address)",
                "numberOfBytes": "32",
                "value": "t_address"
              },
              "t_mapping(t_uint256,t_string_storage)": {
                "encoding": "mapping",
                "key": "t_uint256",
                "label": "mapping(uint256 => string)",
                "numberOfBytes": "32",
                "value": "t_string_storage"
              },
              "t_string_storage": {
                "encoding": "bytes",
                "label": "string",
                "numberOfBytes": "32"
              },
              "t_struct(Map)3693_storage": {
                "encoding": "inplace",
                "label": "struct EnumerableMapUpgradeable.Map",
                "members": [
                  {
                    "astId": 3688,
                    "contract": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:ERC721Upgradeable",
                    "label": "_entries",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_array(t_struct(MapEntry)3685_storage)dyn_storage"
                  },
                  {
                    "astId": 3692,
                    "contract": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:ERC721Upgradeable",
                    "label": "_indexes",
                    "offset": 0,
                    "slot": "1",
                    "type": "t_mapping(t_bytes32,t_uint256)"
                  }
                ],
                "numberOfBytes": "64"
              },
              "t_struct(MapEntry)3685_storage": {
                "encoding": "inplace",
                "label": "struct EnumerableMapUpgradeable.MapEntry",
                "members": [
                  {
                    "astId": 3682,
                    "contract": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:ERC721Upgradeable",
                    "label": "_key",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_bytes32"
                  },
                  {
                    "astId": 3684,
                    "contract": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:ERC721Upgradeable",
                    "label": "_value",
                    "offset": 0,
                    "slot": "1",
                    "type": "t_bytes32"
                  }
                ],
                "numberOfBytes": "64"
              },
              "t_struct(Set)4248_storage": {
                "encoding": "inplace",
                "label": "struct EnumerableSetUpgradeable.Set",
                "members": [
                  {
                    "astId": 4243,
                    "contract": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:ERC721Upgradeable",
                    "label": "_values",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_array(t_bytes32)dyn_storage"
                  },
                  {
                    "astId": 4247,
                    "contract": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:ERC721Upgradeable",
                    "label": "_indexes",
                    "offset": 0,
                    "slot": "1",
                    "type": "t_mapping(t_bytes32,t_uint256)"
                  }
                ],
                "numberOfBytes": "64"
              },
              "t_struct(UintSet)4634_storage": {
                "encoding": "inplace",
                "label": "struct EnumerableSetUpgradeable.UintSet",
                "members": [
                  {
                    "astId": 4633,
                    "contract": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:ERC721Upgradeable",
                    "label": "_inner",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_struct(Set)4248_storage"
                  }
                ],
                "numberOfBytes": "64"
              },
              "t_struct(UintToAddressMap)4011_storage": {
                "encoding": "inplace",
                "label": "struct EnumerableMapUpgradeable.UintToAddressMap",
                "members": [
                  {
                    "astId": 4010,
                    "contract": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:ERC721Upgradeable",
                    "label": "_inner",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_struct(Map)3693_storage"
                  }
                ],
                "numberOfBytes": "64"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721EnumerableUpgradeable.sol": {
        "IERC721EnumerableUpgradeable": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "approved",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "Approval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                }
              ],
              "name": "ApprovalForAll",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "Transfer",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "approve",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "balance",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "getApproved",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                }
              ],
              "name": "isApprovedForAll",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "ownerOf",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "safeTransferFrom",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "safeTransferFrom",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "_approved",
                  "type": "bool"
                }
              ],
              "name": "setApprovalForAll",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes4",
                  "name": "interfaceId",
                  "type": "bytes4"
                }
              ],
              "name": "supportsInterface",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "index",
                  "type": "uint256"
                }
              ],
              "name": "tokenByIndex",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "index",
                  "type": "uint256"
                }
              ],
              "name": "tokenOfOwnerByIndex",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "transferFrom",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "details": "See https://eips.ethereum.org/EIPS/eip-721",
            "kind": "dev",
            "methods": {
              "approve(address,uint256)": {
                "details": "Gives permission to `to` to transfer `tokenId` token to another account. The approval is cleared when the token is transferred. Only a single account can be approved at a time, so approving the zero address clears previous approvals. Requirements: - The caller must own the token or be an approved operator. - `tokenId` must exist. Emits an {Approval} event."
              },
              "balanceOf(address)": {
                "details": "Returns the number of tokens in ``owner``'s account."
              },
              "getApproved(uint256)": {
                "details": "Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist."
              },
              "isApprovedForAll(address,address)": {
                "details": "Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}"
              },
              "ownerOf(uint256)": {
                "details": "Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist."
              },
              "safeTransferFrom(address,address,uint256)": {
                "details": "Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients are aware of the ERC721 protocol to prevent tokens from being forever locked. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event."
              },
              "safeTransferFrom(address,address,uint256,bytes)": {
                "details": "Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event."
              },
              "setApprovalForAll(address,bool)": {
                "details": "Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event."
              },
              "supportsInterface(bytes4)": {
                "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."
              },
              "tokenByIndex(uint256)": {
                "details": "Returns a token ID at a given `index` of all the tokens stored by the contract. Use along with {totalSupply} to enumerate all tokens."
              },
              "tokenOfOwnerByIndex(address,uint256)": {
                "details": "Returns a token ID owned by `owner` at a given `index` of its token list. Use along with {balanceOf} to enumerate all of ``owner``'s tokens."
              },
              "totalSupply()": {
                "details": "Returns the total amount of tokens stored by the contract."
              },
              "transferFrom(address,address,uint256)": {
                "details": "Transfers `tokenId` token from `from` to `to`. WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event."
              }
            },
            "title": "ERC-721 Non-Fungible Token Standard, optional enumeration extension",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "approve(address,uint256)": "095ea7b3",
              "balanceOf(address)": "70a08231",
              "getApproved(uint256)": "081812fc",
              "isApprovedForAll(address,address)": "e985e9c5",
              "ownerOf(uint256)": "6352211e",
              "safeTransferFrom(address,address,uint256)": "42842e0e",
              "safeTransferFrom(address,address,uint256,bytes)": "b88d4fde",
              "setApprovalForAll(address,bool)": "a22cb465",
              "supportsInterface(bytes4)": "01ffc9a7",
              "tokenByIndex(uint256)": "4f6ccce7",
              "tokenOfOwnerByIndex(address,uint256)": "2f745c59",
              "totalSupply()": "18160ddd",
              "transferFrom(address,address,uint256)": "23b872dd"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenOfOwnerByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-721\",\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Gives permission to `to` to transfer `tokenId` token to another account. The approval is cleared when the token is transferred. Only a single account can be approved at a time, so approving the zero address clears previous approvals. Requirements: - The caller must own the token or be an approved operator. - `tokenId` must exist. Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the number of tokens in ``owner``'s account.\"},\"getApproved(uint256)\":{\"details\":\"Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist.\"},\"isApprovedForAll(address,address)\":{\"details\":\"Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}\"},\"ownerOf(uint256)\":{\"details\":\"Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients are aware of the ERC721 protocol to prevent tokens from being forever locked. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"tokenByIndex(uint256)\":{\"details\":\"Returns a token ID at a given `index` of all the tokens stored by the contract. Use along with {totalSupply} to enumerate all tokens.\"},\"tokenOfOwnerByIndex(address,uint256)\":{\"details\":\"Returns a token ID owned by `owner` at a given `index` of its token list. Use along with {balanceOf} to enumerate all of ``owner``'s tokens.\"},\"totalSupply()\":{\"details\":\"Returns the total amount of tokens stored by the contract.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Transfers `tokenId` token from `from` to `to`. WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event.\"}},\"title\":\"ERC-721 Non-Fungible Token Standard, optional enumeration extension\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721EnumerableUpgradeable.sol\":\"IERC721EnumerableUpgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721EnumerableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"./IERC721Upgradeable.sol\\\";\\n\\n/**\\n * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\n */\\ninterface IERC721EnumerableUpgradeable is IERC721Upgradeable {\\n\\n    /**\\n     * @dev Returns the total amount of tokens stored by the contract.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.\\n     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.\\n     */\\n    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);\\n\\n    /**\\n     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.\\n     * Use along with {totalSupply} to enumerate all tokens.\\n     */\\n    function tokenByIndex(uint256 index) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x529f3ab127aace61d7d47f3df7a6a2c42dc79bbb3a0ca459d6a861f33698aee6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721MetadataUpgradeable.sol": {
        "IERC721MetadataUpgradeable": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "approved",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "Approval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                }
              ],
              "name": "ApprovalForAll",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "Transfer",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "approve",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "balance",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "getApproved",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                }
              ],
              "name": "isApprovedForAll",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "name",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "ownerOf",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "safeTransferFrom",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "safeTransferFrom",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "_approved",
                  "type": "bool"
                }
              ],
              "name": "setApprovalForAll",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes4",
                  "name": "interfaceId",
                  "type": "bytes4"
                }
              ],
              "name": "supportsInterface",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "symbol",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "tokenURI",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "transferFrom",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "details": "See https://eips.ethereum.org/EIPS/eip-721",
            "kind": "dev",
            "methods": {
              "approve(address,uint256)": {
                "details": "Gives permission to `to` to transfer `tokenId` token to another account. The approval is cleared when the token is transferred. Only a single account can be approved at a time, so approving the zero address clears previous approvals. Requirements: - The caller must own the token or be an approved operator. - `tokenId` must exist. Emits an {Approval} event."
              },
              "balanceOf(address)": {
                "details": "Returns the number of tokens in ``owner``'s account."
              },
              "getApproved(uint256)": {
                "details": "Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist."
              },
              "isApprovedForAll(address,address)": {
                "details": "Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}"
              },
              "name()": {
                "details": "Returns the token collection name."
              },
              "ownerOf(uint256)": {
                "details": "Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist."
              },
              "safeTransferFrom(address,address,uint256)": {
                "details": "Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients are aware of the ERC721 protocol to prevent tokens from being forever locked. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event."
              },
              "safeTransferFrom(address,address,uint256,bytes)": {
                "details": "Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event."
              },
              "setApprovalForAll(address,bool)": {
                "details": "Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event."
              },
              "supportsInterface(bytes4)": {
                "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."
              },
              "symbol()": {
                "details": "Returns the token collection symbol."
              },
              "tokenURI(uint256)": {
                "details": "Returns the Uniform Resource Identifier (URI) for `tokenId` token."
              },
              "transferFrom(address,address,uint256)": {
                "details": "Transfers `tokenId` token from `from` to `to`. WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event."
              }
            },
            "title": "ERC-721 Non-Fungible Token Standard, optional metadata extension",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "approve(address,uint256)": "095ea7b3",
              "balanceOf(address)": "70a08231",
              "getApproved(uint256)": "081812fc",
              "isApprovedForAll(address,address)": "e985e9c5",
              "name()": "06fdde03",
              "ownerOf(uint256)": "6352211e",
              "safeTransferFrom(address,address,uint256)": "42842e0e",
              "safeTransferFrom(address,address,uint256,bytes)": "b88d4fde",
              "setApprovalForAll(address,bool)": "a22cb465",
              "supportsInterface(bytes4)": "01ffc9a7",
              "symbol()": "95d89b41",
              "tokenURI(uint256)": "c87b56dd",
              "transferFrom(address,address,uint256)": "23b872dd"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"See https://eips.ethereum.org/EIPS/eip-721\",\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Gives permission to `to` to transfer `tokenId` token to another account. The approval is cleared when the token is transferred. Only a single account can be approved at a time, so approving the zero address clears previous approvals. Requirements: - The caller must own the token or be an approved operator. - `tokenId` must exist. Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the number of tokens in ``owner``'s account.\"},\"getApproved(uint256)\":{\"details\":\"Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist.\"},\"isApprovedForAll(address,address)\":{\"details\":\"Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}\"},\"name()\":{\"details\":\"Returns the token collection name.\"},\"ownerOf(uint256)\":{\"details\":\"Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients are aware of the ERC721 protocol to prevent tokens from being forever locked. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"symbol()\":{\"details\":\"Returns the token collection symbol.\"},\"tokenURI(uint256)\":{\"details\":\"Returns the Uniform Resource Identifier (URI) for `tokenId` token.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Transfers `tokenId` token from `from` to `to`. WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event.\"}},\"title\":\"ERC-721 Non-Fungible Token Standard, optional metadata extension\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721MetadataUpgradeable.sol\":\"IERC721MetadataUpgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721MetadataUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"./IERC721Upgradeable.sol\\\";\\n\\n/**\\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\n */\\ninterface IERC721MetadataUpgradeable is IERC721Upgradeable {\\n\\n    /**\\n     * @dev Returns the token collection name.\\n     */\\n    function name() external view returns (string memory);\\n\\n    /**\\n     * @dev Returns the token collection symbol.\\n     */\\n    function symbol() external view returns (string memory);\\n\\n    /**\\n     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\\n     */\\n    function tokenURI(uint256 tokenId) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0xa981b1f67f60771c18d39e21bad0a2f0f952e2c3faa90b45b982060fc14ee2bd\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol": {
        "IERC721ReceiverUpgradeable": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "onERC721Received",
              "outputs": [
                {
                  "internalType": "bytes4",
                  "name": "",
                  "type": "bytes4"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "details": "Interface for any contract that wants to support safeTransfers from ERC721 asset contracts.",
            "kind": "dev",
            "methods": {
              "onERC721Received(address,address,uint256,bytes)": {
                "details": "Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} by `operator` from `from`, this function is called. It must return its Solidity selector to confirm the token transfer. If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`."
              }
            },
            "title": "ERC721 token receiver interface",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "onERC721Received(address,address,uint256,bytes)": "150b7a02"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface for any contract that wants to support safeTransfers from ERC721 asset contracts.\",\"kind\":\"dev\",\"methods\":{\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} by `operator` from `from`, this function is called. It must return its Solidity selector to confirm the token transfer. If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\"}},\"title\":\"ERC721 token receiver interface\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":\"IERC721ReceiverUpgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol": {
        "IERC721Upgradeable": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "approved",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "Approval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                }
              ],
              "name": "ApprovalForAll",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "Transfer",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "approve",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "balance",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "getApproved",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                }
              ],
              "name": "isApprovedForAll",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "ownerOf",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "safeTransferFrom",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "safeTransferFrom",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "_approved",
                  "type": "bool"
                }
              ],
              "name": "setApprovalForAll",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes4",
                  "name": "interfaceId",
                  "type": "bytes4"
                }
              ],
              "name": "supportsInterface",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "transferFrom",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "details": "Required interface of an ERC721 compliant contract.",
            "events": {
              "Approval(address,address,uint256)": {
                "details": "Emitted when `owner` enables `approved` to manage the `tokenId` token."
              },
              "ApprovalForAll(address,address,bool)": {
                "details": "Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets."
              },
              "Transfer(address,address,uint256)": {
                "details": "Emitted when `tokenId` token is transferred from `from` to `to`."
              }
            },
            "kind": "dev",
            "methods": {
              "approve(address,uint256)": {
                "details": "Gives permission to `to` to transfer `tokenId` token to another account. The approval is cleared when the token is transferred. Only a single account can be approved at a time, so approving the zero address clears previous approvals. Requirements: - The caller must own the token or be an approved operator. - `tokenId` must exist. Emits an {Approval} event."
              },
              "balanceOf(address)": {
                "details": "Returns the number of tokens in ``owner``'s account."
              },
              "getApproved(uint256)": {
                "details": "Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist."
              },
              "isApprovedForAll(address,address)": {
                "details": "Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}"
              },
              "ownerOf(uint256)": {
                "details": "Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist."
              },
              "safeTransferFrom(address,address,uint256)": {
                "details": "Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients are aware of the ERC721 protocol to prevent tokens from being forever locked. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event."
              },
              "safeTransferFrom(address,address,uint256,bytes)": {
                "details": "Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event."
              },
              "setApprovalForAll(address,bool)": {
                "details": "Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event."
              },
              "supportsInterface(bytes4)": {
                "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."
              },
              "transferFrom(address,address,uint256)": {
                "details": "Transfers `tokenId` token from `from` to `to`. WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "approve(address,uint256)": "095ea7b3",
              "balanceOf(address)": "70a08231",
              "getApproved(uint256)": "081812fc",
              "isApprovedForAll(address,address)": "e985e9c5",
              "ownerOf(uint256)": "6352211e",
              "safeTransferFrom(address,address,uint256)": "42842e0e",
              "safeTransferFrom(address,address,uint256,bytes)": "b88d4fde",
              "setApprovalForAll(address,bool)": "a22cb465",
              "supportsInterface(bytes4)": "01ffc9a7",
              "transferFrom(address,address,uint256)": "23b872dd"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Required interface of an ERC721 compliant contract.\",\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"Gives permission to `to` to transfer `tokenId` token to another account. The approval is cleared when the token is transferred. Only a single account can be approved at a time, so approving the zero address clears previous approvals. Requirements: - The caller must own the token or be an approved operator. - `tokenId` must exist. Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the number of tokens in ``owner``'s account.\"},\"getApproved(uint256)\":{\"details\":\"Returns the account approved for `tokenId` token. Requirements: - `tokenId` must exist.\"},\"isApprovedForAll(address,address)\":{\"details\":\"Returns if the `operator` is allowed to manage all of the assets of `owner`. See {setApprovalForAll}\"},\"ownerOf(uint256)\":{\"details\":\"Returns the owner of the `tokenId` token. Requirements: - `tokenId` must exist.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients are aware of the ERC721 protocol to prevent tokens from being forever locked. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"Safely transfers `tokenId` token from `from` to `to`. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must exist and be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. Emits a {Transfer} event.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"Approve or remove `operator` as an operator for the caller. Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. Requirements: - The `operator` cannot be the caller. Emits an {ApprovalForAll} event.\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Transfers `tokenId` token from `from` to `to`. WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. Requirements: - `from` cannot be the zero address. - `to` cannot be the zero address. - `tokenId` token must be owned by `from`. - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. Emits a {Transfer} event.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":\"IERC721Upgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": {
        "AddressUpgradeable": {
          "abi": [],
          "devdoc": {
            "details": "Collection of functions related to the address type",
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122011cd4c1e66a4a6717d5ab8a2b41ff0e29a2ecf35e432363ce21510e43a24b34c64736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 GT 0xCD 0x4C 0x1E PUSH7 0xA4A6717D5AB8A2 0xB4 0x1F CREATE 0xE2 SWAP11 0x2E 0xCF CALLDATALOAD 0xE4 ORIGIN CALLDATASIZE EXTCODECOPY 0xE2 ISZERO LT 0xE4 GASPRICE 0x24 0xB3 0x4C PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "134:6715:18:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122011cd4c1e66a4a6717d5ab8a2b41ff0e29a2ecf35e432363ce21510e43a24b34c64736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 GT 0xCD 0x4C 0x1E PUSH7 0xA4A6717D5AB8A2 0xB4 0x1F CREATE 0xE2 SWAP11 0x2E 0xCF CALLDATALOAD 0xE4 ORIGIN CALLDATASIZE EXTCODECOPY 0xE2 ISZERO LT 0xE4 GASPRICE 0x24 0xB3 0x4C PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "134:6715:18:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "_verifyCallResult(bool,bytes memory,string memory)": "infinite",
                "functionCall(address,bytes memory)": "infinite",
                "functionCall(address,bytes memory,string memory)": "infinite",
                "functionCallWithValue(address,bytes memory,uint256)": "infinite",
                "functionCallWithValue(address,bytes memory,uint256,string memory)": "infinite",
                "functionStaticCall(address,bytes memory)": "infinite",
                "functionStaticCall(address,bytes memory,string memory)": "infinite",
                "isContract(address)": "infinite",
                "sendValue(address payable,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Collection of functions related to the address type\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":\"AddressUpgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": {
        "ContextUpgradeable": {
          "abi": [],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":\"ContextUpgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:ContextUpgradeable",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:ContextUpgradeable",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:ContextUpgradeable",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              }
            ],
            "types": {
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol": {
        "CountersUpgradeable": {
          "abi": [],
          "devdoc": {
            "author": "Matt Condon (@shrugs)",
            "details": "Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number of elements in a mapping, issuing ERC721 ids, or counting request ids. Include with `using Counters for Counters.Counter;` Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath} overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never directly accessed.",
            "kind": "dev",
            "methods": {},
            "title": "Counters",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122002e9a793ab2f2c76929ce43c91f890e4fc779819af58c4f9ac7f51793ef0b53064736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MUL 0xE9 0xA7 SWAP4 0xAB 0x2F 0x2C PUSH23 0x929CE43C91F890E4FC779819AF58C4F9AC7F51793EF0B5 ADDRESS PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "681:870:20:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122002e9a793ab2f2c76929ce43c91f890e4fc779819af58c4f9ac7f51793ef0b53064736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 MUL 0xE9 0xA7 SWAP4 0xAB 0x2F 0x2C PUSH23 0x929CE43C91F890E4FC779819AF58C4F9AC7F51793EF0B5 ADDRESS PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "681:870:20:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "current(struct CountersUpgradeable.Counter storage pointer)": "infinite",
                "decrement(struct CountersUpgradeable.Counter storage pointer)": "infinite",
                "increment(struct CountersUpgradeable.Counter storage pointer)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"Matt Condon (@shrugs)\",\"details\":\"Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number of elements in a mapping, issuing ERC721 ids, or counting request ids. Include with `using Counters for Counters.Counter;` Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath} overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never directly accessed.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"Counters\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":\"CountersUpgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/utils/EnumerableMapUpgradeable.sol": {
        "EnumerableMapUpgradeable": {
          "abi": [],
          "devdoc": {
            "details": "Library for managing an enumerable variant of Solidity's https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] type. Maps have the following properties: - Entries are added, removed, and checked for existence in constant time (O(1)). - Entries are enumerated in O(n). No guarantees are made on the ordering. ``` contract Example {     // Add the library methods     using EnumerableMap for EnumerableMap.UintToAddressMap;     // Declare a set state variable     EnumerableMap.UintToAddressMap private myMap; } ``` As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are supported.",
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122071eadf854fadd00dee4e2106b490c5b9fd9abb1d57476525643cd4a086da549064736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH18 0xEADF854FADD00DEE4E2106B490C5B9FD9ABB SAR JUMPI SELFBALANCE PUSH6 0x25643CD4A086 0xDA SLOAD SWAP1 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "772:8974:21:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122071eadf854fadd00dee4e2106b490c5b9fd9abb1d57476525643cd4a086da549064736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH18 0xEADF854FADD00DEE4E2106B490C5B9FD9ABB SAR JUMPI SELFBALANCE PUSH6 0x25643CD4A086 0xDA SLOAD SWAP1 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "772:8974:21:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "_at(struct EnumerableMapUpgradeable.Map storage pointer,uint256)": "infinite",
                "_contains(struct EnumerableMapUpgradeable.Map storage pointer,bytes32)": "infinite",
                "_get(struct EnumerableMapUpgradeable.Map storage pointer,bytes32)": "infinite",
                "_get(struct EnumerableMapUpgradeable.Map storage pointer,bytes32,string memory)": "infinite",
                "_length(struct EnumerableMapUpgradeable.Map storage pointer)": "infinite",
                "_remove(struct EnumerableMapUpgradeable.Map storage pointer,bytes32)": "infinite",
                "_set(struct EnumerableMapUpgradeable.Map storage pointer,bytes32,bytes32)": "infinite",
                "_tryGet(struct EnumerableMapUpgradeable.Map storage pointer,bytes32)": "infinite",
                "at(struct EnumerableMapUpgradeable.UintToAddressMap storage pointer,uint256)": "infinite",
                "contains(struct EnumerableMapUpgradeable.UintToAddressMap storage pointer,uint256)": "infinite",
                "get(struct EnumerableMapUpgradeable.UintToAddressMap storage pointer,uint256)": "infinite",
                "get(struct EnumerableMapUpgradeable.UintToAddressMap storage pointer,uint256,string memory)": "infinite",
                "length(struct EnumerableMapUpgradeable.UintToAddressMap storage pointer)": "infinite",
                "remove(struct EnumerableMapUpgradeable.UintToAddressMap storage pointer,uint256)": "infinite",
                "set(struct EnumerableMapUpgradeable.UintToAddressMap storage pointer,uint256,address)": "infinite",
                "tryGet(struct EnumerableMapUpgradeable.UintToAddressMap storage pointer,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Library for managing an enumerable variant of Solidity's https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] type. Maps have the following properties: - Entries are added, removed, and checked for existence in constant time (O(1)). - Entries are enumerated in O(n). No guarantees are made on the ordering. ``` contract Example {     // Add the library methods     using EnumerableMap for EnumerableMap.UintToAddressMap;     // Declare a set state variable     EnumerableMap.UintToAddressMap private myMap; } ``` As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are supported.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/utils/EnumerableMapUpgradeable.sol\":\"EnumerableMapUpgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/utils/EnumerableMapUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Library for managing an enumerable variant of Solidity's\\n * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]\\n * type.\\n *\\n * Maps have the following properties:\\n *\\n * - Entries are added, removed, and checked for existence in constant time\\n * (O(1)).\\n * - Entries are enumerated in O(n). No guarantees are made on the ordering.\\n *\\n * ```\\n * contract Example {\\n *     // Add the library methods\\n *     using EnumerableMap for EnumerableMap.UintToAddressMap;\\n *\\n *     // Declare a set state variable\\n *     EnumerableMap.UintToAddressMap private myMap;\\n * }\\n * ```\\n *\\n * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are\\n * supported.\\n */\\nlibrary EnumerableMapUpgradeable {\\n    // To implement this library for multiple types with as little code\\n    // repetition as possible, we write it in terms of a generic Map type with\\n    // bytes32 keys and values.\\n    // The Map implementation uses private functions, and user-facing\\n    // implementations (such as Uint256ToAddressMap) are just wrappers around\\n    // the underlying Map.\\n    // This means that we can only create new EnumerableMaps for types that fit\\n    // in bytes32.\\n\\n    struct MapEntry {\\n        bytes32 _key;\\n        bytes32 _value;\\n    }\\n\\n    struct Map {\\n        // Storage of map keys and values\\n        MapEntry[] _entries;\\n\\n        // Position of the entry defined by a key in the `entries` array, plus 1\\n        // because index 0 means a key is not in the map.\\n        mapping (bytes32 => uint256) _indexes;\\n    }\\n\\n    /**\\n     * @dev Adds a key-value pair to a map, or updates the value for an existing\\n     * key. O(1).\\n     *\\n     * Returns true if the key was added to the map, that is if it was not\\n     * already present.\\n     */\\n    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {\\n        // We read and store the key's index to prevent multiple reads from the same storage slot\\n        uint256 keyIndex = map._indexes[key];\\n\\n        if (keyIndex == 0) { // Equivalent to !contains(map, key)\\n            map._entries.push(MapEntry({ _key: key, _value: value }));\\n            // The entry is stored at length-1, but we add 1 to all indexes\\n            // and use 0 as a sentinel value\\n            map._indexes[key] = map._entries.length;\\n            return true;\\n        } else {\\n            map._entries[keyIndex - 1]._value = value;\\n            return false;\\n        }\\n    }\\n\\n    /**\\n     * @dev Removes a key-value pair from a map. O(1).\\n     *\\n     * Returns true if the key was removed from the map, that is if it was present.\\n     */\\n    function _remove(Map storage map, bytes32 key) private returns (bool) {\\n        // We read and store the key's index to prevent multiple reads from the same storage slot\\n        uint256 keyIndex = map._indexes[key];\\n\\n        if (keyIndex != 0) { // Equivalent to contains(map, key)\\n            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one\\n            // in the array, and then remove the last entry (sometimes called as 'swap and pop').\\n            // This modifies the order of the array, as noted in {at}.\\n\\n            uint256 toDeleteIndex = keyIndex - 1;\\n            uint256 lastIndex = map._entries.length - 1;\\n\\n            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs\\n            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.\\n\\n            MapEntry storage lastEntry = map._entries[lastIndex];\\n\\n            // Move the last entry to the index where the entry to delete is\\n            map._entries[toDeleteIndex] = lastEntry;\\n            // Update the index for the moved entry\\n            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based\\n\\n            // Delete the slot where the moved entry was stored\\n            map._entries.pop();\\n\\n            // Delete the index for the deleted slot\\n            delete map._indexes[key];\\n\\n            return true;\\n        } else {\\n            return false;\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns true if the key is in the map. O(1).\\n     */\\n    function _contains(Map storage map, bytes32 key) private view returns (bool) {\\n        return map._indexes[key] != 0;\\n    }\\n\\n    /**\\n     * @dev Returns the number of key-value pairs in the map. O(1).\\n     */\\n    function _length(Map storage map) private view returns (uint256) {\\n        return map._entries.length;\\n    }\\n\\n   /**\\n    * @dev Returns the key-value pair stored at position `index` in the map. O(1).\\n    *\\n    * Note that there are no guarantees on the ordering of entries inside the\\n    * array, and it may change when more entries are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {\\n        require(map._entries.length > index, \\\"EnumerableMap: index out of bounds\\\");\\n\\n        MapEntry storage entry = map._entries[index];\\n        return (entry._key, entry._value);\\n    }\\n\\n    /**\\n     * @dev Tries to returns the value associated with `key`.  O(1).\\n     * Does not revert if `key` is not in the map.\\n     */\\n    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {\\n        uint256 keyIndex = map._indexes[key];\\n        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)\\n        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based\\n    }\\n\\n    /**\\n     * @dev Returns the value associated with `key`.  O(1).\\n     *\\n     * Requirements:\\n     *\\n     * - `key` must be in the map.\\n     */\\n    function _get(Map storage map, bytes32 key) private view returns (bytes32) {\\n        uint256 keyIndex = map._indexes[key];\\n        require(keyIndex != 0, \\\"EnumerableMap: nonexistent key\\\"); // Equivalent to contains(map, key)\\n        return map._entries[keyIndex - 1]._value; // All indexes are 1-based\\n    }\\n\\n    /**\\n     * @dev Same as {_get}, with a custom error message when `key` is not in the map.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {_tryGet}.\\n     */\\n    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {\\n        uint256 keyIndex = map._indexes[key];\\n        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)\\n        return map._entries[keyIndex - 1]._value; // All indexes are 1-based\\n    }\\n\\n    // UintToAddressMap\\n\\n    struct UintToAddressMap {\\n        Map _inner;\\n    }\\n\\n    /**\\n     * @dev Adds a key-value pair to a map, or updates the value for an existing\\n     * key. O(1).\\n     *\\n     * Returns true if the key was added to the map, that is if it was not\\n     * already present.\\n     */\\n    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {\\n        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the key was removed from the map, that is if it was present.\\n     */\\n    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {\\n        return _remove(map._inner, bytes32(key));\\n    }\\n\\n    /**\\n     * @dev Returns true if the key is in the map. O(1).\\n     */\\n    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {\\n        return _contains(map._inner, bytes32(key));\\n    }\\n\\n    /**\\n     * @dev Returns the number of elements in the map. O(1).\\n     */\\n    function length(UintToAddressMap storage map) internal view returns (uint256) {\\n        return _length(map._inner);\\n    }\\n\\n   /**\\n    * @dev Returns the element stored at position `index` in the set. O(1).\\n    * Note that there are no guarantees on the ordering of values inside the\\n    * array, and it may change when more values are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {\\n        (bytes32 key, bytes32 value) = _at(map._inner, index);\\n        return (uint256(key), address(uint160(uint256(value))));\\n    }\\n\\n    /**\\n     * @dev Tries to returns the value associated with `key`.  O(1).\\n     * Does not revert if `key` is not in the map.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {\\n        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));\\n        return (success, address(uint160(uint256(value))));\\n    }\\n\\n    /**\\n     * @dev Returns the value associated with `key`.  O(1).\\n     *\\n     * Requirements:\\n     *\\n     * - `key` must be in the map.\\n     */\\n    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {\\n        return address(uint160(uint256(_get(map._inner, bytes32(key)))));\\n    }\\n\\n    /**\\n     * @dev Same as {get}, with a custom error message when `key` is not in the map.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryGet}.\\n     */\\n    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {\\n        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));\\n    }\\n}\\n\",\"keccak256\":\"0x6a8e34d051fc71ce49a8a47d050c5b7e77909008c6be7d6780ee9ed87d2d3797\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/utils/EnumerableSetUpgradeable.sol": {
        "EnumerableSetUpgradeable": {
          "abi": [],
          "devdoc": {
            "details": "Library for managing https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive types. Sets have the following properties: - Elements are added, removed, and checked for existence in constant time (O(1)). - Elements are enumerated in O(n). No guarantees are made on the ordering. ``` contract Example {     // Add the library methods     using EnumerableSet for EnumerableSet.AddressSet;     // Declare a set state variable     EnumerableSet.AddressSet private mySet; } ``` As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) and `uint256` (`UintSet`) are supported.",
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212203c69c326f23c1dc68a4669bd0a2d5ed47d101e3c0260abc15bb38a66bbaf559b64736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 EXTCODECOPY PUSH10 0xC326F23C1DC68A4669BD EXP 0x2D 0x5E 0xD4 PUSH30 0x101E3C0260ABC15BB38A66BBAF559B64736F6C634300060C003300000000 ",
              "sourceMap": "753:8645:22:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212203c69c326f23c1dc68a4669bd0a2d5ed47d101e3c0260abc15bb38a66bbaf559b64736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 EXTCODECOPY PUSH10 0xC326F23C1DC68A4669BD EXP 0x2D 0x5E 0xD4 PUSH30 0x101E3C0260ABC15BB38A66BBAF559B64736F6C634300060C003300000000 ",
              "sourceMap": "753:8645:22:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "_add(struct EnumerableSetUpgradeable.Set storage pointer,bytes32)": "infinite",
                "_at(struct EnumerableSetUpgradeable.Set storage pointer,uint256)": "infinite",
                "_contains(struct EnumerableSetUpgradeable.Set storage pointer,bytes32)": "infinite",
                "_length(struct EnumerableSetUpgradeable.Set storage pointer)": "infinite",
                "_remove(struct EnumerableSetUpgradeable.Set storage pointer,bytes32)": "infinite",
                "add(struct EnumerableSetUpgradeable.AddressSet storage pointer,address)": "infinite",
                "add(struct EnumerableSetUpgradeable.Bytes32Set storage pointer,bytes32)": "infinite",
                "add(struct EnumerableSetUpgradeable.UintSet storage pointer,uint256)": "infinite",
                "at(struct EnumerableSetUpgradeable.AddressSet storage pointer,uint256)": "infinite",
                "at(struct EnumerableSetUpgradeable.Bytes32Set storage pointer,uint256)": "infinite",
                "at(struct EnumerableSetUpgradeable.UintSet storage pointer,uint256)": "infinite",
                "contains(struct EnumerableSetUpgradeable.AddressSet storage pointer,address)": "infinite",
                "contains(struct EnumerableSetUpgradeable.Bytes32Set storage pointer,bytes32)": "infinite",
                "contains(struct EnumerableSetUpgradeable.UintSet storage pointer,uint256)": "infinite",
                "length(struct EnumerableSetUpgradeable.AddressSet storage pointer)": "infinite",
                "length(struct EnumerableSetUpgradeable.Bytes32Set storage pointer)": "infinite",
                "length(struct EnumerableSetUpgradeable.UintSet storage pointer)": "infinite",
                "remove(struct EnumerableSetUpgradeable.AddressSet storage pointer,address)": "infinite",
                "remove(struct EnumerableSetUpgradeable.Bytes32Set storage pointer,bytes32)": "infinite",
                "remove(struct EnumerableSetUpgradeable.UintSet storage pointer,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Library for managing https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive types. Sets have the following properties: - Elements are added, removed, and checked for existence in constant time (O(1)). - Elements are enumerated in O(n). No guarantees are made on the ordering. ``` contract Example {     // Add the library methods     using EnumerableSet for EnumerableSet.AddressSet;     // Declare a set state variable     EnumerableSet.AddressSet private mySet; } ``` As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) and `uint256` (`UintSet`) are supported.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/utils/EnumerableSetUpgradeable.sol\":\"EnumerableSetUpgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/utils/EnumerableSetUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Library for managing\\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\\n * types.\\n *\\n * Sets have the following properties:\\n *\\n * - Elements are added, removed, and checked for existence in constant time\\n * (O(1)).\\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\\n *\\n * ```\\n * contract Example {\\n *     // Add the library methods\\n *     using EnumerableSet for EnumerableSet.AddressSet;\\n *\\n *     // Declare a set state variable\\n *     EnumerableSet.AddressSet private mySet;\\n * }\\n * ```\\n *\\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\\n * and `uint256` (`UintSet`) are supported.\\n */\\nlibrary EnumerableSetUpgradeable {\\n    // To implement this library for multiple types with as little code\\n    // repetition as possible, we write it in terms of a generic Set type with\\n    // bytes32 values.\\n    // The Set implementation uses private functions, and user-facing\\n    // implementations (such as AddressSet) are just wrappers around the\\n    // underlying Set.\\n    // This means that we can only create new EnumerableSets for types that fit\\n    // in bytes32.\\n\\n    struct Set {\\n        // Storage of set values\\n        bytes32[] _values;\\n\\n        // Position of the value in the `values` array, plus 1 because index 0\\n        // means a value is not in the set.\\n        mapping (bytes32 => uint256) _indexes;\\n    }\\n\\n    /**\\n     * @dev Add a value to a set. O(1).\\n     *\\n     * Returns true if the value was added to the set, that is if it was not\\n     * already present.\\n     */\\n    function _add(Set storage set, bytes32 value) private returns (bool) {\\n        if (!_contains(set, value)) {\\n            set._values.push(value);\\n            // The value is stored at length-1, but we add 1 to all indexes\\n            // and use 0 as a sentinel value\\n            set._indexes[value] = set._values.length;\\n            return true;\\n        } else {\\n            return false;\\n        }\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the value was removed from the set, that is if it was\\n     * present.\\n     */\\n    function _remove(Set storage set, bytes32 value) private returns (bool) {\\n        // We read and store the value's index to prevent multiple reads from the same storage slot\\n        uint256 valueIndex = set._indexes[value];\\n\\n        if (valueIndex != 0) { // Equivalent to contains(set, value)\\n            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\\n            // the array, and then remove the last element (sometimes called as 'swap and pop').\\n            // This modifies the order of the array, as noted in {at}.\\n\\n            uint256 toDeleteIndex = valueIndex - 1;\\n            uint256 lastIndex = set._values.length - 1;\\n\\n            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs\\n            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.\\n\\n            bytes32 lastvalue = set._values[lastIndex];\\n\\n            // Move the last value to the index where the value to delete is\\n            set._values[toDeleteIndex] = lastvalue;\\n            // Update the index for the moved value\\n            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based\\n\\n            // Delete the slot where the moved value was stored\\n            set._values.pop();\\n\\n            // Delete the index for the deleted slot\\n            delete set._indexes[value];\\n\\n            return true;\\n        } else {\\n            return false;\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns true if the value is in the set. O(1).\\n     */\\n    function _contains(Set storage set, bytes32 value) private view returns (bool) {\\n        return set._indexes[value] != 0;\\n    }\\n\\n    /**\\n     * @dev Returns the number of values on the set. O(1).\\n     */\\n    function _length(Set storage set) private view returns (uint256) {\\n        return set._values.length;\\n    }\\n\\n   /**\\n    * @dev Returns the value stored at position `index` in the set. O(1).\\n    *\\n    * Note that there are no guarantees on the ordering of values inside the\\n    * array, and it may change when more values are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function _at(Set storage set, uint256 index) private view returns (bytes32) {\\n        require(set._values.length > index, \\\"EnumerableSet: index out of bounds\\\");\\n        return set._values[index];\\n    }\\n\\n    // Bytes32Set\\n\\n    struct Bytes32Set {\\n        Set _inner;\\n    }\\n\\n    /**\\n     * @dev Add a value to a set. O(1).\\n     *\\n     * Returns true if the value was added to the set, that is if it was not\\n     * already present.\\n     */\\n    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n        return _add(set._inner, value);\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the value was removed from the set, that is if it was\\n     * present.\\n     */\\n    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n        return _remove(set._inner, value);\\n    }\\n\\n    /**\\n     * @dev Returns true if the value is in the set. O(1).\\n     */\\n    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\\n        return _contains(set._inner, value);\\n    }\\n\\n    /**\\n     * @dev Returns the number of values in the set. O(1).\\n     */\\n    function length(Bytes32Set storage set) internal view returns (uint256) {\\n        return _length(set._inner);\\n    }\\n\\n   /**\\n    * @dev Returns the value stored at position `index` in the set. O(1).\\n    *\\n    * Note that there are no guarantees on the ordering of values inside the\\n    * array, and it may change when more values are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\\n        return _at(set._inner, index);\\n    }\\n\\n    // AddressSet\\n\\n    struct AddressSet {\\n        Set _inner;\\n    }\\n\\n    /**\\n     * @dev Add a value to a set. O(1).\\n     *\\n     * Returns true if the value was added to the set, that is if it was not\\n     * already present.\\n     */\\n    function add(AddressSet storage set, address value) internal returns (bool) {\\n        return _add(set._inner, bytes32(uint256(uint160(value))));\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the value was removed from the set, that is if it was\\n     * present.\\n     */\\n    function remove(AddressSet storage set, address value) internal returns (bool) {\\n        return _remove(set._inner, bytes32(uint256(uint160(value))));\\n    }\\n\\n    /**\\n     * @dev Returns true if the value is in the set. O(1).\\n     */\\n    function contains(AddressSet storage set, address value) internal view returns (bool) {\\n        return _contains(set._inner, bytes32(uint256(uint160(value))));\\n    }\\n\\n    /**\\n     * @dev Returns the number of values in the set. O(1).\\n     */\\n    function length(AddressSet storage set) internal view returns (uint256) {\\n        return _length(set._inner);\\n    }\\n\\n   /**\\n    * @dev Returns the value stored at position `index` in the set. O(1).\\n    *\\n    * Note that there are no guarantees on the ordering of values inside the\\n    * array, and it may change when more values are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function at(AddressSet storage set, uint256 index) internal view returns (address) {\\n        return address(uint160(uint256(_at(set._inner, index))));\\n    }\\n\\n\\n    // UintSet\\n\\n    struct UintSet {\\n        Set _inner;\\n    }\\n\\n    /**\\n     * @dev Add a value to a set. O(1).\\n     *\\n     * Returns true if the value was added to the set, that is if it was not\\n     * already present.\\n     */\\n    function add(UintSet storage set, uint256 value) internal returns (bool) {\\n        return _add(set._inner, bytes32(value));\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the value was removed from the set, that is if it was\\n     * present.\\n     */\\n    function remove(UintSet storage set, uint256 value) internal returns (bool) {\\n        return _remove(set._inner, bytes32(value));\\n    }\\n\\n    /**\\n     * @dev Returns true if the value is in the set. O(1).\\n     */\\n    function contains(UintSet storage set, uint256 value) internal view returns (bool) {\\n        return _contains(set._inner, bytes32(value));\\n    }\\n\\n    /**\\n     * @dev Returns the number of values on the set. O(1).\\n     */\\n    function length(UintSet storage set) internal view returns (uint256) {\\n        return _length(set._inner);\\n    }\\n\\n   /**\\n    * @dev Returns the value stored at position `index` in the set. O(1).\\n    *\\n    * Note that there are no guarantees on the ordering of values inside the\\n    * array, and it may change when more values are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function at(UintSet storage set, uint256 index) internal view returns (uint256) {\\n        return uint256(_at(set._inner, index));\\n    }\\n}\\n\",\"keccak256\":\"0x20714cf126a1a984613579156d3cbc726db8025d8400e1db1d2bb714edaba335\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol": {
        "ReentrancyGuardUpgradeable": {
          "abi": [],
          "devdoc": {
            "details": "Contract module that helps prevent reentrant calls to a function. Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier available, which can be applied to functions to make sure there are no nested (reentrant) calls to them. Note that because there is a single `nonReentrant` guard, functions marked as `nonReentrant` may not call one another. This can be worked around by making those functions `private`, and then adding `external` `nonReentrant` entry points to them. TIP: If you would like to learn more about reentrancy and alternative ways to protect against it, check out our blog post https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].",
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Contract module that helps prevent reentrant calls to a function. Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier available, which can be applied to functions to make sure there are no nested (reentrant) calls to them. Note that because there is a single `nonReentrant` guard, functions marked as `nonReentrant` may not call one another. This can be worked around by making those functions `private`, and then adding `external` `nonReentrant` entry points to them. TIP: If you would like to learn more about reentrancy and alternative ways to protect against it, check out our blog post https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":\"ReentrancyGuardUpgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:ReentrancyGuardUpgradeable",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:ReentrancyGuardUpgradeable",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 4743,
                "contract": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:ReentrancyGuardUpgradeable",
                "label": "_status",
                "offset": 0,
                "slot": "1",
                "type": "t_uint256"
              },
              {
                "astId": 4786,
                "contract": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:ReentrancyGuardUpgradeable",
                "label": "__gap",
                "offset": 0,
                "slot": "2",
                "type": "t_array(t_uint256)49_storage"
              }
            ],
            "types": {
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol": {
        "SafeCastUpgradeable": {
          "abi": [],
          "devdoc": {
            "details": "Wrappers over Solidity's uintXX/intXX casting operators with added overflow checks. Downcasting from uint256/int256 in Solidity does not revert on overflow. This can easily result in undesired exploitation or bugs, since developers usually assume that overflows raise errors. `SafeCast` restores this intuition by reverting the transaction when such an operation overflows. Using this library instead of the unchecked operations eliminates an entire class of bugs, so it's recommended to use it always. Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing all math on `uint256` and `int256` and then downcasting.",
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220afe5ba763d664e17b4b4cd562b46c04438d9b6008572fccdc1320726c1555b2c64736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xAF 0xE5 0xBA PUSH23 0x3D664E17B4B4CD562B46C04438D9B6008572FCCDC13207 0x26 0xC1 SSTORE JUMPDEST 0x2C PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "777:5776:24:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220afe5ba763d664e17b4b4cd562b46c04438d9b6008572fccdc1320726c1555b2c64736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xAF 0xE5 0xBA PUSH23 0x3D664E17B4B4CD562B46C04438D9B6008572FCCDC13207 0x26 0xC1 SSTORE JUMPDEST 0x2C PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "777:5776:24:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "toInt128(int256)": "infinite",
                "toInt16(int256)": "infinite",
                "toInt256(uint256)": "infinite",
                "toInt32(int256)": "infinite",
                "toInt64(int256)": "infinite",
                "toInt8(int256)": "infinite",
                "toUint128(uint256)": "infinite",
                "toUint16(uint256)": "infinite",
                "toUint256(int256)": "infinite",
                "toUint32(uint256)": "infinite",
                "toUint64(uint256)": "infinite",
                "toUint8(uint256)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Wrappers over Solidity's uintXX/intXX casting operators with added overflow checks. Downcasting from uint256/int256 in Solidity does not revert on overflow. This can easily result in undesired exploitation or bugs, since developers usually assume that overflows raise errors. `SafeCast` restores this intuition by reverting the transaction when such an operation overflows. Using this library instead of the unchecked operations eliminates an entire class of bugs, so it's recommended to use it always. Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing all math on `uint256` and `int256` and then downcasting.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":\"SafeCastUpgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol": {
        "StringsUpgradeable": {
          "abi": [],
          "devdoc": {
            "details": "String operations.",
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220e130abf047cb33a418cca3be60c99f86e703924bb210fa2f09ddde90abd2c1b364736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE1 ADDRESS 0xAB CREATE SELFBALANCE 0xCB CALLER LOG4 XOR 0xCC LOG3 0xBE PUSH1 0xC9 SWAP16 DUP7 0xE7 SUB SWAP3 0x4B 0xB2 LT STATICCALL 0x2F MULMOD 0xDD 0xDE SWAP1 0xAB 0xD2 0xC1 0xB3 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "101:847:25:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220e130abf047cb33a418cca3be60c99f86e703924bb210fa2f09ddde90abd2c1b364736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE1 ADDRESS 0xAB CREATE SELFBALANCE 0xCB CALLER LOG4 XOR 0xCC LOG3 0xBE PUSH1 0xC9 SWAP16 DUP7 0xE7 SUB SWAP3 0x4B 0xB2 LT STATICCALL 0x2F MULMOD 0xDD 0xDE SWAP1 0xAB 0xD2 0xC1 0xB3 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "101:847:25:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "toString(uint256)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"String operations.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":\"StringsUpgradeable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary StringsUpgradeable {\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` representation.\\n     */\\n    function toString(uint256 value) internal pure returns (string memory) {\\n        // Inspired by OraclizeAPI's implementation - MIT licence\\n        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol\\n\\n        if (value == 0) {\\n            return \\\"0\\\";\\n        }\\n        uint256 temp = value;\\n        uint256 digits;\\n        while (temp != 0) {\\n            digits++;\\n            temp /= 10;\\n        }\\n        bytes memory buffer = new bytes(digits);\\n        uint256 index = digits - 1;\\n        temp = value;\\n        while (temp != 0) {\\n            buffer[index--] = bytes1(uint8(48 + temp % 10));\\n            temp /= 10;\\n        }\\n        return string(buffer);\\n    }\\n}\\n\",\"keccak256\":\"0x8d1ac29b8a8ed3cfebe5d8774b465441ae8931aaca549f84408e0b29a1191964\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@pooltogether/fixed-point/contracts/FixedPoint.sol": {
        "FixedPoint": {
          "abi": [],
          "devdoc": {
            "author": "Brendan Asselstine",
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220c7be8d39ee473681be23df874a35d7c0fb740d480d80bf32d07fa1b7dca81cd564736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC7 0xBE DUP14 CODECOPY 0xEE SELFBALANCE CALLDATASIZE DUP2 0xBE 0x23 0xDF DUP8 0x4A CALLDATALOAD 0xD7 0xC0 0xFB PUSH21 0xD480D80BF32D07FA1B7DCA81CD564736F6C634300 MOD 0xC STOP CALLER ",
              "sourceMap": "958:1718:26:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220c7be8d39ee473681be23df874a35d7c0fb740d480d80bf32d07fa1b7dca81cd564736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC7 0xBE DUP14 CODECOPY 0xEE SELFBALANCE CALLDATASIZE DUP2 0xBE 0x23 0xDF DUP8 0x4A CALLDATALOAD 0xD7 0xC0 0xFB PUSH21 0xD480D80BF32D07FA1B7DCA81CD564736F6C634300 MOD 0xC STOP CALLER ",
              "sourceMap": "958:1718:26:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "calculateMantissa(uint256,uint256)": "infinite",
                "divideUintByMantissa(uint256,uint256)": "infinite",
                "multiplyUintByMantissa(uint256,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"Brendan Asselstine\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Provides basic fixed point math calculations. This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":\"FixedPoint\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "notice": "Provides basic fixed point math calculations. This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.",
            "version": 1
          }
        }
      },
      "@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol": {
        "OpenZeppelinSafeMath_V3_3_0": {
          "abi": [],
          "devdoc": {
            "details": "Wrappers over Solidity's arithmetic operations with added overflow checks. Arithmetic operations in Solidity wrap on overflow. This can easily result in bugs, because programmers usually assume that an overflow raises an error, which is the standard behavior in high level programming languages. `SafeMath` restores this intuition by reverting the transaction when an operation overflows. Using this library instead of the unchecked operations eliminates an entire class of bugs, so it's recommended to use it always.",
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220682bc22d2da07399a7ba1db029dec5fdf195e3381cc6babd086c6e90703735bb64736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH9 0x2BC22D2DA07399A7BA SAR 0xB0 0x29 0xDE 0xC5 REVERT CALL SWAP6 0xE3 CODESIZE SHR 0xC6 0xBA 0xBD ADDMOD PUSH13 0x6E90703735BB64736F6C634300 MOD 0xC STOP CALLER ",
              "sourceMap": "689:4597:27:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220682bc22d2da07399a7ba1db029dec5fdf195e3381cc6babd086c6e90703735bb64736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH9 0x2BC22D2DA07399A7BA SAR 0xB0 0x29 0xDE 0xC5 REVERT CALL SWAP6 0xE3 CODESIZE SHR 0xC6 0xBA 0xBD ADDMOD PUSH13 0x6E90703735BB64736F6C634300 MOD 0xC STOP CALLER ",
              "sourceMap": "689:4597:27:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "add(uint256,uint256)": "infinite",
                "div(uint256,uint256)": "infinite",
                "div(uint256,uint256,string memory)": "infinite",
                "mod(uint256,uint256)": "infinite",
                "mod(uint256,uint256,string memory)": "infinite",
                "mul(uint256,uint256)": "infinite",
                "sub(uint256,uint256)": "infinite",
                "sub(uint256,uint256,string memory)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Wrappers over Solidity's arithmetic operations with added overflow checks. Arithmetic operations in Solidity wrap on overflow. This can easily result in bugs, because programmers usually assume that an overflow raises an error, which is the standard behavior in high level programming languages. `SafeMath` restores this intuition by reverting the transaction when an operation overflows. Using this library instead of the unchecked operations eliminates an entire class of bugs, so it's recommended to use it always.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":\"OpenZeppelinSafeMath_V3_3_0\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol": {
        "RNGInterface": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "uint32",
                  "name": "requestId",
                  "type": "uint32"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "randomNumber",
                  "type": "uint256"
                }
              ],
              "name": "RandomNumberCompleted",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "uint32",
                  "name": "requestId",
                  "type": "uint32"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "sender",
                  "type": "address"
                }
              ],
              "name": "RandomNumberRequested",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "getLastRequestId",
              "outputs": [
                {
                  "internalType": "uint32",
                  "name": "requestId",
                  "type": "uint32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "getRequestFee",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "feeToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "requestFee",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint32",
                  "name": "requestId",
                  "type": "uint32"
                }
              ],
              "name": "isRequestComplete",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "isCompleted",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint32",
                  "name": "requestId",
                  "type": "uint32"
                }
              ],
              "name": "randomNumber",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "randomNum",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "requestRandomNumber",
              "outputs": [
                {
                  "internalType": "uint32",
                  "name": "requestId",
                  "type": "uint32"
                },
                {
                  "internalType": "uint32",
                  "name": "lockBlock",
                  "type": "uint32"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "events": {
              "RandomNumberCompleted(uint32,uint256)": {
                "params": {
                  "randomNumber": "The random number produced by the 3rd-party service",
                  "requestId": "The indexed ID of the request used to get the results of the RNG service"
                }
              },
              "RandomNumberRequested(uint32,address)": {
                "params": {
                  "requestId": "The indexed ID of the request used to get the results of the RNG service",
                  "sender": "The indexed address of the sender of the request"
                }
              }
            },
            "kind": "dev",
            "methods": {
              "getLastRequestId()": {
                "returns": {
                  "requestId": "The last request id used in the last request"
                }
              },
              "getRequestFee()": {
                "returns": {
                  "feeToken": "The address of the token that is used to pay fees",
                  "requestFee": "The fee required to be paid to make a request"
                }
              },
              "isRequestComplete(uint32)": {
                "details": "For time-delayed requests, this function is used to check/confirm completion",
                "params": {
                  "requestId": "The ID of the request used to get the results of the RNG service"
                },
                "returns": {
                  "isCompleted": "True if the request has completed and a random number is available, false otherwise"
                }
              },
              "randomNumber(uint32)": {
                "params": {
                  "requestId": "The ID of the request used to get the results of the RNG service"
                },
                "returns": {
                  "randomNum": "The random number"
                }
              },
              "requestRandomNumber()": {
                "details": "Some services will complete the request immediately, others may have a time-delaySome services require payment in the form of a token, such as $LINK for Chainlink VRF",
                "returns": {
                  "lockBlock": "The block number at which the RNG service will start generating time-delayed randomness.  The calling contract should \"lock\" all activity until the result is available via the `requestId`",
                  "requestId": "The ID of the request used to get the results of the RNG service"
                }
              }
            },
            "title": "Random Number Generator Interface",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "getLastRequestId()": "19c2b4c3",
              "getRequestFee()": "0d37b537",
              "isRequestComplete(uint32)": "3a19b9bc",
              "randomNumber(uint32)": "9d2a5f98",
              "requestRandomNumber()": "8678a7b2"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"requestId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"randomNumber\",\"type\":\"uint256\"}],\"name\":\"RandomNumberCompleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"requestId\",\"type\":\"uint32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RandomNumberRequested\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"getLastRequestId\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"requestId\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRequestFee\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"requestFee\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"requestId\",\"type\":\"uint32\"}],\"name\":\"isRequestComplete\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isCompleted\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"requestId\",\"type\":\"uint32\"}],\"name\":\"randomNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"randomNum\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requestRandomNumber\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"requestId\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"lockBlock\",\"type\":\"uint32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"RandomNumberCompleted(uint32,uint256)\":{\"params\":{\"randomNumber\":\"The random number produced by the 3rd-party service\",\"requestId\":\"The indexed ID of the request used to get the results of the RNG service\"}},\"RandomNumberRequested(uint32,address)\":{\"params\":{\"requestId\":\"The indexed ID of the request used to get the results of the RNG service\",\"sender\":\"The indexed address of the sender of the request\"}}},\"kind\":\"dev\",\"methods\":{\"getLastRequestId()\":{\"returns\":{\"requestId\":\"The last request id used in the last request\"}},\"getRequestFee()\":{\"returns\":{\"feeToken\":\"The address of the token that is used to pay fees\",\"requestFee\":\"The fee required to be paid to make a request\"}},\"isRequestComplete(uint32)\":{\"details\":\"For time-delayed requests, this function is used to check/confirm completion\",\"params\":{\"requestId\":\"The ID of the request used to get the results of the RNG service\"},\"returns\":{\"isCompleted\":\"True if the request has completed and a random number is available, false otherwise\"}},\"randomNumber(uint32)\":{\"params\":{\"requestId\":\"The ID of the request used to get the results of the RNG service\"},\"returns\":{\"randomNum\":\"The random number\"}},\"requestRandomNumber()\":{\"details\":\"Some services will complete the request immediately, others may have a time-delaySome services require payment in the form of a token, such as $LINK for Chainlink VRF\",\"returns\":{\"lockBlock\":\"The block number at which the RNG service will start generating time-delayed randomness.  The calling contract should \\\"lock\\\" all activity until the result is available via the `requestId`\",\"requestId\":\"The ID of the request used to get the results of the RNG service\"}}},\"title\":\"Random Number Generator Interface\",\"version\":1},\"userdoc\":{\"events\":{\"RandomNumberCompleted(uint32,uint256)\":{\"notice\":\"Emitted when an existing request for a random number has been completed\"},\"RandomNumberRequested(uint32,address)\":{\"notice\":\"Emitted when a new request for a random number has been submitted\"}},\"kind\":\"user\",\"methods\":{\"getLastRequestId()\":{\"notice\":\"Gets the last request id used by the RNG service\"},\"getRequestFee()\":{\"notice\":\"Gets the Fee for making a Request against an RNG service\"},\"isRequestComplete(uint32)\":{\"notice\":\"Checks if the request for randomness from the 3rd-party service has completed\"},\"randomNumber(uint32)\":{\"notice\":\"Gets the random number produced by the 3rd-party service\"},\"requestRandomNumber()\":{\"notice\":\"Sends a request for a random number to the 3rd-party service\"}},\"notice\":\"Provides an interface for requesting random numbers from 3rd-party RNG services (Chainlink VRF, Starkware VDF, etc..)\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\":\"RNGInterface\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.6.0;\\n\\n/// @title Random Number Generator Interface\\n/// @notice Provides an interface for requesting random numbers from 3rd-party RNG services (Chainlink VRF, Starkware VDF, etc..)\\ninterface RNGInterface {\\n\\n  /// @notice Emitted when a new request for a random number has been submitted\\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\\n  /// @param sender The indexed address of the sender of the request\\n  event RandomNumberRequested(uint32 indexed requestId, address indexed sender);\\n\\n  /// @notice Emitted when an existing request for a random number has been completed\\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\\n  /// @param randomNumber The random number produced by the 3rd-party service\\n  event RandomNumberCompleted(uint32 indexed requestId, uint256 randomNumber);\\n\\n  /// @notice Gets the last request id used by the RNG service\\n  /// @return requestId The last request id used in the last request\\n  function getLastRequestId() external view returns (uint32 requestId);\\n\\n  /// @notice Gets the Fee for making a Request against an RNG service\\n  /// @return feeToken The address of the token that is used to pay fees\\n  /// @return requestFee The fee required to be paid to make a request\\n  function getRequestFee() external view returns (address feeToken, uint256 requestFee);\\n\\n  /// @notice Sends a request for a random number to the 3rd-party service\\n  /// @dev Some services will complete the request immediately, others may have a time-delay\\n  /// @dev Some services require payment in the form of a token, such as $LINK for Chainlink VRF\\n  /// @return requestId The ID of the request used to get the results of the RNG service\\n  /// @return lockBlock The block number at which the RNG service will start generating time-delayed randomness.  The calling contract\\n  /// should \\\"lock\\\" all activity until the result is available via the `requestId`\\n  function requestRandomNumber() external returns (uint32 requestId, uint32 lockBlock);\\n\\n  /// @notice Checks if the request for randomness from the 3rd-party service has completed\\n  /// @dev For time-delayed requests, this function is used to check/confirm completion\\n  /// @param requestId The ID of the request used to get the results of the RNG service\\n  /// @return isCompleted True if the request has completed and a random number is available, false otherwise\\n  function isRequestComplete(uint32 requestId) external view returns (bool isCompleted);\\n\\n  /// @notice Gets the random number produced by the 3rd-party service\\n  /// @param requestId The ID of the request used to get the results of the RNG service\\n  /// @return randomNum The random number\\n  function randomNumber(uint32 requestId) external returns (uint256 randomNum);\\n}\\n\",\"keccak256\":\"0xf917c68439d7476cd226f475e8fce940e0cf1d32cb0ff12e8537072a07f2b1da\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "events": {
              "RandomNumberCompleted(uint32,uint256)": {
                "notice": "Emitted when an existing request for a random number has been completed"
              },
              "RandomNumberRequested(uint32,address)": {
                "notice": "Emitted when a new request for a random number has been submitted"
              }
            },
            "kind": "user",
            "methods": {
              "getLastRequestId()": {
                "notice": "Gets the last request id used by the RNG service"
              },
              "getRequestFee()": {
                "notice": "Gets the Fee for making a Request against an RNG service"
              },
              "isRequestComplete(uint32)": {
                "notice": "Checks if the request for randomness from the 3rd-party service has completed"
              },
              "randomNumber(uint32)": {
                "notice": "Gets the random number produced by the 3rd-party service"
              },
              "requestRandomNumber()": {
                "notice": "Sends a request for a random number to the 3rd-party service"
              }
            },
            "notice": "Provides an interface for requesting random numbers from 3rd-party RNG services (Chainlink VRF, Starkware VDF, etc..)",
            "version": 1
          }
        }
      },
      "@pooltogether/uniform-random-number/contracts/UniformRandomNumber.sol": {
        "UniformRandomNumber": {
          "abi": [],
          "devdoc": {
            "author": "Brendan Asselstine",
            "details": "Thanks to https://medium.com/hownetworks/dont-waste-cycles-with-modulo-bias-35b6fdafcf94",
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220431208c98ab9aab4da3d9469fefe86e42e0c10561b3386a34849d81823864ec464736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 NUMBER SLT ADDMOD 0xC9 DUP11 0xB9 0xAA 0xB4 0xDA RETURNDATASIZE SWAP5 PUSH10 0xFEFE86E42E0C10561B33 DUP7 LOG3 0x48 0x49 0xD8 XOR 0x23 DUP7 0x4E 0xC4 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "928:686:29:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220431208c98ab9aab4da3d9469fefe86e42e0c10561b3386a34849d81823864ec464736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 NUMBER SLT ADDMOD 0xC9 DUP11 0xB9 0xAA 0xB4 0xDA RETURNDATASIZE SWAP5 PUSH10 0xFEFE86E42E0C10561B33 DUP7 LOG3 0x48 0x49 0xD8 XOR 0x23 DUP7 0x4E 0xC4 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "928:686:29:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "uniform(uint256,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"Brendan Asselstine\",\"details\":\"Thanks to https://medium.com/hownetworks/dont-waste-cycles-with-modulo-bias-35b6fdafcf94\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A library that uses entropy to select a random number within a bound.  Compensates for modulo bias.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@pooltogether/uniform-random-number/contracts/UniformRandomNumber.sol\":\"UniformRandomNumber\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@pooltogether/uniform-random-number/contracts/UniformRandomNumber.sol\":{\"content\":\"/**\\nCopyright 2019 PoolTogether LLC\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice A library that uses entropy to select a random number within a bound.  Compensates for modulo bias.\\n * @dev Thanks to https://medium.com/hownetworks/dont-waste-cycles-with-modulo-bias-35b6fdafcf94\\n */\\nlibrary UniformRandomNumber {\\n  /// @notice Select a random number without modulo bias using a random seed and upper bound\\n  /// @param _entropy The seed for randomness\\n  /// @param _upperBound The upper bound of the desired number\\n  /// @return A random number less than the _upperBound\\n  function uniform(uint256 _entropy, uint256 _upperBound) internal pure returns (uint256) {\\n    require(_upperBound > 0, \\\"UniformRand/min-bound\\\");\\n    uint256 min = -_upperBound % _upperBound;\\n    uint256 random = _entropy;\\n    while (true) {\\n      if (random >= min) {\\n        break;\\n      }\\n      random = uint256(keccak256(abi.encodePacked(random)));\\n    }\\n    return random % _upperBound;\\n  }\\n}\",\"keccak256\":\"0x0d86eb3349d8a9e226ff6f3328a6a79bbf872859a4afbe489051fbf3b8550df4\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "notice": "A library that uses entropy to select a random number within a bound.  Compensates for modulo bias.",
            "version": 1
          }
        }
      },
      "@pooltogether/yield-source-interface/contracts/IYieldSource.sol": {
        "IYieldSource": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "addr",
                  "type": "address"
                }
              ],
              "name": "balanceOfToken",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "depositToken",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "redeemToken",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                }
              ],
              "name": "supplyTokenTo",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "balanceOfToken(address)": {
                "returns": {
                  "_0": "The underlying balance of asset tokens"
                }
              },
              "depositToken()": {
                "returns": {
                  "_0": "The ERC20 asset token"
                }
              },
              "redeemToken(uint256)": {
                "params": {
                  "amount": "The amount of `token()` to withdraw.  Denominated in `token()` as above."
                },
                "returns": {
                  "_0": "The actual amount of tokens that were redeemed."
                }
              },
              "supplyTokenTo(uint256,address)": {
                "params": {
                  "amount": "The amount of `token()` to be supplied",
                  "to": "The user whose balance will receive the tokens"
                }
              }
            },
            "title": "Defines the functions used to interact with a yield source.  The Prize Pool inherits this contract.",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "balanceOfToken(address)": "b99152d0",
              "depositToken()": "c89039c5",
              "redeemToken(uint256)": "013054c2",
              "supplyTokenTo(uint256,address)": "87a6eeef"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"balanceOfToken\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"depositToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"redeemToken\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"supplyTokenTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"balanceOfToken(address)\":{\"returns\":{\"_0\":\"The underlying balance of asset tokens\"}},\"depositToken()\":{\"returns\":{\"_0\":\"The ERC20 asset token\"}},\"redeemToken(uint256)\":{\"params\":{\"amount\":\"The amount of `token()` to withdraw.  Denominated in `token()` as above.\"},\"returns\":{\"_0\":\"The actual amount of tokens that were redeemed.\"}},\"supplyTokenTo(uint256,address)\":{\"params\":{\"amount\":\"The amount of `token()` to be supplied\",\"to\":\"The user whose balance will receive the tokens\"}}},\"title\":\"Defines the functions used to interact with a yield source.  The Prize Pool inherits this contract.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"balanceOfToken(address)\":{\"notice\":\"Returns the total balance (in asset tokens).  This includes the deposits and interest.\"},\"depositToken()\":{\"notice\":\"Returns the ERC20 asset token used for deposits.\"},\"redeemToken(uint256)\":{\"notice\":\"Redeems tokens from the yield source.\"},\"supplyTokenTo(uint256,address)\":{\"notice\":\"Supplies tokens to the yield source.  Allows assets to be supplied on other user's behalf using the `to` param.\"}},\"notice\":\"Prize Pools subclasses need to implement this interface so that yield can be generated.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@pooltogether/yield-source-interface/contracts/IYieldSource.sol\":\"IYieldSource\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@pooltogether/yield-source-interface/contracts/IYieldSource.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.4.0 <0.8.0;\\n\\n/// @title Defines the functions used to interact with a yield source.  The Prize Pool inherits this contract.\\n/// @notice Prize Pools subclasses need to implement this interface so that yield can be generated.\\ninterface IYieldSource {\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function depositToken() external view returns (address);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function balanceOfToken(address addr) external returns (uint256);\\n\\n  /// @notice Supplies tokens to the yield source.  Allows assets to be supplied on other user's behalf using the `to` param.\\n  /// @param amount The amount of `token()` to be supplied\\n  /// @param to The user whose balance will receive the tokens\\n  function supplyTokenTo(uint256 amount, address to) external;\\n\\n  /// @notice Redeems tokens from the yield source.\\n  /// @param amount The amount of `token()` to withdraw.  Denominated in `token()` as above.\\n  /// @return The actual amount of tokens that were redeemed.\\n  function redeemToken(uint256 amount) external returns (uint256);\\n\\n}\\n\",\"keccak256\":\"0xee862089c29ec1f9b2a1df7c01953d88ef5dfcfb2c2198e8926f692ec76537f1\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "balanceOfToken(address)": {
                "notice": "Returns the total balance (in asset tokens).  This includes the deposits and interest."
              },
              "depositToken()": {
                "notice": "Returns the ERC20 asset token used for deposits."
              },
              "redeemToken(uint256)": {
                "notice": "Redeems tokens from the yield source."
              },
              "supplyTokenTo(uint256,address)": {
                "notice": "Supplies tokens to the yield source.  Allows assets to be supplied on other user's behalf using the `to` param."
              }
            },
            "notice": "Prize Pools subclasses need to implement this interface so that yield can be generated.",
            "version": 1
          }
        }
      },
      "contracts/Constants.sol": {
        "Constants": {
          "abi": [
            {
              "inputs": [],
              "name": "ERC165_INTERFACE_ID_ERC165",
              "outputs": [
                {
                  "internalType": "bytes4",
                  "name": "",
                  "type": "bytes4"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "ERC165_INTERFACE_ID_ERC721",
              "outputs": [
                {
                  "internalType": "bytes4",
                  "name": "",
                  "type": "bytes4"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60b7610025600b82828239805160001a60731461001857fe5b30600052607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610603d5760003560e01c8063a5ab436d146042578063c92669ed146065575b600080fd5b6048606b565b604080516001600160e01b03199092168252519081900360200190f35b60486076565b6301ffc9a760e01b81565b6380ac58cd60e01b8156fea2646970667358221220b66d342f34c1b4d3d1a8cd652f1a471588d76cd8fe4f332c612cd4e12e43703b64736f6c634300060c0033",
              "opcodes": "PUSH1 0xB7 PUSH2 0x25 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH2 0x18 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH1 0x3D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA5AB436D EQ PUSH1 0x42 JUMPI DUP1 PUSH4 0xC92669ED EQ PUSH1 0x65 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x48 PUSH1 0x6B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x48 PUSH1 0x76 JUMP JUMPDEST PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL DUP2 JUMP JUMPDEST PUSH4 0x80AC58CD PUSH1 0xE0 SHL DUP2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB6 PUSH14 0x342F34C1B4D3D1A8CD652F1A4715 DUP9 0xD7 PUSH13 0xD8FE4F332C612CD4E12E43703B PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "62:153:31:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "7300000000000000000000000000000000000000003014608060405260043610603d5760003560e01c8063a5ab436d146042578063c92669ed146065575b600080fd5b6048606b565b604080516001600160e01b03199092168252519081900360200190f35b60486076565b6301ffc9a760e01b81565b6380ac58cd60e01b8156fea2646970667358221220b66d342f34c1b4d3d1a8cd652f1a471588d76cd8fe4f332c612cd4e12e43703b64736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH1 0x3D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA5AB436D EQ PUSH1 0x42 JUMPI DUP1 PUSH4 0xC92669ED EQ PUSH1 0x65 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x48 PUSH1 0x6B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x48 PUSH1 0x76 JUMP JUMPDEST PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL DUP2 JUMP JUMPDEST PUSH4 0x80AC58CD PUSH1 0xE0 SHL DUP2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB6 PUSH14 0x342F34C1B4D3D1A8CD652F1A4715 DUP9 0xD7 PUSH13 0xD8FE4F332C612CD4E12E43703B PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "62:153:31:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84:62;;;:::i;:::-;;;;-1:-1:-1;;;;;;84:62:31;;;;;;;;;;;;;;150;;;:::i;84:::-;-1:-1:-1;;;84:62:31;:::o;150:::-;-1:-1:-1;;;150:62:31;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "36600",
                "executionCost": "115",
                "totalCost": "36715"
              },
              "external": {
                "ERC165_INTERFACE_ID_ERC165()": "190",
                "ERC165_INTERFACE_ID_ERC721()": "212"
              }
            },
            "methodIdentifiers": {
              "ERC165_INTERFACE_ID_ERC165()": "a5ab436d",
              "ERC165_INTERFACE_ID_ERC721()": "c92669ed"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ERC165_INTERFACE_ID_ERC165\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ERC165_INTERFACE_ID_ERC721\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Constants.sol\":\"Constants\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary Constants {\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC721 = 0x80ac58cd;\\n}\",\"keccak256\":\"0x5dc8f8bda4e9668a9ffae6a941774f849adcb368cc2275fd8a91e6ada8fad7fb\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/builders/ControlledTokenBuilder.sol": {
        "ControlledTokenBuilder": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "contract ControlledTokenProxyFactory",
                  "name": "_controlledTokenProxyFactory",
                  "type": "address"
                },
                {
                  "internalType": "contract TicketProxyFactory",
                  "name": "_ticketProxyFactory",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                }
              ],
              "name": "CreatedControlledToken",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                }
              ],
              "name": "CreatedTicket",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "controlledTokenProxyFactory",
              "outputs": [
                {
                  "internalType": "contract ControlledTokenProxyFactory",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "components": [
                    {
                      "internalType": "string",
                      "name": "name",
                      "type": "string"
                    },
                    {
                      "internalType": "string",
                      "name": "symbol",
                      "type": "string"
                    },
                    {
                      "internalType": "uint8",
                      "name": "decimals",
                      "type": "uint8"
                    },
                    {
                      "internalType": "contract TokenControllerInterface",
                      "name": "controller",
                      "type": "address"
                    }
                  ],
                  "internalType": "struct ControlledTokenBuilder.ControlledTokenConfig",
                  "name": "config",
                  "type": "tuple"
                }
              ],
              "name": "createControlledToken",
              "outputs": [
                {
                  "internalType": "contract ControlledToken",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "components": [
                    {
                      "internalType": "string",
                      "name": "name",
                      "type": "string"
                    },
                    {
                      "internalType": "string",
                      "name": "symbol",
                      "type": "string"
                    },
                    {
                      "internalType": "uint8",
                      "name": "decimals",
                      "type": "uint8"
                    },
                    {
                      "internalType": "contract TokenControllerInterface",
                      "name": "controller",
                      "type": "address"
                    }
                  ],
                  "internalType": "struct ControlledTokenBuilder.ControlledTokenConfig",
                  "name": "config",
                  "type": "tuple"
                }
              ],
              "name": "createTicket",
              "outputs": [
                {
                  "internalType": "contract Ticket",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "ticketProxyFactory",
              "outputs": [
                {
                  "internalType": "contract TicketProxyFactory",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506040516106f03803806106f083398101604081905261002f916100b5565b6001600160a01b03821661005e5760405162461bcd60e51b815260040161005590610140565b60405180910390fd5b6001600160a01b0381166100845760405162461bcd60e51b8152600401610055906100ee565b600080546001600160a01b039384166001600160a01b031991821617909155600180549290931691161790556101b5565b600080604083850312156100c7578182fd5b82516100d28161019d565b60208401519092506100e38161019d565b809150509250929050565b60208082526032908201527f436f6e74726f6c6c6564546f6b656e4275696c6465722f7469636b657450726f6040820152717879466163746f72792d6e6f742d7a65726f60701b606082015260800190565b6020808252603b908201527f436f6e74726f6c6c6564546f6b656e4275696c6465722f636f6e74726f6c6c6560408201527f64546f6b656e50726f7879466163746f72792d6e6f742d7a65726f0000000000606082015260800190565b6001600160a01b03811681146101b257600080fd5b50565b61052c806101c46000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80636a81d8bd146100515780638c0cd38d1461006f5780638e22585d14610082578063aa3b296c14610095575b600080fd5b61005961009d565b6040516100669190610430565b60405180910390f35b61005961007d3660046103ad565b6100ac565b6100596100903660046103ad565b6101ff565b61005961035f565b6000546001600160a01b031681565b6000805460408051633bf206a360e21b8152905183926001600160a01b03169163efc81a8c91600480830192602092919082900301818787803b1580156100f257600080fd5b505af1158015610106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061012a919061036e565b90506001600160a01b03811663de7ea79d6101458580610492565b6101526020880188610492565b61016260608a0160408b016103e5565b61017260808b0160608c01610391565b6040518763ffffffff1660e01b815260040161019396959493929190610444565b600060405180830381600087803b1580156101ad57600080fd5b505af11580156101c1573d6000803e3d6000fd5b50506040516001600160a01b03841692507fe3d5734f17a493c850907f8a8366a543676afd8eeb9b7cd16e22c998297d8ebd9150600090a292915050565b600080600160009054906101000a90046001600160a01b03166001600160a01b031663efc81a8c6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561025257600080fd5b505af1158015610266573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061028a919061036e565b90506001600160a01b03811663de7ea79d6102a58580610492565b6102b26020880188610492565b6102c260608a0160408b016103e5565b6102d260808b0160608c01610391565b6040518763ffffffff1660e01b81526004016102f396959493929190610444565b600060405180830381600087803b15801561030d57600080fd5b505af1158015610321573d6000803e3d6000fd5b50506040516001600160a01b03841692507ff771026f1a6d488c23bb75726c18bcc96f290b64209576da54a46c80fd335cab9150600090a292915050565b6001546001600160a01b031681565b60006020828403121561037f578081fd5b815161038a816104de565b9392505050565b6000602082840312156103a2578081fd5b813561038a816104de565b6000602082840312156103be578081fd5b813567ffffffffffffffff8111156103d4578182fd5b82016080818503121561038a578182fd5b6000602082840312156103f6578081fd5b813560ff8116811461038a578182fd5b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b6001600160a01b0391909116815260200190565b60006080825261045860808301888a610406565b828103602084015261046b818789610406565b60ff95909516604084015250506001600160a01b0391909116606090910152949350505050565b6000808335601e198436030181126104a8578283fd5b83018035915067ffffffffffffffff8211156104c2578283fd5b6020019150368190038213156104d757600080fd5b9250929050565b6001600160a01b03811681146104f357600080fd5b5056fea2646970667358221220a4a35af99067980efc0c3e204c8044a6460eec2ff71de6d27e066e36e230871764736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x6F0 CODESIZE SUB DUP1 PUSH2 0x6F0 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x2F SWAP2 PUSH2 0xB5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x5E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x55 SWAP1 PUSH2 0x140 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x84 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x55 SWAP1 PUSH2 0xEE JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP3 SWAP1 SWAP4 AND SWAP2 AND OR SWAP1 SSTORE PUSH2 0x1B5 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xC7 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH2 0xD2 DUP2 PUSH2 0x19D JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH2 0xE3 DUP2 PUSH2 0x19D JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x32 SWAP1 DUP3 ADD MSTORE PUSH32 0x436F6E74726F6C6C6564546F6B656E4275696C6465722F7469636B657450726F PUSH1 0x40 DUP3 ADD MSTORE PUSH18 0x7879466163746F72792D6E6F742D7A65726F PUSH1 0x70 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x3B SWAP1 DUP3 ADD MSTORE PUSH32 0x436F6E74726F6C6C6564546F6B656E4275696C6465722F636F6E74726F6C6C65 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x64546F6B656E50726F7879466163746F72792D6E6F742D7A65726F0000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x1B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x52C DUP1 PUSH2 0x1C4 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6A81D8BD EQ PUSH2 0x51 JUMPI DUP1 PUSH4 0x8C0CD38D EQ PUSH2 0x6F JUMPI DUP1 PUSH4 0x8E22585D EQ PUSH2 0x82 JUMPI DUP1 PUSH4 0xAA3B296C EQ PUSH2 0x95 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x59 PUSH2 0x9D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x66 SWAP2 SWAP1 PUSH2 0x430 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x59 PUSH2 0x7D CALLDATASIZE PUSH1 0x4 PUSH2 0x3AD JUMP JUMPDEST PUSH2 0xAC JUMP JUMPDEST PUSH2 0x59 PUSH2 0x90 CALLDATASIZE PUSH1 0x4 PUSH2 0x3AD JUMP JUMPDEST PUSH2 0x1FF JUMP JUMPDEST PUSH2 0x59 PUSH2 0x35F JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x3BF206A3 PUSH1 0xE2 SHL DUP2 MSTORE SWAP1 MLOAD DUP4 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xEFC81A8C SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x106 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x12A SWAP2 SWAP1 PUSH2 0x36E JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH4 0xDE7EA79D PUSH2 0x145 DUP6 DUP1 PUSH2 0x492 JUMP JUMPDEST PUSH2 0x152 PUSH1 0x20 DUP9 ADD DUP9 PUSH2 0x492 JUMP JUMPDEST PUSH2 0x162 PUSH1 0x60 DUP11 ADD PUSH1 0x40 DUP12 ADD PUSH2 0x3E5 JUMP JUMPDEST PUSH2 0x172 PUSH1 0x80 DUP12 ADD PUSH1 0x60 DUP13 ADD PUSH2 0x391 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP8 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x193 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x444 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1C1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP3 POP PUSH32 0xE3D5734F17A493C850907F8A8366A543676AFD8EEB9B7CD16E22C998297D8EBD SWAP2 POP PUSH1 0x0 SWAP1 LOG2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xEFC81A8C PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x252 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x266 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x28A SWAP2 SWAP1 PUSH2 0x36E JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH4 0xDE7EA79D PUSH2 0x2A5 DUP6 DUP1 PUSH2 0x492 JUMP JUMPDEST PUSH2 0x2B2 PUSH1 0x20 DUP9 ADD DUP9 PUSH2 0x492 JUMP JUMPDEST PUSH2 0x2C2 PUSH1 0x60 DUP11 ADD PUSH1 0x40 DUP12 ADD PUSH2 0x3E5 JUMP JUMPDEST PUSH2 0x2D2 PUSH1 0x80 DUP12 ADD PUSH1 0x60 DUP13 ADD PUSH2 0x391 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP8 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2F3 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x444 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x30D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x321 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP3 POP PUSH32 0xF771026F1A6D488C23BB75726C18BCC96F290B64209576DA54A46C80FD335CAB SWAP2 POP PUSH1 0x0 SWAP1 LOG2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x37F JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x38A DUP2 PUSH2 0x4DE JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3A2 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x38A DUP2 PUSH2 0x4DE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3BE JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3D4 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 ADD PUSH1 0x80 DUP2 DUP6 SUB SLT ISZERO PUSH2 0x38A JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3F6 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x38A JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP5 MSTORE DUP3 DUP3 PUSH1 0x20 DUP7 ADD CALLDATACOPY DUP1 PUSH1 0x20 DUP5 DUP7 ADD ADD MSTORE PUSH1 0x20 PUSH1 0x1F NOT PUSH1 0x1F DUP6 ADD AND DUP6 ADD ADD SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 MSTORE PUSH2 0x458 PUSH1 0x80 DUP4 ADD DUP9 DUP11 PUSH2 0x406 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x46B DUP2 DUP8 DUP10 PUSH2 0x406 JUMP JUMPDEST PUSH1 0xFF SWAP6 SWAP1 SWAP6 AND PUSH1 0x40 DUP5 ADD MSTORE POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND PUSH1 0x60 SWAP1 SWAP2 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH1 0x1E NOT DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x4A8 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x4C2 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x4D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x4F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 LOG4 LOG3 GAS 0xF9 SWAP1 PUSH8 0x980EFC0C3E204C80 DIFFICULTY 0xA6 CHAINID 0xE 0xEC 0x2F 0xF7 SAR 0xE6 0xD2 PUSH31 0x66E36E230871764736F6C634300060C003300000000000000000000000000 ",
              "sourceMap": "237:1579:32:-:0;;;626:485;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;770:51:32;;762:123;;;;-1:-1:-1;;;762:123:32;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;899:42:32;;891:105;;;;-1:-1:-1;;;891:105:32;;;;;;;:::i;:::-;1002:27;:58;;-1:-1:-1;;;;;1002:58:32;;;-1:-1:-1;;;;;;1002:58:32;;;;;;;;1066:40;;;;;;;;;;;237:1579;;417:529:-1;;;614:2;602:9;593:7;589:23;585:32;582:2;;;-1:-1;;620:12;582:2;126:6;120:13;138:70;202:5;138:70;:::i;:::-;820:2;898:22;;326:13;672:111;;-1:-1;344:61;326:13;344:61;:::i;:::-;828:102;;;;576:370;;;;;:::o;1754:416::-;1954:2;1968:47;;;1178:2;1939:18;;;2704:19;1214:34;2744:14;;;1194:55;-1:-1;;;1269:12;;;1262:42;1323:12;;;1925:245::o;2177:416::-;2377:2;2391:47;;;1574:2;2362:18;;;2704:19;1610:34;2744:14;;;1590:55;1679:29;1665:12;;;1658:51;1728:12;;;2348:245::o;3259:191::-;-1:-1;;;;;3193:54;;3355:72;;3345:2;;3441:1;;3431:12;3345:2;3339:111;:::o;:::-;237:1579:32;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506004361061004c5760003560e01c80636a81d8bd146100515780638c0cd38d1461006f5780638e22585d14610082578063aa3b296c14610095575b600080fd5b61005961009d565b6040516100669190610430565b60405180910390f35b61005961007d3660046103ad565b6100ac565b6100596100903660046103ad565b6101ff565b61005961035f565b6000546001600160a01b031681565b6000805460408051633bf206a360e21b8152905183926001600160a01b03169163efc81a8c91600480830192602092919082900301818787803b1580156100f257600080fd5b505af1158015610106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061012a919061036e565b90506001600160a01b03811663de7ea79d6101458580610492565b6101526020880188610492565b61016260608a0160408b016103e5565b61017260808b0160608c01610391565b6040518763ffffffff1660e01b815260040161019396959493929190610444565b600060405180830381600087803b1580156101ad57600080fd5b505af11580156101c1573d6000803e3d6000fd5b50506040516001600160a01b03841692507fe3d5734f17a493c850907f8a8366a543676afd8eeb9b7cd16e22c998297d8ebd9150600090a292915050565b600080600160009054906101000a90046001600160a01b03166001600160a01b031663efc81a8c6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561025257600080fd5b505af1158015610266573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061028a919061036e565b90506001600160a01b03811663de7ea79d6102a58580610492565b6102b26020880188610492565b6102c260608a0160408b016103e5565b6102d260808b0160608c01610391565b6040518763ffffffff1660e01b81526004016102f396959493929190610444565b600060405180830381600087803b15801561030d57600080fd5b505af1158015610321573d6000803e3d6000fd5b50506040516001600160a01b03841692507ff771026f1a6d488c23bb75726c18bcc96f290b64209576da54a46c80fd335cab9150600090a292915050565b6001546001600160a01b031681565b60006020828403121561037f578081fd5b815161038a816104de565b9392505050565b6000602082840312156103a2578081fd5b813561038a816104de565b6000602082840312156103be578081fd5b813567ffffffffffffffff8111156103d4578182fd5b82016080818503121561038a578182fd5b6000602082840312156103f6578081fd5b813560ff8116811461038a578182fd5b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b6001600160a01b0391909116815260200190565b60006080825261045860808301888a610406565b828103602084015261046b818789610406565b60ff95909516604084015250506001600160a01b0391909116606090910152949350505050565b6000808335601e198436030181126104a8578283fd5b83018035915067ffffffffffffffff8211156104c2578283fd5b6020019150368190038213156104d757600080fd5b9250929050565b6001600160a01b03811681146104f357600080fd5b5056fea2646970667358221220a4a35af99067980efc0c3e204c8044a6460eec2ff71de6d27e066e36e230871764736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6A81D8BD EQ PUSH2 0x51 JUMPI DUP1 PUSH4 0x8C0CD38D EQ PUSH2 0x6F JUMPI DUP1 PUSH4 0x8E22585D EQ PUSH2 0x82 JUMPI DUP1 PUSH4 0xAA3B296C EQ PUSH2 0x95 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x59 PUSH2 0x9D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x66 SWAP2 SWAP1 PUSH2 0x430 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x59 PUSH2 0x7D CALLDATASIZE PUSH1 0x4 PUSH2 0x3AD JUMP JUMPDEST PUSH2 0xAC JUMP JUMPDEST PUSH2 0x59 PUSH2 0x90 CALLDATASIZE PUSH1 0x4 PUSH2 0x3AD JUMP JUMPDEST PUSH2 0x1FF JUMP JUMPDEST PUSH2 0x59 PUSH2 0x35F JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x3BF206A3 PUSH1 0xE2 SHL DUP2 MSTORE SWAP1 MLOAD DUP4 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xEFC81A8C SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x106 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x12A SWAP2 SWAP1 PUSH2 0x36E JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH4 0xDE7EA79D PUSH2 0x145 DUP6 DUP1 PUSH2 0x492 JUMP JUMPDEST PUSH2 0x152 PUSH1 0x20 DUP9 ADD DUP9 PUSH2 0x492 JUMP JUMPDEST PUSH2 0x162 PUSH1 0x60 DUP11 ADD PUSH1 0x40 DUP12 ADD PUSH2 0x3E5 JUMP JUMPDEST PUSH2 0x172 PUSH1 0x80 DUP12 ADD PUSH1 0x60 DUP13 ADD PUSH2 0x391 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP8 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x193 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x444 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1C1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP3 POP PUSH32 0xE3D5734F17A493C850907F8A8366A543676AFD8EEB9B7CD16E22C998297D8EBD SWAP2 POP PUSH1 0x0 SWAP1 LOG2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xEFC81A8C PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x252 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x266 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x28A SWAP2 SWAP1 PUSH2 0x36E JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH4 0xDE7EA79D PUSH2 0x2A5 DUP6 DUP1 PUSH2 0x492 JUMP JUMPDEST PUSH2 0x2B2 PUSH1 0x20 DUP9 ADD DUP9 PUSH2 0x492 JUMP JUMPDEST PUSH2 0x2C2 PUSH1 0x60 DUP11 ADD PUSH1 0x40 DUP12 ADD PUSH2 0x3E5 JUMP JUMPDEST PUSH2 0x2D2 PUSH1 0x80 DUP12 ADD PUSH1 0x60 DUP13 ADD PUSH2 0x391 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP8 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x2F3 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x444 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x30D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x321 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP3 POP PUSH32 0xF771026F1A6D488C23BB75726C18BCC96F290B64209576DA54A46C80FD335CAB SWAP2 POP PUSH1 0x0 SWAP1 LOG2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x37F JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x38A DUP2 PUSH2 0x4DE JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3A2 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x38A DUP2 PUSH2 0x4DE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3BE JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3D4 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 ADD PUSH1 0x80 DUP2 DUP6 SUB SLT ISZERO PUSH2 0x38A JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3F6 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x38A JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP5 MSTORE DUP3 DUP3 PUSH1 0x20 DUP7 ADD CALLDATACOPY DUP1 PUSH1 0x20 DUP5 DUP7 ADD ADD MSTORE PUSH1 0x20 PUSH1 0x1F NOT PUSH1 0x1F DUP6 ADD AND DUP6 ADD ADD SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 MSTORE PUSH2 0x458 PUSH1 0x80 DUP4 ADD DUP9 DUP11 PUSH2 0x406 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x46B DUP2 DUP8 DUP10 PUSH2 0x406 JUMP JUMPDEST PUSH1 0xFF SWAP6 SWAP1 SWAP6 AND PUSH1 0x40 DUP5 ADD MSTORE POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND PUSH1 0x60 SWAP1 SWAP2 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH1 0x1E NOT DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x4A8 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x4C2 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x4D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x4F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 LOG4 LOG3 GAS 0xF9 SWAP1 PUSH8 0x980EFC0C3E204C80 DIFFICULTY 0xA6 CHAINID 0xE 0xEC 0x2F 0xF7 SAR 0xE6 0xD2 PUSH31 0x66E36E230871764736F6C634300060C003300000000000000000000000000 ",
              "sourceMap": "237:1579:32:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;376:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1115:370;;;;;;:::i;:::-;;:::i;1489:325::-;;;;;;:::i;:::-;;:::i;442:44::-;;;:::i;376:62::-;;;-1:-1:-1;;;;;376:62:32;;:::o;1115:370::-;1211:15;1258:27;;:36;;;-1:-1:-1;;;1258:36:32;;;;1211:15;;-1:-1:-1;;;;;1258:27:32;;:34;;:36;;;;;;;;;;;;;;1211:15;1258:27;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1234:60;-1:-1:-1;;;;;;1301:16:32;;;1325:11;:6;;:11;:::i;:::-;1344:13;;;;:6;:13;:::i;:::-;1365:15;;;;;;;;:::i;:::-;1388:17;;;;;;;;:::i;:::-;1301:110;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1423:38:32;;-1:-1:-1;;;;;1423:38:32;;;-1:-1:-1;1423:38:32;;-1:-1:-1;1423:38:32;;;1475:5;1115:370;-1:-1:-1;;1115:370:32:o;1489:325::-;1576:6;1590:12;1605:18;;;;;;;;;-1:-1:-1;;;;;1605:18:32;-1:-1:-1;;;;;1605:25:32;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1590:42;-1:-1:-1;;;;;;1639:16:32;;;1663:11;:6;;:11;:::i;:::-;1682:13;;;;:6;:13;:::i;:::-;1703:15;;;;;;;;:::i;:::-;1726:17;;;;;;;;:::i;:::-;1639:110;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1761:29:32;;-1:-1:-1;;;;;1761:29:32;;;-1:-1:-1;1761:29:32;;-1:-1:-1;1761:29:32;;;1804:5;1489:325;-1:-1:-1;;1489:325:32:o;442:44::-;;;-1:-1:-1;;;;;442:44:32;;:::o;947:313:-1:-;;1087:2;1075:9;1066:7;1062:23;1058:32;1055:2;;;-1:-1;;1093:12;1055:2;114:6;108:13;126:58;178:5;126:58;:::i;:::-;1145:99;1049:211;-1:-1;;;1049:211::o;1569:309::-;;1707:2;1695:9;1686:7;1682:23;1678:32;1675:2;;;-1:-1;;1713:12;1675:2;483:6;470:20;495:67;556:5;495:67;:::i;1885:409::-;;2030:2;2018:9;2009:7;2005:23;2001:32;1998:2;;;-1:-1;;2036:12;1998:2;2094:17;2081:31;2132:18;2124:6;2121:30;2118:2;;;-1:-1;;2154:12;2118:2;2246:22;;759:3;741:16;;;737:26;734:2;;;-1:-1;;766:12;2301:237;;2403:2;2391:9;2382:7;2378:23;2374:32;2371:2;;;-1:-1;;2409:12;2371:2;892:6;879:20;7256:4;9772:5;7245:16;9749:5;9746:33;9736:2;;-1:-1;;9783:12;3515:300;;6534:6;6529:3;6522:19;8990:6;8985:3;6571:4;6566:3;6562:14;8967:30;-1:-1;6571:4;9037:6;6566:3;9028:16;;9021:27;6571:4;9146:7;;9150:2;3801:6;9130:14;9126:28;6566:3;3770:39;;3763:46;;3617:198;;;;;:::o;3937:296::-;-1:-1;;;;;7119:54;;;;2653:87;;4101:2;4086:18;;4072:161::o;5065:832::-;;5366:3;5388:17;5381:47;5442:88;5366:3;5355:9;5351:19;5516:6;5508;5442:88;:::i;:::-;5578:9;5572:4;5568:20;5563:2;5552:9;5548:18;5541:48;5603:88;5686:4;5677:6;5669;5603:88;:::i;:::-;7256:4;7245:16;;;;5766:2;5751:18;;3890:35;-1:-1;;;;;;;7119:54;;;;5883:2;5868:18;;;2653:87;5595:96;5337:560;-1:-1;;;;5337:560::o;5904:507::-;;;6040:11;6027:25;6091:48;;6115:8;6099:14;6095:29;6091:48;6071:18;6067:73;6057:2;;-1:-1;;6144:12;6057:2;6171:33;;6225:18;;;-1:-1;6263:18;6252:30;;6249:2;;;-1:-1;;6285:12;6249:2;6130:4;6313:13;;-1:-1;6099:14;6345:38;;;6335:49;;6332:2;;;6397:1;;6387:12;6332:2;5995:416;;;;;:::o;9167:167::-;-1:-1;;;;;7119:54;;9251:60;;9241:2;;9325:1;;9315:12;9241:2;9235:99;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "264800",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "controlledTokenProxyFactory()": "1048",
                "createControlledToken((string,string,uint8,address))": "infinite",
                "createTicket((string,string,uint8,address))": "infinite",
                "ticketProxyFactory()": "1114"
              }
            },
            "methodIdentifiers": {
              "controlledTokenProxyFactory()": "6a81d8bd",
              "createControlledToken((string,string,uint8,address))": "8c0cd38d",
              "createTicket((string,string,uint8,address))": "8e22585d",
              "ticketProxyFactory()": "aa3b296c"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract ControlledTokenProxyFactory\",\"name\":\"_controlledTokenProxyFactory\",\"type\":\"address\"},{\"internalType\":\"contract TicketProxyFactory\",\"name\":\"_ticketProxyFactory\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"CreatedControlledToken\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"CreatedTicket\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"controlledTokenProxyFactory\",\"outputs\":[{\"internalType\":\"contract ControlledTokenProxyFactory\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"contract TokenControllerInterface\",\"name\":\"controller\",\"type\":\"address\"}],\"internalType\":\"struct ControlledTokenBuilder.ControlledTokenConfig\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"createControlledToken\",\"outputs\":[{\"internalType\":\"contract ControlledToken\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"contract TokenControllerInterface\",\"name\":\"controller\",\"type\":\"address\"}],\"internalType\":\"struct ControlledTokenBuilder.ControlledTokenConfig\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"createTicket\",\"outputs\":[{\"internalType\":\"contract Ticket\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ticketProxyFactory\",\"outputs\":[{\"internalType\":\"contract TicketProxyFactory\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/builders/ControlledTokenBuilder.sol\":\"ControlledTokenBuilder\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@pooltogether/uniform-random-number/contracts/UniformRandomNumber.sol\":{\"content\":\"/**\\nCopyright 2019 PoolTogether LLC\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice A library that uses entropy to select a random number within a bound.  Compensates for modulo bias.\\n * @dev Thanks to https://medium.com/hownetworks/dont-waste-cycles-with-modulo-bias-35b6fdafcf94\\n */\\nlibrary UniformRandomNumber {\\n  /// @notice Select a random number without modulo bias using a random seed and upper bound\\n  /// @param _entropy The seed for randomness\\n  /// @param _upperBound The upper bound of the desired number\\n  /// @return A random number less than the _upperBound\\n  function uniform(uint256 _entropy, uint256 _upperBound) internal pure returns (uint256) {\\n    require(_upperBound > 0, \\\"UniformRand/min-bound\\\");\\n    uint256 min = -_upperBound % _upperBound;\\n    uint256 random = _entropy;\\n    while (true) {\\n      if (random >= min) {\\n        break;\\n      }\\n      random = uint256(keccak256(abi.encodePacked(random)));\\n    }\\n    return random % _upperBound;\\n  }\\n}\",\"keccak256\":\"0x0d86eb3349d8a9e226ff6f3328a6a79bbf872859a4afbe489051fbf3b8550df4\"},\"contracts/builders/ControlledTokenBuilder.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"../token/ControlledTokenProxyFactory.sol\\\";\\nimport \\\"../token/TicketProxyFactory.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ncontract ControlledTokenBuilder {\\n\\n  event CreatedControlledToken(address indexed token);\\n  event CreatedTicket(address indexed token);\\n\\n  ControlledTokenProxyFactory public controlledTokenProxyFactory;\\n  TicketProxyFactory public ticketProxyFactory;\\n\\n  struct ControlledTokenConfig {\\n    string name;\\n    string symbol;\\n    uint8 decimals;\\n    TokenControllerInterface controller;\\n  }\\n\\n  constructor (\\n    ControlledTokenProxyFactory _controlledTokenProxyFactory,\\n    TicketProxyFactory _ticketProxyFactory\\n  ) public {\\n    require(address(_controlledTokenProxyFactory) != address(0), \\\"ControlledTokenBuilder/controlledTokenProxyFactory-not-zero\\\");\\n    require(address(_ticketProxyFactory) != address(0), \\\"ControlledTokenBuilder/ticketProxyFactory-not-zero\\\");\\n    controlledTokenProxyFactory = _controlledTokenProxyFactory;\\n    ticketProxyFactory = _ticketProxyFactory;\\n  }\\n\\n  function createControlledToken(\\n    ControlledTokenConfig calldata config\\n  ) external returns (ControlledToken) {\\n    ControlledToken token = controlledTokenProxyFactory.create();\\n\\n    token.initialize(\\n      config.name,\\n      config.symbol,\\n      config.decimals,\\n      config.controller\\n    );\\n\\n    emit CreatedControlledToken(address(token));\\n\\n    return token;\\n  }\\n\\n  function createTicket(\\n    ControlledTokenConfig calldata config\\n  ) external returns (Ticket) {\\n    Ticket token = ticketProxyFactory.create();\\n\\n    token.initialize(\\n      config.name,\\n      config.symbol,\\n      config.decimals,\\n      config.controller\\n    );\\n\\n    emit CreatedTicket(address(token));\\n\\n    return token;\\n  }\\n}\\n\",\"keccak256\":\"0x87077a6f3a7cc093a1742ebb24a62b1c8a728341b3c49e3a147630f77c5aada7\",\"license\":\"GPL-3.0\"},\"contracts/external/openzeppelin/ProxyFactory.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\n// solium-disable security/no-inline-assembly\\n// solium-disable security/no-low-level-calls\\ncontract ProxyFactory {\\n\\n  event ProxyCreated(address proxy);\\n\\n  function deployMinimal(address _logic, bytes memory _data) public returns (address proxy) {\\n    // Adapted from https://github.com/optionality/clone-factory/blob/32782f82dfc5a00d103a7e61a17a5dedbd1e8e9d/contracts/CloneFactory.sol\\n    bytes20 targetBytes = bytes20(_logic);\\n    assembly {\\n      let clone := mload(0x40)\\n      mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n      mstore(add(clone, 0x14), targetBytes)\\n      mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n      proxy := create(0, clone, 0x37)\\n    }\\n\\n    emit ProxyCreated(address(proxy));\\n\\n    if(_data.length > 0) {\\n      (bool success,) = proxy.call(_data);\\n      require(success, \\\"ProxyFactory/constructor-call-failed\\\");\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0xf0422303985796fdd8bdf772ac8e34331e2e63006f657989cca010fa4776d735\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./ControlledToken.sol\\\";\\nimport \\\"../external/openzeppelin/ProxyFactory.sol\\\";\\n\\n/// @title Controlled ERC20 Token Factory\\n/// @notice Minimal proxy pattern for creating new Controlled ERC20 Tokens\\ncontract ControlledTokenProxyFactory is ProxyFactory {\\n\\n  /// @notice Contract template for deploying proxied tokens\\n  ControlledToken public instance;\\n\\n  /// @notice Initializes the Factory with an instance of the Controlled ERC20 Token\\n  constructor () public {\\n    instance = new ControlledToken();\\n  }\\n\\n  /// @notice Creates a new Controlled ERC20 Token as a proxy of the template instance\\n  /// @return A reference to the new proxied Controlled ERC20 Token\\n  function create() external returns (ControlledToken) {\\n    return ControlledToken(deployMinimal(address(instance), \\\"\\\"));\\n  }\\n}\\n\",\"keccak256\":\"0x3872184d356e0bc4aadf034dbc8dccb454c00b7efdc8f4d0a96621702a9d5135\",\"license\":\"GPL-3.0\"},\"contracts/token/Ticket.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"sortition-sum-tree-factory/contracts/SortitionSumTreeFactory.sol\\\";\\nimport \\\"@pooltogether/uniform-random-number/contracts/UniformRandomNumber.sol\\\";\\n\\nimport \\\"./ControlledToken.sol\\\";\\nimport \\\"./TicketInterface.sol\\\";\\n\\ncontract Ticket is ControlledToken, TicketInterface {\\n  using SortitionSumTreeFactory for SortitionSumTreeFactory.SortitionSumTrees;\\n\\n  bytes32 constant private TREE_KEY = keccak256(\\\"PoolTogether/Ticket\\\");\\n  uint256 constant private MAX_TREE_LEAVES = 5;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  // Ticket-weighted odds\\n  SortitionSumTreeFactory.SortitionSumTrees internal sortitionSumTrees;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    override\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"Ticket/controller-not-zero\\\");\\n    ControlledToken.initialize(_name, _symbol, _decimals, _controller);\\n    sortitionSumTrees.createTree(TREE_KEY, MAX_TREE_LEAVES);\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Returns the user's chance of winning.\\n  function chanceOf(address user) external view returns (uint256) {\\n    return sortitionSumTrees.stakeOf(TREE_KEY, bytes32(uint256(user)));\\n  }\\n\\n  /// @notice Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\\n  /// @param randomNumber The random number to use to select a user.\\n  /// @return The winner\\n  function draw(uint256 randomNumber) external view override returns (address) {\\n    uint256 bound = totalSupply();\\n    address selected;\\n    if (bound == 0) {\\n      selected = address(0);\\n    } else {\\n      uint256 token = UniformRandomNumber.uniform(randomNumber, bound);\\n      selected = address(uint256(sortitionSumTrees.draw(TREE_KEY, token)));\\n    }\\n    return selected;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    super._beforeTokenTransfer(from, to, amount);\\n\\n    // optimize: ignore transfers to self\\n    if (from == to) {\\n      return;\\n    }\\n\\n    if (from != address(0)) {\\n      uint256 fromBalance = balanceOf(from).sub(amount);\\n      sortitionSumTrees.set(TREE_KEY, fromBalance, bytes32(uint256(from)));\\n    }\\n\\n    if (to != address(0)) {\\n      uint256 toBalance = balanceOf(to).add(amount);\\n      sortitionSumTrees.set(TREE_KEY, toBalance, bytes32(uint256(to)));\\n    }\\n  }\\n\\n}\",\"keccak256\":\"0xf659dcfda626c713b7dd64525476d282e141163977edd881b647e83f505c4044\",\"license\":\"GPL-3.0\"},\"contracts/token/TicketInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface TicketInterface {\\n  /// @notice Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\\n  /// @param randomNumber The random number to use to select a user.\\n  /// @return The winner\\n  function draw(uint256 randomNumber) external view returns (address);\\n}\",\"keccak256\":\"0x5201a9a22748781592abd2003801289224d4899292195b7de937cd5748be87dd\",\"license\":\"GPL-3.0\"},\"contracts/token/TicketProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\\\";\\n\\nimport \\\"./Ticket.sol\\\";\\nimport \\\"../external/openzeppelin/ProxyFactory.sol\\\";\\n\\n/// @title Controlled ERC20 Token Factory\\n/// @notice Minimal proxy pattern for creating new Controlled ERC20 Tokens\\ncontract TicketProxyFactory is ProxyFactory {\\n\\n  /// @notice Contract template for deploying proxied tokens\\n  Ticket public instance;\\n\\n  /// @notice Initializes the Factory with an instance of the Controlled ERC20 Token\\n  constructor () public {\\n    instance = new Ticket();\\n  }\\n\\n  /// @notice Creates a new Controlled ERC20 Token as a proxy of the template instance\\n  /// @return A reference to the new proxied Controlled ERC20 Token\\n  function create() external returns (Ticket) {\\n    return Ticket(deployMinimal(address(instance), \\\"\\\"));\\n  }\\n}\\n\",\"keccak256\":\"0xb68f1cd27e8caaab3f69d6ccd14e70ff2d7c3685c9c45733f62690087833410e\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"sortition-sum-tree-factory/contracts/SortitionSumTreeFactory.sol\":{\"content\":\"/**\\n *  @reviewers: [@clesaege, @unknownunknown1, @ferittuncer]\\n *  @auditors: []\\n *  @bounties: [<14 days 10 ETH max payout>]\\n *  @deployments: []\\n */\\n\\npragma solidity ^0.6.0;\\n\\n/**\\n *  @title SortitionSumTreeFactory\\n *  @author Enrique Piqueras - <epiquerass@gmail.com>\\n *  @dev A factory of trees that keep track of staked values for sortition.\\n */\\nlibrary SortitionSumTreeFactory {\\n    /* Structs */\\n\\n    struct SortitionSumTree {\\n        uint K; // The maximum number of childs per node.\\n        // We use this to keep track of vacant positions in the tree after removing a leaf. This is for keeping the tree as balanced as possible without spending gas on moving nodes around.\\n        uint[] stack;\\n        uint[] nodes;\\n        // Two-way mapping of IDs to node indexes. Note that node index 0 is reserved for the root node, and means the ID does not have a node.\\n        mapping(bytes32 => uint) IDsToNodeIndexes;\\n        mapping(uint => bytes32) nodeIndexesToIDs;\\n    }\\n\\n    /* Storage */\\n\\n    struct SortitionSumTrees {\\n        mapping(bytes32 => SortitionSumTree) sortitionSumTrees;\\n    }\\n\\n    /* internal */\\n\\n    /**\\n     *  @dev Create a sortition sum tree at the specified key.\\n     *  @param _key The key of the new tree.\\n     *  @param _K The number of children each node in the tree should have.\\n     */\\n    function createTree(SortitionSumTrees storage self, bytes32 _key, uint _K) internal {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        require(tree.K == 0, \\\"Tree already exists.\\\");\\n        require(_K > 1, \\\"K must be greater than one.\\\");\\n        tree.K = _K;\\n        tree.stack = new uint[](0);\\n        tree.nodes = new uint[](0);\\n        tree.nodes.push(0);\\n    }\\n\\n    /**\\n     *  @dev Set a value of a tree.\\n     *  @param _key The key of the tree.\\n     *  @param _value The new value.\\n     *  @param _ID The ID of the value.\\n     *  `O(log_k(n))` where\\n     *  `k` is the maximum number of childs per node in the tree,\\n     *   and `n` is the maximum number of nodes ever appended.\\n     */\\n    function set(SortitionSumTrees storage self, bytes32 _key, uint _value, bytes32 _ID) internal {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        uint treeIndex = tree.IDsToNodeIndexes[_ID];\\n\\n        if (treeIndex == 0) { // No existing node.\\n            if (_value != 0) { // Non zero value.\\n                // Append.\\n                // Add node.\\n                if (tree.stack.length == 0) { // No vacant spots.\\n                    // Get the index and append the value.\\n                    treeIndex = tree.nodes.length;\\n                    tree.nodes.push(_value);\\n\\n                    // Potentially append a new node and make the parent a sum node.\\n                    if (treeIndex != 1 && (treeIndex - 1) % tree.K == 0) { // Is first child.\\n                        uint parentIndex = treeIndex / tree.K;\\n                        bytes32 parentID = tree.nodeIndexesToIDs[parentIndex];\\n                        uint newIndex = treeIndex + 1;\\n                        tree.nodes.push(tree.nodes[parentIndex]);\\n                        delete tree.nodeIndexesToIDs[parentIndex];\\n                        tree.IDsToNodeIndexes[parentID] = newIndex;\\n                        tree.nodeIndexesToIDs[newIndex] = parentID;\\n                    }\\n                } else { // Some vacant spot.\\n                    // Pop the stack and append the value.\\n                    treeIndex = tree.stack[tree.stack.length - 1];\\n                    tree.stack.pop();\\n                    tree.nodes[treeIndex] = _value;\\n                }\\n\\n                // Add label.\\n                tree.IDsToNodeIndexes[_ID] = treeIndex;\\n                tree.nodeIndexesToIDs[treeIndex] = _ID;\\n\\n                updateParents(self, _key, treeIndex, true, _value);\\n            }\\n        } else { // Existing node.\\n            if (_value == 0) { // Zero value.\\n                // Remove.\\n                // Remember value and set to 0.\\n                uint value = tree.nodes[treeIndex];\\n                tree.nodes[treeIndex] = 0;\\n\\n                // Push to stack.\\n                tree.stack.push(treeIndex);\\n\\n                // Clear label.\\n                delete tree.IDsToNodeIndexes[_ID];\\n                delete tree.nodeIndexesToIDs[treeIndex];\\n\\n                updateParents(self, _key, treeIndex, false, value);\\n            } else if (_value != tree.nodes[treeIndex]) { // New, non zero value.\\n                // Set.\\n                bool plusOrMinus = tree.nodes[treeIndex] <= _value;\\n                uint plusOrMinusValue = plusOrMinus ? _value - tree.nodes[treeIndex] : tree.nodes[treeIndex] - _value;\\n                tree.nodes[treeIndex] = _value;\\n\\n                updateParents(self, _key, treeIndex, plusOrMinus, plusOrMinusValue);\\n            }\\n        }\\n    }\\n\\n    /* internal Views */\\n\\n    /**\\n     *  @dev Query the leaves of a tree. Note that if `startIndex == 0`, the tree is empty and the root node will be returned.\\n     *  @param _key The key of the tree to get the leaves from.\\n     *  @param _cursor The pagination cursor.\\n     *  @param _count The number of items to return.\\n     *  @return startIndex The index at which leaves start\\n     *  @return values The values of the returned leaves\\n     *  @return hasMore Whether there are more for pagination.\\n     *  `O(n)` where\\n     *  `n` is the maximum number of nodes ever appended.\\n     */\\n    function queryLeafs(\\n        SortitionSumTrees storage self,\\n        bytes32 _key,\\n        uint _cursor,\\n        uint _count\\n    ) internal view returns(uint startIndex, uint[] memory values, bool hasMore) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n\\n        // Find the start index.\\n        for (uint i = 0; i < tree.nodes.length; i++) {\\n            if ((tree.K * i) + 1 >= tree.nodes.length) {\\n                startIndex = i;\\n                break;\\n            }\\n        }\\n\\n        // Get the values.\\n        uint loopStartIndex = startIndex + _cursor;\\n        values = new uint[](loopStartIndex + _count > tree.nodes.length ? tree.nodes.length - loopStartIndex : _count);\\n        uint valuesIndex = 0;\\n        for (uint j = loopStartIndex; j < tree.nodes.length; j++) {\\n            if (valuesIndex < _count) {\\n                values[valuesIndex] = tree.nodes[j];\\n                valuesIndex++;\\n            } else {\\n                hasMore = true;\\n                break;\\n            }\\n        }\\n    }\\n\\n    /**\\n     *  @dev Draw an ID from a tree using a number. Note that this function reverts if the sum of all values in the tree is 0.\\n     *  @param _key The key of the tree.\\n     *  @param _drawnNumber The drawn number.\\n     *  @return ID The drawn ID.\\n     *  `O(k * log_k(n))` where\\n     *  `k` is the maximum number of childs per node in the tree,\\n     *   and `n` is the maximum number of nodes ever appended.\\n     */\\n    function draw(SortitionSumTrees storage self, bytes32 _key, uint _drawnNumber) internal view returns(bytes32 ID) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        uint treeIndex = 0;\\n        uint currentDrawnNumber = _drawnNumber % tree.nodes[0];\\n\\n        while ((tree.K * treeIndex) + 1 < tree.nodes.length)  // While it still has children.\\n            for (uint i = 1; i <= tree.K; i++) { // Loop over children.\\n                uint nodeIndex = (tree.K * treeIndex) + i;\\n                uint nodeValue = tree.nodes[nodeIndex];\\n\\n                if (currentDrawnNumber >= nodeValue) currentDrawnNumber -= nodeValue; // Go to the next child.\\n                else { // Pick this child.\\n                    treeIndex = nodeIndex;\\n                    break;\\n                }\\n            }\\n        \\n        ID = tree.nodeIndexesToIDs[treeIndex];\\n    }\\n\\n    /** @dev Gets a specified ID's associated value.\\n     *  @param _key The key of the tree.\\n     *  @param _ID The ID of the value.\\n     *  @return value The associated value.\\n     */\\n    function stakeOf(SortitionSumTrees storage self, bytes32 _key, bytes32 _ID) internal view returns(uint value) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        uint treeIndex = tree.IDsToNodeIndexes[_ID];\\n\\n        if (treeIndex == 0) value = 0;\\n        else value = tree.nodes[treeIndex];\\n    }\\n\\n    function total(SortitionSumTrees storage self, bytes32 _key) internal view returns (uint) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        if (tree.nodes.length == 0) {\\n            return 0;\\n        } else {\\n            return tree.nodes[0];\\n        }\\n    }\\n\\n    /* Private */\\n\\n    /**\\n     *  @dev Update all the parents of a node.\\n     *  @param _key The key of the tree to update.\\n     *  @param _treeIndex The index of the node to start from.\\n     *  @param _plusOrMinus Wether to add (true) or substract (false).\\n     *  @param _value The value to add or substract.\\n     *  `O(log_k(n))` where\\n     *  `k` is the maximum number of childs per node in the tree,\\n     *   and `n` is the maximum number of nodes ever appended.\\n     */\\n    function updateParents(SortitionSumTrees storage self, bytes32 _key, uint _treeIndex, bool _plusOrMinus, uint _value) private {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n\\n        uint parentIndex = _treeIndex;\\n        while (parentIndex != 0) {\\n            parentIndex = (parentIndex - 1) / tree.K;\\n            tree.nodes[parentIndex] = _plusOrMinus ? tree.nodes[parentIndex] + _value : tree.nodes[parentIndex] - _value;\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa20ece2e1ddeaa6432549a7c38cd02594000b93a54b92399b89bae0dd76dbc7e\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 5647,
                "contract": "contracts/builders/ControlledTokenBuilder.sol:ControlledTokenBuilder",
                "label": "controlledTokenProxyFactory",
                "offset": 0,
                "slot": "0",
                "type": "t_contract(ControlledTokenProxyFactory)15889"
              },
              {
                "astId": 5649,
                "contract": "contracts/builders/ControlledTokenBuilder.sol:ControlledTokenBuilder",
                "label": "ticketProxyFactory",
                "offset": 0,
                "slot": "1",
                "type": "t_contract(TicketProxyFactory)16192"
              }
            ],
            "types": {
              "t_contract(ControlledTokenProxyFactory)15889": {
                "encoding": "inplace",
                "label": "contract ControlledTokenProxyFactory",
                "numberOfBytes": "20"
              },
              "t_contract(TicketProxyFactory)16192": {
                "encoding": "inplace",
                "label": "contract TicketProxyFactory",
                "numberOfBytes": "20"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/builders/MultipleWinnersBuilder.sol": {
        "MultipleWinnersBuilder": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "contract MultipleWinnersProxyFactory",
                  "name": "_multipleWinnersProxyFactory",
                  "type": "address"
                },
                {
                  "internalType": "contract ControlledTokenBuilder",
                  "name": "_controlledTokenBuilder",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "prizeStrategy",
                  "type": "address"
                }
              ],
              "name": "MultipleWinnersCreated",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "controlledTokenBuilder",
              "outputs": [
                {
                  "internalType": "contract ControlledTokenBuilder",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract PrizePool",
                  "name": "prizePool",
                  "type": "address"
                },
                {
                  "components": [
                    {
                      "internalType": "contract RNGInterface",
                      "name": "rngService",
                      "type": "address"
                    },
                    {
                      "internalType": "uint256",
                      "name": "prizePeriodStart",
                      "type": "uint256"
                    },
                    {
                      "internalType": "uint256",
                      "name": "prizePeriodSeconds",
                      "type": "uint256"
                    },
                    {
                      "internalType": "string",
                      "name": "ticketName",
                      "type": "string"
                    },
                    {
                      "internalType": "string",
                      "name": "ticketSymbol",
                      "type": "string"
                    },
                    {
                      "internalType": "string",
                      "name": "sponsorshipName",
                      "type": "string"
                    },
                    {
                      "internalType": "string",
                      "name": "sponsorshipSymbol",
                      "type": "string"
                    },
                    {
                      "internalType": "uint256",
                      "name": "ticketCreditLimitMantissa",
                      "type": "uint256"
                    },
                    {
                      "internalType": "uint256",
                      "name": "ticketCreditRateMantissa",
                      "type": "uint256"
                    },
                    {
                      "internalType": "uint256",
                      "name": "numberOfWinners",
                      "type": "uint256"
                    },
                    {
                      "components": [
                        {
                          "internalType": "address",
                          "name": "target",
                          "type": "address"
                        },
                        {
                          "internalType": "uint16",
                          "name": "percentage",
                          "type": "uint16"
                        },
                        {
                          "internalType": "uint8",
                          "name": "token",
                          "type": "uint8"
                        }
                      ],
                      "internalType": "struct PrizeSplit.PrizeSplitConfig[]",
                      "name": "prizeSplits",
                      "type": "tuple[]"
                    },
                    {
                      "internalType": "bool",
                      "name": "splitExternalErc20Awards",
                      "type": "bool"
                    }
                  ],
                  "internalType": "struct MultipleWinnersBuilder.MultipleWinnersConfig",
                  "name": "prizeStrategyConfig",
                  "type": "tuple"
                },
                {
                  "internalType": "uint8",
                  "name": "decimals",
                  "type": "uint8"
                },
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                }
              ],
              "name": "createMultipleWinners",
              "outputs": [
                {
                  "internalType": "contract MultipleWinners",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "multipleWinnersProxyFactory",
              "outputs": [
                {
                  "internalType": "contract MultipleWinnersProxyFactory",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50604051610b12380380610b1283398101604081905261002f916100b5565b6001600160a01b03821661005e5760405162461bcd60e51b8152600401610055906100ee565b60405180910390fd5b6001600160a01b0381166100845760405162461bcd60e51b81526004016100559061014b565b600080546001600160a01b039384166001600160a01b031991821617909155600180549290931691161790556101b0565b600080604083850312156100c7578182fd5b82516100d281610198565b60208401519092506100e381610198565b809150509250929050565b6020808252603b908201527f4d756c7469706c6557696e6e6572734275696c6465722f6d756c7469706c655760408201527f696e6e65727350726f7879466163746f72792d6e6f742d7a65726f0000000000606082015260800190565b6020808252602d908201527f4d756c7469706c6557696e6e6572734275696c6465722f746f6b656e2d62756960408201526c6c6465722d6e6f742d7a65726f60981b606082015260800190565b6001600160a01b03811681146101ad57600080fd5b50565b610953806101bf6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063013da4201461004657806314d9dcd014610064578063b77f3bcb1461006c575b600080fd5b61004e61007f565b60405161005b91906107b3565b60405180910390f35b61004e61008e565b61004e61007a3660046105d8565b61009d565b6000546001600160a01b031681565b6001546001600160a01b031681565b6000805460408051633bf206a360e21b8152905183926001600160a01b03169163efc81a8c91600480830192602092919082900301818787803b1580156100e357600080fd5b505af11580156100f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061011b91906105b5565b9050600061013386606001518760800151878a610331565b9050600061014b8760a001518860c00151888b6103e1565b60208801516040808a01518a516101208c01519251631fcafa7f60e21b81529495506001600160a01b03881694637f2be9fc94610194949093928f928a928a92916004016108a3565b600060405180830381600087803b1580156101ae57600080fd5b505af11580156101c2573d6000803e3d6000fd5b50505061014088015160405163612d4e1960e11b81526001600160a01b038616925063c25a9c32916101f6916004016107c7565b600060405180830381600087803b15801561021057600080fd5b505af1158015610224573d6000803e3d6000fd5b505050508661016001511561029357604051631c54da5b60e11b81526001600160a01b038416906338a9b4b69061026090600190600401610830565b600060405180830381600087803b15801561027a57600080fd5b505af115801561028e573d6000803e3d6000fd5b505050505b60405163f2fde38b60e01b81526001600160a01b0384169063f2fde38b906102bf9088906004016107b3565b600060405180830381600087803b1580156102d957600080fd5b505af11580156102ed573d6000803e3d6000fd5b50506040516001600160a01b03861692507f8f711639be1281e7c5ee59206b3043d38eaabb4e87ef3cbd3e301ca1f46474549150600090a250909695505050505050565b600154604080516080810182528681526020810186905260ff8516818301526001600160a01b0384811660608301529151638e22585d60e01b81526000939290921691638e22585d916103869160040161083b565b602060405180830381600087803b1580156103a057600080fd5b505af11580156103b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d891906105b5565b95945050505050565b600154604080516080810182528681526020810186905260ff8516818301526001600160a01b0384811660608301529151638c0cd38d60e01b81526000939290921691638c0cd38d916103869160040161083b565b803561044181610905565b92915050565b600082601f830112610457578081fd5b813567ffffffffffffffff81111561046d578182fd5b602061047c81828402016108de565b828152925080830184820160608085028701840188101561049c57600080fd5b60005b858110156104c3576104b18984610548565b8452928401929181019160010161049f565b50505050505092915050565b8035801515811461044157600080fd5b600082601f8301126104ef578081fd5b813567ffffffffffffffff811115610505578182fd5b610518601f8201601f19166020016108de565b915080825283602082850101111561052f57600080fd5b8060208401602084013760009082016020015292915050565b600060608284031215610559578081fd5b61056360606108de565b9050813561057081610905565b8152602082013561ffff8116811461058757600080fd5b602082015261059983604084016105a4565b604082015292915050565b803560ff8116811461044157600080fd5b6000602082840312156105c6578081fd5b81516105d181610905565b9392505050565b600080600080608085870312156105ed578283fd5b84356105f881610905565b9350602085013567ffffffffffffffff80821115610614578485fd5b818701915061018080838a03121561062a578586fd5b610633816108de565b905061063f8984610436565b81526020830135602082015260408301356040820152606083013582811115610666578687fd5b6106728a8286016104df565b606083015250608083013582811115610689578687fd5b6106958a8286016104df565b60808301525060a0830135828111156106ac578687fd5b6106b88a8286016104df565b60a08301525060c0830135828111156106cf578687fd5b6106db8a8286016104df565b60c08301525060e08381013590820152610100808401359082015261012080840135908201526101408084013583811115610714578788fd5b6107208b828701610447565b8284015250506101609150610737898385016104cf565b8282015280955050505061074e86604087016105a4565b915061075d8660608701610436565b905092959194509250565b60008151808452815b8181101561078d57602081850181015186830182015201610771565b8181111561079e5782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b8281101561082357815180516001600160a01b031685528681015161ffff168786015285015160ff1685850152606090930192908501906001016107e4565b5091979650505050505050565b901515815260200190565b60006020825282516080602084015261085760a0840182610768565b90506020840151601f198483030160408501526108748282610768565b604086015160ff16606086810191909152909501516001600160a01b0316608090940193909352509192915050565b96875260208701959095526001600160a01b0393841660408701529183166060860152821660808501521660a083015260c082015260e00190565b60405181810167ffffffffffffffff811182821017156108fd57600080fd5b604052919050565b6001600160a01b038116811461091a57600080fd5b5056fea2646970667358221220d1b432d289e7eeba4b0e02429b8c732946dde2bf512727089a437e2b5bc39dcf64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0xB12 CODESIZE SUB DUP1 PUSH2 0xB12 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x2F SWAP2 PUSH2 0xB5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x5E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x55 SWAP1 PUSH2 0xEE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x84 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x55 SWAP1 PUSH2 0x14B JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP3 SWAP1 SWAP4 AND SWAP2 AND OR SWAP1 SSTORE PUSH2 0x1B0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xC7 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH2 0xD2 DUP2 PUSH2 0x198 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH2 0xE3 DUP2 PUSH2 0x198 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x3B SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572734275696C6465722F6D756C7469706C6557 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x696E6E65727350726F7879466163746F72792D6E6F742D7A65726F0000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2D SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572734275696C6465722F746F6B656E2D627569 PUSH1 0x40 DUP3 ADD MSTORE PUSH13 0x6C6465722D6E6F742D7A65726F PUSH1 0x98 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x1AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x953 DUP1 PUSH2 0x1BF PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x13DA420 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0x14D9DCD0 EQ PUSH2 0x64 JUMPI DUP1 PUSH4 0xB77F3BCB EQ PUSH2 0x6C JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x7F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x5B SWAP2 SWAP1 PUSH2 0x7B3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH2 0x8E JUMP JUMPDEST PUSH2 0x4E PUSH2 0x7A CALLDATASIZE PUSH1 0x4 PUSH2 0x5D8 JUMP JUMPDEST PUSH2 0x9D JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x3BF206A3 PUSH1 0xE2 SHL DUP2 MSTORE SWAP1 MLOAD DUP4 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xEFC81A8C SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x11B SWAP2 SWAP1 PUSH2 0x5B5 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x133 DUP7 PUSH1 0x60 ADD MLOAD DUP8 PUSH1 0x80 ADD MLOAD DUP8 DUP11 PUSH2 0x331 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x14B DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0xC0 ADD MLOAD DUP9 DUP12 PUSH2 0x3E1 JUMP JUMPDEST PUSH1 0x20 DUP9 ADD MLOAD PUSH1 0x40 DUP1 DUP11 ADD MLOAD DUP11 MLOAD PUSH2 0x120 DUP13 ADD MLOAD SWAP3 MLOAD PUSH4 0x1FCAFA7F PUSH1 0xE2 SHL DUP2 MSTORE SWAP5 SWAP6 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND SWAP5 PUSH4 0x7F2BE9FC SWAP5 PUSH2 0x194 SWAP5 SWAP1 SWAP4 SWAP3 DUP16 SWAP3 DUP11 SWAP3 DUP11 SWAP3 SWAP2 PUSH1 0x4 ADD PUSH2 0x8A3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1C2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH2 0x140 DUP9 ADD MLOAD PUSH1 0x40 MLOAD PUSH4 0x612D4E19 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND SWAP3 POP PUSH4 0xC25A9C32 SWAP2 PUSH2 0x1F6 SWAP2 PUSH1 0x4 ADD PUSH2 0x7C7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x210 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x224 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP7 PUSH2 0x160 ADD MLOAD ISZERO PUSH2 0x293 JUMPI PUSH1 0x40 MLOAD PUSH4 0x1C54DA5B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH4 0x38A9B4B6 SWAP1 PUSH2 0x260 SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x4 ADD PUSH2 0x830 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x27A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x28E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0xF2FDE38B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH4 0xF2FDE38B SWAP1 PUSH2 0x2BF SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x7B3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2ED JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND SWAP3 POP PUSH32 0x8F711639BE1281E7C5EE59206B3043D38EAABB4E87EF3CBD3E301CA1F4647454 SWAP2 POP PUSH1 0x0 SWAP1 LOG2 POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE DUP7 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0xFF DUP6 AND DUP2 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x60 DUP4 ADD MSTORE SWAP2 MLOAD PUSH4 0x8E22585D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP4 SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH4 0x8E22585D SWAP2 PUSH2 0x386 SWAP2 PUSH1 0x4 ADD PUSH2 0x83B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3B4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3D8 SWAP2 SWAP1 PUSH2 0x5B5 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE DUP7 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0xFF DUP6 AND DUP2 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x60 DUP4 ADD MSTORE SWAP2 MLOAD PUSH4 0x8C0CD38D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP4 SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH4 0x8C0CD38D SWAP2 PUSH2 0x386 SWAP2 PUSH1 0x4 ADD PUSH2 0x83B JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0x441 DUP2 PUSH2 0x905 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x457 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x46D JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 PUSH2 0x47C DUP2 DUP3 DUP5 MUL ADD PUSH2 0x8DE JUMP JUMPDEST DUP3 DUP2 MSTORE SWAP3 POP DUP1 DUP4 ADD DUP5 DUP3 ADD PUSH1 0x60 DUP1 DUP6 MUL DUP8 ADD DUP5 ADD DUP9 LT ISZERO PUSH2 0x49C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0x4C3 JUMPI PUSH2 0x4B1 DUP10 DUP5 PUSH2 0x548 JUMP JUMPDEST DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP2 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x49F JUMP JUMPDEST POP POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x441 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x4EF JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x505 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x518 PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD PUSH2 0x8DE JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x52F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x559 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x563 PUSH1 0x60 PUSH2 0x8DE JUMP JUMPDEST SWAP1 POP DUP2 CALLDATALOAD PUSH2 0x570 DUP2 PUSH2 0x905 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH2 0xFFFF DUP2 AND DUP2 EQ PUSH2 0x587 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x599 DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x5A4 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x441 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5C6 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x5D1 DUP2 PUSH2 0x905 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x5ED JUMPI DUP3 DUP4 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x5F8 DUP2 PUSH2 0x905 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x614 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP PUSH2 0x180 DUP1 DUP4 DUP11 SUB SLT ISZERO PUSH2 0x62A JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH2 0x633 DUP2 PUSH2 0x8DE JUMP JUMPDEST SWAP1 POP PUSH2 0x63F DUP10 DUP5 PUSH2 0x436 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP4 ADD CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP4 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x666 JUMPI DUP7 DUP8 REVERT JUMPDEST PUSH2 0x672 DUP11 DUP3 DUP7 ADD PUSH2 0x4DF JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 DUP4 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x689 JUMPI DUP7 DUP8 REVERT JUMPDEST PUSH2 0x695 DUP11 DUP3 DUP7 ADD PUSH2 0x4DF JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 DUP4 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x6AC JUMPI DUP7 DUP8 REVERT JUMPDEST PUSH2 0x6B8 DUP11 DUP3 DUP7 ADD PUSH2 0x4DF JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 DUP4 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x6CF JUMPI DUP7 DUP8 REVERT JUMPDEST PUSH2 0x6DB DUP11 DUP3 DUP7 ADD PUSH2 0x4DF JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 DUP4 DUP2 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE PUSH2 0x100 DUP1 DUP5 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE PUSH2 0x120 DUP1 DUP5 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE PUSH2 0x140 DUP1 DUP5 ADD CALLDATALOAD DUP4 DUP2 GT ISZERO PUSH2 0x714 JUMPI DUP8 DUP9 REVERT JUMPDEST PUSH2 0x720 DUP12 DUP3 DUP8 ADD PUSH2 0x447 JUMP JUMPDEST DUP3 DUP5 ADD MSTORE POP POP PUSH2 0x160 SWAP2 POP PUSH2 0x737 DUP10 DUP4 DUP6 ADD PUSH2 0x4CF JUMP JUMPDEST DUP3 DUP3 ADD MSTORE DUP1 SWAP6 POP POP POP POP PUSH2 0x74E DUP7 PUSH1 0x40 DUP8 ADD PUSH2 0x5A4 JUMP JUMPDEST SWAP2 POP PUSH2 0x75D DUP7 PUSH1 0x60 DUP8 ADD PUSH2 0x436 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x78D JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x771 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x79E JUMPI DUP3 PUSH1 0x20 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 PUSH1 0x40 SWAP1 DUP2 DUP6 ADD SWAP1 DUP7 DUP5 ADD DUP6 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x823 JUMPI DUP2 MLOAD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 MSTORE DUP7 DUP2 ADD MLOAD PUSH2 0xFFFF AND DUP8 DUP7 ADD MSTORE DUP6 ADD MLOAD PUSH1 0xFF AND DUP6 DUP6 ADD MSTORE PUSH1 0x60 SWAP1 SWAP4 ADD SWAP3 SWAP1 DUP6 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x7E4 JUMP JUMPDEST POP SWAP2 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD PUSH1 0x80 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x857 PUSH1 0xA0 DUP5 ADD DUP3 PUSH2 0x768 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x1F NOT DUP5 DUP4 SUB ADD PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0x874 DUP3 DUP3 PUSH2 0x768 JUMP JUMPDEST PUSH1 0x40 DUP7 ADD MLOAD PUSH1 0xFF AND PUSH1 0x60 DUP7 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 SWAP6 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x80 SWAP1 SWAP5 ADD SWAP4 SWAP1 SWAP4 MSTORE POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST SWAP7 DUP8 MSTORE PUSH1 0x20 DUP8 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND PUSH1 0x40 DUP8 ADD MSTORE SWAP2 DUP4 AND PUSH1 0x60 DUP7 ADD MSTORE DUP3 AND PUSH1 0x80 DUP6 ADD MSTORE AND PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xE0 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x8FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x91A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD1 0xB4 ORIGIN 0xD2 DUP10 0xE7 0xEE 0xBA 0x4B 0xE MUL TIMESTAMP SWAP12 DUP13 PUSH20 0x2946DDE2BF512727089A437E2B5BC39DCF64736F PUSH13 0x634300060C0033000000000000 ",
              "sourceMap": "260:2967:33:-:0;;;912:500;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1064:51:33;;1056:123;;;;-1:-1:-1;;;1056:123:33;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;1193:46:33;;1185:104;;;;-1:-1:-1;;;1185:104:33;;;;;;;:::i;:::-;1295:27;:58;;-1:-1:-1;;;;;1295:58:33;;;-1:-1:-1;;;;;;1295:58:33;;;;;;;;1359:48;;;;;;;;;;;260:2967;;423:535:-1;;;623:2;611:9;602:7;598:23;594:32;591:2;;;-1:-1;;629:12;591:2;329:6;323:13;341:70;405:5;341:70;:::i;:::-;829:2;910:22;;114:13;681:111;;-1:-1;132:64;114:13;132:64;:::i;:::-;837:105;;;;585:373;;;;;:::o;1761:416::-;1961:2;1975:47;;;1190:2;1946:18;;;2711:19;1226:34;2751:14;;;1206:55;1295:29;1281:12;;;1274:51;1344:12;;;1932:245::o;2184:416::-;2384:2;2398:47;;;1595:2;2369:18;;;2711:19;1631:34;2751:14;;;1611:55;-1:-1;;;1686:12;;;1679:37;1735:12;;;2355:245::o;3269:179::-;-1:-1;;;;;3203:54;;3359:66;;3349:2;;3439:1;;3429:12;3349:2;3343:105;:::o;:::-;260:2967:33;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106100415760003560e01c8063013da4201461004657806314d9dcd014610064578063b77f3bcb1461006c575b600080fd5b61004e61007f565b60405161005b91906107b3565b60405180910390f35b61004e61008e565b61004e61007a3660046105d8565b61009d565b6000546001600160a01b031681565b6001546001600160a01b031681565b6000805460408051633bf206a360e21b8152905183926001600160a01b03169163efc81a8c91600480830192602092919082900301818787803b1580156100e357600080fd5b505af11580156100f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061011b91906105b5565b9050600061013386606001518760800151878a610331565b9050600061014b8760a001518860c00151888b6103e1565b60208801516040808a01518a516101208c01519251631fcafa7f60e21b81529495506001600160a01b03881694637f2be9fc94610194949093928f928a928a92916004016108a3565b600060405180830381600087803b1580156101ae57600080fd5b505af11580156101c2573d6000803e3d6000fd5b50505061014088015160405163612d4e1960e11b81526001600160a01b038616925063c25a9c32916101f6916004016107c7565b600060405180830381600087803b15801561021057600080fd5b505af1158015610224573d6000803e3d6000fd5b505050508661016001511561029357604051631c54da5b60e11b81526001600160a01b038416906338a9b4b69061026090600190600401610830565b600060405180830381600087803b15801561027a57600080fd5b505af115801561028e573d6000803e3d6000fd5b505050505b60405163f2fde38b60e01b81526001600160a01b0384169063f2fde38b906102bf9088906004016107b3565b600060405180830381600087803b1580156102d957600080fd5b505af11580156102ed573d6000803e3d6000fd5b50506040516001600160a01b03861692507f8f711639be1281e7c5ee59206b3043d38eaabb4e87ef3cbd3e301ca1f46474549150600090a250909695505050505050565b600154604080516080810182528681526020810186905260ff8516818301526001600160a01b0384811660608301529151638e22585d60e01b81526000939290921691638e22585d916103869160040161083b565b602060405180830381600087803b1580156103a057600080fd5b505af11580156103b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d891906105b5565b95945050505050565b600154604080516080810182528681526020810186905260ff8516818301526001600160a01b0384811660608301529151638c0cd38d60e01b81526000939290921691638c0cd38d916103869160040161083b565b803561044181610905565b92915050565b600082601f830112610457578081fd5b813567ffffffffffffffff81111561046d578182fd5b602061047c81828402016108de565b828152925080830184820160608085028701840188101561049c57600080fd5b60005b858110156104c3576104b18984610548565b8452928401929181019160010161049f565b50505050505092915050565b8035801515811461044157600080fd5b600082601f8301126104ef578081fd5b813567ffffffffffffffff811115610505578182fd5b610518601f8201601f19166020016108de565b915080825283602082850101111561052f57600080fd5b8060208401602084013760009082016020015292915050565b600060608284031215610559578081fd5b61056360606108de565b9050813561057081610905565b8152602082013561ffff8116811461058757600080fd5b602082015261059983604084016105a4565b604082015292915050565b803560ff8116811461044157600080fd5b6000602082840312156105c6578081fd5b81516105d181610905565b9392505050565b600080600080608085870312156105ed578283fd5b84356105f881610905565b9350602085013567ffffffffffffffff80821115610614578485fd5b818701915061018080838a03121561062a578586fd5b610633816108de565b905061063f8984610436565b81526020830135602082015260408301356040820152606083013582811115610666578687fd5b6106728a8286016104df565b606083015250608083013582811115610689578687fd5b6106958a8286016104df565b60808301525060a0830135828111156106ac578687fd5b6106b88a8286016104df565b60a08301525060c0830135828111156106cf578687fd5b6106db8a8286016104df565b60c08301525060e08381013590820152610100808401359082015261012080840135908201526101408084013583811115610714578788fd5b6107208b828701610447565b8284015250506101609150610737898385016104cf565b8282015280955050505061074e86604087016105a4565b915061075d8660608701610436565b905092959194509250565b60008151808452815b8181101561078d57602081850181015186830182015201610771565b8181111561079e5782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b602080825282518282018190526000919060409081850190868401855b8281101561082357815180516001600160a01b031685528681015161ffff168786015285015160ff1685850152606090930192908501906001016107e4565b5091979650505050505050565b901515815260200190565b60006020825282516080602084015261085760a0840182610768565b90506020840151601f198483030160408501526108748282610768565b604086015160ff16606086810191909152909501516001600160a01b0316608090940193909352509192915050565b96875260208701959095526001600160a01b0393841660408701529183166060860152821660808501521660a083015260c082015260e00190565b60405181810167ffffffffffffffff811182821017156108fd57600080fd5b604052919050565b6001600160a01b038116811461091a57600080fd5b5056fea2646970667358221220d1b432d289e7eeba4b0e02429b8c732946dde2bf512727089a437e2b5bc39dcf64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x13DA420 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0x14D9DCD0 EQ PUSH2 0x64 JUMPI DUP1 PUSH4 0xB77F3BCB EQ PUSH2 0x6C JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x7F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x5B SWAP2 SWAP1 PUSH2 0x7B3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH2 0x8E JUMP JUMPDEST PUSH2 0x4E PUSH2 0x7A CALLDATASIZE PUSH1 0x4 PUSH2 0x5D8 JUMP JUMPDEST PUSH2 0x9D JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x3BF206A3 PUSH1 0xE2 SHL DUP2 MSTORE SWAP1 MLOAD DUP4 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xEFC81A8C SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x11B SWAP2 SWAP1 PUSH2 0x5B5 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x133 DUP7 PUSH1 0x60 ADD MLOAD DUP8 PUSH1 0x80 ADD MLOAD DUP8 DUP11 PUSH2 0x331 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x14B DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0xC0 ADD MLOAD DUP9 DUP12 PUSH2 0x3E1 JUMP JUMPDEST PUSH1 0x20 DUP9 ADD MLOAD PUSH1 0x40 DUP1 DUP11 ADD MLOAD DUP11 MLOAD PUSH2 0x120 DUP13 ADD MLOAD SWAP3 MLOAD PUSH4 0x1FCAFA7F PUSH1 0xE2 SHL DUP2 MSTORE SWAP5 SWAP6 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND SWAP5 PUSH4 0x7F2BE9FC SWAP5 PUSH2 0x194 SWAP5 SWAP1 SWAP4 SWAP3 DUP16 SWAP3 DUP11 SWAP3 DUP11 SWAP3 SWAP2 PUSH1 0x4 ADD PUSH2 0x8A3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1C2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH2 0x140 DUP9 ADD MLOAD PUSH1 0x40 MLOAD PUSH4 0x612D4E19 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND SWAP3 POP PUSH4 0xC25A9C32 SWAP2 PUSH2 0x1F6 SWAP2 PUSH1 0x4 ADD PUSH2 0x7C7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x210 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x224 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP7 PUSH2 0x160 ADD MLOAD ISZERO PUSH2 0x293 JUMPI PUSH1 0x40 MLOAD PUSH4 0x1C54DA5B PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH4 0x38A9B4B6 SWAP1 PUSH2 0x260 SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x4 ADD PUSH2 0x830 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x27A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x28E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0xF2FDE38B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH4 0xF2FDE38B SWAP1 PUSH2 0x2BF SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x7B3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2ED JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND SWAP3 POP PUSH32 0x8F711639BE1281E7C5EE59206B3043D38EAABB4E87EF3CBD3E301CA1F4647454 SWAP2 POP PUSH1 0x0 SWAP1 LOG2 POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE DUP7 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0xFF DUP6 AND DUP2 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x60 DUP4 ADD MSTORE SWAP2 MLOAD PUSH4 0x8E22585D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP4 SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH4 0x8E22585D SWAP2 PUSH2 0x386 SWAP2 PUSH1 0x4 ADD PUSH2 0x83B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3B4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3D8 SWAP2 SWAP1 PUSH2 0x5B5 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE DUP7 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0xFF DUP6 AND DUP2 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x60 DUP4 ADD MSTORE SWAP2 MLOAD PUSH4 0x8C0CD38D PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP4 SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH4 0x8C0CD38D SWAP2 PUSH2 0x386 SWAP2 PUSH1 0x4 ADD PUSH2 0x83B JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0x441 DUP2 PUSH2 0x905 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x457 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x46D JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 PUSH2 0x47C DUP2 DUP3 DUP5 MUL ADD PUSH2 0x8DE JUMP JUMPDEST DUP3 DUP2 MSTORE SWAP3 POP DUP1 DUP4 ADD DUP5 DUP3 ADD PUSH1 0x60 DUP1 DUP6 MUL DUP8 ADD DUP5 ADD DUP9 LT ISZERO PUSH2 0x49C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0x4C3 JUMPI PUSH2 0x4B1 DUP10 DUP5 PUSH2 0x548 JUMP JUMPDEST DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP2 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x49F JUMP JUMPDEST POP POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x441 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x4EF JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x505 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x518 PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD PUSH2 0x8DE JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x52F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x559 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x563 PUSH1 0x60 PUSH2 0x8DE JUMP JUMPDEST SWAP1 POP DUP2 CALLDATALOAD PUSH2 0x570 DUP2 PUSH2 0x905 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH2 0xFFFF DUP2 AND DUP2 EQ PUSH2 0x587 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x599 DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x5A4 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x441 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x5C6 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x5D1 DUP2 PUSH2 0x905 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x5ED JUMPI DUP3 DUP4 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x5F8 DUP2 PUSH2 0x905 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x614 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP PUSH2 0x180 DUP1 DUP4 DUP11 SUB SLT ISZERO PUSH2 0x62A JUMPI DUP6 DUP7 REVERT JUMPDEST PUSH2 0x633 DUP2 PUSH2 0x8DE JUMP JUMPDEST SWAP1 POP PUSH2 0x63F DUP10 DUP5 PUSH2 0x436 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP4 ADD CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP4 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x666 JUMPI DUP7 DUP8 REVERT JUMPDEST PUSH2 0x672 DUP11 DUP3 DUP7 ADD PUSH2 0x4DF JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 DUP4 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x689 JUMPI DUP7 DUP8 REVERT JUMPDEST PUSH2 0x695 DUP11 DUP3 DUP7 ADD PUSH2 0x4DF JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 DUP4 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x6AC JUMPI DUP7 DUP8 REVERT JUMPDEST PUSH2 0x6B8 DUP11 DUP3 DUP7 ADD PUSH2 0x4DF JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 DUP4 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x6CF JUMPI DUP7 DUP8 REVERT JUMPDEST PUSH2 0x6DB DUP11 DUP3 DUP7 ADD PUSH2 0x4DF JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 DUP4 DUP2 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE PUSH2 0x100 DUP1 DUP5 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE PUSH2 0x120 DUP1 DUP5 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE PUSH2 0x140 DUP1 DUP5 ADD CALLDATALOAD DUP4 DUP2 GT ISZERO PUSH2 0x714 JUMPI DUP8 DUP9 REVERT JUMPDEST PUSH2 0x720 DUP12 DUP3 DUP8 ADD PUSH2 0x447 JUMP JUMPDEST DUP3 DUP5 ADD MSTORE POP POP PUSH2 0x160 SWAP2 POP PUSH2 0x737 DUP10 DUP4 DUP6 ADD PUSH2 0x4CF JUMP JUMPDEST DUP3 DUP3 ADD MSTORE DUP1 SWAP6 POP POP POP POP PUSH2 0x74E DUP7 PUSH1 0x40 DUP8 ADD PUSH2 0x5A4 JUMP JUMPDEST SWAP2 POP PUSH2 0x75D DUP7 PUSH1 0x60 DUP8 ADD PUSH2 0x436 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x78D JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x771 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x79E JUMPI DUP3 PUSH1 0x20 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 PUSH1 0x40 SWAP1 DUP2 DUP6 ADD SWAP1 DUP7 DUP5 ADD DUP6 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x823 JUMPI DUP2 MLOAD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 MSTORE DUP7 DUP2 ADD MLOAD PUSH2 0xFFFF AND DUP8 DUP7 ADD MSTORE DUP6 ADD MLOAD PUSH1 0xFF AND DUP6 DUP6 ADD MSTORE PUSH1 0x60 SWAP1 SWAP4 ADD SWAP3 SWAP1 DUP6 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x7E4 JUMP JUMPDEST POP SWAP2 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD PUSH1 0x80 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x857 PUSH1 0xA0 DUP5 ADD DUP3 PUSH2 0x768 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x1F NOT DUP5 DUP4 SUB ADD PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0x874 DUP3 DUP3 PUSH2 0x768 JUMP JUMPDEST PUSH1 0x40 DUP7 ADD MLOAD PUSH1 0xFF AND PUSH1 0x60 DUP7 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 SWAP6 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x80 SWAP1 SWAP5 ADD SWAP4 SWAP1 SWAP4 MSTORE POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST SWAP7 DUP8 MSTORE PUSH1 0x20 DUP8 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND PUSH1 0x40 DUP8 ADD MSTORE SWAP2 DUP4 AND PUSH1 0x60 DUP7 ADD MSTORE DUP3 AND PUSH1 0x80 DUP6 ADD MSTORE AND PUSH1 0xA0 DUP4 ADD MSTORE PUSH1 0xC0 DUP3 ADD MSTORE PUSH1 0xE0 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x8FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x91A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD1 0xB4 ORIGIN 0xD2 DUP10 0xE7 0xEE 0xBA 0x4B 0xE MUL TIMESTAMP SWAP12 DUP13 PUSH20 0x2946DDE2BF512727089A437E2B5BC39DCF64736F PUSH13 0x634300060C0033000000000000 ",
              "sourceMap": "260:2967:33:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;789:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;855:52;;;:::i;1416:1114::-;;;;;;:::i;:::-;;:::i;789:62::-;;;-1:-1:-1;;;;;789:62:33;;:::o;855:52::-;;;-1:-1:-1;;;;;855:52:33;;:::o;1416:1114::-;1587:15;1631:27;;:36;;;-1:-1:-1;;;1631:36:33;;;;1587:15;;-1:-1:-1;;;;;1631:27:33;;:34;;:36;;;;;;;;;;;;;;1587:15;1631:27;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1610:57;;1674:13;1690:130;1711:19;:30;;;1749:19;:32;;;1789:8;1805:9;1690:13;:130::i;:::-;1674:146;;1827:27;1857:145;1883:19;:35;;;1926:19;:37;;;1971:8;1987:9;1857:18;:145::i;:::-;2045:36;;;;2089:38;;;;;2185:30;;2223:35;;;;2009:255;;-1:-1:-1;;;2009:255:33;;1827:175;;-1:-1:-1;;;;;;2009:28:33;;;;;:255;;2045:36;;2089:38;2135:9;;2152:6;;1827:175;;2185:30;2009:255;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2289:31:33;;;;2271:50;;-1:-1:-1;;;2271:50:33;;-1:-1:-1;;;;;2271:17:33;;;-1:-1:-1;2271:17:33;;:50;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2332:19;:44;;;2328:101;;;2386:36;;-1:-1:-1;;;2386:36:33;;-1:-1:-1;;;;;2386:30:33;;;;;:36;;2417:4;;2386:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2328:101;2435:27;;-1:-1:-1;;;2435:27:33;;-1:-1:-1;;;;;2435:20:33;;;;;:27;;2456:5;;2435:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2474:35:33;;-1:-1:-1;;;;;2474:35:33;;;-1:-1:-1;2474:35:33;;-1:-1:-1;2474:35:33;;;-1:-1:-1;2523:2:33;;1416:1114;-1:-1:-1;;;;;;1416:1114:33:o;2534:332::-;2694:22;;2737:118;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2737:118:33;;;;;;;2694:167;;-1:-1:-1;;;2694:167:33;;2673:6;;2694:22;;;;;:35;;:167;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2687:174;2534:332;-1:-1:-1;;;;;2534:332:33:o;2870:355::-;3044:22;;3096:118;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3096:118:33;;;;;;;3044:176;;-1:-1:-1;;;3044:176:33;;3014:15;;3044:22;;;;;:44;;:176;;;;;:::i;5:130:-1:-;72:20;;97:33;72:20;97:33;:::i;:::-;57:78;;;;:::o;187:812::-;;339:3;332:4;324:6;320:17;316:27;306:2;;-1:-1;;347:12;306:2;394:6;381:20;17559:18;17551:6;17548:30;17545:2;;;-1:-1;;17581:12;17545:2;17626:4;416:115;17626:4;;17618:6;17614:17;17679:15;416:115;:::i;:::-;559:21;;;407:124;-1:-1;616:14;;;591:17;;;717:4;705:17;;;696:27;;;;693:36;-1:-1;690:2;;;742:1;;732:12;690:2;767:1;752:241;777:6;774:1;771:13;752:241;;;857:72;925:3;913:10;857:72;:::i;:::-;845:85;;944:14;;;;972;;;;799:1;792:9;752:241;;;756:14;;;;;;299:700;;;;:::o;1007:124::-;1071:20;;19239:13;;19232:21;23527:32;;23517:2;;23573:1;;23563:12;2046:442;;2148:3;2141:4;2133:6;2129:17;2125:27;2115:2;;-1:-1;;2156:12;2115:2;2203:6;2190:20;17855:18;17847:6;17844:30;17841:2;;;-1:-1;;17877:12;17841:2;2225:65;17950:9;17931:17;;-1:-1;;17927:33;18018:4;18008:15;2225:65;:::i;:::-;2216:74;;2310:6;2303:5;2296:21;2414:3;18018:4;2405:6;2338;2396:16;;2393:25;2390:2;;;2431:1;;2421:12;2390:2;22893:6;18018:4;2338:6;2334:17;18018:4;2372:5;2368:16;22870:30;22949:1;22931:16;;;18018:4;22931:16;22924:27;2372:5;2108:380;-1:-1;;2108:380::o;5240:627::-;;5364:4;5352:9;5347:3;5343:19;5339:30;5336:2;;;-1:-1;;5372:12;5336:2;5400:20;5364:4;5400:20;:::i;:::-;5391:29;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5479:75;;5621:2;5674:22;;5940:20;19932:6;19921:18;;24477:34;;24467:2;;-1:-1;;24515:12;24467:2;5621;5636:16;;5629:74;5798:47;5841:3;5765:2;5817:22;;5798:47;:::i;:::-;5765:2;5784:5;5780:16;5773:73;5330:537;;;;:::o;6146:126::-;6211:20;;20229:4;20218:16;;24722:33;;24712:2;;24769:1;;24759:12;6279:313;;6419:2;6407:9;6398:7;6394:23;6390:32;6387:2;;;-1:-1;;6425:12;6387:2;1247:6;1241:13;1259:58;1311:5;1259:58;:::i;:::-;6477:99;6381:211;-1:-1;;;6381:211::o;6919:813::-;;;;;7129:3;7117:9;7108:7;7104:23;7100:33;7097:2;;;-1:-1;;7136:12;7097:2;1618:6;1605:20;1630:51;1675:5;1630:51;:::i;:::-;7188:81;-1:-1;7334:2;7319:18;;7306:32;7358:18;7347:30;;;7344:2;;;-1:-1;;7380:12;7344:2;7485:6;7474:9;7470:22;;;2682:6;;2670:9;2665:3;2661:19;2657:32;2654:2;;;-1:-1;;2692:12;2654:2;2720:22;2682:6;2720:22;:::i;:::-;2711:31;;2830:70;2896:3;2872:22;2830:70;:::i;:::-;2812:16;2805:96;7334:2;3032:9;3028:22;6076:20;7334:2;2993:5;2989:16;2982:75;3132:2;3190:9;3186:22;6076:20;3132:2;3151:5;3147:16;3140:75;3310:2;3299:9;3295:18;3282:32;7358:18;3326:6;3323:30;3320:2;;;-1:-1;;3356:12;3320:2;3401:59;3456:3;3447:6;3436:9;3432:22;3401:59;:::i;:::-;3310:2;3387:5;3383:16;3376:85;;7129:3;3547:9;3543:19;3530:33;7358:18;3575:6;3572:30;3569:2;;;-1:-1;;3605:12;3569:2;3650:59;3705:3;3696:6;3685:9;3681:22;3650:59;:::i;:::-;7129:3;3636:5;3632:16;3625:85;;3810:3;3799:9;3795:19;3782:33;7358:18;3827:6;3824:30;3821:2;;;-1:-1;;3857:12;3821:2;3902:59;3957:3;3948:6;3937:9;3933:22;3902:59;:::i;:::-;3810:3;3888:5;3884:16;3877:85;;4064:3;4053:9;4049:19;4036:33;7358:18;4081:6;4078:30;4075:2;;;-1:-1;;4111:12;4075:2;4156:59;4211:3;4202:6;4191:9;4187:22;4156:59;:::i;:::-;4064:3;4138:16;;4131:85;-1:-1;4298:3;4353:22;;;6076:20;4314:16;;;4307:75;4463:3;4520:22;;;6076:20;4479:18;;;4472:77;4621:3;4678:22;;;6076:20;4637:18;;;4630:77;4803:3;4788:19;;;4775:33;4817:30;;;4814:2;;;-1:-1;;4850:12;4814:2;4897:109;5002:3;4993:6;4982:9;4978:22;4897:109;:::i;:::-;4803:3;4881:5;4877:18;4870:137;;;5088:3;;;5124:46;5166:3;5088;5146:9;5142:22;5124:46;:::i;:::-;5088:3;5108:5;5104:18;5097:74;7400:102;;;;;;7557:51;7600:7;3132:2;7580:9;7576:22;7557:51;:::i;:::-;7547:61;;7663:53;7708:7;3310:2;7688:9;7684:22;7663:53;:::i;:::-;7653:63;;7091:641;;;;;;;:::o;11235:327::-;;11370:5;18371:12;18857:6;18852:3;18845:19;-1:-1;23038:101;23052:6;23049:1;23046:13;23038:101;;;18894:4;23119:11;;;;;23113:18;23100:11;;;;;23093:39;23067:10;23038:101;;;23154:6;23151:1;23148:13;23145:2;;;-1:-1;18894:4;23210:6;18889:3;23201:16;;23194:27;23145:2;-1:-1;17950:9;23310:14;-1:-1;;23306:28;11518:39;;;;18894:4;11518:39;;11317:245;-1:-1;;11317:245::o;13774:222::-;-1:-1;;;;;20013:54;;;;8424:37;;13901:2;13886:18;;13872:124::o;14003:510::-;14250:2;14264:47;;;18371:12;;14235:18;;;18845:19;;;14003:510;;14250:2;18885:14;;;;;;18190;;;14003:510;9261:365;9286:6;9283:1;9280:13;9261:365;;;9347:13;;13014:23;;-1:-1;;;;;20013:54;8424:37;;13180:16;;;13174:23;19932:6;19921:18;13249:14;;;13502:36;13333:16;;13327:23;20229:4;20218:16;13400:14;;;13727:35;8344:4;8335:14;;;;18665;;;;17559:18;9301:9;9261:365;;;-1:-1;14317:186;;14221:292;-1:-1;;;;;;;14221:292::o;14520:210::-;19239:13;;19232:21;9721:34;;14641:2;14626:18;;14612:118::o;15610:426::-;;15815:2;15836:17;15829:47;11933:16;11927:23;11861:4;15815:2;15804:9;15800:18;11963:38;12016:73;11852:14;15804:9;11852:14;12070:12;12016:73;:::i;:::-;12008:81;;15815:2;12169:5;12165:16;12159:23;17950:9;;15804;12222:4;12218:14;;12202;15804:9;12202:14;12195:38;12248:73;12316:4;12302:12;12248:73;:::i;:::-;12202:14;12399:16;;12393:23;20229:4;20218:16;12466:14;;;;13727:35;;;;12555:16;;;12549:23;-1:-1;;;;;20013:54;11861:4;12660:14;;;8424:37;;;;-1:-1;12240:81;;15786:250;-1:-1;;15786:250::o;16043:1052::-;13621:37;;;16583:2;16568:18;;13621:37;;;;-1:-1;;;;;20013:54;;;16684:2;16669:18;;9869:81;20013:54;;;16783:2;16768:18;;9869:81;20013:54;;16891:3;16876:19;;9869:81;20013:54;20024:42;16981:19;;9869:81;17080:3;17065:19;;13621:37;16418:3;16403:19;;16389:706::o;17102:256::-;17164:2;17158:9;17190:17;;;17265:18;17250:34;;17286:22;;;17247:62;17244:2;;;17322:1;;17312:12;17244:2;17164;17331:22;17142:216;;-1:-1;17142:216::o;23347:117::-;-1:-1;;;;;20013:54;;23406:35;;23396:2;;23455:1;;23445:12;23396:2;23390:74;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "477400",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "controlledTokenBuilder()": "1070",
                "createMultipleWinners(address,(address,uint256,uint256,string,string,string,string,uint256,uint256,uint256,(address,uint16,uint8)[],bool),uint8,address)": "infinite",
                "multipleWinnersProxyFactory()": "1048"
              },
              "internal": {
                "_createSponsorship(string memory,string memory,uint8,contract PrizePool)": "infinite",
                "_createTicket(string memory,string memory,uint8,contract PrizePool)": "infinite"
              }
            },
            "methodIdentifiers": {
              "controlledTokenBuilder()": "14d9dcd0",
              "createMultipleWinners(address,(address,uint256,uint256,string,string,string,string,uint256,uint256,uint256,(address,uint16,uint8)[],bool),uint8,address)": "b77f3bcb",
              "multipleWinnersProxyFactory()": "013da420"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract MultipleWinnersProxyFactory\",\"name\":\"_multipleWinnersProxyFactory\",\"type\":\"address\"},{\"internalType\":\"contract ControlledTokenBuilder\",\"name\":\"_controlledTokenBuilder\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"prizeStrategy\",\"type\":\"address\"}],\"name\":\"MultipleWinnersCreated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"controlledTokenBuilder\",\"outputs\":[{\"internalType\":\"contract ControlledTokenBuilder\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract PrizePool\",\"name\":\"prizePool\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"contract RNGInterface\",\"name\":\"rngService\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"prizePeriodStart\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prizePeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"ticketName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"ticketSymbol\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"sponsorshipName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"sponsorshipSymbol\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"ticketCreditLimitMantissa\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ticketCreditRateMantissa\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"numberOfWinners\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"}],\"internalType\":\"struct PrizeSplit.PrizeSplitConfig[]\",\"name\":\"prizeSplits\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"splitExternalErc20Awards\",\"type\":\"bool\"}],\"internalType\":\"struct MultipleWinnersBuilder.MultipleWinnersConfig\",\"name\":\"prizeStrategyConfig\",\"type\":\"tuple\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"createMultipleWinners\",\"outputs\":[{\"internalType\":\"contract MultipleWinners\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"multipleWinnersProxyFactory\",\"outputs\":[{\"internalType\":\"contract MultipleWinnersProxyFactory\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/builders/MultipleWinnersBuilder.sol\":\"MultipleWinnersBuilder\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.6.0;\\n\\n/// @title Random Number Generator Interface\\n/// @notice Provides an interface for requesting random numbers from 3rd-party RNG services (Chainlink VRF, Starkware VDF, etc..)\\ninterface RNGInterface {\\n\\n  /// @notice Emitted when a new request for a random number has been submitted\\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\\n  /// @param sender The indexed address of the sender of the request\\n  event RandomNumberRequested(uint32 indexed requestId, address indexed sender);\\n\\n  /// @notice Emitted when an existing request for a random number has been completed\\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\\n  /// @param randomNumber The random number produced by the 3rd-party service\\n  event RandomNumberCompleted(uint32 indexed requestId, uint256 randomNumber);\\n\\n  /// @notice Gets the last request id used by the RNG service\\n  /// @return requestId The last request id used in the last request\\n  function getLastRequestId() external view returns (uint32 requestId);\\n\\n  /// @notice Gets the Fee for making a Request against an RNG service\\n  /// @return feeToken The address of the token that is used to pay fees\\n  /// @return requestFee The fee required to be paid to make a request\\n  function getRequestFee() external view returns (address feeToken, uint256 requestFee);\\n\\n  /// @notice Sends a request for a random number to the 3rd-party service\\n  /// @dev Some services will complete the request immediately, others may have a time-delay\\n  /// @dev Some services require payment in the form of a token, such as $LINK for Chainlink VRF\\n  /// @return requestId The ID of the request used to get the results of the RNG service\\n  /// @return lockBlock The block number at which the RNG service will start generating time-delayed randomness.  The calling contract\\n  /// should \\\"lock\\\" all activity until the result is available via the `requestId`\\n  function requestRandomNumber() external returns (uint32 requestId, uint32 lockBlock);\\n\\n  /// @notice Checks if the request for randomness from the 3rd-party service has completed\\n  /// @dev For time-delayed requests, this function is used to check/confirm completion\\n  /// @param requestId The ID of the request used to get the results of the RNG service\\n  /// @return isCompleted True if the request has completed and a random number is available, false otherwise\\n  function isRequestComplete(uint32 requestId) external view returns (bool isCompleted);\\n\\n  /// @notice Gets the random number produced by the 3rd-party service\\n  /// @param requestId The ID of the request used to get the results of the RNG service\\n  /// @return randomNum The random number\\n  function randomNumber(uint32 requestId) external returns (uint256 randomNum);\\n}\\n\",\"keccak256\":\"0xf917c68439d7476cd226f475e8fce940e0cf1d32cb0ff12e8537072a07f2b1da\",\"license\":\"GPL-3.0\"},\"@pooltogether/uniform-random-number/contracts/UniformRandomNumber.sol\":{\"content\":\"/**\\nCopyright 2019 PoolTogether LLC\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice A library that uses entropy to select a random number within a bound.  Compensates for modulo bias.\\n * @dev Thanks to https://medium.com/hownetworks/dont-waste-cycles-with-modulo-bias-35b6fdafcf94\\n */\\nlibrary UniformRandomNumber {\\n  /// @notice Select a random number without modulo bias using a random seed and upper bound\\n  /// @param _entropy The seed for randomness\\n  /// @param _upperBound The upper bound of the desired number\\n  /// @return A random number less than the _upperBound\\n  function uniform(uint256 _entropy, uint256 _upperBound) internal pure returns (uint256) {\\n    require(_upperBound > 0, \\\"UniformRand/min-bound\\\");\\n    uint256 min = -_upperBound % _upperBound;\\n    uint256 random = _entropy;\\n    while (true) {\\n      if (random >= min) {\\n        break;\\n      }\\n      random = uint256(keccak256(abi.encodePacked(random)));\\n    }\\n    return random % _upperBound;\\n  }\\n}\",\"keccak256\":\"0x0d86eb3349d8a9e226ff6f3328a6a79bbf872859a4afbe489051fbf3b8550df4\"},\"contracts/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary Constants {\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC721 = 0x80ac58cd;\\n}\",\"keccak256\":\"0x5dc8f8bda4e9668a9ffae6a941774f849adcb368cc2275fd8a91e6ada8fad7fb\",\"license\":\"GPL-3.0\"},\"contracts/builders/ControlledTokenBuilder.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"../token/ControlledTokenProxyFactory.sol\\\";\\nimport \\\"../token/TicketProxyFactory.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ncontract ControlledTokenBuilder {\\n\\n  event CreatedControlledToken(address indexed token);\\n  event CreatedTicket(address indexed token);\\n\\n  ControlledTokenProxyFactory public controlledTokenProxyFactory;\\n  TicketProxyFactory public ticketProxyFactory;\\n\\n  struct ControlledTokenConfig {\\n    string name;\\n    string symbol;\\n    uint8 decimals;\\n    TokenControllerInterface controller;\\n  }\\n\\n  constructor (\\n    ControlledTokenProxyFactory _controlledTokenProxyFactory,\\n    TicketProxyFactory _ticketProxyFactory\\n  ) public {\\n    require(address(_controlledTokenProxyFactory) != address(0), \\\"ControlledTokenBuilder/controlledTokenProxyFactory-not-zero\\\");\\n    require(address(_ticketProxyFactory) != address(0), \\\"ControlledTokenBuilder/ticketProxyFactory-not-zero\\\");\\n    controlledTokenProxyFactory = _controlledTokenProxyFactory;\\n    ticketProxyFactory = _ticketProxyFactory;\\n  }\\n\\n  function createControlledToken(\\n    ControlledTokenConfig calldata config\\n  ) external returns (ControlledToken) {\\n    ControlledToken token = controlledTokenProxyFactory.create();\\n\\n    token.initialize(\\n      config.name,\\n      config.symbol,\\n      config.decimals,\\n      config.controller\\n    );\\n\\n    emit CreatedControlledToken(address(token));\\n\\n    return token;\\n  }\\n\\n  function createTicket(\\n    ControlledTokenConfig calldata config\\n  ) external returns (Ticket) {\\n    Ticket token = ticketProxyFactory.create();\\n\\n    token.initialize(\\n      config.name,\\n      config.symbol,\\n      config.decimals,\\n      config.controller\\n    );\\n\\n    emit CreatedTicket(address(token));\\n\\n    return token;\\n  }\\n}\\n\",\"keccak256\":\"0x87077a6f3a7cc093a1742ebb24a62b1c8a728341b3c49e3a147630f77c5aada7\",\"license\":\"GPL-3.0\"},\"contracts/builders/MultipleWinnersBuilder.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"./ControlledTokenBuilder.sol\\\";\\nimport \\\"../prize-strategy/multiple-winners/MultipleWinnersProxyFactory.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ncontract MultipleWinnersBuilder {\\n\\n  event MultipleWinnersCreated(address indexed prizeStrategy);\\n\\n  struct MultipleWinnersConfig {\\n    RNGInterface rngService;\\n    uint256 prizePeriodStart;\\n    uint256 prizePeriodSeconds;\\n    string ticketName;\\n    string ticketSymbol;\\n    string sponsorshipName;\\n    string sponsorshipSymbol;\\n    uint256 ticketCreditLimitMantissa;\\n    uint256 ticketCreditRateMantissa;\\n    uint256 numberOfWinners;\\n    MultipleWinners.PrizeSplitConfig[] prizeSplits;\\n    bool splitExternalErc20Awards;\\n  }\\n\\n  MultipleWinnersProxyFactory public multipleWinnersProxyFactory;\\n  ControlledTokenBuilder public controlledTokenBuilder;\\n\\n  constructor (\\n    MultipleWinnersProxyFactory _multipleWinnersProxyFactory,\\n    ControlledTokenBuilder _controlledTokenBuilder\\n  ) public {\\n    require(address(_multipleWinnersProxyFactory) != address(0), \\\"MultipleWinnersBuilder/multipleWinnersProxyFactory-not-zero\\\");\\n    require(address(_controlledTokenBuilder) != address(0), \\\"MultipleWinnersBuilder/token-builder-not-zero\\\");\\n    multipleWinnersProxyFactory = _multipleWinnersProxyFactory;\\n    controlledTokenBuilder = _controlledTokenBuilder;\\n  }\\n\\n  function createMultipleWinners(\\n    PrizePool prizePool,\\n    MultipleWinnersConfig memory prizeStrategyConfig,\\n    uint8 decimals,\\n    address owner\\n  ) external returns (MultipleWinners) {\\n    MultipleWinners mw = multipleWinnersProxyFactory.create();\\n\\n    Ticket ticket = _createTicket(\\n      prizeStrategyConfig.ticketName,\\n      prizeStrategyConfig.ticketSymbol,\\n      decimals,\\n      prizePool\\n    );\\n\\n    ControlledToken sponsorship = _createSponsorship(\\n      prizeStrategyConfig.sponsorshipName,\\n      prizeStrategyConfig.sponsorshipSymbol,\\n      decimals,\\n      prizePool\\n    );\\n\\n    mw.initializeMultipleWinners(\\n      prizeStrategyConfig.prizePeriodStart,\\n      prizeStrategyConfig.prizePeriodSeconds,\\n      prizePool,\\n      ticket,\\n      sponsorship,\\n      prizeStrategyConfig.rngService,\\n      prizeStrategyConfig.numberOfWinners\\n    );\\n\\n    mw.setPrizeSplits(prizeStrategyConfig.prizeSplits);\\n\\n    if (prizeStrategyConfig.splitExternalErc20Awards) {\\n      mw.setSplitExternalErc20Awards(true);\\n    }\\n\\n    mw.transferOwnership(owner);\\n\\n    emit MultipleWinnersCreated(address(mw));\\n\\n    return mw;\\n  }\\n\\n  function _createTicket(\\n    string memory name,\\n    string memory token,\\n    uint8 decimals,\\n    PrizePool prizePool\\n  ) internal returns (Ticket) {\\n    return controlledTokenBuilder.createTicket(\\n      ControlledTokenBuilder.ControlledTokenConfig(\\n        name,\\n        token,\\n        decimals,\\n        prizePool\\n      )\\n    );\\n  }\\n\\n  function _createSponsorship(\\n    string memory name,\\n    string memory token,\\n    uint8 decimals,\\n    PrizePool prizePool\\n  ) internal returns (ControlledToken) {\\n    return controlledTokenBuilder.createControlledToken(\\n      ControlledTokenBuilder.ControlledTokenConfig(\\n        name,\\n        token,\\n        decimals,\\n        prizePool\\n      )\\n    );\\n  }\\n}\\n\",\"keccak256\":\"0x30608cb295b5cd6290b1c5e69708d0fb8eebfe299bc358f1aa9a5cc539c81c63\",\"license\":\"GPL-3.0\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"},\"contracts/external/openzeppelin/ProxyFactory.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\n// solium-disable security/no-inline-assembly\\n// solium-disable security/no-low-level-calls\\ncontract ProxyFactory {\\n\\n  event ProxyCreated(address proxy);\\n\\n  function deployMinimal(address _logic, bytes memory _data) public returns (address proxy) {\\n    // Adapted from https://github.com/optionality/clone-factory/blob/32782f82dfc5a00d103a7e61a17a5dedbd1e8e9d/contracts/CloneFactory.sol\\n    bytes20 targetBytes = bytes20(_logic);\\n    assembly {\\n      let clone := mload(0x40)\\n      mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n      mstore(add(clone, 0x14), targetBytes)\\n      mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n      proxy := create(0, clone, 0x37)\\n    }\\n\\n    emit ProxyCreated(address(proxy));\\n\\n    if(_data.length > 0) {\\n      (bool success,) = proxy.call(_data);\\n      require(success, \\\"ProxyFactory/constructor-call-failed\\\");\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0xf0422303985796fdd8bdf772ac8e34331e2e63006f657989cca010fa4776d735\"},\"contracts/prize-pool/PrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../external/compound/ICompLike.sol\\\";\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../reserve/ReserveInterface.sol\\\";\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/TokenListenerLibrary.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\nimport \\\"./PrizePoolInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using SafeERC20Upgradeable for IERC721Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    address reserveRegistry,\\n    uint256 maxExitFeeMantissa\\n  );\\n\\n  /// @dev Event emitted when controlled token is added\\n  event ControlledTokenAdded(\\n    ControlledTokenInterface indexed token\\n  );\\n\\n  /// @dev Emitted when reserve is captured.\\n  event ReserveFeeCaptured(\\n    uint256 amount\\n  );\\n\\n  event AwardCaptured(\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when assets are deposited\\n  event Deposited(\\n    address indexed operator,\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount,\\n    address referrer\\n  );\\n\\n  /// @dev Event emitted when interest is awarded to a winner\\n  event Awarded(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are awarded to a winner\\n  event AwardedExternalERC20(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are transferred out\\n  event TransferredExternalERC20(\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC721s are awarded to a winner\\n  event AwardedExternalERC721(\\n    address indexed winner,\\n    address indexed token,\\n    uint256[] tokenIds\\n  );\\n\\n  /// @dev Event emitted when assets are withdrawn instantly\\n  event InstantWithdrawal(\\n    address indexed operator,\\n    address indexed from,\\n    address indexed token,\\n    uint256 amount,\\n    uint256 redeemed,\\n    uint256 exitFee\\n  );\\n\\n  event ReserveWithdrawal(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when the Liquidity Cap is set\\n  event LiquidityCapSet(\\n    uint256 liquidityCap\\n  );\\n\\n  /// @dev Event emitted when the Credit plan is set\\n  event CreditPlanSet(\\n    address token,\\n    uint128 creditLimitMantissa,\\n    uint128 creditRateMantissa\\n  );\\n\\n  /// @dev Event emitted when the Prize Strategy is set\\n  event PrizeStrategySet(\\n    address indexed prizeStrategy\\n  );\\n\\n  /// @dev Emitted when credit is minted\\n  event CreditMinted(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when credit is burned\\n  event CreditBurned(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\\n  event ErrorAwardingExternalERC721(bytes error);\\n\\n\\n  struct CreditPlan {\\n    uint128 creditLimitMantissa;\\n    uint128 creditRateMantissa;\\n  }\\n\\n  struct CreditBalance {\\n    uint192 balance;\\n    uint32 timestamp;\\n    bool initialized;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  /// @dev Reserve to which reserve fees are sent\\n  RegistryInterface public reserveRegistry;\\n\\n  /// @dev An array of all the controlled tokens\\n  ControlledTokenInterface[] internal _tokens;\\n\\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\\n  TokenListenerInterface public prizeStrategy;\\n\\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\\n  /// For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\\n  uint256 public maxExitFeeMantissa;\\n\\n  /// @dev The total funds that have been allocated to the reserve\\n  uint256 public reserveTotalSupply;\\n\\n  /// @dev The total amount of funds that the prize pool can hold.\\n  uint256 public liquidityCap;\\n\\n  /// @dev the The awardable balance\\n  uint256 internal _currentAwardBalance;\\n\\n  /// @dev Stores the credit plan for each token.\\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\\n\\n  /// @dev Stores each users balance of credit per token.\\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\\n\\n  /// @notice Initializes the Prize Pool\\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\\n  /// @param _maxExitFeeMantissa The maximum exit fee size\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_reserveRegistry) != address(0), \\\"PrizePool/reserveRegistry-not-zero\\\");\\n    uint256 controlledTokensLength = _controlledTokens.length;\\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\\n\\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\\n      _addControlledToken(controlledToken, i);\\n    }\\n    __Ownable_init();\\n    __ReentrancyGuard_init();\\n    _setLiquidityCap(uint256(-1));\\n\\n    reserveRegistry = _reserveRegistry;\\n    maxExitFeeMantissa = _maxExitFeeMantissa;\\n\\n    emit Initialized(\\n      address(_reserveRegistry),\\n      maxExitFeeMantissa\\n    );\\n  }\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external override view returns (address) {\\n    return address(_token());\\n  }\\n\\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\\n  /// @return The underlying balance of assets\\n  function balance() external returns (uint256) {\\n    return _balance();\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function canAwardExternal(address _externalToken) external view returns (bool) {\\n    return _canAwardExternal(_externalToken);\\n  }\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    canAddLiquidity(amount)\\n  {\\n    address operator = _msgSender();\\n\\n    _mint(to, amount, controlledToken, referrer);\\n\\n    _token().safeTransferFrom(operator, address(this), amount);\\n    _supply(amount);\\n\\n    emit Deposited(operator, to, controlledToken, amount, referrer);\\n  }\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    returns (uint256)\\n  {\\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n    require(exitFee <= maximumExitFee, \\\"PrizePool/exit-fee-exceeds-user-maximum\\\");\\n\\n    // burn the credit\\n    _burnCredit(from, controlledToken, burnedCredit);\\n\\n    // burn the tickets\\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\\n\\n    // redeem the tickets less the fee\\n    uint256 amountLessFee = amount.sub(exitFee);\\n    uint256 redeemed = _redeem(amountLessFee);\\n\\n    _token().safeTransfer(from, redeemed);\\n\\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\\n\\n    return exitFee;\\n  }\\n\\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\\n  /// @param exitFee The exit fee to check against the limit\\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\\n    if (exitFee > maxFee) {\\n      exitFee = maxFee;\\n    }\\n    return exitFee;\\n  }\\n\\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\\n  /// @param from The address the tokens are being transferred from (0 if minting)\\n  /// @param to The address the tokens are being transferred to (0 if burning)\\n  /// @param amount The amount of tokens being trasferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\\n    if (from != address(0)) {\\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\\n      // first accrue credit for their old balance\\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\\n\\n      if (from != to) {\\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\\n      }\\n\\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\\n    }\\n    if (to != address(0) && to != from) {\\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\\n    }\\n    // if we aren't minting\\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\\n    }\\n  }\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external override view returns (uint256) {\\n    return _currentAwardBalance;\\n  }\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n\\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\\n    uint256 currentBalance = _balance();\\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\\n\\n    if (unaccountedPrizeBalance > 0) {\\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\\n      if (reserveFee > 0) {\\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\\n        emit ReserveFeeCaptured(reserveFee);\\n      }\\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\\n\\n      emit AwardCaptured(unaccountedPrizeBalance);\\n    }\\n\\n    return _currentAwardBalance;\\n  }\\n\\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\\n\\n    uint256 amount = reserveTotalSupply;\\n    reserveTotalSupply = 0;\\n    uint256 redeemed = _redeem(amount);\\n\\n    _token().safeTransfer(address(to), redeemed);\\n\\n    emit ReserveWithdrawal(to, amount);\\n\\n    return redeemed;\\n  }\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external override\\n    onlyPrizeStrategy\\n    onlyControlledToken(controlledToken)\\n  {\\n    if (amount == 0) {\\n      return;\\n    }\\n\\n    require(amount <= _currentAwardBalance, \\\"PrizePool/award-exceeds-avail\\\");\\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\\n\\n    _mint(to, amount, controlledToken, address(0));\\n\\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\\n\\n    emit Awarded(to, controlledToken, amount);\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit TransferredExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit AwardedExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  function _transferOut(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (bool)\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (amount == 0) {\\n      return false;\\n    }\\n\\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\\n\\n    return true;\\n  }\\n\\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\\n  /// @param to The user who is receiving the tokens\\n  /// @param amount The amount of tokens they are receiving\\n  /// @param controlledToken The token that is going to be minted\\n  /// @param referrer The user who referred the minting\\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\\n    if (address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n    ControlledToken(controlledToken).controllerMint(to, amount);\\n  }\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (tokenIds.length == 0) {\\n      return;\\n    }\\n\\n    for (uint256 i = 0; i < tokenIds.length; i++) {\\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\\n\\n      }\\n      catch(bytes memory error){\\n        emit ErrorAwardingExternalERC721(error);\\n      }\\n      \\n    }\\n\\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\\n  }\\n\\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\\n  /// @param amount The prize amount\\n  /// @return The size of the reserve portion of the prize\\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    if (address(reserve) == address(0)) {\\n      return 0;\\n    }\\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\\n    if (reserveRateMantissa == 0) {\\n      return 0;\\n    }\\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\\n  }\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external override\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    )\\n  {\\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n  }\\n\\n  /// @dev Calculates the early exit fee for the given amount\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return Exit fee\\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\\n    return _limitExitFee(\\n      amount,\\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external override\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    durationSeconds =_estimateCreditAccrualTime(\\n      _controlledToken,\\n      _principal,\\n      _interest\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function _estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    internal\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    // interest = credit rate * principal * time\\n    // => time = interest / (credit rate * principal)\\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\\n    if (accruedPerSecond == 0) {\\n      return 0;\\n    }\\n    return _interest.div(accruedPerSecond);\\n  }\\n\\n  /// @notice Burns a users credit.\\n  /// @param user The user whose credit should be burned\\n  /// @param credit The amount of credit to burn\\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\\n\\n    emit CreditBurned(user, controlledToken, credit);\\n  }\\n\\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\\n  /// @param user The user for whom to accrue credit\\n  /// @param controlledToken The controlled token whose balance we are checking\\n  /// @param controlledTokenBalance The balance to use for the user\\n  /// @param extra Additional credit to be added\\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\\n    _updateCreditBalance(\\n      user,\\n      controlledToken,\\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\\n    );\\n  }\\n\\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\\n    uint256 newBalance;\\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\\n    if (!creditBalance.initialized) {\\n      newBalance = 0;\\n    } else {\\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\\n    }\\n    return newBalance;\\n  }\\n\\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\\n\\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\\n      balance: newBalance.toUint128(),\\n      timestamp: _currentTime().toUint32(),\\n      initialized: true\\n    });\\n\\n    if (oldBalance < newBalance) {\\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\\n    } \\n    else if (newBalance < oldBalance) {\\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\\n    }\\n  }\\n\\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\\n  /// @param creditBalance The new credit balance to be checked\\n  /// @return The users new credit balance.  Will not exceed the credit limit.\\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\\n      controlledTokenBalance,\\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\\n    );\\n    if (creditBalance > creditLimit) {\\n      creditBalance = creditLimit;\\n    }\\n\\n    return creditBalance;\\n  }\\n\\n  /// @notice Calculates the accrued interest for a user\\n  /// @param user The user whose credit should be calculated.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\\n  /// @return The credit that has accrued since the last credit update.\\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\\n\\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\\n      return 0;\\n    }\\n\\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\\n  }\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\\n    return _tokenCreditBalances[controlledToken][user].balance;\\n  }\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external override\\n    onlyControlledToken(_controlledToken)\\n    onlyOwner\\n  {\\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\\n      creditLimitMantissa: _creditLimitMantissa,\\n      creditRateMantissa: _creditRateMantissa\\n    });\\n\\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\\n  }\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external override\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    )\\n  {\\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\\n  }\\n\\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The token they are withdrawing\\n  /// @param amount The amount of funds they are withdrawing\\n  /// @return earlyExitFee The additional exit fee that should be charged.\\n  /// @return creditBurned The amount of credit that will be burned\\n  function _calculateEarlyExitFeeLessBurnedCredit(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (\\n      uint256 earlyExitFee,\\n      uint256 creditBurned\\n    )\\n  {\\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\\n    require(controlledTokenBalance >= amount, \\\"PrizePool/insuff-funds\\\");\\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\\n    /*\\n    The credit is used *last*.  Always charge the fees up-front.\\n\\n    How to calculate:\\n\\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\\n\\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\\n    */\\n\\n    // Determine available usable credit based on withdraw amount\\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\\n\\n    uint256 availableCredit;\\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\\n    }\\n\\n    // Determine amount of credit to burn and amount of fees required\\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\\n    earlyExitFee = totalExitFee.sub(creditBurned);\\n  }\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\\n    _setLiquidityCap(_liquidityCap);\\n  }\\n\\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\\n    liquidityCap = _liquidityCap;\\n    emit LiquidityCapSet(_liquidityCap);\\n  }\\n\\n  /// @notice Adds a new controlled token\\n  /// @param _controlledToken The controlled token to add.\\n  /// @param index The index to add the controlledToken\\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\\n    require(_controlledToken.controller() == this, \\\"PrizePool/token-ctrlr-mismatch\\\");\\n    \\n    _tokens[index] = _controlledToken;\\n    emit ControlledTokenAdded(_controlledToken);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\\n    _setPrizeStrategy(_prizeStrategy);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\\n    require(address(_prizeStrategy) != address(0), \\\"PrizePool/prizeStrategy-not-zero\\\");\\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PrizePool/prizeStrategy-invalid\\\");\\n    prizeStrategy = _prizeStrategy;\\n\\n    emit PrizeStrategySet(address(_prizeStrategy));\\n  }\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\\n    return _tokens;\\n  }\\n\\n  /// @dev Gets the current time as represented by the current block\\n  /// @return The timestamp of the current block\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external override view returns (uint256) {\\n    return _tokenTotalSupply();\\n  }\\n\\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\\n  /// @param to The address to delegate to \\n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\\n    if (compLike.balanceOf(address(this)) > 0) {\\n      compLike.delegate(to);\\n    }\\n  }\\n  \\n  /// @notice Required for ERC721 safe token transfers from smart contracts.\\n  /// @param operator The address that acts on behalf of the owner\\n  /// @param from The current owner of the NFT\\n  /// @param tokenId The NFT to transfer\\n  /// @param data Additional data with no specified format, sent in call to `_to`.\\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function _tokenTotalSupply() internal view returns (uint256) {\\n    uint256 total = reserveTotalSupply;\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \\n    uint256 tokensLength = tokens.length;\\n    \\n    for(uint256 i = 0; i < tokensLength; i++){\\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\\n    }\\n\\n    return total;\\n  }\\n\\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\\n  }\\n\\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\\n    uint256 tokensLength = tokens.length;\\n\\n    for(uint256 i = 0; i < tokensLength; i++) {\\n      if(tokens[i] == controlledToken) return true;\\n    }\\n    return false;\\n  }\\n  \\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\\n    return _isControlled(controlledToken);\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function _token() internal virtual view returns (IERC20Upgradeable);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal virtual returns (uint256);\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal virtual;\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\\n\\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  modifier onlyControlledToken(address controlledToken) {\\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \\\"PrizePool/unknown-token\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure caller is the prize-strategy\\n  modifier onlyPrizeStrategy() {\\n    require(_msgSender() == address(prizeStrategy), \\\"PrizePool/only-prizeStrategy\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\\n  modifier canAddLiquidity(uint256 _amount) {\\n    require(_canAddLiquidity(_amount), \\\"PrizePool/exceeds-liquidity-cap\\\");\\n    _;\\n  }\\n\\n  modifier onlyReserve() {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    require(address(reserve) == msg.sender, \\\"PrizePool/only-reserve\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x386ebc1c80ab4424f14125e716dd12641ff933b475bf1082b7b1a6eee4a969c3\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListener.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./BeforeAwardListenerInterface.sol\\\";\\nimport \\\"../Constants.sol\\\";\\nimport \\\"./BeforeAwardListenerLibrary.sol\\\";\\n\\nabstract contract BeforeAwardListener is BeforeAwardListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == BeforeAwardListenerLibrary.ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER\\n    );\\n  }\\n}\",\"keccak256\":\"0x5da2a7332421d6136d793ef55410c2da63a7fb719e8522697f78ac4c50391505\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @notice The interface for the Periodic Prize Strategy before award listener.  This listener will be called immediately before the award is distributed.\\ninterface BeforeAwardListenerInterface is IERC165Upgradeable {\\n  /// @notice Called immediately before the award is distributed\\n  function beforePrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x96145efe8fc65aff97d11ffaf0905d53baf4b87c4a575a84d691804468f12083\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary BeforeAwardListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforePrizePoolAwarded(uint256,uint256)')) == 0x4cdf9c3e\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER = 0x4cdf9c3e;\\n}\",\"keccak256\":\"0xeac08a7b8e2e7d508a0af89c05c31c36e2b060674d05dfa9a5016cf2d12cf500\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategy.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\\\";\\nimport \\\"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../token/TokenListener.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TicketInterface.sol\\\";\\nimport \\\"../prize-pool/PrizePool.sol\\\";\\nimport \\\"../Constants.sol\\\";\\nimport \\\"./PeriodicPrizeStrategyListenerInterface.sol\\\";\\nimport \\\"./PeriodicPrizeStrategyListenerLibrary.sol\\\";\\nimport \\\"./BeforeAwardListener.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\nabstract contract PeriodicPrizeStrategy is Initializable,\\n                                           OwnableUpgradeable,\\n                                           TokenListener {\\n\\n  using SafeMathUpgradeable for uint256;\\n  using SafeMathUpgradeable for uint16;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using AddressUpgradeable for address;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  uint256 internal constant ETHEREUM_BLOCK_TIME_ESTIMATE_MANTISSA = 13.4 ether;\\n\\n  event PrizePoolOpened(\\n    address indexed operator,\\n    uint256 indexed prizePeriodStartedAt\\n  );\\n\\n  event RngRequestFailed();\\n\\n  event PrizePoolAwardStarted(\\n    address indexed operator,\\n    address indexed prizePool,\\n    uint32 indexed rngRequestId,\\n    uint32 rngLockBlock\\n  );\\n\\n  event PrizePoolAwardCancelled(\\n    address indexed operator,\\n    address indexed prizePool,\\n    uint32 indexed rngRequestId,\\n    uint32 rngLockBlock\\n  );\\n\\n  event PrizePoolAwarded(\\n    address indexed operator,\\n    uint256 randomNumber\\n  );\\n\\n  event RngServiceUpdated(\\n    RNGInterface indexed rngService\\n  );\\n\\n  event TokenListenerUpdated(\\n    TokenListenerInterface indexed tokenListener\\n  );\\n\\n  event RngRequestTimeoutSet(\\n    uint32 rngRequestTimeout\\n  );\\n\\n  event PrizePeriodSecondsUpdated(\\n    uint256 prizePeriodSeconds\\n  );\\n\\n  event BeforeAwardListenerSet(\\n    BeforeAwardListenerInterface indexed beforeAwardListener\\n  );\\n\\n  event PeriodicPrizeStrategyListenerSet(\\n    PeriodicPrizeStrategyListenerInterface indexed periodicPrizeStrategyListener\\n  );\\n\\n  event ExternalErc721AwardAdded(\\n    IERC721Upgradeable indexed externalErc721,\\n    uint256[] tokenIds\\n  );\\n\\n  event ExternalErc20AwardAdded(\\n    IERC20Upgradeable indexed externalErc20\\n  );\\n\\n  event ExternalErc721AwardRemoved(\\n    IERC721Upgradeable indexed externalErc721Award\\n  );\\n\\n  event ExternalErc20AwardRemoved(\\n    IERC20Upgradeable indexed externalErc20Award\\n  );\\n\\n  event Initialized(\\n    uint256 prizePeriodStart,\\n    uint256 prizePeriodSeconds,\\n    PrizePool indexed prizePool,\\n    TicketInterface ticket,\\n    IERC20Upgradeable sponsorship,\\n    RNGInterface rng,\\n    IERC20Upgradeable[] externalErc20Awards\\n  );\\n\\n  struct RngRequest {\\n    uint32 id;\\n    uint32 lockBlock;\\n    uint32 requestedAt;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  // Comptroller\\n  TokenListenerInterface public tokenListener;\\n\\n  // Contract Interfaces\\n  PrizePool public prizePool;\\n  TicketInterface public ticket;\\n  IERC20Upgradeable public sponsorship;\\n  RNGInterface public rng;\\n\\n  // Current RNG Request\\n  RngRequest internal rngRequest;\\n\\n  /// @notice RNG Request Timeout.  In fact, this is really a \\\"complete award\\\" timeout.\\n  /// If the rng completes the award can still be cancelled.\\n  uint32 public rngRequestTimeout;\\n\\n  // Prize period\\n  uint256 public prizePeriodSeconds;\\n  uint256 public prizePeriodStartedAt;\\n\\n  // External tokens awarded as part of prize\\n  MappedSinglyLinkedList.Mapping internal externalErc20s;\\n  MappedSinglyLinkedList.Mapping internal externalErc721s;\\n\\n  // External NFT token IDs to be awarded\\n  //   NFT Address => TokenIds\\n  mapping (IERC721Upgradeable => uint256[]) internal externalErc721TokenIds;\\n\\n  /// @notice A listener that is called before the prize is awarded\\n  BeforeAwardListenerInterface public beforeAwardListener;\\n\\n  /// @notice A listener that is called after the prize is awarded\\n  PeriodicPrizeStrategyListenerInterface public periodicPrizeStrategyListener;\\n\\n  /// @notice Initializes a new strategy\\n  /// @param _prizePeriodStart The starting timestamp of the prize period.\\n  /// @param _prizePeriodSeconds The duration of the prize period in seconds\\n  /// @param _prizePool The prize pool to award\\n  /// @param _ticket The ticket to use to draw winners\\n  /// @param _sponsorship The sponsorship token\\n  /// @param _rng The RNG service to use\\n  function initialize (\\n    uint256 _prizePeriodStart,\\n    uint256 _prizePeriodSeconds,\\n    PrizePool _prizePool,\\n    TicketInterface _ticket,\\n    IERC20Upgradeable _sponsorship,\\n    RNGInterface _rng,\\n    IERC20Upgradeable[] memory externalErc20Awards\\n  ) public initializer {\\n    require(address(_prizePool) != address(0), \\\"PeriodicPrizeStrategy/prize-pool-not-zero\\\");\\n    require(address(_ticket) != address(0), \\\"PeriodicPrizeStrategy/ticket-not-zero\\\");\\n    require(address(_sponsorship) != address(0), \\\"PeriodicPrizeStrategy/sponsorship-not-zero\\\");\\n    require(address(_rng) != address(0), \\\"PeriodicPrizeStrategy/rng-not-zero\\\");\\n    prizePool = _prizePool;\\n    ticket = _ticket;\\n    rng = _rng;\\n    sponsorship = _sponsorship;\\n    _setPrizePeriodSeconds(_prizePeriodSeconds);\\n\\n    __Ownable_init();\\n\\n    externalErc20s.initialize();\\n    for (uint256 i = 0; i < externalErc20Awards.length; i++) {\\n      _addExternalErc20Award(externalErc20Awards[i]);\\n    }\\n\\n    prizePeriodSeconds = _prizePeriodSeconds;\\n    prizePeriodStartedAt = _prizePeriodStart;\\n\\n    externalErc721s.initialize();\\n\\n    // 30 min timeout\\n    _setRngRequestTimeout(1800);\\n\\n    emit Initialized(\\n      _prizePeriodStart,\\n      _prizePeriodSeconds,\\n      _prizePool,\\n      _ticket,\\n      _sponsorship,\\n      _rng,\\n      externalErc20Awards\\n    );\\n    emit PrizePoolOpened(_msgSender(), prizePeriodStartedAt);\\n  }\\n\\n  function _distribute(uint256 randomNumber) internal virtual;\\n\\n  /// @notice Calculates and returns the currently accrued prize\\n  /// @return The current prize size\\n  function currentPrize() public view returns (uint256) {\\n    return prizePool.awardBalance();\\n  }\\n\\n  /// @notice Allows the owner to set the token listener\\n  /// @param _tokenListener A contract that implements the token listener interface.\\n  function setTokenListener(TokenListenerInterface _tokenListener) external onlyOwner requireAwardNotInProgress {\\n    require(address(0) == address(_tokenListener) || address(_tokenListener).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PeriodicPrizeStrategy/token-listener-invalid\\\");\\n\\n    tokenListener = _tokenListener;\\n\\n    emit TokenListenerUpdated(tokenListener);\\n  }\\n\\n  /// @notice Estimates the remaining blocks until the prize given a number of seconds per block\\n  /// @param secondsPerBlockMantissa The number of seconds per block to use for the calculation.  Should be a fixed point 18 number like Ether.\\n  /// @return The estimated number of blocks remaining until the prize can be awarded.\\n  function estimateRemainingBlocksToPrize(uint256 secondsPerBlockMantissa) public view returns (uint256) {\\n    return FixedPoint.divideUintByMantissa(\\n      _prizePeriodRemainingSeconds(),\\n      secondsPerBlockMantissa\\n    );\\n  }\\n\\n  /// @notice Returns the number of seconds remaining until the prize can be awarded.\\n  /// @return The number of seconds remaining until the prize can be awarded.\\n  function prizePeriodRemainingSeconds() external view returns (uint256) {\\n    return _prizePeriodRemainingSeconds();\\n  }\\n\\n  /// @notice Returns the number of seconds remaining until the prize can be awarded.\\n  /// @return The number of seconds remaining until the prize can be awarded.\\n  function _prizePeriodRemainingSeconds() internal view returns (uint256) {\\n    uint256 endAt = _prizePeriodEndAt();\\n    uint256 time = _currentTime();\\n    if (time > endAt) {\\n      return 0;\\n    }\\n    return endAt.sub(time);\\n  }\\n\\n  /// @notice Returns whether the prize period is over\\n  /// @return True if the prize period is over, false otherwise\\n  function isPrizePeriodOver() external view returns (bool) {\\n    return _isPrizePeriodOver();\\n  }\\n\\n  /// @notice Returns whether the prize period is over\\n  /// @return True if the prize period is over, false otherwise\\n  function _isPrizePeriodOver() internal view returns (bool) {\\n    return _currentTime() >= _prizePeriodEndAt();\\n  }\\n\\n  /// @notice Awards collateral as tickets to a user\\n  /// @param user Recipient of minted tokens\\n  /// @param amount Amount of minted tokens\\n  function _awardTickets(address user, uint256 amount) internal {\\n    prizePool.award(user, amount, address(ticket));\\n  }\\n  \\n  /// @notice Mints ticket or sponsorship tokens for user.\\n  /// @dev Mints ticket or sponsorship tokens by looking up the address in the prizePool.tokens mapping. \\n  /// @param user Recipient of minted tokens\\n  /// @param amount Amount of minted tokens\\n  /// @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\\n  function _awardToken(address user, uint256 amount, uint8 tokenIndex) internal {\\n    ControlledTokenInterface[] memory _controlledTokens = prizePool.tokens();\\n    require(tokenIndex <= _controlledTokens.length, \\\"PeriodicPrizeStrategy/award-invalid-token-index\\\");\\n    ControlledTokenInterface _token = _controlledTokens[tokenIndex];\\n    prizePool.award(user, amount, address(_token));\\n  }\\n\\n  /// @notice Awards all external tokens with non-zero balances to the given user.  The external tokens must be held by the PrizePool contract.\\n  /// @param winner The user to transfer the tokens to\\n  function _awardAllExternalTokens(address winner) internal {\\n    _awardExternalErc20s(winner);\\n    _awardExternalErc721s(winner);\\n  }\\n\\n  /// @notice Awards all external ERC20 tokens with non-zero balances to the given user.\\n  /// The external tokens must be held by the PrizePool contract.\\n  /// @param winner The user to transfer the tokens to\\n  function _awardExternalErc20s(address winner) internal {\\n    address currentToken = externalErc20s.start();\\n    while (currentToken != address(0) && currentToken != externalErc20s.end()) {\\n      uint256 balance = IERC20Upgradeable(currentToken).balanceOf(address(prizePool));\\n      if (balance > 0) {\\n        prizePool.awardExternalERC20(winner, currentToken, balance);\\n      }\\n      currentToken = externalErc20s.next(currentToken);\\n    }\\n  }\\n\\n  /// @notice Awards all external ERC721 tokens to the given user.\\n  /// The external tokens must be held by the PrizePool contract.\\n  /// @dev The list of ERC721s is reset after every award\\n  /// @param winner The user to transfer the tokens to\\n  function _awardExternalErc721s(address winner) internal {\\n    address currentToken = externalErc721s.start();\\n    while (currentToken != address(0) && currentToken != externalErc721s.end()) {\\n      uint256 balance = IERC721Upgradeable(currentToken).balanceOf(address(prizePool));\\n      if (balance > 0) {\\n        prizePool.awardExternalERC721(winner, currentToken, externalErc721TokenIds[IERC721Upgradeable(currentToken)]);\\n        _removeExternalErc721AwardTokens(IERC721Upgradeable(currentToken));\\n      }\\n      currentToken = externalErc721s.next(currentToken);\\n    }\\n    externalErc721s.clearAll();\\n  }\\n\\n  /// @notice Returns the timestamp at which the prize period ends\\n  /// @return The timestamp at which the prize period ends.\\n  function prizePeriodEndAt() external view returns (uint256) {\\n    // current prize started at is non-inclusive, so add one\\n    return _prizePeriodEndAt();\\n  }\\n\\n  /// @notice Returns the timestamp at which the prize period ends\\n  /// @return The timestamp at which the prize period ends.\\n  function _prizePeriodEndAt() internal view returns (uint256) {\\n    // current prize started at is non-inclusive, so add one\\n    return prizePeriodStartedAt.add(prizePeriodSeconds);\\n  }\\n\\n  /// @notice Called by the PrizePool for transfers of controlled tokens\\n  /// @dev Note that this is only for *transfers*, not mints or burns\\n  /// @param controlledToken The type of collateral that is being sent\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external override onlyPrizePool {\\n    require(from != to, \\\"PeriodicPrizeStrategy/transfer-to-self\\\");\\n\\n    if (controlledToken == address(ticket)) {\\n      _requireAwardNotInProgress();\\n    }\\n\\n    if (address(tokenListener) != address(0)) {\\n      tokenListener.beforeTokenTransfer(from, to, amount, controlledToken);\\n    }\\n  }\\n\\n  /// @notice Called by the PrizePool when minting controlled tokens\\n  /// @param controlledToken The type of collateral that is being minted\\n  function beforeTokenMint(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external\\n    override\\n    onlyPrizePool\\n  {\\n    if (controlledToken == address(ticket)) {\\n      _requireAwardNotInProgress();\\n    }\\n    if (address(tokenListener) != address(0)) {\\n      tokenListener.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n  }\\n\\n  /// @notice returns the current time.  Used for testing.\\n  /// @return The current time (block.timestamp)\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice returns the current time.  Used for testing.\\n  /// @return The current time (block.timestamp)\\n  function _currentBlock() internal virtual view returns (uint256) {\\n    return block.number;\\n  }\\n\\n  /// @notice Starts the award process by starting random number request.  The prize period must have ended.\\n  /// @dev The RNG-Request-Fee is expected to be held within this contract before calling this function\\n  function startAward() external requireCanStartAward {\\n    (address feeToken, uint256 requestFee) = rng.getRequestFee();\\n    if (feeToken != address(0) && requestFee > 0) {\\n      IERC20Upgradeable(feeToken).safeApprove(address(rng), requestFee);\\n    }\\n\\n    (uint32 requestId, uint32 lockBlock) = rng.requestRandomNumber();\\n    rngRequest.id = requestId;\\n    rngRequest.lockBlock = lockBlock;\\n    rngRequest.requestedAt = _currentTime().toUint32();\\n\\n    emit PrizePoolAwardStarted(_msgSender(), address(prizePool), requestId, lockBlock);\\n  }\\n\\n  /// @notice Can be called by anyone to unlock the tickets if the RNG has timed out.\\n  function cancelAward() public {\\n    require(isRngTimedOut(), \\\"PeriodicPrizeStrategy/rng-not-timedout\\\");\\n    uint32 requestId = rngRequest.id;\\n    uint32 lockBlock = rngRequest.lockBlock;\\n    delete rngRequest;\\n    emit RngRequestFailed();\\n    emit PrizePoolAwardCancelled(msg.sender, address(prizePool), requestId, lockBlock);\\n  }\\n\\n  /// @notice Completes the award process and awards the winners.  The random number must have been requested and is now available.\\n  function completeAward() external requireCanCompleteAward {\\n    uint256 randomNumber = rng.randomNumber(rngRequest.id);\\n    delete rngRequest;\\n\\n    if (address(beforeAwardListener) != address(0)) {\\n      beforeAwardListener.beforePrizePoolAwarded(randomNumber, prizePeriodStartedAt);\\n    }\\n    _distribute(randomNumber);\\n    if (address(periodicPrizeStrategyListener) != address(0)) {\\n      periodicPrizeStrategyListener.afterPrizePoolAwarded(randomNumber, prizePeriodStartedAt);\\n    }\\n\\n    // to avoid clock drift, we should calculate the start time based on the previous period start time.\\n    prizePeriodStartedAt = _calculateNextPrizePeriodStartTime(_currentTime());\\n\\n    emit PrizePoolAwarded(_msgSender(), randomNumber);\\n    emit PrizePoolOpened(_msgSender(), prizePeriodStartedAt);\\n  }\\n\\n  /// @notice Allows the owner to set a listener that is triggered immediately before the award is distributed\\n  /// @dev The listener must implement ERC165 and the BeforeAwardListenerInterface\\n  /// @param _beforeAwardListener The address of the listener contract\\n  function setBeforeAwardListener(BeforeAwardListenerInterface _beforeAwardListener) external onlyOwner requireAwardNotInProgress {\\n    require(\\n      address(0) == address(_beforeAwardListener) || address(_beforeAwardListener).supportsInterface(BeforeAwardListenerLibrary.ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER),\\n      \\\"PeriodicPrizeStrategy/beforeAwardListener-invalid\\\"\\n    );\\n\\n    beforeAwardListener = _beforeAwardListener;\\n\\n    emit BeforeAwardListenerSet(_beforeAwardListener);\\n  }\\n\\n  /// @notice Allows the owner to set a listener for prize strategy callbacks.\\n  /// @param _periodicPrizeStrategyListener The address of the listener contract\\n  function setPeriodicPrizeStrategyListener(PeriodicPrizeStrategyListenerInterface _periodicPrizeStrategyListener) external onlyOwner requireAwardNotInProgress {\\n    require(\\n      address(0) == address(_periodicPrizeStrategyListener) || address(_periodicPrizeStrategyListener).supportsInterface(PeriodicPrizeStrategyListenerLibrary.ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER),\\n      \\\"PeriodicPrizeStrategy/prizeStrategyListener-invalid\\\"\\n    );\\n\\n    periodicPrizeStrategyListener = _periodicPrizeStrategyListener;\\n\\n    emit PeriodicPrizeStrategyListenerSet(_periodicPrizeStrategyListener);\\n  }\\n\\n  function _calculateNextPrizePeriodStartTime(uint256 currentTime) internal view returns (uint256) {\\n    uint256 elapsedPeriods = currentTime.sub(prizePeriodStartedAt).div(prizePeriodSeconds);\\n    return prizePeriodStartedAt.add(elapsedPeriods.mul(prizePeriodSeconds));\\n  }\\n\\n  /// @notice Calculates when the next prize period will start\\n  /// @param currentTime The timestamp to use as the current time\\n  /// @return The timestamp at which the next prize period would start\\n  function calculateNextPrizePeriodStartTime(uint256 currentTime) external view returns (uint256) {\\n    return _calculateNextPrizePeriodStartTime(currentTime);\\n  }\\n\\n  /// @notice Returns whether an award process can be started\\n  /// @return True if an award can be started, false otherwise.\\n  function canStartAward() external view returns (bool) {\\n    return _isPrizePeriodOver() && !isRngRequested();\\n  }\\n\\n  /// @notice Returns whether an award process can be completed\\n  /// @return True if an award can be completed, false otherwise.\\n  function canCompleteAward() external view returns (bool) {\\n    return isRngRequested() && isRngCompleted();\\n  }\\n\\n  /// @notice Returns whether a random number has been requested\\n  /// @return True if a random number has been requested, false otherwise.\\n  function isRngRequested() public view returns (bool) {\\n    return rngRequest.id != 0;\\n  }\\n\\n  /// @notice Returns whether the random number request has completed.\\n  /// @return True if a random number request has completed, false otherwise.\\n  function isRngCompleted() public view returns (bool) {\\n    return rng.isRequestComplete(rngRequest.id);\\n  }\\n\\n  /// @notice Returns the block number that the current RNG request has been locked to\\n  /// @return The block number that the RNG request is locked to\\n  function getLastRngLockBlock() external view returns (uint32) {\\n    return rngRequest.lockBlock;\\n  }\\n\\n  /// @notice Returns the current RNG Request ID\\n  /// @return The current Request ID\\n  function getLastRngRequestId() external view returns (uint32) {\\n    return rngRequest.id;\\n  }\\n\\n  /// @notice Sets the RNG service that the Prize Strategy is connected to\\n  /// @param rngService The address of the new RNG service interface\\n  function setRngService(RNGInterface rngService) external onlyOwner requireAwardNotInProgress {\\n    require(!isRngRequested(), \\\"PeriodicPrizeStrategy/rng-in-flight\\\");\\n\\n    rng = rngService;\\n    emit RngServiceUpdated(rngService);\\n  }\\n\\n  /// @notice Allows the owner to set the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\\n  /// @param _rngRequestTimeout The RNG request timeout in seconds.\\n  function setRngRequestTimeout(uint32 _rngRequestTimeout) external onlyOwner requireAwardNotInProgress {\\n    _setRngRequestTimeout(_rngRequestTimeout);\\n  }\\n\\n  /// @notice Sets the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\\n  /// @param _rngRequestTimeout The RNG request timeout in seconds.\\n  function _setRngRequestTimeout(uint32 _rngRequestTimeout) internal {\\n    require(_rngRequestTimeout > 60, \\\"PeriodicPrizeStrategy/rng-timeout-gt-60-secs\\\");\\n    rngRequestTimeout = _rngRequestTimeout;\\n    emit RngRequestTimeoutSet(rngRequestTimeout);\\n  }\\n\\n  /// @notice Allows the owner to set the prize period in seconds.\\n  /// @param _prizePeriodSeconds The new prize period in seconds.  Must be greater than zero.\\n  function setPrizePeriodSeconds(uint256 _prizePeriodSeconds) external onlyOwner requireAwardNotInProgress {\\n    _setPrizePeriodSeconds(_prizePeriodSeconds);\\n  }\\n\\n  /// @notice Sets the prize period in seconds.\\n  /// @param _prizePeriodSeconds The new prize period in seconds.  Must be greater than zero.\\n  function _setPrizePeriodSeconds(uint256 _prizePeriodSeconds) internal {\\n    require(_prizePeriodSeconds > 0, \\\"PeriodicPrizeStrategy/prize-period-greater-than-zero\\\");\\n    prizePeriodSeconds = _prizePeriodSeconds;\\n\\n    emit PrizePeriodSecondsUpdated(prizePeriodSeconds);\\n  }\\n\\n  /// @notice Gets the current list of External ERC20 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC20 token addresses\\n  function getExternalErc20Awards() external view returns (address[] memory) {\\n    return externalErc20s.addressArray();\\n  }\\n\\n  /// @notice Adds an external ERC20 token type as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can assign external tokens,\\n  /// and they must be approved by the Prize-Pool\\n  /// @param _externalErc20 The address of an ERC20 token to be awarded\\n  function addExternalErc20Award(IERC20Upgradeable _externalErc20) external onlyOwnerOrListener requireAwardNotInProgress {\\n    _addExternalErc20Award(_externalErc20);\\n  }\\n\\n  function _addExternalErc20Award(IERC20Upgradeable _externalErc20) internal {\\n    require(address(_externalErc20).isContract(), \\\"PeriodicPrizeStrategy/erc20-null\\\");\\n    require(prizePool.canAwardExternal(address(_externalErc20)), \\\"PeriodicPrizeStrategy/cannot-award-external\\\");\\n    (bool succeeded, bytes memory returnValue) = address(_externalErc20).staticcall(abi.encodeWithSignature(\\\"totalSupply()\\\"));\\n    require(succeeded, \\\"PeriodicPrizeStrategy/erc20-invalid\\\");\\n    externalErc20s.addAddress(address(_externalErc20));\\n    emit ExternalErc20AwardAdded(_externalErc20);\\n  }\\n\\n  function addExternalErc20Awards(IERC20Upgradeable[] calldata _externalErc20s) external onlyOwnerOrListener requireAwardNotInProgress {\\n    for (uint256 i = 0; i < _externalErc20s.length; i++) {\\n      _addExternalErc20Award(_externalErc20s[i]);\\n    }\\n  }\\n\\n  /// @notice Removes an external ERC20 token type as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can remove external tokens\\n  /// @param _externalErc20 The address of an ERC20 token to be removed\\n  /// @param _prevExternalErc20 The address of the previous ERC20 token in the `externalErc20s` list.\\n  /// If the ERC20 is the first address, then the previous address is the SENTINEL address: 0x0000000000000000000000000000000000000001\\n  function removeExternalErc20Award(IERC20Upgradeable _externalErc20, IERC20Upgradeable _prevExternalErc20) external onlyOwner requireAwardNotInProgress {\\n    externalErc20s.removeAddress(address(_prevExternalErc20), address(_externalErc20));\\n    emit ExternalErc20AwardRemoved(_externalErc20);\\n  }\\n\\n  /// @notice Gets the current list of External ERC721 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC721 token addresses\\n  function getExternalErc721Awards() external view returns (address[] memory) {\\n    return externalErc721s.addressArray();\\n  }\\n\\n  /// @notice Gets the current list of External ERC721 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC721 token addresses\\n  function getExternalErc721AwardTokenIds(IERC721Upgradeable _externalErc721) external view returns (uint256[] memory) {\\n    return externalErc721TokenIds[_externalErc721];\\n  }\\n\\n  /// @notice Adds an external ERC721 token as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can assign external tokens,\\n  /// and they must be approved by the Prize-Pool\\n  /// NOTE: The NFT must already be owned by the Prize-Pool\\n  /// @param _externalErc721 The address of an ERC721 token to be awarded\\n  /// @param _tokenIds An array of token IDs of the ERC721 to be awarded\\n  function addExternalErc721Award(IERC721Upgradeable _externalErc721, uint256[] calldata _tokenIds) external onlyOwnerOrListener requireAwardNotInProgress {\\n    require(prizePool.canAwardExternal(address(_externalErc721)), \\\"PeriodicPrizeStrategy/cannot-award-external\\\");\\n    require(address(_externalErc721).supportsInterface(Constants.ERC165_INTERFACE_ID_ERC721), \\\"PeriodicPrizeStrategy/erc721-invalid\\\");\\n    \\n    if (!externalErc721s.contains(address(_externalErc721))) {\\n      externalErc721s.addAddress(address(_externalErc721));\\n    }\\n\\n    for (uint256 i = 0; i < _tokenIds.length; i++) {\\n      _addExternalErc721Award(_externalErc721, _tokenIds[i]);\\n    }\\n\\n    emit ExternalErc721AwardAdded(_externalErc721, _tokenIds);\\n  }\\n\\n  function _addExternalErc721Award(IERC721Upgradeable _externalErc721, uint256 _tokenId) internal {\\n    require(IERC721Upgradeable(_externalErc721).ownerOf(_tokenId) == address(prizePool), \\\"PeriodicPrizeStrategy/unavailable-token\\\");\\n    for (uint256 i = 0; i < externalErc721TokenIds[_externalErc721].length; i++) {\\n      if (externalErc721TokenIds[_externalErc721][i] == _tokenId) {\\n        revert(\\\"PeriodicPrizeStrategy/erc721-duplicate\\\");\\n      }\\n    }\\n    externalErc721TokenIds[_externalErc721].push(_tokenId);\\n  }\\n\\n  /// @notice Removes an external ERC721 token as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can remove external tokens\\n  /// @param _externalErc721 The address of an ERC721 token to be removed\\n  /// @param _prevExternalErc721 The address of the previous ERC721 token in the list.\\n  /// If no previous, then pass the SENTINEL address: 0x0000000000000000000000000000000000000001\\n  function removeExternalErc721Award(\\n    IERC721Upgradeable _externalErc721,\\n    IERC721Upgradeable _prevExternalErc721\\n  )\\n    external\\n    onlyOwner\\n    requireAwardNotInProgress\\n  {\\n    externalErc721s.removeAddress(address(_prevExternalErc721), address(_externalErc721));\\n    _removeExternalErc721AwardTokens(_externalErc721);\\n  }\\n\\n  function _removeExternalErc721AwardTokens(\\n    IERC721Upgradeable _externalErc721\\n  )\\n    internal\\n  {\\n    delete externalErc721TokenIds[_externalErc721];\\n    emit ExternalErc721AwardRemoved(_externalErc721);\\n  }\\n\\n  function _requireAwardNotInProgress() internal view {\\n    uint256 currentBlock = _currentBlock();\\n    require(rngRequest.lockBlock == 0 || currentBlock < rngRequest.lockBlock, \\\"PeriodicPrizeStrategy/rng-in-flight\\\");\\n  }\\n\\n  function isRngTimedOut() public view returns (bool) {\\n    if (rngRequest.requestedAt == 0) {\\n      return false;\\n    } else {\\n      return _currentTime() > uint256(rngRequestTimeout).add(rngRequest.requestedAt);\\n    }\\n  }\\n\\n  modifier onlyOwnerOrListener() {\\n    require(_msgSender() == owner() ||\\n            _msgSender() == address(periodicPrizeStrategyListener) ||\\n            _msgSender() == address(beforeAwardListener),\\n            \\\"PeriodicPrizeStrategy/only-owner-or-listener\\\");\\n    _;\\n  }\\n\\n  modifier requireAwardNotInProgress() {\\n    _requireAwardNotInProgress();\\n    _;\\n  }\\n\\n  modifier requireCanStartAward() {\\n    require(_isPrizePeriodOver(), \\\"PeriodicPrizeStrategy/prize-period-not-over\\\");\\n    require(!isRngRequested(), \\\"PeriodicPrizeStrategy/rng-already-requested\\\");\\n    _;\\n  }\\n\\n  modifier requireCanCompleteAward() {\\n    require(isRngRequested(), \\\"PeriodicPrizeStrategy/rng-not-requested\\\");\\n    require(isRngCompleted(), \\\"PeriodicPrizeStrategy/rng-not-complete\\\");\\n    _;\\n  }\\n\\n  modifier onlyPrizePool() {\\n    require(_msgSender() == address(prizePool), \\\"PeriodicPrizeStrategy/only-prize-pool\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0xd7bf198ab616ed4b3e9c29d20477887d5a1e000e137e447da20bcec73b7cf997\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ninterface PeriodicPrizeStrategyListenerInterface is IERC165Upgradeable {\\n  function afterPrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x229624266562f60200b4e40ebc95a35a8aad799c0ff95a42df243af98a44d198\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary PeriodicPrizeStrategyListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('afterPrizePoolAwarded(uint256,uint256)')) == 0x575072c6\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER = 0x575072c6;\\n}\\n\",\"keccak256\":\"0xed291b9a33e265535032557f0a5430a150701c9eb58b0138c120eb02bc13b514\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PrizeSplit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\n\\n/**\\n  * @title Abstract prize split contract for adding unique award distribution to static addresses. \\n  * @author Kames Geraghty (PoolTogether Inc)\\n*/\\nabstract contract PrizeSplit is OwnableUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  \\n  PrizeSplitConfig[] internal _prizeSplits;\\n\\n  /**\\n    * @notice The prize split configuration struct.\\n    * @dev The prize split configuration struct used to award prize splits during distribution.\\n    * @param target Address of recipient receiving the prize split distribution\\n    * @param percentage Percentage of prize split using a 0-1000 range for single decimal precision i.e. 125 = 12.5%\\n    * @param token Position of controlled token in prizePool.tokens (i.e. ticket or sponsorship)\\n  */\\n  struct PrizeSplitConfig {\\n      address target;\\n      uint16 percentage;\\n      uint8 token;\\n  }\\n\\n  /**\\n    * @notice Emitted when a PrizeSplitConfig config is added or updated.\\n    * @dev Emitted when aPrizeSplitConfig config is added or updated in setPrizeSplits or setPrizeSplit.\\n    * @param target Address of prize split recipient\\n    * @param percentage Percentage of prize split. Must be between 0 and 1000 for single decimal precision\\n    * @param token Index (0 or 1) of token in the prizePool.tokens mapping\\n    * @param index Index of prize split in the prizeSplts array\\n  */\\n  event PrizeSplitSet(address indexed target, uint16 percentage, uint8 token, uint256 index);\\n\\n  /**\\n    * @notice Emitted when a PrizeSplitConfig config is removed.\\n    * @dev Emitted when a PrizeSplitConfig config is removed from the _prizeSplits array.\\n    * @param target Index of a previously active prize split config\\n  */\\n  event PrizeSplitRemoved(uint256 indexed target);\\n\\n  /**\\n    * @notice Mints ticket or sponsorship tokens to prize split recipient.\\n    * @dev Mints ticket or sponsorship tokens to prize split recipient via the linked PrizePool contract.\\n    * @param target Recipient of minted tokens\\n    * @param amount Amount of minted tokens\\n    * @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\\n  */\\n  function _awardPrizeSplitAmount(address target, uint256 amount, uint8 tokenIndex) virtual internal;\\n\\n  /**\\n    * @notice Read all prize splits configs.\\n    * @dev Read all PrizeSplitConfig structs stored in _prizeSplits.\\n    * @return _prizeSplits Array of PrizeSplitConfig structs\\n  */\\n  function prizeSplits() external view returns (PrizeSplitConfig[] memory) {\\n    return _prizeSplits;\\n  }\\n\\n  /**\\n    * @notice Read prize split config from active PrizeSplits.\\n    * @dev Read PrizeSplitConfig struct from _prizeSplits array.\\n    * @param prizeSplitIndex Index position of PrizeSplitConfig\\n    * @return PrizeSplitConfig Single prize split config\\n  */\\n  function prizeSplit(uint256 prizeSplitIndex) external view returns (PrizeSplitConfig memory) {\\n    return _prizeSplits[prizeSplitIndex];\\n  }\\n\\n  /**\\n    * @notice Set and remove prize split(s) configs.\\n    * @dev Set and remove prize split configs by passing a new PrizeSplitConfig structs array. Will remove existing PrizeSplitConfig(s) if passed array length is less than existing _prizeSplits length.\\n    * @param newPrizeSplits Array of PrizeSplitConfig structs\\n  */\\n  function setPrizeSplits(PrizeSplitConfig[] calldata newPrizeSplits) external onlyOwner {\\n    uint256 newPrizeSplitsLength = newPrizeSplits.length;\\n\\n    // Add and/or update prize split configs using newPrizeSplits PrizeSplitConfig structs array.\\n    for (uint256 index = 0; index < newPrizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = newPrizeSplits[index];\\n      require(split.token <= 1, \\\"MultipleWinners/invalid-prizesplit-token\\\");\\n      require(split.target != address(0), \\\"MultipleWinners/invalid-prizesplit-target\\\");\\n      \\n      if (_prizeSplits.length <= index) {\\n        _prizeSplits.push(split);\\n      } else {\\n        PrizeSplitConfig memory currentSplit = _prizeSplits[index];\\n        if (split.target != currentSplit.target || split.percentage != currentSplit.percentage || split.token != currentSplit.token) {\\n          _prizeSplits[index] = split;\\n        } else {\\n          continue;\\n        }\\n      }\\n\\n      // Emit the added/updated prize split config.\\n      emit PrizeSplitSet(split.target, split.percentage, split.token, index);\\n    }\\n\\n    // Remove old prize splits configs. Match storage _prizesSplits.length with the passed newPrizeSplits.length\\n    while (_prizeSplits.length > newPrizeSplitsLength) {\\n      uint256 _index = _prizeSplits.length.sub(1);\\n      _prizeSplits.pop();\\n      emit PrizeSplitRemoved(_index);\\n    }\\n\\n    // Total prize split do not exceed 100%\\n    uint256 totalPercentage = _totalPrizeSplitPercentageAmount();\\n    require(totalPercentage <= 1000, \\\"MultipleWinners/invalid-prizesplit-percentage-total\\\");\\n  }\\n\\n  /**\\n    * @notice Updates a previously set prize split config.\\n    * @dev Updates a prize split config by passing a new PrizeSplitConfig struct and current index position. Limited to contract owner.\\n    * @param prizeStrategySplit PrizeSplitConfig config struct\\n    * @param prizeSplitIndex Index position of PrizeSplitConfig to update\\n  */\\n  function setPrizeSplit(PrizeSplitConfig memory prizeStrategySplit, uint8 prizeSplitIndex) external onlyOwner {\\n    require(prizeSplitIndex < _prizeSplits.length, \\\"MultipleWinners/nonexistent-prizesplit\\\");\\n    require(prizeStrategySplit.token <= 1, \\\"MultipleWinners/invalid-prizesplit-token\\\");\\n    require(prizeStrategySplit.target != address(0), \\\"MultipleWinners/invalid-prizesplit-target\\\");\\n    \\n    // Update the prize split config\\n    _prizeSplits[prizeSplitIndex] = prizeStrategySplit;\\n\\n    // Total prize split do not exceed 100%\\n    uint256 totalPercentage = _totalPrizeSplitPercentageAmount();\\n    require(totalPercentage <= 1000, \\\"MultipleWinners/invalid-prizesplit-percentage-total\\\");\\n\\n    // Emit updated prize split config\\n    emit PrizeSplitSet(prizeStrategySplit.target, prizeStrategySplit.percentage, prizeStrategySplit.token, prizeSplitIndex);\\n  }\\n\\n  /**\\n  * @notice Calculate single prize split distribution amount.\\n  * @dev Calculate single prize split distribution amount using the total prize amount and prize split percentage.\\n  * @param amount Total prize award distribution amount\\n  * @param percentage Percentage with single decimal precision using 0-1000 ranges\\n  */\\n  function _getPrizeSplitAmount(uint256 amount, uint16 percentage) internal pure returns (uint256) {\\n    return (amount * percentage).div(1000);\\n  }\\n\\n  /**\\n  * @notice Calculates total prize split percentage amount.\\n  * @dev Calculates total PrizeSplitConfig percentage(s) amount. Used to check the total does not exceed 100% of award distribution.\\n  * @return Total prize split(s) percentage amount\\n  */\\n  function _totalPrizeSplitPercentageAmount() internal view returns (uint256) {\\n    uint256 _tempTotalPercentage;\\n    uint256 prizeSplitsLength = _prizeSplits.length;\\n    for (uint8 index = 0; index < prizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = _prizeSplits[index];\\n      _tempTotalPercentage = _tempTotalPercentage.add(split.percentage);\\n    }\\n    return _tempTotalPercentage;\\n  }\\n\\n  /**\\n  * @notice Distributes prize split(s).\\n  * @dev Distributes prize split(s) by awarding ticket or sponsorship tokens.\\n  * @param prize Starting prize award amount\\n  * @return Total prize award distribution amount exlcuding the awarded prize split(s)\\n  */\\n  function _distributePrizeSplits(uint256 prize) internal returns (uint256) {\\n    // Store temporary total prize amount for multiple calculations using initial prize amount.\\n    uint256 _prizeTemp = prize;\\n    uint256 prizeSplitsLength = _prizeSplits.length;\\n    for (uint256 index = 0; index < prizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = _prizeSplits[index];\\n      uint256 _splitAmount = _getPrizeSplitAmount(_prizeTemp, split.percentage);\\n\\n      // Award the prize split distribution amount.\\n      _awardPrizeSplitAmount(split.target, _splitAmount, split.token);\\n\\n      // Update the remaining prize amount after distributing the prize split percentage.\\n      prize = prize.sub(_splitAmount);\\n    }\\n\\n    return prize;\\n  }\\n\\n}\",\"keccak256\":\"0xc736c25922cf9065c73a06108d4d05c18af9a9e393c5280ba5d4cdb1863f3dbd\",\"license\":\"MIT\"},\"contracts/prize-strategy/multiple-winners/MultipleWinners.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"../PrizeSplit.sol\\\";\\nimport \\\"../PeriodicPrizeStrategy.sol\\\";\\n\\ncontract MultipleWinners is PeriodicPrizeStrategy, PrizeSplit {\\n\\n  // Maximum number number of winners per award distribution period\\n  uint256 internal __numberOfWinners;\\n  \\n  // Toggle for distributing external ERC 20 awards to all winners\\n  bool public splitExternalErc20Awards;\\n\\n  // Mapping of addresses isBlocked status. Can prevent an address from selected during award distribution\\n  mapping(address => bool) public isBlocklisted;\\n\\n  // Carry over the awarded prize for the next drawing when selected winners is less than __numberOfWinners\\n  bool public carryOverBlocklist;\\n\\n  // Limit ticket.draw() retry attempts when a blocked address is selected in _distribute.\\n  uint256 public blocklistRetryCount;\\n\\n  /**\\n    * @notice Emitted when splitExternalErc20Awards is toggled.\\n    * @dev Emitted when splitExternalErc20Awards is toggled between awarding external ERC20 to main or all winners.\\n  */\\n  event SplitExternalErc20AwardsSet(bool splitExternalErc20Awards);\\n\\n  /**\\n    * @notice Emitted when numberOfWinners is set.\\n    * @dev Emitted when numberOfWinners is set, which limits the maximum number of potentially selected winners.\\n    * @param numberOfWinners Maximum potentially selected winners\\n  */\\n  event NumberOfWinnersSet(uint256 numberOfWinners);\\n\\n  /**\\n    * @notice Emitted when carryOverBlocklist is toggled.\\n    * @dev Emitted when carryOverBlocklist is toggled for distribution of the primary and secondary prizes.\\n    * @param carry Awarded prize carry over status\\n  */\\n  event BlocklistCarrySet(bool carry);\\n\\n  /**\\n    * @notice Emitted when a user is blocked/unblocked from receiving a prize award.\\n    * @dev Emitted when a contract owner blocks/unblocks user from award selection in _distribute.\\n    * @param user Address of user to block or unblock\\n    * @param isBlocked User blocked status\\n  */\\n  event BlocklistSet(address indexed user, bool isBlocked);\\n\\n  /**\\n    * @notice Emitted when a new draw retry limit is set.\\n    * @dev Emitted when a new draw retry limit is set. Retry limit is set to limit gas spendings if a blocked user continues to be drawn.\\n    * @param count Number of winner selection retry attempts \\n  */\\n  event BlocklistRetryCountSet(uint256 count);\\n\\n  /**\\n    * @notice Emitted when the winner selection retry limit is reached during award distribution.\\n    * @dev Emitted when the maximum number of users has not been selected after the blocklistRetryCount is reached.\\n    * @param numberOfWinners Total number of winners selected before the blocklistRetryCount is reached.\\n  */\\n  event RetryMaxLimitReached(uint256 numberOfWinners);\\n\\n  /**\\n    * @notice Emitted when no winner can be selected during the prize distribution. \\n    * @dev Emitted when no winner can be selected in _distribute due to ticket.totalSupply() equaling zero.\\n  */\\n  event NoWinners();\\n\\n  function initializeMultipleWinners (\\n    uint256 _prizePeriodStart,\\n    uint256 _prizePeriodSeconds,\\n    PrizePool _prizePool,\\n    TicketInterface _ticket,\\n    IERC20Upgradeable _sponsorship,\\n    RNGInterface _rng,\\n    uint256 _numberOfWinners\\n  ) public initializer {\\n    IERC20Upgradeable[] memory _externalErc20Awards;\\n\\n    PeriodicPrizeStrategy.initialize(\\n      _prizePeriodStart,\\n      _prizePeriodSeconds,\\n      _prizePool,\\n      _ticket,\\n      _sponsorship,\\n      _rng,\\n      _externalErc20Awards\\n    );\\n\\n    _setNumberOfWinners(_numberOfWinners);\\n  }\\n\\n  /**\\n    * @notice Block/unblock a user from winning during prize distribution.\\n    * @dev Block/unblock a user from winning award in prize distribution by updating the isBlocklisted mapping.\\n    * @param _user Address of blocked user\\n    * @param _isBlocked Blocked Status (true or false) of user\\n  */\\n  function setBlocklisted(address _user, bool _isBlocked) external onlyOwner requireAwardNotInProgress returns (bool) {\\n    isBlocklisted[_user] = _isBlocked;\\n\\n    emit BlocklistSet(_user, _isBlocked);\\n\\n    return true;\\n  }\\n\\n  /**\\n    * @notice Toggle if an unawarded prize amount should be kept for the next draw or evenly distrubted to selected winners. \\n    * @dev Toggles if the main prize (prizePool.captureAwardBalance) and secondary prizes (LootBox) should be kept for the next draw or evenly distrubted if maximum number of winners is not selected. \\n    * @param _carry Award carry over status (true or false)\\n  */\\n  function setCarryBlocklist(bool _carry) external onlyOwner requireAwardNotInProgress returns (bool) {\\n    carryOverBlocklist = _carry;\\n\\n    emit BlocklistCarrySet(_carry);\\n\\n    return true;\\n  }\\n\\n  /**\\n    * @notice Sets the number of attempts for winner selection if a blocked address is chosen.\\n    * @dev Limits winner selection (ticket.draw) retries to avoid to gas limit reached errors. Increases the probability of not reaching the maximum number of winners if to low.\\n    * @param _count Number of retry attempts\\n  */\\n  function setBlocklistRetryCount(uint256 _count) external onlyOwner requireAwardNotInProgress returns (bool) {\\n    blocklistRetryCount = _count;\\n\\n    emit BlocklistRetryCountSet(_count);\\n\\n    return true;\\n  }\\n  \\n  /**\\n    * @notice Toggle external ERC20 awards for all prize winners.\\n    * @dev Toggle external ERC20 awards for all prize winners. If unset will distribute external ERC20 awards to main winner.\\n    * @param _splitExternalErc20Awards Toggle splitting external ERC20 awards.\\n  */\\n  function setSplitExternalErc20Awards(bool _splitExternalErc20Awards) external onlyOwner requireAwardNotInProgress {\\n    splitExternalErc20Awards = _splitExternalErc20Awards;\\n\\n    emit SplitExternalErc20AwardsSet(splitExternalErc20Awards);\\n  }\\n\\n  /**\\n    * @notice Sets maximum number of winners.\\n    * @dev Sets maximum number of winners per award distribution period.\\n    * @param count Number of winners.\\n  */\\n  function setNumberOfWinners(uint256 count) external onlyOwner requireAwardNotInProgress {\\n    _setNumberOfWinners(count);\\n  }\\n\\n   /**\\n    * @dev Set the maximum number of winners. Must be greater than 0.\\n    * @param count Number of winners.\\n  */\\n  function _setNumberOfWinners(uint256 count) internal {\\n    require(count > 0, \\\"MultipleWinners/winners-gte-one\\\");\\n\\n    __numberOfWinners = count;\\n    emit NumberOfWinnersSet(count);\\n  }\\n\\n  /**\\n    * @notice Maximum number of winners per award distribution period\\n    * @dev Read maximum number of winners per award distribution period from internal __numberOfWinners variable.\\n    * @return __numberOfWinners The total number of winners per prize award.\\n  */\\n  function numberOfWinners() external view returns (uint256) {\\n    return __numberOfWinners;\\n  }\\n\\n  /**\\n    * @notice Award ticket or sponsorship tokens to prize split recipient.\\n    * @dev Award ticket or sponsorship tokens to prize split recipient via the linked PrizePool contract.\\n    * @param target Recipient of minted tokens\\n    * @param amount Amount of minted tokens\\n    * @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\\n  */\\n  function _awardPrizeSplitAmount(address target, uint256 amount, uint8 tokenIndex) override internal {\\n    _awardToken(target, amount, tokenIndex);\\n  }\\n\\n  /**\\n    * @notice Distributes captured award balance to winners\\n    * @dev Distributes the captured award balance to the main winner and secondary winners if __numberOfWinners greater than 1.\\n    * @param randomNumber Random number seed used to select winners\\n  */\\n  function _distribute(uint256 randomNumber) internal override {\\n    uint256 prize = prizePool.captureAwardBalance();\\n    \\n    // distributes prize to prize splits and returns remaining award.\\n    prize = _distributePrizeSplits(prize);\\n\\n    if (IERC20Upgradeable(address(ticket)).totalSupply() == 0) {\\n      emit NoWinners();\\n      return;\\n    }\\n\\n    bool _carryOverBlocklistPrizes = carryOverBlocklist;\\n\\n    // main winner is simply the first that is drawn\\n    uint256 numberOfWinners = __numberOfWinners;\\n    address[] memory winners = new address[](numberOfWinners);\\n    uint256 nextRandom = randomNumber;\\n    uint256 winnerCount = 0;\\n    uint256 retries = 0;\\n    uint256 _retryCount = blocklistRetryCount;\\n    while (winnerCount < numberOfWinners) {\\n      address winner = ticket.draw(nextRandom);\\n\\n      if (!isBlocklisted[winner]) {\\n        winners[winnerCount++] = winner;\\n      } else if (++retries >= _retryCount) {\\n        emit RetryMaxLimitReached(winnerCount);\\n        if(winnerCount == 0) {\\n          emit NoWinners();\\n        }\\n        break;\\n      }\\n\\n      // add some arbitrary numbers to the previous random number to ensure no matches with the UniformRandomNumber lib\\n      bytes32 nextRandomHash = keccak256(abi.encodePacked(nextRandom + 499 + winnerCount*521));\\n      nextRandom = uint256(nextRandomHash);\\n    }\\n\\n    // main winner gets all external ERC721 tokens\\n    _awardExternalErc721s(winners[0]);\\n\\n    // yield prize is split up among all winners\\n    uint256 prizeShare = _carryOverBlocklistPrizes ? prize.div(numberOfWinners) : prize.div(winnerCount);\\n    if (prizeShare > 0) {\\n      for (uint i = 0; i < winnerCount; i++) {\\n        _awardTickets(winners[i], prizeShare);\\n      }\\n    }\\n\\n    if (splitExternalErc20Awards) {\\n      address currentToken = externalErc20s.start();\\n      while (currentToken != address(0) && currentToken != externalErc20s.end()) {\\n        uint256 balance = IERC20Upgradeable(currentToken).balanceOf(address(prizePool));\\n        uint256 split = _carryOverBlocklistPrizes ? balance.div(numberOfWinners) : balance.div(winnerCount);\\n        if (split > 0) {\\n          for (uint256 i = 0; i < winnerCount; i++) {\\n            prizePool.awardExternalERC20(winners[i], currentToken, split);\\n          }\\n        }\\n        currentToken = externalErc20s.next(currentToken);\\n      }\\n    } else {\\n      _awardExternalErc20s(winners[0]);\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0x26fbb59d9251cd6d66a423abaea29d5ea182e539365767ebfed726fe6248a29a\",\"license\":\"MIT\"},\"contracts/prize-strategy/multiple-winners/MultipleWinnersProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./MultipleWinners.sol\\\";\\nimport \\\"../../external/openzeppelin/ProxyFactory.sol\\\";\\n\\n/// @title Creates a minimal proxy to the MultipleWinners prize strategy.  Very cheap to deploy.\\ncontract MultipleWinnersProxyFactory is ProxyFactory {\\n\\n  MultipleWinners public instance;\\n\\n  constructor () public {\\n    instance = new MultipleWinners();\\n  }\\n\\n  function create() external returns (MultipleWinners) {\\n    return MultipleWinners(deployMinimal(address(instance), \\\"\\\"));\\n  }\\n\\n}\",\"keccak256\":\"0x005d4b6c74b67d7dc49a928a3910c132295d39258dddaa991c79437e95a600ae\",\"license\":\"GPL-3.0\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./ControlledToken.sol\\\";\\nimport \\\"../external/openzeppelin/ProxyFactory.sol\\\";\\n\\n/// @title Controlled ERC20 Token Factory\\n/// @notice Minimal proxy pattern for creating new Controlled ERC20 Tokens\\ncontract ControlledTokenProxyFactory is ProxyFactory {\\n\\n  /// @notice Contract template for deploying proxied tokens\\n  ControlledToken public instance;\\n\\n  /// @notice Initializes the Factory with an instance of the Controlled ERC20 Token\\n  constructor () public {\\n    instance = new ControlledToken();\\n  }\\n\\n  /// @notice Creates a new Controlled ERC20 Token as a proxy of the template instance\\n  /// @return A reference to the new proxied Controlled ERC20 Token\\n  function create() external returns (ControlledToken) {\\n    return ControlledToken(deployMinimal(address(instance), \\\"\\\"));\\n  }\\n}\\n\",\"keccak256\":\"0x3872184d356e0bc4aadf034dbc8dccb454c00b7efdc8f4d0a96621702a9d5135\",\"license\":\"GPL-3.0\"},\"contracts/token/Ticket.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"sortition-sum-tree-factory/contracts/SortitionSumTreeFactory.sol\\\";\\nimport \\\"@pooltogether/uniform-random-number/contracts/UniformRandomNumber.sol\\\";\\n\\nimport \\\"./ControlledToken.sol\\\";\\nimport \\\"./TicketInterface.sol\\\";\\n\\ncontract Ticket is ControlledToken, TicketInterface {\\n  using SortitionSumTreeFactory for SortitionSumTreeFactory.SortitionSumTrees;\\n\\n  bytes32 constant private TREE_KEY = keccak256(\\\"PoolTogether/Ticket\\\");\\n  uint256 constant private MAX_TREE_LEAVES = 5;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  // Ticket-weighted odds\\n  SortitionSumTreeFactory.SortitionSumTrees internal sortitionSumTrees;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    override\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"Ticket/controller-not-zero\\\");\\n    ControlledToken.initialize(_name, _symbol, _decimals, _controller);\\n    sortitionSumTrees.createTree(TREE_KEY, MAX_TREE_LEAVES);\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Returns the user's chance of winning.\\n  function chanceOf(address user) external view returns (uint256) {\\n    return sortitionSumTrees.stakeOf(TREE_KEY, bytes32(uint256(user)));\\n  }\\n\\n  /// @notice Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\\n  /// @param randomNumber The random number to use to select a user.\\n  /// @return The winner\\n  function draw(uint256 randomNumber) external view override returns (address) {\\n    uint256 bound = totalSupply();\\n    address selected;\\n    if (bound == 0) {\\n      selected = address(0);\\n    } else {\\n      uint256 token = UniformRandomNumber.uniform(randomNumber, bound);\\n      selected = address(uint256(sortitionSumTrees.draw(TREE_KEY, token)));\\n    }\\n    return selected;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    super._beforeTokenTransfer(from, to, amount);\\n\\n    // optimize: ignore transfers to self\\n    if (from == to) {\\n      return;\\n    }\\n\\n    if (from != address(0)) {\\n      uint256 fromBalance = balanceOf(from).sub(amount);\\n      sortitionSumTrees.set(TREE_KEY, fromBalance, bytes32(uint256(from)));\\n    }\\n\\n    if (to != address(0)) {\\n      uint256 toBalance = balanceOf(to).add(amount);\\n      sortitionSumTrees.set(TREE_KEY, toBalance, bytes32(uint256(to)));\\n    }\\n  }\\n\\n}\",\"keccak256\":\"0xf659dcfda626c713b7dd64525476d282e141163977edd881b647e83f505c4044\",\"license\":\"GPL-3.0\"},\"contracts/token/TicketInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface TicketInterface {\\n  /// @notice Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\\n  /// @param randomNumber The random number to use to select a user.\\n  /// @return The winner\\n  function draw(uint256 randomNumber) external view returns (address);\\n}\",\"keccak256\":\"0x5201a9a22748781592abd2003801289224d4899292195b7de937cd5748be87dd\",\"license\":\"GPL-3.0\"},\"contracts/token/TicketProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\\\";\\n\\nimport \\\"./Ticket.sol\\\";\\nimport \\\"../external/openzeppelin/ProxyFactory.sol\\\";\\n\\n/// @title Controlled ERC20 Token Factory\\n/// @notice Minimal proxy pattern for creating new Controlled ERC20 Tokens\\ncontract TicketProxyFactory is ProxyFactory {\\n\\n  /// @notice Contract template for deploying proxied tokens\\n  Ticket public instance;\\n\\n  /// @notice Initializes the Factory with an instance of the Controlled ERC20 Token\\n  constructor () public {\\n    instance = new Ticket();\\n  }\\n\\n  /// @notice Creates a new Controlled ERC20 Token as a proxy of the template instance\\n  /// @return A reference to the new proxied Controlled ERC20 Token\\n  function create() external returns (Ticket) {\\n    return Ticket(deployMinimal(address(instance), \\\"\\\"));\\n  }\\n}\\n\",\"keccak256\":\"0xb68f1cd27e8caaab3f69d6ccd14e70ff2d7c3685c9c45733f62690087833410e\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListener.sol\":{\"content\":\"pragma solidity ^0.6.4;\\n\\nimport \\\"./TokenListenerInterface.sol\\\";\\nimport \\\"./TokenListenerLibrary.sol\\\";\\nimport \\\"../Constants.sol\\\";\\n\\nabstract contract TokenListener is TokenListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER\\n    );\\n  }\\n}\\n\",\"keccak256\":\"0xb0e98d10b004602e1d4f4369a70e6382002dc0c0c5713698eb6a92943aef2265\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"},\"sortition-sum-tree-factory/contracts/SortitionSumTreeFactory.sol\":{\"content\":\"/**\\n *  @reviewers: [@clesaege, @unknownunknown1, @ferittuncer]\\n *  @auditors: []\\n *  @bounties: [<14 days 10 ETH max payout>]\\n *  @deployments: []\\n */\\n\\npragma solidity ^0.6.0;\\n\\n/**\\n *  @title SortitionSumTreeFactory\\n *  @author Enrique Piqueras - <epiquerass@gmail.com>\\n *  @dev A factory of trees that keep track of staked values for sortition.\\n */\\nlibrary SortitionSumTreeFactory {\\n    /* Structs */\\n\\n    struct SortitionSumTree {\\n        uint K; // The maximum number of childs per node.\\n        // We use this to keep track of vacant positions in the tree after removing a leaf. This is for keeping the tree as balanced as possible without spending gas on moving nodes around.\\n        uint[] stack;\\n        uint[] nodes;\\n        // Two-way mapping of IDs to node indexes. Note that node index 0 is reserved for the root node, and means the ID does not have a node.\\n        mapping(bytes32 => uint) IDsToNodeIndexes;\\n        mapping(uint => bytes32) nodeIndexesToIDs;\\n    }\\n\\n    /* Storage */\\n\\n    struct SortitionSumTrees {\\n        mapping(bytes32 => SortitionSumTree) sortitionSumTrees;\\n    }\\n\\n    /* internal */\\n\\n    /**\\n     *  @dev Create a sortition sum tree at the specified key.\\n     *  @param _key The key of the new tree.\\n     *  @param _K The number of children each node in the tree should have.\\n     */\\n    function createTree(SortitionSumTrees storage self, bytes32 _key, uint _K) internal {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        require(tree.K == 0, \\\"Tree already exists.\\\");\\n        require(_K > 1, \\\"K must be greater than one.\\\");\\n        tree.K = _K;\\n        tree.stack = new uint[](0);\\n        tree.nodes = new uint[](0);\\n        tree.nodes.push(0);\\n    }\\n\\n    /**\\n     *  @dev Set a value of a tree.\\n     *  @param _key The key of the tree.\\n     *  @param _value The new value.\\n     *  @param _ID The ID of the value.\\n     *  `O(log_k(n))` where\\n     *  `k` is the maximum number of childs per node in the tree,\\n     *   and `n` is the maximum number of nodes ever appended.\\n     */\\n    function set(SortitionSumTrees storage self, bytes32 _key, uint _value, bytes32 _ID) internal {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        uint treeIndex = tree.IDsToNodeIndexes[_ID];\\n\\n        if (treeIndex == 0) { // No existing node.\\n            if (_value != 0) { // Non zero value.\\n                // Append.\\n                // Add node.\\n                if (tree.stack.length == 0) { // No vacant spots.\\n                    // Get the index and append the value.\\n                    treeIndex = tree.nodes.length;\\n                    tree.nodes.push(_value);\\n\\n                    // Potentially append a new node and make the parent a sum node.\\n                    if (treeIndex != 1 && (treeIndex - 1) % tree.K == 0) { // Is first child.\\n                        uint parentIndex = treeIndex / tree.K;\\n                        bytes32 parentID = tree.nodeIndexesToIDs[parentIndex];\\n                        uint newIndex = treeIndex + 1;\\n                        tree.nodes.push(tree.nodes[parentIndex]);\\n                        delete tree.nodeIndexesToIDs[parentIndex];\\n                        tree.IDsToNodeIndexes[parentID] = newIndex;\\n                        tree.nodeIndexesToIDs[newIndex] = parentID;\\n                    }\\n                } else { // Some vacant spot.\\n                    // Pop the stack and append the value.\\n                    treeIndex = tree.stack[tree.stack.length - 1];\\n                    tree.stack.pop();\\n                    tree.nodes[treeIndex] = _value;\\n                }\\n\\n                // Add label.\\n                tree.IDsToNodeIndexes[_ID] = treeIndex;\\n                tree.nodeIndexesToIDs[treeIndex] = _ID;\\n\\n                updateParents(self, _key, treeIndex, true, _value);\\n            }\\n        } else { // Existing node.\\n            if (_value == 0) { // Zero value.\\n                // Remove.\\n                // Remember value and set to 0.\\n                uint value = tree.nodes[treeIndex];\\n                tree.nodes[treeIndex] = 0;\\n\\n                // Push to stack.\\n                tree.stack.push(treeIndex);\\n\\n                // Clear label.\\n                delete tree.IDsToNodeIndexes[_ID];\\n                delete tree.nodeIndexesToIDs[treeIndex];\\n\\n                updateParents(self, _key, treeIndex, false, value);\\n            } else if (_value != tree.nodes[treeIndex]) { // New, non zero value.\\n                // Set.\\n                bool plusOrMinus = tree.nodes[treeIndex] <= _value;\\n                uint plusOrMinusValue = plusOrMinus ? _value - tree.nodes[treeIndex] : tree.nodes[treeIndex] - _value;\\n                tree.nodes[treeIndex] = _value;\\n\\n                updateParents(self, _key, treeIndex, plusOrMinus, plusOrMinusValue);\\n            }\\n        }\\n    }\\n\\n    /* internal Views */\\n\\n    /**\\n     *  @dev Query the leaves of a tree. Note that if `startIndex == 0`, the tree is empty and the root node will be returned.\\n     *  @param _key The key of the tree to get the leaves from.\\n     *  @param _cursor The pagination cursor.\\n     *  @param _count The number of items to return.\\n     *  @return startIndex The index at which leaves start\\n     *  @return values The values of the returned leaves\\n     *  @return hasMore Whether there are more for pagination.\\n     *  `O(n)` where\\n     *  `n` is the maximum number of nodes ever appended.\\n     */\\n    function queryLeafs(\\n        SortitionSumTrees storage self,\\n        bytes32 _key,\\n        uint _cursor,\\n        uint _count\\n    ) internal view returns(uint startIndex, uint[] memory values, bool hasMore) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n\\n        // Find the start index.\\n        for (uint i = 0; i < tree.nodes.length; i++) {\\n            if ((tree.K * i) + 1 >= tree.nodes.length) {\\n                startIndex = i;\\n                break;\\n            }\\n        }\\n\\n        // Get the values.\\n        uint loopStartIndex = startIndex + _cursor;\\n        values = new uint[](loopStartIndex + _count > tree.nodes.length ? tree.nodes.length - loopStartIndex : _count);\\n        uint valuesIndex = 0;\\n        for (uint j = loopStartIndex; j < tree.nodes.length; j++) {\\n            if (valuesIndex < _count) {\\n                values[valuesIndex] = tree.nodes[j];\\n                valuesIndex++;\\n            } else {\\n                hasMore = true;\\n                break;\\n            }\\n        }\\n    }\\n\\n    /**\\n     *  @dev Draw an ID from a tree using a number. Note that this function reverts if the sum of all values in the tree is 0.\\n     *  @param _key The key of the tree.\\n     *  @param _drawnNumber The drawn number.\\n     *  @return ID The drawn ID.\\n     *  `O(k * log_k(n))` where\\n     *  `k` is the maximum number of childs per node in the tree,\\n     *   and `n` is the maximum number of nodes ever appended.\\n     */\\n    function draw(SortitionSumTrees storage self, bytes32 _key, uint _drawnNumber) internal view returns(bytes32 ID) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        uint treeIndex = 0;\\n        uint currentDrawnNumber = _drawnNumber % tree.nodes[0];\\n\\n        while ((tree.K * treeIndex) + 1 < tree.nodes.length)  // While it still has children.\\n            for (uint i = 1; i <= tree.K; i++) { // Loop over children.\\n                uint nodeIndex = (tree.K * treeIndex) + i;\\n                uint nodeValue = tree.nodes[nodeIndex];\\n\\n                if (currentDrawnNumber >= nodeValue) currentDrawnNumber -= nodeValue; // Go to the next child.\\n                else { // Pick this child.\\n                    treeIndex = nodeIndex;\\n                    break;\\n                }\\n            }\\n        \\n        ID = tree.nodeIndexesToIDs[treeIndex];\\n    }\\n\\n    /** @dev Gets a specified ID's associated value.\\n     *  @param _key The key of the tree.\\n     *  @param _ID The ID of the value.\\n     *  @return value The associated value.\\n     */\\n    function stakeOf(SortitionSumTrees storage self, bytes32 _key, bytes32 _ID) internal view returns(uint value) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        uint treeIndex = tree.IDsToNodeIndexes[_ID];\\n\\n        if (treeIndex == 0) value = 0;\\n        else value = tree.nodes[treeIndex];\\n    }\\n\\n    function total(SortitionSumTrees storage self, bytes32 _key) internal view returns (uint) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        if (tree.nodes.length == 0) {\\n            return 0;\\n        } else {\\n            return tree.nodes[0];\\n        }\\n    }\\n\\n    /* Private */\\n\\n    /**\\n     *  @dev Update all the parents of a node.\\n     *  @param _key The key of the tree to update.\\n     *  @param _treeIndex The index of the node to start from.\\n     *  @param _plusOrMinus Wether to add (true) or substract (false).\\n     *  @param _value The value to add or substract.\\n     *  `O(log_k(n))` where\\n     *  `k` is the maximum number of childs per node in the tree,\\n     *   and `n` is the maximum number of nodes ever appended.\\n     */\\n    function updateParents(SortitionSumTrees storage self, bytes32 _key, uint _treeIndex, bool _plusOrMinus, uint _value) private {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n\\n        uint parentIndex = _treeIndex;\\n        while (parentIndex != 0) {\\n            parentIndex = (parentIndex - 1) / tree.K;\\n            tree.nodes[parentIndex] = _plusOrMinus ? tree.nodes[parentIndex] + _value : tree.nodes[parentIndex] - _value;\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa20ece2e1ddeaa6432549a7c38cd02594000b93a54b92399b89bae0dd76dbc7e\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 5810,
                "contract": "contracts/builders/MultipleWinnersBuilder.sol:MultipleWinnersBuilder",
                "label": "multipleWinnersProxyFactory",
                "offset": 0,
                "slot": "0",
                "type": "t_contract(MultipleWinnersProxyFactory)12401"
              },
              {
                "astId": 5812,
                "contract": "contracts/builders/MultipleWinnersBuilder.sol:MultipleWinnersBuilder",
                "label": "controlledTokenBuilder",
                "offset": 0,
                "slot": "1",
                "type": "t_contract(ControlledTokenBuilder)5773"
              }
            ],
            "types": {
              "t_contract(ControlledTokenBuilder)5773": {
                "encoding": "inplace",
                "label": "contract ControlledTokenBuilder",
                "numberOfBytes": "20"
              },
              "t_contract(MultipleWinnersProxyFactory)12401": {
                "encoding": "inplace",
                "label": "contract MultipleWinnersProxyFactory",
                "numberOfBytes": "20"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/builders/PoolWithMultipleWinnersBuilder.sol": {
        "PoolWithMultipleWinnersBuilder": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "_reserveRegistry",
                  "type": "address"
                },
                {
                  "internalType": "contract CompoundPrizePoolProxyFactory",
                  "name": "_compoundPrizePoolProxyFactory",
                  "type": "address"
                },
                {
                  "internalType": "contract YieldSourcePrizePoolProxyFactory",
                  "name": "_yieldSourcePrizePoolProxyFactory",
                  "type": "address"
                },
                {
                  "internalType": "contract StakePrizePoolProxyFactory",
                  "name": "_stakePrizePoolProxyFactory",
                  "type": "address"
                },
                {
                  "internalType": "contract MultipleWinnersBuilder",
                  "name": "_multipleWinnersBuilder",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract CompoundPrizePool",
                  "name": "prizePool",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "contract MultipleWinners",
                  "name": "prizeStrategy",
                  "type": "address"
                }
              ],
              "name": "CompoundPrizePoolWithMultipleWinnersCreated",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract StakePrizePool",
                  "name": "prizePool",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "contract MultipleWinners",
                  "name": "prizeStrategy",
                  "type": "address"
                }
              ],
              "name": "StakePrizePoolWithMultipleWinnersCreated",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract YieldSourcePrizePool",
                  "name": "prizePool",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "contract MultipleWinners",
                  "name": "prizeStrategy",
                  "type": "address"
                }
              ],
              "name": "YieldSourcePrizePoolWithMultipleWinnersCreated",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "compoundPrizePoolProxyFactory",
              "outputs": [
                {
                  "internalType": "contract CompoundPrizePoolProxyFactory",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "components": [
                    {
                      "internalType": "contract CTokenInterface",
                      "name": "cToken",
                      "type": "address"
                    },
                    {
                      "internalType": "uint256",
                      "name": "maxExitFeeMantissa",
                      "type": "uint256"
                    }
                  ],
                  "internalType": "struct PoolWithMultipleWinnersBuilder.CompoundPrizePoolConfig",
                  "name": "prizePoolConfig",
                  "type": "tuple"
                },
                {
                  "components": [
                    {
                      "internalType": "contract RNGInterface",
                      "name": "rngService",
                      "type": "address"
                    },
                    {
                      "internalType": "uint256",
                      "name": "prizePeriodStart",
                      "type": "uint256"
                    },
                    {
                      "internalType": "uint256",
                      "name": "prizePeriodSeconds",
                      "type": "uint256"
                    },
                    {
                      "internalType": "string",
                      "name": "ticketName",
                      "type": "string"
                    },
                    {
                      "internalType": "string",
                      "name": "ticketSymbol",
                      "type": "string"
                    },
                    {
                      "internalType": "string",
                      "name": "sponsorshipName",
                      "type": "string"
                    },
                    {
                      "internalType": "string",
                      "name": "sponsorshipSymbol",
                      "type": "string"
                    },
                    {
                      "internalType": "uint256",
                      "name": "ticketCreditLimitMantissa",
                      "type": "uint256"
                    },
                    {
                      "internalType": "uint256",
                      "name": "ticketCreditRateMantissa",
                      "type": "uint256"
                    },
                    {
                      "internalType": "uint256",
                      "name": "numberOfWinners",
                      "type": "uint256"
                    },
                    {
                      "components": [
                        {
                          "internalType": "address",
                          "name": "target",
                          "type": "address"
                        },
                        {
                          "internalType": "uint16",
                          "name": "percentage",
                          "type": "uint16"
                        },
                        {
                          "internalType": "uint8",
                          "name": "token",
                          "type": "uint8"
                        }
                      ],
                      "internalType": "struct PrizeSplit.PrizeSplitConfig[]",
                      "name": "prizeSplits",
                      "type": "tuple[]"
                    },
                    {
                      "internalType": "bool",
                      "name": "splitExternalErc20Awards",
                      "type": "bool"
                    }
                  ],
                  "internalType": "struct MultipleWinnersBuilder.MultipleWinnersConfig",
                  "name": "prizeStrategyConfig",
                  "type": "tuple"
                },
                {
                  "internalType": "uint8",
                  "name": "decimals",
                  "type": "uint8"
                }
              ],
              "name": "createCompoundMultipleWinners",
              "outputs": [
                {
                  "internalType": "contract CompoundPrizePool",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "components": [
                    {
                      "internalType": "contract IERC20Upgradeable",
                      "name": "token",
                      "type": "address"
                    },
                    {
                      "internalType": "uint256",
                      "name": "maxExitFeeMantissa",
                      "type": "uint256"
                    }
                  ],
                  "internalType": "struct PoolWithMultipleWinnersBuilder.StakePrizePoolConfig",
                  "name": "prizePoolConfig",
                  "type": "tuple"
                },
                {
                  "components": [
                    {
                      "internalType": "contract RNGInterface",
                      "name": "rngService",
                      "type": "address"
                    },
                    {
                      "internalType": "uint256",
                      "name": "prizePeriodStart",
                      "type": "uint256"
                    },
                    {
                      "internalType": "uint256",
                      "name": "prizePeriodSeconds",
                      "type": "uint256"
                    },
                    {
                      "internalType": "string",
                      "name": "ticketName",
                      "type": "string"
                    },
                    {
                      "internalType": "string",
                      "name": "ticketSymbol",
                      "type": "string"
                    },
                    {
                      "internalType": "string",
                      "name": "sponsorshipName",
                      "type": "string"
                    },
                    {
                      "internalType": "string",
                      "name": "sponsorshipSymbol",
                      "type": "string"
                    },
                    {
                      "internalType": "uint256",
                      "name": "ticketCreditLimitMantissa",
                      "type": "uint256"
                    },
                    {
                      "internalType": "uint256",
                      "name": "ticketCreditRateMantissa",
                      "type": "uint256"
                    },
                    {
                      "internalType": "uint256",
                      "name": "numberOfWinners",
                      "type": "uint256"
                    },
                    {
                      "components": [
                        {
                          "internalType": "address",
                          "name": "target",
                          "type": "address"
                        },
                        {
                          "internalType": "uint16",
                          "name": "percentage",
                          "type": "uint16"
                        },
                        {
                          "internalType": "uint8",
                          "name": "token",
                          "type": "uint8"
                        }
                      ],
                      "internalType": "struct PrizeSplit.PrizeSplitConfig[]",
                      "name": "prizeSplits",
                      "type": "tuple[]"
                    },
                    {
                      "internalType": "bool",
                      "name": "splitExternalErc20Awards",
                      "type": "bool"
                    }
                  ],
                  "internalType": "struct MultipleWinnersBuilder.MultipleWinnersConfig",
                  "name": "prizeStrategyConfig",
                  "type": "tuple"
                },
                {
                  "internalType": "uint8",
                  "name": "decimals",
                  "type": "uint8"
                }
              ],
              "name": "createStakeMultipleWinners",
              "outputs": [
                {
                  "internalType": "contract StakePrizePool",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "components": [
                    {
                      "internalType": "contract IYieldSource",
                      "name": "yieldSource",
                      "type": "address"
                    },
                    {
                      "internalType": "uint256",
                      "name": "maxExitFeeMantissa",
                      "type": "uint256"
                    }
                  ],
                  "internalType": "struct PoolWithMultipleWinnersBuilder.YieldSourcePrizePoolConfig",
                  "name": "prizePoolConfig",
                  "type": "tuple"
                },
                {
                  "components": [
                    {
                      "internalType": "contract RNGInterface",
                      "name": "rngService",
                      "type": "address"
                    },
                    {
                      "internalType": "uint256",
                      "name": "prizePeriodStart",
                      "type": "uint256"
                    },
                    {
                      "internalType": "uint256",
                      "name": "prizePeriodSeconds",
                      "type": "uint256"
                    },
                    {
                      "internalType": "string",
                      "name": "ticketName",
                      "type": "string"
                    },
                    {
                      "internalType": "string",
                      "name": "ticketSymbol",
                      "type": "string"
                    },
                    {
                      "internalType": "string",
                      "name": "sponsorshipName",
                      "type": "string"
                    },
                    {
                      "internalType": "string",
                      "name": "sponsorshipSymbol",
                      "type": "string"
                    },
                    {
                      "internalType": "uint256",
                      "name": "ticketCreditLimitMantissa",
                      "type": "uint256"
                    },
                    {
                      "internalType": "uint256",
                      "name": "ticketCreditRateMantissa",
                      "type": "uint256"
                    },
                    {
                      "internalType": "uint256",
                      "name": "numberOfWinners",
                      "type": "uint256"
                    },
                    {
                      "components": [
                        {
                          "internalType": "address",
                          "name": "target",
                          "type": "address"
                        },
                        {
                          "internalType": "uint16",
                          "name": "percentage",
                          "type": "uint16"
                        },
                        {
                          "internalType": "uint8",
                          "name": "token",
                          "type": "uint8"
                        }
                      ],
                      "internalType": "struct PrizeSplit.PrizeSplitConfig[]",
                      "name": "prizeSplits",
                      "type": "tuple[]"
                    },
                    {
                      "internalType": "bool",
                      "name": "splitExternalErc20Awards",
                      "type": "bool"
                    }
                  ],
                  "internalType": "struct MultipleWinnersBuilder.MultipleWinnersConfig",
                  "name": "prizeStrategyConfig",
                  "type": "tuple"
                },
                {
                  "internalType": "uint8",
                  "name": "decimals",
                  "type": "uint8"
                }
              ],
              "name": "createYieldSourceMultipleWinners",
              "outputs": [
                {
                  "internalType": "contract YieldSourcePrizePool",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "multipleWinnersBuilder",
              "outputs": [
                {
                  "internalType": "contract MultipleWinnersBuilder",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "reserveRegistry",
              "outputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "stakePrizePoolProxyFactory",
              "outputs": [
                {
                  "internalType": "contract StakePrizePoolProxyFactory",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "yieldSourcePrizePoolProxyFactory",
              "outputs": [
                {
                  "internalType": "contract YieldSourcePrizePoolProxyFactory",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60806040523480156200001157600080fd5b506040516200182a3803806200182a83398101604081905262000034916200016d565b6001600160a01b038516620000665760405162461bcd60e51b81526004016200005d9062000296565b60405180910390fd5b6001600160a01b0384166200008f5760405162461bcd60e51b81526004016200005d90620002dc565b6001600160a01b038316620000b85760405162461bcd60e51b81526004016200005d90620001ec565b6001600160a01b038216620000e15760405162461bcd60e51b81526004016200005d9062000339565b6001600160a01b0381166200010a5760405162461bcd60e51b81526004016200005d9062000249565b600080546001600160a01b03199081166001600160a01b03978816179091556001805482169587169590951790945560028054851693861693909317909255600380548416918516919091179055600480549092169216919091179055620003a3565b600080600080600060a0868803121562000185578081fd5b855162000192816200038a565b6020870151909550620001a5816200038a565b6040870151909450620001b8816200038a565b6060870151909350620001cb816200038a565b6080870151909250620001de816200038a565b809150509295509295909350565b60208082526037908201527f476c6f62616c4275696c6465722f7969656c64536f757263655072697a65506f60408201527f6f6c50726f7879466163746f72792d6e6f742d7a65726f000000000000000000606082015260800190565b6020808252602d908201527f476c6f62616c4275696c6465722f6d756c7469706c6557696e6e65727342756960408201526c6c6465722d6e6f742d7a65726f60981b606082015260800190565b60208082526026908201527f476c6f62616c4275696c6465722f7265736572766552656769737472792d6e6f604082015265742d7a65726f60d01b606082015260800190565b60208082526034908201527f476c6f62616c4275696c6465722f636f6d706f756e645072697a65506f6f6c5060408201527f726f7879466163746f72792d6e6f742d7a65726f000000000000000000000000606082015260800190565b60208082526031908201527f476c6f62616c4275696c6465722f7374616b655072697a65506f6f6c50726f7860408201527079466163746f72792d6e6f742d7a65726f60781b606082015260800190565b6001600160a01b0381168114620003a057600080fd5b50565b61147780620003b36000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80638f0a6b361161005b5780638f0a6b36146100ce578063b77b59d0146100d6578063c4844272146100de578063dc71362b146100f157610088565b8063083d91441461008d5780633327717d146100b6578063802125f5146100be5780638e71c1f6146100c6575b600080fd5b6100a061009b36600461103b565b610104565b6040516100ad91906112fb565b60405180910390f35b6100a0610483565b6100a0610492565b6100a06104a1565b6100a06104b0565b6100a06104bf565b6100a06100ec3660046110bf565b6104ce565b6100a06100ff3660046110bf565b61084d565b600080600160009054906101000a90046001600160a01b03166001600160a01b031663efc81a8c6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561015757600080fd5b505af115801561016b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061018f9190611018565b6004805460405163b77f3bcb60e01b81529293506000926001600160a01b039091169163b77f3bcb916101ca9186918a918a91339101611342565b602060405180830381600087803b1580156101e457600080fd5b505af11580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c9190611018565b6000549091506001600160a01b038084169163c5871485911661023e84610bcc565b60208a01518a516040516001600160e01b031960e087901b1681526102699493929190600401611380565b600060405180830381600087803b15801561028357600080fd5b505af1158015610297573d6000803e3d6000fd5b50506040516348e5240760e11b81526001600160a01b03851692506391ca480e91506102c79084906004016112fb565b600060405180830381600087803b1580156102e157600080fd5b505af11580156102f5573d6000803e3d6000fd5b50505050816001600160a01b031663a7b2cc31826001600160a01b0316636cc25db76040518163ffffffff1660e01b815260040160206040518083038186803b15801561034157600080fd5b505afa158015610355573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103799190611018565b610387886101000151610d2b565b6103948960e00151610d2b565b6040518463ffffffff1660e01b81526004016103b29392919061130f565b600060405180830381600087803b1580156103cc57600080fd5b505af11580156103e0573d6000803e3d6000fd5b505060405163f2fde38b60e01b81526001600160a01b038516925063f2fde38b91506104109033906004016112fb565b600060405180830381600087803b15801561042a57600080fd5b505af115801561043e573d6000803e3d6000fd5b50506040516001600160a01b038085169350851691507f42714bc68c7250ebba24f4cf6ff0e97afddec794459ee3d050081bd7fbc3d65e90600090a350949350505050565b6003546001600160a01b031681565b6001546001600160a01b031681565b6000546001600160a01b031681565b6002546001600160a01b031681565b6004546001600160a01b031681565b600080600360009054906101000a90046001600160a01b03166001600160a01b031663efc81a8c6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561052157600080fd5b505af1158015610535573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105599190611018565b6004805460405163b77f3bcb60e01b81529293506000926001600160a01b039091169163b77f3bcb916105949186918a918a91339101611342565b602060405180830381600087803b1580156105ae57600080fd5b505af11580156105c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e69190611018565b6000549091506001600160a01b038084169163c5871485911661060884610bcc565b60208a01518a516040516001600160e01b031960e087901b1681526106339493929190600401611380565b600060405180830381600087803b15801561064d57600080fd5b505af1158015610661573d6000803e3d6000fd5b50506040516348e5240760e11b81526001600160a01b03851692506391ca480e91506106919084906004016112fb565b600060405180830381600087803b1580156106ab57600080fd5b505af11580156106bf573d6000803e3d6000fd5b50505050816001600160a01b031663a7b2cc31826001600160a01b0316636cc25db76040518163ffffffff1660e01b815260040160206040518083038186803b15801561070b57600080fd5b505afa15801561071f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107439190611018565b610751886101000151610d2b565b61075e8960e00151610d2b565b6040518463ffffffff1660e01b815260040161077c9392919061130f565b600060405180830381600087803b15801561079657600080fd5b505af11580156107aa573d6000803e3d6000fd5b505060405163f2fde38b60e01b81526001600160a01b038516925063f2fde38b91506107da9033906004016112fb565b600060405180830381600087803b1580156107f457600080fd5b505af1158015610808573d6000803e3d6000fd5b50506040516001600160a01b038085169350851691507f1633ccb3d787c0c7e5c7b5eb77604c85e70614eeef4f64551ab0044cd9925d0e90600090a350949350505050565b600080600260009054906101000a90046001600160a01b03166001600160a01b031663efc81a8c6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156108a057600080fd5b505af11580156108b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d89190611018565b6004805460405163b77f3bcb60e01b81529293506000926001600160a01b039091169163b77f3bcb916109139186918a918a91339101611342565b602060405180830381600087803b15801561092d57600080fd5b505af1158015610941573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109659190611018565b6000549091506001600160a01b038084169163cfa24007911661098784610bcc565b60208a01518a516040516001600160e01b031960e087901b1681526109b29493929190600401611380565b600060405180830381600087803b1580156109cc57600080fd5b505af11580156109e0573d6000803e3d6000fd5b50506040516348e5240760e11b81526001600160a01b03851692506391ca480e9150610a109084906004016112fb565b600060405180830381600087803b158015610a2a57600080fd5b505af1158015610a3e573d6000803e3d6000fd5b50505050816001600160a01b031663a7b2cc31826001600160a01b0316636cc25db76040518163ffffffff1660e01b815260040160206040518083038186803b158015610a8a57600080fd5b505afa158015610a9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac29190611018565b610ad0886101000151610d2b565b610add8960e00151610d2b565b6040518463ffffffff1660e01b8152600401610afb9392919061130f565b600060405180830381600087803b158015610b1557600080fd5b505af1158015610b29573d6000803e3d6000fd5b505060405163f2fde38b60e01b81526001600160a01b038516925063f2fde38b9150610b599033906004016112fb565b600060405180830381600087803b158015610b7357600080fd5b505af1158015610b87573d6000803e3d6000fd5b50506040516001600160a01b038085169350851691507f63eabe842a4ca0fa63657803ae342a4b111574de00afe4fad24e7668d8b7975490600090a350949350505050565b604080516002808252606080830184529283929190602083019080368337019050509050826001600160a01b0316636cc25db76040518163ffffffff1660e01b815260040160206040518083038186803b158015610c2957600080fd5b505afa158015610c3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c619190611018565b81600081518110610c6e57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050826001600160a01b031663500db70d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610cc757600080fd5b505afa158015610cdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cff9190611018565b81600181518110610d0c57fe5b6001600160a01b03909216602092830291909101909101529050919050565b6000600160801b8210610d595760405162461bcd60e51b8152600401610d50906113bb565b60405180910390fd5b5090565b600082601f830112610d6d578081fd5b813567ffffffffffffffff811115610d83578182fd5b6020610d928182840201611402565b8281529250808301848201606080850287018401881015610db257600080fd5b60005b85811015610dd957610dc78984610fab565b84529284019291810191600101610db5565b50505050505092915050565b80358015158114610df557600080fd5b92915050565b8035610df581611429565b600082601f830112610e16578081fd5b813567ffffffffffffffff811115610e2c578182fd5b610e3f601f8201601f1916602001611402565b9150808252836020828501011115610e5657600080fd5b8060208401602084013760009082016020015292915050565b6000610180808385031215610e82578182fd5b610e8b81611402565b915050610e988383610dfb565b81526020820135602082015260408201356040820152606082013567ffffffffffffffff80821115610ec957600080fd5b610ed585838601610e06565b60608401526080840135915080821115610eee57600080fd5b610efa85838601610e06565b608084015260a0840135915080821115610f1357600080fd5b610f1f85838601610e06565b60a084015260c0840135915080821115610f3857600080fd5b610f4485838601610e06565b60c084015260e084810135908401526101008085013590840152610120808501359084015261014091508184013581811115610f7f57600080fd5b610f8b86828701610d5d565b83850152505050610160610fa184828501610de5565b9082015292915050565b600060608284031215610fbc578081fd5b610fc66060611402565b90508135610fd381611429565b8152602082013561ffff81168114610fea57600080fd5b6020820152610ffc8360408401611007565b604082015292915050565b803560ff81168114610df557600080fd5b600060208284031215611029578081fd5b815161103481611429565b9392505050565b60008060008385036080811215611050578283fd5b604081121561105d578283fd5b506110686040611402565b843561107381611429565b8152602085810135908201529250604084013567ffffffffffffffff81111561109a578283fd5b6110a686828701610e6f565b9250506110b68560608601611007565b90509250925092565b600080600083850360808112156110d4578182fd5b60408112156110e1578182fd5b506110ec6040611402565b84356110f781611429565b8152602085810135908201529250604084013567ffffffffffffffff81111561109a578182fd5b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156111635781516001600160a01b03168752958201959082019060010161113e565b509495945050505050565b6000815180845260208085019450808401835b8381101561116357815180516001600160a01b031688528381015161ffff168489015260409081015160ff169088015260609096019590820190600101611181565b15159052565b60008151808452815b818110156111ee576020818501810151868301820152016111d2565b818111156111ff5782602083870101525b50601f01601f19169290920160200192915050565b600061018061122484845161111e565b6020830151602085015260408301516040850152606083015181606086015261124f828601826111c9565b9150506080830151848203608086015261126982826111c9565b91505060a083015184820360a086015261128382826111c9565b91505060c083015184820360c086015261129d82826111c9565b91505060e083015160e085015261010080840151818601525061012080840151818601525061014080840151858303828701526112da838261116e565b92505050610160808401516112f1828701826111c3565b5090949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b039390931683526fffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b600060018060a01b038087168352608060208401526113646080840187611214565b60ff959095166040840152929092166060909101525092915050565b600060018060a01b038087168352608060208401526113a2608084018761112b565b6040840195909552929092166060909101525092915050565b60208082526027908201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316040820152663238206269747360c81b606082015260800190565b60405181810167ffffffffffffffff8111828210171561142157600080fd5b604052919050565b6001600160a01b038116811461143e57600080fd5b5056fea26469706673582212201ba973f8cae0fa827d6823dbcba98d90d9f84f125659a922b55e1d2c66b148fa64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x182A CODESIZE SUB DUP1 PUSH3 0x182A DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x34 SWAP2 PUSH3 0x16D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH3 0x66 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x5D SWAP1 PUSH3 0x296 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH3 0x8F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x5D SWAP1 PUSH3 0x2DC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH3 0xB8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x5D SWAP1 PUSH3 0x1EC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH3 0xE1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x5D SWAP1 PUSH3 0x339 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH3 0x10A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x5D SWAP1 PUSH3 0x249 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP8 DUP9 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD DUP3 AND SWAP6 DUP8 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE PUSH1 0x2 DUP1 SLOAD DUP6 AND SWAP4 DUP7 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE PUSH1 0x3 DUP1 SLOAD DUP5 AND SWAP2 DUP6 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x4 DUP1 SLOAD SWAP1 SWAP3 AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH3 0x3A3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH3 0x185 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP6 MLOAD PUSH3 0x192 DUP2 PUSH3 0x38A JUMP JUMPDEST PUSH1 0x20 DUP8 ADD MLOAD SWAP1 SWAP6 POP PUSH3 0x1A5 DUP2 PUSH3 0x38A JUMP JUMPDEST PUSH1 0x40 DUP8 ADD MLOAD SWAP1 SWAP5 POP PUSH3 0x1B8 DUP2 PUSH3 0x38A JUMP JUMPDEST PUSH1 0x60 DUP8 ADD MLOAD SWAP1 SWAP4 POP PUSH3 0x1CB DUP2 PUSH3 0x38A JUMP JUMPDEST PUSH1 0x80 DUP8 ADD MLOAD SWAP1 SWAP3 POP PUSH3 0x1DE DUP2 PUSH3 0x38A JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x37 SWAP1 DUP3 ADD MSTORE PUSH32 0x476C6F62616C4275696C6465722F7969656C64536F757263655072697A65506F PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x6F6C50726F7879466163746F72792D6E6F742D7A65726F000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2D SWAP1 DUP3 ADD MSTORE PUSH32 0x476C6F62616C4275696C6465722F6D756C7469706C6557696E6E657273427569 PUSH1 0x40 DUP3 ADD MSTORE PUSH13 0x6C6465722D6E6F742D7A65726F PUSH1 0x98 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x476C6F62616C4275696C6465722F7265736572766552656769737472792D6E6F PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x742D7A65726F PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x34 SWAP1 DUP3 ADD MSTORE PUSH32 0x476C6F62616C4275696C6465722F636F6D706F756E645072697A65506F6F6C50 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x726F7879466163746F72792D6E6F742D7A65726F000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x31 SWAP1 DUP3 ADD MSTORE PUSH32 0x476C6F62616C4275696C6465722F7374616B655072697A65506F6F6C50726F78 PUSH1 0x40 DUP3 ADD MSTORE PUSH17 0x79466163746F72792D6E6F742D7A65726F PUSH1 0x78 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0x3A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH2 0x1477 DUP1 PUSH3 0x3B3 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x88 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8F0A6B36 GT PUSH2 0x5B JUMPI DUP1 PUSH4 0x8F0A6B36 EQ PUSH2 0xCE JUMPI DUP1 PUSH4 0xB77B59D0 EQ PUSH2 0xD6 JUMPI DUP1 PUSH4 0xC4844272 EQ PUSH2 0xDE JUMPI DUP1 PUSH4 0xDC71362B EQ PUSH2 0xF1 JUMPI PUSH2 0x88 JUMP JUMPDEST DUP1 PUSH4 0x83D9144 EQ PUSH2 0x8D JUMPI DUP1 PUSH4 0x3327717D EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0x802125F5 EQ PUSH2 0xBE JUMPI DUP1 PUSH4 0x8E71C1F6 EQ PUSH2 0xC6 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA0 PUSH2 0x9B CALLDATASIZE PUSH1 0x4 PUSH2 0x103B JUMP JUMPDEST PUSH2 0x104 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAD SWAP2 SWAP1 PUSH2 0x12FB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xA0 PUSH2 0x483 JUMP JUMPDEST PUSH2 0xA0 PUSH2 0x492 JUMP JUMPDEST PUSH2 0xA0 PUSH2 0x4A1 JUMP JUMPDEST PUSH2 0xA0 PUSH2 0x4B0 JUMP JUMPDEST PUSH2 0xA0 PUSH2 0x4BF JUMP JUMPDEST PUSH2 0xA0 PUSH2 0xEC CALLDATASIZE PUSH1 0x4 PUSH2 0x10BF JUMP JUMPDEST PUSH2 0x4CE JUMP JUMPDEST PUSH2 0xA0 PUSH2 0xFF CALLDATASIZE PUSH1 0x4 PUSH2 0x10BF JUMP JUMPDEST PUSH2 0x84D JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xEFC81A8C PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x157 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x16B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x18F SWAP2 SWAP1 PUSH2 0x1018 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH4 0xB77F3BCB PUSH1 0xE0 SHL DUP2 MSTORE SWAP3 SWAP4 POP PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0xB77F3BCB SWAP2 PUSH2 0x1CA SWAP2 DUP7 SWAP2 DUP11 SWAP2 DUP11 SWAP2 CALLER SWAP2 ADD PUSH2 0x1342 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1F8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x21C SWAP2 SWAP1 PUSH2 0x1018 JUMP JUMPDEST PUSH1 0x0 SLOAD SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP2 PUSH4 0xC5871485 SWAP2 AND PUSH2 0x23E DUP5 PUSH2 0xBCC JUMP JUMPDEST PUSH1 0x20 DUP11 ADD MLOAD DUP11 MLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH1 0xE0 DUP8 SWAP1 SHL AND DUP2 MSTORE PUSH2 0x269 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x1380 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x283 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x297 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH4 0x48E52407 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP3 POP PUSH4 0x91CA480E SWAP2 POP PUSH2 0x2C7 SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH2 0x12FB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2F5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xA7B2CC31 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x6CC25DB7 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x341 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x355 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x379 SWAP2 SWAP1 PUSH2 0x1018 JUMP JUMPDEST PUSH2 0x387 DUP9 PUSH2 0x100 ADD MLOAD PUSH2 0xD2B JUMP JUMPDEST PUSH2 0x394 DUP10 PUSH1 0xE0 ADD MLOAD PUSH2 0xD2B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3B2 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x130F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3E0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH4 0xF2FDE38B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP3 POP PUSH4 0xF2FDE38B SWAP2 POP PUSH2 0x410 SWAP1 CALLER SWAP1 PUSH1 0x4 ADD PUSH2 0x12FB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x42A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x43E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP4 POP DUP6 AND SWAP2 POP PUSH32 0x42714BC68C7250EBBA24F4CF6FF0E97AFDDEC794459EE3D050081BD7FBC3D65E SWAP1 PUSH1 0x0 SWAP1 LOG3 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x3 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xEFC81A8C PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x521 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x535 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x559 SWAP2 SWAP1 PUSH2 0x1018 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH4 0xB77F3BCB PUSH1 0xE0 SHL DUP2 MSTORE SWAP3 SWAP4 POP PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0xB77F3BCB SWAP2 PUSH2 0x594 SWAP2 DUP7 SWAP2 DUP11 SWAP2 DUP11 SWAP2 CALLER SWAP2 ADD PUSH2 0x1342 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x5C2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x5E6 SWAP2 SWAP1 PUSH2 0x1018 JUMP JUMPDEST PUSH1 0x0 SLOAD SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP2 PUSH4 0xC5871485 SWAP2 AND PUSH2 0x608 DUP5 PUSH2 0xBCC JUMP JUMPDEST PUSH1 0x20 DUP11 ADD MLOAD DUP11 MLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH1 0xE0 DUP8 SWAP1 SHL AND DUP2 MSTORE PUSH2 0x633 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x1380 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x64D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x661 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH4 0x48E52407 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP3 POP PUSH4 0x91CA480E SWAP2 POP PUSH2 0x691 SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH2 0x12FB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x6BF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xA7B2CC31 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x6CC25DB7 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x70B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x71F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x743 SWAP2 SWAP1 PUSH2 0x1018 JUMP JUMPDEST PUSH2 0x751 DUP9 PUSH2 0x100 ADD MLOAD PUSH2 0xD2B JUMP JUMPDEST PUSH2 0x75E DUP10 PUSH1 0xE0 ADD MLOAD PUSH2 0xD2B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x77C SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x130F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x796 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x7AA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH4 0xF2FDE38B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP3 POP PUSH4 0xF2FDE38B SWAP2 POP PUSH2 0x7DA SWAP1 CALLER SWAP1 PUSH1 0x4 ADD PUSH2 0x12FB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x7F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x808 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP4 POP DUP6 AND SWAP2 POP PUSH32 0x1633CCB3D787C0C7E5C7B5EB77604C85E70614EEEF4F64551AB0044CD9925D0E SWAP1 PUSH1 0x0 SWAP1 LOG3 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xEFC81A8C PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x8A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8B4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x8D8 SWAP2 SWAP1 PUSH2 0x1018 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH4 0xB77F3BCB PUSH1 0xE0 SHL DUP2 MSTORE SWAP3 SWAP4 POP PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0xB77F3BCB SWAP2 PUSH2 0x913 SWAP2 DUP7 SWAP2 DUP11 SWAP2 DUP11 SWAP2 CALLER SWAP2 ADD PUSH2 0x1342 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x92D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x941 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x965 SWAP2 SWAP1 PUSH2 0x1018 JUMP JUMPDEST PUSH1 0x0 SLOAD SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP2 PUSH4 0xCFA24007 SWAP2 AND PUSH2 0x987 DUP5 PUSH2 0xBCC JUMP JUMPDEST PUSH1 0x20 DUP11 ADD MLOAD DUP11 MLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH1 0xE0 DUP8 SWAP1 SHL AND DUP2 MSTORE PUSH2 0x9B2 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x1380 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x9CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x9E0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH4 0x48E52407 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP3 POP PUSH4 0x91CA480E SWAP2 POP PUSH2 0xA10 SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH2 0x12FB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA2A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA3E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xA7B2CC31 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x6CC25DB7 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA8A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xA9E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xAC2 SWAP2 SWAP1 PUSH2 0x1018 JUMP JUMPDEST PUSH2 0xAD0 DUP9 PUSH2 0x100 ADD MLOAD PUSH2 0xD2B JUMP JUMPDEST PUSH2 0xADD DUP10 PUSH1 0xE0 ADD MLOAD PUSH2 0xD2B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xAFB SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x130F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB29 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH4 0xF2FDE38B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP3 POP PUSH4 0xF2FDE38B SWAP2 POP PUSH2 0xB59 SWAP1 CALLER SWAP1 PUSH1 0x4 ADD PUSH2 0x12FB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB73 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB87 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP4 POP DUP6 AND SWAP2 POP PUSH32 0x63EABE842A4CA0FA63657803AE342A4B111574DE00AFE4FAD24E7668D8B79754 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP1 DUP4 ADD DUP5 MSTORE SWAP3 DUP4 SWAP3 SWAP2 SWAP1 PUSH1 0x20 DUP4 ADD SWAP1 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP POP SWAP1 POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x6CC25DB7 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC29 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xC3D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xC61 SWAP2 SWAP1 PUSH2 0x1018 JUMP JUMPDEST DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0xC6E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x500DB70D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xCDB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xCFF SWAP2 SWAP1 PUSH2 0x1018 JUMP JUMPDEST DUP2 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0xD0C JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0xD59 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xD50 SWAP1 PUSH2 0x13BB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xD6D JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xD83 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 PUSH2 0xD92 DUP2 DUP3 DUP5 MUL ADD PUSH2 0x1402 JUMP JUMPDEST DUP3 DUP2 MSTORE SWAP3 POP DUP1 DUP4 ADD DUP5 DUP3 ADD PUSH1 0x60 DUP1 DUP6 MUL DUP8 ADD DUP5 ADD DUP9 LT ISZERO PUSH2 0xDB2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0xDD9 JUMPI PUSH2 0xDC7 DUP10 DUP5 PUSH2 0xFAB JUMP JUMPDEST DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP2 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xDB5 JUMP JUMPDEST POP POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xDF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0xDF5 DUP2 PUSH2 0x1429 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xE16 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xE2C JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xE3F PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD PUSH2 0x1402 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0xE56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xE82 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xE8B DUP2 PUSH2 0x1402 JUMP JUMPDEST SWAP2 POP POP PUSH2 0xE98 DUP4 DUP4 PUSH2 0xDFB JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xEC9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xED5 DUP6 DUP4 DUP7 ADD PUSH2 0xE06 JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP5 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xEEE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xEFA DUP6 DUP4 DUP7 ADD PUSH2 0xE06 JUMP JUMPDEST PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0xA0 DUP5 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xF13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF1F DUP6 DUP4 DUP7 ADD PUSH2 0xE06 JUMP JUMPDEST PUSH1 0xA0 DUP5 ADD MSTORE PUSH1 0xC0 DUP5 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xF38 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF44 DUP6 DUP4 DUP7 ADD PUSH2 0xE06 JUMP JUMPDEST PUSH1 0xC0 DUP5 ADD MSTORE PUSH1 0xE0 DUP5 DUP2 ADD CALLDATALOAD SWAP1 DUP5 ADD MSTORE PUSH2 0x100 DUP1 DUP6 ADD CALLDATALOAD SWAP1 DUP5 ADD MSTORE PUSH2 0x120 DUP1 DUP6 ADD CALLDATALOAD SWAP1 DUP5 ADD MSTORE PUSH2 0x140 SWAP2 POP DUP2 DUP5 ADD CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0xF7F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF8B DUP7 DUP3 DUP8 ADD PUSH2 0xD5D JUMP JUMPDEST DUP4 DUP6 ADD MSTORE POP POP POP PUSH2 0x160 PUSH2 0xFA1 DUP5 DUP3 DUP6 ADD PUSH2 0xDE5 JUMP JUMPDEST SWAP1 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xFBC JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0xFC6 PUSH1 0x60 PUSH2 0x1402 JUMP JUMPDEST SWAP1 POP DUP2 CALLDATALOAD PUSH2 0xFD3 DUP2 PUSH2 0x1429 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH2 0xFFFF DUP2 AND DUP2 EQ PUSH2 0xFEA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0xFFC DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x1007 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0xDF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1029 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x1034 DUP2 PUSH2 0x1429 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 DUP6 SUB PUSH1 0x80 DUP2 SLT ISZERO PUSH2 0x1050 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x40 DUP2 SLT ISZERO PUSH2 0x105D JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x1068 PUSH1 0x40 PUSH2 0x1402 JUMP JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1073 DUP2 PUSH2 0x1429 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP6 DUP2 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE SWAP3 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x109A JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x10A6 DUP7 DUP3 DUP8 ADD PUSH2 0xE6F JUMP JUMPDEST SWAP3 POP POP PUSH2 0x10B6 DUP6 PUSH1 0x60 DUP7 ADD PUSH2 0x1007 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 DUP6 SUB PUSH1 0x80 DUP2 SLT ISZERO PUSH2 0x10D4 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x40 DUP2 SLT ISZERO PUSH2 0x10E1 JUMPI DUP2 DUP3 REVERT JUMPDEST POP PUSH2 0x10EC PUSH1 0x40 PUSH2 0x1402 JUMP JUMPDEST DUP5 CALLDATALOAD PUSH2 0x10F7 DUP2 PUSH2 0x1429 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP6 DUP2 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE SWAP3 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x109A JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP1 DUP6 ADD SWAP5 POP DUP1 DUP5 ADD DUP4 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1163 JUMPI DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 MSTORE SWAP6 DUP3 ADD SWAP6 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x113E JUMP JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP1 DUP6 ADD SWAP5 POP DUP1 DUP5 ADD DUP4 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1163 JUMPI DUP2 MLOAD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP9 MSTORE DUP4 DUP2 ADD MLOAD PUSH2 0xFFFF AND DUP5 DUP10 ADD MSTORE PUSH1 0x40 SWAP1 DUP2 ADD MLOAD PUSH1 0xFF AND SWAP1 DUP9 ADD MSTORE PUSH1 0x60 SWAP1 SWAP7 ADD SWAP6 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1181 JUMP JUMPDEST ISZERO ISZERO SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x11EE JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x11D2 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x11FF JUMPI DUP3 PUSH1 0x20 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 PUSH2 0x1224 DUP5 DUP5 MLOAD PUSH2 0x111E JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP4 ADD MLOAD DUP2 PUSH1 0x60 DUP7 ADD MSTORE PUSH2 0x124F DUP3 DUP7 ADD DUP3 PUSH2 0x11C9 JUMP JUMPDEST SWAP2 POP POP PUSH1 0x80 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0x80 DUP7 ADD MSTORE PUSH2 0x1269 DUP3 DUP3 PUSH2 0x11C9 JUMP JUMPDEST SWAP2 POP POP PUSH1 0xA0 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0xA0 DUP7 ADD MSTORE PUSH2 0x1283 DUP3 DUP3 PUSH2 0x11C9 JUMP JUMPDEST SWAP2 POP POP PUSH1 0xC0 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0xC0 DUP7 ADD MSTORE PUSH2 0x129D DUP3 DUP3 PUSH2 0x11C9 JUMP JUMPDEST SWAP2 POP POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH1 0xE0 DUP6 ADD MSTORE PUSH2 0x100 DUP1 DUP5 ADD MLOAD DUP2 DUP7 ADD MSTORE POP PUSH2 0x120 DUP1 DUP5 ADD MLOAD DUP2 DUP7 ADD MSTORE POP PUSH2 0x140 DUP1 DUP5 ADD MLOAD DUP6 DUP4 SUB DUP3 DUP8 ADD MSTORE PUSH2 0x12DA DUP4 DUP3 PUSH2 0x116E JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x160 DUP1 DUP5 ADD MLOAD PUSH2 0x12F1 DUP3 DUP8 ADD DUP3 PUSH2 0x11C3 JUMP JUMPDEST POP SWAP1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND DUP4 MSTORE PUSH1 0x80 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x1364 PUSH1 0x80 DUP5 ADD DUP8 PUSH2 0x1214 JUMP JUMPDEST PUSH1 0xFF SWAP6 SWAP1 SWAP6 AND PUSH1 0x40 DUP5 ADD MSTORE SWAP3 SWAP1 SWAP3 AND PUSH1 0x60 SWAP1 SWAP2 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND DUP4 MSTORE PUSH1 0x80 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x13A2 PUSH1 0x80 DUP5 ADD DUP8 PUSH2 0x112B JUMP JUMPDEST PUSH1 0x40 DUP5 ADD SWAP6 SWAP1 SWAP6 MSTORE SWAP3 SWAP1 SWAP3 AND PUSH1 0x60 SWAP1 SWAP2 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x27 SWAP1 DUP3 ADD MSTORE PUSH32 0x53616665436173743A2076616C756520646F65736E27742066697420696E2031 PUSH1 0x40 DUP3 ADD MSTORE PUSH7 0x32382062697473 PUSH1 0xC8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1421 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x143E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SHL 0xA9 PUSH20 0xF8CAE0FA827D6823DBCBA98D90D9F84F125659A9 0x22 0xB5 0x5E SAR 0x2C PUSH7 0xB148FA64736F6C PUSH4 0x4300060C STOP CALLER ",
              "sourceMap": "533:5997:34:-:0;;;1809:1195;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2137:39:34;;2129:90;;;;-1:-1:-1;;;2129:90:34;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;2233:53:34;;2225:118;;;;-1:-1:-1;;;2225:118:34;;;;;;;:::i;:::-;-1:-1:-1;;;;;2357:56:34;;2349:124;;;;-1:-1:-1;;;2349:124:34;;;;;;;:::i;:::-;-1:-1:-1;;;;;2487:50:34;;2479:112;;;;-1:-1:-1;;;2479:112:34;;;;;;;:::i;:::-;-1:-1:-1;;;;;2605:46:34;;2597:104;;;;-1:-1:-1;;;2597:104:34;;;;;;;:::i;:::-;2707:15;:34;;-1:-1:-1;;;;;;2707:34:34;;;-1:-1:-1;;;;;2707:34:34;;;;;;;-1:-1:-1;2747:62:34;;;;;;;;;;;;;;2815:32;:68;;;;;;;;;;;;;;2889:26;:56;;;;;;;;;;;;;2951:22;:48;;;;;;;;;;;;;533:5997;;1054:1153:-1;;;;;;1409:3;1397:9;1388:7;1384:23;1380:33;1377:2;;;-1:-1;;1416:12;1377:2;536:6;530:13;548:60;602:5;548:60;:::i;:::-;1606:2;1694:22;;121:13;1468:101;;-1:-1;139:71;121:13;139:71;:::i;:::-;1763:2;1854:22;;950:13;1614:112;;-1:-1;968:74;950:13;968:74;:::i;:::-;1923:2;2008:22;;733:13;1771:115;;-1:-1;751:68;733:13;751:68;:::i;:::-;2077:3;2159:22;;331:13;1931:109;;-1:-1;349:64;331:13;349:64;:::i;:::-;2086:105;;;;1371:836;;;;;;;;:::o;4183:416::-;4383:2;4397:47;;;2439:2;4368:18;;;6402:19;2475:34;6442:14;;;2455:55;2544:25;2530:12;;;2523:47;2589:12;;;4354:245::o;4606:416::-;4806:2;4820:47;;;2840:2;4791:18;;;6402:19;2876:34;6442:14;;;2856:55;-1:-1;;;2931:12;;;2924:37;2980:12;;;4777:245::o;5029:416::-;5229:2;5243:47;;;3231:2;5214:18;;;6402:19;3267:34;6442:14;;;3247:55;-1:-1;;;3322:12;;;3315:30;3364:12;;;5200:245::o;5452:416::-;5652:2;5666:47;;;3615:2;5637:18;;;6402:19;3651:34;6442:14;;;3631:55;3720:22;3706:12;;;3699:44;3762:12;;;5623:245::o;5875:416::-;6075:2;6089:47;;;4013:2;6060:18;;;6402:19;4049:34;6442:14;;;4029:55;-1:-1;;;4104:12;;;4097:41;4157:12;;;6046:245::o;7358:193::-;-1:-1;;;;;7292:54;;7455:73;;7445:2;;7542:1;;7532:12;7445:2;7439:112;:::o;:::-;533:5997:34;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106100885760003560e01c80638f0a6b361161005b5780638f0a6b36146100ce578063b77b59d0146100d6578063c4844272146100de578063dc71362b146100f157610088565b8063083d91441461008d5780633327717d146100b6578063802125f5146100be5780638e71c1f6146100c6575b600080fd5b6100a061009b36600461103b565b610104565b6040516100ad91906112fb565b60405180910390f35b6100a0610483565b6100a0610492565b6100a06104a1565b6100a06104b0565b6100a06104bf565b6100a06100ec3660046110bf565b6104ce565b6100a06100ff3660046110bf565b61084d565b600080600160009054906101000a90046001600160a01b03166001600160a01b031663efc81a8c6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561015757600080fd5b505af115801561016b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061018f9190611018565b6004805460405163b77f3bcb60e01b81529293506000926001600160a01b039091169163b77f3bcb916101ca9186918a918a91339101611342565b602060405180830381600087803b1580156101e457600080fd5b505af11580156101f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061021c9190611018565b6000549091506001600160a01b038084169163c5871485911661023e84610bcc565b60208a01518a516040516001600160e01b031960e087901b1681526102699493929190600401611380565b600060405180830381600087803b15801561028357600080fd5b505af1158015610297573d6000803e3d6000fd5b50506040516348e5240760e11b81526001600160a01b03851692506391ca480e91506102c79084906004016112fb565b600060405180830381600087803b1580156102e157600080fd5b505af11580156102f5573d6000803e3d6000fd5b50505050816001600160a01b031663a7b2cc31826001600160a01b0316636cc25db76040518163ffffffff1660e01b815260040160206040518083038186803b15801561034157600080fd5b505afa158015610355573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103799190611018565b610387886101000151610d2b565b6103948960e00151610d2b565b6040518463ffffffff1660e01b81526004016103b29392919061130f565b600060405180830381600087803b1580156103cc57600080fd5b505af11580156103e0573d6000803e3d6000fd5b505060405163f2fde38b60e01b81526001600160a01b038516925063f2fde38b91506104109033906004016112fb565b600060405180830381600087803b15801561042a57600080fd5b505af115801561043e573d6000803e3d6000fd5b50506040516001600160a01b038085169350851691507f42714bc68c7250ebba24f4cf6ff0e97afddec794459ee3d050081bd7fbc3d65e90600090a350949350505050565b6003546001600160a01b031681565b6001546001600160a01b031681565b6000546001600160a01b031681565b6002546001600160a01b031681565b6004546001600160a01b031681565b600080600360009054906101000a90046001600160a01b03166001600160a01b031663efc81a8c6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561052157600080fd5b505af1158015610535573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105599190611018565b6004805460405163b77f3bcb60e01b81529293506000926001600160a01b039091169163b77f3bcb916105949186918a918a91339101611342565b602060405180830381600087803b1580156105ae57600080fd5b505af11580156105c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e69190611018565b6000549091506001600160a01b038084169163c5871485911661060884610bcc565b60208a01518a516040516001600160e01b031960e087901b1681526106339493929190600401611380565b600060405180830381600087803b15801561064d57600080fd5b505af1158015610661573d6000803e3d6000fd5b50506040516348e5240760e11b81526001600160a01b03851692506391ca480e91506106919084906004016112fb565b600060405180830381600087803b1580156106ab57600080fd5b505af11580156106bf573d6000803e3d6000fd5b50505050816001600160a01b031663a7b2cc31826001600160a01b0316636cc25db76040518163ffffffff1660e01b815260040160206040518083038186803b15801561070b57600080fd5b505afa15801561071f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107439190611018565b610751886101000151610d2b565b61075e8960e00151610d2b565b6040518463ffffffff1660e01b815260040161077c9392919061130f565b600060405180830381600087803b15801561079657600080fd5b505af11580156107aa573d6000803e3d6000fd5b505060405163f2fde38b60e01b81526001600160a01b038516925063f2fde38b91506107da9033906004016112fb565b600060405180830381600087803b1580156107f457600080fd5b505af1158015610808573d6000803e3d6000fd5b50506040516001600160a01b038085169350851691507f1633ccb3d787c0c7e5c7b5eb77604c85e70614eeef4f64551ab0044cd9925d0e90600090a350949350505050565b600080600260009054906101000a90046001600160a01b03166001600160a01b031663efc81a8c6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156108a057600080fd5b505af11580156108b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d89190611018565b6004805460405163b77f3bcb60e01b81529293506000926001600160a01b039091169163b77f3bcb916109139186918a918a91339101611342565b602060405180830381600087803b15801561092d57600080fd5b505af1158015610941573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109659190611018565b6000549091506001600160a01b038084169163cfa24007911661098784610bcc565b60208a01518a516040516001600160e01b031960e087901b1681526109b29493929190600401611380565b600060405180830381600087803b1580156109cc57600080fd5b505af11580156109e0573d6000803e3d6000fd5b50506040516348e5240760e11b81526001600160a01b03851692506391ca480e9150610a109084906004016112fb565b600060405180830381600087803b158015610a2a57600080fd5b505af1158015610a3e573d6000803e3d6000fd5b50505050816001600160a01b031663a7b2cc31826001600160a01b0316636cc25db76040518163ffffffff1660e01b815260040160206040518083038186803b158015610a8a57600080fd5b505afa158015610a9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac29190611018565b610ad0886101000151610d2b565b610add8960e00151610d2b565b6040518463ffffffff1660e01b8152600401610afb9392919061130f565b600060405180830381600087803b158015610b1557600080fd5b505af1158015610b29573d6000803e3d6000fd5b505060405163f2fde38b60e01b81526001600160a01b038516925063f2fde38b9150610b599033906004016112fb565b600060405180830381600087803b158015610b7357600080fd5b505af1158015610b87573d6000803e3d6000fd5b50506040516001600160a01b038085169350851691507f63eabe842a4ca0fa63657803ae342a4b111574de00afe4fad24e7668d8b7975490600090a350949350505050565b604080516002808252606080830184529283929190602083019080368337019050509050826001600160a01b0316636cc25db76040518163ffffffff1660e01b815260040160206040518083038186803b158015610c2957600080fd5b505afa158015610c3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c619190611018565b81600081518110610c6e57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050826001600160a01b031663500db70d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610cc757600080fd5b505afa158015610cdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cff9190611018565b81600181518110610d0c57fe5b6001600160a01b03909216602092830291909101909101529050919050565b6000600160801b8210610d595760405162461bcd60e51b8152600401610d50906113bb565b60405180910390fd5b5090565b600082601f830112610d6d578081fd5b813567ffffffffffffffff811115610d83578182fd5b6020610d928182840201611402565b8281529250808301848201606080850287018401881015610db257600080fd5b60005b85811015610dd957610dc78984610fab565b84529284019291810191600101610db5565b50505050505092915050565b80358015158114610df557600080fd5b92915050565b8035610df581611429565b600082601f830112610e16578081fd5b813567ffffffffffffffff811115610e2c578182fd5b610e3f601f8201601f1916602001611402565b9150808252836020828501011115610e5657600080fd5b8060208401602084013760009082016020015292915050565b6000610180808385031215610e82578182fd5b610e8b81611402565b915050610e988383610dfb565b81526020820135602082015260408201356040820152606082013567ffffffffffffffff80821115610ec957600080fd5b610ed585838601610e06565b60608401526080840135915080821115610eee57600080fd5b610efa85838601610e06565b608084015260a0840135915080821115610f1357600080fd5b610f1f85838601610e06565b60a084015260c0840135915080821115610f3857600080fd5b610f4485838601610e06565b60c084015260e084810135908401526101008085013590840152610120808501359084015261014091508184013581811115610f7f57600080fd5b610f8b86828701610d5d565b83850152505050610160610fa184828501610de5565b9082015292915050565b600060608284031215610fbc578081fd5b610fc66060611402565b90508135610fd381611429565b8152602082013561ffff81168114610fea57600080fd5b6020820152610ffc8360408401611007565b604082015292915050565b803560ff81168114610df557600080fd5b600060208284031215611029578081fd5b815161103481611429565b9392505050565b60008060008385036080811215611050578283fd5b604081121561105d578283fd5b506110686040611402565b843561107381611429565b8152602085810135908201529250604084013567ffffffffffffffff81111561109a578283fd5b6110a686828701610e6f565b9250506110b68560608601611007565b90509250925092565b600080600083850360808112156110d4578182fd5b60408112156110e1578182fd5b506110ec6040611402565b84356110f781611429565b8152602085810135908201529250604084013567ffffffffffffffff81111561109a578182fd5b6001600160a01b03169052565b6000815180845260208085019450808401835b838110156111635781516001600160a01b03168752958201959082019060010161113e565b509495945050505050565b6000815180845260208085019450808401835b8381101561116357815180516001600160a01b031688528381015161ffff168489015260409081015160ff169088015260609096019590820190600101611181565b15159052565b60008151808452815b818110156111ee576020818501810151868301820152016111d2565b818111156111ff5782602083870101525b50601f01601f19169290920160200192915050565b600061018061122484845161111e565b6020830151602085015260408301516040850152606083015181606086015261124f828601826111c9565b9150506080830151848203608086015261126982826111c9565b91505060a083015184820360a086015261128382826111c9565b91505060c083015184820360c086015261129d82826111c9565b91505060e083015160e085015261010080840151818601525061012080840151818601525061014080840151858303828701526112da838261116e565b92505050610160808401516112f1828701826111c3565b5090949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b039390931683526fffffffffffffffffffffffffffffffff918216602084015216604082015260600190565b600060018060a01b038087168352608060208401526113646080840187611214565b60ff959095166040840152929092166060909101525092915050565b600060018060a01b038087168352608060208401526113a2608084018761112b565b6040840195909552929092166060909101525092915050565b60208082526027908201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316040820152663238206269747360c81b606082015260800190565b60405181810167ffffffffffffffff8111828210171561142157600080fd5b604052919050565b6001600160a01b038116811461143e57600080fd5b5056fea26469706673582212201ba973f8cae0fa827d6823dbcba98d90d9f84f125659a922b55e1d2c66b148fa64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x88 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8F0A6B36 GT PUSH2 0x5B JUMPI DUP1 PUSH4 0x8F0A6B36 EQ PUSH2 0xCE JUMPI DUP1 PUSH4 0xB77B59D0 EQ PUSH2 0xD6 JUMPI DUP1 PUSH4 0xC4844272 EQ PUSH2 0xDE JUMPI DUP1 PUSH4 0xDC71362B EQ PUSH2 0xF1 JUMPI PUSH2 0x88 JUMP JUMPDEST DUP1 PUSH4 0x83D9144 EQ PUSH2 0x8D JUMPI DUP1 PUSH4 0x3327717D EQ PUSH2 0xB6 JUMPI DUP1 PUSH4 0x802125F5 EQ PUSH2 0xBE JUMPI DUP1 PUSH4 0x8E71C1F6 EQ PUSH2 0xC6 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA0 PUSH2 0x9B CALLDATASIZE PUSH1 0x4 PUSH2 0x103B JUMP JUMPDEST PUSH2 0x104 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xAD SWAP2 SWAP1 PUSH2 0x12FB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xA0 PUSH2 0x483 JUMP JUMPDEST PUSH2 0xA0 PUSH2 0x492 JUMP JUMPDEST PUSH2 0xA0 PUSH2 0x4A1 JUMP JUMPDEST PUSH2 0xA0 PUSH2 0x4B0 JUMP JUMPDEST PUSH2 0xA0 PUSH2 0x4BF JUMP JUMPDEST PUSH2 0xA0 PUSH2 0xEC CALLDATASIZE PUSH1 0x4 PUSH2 0x10BF JUMP JUMPDEST PUSH2 0x4CE JUMP JUMPDEST PUSH2 0xA0 PUSH2 0xFF CALLDATASIZE PUSH1 0x4 PUSH2 0x10BF JUMP JUMPDEST PUSH2 0x84D JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xEFC81A8C PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x157 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x16B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x18F SWAP2 SWAP1 PUSH2 0x1018 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH4 0xB77F3BCB PUSH1 0xE0 SHL DUP2 MSTORE SWAP3 SWAP4 POP PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0xB77F3BCB SWAP2 PUSH2 0x1CA SWAP2 DUP7 SWAP2 DUP11 SWAP2 DUP11 SWAP2 CALLER SWAP2 ADD PUSH2 0x1342 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1F8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x21C SWAP2 SWAP1 PUSH2 0x1018 JUMP JUMPDEST PUSH1 0x0 SLOAD SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP2 PUSH4 0xC5871485 SWAP2 AND PUSH2 0x23E DUP5 PUSH2 0xBCC JUMP JUMPDEST PUSH1 0x20 DUP11 ADD MLOAD DUP11 MLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH1 0xE0 DUP8 SWAP1 SHL AND DUP2 MSTORE PUSH2 0x269 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x1380 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x283 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x297 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH4 0x48E52407 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP3 POP PUSH4 0x91CA480E SWAP2 POP PUSH2 0x2C7 SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH2 0x12FB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2F5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xA7B2CC31 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x6CC25DB7 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x341 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x355 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x379 SWAP2 SWAP1 PUSH2 0x1018 JUMP JUMPDEST PUSH2 0x387 DUP9 PUSH2 0x100 ADD MLOAD PUSH2 0xD2B JUMP JUMPDEST PUSH2 0x394 DUP10 PUSH1 0xE0 ADD MLOAD PUSH2 0xD2B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3B2 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x130F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3E0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH4 0xF2FDE38B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP3 POP PUSH4 0xF2FDE38B SWAP2 POP PUSH2 0x410 SWAP1 CALLER SWAP1 PUSH1 0x4 ADD PUSH2 0x12FB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x42A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x43E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP4 POP DUP6 AND SWAP2 POP PUSH32 0x42714BC68C7250EBBA24F4CF6FF0E97AFDDEC794459EE3D050081BD7FBC3D65E SWAP1 PUSH1 0x0 SWAP1 LOG3 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x3 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xEFC81A8C PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x521 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x535 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x559 SWAP2 SWAP1 PUSH2 0x1018 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH4 0xB77F3BCB PUSH1 0xE0 SHL DUP2 MSTORE SWAP3 SWAP4 POP PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0xB77F3BCB SWAP2 PUSH2 0x594 SWAP2 DUP7 SWAP2 DUP11 SWAP2 DUP11 SWAP2 CALLER SWAP2 ADD PUSH2 0x1342 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x5C2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x5E6 SWAP2 SWAP1 PUSH2 0x1018 JUMP JUMPDEST PUSH1 0x0 SLOAD SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP2 PUSH4 0xC5871485 SWAP2 AND PUSH2 0x608 DUP5 PUSH2 0xBCC JUMP JUMPDEST PUSH1 0x20 DUP11 ADD MLOAD DUP11 MLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH1 0xE0 DUP8 SWAP1 SHL AND DUP2 MSTORE PUSH2 0x633 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x1380 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x64D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x661 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH4 0x48E52407 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP3 POP PUSH4 0x91CA480E SWAP2 POP PUSH2 0x691 SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH2 0x12FB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x6BF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xA7B2CC31 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x6CC25DB7 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x70B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x71F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x743 SWAP2 SWAP1 PUSH2 0x1018 JUMP JUMPDEST PUSH2 0x751 DUP9 PUSH2 0x100 ADD MLOAD PUSH2 0xD2B JUMP JUMPDEST PUSH2 0x75E DUP10 PUSH1 0xE0 ADD MLOAD PUSH2 0xD2B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x77C SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x130F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x796 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x7AA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH4 0xF2FDE38B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP3 POP PUSH4 0xF2FDE38B SWAP2 POP PUSH2 0x7DA SWAP1 CALLER SWAP1 PUSH1 0x4 ADD PUSH2 0x12FB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x7F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x808 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP4 POP DUP6 AND SWAP2 POP PUSH32 0x1633CCB3D787C0C7E5C7B5EB77604C85E70614EEEF4F64551AB0044CD9925D0E SWAP1 PUSH1 0x0 SWAP1 LOG3 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xEFC81A8C PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x8A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8B4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x8D8 SWAP2 SWAP1 PUSH2 0x1018 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH4 0xB77F3BCB PUSH1 0xE0 SHL DUP2 MSTORE SWAP3 SWAP4 POP PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0xB77F3BCB SWAP2 PUSH2 0x913 SWAP2 DUP7 SWAP2 DUP11 SWAP2 DUP11 SWAP2 CALLER SWAP2 ADD PUSH2 0x1342 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x92D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x941 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x965 SWAP2 SWAP1 PUSH2 0x1018 JUMP JUMPDEST PUSH1 0x0 SLOAD SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP2 PUSH4 0xCFA24007 SWAP2 AND PUSH2 0x987 DUP5 PUSH2 0xBCC JUMP JUMPDEST PUSH1 0x20 DUP11 ADD MLOAD DUP11 MLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH1 0xE0 DUP8 SWAP1 SHL AND DUP2 MSTORE PUSH2 0x9B2 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x1380 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x9CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x9E0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH4 0x48E52407 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP3 POP PUSH4 0x91CA480E SWAP2 POP PUSH2 0xA10 SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH2 0x12FB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA2A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA3E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xA7B2CC31 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x6CC25DB7 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA8A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xA9E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xAC2 SWAP2 SWAP1 PUSH2 0x1018 JUMP JUMPDEST PUSH2 0xAD0 DUP9 PUSH2 0x100 ADD MLOAD PUSH2 0xD2B JUMP JUMPDEST PUSH2 0xADD DUP10 PUSH1 0xE0 ADD MLOAD PUSH2 0xD2B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xAFB SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x130F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB29 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH4 0xF2FDE38B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP3 POP PUSH4 0xF2FDE38B SWAP2 POP PUSH2 0xB59 SWAP1 CALLER SWAP1 PUSH1 0x4 ADD PUSH2 0x12FB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB73 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB87 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP4 POP DUP6 AND SWAP2 POP PUSH32 0x63EABE842A4CA0FA63657803AE342A4B111574DE00AFE4FAD24E7668D8B79754 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 DUP1 DUP3 MSTORE PUSH1 0x60 DUP1 DUP4 ADD DUP5 MSTORE SWAP3 DUP4 SWAP3 SWAP2 SWAP1 PUSH1 0x20 DUP4 ADD SWAP1 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP POP SWAP1 POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x6CC25DB7 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC29 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xC3D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xC61 SWAP2 SWAP1 PUSH2 0x1018 JUMP JUMPDEST DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0xC6E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x500DB70D PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xCDB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xCFF SWAP2 SWAP1 PUSH2 0x1018 JUMP JUMPDEST DUP2 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0xD0C JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0xD59 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xD50 SWAP1 PUSH2 0x13BB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xD6D JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xD83 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 PUSH2 0xD92 DUP2 DUP3 DUP5 MUL ADD PUSH2 0x1402 JUMP JUMPDEST DUP3 DUP2 MSTORE SWAP3 POP DUP1 DUP4 ADD DUP5 DUP3 ADD PUSH1 0x60 DUP1 DUP6 MUL DUP8 ADD DUP5 ADD DUP9 LT ISZERO PUSH2 0xDB2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP6 DUP2 LT ISZERO PUSH2 0xDD9 JUMPI PUSH2 0xDC7 DUP10 DUP5 PUSH2 0xFAB JUMP JUMPDEST DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP2 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xDB5 JUMP JUMPDEST POP POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xDF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH2 0xDF5 DUP2 PUSH2 0x1429 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xE16 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xE2C JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xE3F PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD PUSH2 0x1402 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0xE56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xE82 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xE8B DUP2 PUSH2 0x1402 JUMP JUMPDEST SWAP2 POP POP PUSH2 0xE98 DUP4 DUP4 PUSH2 0xDFB JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xEC9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xED5 DUP6 DUP4 DUP7 ADD PUSH2 0xE06 JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP5 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xEEE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xEFA DUP6 DUP4 DUP7 ADD PUSH2 0xE06 JUMP JUMPDEST PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0xA0 DUP5 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xF13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF1F DUP6 DUP4 DUP7 ADD PUSH2 0xE06 JUMP JUMPDEST PUSH1 0xA0 DUP5 ADD MSTORE PUSH1 0xC0 DUP5 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xF38 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF44 DUP6 DUP4 DUP7 ADD PUSH2 0xE06 JUMP JUMPDEST PUSH1 0xC0 DUP5 ADD MSTORE PUSH1 0xE0 DUP5 DUP2 ADD CALLDATALOAD SWAP1 DUP5 ADD MSTORE PUSH2 0x100 DUP1 DUP6 ADD CALLDATALOAD SWAP1 DUP5 ADD MSTORE PUSH2 0x120 DUP1 DUP6 ADD CALLDATALOAD SWAP1 DUP5 ADD MSTORE PUSH2 0x140 SWAP2 POP DUP2 DUP5 ADD CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0xF7F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF8B DUP7 DUP3 DUP8 ADD PUSH2 0xD5D JUMP JUMPDEST DUP4 DUP6 ADD MSTORE POP POP POP PUSH2 0x160 PUSH2 0xFA1 DUP5 DUP3 DUP6 ADD PUSH2 0xDE5 JUMP JUMPDEST SWAP1 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xFBC JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0xFC6 PUSH1 0x60 PUSH2 0x1402 JUMP JUMPDEST SWAP1 POP DUP2 CALLDATALOAD PUSH2 0xFD3 DUP2 PUSH2 0x1429 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH2 0xFFFF DUP2 AND DUP2 EQ PUSH2 0xFEA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0xFFC DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x1007 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0xDF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1029 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x1034 DUP2 PUSH2 0x1429 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 DUP6 SUB PUSH1 0x80 DUP2 SLT ISZERO PUSH2 0x1050 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x40 DUP2 SLT ISZERO PUSH2 0x105D JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x1068 PUSH1 0x40 PUSH2 0x1402 JUMP JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1073 DUP2 PUSH2 0x1429 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP6 DUP2 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE SWAP3 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x109A JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x10A6 DUP7 DUP3 DUP8 ADD PUSH2 0xE6F JUMP JUMPDEST SWAP3 POP POP PUSH2 0x10B6 DUP6 PUSH1 0x60 DUP7 ADD PUSH2 0x1007 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 DUP6 SUB PUSH1 0x80 DUP2 SLT ISZERO PUSH2 0x10D4 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x40 DUP2 SLT ISZERO PUSH2 0x10E1 JUMPI DUP2 DUP3 REVERT JUMPDEST POP PUSH2 0x10EC PUSH1 0x40 PUSH2 0x1402 JUMP JUMPDEST DUP5 CALLDATALOAD PUSH2 0x10F7 DUP2 PUSH2 0x1429 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP6 DUP2 ADD CALLDATALOAD SWAP1 DUP3 ADD MSTORE SWAP3 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x109A JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP1 DUP6 ADD SWAP5 POP DUP1 DUP5 ADD DUP4 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1163 JUMPI DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 MSTORE SWAP6 DUP3 ADD SWAP6 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x113E JUMP JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x20 DUP1 DUP6 ADD SWAP5 POP DUP1 DUP5 ADD DUP4 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1163 JUMPI DUP2 MLOAD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP9 MSTORE DUP4 DUP2 ADD MLOAD PUSH2 0xFFFF AND DUP5 DUP10 ADD MSTORE PUSH1 0x40 SWAP1 DUP2 ADD MLOAD PUSH1 0xFF AND SWAP1 DUP9 ADD MSTORE PUSH1 0x60 SWAP1 SWAP7 ADD SWAP6 SWAP1 DUP3 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1181 JUMP JUMPDEST ISZERO ISZERO SWAP1 MSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x11EE JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x11D2 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x11FF JUMPI DUP3 PUSH1 0x20 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 PUSH2 0x1224 DUP5 DUP5 MLOAD PUSH2 0x111E JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP4 ADD MLOAD DUP2 PUSH1 0x60 DUP7 ADD MSTORE PUSH2 0x124F DUP3 DUP7 ADD DUP3 PUSH2 0x11C9 JUMP JUMPDEST SWAP2 POP POP PUSH1 0x80 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0x80 DUP7 ADD MSTORE PUSH2 0x1269 DUP3 DUP3 PUSH2 0x11C9 JUMP JUMPDEST SWAP2 POP POP PUSH1 0xA0 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0xA0 DUP7 ADD MSTORE PUSH2 0x1283 DUP3 DUP3 PUSH2 0x11C9 JUMP JUMPDEST SWAP2 POP POP PUSH1 0xC0 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH1 0xC0 DUP7 ADD MSTORE PUSH2 0x129D DUP3 DUP3 PUSH2 0x11C9 JUMP JUMPDEST SWAP2 POP POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH1 0xE0 DUP6 ADD MSTORE PUSH2 0x100 DUP1 DUP5 ADD MLOAD DUP2 DUP7 ADD MSTORE POP PUSH2 0x120 DUP1 DUP5 ADD MLOAD DUP2 DUP7 ADD MSTORE POP PUSH2 0x140 DUP1 DUP5 ADD MLOAD DUP6 DUP4 SUB DUP3 DUP8 ADD MSTORE PUSH2 0x12DA DUP4 DUP3 PUSH2 0x116E JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x160 DUP1 DUP5 ADD MLOAD PUSH2 0x12F1 DUP3 DUP8 ADD DUP3 PUSH2 0x11C3 JUMP JUMPDEST POP SWAP1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND DUP4 MSTORE PUSH1 0x80 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x1364 PUSH1 0x80 DUP5 ADD DUP8 PUSH2 0x1214 JUMP JUMPDEST PUSH1 0xFF SWAP6 SWAP1 SWAP6 AND PUSH1 0x40 DUP5 ADD MSTORE SWAP3 SWAP1 SWAP3 AND PUSH1 0x60 SWAP1 SWAP2 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND DUP4 MSTORE PUSH1 0x80 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x13A2 PUSH1 0x80 DUP5 ADD DUP8 PUSH2 0x112B JUMP JUMPDEST PUSH1 0x40 DUP5 ADD SWAP6 SWAP1 SWAP6 MSTORE SWAP3 SWAP1 SWAP3 AND PUSH1 0x60 SWAP1 SWAP2 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x27 SWAP1 DUP3 ADD MSTORE PUSH32 0x53616665436173743A2076616C756520646F65736E27742066697420696E2031 PUSH1 0x40 DUP3 ADD MSTORE PUSH7 0x32382062697473 PUSH1 0xC8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1421 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x143E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SHL 0xA9 PUSH20 0xF8CAE0FA827D6823DBCBA98D90D9F84F125659A9 0x22 0xB5 0x5E SAR 0x2C PUSH7 0xB148FA64736F6C PUSH4 0x4300060C STOP CALLER ",
              "sourceMap": "533:5997:34:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3008:1047;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1688:60;;;:::i;1542:66::-;;;:::i;1498:40::-;;;:::i;1612:72::-;;;:::i;1752:52::-;;;:::i;5136:1011::-;;;;;;:::i;:::-;;:::i;4059:1073::-;;;;;;:::i;:::-;;:::i;3008:1047::-;3218:17;3243:27;3273:29;;;;;;;;;-1:-1:-1;;;;;3273:29:34;-1:-1:-1;;;;;3273:36:34;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3349:22;;;:128;;-1:-1:-1;;;3349:128:34;;3243:68;;-1:-1:-1;3317:29:34;;-1:-1:-1;;;;;3349:22:34;;;;:44;;:128;;3243:68;;3418:19;;3445:8;;3461:10;;3349:128;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3511:15;;3317:160;;-1:-1:-1;;;;;;3483:20:34;;;;;;3511:15;3534:22;3317:160;3534:7;:22::i;:::-;3564:34;;;;3622:22;;3483:168;;-1:-1:-1;;;;;;3483:168:34;;;;;;;;;;;3564:34;3622:22;3483:168;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3657:41:34;;-1:-1:-1;;;3657:41:34;;-1:-1:-1;;;;;3657:26:34;;;-1:-1:-1;3657:26:34;;-1:-1:-1;3657:41:34;;3684:13;;3657:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3704:9;-1:-1:-1;;;;;3704:25:34;;3745:13;-1:-1:-1;;;;;3745:20:34;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3776:56;:19;:44;;;:54;:56::i;:::-;3840:57;:19;:45;;;:55;:57::i;:::-;3704:199;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3909:39:34;;-1:-1:-1;;;3909:39:34;;-1:-1:-1;;;;;3909:27:34;;;-1:-1:-1;3909:27:34;;-1:-1:-1;3909:39:34;;3937:10;;3909:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3959:69:34;;-1:-1:-1;;;;;3959:69:34;;;;-1:-1:-1;3959:69:34;;;-1:-1:-1;3959:69:34;;;;;-1:-1:-1;4041:9:34;3008:1047;-1:-1:-1;;;;3008:1047:34:o;1688:60::-;;;-1:-1:-1;;;;;1688:60:34;;:::o;1542:66::-;;;-1:-1:-1;;;;;1542:66:34;;:::o;1498:40::-;;;-1:-1:-1;;;;;1498:40:34;;:::o;1612:72::-;;;-1:-1:-1;;;;;1612:72:34;;:::o;1752:52::-;;;-1:-1:-1;;;;;1752:52:34;;:::o;5136:1011::-;5340:14;5362:24;5389:26;;;;;;;;;-1:-1:-1;;;;;5389:26:34;-1:-1:-1;;;;;5389:33:34;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5462:22;;;:128;;-1:-1:-1;;;5462:128:34;;5362:62;;-1:-1:-1;5430:29:34;;-1:-1:-1;;;;;5462:22:34;;;;:44;;:128;;5362:62;;5531:19;;5558:8;;5574:10;;5462:128;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5624:15;;5430:160;;-1:-1:-1;;;;;;5596:20:34;;;;;;5624:15;5647:22;5430:160;5647:7;:22::i;:::-;5677:34;;;;5719:21;;5596:150;;-1:-1:-1;;;;;;5596:150:34;;;;;;;;;;;5677:34;5719:21;5596:150;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5752:41:34;;-1:-1:-1;;;5752:41:34;;-1:-1:-1;;;;;5752:26:34;;;-1:-1:-1;5752:26:34;;-1:-1:-1;5752:41:34;;5779:13;;5752:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5799:9;-1:-1:-1;;;;;5799:25:34;;5840:13;-1:-1:-1;;;;;5840:20:34;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5871:56;:19;:44;;;:54;:56::i;:::-;5935:57;:19;:45;;;:55;:57::i;:::-;5799:199;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6004:39:34;;-1:-1:-1;;;6004:39:34;;-1:-1:-1;;;;;6004:27:34;;;-1:-1:-1;6004:27:34;;-1:-1:-1;6004:39:34;;6032:10;;6004:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6054:66:34;;-1:-1:-1;;;;;6054:66:34;;;;-1:-1:-1;6054:66:34;;;-1:-1:-1;6054:66:34;;;;;-1:-1:-1;6133:9:34;5136:1011;-1:-1:-1;;;;5136:1011:34:o;4059:1073::-;4275:20;4303:30;4336:32;;;;;;;;;-1:-1:-1;;;;;4336:32:34;-1:-1:-1;;;;;4336:39:34;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4415:22;;;:128;;-1:-1:-1;;;4415:128:34;;4303:74;;-1:-1:-1;4383:29:34;;-1:-1:-1;;;;;4415:22:34;;;;:44;;:128;;4303:74;;4484:19;;4511:8;;4527:10;;4415:128;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4597:15;;4383:160;;-1:-1:-1;;;;;;4549:40:34;;;;;;4597:15;4620:22;4383:160;4620:7;:22::i;:::-;4650:34;;;;4692:27;;4549:176;;-1:-1:-1;;;;;;4549:176:34;;;;;;;;;;;4650:34;4692:27;4549:176;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4731:41:34;;-1:-1:-1;;;4731:41:34;;-1:-1:-1;;;;;4731:26:34;;;-1:-1:-1;4731:26:34;;-1:-1:-1;4731:41:34;;4758:13;;4731:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4778:9;-1:-1:-1;;;;;4778:25:34;;4819:13;-1:-1:-1;;;;;4819:20:34;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4850:56;:19;:44;;;:54;:56::i;:::-;4914:57;:19;:45;;;:55;:57::i;:::-;4778:199;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4983:39:34;;-1:-1:-1;;;4983:39:34;;-1:-1:-1;;;;;4983:27:34;;;-1:-1:-1;4983:27:34;;-1:-1:-1;4983:39:34;;5011:10;;4983:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5033:72:34;;-1:-1:-1;;;;;5033:72:34;;;;-1:-1:-1;5033:72:34;;;-1:-1:-1;5033:72:34;;;;;-1:-1:-1;5118:9:34;4059:1073;-1:-1:-1;;;;4059:1073:34:o;6151:376::-;6309:33;;;6340:1;6309:33;;;6225;6309;;;;;6225;;;6309;6340:1;6309:33;;;;;;;;;;-1:-1:-1;6309:33:34;6266:76;;6393:16;-1:-1:-1;;;;;6393:23:34;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6348:6;6355:1;6348:9;;;;;;;;;;;;;:72;-1:-1:-1;;;;;6348:72:34;;;-1:-1:-1;;;;;6348:72:34;;;;;6471:16;-1:-1:-1;;;;;6471:28:34;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6426:6;6433:1;6426:9;;;;;;;;-1:-1:-1;;;;;6426:77:34;;;:9;;;;;;;;;;;:77;6516:6;-1:-1:-1;6151:376:34;;;:::o;1097:181:24:-;1154:7;-1:-1:-1;;;1181:5:24;:14;1173:67;;;;-1:-1:-1;;;1173:67:24;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;1265:5:24;1097:181::o;187:812:-1:-;;339:3;332:4;324:6;320:17;316:27;306:2;;-1:-1;;347:12;306:2;394:6;381:20;33147:18;33139:6;33136:30;33133:2;;;-1:-1;;33169:12;33133:2;33214:4;416:115;33214:4;;33206:6;33202:17;33267:15;416:115;:::i;:::-;559:21;;;407:124;-1:-1;616:14;;;591:17;;;717:4;705:17;;;696:27;;;;693:36;-1:-1;690:2;;;742:1;;732:12;690:2;767:1;752:241;777:6;774:1;771:13;752:241;;;857:72;925:3;913:10;857:72;:::i;:::-;845:85;;944:14;;;;972;;;;799:1;792:9;752:241;;;756:14;;;;;;299:700;;;;:::o;1007:124::-;1071:20;;35695:13;;35688:21;43029:32;;43019:2;;43075:1;;43065:12;43019:2;1056:75;;;;:::o;2268:172::-;2356:20;;2381:54;2356:20;2381:54;:::i;3025:442::-;;3127:3;3120:4;3112:6;3108:17;3104:27;3094:2;;-1:-1;;3135:12;3094:2;3182:6;3169:20;33443:18;33435:6;33432:30;33429:2;;;-1:-1;;33465:12;33429:2;3204:65;33538:9;33519:17;;-1:-1;;33515:33;33606:4;33596:15;3204:65;:::i;:::-;3195:74;;3289:6;3282:5;3275:21;3393:3;33606:4;3384:6;3317;3375:16;;3372:25;3369:2;;;3410:1;;3400:12;3369:2;42395:6;33606:4;3317:6;3313:17;33606:4;3351:5;3347:16;42372:30;42451:1;42433:16;;;33606:4;42433:16;42426:27;3351:5;3087:380;-1:-1;;3087:380::o;4131:2638::-;;4259:6;;4247:9;4242:3;4238:19;4234:32;4231:2;;;-1:-1;;4269:12;4231:2;4297:22;4259:6;4297:22;:::i;:::-;4288:31;;;4407:70;4473:3;4449:22;4407:70;:::i;:::-;4389:16;4382:96;4551:2;4609:9;4605:22;8852:20;4551:2;4570:5;4566:16;4559:75;4709:2;4767:9;4763:22;8852:20;4709:2;4728:5;4724:16;4717:75;4887:2;4876:9;4872:18;4859:32;4911:18;;4903:6;4900:30;4897:2;;;4375:1;;4933:12;4897:2;4978:59;5033:3;5024:6;5013:9;5009:22;4978:59;:::i;:::-;4887:2;4964:5;4960:16;4953:85;5135:3;5124:9;5120:19;5107:33;5093:47;;4911:18;5152:6;5149:30;5146:2;;;4375:1;;5182:12;5146:2;5227:59;5282:3;5273:6;5262:9;5258:22;5227:59;:::i;:::-;5135:3;5213:5;5209:16;5202:85;5387:3;5376:9;5372:19;5359:33;5345:47;;4911:18;5404:6;5401:30;5398:2;;;4375:1;;5434:12;5398:2;5479:59;5534:3;5525:6;5514:9;5510:22;5479:59;:::i;:::-;5387:3;5465:5;5461:16;5454:85;5641:3;5630:9;5626:19;5613:33;5599:47;;4911:18;5658:6;5655:30;5652:2;;;4375:1;;5688:12;5652:2;5733:59;5788:3;5779:6;5768:9;5764:22;5733:59;:::i;:::-;5641:3;5715:16;;5708:85;5875:3;5930:22;;;8852:20;5891:16;;;5884:75;6040:3;6097:22;;;8852:20;6056:18;;;6049:77;6198:3;6255:22;;;8852:20;6214:18;;;6207:77;6380:3;;-1:-1;6365:19;;;6352:33;6394:30;;;6391:2;;;4375:1;;6427:12;6391:2;6474:109;6579:3;6570:6;6559:9;6555:22;6474:109;:::i;:::-;6380:3;6458:5;6454:18;6447:137;;;;6665:3;6701:46;6743:3;6665;6723:9;6719:22;6701:46;:::i;:::-;6681:18;;;6674:74;6685:5;4225:2544;-1:-1;;4225:2544::o;6817:627::-;;6941:4;6929:9;6924:3;6920:19;6916:30;6913:2;;;-1:-1;;6949:12;6913:2;6977:20;6941:4;6977:20;:::i;:::-;6968:29;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;7056:75;;7198:2;7251:22;;8716:20;37015:6;37004:18;;44705:34;;44695:2;;-1:-1;;44743:12;44695:2;7198;7213:16;;7206:74;7375:47;7418:3;7342:2;7394:22;;7375:47;:::i;:::-;7342:2;7361:5;7357:16;7350:73;6907:537;;;;:::o;8922:126::-;8987:20;;37312:4;37301:16;;44950:33;;44940:2;;44997:1;;44987:12;9055:315;;9196:2;9184:9;9175:7;9171:23;9167:32;9164:2;;;-1:-1;;9202:12;9164:2;1433:6;1427:13;1445:59;1498:5;1445:59;:::i;:::-;9254:100;9158:212;-1:-1;;;9158:212::o;10983:734::-;;;;11187:9;11178:7;11174:23;11199:3;11174:23;11170:33;11167:2;;;-1:-1;;11206:12;11167:2;3673:4;3652:19;3648:30;3645:2;;;-1:-1;;3681:12;3645:2;;3709:20;3673:4;3709:20;:::i;:::-;1242:6;1229:20;1254:57;1305:5;1254:57;:::i;:::-;3788:99;;3962:2;4016:22;;;8852:20;3977:16;;;3970:75;3795:16;-1:-1;3673:4;11412:18;;11399:32;11451:18;11440:30;;11437:2;;;-1:-1;;11473:12;11437:2;11503:92;11587:7;11578:6;11567:9;11563:22;11503:92;:::i;:::-;11493:102;;;11650:51;11693:7;11632:2;11673:9;11669:22;11650:51;:::i;:::-;11640:61;;11161:556;;;;;:::o;11724:728::-;;;;11925:9;11916:7;11912:23;11937:3;11912:23;11908:33;11905:2;;;-1:-1;;11944:12;11905:2;7643:4;7622:19;7618:30;7615:2;;;-1:-1;;7651:12;7615:2;;7679:20;7643:4;7679:20;:::i;:::-;1622:6;1609:20;1634:59;1687:5;1634:59;:::i;:::-;7757:101;;7933:2;7987:22;;;8852:20;7948:16;;;7941:75;7764:16;-1:-1;7643:4;12147:18;;12134:32;12186:18;12175:30;;12172:2;;;-1:-1;;12208:12;13927:103;-1:-1;;;;;37096:54;13988:37;;13982:48::o;14214:860::-;;14475:5;34150:12;34929:6;34924:3;34917:19;34966:4;;34961:3;34957:14;14487:93;;34966:4;14685:5;33777:14;-1:-1;14724:328;14749:6;14746:1;14743:13;14724:328;;;14810:13;;-1:-1;;;;;37096:54;16321:74;;13428:14;;;;34622;;;;33147:18;14764:9;14724:328;;;-1:-1;15058:10;;14372:702;-1:-1;;;;;14372:702::o;15167:950::-;;15455:5;34150:12;34929:6;34924:3;34917:19;34966:4;;34961:3;34957:14;15467:118;;34966:4;15691:5;33777:14;-1:-1;15730:365;15755:6;15752:1;15749:13;15730:365;;;15816:13;;22734:23;;-1:-1;;;;;37096:54;13988:37;;22900:16;;;22894:23;37015:6;37004:18;22969:14;;;23342:36;23064:4;23053:16;;;23047:23;37312:4;37301:16;23120:14;;;23677:35;13759:4;13750:14;;;;34622;;;;33147:18;15770:9;15730:365;;16125:94;35695:13;35688:21;16180:34;;16174:45::o;18870:327::-;;19005:5;34150:12;34929:6;34924:3;34917:19;-1:-1;42540:101;42554:6;42551:1;42548:13;42540:101;;;34966:4;42621:11;;;;;42615:18;42602:11;;;;;42595:39;42569:10;42540:101;;;42656:6;42653:1;42650:13;42647:2;;;-1:-1;34966:4;42712:6;34961:3;42703:16;;42696:27;42647:2;-1:-1;33538:9;42812:14;-1:-1;;42808:28;19153:39;;;;34966:4;19153:39;;18952:245;-1:-1;;18952:245::o;19702:2725::-;;19881:6;19984:84;20053:14;19961:16;19955:23;19984:84;:::i;:::-;20159:4;20152:5;20148:16;20142:23;20159:4;20223:3;20219:14;23451:37;20327:4;20320:5;20316:16;20310:23;20327:4;20391:3;20387:14;23451:37;20487:4;20480:5;20476:16;20470:23;19881:6;20487:4;20517:3;20513:14;20506:38;20559:73;19881:6;19876:3;19872:16;20613:12;20559:73;:::i;:::-;20551:81;;;20725:4;20718:5;20714:16;20708:23;20777:3;20771:4;20767:14;20725:4;20755:3;20751:14;20744:38;20797:73;20865:4;20851:12;20797:73;:::i;:::-;20789:81;;;20966:4;20959:5;20955:16;20949:23;21018:3;21012:4;21008:14;20966:4;20996:3;20992:14;20985:38;21038:73;21106:4;21092:12;21038:73;:::i;:::-;21030:81;;;21209:4;21202:5;21198:16;21192:23;21261:3;21255:4;21251:14;21209:4;21239:3;21235:14;21228:38;21281:73;21349:4;21335:12;21281:73;:::i;:::-;21273:81;;;21460:4;21453:5;21449:16;21443:23;21460:4;21524:3;21520:14;23451:37;21634:6;;21627:5;21623:18;21617:25;21634:6;21700:3;21696:16;23451:37;;21803:6;;21796:5;21792:18;21786:25;21803:6;21869:3;21865:16;23451:37;;21968:6;;21961:5;21957:18;21951:25;22024:3;22018:4;22014:14;21968:6;22000:3;21996:16;21989:40;22044:173;22212:4;22198:12;22044:173;:::i;:::-;22036:181;;;;22322:6;;22315:5;22311:18;22305:25;22336:59;22322:6;22382:3;22378:16;22364:12;22336:59;:::i;:::-;-1:-1;22411:11;;19854:2573;-1:-1;;;;19854:2573::o;23838:238::-;-1:-1;;;;;37096:54;;;;13857:58;;23973:2;23958:18;;23944:132::o;24083:444::-;-1:-1;;;;;37096:54;;;;13988:37;;36896:34;36885:46;;;24430:2;24415:18;;23234:37;36885:46;24513:2;24498:18;;23234:37;24266:2;24251:18;;24237:290::o;25120:820::-;;33147:18;;37107:42;;;;35611:5;37096:54;16328:3;16321:74;25439:3;25584:2;25573:9;25569:18;25562:48;25624:136;25439:3;25428:9;25424:19;25746:6;25624:136;:::i;:::-;37312:4;37301:16;;;;25835:2;25820:18;;23677:35;37096:54;;;;25926:2;25911:18;;;13857:58;-1:-1;25616:144;25410:530;-1:-1;;25410:530::o;26800:874::-;;33147:18;;37107:42;;;;16388:5;37096:54;16328:3;16321:74;27146:3;27292:2;27281:9;27277:18;27270:48;27332:142;27146:3;27135:9;27131:19;27460:6;27332:142;:::i;:::-;27553:2;27538:18;;23451:37;;;;37096:54;;;;27660:2;27645:18;;;16321:74;-1:-1;27324:150;27117:557;-1:-1;;27117:557::o;32267:416::-;32467:2;32481:47;;;19429:2;32452:18;;;34917:19;19465:34;34957:14;;;19445:55;-1:-1;;;19520:12;;;19513:31;19563:12;;;32438:245::o;32690:256::-;32752:2;32746:9;32778:17;;;32853:18;32838:34;;32874:22;;;32835:62;32832:2;;;32910:1;;32900:12;32832:2;32752;32919:22;32730:216;;-1:-1;32730:216::o;42849:117::-;-1:-1;;;;;37096:54;;42908:35;;42898:2;;42957:1;;42947:12;42898:2;42892:74;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "1047800",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "compoundPrizePoolProxyFactory()": "1115",
                "createCompoundMultipleWinners((address,uint256),(address,uint256,uint256,string,string,string,string,uint256,uint256,uint256,(address,uint16,uint8)[],bool),uint8)": "infinite",
                "createStakeMultipleWinners((address,uint256),(address,uint256,uint256,string,string,string,string,uint256,uint256,uint256,(address,uint16,uint8)[],bool),uint8)": "infinite",
                "createYieldSourceMultipleWinners((address,uint256),(address,uint256,uint256,string,string,string,string,uint256,uint256,uint256,(address,uint16,uint8)[],bool),uint8)": "infinite",
                "multipleWinnersBuilder()": "1092",
                "reserveRegistry()": "1137",
                "stakePrizePoolProxyFactory()": "1093",
                "yieldSourcePrizePoolProxyFactory()": "1070"
              },
              "internal": {
                "_tokens(contract MultipleWinners)": "infinite"
              }
            },
            "methodIdentifiers": {
              "compoundPrizePoolProxyFactory()": "802125f5",
              "createCompoundMultipleWinners((address,uint256),(address,uint256,uint256,string,string,string,string,uint256,uint256,uint256,(address,uint16,uint8)[],bool),uint8)": "083d9144",
              "createStakeMultipleWinners((address,uint256),(address,uint256,uint256,string,string,string,string,uint256,uint256,uint256,(address,uint16,uint8)[],bool),uint8)": "c4844272",
              "createYieldSourceMultipleWinners((address,uint256),(address,uint256,uint256,string,string,string,string,uint256,uint256,uint256,(address,uint16,uint8)[],bool),uint8)": "dc71362b",
              "multipleWinnersBuilder()": "b77b59d0",
              "reserveRegistry()": "8e71c1f6",
              "stakePrizePoolProxyFactory()": "3327717d",
              "yieldSourcePrizePoolProxyFactory()": "8f0a6b36"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"_reserveRegistry\",\"type\":\"address\"},{\"internalType\":\"contract CompoundPrizePoolProxyFactory\",\"name\":\"_compoundPrizePoolProxyFactory\",\"type\":\"address\"},{\"internalType\":\"contract YieldSourcePrizePoolProxyFactory\",\"name\":\"_yieldSourcePrizePoolProxyFactory\",\"type\":\"address\"},{\"internalType\":\"contract StakePrizePoolProxyFactory\",\"name\":\"_stakePrizePoolProxyFactory\",\"type\":\"address\"},{\"internalType\":\"contract MultipleWinnersBuilder\",\"name\":\"_multipleWinnersBuilder\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract CompoundPrizePool\",\"name\":\"prizePool\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"contract MultipleWinners\",\"name\":\"prizeStrategy\",\"type\":\"address\"}],\"name\":\"CompoundPrizePoolWithMultipleWinnersCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract StakePrizePool\",\"name\":\"prizePool\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"contract MultipleWinners\",\"name\":\"prizeStrategy\",\"type\":\"address\"}],\"name\":\"StakePrizePoolWithMultipleWinnersCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract YieldSourcePrizePool\",\"name\":\"prizePool\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"contract MultipleWinners\",\"name\":\"prizeStrategy\",\"type\":\"address\"}],\"name\":\"YieldSourcePrizePoolWithMultipleWinnersCreated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"compoundPrizePoolProxyFactory\",\"outputs\":[{\"internalType\":\"contract CompoundPrizePoolProxyFactory\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"contract CTokenInterface\",\"name\":\"cToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxExitFeeMantissa\",\"type\":\"uint256\"}],\"internalType\":\"struct PoolWithMultipleWinnersBuilder.CompoundPrizePoolConfig\",\"name\":\"prizePoolConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"contract RNGInterface\",\"name\":\"rngService\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"prizePeriodStart\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prizePeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"ticketName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"ticketSymbol\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"sponsorshipName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"sponsorshipSymbol\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"ticketCreditLimitMantissa\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ticketCreditRateMantissa\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"numberOfWinners\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"}],\"internalType\":\"struct PrizeSplit.PrizeSplitConfig[]\",\"name\":\"prizeSplits\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"splitExternalErc20Awards\",\"type\":\"bool\"}],\"internalType\":\"struct MultipleWinnersBuilder.MultipleWinnersConfig\",\"name\":\"prizeStrategyConfig\",\"type\":\"tuple\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"}],\"name\":\"createCompoundMultipleWinners\",\"outputs\":[{\"internalType\":\"contract CompoundPrizePool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxExitFeeMantissa\",\"type\":\"uint256\"}],\"internalType\":\"struct PoolWithMultipleWinnersBuilder.StakePrizePoolConfig\",\"name\":\"prizePoolConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"contract RNGInterface\",\"name\":\"rngService\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"prizePeriodStart\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prizePeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"ticketName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"ticketSymbol\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"sponsorshipName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"sponsorshipSymbol\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"ticketCreditLimitMantissa\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ticketCreditRateMantissa\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"numberOfWinners\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"}],\"internalType\":\"struct PrizeSplit.PrizeSplitConfig[]\",\"name\":\"prizeSplits\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"splitExternalErc20Awards\",\"type\":\"bool\"}],\"internalType\":\"struct MultipleWinnersBuilder.MultipleWinnersConfig\",\"name\":\"prizeStrategyConfig\",\"type\":\"tuple\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"}],\"name\":\"createStakeMultipleWinners\",\"outputs\":[{\"internalType\":\"contract StakePrizePool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"contract IYieldSource\",\"name\":\"yieldSource\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxExitFeeMantissa\",\"type\":\"uint256\"}],\"internalType\":\"struct PoolWithMultipleWinnersBuilder.YieldSourcePrizePoolConfig\",\"name\":\"prizePoolConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"contract RNGInterface\",\"name\":\"rngService\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"prizePeriodStart\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prizePeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"ticketName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"ticketSymbol\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"sponsorshipName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"sponsorshipSymbol\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"ticketCreditLimitMantissa\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ticketCreditRateMantissa\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"numberOfWinners\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"}],\"internalType\":\"struct PrizeSplit.PrizeSplitConfig[]\",\"name\":\"prizeSplits\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"splitExternalErc20Awards\",\"type\":\"bool\"}],\"internalType\":\"struct MultipleWinnersBuilder.MultipleWinnersConfig\",\"name\":\"prizeStrategyConfig\",\"type\":\"tuple\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"}],\"name\":\"createYieldSourceMultipleWinners\",\"outputs\":[{\"internalType\":\"contract YieldSourcePrizePool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"multipleWinnersBuilder\",\"outputs\":[{\"internalType\":\"contract MultipleWinnersBuilder\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reserveRegistry\",\"outputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakePrizePoolProxyFactory\",\"outputs\":[{\"internalType\":\"contract StakePrizePoolProxyFactory\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"yieldSourcePrizePoolProxyFactory\",\"outputs\":[{\"internalType\":\"contract YieldSourcePrizePoolProxyFactory\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/builders/PoolWithMultipleWinnersBuilder.sol\":\"PoolWithMultipleWinnersBuilder\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.6.0;\\n\\n/// @title Random Number Generator Interface\\n/// @notice Provides an interface for requesting random numbers from 3rd-party RNG services (Chainlink VRF, Starkware VDF, etc..)\\ninterface RNGInterface {\\n\\n  /// @notice Emitted when a new request for a random number has been submitted\\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\\n  /// @param sender The indexed address of the sender of the request\\n  event RandomNumberRequested(uint32 indexed requestId, address indexed sender);\\n\\n  /// @notice Emitted when an existing request for a random number has been completed\\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\\n  /// @param randomNumber The random number produced by the 3rd-party service\\n  event RandomNumberCompleted(uint32 indexed requestId, uint256 randomNumber);\\n\\n  /// @notice Gets the last request id used by the RNG service\\n  /// @return requestId The last request id used in the last request\\n  function getLastRequestId() external view returns (uint32 requestId);\\n\\n  /// @notice Gets the Fee for making a Request against an RNG service\\n  /// @return feeToken The address of the token that is used to pay fees\\n  /// @return requestFee The fee required to be paid to make a request\\n  function getRequestFee() external view returns (address feeToken, uint256 requestFee);\\n\\n  /// @notice Sends a request for a random number to the 3rd-party service\\n  /// @dev Some services will complete the request immediately, others may have a time-delay\\n  /// @dev Some services require payment in the form of a token, such as $LINK for Chainlink VRF\\n  /// @return requestId The ID of the request used to get the results of the RNG service\\n  /// @return lockBlock The block number at which the RNG service will start generating time-delayed randomness.  The calling contract\\n  /// should \\\"lock\\\" all activity until the result is available via the `requestId`\\n  function requestRandomNumber() external returns (uint32 requestId, uint32 lockBlock);\\n\\n  /// @notice Checks if the request for randomness from the 3rd-party service has completed\\n  /// @dev For time-delayed requests, this function is used to check/confirm completion\\n  /// @param requestId The ID of the request used to get the results of the RNG service\\n  /// @return isCompleted True if the request has completed and a random number is available, false otherwise\\n  function isRequestComplete(uint32 requestId) external view returns (bool isCompleted);\\n\\n  /// @notice Gets the random number produced by the 3rd-party service\\n  /// @param requestId The ID of the request used to get the results of the RNG service\\n  /// @return randomNum The random number\\n  function randomNumber(uint32 requestId) external returns (uint256 randomNum);\\n}\\n\",\"keccak256\":\"0xf917c68439d7476cd226f475e8fce940e0cf1d32cb0ff12e8537072a07f2b1da\",\"license\":\"GPL-3.0\"},\"@pooltogether/uniform-random-number/contracts/UniformRandomNumber.sol\":{\"content\":\"/**\\nCopyright 2019 PoolTogether LLC\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice A library that uses entropy to select a random number within a bound.  Compensates for modulo bias.\\n * @dev Thanks to https://medium.com/hownetworks/dont-waste-cycles-with-modulo-bias-35b6fdafcf94\\n */\\nlibrary UniformRandomNumber {\\n  /// @notice Select a random number without modulo bias using a random seed and upper bound\\n  /// @param _entropy The seed for randomness\\n  /// @param _upperBound The upper bound of the desired number\\n  /// @return A random number less than the _upperBound\\n  function uniform(uint256 _entropy, uint256 _upperBound) internal pure returns (uint256) {\\n    require(_upperBound > 0, \\\"UniformRand/min-bound\\\");\\n    uint256 min = -_upperBound % _upperBound;\\n    uint256 random = _entropy;\\n    while (true) {\\n      if (random >= min) {\\n        break;\\n      }\\n      random = uint256(keccak256(abi.encodePacked(random)));\\n    }\\n    return random % _upperBound;\\n  }\\n}\",\"keccak256\":\"0x0d86eb3349d8a9e226ff6f3328a6a79bbf872859a4afbe489051fbf3b8550df4\"},\"@pooltogether/yield-source-interface/contracts/IYieldSource.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.4.0 <0.8.0;\\n\\n/// @title Defines the functions used to interact with a yield source.  The Prize Pool inherits this contract.\\n/// @notice Prize Pools subclasses need to implement this interface so that yield can be generated.\\ninterface IYieldSource {\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function depositToken() external view returns (address);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function balanceOfToken(address addr) external returns (uint256);\\n\\n  /// @notice Supplies tokens to the yield source.  Allows assets to be supplied on other user's behalf using the `to` param.\\n  /// @param amount The amount of `token()` to be supplied\\n  /// @param to The user whose balance will receive the tokens\\n  function supplyTokenTo(uint256 amount, address to) external;\\n\\n  /// @notice Redeems tokens from the yield source.\\n  /// @param amount The amount of `token()` to withdraw.  Denominated in `token()` as above.\\n  /// @return The actual amount of tokens that were redeemed.\\n  function redeemToken(uint256 amount) external returns (uint256);\\n\\n}\\n\",\"keccak256\":\"0xee862089c29ec1f9b2a1df7c01953d88ef5dfcfb2c2198e8926f692ec76537f1\",\"license\":\"MIT\"},\"contracts/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary Constants {\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC721 = 0x80ac58cd;\\n}\",\"keccak256\":\"0x5dc8f8bda4e9668a9ffae6a941774f849adcb368cc2275fd8a91e6ada8fad7fb\",\"license\":\"GPL-3.0\"},\"contracts/builders/ControlledTokenBuilder.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"../token/ControlledTokenProxyFactory.sol\\\";\\nimport \\\"../token/TicketProxyFactory.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ncontract ControlledTokenBuilder {\\n\\n  event CreatedControlledToken(address indexed token);\\n  event CreatedTicket(address indexed token);\\n\\n  ControlledTokenProxyFactory public controlledTokenProxyFactory;\\n  TicketProxyFactory public ticketProxyFactory;\\n\\n  struct ControlledTokenConfig {\\n    string name;\\n    string symbol;\\n    uint8 decimals;\\n    TokenControllerInterface controller;\\n  }\\n\\n  constructor (\\n    ControlledTokenProxyFactory _controlledTokenProxyFactory,\\n    TicketProxyFactory _ticketProxyFactory\\n  ) public {\\n    require(address(_controlledTokenProxyFactory) != address(0), \\\"ControlledTokenBuilder/controlledTokenProxyFactory-not-zero\\\");\\n    require(address(_ticketProxyFactory) != address(0), \\\"ControlledTokenBuilder/ticketProxyFactory-not-zero\\\");\\n    controlledTokenProxyFactory = _controlledTokenProxyFactory;\\n    ticketProxyFactory = _ticketProxyFactory;\\n  }\\n\\n  function createControlledToken(\\n    ControlledTokenConfig calldata config\\n  ) external returns (ControlledToken) {\\n    ControlledToken token = controlledTokenProxyFactory.create();\\n\\n    token.initialize(\\n      config.name,\\n      config.symbol,\\n      config.decimals,\\n      config.controller\\n    );\\n\\n    emit CreatedControlledToken(address(token));\\n\\n    return token;\\n  }\\n\\n  function createTicket(\\n    ControlledTokenConfig calldata config\\n  ) external returns (Ticket) {\\n    Ticket token = ticketProxyFactory.create();\\n\\n    token.initialize(\\n      config.name,\\n      config.symbol,\\n      config.decimals,\\n      config.controller\\n    );\\n\\n    emit CreatedTicket(address(token));\\n\\n    return token;\\n  }\\n}\\n\",\"keccak256\":\"0x87077a6f3a7cc093a1742ebb24a62b1c8a728341b3c49e3a147630f77c5aada7\",\"license\":\"GPL-3.0\"},\"contracts/builders/MultipleWinnersBuilder.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"./ControlledTokenBuilder.sol\\\";\\nimport \\\"../prize-strategy/multiple-winners/MultipleWinnersProxyFactory.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ncontract MultipleWinnersBuilder {\\n\\n  event MultipleWinnersCreated(address indexed prizeStrategy);\\n\\n  struct MultipleWinnersConfig {\\n    RNGInterface rngService;\\n    uint256 prizePeriodStart;\\n    uint256 prizePeriodSeconds;\\n    string ticketName;\\n    string ticketSymbol;\\n    string sponsorshipName;\\n    string sponsorshipSymbol;\\n    uint256 ticketCreditLimitMantissa;\\n    uint256 ticketCreditRateMantissa;\\n    uint256 numberOfWinners;\\n    MultipleWinners.PrizeSplitConfig[] prizeSplits;\\n    bool splitExternalErc20Awards;\\n  }\\n\\n  MultipleWinnersProxyFactory public multipleWinnersProxyFactory;\\n  ControlledTokenBuilder public controlledTokenBuilder;\\n\\n  constructor (\\n    MultipleWinnersProxyFactory _multipleWinnersProxyFactory,\\n    ControlledTokenBuilder _controlledTokenBuilder\\n  ) public {\\n    require(address(_multipleWinnersProxyFactory) != address(0), \\\"MultipleWinnersBuilder/multipleWinnersProxyFactory-not-zero\\\");\\n    require(address(_controlledTokenBuilder) != address(0), \\\"MultipleWinnersBuilder/token-builder-not-zero\\\");\\n    multipleWinnersProxyFactory = _multipleWinnersProxyFactory;\\n    controlledTokenBuilder = _controlledTokenBuilder;\\n  }\\n\\n  function createMultipleWinners(\\n    PrizePool prizePool,\\n    MultipleWinnersConfig memory prizeStrategyConfig,\\n    uint8 decimals,\\n    address owner\\n  ) external returns (MultipleWinners) {\\n    MultipleWinners mw = multipleWinnersProxyFactory.create();\\n\\n    Ticket ticket = _createTicket(\\n      prizeStrategyConfig.ticketName,\\n      prizeStrategyConfig.ticketSymbol,\\n      decimals,\\n      prizePool\\n    );\\n\\n    ControlledToken sponsorship = _createSponsorship(\\n      prizeStrategyConfig.sponsorshipName,\\n      prizeStrategyConfig.sponsorshipSymbol,\\n      decimals,\\n      prizePool\\n    );\\n\\n    mw.initializeMultipleWinners(\\n      prizeStrategyConfig.prizePeriodStart,\\n      prizeStrategyConfig.prizePeriodSeconds,\\n      prizePool,\\n      ticket,\\n      sponsorship,\\n      prizeStrategyConfig.rngService,\\n      prizeStrategyConfig.numberOfWinners\\n    );\\n\\n    mw.setPrizeSplits(prizeStrategyConfig.prizeSplits);\\n\\n    if (prizeStrategyConfig.splitExternalErc20Awards) {\\n      mw.setSplitExternalErc20Awards(true);\\n    }\\n\\n    mw.transferOwnership(owner);\\n\\n    emit MultipleWinnersCreated(address(mw));\\n\\n    return mw;\\n  }\\n\\n  function _createTicket(\\n    string memory name,\\n    string memory token,\\n    uint8 decimals,\\n    PrizePool prizePool\\n  ) internal returns (Ticket) {\\n    return controlledTokenBuilder.createTicket(\\n      ControlledTokenBuilder.ControlledTokenConfig(\\n        name,\\n        token,\\n        decimals,\\n        prizePool\\n      )\\n    );\\n  }\\n\\n  function _createSponsorship(\\n    string memory name,\\n    string memory token,\\n    uint8 decimals,\\n    PrizePool prizePool\\n  ) internal returns (ControlledToken) {\\n    return controlledTokenBuilder.createControlledToken(\\n      ControlledTokenBuilder.ControlledTokenConfig(\\n        name,\\n        token,\\n        decimals,\\n        prizePool\\n      )\\n    );\\n  }\\n}\\n\",\"keccak256\":\"0x30608cb295b5cd6290b1c5e69708d0fb8eebfe299bc358f1aa9a5cc539c81c63\",\"license\":\"GPL-3.0\"},\"contracts/builders/PoolWithMultipleWinnersBuilder.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@pooltogether/yield-source-interface/contracts/IYieldSource.sol\\\";\\n\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../prize-pool/compound/CompoundPrizePoolProxyFactory.sol\\\";\\nimport \\\"../prize-pool/yield-source/YieldSourcePrizePoolProxyFactory.sol\\\";\\nimport \\\"../prize-pool/stake/StakePrizePoolProxyFactory.sol\\\";\\nimport \\\"./MultipleWinnersBuilder.sol\\\";\\n\\ncontract PoolWithMultipleWinnersBuilder {\\n  using SafeCastUpgradeable for uint256;\\n\\n  event CompoundPrizePoolWithMultipleWinnersCreated(\\n    CompoundPrizePool indexed prizePool,\\n    MultipleWinners indexed prizeStrategy\\n  );\\n\\n  event YieldSourcePrizePoolWithMultipleWinnersCreated(\\n    YieldSourcePrizePool indexed prizePool,\\n    MultipleWinners indexed prizeStrategy\\n  );\\n\\n  event StakePrizePoolWithMultipleWinnersCreated(\\n    StakePrizePool indexed prizePool,\\n    MultipleWinners indexed prizeStrategy\\n  );\\n\\n  /// @notice The configuration used to initialize the Compound Prize Pool\\n  struct CompoundPrizePoolConfig {\\n    CTokenInterface cToken;\\n    uint256 maxExitFeeMantissa;\\n  }\\n\\n  /// @notice The configuration used to initialize the Compound Prize Pool\\n  struct YieldSourcePrizePoolConfig {\\n    IYieldSource yieldSource;\\n    uint256 maxExitFeeMantissa;\\n  }\\n\\n  struct StakePrizePoolConfig {\\n    IERC20Upgradeable token;\\n    uint256 maxExitFeeMantissa;\\n  }\\n\\n  RegistryInterface public reserveRegistry;\\n  CompoundPrizePoolProxyFactory public compoundPrizePoolProxyFactory;\\n  YieldSourcePrizePoolProxyFactory public yieldSourcePrizePoolProxyFactory;\\n  StakePrizePoolProxyFactory public stakePrizePoolProxyFactory;\\n  MultipleWinnersBuilder public multipleWinnersBuilder;\\n\\n  constructor (\\n    RegistryInterface _reserveRegistry,\\n    CompoundPrizePoolProxyFactory _compoundPrizePoolProxyFactory,\\n    YieldSourcePrizePoolProxyFactory _yieldSourcePrizePoolProxyFactory,\\n    StakePrizePoolProxyFactory _stakePrizePoolProxyFactory,\\n    MultipleWinnersBuilder _multipleWinnersBuilder\\n  ) public {\\n    require(address(_reserveRegistry) != address(0), \\\"GlobalBuilder/reserveRegistry-not-zero\\\");\\n    require(address(_compoundPrizePoolProxyFactory) != address(0), \\\"GlobalBuilder/compoundPrizePoolProxyFactory-not-zero\\\");\\n    require(address(_yieldSourcePrizePoolProxyFactory) != address(0), \\\"GlobalBuilder/yieldSourcePrizePoolProxyFactory-not-zero\\\");\\n    require(address(_stakePrizePoolProxyFactory) != address(0), \\\"GlobalBuilder/stakePrizePoolProxyFactory-not-zero\\\");\\n    require(address(_multipleWinnersBuilder) != address(0), \\\"GlobalBuilder/multipleWinnersBuilder-not-zero\\\");\\n    reserveRegistry = _reserveRegistry;\\n    compoundPrizePoolProxyFactory = _compoundPrizePoolProxyFactory;\\n    yieldSourcePrizePoolProxyFactory = _yieldSourcePrizePoolProxyFactory;\\n    stakePrizePoolProxyFactory = _stakePrizePoolProxyFactory;\\n    multipleWinnersBuilder = _multipleWinnersBuilder;\\n  }\\n\\n  function createCompoundMultipleWinners(\\n    CompoundPrizePoolConfig memory prizePoolConfig,\\n    MultipleWinnersBuilder.MultipleWinnersConfig memory prizeStrategyConfig,\\n    uint8 decimals\\n  ) external returns (CompoundPrizePool) {\\n    CompoundPrizePool prizePool = compoundPrizePoolProxyFactory.create();\\n    MultipleWinners prizeStrategy = multipleWinnersBuilder.createMultipleWinners(\\n      prizePool,\\n      prizeStrategyConfig,\\n      decimals,\\n      msg.sender\\n    );\\n    prizePool.initialize(\\n      reserveRegistry,\\n      _tokens(prizeStrategy),\\n      prizePoolConfig.maxExitFeeMantissa,\\n      CTokenInterface(prizePoolConfig.cToken)\\n    );\\n    prizePool.setPrizeStrategy(prizeStrategy);\\n    prizePool.setCreditPlanOf(\\n      address(prizeStrategy.ticket()),\\n      prizeStrategyConfig.ticketCreditRateMantissa.toUint128(),\\n      prizeStrategyConfig.ticketCreditLimitMantissa.toUint128()\\n    );\\n    prizePool.transferOwnership(msg.sender);\\n    emit CompoundPrizePoolWithMultipleWinnersCreated(prizePool, prizeStrategy);\\n    return prizePool;\\n  }\\n\\n  function createYieldSourceMultipleWinners(\\n    YieldSourcePrizePoolConfig memory prizePoolConfig,\\n    MultipleWinnersBuilder.MultipleWinnersConfig memory prizeStrategyConfig,\\n    uint8 decimals\\n  ) external returns (YieldSourcePrizePool) {\\n    YieldSourcePrizePool prizePool = yieldSourcePrizePoolProxyFactory.create();\\n    MultipleWinners prizeStrategy = multipleWinnersBuilder.createMultipleWinners(\\n      prizePool,\\n      prizeStrategyConfig,\\n      decimals,\\n      msg.sender\\n    );\\n    prizePool.initializeYieldSourcePrizePool(\\n      reserveRegistry,\\n      _tokens(prizeStrategy),\\n      prizePoolConfig.maxExitFeeMantissa,\\n      prizePoolConfig.yieldSource\\n    );\\n    prizePool.setPrizeStrategy(prizeStrategy);\\n    prizePool.setCreditPlanOf(\\n      address(prizeStrategy.ticket()),\\n      prizeStrategyConfig.ticketCreditRateMantissa.toUint128(),\\n      prizeStrategyConfig.ticketCreditLimitMantissa.toUint128()\\n    );\\n    prizePool.transferOwnership(msg.sender);\\n    emit YieldSourcePrizePoolWithMultipleWinnersCreated(prizePool, prizeStrategy);\\n    return prizePool;\\n  }\\n\\n  function createStakeMultipleWinners(\\n    StakePrizePoolConfig memory prizePoolConfig,\\n    MultipleWinnersBuilder.MultipleWinnersConfig memory prizeStrategyConfig,\\n    uint8 decimals\\n  ) external returns (StakePrizePool) {\\n    StakePrizePool prizePool = stakePrizePoolProxyFactory.create();\\n    MultipleWinners prizeStrategy = multipleWinnersBuilder.createMultipleWinners(\\n      prizePool,\\n      prizeStrategyConfig,\\n      decimals,\\n      msg.sender\\n    );\\n    prizePool.initialize(\\n      reserveRegistry,\\n      _tokens(prizeStrategy),\\n      prizePoolConfig.maxExitFeeMantissa,\\n      prizePoolConfig.token\\n    );\\n    prizePool.setPrizeStrategy(prizeStrategy);\\n    prizePool.setCreditPlanOf(\\n      address(prizeStrategy.ticket()),\\n      prizeStrategyConfig.ticketCreditRateMantissa.toUint128(),\\n      prizeStrategyConfig.ticketCreditLimitMantissa.toUint128()\\n    );\\n    prizePool.transferOwnership(msg.sender);\\n    emit StakePrizePoolWithMultipleWinnersCreated(prizePool, prizeStrategy);\\n    return prizePool;\\n  }\\n\\n  function _tokens(MultipleWinners _multipleWinners) internal view returns (ControlledTokenInterface[] memory) {\\n    ControlledTokenInterface[] memory tokens = new ControlledTokenInterface[](2);\\n    tokens[0] = ControlledTokenInterface(address(_multipleWinners.ticket()));\\n    tokens[1] = ControlledTokenInterface(address(_multipleWinners.sponsorship()));\\n    return tokens;\\n  }\\n\\n}\\n\",\"keccak256\":\"0x11c65e59cb30e78fed016cb79e8a5c3d4f33b033964aa8b8c51ec71ac834460c\",\"license\":\"GPL-3.0\"},\"contracts/external/compound/CTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface CTokenInterface is IERC20Upgradeable {\\n    function decimals() external view returns (uint8);\\n    function totalSupply() external override view returns (uint256);\\n    function underlying() external view returns (address);\\n    function balanceOfUnderlying(address owner) external returns (uint256);\\n    function supplyRatePerBlock() external returns (uint256);\\n    function exchangeRateCurrent() external returns (uint256);\\n    function mint(uint256 mintAmount) external returns (uint256);\\n    function redeem(uint256 amount) external returns (uint256);\\n    function balanceOf(address user) external override view returns (uint256);\\n    function redeemUnderlying(uint256 redeemAmount) external returns (uint256);\\n}\\n\",\"keccak256\":\"0x9608049458bc017f2369e2af2a20bfa2efaff1a5b451a17bd0594a976d5bc88f\",\"license\":\"GPL-3.0\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"},\"contracts/external/openzeppelin/ProxyFactory.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\n// solium-disable security/no-inline-assembly\\n// solium-disable security/no-low-level-calls\\ncontract ProxyFactory {\\n\\n  event ProxyCreated(address proxy);\\n\\n  function deployMinimal(address _logic, bytes memory _data) public returns (address proxy) {\\n    // Adapted from https://github.com/optionality/clone-factory/blob/32782f82dfc5a00d103a7e61a17a5dedbd1e8e9d/contracts/CloneFactory.sol\\n    bytes20 targetBytes = bytes20(_logic);\\n    assembly {\\n      let clone := mload(0x40)\\n      mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n      mstore(add(clone, 0x14), targetBytes)\\n      mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n      proxy := create(0, clone, 0x37)\\n    }\\n\\n    emit ProxyCreated(address(proxy));\\n\\n    if(_data.length > 0) {\\n      (bool success,) = proxy.call(_data);\\n      require(success, \\\"ProxyFactory/constructor-call-failed\\\");\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0xf0422303985796fdd8bdf772ac8e34331e2e63006f657989cca010fa4776d735\"},\"contracts/prize-pool/PrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../external/compound/ICompLike.sol\\\";\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../reserve/ReserveInterface.sol\\\";\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/TokenListenerLibrary.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\nimport \\\"./PrizePoolInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using SafeERC20Upgradeable for IERC721Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    address reserveRegistry,\\n    uint256 maxExitFeeMantissa\\n  );\\n\\n  /// @dev Event emitted when controlled token is added\\n  event ControlledTokenAdded(\\n    ControlledTokenInterface indexed token\\n  );\\n\\n  /// @dev Emitted when reserve is captured.\\n  event ReserveFeeCaptured(\\n    uint256 amount\\n  );\\n\\n  event AwardCaptured(\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when assets are deposited\\n  event Deposited(\\n    address indexed operator,\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount,\\n    address referrer\\n  );\\n\\n  /// @dev Event emitted when interest is awarded to a winner\\n  event Awarded(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are awarded to a winner\\n  event AwardedExternalERC20(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are transferred out\\n  event TransferredExternalERC20(\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC721s are awarded to a winner\\n  event AwardedExternalERC721(\\n    address indexed winner,\\n    address indexed token,\\n    uint256[] tokenIds\\n  );\\n\\n  /// @dev Event emitted when assets are withdrawn instantly\\n  event InstantWithdrawal(\\n    address indexed operator,\\n    address indexed from,\\n    address indexed token,\\n    uint256 amount,\\n    uint256 redeemed,\\n    uint256 exitFee\\n  );\\n\\n  event ReserveWithdrawal(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when the Liquidity Cap is set\\n  event LiquidityCapSet(\\n    uint256 liquidityCap\\n  );\\n\\n  /// @dev Event emitted when the Credit plan is set\\n  event CreditPlanSet(\\n    address token,\\n    uint128 creditLimitMantissa,\\n    uint128 creditRateMantissa\\n  );\\n\\n  /// @dev Event emitted when the Prize Strategy is set\\n  event PrizeStrategySet(\\n    address indexed prizeStrategy\\n  );\\n\\n  /// @dev Emitted when credit is minted\\n  event CreditMinted(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when credit is burned\\n  event CreditBurned(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\\n  event ErrorAwardingExternalERC721(bytes error);\\n\\n\\n  struct CreditPlan {\\n    uint128 creditLimitMantissa;\\n    uint128 creditRateMantissa;\\n  }\\n\\n  struct CreditBalance {\\n    uint192 balance;\\n    uint32 timestamp;\\n    bool initialized;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  /// @dev Reserve to which reserve fees are sent\\n  RegistryInterface public reserveRegistry;\\n\\n  /// @dev An array of all the controlled tokens\\n  ControlledTokenInterface[] internal _tokens;\\n\\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\\n  TokenListenerInterface public prizeStrategy;\\n\\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\\n  /// For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\\n  uint256 public maxExitFeeMantissa;\\n\\n  /// @dev The total funds that have been allocated to the reserve\\n  uint256 public reserveTotalSupply;\\n\\n  /// @dev The total amount of funds that the prize pool can hold.\\n  uint256 public liquidityCap;\\n\\n  /// @dev the The awardable balance\\n  uint256 internal _currentAwardBalance;\\n\\n  /// @dev Stores the credit plan for each token.\\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\\n\\n  /// @dev Stores each users balance of credit per token.\\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\\n\\n  /// @notice Initializes the Prize Pool\\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\\n  /// @param _maxExitFeeMantissa The maximum exit fee size\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_reserveRegistry) != address(0), \\\"PrizePool/reserveRegistry-not-zero\\\");\\n    uint256 controlledTokensLength = _controlledTokens.length;\\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\\n\\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\\n      _addControlledToken(controlledToken, i);\\n    }\\n    __Ownable_init();\\n    __ReentrancyGuard_init();\\n    _setLiquidityCap(uint256(-1));\\n\\n    reserveRegistry = _reserveRegistry;\\n    maxExitFeeMantissa = _maxExitFeeMantissa;\\n\\n    emit Initialized(\\n      address(_reserveRegistry),\\n      maxExitFeeMantissa\\n    );\\n  }\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external override view returns (address) {\\n    return address(_token());\\n  }\\n\\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\\n  /// @return The underlying balance of assets\\n  function balance() external returns (uint256) {\\n    return _balance();\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function canAwardExternal(address _externalToken) external view returns (bool) {\\n    return _canAwardExternal(_externalToken);\\n  }\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    canAddLiquidity(amount)\\n  {\\n    address operator = _msgSender();\\n\\n    _mint(to, amount, controlledToken, referrer);\\n\\n    _token().safeTransferFrom(operator, address(this), amount);\\n    _supply(amount);\\n\\n    emit Deposited(operator, to, controlledToken, amount, referrer);\\n  }\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    returns (uint256)\\n  {\\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n    require(exitFee <= maximumExitFee, \\\"PrizePool/exit-fee-exceeds-user-maximum\\\");\\n\\n    // burn the credit\\n    _burnCredit(from, controlledToken, burnedCredit);\\n\\n    // burn the tickets\\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\\n\\n    // redeem the tickets less the fee\\n    uint256 amountLessFee = amount.sub(exitFee);\\n    uint256 redeemed = _redeem(amountLessFee);\\n\\n    _token().safeTransfer(from, redeemed);\\n\\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\\n\\n    return exitFee;\\n  }\\n\\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\\n  /// @param exitFee The exit fee to check against the limit\\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\\n    if (exitFee > maxFee) {\\n      exitFee = maxFee;\\n    }\\n    return exitFee;\\n  }\\n\\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\\n  /// @param from The address the tokens are being transferred from (0 if minting)\\n  /// @param to The address the tokens are being transferred to (0 if burning)\\n  /// @param amount The amount of tokens being trasferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\\n    if (from != address(0)) {\\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\\n      // first accrue credit for their old balance\\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\\n\\n      if (from != to) {\\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\\n      }\\n\\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\\n    }\\n    if (to != address(0) && to != from) {\\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\\n    }\\n    // if we aren't minting\\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\\n    }\\n  }\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external override view returns (uint256) {\\n    return _currentAwardBalance;\\n  }\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n\\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\\n    uint256 currentBalance = _balance();\\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\\n\\n    if (unaccountedPrizeBalance > 0) {\\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\\n      if (reserveFee > 0) {\\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\\n        emit ReserveFeeCaptured(reserveFee);\\n      }\\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\\n\\n      emit AwardCaptured(unaccountedPrizeBalance);\\n    }\\n\\n    return _currentAwardBalance;\\n  }\\n\\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\\n\\n    uint256 amount = reserveTotalSupply;\\n    reserveTotalSupply = 0;\\n    uint256 redeemed = _redeem(amount);\\n\\n    _token().safeTransfer(address(to), redeemed);\\n\\n    emit ReserveWithdrawal(to, amount);\\n\\n    return redeemed;\\n  }\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external override\\n    onlyPrizeStrategy\\n    onlyControlledToken(controlledToken)\\n  {\\n    if (amount == 0) {\\n      return;\\n    }\\n\\n    require(amount <= _currentAwardBalance, \\\"PrizePool/award-exceeds-avail\\\");\\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\\n\\n    _mint(to, amount, controlledToken, address(0));\\n\\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\\n\\n    emit Awarded(to, controlledToken, amount);\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit TransferredExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit AwardedExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  function _transferOut(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (bool)\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (amount == 0) {\\n      return false;\\n    }\\n\\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\\n\\n    return true;\\n  }\\n\\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\\n  /// @param to The user who is receiving the tokens\\n  /// @param amount The amount of tokens they are receiving\\n  /// @param controlledToken The token that is going to be minted\\n  /// @param referrer The user who referred the minting\\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\\n    if (address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n    ControlledToken(controlledToken).controllerMint(to, amount);\\n  }\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (tokenIds.length == 0) {\\n      return;\\n    }\\n\\n    for (uint256 i = 0; i < tokenIds.length; i++) {\\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\\n\\n      }\\n      catch(bytes memory error){\\n        emit ErrorAwardingExternalERC721(error);\\n      }\\n      \\n    }\\n\\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\\n  }\\n\\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\\n  /// @param amount The prize amount\\n  /// @return The size of the reserve portion of the prize\\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    if (address(reserve) == address(0)) {\\n      return 0;\\n    }\\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\\n    if (reserveRateMantissa == 0) {\\n      return 0;\\n    }\\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\\n  }\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external override\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    )\\n  {\\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n  }\\n\\n  /// @dev Calculates the early exit fee for the given amount\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return Exit fee\\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\\n    return _limitExitFee(\\n      amount,\\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external override\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    durationSeconds =_estimateCreditAccrualTime(\\n      _controlledToken,\\n      _principal,\\n      _interest\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function _estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    internal\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    // interest = credit rate * principal * time\\n    // => time = interest / (credit rate * principal)\\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\\n    if (accruedPerSecond == 0) {\\n      return 0;\\n    }\\n    return _interest.div(accruedPerSecond);\\n  }\\n\\n  /// @notice Burns a users credit.\\n  /// @param user The user whose credit should be burned\\n  /// @param credit The amount of credit to burn\\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\\n\\n    emit CreditBurned(user, controlledToken, credit);\\n  }\\n\\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\\n  /// @param user The user for whom to accrue credit\\n  /// @param controlledToken The controlled token whose balance we are checking\\n  /// @param controlledTokenBalance The balance to use for the user\\n  /// @param extra Additional credit to be added\\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\\n    _updateCreditBalance(\\n      user,\\n      controlledToken,\\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\\n    );\\n  }\\n\\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\\n    uint256 newBalance;\\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\\n    if (!creditBalance.initialized) {\\n      newBalance = 0;\\n    } else {\\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\\n    }\\n    return newBalance;\\n  }\\n\\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\\n\\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\\n      balance: newBalance.toUint128(),\\n      timestamp: _currentTime().toUint32(),\\n      initialized: true\\n    });\\n\\n    if (oldBalance < newBalance) {\\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\\n    } \\n    else if (newBalance < oldBalance) {\\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\\n    }\\n  }\\n\\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\\n  /// @param creditBalance The new credit balance to be checked\\n  /// @return The users new credit balance.  Will not exceed the credit limit.\\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\\n      controlledTokenBalance,\\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\\n    );\\n    if (creditBalance > creditLimit) {\\n      creditBalance = creditLimit;\\n    }\\n\\n    return creditBalance;\\n  }\\n\\n  /// @notice Calculates the accrued interest for a user\\n  /// @param user The user whose credit should be calculated.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\\n  /// @return The credit that has accrued since the last credit update.\\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\\n\\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\\n      return 0;\\n    }\\n\\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\\n  }\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\\n    return _tokenCreditBalances[controlledToken][user].balance;\\n  }\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external override\\n    onlyControlledToken(_controlledToken)\\n    onlyOwner\\n  {\\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\\n      creditLimitMantissa: _creditLimitMantissa,\\n      creditRateMantissa: _creditRateMantissa\\n    });\\n\\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\\n  }\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external override\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    )\\n  {\\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\\n  }\\n\\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The token they are withdrawing\\n  /// @param amount The amount of funds they are withdrawing\\n  /// @return earlyExitFee The additional exit fee that should be charged.\\n  /// @return creditBurned The amount of credit that will be burned\\n  function _calculateEarlyExitFeeLessBurnedCredit(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (\\n      uint256 earlyExitFee,\\n      uint256 creditBurned\\n    )\\n  {\\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\\n    require(controlledTokenBalance >= amount, \\\"PrizePool/insuff-funds\\\");\\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\\n    /*\\n    The credit is used *last*.  Always charge the fees up-front.\\n\\n    How to calculate:\\n\\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\\n\\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\\n    */\\n\\n    // Determine available usable credit based on withdraw amount\\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\\n\\n    uint256 availableCredit;\\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\\n    }\\n\\n    // Determine amount of credit to burn and amount of fees required\\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\\n    earlyExitFee = totalExitFee.sub(creditBurned);\\n  }\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\\n    _setLiquidityCap(_liquidityCap);\\n  }\\n\\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\\n    liquidityCap = _liquidityCap;\\n    emit LiquidityCapSet(_liquidityCap);\\n  }\\n\\n  /// @notice Adds a new controlled token\\n  /// @param _controlledToken The controlled token to add.\\n  /// @param index The index to add the controlledToken\\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\\n    require(_controlledToken.controller() == this, \\\"PrizePool/token-ctrlr-mismatch\\\");\\n    \\n    _tokens[index] = _controlledToken;\\n    emit ControlledTokenAdded(_controlledToken);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\\n    _setPrizeStrategy(_prizeStrategy);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\\n    require(address(_prizeStrategy) != address(0), \\\"PrizePool/prizeStrategy-not-zero\\\");\\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PrizePool/prizeStrategy-invalid\\\");\\n    prizeStrategy = _prizeStrategy;\\n\\n    emit PrizeStrategySet(address(_prizeStrategy));\\n  }\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\\n    return _tokens;\\n  }\\n\\n  /// @dev Gets the current time as represented by the current block\\n  /// @return The timestamp of the current block\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external override view returns (uint256) {\\n    return _tokenTotalSupply();\\n  }\\n\\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\\n  /// @param to The address to delegate to \\n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\\n    if (compLike.balanceOf(address(this)) > 0) {\\n      compLike.delegate(to);\\n    }\\n  }\\n  \\n  /// @notice Required for ERC721 safe token transfers from smart contracts.\\n  /// @param operator The address that acts on behalf of the owner\\n  /// @param from The current owner of the NFT\\n  /// @param tokenId The NFT to transfer\\n  /// @param data Additional data with no specified format, sent in call to `_to`.\\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function _tokenTotalSupply() internal view returns (uint256) {\\n    uint256 total = reserveTotalSupply;\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \\n    uint256 tokensLength = tokens.length;\\n    \\n    for(uint256 i = 0; i < tokensLength; i++){\\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\\n    }\\n\\n    return total;\\n  }\\n\\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\\n  }\\n\\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\\n    uint256 tokensLength = tokens.length;\\n\\n    for(uint256 i = 0; i < tokensLength; i++) {\\n      if(tokens[i] == controlledToken) return true;\\n    }\\n    return false;\\n  }\\n  \\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\\n    return _isControlled(controlledToken);\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function _token() internal virtual view returns (IERC20Upgradeable);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal virtual returns (uint256);\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal virtual;\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\\n\\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  modifier onlyControlledToken(address controlledToken) {\\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \\\"PrizePool/unknown-token\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure caller is the prize-strategy\\n  modifier onlyPrizeStrategy() {\\n    require(_msgSender() == address(prizeStrategy), \\\"PrizePool/only-prizeStrategy\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\\n  modifier canAddLiquidity(uint256 _amount) {\\n    require(_canAddLiquidity(_amount), \\\"PrizePool/exceeds-liquidity-cap\\\");\\n    _;\\n  }\\n\\n  modifier onlyReserve() {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    require(address(reserve) == msg.sender, \\\"PrizePool/only-reserve\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x386ebc1c80ab4424f14125e716dd12641ff933b475bf1082b7b1a6eee4a969c3\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/compound/CompoundPrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../../external/compound/CTokenInterface.sol\\\";\\nimport \\\"../PrizePool.sol\\\";\\n\\n/// @title Prize Pool with Compound's cToken\\n/// @notice Manages depositing and withdrawing assets from the Prize Pool\\ncontract CompoundPrizePool is PrizePool {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n\\n  event CompoundPrizePoolInitialized(address indexed cToken);\\n\\n  /// @notice Interface for the Yield-bearing cToken by Compound\\n  CTokenInterface public cToken;\\n\\n  /// @notice Initializes the Prize Pool and Yield Service with the required contract connections\\n  /// @param _controlledTokens Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\\n  /// @param _maxExitFeeMantissa The maximum exit fee size, relative to the withdrawal amount\\n  /// @param _cToken Address of the Compound cToken interface\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa,\\n    CTokenInterface _cToken\\n  )\\n    public\\n    initializer\\n  {\\n    PrizePool.initialize(\\n      _reserveRegistry,\\n      _controlledTokens,\\n      _maxExitFeeMantissa\\n    );\\n    cToken = _cToken;\\n\\n    emit CompoundPrizePoolInitialized(address(cToken));\\n  }\\n\\n  /// @dev Gets the balance of the underlying assets held by the Yield Service\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal override returns (uint256) {\\n    return cToken.balanceOfUnderlying(address(this));\\n  }\\n\\n  /// @dev Allows a user to supply asset tokens in exchange for yield-bearing tokens\\n  /// to be held in escrow by the Yield Service\\n  /// @param amount The amount of asset tokens to be supplied\\n  function _supply(uint256 amount) internal override {\\n    _token().safeApprove(address(cToken), amount);\\n    require(cToken.mint(amount) == 0, \\\"CompoundPrizePool/mint-failed\\\");\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as a prize enhancement\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal override view returns (bool) {\\n    return _externalToken != address(cToken);\\n  }\\n\\n  /// @dev Allows a user to redeem yield-bearing tokens in exchange for the underlying\\n  /// asset tokens held in escrow by the Yield Service\\n  /// @param amount The amount of underlying tokens to be redeemed\\n  /// @return The actual amount of tokens transferred\\n  function _redeem(uint256 amount) internal override returns (uint256) {\\n    IERC20Upgradeable assetToken = _token();\\n    uint256 before = assetToken.balanceOf(address(this));\\n    require(cToken.redeemUnderlying(amount) == 0, \\\"CompoundPrizePool/redeem-failed\\\");\\n    uint256 diff = assetToken.balanceOf(address(this)).sub(before);\\n    return diff;\\n  }\\n\\n  /// @dev Gets the underlying asset token used by the Yield Service\\n  /// @return A reference to the interface of the underling asset token\\n  function _token() internal override view returns (IERC20Upgradeable) {\\n    return IERC20Upgradeable(cToken.underlying());\\n  }\\n}\\n\",\"keccak256\":\"0x094f4926923fad2a264e41f6eaabc161dc9969a6db6dbf3a170c266d27162ab6\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/compound/CompoundPrizePoolProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./CompoundPrizePool.sol\\\";\\nimport \\\"../../external/openzeppelin/ProxyFactory.sol\\\";\\n\\n/// @title Compound Prize Pool Proxy Factory\\n/// @notice Minimal proxy pattern for creating new Compound Prize Pools\\ncontract CompoundPrizePoolProxyFactory is ProxyFactory {\\n\\n  /// @notice Contract template for deploying proxied Prize Pools\\n  CompoundPrizePool public instance;\\n\\n  /// @notice Initializes the Factory with an instance of the Compound Prize Pool\\n  constructor () public {\\n    instance = new CompoundPrizePool();\\n  }\\n\\n  /// @notice Creates a new Compound Prize Pool as a proxy of the template instance\\n  /// @return A reference to the new proxied Compound Prize Pool\\n  function create() external returns (CompoundPrizePool) {\\n    return CompoundPrizePool(deployMinimal(address(instance), \\\"\\\"));\\n  }\\n}\\n\",\"keccak256\":\"0xc78bee7f6a01f062e82e3304e52ab3d9dcbad9adfeea46489ee84883e126ccbd\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/stake/StakePrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"../PrizePool.sol\\\";\\n\\ncontract StakePrizePool is PrizePool {\\n\\n  IERC20Upgradeable private stakeToken;\\n\\n  event StakePrizePoolInitialized(address indexed stakeToken);\\n\\n  /// @notice Initializes the Prize Pool and Yield Service with the required contract connections\\n  /// @param _controlledTokens Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\\n  /// @param _maxExitFeeMantissa The maximum exit fee size, relative to the withdrawal amount\\n  /// @param _stakeToken Address of the stake token\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa,\\n    IERC20Upgradeable _stakeToken\\n  )\\n    public\\n    initializer\\n  {\\n    PrizePool.initialize(\\n      _reserveRegistry,\\n      _controlledTokens,\\n      _maxExitFeeMantissa\\n    );\\n\\n    require(address(_stakeToken) != address(0), \\\"StakePrizePool/stake-token-not-zero-address\\\");\\n    stakeToken = _stakeToken;\\n\\n    emit StakePrizePoolInitialized(address(stakeToken));\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal override view returns (bool) {\\n    return address(stakeToken) != _externalToken;\\n  }\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal override returns (uint256) {\\n    return stakeToken.balanceOf(address(this));\\n  }\\n\\n  function _token() internal override view returns (IERC20Upgradeable) {\\n    return stakeToken;\\n  }\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal override {\\n    // no-op because nothing else needs to be done\\n  }\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal override returns (uint256) {\\n    return redeemAmount;\\n  }\\n}\\n\",\"keccak256\":\"0x3410ac3873521a451484e54c6319be3042f2d92da8030511403f192edb3f5798\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/stake/StakePrizePoolProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./StakePrizePool.sol\\\";\\nimport \\\"../../external/openzeppelin/ProxyFactory.sol\\\";\\n\\n/// @title Stake Prize Pool Proxy Factory\\n/// @notice Minimal proxy pattern for creating new Stake Prize Pools\\ncontract StakePrizePoolProxyFactory is ProxyFactory {\\n\\n  /// @notice Contract template for deploying proxied Prize Pools\\n  StakePrizePool public instance;\\n\\n  /// @notice Initializes the Factory with an instance of the Stake Prize Pool\\n  constructor () public {\\n    instance = new StakePrizePool();\\n  }\\n\\n  /// @notice Creates a new Stake Prize Pool as a proxy of the template instance\\n  /// @return A reference to the new proxied Stake Prize Pool\\n  function create() external returns (StakePrizePool) {\\n    return StakePrizePool(deployMinimal(address(instance), \\\"\\\"));\\n  }\\n}\\n\",\"keccak256\":\"0xd105fb3c1531c4167fab9a6c15972411db9afc7a1ab6b1640d9fc746bc29ae10\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/yield-source/YieldSourcePrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\\\";\\n\\nimport \\\"@pooltogether/yield-source-interface/contracts/IYieldSource.sol\\\";\\n\\nimport \\\"../PrizePool.sol\\\";\\n\\ncontract YieldSourcePrizePool is PrizePool {\\n\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using AddressUpgradeable for address;\\n\\n  IYieldSource public yieldSource;\\n\\n  event YieldSourcePrizePoolInitialized(address indexed yieldSource);\\n\\n  /// @notice Initializes the Prize Pool and Yield Service with the required contract connections\\n  /// @param _controlledTokens Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\\n  /// @param _maxExitFeeMantissa The maximum exit fee size, relative to the withdrawal amount\\n  /// @param _yieldSource Address of the yield source\\n  function initializeYieldSourcePrizePool (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa,\\n    IYieldSource _yieldSource\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_yieldSource).isContract(), \\\"YieldSourcePrizePool/yield-source-not-contract-address\\\");\\n    PrizePool.initialize(\\n      _reserveRegistry,\\n      _controlledTokens,\\n      _maxExitFeeMantissa\\n    );\\n    yieldSource = _yieldSource;\\n\\n    // A hack to determine whether it's an actual yield source\\n    (bool succeeded,) = address(_yieldSource).staticcall(abi.encode(_yieldSource.depositToken.selector));\\n    require(succeeded, \\\"YieldSourcePrizePool/invalid-yield-source\\\");\\n\\n    emit YieldSourcePrizePoolInitialized(address(_yieldSource));\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal override view returns (bool) {\\n    return _externalToken != address(yieldSource);\\n  }\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal override returns (uint256) {\\n    return yieldSource.balanceOfToken(address(this));\\n  }\\n\\n  function _token() internal override view returns (IERC20Upgradeable) {\\n    return IERC20Upgradeable(yieldSource.depositToken());\\n  }\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal override {\\n    _token().safeApprove(address(yieldSource), mintAmount);\\n    yieldSource.supplyTokenTo(mintAmount, address(this));\\n  }\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal override returns (uint256) {\\n    return yieldSource.redeemToken(redeemAmount);\\n  }\\n}\",\"keccak256\":\"0x74b0899be05f0fa46f6818359aabb09b10ce1e6f14b407b733adc207d5b72104\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/yield-source/YieldSourcePrizePoolProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./YieldSourcePrizePool.sol\\\";\\nimport \\\"../../external/openzeppelin/ProxyFactory.sol\\\";\\n\\n/// @title Yield Source Prize Pool Proxy Factory\\n/// @notice Minimal proxy pattern for creating new Yield Source Prize Pools\\ncontract YieldSourcePrizePoolProxyFactory is ProxyFactory {\\n\\n  /// @notice Contract template for deploying proxied Prize Pools\\n  YieldSourcePrizePool public instance;\\n\\n  /// @notice Initializes the Factory with an instance of the Yield Source Prize Pool\\n  constructor () public {\\n    instance = new YieldSourcePrizePool();\\n  }\\n\\n  /// @notice Creates a new Yield Source Prize Pool as a proxy of the template instance\\n  /// @return A reference to the new proxied Yield Source Prize Pool\\n  function create() external returns (YieldSourcePrizePool) {\\n    return YieldSourcePrizePool(deployMinimal(address(instance), \\\"\\\"));\\n  }\\n}\\n\",\"keccak256\":\"0xaff3efd083782dd317e241f88d0409f9bade2f918417736e0c7a2f6f27e07117\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListener.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./BeforeAwardListenerInterface.sol\\\";\\nimport \\\"../Constants.sol\\\";\\nimport \\\"./BeforeAwardListenerLibrary.sol\\\";\\n\\nabstract contract BeforeAwardListener is BeforeAwardListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == BeforeAwardListenerLibrary.ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER\\n    );\\n  }\\n}\",\"keccak256\":\"0x5da2a7332421d6136d793ef55410c2da63a7fb719e8522697f78ac4c50391505\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @notice The interface for the Periodic Prize Strategy before award listener.  This listener will be called immediately before the award is distributed.\\ninterface BeforeAwardListenerInterface is IERC165Upgradeable {\\n  /// @notice Called immediately before the award is distributed\\n  function beforePrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x96145efe8fc65aff97d11ffaf0905d53baf4b87c4a575a84d691804468f12083\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary BeforeAwardListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforePrizePoolAwarded(uint256,uint256)')) == 0x4cdf9c3e\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER = 0x4cdf9c3e;\\n}\",\"keccak256\":\"0xeac08a7b8e2e7d508a0af89c05c31c36e2b060674d05dfa9a5016cf2d12cf500\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategy.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\\\";\\nimport \\\"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../token/TokenListener.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TicketInterface.sol\\\";\\nimport \\\"../prize-pool/PrizePool.sol\\\";\\nimport \\\"../Constants.sol\\\";\\nimport \\\"./PeriodicPrizeStrategyListenerInterface.sol\\\";\\nimport \\\"./PeriodicPrizeStrategyListenerLibrary.sol\\\";\\nimport \\\"./BeforeAwardListener.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\nabstract contract PeriodicPrizeStrategy is Initializable,\\n                                           OwnableUpgradeable,\\n                                           TokenListener {\\n\\n  using SafeMathUpgradeable for uint256;\\n  using SafeMathUpgradeable for uint16;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using AddressUpgradeable for address;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  uint256 internal constant ETHEREUM_BLOCK_TIME_ESTIMATE_MANTISSA = 13.4 ether;\\n\\n  event PrizePoolOpened(\\n    address indexed operator,\\n    uint256 indexed prizePeriodStartedAt\\n  );\\n\\n  event RngRequestFailed();\\n\\n  event PrizePoolAwardStarted(\\n    address indexed operator,\\n    address indexed prizePool,\\n    uint32 indexed rngRequestId,\\n    uint32 rngLockBlock\\n  );\\n\\n  event PrizePoolAwardCancelled(\\n    address indexed operator,\\n    address indexed prizePool,\\n    uint32 indexed rngRequestId,\\n    uint32 rngLockBlock\\n  );\\n\\n  event PrizePoolAwarded(\\n    address indexed operator,\\n    uint256 randomNumber\\n  );\\n\\n  event RngServiceUpdated(\\n    RNGInterface indexed rngService\\n  );\\n\\n  event TokenListenerUpdated(\\n    TokenListenerInterface indexed tokenListener\\n  );\\n\\n  event RngRequestTimeoutSet(\\n    uint32 rngRequestTimeout\\n  );\\n\\n  event PrizePeriodSecondsUpdated(\\n    uint256 prizePeriodSeconds\\n  );\\n\\n  event BeforeAwardListenerSet(\\n    BeforeAwardListenerInterface indexed beforeAwardListener\\n  );\\n\\n  event PeriodicPrizeStrategyListenerSet(\\n    PeriodicPrizeStrategyListenerInterface indexed periodicPrizeStrategyListener\\n  );\\n\\n  event ExternalErc721AwardAdded(\\n    IERC721Upgradeable indexed externalErc721,\\n    uint256[] tokenIds\\n  );\\n\\n  event ExternalErc20AwardAdded(\\n    IERC20Upgradeable indexed externalErc20\\n  );\\n\\n  event ExternalErc721AwardRemoved(\\n    IERC721Upgradeable indexed externalErc721Award\\n  );\\n\\n  event ExternalErc20AwardRemoved(\\n    IERC20Upgradeable indexed externalErc20Award\\n  );\\n\\n  event Initialized(\\n    uint256 prizePeriodStart,\\n    uint256 prizePeriodSeconds,\\n    PrizePool indexed prizePool,\\n    TicketInterface ticket,\\n    IERC20Upgradeable sponsorship,\\n    RNGInterface rng,\\n    IERC20Upgradeable[] externalErc20Awards\\n  );\\n\\n  struct RngRequest {\\n    uint32 id;\\n    uint32 lockBlock;\\n    uint32 requestedAt;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  // Comptroller\\n  TokenListenerInterface public tokenListener;\\n\\n  // Contract Interfaces\\n  PrizePool public prizePool;\\n  TicketInterface public ticket;\\n  IERC20Upgradeable public sponsorship;\\n  RNGInterface public rng;\\n\\n  // Current RNG Request\\n  RngRequest internal rngRequest;\\n\\n  /// @notice RNG Request Timeout.  In fact, this is really a \\\"complete award\\\" timeout.\\n  /// If the rng completes the award can still be cancelled.\\n  uint32 public rngRequestTimeout;\\n\\n  // Prize period\\n  uint256 public prizePeriodSeconds;\\n  uint256 public prizePeriodStartedAt;\\n\\n  // External tokens awarded as part of prize\\n  MappedSinglyLinkedList.Mapping internal externalErc20s;\\n  MappedSinglyLinkedList.Mapping internal externalErc721s;\\n\\n  // External NFT token IDs to be awarded\\n  //   NFT Address => TokenIds\\n  mapping (IERC721Upgradeable => uint256[]) internal externalErc721TokenIds;\\n\\n  /// @notice A listener that is called before the prize is awarded\\n  BeforeAwardListenerInterface public beforeAwardListener;\\n\\n  /// @notice A listener that is called after the prize is awarded\\n  PeriodicPrizeStrategyListenerInterface public periodicPrizeStrategyListener;\\n\\n  /// @notice Initializes a new strategy\\n  /// @param _prizePeriodStart The starting timestamp of the prize period.\\n  /// @param _prizePeriodSeconds The duration of the prize period in seconds\\n  /// @param _prizePool The prize pool to award\\n  /// @param _ticket The ticket to use to draw winners\\n  /// @param _sponsorship The sponsorship token\\n  /// @param _rng The RNG service to use\\n  function initialize (\\n    uint256 _prizePeriodStart,\\n    uint256 _prizePeriodSeconds,\\n    PrizePool _prizePool,\\n    TicketInterface _ticket,\\n    IERC20Upgradeable _sponsorship,\\n    RNGInterface _rng,\\n    IERC20Upgradeable[] memory externalErc20Awards\\n  ) public initializer {\\n    require(address(_prizePool) != address(0), \\\"PeriodicPrizeStrategy/prize-pool-not-zero\\\");\\n    require(address(_ticket) != address(0), \\\"PeriodicPrizeStrategy/ticket-not-zero\\\");\\n    require(address(_sponsorship) != address(0), \\\"PeriodicPrizeStrategy/sponsorship-not-zero\\\");\\n    require(address(_rng) != address(0), \\\"PeriodicPrizeStrategy/rng-not-zero\\\");\\n    prizePool = _prizePool;\\n    ticket = _ticket;\\n    rng = _rng;\\n    sponsorship = _sponsorship;\\n    _setPrizePeriodSeconds(_prizePeriodSeconds);\\n\\n    __Ownable_init();\\n\\n    externalErc20s.initialize();\\n    for (uint256 i = 0; i < externalErc20Awards.length; i++) {\\n      _addExternalErc20Award(externalErc20Awards[i]);\\n    }\\n\\n    prizePeriodSeconds = _prizePeriodSeconds;\\n    prizePeriodStartedAt = _prizePeriodStart;\\n\\n    externalErc721s.initialize();\\n\\n    // 30 min timeout\\n    _setRngRequestTimeout(1800);\\n\\n    emit Initialized(\\n      _prizePeriodStart,\\n      _prizePeriodSeconds,\\n      _prizePool,\\n      _ticket,\\n      _sponsorship,\\n      _rng,\\n      externalErc20Awards\\n    );\\n    emit PrizePoolOpened(_msgSender(), prizePeriodStartedAt);\\n  }\\n\\n  function _distribute(uint256 randomNumber) internal virtual;\\n\\n  /// @notice Calculates and returns the currently accrued prize\\n  /// @return The current prize size\\n  function currentPrize() public view returns (uint256) {\\n    return prizePool.awardBalance();\\n  }\\n\\n  /// @notice Allows the owner to set the token listener\\n  /// @param _tokenListener A contract that implements the token listener interface.\\n  function setTokenListener(TokenListenerInterface _tokenListener) external onlyOwner requireAwardNotInProgress {\\n    require(address(0) == address(_tokenListener) || address(_tokenListener).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PeriodicPrizeStrategy/token-listener-invalid\\\");\\n\\n    tokenListener = _tokenListener;\\n\\n    emit TokenListenerUpdated(tokenListener);\\n  }\\n\\n  /// @notice Estimates the remaining blocks until the prize given a number of seconds per block\\n  /// @param secondsPerBlockMantissa The number of seconds per block to use for the calculation.  Should be a fixed point 18 number like Ether.\\n  /// @return The estimated number of blocks remaining until the prize can be awarded.\\n  function estimateRemainingBlocksToPrize(uint256 secondsPerBlockMantissa) public view returns (uint256) {\\n    return FixedPoint.divideUintByMantissa(\\n      _prizePeriodRemainingSeconds(),\\n      secondsPerBlockMantissa\\n    );\\n  }\\n\\n  /// @notice Returns the number of seconds remaining until the prize can be awarded.\\n  /// @return The number of seconds remaining until the prize can be awarded.\\n  function prizePeriodRemainingSeconds() external view returns (uint256) {\\n    return _prizePeriodRemainingSeconds();\\n  }\\n\\n  /// @notice Returns the number of seconds remaining until the prize can be awarded.\\n  /// @return The number of seconds remaining until the prize can be awarded.\\n  function _prizePeriodRemainingSeconds() internal view returns (uint256) {\\n    uint256 endAt = _prizePeriodEndAt();\\n    uint256 time = _currentTime();\\n    if (time > endAt) {\\n      return 0;\\n    }\\n    return endAt.sub(time);\\n  }\\n\\n  /// @notice Returns whether the prize period is over\\n  /// @return True if the prize period is over, false otherwise\\n  function isPrizePeriodOver() external view returns (bool) {\\n    return _isPrizePeriodOver();\\n  }\\n\\n  /// @notice Returns whether the prize period is over\\n  /// @return True if the prize period is over, false otherwise\\n  function _isPrizePeriodOver() internal view returns (bool) {\\n    return _currentTime() >= _prizePeriodEndAt();\\n  }\\n\\n  /// @notice Awards collateral as tickets to a user\\n  /// @param user Recipient of minted tokens\\n  /// @param amount Amount of minted tokens\\n  function _awardTickets(address user, uint256 amount) internal {\\n    prizePool.award(user, amount, address(ticket));\\n  }\\n  \\n  /// @notice Mints ticket or sponsorship tokens for user.\\n  /// @dev Mints ticket or sponsorship tokens by looking up the address in the prizePool.tokens mapping. \\n  /// @param user Recipient of minted tokens\\n  /// @param amount Amount of minted tokens\\n  /// @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\\n  function _awardToken(address user, uint256 amount, uint8 tokenIndex) internal {\\n    ControlledTokenInterface[] memory _controlledTokens = prizePool.tokens();\\n    require(tokenIndex <= _controlledTokens.length, \\\"PeriodicPrizeStrategy/award-invalid-token-index\\\");\\n    ControlledTokenInterface _token = _controlledTokens[tokenIndex];\\n    prizePool.award(user, amount, address(_token));\\n  }\\n\\n  /// @notice Awards all external tokens with non-zero balances to the given user.  The external tokens must be held by the PrizePool contract.\\n  /// @param winner The user to transfer the tokens to\\n  function _awardAllExternalTokens(address winner) internal {\\n    _awardExternalErc20s(winner);\\n    _awardExternalErc721s(winner);\\n  }\\n\\n  /// @notice Awards all external ERC20 tokens with non-zero balances to the given user.\\n  /// The external tokens must be held by the PrizePool contract.\\n  /// @param winner The user to transfer the tokens to\\n  function _awardExternalErc20s(address winner) internal {\\n    address currentToken = externalErc20s.start();\\n    while (currentToken != address(0) && currentToken != externalErc20s.end()) {\\n      uint256 balance = IERC20Upgradeable(currentToken).balanceOf(address(prizePool));\\n      if (balance > 0) {\\n        prizePool.awardExternalERC20(winner, currentToken, balance);\\n      }\\n      currentToken = externalErc20s.next(currentToken);\\n    }\\n  }\\n\\n  /// @notice Awards all external ERC721 tokens to the given user.\\n  /// The external tokens must be held by the PrizePool contract.\\n  /// @dev The list of ERC721s is reset after every award\\n  /// @param winner The user to transfer the tokens to\\n  function _awardExternalErc721s(address winner) internal {\\n    address currentToken = externalErc721s.start();\\n    while (currentToken != address(0) && currentToken != externalErc721s.end()) {\\n      uint256 balance = IERC721Upgradeable(currentToken).balanceOf(address(prizePool));\\n      if (balance > 0) {\\n        prizePool.awardExternalERC721(winner, currentToken, externalErc721TokenIds[IERC721Upgradeable(currentToken)]);\\n        _removeExternalErc721AwardTokens(IERC721Upgradeable(currentToken));\\n      }\\n      currentToken = externalErc721s.next(currentToken);\\n    }\\n    externalErc721s.clearAll();\\n  }\\n\\n  /// @notice Returns the timestamp at which the prize period ends\\n  /// @return The timestamp at which the prize period ends.\\n  function prizePeriodEndAt() external view returns (uint256) {\\n    // current prize started at is non-inclusive, so add one\\n    return _prizePeriodEndAt();\\n  }\\n\\n  /// @notice Returns the timestamp at which the prize period ends\\n  /// @return The timestamp at which the prize period ends.\\n  function _prizePeriodEndAt() internal view returns (uint256) {\\n    // current prize started at is non-inclusive, so add one\\n    return prizePeriodStartedAt.add(prizePeriodSeconds);\\n  }\\n\\n  /// @notice Called by the PrizePool for transfers of controlled tokens\\n  /// @dev Note that this is only for *transfers*, not mints or burns\\n  /// @param controlledToken The type of collateral that is being sent\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external override onlyPrizePool {\\n    require(from != to, \\\"PeriodicPrizeStrategy/transfer-to-self\\\");\\n\\n    if (controlledToken == address(ticket)) {\\n      _requireAwardNotInProgress();\\n    }\\n\\n    if (address(tokenListener) != address(0)) {\\n      tokenListener.beforeTokenTransfer(from, to, amount, controlledToken);\\n    }\\n  }\\n\\n  /// @notice Called by the PrizePool when minting controlled tokens\\n  /// @param controlledToken The type of collateral that is being minted\\n  function beforeTokenMint(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external\\n    override\\n    onlyPrizePool\\n  {\\n    if (controlledToken == address(ticket)) {\\n      _requireAwardNotInProgress();\\n    }\\n    if (address(tokenListener) != address(0)) {\\n      tokenListener.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n  }\\n\\n  /// @notice returns the current time.  Used for testing.\\n  /// @return The current time (block.timestamp)\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice returns the current time.  Used for testing.\\n  /// @return The current time (block.timestamp)\\n  function _currentBlock() internal virtual view returns (uint256) {\\n    return block.number;\\n  }\\n\\n  /// @notice Starts the award process by starting random number request.  The prize period must have ended.\\n  /// @dev The RNG-Request-Fee is expected to be held within this contract before calling this function\\n  function startAward() external requireCanStartAward {\\n    (address feeToken, uint256 requestFee) = rng.getRequestFee();\\n    if (feeToken != address(0) && requestFee > 0) {\\n      IERC20Upgradeable(feeToken).safeApprove(address(rng), requestFee);\\n    }\\n\\n    (uint32 requestId, uint32 lockBlock) = rng.requestRandomNumber();\\n    rngRequest.id = requestId;\\n    rngRequest.lockBlock = lockBlock;\\n    rngRequest.requestedAt = _currentTime().toUint32();\\n\\n    emit PrizePoolAwardStarted(_msgSender(), address(prizePool), requestId, lockBlock);\\n  }\\n\\n  /// @notice Can be called by anyone to unlock the tickets if the RNG has timed out.\\n  function cancelAward() public {\\n    require(isRngTimedOut(), \\\"PeriodicPrizeStrategy/rng-not-timedout\\\");\\n    uint32 requestId = rngRequest.id;\\n    uint32 lockBlock = rngRequest.lockBlock;\\n    delete rngRequest;\\n    emit RngRequestFailed();\\n    emit PrizePoolAwardCancelled(msg.sender, address(prizePool), requestId, lockBlock);\\n  }\\n\\n  /// @notice Completes the award process and awards the winners.  The random number must have been requested and is now available.\\n  function completeAward() external requireCanCompleteAward {\\n    uint256 randomNumber = rng.randomNumber(rngRequest.id);\\n    delete rngRequest;\\n\\n    if (address(beforeAwardListener) != address(0)) {\\n      beforeAwardListener.beforePrizePoolAwarded(randomNumber, prizePeriodStartedAt);\\n    }\\n    _distribute(randomNumber);\\n    if (address(periodicPrizeStrategyListener) != address(0)) {\\n      periodicPrizeStrategyListener.afterPrizePoolAwarded(randomNumber, prizePeriodStartedAt);\\n    }\\n\\n    // to avoid clock drift, we should calculate the start time based on the previous period start time.\\n    prizePeriodStartedAt = _calculateNextPrizePeriodStartTime(_currentTime());\\n\\n    emit PrizePoolAwarded(_msgSender(), randomNumber);\\n    emit PrizePoolOpened(_msgSender(), prizePeriodStartedAt);\\n  }\\n\\n  /// @notice Allows the owner to set a listener that is triggered immediately before the award is distributed\\n  /// @dev The listener must implement ERC165 and the BeforeAwardListenerInterface\\n  /// @param _beforeAwardListener The address of the listener contract\\n  function setBeforeAwardListener(BeforeAwardListenerInterface _beforeAwardListener) external onlyOwner requireAwardNotInProgress {\\n    require(\\n      address(0) == address(_beforeAwardListener) || address(_beforeAwardListener).supportsInterface(BeforeAwardListenerLibrary.ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER),\\n      \\\"PeriodicPrizeStrategy/beforeAwardListener-invalid\\\"\\n    );\\n\\n    beforeAwardListener = _beforeAwardListener;\\n\\n    emit BeforeAwardListenerSet(_beforeAwardListener);\\n  }\\n\\n  /// @notice Allows the owner to set a listener for prize strategy callbacks.\\n  /// @param _periodicPrizeStrategyListener The address of the listener contract\\n  function setPeriodicPrizeStrategyListener(PeriodicPrizeStrategyListenerInterface _periodicPrizeStrategyListener) external onlyOwner requireAwardNotInProgress {\\n    require(\\n      address(0) == address(_periodicPrizeStrategyListener) || address(_periodicPrizeStrategyListener).supportsInterface(PeriodicPrizeStrategyListenerLibrary.ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER),\\n      \\\"PeriodicPrizeStrategy/prizeStrategyListener-invalid\\\"\\n    );\\n\\n    periodicPrizeStrategyListener = _periodicPrizeStrategyListener;\\n\\n    emit PeriodicPrizeStrategyListenerSet(_periodicPrizeStrategyListener);\\n  }\\n\\n  function _calculateNextPrizePeriodStartTime(uint256 currentTime) internal view returns (uint256) {\\n    uint256 elapsedPeriods = currentTime.sub(prizePeriodStartedAt).div(prizePeriodSeconds);\\n    return prizePeriodStartedAt.add(elapsedPeriods.mul(prizePeriodSeconds));\\n  }\\n\\n  /// @notice Calculates when the next prize period will start\\n  /// @param currentTime The timestamp to use as the current time\\n  /// @return The timestamp at which the next prize period would start\\n  function calculateNextPrizePeriodStartTime(uint256 currentTime) external view returns (uint256) {\\n    return _calculateNextPrizePeriodStartTime(currentTime);\\n  }\\n\\n  /// @notice Returns whether an award process can be started\\n  /// @return True if an award can be started, false otherwise.\\n  function canStartAward() external view returns (bool) {\\n    return _isPrizePeriodOver() && !isRngRequested();\\n  }\\n\\n  /// @notice Returns whether an award process can be completed\\n  /// @return True if an award can be completed, false otherwise.\\n  function canCompleteAward() external view returns (bool) {\\n    return isRngRequested() && isRngCompleted();\\n  }\\n\\n  /// @notice Returns whether a random number has been requested\\n  /// @return True if a random number has been requested, false otherwise.\\n  function isRngRequested() public view returns (bool) {\\n    return rngRequest.id != 0;\\n  }\\n\\n  /// @notice Returns whether the random number request has completed.\\n  /// @return True if a random number request has completed, false otherwise.\\n  function isRngCompleted() public view returns (bool) {\\n    return rng.isRequestComplete(rngRequest.id);\\n  }\\n\\n  /// @notice Returns the block number that the current RNG request has been locked to\\n  /// @return The block number that the RNG request is locked to\\n  function getLastRngLockBlock() external view returns (uint32) {\\n    return rngRequest.lockBlock;\\n  }\\n\\n  /// @notice Returns the current RNG Request ID\\n  /// @return The current Request ID\\n  function getLastRngRequestId() external view returns (uint32) {\\n    return rngRequest.id;\\n  }\\n\\n  /// @notice Sets the RNG service that the Prize Strategy is connected to\\n  /// @param rngService The address of the new RNG service interface\\n  function setRngService(RNGInterface rngService) external onlyOwner requireAwardNotInProgress {\\n    require(!isRngRequested(), \\\"PeriodicPrizeStrategy/rng-in-flight\\\");\\n\\n    rng = rngService;\\n    emit RngServiceUpdated(rngService);\\n  }\\n\\n  /// @notice Allows the owner to set the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\\n  /// @param _rngRequestTimeout The RNG request timeout in seconds.\\n  function setRngRequestTimeout(uint32 _rngRequestTimeout) external onlyOwner requireAwardNotInProgress {\\n    _setRngRequestTimeout(_rngRequestTimeout);\\n  }\\n\\n  /// @notice Sets the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\\n  /// @param _rngRequestTimeout The RNG request timeout in seconds.\\n  function _setRngRequestTimeout(uint32 _rngRequestTimeout) internal {\\n    require(_rngRequestTimeout > 60, \\\"PeriodicPrizeStrategy/rng-timeout-gt-60-secs\\\");\\n    rngRequestTimeout = _rngRequestTimeout;\\n    emit RngRequestTimeoutSet(rngRequestTimeout);\\n  }\\n\\n  /// @notice Allows the owner to set the prize period in seconds.\\n  /// @param _prizePeriodSeconds The new prize period in seconds.  Must be greater than zero.\\n  function setPrizePeriodSeconds(uint256 _prizePeriodSeconds) external onlyOwner requireAwardNotInProgress {\\n    _setPrizePeriodSeconds(_prizePeriodSeconds);\\n  }\\n\\n  /// @notice Sets the prize period in seconds.\\n  /// @param _prizePeriodSeconds The new prize period in seconds.  Must be greater than zero.\\n  function _setPrizePeriodSeconds(uint256 _prizePeriodSeconds) internal {\\n    require(_prizePeriodSeconds > 0, \\\"PeriodicPrizeStrategy/prize-period-greater-than-zero\\\");\\n    prizePeriodSeconds = _prizePeriodSeconds;\\n\\n    emit PrizePeriodSecondsUpdated(prizePeriodSeconds);\\n  }\\n\\n  /// @notice Gets the current list of External ERC20 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC20 token addresses\\n  function getExternalErc20Awards() external view returns (address[] memory) {\\n    return externalErc20s.addressArray();\\n  }\\n\\n  /// @notice Adds an external ERC20 token type as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can assign external tokens,\\n  /// and they must be approved by the Prize-Pool\\n  /// @param _externalErc20 The address of an ERC20 token to be awarded\\n  function addExternalErc20Award(IERC20Upgradeable _externalErc20) external onlyOwnerOrListener requireAwardNotInProgress {\\n    _addExternalErc20Award(_externalErc20);\\n  }\\n\\n  function _addExternalErc20Award(IERC20Upgradeable _externalErc20) internal {\\n    require(address(_externalErc20).isContract(), \\\"PeriodicPrizeStrategy/erc20-null\\\");\\n    require(prizePool.canAwardExternal(address(_externalErc20)), \\\"PeriodicPrizeStrategy/cannot-award-external\\\");\\n    (bool succeeded, bytes memory returnValue) = address(_externalErc20).staticcall(abi.encodeWithSignature(\\\"totalSupply()\\\"));\\n    require(succeeded, \\\"PeriodicPrizeStrategy/erc20-invalid\\\");\\n    externalErc20s.addAddress(address(_externalErc20));\\n    emit ExternalErc20AwardAdded(_externalErc20);\\n  }\\n\\n  function addExternalErc20Awards(IERC20Upgradeable[] calldata _externalErc20s) external onlyOwnerOrListener requireAwardNotInProgress {\\n    for (uint256 i = 0; i < _externalErc20s.length; i++) {\\n      _addExternalErc20Award(_externalErc20s[i]);\\n    }\\n  }\\n\\n  /// @notice Removes an external ERC20 token type as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can remove external tokens\\n  /// @param _externalErc20 The address of an ERC20 token to be removed\\n  /// @param _prevExternalErc20 The address of the previous ERC20 token in the `externalErc20s` list.\\n  /// If the ERC20 is the first address, then the previous address is the SENTINEL address: 0x0000000000000000000000000000000000000001\\n  function removeExternalErc20Award(IERC20Upgradeable _externalErc20, IERC20Upgradeable _prevExternalErc20) external onlyOwner requireAwardNotInProgress {\\n    externalErc20s.removeAddress(address(_prevExternalErc20), address(_externalErc20));\\n    emit ExternalErc20AwardRemoved(_externalErc20);\\n  }\\n\\n  /// @notice Gets the current list of External ERC721 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC721 token addresses\\n  function getExternalErc721Awards() external view returns (address[] memory) {\\n    return externalErc721s.addressArray();\\n  }\\n\\n  /// @notice Gets the current list of External ERC721 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC721 token addresses\\n  function getExternalErc721AwardTokenIds(IERC721Upgradeable _externalErc721) external view returns (uint256[] memory) {\\n    return externalErc721TokenIds[_externalErc721];\\n  }\\n\\n  /// @notice Adds an external ERC721 token as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can assign external tokens,\\n  /// and they must be approved by the Prize-Pool\\n  /// NOTE: The NFT must already be owned by the Prize-Pool\\n  /// @param _externalErc721 The address of an ERC721 token to be awarded\\n  /// @param _tokenIds An array of token IDs of the ERC721 to be awarded\\n  function addExternalErc721Award(IERC721Upgradeable _externalErc721, uint256[] calldata _tokenIds) external onlyOwnerOrListener requireAwardNotInProgress {\\n    require(prizePool.canAwardExternal(address(_externalErc721)), \\\"PeriodicPrizeStrategy/cannot-award-external\\\");\\n    require(address(_externalErc721).supportsInterface(Constants.ERC165_INTERFACE_ID_ERC721), \\\"PeriodicPrizeStrategy/erc721-invalid\\\");\\n    \\n    if (!externalErc721s.contains(address(_externalErc721))) {\\n      externalErc721s.addAddress(address(_externalErc721));\\n    }\\n\\n    for (uint256 i = 0; i < _tokenIds.length; i++) {\\n      _addExternalErc721Award(_externalErc721, _tokenIds[i]);\\n    }\\n\\n    emit ExternalErc721AwardAdded(_externalErc721, _tokenIds);\\n  }\\n\\n  function _addExternalErc721Award(IERC721Upgradeable _externalErc721, uint256 _tokenId) internal {\\n    require(IERC721Upgradeable(_externalErc721).ownerOf(_tokenId) == address(prizePool), \\\"PeriodicPrizeStrategy/unavailable-token\\\");\\n    for (uint256 i = 0; i < externalErc721TokenIds[_externalErc721].length; i++) {\\n      if (externalErc721TokenIds[_externalErc721][i] == _tokenId) {\\n        revert(\\\"PeriodicPrizeStrategy/erc721-duplicate\\\");\\n      }\\n    }\\n    externalErc721TokenIds[_externalErc721].push(_tokenId);\\n  }\\n\\n  /// @notice Removes an external ERC721 token as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can remove external tokens\\n  /// @param _externalErc721 The address of an ERC721 token to be removed\\n  /// @param _prevExternalErc721 The address of the previous ERC721 token in the list.\\n  /// If no previous, then pass the SENTINEL address: 0x0000000000000000000000000000000000000001\\n  function removeExternalErc721Award(\\n    IERC721Upgradeable _externalErc721,\\n    IERC721Upgradeable _prevExternalErc721\\n  )\\n    external\\n    onlyOwner\\n    requireAwardNotInProgress\\n  {\\n    externalErc721s.removeAddress(address(_prevExternalErc721), address(_externalErc721));\\n    _removeExternalErc721AwardTokens(_externalErc721);\\n  }\\n\\n  function _removeExternalErc721AwardTokens(\\n    IERC721Upgradeable _externalErc721\\n  )\\n    internal\\n  {\\n    delete externalErc721TokenIds[_externalErc721];\\n    emit ExternalErc721AwardRemoved(_externalErc721);\\n  }\\n\\n  function _requireAwardNotInProgress() internal view {\\n    uint256 currentBlock = _currentBlock();\\n    require(rngRequest.lockBlock == 0 || currentBlock < rngRequest.lockBlock, \\\"PeriodicPrizeStrategy/rng-in-flight\\\");\\n  }\\n\\n  function isRngTimedOut() public view returns (bool) {\\n    if (rngRequest.requestedAt == 0) {\\n      return false;\\n    } else {\\n      return _currentTime() > uint256(rngRequestTimeout).add(rngRequest.requestedAt);\\n    }\\n  }\\n\\n  modifier onlyOwnerOrListener() {\\n    require(_msgSender() == owner() ||\\n            _msgSender() == address(periodicPrizeStrategyListener) ||\\n            _msgSender() == address(beforeAwardListener),\\n            \\\"PeriodicPrizeStrategy/only-owner-or-listener\\\");\\n    _;\\n  }\\n\\n  modifier requireAwardNotInProgress() {\\n    _requireAwardNotInProgress();\\n    _;\\n  }\\n\\n  modifier requireCanStartAward() {\\n    require(_isPrizePeriodOver(), \\\"PeriodicPrizeStrategy/prize-period-not-over\\\");\\n    require(!isRngRequested(), \\\"PeriodicPrizeStrategy/rng-already-requested\\\");\\n    _;\\n  }\\n\\n  modifier requireCanCompleteAward() {\\n    require(isRngRequested(), \\\"PeriodicPrizeStrategy/rng-not-requested\\\");\\n    require(isRngCompleted(), \\\"PeriodicPrizeStrategy/rng-not-complete\\\");\\n    _;\\n  }\\n\\n  modifier onlyPrizePool() {\\n    require(_msgSender() == address(prizePool), \\\"PeriodicPrizeStrategy/only-prize-pool\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0xd7bf198ab616ed4b3e9c29d20477887d5a1e000e137e447da20bcec73b7cf997\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ninterface PeriodicPrizeStrategyListenerInterface is IERC165Upgradeable {\\n  function afterPrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x229624266562f60200b4e40ebc95a35a8aad799c0ff95a42df243af98a44d198\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary PeriodicPrizeStrategyListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('afterPrizePoolAwarded(uint256,uint256)')) == 0x575072c6\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER = 0x575072c6;\\n}\\n\",\"keccak256\":\"0xed291b9a33e265535032557f0a5430a150701c9eb58b0138c120eb02bc13b514\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PrizeSplit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\n\\n/**\\n  * @title Abstract prize split contract for adding unique award distribution to static addresses. \\n  * @author Kames Geraghty (PoolTogether Inc)\\n*/\\nabstract contract PrizeSplit is OwnableUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  \\n  PrizeSplitConfig[] internal _prizeSplits;\\n\\n  /**\\n    * @notice The prize split configuration struct.\\n    * @dev The prize split configuration struct used to award prize splits during distribution.\\n    * @param target Address of recipient receiving the prize split distribution\\n    * @param percentage Percentage of prize split using a 0-1000 range for single decimal precision i.e. 125 = 12.5%\\n    * @param token Position of controlled token in prizePool.tokens (i.e. ticket or sponsorship)\\n  */\\n  struct PrizeSplitConfig {\\n      address target;\\n      uint16 percentage;\\n      uint8 token;\\n  }\\n\\n  /**\\n    * @notice Emitted when a PrizeSplitConfig config is added or updated.\\n    * @dev Emitted when aPrizeSplitConfig config is added or updated in setPrizeSplits or setPrizeSplit.\\n    * @param target Address of prize split recipient\\n    * @param percentage Percentage of prize split. Must be between 0 and 1000 for single decimal precision\\n    * @param token Index (0 or 1) of token in the prizePool.tokens mapping\\n    * @param index Index of prize split in the prizeSplts array\\n  */\\n  event PrizeSplitSet(address indexed target, uint16 percentage, uint8 token, uint256 index);\\n\\n  /**\\n    * @notice Emitted when a PrizeSplitConfig config is removed.\\n    * @dev Emitted when a PrizeSplitConfig config is removed from the _prizeSplits array.\\n    * @param target Index of a previously active prize split config\\n  */\\n  event PrizeSplitRemoved(uint256 indexed target);\\n\\n  /**\\n    * @notice Mints ticket or sponsorship tokens to prize split recipient.\\n    * @dev Mints ticket or sponsorship tokens to prize split recipient via the linked PrizePool contract.\\n    * @param target Recipient of minted tokens\\n    * @param amount Amount of minted tokens\\n    * @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\\n  */\\n  function _awardPrizeSplitAmount(address target, uint256 amount, uint8 tokenIndex) virtual internal;\\n\\n  /**\\n    * @notice Read all prize splits configs.\\n    * @dev Read all PrizeSplitConfig structs stored in _prizeSplits.\\n    * @return _prizeSplits Array of PrizeSplitConfig structs\\n  */\\n  function prizeSplits() external view returns (PrizeSplitConfig[] memory) {\\n    return _prizeSplits;\\n  }\\n\\n  /**\\n    * @notice Read prize split config from active PrizeSplits.\\n    * @dev Read PrizeSplitConfig struct from _prizeSplits array.\\n    * @param prizeSplitIndex Index position of PrizeSplitConfig\\n    * @return PrizeSplitConfig Single prize split config\\n  */\\n  function prizeSplit(uint256 prizeSplitIndex) external view returns (PrizeSplitConfig memory) {\\n    return _prizeSplits[prizeSplitIndex];\\n  }\\n\\n  /**\\n    * @notice Set and remove prize split(s) configs.\\n    * @dev Set and remove prize split configs by passing a new PrizeSplitConfig structs array. Will remove existing PrizeSplitConfig(s) if passed array length is less than existing _prizeSplits length.\\n    * @param newPrizeSplits Array of PrizeSplitConfig structs\\n  */\\n  function setPrizeSplits(PrizeSplitConfig[] calldata newPrizeSplits) external onlyOwner {\\n    uint256 newPrizeSplitsLength = newPrizeSplits.length;\\n\\n    // Add and/or update prize split configs using newPrizeSplits PrizeSplitConfig structs array.\\n    for (uint256 index = 0; index < newPrizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = newPrizeSplits[index];\\n      require(split.token <= 1, \\\"MultipleWinners/invalid-prizesplit-token\\\");\\n      require(split.target != address(0), \\\"MultipleWinners/invalid-prizesplit-target\\\");\\n      \\n      if (_prizeSplits.length <= index) {\\n        _prizeSplits.push(split);\\n      } else {\\n        PrizeSplitConfig memory currentSplit = _prizeSplits[index];\\n        if (split.target != currentSplit.target || split.percentage != currentSplit.percentage || split.token != currentSplit.token) {\\n          _prizeSplits[index] = split;\\n        } else {\\n          continue;\\n        }\\n      }\\n\\n      // Emit the added/updated prize split config.\\n      emit PrizeSplitSet(split.target, split.percentage, split.token, index);\\n    }\\n\\n    // Remove old prize splits configs. Match storage _prizesSplits.length with the passed newPrizeSplits.length\\n    while (_prizeSplits.length > newPrizeSplitsLength) {\\n      uint256 _index = _prizeSplits.length.sub(1);\\n      _prizeSplits.pop();\\n      emit PrizeSplitRemoved(_index);\\n    }\\n\\n    // Total prize split do not exceed 100%\\n    uint256 totalPercentage = _totalPrizeSplitPercentageAmount();\\n    require(totalPercentage <= 1000, \\\"MultipleWinners/invalid-prizesplit-percentage-total\\\");\\n  }\\n\\n  /**\\n    * @notice Updates a previously set prize split config.\\n    * @dev Updates a prize split config by passing a new PrizeSplitConfig struct and current index position. Limited to contract owner.\\n    * @param prizeStrategySplit PrizeSplitConfig config struct\\n    * @param prizeSplitIndex Index position of PrizeSplitConfig to update\\n  */\\n  function setPrizeSplit(PrizeSplitConfig memory prizeStrategySplit, uint8 prizeSplitIndex) external onlyOwner {\\n    require(prizeSplitIndex < _prizeSplits.length, \\\"MultipleWinners/nonexistent-prizesplit\\\");\\n    require(prizeStrategySplit.token <= 1, \\\"MultipleWinners/invalid-prizesplit-token\\\");\\n    require(prizeStrategySplit.target != address(0), \\\"MultipleWinners/invalid-prizesplit-target\\\");\\n    \\n    // Update the prize split config\\n    _prizeSplits[prizeSplitIndex] = prizeStrategySplit;\\n\\n    // Total prize split do not exceed 100%\\n    uint256 totalPercentage = _totalPrizeSplitPercentageAmount();\\n    require(totalPercentage <= 1000, \\\"MultipleWinners/invalid-prizesplit-percentage-total\\\");\\n\\n    // Emit updated prize split config\\n    emit PrizeSplitSet(prizeStrategySplit.target, prizeStrategySplit.percentage, prizeStrategySplit.token, prizeSplitIndex);\\n  }\\n\\n  /**\\n  * @notice Calculate single prize split distribution amount.\\n  * @dev Calculate single prize split distribution amount using the total prize amount and prize split percentage.\\n  * @param amount Total prize award distribution amount\\n  * @param percentage Percentage with single decimal precision using 0-1000 ranges\\n  */\\n  function _getPrizeSplitAmount(uint256 amount, uint16 percentage) internal pure returns (uint256) {\\n    return (amount * percentage).div(1000);\\n  }\\n\\n  /**\\n  * @notice Calculates total prize split percentage amount.\\n  * @dev Calculates total PrizeSplitConfig percentage(s) amount. Used to check the total does not exceed 100% of award distribution.\\n  * @return Total prize split(s) percentage amount\\n  */\\n  function _totalPrizeSplitPercentageAmount() internal view returns (uint256) {\\n    uint256 _tempTotalPercentage;\\n    uint256 prizeSplitsLength = _prizeSplits.length;\\n    for (uint8 index = 0; index < prizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = _prizeSplits[index];\\n      _tempTotalPercentage = _tempTotalPercentage.add(split.percentage);\\n    }\\n    return _tempTotalPercentage;\\n  }\\n\\n  /**\\n  * @notice Distributes prize split(s).\\n  * @dev Distributes prize split(s) by awarding ticket or sponsorship tokens.\\n  * @param prize Starting prize award amount\\n  * @return Total prize award distribution amount exlcuding the awarded prize split(s)\\n  */\\n  function _distributePrizeSplits(uint256 prize) internal returns (uint256) {\\n    // Store temporary total prize amount for multiple calculations using initial prize amount.\\n    uint256 _prizeTemp = prize;\\n    uint256 prizeSplitsLength = _prizeSplits.length;\\n    for (uint256 index = 0; index < prizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = _prizeSplits[index];\\n      uint256 _splitAmount = _getPrizeSplitAmount(_prizeTemp, split.percentage);\\n\\n      // Award the prize split distribution amount.\\n      _awardPrizeSplitAmount(split.target, _splitAmount, split.token);\\n\\n      // Update the remaining prize amount after distributing the prize split percentage.\\n      prize = prize.sub(_splitAmount);\\n    }\\n\\n    return prize;\\n  }\\n\\n}\",\"keccak256\":\"0xc736c25922cf9065c73a06108d4d05c18af9a9e393c5280ba5d4cdb1863f3dbd\",\"license\":\"MIT\"},\"contracts/prize-strategy/multiple-winners/MultipleWinners.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"../PrizeSplit.sol\\\";\\nimport \\\"../PeriodicPrizeStrategy.sol\\\";\\n\\ncontract MultipleWinners is PeriodicPrizeStrategy, PrizeSplit {\\n\\n  // Maximum number number of winners per award distribution period\\n  uint256 internal __numberOfWinners;\\n  \\n  // Toggle for distributing external ERC 20 awards to all winners\\n  bool public splitExternalErc20Awards;\\n\\n  // Mapping of addresses isBlocked status. Can prevent an address from selected during award distribution\\n  mapping(address => bool) public isBlocklisted;\\n\\n  // Carry over the awarded prize for the next drawing when selected winners is less than __numberOfWinners\\n  bool public carryOverBlocklist;\\n\\n  // Limit ticket.draw() retry attempts when a blocked address is selected in _distribute.\\n  uint256 public blocklistRetryCount;\\n\\n  /**\\n    * @notice Emitted when splitExternalErc20Awards is toggled.\\n    * @dev Emitted when splitExternalErc20Awards is toggled between awarding external ERC20 to main or all winners.\\n  */\\n  event SplitExternalErc20AwardsSet(bool splitExternalErc20Awards);\\n\\n  /**\\n    * @notice Emitted when numberOfWinners is set.\\n    * @dev Emitted when numberOfWinners is set, which limits the maximum number of potentially selected winners.\\n    * @param numberOfWinners Maximum potentially selected winners\\n  */\\n  event NumberOfWinnersSet(uint256 numberOfWinners);\\n\\n  /**\\n    * @notice Emitted when carryOverBlocklist is toggled.\\n    * @dev Emitted when carryOverBlocklist is toggled for distribution of the primary and secondary prizes.\\n    * @param carry Awarded prize carry over status\\n  */\\n  event BlocklistCarrySet(bool carry);\\n\\n  /**\\n    * @notice Emitted when a user is blocked/unblocked from receiving a prize award.\\n    * @dev Emitted when a contract owner blocks/unblocks user from award selection in _distribute.\\n    * @param user Address of user to block or unblock\\n    * @param isBlocked User blocked status\\n  */\\n  event BlocklistSet(address indexed user, bool isBlocked);\\n\\n  /**\\n    * @notice Emitted when a new draw retry limit is set.\\n    * @dev Emitted when a new draw retry limit is set. Retry limit is set to limit gas spendings if a blocked user continues to be drawn.\\n    * @param count Number of winner selection retry attempts \\n  */\\n  event BlocklistRetryCountSet(uint256 count);\\n\\n  /**\\n    * @notice Emitted when the winner selection retry limit is reached during award distribution.\\n    * @dev Emitted when the maximum number of users has not been selected after the blocklistRetryCount is reached.\\n    * @param numberOfWinners Total number of winners selected before the blocklistRetryCount is reached.\\n  */\\n  event RetryMaxLimitReached(uint256 numberOfWinners);\\n\\n  /**\\n    * @notice Emitted when no winner can be selected during the prize distribution. \\n    * @dev Emitted when no winner can be selected in _distribute due to ticket.totalSupply() equaling zero.\\n  */\\n  event NoWinners();\\n\\n  function initializeMultipleWinners (\\n    uint256 _prizePeriodStart,\\n    uint256 _prizePeriodSeconds,\\n    PrizePool _prizePool,\\n    TicketInterface _ticket,\\n    IERC20Upgradeable _sponsorship,\\n    RNGInterface _rng,\\n    uint256 _numberOfWinners\\n  ) public initializer {\\n    IERC20Upgradeable[] memory _externalErc20Awards;\\n\\n    PeriodicPrizeStrategy.initialize(\\n      _prizePeriodStart,\\n      _prizePeriodSeconds,\\n      _prizePool,\\n      _ticket,\\n      _sponsorship,\\n      _rng,\\n      _externalErc20Awards\\n    );\\n\\n    _setNumberOfWinners(_numberOfWinners);\\n  }\\n\\n  /**\\n    * @notice Block/unblock a user from winning during prize distribution.\\n    * @dev Block/unblock a user from winning award in prize distribution by updating the isBlocklisted mapping.\\n    * @param _user Address of blocked user\\n    * @param _isBlocked Blocked Status (true or false) of user\\n  */\\n  function setBlocklisted(address _user, bool _isBlocked) external onlyOwner requireAwardNotInProgress returns (bool) {\\n    isBlocklisted[_user] = _isBlocked;\\n\\n    emit BlocklistSet(_user, _isBlocked);\\n\\n    return true;\\n  }\\n\\n  /**\\n    * @notice Toggle if an unawarded prize amount should be kept for the next draw or evenly distrubted to selected winners. \\n    * @dev Toggles if the main prize (prizePool.captureAwardBalance) and secondary prizes (LootBox) should be kept for the next draw or evenly distrubted if maximum number of winners is not selected. \\n    * @param _carry Award carry over status (true or false)\\n  */\\n  function setCarryBlocklist(bool _carry) external onlyOwner requireAwardNotInProgress returns (bool) {\\n    carryOverBlocklist = _carry;\\n\\n    emit BlocklistCarrySet(_carry);\\n\\n    return true;\\n  }\\n\\n  /**\\n    * @notice Sets the number of attempts for winner selection if a blocked address is chosen.\\n    * @dev Limits winner selection (ticket.draw) retries to avoid to gas limit reached errors. Increases the probability of not reaching the maximum number of winners if to low.\\n    * @param _count Number of retry attempts\\n  */\\n  function setBlocklistRetryCount(uint256 _count) external onlyOwner requireAwardNotInProgress returns (bool) {\\n    blocklistRetryCount = _count;\\n\\n    emit BlocklistRetryCountSet(_count);\\n\\n    return true;\\n  }\\n  \\n  /**\\n    * @notice Toggle external ERC20 awards for all prize winners.\\n    * @dev Toggle external ERC20 awards for all prize winners. If unset will distribute external ERC20 awards to main winner.\\n    * @param _splitExternalErc20Awards Toggle splitting external ERC20 awards.\\n  */\\n  function setSplitExternalErc20Awards(bool _splitExternalErc20Awards) external onlyOwner requireAwardNotInProgress {\\n    splitExternalErc20Awards = _splitExternalErc20Awards;\\n\\n    emit SplitExternalErc20AwardsSet(splitExternalErc20Awards);\\n  }\\n\\n  /**\\n    * @notice Sets maximum number of winners.\\n    * @dev Sets maximum number of winners per award distribution period.\\n    * @param count Number of winners.\\n  */\\n  function setNumberOfWinners(uint256 count) external onlyOwner requireAwardNotInProgress {\\n    _setNumberOfWinners(count);\\n  }\\n\\n   /**\\n    * @dev Set the maximum number of winners. Must be greater than 0.\\n    * @param count Number of winners.\\n  */\\n  function _setNumberOfWinners(uint256 count) internal {\\n    require(count > 0, \\\"MultipleWinners/winners-gte-one\\\");\\n\\n    __numberOfWinners = count;\\n    emit NumberOfWinnersSet(count);\\n  }\\n\\n  /**\\n    * @notice Maximum number of winners per award distribution period\\n    * @dev Read maximum number of winners per award distribution period from internal __numberOfWinners variable.\\n    * @return __numberOfWinners The total number of winners per prize award.\\n  */\\n  function numberOfWinners() external view returns (uint256) {\\n    return __numberOfWinners;\\n  }\\n\\n  /**\\n    * @notice Award ticket or sponsorship tokens to prize split recipient.\\n    * @dev Award ticket or sponsorship tokens to prize split recipient via the linked PrizePool contract.\\n    * @param target Recipient of minted tokens\\n    * @param amount Amount of minted tokens\\n    * @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\\n  */\\n  function _awardPrizeSplitAmount(address target, uint256 amount, uint8 tokenIndex) override internal {\\n    _awardToken(target, amount, tokenIndex);\\n  }\\n\\n  /**\\n    * @notice Distributes captured award balance to winners\\n    * @dev Distributes the captured award balance to the main winner and secondary winners if __numberOfWinners greater than 1.\\n    * @param randomNumber Random number seed used to select winners\\n  */\\n  function _distribute(uint256 randomNumber) internal override {\\n    uint256 prize = prizePool.captureAwardBalance();\\n    \\n    // distributes prize to prize splits and returns remaining award.\\n    prize = _distributePrizeSplits(prize);\\n\\n    if (IERC20Upgradeable(address(ticket)).totalSupply() == 0) {\\n      emit NoWinners();\\n      return;\\n    }\\n\\n    bool _carryOverBlocklistPrizes = carryOverBlocklist;\\n\\n    // main winner is simply the first that is drawn\\n    uint256 numberOfWinners = __numberOfWinners;\\n    address[] memory winners = new address[](numberOfWinners);\\n    uint256 nextRandom = randomNumber;\\n    uint256 winnerCount = 0;\\n    uint256 retries = 0;\\n    uint256 _retryCount = blocklistRetryCount;\\n    while (winnerCount < numberOfWinners) {\\n      address winner = ticket.draw(nextRandom);\\n\\n      if (!isBlocklisted[winner]) {\\n        winners[winnerCount++] = winner;\\n      } else if (++retries >= _retryCount) {\\n        emit RetryMaxLimitReached(winnerCount);\\n        if(winnerCount == 0) {\\n          emit NoWinners();\\n        }\\n        break;\\n      }\\n\\n      // add some arbitrary numbers to the previous random number to ensure no matches with the UniformRandomNumber lib\\n      bytes32 nextRandomHash = keccak256(abi.encodePacked(nextRandom + 499 + winnerCount*521));\\n      nextRandom = uint256(nextRandomHash);\\n    }\\n\\n    // main winner gets all external ERC721 tokens\\n    _awardExternalErc721s(winners[0]);\\n\\n    // yield prize is split up among all winners\\n    uint256 prizeShare = _carryOverBlocklistPrizes ? prize.div(numberOfWinners) : prize.div(winnerCount);\\n    if (prizeShare > 0) {\\n      for (uint i = 0; i < winnerCount; i++) {\\n        _awardTickets(winners[i], prizeShare);\\n      }\\n    }\\n\\n    if (splitExternalErc20Awards) {\\n      address currentToken = externalErc20s.start();\\n      while (currentToken != address(0) && currentToken != externalErc20s.end()) {\\n        uint256 balance = IERC20Upgradeable(currentToken).balanceOf(address(prizePool));\\n        uint256 split = _carryOverBlocklistPrizes ? balance.div(numberOfWinners) : balance.div(winnerCount);\\n        if (split > 0) {\\n          for (uint256 i = 0; i < winnerCount; i++) {\\n            prizePool.awardExternalERC20(winners[i], currentToken, split);\\n          }\\n        }\\n        currentToken = externalErc20s.next(currentToken);\\n      }\\n    } else {\\n      _awardExternalErc20s(winners[0]);\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0x26fbb59d9251cd6d66a423abaea29d5ea182e539365767ebfed726fe6248a29a\",\"license\":\"MIT\"},\"contracts/prize-strategy/multiple-winners/MultipleWinnersProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./MultipleWinners.sol\\\";\\nimport \\\"../../external/openzeppelin/ProxyFactory.sol\\\";\\n\\n/// @title Creates a minimal proxy to the MultipleWinners prize strategy.  Very cheap to deploy.\\ncontract MultipleWinnersProxyFactory is ProxyFactory {\\n\\n  MultipleWinners public instance;\\n\\n  constructor () public {\\n    instance = new MultipleWinners();\\n  }\\n\\n  function create() external returns (MultipleWinners) {\\n    return MultipleWinners(deployMinimal(address(instance), \\\"\\\"));\\n  }\\n\\n}\",\"keccak256\":\"0x005d4b6c74b67d7dc49a928a3910c132295d39258dddaa991c79437e95a600ae\",\"license\":\"GPL-3.0\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./ControlledToken.sol\\\";\\nimport \\\"../external/openzeppelin/ProxyFactory.sol\\\";\\n\\n/// @title Controlled ERC20 Token Factory\\n/// @notice Minimal proxy pattern for creating new Controlled ERC20 Tokens\\ncontract ControlledTokenProxyFactory is ProxyFactory {\\n\\n  /// @notice Contract template for deploying proxied tokens\\n  ControlledToken public instance;\\n\\n  /// @notice Initializes the Factory with an instance of the Controlled ERC20 Token\\n  constructor () public {\\n    instance = new ControlledToken();\\n  }\\n\\n  /// @notice Creates a new Controlled ERC20 Token as a proxy of the template instance\\n  /// @return A reference to the new proxied Controlled ERC20 Token\\n  function create() external returns (ControlledToken) {\\n    return ControlledToken(deployMinimal(address(instance), \\\"\\\"));\\n  }\\n}\\n\",\"keccak256\":\"0x3872184d356e0bc4aadf034dbc8dccb454c00b7efdc8f4d0a96621702a9d5135\",\"license\":\"GPL-3.0\"},\"contracts/token/Ticket.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"sortition-sum-tree-factory/contracts/SortitionSumTreeFactory.sol\\\";\\nimport \\\"@pooltogether/uniform-random-number/contracts/UniformRandomNumber.sol\\\";\\n\\nimport \\\"./ControlledToken.sol\\\";\\nimport \\\"./TicketInterface.sol\\\";\\n\\ncontract Ticket is ControlledToken, TicketInterface {\\n  using SortitionSumTreeFactory for SortitionSumTreeFactory.SortitionSumTrees;\\n\\n  bytes32 constant private TREE_KEY = keccak256(\\\"PoolTogether/Ticket\\\");\\n  uint256 constant private MAX_TREE_LEAVES = 5;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  // Ticket-weighted odds\\n  SortitionSumTreeFactory.SortitionSumTrees internal sortitionSumTrees;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    override\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"Ticket/controller-not-zero\\\");\\n    ControlledToken.initialize(_name, _symbol, _decimals, _controller);\\n    sortitionSumTrees.createTree(TREE_KEY, MAX_TREE_LEAVES);\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Returns the user's chance of winning.\\n  function chanceOf(address user) external view returns (uint256) {\\n    return sortitionSumTrees.stakeOf(TREE_KEY, bytes32(uint256(user)));\\n  }\\n\\n  /// @notice Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\\n  /// @param randomNumber The random number to use to select a user.\\n  /// @return The winner\\n  function draw(uint256 randomNumber) external view override returns (address) {\\n    uint256 bound = totalSupply();\\n    address selected;\\n    if (bound == 0) {\\n      selected = address(0);\\n    } else {\\n      uint256 token = UniformRandomNumber.uniform(randomNumber, bound);\\n      selected = address(uint256(sortitionSumTrees.draw(TREE_KEY, token)));\\n    }\\n    return selected;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    super._beforeTokenTransfer(from, to, amount);\\n\\n    // optimize: ignore transfers to self\\n    if (from == to) {\\n      return;\\n    }\\n\\n    if (from != address(0)) {\\n      uint256 fromBalance = balanceOf(from).sub(amount);\\n      sortitionSumTrees.set(TREE_KEY, fromBalance, bytes32(uint256(from)));\\n    }\\n\\n    if (to != address(0)) {\\n      uint256 toBalance = balanceOf(to).add(amount);\\n      sortitionSumTrees.set(TREE_KEY, toBalance, bytes32(uint256(to)));\\n    }\\n  }\\n\\n}\",\"keccak256\":\"0xf659dcfda626c713b7dd64525476d282e141163977edd881b647e83f505c4044\",\"license\":\"GPL-3.0\"},\"contracts/token/TicketInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface TicketInterface {\\n  /// @notice Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\\n  /// @param randomNumber The random number to use to select a user.\\n  /// @return The winner\\n  function draw(uint256 randomNumber) external view returns (address);\\n}\",\"keccak256\":\"0x5201a9a22748781592abd2003801289224d4899292195b7de937cd5748be87dd\",\"license\":\"GPL-3.0\"},\"contracts/token/TicketProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\\\";\\n\\nimport \\\"./Ticket.sol\\\";\\nimport \\\"../external/openzeppelin/ProxyFactory.sol\\\";\\n\\n/// @title Controlled ERC20 Token Factory\\n/// @notice Minimal proxy pattern for creating new Controlled ERC20 Tokens\\ncontract TicketProxyFactory is ProxyFactory {\\n\\n  /// @notice Contract template for deploying proxied tokens\\n  Ticket public instance;\\n\\n  /// @notice Initializes the Factory with an instance of the Controlled ERC20 Token\\n  constructor () public {\\n    instance = new Ticket();\\n  }\\n\\n  /// @notice Creates a new Controlled ERC20 Token as a proxy of the template instance\\n  /// @return A reference to the new proxied Controlled ERC20 Token\\n  function create() external returns (Ticket) {\\n    return Ticket(deployMinimal(address(instance), \\\"\\\"));\\n  }\\n}\\n\",\"keccak256\":\"0xb68f1cd27e8caaab3f69d6ccd14e70ff2d7c3685c9c45733f62690087833410e\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListener.sol\":{\"content\":\"pragma solidity ^0.6.4;\\n\\nimport \\\"./TokenListenerInterface.sol\\\";\\nimport \\\"./TokenListenerLibrary.sol\\\";\\nimport \\\"../Constants.sol\\\";\\n\\nabstract contract TokenListener is TokenListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER\\n    );\\n  }\\n}\\n\",\"keccak256\":\"0xb0e98d10b004602e1d4f4369a70e6382002dc0c0c5713698eb6a92943aef2265\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"},\"sortition-sum-tree-factory/contracts/SortitionSumTreeFactory.sol\":{\"content\":\"/**\\n *  @reviewers: [@clesaege, @unknownunknown1, @ferittuncer]\\n *  @auditors: []\\n *  @bounties: [<14 days 10 ETH max payout>]\\n *  @deployments: []\\n */\\n\\npragma solidity ^0.6.0;\\n\\n/**\\n *  @title SortitionSumTreeFactory\\n *  @author Enrique Piqueras - <epiquerass@gmail.com>\\n *  @dev A factory of trees that keep track of staked values for sortition.\\n */\\nlibrary SortitionSumTreeFactory {\\n    /* Structs */\\n\\n    struct SortitionSumTree {\\n        uint K; // The maximum number of childs per node.\\n        // We use this to keep track of vacant positions in the tree after removing a leaf. This is for keeping the tree as balanced as possible without spending gas on moving nodes around.\\n        uint[] stack;\\n        uint[] nodes;\\n        // Two-way mapping of IDs to node indexes. Note that node index 0 is reserved for the root node, and means the ID does not have a node.\\n        mapping(bytes32 => uint) IDsToNodeIndexes;\\n        mapping(uint => bytes32) nodeIndexesToIDs;\\n    }\\n\\n    /* Storage */\\n\\n    struct SortitionSumTrees {\\n        mapping(bytes32 => SortitionSumTree) sortitionSumTrees;\\n    }\\n\\n    /* internal */\\n\\n    /**\\n     *  @dev Create a sortition sum tree at the specified key.\\n     *  @param _key The key of the new tree.\\n     *  @param _K The number of children each node in the tree should have.\\n     */\\n    function createTree(SortitionSumTrees storage self, bytes32 _key, uint _K) internal {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        require(tree.K == 0, \\\"Tree already exists.\\\");\\n        require(_K > 1, \\\"K must be greater than one.\\\");\\n        tree.K = _K;\\n        tree.stack = new uint[](0);\\n        tree.nodes = new uint[](0);\\n        tree.nodes.push(0);\\n    }\\n\\n    /**\\n     *  @dev Set a value of a tree.\\n     *  @param _key The key of the tree.\\n     *  @param _value The new value.\\n     *  @param _ID The ID of the value.\\n     *  `O(log_k(n))` where\\n     *  `k` is the maximum number of childs per node in the tree,\\n     *   and `n` is the maximum number of nodes ever appended.\\n     */\\n    function set(SortitionSumTrees storage self, bytes32 _key, uint _value, bytes32 _ID) internal {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        uint treeIndex = tree.IDsToNodeIndexes[_ID];\\n\\n        if (treeIndex == 0) { // No existing node.\\n            if (_value != 0) { // Non zero value.\\n                // Append.\\n                // Add node.\\n                if (tree.stack.length == 0) { // No vacant spots.\\n                    // Get the index and append the value.\\n                    treeIndex = tree.nodes.length;\\n                    tree.nodes.push(_value);\\n\\n                    // Potentially append a new node and make the parent a sum node.\\n                    if (treeIndex != 1 && (treeIndex - 1) % tree.K == 0) { // Is first child.\\n                        uint parentIndex = treeIndex / tree.K;\\n                        bytes32 parentID = tree.nodeIndexesToIDs[parentIndex];\\n                        uint newIndex = treeIndex + 1;\\n                        tree.nodes.push(tree.nodes[parentIndex]);\\n                        delete tree.nodeIndexesToIDs[parentIndex];\\n                        tree.IDsToNodeIndexes[parentID] = newIndex;\\n                        tree.nodeIndexesToIDs[newIndex] = parentID;\\n                    }\\n                } else { // Some vacant spot.\\n                    // Pop the stack and append the value.\\n                    treeIndex = tree.stack[tree.stack.length - 1];\\n                    tree.stack.pop();\\n                    tree.nodes[treeIndex] = _value;\\n                }\\n\\n                // Add label.\\n                tree.IDsToNodeIndexes[_ID] = treeIndex;\\n                tree.nodeIndexesToIDs[treeIndex] = _ID;\\n\\n                updateParents(self, _key, treeIndex, true, _value);\\n            }\\n        } else { // Existing node.\\n            if (_value == 0) { // Zero value.\\n                // Remove.\\n                // Remember value and set to 0.\\n                uint value = tree.nodes[treeIndex];\\n                tree.nodes[treeIndex] = 0;\\n\\n                // Push to stack.\\n                tree.stack.push(treeIndex);\\n\\n                // Clear label.\\n                delete tree.IDsToNodeIndexes[_ID];\\n                delete tree.nodeIndexesToIDs[treeIndex];\\n\\n                updateParents(self, _key, treeIndex, false, value);\\n            } else if (_value != tree.nodes[treeIndex]) { // New, non zero value.\\n                // Set.\\n                bool plusOrMinus = tree.nodes[treeIndex] <= _value;\\n                uint plusOrMinusValue = plusOrMinus ? _value - tree.nodes[treeIndex] : tree.nodes[treeIndex] - _value;\\n                tree.nodes[treeIndex] = _value;\\n\\n                updateParents(self, _key, treeIndex, plusOrMinus, plusOrMinusValue);\\n            }\\n        }\\n    }\\n\\n    /* internal Views */\\n\\n    /**\\n     *  @dev Query the leaves of a tree. Note that if `startIndex == 0`, the tree is empty and the root node will be returned.\\n     *  @param _key The key of the tree to get the leaves from.\\n     *  @param _cursor The pagination cursor.\\n     *  @param _count The number of items to return.\\n     *  @return startIndex The index at which leaves start\\n     *  @return values The values of the returned leaves\\n     *  @return hasMore Whether there are more for pagination.\\n     *  `O(n)` where\\n     *  `n` is the maximum number of nodes ever appended.\\n     */\\n    function queryLeafs(\\n        SortitionSumTrees storage self,\\n        bytes32 _key,\\n        uint _cursor,\\n        uint _count\\n    ) internal view returns(uint startIndex, uint[] memory values, bool hasMore) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n\\n        // Find the start index.\\n        for (uint i = 0; i < tree.nodes.length; i++) {\\n            if ((tree.K * i) + 1 >= tree.nodes.length) {\\n                startIndex = i;\\n                break;\\n            }\\n        }\\n\\n        // Get the values.\\n        uint loopStartIndex = startIndex + _cursor;\\n        values = new uint[](loopStartIndex + _count > tree.nodes.length ? tree.nodes.length - loopStartIndex : _count);\\n        uint valuesIndex = 0;\\n        for (uint j = loopStartIndex; j < tree.nodes.length; j++) {\\n            if (valuesIndex < _count) {\\n                values[valuesIndex] = tree.nodes[j];\\n                valuesIndex++;\\n            } else {\\n                hasMore = true;\\n                break;\\n            }\\n        }\\n    }\\n\\n    /**\\n     *  @dev Draw an ID from a tree using a number. Note that this function reverts if the sum of all values in the tree is 0.\\n     *  @param _key The key of the tree.\\n     *  @param _drawnNumber The drawn number.\\n     *  @return ID The drawn ID.\\n     *  `O(k * log_k(n))` where\\n     *  `k` is the maximum number of childs per node in the tree,\\n     *   and `n` is the maximum number of nodes ever appended.\\n     */\\n    function draw(SortitionSumTrees storage self, bytes32 _key, uint _drawnNumber) internal view returns(bytes32 ID) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        uint treeIndex = 0;\\n        uint currentDrawnNumber = _drawnNumber % tree.nodes[0];\\n\\n        while ((tree.K * treeIndex) + 1 < tree.nodes.length)  // While it still has children.\\n            for (uint i = 1; i <= tree.K; i++) { // Loop over children.\\n                uint nodeIndex = (tree.K * treeIndex) + i;\\n                uint nodeValue = tree.nodes[nodeIndex];\\n\\n                if (currentDrawnNumber >= nodeValue) currentDrawnNumber -= nodeValue; // Go to the next child.\\n                else { // Pick this child.\\n                    treeIndex = nodeIndex;\\n                    break;\\n                }\\n            }\\n        \\n        ID = tree.nodeIndexesToIDs[treeIndex];\\n    }\\n\\n    /** @dev Gets a specified ID's associated value.\\n     *  @param _key The key of the tree.\\n     *  @param _ID The ID of the value.\\n     *  @return value The associated value.\\n     */\\n    function stakeOf(SortitionSumTrees storage self, bytes32 _key, bytes32 _ID) internal view returns(uint value) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        uint treeIndex = tree.IDsToNodeIndexes[_ID];\\n\\n        if (treeIndex == 0) value = 0;\\n        else value = tree.nodes[treeIndex];\\n    }\\n\\n    function total(SortitionSumTrees storage self, bytes32 _key) internal view returns (uint) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        if (tree.nodes.length == 0) {\\n            return 0;\\n        } else {\\n            return tree.nodes[0];\\n        }\\n    }\\n\\n    /* Private */\\n\\n    /**\\n     *  @dev Update all the parents of a node.\\n     *  @param _key The key of the tree to update.\\n     *  @param _treeIndex The index of the node to start from.\\n     *  @param _plusOrMinus Wether to add (true) or substract (false).\\n     *  @param _value The value to add or substract.\\n     *  `O(log_k(n))` where\\n     *  `k` is the maximum number of childs per node in the tree,\\n     *   and `n` is the maximum number of nodes ever appended.\\n     */\\n    function updateParents(SortitionSumTrees storage self, bytes32 _key, uint _treeIndex, bool _plusOrMinus, uint _value) private {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n\\n        uint parentIndex = _treeIndex;\\n        while (parentIndex != 0) {\\n            parentIndex = (parentIndex - 1) / tree.K;\\n            tree.nodes[parentIndex] = _plusOrMinus ? tree.nodes[parentIndex] + _value : tree.nodes[parentIndex] - _value;\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa20ece2e1ddeaa6432549a7c38cd02594000b93a54b92399b89bae0dd76dbc7e\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 6043,
                "contract": "contracts/builders/PoolWithMultipleWinnersBuilder.sol:PoolWithMultipleWinnersBuilder",
                "label": "reserveRegistry",
                "offset": 0,
                "slot": "0",
                "type": "t_contract(RegistryInterface)12458"
              },
              {
                "astId": 6045,
                "contract": "contracts/builders/PoolWithMultipleWinnersBuilder.sol:PoolWithMultipleWinnersBuilder",
                "label": "compoundPrizePoolProxyFactory",
                "offset": 0,
                "slot": "1",
                "type": "t_contract(CompoundPrizePoolProxyFactory)9155"
              },
              {
                "astId": 6047,
                "contract": "contracts/builders/PoolWithMultipleWinnersBuilder.sol:PoolWithMultipleWinnersBuilder",
                "label": "yieldSourcePrizePoolProxyFactory",
                "offset": 0,
                "slot": "2",
                "type": "t_contract(YieldSourcePrizePoolProxyFactory)9532"
              },
              {
                "astId": 6049,
                "contract": "contracts/builders/PoolWithMultipleWinnersBuilder.sol:PoolWithMultipleWinnersBuilder",
                "label": "stakePrizePoolProxyFactory",
                "offset": 0,
                "slot": "3",
                "type": "t_contract(StakePrizePoolProxyFactory)9317"
              },
              {
                "astId": 6051,
                "contract": "contracts/builders/PoolWithMultipleWinnersBuilder.sol:PoolWithMultipleWinnersBuilder",
                "label": "multipleWinnersBuilder",
                "offset": 0,
                "slot": "4",
                "type": "t_contract(MultipleWinnersBuilder)5995"
              }
            ],
            "types": {
              "t_contract(CompoundPrizePoolProxyFactory)9155": {
                "encoding": "inplace",
                "label": "contract CompoundPrizePoolProxyFactory",
                "numberOfBytes": "20"
              },
              "t_contract(MultipleWinnersBuilder)5995": {
                "encoding": "inplace",
                "label": "contract MultipleWinnersBuilder",
                "numberOfBytes": "20"
              },
              "t_contract(RegistryInterface)12458": {
                "encoding": "inplace",
                "label": "contract RegistryInterface",
                "numberOfBytes": "20"
              },
              "t_contract(StakePrizePoolProxyFactory)9317": {
                "encoding": "inplace",
                "label": "contract StakePrizePoolProxyFactory",
                "numberOfBytes": "20"
              },
              "t_contract(YieldSourcePrizePoolProxyFactory)9532": {
                "encoding": "inplace",
                "label": "contract YieldSourcePrizePoolProxyFactory",
                "numberOfBytes": "20"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/external/compound/CTokenInterface.sol": {
        "CTokenInterface": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Approval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Transfer",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                }
              ],
              "name": "allowance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "approve",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                }
              ],
              "name": "balanceOfUnderlying",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "decimals",
              "outputs": [
                {
                  "internalType": "uint8",
                  "name": "",
                  "type": "uint8"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "exchangeRateCurrent",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "mintAmount",
                  "type": "uint256"
                }
              ],
              "name": "mint",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "redeem",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "redeemAmount",
                  "type": "uint256"
                }
              ],
              "name": "redeemUnderlying",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "supplyRatePerBlock",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transfer",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "sender",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transferFrom",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "underlying",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "allowance(address,address)": {
                "details": "Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."
              },
              "approve(address,uint256)": {
                "details": "Sets `amount` as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event."
              },
              "totalSupply()": {
                "details": "Returns the amount of tokens in existence."
              },
              "transfer(address,uint256)": {
                "details": "Moves `amount` tokens from the caller's account to `recipient`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."
              },
              "transferFrom(address,address,uint256)": {
                "details": "Moves `amount` tokens from `sender` to `recipient` using the allowance mechanism. `amount` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "allowance(address,address)": "dd62ed3e",
              "approve(address,uint256)": "095ea7b3",
              "balanceOf(address)": "70a08231",
              "balanceOfUnderlying(address)": "3af9e669",
              "decimals()": "313ce567",
              "exchangeRateCurrent()": "bd6d894d",
              "mint(uint256)": "a0712d68",
              "redeem(uint256)": "db006a75",
              "redeemUnderlying(uint256)": "852a12e3",
              "supplyRatePerBlock()": "ae9d70b0",
              "totalSupply()": "18160ddd",
              "transfer(address,uint256)": "a9059cbb",
              "transferFrom(address,address,uint256)": "23b872dd",
              "underlying()": "6f307dc3"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOfUnderlying\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"exchangeRateCurrent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"mintAmount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"redeem\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"redeemAmount\",\"type\":\"uint256\"}],\"name\":\"redeemUnderlying\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"supplyRatePerBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"underlying\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.\"},\"approve(address,uint256)\":{\"details\":\"Sets `amount` as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event.\"},\"totalSupply()\":{\"details\":\"Returns the amount of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves `amount` tokens from the caller's account to `recipient`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Moves `amount` tokens from `sender` to `recipient` using the allowance mechanism. `amount` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/external/compound/CTokenInterface.sol\":\"CTokenInterface\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"contracts/external/compound/CTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface CTokenInterface is IERC20Upgradeable {\\n    function decimals() external view returns (uint8);\\n    function totalSupply() external override view returns (uint256);\\n    function underlying() external view returns (address);\\n    function balanceOfUnderlying(address owner) external returns (uint256);\\n    function supplyRatePerBlock() external returns (uint256);\\n    function exchangeRateCurrent() external returns (uint256);\\n    function mint(uint256 mintAmount) external returns (uint256);\\n    function redeem(uint256 amount) external returns (uint256);\\n    function balanceOf(address user) external override view returns (uint256);\\n    function redeemUnderlying(uint256 redeemAmount) external returns (uint256);\\n}\\n\",\"keccak256\":\"0x9608049458bc017f2369e2af2a20bfa2efaff1a5b451a17bd0594a976d5bc88f\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/external/compound/ICompLike.sol": {
        "ICompLike": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Approval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Transfer",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                }
              ],
              "name": "allowance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "approve",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "delegatee",
                  "type": "address"
                }
              ],
              "name": "delegate",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                }
              ],
              "name": "getCurrentVotes",
              "outputs": [
                {
                  "internalType": "uint96",
                  "name": "",
                  "type": "uint96"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transfer",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "sender",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transferFrom",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "allowance(address,address)": {
                "details": "Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."
              },
              "approve(address,uint256)": {
                "details": "Sets `amount` as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event."
              },
              "balanceOf(address)": {
                "details": "Returns the amount of tokens owned by `account`."
              },
              "totalSupply()": {
                "details": "Returns the amount of tokens in existence."
              },
              "transfer(address,uint256)": {
                "details": "Moves `amount` tokens from the caller's account to `recipient`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."
              },
              "transferFrom(address,address,uint256)": {
                "details": "Moves `amount` tokens from `sender` to `recipient` using the allowance mechanism. `amount` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "allowance(address,address)": "dd62ed3e",
              "approve(address,uint256)": "095ea7b3",
              "balanceOf(address)": "70a08231",
              "delegate(address)": "5c19a95c",
              "getCurrentVotes(address)": "b4b5ea57",
              "totalSupply()": "18160ddd",
              "transfer(address,uint256)": "a9059cbb",
              "transferFrom(address,address,uint256)": "23b872dd"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getCurrentVotes\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.\"},\"approve(address,uint256)\":{\"details\":\"Sets `amount` as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the amount of tokens owned by `account`.\"},\"totalSupply()\":{\"details\":\"Returns the amount of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves `amount` tokens from the caller's account to `recipient`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Moves `amount` tokens from `sender` to `recipient` using the allowance mechanism. `amount` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/external/compound/ICompLike.sol\":\"ICompLike\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/external/maker/DaiInterface.sol": {
        "DaiInterface": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Approval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Transfer",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                }
              ],
              "name": "allowance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "approve",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "holder",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "nonce",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "expiry",
                  "type": "uint256"
                },
                {
                  "internalType": "bool",
                  "name": "allowed",
                  "type": "bool"
                },
                {
                  "internalType": "uint8",
                  "name": "v",
                  "type": "uint8"
                },
                {
                  "internalType": "bytes32",
                  "name": "r",
                  "type": "bytes32"
                },
                {
                  "internalType": "bytes32",
                  "name": "s",
                  "type": "bytes32"
                }
              ],
              "name": "permit",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transfer",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "src",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "dst",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "wad",
                  "type": "uint256"
                }
              ],
              "name": "transferFrom",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "allowance(address,address)": {
                "details": "Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."
              },
              "approve(address,uint256)": {
                "details": "Sets `amount` as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event."
              },
              "balanceOf(address)": {
                "details": "Returns the amount of tokens owned by `account`."
              },
              "totalSupply()": {
                "details": "Returns the amount of tokens in existence."
              },
              "transfer(address,uint256)": {
                "details": "Moves `amount` tokens from the caller's account to `recipient`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "allowance(address,address)": "dd62ed3e",
              "approve(address,uint256)": "095ea7b3",
              "balanceOf(address)": "70a08231",
              "permit(address,address,uint256,uint256,bool,uint8,bytes32,bytes32)": "8fcbaf0c",
              "totalSupply()": "18160ddd",
              "transfer(address,uint256)": "a9059cbb",
              "transferFrom(address,address,uint256)": "23b872dd"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"holder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"src\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"dst\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"wad\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.\"},\"approve(address,uint256)\":{\"details\":\"Sets `amount` as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the amount of tokens owned by `account`.\"},\"totalSupply()\":{\"details\":\"Returns the amount of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves `amount` tokens from the caller's account to `recipient`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/external/maker/DaiInterface.sol\":\"DaiInterface\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"contracts/external/maker/DaiInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface DaiInterface is IERC20Upgradeable {\\n    // --- Approve by signature ---\\n  function permit(address holder, address spender, uint256 nonce, uint256 expiry, bool allowed, uint8 v, bytes32 r, bytes32 s) external;\\n  function transferFrom(address src, address dst, uint wad) external override returns (bool);\\n}\\n\",\"keccak256\":\"0x22d935aab5d88376c469f899191d7046d4b62ec3291c6e5970bdc3f0f385df22\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/external/openzeppelin/ProxyFactory.sol": {
        "ProxyFactory": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "name": "ProxyCreated",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_logic",
                  "type": "address"
                },
                {
                  "internalType": "bytes",
                  "name": "_data",
                  "type": "bytes"
                }
              ],
              "name": "deployMinimal",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506102d8806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063b3eeb5e214610030575b600080fd5b6100e66004803603604081101561004657600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561007157600080fd5b82018360208201111561008357600080fd5b803590602001918460018302840111640100000000831117156100a557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610102945050505050565b604080516001600160a01b039092168252519081900360200190f35b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a1825115610277576000826001600160a01b0316846040518082805190602001908083835b602083106101ce5780518252601f1990920191602091820191016101af565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610230576040519150601f19603f3d011682016040523d82523d6000602084013e610235565b606091505b50509050806102755760405162461bcd60e51b815260040180806020018281038252602481526020018061027f6024913960400191505060405180910390fd5b505b509291505056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a264697066735822122099daeed7089a0d1a87ddc2c51e15f1fc44d754af024f48ae124b946651648a3164736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D8 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE6 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x46 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x71 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x83 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xA5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x102 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x277 JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1CE JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1AF JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x230 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x235 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x275 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x27F PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 SWAP10 0xDA 0xEE 0xD7 ADDMOD SWAP11 0xD BYTE DUP8 0xDD 0xC2 0xC5 0x1E ISZERO CALL 0xFC DIFFICULTY 0xD7 SLOAD 0xAF MUL 0x4F 0x48 0xAE SLT 0x4B SWAP5 PUSH7 0x51648A3164736F PUSH13 0x634300060C0033000000000000 ",
              "sourceMap": "117:845:38:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506004361061002b5760003560e01c8063b3eeb5e214610030575b600080fd5b6100e66004803603604081101561004657600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561007157600080fd5b82018360208201111561008357600080fd5b803590602001918460018302840111640100000000831117156100a557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610102945050505050565b604080516001600160a01b039092168252519081900360200190f35b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a1825115610277576000826001600160a01b0316846040518082805190602001908083835b602083106101ce5780518252601f1990920191602091820191016101af565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610230576040519150601f19603f3d011682016040523d82523d6000602084013e610235565b606091505b50509050806102755760405162461bcd60e51b815260040180806020018281038252602481526020018061027f6024913960400191505060405180910390fd5b505b509291505056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a264697066735822122099daeed7089a0d1a87ddc2c51e15f1fc44d754af024f48ae124b946651648a3164736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE6 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x46 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x71 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x83 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xA5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x102 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x277 JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1CE JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1AF JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x230 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x235 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x275 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x27F PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 SWAP10 0xDA 0xEE 0xD7 ADDMOD SWAP11 0xD BYTE DUP8 0xDD 0xC2 0xC5 0x1E ISZERO CALL 0xFC DIFFICULTY 0xD7 SLOAD 0xAF MUL 0x4F 0x48 0xAE SLT 0x4B SWAP5 PUSH7 0x51648A3164736F PUSH13 0x634300060C0033000000000000 ",
              "sourceMap": "117:845:38:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;182:778;;;;;;;;;;;;;;;;-1:-1:-1;;;;;182:778:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;182:778:38;;-1:-1:-1;182:778:38;;-1:-1:-1;;;;;182:778:38:i;:::-;;;;-1:-1:-1;;;;;182:778:38;;;;;;;;;;;;;;;257:13;416:19;446:6;438:15;;416:37;;495:4;489:11;-1:-1:-1;;;514:5:38;507:81;620:11;613:4;606:5;602:16;595:37;-1:-1:-1;;;657:4:38;650:5;646:16;639:92;764:4;757:5;754:1;747:22;786:28;;;-1:-1:-1;;;;;786:28:38;;;;;;738:31;;-1:-1:-1;786:28:38;;-1:-1:-1;786:28:38;;;;;;;824:12;;:16;821:135;;851:12;868:5;-1:-1:-1;;;;;868:10:38;879:5;868:17;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;868:17:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;850:35;;;901:7;893:56;;;;-1:-1:-1;;;893:56:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;821:135;;182:778;;;;;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "145600",
                "executionCost": "190",
                "totalCost": "145790"
              },
              "external": {
                "deployMinimal(address,bytes)": "infinite"
              }
            },
            "methodIdentifiers": {
              "deployMinimal(address,bytes)": "b3eeb5e2"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"name\":\"ProxyCreated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"deployMinimal\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/external/openzeppelin/ProxyFactory.sol\":\"ProxyFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/external/openzeppelin/ProxyFactory.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\n// solium-disable security/no-inline-assembly\\n// solium-disable security/no-low-level-calls\\ncontract ProxyFactory {\\n\\n  event ProxyCreated(address proxy);\\n\\n  function deployMinimal(address _logic, bytes memory _data) public returns (address proxy) {\\n    // Adapted from https://github.com/optionality/clone-factory/blob/32782f82dfc5a00d103a7e61a17a5dedbd1e8e9d/contracts/CloneFactory.sol\\n    bytes20 targetBytes = bytes20(_logic);\\n    assembly {\\n      let clone := mload(0x40)\\n      mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n      mstore(add(clone, 0x14), targetBytes)\\n      mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n      proxy := create(0, clone, 0x37)\\n    }\\n\\n    emit ProxyCreated(address(proxy));\\n\\n    if(_data.length > 0) {\\n      (bool success,) = proxy.call(_data);\\n      require(success, \\\"ProxyFactory/constructor-call-failed\\\");\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0xf0422303985796fdd8bdf772ac8e34331e2e63006f657989cca010fa4776d735\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/prize-pool/PrizePool.sol": {
        "PrizePool": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "AwardCaptured",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "Awarded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "AwardedExternalERC20",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256[]",
                  "name": "tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "AwardedExternalERC721",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract ControlledTokenInterface",
                  "name": "token",
                  "type": "address"
                }
              ],
              "name": "ControlledTokenAdded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "CreditBurned",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "CreditMinted",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint128",
                  "name": "creditLimitMantissa",
                  "type": "uint128"
                },
                {
                  "indexed": false,
                  "internalType": "uint128",
                  "name": "creditRateMantissa",
                  "type": "uint128"
                }
              ],
              "name": "CreditPlanSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "referrer",
                  "type": "address"
                }
              ],
              "name": "Deposited",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "bytes",
                  "name": "error",
                  "type": "bytes"
                }
              ],
              "name": "ErrorAwardingExternalERC721",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "reserveRegistry",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "maxExitFeeMantissa",
                  "type": "uint256"
                }
              ],
              "name": "Initialized",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "redeemed",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "exitFee",
                  "type": "uint256"
                }
              ],
              "name": "InstantWithdrawal",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "liquidityCap",
                  "type": "uint256"
                }
              ],
              "name": "LiquidityCapSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "prizeStrategy",
                  "type": "address"
                }
              ],
              "name": "PrizeStrategySet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "ReserveFeeCaptured",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "ReserveWithdrawal",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "TransferredExternalERC20",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "VERSION",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "accountedBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "awardBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "awardExternalERC20",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256[]",
                  "name": "tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "awardExternalERC721",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "balance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "balanceOfCredit",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "beforeTokenTransfer",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "calculateEarlyExitFee",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "exitFee",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "burnedCredit",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "calculateReserveFee",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_externalToken",
                  "type": "address"
                }
              ],
              "name": "canAwardExternal",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "captureAwardBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract ICompLike",
                  "name": "compLike",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                }
              ],
              "name": "compLikeDelegate",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "creditPlanOf",
              "outputs": [
                {
                  "internalType": "uint128",
                  "name": "creditLimitMantissa",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "creditRateMantissa",
                  "type": "uint128"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "referrer",
                  "type": "address"
                }
              ],
              "name": "depositTo",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_principal",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "_interest",
                  "type": "uint256"
                }
              ],
              "name": "estimateCreditAccrualTime",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "durationSeconds",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "_reserveRegistry",
                  "type": "address"
                },
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "_controlledTokens",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256",
                  "name": "_maxExitFeeMantissa",
                  "type": "uint256"
                }
              ],
              "name": "initialize",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract ControlledTokenInterface",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "isControlled",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "liquidityCap",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "maxExitFeeMantissa",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "onERC721Received",
              "outputs": [
                {
                  "internalType": "bytes4",
                  "name": "",
                  "type": "bytes4"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizeStrategy",
              "outputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "renounceOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "reserveRegistry",
              "outputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "reserveTotalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint128",
                  "name": "_creditRateMantissa",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "_creditLimitMantissa",
                  "type": "uint128"
                }
              ],
              "name": "setCreditPlanOf",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_liquidityCap",
                  "type": "uint256"
                }
              ],
              "name": "setLiquidityCap",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "_prizeStrategy",
                  "type": "address"
                }
              ],
              "name": "setPrizeStrategy",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "token",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "tokens",
              "outputs": [
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "",
                  "type": "address[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transferExternalERC20",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "maximumExitFee",
                  "type": "uint256"
                }
              ],
              "name": "withdrawInstantlyFrom",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                }
              ],
              "name": "withdrawReserve",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "details": "Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens",
            "events": {
              "Awarded(address,address,uint256)": {
                "details": "Event emitted when interest is awarded to a winner"
              },
              "AwardedExternalERC20(address,address,uint256)": {
                "details": "Event emitted when external ERC20s are awarded to a winner"
              },
              "AwardedExternalERC721(address,address,uint256[])": {
                "details": "Event emitted when external ERC721s are awarded to a winner"
              },
              "ControlledTokenAdded(address)": {
                "details": "Event emitted when controlled token is added"
              },
              "CreditBurned(address,address,uint256)": {
                "details": "Emitted when credit is burned"
              },
              "CreditMinted(address,address,uint256)": {
                "details": "Emitted when credit is minted"
              },
              "CreditPlanSet(address,uint128,uint128)": {
                "details": "Event emitted when the Credit plan is set"
              },
              "Deposited(address,address,address,uint256,address)": {
                "details": "Event emitted when assets are deposited"
              },
              "ErrorAwardingExternalERC721(bytes)": {
                "details": "Emitted when there was an error thrown awarding an External ERC721"
              },
              "Initialized(address,uint256)": {
                "details": "Emitted when an instance is initialized"
              },
              "InstantWithdrawal(address,address,address,uint256,uint256,uint256)": {
                "details": "Event emitted when assets are withdrawn instantly"
              },
              "LiquidityCapSet(uint256)": {
                "details": "Event emitted when the Liquidity Cap is set"
              },
              "PrizeStrategySet(address)": {
                "details": "Event emitted when the Prize Strategy is set"
              },
              "ReserveFeeCaptured(uint256)": {
                "details": "Emitted when reserve is captured."
              },
              "TransferredExternalERC20(address,address,uint256)": {
                "details": "Event emitted when external ERC20s are transferred out"
              }
            },
            "kind": "dev",
            "methods": {
              "accountedBalance()": {
                "returns": {
                  "_0": "The current total of all tokens"
                }
              },
              "award(address,uint256,address)": {
                "details": "The amount awarded must be less than the awardBalance()",
                "params": {
                  "amount": "The amount of assets to be awarded",
                  "controlledToken": "The address of the asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "awardBalance()": {
                "details": "captureAwardBalance() should be called first",
                "returns": {
                  "_0": "The total amount of assets to be awarded for the current prize"
                }
              },
              "awardExternalERC20(address,address,uint256)": {
                "details": "Used to award any arbitrary tokens held by the Prize Pool",
                "params": {
                  "amount": "The amount of external assets to be awarded",
                  "externalToken": "The address of the external asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "awardExternalERC721(address,address,uint256[])": {
                "details": "Used to award any arbitrary NFTs held by the Prize Pool",
                "params": {
                  "externalToken": "The address of the external NFT token being awarded",
                  "to": "The address of the winner that receives the award",
                  "tokenIds": "An array of NFT Token IDs to be transferred"
                }
              },
              "balance()": {
                "details": "Returns the total underlying balance of all assets. This includes both principal and interest.",
                "returns": {
                  "_0": "The underlying balance of assets"
                }
              },
              "balanceOfCredit(address,address)": {
                "params": {
                  "user": "The user whose credit balance should be returned"
                },
                "returns": {
                  "_0": "The balance of the users credit"
                }
              },
              "beforeTokenTransfer(address,address,uint256)": {
                "params": {
                  "amount": "The amount of tokens being trasferred",
                  "from": "The address the tokens are being transferred from (0 if minting)",
                  "to": "The address the tokens are being transferred to (0 if burning)"
                }
              },
              "calculateEarlyExitFee(address,address,uint256)": {
                "params": {
                  "amount": "The amount of collateral to be withdrawn",
                  "controlledToken": "The type of collateral being withdrawn",
                  "from": "The user who is withdrawing"
                },
                "returns": {
                  "burnedCredit": "The user's credit that was burned",
                  "exitFee": "The exit fee"
                }
              },
              "calculateReserveFee(uint256)": {
                "params": {
                  "amount": "The prize amount"
                },
                "returns": {
                  "_0": "The size of the reserve portion of the prize"
                }
              },
              "canAwardExternal(address)": {
                "details": "Checks with the Prize Pool if a specific token type may be awarded as an external prize",
                "params": {
                  "_externalToken": "The address of the token to check"
                },
                "returns": {
                  "_0": "True if the token may be awarded, false otherwise"
                }
              },
              "captureAwardBalance()": {
                "details": "This function also captures the reserve fees.",
                "returns": {
                  "_0": "The total amount of assets to be awarded for the current prize"
                }
              },
              "compLikeDelegate(address,address)": {
                "params": {
                  "compLike": "The COMP-like token held by the prize pool that should be delegated",
                  "to": "The address to delegate to "
                }
              },
              "creditPlanOf(address)": {
                "params": {
                  "controlledToken": "The controlled token to retrieve the credit rates for"
                },
                "returns": {
                  "creditLimitMantissa": "The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.",
                  "creditRateMantissa": "The credit rate. This is the amount of tokens that accrue per second."
                }
              },
              "depositTo(address,uint256,address,address)": {
                "params": {
                  "amount": "The amount of assets to deposit",
                  "controlledToken": "The address of the type of token the user is minting",
                  "referrer": "The referrer of the deposit",
                  "to": "The address receiving the newly minted tokens"
                }
              },
              "estimateCreditAccrualTime(address,uint256,uint256)": {
                "params": {
                  "_interest": "The amount of interest that must accrue",
                  "_principal": "The principal amount on which interest is accruing"
                },
                "returns": {
                  "durationSeconds": "The duration of time it will take to accrue the given amount of interest, in seconds."
                }
              },
              "initialize(address,address[],uint256)": {
                "params": {
                  "_controlledTokens": "Array of ControlledTokens that are controlled by this Prize Pool.",
                  "_maxExitFeeMantissa": "The maximum exit fee size"
                }
              },
              "isControlled(address)": {
                "details": "Checks if a specific token is controlled by the Prize Pool",
                "params": {
                  "controlledToken": "The address of the token to check"
                },
                "returns": {
                  "_0": "True if the token is a controlled token, false otherwise"
                }
              },
              "onERC721Received(address,address,uint256,bytes)": {
                "params": {
                  "data": "Additional data with no specified format, sent in call to `_to`.",
                  "from": "The current owner of the NFT",
                  "operator": "The address that acts on behalf of the owner",
                  "tokenId": "The NFT to transfer"
                }
              },
              "owner()": {
                "details": "Returns the address of the current owner."
              },
              "renounceOwnership()": {
                "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
              },
              "setCreditPlanOf(address,uint128,uint128)": {
                "params": {
                  "_controlledToken": "The controlled token for whom to set the credit plan",
                  "_creditLimitMantissa": "The credit limit to set.  Is a fixed point 18 decimal (like Ether).",
                  "_creditRateMantissa": "The credit rate to set.  Is a fixed point 18 decimal (like Ether)."
                }
              },
              "setLiquidityCap(uint256)": {
                "params": {
                  "_liquidityCap": "The new liquidity cap for the prize pool"
                }
              },
              "setPrizeStrategy(address)": {
                "params": {
                  "_prizeStrategy": "The new prize strategy"
                }
              },
              "token()": {
                "details": "Returns the address of the underlying ERC20 asset",
                "returns": {
                  "_0": "The address of the asset"
                }
              },
              "tokens()": {
                "returns": {
                  "_0": "An array of controlled token addresses"
                }
              },
              "transferExternalERC20(address,address,uint256)": {
                "details": "Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.",
                "params": {
                  "amount": "The amount of external assets to be awarded",
                  "externalToken": "The address of the external asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "transferOwnership(address)": {
                "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
              },
              "withdrawInstantlyFrom(address,uint256,address,uint256)": {
                "params": {
                  "amount": "The amount of tokens to redeem for assets.",
                  "controlledToken": "The address of the token to redeem (i.e. ticket or sponsorship)",
                  "from": "The address to redeem tokens from.",
                  "maximumExitFee": "The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn."
                },
                "returns": {
                  "_0": "The actual exit fee paid"
                }
              }
            },
            "stateVariables": {
              "_currentAwardBalance": {
                "details": "the The awardable balance"
              },
              "_tokenCreditBalances": {
                "details": "Stores each users balance of credit per token."
              },
              "_tokenCreditPlans": {
                "details": "Stores the credit plan for each token."
              },
              "_tokens": {
                "details": "An array of all the controlled tokens"
              },
              "liquidityCap": {
                "details": "The total amount of funds that the prize pool can hold."
              },
              "maxExitFeeMantissa": {
                "details": "The maximum possible exit fee fraction as a fixed point 18 number. For example, if the maxExitFeeMantissa is \"0.1 ether\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai"
              },
              "prizeStrategy": {
                "details": "The Prize Strategy that this Prize Pool is bound to."
              },
              "reserveRegistry": {
                "details": "Reserve to which reserve fees are sent"
              },
              "reserveTotalSupply": {
                "details": "The total funds that have been allocated to the reserve"
              }
            },
            "title": "Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "VERSION()": "ffa1ad74",
              "accountedBalance()": "0937eb54",
              "award(address,uint256,address)": "6b1b863a",
              "awardBalance()": "630665b4",
              "awardExternalERC20(address,address,uint256)": "2b0ab144",
              "awardExternalERC721(address,address,uint256[])": "16960d55",
              "balance()": "b69ef8a8",
              "balanceOfCredit(address,address)": "494de9f7",
              "beforeTokenTransfer(address,address,uint256)": "7cbab1c7",
              "calculateEarlyExitFee(address,address,uint256)": "888c2b6f",
              "calculateReserveFee(uint256)": "9fe32a91",
              "canAwardExternal(address)": "6a3fd4f9",
              "captureAwardBalance()": "e6d8a94b",
              "compLikeDelegate(address,address)": "2f7627e3",
              "creditPlanOf(address)": "d4a1361d",
              "depositTo(address,uint256,address,address)": "e323f825",
              "estimateCreditAccrualTime(address,uint256,uint256)": "79cb8563",
              "initialize(address,address[],uint256)": "3ede50c6",
              "isControlled(address)": "78b3d327",
              "liquidityCap()": "76687d3d",
              "maxExitFeeMantissa()": "9e167519",
              "onERC721Received(address,address,uint256,bytes)": "150b7a02",
              "owner()": "8da5cb5b",
              "prizeStrategy()": "98bf3eb6",
              "renounceOwnership()": "715018a6",
              "reserveRegistry()": "8e71c1f6",
              "reserveTotalSupply()": "edb4e1cf",
              "setCreditPlanOf(address,uint128,uint128)": "a7b2cc31",
              "setLiquidityCap(uint256)": "7b99adb1",
              "setPrizeStrategy(address)": "91ca480e",
              "token()": "fc0c546a",
              "tokens()": "9d63848a",
              "transferExternalERC20(address,address,uint256)": "13f55e39",
              "transferOwnership(address)": "f2fde38b",
              "withdrawInstantlyFrom(address,uint256,address,uint256)": "a016240b",
              "withdrawReserve(address)": "52a387ab"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"AwardCaptured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Awarded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"AwardedExternalERC20\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"AwardedExternalERC721\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract ControlledTokenInterface\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"ControlledTokenAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CreditBurned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CreditMinted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"creditLimitMantissa\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"creditRateMantissa\",\"type\":\"uint128\"}],\"name\":\"CreditPlanSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ErrorAwardingExternalERC721\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"reserveRegistry\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxExitFeeMantissa\",\"type\":\"uint256\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"redeemed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"exitFee\",\"type\":\"uint256\"}],\"name\":\"InstantWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"liquidityCap\",\"type\":\"uint256\"}],\"name\":\"LiquidityCapSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"prizeStrategy\",\"type\":\"address\"}],\"name\":\"PrizeStrategySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ReserveFeeCaptured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ReserveWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferredExternalERC20\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accountedBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"awardBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"awardExternalERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"awardExternalERC721\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"balance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"balanceOfCredit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"beforeTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"calculateEarlyExitFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"exitFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"burnedCredit\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"calculateReserveFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_externalToken\",\"type\":\"address\"}],\"name\":\"canAwardExternal\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"captureAwardBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ICompLike\",\"name\":\"compLike\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"compLikeDelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"creditPlanOf\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"creditLimitMantissa\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"creditRateMantissa\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_principal\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_interest\",\"type\":\"uint256\"}],\"name\":\"estimateCreditAccrualTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"durationSeconds\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"_reserveRegistry\",\"type\":\"address\"},{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"_controlledTokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_maxExitFeeMantissa\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ControlledTokenInterface\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"isControlled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"liquidityCap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxExitFeeMantissa\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizeStrategy\",\"outputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reserveRegistry\",\"outputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reserveTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"_creditRateMantissa\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"_creditLimitMantissa\",\"type\":\"uint128\"}],\"name\":\"setCreditPlanOf\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_liquidityCap\",\"type\":\"uint256\"}],\"name\":\"setLiquidityCap\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"_prizeStrategy\",\"type\":\"address\"}],\"name\":\"setPrizeStrategy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokens\",\"outputs\":[{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferExternalERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maximumExitFee\",\"type\":\"uint256\"}],\"name\":\"withdrawInstantlyFrom\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawReserve\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\",\"events\":{\"Awarded(address,address,uint256)\":{\"details\":\"Event emitted when interest is awarded to a winner\"},\"AwardedExternalERC20(address,address,uint256)\":{\"details\":\"Event emitted when external ERC20s are awarded to a winner\"},\"AwardedExternalERC721(address,address,uint256[])\":{\"details\":\"Event emitted when external ERC721s are awarded to a winner\"},\"ControlledTokenAdded(address)\":{\"details\":\"Event emitted when controlled token is added\"},\"CreditBurned(address,address,uint256)\":{\"details\":\"Emitted when credit is burned\"},\"CreditMinted(address,address,uint256)\":{\"details\":\"Emitted when credit is minted\"},\"CreditPlanSet(address,uint128,uint128)\":{\"details\":\"Event emitted when the Credit plan is set\"},\"Deposited(address,address,address,uint256,address)\":{\"details\":\"Event emitted when assets are deposited\"},\"ErrorAwardingExternalERC721(bytes)\":{\"details\":\"Emitted when there was an error thrown awarding an External ERC721\"},\"Initialized(address,uint256)\":{\"details\":\"Emitted when an instance is initialized\"},\"InstantWithdrawal(address,address,address,uint256,uint256,uint256)\":{\"details\":\"Event emitted when assets are withdrawn instantly\"},\"LiquidityCapSet(uint256)\":{\"details\":\"Event emitted when the Liquidity Cap is set\"},\"PrizeStrategySet(address)\":{\"details\":\"Event emitted when the Prize Strategy is set\"},\"ReserveFeeCaptured(uint256)\":{\"details\":\"Emitted when reserve is captured.\"},\"TransferredExternalERC20(address,address,uint256)\":{\"details\":\"Event emitted when external ERC20s are transferred out\"}},\"kind\":\"dev\",\"methods\":{\"accountedBalance()\":{\"returns\":{\"_0\":\"The current total of all tokens\"}},\"award(address,uint256,address)\":{\"details\":\"The amount awarded must be less than the awardBalance()\",\"params\":{\"amount\":\"The amount of assets to be awarded\",\"controlledToken\":\"The address of the asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"awardBalance()\":{\"details\":\"captureAwardBalance() should be called first\",\"returns\":{\"_0\":\"The total amount of assets to be awarded for the current prize\"}},\"awardExternalERC20(address,address,uint256)\":{\"details\":\"Used to award any arbitrary tokens held by the Prize Pool\",\"params\":{\"amount\":\"The amount of external assets to be awarded\",\"externalToken\":\"The address of the external asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"awardExternalERC721(address,address,uint256[])\":{\"details\":\"Used to award any arbitrary NFTs held by the Prize Pool\",\"params\":{\"externalToken\":\"The address of the external NFT token being awarded\",\"to\":\"The address of the winner that receives the award\",\"tokenIds\":\"An array of NFT Token IDs to be transferred\"}},\"balance()\":{\"details\":\"Returns the total underlying balance of all assets. This includes both principal and interest.\",\"returns\":{\"_0\":\"The underlying balance of assets\"}},\"balanceOfCredit(address,address)\":{\"params\":{\"user\":\"The user whose credit balance should be returned\"},\"returns\":{\"_0\":\"The balance of the users credit\"}},\"beforeTokenTransfer(address,address,uint256)\":{\"params\":{\"amount\":\"The amount of tokens being trasferred\",\"from\":\"The address the tokens are being transferred from (0 if minting)\",\"to\":\"The address the tokens are being transferred to (0 if burning)\"}},\"calculateEarlyExitFee(address,address,uint256)\":{\"params\":{\"amount\":\"The amount of collateral to be withdrawn\",\"controlledToken\":\"The type of collateral being withdrawn\",\"from\":\"The user who is withdrawing\"},\"returns\":{\"burnedCredit\":\"The user's credit that was burned\",\"exitFee\":\"The exit fee\"}},\"calculateReserveFee(uint256)\":{\"params\":{\"amount\":\"The prize amount\"},\"returns\":{\"_0\":\"The size of the reserve portion of the prize\"}},\"canAwardExternal(address)\":{\"details\":\"Checks with the Prize Pool if a specific token type may be awarded as an external prize\",\"params\":{\"_externalToken\":\"The address of the token to check\"},\"returns\":{\"_0\":\"True if the token may be awarded, false otherwise\"}},\"captureAwardBalance()\":{\"details\":\"This function also captures the reserve fees.\",\"returns\":{\"_0\":\"The total amount of assets to be awarded for the current prize\"}},\"compLikeDelegate(address,address)\":{\"params\":{\"compLike\":\"The COMP-like token held by the prize pool that should be delegated\",\"to\":\"The address to delegate to \"}},\"creditPlanOf(address)\":{\"params\":{\"controlledToken\":\"The controlled token to retrieve the credit rates for\"},\"returns\":{\"creditLimitMantissa\":\"The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\",\"creditRateMantissa\":\"The credit rate. This is the amount of tokens that accrue per second.\"}},\"depositTo(address,uint256,address,address)\":{\"params\":{\"amount\":\"The amount of assets to deposit\",\"controlledToken\":\"The address of the type of token the user is minting\",\"referrer\":\"The referrer of the deposit\",\"to\":\"The address receiving the newly minted tokens\"}},\"estimateCreditAccrualTime(address,uint256,uint256)\":{\"params\":{\"_interest\":\"The amount of interest that must accrue\",\"_principal\":\"The principal amount on which interest is accruing\"},\"returns\":{\"durationSeconds\":\"The duration of time it will take to accrue the given amount of interest, in seconds.\"}},\"initialize(address,address[],uint256)\":{\"params\":{\"_controlledTokens\":\"Array of ControlledTokens that are controlled by this Prize Pool.\",\"_maxExitFeeMantissa\":\"The maximum exit fee size\"}},\"isControlled(address)\":{\"details\":\"Checks if a specific token is controlled by the Prize Pool\",\"params\":{\"controlledToken\":\"The address of the token to check\"},\"returns\":{\"_0\":\"True if the token is a controlled token, false otherwise\"}},\"onERC721Received(address,address,uint256,bytes)\":{\"params\":{\"data\":\"Additional data with no specified format, sent in call to `_to`.\",\"from\":\"The current owner of the NFT\",\"operator\":\"The address that acts on behalf of the owner\",\"tokenId\":\"The NFT to transfer\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setCreditPlanOf(address,uint128,uint128)\":{\"params\":{\"_controlledToken\":\"The controlled token for whom to set the credit plan\",\"_creditLimitMantissa\":\"The credit limit to set.  Is a fixed point 18 decimal (like Ether).\",\"_creditRateMantissa\":\"The credit rate to set.  Is a fixed point 18 decimal (like Ether).\"}},\"setLiquidityCap(uint256)\":{\"params\":{\"_liquidityCap\":\"The new liquidity cap for the prize pool\"}},\"setPrizeStrategy(address)\":{\"params\":{\"_prizeStrategy\":\"The new prize strategy\"}},\"token()\":{\"details\":\"Returns the address of the underlying ERC20 asset\",\"returns\":{\"_0\":\"The address of the asset\"}},\"tokens()\":{\"returns\":{\"_0\":\"An array of controlled token addresses\"}},\"transferExternalERC20(address,address,uint256)\":{\"details\":\"Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\",\"params\":{\"amount\":\"The amount of external assets to be awarded\",\"externalToken\":\"The address of the external asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"withdrawInstantlyFrom(address,uint256,address,uint256)\":{\"params\":{\"amount\":\"The amount of tokens to redeem for assets.\",\"controlledToken\":\"The address of the token to redeem (i.e. ticket or sponsorship)\",\"from\":\"The address to redeem tokens from.\",\"maximumExitFee\":\"The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\"},\"returns\":{\"_0\":\"The actual exit fee paid\"}}},\"stateVariables\":{\"_currentAwardBalance\":{\"details\":\"the The awardable balance\"},\"_tokenCreditBalances\":{\"details\":\"Stores each users balance of credit per token.\"},\"_tokenCreditPlans\":{\"details\":\"Stores the credit plan for each token.\"},\"_tokens\":{\"details\":\"An array of all the controlled tokens\"},\"liquidityCap\":{\"details\":\"The total amount of funds that the prize pool can hold.\"},\"maxExitFeeMantissa\":{\"details\":\"The maximum possible exit fee fraction as a fixed point 18 number. For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\"},\"prizeStrategy\":{\"details\":\"The Prize Strategy that this Prize Pool is bound to.\"},\"reserveRegistry\":{\"details\":\"Reserve to which reserve fees are sent\"},\"reserveTotalSupply\":{\"details\":\"The total funds that have been allocated to the reserve\"}},\"title\":\"Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"VERSION()\":{\"notice\":\"Semver Version\"},\"accountedBalance()\":{\"notice\":\"The total of all controlled tokens\"},\"award(address,uint256,address)\":{\"notice\":\"Called by the prize strategy to award prizes.\"},\"awardBalance()\":{\"notice\":\"Returns the balance that is available to award.\"},\"awardExternalERC20(address,address,uint256)\":{\"notice\":\"Called by the Prize-Strategy to award external ERC20 prizes\"},\"awardExternalERC721(address,address,uint256[])\":{\"notice\":\"Called by the prize strategy to award external ERC721 prizes\"},\"balanceOfCredit(address,address)\":{\"notice\":\"Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\"},\"beforeTokenTransfer(address,address,uint256)\":{\"notice\":\"Updates the Prize Strategy when tokens are transferred between holders.\"},\"calculateEarlyExitFee(address,address,uint256)\":{\"notice\":\"Calculates the early exit fee for the given amount\"},\"calculateReserveFee(uint256)\":{\"notice\":\"Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\"},\"captureAwardBalance()\":{\"notice\":\"Captures any available interest as award balance.\"},\"compLikeDelegate(address,address)\":{\"notice\":\"Delegate the votes for a Compound COMP-like token held by the prize pool\"},\"creditPlanOf(address)\":{\"notice\":\"Returns the credit rate of a controlled token\"},\"depositTo(address,uint256,address,address)\":{\"notice\":\"Deposit assets into the Prize Pool in exchange for tokens\"},\"estimateCreditAccrualTime(address,uint256,uint256)\":{\"notice\":\"Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\"},\"initialize(address,address[],uint256)\":{\"notice\":\"Initializes the Prize Pool\"},\"onERC721Received(address,address,uint256,bytes)\":{\"notice\":\"Required for ERC721 safe token transfers from smart contracts.\"},\"setCreditPlanOf(address,uint128,uint128)\":{\"notice\":\"Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\"},\"setLiquidityCap(uint256)\":{\"notice\":\"Allows the Governor to set a cap on the amount of liquidity that he pool can hold\"},\"setPrizeStrategy(address)\":{\"notice\":\"Sets the prize strategy of the prize pool.  Only callable by the owner.\"},\"tokens()\":{\"notice\":\"An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\"},\"transferExternalERC20(address,address,uint256)\":{\"notice\":\"Called by the Prize-Strategy to transfer out external ERC20 tokens\"},\"withdrawInstantlyFrom(address,uint256,address,uint256)\":{\"notice\":\"Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\"}},\"notice\":\"Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/prize-pool/PrizePool.sol\":\"PrizePool\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../external/compound/ICompLike.sol\\\";\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../reserve/ReserveInterface.sol\\\";\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/TokenListenerLibrary.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\nimport \\\"./PrizePoolInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using SafeERC20Upgradeable for IERC721Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    address reserveRegistry,\\n    uint256 maxExitFeeMantissa\\n  );\\n\\n  /// @dev Event emitted when controlled token is added\\n  event ControlledTokenAdded(\\n    ControlledTokenInterface indexed token\\n  );\\n\\n  /// @dev Emitted when reserve is captured.\\n  event ReserveFeeCaptured(\\n    uint256 amount\\n  );\\n\\n  event AwardCaptured(\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when assets are deposited\\n  event Deposited(\\n    address indexed operator,\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount,\\n    address referrer\\n  );\\n\\n  /// @dev Event emitted when interest is awarded to a winner\\n  event Awarded(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are awarded to a winner\\n  event AwardedExternalERC20(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are transferred out\\n  event TransferredExternalERC20(\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC721s are awarded to a winner\\n  event AwardedExternalERC721(\\n    address indexed winner,\\n    address indexed token,\\n    uint256[] tokenIds\\n  );\\n\\n  /// @dev Event emitted when assets are withdrawn instantly\\n  event InstantWithdrawal(\\n    address indexed operator,\\n    address indexed from,\\n    address indexed token,\\n    uint256 amount,\\n    uint256 redeemed,\\n    uint256 exitFee\\n  );\\n\\n  event ReserveWithdrawal(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when the Liquidity Cap is set\\n  event LiquidityCapSet(\\n    uint256 liquidityCap\\n  );\\n\\n  /// @dev Event emitted when the Credit plan is set\\n  event CreditPlanSet(\\n    address token,\\n    uint128 creditLimitMantissa,\\n    uint128 creditRateMantissa\\n  );\\n\\n  /// @dev Event emitted when the Prize Strategy is set\\n  event PrizeStrategySet(\\n    address indexed prizeStrategy\\n  );\\n\\n  /// @dev Emitted when credit is minted\\n  event CreditMinted(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when credit is burned\\n  event CreditBurned(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\\n  event ErrorAwardingExternalERC721(bytes error);\\n\\n\\n  struct CreditPlan {\\n    uint128 creditLimitMantissa;\\n    uint128 creditRateMantissa;\\n  }\\n\\n  struct CreditBalance {\\n    uint192 balance;\\n    uint32 timestamp;\\n    bool initialized;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  /// @dev Reserve to which reserve fees are sent\\n  RegistryInterface public reserveRegistry;\\n\\n  /// @dev An array of all the controlled tokens\\n  ControlledTokenInterface[] internal _tokens;\\n\\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\\n  TokenListenerInterface public prizeStrategy;\\n\\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\\n  /// For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\\n  uint256 public maxExitFeeMantissa;\\n\\n  /// @dev The total funds that have been allocated to the reserve\\n  uint256 public reserveTotalSupply;\\n\\n  /// @dev The total amount of funds that the prize pool can hold.\\n  uint256 public liquidityCap;\\n\\n  /// @dev the The awardable balance\\n  uint256 internal _currentAwardBalance;\\n\\n  /// @dev Stores the credit plan for each token.\\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\\n\\n  /// @dev Stores each users balance of credit per token.\\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\\n\\n  /// @notice Initializes the Prize Pool\\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\\n  /// @param _maxExitFeeMantissa The maximum exit fee size\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_reserveRegistry) != address(0), \\\"PrizePool/reserveRegistry-not-zero\\\");\\n    uint256 controlledTokensLength = _controlledTokens.length;\\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\\n\\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\\n      _addControlledToken(controlledToken, i);\\n    }\\n    __Ownable_init();\\n    __ReentrancyGuard_init();\\n    _setLiquidityCap(uint256(-1));\\n\\n    reserveRegistry = _reserveRegistry;\\n    maxExitFeeMantissa = _maxExitFeeMantissa;\\n\\n    emit Initialized(\\n      address(_reserveRegistry),\\n      maxExitFeeMantissa\\n    );\\n  }\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external override view returns (address) {\\n    return address(_token());\\n  }\\n\\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\\n  /// @return The underlying balance of assets\\n  function balance() external returns (uint256) {\\n    return _balance();\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function canAwardExternal(address _externalToken) external view returns (bool) {\\n    return _canAwardExternal(_externalToken);\\n  }\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    canAddLiquidity(amount)\\n  {\\n    address operator = _msgSender();\\n\\n    _mint(to, amount, controlledToken, referrer);\\n\\n    _token().safeTransferFrom(operator, address(this), amount);\\n    _supply(amount);\\n\\n    emit Deposited(operator, to, controlledToken, amount, referrer);\\n  }\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    returns (uint256)\\n  {\\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n    require(exitFee <= maximumExitFee, \\\"PrizePool/exit-fee-exceeds-user-maximum\\\");\\n\\n    // burn the credit\\n    _burnCredit(from, controlledToken, burnedCredit);\\n\\n    // burn the tickets\\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\\n\\n    // redeem the tickets less the fee\\n    uint256 amountLessFee = amount.sub(exitFee);\\n    uint256 redeemed = _redeem(amountLessFee);\\n\\n    _token().safeTransfer(from, redeemed);\\n\\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\\n\\n    return exitFee;\\n  }\\n\\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\\n  /// @param exitFee The exit fee to check against the limit\\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\\n    if (exitFee > maxFee) {\\n      exitFee = maxFee;\\n    }\\n    return exitFee;\\n  }\\n\\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\\n  /// @param from The address the tokens are being transferred from (0 if minting)\\n  /// @param to The address the tokens are being transferred to (0 if burning)\\n  /// @param amount The amount of tokens being trasferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\\n    if (from != address(0)) {\\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\\n      // first accrue credit for their old balance\\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\\n\\n      if (from != to) {\\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\\n      }\\n\\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\\n    }\\n    if (to != address(0) && to != from) {\\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\\n    }\\n    // if we aren't minting\\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\\n    }\\n  }\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external override view returns (uint256) {\\n    return _currentAwardBalance;\\n  }\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n\\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\\n    uint256 currentBalance = _balance();\\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\\n\\n    if (unaccountedPrizeBalance > 0) {\\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\\n      if (reserveFee > 0) {\\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\\n        emit ReserveFeeCaptured(reserveFee);\\n      }\\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\\n\\n      emit AwardCaptured(unaccountedPrizeBalance);\\n    }\\n\\n    return _currentAwardBalance;\\n  }\\n\\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\\n\\n    uint256 amount = reserveTotalSupply;\\n    reserveTotalSupply = 0;\\n    uint256 redeemed = _redeem(amount);\\n\\n    _token().safeTransfer(address(to), redeemed);\\n\\n    emit ReserveWithdrawal(to, amount);\\n\\n    return redeemed;\\n  }\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external override\\n    onlyPrizeStrategy\\n    onlyControlledToken(controlledToken)\\n  {\\n    if (amount == 0) {\\n      return;\\n    }\\n\\n    require(amount <= _currentAwardBalance, \\\"PrizePool/award-exceeds-avail\\\");\\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\\n\\n    _mint(to, amount, controlledToken, address(0));\\n\\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\\n\\n    emit Awarded(to, controlledToken, amount);\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit TransferredExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit AwardedExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  function _transferOut(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (bool)\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (amount == 0) {\\n      return false;\\n    }\\n\\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\\n\\n    return true;\\n  }\\n\\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\\n  /// @param to The user who is receiving the tokens\\n  /// @param amount The amount of tokens they are receiving\\n  /// @param controlledToken The token that is going to be minted\\n  /// @param referrer The user who referred the minting\\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\\n    if (address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n    ControlledToken(controlledToken).controllerMint(to, amount);\\n  }\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (tokenIds.length == 0) {\\n      return;\\n    }\\n\\n    for (uint256 i = 0; i < tokenIds.length; i++) {\\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\\n\\n      }\\n      catch(bytes memory error){\\n        emit ErrorAwardingExternalERC721(error);\\n      }\\n      \\n    }\\n\\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\\n  }\\n\\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\\n  /// @param amount The prize amount\\n  /// @return The size of the reserve portion of the prize\\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    if (address(reserve) == address(0)) {\\n      return 0;\\n    }\\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\\n    if (reserveRateMantissa == 0) {\\n      return 0;\\n    }\\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\\n  }\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external override\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    )\\n  {\\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n  }\\n\\n  /// @dev Calculates the early exit fee for the given amount\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return Exit fee\\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\\n    return _limitExitFee(\\n      amount,\\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external override\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    durationSeconds =_estimateCreditAccrualTime(\\n      _controlledToken,\\n      _principal,\\n      _interest\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function _estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    internal\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    // interest = credit rate * principal * time\\n    // => time = interest / (credit rate * principal)\\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\\n    if (accruedPerSecond == 0) {\\n      return 0;\\n    }\\n    return _interest.div(accruedPerSecond);\\n  }\\n\\n  /// @notice Burns a users credit.\\n  /// @param user The user whose credit should be burned\\n  /// @param credit The amount of credit to burn\\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\\n\\n    emit CreditBurned(user, controlledToken, credit);\\n  }\\n\\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\\n  /// @param user The user for whom to accrue credit\\n  /// @param controlledToken The controlled token whose balance we are checking\\n  /// @param controlledTokenBalance The balance to use for the user\\n  /// @param extra Additional credit to be added\\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\\n    _updateCreditBalance(\\n      user,\\n      controlledToken,\\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\\n    );\\n  }\\n\\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\\n    uint256 newBalance;\\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\\n    if (!creditBalance.initialized) {\\n      newBalance = 0;\\n    } else {\\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\\n    }\\n    return newBalance;\\n  }\\n\\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\\n\\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\\n      balance: newBalance.toUint128(),\\n      timestamp: _currentTime().toUint32(),\\n      initialized: true\\n    });\\n\\n    if (oldBalance < newBalance) {\\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\\n    } \\n    else if (newBalance < oldBalance) {\\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\\n    }\\n  }\\n\\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\\n  /// @param creditBalance The new credit balance to be checked\\n  /// @return The users new credit balance.  Will not exceed the credit limit.\\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\\n      controlledTokenBalance,\\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\\n    );\\n    if (creditBalance > creditLimit) {\\n      creditBalance = creditLimit;\\n    }\\n\\n    return creditBalance;\\n  }\\n\\n  /// @notice Calculates the accrued interest for a user\\n  /// @param user The user whose credit should be calculated.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\\n  /// @return The credit that has accrued since the last credit update.\\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\\n\\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\\n      return 0;\\n    }\\n\\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\\n  }\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\\n    return _tokenCreditBalances[controlledToken][user].balance;\\n  }\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external override\\n    onlyControlledToken(_controlledToken)\\n    onlyOwner\\n  {\\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\\n      creditLimitMantissa: _creditLimitMantissa,\\n      creditRateMantissa: _creditRateMantissa\\n    });\\n\\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\\n  }\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external override\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    )\\n  {\\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\\n  }\\n\\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The token they are withdrawing\\n  /// @param amount The amount of funds they are withdrawing\\n  /// @return earlyExitFee The additional exit fee that should be charged.\\n  /// @return creditBurned The amount of credit that will be burned\\n  function _calculateEarlyExitFeeLessBurnedCredit(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (\\n      uint256 earlyExitFee,\\n      uint256 creditBurned\\n    )\\n  {\\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\\n    require(controlledTokenBalance >= amount, \\\"PrizePool/insuff-funds\\\");\\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\\n    /*\\n    The credit is used *last*.  Always charge the fees up-front.\\n\\n    How to calculate:\\n\\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\\n\\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\\n    */\\n\\n    // Determine available usable credit based on withdraw amount\\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\\n\\n    uint256 availableCredit;\\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\\n    }\\n\\n    // Determine amount of credit to burn and amount of fees required\\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\\n    earlyExitFee = totalExitFee.sub(creditBurned);\\n  }\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\\n    _setLiquidityCap(_liquidityCap);\\n  }\\n\\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\\n    liquidityCap = _liquidityCap;\\n    emit LiquidityCapSet(_liquidityCap);\\n  }\\n\\n  /// @notice Adds a new controlled token\\n  /// @param _controlledToken The controlled token to add.\\n  /// @param index The index to add the controlledToken\\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\\n    require(_controlledToken.controller() == this, \\\"PrizePool/token-ctrlr-mismatch\\\");\\n    \\n    _tokens[index] = _controlledToken;\\n    emit ControlledTokenAdded(_controlledToken);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\\n    _setPrizeStrategy(_prizeStrategy);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\\n    require(address(_prizeStrategy) != address(0), \\\"PrizePool/prizeStrategy-not-zero\\\");\\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PrizePool/prizeStrategy-invalid\\\");\\n    prizeStrategy = _prizeStrategy;\\n\\n    emit PrizeStrategySet(address(_prizeStrategy));\\n  }\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\\n    return _tokens;\\n  }\\n\\n  /// @dev Gets the current time as represented by the current block\\n  /// @return The timestamp of the current block\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external override view returns (uint256) {\\n    return _tokenTotalSupply();\\n  }\\n\\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\\n  /// @param to The address to delegate to \\n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\\n    if (compLike.balanceOf(address(this)) > 0) {\\n      compLike.delegate(to);\\n    }\\n  }\\n  \\n  /// @notice Required for ERC721 safe token transfers from smart contracts.\\n  /// @param operator The address that acts on behalf of the owner\\n  /// @param from The current owner of the NFT\\n  /// @param tokenId The NFT to transfer\\n  /// @param data Additional data with no specified format, sent in call to `_to`.\\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function _tokenTotalSupply() internal view returns (uint256) {\\n    uint256 total = reserveTotalSupply;\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \\n    uint256 tokensLength = tokens.length;\\n    \\n    for(uint256 i = 0; i < tokensLength; i++){\\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\\n    }\\n\\n    return total;\\n  }\\n\\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\\n  }\\n\\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\\n    uint256 tokensLength = tokens.length;\\n\\n    for(uint256 i = 0; i < tokensLength; i++) {\\n      if(tokens[i] == controlledToken) return true;\\n    }\\n    return false;\\n  }\\n  \\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\\n    return _isControlled(controlledToken);\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function _token() internal virtual view returns (IERC20Upgradeable);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal virtual returns (uint256);\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal virtual;\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\\n\\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  modifier onlyControlledToken(address controlledToken) {\\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \\\"PrizePool/unknown-token\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure caller is the prize-strategy\\n  modifier onlyPrizeStrategy() {\\n    require(_msgSender() == address(prizeStrategy), \\\"PrizePool/only-prizeStrategy\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\\n  modifier canAddLiquidity(uint256 _amount) {\\n    require(_canAddLiquidity(_amount), \\\"PrizePool/exceeds-liquidity-cap\\\");\\n    _;\\n  }\\n\\n  modifier onlyReserve() {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    require(address(reserve) == msg.sender, \\\"PrizePool/only-reserve\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x386ebc1c80ab4424f14125e716dd12641ff933b475bf1082b7b1a6eee4a969c3\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/prize-pool/PrizePool.sol:PrizePool",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/prize-pool/PrizePool.sol:PrizePool",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/prize-pool/PrizePool.sol:PrizePool",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 10,
                "contract": "contracts/prize-pool/PrizePool.sol:PrizePool",
                "label": "_owner",
                "offset": 0,
                "slot": "51",
                "type": "t_address"
              },
              {
                "astId": 129,
                "contract": "contracts/prize-pool/PrizePool.sol:PrizePool",
                "label": "__gap",
                "offset": 0,
                "slot": "52",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 4743,
                "contract": "contracts/prize-pool/PrizePool.sol:PrizePool",
                "label": "_status",
                "offset": 0,
                "slot": "101",
                "type": "t_uint256"
              },
              {
                "astId": 4786,
                "contract": "contracts/prize-pool/PrizePool.sol:PrizePool",
                "label": "__gap",
                "offset": 0,
                "slot": "102",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 6817,
                "contract": "contracts/prize-pool/PrizePool.sol:PrizePool",
                "label": "reserveRegistry",
                "offset": 0,
                "slot": "151",
                "type": "t_contract(RegistryInterface)12458"
              },
              {
                "astId": 6821,
                "contract": "contracts/prize-pool/PrizePool.sol:PrizePool",
                "label": "_tokens",
                "offset": 0,
                "slot": "152",
                "type": "t_array(t_contract(ControlledTokenInterface)15850)dyn_storage"
              },
              {
                "astId": 6824,
                "contract": "contracts/prize-pool/PrizePool.sol:PrizePool",
                "label": "prizeStrategy",
                "offset": 0,
                "slot": "153",
                "type": "t_contract(TokenListenerInterface)16265"
              },
              {
                "astId": 6827,
                "contract": "contracts/prize-pool/PrizePool.sol:PrizePool",
                "label": "maxExitFeeMantissa",
                "offset": 0,
                "slot": "154",
                "type": "t_uint256"
              },
              {
                "astId": 6830,
                "contract": "contracts/prize-pool/PrizePool.sol:PrizePool",
                "label": "reserveTotalSupply",
                "offset": 0,
                "slot": "155",
                "type": "t_uint256"
              },
              {
                "astId": 6833,
                "contract": "contracts/prize-pool/PrizePool.sol:PrizePool",
                "label": "liquidityCap",
                "offset": 0,
                "slot": "156",
                "type": "t_uint256"
              },
              {
                "astId": 6836,
                "contract": "contracts/prize-pool/PrizePool.sol:PrizePool",
                "label": "_currentAwardBalance",
                "offset": 0,
                "slot": "157",
                "type": "t_uint256"
              },
              {
                "astId": 6841,
                "contract": "contracts/prize-pool/PrizePool.sol:PrizePool",
                "label": "_tokenCreditPlans",
                "offset": 0,
                "slot": "158",
                "type": "t_mapping(t_address,t_struct(CreditPlan)6803_storage)"
              },
              {
                "astId": 6848,
                "contract": "contracts/prize-pool/PrizePool.sol:PrizePool",
                "label": "_tokenCreditBalances",
                "offset": 0,
                "slot": "159",
                "type": "t_mapping(t_address,t_mapping(t_address,t_struct(CreditBalance)6810_storage))"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_contract(ControlledTokenInterface)15850)dyn_storage": {
                "base": "t_contract(ControlledTokenInterface)15850",
                "encoding": "dynamic_array",
                "label": "contract ControlledTokenInterface[]",
                "numberOfBytes": "32"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_contract(ControlledTokenInterface)15850": {
                "encoding": "inplace",
                "label": "contract ControlledTokenInterface",
                "numberOfBytes": "20"
              },
              "t_contract(RegistryInterface)12458": {
                "encoding": "inplace",
                "label": "contract RegistryInterface",
                "numberOfBytes": "20"
              },
              "t_contract(TokenListenerInterface)16265": {
                "encoding": "inplace",
                "label": "contract TokenListenerInterface",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_mapping(t_address,t_struct(CreditBalance)6810_storage))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => struct PrizePool.CreditBalance))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_struct(CreditBalance)6810_storage)"
              },
              "t_mapping(t_address,t_struct(CreditBalance)6810_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct PrizePool.CreditBalance)",
                "numberOfBytes": "32",
                "value": "t_struct(CreditBalance)6810_storage"
              },
              "t_mapping(t_address,t_struct(CreditPlan)6803_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct PrizePool.CreditPlan)",
                "numberOfBytes": "32",
                "value": "t_struct(CreditPlan)6803_storage"
              },
              "t_struct(CreditBalance)6810_storage": {
                "encoding": "inplace",
                "label": "struct PrizePool.CreditBalance",
                "members": [
                  {
                    "astId": 6805,
                    "contract": "contracts/prize-pool/PrizePool.sol:PrizePool",
                    "label": "balance",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint192"
                  },
                  {
                    "astId": 6807,
                    "contract": "contracts/prize-pool/PrizePool.sol:PrizePool",
                    "label": "timestamp",
                    "offset": 24,
                    "slot": "0",
                    "type": "t_uint32"
                  },
                  {
                    "astId": 6809,
                    "contract": "contracts/prize-pool/PrizePool.sol:PrizePool",
                    "label": "initialized",
                    "offset": 28,
                    "slot": "0",
                    "type": "t_bool"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_struct(CreditPlan)6803_storage": {
                "encoding": "inplace",
                "label": "struct PrizePool.CreditPlan",
                "members": [
                  {
                    "astId": 6800,
                    "contract": "contracts/prize-pool/PrizePool.sol:PrizePool",
                    "label": "creditLimitMantissa",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint128"
                  },
                  {
                    "astId": 6802,
                    "contract": "contracts/prize-pool/PrizePool.sol:PrizePool",
                    "label": "creditRateMantissa",
                    "offset": 16,
                    "slot": "0",
                    "type": "t_uint128"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_uint128": {
                "encoding": "inplace",
                "label": "uint128",
                "numberOfBytes": "16"
              },
              "t_uint192": {
                "encoding": "inplace",
                "label": "uint192",
                "numberOfBytes": "24"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint32": {
                "encoding": "inplace",
                "label": "uint32",
                "numberOfBytes": "4"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "VERSION()": {
                "notice": "Semver Version"
              },
              "accountedBalance()": {
                "notice": "The total of all controlled tokens"
              },
              "award(address,uint256,address)": {
                "notice": "Called by the prize strategy to award prizes."
              },
              "awardBalance()": {
                "notice": "Returns the balance that is available to award."
              },
              "awardExternalERC20(address,address,uint256)": {
                "notice": "Called by the Prize-Strategy to award external ERC20 prizes"
              },
              "awardExternalERC721(address,address,uint256[])": {
                "notice": "Called by the prize strategy to award external ERC721 prizes"
              },
              "balanceOfCredit(address,address)": {
                "notice": "Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit."
              },
              "beforeTokenTransfer(address,address,uint256)": {
                "notice": "Updates the Prize Strategy when tokens are transferred between holders."
              },
              "calculateEarlyExitFee(address,address,uint256)": {
                "notice": "Calculates the early exit fee for the given amount"
              },
              "calculateReserveFee(uint256)": {
                "notice": "Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero."
              },
              "captureAwardBalance()": {
                "notice": "Captures any available interest as award balance."
              },
              "compLikeDelegate(address,address)": {
                "notice": "Delegate the votes for a Compound COMP-like token held by the prize pool"
              },
              "creditPlanOf(address)": {
                "notice": "Returns the credit rate of a controlled token"
              },
              "depositTo(address,uint256,address,address)": {
                "notice": "Deposit assets into the Prize Pool in exchange for tokens"
              },
              "estimateCreditAccrualTime(address,uint256,uint256)": {
                "notice": "Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit."
              },
              "initialize(address,address[],uint256)": {
                "notice": "Initializes the Prize Pool"
              },
              "onERC721Received(address,address,uint256,bytes)": {
                "notice": "Required for ERC721 safe token transfers from smart contracts."
              },
              "setCreditPlanOf(address,uint128,uint128)": {
                "notice": "Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether)."
              },
              "setLiquidityCap(uint256)": {
                "notice": "Allows the Governor to set a cap on the amount of liquidity that he pool can hold"
              },
              "setPrizeStrategy(address)": {
                "notice": "Sets the prize strategy of the prize pool.  Only callable by the owner."
              },
              "tokens()": {
                "notice": "An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)"
              },
              "transferExternalERC20(address,address,uint256)": {
                "notice": "Called by the Prize-Strategy to transfer out external ERC20 tokens"
              },
              "withdrawInstantlyFrom(address,uint256,address,uint256)": {
                "notice": "Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit."
              }
            },
            "notice": "Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.",
            "version": 1
          }
        }
      },
      "contracts/prize-pool/PrizePoolInterface.sol": {
        "PrizePoolInterface": {
          "abi": [
            {
              "inputs": [],
              "name": "accountedBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "awardBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "awardExternalERC20",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256[]",
                  "name": "tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "awardExternalERC721",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "balanceOfCredit",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "calculateEarlyExitFee",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "exitFee",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "burnedCredit",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "captureAwardBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "creditPlanOf",
              "outputs": [
                {
                  "internalType": "uint128",
                  "name": "creditLimitMantissa",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "creditRateMantissa",
                  "type": "uint128"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "referrer",
                  "type": "address"
                }
              ],
              "name": "depositTo",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_principal",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "_interest",
                  "type": "uint256"
                }
              ],
              "name": "estimateCreditAccrualTime",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "durationSeconds",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint128",
                  "name": "_creditRateMantissa",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "_creditLimitMantissa",
                  "type": "uint128"
                }
              ],
              "name": "setCreditPlanOf",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_liquidityCap",
                  "type": "uint256"
                }
              ],
              "name": "setLiquidityCap",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "_prizeStrategy",
                  "type": "address"
                }
              ],
              "name": "setPrizeStrategy",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "token",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "tokens",
              "outputs": [
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "",
                  "type": "address[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transferExternalERC20",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "maximumExitFee",
                  "type": "uint256"
                }
              ],
              "name": "withdrawInstantlyFrom",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                }
              ],
              "name": "withdrawReserve",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "details": "Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens",
            "kind": "dev",
            "methods": {
              "accountedBalance()": {
                "returns": {
                  "_0": "The current total of all tokens"
                }
              },
              "award(address,uint256,address)": {
                "details": "The amount awarded must be less than the awardBalance()",
                "params": {
                  "amount": "The amount of assets to be awarded",
                  "controlledToken": "The address of the asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "awardBalance()": {
                "details": "captureAwardBalance() should be called first",
                "returns": {
                  "_0": "The total amount of assets to be awarded for the current prize"
                }
              },
              "awardExternalERC20(address,address,uint256)": {
                "details": "Used to award any arbitrary tokens held by the Prize Pool",
                "params": {
                  "amount": "The amount of external assets to be awarded",
                  "externalToken": "The address of the external asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "awardExternalERC721(address,address,uint256[])": {
                "details": "Used to award any arbitrary NFTs held by the Prize Pool",
                "params": {
                  "externalToken": "The address of the external NFT token being awarded",
                  "to": "The address of the winner that receives the award",
                  "tokenIds": "An array of NFT Token IDs to be transferred"
                }
              },
              "balanceOfCredit(address,address)": {
                "params": {
                  "user": "The user whose credit balance should be returned"
                },
                "returns": {
                  "_0": "The balance of the users credit"
                }
              },
              "calculateEarlyExitFee(address,address,uint256)": {
                "params": {
                  "amount": "The amount of collateral to be withdrawn",
                  "controlledToken": "The type of collateral being withdrawn",
                  "from": "The user who is withdrawing"
                },
                "returns": {
                  "burnedCredit": "The user's credit that was burned",
                  "exitFee": "The exit fee"
                }
              },
              "captureAwardBalance()": {
                "details": "This function also captures the reserve fees.",
                "returns": {
                  "_0": "The total amount of assets to be awarded for the current prize"
                }
              },
              "creditPlanOf(address)": {
                "params": {
                  "controlledToken": "The controlled token to retrieve the credit rates for"
                },
                "returns": {
                  "creditLimitMantissa": "The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.",
                  "creditRateMantissa": "The credit rate. This is the amount of tokens that accrue per second."
                }
              },
              "depositTo(address,uint256,address,address)": {
                "params": {
                  "amount": "The amount of assets to deposit",
                  "controlledToken": "The address of the type of token the user is minting",
                  "referrer": "The referrer of the deposit",
                  "to": "The address receiving the newly minted tokens"
                }
              },
              "estimateCreditAccrualTime(address,uint256,uint256)": {
                "params": {
                  "_interest": "The amount of interest that must accrue",
                  "_principal": "The principal amount on which interest is accruing"
                },
                "returns": {
                  "durationSeconds": "The duration of time it will take to accrue the given amount of interest, in seconds."
                }
              },
              "setCreditPlanOf(address,uint128,uint128)": {
                "params": {
                  "_controlledToken": "The controlled token for whom to set the credit plan",
                  "_creditLimitMantissa": "The credit limit to set.  Is a fixed point 18 decimal (like Ether).",
                  "_creditRateMantissa": "The credit rate to set.  Is a fixed point 18 decimal (like Ether)."
                }
              },
              "setLiquidityCap(uint256)": {
                "params": {
                  "_liquidityCap": "The new liquidity cap for the prize pool"
                }
              },
              "setPrizeStrategy(address)": {
                "params": {
                  "_prizeStrategy": "The new prize strategy.  Must implement TokenListenerInterface"
                }
              },
              "token()": {
                "details": "Returns the address of the underlying ERC20 asset",
                "returns": {
                  "_0": "The address of the asset"
                }
              },
              "tokens()": {
                "returns": {
                  "_0": "An array of controlled token addresses"
                }
              },
              "transferExternalERC20(address,address,uint256)": {
                "details": "Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.",
                "params": {
                  "amount": "The amount of external assets to be awarded",
                  "externalToken": "The address of the external asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "withdrawInstantlyFrom(address,uint256,address,uint256)": {
                "params": {
                  "amount": "The amount of tokens to redeem for assets.",
                  "controlledToken": "The address of the token to redeem (i.e. ticket or sponsorship)",
                  "from": "The address to redeem tokens from.",
                  "maximumExitFee": "The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn."
                },
                "returns": {
                  "_0": "The actual exit fee paid"
                }
              }
            },
            "title": "Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "accountedBalance()": "0937eb54",
              "award(address,uint256,address)": "6b1b863a",
              "awardBalance()": "630665b4",
              "awardExternalERC20(address,address,uint256)": "2b0ab144",
              "awardExternalERC721(address,address,uint256[])": "16960d55",
              "balanceOfCredit(address,address)": "494de9f7",
              "calculateEarlyExitFee(address,address,uint256)": "888c2b6f",
              "captureAwardBalance()": "e6d8a94b",
              "creditPlanOf(address)": "d4a1361d",
              "depositTo(address,uint256,address,address)": "e323f825",
              "estimateCreditAccrualTime(address,uint256,uint256)": "79cb8563",
              "setCreditPlanOf(address,uint128,uint128)": "a7b2cc31",
              "setLiquidityCap(uint256)": "7b99adb1",
              "setPrizeStrategy(address)": "91ca480e",
              "token()": "fc0c546a",
              "tokens()": "9d63848a",
              "transferExternalERC20(address,address,uint256)": "13f55e39",
              "withdrawInstantlyFrom(address,uint256,address,uint256)": "a016240b",
              "withdrawReserve(address)": "52a387ab"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"accountedBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"awardBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"awardExternalERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"awardExternalERC721\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"balanceOfCredit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"calculateEarlyExitFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"exitFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"burnedCredit\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"captureAwardBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"creditPlanOf\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"creditLimitMantissa\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"creditRateMantissa\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_principal\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_interest\",\"type\":\"uint256\"}],\"name\":\"estimateCreditAccrualTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"durationSeconds\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"_creditRateMantissa\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"_creditLimitMantissa\",\"type\":\"uint128\"}],\"name\":\"setCreditPlanOf\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_liquidityCap\",\"type\":\"uint256\"}],\"name\":\"setLiquidityCap\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"_prizeStrategy\",\"type\":\"address\"}],\"name\":\"setPrizeStrategy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokens\",\"outputs\":[{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferExternalERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maximumExitFee\",\"type\":\"uint256\"}],\"name\":\"withdrawInstantlyFrom\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawReserve\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\",\"kind\":\"dev\",\"methods\":{\"accountedBalance()\":{\"returns\":{\"_0\":\"The current total of all tokens\"}},\"award(address,uint256,address)\":{\"details\":\"The amount awarded must be less than the awardBalance()\",\"params\":{\"amount\":\"The amount of assets to be awarded\",\"controlledToken\":\"The address of the asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"awardBalance()\":{\"details\":\"captureAwardBalance() should be called first\",\"returns\":{\"_0\":\"The total amount of assets to be awarded for the current prize\"}},\"awardExternalERC20(address,address,uint256)\":{\"details\":\"Used to award any arbitrary tokens held by the Prize Pool\",\"params\":{\"amount\":\"The amount of external assets to be awarded\",\"externalToken\":\"The address of the external asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"awardExternalERC721(address,address,uint256[])\":{\"details\":\"Used to award any arbitrary NFTs held by the Prize Pool\",\"params\":{\"externalToken\":\"The address of the external NFT token being awarded\",\"to\":\"The address of the winner that receives the award\",\"tokenIds\":\"An array of NFT Token IDs to be transferred\"}},\"balanceOfCredit(address,address)\":{\"params\":{\"user\":\"The user whose credit balance should be returned\"},\"returns\":{\"_0\":\"The balance of the users credit\"}},\"calculateEarlyExitFee(address,address,uint256)\":{\"params\":{\"amount\":\"The amount of collateral to be withdrawn\",\"controlledToken\":\"The type of collateral being withdrawn\",\"from\":\"The user who is withdrawing\"},\"returns\":{\"burnedCredit\":\"The user's credit that was burned\",\"exitFee\":\"The exit fee\"}},\"captureAwardBalance()\":{\"details\":\"This function also captures the reserve fees.\",\"returns\":{\"_0\":\"The total amount of assets to be awarded for the current prize\"}},\"creditPlanOf(address)\":{\"params\":{\"controlledToken\":\"The controlled token to retrieve the credit rates for\"},\"returns\":{\"creditLimitMantissa\":\"The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\",\"creditRateMantissa\":\"The credit rate. This is the amount of tokens that accrue per second.\"}},\"depositTo(address,uint256,address,address)\":{\"params\":{\"amount\":\"The amount of assets to deposit\",\"controlledToken\":\"The address of the type of token the user is minting\",\"referrer\":\"The referrer of the deposit\",\"to\":\"The address receiving the newly minted tokens\"}},\"estimateCreditAccrualTime(address,uint256,uint256)\":{\"params\":{\"_interest\":\"The amount of interest that must accrue\",\"_principal\":\"The principal amount on which interest is accruing\"},\"returns\":{\"durationSeconds\":\"The duration of time it will take to accrue the given amount of interest, in seconds.\"}},\"setCreditPlanOf(address,uint128,uint128)\":{\"params\":{\"_controlledToken\":\"The controlled token for whom to set the credit plan\",\"_creditLimitMantissa\":\"The credit limit to set.  Is a fixed point 18 decimal (like Ether).\",\"_creditRateMantissa\":\"The credit rate to set.  Is a fixed point 18 decimal (like Ether).\"}},\"setLiquidityCap(uint256)\":{\"params\":{\"_liquidityCap\":\"The new liquidity cap for the prize pool\"}},\"setPrizeStrategy(address)\":{\"params\":{\"_prizeStrategy\":\"The new prize strategy.  Must implement TokenListenerInterface\"}},\"token()\":{\"details\":\"Returns the address of the underlying ERC20 asset\",\"returns\":{\"_0\":\"The address of the asset\"}},\"tokens()\":{\"returns\":{\"_0\":\"An array of controlled token addresses\"}},\"transferExternalERC20(address,address,uint256)\":{\"details\":\"Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\",\"params\":{\"amount\":\"The amount of external assets to be awarded\",\"externalToken\":\"The address of the external asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"withdrawInstantlyFrom(address,uint256,address,uint256)\":{\"params\":{\"amount\":\"The amount of tokens to redeem for assets.\",\"controlledToken\":\"The address of the token to redeem (i.e. ticket or sponsorship)\",\"from\":\"The address to redeem tokens from.\",\"maximumExitFee\":\"The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\"},\"returns\":{\"_0\":\"The actual exit fee paid\"}}},\"title\":\"Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"accountedBalance()\":{\"notice\":\"The total of all controlled tokens\"},\"award(address,uint256,address)\":{\"notice\":\"Called by the prize strategy to award prizes.\"},\"awardBalance()\":{\"notice\":\"Returns the balance that is available to award.\"},\"awardExternalERC20(address,address,uint256)\":{\"notice\":\"Called by the Prize-Strategy to award external ERC20 prizes\"},\"awardExternalERC721(address,address,uint256[])\":{\"notice\":\"Called by the prize strategy to award external ERC721 prizes\"},\"balanceOfCredit(address,address)\":{\"notice\":\"Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\"},\"calculateEarlyExitFee(address,address,uint256)\":{\"notice\":\"Calculates the early exit fee for the given amount\"},\"captureAwardBalance()\":{\"notice\":\"Captures any available interest as award balance.\"},\"creditPlanOf(address)\":{\"notice\":\"Returns the credit rate of a controlled token\"},\"depositTo(address,uint256,address,address)\":{\"notice\":\"Deposit assets into the Prize Pool in exchange for tokens\"},\"estimateCreditAccrualTime(address,uint256,uint256)\":{\"notice\":\"Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\"},\"setCreditPlanOf(address,uint128,uint128)\":{\"notice\":\"Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\"},\"setLiquidityCap(uint256)\":{\"notice\":\"Allows the Governor to set a cap on the amount of liquidity that he pool can hold\"},\"setPrizeStrategy(address)\":{\"notice\":\"Sets the prize strategy of the prize pool.  Only callable by the owner.\"},\"tokens()\":{\"notice\":\"An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\"},\"transferExternalERC20(address,address,uint256)\":{\"notice\":\"Called by the Prize-Strategy to transfer out external ERC20 tokens\"},\"withdrawInstantlyFrom(address,uint256,address,uint256)\":{\"notice\":\"Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\"}},\"notice\":\"Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/prize-pool/PrizePoolInterface.sol\":\"PrizePoolInterface\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "accountedBalance()": {
                "notice": "The total of all controlled tokens"
              },
              "award(address,uint256,address)": {
                "notice": "Called by the prize strategy to award prizes."
              },
              "awardBalance()": {
                "notice": "Returns the balance that is available to award."
              },
              "awardExternalERC20(address,address,uint256)": {
                "notice": "Called by the Prize-Strategy to award external ERC20 prizes"
              },
              "awardExternalERC721(address,address,uint256[])": {
                "notice": "Called by the prize strategy to award external ERC721 prizes"
              },
              "balanceOfCredit(address,address)": {
                "notice": "Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit."
              },
              "calculateEarlyExitFee(address,address,uint256)": {
                "notice": "Calculates the early exit fee for the given amount"
              },
              "captureAwardBalance()": {
                "notice": "Captures any available interest as award balance."
              },
              "creditPlanOf(address)": {
                "notice": "Returns the credit rate of a controlled token"
              },
              "depositTo(address,uint256,address,address)": {
                "notice": "Deposit assets into the Prize Pool in exchange for tokens"
              },
              "estimateCreditAccrualTime(address,uint256,uint256)": {
                "notice": "Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit."
              },
              "setCreditPlanOf(address,uint128,uint128)": {
                "notice": "Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether)."
              },
              "setLiquidityCap(uint256)": {
                "notice": "Allows the Governor to set a cap on the amount of liquidity that he pool can hold"
              },
              "setPrizeStrategy(address)": {
                "notice": "Sets the prize strategy of the prize pool.  Only callable by the owner."
              },
              "tokens()": {
                "notice": "An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)"
              },
              "transferExternalERC20(address,address,uint256)": {
                "notice": "Called by the Prize-Strategy to transfer out external ERC20 tokens"
              },
              "withdrawInstantlyFrom(address,uint256,address,uint256)": {
                "notice": "Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit."
              }
            },
            "notice": "Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.",
            "version": 1
          }
        }
      },
      "contracts/prize-pool/compound/CompoundPrizePool.sol": {
        "CompoundPrizePool": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "AwardCaptured",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "Awarded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "AwardedExternalERC20",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256[]",
                  "name": "tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "AwardedExternalERC721",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "cToken",
                  "type": "address"
                }
              ],
              "name": "CompoundPrizePoolInitialized",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract ControlledTokenInterface",
                  "name": "token",
                  "type": "address"
                }
              ],
              "name": "ControlledTokenAdded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "CreditBurned",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "CreditMinted",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint128",
                  "name": "creditLimitMantissa",
                  "type": "uint128"
                },
                {
                  "indexed": false,
                  "internalType": "uint128",
                  "name": "creditRateMantissa",
                  "type": "uint128"
                }
              ],
              "name": "CreditPlanSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "referrer",
                  "type": "address"
                }
              ],
              "name": "Deposited",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "bytes",
                  "name": "error",
                  "type": "bytes"
                }
              ],
              "name": "ErrorAwardingExternalERC721",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "reserveRegistry",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "maxExitFeeMantissa",
                  "type": "uint256"
                }
              ],
              "name": "Initialized",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "redeemed",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "exitFee",
                  "type": "uint256"
                }
              ],
              "name": "InstantWithdrawal",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "liquidityCap",
                  "type": "uint256"
                }
              ],
              "name": "LiquidityCapSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "prizeStrategy",
                  "type": "address"
                }
              ],
              "name": "PrizeStrategySet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "ReserveFeeCaptured",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "ReserveWithdrawal",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "TransferredExternalERC20",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "VERSION",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "accountedBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "awardBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "awardExternalERC20",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256[]",
                  "name": "tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "awardExternalERC721",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "balance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "balanceOfCredit",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "beforeTokenTransfer",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "cToken",
              "outputs": [
                {
                  "internalType": "contract CTokenInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "calculateEarlyExitFee",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "exitFee",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "burnedCredit",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "calculateReserveFee",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_externalToken",
                  "type": "address"
                }
              ],
              "name": "canAwardExternal",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "captureAwardBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract ICompLike",
                  "name": "compLike",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                }
              ],
              "name": "compLikeDelegate",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "creditPlanOf",
              "outputs": [
                {
                  "internalType": "uint128",
                  "name": "creditLimitMantissa",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "creditRateMantissa",
                  "type": "uint128"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "referrer",
                  "type": "address"
                }
              ],
              "name": "depositTo",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_principal",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "_interest",
                  "type": "uint256"
                }
              ],
              "name": "estimateCreditAccrualTime",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "durationSeconds",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "_reserveRegistry",
                  "type": "address"
                },
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "_controlledTokens",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256",
                  "name": "_maxExitFeeMantissa",
                  "type": "uint256"
                }
              ],
              "name": "initialize",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "_reserveRegistry",
                  "type": "address"
                },
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "_controlledTokens",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256",
                  "name": "_maxExitFeeMantissa",
                  "type": "uint256"
                },
                {
                  "internalType": "contract CTokenInterface",
                  "name": "_cToken",
                  "type": "address"
                }
              ],
              "name": "initialize",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract ControlledTokenInterface",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "isControlled",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "liquidityCap",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "maxExitFeeMantissa",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "onERC721Received",
              "outputs": [
                {
                  "internalType": "bytes4",
                  "name": "",
                  "type": "bytes4"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizeStrategy",
              "outputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "renounceOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "reserveRegistry",
              "outputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "reserveTotalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint128",
                  "name": "_creditRateMantissa",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "_creditLimitMantissa",
                  "type": "uint128"
                }
              ],
              "name": "setCreditPlanOf",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_liquidityCap",
                  "type": "uint256"
                }
              ],
              "name": "setLiquidityCap",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "_prizeStrategy",
                  "type": "address"
                }
              ],
              "name": "setPrizeStrategy",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "token",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "tokens",
              "outputs": [
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "",
                  "type": "address[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transferExternalERC20",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "maximumExitFee",
                  "type": "uint256"
                }
              ],
              "name": "withdrawInstantlyFrom",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                }
              ],
              "name": "withdrawReserve",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "accountedBalance()": {
                "returns": {
                  "_0": "The current total of all tokens"
                }
              },
              "award(address,uint256,address)": {
                "details": "The amount awarded must be less than the awardBalance()",
                "params": {
                  "amount": "The amount of assets to be awarded",
                  "controlledToken": "The address of the asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "awardBalance()": {
                "details": "captureAwardBalance() should be called first",
                "returns": {
                  "_0": "The total amount of assets to be awarded for the current prize"
                }
              },
              "awardExternalERC20(address,address,uint256)": {
                "details": "Used to award any arbitrary tokens held by the Prize Pool",
                "params": {
                  "amount": "The amount of external assets to be awarded",
                  "externalToken": "The address of the external asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "awardExternalERC721(address,address,uint256[])": {
                "details": "Used to award any arbitrary NFTs held by the Prize Pool",
                "params": {
                  "externalToken": "The address of the external NFT token being awarded",
                  "to": "The address of the winner that receives the award",
                  "tokenIds": "An array of NFT Token IDs to be transferred"
                }
              },
              "balance()": {
                "details": "Returns the total underlying balance of all assets. This includes both principal and interest.",
                "returns": {
                  "_0": "The underlying balance of assets"
                }
              },
              "balanceOfCredit(address,address)": {
                "params": {
                  "user": "The user whose credit balance should be returned"
                },
                "returns": {
                  "_0": "The balance of the users credit"
                }
              },
              "beforeTokenTransfer(address,address,uint256)": {
                "params": {
                  "amount": "The amount of tokens being trasferred",
                  "from": "The address the tokens are being transferred from (0 if minting)",
                  "to": "The address the tokens are being transferred to (0 if burning)"
                }
              },
              "calculateEarlyExitFee(address,address,uint256)": {
                "params": {
                  "amount": "The amount of collateral to be withdrawn",
                  "controlledToken": "The type of collateral being withdrawn",
                  "from": "The user who is withdrawing"
                },
                "returns": {
                  "burnedCredit": "The user's credit that was burned",
                  "exitFee": "The exit fee"
                }
              },
              "calculateReserveFee(uint256)": {
                "params": {
                  "amount": "The prize amount"
                },
                "returns": {
                  "_0": "The size of the reserve portion of the prize"
                }
              },
              "canAwardExternal(address)": {
                "details": "Checks with the Prize Pool if a specific token type may be awarded as an external prize",
                "params": {
                  "_externalToken": "The address of the token to check"
                },
                "returns": {
                  "_0": "True if the token may be awarded, false otherwise"
                }
              },
              "captureAwardBalance()": {
                "details": "This function also captures the reserve fees.",
                "returns": {
                  "_0": "The total amount of assets to be awarded for the current prize"
                }
              },
              "compLikeDelegate(address,address)": {
                "params": {
                  "compLike": "The COMP-like token held by the prize pool that should be delegated",
                  "to": "The address to delegate to "
                }
              },
              "creditPlanOf(address)": {
                "params": {
                  "controlledToken": "The controlled token to retrieve the credit rates for"
                },
                "returns": {
                  "creditLimitMantissa": "The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.",
                  "creditRateMantissa": "The credit rate. This is the amount of tokens that accrue per second."
                }
              },
              "depositTo(address,uint256,address,address)": {
                "params": {
                  "amount": "The amount of assets to deposit",
                  "controlledToken": "The address of the type of token the user is minting",
                  "referrer": "The referrer of the deposit",
                  "to": "The address receiving the newly minted tokens"
                }
              },
              "estimateCreditAccrualTime(address,uint256,uint256)": {
                "params": {
                  "_interest": "The amount of interest that must accrue",
                  "_principal": "The principal amount on which interest is accruing"
                },
                "returns": {
                  "durationSeconds": "The duration of time it will take to accrue the given amount of interest, in seconds."
                }
              },
              "initialize(address,address[],uint256)": {
                "params": {
                  "_controlledTokens": "Array of ControlledTokens that are controlled by this Prize Pool.",
                  "_maxExitFeeMantissa": "The maximum exit fee size"
                }
              },
              "initialize(address,address[],uint256,address)": {
                "params": {
                  "_cToken": "Address of the Compound cToken interface",
                  "_controlledTokens": "Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool",
                  "_maxExitFeeMantissa": "The maximum exit fee size, relative to the withdrawal amount"
                }
              },
              "isControlled(address)": {
                "details": "Checks if a specific token is controlled by the Prize Pool",
                "params": {
                  "controlledToken": "The address of the token to check"
                },
                "returns": {
                  "_0": "True if the token is a controlled token, false otherwise"
                }
              },
              "onERC721Received(address,address,uint256,bytes)": {
                "params": {
                  "data": "Additional data with no specified format, sent in call to `_to`.",
                  "from": "The current owner of the NFT",
                  "operator": "The address that acts on behalf of the owner",
                  "tokenId": "The NFT to transfer"
                }
              },
              "owner()": {
                "details": "Returns the address of the current owner."
              },
              "renounceOwnership()": {
                "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
              },
              "setCreditPlanOf(address,uint128,uint128)": {
                "params": {
                  "_controlledToken": "The controlled token for whom to set the credit plan",
                  "_creditLimitMantissa": "The credit limit to set.  Is a fixed point 18 decimal (like Ether).",
                  "_creditRateMantissa": "The credit rate to set.  Is a fixed point 18 decimal (like Ether)."
                }
              },
              "setLiquidityCap(uint256)": {
                "params": {
                  "_liquidityCap": "The new liquidity cap for the prize pool"
                }
              },
              "setPrizeStrategy(address)": {
                "params": {
                  "_prizeStrategy": "The new prize strategy"
                }
              },
              "token()": {
                "details": "Returns the address of the underlying ERC20 asset",
                "returns": {
                  "_0": "The address of the asset"
                }
              },
              "tokens()": {
                "returns": {
                  "_0": "An array of controlled token addresses"
                }
              },
              "transferExternalERC20(address,address,uint256)": {
                "details": "Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.",
                "params": {
                  "amount": "The amount of external assets to be awarded",
                  "externalToken": "The address of the external asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "transferOwnership(address)": {
                "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
              },
              "withdrawInstantlyFrom(address,uint256,address,uint256)": {
                "params": {
                  "amount": "The amount of tokens to redeem for assets.",
                  "controlledToken": "The address of the token to redeem (i.e. ticket or sponsorship)",
                  "from": "The address to redeem tokens from.",
                  "maximumExitFee": "The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn."
                },
                "returns": {
                  "_0": "The actual exit fee paid"
                }
              }
            },
            "title": "Prize Pool with Compound's cToken",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50614425806100206000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c8063888c2b6f11610130578063a7b2cc31116100b8578063e6d8a94b1161007c578063e6d8a94b14610956578063edb4e1cf1461095e578063f2fde38b14610966578063fc0c546a1461098c578063ffa1ad741461099457610232565b8063a7b2cc31146107c1578063b69ef8a8146107fe578063c587148514610806578063d4a1361d146108c5578063e323f8251461091a57610232565b806398bf3eb6116100ff57806398bf3eb6146107025780639d63848a1461070a5780639e167519146107625780639fe32a911461076a578063a016240b1461078757610232565b8063888c2b6f1461067d5780638da5cb5b146106cc5780638e71c1f6146106d457806391ca480e146106dc57610232565b8063630665b4116101be57806376687d3d1161018257806376687d3d146105ca57806378b3d327146105d257806379cb8563146105f85780637b99adb11461062a5780637cbab1c71461064757610232565b8063630665b41461052657806369e527da1461052e5780636a3fd4f9146105525780636b1b863a1461058c578063715018a6146105c257610232565b80632b0ab144116102055780632b0ab144146103bb5780632f7627e3146103f15780633ede50c61461041f578063494de9f7146104d257806352a387ab1461050057610232565b80630937eb541461023757806313f55e3914610251578063150b7a021461028957806316960d5514610334575b600080fd5b61023f610a11565b60408051918252519081900360200190f35b6102876004803603606081101561026757600080fd5b506001600160a01b03813581169160208101359091169060400135610a20565b005b6103176004803603608081101561029f57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156102d957600080fd5b8201836020820111156102eb57600080fd5b803590602001918460018302840111600160201b8311171561030c57600080fd5b509092509050610ade565b604080516001600160e01b03199092168252519081900360200190f35b6102876004803603606081101561034a57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561037d57600080fd5b82018360208201111561038f57600080fd5b803590602001918460208302840111600160201b831117156103b057600080fd5b509092509050610aef565b610287600480360360608110156103d157600080fd5b506001600160a01b03813581169160208101359091169060400135610d9c565b6102876004803603604081101561040757600080fd5b506001600160a01b0381358116916020013516610e59565b6102876004803603606081101561043557600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561045f57600080fd5b82018360208201111561047157600080fd5b803590602001918460208302840111600160201b8311171561049257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250610fa8915050565b61023f600480360360408110156104e857600080fd5b506001600160a01b038135811691602001351661119a565b61023f6004803603602081101561051657600080fd5b50356001600160a01b03166112a1565b61023f6113f0565b6105366113f6565b604080516001600160a01b039092168252519081900360200190f35b6105786004803603602081101561056857600080fd5b50356001600160a01b0316611405565b604080519115158252519081900360200190f35b610287600480360360608110156105a257600080fd5b506001600160a01b03813581169160208101359160409091013516611418565b610287611620565b61023f6116cc565b610578600480360360208110156105e857600080fd5b50356001600160a01b03166116d2565b61023f6004803603606081101561060e57600080fd5b506001600160a01b0381351690602081013590604001356116dd565b6102876004803603602081101561064057600080fd5b50356116f2565b6102876004803603606081101561065d57600080fd5b506001600160a01b03813581169160208101359091169060400135611760565b6106b36004803603606081101561069357600080fd5b506001600160a01b038135811691602081013590911690604001356119ac565b6040805192835260208301919091528051918290030190f35b6105366119c6565b6105366119d5565b610287600480360360208110156106f257600080fd5b50356001600160a01b03166119e4565b610536611a4f565b610712611a5e565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561074e578181015183820152602001610736565b505050509050019250505060405180910390f35b61023f611ac0565b61023f6004803603602081101561078057600080fd5b5035611ac6565b61023f6004803603608081101561079d57600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611bf4565b610287600480360360608110156107d757600080fd5b506001600160a01b03813516906001600160801b0360208201358116916040013516611e2b565b61023f611f81565b6102876004803603608081101561081c57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561084657600080fd5b82018360208201111561085857600080fd5b803590602001918460208302840111600160201b8311171561087957600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602001356001600160a01b0316611f8b565b6108eb600480360360208110156108db57600080fd5b50356001600160a01b0316612089565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b6102876004803603608081101561093057600080fd5b506001600160a01b038135811691602081013591604082013581169160600135166120b9565b61023f61226e565b61023f6123e4565b6102876004803603602081101561097c57600080fd5b50356001600160a01b03166123ea565b6105366124ed565b61099c6124f7565b6040805160208082528351818301528351919283929083019185019080838360005b838110156109d65781810151838201526020016109be565b50505050905090810190601f168015610a035780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610a1b612518565b905090565b6099546001600160a01b0316610a34612623565b6001600160a01b031614610a7d576040805162461bcd60e51b815260206004820152601c60248201526000805160206143d0833981519152604482015290519081900360640190fd5b610a88838383612627565b15610ad957816001600160a01b0316836001600160a01b03167fb0bac59718cd343c80a813518afcf36846cfcfe6d56e2b3cab9bd49f5f9b251c836040518082815260200191505060405180910390a35b505050565b630a85bd0160e11b95945050505050565b6099546001600160a01b0316610b03612623565b6001600160a01b031614610b4c576040805162461bcd60e51b815260206004820152601c60248201526000805160206143d0833981519152604482015290519081900360640190fd5b610b55836126af565b610ba6576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b80610bb057610d96565b60005b81811015610d1d57836001600160a01b03166342842e0e3087868686818110610bd857fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610c3557600080fd5b505af1925050508015610c46575060015b610d15573d808015610c74576040519150601f19603f3d011682016040523d82523d6000602084013e610c79565b606091505b507f17e975018310f88872b58d4d8263adca83cf5c1893496ea2a86923dab15276ad816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610cd9578181015183820152602001610cc1565b50505050905090810190601f168015610d065780820380516001836020036101000a031916815260200191505b509250505060405180910390a1505b600101610bb3565b50826001600160a01b0316846001600160a01b03167f69c2de32bc4d47f488e72626a6cfdee85089342e52675e7de79c4b417623960c848460405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a35b50505050565b6099546001600160a01b0316610db0612623565b6001600160a01b031614610df9576040805162461bcd60e51b815260206004820152601c60248201526000805160206143d0833981519152604482015290519081900360640190fd5b610e04838383612627565b15610ad957816001600160a01b0316836001600160a01b03167fc65f48aca3b7a99b7443d04b8ffbb073156179bc628dc3f7def5047748973469836040518082815260200191505060405180910390a3505050565b610e61612623565b6001600160a01b0316610e726119c6565b6001600160a01b031614610ebb576040805162461bcd60e51b815260206004820181905260248201526000805160206142e3833981519152604482015290519081900360640190fd5b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f0a57600080fd5b505afa158015610f1e573d6000803e3d6000fd5b505050506040513d6020811015610f3457600080fd5b50511115610fa457816001600160a01b0316635c19a95c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015610f8b57600080fd5b505af1158015610f9f573d6000803e3d6000fd5b505050505b5050565b600054610100900460ff1680610fc15750610fc16126c4565b80610fcf575060005460ff16155b61100a5760405162461bcd60e51b815260040180806020018281038252602e815260200180614294602e913960400191505060405180910390fd5b600054610100900460ff16158015611035576000805460ff1961ff0019909116610100171660011790555b6001600160a01b03841661107a5760405162461bcd60e51b815260040180806020018281038252602281526020018061424c6022913960400191505060405180910390fd5b82518067ffffffffffffffff8111801561109357600080fd5b506040519080825280602002602001820160405280156110bd578160200160208202803683370190505b5080516110d291609891602090910190614183565b5060005b818110156111095760008582815181106110ec57fe5b6020026020010151905061110081836126d5565b506001016110d6565b50611112612800565b61111a6128b1565b611125600019612946565b609780546001600160a01b0319166001600160a01b038716908117909155609a849055604080519182526020820185905280517f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce799281900390910190a1508015610d96576000805461ff001916905550505050565b6000816111a681612981565b6111e5576040805162461bcd60e51b8152602060048201526017602482015260008051602061432a833981519152604482015290519081900360640190fd5b61126a8484856001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d602081101561126157600080fd5b50516000612a3d565b50506001600160a01b039081166000908152609f60209081526040808320949093168252929092529020546001600160c01b031690565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112f257600080fd5b505afa158015611306573d6000803e3d6000fd5b505050506040513d602081101561131c57600080fd5b505190506001600160a01b0381163314611376576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f6f6e6c792d7265736572766560501b604482015290519081900360640190fd5b609b80546000918290559061138a82612a53565b90506113a98582611399612c38565b6001600160a01b03169190612cae565b6040805183815290516001600160a01b038716917f1c71c8e11fd443227c8f8d3dc1a237a3a5e8310b540c7fbcf5169754aedf42c9919081900360200190a2949350505050565b609d5490565b60a0546001600160a01b031681565b6000611410826126af565b90505b919050565b6099546001600160a01b031661142c612623565b6001600160a01b031614611475576040805162461bcd60e51b815260206004820152601c60248201526000805160206143d0833981519152604482015290519081900360640190fd5b8061147f81612981565b6114be576040805162461bcd60e51b8152602060048201526017602482015260008051602061432a833981519152604482015290519081900360640190fd5b826114c857610d96565b609d5483111561151f576040805162461bcd60e51b815260206004820152601d60248201527f5072697a65506f6f6c2f61776172642d657863656564732d617661696c000000604482015290519081900360640190fd5b609d5461152c9084612d00565b609d5561153c8484846000612d62565b60006115488385612e48565b90506115ce8584856001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561159c57600080fd5b505afa1580156115b0573d6000803e3d6000fd5b505050506040513d60208110156115c657600080fd5b505184612a3d565b826001600160a01b0316856001600160a01b03167fe2554529d99ab7a67db6b4cea2b32c7d55ae325f958861e05f304fdded867e31866040518082815260200191505060405180910390a35050505050565b611628612623565b6001600160a01b03166116396119c6565b6001600160a01b031614611682576040805162461bcd60e51b815260206004820181905260248201526000805160206142e3833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b609c5481565b600061141082612981565b60006116ea848484612e80565b949350505050565b6116fa612623565b6001600160a01b031661170b6119c6565b6001600160a01b031614611754576040805162461bcd60e51b815260206004820181905260248201526000805160206142e3833981519152604482015290519081900360640190fd5b61175d81612946565b50565b3361176a81612981565b6117a9576040805162461bcd60e51b8152602060048201526017602482015260008051602061432a833981519152604482015290519081900360640190fd5b6001600160a01b03841615611883576000336001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180757600080fd5b505afa15801561181b573d6000803e3d6000fd5b505050506040513d602081101561183157600080fd5b50519050600061184386338484612ed1565b9050846001600160a01b0316866001600160a01b031614611875576118723361186c8487612d00565b83612f60565b90505b611880863383612fa6565b50505b6001600160a01b038316158015906118ad5750836001600160a01b0316836001600160a01b031614155b15611904576119048333336001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561123757600080fd5b6001600160a01b0384161580159061192657506099546001600160a01b031615155b15610d96576099546040805163b221095760e01b81526001600160a01b0387811660048301528681166024830152604482018690523360648301529151919092169163b221095791608480830192600092919082900301818387803b15801561198e57600080fd5b505af11580156119a2573d6000803e3d6000fd5b5050505050505050565b6000806119ba858585613144565b90969095509350505050565b6033546001600160a01b031690565b6097546001600160a01b031681565b6119ec612623565b6001600160a01b03166119fd6119c6565b6001600160a01b031614611a46576040805162461bcd60e51b815260206004820181905260248201526000805160206142e3833981519152604482015290519081900360640190fd5b61175d816132e2565b6099546001600160a01b031681565b60606098805480602002602001604051908101604052809291908181526020018280548015611ab657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a98575b5050505050905090565b609a5481565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b1757600080fd5b505afa158015611b2b573d6000803e3d6000fd5b505050506040513d6020811015611b4157600080fd5b505190506001600160a01b038116611b5d576000915050611413565b6000816001600160a01b031663010dfa58306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611bac57600080fd5b505afa158015611bc0573d6000803e3d6000fd5b505050506040513d6020811015611bd657600080fd5b5051905080611bea57600092505050611413565b6116ea84826133f5565b600060026065541415611c4e576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655582611c5d81612981565b611c9c576040805162461bcd60e51b8152602060048201526017602482015260008051602061432a833981519152604482015290519081900360640190fd5b600080611caa888789613144565b9150915084821115611ced5760405162461bcd60e51b81526004018080602001828103825260278152602001806143036027913960400191505060405180910390fd5b611cf8888783613416565b856001600160a01b031663631b5dfb611d0f612623565b8a8a6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611d6757600080fd5b505af1158015611d7b573d6000803e3d6000fd5b505050506000611d948389612d0090919063ffffffff16565b90506000611da182612a53565b9050611db08a82611399612c38565b876001600160a01b03168a6001600160a01b0316611dcc612623565b604080518d81526020810186905280820189905290516001600160a01b0392909216917f0271704a58fd2953e49b87d67a0a3ce28a58147de98a5457f60b4686f63850309181900360600190a450506001606555509695505050505050565b82611e3581612981565b611e74576040805162461bcd60e51b8152602060048201526017602482015260008051602061432a833981519152604482015290519081900360640190fd5b611e7c612623565b6001600160a01b0316611e8d6119c6565b6001600160a01b031614611ed6576040805162461bcd60e51b815260206004820181905260248201526000805160206142e3833981519152604482015290519081900360640190fd5b6040805180820182526001600160801b0380851680835286821660208085018281526001600160a01b038b166000818152609e84528890209651875492518716600160801b029087166fffffffffffffffffffffffffffffffff1990931692909217909516179094558451928352928201528083019190915290517ffb0ba2cf86a2b03bcf387753a2192da80a006afa99dd022bb301c78e323bf1b99181900360600190a150505050565b6000610a1b6134d7565b600054610100900460ff1680611fa45750611fa46126c4565b80611fb2575060005460ff16155b611fed5760405162461bcd60e51b815260040180806020018281038252602e815260200180614294602e913960400191505060405180910390fd5b600054610100900460ff16158015612018576000805460ff1961ff0019909116610100171660011790555b612023858585610fa8565b60a080546001600160a01b0319166001600160a01b0384811691909117918290556040519116907fa5670b49a0ee863080ae28858bb5d9bcc1eb0d2a6f4c9c3a8accc43b8f445d2590600090a28015612082576000805461ff00191690555b5050505050565b6001600160a01b03166000908152609e60205260409020546001600160801b0380821692600160801b9092041690565b60026065541415612111576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026065558161212081612981565b61215f576040805162461bcd60e51b8152602060048201526017602482015260008051602061432a833981519152604482015290519081900360640190fd5b8361216981613537565b6121ba576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f657863656564732d6c69717569646974792d63617000604482015290519081900360640190fd5b60006121c4612623565b90506121d287878787612d62565b6121f18130886121e0612c38565b6001600160a01b031692919061355b565b6121fa866135b5565b846001600160a01b0316876001600160a01b0316826001600160a01b03167f6ce569498e0f86f147466ac49211cb2a1ffe06195adb805e383b3f2365109160898860405180838152602001826001600160a01b031681526020019250505060405180910390a4505060016065555050505050565b6000600260655414156122c8576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655560006122d7612518565b905060006122e36134d7565b905060008282116122f55760006122ff565b6122ff8284612d00565b90506000609d548211612313576000612321565b609d54612321908390612d00565b905080156123d357600061233482611ac6565b9050801561238e57609b5461234990826136aa565b609b556123568282612d00565b6040805183815290519193507f5f1703ccfa2730d4245350f228079926a37f26a44ecf6978a7eeafff0af11407919081900360200190a15b609d5461239b90836136aa565b609d556040805183815290517fce2b6e507c7ca1a20ce136810f524eefc19ba4c7e4866eb6cc0cba76e778d4be9181900360200190a1505b609d54945050505050600160655590565b609b5481565b6123f2612623565b6001600160a01b03166124036119c6565b6001600160a01b03161461244c576040805162461bcd60e51b815260206004820181905260248201526000805160206142e3833981519152604482015290519081900360640190fd5b6001600160a01b0381166124915760405162461bcd60e51b81526004018080602001828103825260268152602001806141ff6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610a1b612c38565b60405180604001604052806005815260200164332e342e3560d81b81525081565b600080609b5490506060609880548060200260200160405190810160405280929190818152602001828054801561257857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161255a575b505083519394506000925050505b8181101561261a5761261083828151811061259d57fe5b60200260200101516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156125dd57600080fd5b505afa1580156125f1573d6000803e3d6000fd5b505050506040513d602081101561260757600080fd5b505185906136aa565b9350600101612586565b50919250505090565b3390565b6000612632836126af565b612683576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b81612690575060006126a8565b6126a46001600160a01b0384168584612cae565b5060015b9392505050565b60a0546001600160a01b039081169116141590565b60006126cf30613704565b15905090565b306001600160a01b0316826001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b15801561271857600080fd5b505afa15801561272c573d6000803e3d6000fd5b505050506040513d602081101561274257600080fd5b50516001600160a01b03161461279f576040805162461bcd60e51b815260206004820152601e60248201527f5072697a65506f6f6c2f746f6b656e2d6374726c722d6d69736d617463680000604482015290519081900360640190fd5b81609882815481106127ad57fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051918416917f460e712b4a5d801d031ed673dea209b73ab854f7ddeb86b6c48082e92c3eee669190a25050565b600054610100900460ff168061281957506128196126c4565b80612827575060005460ff16155b6128625760405162461bcd60e51b815260040180806020018281038252602e815260200180614294602e913960400191505060405180910390fd5b600054610100900460ff1615801561288d576000805460ff1961ff0019909116610100171660011790555b61289561370a565b61289d6137aa565b801561175d576000805461ff001916905550565b600054610100900460ff16806128ca57506128ca6126c4565b806128d8575060005460ff16155b6129135760405162461bcd60e51b815260040180806020018281038252602e815260200180614294602e913960400191505060405180910390fd5b600054610100900460ff1615801561293e576000805460ff1961ff0019909116610100171660011790555b61289d6138a3565b609c8190556040805182815290517f3ff20538222f568f27ff436c0c49dfd3e48d5b8f86533a3f759dc1c7089775ab9181900360200190a150565b6000606060988054806020026020016040519081016040528092919081815260200182805480156129db57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116129bd575b505083519394506000925050505b81811015612a3257846001600160a01b0316838281518110612a0757fe5b60200260200101516001600160a01b03161415612a2a5760019350505050611413565b6001016129e9565b506000949350505050565b610d968484612a4e87878787612ed1565b612fa6565b600080612a5e612c38565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612aaf57600080fd5b505afa158015612ac3573d6000803e3d6000fd5b505050506040513d6020811015612ad957600080fd5b505160a0546040805163852a12e360e01b81526004810188905290519293506001600160a01b039091169163852a12e3916024808201926020929091908290030181600087803b158015612b2c57600080fd5b505af1158015612b40573d6000803e3d6000fd5b505050506040513d6020811015612b5657600080fd5b505115612baa576040805162461bcd60e51b815260206004820152601f60248201527f436f6d706f756e645072697a65506f6f6c2f72656465656d2d6661696c656400604482015290519081900360640190fd5b6000612c2f82846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612bfd57600080fd5b505afa158015612c11573d6000803e3d6000fd5b505050506040513d6020811015612c2757600080fd5b505190612d00565b95945050505050565b60a05460408051636f307dc360e01b815290516000926001600160a01b031691636f307dc3916004808301926020929190829003018186803b158015612c7d57600080fd5b505afa158015612c91573d6000803e3d6000fd5b505050506040513d6020811015612ca757600080fd5b5051905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ad9908490613949565b600082821115612d57576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6099546001600160a01b031615612df157609954604080516304d7f3db60e41b81526001600160a01b038781166004830152602482018790528581166044830152848116606483015291519190921691634d7f3db091608480830192600092919082900301818387803b158015612dd857600080fd5b505af1158015612dec573d6000803e3d6000fd5b505050505b816001600160a01b0316635d7b075885856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561198e57600080fd5b6001600160a01b0382166000908152609e60205260408120546126a8908390612e7b9082906001600160801b03166133f5565b6139fa565b6001600160a01b0383166000908152609e60205260408120548190612eb6908590600160801b90046001600160801b03166133f5565b905080612ec75760009150506126a8565b612c2f8382613a1f565b6001600160a01b038381166000908152609f6020908152604080832093881683529290529081208054829190600160e01b900460ff16612f145760009150612f56565b6000612f21888888613a86565b8254909150612f529088908890612f4d908990612f47906001600160c01b0316876136aa565b906136aa565b612f60565b9250505b5095945050505050565b6001600160a01b0383166000908152609e60205260408120548190612f8f9085906001600160801b03166133f5565b905080831115612f9d578092505b50909392505050565b6001600160a01b038083166000908152609f602090815260408083209387168352929052819020548151606081019092526001600160c01b03169080612feb84613b37565b6001600160801b03168152602001613009613004613b7f565b613b83565b63ffffffff908116825260016020928301526001600160a01b038681166000908152609f84526040808220928a168252918452819020845181549486015195909201516001600160c01b03199094166001600160c01b039092169190911763ffffffff60c01b1916600160c01b94909216939093021760ff60e01b1916600160e01b91151591909102179055818110156130ec576001600160a01b038084169085167f2f92d56910619b38bc29fd8e4ca5e56359edac7a0c086cdcd305fb603fa374916130d68585612d00565b60408051918252519081900360200190a3610d96565b80821015610d96576001600160a01b038084169085167ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf61312d8486612d00565b60408051918252519081900360200190a350505050565b6000806000846001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561319657600080fd5b505afa1580156131aa573d6000803e3d6000fd5b505050506040513d60208110156131c057600080fd5b5051905083811015613212576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f696e737566662d66756e647360501b604482015290519081900360640190fd5b61321f8686836000612a3d565b60006132348661322f8488612d00565b612e48565b6001600160a01b038088166000908152609f60209081526040808320938c16835292905290812054919250906001600160c01b031682116132ab576001600160a01b038088166000908152609f60209081526040808320938c16835292905220546132a8906001600160c01b031683612d00565b90505b60006132b78888612e48565b90508082116132c657816132c8565b805b94506132d48186612d00565b955050505050935093915050565b6001600160a01b03811661333d576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f7072697a6553747261746567792d6e6f742d7a65726f604482015290519081900360640190fd5b61335a6001600160a01b038216600162a1cb1960e01b0319613bc7565b6133ab576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f7072697a6553747261746567792d696e76616c696400604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0383169081179091556040517f7f58dc86bc2e435cb77ca0edb1df55e25f90caf2d6bd866971715437d456a21290600090a250565b6000806134028385613be3565b90506116ea81670de0b6b3a7640000613c3c565b6001600160a01b038083166000908152609f602090815260408083209387168352929052205461345890613453906001600160c01b031683612d00565b613b37565b6001600160a01b038084166000818152609f602090815260408083209489168084529482529182902080546001600160c01b0319166001600160801b0396909616959095179094558051858152905191937ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf92918290030190a3505050565b60a05460408051633af9e66960e01b815230600482015290516000926001600160a01b031691633af9e66991602480830192602092919082900301818787803b15801561352357600080fd5b505af1158015612c91573d6000803e3d6000fd5b600080613542612518565b609c5490915061355282856136aa565b11159392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610d96908590613949565b60a0546135de906001600160a01b0316826135ce612c38565b6001600160a01b03169190613c7e565b60a0546040805163140e25ad60e31b81526004810184905290516001600160a01b039092169163a0712d68916024808201926020929091908290030181600087803b15801561362c57600080fd5b505af1158015613640573d6000803e3d6000fd5b505050506040513d602081101561365657600080fd5b50511561175d576040805162461bcd60e51b815260206004820152601d60248201527f436f6d706f756e645072697a65506f6f6c2f6d696e742d6661696c6564000000604482015290519081900360640190fd5b6000828201838110156126a8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3b151590565b600054610100900460ff168061372357506137236126c4565b80613731575060005460ff16155b61376c5760405162461bcd60e51b815260040180806020018281038252602e815260200180614294602e913960400191505060405180910390fd5b600054610100900460ff1615801561289d576000805460ff1961ff001990911661010017166001179055801561175d576000805461ff001916905550565b600054610100900460ff16806137c357506137c36126c4565b806137d1575060005460ff16155b61380c5760405162461bcd60e51b815260040180806020018281038252602e815260200180614294602e913960400191505060405180910390fd5b600054610100900460ff16158015613837576000805460ff1961ff0019909116610100171660011790555b6000613841612623565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561175d576000805461ff001916905550565b600054610100900460ff16806138bc57506138bc6126c4565b806138ca575060005460ff16155b6139055760405162461bcd60e51b815260040180806020018281038252602e815260200180614294602e913960400191505060405180910390fd5b600054610100900460ff16158015613930576000805460ff1961ff0019909116610100171660011790555b6001606555801561175d576000805461ff001916905550565b606061399e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613d919092919063ffffffff16565b805190915015610ad9578080602001905160208110156139bd57600080fd5b5051610ad95760405162461bcd60e51b815260040180806020018281038252602a815260200180614370602a913960400191505060405180910390fd5b600080613a0984609a546133f5565b905080831115613a17578092505b509092915050565b6000808211613a75576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381613a7e57fe5b049392505050565b6001600160a01b038281166000908152609f60209081526040808320938716835292905290812054600160c01b810463ffffffff1690600160e01b900460ff16613ad45760009150506126a8565b6000613ae882613ae2613b7f565b90612d00565b6001600160a01b0386166000908152609e602052604081205491925090613b20908390600160801b90046001600160801b0316613be3565b9050613b2c85826133f5565b979650505050505050565b6000600160801b8210613b7b5760405162461bcd60e51b81526004018080602001828103825260278152602001806142256027913960400191505060405180910390fd5b5090565b4290565b6000600160201b8210613b7b5760405162461bcd60e51b815260040180806020018281038252602681526020018061434a6026913960400191505060405180910390fd5b6000613bd283613da0565b80156126a857506126a88383613dd3565b600082613bf257506000612d5c565b82820282848281613bff57fe5b04146126a85760405162461bcd60e51b81526004018080602001828103825260218152602001806142c26021913960400191505060405180910390fd5b60006126a883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613df6565b801580613d04575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015613cd657600080fd5b505afa158015613cea573d6000803e3d6000fd5b505050506040513d6020811015613d0057600080fd5b5051155b613d3f5760405162461bcd60e51b815260040180806020018281038252603681526020018061439a6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610ad9908490613949565b60606116ea8484600085613e98565b6000613db3826301ffc9a760e01b613dd3565b80156114105750613dcc826001600160e01b0319613dd3565b1592915050565b6000806000613de28585613fe9565b91509150818015612c2f5750949350505050565b60008183613e825760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613e47578181015183820152602001613e2f565b50505050905090810190601f168015613e745780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613e8e57fe5b0495945050505050565b606082471015613ed95760405162461bcd60e51b815260040180806020018281038252602681526020018061426e6026913960400191505060405180910390fd5b613ee285613704565b613f33576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613f725780518252601f199092019160209182019101613f53565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613fd4576040519150601f19603f3d011682016040523d82523d6000602084013e613fd9565b606091505b5091509150613b2c82828661411d565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b1781529151815160009384939284926060926001600160a01b038a169261753092879282918083835b602083106140715780518252601f199092019160209182019101614052565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146140d2576040519150601f19603f3d011682016040523d82523d6000602084013e6140d7565b606091505b50915091506020815110156140f55760008094509450505050614116565b8181806020019051602081101561410b57600080fd5b505190955093505050505b9250929050565b6060831561412c5750816126a8565b82511561413c5782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315613e47578181015183820152602001613e2f565b8280548282559060005260206000209081019282156141d8579160200282015b828111156141d857825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906141a3565b50613b7b9291505b80821115613b7b5780546001600160a01b03191681556001016141e056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e2031323820626974735072697a65506f6f6c2f7265736572766552656769737472792d6e6f742d7a65726f416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725072697a65506f6f6c2f657869742d6665652d657863656564732d757365722d6d6178696d756d5072697a65506f6f6c2f756e6b6e6f776e2d746f6b656e00000000000000000053616665436173743a2076616c756520646f65736e27742066697420696e20333220626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e63655072697a65506f6f6c2f6f6e6c792d7072697a65537472617465677900000000a2646970667358221220f4393b0623e961cf091e9e8dd7f9daddda87eb68809795b7c73097e3c133f48f64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4425 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x232 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x888C2B6F GT PUSH2 0x130 JUMPI DUP1 PUSH4 0xA7B2CC31 GT PUSH2 0xB8 JUMPI DUP1 PUSH4 0xE6D8A94B GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xE6D8A94B EQ PUSH2 0x956 JUMPI DUP1 PUSH4 0xEDB4E1CF EQ PUSH2 0x95E JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x966 JUMPI DUP1 PUSH4 0xFC0C546A EQ PUSH2 0x98C JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x994 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0xA7B2CC31 EQ PUSH2 0x7C1 JUMPI DUP1 PUSH4 0xB69EF8A8 EQ PUSH2 0x7FE JUMPI DUP1 PUSH4 0xC5871485 EQ PUSH2 0x806 JUMPI DUP1 PUSH4 0xD4A1361D EQ PUSH2 0x8C5 JUMPI DUP1 PUSH4 0xE323F825 EQ PUSH2 0x91A JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x98BF3EB6 GT PUSH2 0xFF JUMPI DUP1 PUSH4 0x98BF3EB6 EQ PUSH2 0x702 JUMPI DUP1 PUSH4 0x9D63848A EQ PUSH2 0x70A JUMPI DUP1 PUSH4 0x9E167519 EQ PUSH2 0x762 JUMPI DUP1 PUSH4 0x9FE32A91 EQ PUSH2 0x76A JUMPI DUP1 PUSH4 0xA016240B EQ PUSH2 0x787 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x888C2B6F EQ PUSH2 0x67D JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x6CC JUMPI DUP1 PUSH4 0x8E71C1F6 EQ PUSH2 0x6D4 JUMPI DUP1 PUSH4 0x91CA480E EQ PUSH2 0x6DC JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x630665B4 GT PUSH2 0x1BE JUMPI DUP1 PUSH4 0x76687D3D GT PUSH2 0x182 JUMPI DUP1 PUSH4 0x76687D3D EQ PUSH2 0x5CA JUMPI DUP1 PUSH4 0x78B3D327 EQ PUSH2 0x5D2 JUMPI DUP1 PUSH4 0x79CB8563 EQ PUSH2 0x5F8 JUMPI DUP1 PUSH4 0x7B99ADB1 EQ PUSH2 0x62A JUMPI DUP1 PUSH4 0x7CBAB1C7 EQ PUSH2 0x647 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x630665B4 EQ PUSH2 0x526 JUMPI DUP1 PUSH4 0x69E527DA EQ PUSH2 0x52E JUMPI DUP1 PUSH4 0x6A3FD4F9 EQ PUSH2 0x552 JUMPI DUP1 PUSH4 0x6B1B863A EQ PUSH2 0x58C JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x5C2 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x2B0AB144 GT PUSH2 0x205 JUMPI DUP1 PUSH4 0x2B0AB144 EQ PUSH2 0x3BB JUMPI DUP1 PUSH4 0x2F7627E3 EQ PUSH2 0x3F1 JUMPI DUP1 PUSH4 0x3EDE50C6 EQ PUSH2 0x41F JUMPI DUP1 PUSH4 0x494DE9F7 EQ PUSH2 0x4D2 JUMPI DUP1 PUSH4 0x52A387AB EQ PUSH2 0x500 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x937EB54 EQ PUSH2 0x237 JUMPI DUP1 PUSH4 0x13F55E39 EQ PUSH2 0x251 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x289 JUMPI DUP1 PUSH4 0x16960D55 EQ PUSH2 0x334 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x23F PUSH2 0xA11 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x267 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xA20 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x317 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x29F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x2D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x2EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x30C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xADE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x34A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x37D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x38F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x3B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xAEF JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x3D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xD9C JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x407 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xE59 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x435 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x45F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x471 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x492 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0xFA8 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x4E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x119A JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x516 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x12A1 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x13F0 JUMP JUMPDEST PUSH2 0x536 PUSH2 0x13F6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x578 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x568 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1405 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x5A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 SWAP1 SWAP2 ADD CALLDATALOAD AND PUSH2 0x1418 JUMP JUMPDEST PUSH2 0x287 PUSH2 0x1620 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x16CC JUMP JUMPDEST PUSH2 0x578 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16D2 JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x60E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x16DD JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x640 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x16F2 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x65D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1760 JUMP JUMPDEST PUSH2 0x6B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x693 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x19AC JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB ADD SWAP1 RETURN JUMPDEST PUSH2 0x536 PUSH2 0x19C6 JUMP JUMPDEST PUSH2 0x536 PUSH2 0x19D5 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x19E4 JUMP JUMPDEST PUSH2 0x536 PUSH2 0x1A4F JUMP JUMPDEST PUSH2 0x712 PUSH2 0x1A5E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x74E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x736 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x23F PUSH2 0x1AC0 JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x780 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1AC6 JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x79D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x1BF4 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x7D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x40 ADD CALLDATALOAD AND PUSH2 0x1E2B JUMP JUMPDEST PUSH2 0x23F PUSH2 0x1F81 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x81C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x846 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x858 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x879 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1F8B JUMP JUMPDEST PUSH2 0x8EB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x8DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2089 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x930 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x20B9 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x226E JUMP JUMPDEST PUSH2 0x23F PUSH2 0x23E4 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x97C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x23EA JUMP JUMPDEST PUSH2 0x536 PUSH2 0x24ED JUMP JUMPDEST PUSH2 0x99C PUSH2 0x24F7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x9D6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x9BE JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xA03 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xA1B PUSH2 0x2518 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xA34 PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xA7D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D0 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xA88 DUP4 DUP4 DUP4 PUSH2 0x2627 JUMP JUMPDEST ISZERO PUSH2 0xAD9 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB0BAC59718CD343C80A813518AFCF36846CFCFE6D56E2B3CAB9BD49F5F9B251C DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0xA85BD01 PUSH1 0xE1 SHL SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xB03 PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xB4C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D0 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xB55 DUP4 PUSH2 0x26AF JUMP JUMPDEST PUSH2 0xBA6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0xBB0 JUMPI PUSH2 0xD96 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xD1D JUMPI DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x42842E0E ADDRESS DUP8 DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0xBD8 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0xC46 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xD15 JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0xC74 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xC79 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH32 0x17E975018310F88872B58D4D8263ADCA83CF5C1893496EA2A86923DAB15276AD DUP2 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xCD9 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xCC1 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD06 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xBB3 JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x69C2DE32BC4D47F488E72626A6CFDEE85089342E52675E7DE79C4B417623960C DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP6 POP SWAP1 SWAP4 POP POP POP POP LOG3 JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xDB0 PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xDF9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D0 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xE04 DUP4 DUP4 DUP4 PUSH2 0x2627 JUMP JUMPDEST ISZERO PUSH2 0xAD9 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC65F48ACA3B7A99B7443D04B8FFBB073156179BC628DC3F7DEF5047748973469 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH2 0xE61 PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE72 PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xEBB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42E3 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF0A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xF1E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xF34 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD GT ISZERO PUSH2 0xFA4 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5C19A95C DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF9F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0xFC1 JUMPI POP PUSH2 0xFC1 PUSH2 0x26C4 JUMP JUMPDEST DUP1 PUSH2 0xFCF JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x100A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4294 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1035 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x107A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x424C PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 MLOAD DUP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x1093 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x10BD JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP1 MLOAD PUSH2 0x10D2 SWAP2 PUSH1 0x98 SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x4183 JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1109 JUMPI PUSH1 0x0 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x10EC JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0x1100 DUP2 DUP4 PUSH2 0x26D5 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x10D6 JUMP JUMPDEST POP PUSH2 0x1112 PUSH2 0x2800 JUMP JUMPDEST PUSH2 0x111A PUSH2 0x28B1 JUMP JUMPDEST PUSH2 0x1125 PUSH1 0x0 NOT PUSH2 0x2946 JUMP JUMPDEST PUSH1 0x97 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x9A DUP5 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP6 SWAP1 MSTORE DUP1 MLOAD PUSH32 0x25FF68DD81B34665B5BA7E553EE5511BF6812E12ADB4A7E2C0D9E26B3099CE79 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 POP DUP1 ISZERO PUSH2 0xD96 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x11A6 DUP2 PUSH2 0x2981 JUMP JUMPDEST PUSH2 0x11E5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x432A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x126A DUP5 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1237 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x124B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1261 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 PUSH2 0x2A3D JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP4 AND DUP3 MSTORE SWAP3 SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1306 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x131C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ PUSH2 0x1376 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F6F6E6C792D72657365727665 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9B DUP1 SLOAD PUSH1 0x0 SWAP2 DUP3 SWAP1 SSTORE SWAP1 PUSH2 0x138A DUP3 PUSH2 0x2A53 JUMP JUMPDEST SWAP1 POP PUSH2 0x13A9 DUP6 DUP3 PUSH2 0x1399 PUSH2 0x2C38 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x2CAE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP2 PUSH32 0x1C71C8E11FD443227C8F8D3DC1A237A3A5E8310B540C7FBCF5169754AEDF42C9 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x9D SLOAD SWAP1 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1410 DUP3 PUSH2 0x26AF JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x142C PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1475 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D0 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x147F DUP2 PUSH2 0x2981 JUMP JUMPDEST PUSH2 0x14BE JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x432A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 PUSH2 0x14C8 JUMPI PUSH2 0xD96 JUMP JUMPDEST PUSH1 0x9D SLOAD DUP4 GT ISZERO PUSH2 0x151F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F61776172642D657863656564732D617661696C000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x152C SWAP1 DUP5 PUSH2 0x2D00 JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH2 0x153C DUP5 DUP5 DUP5 PUSH1 0x0 PUSH2 0x2D62 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1548 DUP4 DUP6 PUSH2 0x2E48 JUMP JUMPDEST SWAP1 POP PUSH2 0x15CE DUP6 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x159C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x15B0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x15C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP5 PUSH2 0x2A3D JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xE2554529D99AB7A67DB6B4CEA2B32C7D55AE325F958861E05F304FDDED867E31 DUP7 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1628 PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1639 PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1682 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42E3 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1410 DUP3 PUSH2 0x2981 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x16EA DUP5 DUP5 DUP5 PUSH2 0x2E80 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x16FA PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x170B PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1754 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42E3 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x175D DUP2 PUSH2 0x2946 JUMP JUMPDEST POP JUMP JUMPDEST CALLER PUSH2 0x176A DUP2 PUSH2 0x2981 JUMP JUMPDEST PUSH2 0x17A9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x432A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO PUSH2 0x1883 JUMPI PUSH1 0x0 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP7 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1807 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x181B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1831 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x1843 DUP7 CALLER DUP5 DUP5 PUSH2 0x2ED1 JUMP JUMPDEST SWAP1 POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1875 JUMPI PUSH2 0x1872 CALLER PUSH2 0x186C DUP5 DUP8 PUSH2 0x2D00 JUMP JUMPDEST DUP4 PUSH2 0x2F60 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x1880 DUP7 CALLER DUP4 PUSH2 0x2FA6 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x18AD JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x1904 JUMPI PUSH2 0x1904 DUP4 CALLER CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1237 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1926 JUMPI POP PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xD96 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP7 SWAP1 MSTORE CALLER PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xB2210957 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x198E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x19A2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x19BA DUP6 DUP6 DUP6 PUSH2 0x3144 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x97 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x19EC PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x19FD PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1A46 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42E3 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x175D DUP2 PUSH2 0x32E2 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1AB6 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1A98 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1B17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B2B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1B41 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1B5D JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x1413 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x10DFA58 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1BAC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1BC0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1BD6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x1BEA JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x1413 JUMP JUMPDEST PUSH2 0x16EA DUP5 DUP3 PUSH2 0x33F5 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x1C4E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP3 PUSH2 0x1C5D DUP2 PUSH2 0x2981 JUMP JUMPDEST PUSH2 0x1C9C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x432A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1CAA DUP9 DUP8 DUP10 PUSH2 0x3144 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0x1CED JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4303 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1CF8 DUP9 DUP8 DUP4 PUSH2 0x3416 JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x631B5DFB PUSH2 0x1D0F PUSH2 0x2623 JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1D67 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D7B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 PUSH2 0x1D94 DUP4 DUP10 PUSH2 0x2D00 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1DA1 DUP3 PUSH2 0x2A53 JUMP JUMPDEST SWAP1 POP PUSH2 0x1DB0 DUP11 DUP3 PUSH2 0x1399 PUSH2 0x2C38 JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1DCC PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP14 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE DUP1 DUP3 ADD DUP10 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x271704A58FD2953E49B87D67A0A3CE28A58147DE98A5457F60B4686F6385030 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH2 0x1E35 DUP2 PUSH2 0x2981 JUMP JUMPDEST PUSH2 0x1E74 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x432A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1E7C PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E8D PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1ED6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42E3 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP6 AND DUP1 DUP4 MSTORE DUP7 DUP3 AND PUSH1 0x20 DUP1 DUP6 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9E DUP5 MSTORE DUP9 SWAP1 KECCAK256 SWAP7 MLOAD DUP8 SLOAD SWAP3 MLOAD DUP8 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP1 DUP8 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP6 AND OR SWAP1 SWAP5 SSTORE DUP5 MLOAD SWAP3 DUP4 MSTORE SWAP3 DUP3 ADD MSTORE DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 MLOAD PUSH32 0xFB0BA2CF86A2B03BCF387753A2192DA80A006AFA99DD022BB301C78E323BF1B9 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA1B PUSH2 0x34D7 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1FA4 JUMPI POP PUSH2 0x1FA4 PUSH2 0x26C4 JUMP JUMPDEST DUP1 PUSH2 0x1FB2 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1FED JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4294 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2018 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2023 DUP6 DUP6 DUP6 PUSH2 0xFA8 JUMP JUMPDEST PUSH1 0xA0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 AND SWAP1 PUSH32 0xA5670B49A0EE863080AE28858BB5D9BCC1EB0D2A6F4C9C3A8ACCC43B8F445D25 SWAP1 PUSH1 0x0 SWAP1 LOG2 DUP1 ISZERO PUSH2 0x2082 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP3 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND SWAP1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x2111 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP2 PUSH2 0x2120 DUP2 PUSH2 0x2981 JUMP JUMPDEST PUSH2 0x215F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x432A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP4 PUSH2 0x2169 DUP2 PUSH2 0x3537 JUMP JUMPDEST PUSH2 0x21BA JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F657863656564732D6C69717569646974792D63617000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x21C4 PUSH2 0x2623 JUMP JUMPDEST SWAP1 POP PUSH2 0x21D2 DUP8 DUP8 DUP8 DUP8 PUSH2 0x2D62 JUMP JUMPDEST PUSH2 0x21F1 DUP2 ADDRESS DUP9 PUSH2 0x21E0 PUSH2 0x2C38 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 SWAP1 PUSH2 0x355B JUMP JUMPDEST PUSH2 0x21FA DUP7 PUSH2 0x35B5 JUMP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6CE569498E0F86F147466AC49211CB2A1FFE06195ADB805E383B3F2365109160 DUP10 DUP9 PUSH1 0x40 MLOAD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x22C8 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE PUSH1 0x0 PUSH2 0x22D7 PUSH2 0x2518 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x22E3 PUSH2 0x34D7 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 DUP3 GT PUSH2 0x22F5 JUMPI PUSH1 0x0 PUSH2 0x22FF JUMP JUMPDEST PUSH2 0x22FF DUP3 DUP5 PUSH2 0x2D00 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x9D SLOAD DUP3 GT PUSH2 0x2313 JUMPI PUSH1 0x0 PUSH2 0x2321 JUMP JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x2321 SWAP1 DUP4 SWAP1 PUSH2 0x2D00 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x23D3 JUMPI PUSH1 0x0 PUSH2 0x2334 DUP3 PUSH2 0x1AC6 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x238E JUMPI PUSH1 0x9B SLOAD PUSH2 0x2349 SWAP1 DUP3 PUSH2 0x36AA JUMP JUMPDEST PUSH1 0x9B SSTORE PUSH2 0x2356 DUP3 DUP3 PUSH2 0x2D00 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 POP PUSH32 0x5F1703CCFA2730D4245350F228079926A37F26A44ECF6978A7EEAFFF0AF11407 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x239B SWAP1 DUP4 PUSH2 0x36AA JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xCE2B6E507C7CA1A20CE136810F524EEFC19BA4C7E4866EB6CC0CBA76E778D4BE SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH1 0x9D SLOAD SWAP5 POP POP POP POP POP PUSH1 0x1 PUSH1 0x65 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x9B SLOAD DUP2 JUMP JUMPDEST PUSH2 0x23F2 PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2403 PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x244C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42E3 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x2491 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x41FF PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA1B PUSH2 0x2C38 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x9B SLOAD SWAP1 POP PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2578 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x255A JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x261A JUMPI PUSH2 0x2610 DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x259D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x25DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x25F1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2607 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP6 SWAP1 PUSH2 0x36AA JUMP JUMPDEST SWAP4 POP PUSH1 0x1 ADD PUSH2 0x2586 JUMP JUMPDEST POP SWAP2 SWAP3 POP POP POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2632 DUP4 PUSH2 0x26AF JUMP JUMPDEST PUSH2 0x2683 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x2690 JUMPI POP PUSH1 0x0 PUSH2 0x26A8 JUMP JUMPDEST PUSH2 0x26A4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP6 DUP5 PUSH2 0x2CAE JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND SWAP2 AND EQ ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x26CF ADDRESS PUSH2 0x3704 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF77C4791 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2718 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x272C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2742 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x279F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F746F6B656E2D6374726C722D6D69736D617463680000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x98 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x27AD JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 DUP5 AND SWAP2 PUSH32 0x460E712B4A5D801D031ED673DEA209B73AB854F7DDEB86B6C48082E92C3EEE66 SWAP2 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2819 JUMPI POP PUSH2 0x2819 PUSH2 0x26C4 JUMP JUMPDEST DUP1 PUSH2 0x2827 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2862 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4294 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x288D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2895 PUSH2 0x370A JUMP JUMPDEST PUSH2 0x289D PUSH2 0x37AA JUMP JUMPDEST DUP1 ISZERO PUSH2 0x175D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x28CA JUMPI POP PUSH2 0x28CA PUSH2 0x26C4 JUMP JUMPDEST DUP1 PUSH2 0x28D8 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2913 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4294 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x293E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x289D PUSH2 0x38A3 JUMP JUMPDEST PUSH1 0x9C DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3FF20538222F568F27FF436C0C49DFD3E48D5B8F86533A3F759DC1C7089775AB SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x29DB JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x29BD JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2A32 JUMPI DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2A07 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x2A2A JUMPI PUSH1 0x1 SWAP4 POP POP POP POP PUSH2 0x1413 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x29E9 JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xD96 DUP5 DUP5 PUSH2 0x2A4E DUP8 DUP8 DUP8 DUP8 PUSH2 0x2ED1 JUMP JUMPDEST PUSH2 0x2FA6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2A5E PUSH2 0x2C38 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2AAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2AC3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2AD9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x852A12E3 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP9 SWAP1 MSTORE SWAP1 MLOAD SWAP3 SWAP4 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0x852A12E3 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2B2C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2B40 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2B56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO PUSH2 0x2BAA JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6D706F756E645072697A65506F6F6C2F72656465656D2D6661696C656400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2C2F DUP3 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2BFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2C11 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2C27 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 PUSH2 0x2D00 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x6F307DC3 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x6F307DC3 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2C7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2C91 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2CA7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xAD9 SWAP1 DUP5 SWAP1 PUSH2 0x3949 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2D57 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2DF1 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE DUP6 DUP2 AND PUSH1 0x44 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x4D7F3DB0 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2DD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2DEC JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5D7B0758 DUP6 DUP6 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x198E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x26A8 SWAP1 DUP4 SWAP1 PUSH2 0x2E7B SWAP1 DUP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x33F5 JUMP JUMPDEST PUSH2 0x39FA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2EB6 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x33F5 JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x2EC7 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x26A8 JUMP JUMPDEST PUSH2 0x2C2F DUP4 DUP3 PUSH2 0x3A1F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP3 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x2F14 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x2F56 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2F21 DUP9 DUP9 DUP9 PUSH2 0x3A86 JUMP JUMPDEST DUP3 SLOAD SWAP1 SWAP2 POP PUSH2 0x2F52 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x2F4D SWAP1 DUP10 SWAP1 PUSH2 0x2F47 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP8 PUSH2 0x36AA JUMP JUMPDEST SWAP1 PUSH2 0x36AA JUMP JUMPDEST PUSH2 0x2F60 JUMP JUMPDEST SWAP3 POP POP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2F8F SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x33F5 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x2F9D JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE DUP2 SWAP1 KECCAK256 SLOAD DUP2 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 DUP1 PUSH2 0x2FEB DUP5 PUSH2 0x3B37 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x3009 PUSH2 0x3004 PUSH2 0x3B7F JUMP JUMPDEST PUSH2 0x3B83 JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP3 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 DUP11 AND DUP3 MSTORE SWAP2 DUP5 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP5 DUP7 ADD MLOAD SWAP6 SWAP1 SWAP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH4 0xFFFFFFFF PUSH1 0xC0 SHL NOT AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP5 SWAP1 SWAP3 AND SWAP4 SWAP1 SWAP4 MUL OR PUSH1 0xFF PUSH1 0xE0 SHL NOT AND PUSH1 0x1 PUSH1 0xE0 SHL SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE DUP2 DUP2 LT ISZERO PUSH2 0x30EC JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0x2F92D56910619B38BC29FD8E4CA5E56359EDAC7A0C086CDCD305FB603FA37491 PUSH2 0x30D6 DUP6 DUP6 PUSH2 0x2D00 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 PUSH2 0xD96 JUMP JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0xD96 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF PUSH2 0x312D DUP5 DUP7 PUSH2 0x2D00 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3196 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x31AA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x31C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x3212 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F696E737566662D66756E6473 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x321F DUP7 DUP7 DUP4 PUSH1 0x0 PUSH2 0x2A3D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3234 DUP7 PUSH2 0x322F DUP5 DUP9 PUSH2 0x2D00 JUMP JUMPDEST PUSH2 0x2E48 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP3 GT PUSH2 0x32AB JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x32A8 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2D00 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x32B7 DUP9 DUP9 PUSH2 0x2E48 JUMP JUMPDEST SWAP1 POP DUP1 DUP3 GT PUSH2 0x32C6 JUMPI DUP2 PUSH2 0x32C8 JUMP JUMPDEST DUP1 JUMPDEST SWAP5 POP PUSH2 0x32D4 DUP2 DUP7 PUSH2 0x2D00 JUMP JUMPDEST SWAP6 POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x333D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D6E6F742D7A65726F PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x335A PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3BC7 JUMP JUMPDEST PUSH2 0x33AB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D696E76616C696400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x99 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x7F58DC86BC2E435CB77CA0EDB1DF55E25F90CAF2D6BD866971715437D456A212 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3402 DUP4 DUP6 PUSH2 0x3BE3 JUMP JUMPDEST SWAP1 POP PUSH2 0x16EA DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x3C3C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x3458 SWAP1 PUSH2 0x3453 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2D00 JUMP JUMPDEST PUSH2 0x3B37 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x3AF9E669 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x3AF9E669 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3523 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2C91 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3542 PUSH2 0x2518 JUMP JUMPDEST PUSH1 0x9C SLOAD SWAP1 SWAP2 POP PUSH2 0x3552 DUP3 DUP6 PUSH2 0x36AA JUMP JUMPDEST GT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x24 DUP4 ADD MSTORE DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x84 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xD96 SWAP1 DUP6 SWAP1 PUSH2 0x3949 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH2 0x35DE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH2 0x35CE PUSH2 0x2C38 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x3C7E JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x140E25AD PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0xA0712D68 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x362C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3640 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3656 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO PUSH2 0x175D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6D706F756E645072697A65506F6F6C2F6D696E742D6661696C6564000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x26A8 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3723 JUMPI POP PUSH2 0x3723 PUSH2 0x26C4 JUMP JUMPDEST DUP1 PUSH2 0x3731 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x376C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4294 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x289D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x175D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x37C3 JUMPI POP PUSH2 0x37C3 PUSH2 0x26C4 JUMP JUMPDEST DUP1 PUSH2 0x37D1 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x380C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4294 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3837 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x3841 PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x175D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x38BC JUMPI POP PUSH2 0x38BC PUSH2 0x26C4 JUMP JUMPDEST DUP1 PUSH2 0x38CA JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3905 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4294 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3930 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x65 SSTORE DUP1 ISZERO PUSH2 0x175D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x399E DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3D91 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xAD9 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x39BD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xAD9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4370 PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3A09 DUP5 PUSH1 0x9A SLOAD PUSH2 0x33F5 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x3A17 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x3A75 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x3A7E JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xC0 SHL DUP2 DIV PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x3AD4 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x26A8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3AE8 DUP3 PUSH2 0x3AE2 PUSH2 0x3B7F JUMP JUMPDEST SWAP1 PUSH2 0x2D00 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x3B20 SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3BE3 JUMP JUMPDEST SWAP1 POP PUSH2 0x3B2C DUP6 DUP3 PUSH2 0x33F5 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x3B7B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4225 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST TIMESTAMP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x20 SHL DUP3 LT PUSH2 0x3B7B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x434A PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3BD2 DUP4 PUSH2 0x3DA0 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x26A8 JUMPI POP PUSH2 0x26A8 DUP4 DUP4 PUSH2 0x3DD3 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3BF2 JUMPI POP PUSH1 0x0 PUSH2 0x2D5C JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x3BFF JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x26A8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42C2 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x26A8 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x3DF6 JUMP JUMPDEST DUP1 ISZERO DUP1 PUSH2 0x3D04 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH4 0x6EB1769F PUSH1 0xE1 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 DUP6 AND SWAP2 PUSH4 0xDD62ED3E SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3CD6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3CEA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3D00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO JUMPDEST PUSH2 0x3D3F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x36 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x439A PUSH1 0x36 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x95EA7B3 PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xAD9 SWAP1 DUP5 SWAP1 PUSH2 0x3949 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x16EA DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x3E98 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3DB3 DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3DD3 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x1410 JUMPI POP PUSH2 0x3DCC DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3DD3 JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x3DE2 DUP6 DUP6 PUSH2 0x3FE9 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x2C2F JUMPI POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x3E82 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3E47 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3E2F JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3E74 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x3E8E JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x3ED9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x426E PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3EE2 DUP6 PUSH2 0x3704 JUMP JUMPDEST PUSH2 0x3F33 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3F72 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3F53 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3FD4 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3FD9 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x3B2C DUP3 DUP3 DUP7 PUSH2 0x411D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x24 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP3 DUP5 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND SWAP3 PUSH2 0x7530 SWAP3 DUP8 SWAP3 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x4071 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x4052 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x40D2 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x40D7 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x40F5 JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x4116 JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x410B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x412C JUMPI POP DUP2 PUSH2 0x26A8 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x413C JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x3E47 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3E2F JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x41D8 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x41D8 JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x41A3 JUMP JUMPDEST POP PUSH2 0x3B7B SWAP3 SWAP2 POP JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x3B7B JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x41E0 JUMP INVALID 0x4F PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F206164647265737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E2031323820626974735072697A65 POP PUSH16 0x6F6C2F72657365727665526567697374 PUSH19 0x792D6E6F742D7A65726F416464726573733A20 PUSH10 0x6E73756666696369656E PUSH21 0x2062616C616E636520666F722063616C6C496E6974 PUSH10 0x616C697A61626C653A20 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 MSTORE8 PUSH2 0x6665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F774F776E61626C653A20 PUSH4 0x616C6C65 PUSH19 0x206973206E6F7420746865206F776E65725072 PUSH10 0x7A65506F6F6C2F657869 PUSH21 0x2D6665652D657863656564732D757365722D6D6178 PUSH10 0x6D756D5072697A65506F PUSH16 0x6C2F756E6B6E6F776E2D746F6B656E00 STOP STOP STOP STOP STOP STOP STOP STOP MSTORE8 PUSH2 0x6665 NUMBER PUSH2 0x7374 GASPRICE KECCAK256 PUSH23 0x616C756520646F65736E27742066697420696E20333220 PUSH3 0x697473 MSTORE8 PUSH2 0x6665 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x7563636565645361666545524332303A20617070 PUSH19 0x6F76652066726F6D206E6F6E2D7A65726F2074 PUSH16 0x206E6F6E2D7A65726F20616C6C6F7761 PUSH15 0x63655072697A65506F6F6C2F6F6E6C PUSH26 0x2D7072697A65537472617465677900000000A264697066735822 SLT KECCAK256 DELEGATECALL CODECOPY EXTCODESIZE MOD 0x23 0xE9 PUSH2 0xCF09 0x1E SWAP15 DUP14 0xD7 0xF9 0xDA 0xDD 0xDA DUP8 0xEB PUSH9 0x809795B7C73097E3C1 CALLER DELEGATECALL DUP16 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "633:2963:41:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106102325760003560e01c8063888c2b6f11610130578063a7b2cc31116100b8578063e6d8a94b1161007c578063e6d8a94b14610956578063edb4e1cf1461095e578063f2fde38b14610966578063fc0c546a1461098c578063ffa1ad741461099457610232565b8063a7b2cc31146107c1578063b69ef8a8146107fe578063c587148514610806578063d4a1361d146108c5578063e323f8251461091a57610232565b806398bf3eb6116100ff57806398bf3eb6146107025780639d63848a1461070a5780639e167519146107625780639fe32a911461076a578063a016240b1461078757610232565b8063888c2b6f1461067d5780638da5cb5b146106cc5780638e71c1f6146106d457806391ca480e146106dc57610232565b8063630665b4116101be57806376687d3d1161018257806376687d3d146105ca57806378b3d327146105d257806379cb8563146105f85780637b99adb11461062a5780637cbab1c71461064757610232565b8063630665b41461052657806369e527da1461052e5780636a3fd4f9146105525780636b1b863a1461058c578063715018a6146105c257610232565b80632b0ab144116102055780632b0ab144146103bb5780632f7627e3146103f15780633ede50c61461041f578063494de9f7146104d257806352a387ab1461050057610232565b80630937eb541461023757806313f55e3914610251578063150b7a021461028957806316960d5514610334575b600080fd5b61023f610a11565b60408051918252519081900360200190f35b6102876004803603606081101561026757600080fd5b506001600160a01b03813581169160208101359091169060400135610a20565b005b6103176004803603608081101561029f57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156102d957600080fd5b8201836020820111156102eb57600080fd5b803590602001918460018302840111600160201b8311171561030c57600080fd5b509092509050610ade565b604080516001600160e01b03199092168252519081900360200190f35b6102876004803603606081101561034a57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561037d57600080fd5b82018360208201111561038f57600080fd5b803590602001918460208302840111600160201b831117156103b057600080fd5b509092509050610aef565b610287600480360360608110156103d157600080fd5b506001600160a01b03813581169160208101359091169060400135610d9c565b6102876004803603604081101561040757600080fd5b506001600160a01b0381358116916020013516610e59565b6102876004803603606081101561043557600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561045f57600080fd5b82018360208201111561047157600080fd5b803590602001918460208302840111600160201b8311171561049257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250610fa8915050565b61023f600480360360408110156104e857600080fd5b506001600160a01b038135811691602001351661119a565b61023f6004803603602081101561051657600080fd5b50356001600160a01b03166112a1565b61023f6113f0565b6105366113f6565b604080516001600160a01b039092168252519081900360200190f35b6105786004803603602081101561056857600080fd5b50356001600160a01b0316611405565b604080519115158252519081900360200190f35b610287600480360360608110156105a257600080fd5b506001600160a01b03813581169160208101359160409091013516611418565b610287611620565b61023f6116cc565b610578600480360360208110156105e857600080fd5b50356001600160a01b03166116d2565b61023f6004803603606081101561060e57600080fd5b506001600160a01b0381351690602081013590604001356116dd565b6102876004803603602081101561064057600080fd5b50356116f2565b6102876004803603606081101561065d57600080fd5b506001600160a01b03813581169160208101359091169060400135611760565b6106b36004803603606081101561069357600080fd5b506001600160a01b038135811691602081013590911690604001356119ac565b6040805192835260208301919091528051918290030190f35b6105366119c6565b6105366119d5565b610287600480360360208110156106f257600080fd5b50356001600160a01b03166119e4565b610536611a4f565b610712611a5e565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561074e578181015183820152602001610736565b505050509050019250505060405180910390f35b61023f611ac0565b61023f6004803603602081101561078057600080fd5b5035611ac6565b61023f6004803603608081101561079d57600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611bf4565b610287600480360360608110156107d757600080fd5b506001600160a01b03813516906001600160801b0360208201358116916040013516611e2b565b61023f611f81565b6102876004803603608081101561081c57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561084657600080fd5b82018360208201111561085857600080fd5b803590602001918460208302840111600160201b8311171561087957600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602001356001600160a01b0316611f8b565b6108eb600480360360208110156108db57600080fd5b50356001600160a01b0316612089565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b6102876004803603608081101561093057600080fd5b506001600160a01b038135811691602081013591604082013581169160600135166120b9565b61023f61226e565b61023f6123e4565b6102876004803603602081101561097c57600080fd5b50356001600160a01b03166123ea565b6105366124ed565b61099c6124f7565b6040805160208082528351818301528351919283929083019185019080838360005b838110156109d65781810151838201526020016109be565b50505050905090810190601f168015610a035780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610a1b612518565b905090565b6099546001600160a01b0316610a34612623565b6001600160a01b031614610a7d576040805162461bcd60e51b815260206004820152601c60248201526000805160206143d0833981519152604482015290519081900360640190fd5b610a88838383612627565b15610ad957816001600160a01b0316836001600160a01b03167fb0bac59718cd343c80a813518afcf36846cfcfe6d56e2b3cab9bd49f5f9b251c836040518082815260200191505060405180910390a35b505050565b630a85bd0160e11b95945050505050565b6099546001600160a01b0316610b03612623565b6001600160a01b031614610b4c576040805162461bcd60e51b815260206004820152601c60248201526000805160206143d0833981519152604482015290519081900360640190fd5b610b55836126af565b610ba6576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b80610bb057610d96565b60005b81811015610d1d57836001600160a01b03166342842e0e3087868686818110610bd857fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610c3557600080fd5b505af1925050508015610c46575060015b610d15573d808015610c74576040519150601f19603f3d011682016040523d82523d6000602084013e610c79565b606091505b507f17e975018310f88872b58d4d8263adca83cf5c1893496ea2a86923dab15276ad816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610cd9578181015183820152602001610cc1565b50505050905090810190601f168015610d065780820380516001836020036101000a031916815260200191505b509250505060405180910390a1505b600101610bb3565b50826001600160a01b0316846001600160a01b03167f69c2de32bc4d47f488e72626a6cfdee85089342e52675e7de79c4b417623960c848460405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a35b50505050565b6099546001600160a01b0316610db0612623565b6001600160a01b031614610df9576040805162461bcd60e51b815260206004820152601c60248201526000805160206143d0833981519152604482015290519081900360640190fd5b610e04838383612627565b15610ad957816001600160a01b0316836001600160a01b03167fc65f48aca3b7a99b7443d04b8ffbb073156179bc628dc3f7def5047748973469836040518082815260200191505060405180910390a3505050565b610e61612623565b6001600160a01b0316610e726119c6565b6001600160a01b031614610ebb576040805162461bcd60e51b815260206004820181905260248201526000805160206142e3833981519152604482015290519081900360640190fd5b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f0a57600080fd5b505afa158015610f1e573d6000803e3d6000fd5b505050506040513d6020811015610f3457600080fd5b50511115610fa457816001600160a01b0316635c19a95c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015610f8b57600080fd5b505af1158015610f9f573d6000803e3d6000fd5b505050505b5050565b600054610100900460ff1680610fc15750610fc16126c4565b80610fcf575060005460ff16155b61100a5760405162461bcd60e51b815260040180806020018281038252602e815260200180614294602e913960400191505060405180910390fd5b600054610100900460ff16158015611035576000805460ff1961ff0019909116610100171660011790555b6001600160a01b03841661107a5760405162461bcd60e51b815260040180806020018281038252602281526020018061424c6022913960400191505060405180910390fd5b82518067ffffffffffffffff8111801561109357600080fd5b506040519080825280602002602001820160405280156110bd578160200160208202803683370190505b5080516110d291609891602090910190614183565b5060005b818110156111095760008582815181106110ec57fe5b6020026020010151905061110081836126d5565b506001016110d6565b50611112612800565b61111a6128b1565b611125600019612946565b609780546001600160a01b0319166001600160a01b038716908117909155609a849055604080519182526020820185905280517f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce799281900390910190a1508015610d96576000805461ff001916905550505050565b6000816111a681612981565b6111e5576040805162461bcd60e51b8152602060048201526017602482015260008051602061432a833981519152604482015290519081900360640190fd5b61126a8484856001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d602081101561126157600080fd5b50516000612a3d565b50506001600160a01b039081166000908152609f60209081526040808320949093168252929092529020546001600160c01b031690565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112f257600080fd5b505afa158015611306573d6000803e3d6000fd5b505050506040513d602081101561131c57600080fd5b505190506001600160a01b0381163314611376576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f6f6e6c792d7265736572766560501b604482015290519081900360640190fd5b609b80546000918290559061138a82612a53565b90506113a98582611399612c38565b6001600160a01b03169190612cae565b6040805183815290516001600160a01b038716917f1c71c8e11fd443227c8f8d3dc1a237a3a5e8310b540c7fbcf5169754aedf42c9919081900360200190a2949350505050565b609d5490565b60a0546001600160a01b031681565b6000611410826126af565b90505b919050565b6099546001600160a01b031661142c612623565b6001600160a01b031614611475576040805162461bcd60e51b815260206004820152601c60248201526000805160206143d0833981519152604482015290519081900360640190fd5b8061147f81612981565b6114be576040805162461bcd60e51b8152602060048201526017602482015260008051602061432a833981519152604482015290519081900360640190fd5b826114c857610d96565b609d5483111561151f576040805162461bcd60e51b815260206004820152601d60248201527f5072697a65506f6f6c2f61776172642d657863656564732d617661696c000000604482015290519081900360640190fd5b609d5461152c9084612d00565b609d5561153c8484846000612d62565b60006115488385612e48565b90506115ce8584856001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561159c57600080fd5b505afa1580156115b0573d6000803e3d6000fd5b505050506040513d60208110156115c657600080fd5b505184612a3d565b826001600160a01b0316856001600160a01b03167fe2554529d99ab7a67db6b4cea2b32c7d55ae325f958861e05f304fdded867e31866040518082815260200191505060405180910390a35050505050565b611628612623565b6001600160a01b03166116396119c6565b6001600160a01b031614611682576040805162461bcd60e51b815260206004820181905260248201526000805160206142e3833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b609c5481565b600061141082612981565b60006116ea848484612e80565b949350505050565b6116fa612623565b6001600160a01b031661170b6119c6565b6001600160a01b031614611754576040805162461bcd60e51b815260206004820181905260248201526000805160206142e3833981519152604482015290519081900360640190fd5b61175d81612946565b50565b3361176a81612981565b6117a9576040805162461bcd60e51b8152602060048201526017602482015260008051602061432a833981519152604482015290519081900360640190fd5b6001600160a01b03841615611883576000336001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180757600080fd5b505afa15801561181b573d6000803e3d6000fd5b505050506040513d602081101561183157600080fd5b50519050600061184386338484612ed1565b9050846001600160a01b0316866001600160a01b031614611875576118723361186c8487612d00565b83612f60565b90505b611880863383612fa6565b50505b6001600160a01b038316158015906118ad5750836001600160a01b0316836001600160a01b031614155b15611904576119048333336001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561123757600080fd5b6001600160a01b0384161580159061192657506099546001600160a01b031615155b15610d96576099546040805163b221095760e01b81526001600160a01b0387811660048301528681166024830152604482018690523360648301529151919092169163b221095791608480830192600092919082900301818387803b15801561198e57600080fd5b505af11580156119a2573d6000803e3d6000fd5b5050505050505050565b6000806119ba858585613144565b90969095509350505050565b6033546001600160a01b031690565b6097546001600160a01b031681565b6119ec612623565b6001600160a01b03166119fd6119c6565b6001600160a01b031614611a46576040805162461bcd60e51b815260206004820181905260248201526000805160206142e3833981519152604482015290519081900360640190fd5b61175d816132e2565b6099546001600160a01b031681565b60606098805480602002602001604051908101604052809291908181526020018280548015611ab657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a98575b5050505050905090565b609a5481565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b1757600080fd5b505afa158015611b2b573d6000803e3d6000fd5b505050506040513d6020811015611b4157600080fd5b505190506001600160a01b038116611b5d576000915050611413565b6000816001600160a01b031663010dfa58306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611bac57600080fd5b505afa158015611bc0573d6000803e3d6000fd5b505050506040513d6020811015611bd657600080fd5b5051905080611bea57600092505050611413565b6116ea84826133f5565b600060026065541415611c4e576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655582611c5d81612981565b611c9c576040805162461bcd60e51b8152602060048201526017602482015260008051602061432a833981519152604482015290519081900360640190fd5b600080611caa888789613144565b9150915084821115611ced5760405162461bcd60e51b81526004018080602001828103825260278152602001806143036027913960400191505060405180910390fd5b611cf8888783613416565b856001600160a01b031663631b5dfb611d0f612623565b8a8a6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611d6757600080fd5b505af1158015611d7b573d6000803e3d6000fd5b505050506000611d948389612d0090919063ffffffff16565b90506000611da182612a53565b9050611db08a82611399612c38565b876001600160a01b03168a6001600160a01b0316611dcc612623565b604080518d81526020810186905280820189905290516001600160a01b0392909216917f0271704a58fd2953e49b87d67a0a3ce28a58147de98a5457f60b4686f63850309181900360600190a450506001606555509695505050505050565b82611e3581612981565b611e74576040805162461bcd60e51b8152602060048201526017602482015260008051602061432a833981519152604482015290519081900360640190fd5b611e7c612623565b6001600160a01b0316611e8d6119c6565b6001600160a01b031614611ed6576040805162461bcd60e51b815260206004820181905260248201526000805160206142e3833981519152604482015290519081900360640190fd5b6040805180820182526001600160801b0380851680835286821660208085018281526001600160a01b038b166000818152609e84528890209651875492518716600160801b029087166fffffffffffffffffffffffffffffffff1990931692909217909516179094558451928352928201528083019190915290517ffb0ba2cf86a2b03bcf387753a2192da80a006afa99dd022bb301c78e323bf1b99181900360600190a150505050565b6000610a1b6134d7565b600054610100900460ff1680611fa45750611fa46126c4565b80611fb2575060005460ff16155b611fed5760405162461bcd60e51b815260040180806020018281038252602e815260200180614294602e913960400191505060405180910390fd5b600054610100900460ff16158015612018576000805460ff1961ff0019909116610100171660011790555b612023858585610fa8565b60a080546001600160a01b0319166001600160a01b0384811691909117918290556040519116907fa5670b49a0ee863080ae28858bb5d9bcc1eb0d2a6f4c9c3a8accc43b8f445d2590600090a28015612082576000805461ff00191690555b5050505050565b6001600160a01b03166000908152609e60205260409020546001600160801b0380821692600160801b9092041690565b60026065541415612111576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026065558161212081612981565b61215f576040805162461bcd60e51b8152602060048201526017602482015260008051602061432a833981519152604482015290519081900360640190fd5b8361216981613537565b6121ba576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f657863656564732d6c69717569646974792d63617000604482015290519081900360640190fd5b60006121c4612623565b90506121d287878787612d62565b6121f18130886121e0612c38565b6001600160a01b031692919061355b565b6121fa866135b5565b846001600160a01b0316876001600160a01b0316826001600160a01b03167f6ce569498e0f86f147466ac49211cb2a1ffe06195adb805e383b3f2365109160898860405180838152602001826001600160a01b031681526020019250505060405180910390a4505060016065555050505050565b6000600260655414156122c8576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655560006122d7612518565b905060006122e36134d7565b905060008282116122f55760006122ff565b6122ff8284612d00565b90506000609d548211612313576000612321565b609d54612321908390612d00565b905080156123d357600061233482611ac6565b9050801561238e57609b5461234990826136aa565b609b556123568282612d00565b6040805183815290519193507f5f1703ccfa2730d4245350f228079926a37f26a44ecf6978a7eeafff0af11407919081900360200190a15b609d5461239b90836136aa565b609d556040805183815290517fce2b6e507c7ca1a20ce136810f524eefc19ba4c7e4866eb6cc0cba76e778d4be9181900360200190a1505b609d54945050505050600160655590565b609b5481565b6123f2612623565b6001600160a01b03166124036119c6565b6001600160a01b03161461244c576040805162461bcd60e51b815260206004820181905260248201526000805160206142e3833981519152604482015290519081900360640190fd5b6001600160a01b0381166124915760405162461bcd60e51b81526004018080602001828103825260268152602001806141ff6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610a1b612c38565b60405180604001604052806005815260200164332e342e3560d81b81525081565b600080609b5490506060609880548060200260200160405190810160405280929190818152602001828054801561257857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161255a575b505083519394506000925050505b8181101561261a5761261083828151811061259d57fe5b60200260200101516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156125dd57600080fd5b505afa1580156125f1573d6000803e3d6000fd5b505050506040513d602081101561260757600080fd5b505185906136aa565b9350600101612586565b50919250505090565b3390565b6000612632836126af565b612683576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b81612690575060006126a8565b6126a46001600160a01b0384168584612cae565b5060015b9392505050565b60a0546001600160a01b039081169116141590565b60006126cf30613704565b15905090565b306001600160a01b0316826001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b15801561271857600080fd5b505afa15801561272c573d6000803e3d6000fd5b505050506040513d602081101561274257600080fd5b50516001600160a01b03161461279f576040805162461bcd60e51b815260206004820152601e60248201527f5072697a65506f6f6c2f746f6b656e2d6374726c722d6d69736d617463680000604482015290519081900360640190fd5b81609882815481106127ad57fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051918416917f460e712b4a5d801d031ed673dea209b73ab854f7ddeb86b6c48082e92c3eee669190a25050565b600054610100900460ff168061281957506128196126c4565b80612827575060005460ff16155b6128625760405162461bcd60e51b815260040180806020018281038252602e815260200180614294602e913960400191505060405180910390fd5b600054610100900460ff1615801561288d576000805460ff1961ff0019909116610100171660011790555b61289561370a565b61289d6137aa565b801561175d576000805461ff001916905550565b600054610100900460ff16806128ca57506128ca6126c4565b806128d8575060005460ff16155b6129135760405162461bcd60e51b815260040180806020018281038252602e815260200180614294602e913960400191505060405180910390fd5b600054610100900460ff1615801561293e576000805460ff1961ff0019909116610100171660011790555b61289d6138a3565b609c8190556040805182815290517f3ff20538222f568f27ff436c0c49dfd3e48d5b8f86533a3f759dc1c7089775ab9181900360200190a150565b6000606060988054806020026020016040519081016040528092919081815260200182805480156129db57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116129bd575b505083519394506000925050505b81811015612a3257846001600160a01b0316838281518110612a0757fe5b60200260200101516001600160a01b03161415612a2a5760019350505050611413565b6001016129e9565b506000949350505050565b610d968484612a4e87878787612ed1565b612fa6565b600080612a5e612c38565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612aaf57600080fd5b505afa158015612ac3573d6000803e3d6000fd5b505050506040513d6020811015612ad957600080fd5b505160a0546040805163852a12e360e01b81526004810188905290519293506001600160a01b039091169163852a12e3916024808201926020929091908290030181600087803b158015612b2c57600080fd5b505af1158015612b40573d6000803e3d6000fd5b505050506040513d6020811015612b5657600080fd5b505115612baa576040805162461bcd60e51b815260206004820152601f60248201527f436f6d706f756e645072697a65506f6f6c2f72656465656d2d6661696c656400604482015290519081900360640190fd5b6000612c2f82846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612bfd57600080fd5b505afa158015612c11573d6000803e3d6000fd5b505050506040513d6020811015612c2757600080fd5b505190612d00565b95945050505050565b60a05460408051636f307dc360e01b815290516000926001600160a01b031691636f307dc3916004808301926020929190829003018186803b158015612c7d57600080fd5b505afa158015612c91573d6000803e3d6000fd5b505050506040513d6020811015612ca757600080fd5b5051905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ad9908490613949565b600082821115612d57576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6099546001600160a01b031615612df157609954604080516304d7f3db60e41b81526001600160a01b038781166004830152602482018790528581166044830152848116606483015291519190921691634d7f3db091608480830192600092919082900301818387803b158015612dd857600080fd5b505af1158015612dec573d6000803e3d6000fd5b505050505b816001600160a01b0316635d7b075885856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561198e57600080fd5b6001600160a01b0382166000908152609e60205260408120546126a8908390612e7b9082906001600160801b03166133f5565b6139fa565b6001600160a01b0383166000908152609e60205260408120548190612eb6908590600160801b90046001600160801b03166133f5565b905080612ec75760009150506126a8565b612c2f8382613a1f565b6001600160a01b038381166000908152609f6020908152604080832093881683529290529081208054829190600160e01b900460ff16612f145760009150612f56565b6000612f21888888613a86565b8254909150612f529088908890612f4d908990612f47906001600160c01b0316876136aa565b906136aa565b612f60565b9250505b5095945050505050565b6001600160a01b0383166000908152609e60205260408120548190612f8f9085906001600160801b03166133f5565b905080831115612f9d578092505b50909392505050565b6001600160a01b038083166000908152609f602090815260408083209387168352929052819020548151606081019092526001600160c01b03169080612feb84613b37565b6001600160801b03168152602001613009613004613b7f565b613b83565b63ffffffff908116825260016020928301526001600160a01b038681166000908152609f84526040808220928a168252918452819020845181549486015195909201516001600160c01b03199094166001600160c01b039092169190911763ffffffff60c01b1916600160c01b94909216939093021760ff60e01b1916600160e01b91151591909102179055818110156130ec576001600160a01b038084169085167f2f92d56910619b38bc29fd8e4ca5e56359edac7a0c086cdcd305fb603fa374916130d68585612d00565b60408051918252519081900360200190a3610d96565b80821015610d96576001600160a01b038084169085167ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf61312d8486612d00565b60408051918252519081900360200190a350505050565b6000806000846001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561319657600080fd5b505afa1580156131aa573d6000803e3d6000fd5b505050506040513d60208110156131c057600080fd5b5051905083811015613212576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f696e737566662d66756e647360501b604482015290519081900360640190fd5b61321f8686836000612a3d565b60006132348661322f8488612d00565b612e48565b6001600160a01b038088166000908152609f60209081526040808320938c16835292905290812054919250906001600160c01b031682116132ab576001600160a01b038088166000908152609f60209081526040808320938c16835292905220546132a8906001600160c01b031683612d00565b90505b60006132b78888612e48565b90508082116132c657816132c8565b805b94506132d48186612d00565b955050505050935093915050565b6001600160a01b03811661333d576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f7072697a6553747261746567792d6e6f742d7a65726f604482015290519081900360640190fd5b61335a6001600160a01b038216600162a1cb1960e01b0319613bc7565b6133ab576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f7072697a6553747261746567792d696e76616c696400604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0383169081179091556040517f7f58dc86bc2e435cb77ca0edb1df55e25f90caf2d6bd866971715437d456a21290600090a250565b6000806134028385613be3565b90506116ea81670de0b6b3a7640000613c3c565b6001600160a01b038083166000908152609f602090815260408083209387168352929052205461345890613453906001600160c01b031683612d00565b613b37565b6001600160a01b038084166000818152609f602090815260408083209489168084529482529182902080546001600160c01b0319166001600160801b0396909616959095179094558051858152905191937ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf92918290030190a3505050565b60a05460408051633af9e66960e01b815230600482015290516000926001600160a01b031691633af9e66991602480830192602092919082900301818787803b15801561352357600080fd5b505af1158015612c91573d6000803e3d6000fd5b600080613542612518565b609c5490915061355282856136aa565b11159392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610d96908590613949565b60a0546135de906001600160a01b0316826135ce612c38565b6001600160a01b03169190613c7e565b60a0546040805163140e25ad60e31b81526004810184905290516001600160a01b039092169163a0712d68916024808201926020929091908290030181600087803b15801561362c57600080fd5b505af1158015613640573d6000803e3d6000fd5b505050506040513d602081101561365657600080fd5b50511561175d576040805162461bcd60e51b815260206004820152601d60248201527f436f6d706f756e645072697a65506f6f6c2f6d696e742d6661696c6564000000604482015290519081900360640190fd5b6000828201838110156126a8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3b151590565b600054610100900460ff168061372357506137236126c4565b80613731575060005460ff16155b61376c5760405162461bcd60e51b815260040180806020018281038252602e815260200180614294602e913960400191505060405180910390fd5b600054610100900460ff1615801561289d576000805460ff1961ff001990911661010017166001179055801561175d576000805461ff001916905550565b600054610100900460ff16806137c357506137c36126c4565b806137d1575060005460ff16155b61380c5760405162461bcd60e51b815260040180806020018281038252602e815260200180614294602e913960400191505060405180910390fd5b600054610100900460ff16158015613837576000805460ff1961ff0019909116610100171660011790555b6000613841612623565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561175d576000805461ff001916905550565b600054610100900460ff16806138bc57506138bc6126c4565b806138ca575060005460ff16155b6139055760405162461bcd60e51b815260040180806020018281038252602e815260200180614294602e913960400191505060405180910390fd5b600054610100900460ff16158015613930576000805460ff1961ff0019909116610100171660011790555b6001606555801561175d576000805461ff001916905550565b606061399e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613d919092919063ffffffff16565b805190915015610ad9578080602001905160208110156139bd57600080fd5b5051610ad95760405162461bcd60e51b815260040180806020018281038252602a815260200180614370602a913960400191505060405180910390fd5b600080613a0984609a546133f5565b905080831115613a17578092505b509092915050565b6000808211613a75576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381613a7e57fe5b049392505050565b6001600160a01b038281166000908152609f60209081526040808320938716835292905290812054600160c01b810463ffffffff1690600160e01b900460ff16613ad45760009150506126a8565b6000613ae882613ae2613b7f565b90612d00565b6001600160a01b0386166000908152609e602052604081205491925090613b20908390600160801b90046001600160801b0316613be3565b9050613b2c85826133f5565b979650505050505050565b6000600160801b8210613b7b5760405162461bcd60e51b81526004018080602001828103825260278152602001806142256027913960400191505060405180910390fd5b5090565b4290565b6000600160201b8210613b7b5760405162461bcd60e51b815260040180806020018281038252602681526020018061434a6026913960400191505060405180910390fd5b6000613bd283613da0565b80156126a857506126a88383613dd3565b600082613bf257506000612d5c565b82820282848281613bff57fe5b04146126a85760405162461bcd60e51b81526004018080602001828103825260218152602001806142c26021913960400191505060405180910390fd5b60006126a883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613df6565b801580613d04575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015613cd657600080fd5b505afa158015613cea573d6000803e3d6000fd5b505050506040513d6020811015613d0057600080fd5b5051155b613d3f5760405162461bcd60e51b815260040180806020018281038252603681526020018061439a6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610ad9908490613949565b60606116ea8484600085613e98565b6000613db3826301ffc9a760e01b613dd3565b80156114105750613dcc826001600160e01b0319613dd3565b1592915050565b6000806000613de28585613fe9565b91509150818015612c2f5750949350505050565b60008183613e825760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613e47578181015183820152602001613e2f565b50505050905090810190601f168015613e745780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613e8e57fe5b0495945050505050565b606082471015613ed95760405162461bcd60e51b815260040180806020018281038252602681526020018061426e6026913960400191505060405180910390fd5b613ee285613704565b613f33576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613f725780518252601f199092019160209182019101613f53565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613fd4576040519150601f19603f3d011682016040523d82523d6000602084013e613fd9565b606091505b5091509150613b2c82828661411d565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b1781529151815160009384939284926060926001600160a01b038a169261753092879282918083835b602083106140715780518252601f199092019160209182019101614052565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146140d2576040519150601f19603f3d011682016040523d82523d6000602084013e6140d7565b606091505b50915091506020815110156140f55760008094509450505050614116565b8181806020019051602081101561410b57600080fd5b505190955093505050505b9250929050565b6060831561412c5750816126a8565b82511561413c5782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315613e47578181015183820152602001613e2f565b8280548282559060005260206000209081019282156141d8579160200282015b828111156141d857825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906141a3565b50613b7b9291505b80821115613b7b5780546001600160a01b03191681556001016141e056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e2031323820626974735072697a65506f6f6c2f7265736572766552656769737472792d6e6f742d7a65726f416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725072697a65506f6f6c2f657869742d6665652d657863656564732d757365722d6d6178696d756d5072697a65506f6f6c2f756e6b6e6f776e2d746f6b656e00000000000000000053616665436173743a2076616c756520646f65736e27742066697420696e20333220626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e63655072697a65506f6f6c2f6f6e6c792d7072697a65537472617465677900000000a2646970667358221220f4393b0623e961cf091e9e8dd7f9daddda87eb68809795b7c73097e3c133f48f64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x232 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x888C2B6F GT PUSH2 0x130 JUMPI DUP1 PUSH4 0xA7B2CC31 GT PUSH2 0xB8 JUMPI DUP1 PUSH4 0xE6D8A94B GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xE6D8A94B EQ PUSH2 0x956 JUMPI DUP1 PUSH4 0xEDB4E1CF EQ PUSH2 0x95E JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x966 JUMPI DUP1 PUSH4 0xFC0C546A EQ PUSH2 0x98C JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x994 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0xA7B2CC31 EQ PUSH2 0x7C1 JUMPI DUP1 PUSH4 0xB69EF8A8 EQ PUSH2 0x7FE JUMPI DUP1 PUSH4 0xC5871485 EQ PUSH2 0x806 JUMPI DUP1 PUSH4 0xD4A1361D EQ PUSH2 0x8C5 JUMPI DUP1 PUSH4 0xE323F825 EQ PUSH2 0x91A JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x98BF3EB6 GT PUSH2 0xFF JUMPI DUP1 PUSH4 0x98BF3EB6 EQ PUSH2 0x702 JUMPI DUP1 PUSH4 0x9D63848A EQ PUSH2 0x70A JUMPI DUP1 PUSH4 0x9E167519 EQ PUSH2 0x762 JUMPI DUP1 PUSH4 0x9FE32A91 EQ PUSH2 0x76A JUMPI DUP1 PUSH4 0xA016240B EQ PUSH2 0x787 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x888C2B6F EQ PUSH2 0x67D JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x6CC JUMPI DUP1 PUSH4 0x8E71C1F6 EQ PUSH2 0x6D4 JUMPI DUP1 PUSH4 0x91CA480E EQ PUSH2 0x6DC JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x630665B4 GT PUSH2 0x1BE JUMPI DUP1 PUSH4 0x76687D3D GT PUSH2 0x182 JUMPI DUP1 PUSH4 0x76687D3D EQ PUSH2 0x5CA JUMPI DUP1 PUSH4 0x78B3D327 EQ PUSH2 0x5D2 JUMPI DUP1 PUSH4 0x79CB8563 EQ PUSH2 0x5F8 JUMPI DUP1 PUSH4 0x7B99ADB1 EQ PUSH2 0x62A JUMPI DUP1 PUSH4 0x7CBAB1C7 EQ PUSH2 0x647 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x630665B4 EQ PUSH2 0x526 JUMPI DUP1 PUSH4 0x69E527DA EQ PUSH2 0x52E JUMPI DUP1 PUSH4 0x6A3FD4F9 EQ PUSH2 0x552 JUMPI DUP1 PUSH4 0x6B1B863A EQ PUSH2 0x58C JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x5C2 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x2B0AB144 GT PUSH2 0x205 JUMPI DUP1 PUSH4 0x2B0AB144 EQ PUSH2 0x3BB JUMPI DUP1 PUSH4 0x2F7627E3 EQ PUSH2 0x3F1 JUMPI DUP1 PUSH4 0x3EDE50C6 EQ PUSH2 0x41F JUMPI DUP1 PUSH4 0x494DE9F7 EQ PUSH2 0x4D2 JUMPI DUP1 PUSH4 0x52A387AB EQ PUSH2 0x500 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x937EB54 EQ PUSH2 0x237 JUMPI DUP1 PUSH4 0x13F55E39 EQ PUSH2 0x251 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x289 JUMPI DUP1 PUSH4 0x16960D55 EQ PUSH2 0x334 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x23F PUSH2 0xA11 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x267 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xA20 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x317 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x29F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x2D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x2EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x30C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xADE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x34A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x37D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x38F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x3B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xAEF JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x3D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xD9C JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x407 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xE59 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x435 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x45F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x471 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x492 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0xFA8 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x4E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x119A JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x516 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x12A1 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x13F0 JUMP JUMPDEST PUSH2 0x536 PUSH2 0x13F6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x578 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x568 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1405 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x5A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 SWAP1 SWAP2 ADD CALLDATALOAD AND PUSH2 0x1418 JUMP JUMPDEST PUSH2 0x287 PUSH2 0x1620 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x16CC JUMP JUMPDEST PUSH2 0x578 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16D2 JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x60E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x16DD JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x640 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x16F2 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x65D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1760 JUMP JUMPDEST PUSH2 0x6B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x693 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x19AC JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB ADD SWAP1 RETURN JUMPDEST PUSH2 0x536 PUSH2 0x19C6 JUMP JUMPDEST PUSH2 0x536 PUSH2 0x19D5 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x19E4 JUMP JUMPDEST PUSH2 0x536 PUSH2 0x1A4F JUMP JUMPDEST PUSH2 0x712 PUSH2 0x1A5E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x74E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x736 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x23F PUSH2 0x1AC0 JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x780 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1AC6 JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x79D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x1BF4 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x7D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x40 ADD CALLDATALOAD AND PUSH2 0x1E2B JUMP JUMPDEST PUSH2 0x23F PUSH2 0x1F81 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x81C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x846 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x858 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x879 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1F8B JUMP JUMPDEST PUSH2 0x8EB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x8DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2089 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x930 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x20B9 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x226E JUMP JUMPDEST PUSH2 0x23F PUSH2 0x23E4 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x97C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x23EA JUMP JUMPDEST PUSH2 0x536 PUSH2 0x24ED JUMP JUMPDEST PUSH2 0x99C PUSH2 0x24F7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x9D6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x9BE JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xA03 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xA1B PUSH2 0x2518 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xA34 PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xA7D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D0 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xA88 DUP4 DUP4 DUP4 PUSH2 0x2627 JUMP JUMPDEST ISZERO PUSH2 0xAD9 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB0BAC59718CD343C80A813518AFCF36846CFCFE6D56E2B3CAB9BD49F5F9B251C DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0xA85BD01 PUSH1 0xE1 SHL SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xB03 PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xB4C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D0 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xB55 DUP4 PUSH2 0x26AF JUMP JUMPDEST PUSH2 0xBA6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0xBB0 JUMPI PUSH2 0xD96 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xD1D JUMPI DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x42842E0E ADDRESS DUP8 DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0xBD8 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0xC46 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xD15 JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0xC74 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xC79 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH32 0x17E975018310F88872B58D4D8263ADCA83CF5C1893496EA2A86923DAB15276AD DUP2 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xCD9 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xCC1 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD06 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xBB3 JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x69C2DE32BC4D47F488E72626A6CFDEE85089342E52675E7DE79C4B417623960C DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP6 POP SWAP1 SWAP4 POP POP POP POP LOG3 JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xDB0 PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xDF9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D0 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xE04 DUP4 DUP4 DUP4 PUSH2 0x2627 JUMP JUMPDEST ISZERO PUSH2 0xAD9 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC65F48ACA3B7A99B7443D04B8FFBB073156179BC628DC3F7DEF5047748973469 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH2 0xE61 PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE72 PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xEBB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42E3 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF0A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xF1E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xF34 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD GT ISZERO PUSH2 0xFA4 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5C19A95C DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF9F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0xFC1 JUMPI POP PUSH2 0xFC1 PUSH2 0x26C4 JUMP JUMPDEST DUP1 PUSH2 0xFCF JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x100A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4294 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1035 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x107A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x424C PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 MLOAD DUP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x1093 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x10BD JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP1 MLOAD PUSH2 0x10D2 SWAP2 PUSH1 0x98 SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x4183 JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1109 JUMPI PUSH1 0x0 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x10EC JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0x1100 DUP2 DUP4 PUSH2 0x26D5 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x10D6 JUMP JUMPDEST POP PUSH2 0x1112 PUSH2 0x2800 JUMP JUMPDEST PUSH2 0x111A PUSH2 0x28B1 JUMP JUMPDEST PUSH2 0x1125 PUSH1 0x0 NOT PUSH2 0x2946 JUMP JUMPDEST PUSH1 0x97 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x9A DUP5 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP6 SWAP1 MSTORE DUP1 MLOAD PUSH32 0x25FF68DD81B34665B5BA7E553EE5511BF6812E12ADB4A7E2C0D9E26B3099CE79 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 POP DUP1 ISZERO PUSH2 0xD96 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x11A6 DUP2 PUSH2 0x2981 JUMP JUMPDEST PUSH2 0x11E5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x432A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x126A DUP5 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1237 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x124B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1261 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 PUSH2 0x2A3D JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP4 AND DUP3 MSTORE SWAP3 SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1306 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x131C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ PUSH2 0x1376 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F6F6E6C792D72657365727665 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9B DUP1 SLOAD PUSH1 0x0 SWAP2 DUP3 SWAP1 SSTORE SWAP1 PUSH2 0x138A DUP3 PUSH2 0x2A53 JUMP JUMPDEST SWAP1 POP PUSH2 0x13A9 DUP6 DUP3 PUSH2 0x1399 PUSH2 0x2C38 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x2CAE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP2 PUSH32 0x1C71C8E11FD443227C8F8D3DC1A237A3A5E8310B540C7FBCF5169754AEDF42C9 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x9D SLOAD SWAP1 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1410 DUP3 PUSH2 0x26AF JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x142C PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1475 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D0 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x147F DUP2 PUSH2 0x2981 JUMP JUMPDEST PUSH2 0x14BE JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x432A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 PUSH2 0x14C8 JUMPI PUSH2 0xD96 JUMP JUMPDEST PUSH1 0x9D SLOAD DUP4 GT ISZERO PUSH2 0x151F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F61776172642D657863656564732D617661696C000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x152C SWAP1 DUP5 PUSH2 0x2D00 JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH2 0x153C DUP5 DUP5 DUP5 PUSH1 0x0 PUSH2 0x2D62 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1548 DUP4 DUP6 PUSH2 0x2E48 JUMP JUMPDEST SWAP1 POP PUSH2 0x15CE DUP6 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x159C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x15B0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x15C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP5 PUSH2 0x2A3D JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xE2554529D99AB7A67DB6B4CEA2B32C7D55AE325F958861E05F304FDDED867E31 DUP7 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1628 PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1639 PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1682 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42E3 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1410 DUP3 PUSH2 0x2981 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x16EA DUP5 DUP5 DUP5 PUSH2 0x2E80 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x16FA PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x170B PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1754 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42E3 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x175D DUP2 PUSH2 0x2946 JUMP JUMPDEST POP JUMP JUMPDEST CALLER PUSH2 0x176A DUP2 PUSH2 0x2981 JUMP JUMPDEST PUSH2 0x17A9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x432A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO PUSH2 0x1883 JUMPI PUSH1 0x0 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP7 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1807 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x181B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1831 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x1843 DUP7 CALLER DUP5 DUP5 PUSH2 0x2ED1 JUMP JUMPDEST SWAP1 POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1875 JUMPI PUSH2 0x1872 CALLER PUSH2 0x186C DUP5 DUP8 PUSH2 0x2D00 JUMP JUMPDEST DUP4 PUSH2 0x2F60 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x1880 DUP7 CALLER DUP4 PUSH2 0x2FA6 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x18AD JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x1904 JUMPI PUSH2 0x1904 DUP4 CALLER CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1237 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1926 JUMPI POP PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xD96 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP7 SWAP1 MSTORE CALLER PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xB2210957 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x198E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x19A2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x19BA DUP6 DUP6 DUP6 PUSH2 0x3144 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x97 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x19EC PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x19FD PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1A46 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42E3 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x175D DUP2 PUSH2 0x32E2 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1AB6 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1A98 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1B17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B2B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1B41 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1B5D JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x1413 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x10DFA58 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1BAC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1BC0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1BD6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x1BEA JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x1413 JUMP JUMPDEST PUSH2 0x16EA DUP5 DUP3 PUSH2 0x33F5 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x1C4E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP3 PUSH2 0x1C5D DUP2 PUSH2 0x2981 JUMP JUMPDEST PUSH2 0x1C9C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x432A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1CAA DUP9 DUP8 DUP10 PUSH2 0x3144 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0x1CED JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4303 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1CF8 DUP9 DUP8 DUP4 PUSH2 0x3416 JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x631B5DFB PUSH2 0x1D0F PUSH2 0x2623 JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1D67 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D7B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 PUSH2 0x1D94 DUP4 DUP10 PUSH2 0x2D00 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1DA1 DUP3 PUSH2 0x2A53 JUMP JUMPDEST SWAP1 POP PUSH2 0x1DB0 DUP11 DUP3 PUSH2 0x1399 PUSH2 0x2C38 JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1DCC PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP14 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE DUP1 DUP3 ADD DUP10 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x271704A58FD2953E49B87D67A0A3CE28A58147DE98A5457F60B4686F6385030 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH2 0x1E35 DUP2 PUSH2 0x2981 JUMP JUMPDEST PUSH2 0x1E74 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x432A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1E7C PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E8D PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1ED6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42E3 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP6 AND DUP1 DUP4 MSTORE DUP7 DUP3 AND PUSH1 0x20 DUP1 DUP6 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9E DUP5 MSTORE DUP9 SWAP1 KECCAK256 SWAP7 MLOAD DUP8 SLOAD SWAP3 MLOAD DUP8 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP1 DUP8 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP6 AND OR SWAP1 SWAP5 SSTORE DUP5 MLOAD SWAP3 DUP4 MSTORE SWAP3 DUP3 ADD MSTORE DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 MLOAD PUSH32 0xFB0BA2CF86A2B03BCF387753A2192DA80A006AFA99DD022BB301C78E323BF1B9 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA1B PUSH2 0x34D7 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1FA4 JUMPI POP PUSH2 0x1FA4 PUSH2 0x26C4 JUMP JUMPDEST DUP1 PUSH2 0x1FB2 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1FED JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4294 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2018 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2023 DUP6 DUP6 DUP6 PUSH2 0xFA8 JUMP JUMPDEST PUSH1 0xA0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 AND SWAP1 PUSH32 0xA5670B49A0EE863080AE28858BB5D9BCC1EB0D2A6F4C9C3A8ACCC43B8F445D25 SWAP1 PUSH1 0x0 SWAP1 LOG2 DUP1 ISZERO PUSH2 0x2082 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP3 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND SWAP1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x2111 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP2 PUSH2 0x2120 DUP2 PUSH2 0x2981 JUMP JUMPDEST PUSH2 0x215F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x432A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP4 PUSH2 0x2169 DUP2 PUSH2 0x3537 JUMP JUMPDEST PUSH2 0x21BA JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F657863656564732D6C69717569646974792D63617000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x21C4 PUSH2 0x2623 JUMP JUMPDEST SWAP1 POP PUSH2 0x21D2 DUP8 DUP8 DUP8 DUP8 PUSH2 0x2D62 JUMP JUMPDEST PUSH2 0x21F1 DUP2 ADDRESS DUP9 PUSH2 0x21E0 PUSH2 0x2C38 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 SWAP1 PUSH2 0x355B JUMP JUMPDEST PUSH2 0x21FA DUP7 PUSH2 0x35B5 JUMP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6CE569498E0F86F147466AC49211CB2A1FFE06195ADB805E383B3F2365109160 DUP10 DUP9 PUSH1 0x40 MLOAD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x22C8 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE PUSH1 0x0 PUSH2 0x22D7 PUSH2 0x2518 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x22E3 PUSH2 0x34D7 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 DUP3 GT PUSH2 0x22F5 JUMPI PUSH1 0x0 PUSH2 0x22FF JUMP JUMPDEST PUSH2 0x22FF DUP3 DUP5 PUSH2 0x2D00 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x9D SLOAD DUP3 GT PUSH2 0x2313 JUMPI PUSH1 0x0 PUSH2 0x2321 JUMP JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x2321 SWAP1 DUP4 SWAP1 PUSH2 0x2D00 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x23D3 JUMPI PUSH1 0x0 PUSH2 0x2334 DUP3 PUSH2 0x1AC6 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x238E JUMPI PUSH1 0x9B SLOAD PUSH2 0x2349 SWAP1 DUP3 PUSH2 0x36AA JUMP JUMPDEST PUSH1 0x9B SSTORE PUSH2 0x2356 DUP3 DUP3 PUSH2 0x2D00 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 POP PUSH32 0x5F1703CCFA2730D4245350F228079926A37F26A44ECF6978A7EEAFFF0AF11407 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x239B SWAP1 DUP4 PUSH2 0x36AA JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xCE2B6E507C7CA1A20CE136810F524EEFC19BA4C7E4866EB6CC0CBA76E778D4BE SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH1 0x9D SLOAD SWAP5 POP POP POP POP POP PUSH1 0x1 PUSH1 0x65 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x9B SLOAD DUP2 JUMP JUMPDEST PUSH2 0x23F2 PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2403 PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x244C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42E3 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x2491 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x41FF PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA1B PUSH2 0x2C38 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x9B SLOAD SWAP1 POP PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2578 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x255A JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x261A JUMPI PUSH2 0x2610 DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x259D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x25DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x25F1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2607 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP6 SWAP1 PUSH2 0x36AA JUMP JUMPDEST SWAP4 POP PUSH1 0x1 ADD PUSH2 0x2586 JUMP JUMPDEST POP SWAP2 SWAP3 POP POP POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2632 DUP4 PUSH2 0x26AF JUMP JUMPDEST PUSH2 0x2683 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x2690 JUMPI POP PUSH1 0x0 PUSH2 0x26A8 JUMP JUMPDEST PUSH2 0x26A4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP6 DUP5 PUSH2 0x2CAE JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND SWAP2 AND EQ ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x26CF ADDRESS PUSH2 0x3704 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF77C4791 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2718 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x272C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2742 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x279F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F746F6B656E2D6374726C722D6D69736D617463680000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x98 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x27AD JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 DUP5 AND SWAP2 PUSH32 0x460E712B4A5D801D031ED673DEA209B73AB854F7DDEB86B6C48082E92C3EEE66 SWAP2 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2819 JUMPI POP PUSH2 0x2819 PUSH2 0x26C4 JUMP JUMPDEST DUP1 PUSH2 0x2827 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2862 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4294 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x288D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2895 PUSH2 0x370A JUMP JUMPDEST PUSH2 0x289D PUSH2 0x37AA JUMP JUMPDEST DUP1 ISZERO PUSH2 0x175D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x28CA JUMPI POP PUSH2 0x28CA PUSH2 0x26C4 JUMP JUMPDEST DUP1 PUSH2 0x28D8 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2913 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4294 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x293E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x289D PUSH2 0x38A3 JUMP JUMPDEST PUSH1 0x9C DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3FF20538222F568F27FF436C0C49DFD3E48D5B8F86533A3F759DC1C7089775AB SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x29DB JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x29BD JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2A32 JUMPI DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2A07 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x2A2A JUMPI PUSH1 0x1 SWAP4 POP POP POP POP PUSH2 0x1413 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x29E9 JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xD96 DUP5 DUP5 PUSH2 0x2A4E DUP8 DUP8 DUP8 DUP8 PUSH2 0x2ED1 JUMP JUMPDEST PUSH2 0x2FA6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2A5E PUSH2 0x2C38 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2AAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2AC3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2AD9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x852A12E3 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP9 SWAP1 MSTORE SWAP1 MLOAD SWAP3 SWAP4 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0x852A12E3 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2B2C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2B40 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2B56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO PUSH2 0x2BAA JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6D706F756E645072697A65506F6F6C2F72656465656D2D6661696C656400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2C2F DUP3 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2BFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2C11 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2C27 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 PUSH2 0x2D00 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x6F307DC3 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x6F307DC3 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2C7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2C91 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2CA7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xAD9 SWAP1 DUP5 SWAP1 PUSH2 0x3949 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2D57 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2DF1 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE DUP6 DUP2 AND PUSH1 0x44 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x4D7F3DB0 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2DD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2DEC JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5D7B0758 DUP6 DUP6 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x198E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x26A8 SWAP1 DUP4 SWAP1 PUSH2 0x2E7B SWAP1 DUP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x33F5 JUMP JUMPDEST PUSH2 0x39FA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2EB6 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x33F5 JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x2EC7 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x26A8 JUMP JUMPDEST PUSH2 0x2C2F DUP4 DUP3 PUSH2 0x3A1F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP3 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x2F14 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x2F56 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2F21 DUP9 DUP9 DUP9 PUSH2 0x3A86 JUMP JUMPDEST DUP3 SLOAD SWAP1 SWAP2 POP PUSH2 0x2F52 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x2F4D SWAP1 DUP10 SWAP1 PUSH2 0x2F47 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP8 PUSH2 0x36AA JUMP JUMPDEST SWAP1 PUSH2 0x36AA JUMP JUMPDEST PUSH2 0x2F60 JUMP JUMPDEST SWAP3 POP POP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2F8F SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x33F5 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x2F9D JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE DUP2 SWAP1 KECCAK256 SLOAD DUP2 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 DUP1 PUSH2 0x2FEB DUP5 PUSH2 0x3B37 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x3009 PUSH2 0x3004 PUSH2 0x3B7F JUMP JUMPDEST PUSH2 0x3B83 JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP3 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 DUP11 AND DUP3 MSTORE SWAP2 DUP5 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP5 DUP7 ADD MLOAD SWAP6 SWAP1 SWAP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH4 0xFFFFFFFF PUSH1 0xC0 SHL NOT AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP5 SWAP1 SWAP3 AND SWAP4 SWAP1 SWAP4 MUL OR PUSH1 0xFF PUSH1 0xE0 SHL NOT AND PUSH1 0x1 PUSH1 0xE0 SHL SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE DUP2 DUP2 LT ISZERO PUSH2 0x30EC JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0x2F92D56910619B38BC29FD8E4CA5E56359EDAC7A0C086CDCD305FB603FA37491 PUSH2 0x30D6 DUP6 DUP6 PUSH2 0x2D00 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 PUSH2 0xD96 JUMP JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0xD96 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF PUSH2 0x312D DUP5 DUP7 PUSH2 0x2D00 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3196 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x31AA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x31C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x3212 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F696E737566662D66756E6473 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x321F DUP7 DUP7 DUP4 PUSH1 0x0 PUSH2 0x2A3D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3234 DUP7 PUSH2 0x322F DUP5 DUP9 PUSH2 0x2D00 JUMP JUMPDEST PUSH2 0x2E48 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP3 GT PUSH2 0x32AB JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x32A8 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2D00 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x32B7 DUP9 DUP9 PUSH2 0x2E48 JUMP JUMPDEST SWAP1 POP DUP1 DUP3 GT PUSH2 0x32C6 JUMPI DUP2 PUSH2 0x32C8 JUMP JUMPDEST DUP1 JUMPDEST SWAP5 POP PUSH2 0x32D4 DUP2 DUP7 PUSH2 0x2D00 JUMP JUMPDEST SWAP6 POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x333D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D6E6F742D7A65726F PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x335A PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3BC7 JUMP JUMPDEST PUSH2 0x33AB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D696E76616C696400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x99 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x7F58DC86BC2E435CB77CA0EDB1DF55E25F90CAF2D6BD866971715437D456A212 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3402 DUP4 DUP6 PUSH2 0x3BE3 JUMP JUMPDEST SWAP1 POP PUSH2 0x16EA DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x3C3C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x3458 SWAP1 PUSH2 0x3453 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2D00 JUMP JUMPDEST PUSH2 0x3B37 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x3AF9E669 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x3AF9E669 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3523 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2C91 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3542 PUSH2 0x2518 JUMP JUMPDEST PUSH1 0x9C SLOAD SWAP1 SWAP2 POP PUSH2 0x3552 DUP3 DUP6 PUSH2 0x36AA JUMP JUMPDEST GT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x24 DUP4 ADD MSTORE DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x84 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xD96 SWAP1 DUP6 SWAP1 PUSH2 0x3949 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH2 0x35DE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH2 0x35CE PUSH2 0x2C38 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x3C7E JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x140E25AD PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0xA0712D68 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x362C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3640 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3656 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO PUSH2 0x175D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6D706F756E645072697A65506F6F6C2F6D696E742D6661696C6564000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x26A8 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3723 JUMPI POP PUSH2 0x3723 PUSH2 0x26C4 JUMP JUMPDEST DUP1 PUSH2 0x3731 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x376C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4294 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x289D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x175D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x37C3 JUMPI POP PUSH2 0x37C3 PUSH2 0x26C4 JUMP JUMPDEST DUP1 PUSH2 0x37D1 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x380C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4294 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3837 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x3841 PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x175D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x38BC JUMPI POP PUSH2 0x38BC PUSH2 0x26C4 JUMP JUMPDEST DUP1 PUSH2 0x38CA JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3905 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4294 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3930 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x65 SSTORE DUP1 ISZERO PUSH2 0x175D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x399E DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3D91 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xAD9 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x39BD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xAD9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4370 PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3A09 DUP5 PUSH1 0x9A SLOAD PUSH2 0x33F5 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x3A17 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x3A75 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x3A7E JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xC0 SHL DUP2 DIV PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x3AD4 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x26A8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3AE8 DUP3 PUSH2 0x3AE2 PUSH2 0x3B7F JUMP JUMPDEST SWAP1 PUSH2 0x2D00 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x3B20 SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3BE3 JUMP JUMPDEST SWAP1 POP PUSH2 0x3B2C DUP6 DUP3 PUSH2 0x33F5 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x3B7B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4225 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST TIMESTAMP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x20 SHL DUP3 LT PUSH2 0x3B7B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x434A PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3BD2 DUP4 PUSH2 0x3DA0 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x26A8 JUMPI POP PUSH2 0x26A8 DUP4 DUP4 PUSH2 0x3DD3 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3BF2 JUMPI POP PUSH1 0x0 PUSH2 0x2D5C JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x3BFF JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x26A8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42C2 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x26A8 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x3DF6 JUMP JUMPDEST DUP1 ISZERO DUP1 PUSH2 0x3D04 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH4 0x6EB1769F PUSH1 0xE1 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 DUP6 AND SWAP2 PUSH4 0xDD62ED3E SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3CD6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3CEA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3D00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO JUMPDEST PUSH2 0x3D3F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x36 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x439A PUSH1 0x36 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x95EA7B3 PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xAD9 SWAP1 DUP5 SWAP1 PUSH2 0x3949 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x16EA DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x3E98 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3DB3 DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3DD3 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x1410 JUMPI POP PUSH2 0x3DCC DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3DD3 JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x3DE2 DUP6 DUP6 PUSH2 0x3FE9 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x2C2F JUMPI POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x3E82 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3E47 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3E2F JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3E74 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x3E8E JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x3ED9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x426E PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3EE2 DUP6 PUSH2 0x3704 JUMP JUMPDEST PUSH2 0x3F33 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3F72 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3F53 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3FD4 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3FD9 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x3B2C DUP3 DUP3 DUP7 PUSH2 0x411D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x24 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP3 DUP5 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND SWAP3 PUSH2 0x7530 SWAP3 DUP8 SWAP3 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x4071 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x4052 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x40D2 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x40D7 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x40F5 JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x4116 JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x410B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x412C JUMPI POP DUP2 PUSH2 0x26A8 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x413C JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x3E47 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3E2F JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x41D8 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x41D8 JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x41A3 JUMP JUMPDEST POP PUSH2 0x3B7B SWAP3 SWAP2 POP JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x3B7B JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x41E0 JUMP INVALID 0x4F PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F206164647265737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E2031323820626974735072697A65 POP PUSH16 0x6F6C2F72657365727665526567697374 PUSH19 0x792D6E6F742D7A65726F416464726573733A20 PUSH10 0x6E73756666696369656E PUSH21 0x2062616C616E636520666F722063616C6C496E6974 PUSH10 0x616C697A61626C653A20 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 MSTORE8 PUSH2 0x6665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F774F776E61626C653A20 PUSH4 0x616C6C65 PUSH19 0x206973206E6F7420746865206F776E65725072 PUSH10 0x7A65506F6F6C2F657869 PUSH21 0x2D6665652D657863656564732D757365722D6D6178 PUSH10 0x6D756D5072697A65506F PUSH16 0x6C2F756E6B6E6F776E2D746F6B656E00 STOP STOP STOP STOP STOP STOP STOP STOP MSTORE8 PUSH2 0x6665 NUMBER PUSH2 0x7374 GASPRICE KECCAK256 PUSH23 0x616C756520646F65736E27742066697420696E20333220 PUSH3 0x697473 MSTORE8 PUSH2 0x6665 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x7563636565645361666545524332303A20617070 PUSH19 0x6F76652066726F6D206E6F6E2D7A65726F2074 PUSH16 0x206E6F6E2D7A65726F20616C6C6F7761 PUSH15 0x63655072697A65506F6F6C2F6F6E6C PUSH26 0x2D7072697A65537472617465677900000000A264697066735822 SLT KECCAK256 DELEGATECALL CODECOPY EXTCODESIZE MOD 0x23 0xE9 PUSH2 0xCF09 0x1E SWAP15 DUP14 0xD7 0xF9 0xDA 0xDD 0xDA DUP8 0xEB PUSH9 0x809795B7C73097E3C1 CALLER DELEGATECALL DUP16 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "633:2963:41:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31480:106:39;;;:::i;:::-;;;;;;;;;;;;;;;;14958:270;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14958:270:39;;;;;;;;;;;;;;;;;:::i;:::-;;32298:200;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32298:200:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32298:200:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32298:200:39;;;;;;;;;;-1:-1:-1;32298:200:39;;-1:-1:-1;32298:200:39;-1:-1:-1;32298:200:39;:::i;:::-;;;;-1:-1:-1;;;;;;32298:200:39;;;;;;;;;;;;;;;17185:617;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17185:617:39;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17185:617:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17185:617:39;;;;;;;;;;-1:-1:-1;17185:617:39;;-1:-1:-1;17185:617:39;-1:-1:-1;17185:617:39;:::i;15586:263::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15586:263:39;;;;;;;;;;;;;;;;;:::i;31811:166::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31811:166:39;;;;;;;;;;:::i;5948:860::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5948:860:39;;;;;;;;;;;;;-1:-1:-1;5948:860:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5948:860:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5948:860:39;;-1:-1:-1;;5948:860:39;;;-1:-1:-1;5948:860:39;;-1:-1:-1;;5948:860:39:i;25409:303::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25409:303:39;;;;;;;;;;:::i;13277:314::-;;;;;;;;;;;;;;;;-1:-1:-1;13277:314:39;-1:-1:-1;;;;;13277:314:39;;:::i;11940:103::-;;;:::i;899:29:41:-;;;:::i;:::-;;;;-1:-1:-1;;;;;899:29:41;;;;;;;;;;;;;;7465:130:39;;;;;;;;;;;;;;;;-1:-1:-1;7465:130:39;-1:-1:-1;;;;;7465:130:39;;:::i;:::-;;;;;;;;;;;;;;;;;;13917:647;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13917:647:39;;;;;;;;;;;;;;;;;:::i;1967:145:0:-;;;:::i;5382:27:39:-;;;:::i;34141:141::-;;;;;;;;;;;;;;;;-1:-1:-1;34141:141:39;-1:-1:-1;;;;;34141:141:39;;:::i;19907:306::-;;;;;;;;;;;;;;;;-1:-1:-1;19907:306:39;;-1:-1:-1;;;;;19907:306:39;;;;;;;;;;;:::i;29377:118::-;;;;;;;;;;;;;;;;-1:-1:-1;29377:118:39;;:::i;10723:1018::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10723:1018:39;;;;;;;;;;;;;;;;;:::i;18806:302::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18806:302:39;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1335:85:0;;;:::i;4710:40:39:-;;;:::i;30219:137::-;;;;;;;;;;;;;;;;-1:-1:-1;30219:137:39;-1:-1:-1;;;;;30219:137:39;;:::i;4916:43::-;;;:::i;31052:110::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5172:33;;;:::i;18036:430::-;;;;;;;;;;;;;;;;-1:-1:-1;18036:430:39;;:::i;8890:921::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8890:921:39;;;;;;;;;;;;;;;;;;;;:::i;26123:455::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26123:455:39;;;;-1:-1:-1;;;;;26123:455:39;;;;;;;;;;;;:::i;7162:74::-;;;:::i;1304:405:41:-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1304:405:41;;;;;;;;;;;;;-1:-1:-1;1304:405:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1304:405:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1304:405:41;;-1:-1:-1;;1304:405:41;;;-1:-1:-1;;;1304:405:41;;;-1:-1:-1;;;;;1304:405:41;;:::i;26965:343:39:-;;;;;;;;;;;;;;;;-1:-1:-1;26965:343:39;-1:-1:-1;;;;;26965:343:39;;:::i;:::-;;;;-1:-1:-1;;;;;26965:343:39;;;;;;;;;;;;;;;;;;;;;;;;7917:469;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7917:469:39;;;;;;;;;;;;;;;;;;;;;;:::i;12245:1028::-;;;:::i;5277:33::-;;;:::i;2261:240:0:-;;;;;;;;;;;;;;;;-1:-1:-1;2261:240:0;-1:-1:-1;;;;;2261:240:0;;:::i;6912:93:39:-;;;:::i;4615:40::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31480:106;31540:7;31562:19;:17;:19::i;:::-;31555:26;;31480:106;:::o;14958:270::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;15112:39:::1;15125:2;15129:13;15144:6;15112:12;:39::i;:::-;15108:116;;;15166:51;::::0;;;;;;;-1:-1:-1;;;;;15166:51:39;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;15108:116;14958:270:::0;;;:::o;32298:200::-;-1:-1:-1;;;;;32298:200:39;-1:-1:-1;;;;32298:200:39:o;17185:617::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;17354:32:::1;17372:13;17354:17;:32::i;:::-;17346:77;;;::::0;;-1:-1:-1;;;17346:77:39;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;17434:20:::0;17430:47:::1;;17464:7;;17430:47;17488:9;17483:253;17503:19:::0;;::::1;17483:253;;;-1:-1:-1::0;;;;;17541:50:39;::::1;;17600:4;17607:2:::0;17611:8;;17620:1;17611:11;;::::1;;;;;17541:82;::::0;;-1:-1:-1;;;;;;17541:82:39::1;::::0;;;;;;-1:-1:-1;;;;;17541:82:39;;::::1;;::::0;::::1;::::0;;;;::::1;::::0;;;;17611:11:::1;;::::0;;;::::1;;17541:82:::0;;;;-1:-1:-1;17541:82:39;;;;;;;-1:-1:-1;;17541:82:39;;;;;;;-1:-1:-1;17541:82:39;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;;;;;17537:186;;;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17680:34;17708:5;17680:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17640:83;17537:186;17524:3;;17483:253;;;-1:-1:-1::0;17747:50:39::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;-1:-1:-1;;;;;17747:50:39;;::::1;::::0;;;::::1;::::0;::::1;::::0;17788:8;;;;17747:50;;;;;;17788:8;;17747:50;::::1;::::0;17788:8;17747:50;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;17747:50:39::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;17747:50:39;;-1:-1:-1;;;;17747:50:39::1;36121:1;17185:617:::0;;;;:::o;15586:263::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;15737:39:::1;15750:2;15754:13;15769:6;15737:12;:39::i;:::-;15733:112;;;15791:47;::::0;;;;;;;-1:-1:-1;;;;;15791:47:39;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;15586:263:::0;;;:::o;31811:166::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;31898:33:39::1;::::0;;-1:-1:-1;;;31898:33:39;;31925:4:::1;31898:33;::::0;::::1;::::0;;;31934:1:::1;::::0;-1:-1:-1;;;;;31898:18:39;::::1;::::0;::::1;::::0;:33;;;;;::::1;::::0;;;;;;;;;:18;:33;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31898:33:39;:37:::1;31894:79;;;31945:21;::::0;;-1:-1:-1;;;31945:21:39;;-1:-1:-1;;;;;31945:21:39;;::::1;;::::0;::::1;::::0;;;:17;;::::1;::::0;::::1;::::0;:21;;;;;-1:-1:-1;;31945:21:39;;;;;;;;-1:-1:-1;31945:17:39;:21;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31894:79;31811:166:::0;;:::o;5948:860::-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;-1:-1:-1;;;;;6146:39:39;::::1;6138:86;;;;-1:-1:-1::0;;;6138:86:39::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6263:24:::0;;;6303:54:::1;::::0;::::1;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;6303:54:39::1;-1:-1:-1::0;6293:64:39;;::::1;::::0;:7:::1;::::0;:64:::1;::::0;;::::1;::::0;::::1;:::i;:::-;;6369:9;6364:178;6388:22;6384:1;:26;6364:178;;;6425:40;6468:17;6486:1;6468:20;;;;;;;;;;;;;;6425:63;;6496:39;6516:15;6533:1;6496:19;:39::i;:::-;-1:-1:-1::0;6412:3:39::1;;6364:178;;;;6547:16;:14;:16::i;:::-;6569:24;:22;:24::i;:::-;6599:29;-1:-1:-1::0;;6599:16:39::1;:29::i;:::-;6635:15;:34:::0;;-1:-1:-1;;;;;;6635:34:39::1;-1:-1:-1::0;;;;;6635:34:39;::::1;::::0;;::::1;::::0;;;6675:18:::1;:40:::0;;;6727:76:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;::::1;1778:1:9;1794:14:::0;1790:66;;;-1:-1:-1;;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;-1:-1:-1;;5948:860:39:o;25409:303::-;25537:7;25511:15;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;;;-1:-1:-1;;;35825:92:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;;;25589:50:::1;::::0;;-1:-1:-1;;;25589:50:39;;-1:-1:-1;;;;;25589:50:39;;::::1;;::::0;::::1;::::0;;;25552:91:::1;::::0;25566:4;;25572:15;;25589:44;;::::1;::::0;::::1;::::0;:50;;;;;::::1;::::0;;;;;;;;;:44;:50;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25589:50:39;25641:1:::1;25552:13;:91::i;:::-;-1:-1:-1::0;;;;;;;25656:37:39;;::::1;;::::0;;;:20:::1;:37;::::0;;;;;;;:43;;;::::1;::::0;;;;;;;;:51;-1:-1:-1;;;;;25656:51:39::1;::::0;25409:303::o;13277:314::-;36438:15;;:24;;;-1:-1:-1;;;36438:24:39;;;;13353:7;;;;-1:-1:-1;;;;;36438:15:39;;;;:22;;:24;;;;;;;;;;;;;;;:15;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36438:24:39;;-1:-1:-1;36497:10:39;-1:-1:-1;;;;;36477:30:39;;;36469:65;;;;;-1:-1:-1;;;36469:65:39;;;;;;;;;;;;-1:-1:-1;;;36469:65:39;;;;;;;;;;;;;;;13386:18:::1;::::0;;13369:14:::1;13410:22:::0;;;;13386:18;13457:15:::1;13386:18:::0;13457:7:::1;:15::i;:::-;13438:34;;13479:44;13509:2;13514:8;13479;:6;:8::i;:::-;-1:-1:-1::0;;;;;13479:21:39::1;::::0;;::::1;:44::i;:::-;13535:29;::::0;;;;;;;-1:-1:-1;;;;;13535:29:39;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;13578:8:::0;13277:314;-1:-1:-1;;;;13277:314:39:o;11940:103::-;12018:20;;11940:103;:::o;899:29:41:-;;;-1:-1:-1;;;;;899:29:41;;:::o;7465:130:39:-;7538:4;7557:33;7575:14;7557:17;:33::i;:::-;7550:40;;7465:130;;;;:::o;13917:647::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;14069:15:::1;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;::::0;;-1:-1:-1;;;35825:92:39;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;::::1;;14098:11:::0;14094:38:::2;;14119:7;;14094:38;14156:20;;14146:6;:30;;14138:72;;;::::0;;-1:-1:-1;;;14138:72:39;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;14239:20;::::0;:32:::2;::::0;14264:6;14239:24:::2;:32::i;:::-;14216:20;:55:::0;14278:46:::2;14284:2:::0;14288:6;14296:15;14321:1:::2;14278:5;:46::i;:::-;14331:19;14353:55;14384:15;14401:6;14353:30;:55::i;:::-;14449:48;::::0;;-1:-1:-1;;;14449:48:39;;-1:-1:-1;;;;;14449:48:39;;::::2;;::::0;::::2;::::0;;;14331:77;;-1:-1:-1;14414:97:39::2;::::0;14428:2;;14432:15;;14449:44;;::::2;::::0;::::2;::::0;:48;;;;;::::2;::::0;;;;;;;;;:44;:48;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;14449:48:39;14499:11;14414:13:::2;:97::i;:::-;14523:36;::::0;;;;;;;-1:-1:-1;;;;;14523:36:39;;::::2;::::0;;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;35923:1;36121::::1;13917:647:::0;;;:::o;1967:145:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;2057:6:::1;::::0;2036:40:::1;::::0;2073:1:::1;::::0;-1:-1:-1;;;;;2057:6:0::1;::::0;2036:40:::1;::::0;2073:1;;2036:40:::1;2086:6;:19:::0;;-1:-1:-1;;;;;;2086:19:0::1;::::0;;1967:145::o;5382:27:39:-;;;;:::o;34141:141::-;34228:4;34247:30;34261:15;34247:13;:30::i;19907:306::-;20067:23;20117:91;20151:16;20175:10;20193:9;20117:26;:91::i;:::-;20100:108;19907:306;-1:-1:-1;;;;19907:306:39:o;29377:118::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;29459:31:39::1;29476:13;29459:16;:31::i;:::-;29377:118:::0;:::o;10723:1018::-;10832:10;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;;;-1:-1:-1;;;35825:92:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;;;-1:-1:-1;;;;;10854:18:39;::::1;::::0;10850:579:::1;;10910:45;::::0;;-1:-1:-1;;;10910:45:39;;-1:-1:-1;;;;;10910:45:39;::::1;;::::0;::::1;::::0;;;10882:25:::1;::::0;10928:10:::1;::::0;10910:39:::1;::::0;:45;;;;;::::1;::::0;;;;;;;;;10928:10;10910:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;10910:45:39;;-1:-1:-1;11014:24:39::1;11041:63;11065:4:::0;11071:10:::1;10910:45:::0;11014:24;11041:23:::1;:63::i;:::-;11014:90:::0;-1:-1:-1;;;;;;11117:10:39;;::::1;::::0;;::::1;;11113:245;;11271:78;11289:10;11301:29;:17:::0;11323:6;11301:21:::1;:29::i;:::-;11332:16;11271:17;:78::i;:::-;11252:97;;11113:245;11366:56;11387:4;11393:10;11405:16;11366:20;:56::i;:::-;10850:579;;;-1:-1:-1::0;;;;;11438:16:39;::::1;::::0;;::::1;::::0;:30:::1;;-1:-1:-1::0;;;;;;11458:10:39;;::::1;::::0;;::::1;;;11438:30;11434:128;;;11508:43;::::0;;-1:-1:-1;;;11508:43:39;;-1:-1:-1;;;;;11508:43:39;::::1;;::::0;::::1;::::0;;;11478:77:::1;::::0;11492:2;;11496:10:::1;::::0;;;11508:39:::1;::::0;:43;;;;;::::1;::::0;;;;;;;;;11496:10;11508:43;::::1;;::::0;::::1;;;;::::0;::::1;11478:77;-1:-1:-1::0;;;;;11599:18:39;::::1;::::0;;::::1;::::0;:58:::1;;-1:-1:-1::0;11629:13:39::1;::::0;-1:-1:-1;;;;;11629:13:39::1;11621:36:::0;::::1;11599:58;11595:142;;;11667:13;::::0;:63:::1;::::0;;-1:-1:-1;;;11667:63:39;;-1:-1:-1;;;;;11667:63:39;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;;11719:10:::1;11667:63:::0;;;;;;:13;;;::::1;::::0;-1:-1:-1;;11667:63:39;;;;;-1:-1:-1;;11667:63:39;;;;;;;-1:-1:-1;11667:13:39;:63;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;10723:1018:::0;;;;:::o;18806:302::-;18950:15;18973:20;19034:69;19073:4;19079:15;19096:6;19034:38;:69::i;:::-;19008:95;;;;-1:-1:-1;18806:302:39;-1:-1:-1;;;;18806:302:39:o;1335:85:0:-;1407:6;;-1:-1:-1;;;;;1407:6:0;;1335:85::o;4710:40:39:-;;;-1:-1:-1;;;;;4710:40:39;;:::o;30219:137::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;30318:33:39::1;30336:14;30318:17;:33::i;4916:43::-:0;;;-1:-1:-1;;;;;4916:43:39;;:::o;31052:110::-;31102:33;31150:7;31143:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31143:14:39;;;-1:-1:-1;31143:14:39;;;;;;;;;;;;;;;;;;;31052:110;:::o;5172:33::-;;;;:::o;18036:430::-;18161:15;;:24;;;-1:-1:-1;;;18161:24:39;;;;18102:7;;;;-1:-1:-1;;;;;18161:15:39;;;;:22;;:24;;;;;;;;;;;;;;;:15;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18161:24:39;;-1:-1:-1;;;;;;18196:30:39;;18192:59;;18243:1;18236:8;;;;;18192:59;18286:42;;;-1:-1:-1;;;18286:42:39;;18322:4;18286:42;;;;;;18256:27;;-1:-1:-1;;;;;18286:27:39;;;;;:42;;;;;;;;;;;;;;;:27;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18286:42:39;;-1:-1:-1;18338:24:39;18334:53;;18379:1;18372:8;;;;;;18334:53;18399:62;18433:6;18441:19;18399:33;:62::i;8890:921::-;9113:7;1753:1:23;2495:7;;:19;;2487:63;;;;;-1:-1:-1;;;2487:63:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;1753:1;2625:7;:18;9083:15:39;35833:56:::1;9083:15:::0;35833:13:::1;:56::i;:::-;35825:92;;;::::0;;-1:-1:-1;;;35825:92:39;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;::::1;;9131:15:::2;9148:20:::0;9172:69:::2;9211:4;9217:15;9234:6;9172:38;:69::i;:::-;9130:111;;;;9266:14;9255:7;:25;;9247:77;;;;-1:-1:-1::0;;;9247:77:39::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9354:48;9366:4;9372:15;9389:12;9354:11;:48::i;:::-;-1:-1:-1::0;;;;;9433:51:39;::::2;;9485:12;:10;:12::i;:::-;9433:79;::::0;;-1:-1:-1;;;;;;9433:79:39::2;::::0;;;;;;-1:-1:-1;;;;;9433:79:39;;::::2;;::::0;::::2;::::0;;;::::2;::::0;;;;;;;;;;;;;;;;-1:-1:-1;;9433:79:39;;;;;;;-1:-1:-1;9433:79:39;;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;9558:21;9582:19;9593:7;9582:6;:10;;:19;;;;:::i;:::-;9558:43;;9607:16;9626:22;9634:13;9626:7;:22::i;:::-;9607:41;;9655:37;9677:4;9683:8;9655;:6;:8::i;:37::-;-1:-1:-1::0;;;;;9704:81:39;;::::2;::::0;;::::2;9722:12;:10;:12::i;:::-;9704:81;::::0;;;;;::::2;::::0;::::2;::::0;;;;;;;;;;;-1:-1:-1;;;;;9704:81:39;;;::::2;::::0;::::2;::::0;;;;;;;::::2;-1:-1:-1::0;;1710:1:23;2798:7;:22;-1:-1:-1;9799:7:39;8890:921;-1:-1:-1;;;;;;8890:921:39:o;26123:455::-;26295:16;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;;;-1:-1:-1;;;35825:92:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;;;1558:12:0::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;1547:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;1547:23:0::1;;1539:68;;;::::0;;-1:-1:-1;;;1539:68:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;::::1;;26373:114:39::2;::::0;;;;::::2;::::0;;-1:-1:-1;;;;;26373:114:39;;::::2;::::0;;;;;::::2;;::::0;;::::2;::::0;;;-1:-1:-1;;;;;26335:35:39;::::2;-1:-1:-1::0;26335:35:39;;;:17:::2;:35:::0;;;;;:152;;;;;;-1:-1:-1;;26335:152:39;;::::2;::::0;;::::2;;::::0;::::2;::::0;;;::::2;-1:-1:-1::0;;;26335:152:39::2;;::::0;;;26499:74;;;;;;;::::2;::::0;;;;;;;;;;::::2;::::0;;;;;;;;::::2;26123:455:::0;;;;:::o;7162:74::-;7199:7;7221:10;:8;:10::i;1304:405:41:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1523:102:41::1;1551:16;1575:17;1600:19;1523:20;:102::i;:::-;1631:6;:16:::0;;-1:-1:-1;;;;;;1631:16:41::1;-1:-1:-1::0;;;;;1631:16:41;;::::1;::::0;;;::::1;::::0;;;;1659:45:::1;::::0;1696:6;::::1;::::0;1659:45:::1;::::0;-1:-1:-1;;1659:45:41::1;1794:14:9::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1790:66;1304:405:41;;;;;:::o;26965:343:39:-;-1:-1:-1;;;;;27169:34:39;27071:27;27169:34;;;:17;:34;;;;;:54;-1:-1:-1;;;;;27169:54:39;;;;-1:-1:-1;;;27250:53:39;;;;;26965:343::o;7917:469::-;1753:1:23;2495:7;;:19;;2487:63;;;;;-1:-1:-1;;;2487:63:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;1753:1;2625:7;:18;8090:15:39;35833:56:::1;8090:15:::0;35833:13:::1;:56::i;:::-;35825:92;;;::::0;;-1:-1:-1;;;35825:92:39;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;::::1;;8127:6:::2;36288:25;36305:7;36288:16;:25::i;:::-;36280:69;;;::::0;;-1:-1:-1;;;36280:69:39;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;8143:16:::3;8162:12;:10;:12::i;:::-;8143:31;;8181:44;8187:2;8191:6;8199:15;8216:8;8181:5;:44::i;:::-;8232:58;8258:8;8276:4;8283:6;8232:8;:6;:8::i;:::-;-1:-1:-1::0;;;;;8232:25:39::3;::::0;;:58;:25:::3;:58::i;:::-;8296:15;8304:6;8296:7;:15::i;:::-;8323:58;::::0;;;;;-1:-1:-1;;;;;8323:58:39;;::::3;;::::0;::::3;::::0;;;;;::::3;::::0;;;::::3;::::0;;;::::3;::::0;::::3;::::0;;;;;;;;;::::3;-1:-1:-1::0;;1710:1:23;2798:7;:22;-1:-1:-1;;;;;7917:469:39:o;12245:1028::-;12316:7;1753:1:23;2495:7;;:19;;2487:63;;;;;-1:-1:-1;;;2487:63:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;1753:1;2625:7;:18;12331:24:39::1;12358:19;:17;:19::i;:::-;12331:46;;12495:22;12520:10;:8;:10::i;:::-;12495:35;;12536:21;12578:16;12561:14;:33;12560:78;;12637:1;12560:78;;;12598:36;:14:::0;12617:16;12598:18:::1;:36::i;:::-;12536:102;;12644:31;12695:20;;12679:13;:36;12678:84;;12761:1;12678:84;;;12737:20;::::0;12719:39:::1;::::0;:13;;:17:::1;:39::i;:::-;12644:118:::0;-1:-1:-1;12773:27:39;;12769:466:::1;;12810:18;12831:44;12851:23;12831:19;:44::i;:::-;12810:65:::0;-1:-1:-1;12887:14:39;;12883:214:::1;;12934:18;::::0;:34:::1;::::0;12957:10;12934:22:::1;:34::i;:::-;12913:18;:55:::0;13004:39:::1;:23:::0;13032:10;13004:27:::1;:39::i;:::-;13058:30;::::0;;;;;;;12978:65;;-1:-1:-1;13058:30:39::1;::::0;;;;;::::1;::::0;;::::1;12883:214;13127:20;::::0;:49:::1;::::0;13152:23;13127:24:::1;:49::i;:::-;13104:20;:72:::0;13190:38:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;12769:466;;13248:20;;13241:27;;;;;;1710:1:23::0;2798:7;:22;12245:1028:39;:::o;5277:33::-;;;;:::o;2261:240:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;2349:22:0;::::1;2341:73;;;;-1:-1:-1::0;;;2341:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2450:6;::::0;2429:38:::1;::::0;-1:-1:-1;;;;;2429:38:0;;::::1;::::0;2450:6:::1;::::0;2429:38:::1;::::0;2450:6:::1;::::0;2429:38:::1;2477:6;:17:::0;;-1:-1:-1;;;;;;2477:17:0::1;-1:-1:-1::0;;;;;2477:17:0;;;::::1;::::0;;;::::1;::::0;;2261:240::o;6912:93:39:-;6961:7;6991:8;:6;:8::i;4615:40::-;;;;;;;;;;;;;-1:-1:-1;;;4615:40:39;;;;;:::o;32597:361::-;32649:7;32664:13;32680:18;;32664:34;;32704:40;32747:7;32704:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32704:50:39;;;-1:-1:-1;32704:50:39;;;;;;;;;;;;-1:-1:-1;;32794:13:39;;32704:50;;-1:-1:-1;32771:20:39;;-1:-1:-1;;;32818:117:39;32841:12;32837:1;:16;32818:117;;;32875:53;32903:6;32910:1;32903:9;;;;;;;;;;;;;;-1:-1:-1;;;;;32885:40:39;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32885:42:39;32875:5;;:9;:53::i;:::-;32867:61;-1:-1:-1;32855:3:39;;32818:117;;;-1:-1:-1;32948:5:39;;-1:-1:-1;;;32597:361:39;:::o;828:104:19:-;915:10;828:104;:::o;15853:343:39:-;15968:4;15990:32;16008:13;15990:17;:32::i;:::-;15982:77;;;;;-1:-1:-1;;;15982:77:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16070:11;16066:44;;-1:-1:-1;16098:5:39;16091:12;;16066:44;16116:57;-1:-1:-1;;;;;16116:45:39;;16162:2;16166:6;16116:45;:57::i;:::-;-1:-1:-1;16187:4:39;15853:343;;;;;;:::o;2569:140:41:-;2697:6;;-1:-1:-1;;;;;2671:33:41;;;2697:6;;2671:33;;;2569:140::o;1952:123:9:-;2000:4;2024:44;2062:4;2024:29;:44::i;:::-;2023:45;2016:52;;1952:123;:::o;29798:280:39:-;29908:29;;;-1:-1:-1;;;29908:29:39;;;;29941:4;;-1:-1:-1;;;;;29908:27:39;;;;;:29;;;;;;;;;;;;;;;:27;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29908:29:39;-1:-1:-1;;;;;29908:37:39;;29900:80;;;;;-1:-1:-1;;;29900:80:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;30008:16;29991:7;29999:5;29991:14;;;;;;;;;;;;;;;;:33;;-1:-1:-1;;;;;;29991:33:39;-1:-1:-1;;;;;29991:33:39;;;;;;30035:38;;;;;;;;29991:14;30035:38;29798:280;;:::o;935:126:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;992:26:0::1;:24;:26::i;:::-;1028;:24;:26::i;:::-;1794:14:9::0;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;935:126:0:o;1791:106:23:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1856:34:23::1;:32;:34::i;29499:138:39:-:0;29563:12;:28;;;29602:30;;;;;;;;;;;;;;;;;29499:138;:::o;33600:331::-;33688:4;33700:40;33743:7;33700:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33700:50:39;;;-1:-1:-1;33700:50:39;;;;;;;;;;;;-1:-1:-1;;33788:13:39;;33700:50;;-1:-1:-1;33765:20:39;;-1:-1:-1;;;33808:101:39;33831:12;33827:1;:16;33808:101;;;33861:9;;-1:-1:-1;;;;;33861:28:39;;;:6;;33868:1;;33861:9;;;;;;;;;;;;-1:-1:-1;;;;;33861:28:39;;33858:44;;;33898:4;33891:11;;;;;;;33858:44;33845:3;;33808:101;;;-1:-1:-1;33921:5:39;;33600:331;-1:-1:-1;;;;33600:331:39:o;21947:275::-;22071:146;22099:4;22111:15;22134:77;22158:4;22164:15;22181:22;22205:5;22134:23;:77::i;:::-;22071:20;:146::i;2976:348:41:-;3036:7;3051:28;3082:8;:6;:8::i;:::-;3113:35;;;-1:-1:-1;;;3113:35:41;;3142:4;3113:35;;;;;;3051:39;;-1:-1:-1;3096:14:41;;-1:-1:-1;;;;;3113:20:41;;;;;:35;;;;;;;;;;;;;;:20;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3113:35:41;3162:6;;:31;;;-1:-1:-1;;;3162:31:41;;;;;;;;;;3113:35;;-1:-1:-1;;;;;;3162:6:41;;;;-1:-1:-1;;3162:31:41;;;;;3113:35;;3162:31;;;;;;;;-1:-1:-1;3162:6:41;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3162:31:41;:36;3154:80;;;;;-1:-1:-1;;;3154:80:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;3255:35;;;-1:-1:-1;;;3255:35:41;;3284:4;3255:35;;;;;;3240:12;;3255:47;;3295:6;;-1:-1:-1;;;;;3255:20:41;;;;;:35;;;;;;;;;;;;;;;:20;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3255:35:41;;:39;:47::i;:::-;3240:62;2976:348;-1:-1:-1;;;;;2976:348:41:o;3469:125::-;3569:6;;:19;;;-1:-1:-1;;;3569:19:41;;;;3519:17;;-1:-1:-1;;;;;3569:6:41;;-1:-1:-1;;3569:19:41;;;;;;;;;;;;;;:6;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3569:19:41;;-1:-1:-1;3469:125:41;:::o;770:186:12:-;890:58;;;-1:-1:-1;;;;;890:58:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;890:58:12;-1:-1:-1;;;890:58:12;;;863:86;;883:5;;863:19;:86::i;3147:155:8:-;3205:7;3237:1;3232;:6;;3224:49;;;;;-1:-1:-1;;;3224:49:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3290:5:8;;;3147:155;;;;;:::o;16533:295:39:-;16646:13;;-1:-1:-1;;;;;16646:13:39;16638:36;16634:125;;16684:13;;:68;;;-1:-1:-1;;;16684:68:39;;-1:-1:-1;;;;;16684:68:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;;;;;:29;;:68;;;;;-1:-1:-1;;16684:68:39;;;;;;;-1:-1:-1;16684:13:39;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16634:125;16764:59;;;-1:-1:-1;;;16764:59:39;;-1:-1:-1;;;;;16764:59:39;;;;;;;;;;;;;;;:47;;;;;;:59;;;;;-1:-1:-1;;16764:59:39;;;;;;;;-1:-1:-1;16764:47:39;:59;;;;;;;;;;19258:269;-1:-1:-1;;;;;19461:34:39;;19362:7;19461:34;;;:17;:34;;;;;:54;19384:138;;19405:6;;19419:97;;19405:6;;-1:-1:-1;;;;;19461:54:39;19419:33;:97::i;:::-;19384:13;:138::i;20592:520::-;-1:-1:-1;;;;;20953:35:39;;20744:23;20953:35;;;:17;:35;;;;;:54;20744:23;;20907:101;;20941:10;;-1:-1:-1;;;20953:54:39;;-1:-1:-1;;;;;20953:54:39;20907:33;:101::i;:::-;20880:128;-1:-1:-1;21018:21:39;21014:50;;21056:1;21049:8;;;;;21014:50;21076:31;:9;21090:16;21076:13;:31::i;22226:598::-;-1:-1:-1;;;;;22445:37:39;;;22368:7;22445:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;22499:25;;22368:7;;22445:43;-1:-1:-1;;;22499:25:39;;;;22494:303;;22547:1;22534:14;;22494:303;;;22569:14;22586:70;22610:4;22616:15;22633:22;22586:23;:70::i;:::-;22744:21;;22569:87;;-1:-1:-1;22677:113:39;;22695:15;;22712:22;;22736:53;;22783:5;;22736:42;;-1:-1:-1;;;;;22744:21:39;22569:87;22736:34;:42::i;:::-;:46;;:53::i;:::-;22677:17;:113::i;:::-;22664:126;;22494:303;;-1:-1:-1;22809:10:39;22226:598;-1:-1:-1;;;;;22226:598:39:o;23848:410::-;-1:-1:-1;;;;;24086:34:39;;23978:7;24086:34;;;:17;:34;;;;;:54;23978:7;;24015:131;;24056:22;;-1:-1:-1;;;;;24086:54:39;24015:33;:131::i;:::-;23993:153;;24172:11;24156:13;:27;24152:75;;;24209:11;24193:27;;24152:75;-1:-1:-1;24240:13:39;;23848:410;-1:-1:-1;;;23848:410:39:o;22828:604::-;-1:-1:-1;;;;;22953:37:39;;;22932:18;22953:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;:51;23057:129;;;;;;;;-1:-1:-1;;;;;22953:51:39;;23057:129;23088:22;:10;:20;:22::i;:::-;-1:-1:-1;;;;;23057:129:39;;;;;23129:25;:14;:12;:14::i;:::-;:23;:25::i;:::-;23057:129;;;;;;23175:4;23057:129;;;;;-1:-1:-1;;;;;23011:37:39;;;-1:-1:-1;23011:37:39;;;:20;:37;;;;;;:43;;;;;;;;;;;:175;;;;;;;;;;;;;-1:-1:-1;;;;;;23011:175:39;;;-1:-1:-1;;;;;23011:175:39;;;;;;;-1:-1:-1;;;;23011:175:39;-1:-1:-1;;;23011:175:39;;;;;;;;;-1:-1:-1;;;;23011:175:39;-1:-1:-1;;;23011:175:39;;;;;;;;;;23197:23;;;23193:235;;;-1:-1:-1;;;;;23235:63:39;;;;;;;23271:26;:10;23286;23271:14;:26::i;:::-;23235:63;;;;;;;;;;;;;;;23193:235;;;23333:10;23320;:23;23316:112;;;-1:-1:-1;;;;;23358:63:39;;;;;;;23394:26;:10;23409;23394:14;:26::i;:::-;23358:63;;;;;;;;;;;;;;;22828:604;;;;:::o;27741:1468::-;27989:50;;;-1:-1:-1;;;27989:50:39;;-1:-1:-1;;;;;27989:50:39;;;;;;;;;27893:20;;;;;;27989:44;;;;;;:50;;;;;;;;;;;;;;;:44;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27989:50:39;;-1:-1:-1;28053:32:39;;;;28045:67;;;;;-1:-1:-1;;;28045:67:39;;;;;;;;;;;;-1:-1:-1;;;28045:67:39;;;;;;;;;;;;;;;28118:63;28132:4;28138:15;28155:22;28179:1;28118:13;:63::i;:::-;28575:24;28602:83;28633:15;28650:34;:22;28677:6;28650:26;:34::i;:::-;28602:30;:83::i;:::-;-1:-1:-1;;;;;28725:37:39;;;28692:23;28725:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;:51;28575:110;;-1:-1:-1;28692:23:39;-1:-1:-1;;;;;28725:51:39;-1:-1:-1;;28721:192:39;;-1:-1:-1;;;;;28832:37:39;;;;;;;:20;:37;;;;;;;;:43;;;;;;;;;:51;28824:82;;-1:-1:-1;;;;;28832:51:39;28889:16;28824:64;:82::i;:::-;28806:100;;28721:192;28989:20;29012:55;29043:15;29060:6;29012:30;:55::i;:::-;28989:78;;29107:12;29089:15;:30;29088:65;;29138:15;29088:65;;;29123:12;29088:65;29073:80;-1:-1:-1;29174:30:39;:12;29073:80;29174:16;:30::i;:::-;29159:45;;27741:1468;;;;;;;;;;:::o;30497:405::-;-1:-1:-1;;;;;30586:37:39;;30578:82;;;;;-1:-1:-1;;;30578:82:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30674:98;-1:-1:-1;;;;;30674:41:39;;-1:-1:-1;;;;;;30674:41:39;:98::i;:::-;30666:142;;;;;-1:-1:-1;;;30666:142:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;30814:13;:30;;-1:-1:-1;;;;;;30814:30:39;-1:-1:-1;;;;;30814:30:39;;;;;;;;30856:41;;;;-1:-1:-1;;30856:41:39;30497:405;:::o;1967:201:26:-;2051:7;;2087:15;:8;2100:1;2087:12;:15::i;:::-;2070:32;-1:-1:-1;2121:17:26;2070:32;1149:4;2121:10;:17::i;21258:289:39:-;-1:-1:-1;;;;;21411:37:39;;;;;;;:20;:37;;;;;;;;:43;;;;;;;;;:51;21403:84;;:72;;-1:-1:-1;;;;;21411:51:39;21468:6;21403:64;:72::i;:::-;:82;:84::i;:::-;-1:-1:-1;;;;;21349:37:39;;;;;;;:20;:37;;;;;;;;:43;;;;;;;;;;;;;:138;;-1:-1:-1;;;;;;21349:138:39;-1:-1:-1;;;;;21349:138:39;;;;;;;;;;;21499:43;;;;;;;21349:37;;21499:43;;;;;;;;;21258:289;;;:::o;1845:115:41:-;1914:6;;:41;;;-1:-1:-1;;;1914:41:41;;1949:4;1914:41;;;;;;-1:-1:-1;;;;;;;1914:6:41;;-1:-1:-1;;1914:41:41;;;;;;;;;;;;;;-1:-1:-1;1914:6:41;:41;;;;;;;;;;;;;;;;;;;;;;;;;;33203:189:39;33269:4;33281:24;33308:19;:17;:19::i;:::-;33374:12;;33281:46;;-1:-1:-1;33341:29:39;33281:46;33362:7;33341:20;:29::i;:::-;:45;;;33203:189;-1:-1:-1;;;33203:189:39:o;962:214:12:-;1100:68;;;-1:-1:-1;;;;;1100:68:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1100:68:12;-1:-1:-1;;;1100:68:12;;;1073:96;;1093:5;;1073:19;:96::i;2159:179:41:-;2245:6;;2216:45;;-1:-1:-1;;;;;2245:6:41;2254;2216:8;:6;:8::i;:::-;-1:-1:-1;;;;;2216:20:41;;;;:45::i;:::-;2275:6;;:19;;;-1:-1:-1;;;2275:19:41;;;;;;;;;;-1:-1:-1;;;;;2275:6:41;;;;:11;;:19;;;;;;;;;;;;;;;-1:-1:-1;2275:6:41;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2275:19:41;:24;2267:66;;;;;-1:-1:-1;;;2267:66:41;;;;;;;;;;;;;;;;;;;;;;;;;;;2701:175:8;2759:7;2790:5;;;2813:6;;;;2805:46;;;;;-1:-1:-1;;;2805:46:8;;;;;;;;;;;;;;;;;;;;;;;;;;;737:413:18;1097:20;1135:8;;;737:413::o;759:64:19:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1794:14;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;759:64:19:o;1067:192:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1134:17:0::1;1154:12;:10;:12::i;:::-;1176:6;:18:::0;;-1:-1:-1;;;;;;1176:18:0::1;-1:-1:-1::0;;;;;1176:18:0;::::1;::::0;;::::1;::::0;;;1209:43:::1;::::0;1176:18;;-1:-1:-1;1176:18:0;-1:-1:-1;;1209:43:0::1;::::0;-1:-1:-1;;1209:43:0::1;1778:1:9;1794:14:::0;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;1067:192:0:o;1903:104:23:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1710:1:23::1;1978:7;:22:::0;1790:66:9;;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;1903:104:23:o;3088:762:12:-;3544:69;;;;;;;;;;;;;;;;;;3518:23;;3544:69;;-1:-1:-1;;;;;3544:27:12;;;3572:4;;3544:27;:69::i;:::-;3627:17;;3518:95;;-1:-1:-1;3627:21:12;3623:221;;3767:10;3756:30;;;;;;;;;;;;;;;-1:-1:-1;3756:30:12;3748:85;;;;-1:-1:-1;;;3748:85:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10138:275:39;10227:7;10242:14;10259:71;10293:16;10311:18;;10259:33;:71::i;:::-;10242:88;;10350:6;10340:7;:16;10336:53;;;10376:6;10366:16;;10336:53;-1:-1:-1;10401:7:39;;10138:275;-1:-1:-1;;10138:275:39:o;4228:150:8:-;4286:7;4317:1;4313;:5;4305:44;;;;;-1:-1:-1;;;4305:44:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;4370:1;4366;:5;;;;;;;4228:150;-1:-1:-1;;;4228:150:8:o;24612:558:39:-;-1:-1:-1;;;;;24778:37:39;;;24739:7;24778:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;:53;-1:-1:-1;;;24778:53:39;;;;;-1:-1:-1;;;24843:55:39;;;;24838:85;;24915:1;24908:8;;;;;24838:85;24929:17;24949:33;24968:13;24949:14;:12;:14::i;:::-;:18;;:33::i;:::-;-1:-1:-1;;;;;25026:34:39;;24988:21;25026:34;;;:17;:34;;;;;:53;24929;;-1:-1:-1;24988:21:39;25012:68;;24929:53;;-1:-1:-1;;;25026:53:39;;-1:-1:-1;;;;;25026:53:39;25012:13;:68::i;:::-;24988:92;;25093:72;25127:22;25151:13;25093:33;:72::i;:::-;25086:79;24612:558;-1:-1:-1;;;;;;;24612:558:39:o;1097:181:24:-;1154:7;-1:-1:-1;;;1181:14:24;;1173:67;;;;-1:-1:-1;;;1173:67:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1265:5:24;1097:181::o;31284:97:39:-;31361:15;31284:97;:::o;2028:176:24:-;2084:6;-1:-1:-1;2110:13:24;;2102:65;;;;-1:-1:-1;;;2102:65:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1369:286:5;1456:4;1563:23;1578:7;1563:14;:23::i;:::-;:85;;;;;1602:46;1627:7;1636:11;1602:24;:46::i;2266:459:27:-;2324:7;2565:6;2561:45;;-1:-1:-1;2594:1:27;2587:8;;2561:45;2628:5;;;2632:1;2628;:5;:1;2651:5;;;;;:10;2643:56;;;;-1:-1:-1;;;2643:56:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3187:130;3245:7;3271:39;3275:1;3278;3271:39;;;;;;;;;;;;;;;;;:3;:39::i;1436:624:12:-;1812:10;;;1811:62;;-1:-1:-1;1828:39:12;;;-1:-1:-1;;;1828:39:12;;1852:4;1828:39;;;;-1:-1:-1;;;;;1828:39:12;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1828:39:12;:44;1811:62;1803:150;;;;-1:-1:-1;;;1803:150:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1990:62;;;-1:-1:-1;;;;;1990:62:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1990:62:12;-1:-1:-1;;;1990:62:12;;;1963:90;;1983:5;;1963:19;:90::i;3592:193:18:-;3695:12;3726:52;3748:6;3756:4;3762:1;3765:12;3726:21;:52::i;757:394:5:-;821:4;1016:55;1041:7;-1:-1:-1;;;1016:24:5;:55::i;:::-;:128;;;;-1:-1:-1;1088:56:5;1113:7;-1:-1:-1;;;;;;1088:24:5;:56::i;:::-;1087:57;;757:394;-1:-1:-1;;757:394:5:o;4243:395::-;4336:4;4515:12;4529:11;4544:50;4573:7;4582:11;4544:28;:50::i;:::-;4514:80;;;;4613:7;:17;;;;-1:-1:-1;4624:6:5;4605:26;-1:-1:-1;;;;4243:395:5:o;3799:272:27:-;3885:7;3919:12;3912:5;3904:28;;;;-1:-1:-1;;;3904:28:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3942:9;3958:1;3954;:5;;;;;;;3799:272;-1:-1:-1;;;;;3799:272:27:o;4619:523:18:-;4746:12;4803:5;4778:21;:30;;4770:81;;;;-1:-1:-1;;;4770:81:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4869:18;4880:6;4869:10;:18::i;:::-;4861:60;;;;;-1:-1:-1;;;4861:60:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;4992:12;5006:23;5033:6;-1:-1:-1;;;;;5033:11:18;5053:5;5061:4;5033:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5033:33:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4991:75;;;;5083:52;5101:7;5110:10;5122:12;5083:17;:52::i;5155:444:5:-;5331:57;;;-1:-1:-1;;;;;;5331:57:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5331:57:5;-1:-1:-1;;;5331:57:5;;;5436:47;;;;-1:-1:-1;;;;5331:57:5;-1:-1:-1;;5302:26:5;;-1:-1:-1;;;;;5436:18:5;;;5461:5;;5331:57;;5436:47;;;;5331:57;5436:47;;;;;;;;;;-1:-1:-1;;5436:47:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5398:85;;;;5513:2;5497:6;:13;:18;5493:45;;;5525:5;5532;5517:21;;;;;;;;;5493:45;5556:7;5576:6;5565:26;;;;;;;;;;;;;;;-1:-1:-1;5565:26:5;5548:44;;-1:-1:-1;5565:26:5;-1:-1:-1;;;;5155:444:5;;;;;;:::o;6122:725:18:-;6237:12;6265:7;6261:580;;;-1:-1:-1;6295:10:18;6288:17;;6261:580;6406:17;;:21;6402:429;;6664:10;6658:17;6724:15;6711:10;6707:2;6703:19;6696:44;6613:145;6796:20;;-1:-1:-1;;;6796:20:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6796:20:18;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "3489000",
                "executionCost": "3909",
                "totalCost": "3492909"
              },
              "external": {
                "VERSION()": "infinite",
                "accountedBalance()": "infinite",
                "award(address,uint256,address)": "infinite",
                "awardBalance()": "1044",
                "awardExternalERC20(address,address,uint256)": "infinite",
                "awardExternalERC721(address,address,uint256[])": "infinite",
                "balance()": "infinite",
                "balanceOfCredit(address,address)": "infinite",
                "beforeTokenTransfer(address,address,uint256)": "infinite",
                "cToken()": "1105",
                "calculateEarlyExitFee(address,address,uint256)": "infinite",
                "calculateReserveFee(uint256)": "infinite",
                "canAwardExternal(address)": "1234",
                "captureAwardBalance()": "infinite",
                "compLikeDelegate(address,address)": "infinite",
                "creditPlanOf(address)": "1357",
                "depositTo(address,uint256,address,address)": "infinite",
                "estimateCreditAccrualTime(address,uint256,uint256)": "infinite",
                "initialize(address,address[],uint256)": "infinite",
                "initialize(address,address[],uint256,address)": "infinite",
                "isControlled(address)": "infinite",
                "liquidityCap()": "1043",
                "maxExitFeeMantissa()": "1087",
                "onERC721Received(address,address,uint256,bytes)": "629",
                "owner()": "1105",
                "prizeStrategy()": "1082",
                "renounceOwnership()": "infinite",
                "reserveRegistry()": "1127",
                "reserveTotalSupply()": "1064",
                "setCreditPlanOf(address,uint128,uint128)": "infinite",
                "setLiquidityCap(uint256)": "infinite",
                "setPrizeStrategy(address)": "infinite",
                "token()": "infinite",
                "tokens()": "infinite",
                "transferExternalERC20(address,address,uint256)": "infinite",
                "transferOwnership(address)": "infinite",
                "withdrawInstantlyFrom(address,uint256,address,uint256)": "infinite",
                "withdrawReserve(address)": "infinite"
              },
              "internal": {
                "_balance()": "infinite",
                "_canAwardExternal(address)": "851",
                "_redeem(uint256)": "infinite",
                "_supply(uint256)": "infinite",
                "_token()": "infinite"
              }
            },
            "methodIdentifiers": {
              "VERSION()": "ffa1ad74",
              "accountedBalance()": "0937eb54",
              "award(address,uint256,address)": "6b1b863a",
              "awardBalance()": "630665b4",
              "awardExternalERC20(address,address,uint256)": "2b0ab144",
              "awardExternalERC721(address,address,uint256[])": "16960d55",
              "balance()": "b69ef8a8",
              "balanceOfCredit(address,address)": "494de9f7",
              "beforeTokenTransfer(address,address,uint256)": "7cbab1c7",
              "cToken()": "69e527da",
              "calculateEarlyExitFee(address,address,uint256)": "888c2b6f",
              "calculateReserveFee(uint256)": "9fe32a91",
              "canAwardExternal(address)": "6a3fd4f9",
              "captureAwardBalance()": "e6d8a94b",
              "compLikeDelegate(address,address)": "2f7627e3",
              "creditPlanOf(address)": "d4a1361d",
              "depositTo(address,uint256,address,address)": "e323f825",
              "estimateCreditAccrualTime(address,uint256,uint256)": "79cb8563",
              "initialize(address,address[],uint256)": "3ede50c6",
              "initialize(address,address[],uint256,address)": "c5871485",
              "isControlled(address)": "78b3d327",
              "liquidityCap()": "76687d3d",
              "maxExitFeeMantissa()": "9e167519",
              "onERC721Received(address,address,uint256,bytes)": "150b7a02",
              "owner()": "8da5cb5b",
              "prizeStrategy()": "98bf3eb6",
              "renounceOwnership()": "715018a6",
              "reserveRegistry()": "8e71c1f6",
              "reserveTotalSupply()": "edb4e1cf",
              "setCreditPlanOf(address,uint128,uint128)": "a7b2cc31",
              "setLiquidityCap(uint256)": "7b99adb1",
              "setPrizeStrategy(address)": "91ca480e",
              "token()": "fc0c546a",
              "tokens()": "9d63848a",
              "transferExternalERC20(address,address,uint256)": "13f55e39",
              "transferOwnership(address)": "f2fde38b",
              "withdrawInstantlyFrom(address,uint256,address,uint256)": "a016240b",
              "withdrawReserve(address)": "52a387ab"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"AwardCaptured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Awarded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"AwardedExternalERC20\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"AwardedExternalERC721\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"cToken\",\"type\":\"address\"}],\"name\":\"CompoundPrizePoolInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract ControlledTokenInterface\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"ControlledTokenAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CreditBurned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CreditMinted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"creditLimitMantissa\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"creditRateMantissa\",\"type\":\"uint128\"}],\"name\":\"CreditPlanSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ErrorAwardingExternalERC721\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"reserveRegistry\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxExitFeeMantissa\",\"type\":\"uint256\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"redeemed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"exitFee\",\"type\":\"uint256\"}],\"name\":\"InstantWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"liquidityCap\",\"type\":\"uint256\"}],\"name\":\"LiquidityCapSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"prizeStrategy\",\"type\":\"address\"}],\"name\":\"PrizeStrategySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ReserveFeeCaptured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ReserveWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferredExternalERC20\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accountedBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"awardBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"awardExternalERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"awardExternalERC721\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"balance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"balanceOfCredit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"beforeTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cToken\",\"outputs\":[{\"internalType\":\"contract CTokenInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"calculateEarlyExitFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"exitFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"burnedCredit\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"calculateReserveFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_externalToken\",\"type\":\"address\"}],\"name\":\"canAwardExternal\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"captureAwardBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ICompLike\",\"name\":\"compLike\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"compLikeDelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"creditPlanOf\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"creditLimitMantissa\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"creditRateMantissa\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_principal\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_interest\",\"type\":\"uint256\"}],\"name\":\"estimateCreditAccrualTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"durationSeconds\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"_reserveRegistry\",\"type\":\"address\"},{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"_controlledTokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_maxExitFeeMantissa\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"_reserveRegistry\",\"type\":\"address\"},{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"_controlledTokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_maxExitFeeMantissa\",\"type\":\"uint256\"},{\"internalType\":\"contract CTokenInterface\",\"name\":\"_cToken\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ControlledTokenInterface\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"isControlled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"liquidityCap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxExitFeeMantissa\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizeStrategy\",\"outputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reserveRegistry\",\"outputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reserveTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"_creditRateMantissa\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"_creditLimitMantissa\",\"type\":\"uint128\"}],\"name\":\"setCreditPlanOf\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_liquidityCap\",\"type\":\"uint256\"}],\"name\":\"setLiquidityCap\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"_prizeStrategy\",\"type\":\"address\"}],\"name\":\"setPrizeStrategy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokens\",\"outputs\":[{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferExternalERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maximumExitFee\",\"type\":\"uint256\"}],\"name\":\"withdrawInstantlyFrom\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawReserve\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"accountedBalance()\":{\"returns\":{\"_0\":\"The current total of all tokens\"}},\"award(address,uint256,address)\":{\"details\":\"The amount awarded must be less than the awardBalance()\",\"params\":{\"amount\":\"The amount of assets to be awarded\",\"controlledToken\":\"The address of the asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"awardBalance()\":{\"details\":\"captureAwardBalance() should be called first\",\"returns\":{\"_0\":\"The total amount of assets to be awarded for the current prize\"}},\"awardExternalERC20(address,address,uint256)\":{\"details\":\"Used to award any arbitrary tokens held by the Prize Pool\",\"params\":{\"amount\":\"The amount of external assets to be awarded\",\"externalToken\":\"The address of the external asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"awardExternalERC721(address,address,uint256[])\":{\"details\":\"Used to award any arbitrary NFTs held by the Prize Pool\",\"params\":{\"externalToken\":\"The address of the external NFT token being awarded\",\"to\":\"The address of the winner that receives the award\",\"tokenIds\":\"An array of NFT Token IDs to be transferred\"}},\"balance()\":{\"details\":\"Returns the total underlying balance of all assets. This includes both principal and interest.\",\"returns\":{\"_0\":\"The underlying balance of assets\"}},\"balanceOfCredit(address,address)\":{\"params\":{\"user\":\"The user whose credit balance should be returned\"},\"returns\":{\"_0\":\"The balance of the users credit\"}},\"beforeTokenTransfer(address,address,uint256)\":{\"params\":{\"amount\":\"The amount of tokens being trasferred\",\"from\":\"The address the tokens are being transferred from (0 if minting)\",\"to\":\"The address the tokens are being transferred to (0 if burning)\"}},\"calculateEarlyExitFee(address,address,uint256)\":{\"params\":{\"amount\":\"The amount of collateral to be withdrawn\",\"controlledToken\":\"The type of collateral being withdrawn\",\"from\":\"The user who is withdrawing\"},\"returns\":{\"burnedCredit\":\"The user's credit that was burned\",\"exitFee\":\"The exit fee\"}},\"calculateReserveFee(uint256)\":{\"params\":{\"amount\":\"The prize amount\"},\"returns\":{\"_0\":\"The size of the reserve portion of the prize\"}},\"canAwardExternal(address)\":{\"details\":\"Checks with the Prize Pool if a specific token type may be awarded as an external prize\",\"params\":{\"_externalToken\":\"The address of the token to check\"},\"returns\":{\"_0\":\"True if the token may be awarded, false otherwise\"}},\"captureAwardBalance()\":{\"details\":\"This function also captures the reserve fees.\",\"returns\":{\"_0\":\"The total amount of assets to be awarded for the current prize\"}},\"compLikeDelegate(address,address)\":{\"params\":{\"compLike\":\"The COMP-like token held by the prize pool that should be delegated\",\"to\":\"The address to delegate to \"}},\"creditPlanOf(address)\":{\"params\":{\"controlledToken\":\"The controlled token to retrieve the credit rates for\"},\"returns\":{\"creditLimitMantissa\":\"The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\",\"creditRateMantissa\":\"The credit rate. This is the amount of tokens that accrue per second.\"}},\"depositTo(address,uint256,address,address)\":{\"params\":{\"amount\":\"The amount of assets to deposit\",\"controlledToken\":\"The address of the type of token the user is minting\",\"referrer\":\"The referrer of the deposit\",\"to\":\"The address receiving the newly minted tokens\"}},\"estimateCreditAccrualTime(address,uint256,uint256)\":{\"params\":{\"_interest\":\"The amount of interest that must accrue\",\"_principal\":\"The principal amount on which interest is accruing\"},\"returns\":{\"durationSeconds\":\"The duration of time it will take to accrue the given amount of interest, in seconds.\"}},\"initialize(address,address[],uint256)\":{\"params\":{\"_controlledTokens\":\"Array of ControlledTokens that are controlled by this Prize Pool.\",\"_maxExitFeeMantissa\":\"The maximum exit fee size\"}},\"initialize(address,address[],uint256,address)\":{\"params\":{\"_cToken\":\"Address of the Compound cToken interface\",\"_controlledTokens\":\"Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\",\"_maxExitFeeMantissa\":\"The maximum exit fee size, relative to the withdrawal amount\"}},\"isControlled(address)\":{\"details\":\"Checks if a specific token is controlled by the Prize Pool\",\"params\":{\"controlledToken\":\"The address of the token to check\"},\"returns\":{\"_0\":\"True if the token is a controlled token, false otherwise\"}},\"onERC721Received(address,address,uint256,bytes)\":{\"params\":{\"data\":\"Additional data with no specified format, sent in call to `_to`.\",\"from\":\"The current owner of the NFT\",\"operator\":\"The address that acts on behalf of the owner\",\"tokenId\":\"The NFT to transfer\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setCreditPlanOf(address,uint128,uint128)\":{\"params\":{\"_controlledToken\":\"The controlled token for whom to set the credit plan\",\"_creditLimitMantissa\":\"The credit limit to set.  Is a fixed point 18 decimal (like Ether).\",\"_creditRateMantissa\":\"The credit rate to set.  Is a fixed point 18 decimal (like Ether).\"}},\"setLiquidityCap(uint256)\":{\"params\":{\"_liquidityCap\":\"The new liquidity cap for the prize pool\"}},\"setPrizeStrategy(address)\":{\"params\":{\"_prizeStrategy\":\"The new prize strategy\"}},\"token()\":{\"details\":\"Returns the address of the underlying ERC20 asset\",\"returns\":{\"_0\":\"The address of the asset\"}},\"tokens()\":{\"returns\":{\"_0\":\"An array of controlled token addresses\"}},\"transferExternalERC20(address,address,uint256)\":{\"details\":\"Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\",\"params\":{\"amount\":\"The amount of external assets to be awarded\",\"externalToken\":\"The address of the external asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"withdrawInstantlyFrom(address,uint256,address,uint256)\":{\"params\":{\"amount\":\"The amount of tokens to redeem for assets.\",\"controlledToken\":\"The address of the token to redeem (i.e. ticket or sponsorship)\",\"from\":\"The address to redeem tokens from.\",\"maximumExitFee\":\"The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\"},\"returns\":{\"_0\":\"The actual exit fee paid\"}}},\"title\":\"Prize Pool with Compound's cToken\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"VERSION()\":{\"notice\":\"Semver Version\"},\"accountedBalance()\":{\"notice\":\"The total of all controlled tokens\"},\"award(address,uint256,address)\":{\"notice\":\"Called by the prize strategy to award prizes.\"},\"awardBalance()\":{\"notice\":\"Returns the balance that is available to award.\"},\"awardExternalERC20(address,address,uint256)\":{\"notice\":\"Called by the Prize-Strategy to award external ERC20 prizes\"},\"awardExternalERC721(address,address,uint256[])\":{\"notice\":\"Called by the prize strategy to award external ERC721 prizes\"},\"balanceOfCredit(address,address)\":{\"notice\":\"Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\"},\"beforeTokenTransfer(address,address,uint256)\":{\"notice\":\"Updates the Prize Strategy when tokens are transferred between holders.\"},\"cToken()\":{\"notice\":\"Interface for the Yield-bearing cToken by Compound\"},\"calculateEarlyExitFee(address,address,uint256)\":{\"notice\":\"Calculates the early exit fee for the given amount\"},\"calculateReserveFee(uint256)\":{\"notice\":\"Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\"},\"captureAwardBalance()\":{\"notice\":\"Captures any available interest as award balance.\"},\"compLikeDelegate(address,address)\":{\"notice\":\"Delegate the votes for a Compound COMP-like token held by the prize pool\"},\"creditPlanOf(address)\":{\"notice\":\"Returns the credit rate of a controlled token\"},\"depositTo(address,uint256,address,address)\":{\"notice\":\"Deposit assets into the Prize Pool in exchange for tokens\"},\"estimateCreditAccrualTime(address,uint256,uint256)\":{\"notice\":\"Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\"},\"initialize(address,address[],uint256)\":{\"notice\":\"Initializes the Prize Pool\"},\"initialize(address,address[],uint256,address)\":{\"notice\":\"Initializes the Prize Pool and Yield Service with the required contract connections\"},\"onERC721Received(address,address,uint256,bytes)\":{\"notice\":\"Required for ERC721 safe token transfers from smart contracts.\"},\"setCreditPlanOf(address,uint128,uint128)\":{\"notice\":\"Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\"},\"setLiquidityCap(uint256)\":{\"notice\":\"Allows the Governor to set a cap on the amount of liquidity that he pool can hold\"},\"setPrizeStrategy(address)\":{\"notice\":\"Sets the prize strategy of the prize pool.  Only callable by the owner.\"},\"tokens()\":{\"notice\":\"An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\"},\"transferExternalERC20(address,address,uint256)\":{\"notice\":\"Called by the Prize-Strategy to transfer out external ERC20 tokens\"},\"withdrawInstantlyFrom(address,uint256,address,uint256)\":{\"notice\":\"Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\"}},\"notice\":\"Manages depositing and withdrawing assets from the Prize Pool\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/prize-pool/compound/CompoundPrizePool.sol\":\"CompoundPrizePool\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"contracts/external/compound/CTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface CTokenInterface is IERC20Upgradeable {\\n    function decimals() external view returns (uint8);\\n    function totalSupply() external override view returns (uint256);\\n    function underlying() external view returns (address);\\n    function balanceOfUnderlying(address owner) external returns (uint256);\\n    function supplyRatePerBlock() external returns (uint256);\\n    function exchangeRateCurrent() external returns (uint256);\\n    function mint(uint256 mintAmount) external returns (uint256);\\n    function redeem(uint256 amount) external returns (uint256);\\n    function balanceOf(address user) external override view returns (uint256);\\n    function redeemUnderlying(uint256 redeemAmount) external returns (uint256);\\n}\\n\",\"keccak256\":\"0x9608049458bc017f2369e2af2a20bfa2efaff1a5b451a17bd0594a976d5bc88f\",\"license\":\"GPL-3.0\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../external/compound/ICompLike.sol\\\";\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../reserve/ReserveInterface.sol\\\";\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/TokenListenerLibrary.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\nimport \\\"./PrizePoolInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using SafeERC20Upgradeable for IERC721Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    address reserveRegistry,\\n    uint256 maxExitFeeMantissa\\n  );\\n\\n  /// @dev Event emitted when controlled token is added\\n  event ControlledTokenAdded(\\n    ControlledTokenInterface indexed token\\n  );\\n\\n  /// @dev Emitted when reserve is captured.\\n  event ReserveFeeCaptured(\\n    uint256 amount\\n  );\\n\\n  event AwardCaptured(\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when assets are deposited\\n  event Deposited(\\n    address indexed operator,\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount,\\n    address referrer\\n  );\\n\\n  /// @dev Event emitted when interest is awarded to a winner\\n  event Awarded(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are awarded to a winner\\n  event AwardedExternalERC20(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are transferred out\\n  event TransferredExternalERC20(\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC721s are awarded to a winner\\n  event AwardedExternalERC721(\\n    address indexed winner,\\n    address indexed token,\\n    uint256[] tokenIds\\n  );\\n\\n  /// @dev Event emitted when assets are withdrawn instantly\\n  event InstantWithdrawal(\\n    address indexed operator,\\n    address indexed from,\\n    address indexed token,\\n    uint256 amount,\\n    uint256 redeemed,\\n    uint256 exitFee\\n  );\\n\\n  event ReserveWithdrawal(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when the Liquidity Cap is set\\n  event LiquidityCapSet(\\n    uint256 liquidityCap\\n  );\\n\\n  /// @dev Event emitted when the Credit plan is set\\n  event CreditPlanSet(\\n    address token,\\n    uint128 creditLimitMantissa,\\n    uint128 creditRateMantissa\\n  );\\n\\n  /// @dev Event emitted when the Prize Strategy is set\\n  event PrizeStrategySet(\\n    address indexed prizeStrategy\\n  );\\n\\n  /// @dev Emitted when credit is minted\\n  event CreditMinted(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when credit is burned\\n  event CreditBurned(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\\n  event ErrorAwardingExternalERC721(bytes error);\\n\\n\\n  struct CreditPlan {\\n    uint128 creditLimitMantissa;\\n    uint128 creditRateMantissa;\\n  }\\n\\n  struct CreditBalance {\\n    uint192 balance;\\n    uint32 timestamp;\\n    bool initialized;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  /// @dev Reserve to which reserve fees are sent\\n  RegistryInterface public reserveRegistry;\\n\\n  /// @dev An array of all the controlled tokens\\n  ControlledTokenInterface[] internal _tokens;\\n\\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\\n  TokenListenerInterface public prizeStrategy;\\n\\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\\n  /// For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\\n  uint256 public maxExitFeeMantissa;\\n\\n  /// @dev The total funds that have been allocated to the reserve\\n  uint256 public reserveTotalSupply;\\n\\n  /// @dev The total amount of funds that the prize pool can hold.\\n  uint256 public liquidityCap;\\n\\n  /// @dev the The awardable balance\\n  uint256 internal _currentAwardBalance;\\n\\n  /// @dev Stores the credit plan for each token.\\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\\n\\n  /// @dev Stores each users balance of credit per token.\\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\\n\\n  /// @notice Initializes the Prize Pool\\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\\n  /// @param _maxExitFeeMantissa The maximum exit fee size\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_reserveRegistry) != address(0), \\\"PrizePool/reserveRegistry-not-zero\\\");\\n    uint256 controlledTokensLength = _controlledTokens.length;\\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\\n\\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\\n      _addControlledToken(controlledToken, i);\\n    }\\n    __Ownable_init();\\n    __ReentrancyGuard_init();\\n    _setLiquidityCap(uint256(-1));\\n\\n    reserveRegistry = _reserveRegistry;\\n    maxExitFeeMantissa = _maxExitFeeMantissa;\\n\\n    emit Initialized(\\n      address(_reserveRegistry),\\n      maxExitFeeMantissa\\n    );\\n  }\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external override view returns (address) {\\n    return address(_token());\\n  }\\n\\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\\n  /// @return The underlying balance of assets\\n  function balance() external returns (uint256) {\\n    return _balance();\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function canAwardExternal(address _externalToken) external view returns (bool) {\\n    return _canAwardExternal(_externalToken);\\n  }\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    canAddLiquidity(amount)\\n  {\\n    address operator = _msgSender();\\n\\n    _mint(to, amount, controlledToken, referrer);\\n\\n    _token().safeTransferFrom(operator, address(this), amount);\\n    _supply(amount);\\n\\n    emit Deposited(operator, to, controlledToken, amount, referrer);\\n  }\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    returns (uint256)\\n  {\\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n    require(exitFee <= maximumExitFee, \\\"PrizePool/exit-fee-exceeds-user-maximum\\\");\\n\\n    // burn the credit\\n    _burnCredit(from, controlledToken, burnedCredit);\\n\\n    // burn the tickets\\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\\n\\n    // redeem the tickets less the fee\\n    uint256 amountLessFee = amount.sub(exitFee);\\n    uint256 redeemed = _redeem(amountLessFee);\\n\\n    _token().safeTransfer(from, redeemed);\\n\\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\\n\\n    return exitFee;\\n  }\\n\\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\\n  /// @param exitFee The exit fee to check against the limit\\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\\n    if (exitFee > maxFee) {\\n      exitFee = maxFee;\\n    }\\n    return exitFee;\\n  }\\n\\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\\n  /// @param from The address the tokens are being transferred from (0 if minting)\\n  /// @param to The address the tokens are being transferred to (0 if burning)\\n  /// @param amount The amount of tokens being trasferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\\n    if (from != address(0)) {\\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\\n      // first accrue credit for their old balance\\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\\n\\n      if (from != to) {\\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\\n      }\\n\\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\\n    }\\n    if (to != address(0) && to != from) {\\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\\n    }\\n    // if we aren't minting\\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\\n    }\\n  }\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external override view returns (uint256) {\\n    return _currentAwardBalance;\\n  }\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n\\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\\n    uint256 currentBalance = _balance();\\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\\n\\n    if (unaccountedPrizeBalance > 0) {\\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\\n      if (reserveFee > 0) {\\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\\n        emit ReserveFeeCaptured(reserveFee);\\n      }\\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\\n\\n      emit AwardCaptured(unaccountedPrizeBalance);\\n    }\\n\\n    return _currentAwardBalance;\\n  }\\n\\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\\n\\n    uint256 amount = reserveTotalSupply;\\n    reserveTotalSupply = 0;\\n    uint256 redeemed = _redeem(amount);\\n\\n    _token().safeTransfer(address(to), redeemed);\\n\\n    emit ReserveWithdrawal(to, amount);\\n\\n    return redeemed;\\n  }\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external override\\n    onlyPrizeStrategy\\n    onlyControlledToken(controlledToken)\\n  {\\n    if (amount == 0) {\\n      return;\\n    }\\n\\n    require(amount <= _currentAwardBalance, \\\"PrizePool/award-exceeds-avail\\\");\\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\\n\\n    _mint(to, amount, controlledToken, address(0));\\n\\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\\n\\n    emit Awarded(to, controlledToken, amount);\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit TransferredExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit AwardedExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  function _transferOut(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (bool)\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (amount == 0) {\\n      return false;\\n    }\\n\\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\\n\\n    return true;\\n  }\\n\\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\\n  /// @param to The user who is receiving the tokens\\n  /// @param amount The amount of tokens they are receiving\\n  /// @param controlledToken The token that is going to be minted\\n  /// @param referrer The user who referred the minting\\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\\n    if (address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n    ControlledToken(controlledToken).controllerMint(to, amount);\\n  }\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (tokenIds.length == 0) {\\n      return;\\n    }\\n\\n    for (uint256 i = 0; i < tokenIds.length; i++) {\\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\\n\\n      }\\n      catch(bytes memory error){\\n        emit ErrorAwardingExternalERC721(error);\\n      }\\n      \\n    }\\n\\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\\n  }\\n\\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\\n  /// @param amount The prize amount\\n  /// @return The size of the reserve portion of the prize\\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    if (address(reserve) == address(0)) {\\n      return 0;\\n    }\\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\\n    if (reserveRateMantissa == 0) {\\n      return 0;\\n    }\\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\\n  }\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external override\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    )\\n  {\\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n  }\\n\\n  /// @dev Calculates the early exit fee for the given amount\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return Exit fee\\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\\n    return _limitExitFee(\\n      amount,\\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external override\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    durationSeconds =_estimateCreditAccrualTime(\\n      _controlledToken,\\n      _principal,\\n      _interest\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function _estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    internal\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    // interest = credit rate * principal * time\\n    // => time = interest / (credit rate * principal)\\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\\n    if (accruedPerSecond == 0) {\\n      return 0;\\n    }\\n    return _interest.div(accruedPerSecond);\\n  }\\n\\n  /// @notice Burns a users credit.\\n  /// @param user The user whose credit should be burned\\n  /// @param credit The amount of credit to burn\\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\\n\\n    emit CreditBurned(user, controlledToken, credit);\\n  }\\n\\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\\n  /// @param user The user for whom to accrue credit\\n  /// @param controlledToken The controlled token whose balance we are checking\\n  /// @param controlledTokenBalance The balance to use for the user\\n  /// @param extra Additional credit to be added\\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\\n    _updateCreditBalance(\\n      user,\\n      controlledToken,\\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\\n    );\\n  }\\n\\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\\n    uint256 newBalance;\\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\\n    if (!creditBalance.initialized) {\\n      newBalance = 0;\\n    } else {\\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\\n    }\\n    return newBalance;\\n  }\\n\\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\\n\\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\\n      balance: newBalance.toUint128(),\\n      timestamp: _currentTime().toUint32(),\\n      initialized: true\\n    });\\n\\n    if (oldBalance < newBalance) {\\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\\n    } \\n    else if (newBalance < oldBalance) {\\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\\n    }\\n  }\\n\\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\\n  /// @param creditBalance The new credit balance to be checked\\n  /// @return The users new credit balance.  Will not exceed the credit limit.\\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\\n      controlledTokenBalance,\\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\\n    );\\n    if (creditBalance > creditLimit) {\\n      creditBalance = creditLimit;\\n    }\\n\\n    return creditBalance;\\n  }\\n\\n  /// @notice Calculates the accrued interest for a user\\n  /// @param user The user whose credit should be calculated.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\\n  /// @return The credit that has accrued since the last credit update.\\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\\n\\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\\n      return 0;\\n    }\\n\\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\\n  }\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\\n    return _tokenCreditBalances[controlledToken][user].balance;\\n  }\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external override\\n    onlyControlledToken(_controlledToken)\\n    onlyOwner\\n  {\\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\\n      creditLimitMantissa: _creditLimitMantissa,\\n      creditRateMantissa: _creditRateMantissa\\n    });\\n\\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\\n  }\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external override\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    )\\n  {\\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\\n  }\\n\\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The token they are withdrawing\\n  /// @param amount The amount of funds they are withdrawing\\n  /// @return earlyExitFee The additional exit fee that should be charged.\\n  /// @return creditBurned The amount of credit that will be burned\\n  function _calculateEarlyExitFeeLessBurnedCredit(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (\\n      uint256 earlyExitFee,\\n      uint256 creditBurned\\n    )\\n  {\\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\\n    require(controlledTokenBalance >= amount, \\\"PrizePool/insuff-funds\\\");\\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\\n    /*\\n    The credit is used *last*.  Always charge the fees up-front.\\n\\n    How to calculate:\\n\\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\\n\\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\\n    */\\n\\n    // Determine available usable credit based on withdraw amount\\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\\n\\n    uint256 availableCredit;\\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\\n    }\\n\\n    // Determine amount of credit to burn and amount of fees required\\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\\n    earlyExitFee = totalExitFee.sub(creditBurned);\\n  }\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\\n    _setLiquidityCap(_liquidityCap);\\n  }\\n\\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\\n    liquidityCap = _liquidityCap;\\n    emit LiquidityCapSet(_liquidityCap);\\n  }\\n\\n  /// @notice Adds a new controlled token\\n  /// @param _controlledToken The controlled token to add.\\n  /// @param index The index to add the controlledToken\\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\\n    require(_controlledToken.controller() == this, \\\"PrizePool/token-ctrlr-mismatch\\\");\\n    \\n    _tokens[index] = _controlledToken;\\n    emit ControlledTokenAdded(_controlledToken);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\\n    _setPrizeStrategy(_prizeStrategy);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\\n    require(address(_prizeStrategy) != address(0), \\\"PrizePool/prizeStrategy-not-zero\\\");\\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PrizePool/prizeStrategy-invalid\\\");\\n    prizeStrategy = _prizeStrategy;\\n\\n    emit PrizeStrategySet(address(_prizeStrategy));\\n  }\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\\n    return _tokens;\\n  }\\n\\n  /// @dev Gets the current time as represented by the current block\\n  /// @return The timestamp of the current block\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external override view returns (uint256) {\\n    return _tokenTotalSupply();\\n  }\\n\\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\\n  /// @param to The address to delegate to \\n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\\n    if (compLike.balanceOf(address(this)) > 0) {\\n      compLike.delegate(to);\\n    }\\n  }\\n  \\n  /// @notice Required for ERC721 safe token transfers from smart contracts.\\n  /// @param operator The address that acts on behalf of the owner\\n  /// @param from The current owner of the NFT\\n  /// @param tokenId The NFT to transfer\\n  /// @param data Additional data with no specified format, sent in call to `_to`.\\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function _tokenTotalSupply() internal view returns (uint256) {\\n    uint256 total = reserveTotalSupply;\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \\n    uint256 tokensLength = tokens.length;\\n    \\n    for(uint256 i = 0; i < tokensLength; i++){\\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\\n    }\\n\\n    return total;\\n  }\\n\\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\\n  }\\n\\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\\n    uint256 tokensLength = tokens.length;\\n\\n    for(uint256 i = 0; i < tokensLength; i++) {\\n      if(tokens[i] == controlledToken) return true;\\n    }\\n    return false;\\n  }\\n  \\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\\n    return _isControlled(controlledToken);\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function _token() internal virtual view returns (IERC20Upgradeable);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal virtual returns (uint256);\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal virtual;\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\\n\\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  modifier onlyControlledToken(address controlledToken) {\\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \\\"PrizePool/unknown-token\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure caller is the prize-strategy\\n  modifier onlyPrizeStrategy() {\\n    require(_msgSender() == address(prizeStrategy), \\\"PrizePool/only-prizeStrategy\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\\n  modifier canAddLiquidity(uint256 _amount) {\\n    require(_canAddLiquidity(_amount), \\\"PrizePool/exceeds-liquidity-cap\\\");\\n    _;\\n  }\\n\\n  modifier onlyReserve() {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    require(address(reserve) == msg.sender, \\\"PrizePool/only-reserve\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x386ebc1c80ab4424f14125e716dd12641ff933b475bf1082b7b1a6eee4a969c3\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/compound/CompoundPrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../../external/compound/CTokenInterface.sol\\\";\\nimport \\\"../PrizePool.sol\\\";\\n\\n/// @title Prize Pool with Compound's cToken\\n/// @notice Manages depositing and withdrawing assets from the Prize Pool\\ncontract CompoundPrizePool is PrizePool {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n\\n  event CompoundPrizePoolInitialized(address indexed cToken);\\n\\n  /// @notice Interface for the Yield-bearing cToken by Compound\\n  CTokenInterface public cToken;\\n\\n  /// @notice Initializes the Prize Pool and Yield Service with the required contract connections\\n  /// @param _controlledTokens Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\\n  /// @param _maxExitFeeMantissa The maximum exit fee size, relative to the withdrawal amount\\n  /// @param _cToken Address of the Compound cToken interface\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa,\\n    CTokenInterface _cToken\\n  )\\n    public\\n    initializer\\n  {\\n    PrizePool.initialize(\\n      _reserveRegistry,\\n      _controlledTokens,\\n      _maxExitFeeMantissa\\n    );\\n    cToken = _cToken;\\n\\n    emit CompoundPrizePoolInitialized(address(cToken));\\n  }\\n\\n  /// @dev Gets the balance of the underlying assets held by the Yield Service\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal override returns (uint256) {\\n    return cToken.balanceOfUnderlying(address(this));\\n  }\\n\\n  /// @dev Allows a user to supply asset tokens in exchange for yield-bearing tokens\\n  /// to be held in escrow by the Yield Service\\n  /// @param amount The amount of asset tokens to be supplied\\n  function _supply(uint256 amount) internal override {\\n    _token().safeApprove(address(cToken), amount);\\n    require(cToken.mint(amount) == 0, \\\"CompoundPrizePool/mint-failed\\\");\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as a prize enhancement\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal override view returns (bool) {\\n    return _externalToken != address(cToken);\\n  }\\n\\n  /// @dev Allows a user to redeem yield-bearing tokens in exchange for the underlying\\n  /// asset tokens held in escrow by the Yield Service\\n  /// @param amount The amount of underlying tokens to be redeemed\\n  /// @return The actual amount of tokens transferred\\n  function _redeem(uint256 amount) internal override returns (uint256) {\\n    IERC20Upgradeable assetToken = _token();\\n    uint256 before = assetToken.balanceOf(address(this));\\n    require(cToken.redeemUnderlying(amount) == 0, \\\"CompoundPrizePool/redeem-failed\\\");\\n    uint256 diff = assetToken.balanceOf(address(this)).sub(before);\\n    return diff;\\n  }\\n\\n  /// @dev Gets the underlying asset token used by the Yield Service\\n  /// @return A reference to the interface of the underling asset token\\n  function _token() internal override view returns (IERC20Upgradeable) {\\n    return IERC20Upgradeable(cToken.underlying());\\n  }\\n}\\n\",\"keccak256\":\"0x094f4926923fad2a264e41f6eaabc161dc9969a6db6dbf3a170c266d27162ab6\",\"license\":\"GPL-3.0\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/prize-pool/compound/CompoundPrizePool.sol:CompoundPrizePool",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/prize-pool/compound/CompoundPrizePool.sol:CompoundPrizePool",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/prize-pool/compound/CompoundPrizePool.sol:CompoundPrizePool",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 10,
                "contract": "contracts/prize-pool/compound/CompoundPrizePool.sol:CompoundPrizePool",
                "label": "_owner",
                "offset": 0,
                "slot": "51",
                "type": "t_address"
              },
              {
                "astId": 129,
                "contract": "contracts/prize-pool/compound/CompoundPrizePool.sol:CompoundPrizePool",
                "label": "__gap",
                "offset": 0,
                "slot": "52",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 4743,
                "contract": "contracts/prize-pool/compound/CompoundPrizePool.sol:CompoundPrizePool",
                "label": "_status",
                "offset": 0,
                "slot": "101",
                "type": "t_uint256"
              },
              {
                "astId": 4786,
                "contract": "contracts/prize-pool/compound/CompoundPrizePool.sol:CompoundPrizePool",
                "label": "__gap",
                "offset": 0,
                "slot": "102",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 6817,
                "contract": "contracts/prize-pool/compound/CompoundPrizePool.sol:CompoundPrizePool",
                "label": "reserveRegistry",
                "offset": 0,
                "slot": "151",
                "type": "t_contract(RegistryInterface)12458"
              },
              {
                "astId": 6821,
                "contract": "contracts/prize-pool/compound/CompoundPrizePool.sol:CompoundPrizePool",
                "label": "_tokens",
                "offset": 0,
                "slot": "152",
                "type": "t_array(t_contract(ControlledTokenInterface)15850)dyn_storage"
              },
              {
                "astId": 6824,
                "contract": "contracts/prize-pool/compound/CompoundPrizePool.sol:CompoundPrizePool",
                "label": "prizeStrategy",
                "offset": 0,
                "slot": "153",
                "type": "t_contract(TokenListenerInterface)16265"
              },
              {
                "astId": 6827,
                "contract": "contracts/prize-pool/compound/CompoundPrizePool.sol:CompoundPrizePool",
                "label": "maxExitFeeMantissa",
                "offset": 0,
                "slot": "154",
                "type": "t_uint256"
              },
              {
                "astId": 6830,
                "contract": "contracts/prize-pool/compound/CompoundPrizePool.sol:CompoundPrizePool",
                "label": "reserveTotalSupply",
                "offset": 0,
                "slot": "155",
                "type": "t_uint256"
              },
              {
                "astId": 6833,
                "contract": "contracts/prize-pool/compound/CompoundPrizePool.sol:CompoundPrizePool",
                "label": "liquidityCap",
                "offset": 0,
                "slot": "156",
                "type": "t_uint256"
              },
              {
                "astId": 6836,
                "contract": "contracts/prize-pool/compound/CompoundPrizePool.sol:CompoundPrizePool",
                "label": "_currentAwardBalance",
                "offset": 0,
                "slot": "157",
                "type": "t_uint256"
              },
              {
                "astId": 6841,
                "contract": "contracts/prize-pool/compound/CompoundPrizePool.sol:CompoundPrizePool",
                "label": "_tokenCreditPlans",
                "offset": 0,
                "slot": "158",
                "type": "t_mapping(t_address,t_struct(CreditPlan)6803_storage)"
              },
              {
                "astId": 6848,
                "contract": "contracts/prize-pool/compound/CompoundPrizePool.sol:CompoundPrizePool",
                "label": "_tokenCreditBalances",
                "offset": 0,
                "slot": "159",
                "type": "t_mapping(t_address,t_mapping(t_address,t_struct(CreditBalance)6810_storage))"
              },
              {
                "astId": 8955,
                "contract": "contracts/prize-pool/compound/CompoundPrizePool.sol:CompoundPrizePool",
                "label": "cToken",
                "offset": 0,
                "slot": "160",
                "type": "t_contract(CTokenInterface)6511"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_contract(ControlledTokenInterface)15850)dyn_storage": {
                "base": "t_contract(ControlledTokenInterface)15850",
                "encoding": "dynamic_array",
                "label": "contract ControlledTokenInterface[]",
                "numberOfBytes": "32"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_contract(CTokenInterface)6511": {
                "encoding": "inplace",
                "label": "contract CTokenInterface",
                "numberOfBytes": "20"
              },
              "t_contract(ControlledTokenInterface)15850": {
                "encoding": "inplace",
                "label": "contract ControlledTokenInterface",
                "numberOfBytes": "20"
              },
              "t_contract(RegistryInterface)12458": {
                "encoding": "inplace",
                "label": "contract RegistryInterface",
                "numberOfBytes": "20"
              },
              "t_contract(TokenListenerInterface)16265": {
                "encoding": "inplace",
                "label": "contract TokenListenerInterface",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_mapping(t_address,t_struct(CreditBalance)6810_storage))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => struct PrizePool.CreditBalance))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_struct(CreditBalance)6810_storage)"
              },
              "t_mapping(t_address,t_struct(CreditBalance)6810_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct PrizePool.CreditBalance)",
                "numberOfBytes": "32",
                "value": "t_struct(CreditBalance)6810_storage"
              },
              "t_mapping(t_address,t_struct(CreditPlan)6803_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct PrizePool.CreditPlan)",
                "numberOfBytes": "32",
                "value": "t_struct(CreditPlan)6803_storage"
              },
              "t_struct(CreditBalance)6810_storage": {
                "encoding": "inplace",
                "label": "struct PrizePool.CreditBalance",
                "members": [
                  {
                    "astId": 6805,
                    "contract": "contracts/prize-pool/compound/CompoundPrizePool.sol:CompoundPrizePool",
                    "label": "balance",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint192"
                  },
                  {
                    "astId": 6807,
                    "contract": "contracts/prize-pool/compound/CompoundPrizePool.sol:CompoundPrizePool",
                    "label": "timestamp",
                    "offset": 24,
                    "slot": "0",
                    "type": "t_uint32"
                  },
                  {
                    "astId": 6809,
                    "contract": "contracts/prize-pool/compound/CompoundPrizePool.sol:CompoundPrizePool",
                    "label": "initialized",
                    "offset": 28,
                    "slot": "0",
                    "type": "t_bool"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_struct(CreditPlan)6803_storage": {
                "encoding": "inplace",
                "label": "struct PrizePool.CreditPlan",
                "members": [
                  {
                    "astId": 6800,
                    "contract": "contracts/prize-pool/compound/CompoundPrizePool.sol:CompoundPrizePool",
                    "label": "creditLimitMantissa",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint128"
                  },
                  {
                    "astId": 6802,
                    "contract": "contracts/prize-pool/compound/CompoundPrizePool.sol:CompoundPrizePool",
                    "label": "creditRateMantissa",
                    "offset": 16,
                    "slot": "0",
                    "type": "t_uint128"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_uint128": {
                "encoding": "inplace",
                "label": "uint128",
                "numberOfBytes": "16"
              },
              "t_uint192": {
                "encoding": "inplace",
                "label": "uint192",
                "numberOfBytes": "24"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint32": {
                "encoding": "inplace",
                "label": "uint32",
                "numberOfBytes": "4"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "VERSION()": {
                "notice": "Semver Version"
              },
              "accountedBalance()": {
                "notice": "The total of all controlled tokens"
              },
              "award(address,uint256,address)": {
                "notice": "Called by the prize strategy to award prizes."
              },
              "awardBalance()": {
                "notice": "Returns the balance that is available to award."
              },
              "awardExternalERC20(address,address,uint256)": {
                "notice": "Called by the Prize-Strategy to award external ERC20 prizes"
              },
              "awardExternalERC721(address,address,uint256[])": {
                "notice": "Called by the prize strategy to award external ERC721 prizes"
              },
              "balanceOfCredit(address,address)": {
                "notice": "Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit."
              },
              "beforeTokenTransfer(address,address,uint256)": {
                "notice": "Updates the Prize Strategy when tokens are transferred between holders."
              },
              "cToken()": {
                "notice": "Interface for the Yield-bearing cToken by Compound"
              },
              "calculateEarlyExitFee(address,address,uint256)": {
                "notice": "Calculates the early exit fee for the given amount"
              },
              "calculateReserveFee(uint256)": {
                "notice": "Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero."
              },
              "captureAwardBalance()": {
                "notice": "Captures any available interest as award balance."
              },
              "compLikeDelegate(address,address)": {
                "notice": "Delegate the votes for a Compound COMP-like token held by the prize pool"
              },
              "creditPlanOf(address)": {
                "notice": "Returns the credit rate of a controlled token"
              },
              "depositTo(address,uint256,address,address)": {
                "notice": "Deposit assets into the Prize Pool in exchange for tokens"
              },
              "estimateCreditAccrualTime(address,uint256,uint256)": {
                "notice": "Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit."
              },
              "initialize(address,address[],uint256)": {
                "notice": "Initializes the Prize Pool"
              },
              "initialize(address,address[],uint256,address)": {
                "notice": "Initializes the Prize Pool and Yield Service with the required contract connections"
              },
              "onERC721Received(address,address,uint256,bytes)": {
                "notice": "Required for ERC721 safe token transfers from smart contracts."
              },
              "setCreditPlanOf(address,uint128,uint128)": {
                "notice": "Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether)."
              },
              "setLiquidityCap(uint256)": {
                "notice": "Allows the Governor to set a cap on the amount of liquidity that he pool can hold"
              },
              "setPrizeStrategy(address)": {
                "notice": "Sets the prize strategy of the prize pool.  Only callable by the owner."
              },
              "tokens()": {
                "notice": "An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)"
              },
              "transferExternalERC20(address,address,uint256)": {
                "notice": "Called by the Prize-Strategy to transfer out external ERC20 tokens"
              },
              "withdrawInstantlyFrom(address,uint256,address,uint256)": {
                "notice": "Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit."
              }
            },
            "notice": "Manages depositing and withdrawing assets from the Prize Pool",
            "version": 1
          }
        }
      },
      "contracts/prize-pool/compound/CompoundPrizePoolProxyFactory.sol": {
        "CompoundPrizePoolProxyFactory": {
          "abi": [
            {
              "inputs": [],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "name": "ProxyCreated",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "create",
              "outputs": [
                {
                  "internalType": "contract CompoundPrizePool",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_logic",
                  "type": "address"
                },
                {
                  "internalType": "bytes",
                  "name": "_data",
                  "type": "bytes"
                }
              ],
              "name": "deployMinimal",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "instance",
              "outputs": [
                {
                  "internalType": "contract CompoundPrizePool",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "create()": {
                "returns": {
                  "_0": "A reference to the new proxied Compound Prize Pool"
                }
              }
            },
            "title": "Compound Prize Pool Proxy Factory",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5060405161001d9061005f565b604051809103906000f080158015610039573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b039290921691909117905561006c565b614445806103b283390190565b6103378061007b6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063022ec09514610046578063b3eeb5e21461006a578063efc81a8c14610120575b600080fd5b61004e610128565b604080516001600160a01b039092168252519081900360200190f35b61004e6004803603604081101561008057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100ab57600080fd5b8201836020820111156100bd57600080fd5b803590602001918460018302840111640100000000831117156100df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610137945050505050565b61004e6102b3565b6000546001600160a01b031681565b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a18251156102ac576000826001600160a01b0316846040518082805190602001908083835b602083106102035780518252601f1990920191602091820191016101e4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610265576040519150601f19603f3d011682016040523d82523d6000602084013e61026a565b606091505b50509050806102aa5760405162461bcd60e51b81526004018080602001828103825260248152602001806102de6024913960400191505060405180910390fd5b505b5092915050565b6000805460408051602081019091528281526102d8916001600160a01b031690610137565b90509056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a2646970667358221220433774e7d34329c512998c2ecabf002ff94a6ffe8fdf03113f7638531a56f20264736f6c634300060c0033608060405234801561001057600080fd5b50614425806100206000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c8063888c2b6f11610130578063a7b2cc31116100b8578063e6d8a94b1161007c578063e6d8a94b14610956578063edb4e1cf1461095e578063f2fde38b14610966578063fc0c546a1461098c578063ffa1ad741461099457610232565b8063a7b2cc31146107c1578063b69ef8a8146107fe578063c587148514610806578063d4a1361d146108c5578063e323f8251461091a57610232565b806398bf3eb6116100ff57806398bf3eb6146107025780639d63848a1461070a5780639e167519146107625780639fe32a911461076a578063a016240b1461078757610232565b8063888c2b6f1461067d5780638da5cb5b146106cc5780638e71c1f6146106d457806391ca480e146106dc57610232565b8063630665b4116101be57806376687d3d1161018257806376687d3d146105ca57806378b3d327146105d257806379cb8563146105f85780637b99adb11461062a5780637cbab1c71461064757610232565b8063630665b41461052657806369e527da1461052e5780636a3fd4f9146105525780636b1b863a1461058c578063715018a6146105c257610232565b80632b0ab144116102055780632b0ab144146103bb5780632f7627e3146103f15780633ede50c61461041f578063494de9f7146104d257806352a387ab1461050057610232565b80630937eb541461023757806313f55e3914610251578063150b7a021461028957806316960d5514610334575b600080fd5b61023f610a11565b60408051918252519081900360200190f35b6102876004803603606081101561026757600080fd5b506001600160a01b03813581169160208101359091169060400135610a20565b005b6103176004803603608081101561029f57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156102d957600080fd5b8201836020820111156102eb57600080fd5b803590602001918460018302840111600160201b8311171561030c57600080fd5b509092509050610ade565b604080516001600160e01b03199092168252519081900360200190f35b6102876004803603606081101561034a57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561037d57600080fd5b82018360208201111561038f57600080fd5b803590602001918460208302840111600160201b831117156103b057600080fd5b509092509050610aef565b610287600480360360608110156103d157600080fd5b506001600160a01b03813581169160208101359091169060400135610d9c565b6102876004803603604081101561040757600080fd5b506001600160a01b0381358116916020013516610e59565b6102876004803603606081101561043557600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561045f57600080fd5b82018360208201111561047157600080fd5b803590602001918460208302840111600160201b8311171561049257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250610fa8915050565b61023f600480360360408110156104e857600080fd5b506001600160a01b038135811691602001351661119a565b61023f6004803603602081101561051657600080fd5b50356001600160a01b03166112a1565b61023f6113f0565b6105366113f6565b604080516001600160a01b039092168252519081900360200190f35b6105786004803603602081101561056857600080fd5b50356001600160a01b0316611405565b604080519115158252519081900360200190f35b610287600480360360608110156105a257600080fd5b506001600160a01b03813581169160208101359160409091013516611418565b610287611620565b61023f6116cc565b610578600480360360208110156105e857600080fd5b50356001600160a01b03166116d2565b61023f6004803603606081101561060e57600080fd5b506001600160a01b0381351690602081013590604001356116dd565b6102876004803603602081101561064057600080fd5b50356116f2565b6102876004803603606081101561065d57600080fd5b506001600160a01b03813581169160208101359091169060400135611760565b6106b36004803603606081101561069357600080fd5b506001600160a01b038135811691602081013590911690604001356119ac565b6040805192835260208301919091528051918290030190f35b6105366119c6565b6105366119d5565b610287600480360360208110156106f257600080fd5b50356001600160a01b03166119e4565b610536611a4f565b610712611a5e565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561074e578181015183820152602001610736565b505050509050019250505060405180910390f35b61023f611ac0565b61023f6004803603602081101561078057600080fd5b5035611ac6565b61023f6004803603608081101561079d57600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611bf4565b610287600480360360608110156107d757600080fd5b506001600160a01b03813516906001600160801b0360208201358116916040013516611e2b565b61023f611f81565b6102876004803603608081101561081c57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561084657600080fd5b82018360208201111561085857600080fd5b803590602001918460208302840111600160201b8311171561087957600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602001356001600160a01b0316611f8b565b6108eb600480360360208110156108db57600080fd5b50356001600160a01b0316612089565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b6102876004803603608081101561093057600080fd5b506001600160a01b038135811691602081013591604082013581169160600135166120b9565b61023f61226e565b61023f6123e4565b6102876004803603602081101561097c57600080fd5b50356001600160a01b03166123ea565b6105366124ed565b61099c6124f7565b6040805160208082528351818301528351919283929083019185019080838360005b838110156109d65781810151838201526020016109be565b50505050905090810190601f168015610a035780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610a1b612518565b905090565b6099546001600160a01b0316610a34612623565b6001600160a01b031614610a7d576040805162461bcd60e51b815260206004820152601c60248201526000805160206143d0833981519152604482015290519081900360640190fd5b610a88838383612627565b15610ad957816001600160a01b0316836001600160a01b03167fb0bac59718cd343c80a813518afcf36846cfcfe6d56e2b3cab9bd49f5f9b251c836040518082815260200191505060405180910390a35b505050565b630a85bd0160e11b95945050505050565b6099546001600160a01b0316610b03612623565b6001600160a01b031614610b4c576040805162461bcd60e51b815260206004820152601c60248201526000805160206143d0833981519152604482015290519081900360640190fd5b610b55836126af565b610ba6576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b80610bb057610d96565b60005b81811015610d1d57836001600160a01b03166342842e0e3087868686818110610bd857fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610c3557600080fd5b505af1925050508015610c46575060015b610d15573d808015610c74576040519150601f19603f3d011682016040523d82523d6000602084013e610c79565b606091505b507f17e975018310f88872b58d4d8263adca83cf5c1893496ea2a86923dab15276ad816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610cd9578181015183820152602001610cc1565b50505050905090810190601f168015610d065780820380516001836020036101000a031916815260200191505b509250505060405180910390a1505b600101610bb3565b50826001600160a01b0316846001600160a01b03167f69c2de32bc4d47f488e72626a6cfdee85089342e52675e7de79c4b417623960c848460405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a35b50505050565b6099546001600160a01b0316610db0612623565b6001600160a01b031614610df9576040805162461bcd60e51b815260206004820152601c60248201526000805160206143d0833981519152604482015290519081900360640190fd5b610e04838383612627565b15610ad957816001600160a01b0316836001600160a01b03167fc65f48aca3b7a99b7443d04b8ffbb073156179bc628dc3f7def5047748973469836040518082815260200191505060405180910390a3505050565b610e61612623565b6001600160a01b0316610e726119c6565b6001600160a01b031614610ebb576040805162461bcd60e51b815260206004820181905260248201526000805160206142e3833981519152604482015290519081900360640190fd5b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f0a57600080fd5b505afa158015610f1e573d6000803e3d6000fd5b505050506040513d6020811015610f3457600080fd5b50511115610fa457816001600160a01b0316635c19a95c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015610f8b57600080fd5b505af1158015610f9f573d6000803e3d6000fd5b505050505b5050565b600054610100900460ff1680610fc15750610fc16126c4565b80610fcf575060005460ff16155b61100a5760405162461bcd60e51b815260040180806020018281038252602e815260200180614294602e913960400191505060405180910390fd5b600054610100900460ff16158015611035576000805460ff1961ff0019909116610100171660011790555b6001600160a01b03841661107a5760405162461bcd60e51b815260040180806020018281038252602281526020018061424c6022913960400191505060405180910390fd5b82518067ffffffffffffffff8111801561109357600080fd5b506040519080825280602002602001820160405280156110bd578160200160208202803683370190505b5080516110d291609891602090910190614183565b5060005b818110156111095760008582815181106110ec57fe5b6020026020010151905061110081836126d5565b506001016110d6565b50611112612800565b61111a6128b1565b611125600019612946565b609780546001600160a01b0319166001600160a01b038716908117909155609a849055604080519182526020820185905280517f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce799281900390910190a1508015610d96576000805461ff001916905550505050565b6000816111a681612981565b6111e5576040805162461bcd60e51b8152602060048201526017602482015260008051602061432a833981519152604482015290519081900360640190fd5b61126a8484856001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d602081101561126157600080fd5b50516000612a3d565b50506001600160a01b039081166000908152609f60209081526040808320949093168252929092529020546001600160c01b031690565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112f257600080fd5b505afa158015611306573d6000803e3d6000fd5b505050506040513d602081101561131c57600080fd5b505190506001600160a01b0381163314611376576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f6f6e6c792d7265736572766560501b604482015290519081900360640190fd5b609b80546000918290559061138a82612a53565b90506113a98582611399612c38565b6001600160a01b03169190612cae565b6040805183815290516001600160a01b038716917f1c71c8e11fd443227c8f8d3dc1a237a3a5e8310b540c7fbcf5169754aedf42c9919081900360200190a2949350505050565b609d5490565b60a0546001600160a01b031681565b6000611410826126af565b90505b919050565b6099546001600160a01b031661142c612623565b6001600160a01b031614611475576040805162461bcd60e51b815260206004820152601c60248201526000805160206143d0833981519152604482015290519081900360640190fd5b8061147f81612981565b6114be576040805162461bcd60e51b8152602060048201526017602482015260008051602061432a833981519152604482015290519081900360640190fd5b826114c857610d96565b609d5483111561151f576040805162461bcd60e51b815260206004820152601d60248201527f5072697a65506f6f6c2f61776172642d657863656564732d617661696c000000604482015290519081900360640190fd5b609d5461152c9084612d00565b609d5561153c8484846000612d62565b60006115488385612e48565b90506115ce8584856001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561159c57600080fd5b505afa1580156115b0573d6000803e3d6000fd5b505050506040513d60208110156115c657600080fd5b505184612a3d565b826001600160a01b0316856001600160a01b03167fe2554529d99ab7a67db6b4cea2b32c7d55ae325f958861e05f304fdded867e31866040518082815260200191505060405180910390a35050505050565b611628612623565b6001600160a01b03166116396119c6565b6001600160a01b031614611682576040805162461bcd60e51b815260206004820181905260248201526000805160206142e3833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b609c5481565b600061141082612981565b60006116ea848484612e80565b949350505050565b6116fa612623565b6001600160a01b031661170b6119c6565b6001600160a01b031614611754576040805162461bcd60e51b815260206004820181905260248201526000805160206142e3833981519152604482015290519081900360640190fd5b61175d81612946565b50565b3361176a81612981565b6117a9576040805162461bcd60e51b8152602060048201526017602482015260008051602061432a833981519152604482015290519081900360640190fd5b6001600160a01b03841615611883576000336001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180757600080fd5b505afa15801561181b573d6000803e3d6000fd5b505050506040513d602081101561183157600080fd5b50519050600061184386338484612ed1565b9050846001600160a01b0316866001600160a01b031614611875576118723361186c8487612d00565b83612f60565b90505b611880863383612fa6565b50505b6001600160a01b038316158015906118ad5750836001600160a01b0316836001600160a01b031614155b15611904576119048333336001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561123757600080fd5b6001600160a01b0384161580159061192657506099546001600160a01b031615155b15610d96576099546040805163b221095760e01b81526001600160a01b0387811660048301528681166024830152604482018690523360648301529151919092169163b221095791608480830192600092919082900301818387803b15801561198e57600080fd5b505af11580156119a2573d6000803e3d6000fd5b5050505050505050565b6000806119ba858585613144565b90969095509350505050565b6033546001600160a01b031690565b6097546001600160a01b031681565b6119ec612623565b6001600160a01b03166119fd6119c6565b6001600160a01b031614611a46576040805162461bcd60e51b815260206004820181905260248201526000805160206142e3833981519152604482015290519081900360640190fd5b61175d816132e2565b6099546001600160a01b031681565b60606098805480602002602001604051908101604052809291908181526020018280548015611ab657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a98575b5050505050905090565b609a5481565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b1757600080fd5b505afa158015611b2b573d6000803e3d6000fd5b505050506040513d6020811015611b4157600080fd5b505190506001600160a01b038116611b5d576000915050611413565b6000816001600160a01b031663010dfa58306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611bac57600080fd5b505afa158015611bc0573d6000803e3d6000fd5b505050506040513d6020811015611bd657600080fd5b5051905080611bea57600092505050611413565b6116ea84826133f5565b600060026065541415611c4e576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655582611c5d81612981565b611c9c576040805162461bcd60e51b8152602060048201526017602482015260008051602061432a833981519152604482015290519081900360640190fd5b600080611caa888789613144565b9150915084821115611ced5760405162461bcd60e51b81526004018080602001828103825260278152602001806143036027913960400191505060405180910390fd5b611cf8888783613416565b856001600160a01b031663631b5dfb611d0f612623565b8a8a6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611d6757600080fd5b505af1158015611d7b573d6000803e3d6000fd5b505050506000611d948389612d0090919063ffffffff16565b90506000611da182612a53565b9050611db08a82611399612c38565b876001600160a01b03168a6001600160a01b0316611dcc612623565b604080518d81526020810186905280820189905290516001600160a01b0392909216917f0271704a58fd2953e49b87d67a0a3ce28a58147de98a5457f60b4686f63850309181900360600190a450506001606555509695505050505050565b82611e3581612981565b611e74576040805162461bcd60e51b8152602060048201526017602482015260008051602061432a833981519152604482015290519081900360640190fd5b611e7c612623565b6001600160a01b0316611e8d6119c6565b6001600160a01b031614611ed6576040805162461bcd60e51b815260206004820181905260248201526000805160206142e3833981519152604482015290519081900360640190fd5b6040805180820182526001600160801b0380851680835286821660208085018281526001600160a01b038b166000818152609e84528890209651875492518716600160801b029087166fffffffffffffffffffffffffffffffff1990931692909217909516179094558451928352928201528083019190915290517ffb0ba2cf86a2b03bcf387753a2192da80a006afa99dd022bb301c78e323bf1b99181900360600190a150505050565b6000610a1b6134d7565b600054610100900460ff1680611fa45750611fa46126c4565b80611fb2575060005460ff16155b611fed5760405162461bcd60e51b815260040180806020018281038252602e815260200180614294602e913960400191505060405180910390fd5b600054610100900460ff16158015612018576000805460ff1961ff0019909116610100171660011790555b612023858585610fa8565b60a080546001600160a01b0319166001600160a01b0384811691909117918290556040519116907fa5670b49a0ee863080ae28858bb5d9bcc1eb0d2a6f4c9c3a8accc43b8f445d2590600090a28015612082576000805461ff00191690555b5050505050565b6001600160a01b03166000908152609e60205260409020546001600160801b0380821692600160801b9092041690565b60026065541415612111576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026065558161212081612981565b61215f576040805162461bcd60e51b8152602060048201526017602482015260008051602061432a833981519152604482015290519081900360640190fd5b8361216981613537565b6121ba576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f657863656564732d6c69717569646974792d63617000604482015290519081900360640190fd5b60006121c4612623565b90506121d287878787612d62565b6121f18130886121e0612c38565b6001600160a01b031692919061355b565b6121fa866135b5565b846001600160a01b0316876001600160a01b0316826001600160a01b03167f6ce569498e0f86f147466ac49211cb2a1ffe06195adb805e383b3f2365109160898860405180838152602001826001600160a01b031681526020019250505060405180910390a4505060016065555050505050565b6000600260655414156122c8576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655560006122d7612518565b905060006122e36134d7565b905060008282116122f55760006122ff565b6122ff8284612d00565b90506000609d548211612313576000612321565b609d54612321908390612d00565b905080156123d357600061233482611ac6565b9050801561238e57609b5461234990826136aa565b609b556123568282612d00565b6040805183815290519193507f5f1703ccfa2730d4245350f228079926a37f26a44ecf6978a7eeafff0af11407919081900360200190a15b609d5461239b90836136aa565b609d556040805183815290517fce2b6e507c7ca1a20ce136810f524eefc19ba4c7e4866eb6cc0cba76e778d4be9181900360200190a1505b609d54945050505050600160655590565b609b5481565b6123f2612623565b6001600160a01b03166124036119c6565b6001600160a01b03161461244c576040805162461bcd60e51b815260206004820181905260248201526000805160206142e3833981519152604482015290519081900360640190fd5b6001600160a01b0381166124915760405162461bcd60e51b81526004018080602001828103825260268152602001806141ff6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610a1b612c38565b60405180604001604052806005815260200164332e342e3560d81b81525081565b600080609b5490506060609880548060200260200160405190810160405280929190818152602001828054801561257857602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161255a575b505083519394506000925050505b8181101561261a5761261083828151811061259d57fe5b60200260200101516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156125dd57600080fd5b505afa1580156125f1573d6000803e3d6000fd5b505050506040513d602081101561260757600080fd5b505185906136aa565b9350600101612586565b50919250505090565b3390565b6000612632836126af565b612683576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b81612690575060006126a8565b6126a46001600160a01b0384168584612cae565b5060015b9392505050565b60a0546001600160a01b039081169116141590565b60006126cf30613704565b15905090565b306001600160a01b0316826001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b15801561271857600080fd5b505afa15801561272c573d6000803e3d6000fd5b505050506040513d602081101561274257600080fd5b50516001600160a01b03161461279f576040805162461bcd60e51b815260206004820152601e60248201527f5072697a65506f6f6c2f746f6b656e2d6374726c722d6d69736d617463680000604482015290519081900360640190fd5b81609882815481106127ad57fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051918416917f460e712b4a5d801d031ed673dea209b73ab854f7ddeb86b6c48082e92c3eee669190a25050565b600054610100900460ff168061281957506128196126c4565b80612827575060005460ff16155b6128625760405162461bcd60e51b815260040180806020018281038252602e815260200180614294602e913960400191505060405180910390fd5b600054610100900460ff1615801561288d576000805460ff1961ff0019909116610100171660011790555b61289561370a565b61289d6137aa565b801561175d576000805461ff001916905550565b600054610100900460ff16806128ca57506128ca6126c4565b806128d8575060005460ff16155b6129135760405162461bcd60e51b815260040180806020018281038252602e815260200180614294602e913960400191505060405180910390fd5b600054610100900460ff1615801561293e576000805460ff1961ff0019909116610100171660011790555b61289d6138a3565b609c8190556040805182815290517f3ff20538222f568f27ff436c0c49dfd3e48d5b8f86533a3f759dc1c7089775ab9181900360200190a150565b6000606060988054806020026020016040519081016040528092919081815260200182805480156129db57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116129bd575b505083519394506000925050505b81811015612a3257846001600160a01b0316838281518110612a0757fe5b60200260200101516001600160a01b03161415612a2a5760019350505050611413565b6001016129e9565b506000949350505050565b610d968484612a4e87878787612ed1565b612fa6565b600080612a5e612c38565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612aaf57600080fd5b505afa158015612ac3573d6000803e3d6000fd5b505050506040513d6020811015612ad957600080fd5b505160a0546040805163852a12e360e01b81526004810188905290519293506001600160a01b039091169163852a12e3916024808201926020929091908290030181600087803b158015612b2c57600080fd5b505af1158015612b40573d6000803e3d6000fd5b505050506040513d6020811015612b5657600080fd5b505115612baa576040805162461bcd60e51b815260206004820152601f60248201527f436f6d706f756e645072697a65506f6f6c2f72656465656d2d6661696c656400604482015290519081900360640190fd5b6000612c2f82846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612bfd57600080fd5b505afa158015612c11573d6000803e3d6000fd5b505050506040513d6020811015612c2757600080fd5b505190612d00565b95945050505050565b60a05460408051636f307dc360e01b815290516000926001600160a01b031691636f307dc3916004808301926020929190829003018186803b158015612c7d57600080fd5b505afa158015612c91573d6000803e3d6000fd5b505050506040513d6020811015612ca757600080fd5b5051905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ad9908490613949565b600082821115612d57576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6099546001600160a01b031615612df157609954604080516304d7f3db60e41b81526001600160a01b038781166004830152602482018790528581166044830152848116606483015291519190921691634d7f3db091608480830192600092919082900301818387803b158015612dd857600080fd5b505af1158015612dec573d6000803e3d6000fd5b505050505b816001600160a01b0316635d7b075885856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561198e57600080fd5b6001600160a01b0382166000908152609e60205260408120546126a8908390612e7b9082906001600160801b03166133f5565b6139fa565b6001600160a01b0383166000908152609e60205260408120548190612eb6908590600160801b90046001600160801b03166133f5565b905080612ec75760009150506126a8565b612c2f8382613a1f565b6001600160a01b038381166000908152609f6020908152604080832093881683529290529081208054829190600160e01b900460ff16612f145760009150612f56565b6000612f21888888613a86565b8254909150612f529088908890612f4d908990612f47906001600160c01b0316876136aa565b906136aa565b612f60565b9250505b5095945050505050565b6001600160a01b0383166000908152609e60205260408120548190612f8f9085906001600160801b03166133f5565b905080831115612f9d578092505b50909392505050565b6001600160a01b038083166000908152609f602090815260408083209387168352929052819020548151606081019092526001600160c01b03169080612feb84613b37565b6001600160801b03168152602001613009613004613b7f565b613b83565b63ffffffff908116825260016020928301526001600160a01b038681166000908152609f84526040808220928a168252918452819020845181549486015195909201516001600160c01b03199094166001600160c01b039092169190911763ffffffff60c01b1916600160c01b94909216939093021760ff60e01b1916600160e01b91151591909102179055818110156130ec576001600160a01b038084169085167f2f92d56910619b38bc29fd8e4ca5e56359edac7a0c086cdcd305fb603fa374916130d68585612d00565b60408051918252519081900360200190a3610d96565b80821015610d96576001600160a01b038084169085167ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf61312d8486612d00565b60408051918252519081900360200190a350505050565b6000806000846001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561319657600080fd5b505afa1580156131aa573d6000803e3d6000fd5b505050506040513d60208110156131c057600080fd5b5051905083811015613212576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f696e737566662d66756e647360501b604482015290519081900360640190fd5b61321f8686836000612a3d565b60006132348661322f8488612d00565b612e48565b6001600160a01b038088166000908152609f60209081526040808320938c16835292905290812054919250906001600160c01b031682116132ab576001600160a01b038088166000908152609f60209081526040808320938c16835292905220546132a8906001600160c01b031683612d00565b90505b60006132b78888612e48565b90508082116132c657816132c8565b805b94506132d48186612d00565b955050505050935093915050565b6001600160a01b03811661333d576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f7072697a6553747261746567792d6e6f742d7a65726f604482015290519081900360640190fd5b61335a6001600160a01b038216600162a1cb1960e01b0319613bc7565b6133ab576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f7072697a6553747261746567792d696e76616c696400604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0383169081179091556040517f7f58dc86bc2e435cb77ca0edb1df55e25f90caf2d6bd866971715437d456a21290600090a250565b6000806134028385613be3565b90506116ea81670de0b6b3a7640000613c3c565b6001600160a01b038083166000908152609f602090815260408083209387168352929052205461345890613453906001600160c01b031683612d00565b613b37565b6001600160a01b038084166000818152609f602090815260408083209489168084529482529182902080546001600160c01b0319166001600160801b0396909616959095179094558051858152905191937ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf92918290030190a3505050565b60a05460408051633af9e66960e01b815230600482015290516000926001600160a01b031691633af9e66991602480830192602092919082900301818787803b15801561352357600080fd5b505af1158015612c91573d6000803e3d6000fd5b600080613542612518565b609c5490915061355282856136aa565b11159392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610d96908590613949565b60a0546135de906001600160a01b0316826135ce612c38565b6001600160a01b03169190613c7e565b60a0546040805163140e25ad60e31b81526004810184905290516001600160a01b039092169163a0712d68916024808201926020929091908290030181600087803b15801561362c57600080fd5b505af1158015613640573d6000803e3d6000fd5b505050506040513d602081101561365657600080fd5b50511561175d576040805162461bcd60e51b815260206004820152601d60248201527f436f6d706f756e645072697a65506f6f6c2f6d696e742d6661696c6564000000604482015290519081900360640190fd5b6000828201838110156126a8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3b151590565b600054610100900460ff168061372357506137236126c4565b80613731575060005460ff16155b61376c5760405162461bcd60e51b815260040180806020018281038252602e815260200180614294602e913960400191505060405180910390fd5b600054610100900460ff1615801561289d576000805460ff1961ff001990911661010017166001179055801561175d576000805461ff001916905550565b600054610100900460ff16806137c357506137c36126c4565b806137d1575060005460ff16155b61380c5760405162461bcd60e51b815260040180806020018281038252602e815260200180614294602e913960400191505060405180910390fd5b600054610100900460ff16158015613837576000805460ff1961ff0019909116610100171660011790555b6000613841612623565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561175d576000805461ff001916905550565b600054610100900460ff16806138bc57506138bc6126c4565b806138ca575060005460ff16155b6139055760405162461bcd60e51b815260040180806020018281038252602e815260200180614294602e913960400191505060405180910390fd5b600054610100900460ff16158015613930576000805460ff1961ff0019909116610100171660011790555b6001606555801561175d576000805461ff001916905550565b606061399e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613d919092919063ffffffff16565b805190915015610ad9578080602001905160208110156139bd57600080fd5b5051610ad95760405162461bcd60e51b815260040180806020018281038252602a815260200180614370602a913960400191505060405180910390fd5b600080613a0984609a546133f5565b905080831115613a17578092505b509092915050565b6000808211613a75576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381613a7e57fe5b049392505050565b6001600160a01b038281166000908152609f60209081526040808320938716835292905290812054600160c01b810463ffffffff1690600160e01b900460ff16613ad45760009150506126a8565b6000613ae882613ae2613b7f565b90612d00565b6001600160a01b0386166000908152609e602052604081205491925090613b20908390600160801b90046001600160801b0316613be3565b9050613b2c85826133f5565b979650505050505050565b6000600160801b8210613b7b5760405162461bcd60e51b81526004018080602001828103825260278152602001806142256027913960400191505060405180910390fd5b5090565b4290565b6000600160201b8210613b7b5760405162461bcd60e51b815260040180806020018281038252602681526020018061434a6026913960400191505060405180910390fd5b6000613bd283613da0565b80156126a857506126a88383613dd3565b600082613bf257506000612d5c565b82820282848281613bff57fe5b04146126a85760405162461bcd60e51b81526004018080602001828103825260218152602001806142c26021913960400191505060405180910390fd5b60006126a883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613df6565b801580613d04575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015613cd657600080fd5b505afa158015613cea573d6000803e3d6000fd5b505050506040513d6020811015613d0057600080fd5b5051155b613d3f5760405162461bcd60e51b815260040180806020018281038252603681526020018061439a6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610ad9908490613949565b60606116ea8484600085613e98565b6000613db3826301ffc9a760e01b613dd3565b80156114105750613dcc826001600160e01b0319613dd3565b1592915050565b6000806000613de28585613fe9565b91509150818015612c2f5750949350505050565b60008183613e825760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613e47578181015183820152602001613e2f565b50505050905090810190601f168015613e745780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613e8e57fe5b0495945050505050565b606082471015613ed95760405162461bcd60e51b815260040180806020018281038252602681526020018061426e6026913960400191505060405180910390fd5b613ee285613704565b613f33576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613f725780518252601f199092019160209182019101613f53565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613fd4576040519150601f19603f3d011682016040523d82523d6000602084013e613fd9565b606091505b5091509150613b2c82828661411d565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b1781529151815160009384939284926060926001600160a01b038a169261753092879282918083835b602083106140715780518252601f199092019160209182019101614052565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146140d2576040519150601f19603f3d011682016040523d82523d6000602084013e6140d7565b606091505b50915091506020815110156140f55760008094509450505050614116565b8181806020019051602081101561410b57600080fd5b505190955093505050505b9250929050565b6060831561412c5750816126a8565b82511561413c5782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315613e47578181015183820152602001613e2f565b8280548282559060005260206000209081019282156141d8579160200282015b828111156141d857825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906141a3565b50613b7b9291505b80821115613b7b5780546001600160a01b03191681556001016141e056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e2031323820626974735072697a65506f6f6c2f7265736572766552656769737472792d6e6f742d7a65726f416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725072697a65506f6f6c2f657869742d6665652d657863656564732d757365722d6d6178696d756d5072697a65506f6f6c2f756e6b6e6f776e2d746f6b656e00000000000000000053616665436173743a2076616c756520646f65736e27742066697420696e20333220626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e63655072697a65506f6f6c2f6f6e6c792d7072697a65537472617465677900000000a2646970667358221220f4393b0623e961cf091e9e8dd7f9daddda87eb68809795b7c73097e3c133f48f64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x1D SWAP1 PUSH2 0x5F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x39 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x6C JUMP JUMPDEST PUSH2 0x4445 DUP1 PUSH2 0x3B2 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH2 0x337 DUP1 PUSH2 0x7B PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x22EC095 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x6A JUMPI DUP1 PUSH4 0xEFC81A8C EQ PUSH2 0x120 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x128 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x137 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x4E PUSH2 0x2B3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x265 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x26A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2DE PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE DUP3 DUP2 MSTORE PUSH2 0x2D8 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x137 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 NUMBER CALLDATACOPY PUSH21 0xE7D34329C512998C2ECABF002FF94A6FFE8FDF0311 EXTCODEHASH PUSH23 0x38531A56F20264736F6C634300060C0033608060405234 DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4425 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x232 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x888C2B6F GT PUSH2 0x130 JUMPI DUP1 PUSH4 0xA7B2CC31 GT PUSH2 0xB8 JUMPI DUP1 PUSH4 0xE6D8A94B GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xE6D8A94B EQ PUSH2 0x956 JUMPI DUP1 PUSH4 0xEDB4E1CF EQ PUSH2 0x95E JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x966 JUMPI DUP1 PUSH4 0xFC0C546A EQ PUSH2 0x98C JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x994 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0xA7B2CC31 EQ PUSH2 0x7C1 JUMPI DUP1 PUSH4 0xB69EF8A8 EQ PUSH2 0x7FE JUMPI DUP1 PUSH4 0xC5871485 EQ PUSH2 0x806 JUMPI DUP1 PUSH4 0xD4A1361D EQ PUSH2 0x8C5 JUMPI DUP1 PUSH4 0xE323F825 EQ PUSH2 0x91A JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x98BF3EB6 GT PUSH2 0xFF JUMPI DUP1 PUSH4 0x98BF3EB6 EQ PUSH2 0x702 JUMPI DUP1 PUSH4 0x9D63848A EQ PUSH2 0x70A JUMPI DUP1 PUSH4 0x9E167519 EQ PUSH2 0x762 JUMPI DUP1 PUSH4 0x9FE32A91 EQ PUSH2 0x76A JUMPI DUP1 PUSH4 0xA016240B EQ PUSH2 0x787 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x888C2B6F EQ PUSH2 0x67D JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x6CC JUMPI DUP1 PUSH4 0x8E71C1F6 EQ PUSH2 0x6D4 JUMPI DUP1 PUSH4 0x91CA480E EQ PUSH2 0x6DC JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x630665B4 GT PUSH2 0x1BE JUMPI DUP1 PUSH4 0x76687D3D GT PUSH2 0x182 JUMPI DUP1 PUSH4 0x76687D3D EQ PUSH2 0x5CA JUMPI DUP1 PUSH4 0x78B3D327 EQ PUSH2 0x5D2 JUMPI DUP1 PUSH4 0x79CB8563 EQ PUSH2 0x5F8 JUMPI DUP1 PUSH4 0x7B99ADB1 EQ PUSH2 0x62A JUMPI DUP1 PUSH4 0x7CBAB1C7 EQ PUSH2 0x647 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x630665B4 EQ PUSH2 0x526 JUMPI DUP1 PUSH4 0x69E527DA EQ PUSH2 0x52E JUMPI DUP1 PUSH4 0x6A3FD4F9 EQ PUSH2 0x552 JUMPI DUP1 PUSH4 0x6B1B863A EQ PUSH2 0x58C JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x5C2 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x2B0AB144 GT PUSH2 0x205 JUMPI DUP1 PUSH4 0x2B0AB144 EQ PUSH2 0x3BB JUMPI DUP1 PUSH4 0x2F7627E3 EQ PUSH2 0x3F1 JUMPI DUP1 PUSH4 0x3EDE50C6 EQ PUSH2 0x41F JUMPI DUP1 PUSH4 0x494DE9F7 EQ PUSH2 0x4D2 JUMPI DUP1 PUSH4 0x52A387AB EQ PUSH2 0x500 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x937EB54 EQ PUSH2 0x237 JUMPI DUP1 PUSH4 0x13F55E39 EQ PUSH2 0x251 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x289 JUMPI DUP1 PUSH4 0x16960D55 EQ PUSH2 0x334 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x23F PUSH2 0xA11 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x267 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xA20 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x317 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x29F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x2D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x2EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x30C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xADE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x34A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x37D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x38F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x3B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xAEF JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x3D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xD9C JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x407 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xE59 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x435 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x45F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x471 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x492 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0xFA8 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x4E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x119A JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x516 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x12A1 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x13F0 JUMP JUMPDEST PUSH2 0x536 PUSH2 0x13F6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x578 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x568 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1405 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x5A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 SWAP1 SWAP2 ADD CALLDATALOAD AND PUSH2 0x1418 JUMP JUMPDEST PUSH2 0x287 PUSH2 0x1620 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x16CC JUMP JUMPDEST PUSH2 0x578 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16D2 JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x60E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x16DD JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x640 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x16F2 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x65D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1760 JUMP JUMPDEST PUSH2 0x6B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x693 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x19AC JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB ADD SWAP1 RETURN JUMPDEST PUSH2 0x536 PUSH2 0x19C6 JUMP JUMPDEST PUSH2 0x536 PUSH2 0x19D5 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x19E4 JUMP JUMPDEST PUSH2 0x536 PUSH2 0x1A4F JUMP JUMPDEST PUSH2 0x712 PUSH2 0x1A5E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x74E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x736 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x23F PUSH2 0x1AC0 JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x780 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1AC6 JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x79D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x1BF4 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x7D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x40 ADD CALLDATALOAD AND PUSH2 0x1E2B JUMP JUMPDEST PUSH2 0x23F PUSH2 0x1F81 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x81C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x846 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x858 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x879 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1F8B JUMP JUMPDEST PUSH2 0x8EB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x8DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2089 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x930 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x20B9 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x226E JUMP JUMPDEST PUSH2 0x23F PUSH2 0x23E4 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x97C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x23EA JUMP JUMPDEST PUSH2 0x536 PUSH2 0x24ED JUMP JUMPDEST PUSH2 0x99C PUSH2 0x24F7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x9D6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x9BE JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xA03 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xA1B PUSH2 0x2518 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xA34 PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xA7D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D0 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xA88 DUP4 DUP4 DUP4 PUSH2 0x2627 JUMP JUMPDEST ISZERO PUSH2 0xAD9 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB0BAC59718CD343C80A813518AFCF36846CFCFE6D56E2B3CAB9BD49F5F9B251C DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0xA85BD01 PUSH1 0xE1 SHL SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xB03 PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xB4C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D0 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xB55 DUP4 PUSH2 0x26AF JUMP JUMPDEST PUSH2 0xBA6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0xBB0 JUMPI PUSH2 0xD96 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xD1D JUMPI DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x42842E0E ADDRESS DUP8 DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0xBD8 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0xC46 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xD15 JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0xC74 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xC79 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH32 0x17E975018310F88872B58D4D8263ADCA83CF5C1893496EA2A86923DAB15276AD DUP2 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xCD9 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xCC1 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD06 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xBB3 JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x69C2DE32BC4D47F488E72626A6CFDEE85089342E52675E7DE79C4B417623960C DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP6 POP SWAP1 SWAP4 POP POP POP POP LOG3 JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xDB0 PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xDF9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D0 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xE04 DUP4 DUP4 DUP4 PUSH2 0x2627 JUMP JUMPDEST ISZERO PUSH2 0xAD9 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC65F48ACA3B7A99B7443D04B8FFBB073156179BC628DC3F7DEF5047748973469 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH2 0xE61 PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE72 PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xEBB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42E3 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF0A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xF1E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xF34 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD GT ISZERO PUSH2 0xFA4 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5C19A95C DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF9F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0xFC1 JUMPI POP PUSH2 0xFC1 PUSH2 0x26C4 JUMP JUMPDEST DUP1 PUSH2 0xFCF JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x100A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4294 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1035 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x107A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x424C PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 MLOAD DUP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x1093 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x10BD JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP1 MLOAD PUSH2 0x10D2 SWAP2 PUSH1 0x98 SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x4183 JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1109 JUMPI PUSH1 0x0 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x10EC JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0x1100 DUP2 DUP4 PUSH2 0x26D5 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x10D6 JUMP JUMPDEST POP PUSH2 0x1112 PUSH2 0x2800 JUMP JUMPDEST PUSH2 0x111A PUSH2 0x28B1 JUMP JUMPDEST PUSH2 0x1125 PUSH1 0x0 NOT PUSH2 0x2946 JUMP JUMPDEST PUSH1 0x97 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x9A DUP5 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP6 SWAP1 MSTORE DUP1 MLOAD PUSH32 0x25FF68DD81B34665B5BA7E553EE5511BF6812E12ADB4A7E2C0D9E26B3099CE79 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 POP DUP1 ISZERO PUSH2 0xD96 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x11A6 DUP2 PUSH2 0x2981 JUMP JUMPDEST PUSH2 0x11E5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x432A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x126A DUP5 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1237 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x124B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1261 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 PUSH2 0x2A3D JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP4 AND DUP3 MSTORE SWAP3 SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1306 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x131C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ PUSH2 0x1376 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F6F6E6C792D72657365727665 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9B DUP1 SLOAD PUSH1 0x0 SWAP2 DUP3 SWAP1 SSTORE SWAP1 PUSH2 0x138A DUP3 PUSH2 0x2A53 JUMP JUMPDEST SWAP1 POP PUSH2 0x13A9 DUP6 DUP3 PUSH2 0x1399 PUSH2 0x2C38 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x2CAE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP2 PUSH32 0x1C71C8E11FD443227C8F8D3DC1A237A3A5E8310B540C7FBCF5169754AEDF42C9 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x9D SLOAD SWAP1 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1410 DUP3 PUSH2 0x26AF JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x142C PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1475 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D0 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x147F DUP2 PUSH2 0x2981 JUMP JUMPDEST PUSH2 0x14BE JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x432A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 PUSH2 0x14C8 JUMPI PUSH2 0xD96 JUMP JUMPDEST PUSH1 0x9D SLOAD DUP4 GT ISZERO PUSH2 0x151F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F61776172642D657863656564732D617661696C000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x152C SWAP1 DUP5 PUSH2 0x2D00 JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH2 0x153C DUP5 DUP5 DUP5 PUSH1 0x0 PUSH2 0x2D62 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1548 DUP4 DUP6 PUSH2 0x2E48 JUMP JUMPDEST SWAP1 POP PUSH2 0x15CE DUP6 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x159C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x15B0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x15C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP5 PUSH2 0x2A3D JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xE2554529D99AB7A67DB6B4CEA2B32C7D55AE325F958861E05F304FDDED867E31 DUP7 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1628 PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1639 PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1682 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42E3 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1410 DUP3 PUSH2 0x2981 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x16EA DUP5 DUP5 DUP5 PUSH2 0x2E80 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x16FA PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x170B PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1754 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42E3 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x175D DUP2 PUSH2 0x2946 JUMP JUMPDEST POP JUMP JUMPDEST CALLER PUSH2 0x176A DUP2 PUSH2 0x2981 JUMP JUMPDEST PUSH2 0x17A9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x432A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO PUSH2 0x1883 JUMPI PUSH1 0x0 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP7 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1807 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x181B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1831 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x1843 DUP7 CALLER DUP5 DUP5 PUSH2 0x2ED1 JUMP JUMPDEST SWAP1 POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1875 JUMPI PUSH2 0x1872 CALLER PUSH2 0x186C DUP5 DUP8 PUSH2 0x2D00 JUMP JUMPDEST DUP4 PUSH2 0x2F60 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x1880 DUP7 CALLER DUP4 PUSH2 0x2FA6 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x18AD JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x1904 JUMPI PUSH2 0x1904 DUP4 CALLER CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1237 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1926 JUMPI POP PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xD96 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP7 SWAP1 MSTORE CALLER PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xB2210957 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x198E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x19A2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x19BA DUP6 DUP6 DUP6 PUSH2 0x3144 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x97 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x19EC PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x19FD PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1A46 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42E3 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x175D DUP2 PUSH2 0x32E2 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1AB6 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1A98 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1B17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B2B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1B41 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1B5D JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x1413 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x10DFA58 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1BAC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1BC0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1BD6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x1BEA JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x1413 JUMP JUMPDEST PUSH2 0x16EA DUP5 DUP3 PUSH2 0x33F5 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x1C4E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP3 PUSH2 0x1C5D DUP2 PUSH2 0x2981 JUMP JUMPDEST PUSH2 0x1C9C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x432A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1CAA DUP9 DUP8 DUP10 PUSH2 0x3144 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0x1CED JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4303 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1CF8 DUP9 DUP8 DUP4 PUSH2 0x3416 JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x631B5DFB PUSH2 0x1D0F PUSH2 0x2623 JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1D67 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D7B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 PUSH2 0x1D94 DUP4 DUP10 PUSH2 0x2D00 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1DA1 DUP3 PUSH2 0x2A53 JUMP JUMPDEST SWAP1 POP PUSH2 0x1DB0 DUP11 DUP3 PUSH2 0x1399 PUSH2 0x2C38 JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1DCC PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP14 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE DUP1 DUP3 ADD DUP10 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x271704A58FD2953E49B87D67A0A3CE28A58147DE98A5457F60B4686F6385030 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH2 0x1E35 DUP2 PUSH2 0x2981 JUMP JUMPDEST PUSH2 0x1E74 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x432A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1E7C PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E8D PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1ED6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42E3 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP6 AND DUP1 DUP4 MSTORE DUP7 DUP3 AND PUSH1 0x20 DUP1 DUP6 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9E DUP5 MSTORE DUP9 SWAP1 KECCAK256 SWAP7 MLOAD DUP8 SLOAD SWAP3 MLOAD DUP8 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP1 DUP8 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP6 AND OR SWAP1 SWAP5 SSTORE DUP5 MLOAD SWAP3 DUP4 MSTORE SWAP3 DUP3 ADD MSTORE DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 MLOAD PUSH32 0xFB0BA2CF86A2B03BCF387753A2192DA80A006AFA99DD022BB301C78E323BF1B9 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA1B PUSH2 0x34D7 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1FA4 JUMPI POP PUSH2 0x1FA4 PUSH2 0x26C4 JUMP JUMPDEST DUP1 PUSH2 0x1FB2 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1FED JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4294 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2018 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2023 DUP6 DUP6 DUP6 PUSH2 0xFA8 JUMP JUMPDEST PUSH1 0xA0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 AND SWAP1 PUSH32 0xA5670B49A0EE863080AE28858BB5D9BCC1EB0D2A6F4C9C3A8ACCC43B8F445D25 SWAP1 PUSH1 0x0 SWAP1 LOG2 DUP1 ISZERO PUSH2 0x2082 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP3 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND SWAP1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x2111 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP2 PUSH2 0x2120 DUP2 PUSH2 0x2981 JUMP JUMPDEST PUSH2 0x215F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x432A DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP4 PUSH2 0x2169 DUP2 PUSH2 0x3537 JUMP JUMPDEST PUSH2 0x21BA JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F657863656564732D6C69717569646974792D63617000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x21C4 PUSH2 0x2623 JUMP JUMPDEST SWAP1 POP PUSH2 0x21D2 DUP8 DUP8 DUP8 DUP8 PUSH2 0x2D62 JUMP JUMPDEST PUSH2 0x21F1 DUP2 ADDRESS DUP9 PUSH2 0x21E0 PUSH2 0x2C38 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 SWAP1 PUSH2 0x355B JUMP JUMPDEST PUSH2 0x21FA DUP7 PUSH2 0x35B5 JUMP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6CE569498E0F86F147466AC49211CB2A1FFE06195ADB805E383B3F2365109160 DUP10 DUP9 PUSH1 0x40 MLOAD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x22C8 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE PUSH1 0x0 PUSH2 0x22D7 PUSH2 0x2518 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x22E3 PUSH2 0x34D7 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 DUP3 GT PUSH2 0x22F5 JUMPI PUSH1 0x0 PUSH2 0x22FF JUMP JUMPDEST PUSH2 0x22FF DUP3 DUP5 PUSH2 0x2D00 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x9D SLOAD DUP3 GT PUSH2 0x2313 JUMPI PUSH1 0x0 PUSH2 0x2321 JUMP JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x2321 SWAP1 DUP4 SWAP1 PUSH2 0x2D00 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x23D3 JUMPI PUSH1 0x0 PUSH2 0x2334 DUP3 PUSH2 0x1AC6 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x238E JUMPI PUSH1 0x9B SLOAD PUSH2 0x2349 SWAP1 DUP3 PUSH2 0x36AA JUMP JUMPDEST PUSH1 0x9B SSTORE PUSH2 0x2356 DUP3 DUP3 PUSH2 0x2D00 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 POP PUSH32 0x5F1703CCFA2730D4245350F228079926A37F26A44ECF6978A7EEAFFF0AF11407 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x239B SWAP1 DUP4 PUSH2 0x36AA JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xCE2B6E507C7CA1A20CE136810F524EEFC19BA4C7E4866EB6CC0CBA76E778D4BE SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH1 0x9D SLOAD SWAP5 POP POP POP POP POP PUSH1 0x1 PUSH1 0x65 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x9B SLOAD DUP2 JUMP JUMPDEST PUSH2 0x23F2 PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2403 PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x244C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42E3 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x2491 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x41FF PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA1B PUSH2 0x2C38 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x9B SLOAD SWAP1 POP PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2578 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x255A JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x261A JUMPI PUSH2 0x2610 DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x259D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x25DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x25F1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2607 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP6 SWAP1 PUSH2 0x36AA JUMP JUMPDEST SWAP4 POP PUSH1 0x1 ADD PUSH2 0x2586 JUMP JUMPDEST POP SWAP2 SWAP3 POP POP POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2632 DUP4 PUSH2 0x26AF JUMP JUMPDEST PUSH2 0x2683 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x2690 JUMPI POP PUSH1 0x0 PUSH2 0x26A8 JUMP JUMPDEST PUSH2 0x26A4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP6 DUP5 PUSH2 0x2CAE JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND SWAP2 AND EQ ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x26CF ADDRESS PUSH2 0x3704 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF77C4791 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2718 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x272C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2742 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x279F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F746F6B656E2D6374726C722D6D69736D617463680000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x98 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x27AD JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 DUP5 AND SWAP2 PUSH32 0x460E712B4A5D801D031ED673DEA209B73AB854F7DDEB86B6C48082E92C3EEE66 SWAP2 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2819 JUMPI POP PUSH2 0x2819 PUSH2 0x26C4 JUMP JUMPDEST DUP1 PUSH2 0x2827 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2862 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4294 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x288D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2895 PUSH2 0x370A JUMP JUMPDEST PUSH2 0x289D PUSH2 0x37AA JUMP JUMPDEST DUP1 ISZERO PUSH2 0x175D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x28CA JUMPI POP PUSH2 0x28CA PUSH2 0x26C4 JUMP JUMPDEST DUP1 PUSH2 0x28D8 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2913 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4294 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x293E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x289D PUSH2 0x38A3 JUMP JUMPDEST PUSH1 0x9C DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3FF20538222F568F27FF436C0C49DFD3E48D5B8F86533A3F759DC1C7089775AB SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x29DB JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x29BD JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2A32 JUMPI DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2A07 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x2A2A JUMPI PUSH1 0x1 SWAP4 POP POP POP POP PUSH2 0x1413 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x29E9 JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xD96 DUP5 DUP5 PUSH2 0x2A4E DUP8 DUP8 DUP8 DUP8 PUSH2 0x2ED1 JUMP JUMPDEST PUSH2 0x2FA6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2A5E PUSH2 0x2C38 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2AAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2AC3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2AD9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x852A12E3 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP9 SWAP1 MSTORE SWAP1 MLOAD SWAP3 SWAP4 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0x852A12E3 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2B2C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2B40 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2B56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO PUSH2 0x2BAA JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6D706F756E645072697A65506F6F6C2F72656465656D2D6661696C656400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2C2F DUP3 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2BFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2C11 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2C27 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 PUSH2 0x2D00 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x6F307DC3 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x6F307DC3 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2C7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2C91 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2CA7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xAD9 SWAP1 DUP5 SWAP1 PUSH2 0x3949 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2D57 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2DF1 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE DUP6 DUP2 AND PUSH1 0x44 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x4D7F3DB0 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2DD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2DEC JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5D7B0758 DUP6 DUP6 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x198E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x26A8 SWAP1 DUP4 SWAP1 PUSH2 0x2E7B SWAP1 DUP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x33F5 JUMP JUMPDEST PUSH2 0x39FA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2EB6 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x33F5 JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x2EC7 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x26A8 JUMP JUMPDEST PUSH2 0x2C2F DUP4 DUP3 PUSH2 0x3A1F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP3 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x2F14 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x2F56 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2F21 DUP9 DUP9 DUP9 PUSH2 0x3A86 JUMP JUMPDEST DUP3 SLOAD SWAP1 SWAP2 POP PUSH2 0x2F52 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x2F4D SWAP1 DUP10 SWAP1 PUSH2 0x2F47 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP8 PUSH2 0x36AA JUMP JUMPDEST SWAP1 PUSH2 0x36AA JUMP JUMPDEST PUSH2 0x2F60 JUMP JUMPDEST SWAP3 POP POP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2F8F SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x33F5 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x2F9D JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE DUP2 SWAP1 KECCAK256 SLOAD DUP2 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 DUP1 PUSH2 0x2FEB DUP5 PUSH2 0x3B37 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x3009 PUSH2 0x3004 PUSH2 0x3B7F JUMP JUMPDEST PUSH2 0x3B83 JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP3 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 DUP11 AND DUP3 MSTORE SWAP2 DUP5 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP5 DUP7 ADD MLOAD SWAP6 SWAP1 SWAP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH4 0xFFFFFFFF PUSH1 0xC0 SHL NOT AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP5 SWAP1 SWAP3 AND SWAP4 SWAP1 SWAP4 MUL OR PUSH1 0xFF PUSH1 0xE0 SHL NOT AND PUSH1 0x1 PUSH1 0xE0 SHL SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE DUP2 DUP2 LT ISZERO PUSH2 0x30EC JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0x2F92D56910619B38BC29FD8E4CA5E56359EDAC7A0C086CDCD305FB603FA37491 PUSH2 0x30D6 DUP6 DUP6 PUSH2 0x2D00 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 PUSH2 0xD96 JUMP JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0xD96 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF PUSH2 0x312D DUP5 DUP7 PUSH2 0x2D00 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3196 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x31AA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x31C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x3212 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F696E737566662D66756E6473 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x321F DUP7 DUP7 DUP4 PUSH1 0x0 PUSH2 0x2A3D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3234 DUP7 PUSH2 0x322F DUP5 DUP9 PUSH2 0x2D00 JUMP JUMPDEST PUSH2 0x2E48 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP3 GT PUSH2 0x32AB JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x32A8 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2D00 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x32B7 DUP9 DUP9 PUSH2 0x2E48 JUMP JUMPDEST SWAP1 POP DUP1 DUP3 GT PUSH2 0x32C6 JUMPI DUP2 PUSH2 0x32C8 JUMP JUMPDEST DUP1 JUMPDEST SWAP5 POP PUSH2 0x32D4 DUP2 DUP7 PUSH2 0x2D00 JUMP JUMPDEST SWAP6 POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x333D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D6E6F742D7A65726F PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x335A PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3BC7 JUMP JUMPDEST PUSH2 0x33AB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D696E76616C696400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x99 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x7F58DC86BC2E435CB77CA0EDB1DF55E25F90CAF2D6BD866971715437D456A212 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3402 DUP4 DUP6 PUSH2 0x3BE3 JUMP JUMPDEST SWAP1 POP PUSH2 0x16EA DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x3C3C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x3458 SWAP1 PUSH2 0x3453 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2D00 JUMP JUMPDEST PUSH2 0x3B37 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x3AF9E669 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x3AF9E669 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3523 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2C91 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3542 PUSH2 0x2518 JUMP JUMPDEST PUSH1 0x9C SLOAD SWAP1 SWAP2 POP PUSH2 0x3552 DUP3 DUP6 PUSH2 0x36AA JUMP JUMPDEST GT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x24 DUP4 ADD MSTORE DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x84 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xD96 SWAP1 DUP6 SWAP1 PUSH2 0x3949 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH2 0x35DE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH2 0x35CE PUSH2 0x2C38 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x3C7E JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x140E25AD PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0xA0712D68 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x362C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3640 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3656 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO PUSH2 0x175D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6D706F756E645072697A65506F6F6C2F6D696E742D6661696C6564000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x26A8 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3723 JUMPI POP PUSH2 0x3723 PUSH2 0x26C4 JUMP JUMPDEST DUP1 PUSH2 0x3731 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x376C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4294 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x289D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x175D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x37C3 JUMPI POP PUSH2 0x37C3 PUSH2 0x26C4 JUMP JUMPDEST DUP1 PUSH2 0x37D1 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x380C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4294 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3837 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x3841 PUSH2 0x2623 JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x175D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x38BC JUMPI POP PUSH2 0x38BC PUSH2 0x26C4 JUMP JUMPDEST DUP1 PUSH2 0x38CA JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3905 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4294 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3930 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x65 SSTORE DUP1 ISZERO PUSH2 0x175D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x399E DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3D91 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xAD9 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x39BD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xAD9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4370 PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3A09 DUP5 PUSH1 0x9A SLOAD PUSH2 0x33F5 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x3A17 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x3A75 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x3A7E JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xC0 SHL DUP2 DIV PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x3AD4 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x26A8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3AE8 DUP3 PUSH2 0x3AE2 PUSH2 0x3B7F JUMP JUMPDEST SWAP1 PUSH2 0x2D00 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x3B20 SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3BE3 JUMP JUMPDEST SWAP1 POP PUSH2 0x3B2C DUP6 DUP3 PUSH2 0x33F5 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x3B7B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4225 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST TIMESTAMP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x20 SHL DUP3 LT PUSH2 0x3B7B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x434A PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3BD2 DUP4 PUSH2 0x3DA0 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x26A8 JUMPI POP PUSH2 0x26A8 DUP4 DUP4 PUSH2 0x3DD3 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3BF2 JUMPI POP PUSH1 0x0 PUSH2 0x2D5C JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x3BFF JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x26A8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42C2 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x26A8 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x3DF6 JUMP JUMPDEST DUP1 ISZERO DUP1 PUSH2 0x3D04 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH4 0x6EB1769F PUSH1 0xE1 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 DUP6 AND SWAP2 PUSH4 0xDD62ED3E SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3CD6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3CEA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3D00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO JUMPDEST PUSH2 0x3D3F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x36 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x439A PUSH1 0x36 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x95EA7B3 PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xAD9 SWAP1 DUP5 SWAP1 PUSH2 0x3949 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x16EA DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x3E98 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3DB3 DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3DD3 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x1410 JUMPI POP PUSH2 0x3DCC DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3DD3 JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x3DE2 DUP6 DUP6 PUSH2 0x3FE9 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x2C2F JUMPI POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x3E82 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3E47 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3E2F JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3E74 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x3E8E JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x3ED9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x426E PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3EE2 DUP6 PUSH2 0x3704 JUMP JUMPDEST PUSH2 0x3F33 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3F72 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3F53 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3FD4 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3FD9 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x3B2C DUP3 DUP3 DUP7 PUSH2 0x411D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x24 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP3 DUP5 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND SWAP3 PUSH2 0x7530 SWAP3 DUP8 SWAP3 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x4071 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x4052 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x40D2 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x40D7 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x40F5 JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x4116 JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x410B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x412C JUMPI POP DUP2 PUSH2 0x26A8 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x413C JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x3E47 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3E2F JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x41D8 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x41D8 JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x41A3 JUMP JUMPDEST POP PUSH2 0x3B7B SWAP3 SWAP2 POP JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x3B7B JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x41E0 JUMP INVALID 0x4F PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F206164647265737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E2031323820626974735072697A65 POP PUSH16 0x6F6C2F72657365727665526567697374 PUSH19 0x792D6E6F742D7A65726F416464726573733A20 PUSH10 0x6E73756666696369656E PUSH21 0x2062616C616E636520666F722063616C6C496E6974 PUSH10 0x616C697A61626C653A20 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 MSTORE8 PUSH2 0x6665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F774F776E61626C653A20 PUSH4 0x616C6C65 PUSH19 0x206973206E6F7420746865206F776E65725072 PUSH10 0x7A65506F6F6C2F657869 PUSH21 0x2D6665652D657863656564732D757365722D6D6178 PUSH10 0x6D756D5072697A65506F PUSH16 0x6C2F756E6B6E6F776E2D746F6B656E00 STOP STOP STOP STOP STOP STOP STOP STOP MSTORE8 PUSH2 0x6665 NUMBER PUSH2 0x7374 GASPRICE KECCAK256 PUSH23 0x616C756520646F65736E27742066697420696E20333220 PUSH3 0x697473 MSTORE8 PUSH2 0x6665 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x7563636565645361666545524332303A20617070 PUSH19 0x6F76652066726F6D206E6F6E2D7A65726F2074 PUSH16 0x206E6F6E2D7A65726F20616C6C6F7761 PUSH15 0x63655072697A65506F6F6C2F6F6E6C PUSH26 0x2D7072697A65537472617465677900000000A264697066735822 SLT KECCAK256 DELEGATECALL CODECOPY EXTCODESIZE MOD 0x23 0xE9 PUSH2 0xCF09 0x1E SWAP15 DUP14 0xD7 0xF9 0xDA 0xDD 0xDA DUP8 0xEB PUSH9 0x809795B7C73097E3C1 CALLER DELEGATECALL DUP16 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "269:596:42:-:0;;;515:67;;;;;;;;;;554:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;543:8:42;:34;;-1:-1:-1;;;;;;543:34:42;-1:-1:-1;;;;;543:34:42;;;;;;;;;;269:596;;;;;;;;;;:::o;:::-;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106100415760003560e01c8063022ec09514610046578063b3eeb5e21461006a578063efc81a8c14610120575b600080fd5b61004e610128565b604080516001600160a01b039092168252519081900360200190f35b61004e6004803603604081101561008057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100ab57600080fd5b8201836020820111156100bd57600080fd5b803590602001918460018302840111640100000000831117156100df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610137945050505050565b61004e6102b3565b6000546001600160a01b031681565b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a18251156102ac576000826001600160a01b0316846040518082805190602001908083835b602083106102035780518252601f1990920191602091820191016101e4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610265576040519150601f19603f3d011682016040523d82523d6000602084013e61026a565b606091505b50509050806102aa5760405162461bcd60e51b81526004018080602001828103825260248152602001806102de6024913960400191505060405180910390fd5b505b5092915050565b6000805460408051602081019091528281526102d8916001600160a01b031690610137565b90509056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a2646970667358221220433774e7d34329c512998c2ecabf002ff94a6ffe8fdf03113f7638531a56f20264736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x22EC095 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x6A JUMPI DUP1 PUSH4 0xEFC81A8C EQ PUSH2 0x120 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x128 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x137 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x4E PUSH2 0x2B3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x265 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x26A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2DE PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE DUP3 DUP2 MSTORE PUSH2 0x2D8 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x137 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 NUMBER CALLDATACOPY PUSH21 0xE7D34329C512998C2ECABF002FF94A6FFE8FDF0311 EXTCODEHASH PUSH23 0x38531A56F20264736F6C634300060C0033000000000000 ",
              "sourceMap": "269:596:42:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;395:33;;;:::i;:::-;;;;-1:-1:-1;;;;;395:33:42;;;;;;;;;;;;;;182:778:38;;;;;;;;;;;;;;;;-1:-1:-1;;;;;182:778:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;182:778:38;;-1:-1:-1;182:778:38;;-1:-1:-1;;;;;182:778:38:i;735:128:42:-;;;:::i;395:33::-;;;-1:-1:-1;;;;;395:33:42;;:::o;182:778:38:-;257:13;416:19;446:6;438:15;;416:37;;495:4;489:11;-1:-1:-1;;;514:5:38;507:81;620:11;613:4;606:5;602:16;595:37;-1:-1:-1;;;657:4:38;650:5;646:16;639:92;764:4;757:5;754:1;747:22;786:28;;;-1:-1:-1;;;;;786:28:38;;;;;;738:31;;-1:-1:-1;786:28:38;;-1:-1:-1;786:28:38;;;;;;;824:12;;:16;821:135;;851:12;868:5;-1:-1:-1;;;;;868:10:38;879:5;868:17;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;868:17:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;850:35;;;901:7;893:56;;;;-1:-1:-1;;;893:56:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;821:135;;182:778;;;;;:::o;735:128:42:-;771:17;843:8;;821:36;;;;;;;;;;;;;;-1:-1:-1;;;;;843:8:42;;821:13;:36::i;:::-;796:62;;735:128;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "164600",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "create()": "infinite",
                "deployMinimal(address,bytes)": "infinite",
                "instance()": "1015"
              }
            },
            "methodIdentifiers": {
              "create()": "efc81a8c",
              "deployMinimal(address,bytes)": "b3eeb5e2",
              "instance()": "022ec095"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"name\":\"ProxyCreated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract CompoundPrizePool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"deployMinimal\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"instance\",\"outputs\":[{\"internalType\":\"contract CompoundPrizePool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"create()\":{\"returns\":{\"_0\":\"A reference to the new proxied Compound Prize Pool\"}}},\"title\":\"Compound Prize Pool Proxy Factory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":\"Initializes the Factory with an instance of the Compound Prize Pool\",\"create()\":{\"notice\":\"Creates a new Compound Prize Pool as a proxy of the template instance\"},\"instance()\":{\"notice\":\"Contract template for deploying proxied Prize Pools\"}},\"notice\":\"Minimal proxy pattern for creating new Compound Prize Pools\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/prize-pool/compound/CompoundPrizePoolProxyFactory.sol\":\"CompoundPrizePoolProxyFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"contracts/external/compound/CTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface CTokenInterface is IERC20Upgradeable {\\n    function decimals() external view returns (uint8);\\n    function totalSupply() external override view returns (uint256);\\n    function underlying() external view returns (address);\\n    function balanceOfUnderlying(address owner) external returns (uint256);\\n    function supplyRatePerBlock() external returns (uint256);\\n    function exchangeRateCurrent() external returns (uint256);\\n    function mint(uint256 mintAmount) external returns (uint256);\\n    function redeem(uint256 amount) external returns (uint256);\\n    function balanceOf(address user) external override view returns (uint256);\\n    function redeemUnderlying(uint256 redeemAmount) external returns (uint256);\\n}\\n\",\"keccak256\":\"0x9608049458bc017f2369e2af2a20bfa2efaff1a5b451a17bd0594a976d5bc88f\",\"license\":\"GPL-3.0\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"},\"contracts/external/openzeppelin/ProxyFactory.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\n// solium-disable security/no-inline-assembly\\n// solium-disable security/no-low-level-calls\\ncontract ProxyFactory {\\n\\n  event ProxyCreated(address proxy);\\n\\n  function deployMinimal(address _logic, bytes memory _data) public returns (address proxy) {\\n    // Adapted from https://github.com/optionality/clone-factory/blob/32782f82dfc5a00d103a7e61a17a5dedbd1e8e9d/contracts/CloneFactory.sol\\n    bytes20 targetBytes = bytes20(_logic);\\n    assembly {\\n      let clone := mload(0x40)\\n      mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n      mstore(add(clone, 0x14), targetBytes)\\n      mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n      proxy := create(0, clone, 0x37)\\n    }\\n\\n    emit ProxyCreated(address(proxy));\\n\\n    if(_data.length > 0) {\\n      (bool success,) = proxy.call(_data);\\n      require(success, \\\"ProxyFactory/constructor-call-failed\\\");\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0xf0422303985796fdd8bdf772ac8e34331e2e63006f657989cca010fa4776d735\"},\"contracts/prize-pool/PrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../external/compound/ICompLike.sol\\\";\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../reserve/ReserveInterface.sol\\\";\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/TokenListenerLibrary.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\nimport \\\"./PrizePoolInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using SafeERC20Upgradeable for IERC721Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    address reserveRegistry,\\n    uint256 maxExitFeeMantissa\\n  );\\n\\n  /// @dev Event emitted when controlled token is added\\n  event ControlledTokenAdded(\\n    ControlledTokenInterface indexed token\\n  );\\n\\n  /// @dev Emitted when reserve is captured.\\n  event ReserveFeeCaptured(\\n    uint256 amount\\n  );\\n\\n  event AwardCaptured(\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when assets are deposited\\n  event Deposited(\\n    address indexed operator,\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount,\\n    address referrer\\n  );\\n\\n  /// @dev Event emitted when interest is awarded to a winner\\n  event Awarded(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are awarded to a winner\\n  event AwardedExternalERC20(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are transferred out\\n  event TransferredExternalERC20(\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC721s are awarded to a winner\\n  event AwardedExternalERC721(\\n    address indexed winner,\\n    address indexed token,\\n    uint256[] tokenIds\\n  );\\n\\n  /// @dev Event emitted when assets are withdrawn instantly\\n  event InstantWithdrawal(\\n    address indexed operator,\\n    address indexed from,\\n    address indexed token,\\n    uint256 amount,\\n    uint256 redeemed,\\n    uint256 exitFee\\n  );\\n\\n  event ReserveWithdrawal(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when the Liquidity Cap is set\\n  event LiquidityCapSet(\\n    uint256 liquidityCap\\n  );\\n\\n  /// @dev Event emitted when the Credit plan is set\\n  event CreditPlanSet(\\n    address token,\\n    uint128 creditLimitMantissa,\\n    uint128 creditRateMantissa\\n  );\\n\\n  /// @dev Event emitted when the Prize Strategy is set\\n  event PrizeStrategySet(\\n    address indexed prizeStrategy\\n  );\\n\\n  /// @dev Emitted when credit is minted\\n  event CreditMinted(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when credit is burned\\n  event CreditBurned(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\\n  event ErrorAwardingExternalERC721(bytes error);\\n\\n\\n  struct CreditPlan {\\n    uint128 creditLimitMantissa;\\n    uint128 creditRateMantissa;\\n  }\\n\\n  struct CreditBalance {\\n    uint192 balance;\\n    uint32 timestamp;\\n    bool initialized;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  /// @dev Reserve to which reserve fees are sent\\n  RegistryInterface public reserveRegistry;\\n\\n  /// @dev An array of all the controlled tokens\\n  ControlledTokenInterface[] internal _tokens;\\n\\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\\n  TokenListenerInterface public prizeStrategy;\\n\\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\\n  /// For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\\n  uint256 public maxExitFeeMantissa;\\n\\n  /// @dev The total funds that have been allocated to the reserve\\n  uint256 public reserveTotalSupply;\\n\\n  /// @dev The total amount of funds that the prize pool can hold.\\n  uint256 public liquidityCap;\\n\\n  /// @dev the The awardable balance\\n  uint256 internal _currentAwardBalance;\\n\\n  /// @dev Stores the credit plan for each token.\\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\\n\\n  /// @dev Stores each users balance of credit per token.\\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\\n\\n  /// @notice Initializes the Prize Pool\\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\\n  /// @param _maxExitFeeMantissa The maximum exit fee size\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_reserveRegistry) != address(0), \\\"PrizePool/reserveRegistry-not-zero\\\");\\n    uint256 controlledTokensLength = _controlledTokens.length;\\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\\n\\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\\n      _addControlledToken(controlledToken, i);\\n    }\\n    __Ownable_init();\\n    __ReentrancyGuard_init();\\n    _setLiquidityCap(uint256(-1));\\n\\n    reserveRegistry = _reserveRegistry;\\n    maxExitFeeMantissa = _maxExitFeeMantissa;\\n\\n    emit Initialized(\\n      address(_reserveRegistry),\\n      maxExitFeeMantissa\\n    );\\n  }\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external override view returns (address) {\\n    return address(_token());\\n  }\\n\\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\\n  /// @return The underlying balance of assets\\n  function balance() external returns (uint256) {\\n    return _balance();\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function canAwardExternal(address _externalToken) external view returns (bool) {\\n    return _canAwardExternal(_externalToken);\\n  }\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    canAddLiquidity(amount)\\n  {\\n    address operator = _msgSender();\\n\\n    _mint(to, amount, controlledToken, referrer);\\n\\n    _token().safeTransferFrom(operator, address(this), amount);\\n    _supply(amount);\\n\\n    emit Deposited(operator, to, controlledToken, amount, referrer);\\n  }\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    returns (uint256)\\n  {\\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n    require(exitFee <= maximumExitFee, \\\"PrizePool/exit-fee-exceeds-user-maximum\\\");\\n\\n    // burn the credit\\n    _burnCredit(from, controlledToken, burnedCredit);\\n\\n    // burn the tickets\\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\\n\\n    // redeem the tickets less the fee\\n    uint256 amountLessFee = amount.sub(exitFee);\\n    uint256 redeemed = _redeem(amountLessFee);\\n\\n    _token().safeTransfer(from, redeemed);\\n\\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\\n\\n    return exitFee;\\n  }\\n\\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\\n  /// @param exitFee The exit fee to check against the limit\\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\\n    if (exitFee > maxFee) {\\n      exitFee = maxFee;\\n    }\\n    return exitFee;\\n  }\\n\\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\\n  /// @param from The address the tokens are being transferred from (0 if minting)\\n  /// @param to The address the tokens are being transferred to (0 if burning)\\n  /// @param amount The amount of tokens being trasferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\\n    if (from != address(0)) {\\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\\n      // first accrue credit for their old balance\\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\\n\\n      if (from != to) {\\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\\n      }\\n\\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\\n    }\\n    if (to != address(0) && to != from) {\\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\\n    }\\n    // if we aren't minting\\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\\n    }\\n  }\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external override view returns (uint256) {\\n    return _currentAwardBalance;\\n  }\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n\\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\\n    uint256 currentBalance = _balance();\\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\\n\\n    if (unaccountedPrizeBalance > 0) {\\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\\n      if (reserveFee > 0) {\\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\\n        emit ReserveFeeCaptured(reserveFee);\\n      }\\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\\n\\n      emit AwardCaptured(unaccountedPrizeBalance);\\n    }\\n\\n    return _currentAwardBalance;\\n  }\\n\\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\\n\\n    uint256 amount = reserveTotalSupply;\\n    reserveTotalSupply = 0;\\n    uint256 redeemed = _redeem(amount);\\n\\n    _token().safeTransfer(address(to), redeemed);\\n\\n    emit ReserveWithdrawal(to, amount);\\n\\n    return redeemed;\\n  }\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external override\\n    onlyPrizeStrategy\\n    onlyControlledToken(controlledToken)\\n  {\\n    if (amount == 0) {\\n      return;\\n    }\\n\\n    require(amount <= _currentAwardBalance, \\\"PrizePool/award-exceeds-avail\\\");\\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\\n\\n    _mint(to, amount, controlledToken, address(0));\\n\\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\\n\\n    emit Awarded(to, controlledToken, amount);\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit TransferredExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit AwardedExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  function _transferOut(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (bool)\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (amount == 0) {\\n      return false;\\n    }\\n\\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\\n\\n    return true;\\n  }\\n\\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\\n  /// @param to The user who is receiving the tokens\\n  /// @param amount The amount of tokens they are receiving\\n  /// @param controlledToken The token that is going to be minted\\n  /// @param referrer The user who referred the minting\\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\\n    if (address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n    ControlledToken(controlledToken).controllerMint(to, amount);\\n  }\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (tokenIds.length == 0) {\\n      return;\\n    }\\n\\n    for (uint256 i = 0; i < tokenIds.length; i++) {\\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\\n\\n      }\\n      catch(bytes memory error){\\n        emit ErrorAwardingExternalERC721(error);\\n      }\\n      \\n    }\\n\\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\\n  }\\n\\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\\n  /// @param amount The prize amount\\n  /// @return The size of the reserve portion of the prize\\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    if (address(reserve) == address(0)) {\\n      return 0;\\n    }\\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\\n    if (reserveRateMantissa == 0) {\\n      return 0;\\n    }\\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\\n  }\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external override\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    )\\n  {\\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n  }\\n\\n  /// @dev Calculates the early exit fee for the given amount\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return Exit fee\\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\\n    return _limitExitFee(\\n      amount,\\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external override\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    durationSeconds =_estimateCreditAccrualTime(\\n      _controlledToken,\\n      _principal,\\n      _interest\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function _estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    internal\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    // interest = credit rate * principal * time\\n    // => time = interest / (credit rate * principal)\\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\\n    if (accruedPerSecond == 0) {\\n      return 0;\\n    }\\n    return _interest.div(accruedPerSecond);\\n  }\\n\\n  /// @notice Burns a users credit.\\n  /// @param user The user whose credit should be burned\\n  /// @param credit The amount of credit to burn\\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\\n\\n    emit CreditBurned(user, controlledToken, credit);\\n  }\\n\\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\\n  /// @param user The user for whom to accrue credit\\n  /// @param controlledToken The controlled token whose balance we are checking\\n  /// @param controlledTokenBalance The balance to use for the user\\n  /// @param extra Additional credit to be added\\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\\n    _updateCreditBalance(\\n      user,\\n      controlledToken,\\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\\n    );\\n  }\\n\\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\\n    uint256 newBalance;\\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\\n    if (!creditBalance.initialized) {\\n      newBalance = 0;\\n    } else {\\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\\n    }\\n    return newBalance;\\n  }\\n\\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\\n\\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\\n      balance: newBalance.toUint128(),\\n      timestamp: _currentTime().toUint32(),\\n      initialized: true\\n    });\\n\\n    if (oldBalance < newBalance) {\\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\\n    } \\n    else if (newBalance < oldBalance) {\\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\\n    }\\n  }\\n\\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\\n  /// @param creditBalance The new credit balance to be checked\\n  /// @return The users new credit balance.  Will not exceed the credit limit.\\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\\n      controlledTokenBalance,\\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\\n    );\\n    if (creditBalance > creditLimit) {\\n      creditBalance = creditLimit;\\n    }\\n\\n    return creditBalance;\\n  }\\n\\n  /// @notice Calculates the accrued interest for a user\\n  /// @param user The user whose credit should be calculated.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\\n  /// @return The credit that has accrued since the last credit update.\\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\\n\\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\\n      return 0;\\n    }\\n\\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\\n  }\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\\n    return _tokenCreditBalances[controlledToken][user].balance;\\n  }\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external override\\n    onlyControlledToken(_controlledToken)\\n    onlyOwner\\n  {\\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\\n      creditLimitMantissa: _creditLimitMantissa,\\n      creditRateMantissa: _creditRateMantissa\\n    });\\n\\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\\n  }\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external override\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    )\\n  {\\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\\n  }\\n\\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The token they are withdrawing\\n  /// @param amount The amount of funds they are withdrawing\\n  /// @return earlyExitFee The additional exit fee that should be charged.\\n  /// @return creditBurned The amount of credit that will be burned\\n  function _calculateEarlyExitFeeLessBurnedCredit(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (\\n      uint256 earlyExitFee,\\n      uint256 creditBurned\\n    )\\n  {\\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\\n    require(controlledTokenBalance >= amount, \\\"PrizePool/insuff-funds\\\");\\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\\n    /*\\n    The credit is used *last*.  Always charge the fees up-front.\\n\\n    How to calculate:\\n\\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\\n\\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\\n    */\\n\\n    // Determine available usable credit based on withdraw amount\\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\\n\\n    uint256 availableCredit;\\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\\n    }\\n\\n    // Determine amount of credit to burn and amount of fees required\\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\\n    earlyExitFee = totalExitFee.sub(creditBurned);\\n  }\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\\n    _setLiquidityCap(_liquidityCap);\\n  }\\n\\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\\n    liquidityCap = _liquidityCap;\\n    emit LiquidityCapSet(_liquidityCap);\\n  }\\n\\n  /// @notice Adds a new controlled token\\n  /// @param _controlledToken The controlled token to add.\\n  /// @param index The index to add the controlledToken\\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\\n    require(_controlledToken.controller() == this, \\\"PrizePool/token-ctrlr-mismatch\\\");\\n    \\n    _tokens[index] = _controlledToken;\\n    emit ControlledTokenAdded(_controlledToken);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\\n    _setPrizeStrategy(_prizeStrategy);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\\n    require(address(_prizeStrategy) != address(0), \\\"PrizePool/prizeStrategy-not-zero\\\");\\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PrizePool/prizeStrategy-invalid\\\");\\n    prizeStrategy = _prizeStrategy;\\n\\n    emit PrizeStrategySet(address(_prizeStrategy));\\n  }\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\\n    return _tokens;\\n  }\\n\\n  /// @dev Gets the current time as represented by the current block\\n  /// @return The timestamp of the current block\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external override view returns (uint256) {\\n    return _tokenTotalSupply();\\n  }\\n\\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\\n  /// @param to The address to delegate to \\n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\\n    if (compLike.balanceOf(address(this)) > 0) {\\n      compLike.delegate(to);\\n    }\\n  }\\n  \\n  /// @notice Required for ERC721 safe token transfers from smart contracts.\\n  /// @param operator The address that acts on behalf of the owner\\n  /// @param from The current owner of the NFT\\n  /// @param tokenId The NFT to transfer\\n  /// @param data Additional data with no specified format, sent in call to `_to`.\\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function _tokenTotalSupply() internal view returns (uint256) {\\n    uint256 total = reserveTotalSupply;\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \\n    uint256 tokensLength = tokens.length;\\n    \\n    for(uint256 i = 0; i < tokensLength; i++){\\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\\n    }\\n\\n    return total;\\n  }\\n\\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\\n  }\\n\\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\\n    uint256 tokensLength = tokens.length;\\n\\n    for(uint256 i = 0; i < tokensLength; i++) {\\n      if(tokens[i] == controlledToken) return true;\\n    }\\n    return false;\\n  }\\n  \\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\\n    return _isControlled(controlledToken);\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function _token() internal virtual view returns (IERC20Upgradeable);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal virtual returns (uint256);\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal virtual;\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\\n\\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  modifier onlyControlledToken(address controlledToken) {\\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \\\"PrizePool/unknown-token\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure caller is the prize-strategy\\n  modifier onlyPrizeStrategy() {\\n    require(_msgSender() == address(prizeStrategy), \\\"PrizePool/only-prizeStrategy\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\\n  modifier canAddLiquidity(uint256 _amount) {\\n    require(_canAddLiquidity(_amount), \\\"PrizePool/exceeds-liquidity-cap\\\");\\n    _;\\n  }\\n\\n  modifier onlyReserve() {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    require(address(reserve) == msg.sender, \\\"PrizePool/only-reserve\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x386ebc1c80ab4424f14125e716dd12641ff933b475bf1082b7b1a6eee4a969c3\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/compound/CompoundPrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../../external/compound/CTokenInterface.sol\\\";\\nimport \\\"../PrizePool.sol\\\";\\n\\n/// @title Prize Pool with Compound's cToken\\n/// @notice Manages depositing and withdrawing assets from the Prize Pool\\ncontract CompoundPrizePool is PrizePool {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n\\n  event CompoundPrizePoolInitialized(address indexed cToken);\\n\\n  /// @notice Interface for the Yield-bearing cToken by Compound\\n  CTokenInterface public cToken;\\n\\n  /// @notice Initializes the Prize Pool and Yield Service with the required contract connections\\n  /// @param _controlledTokens Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\\n  /// @param _maxExitFeeMantissa The maximum exit fee size, relative to the withdrawal amount\\n  /// @param _cToken Address of the Compound cToken interface\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa,\\n    CTokenInterface _cToken\\n  )\\n    public\\n    initializer\\n  {\\n    PrizePool.initialize(\\n      _reserveRegistry,\\n      _controlledTokens,\\n      _maxExitFeeMantissa\\n    );\\n    cToken = _cToken;\\n\\n    emit CompoundPrizePoolInitialized(address(cToken));\\n  }\\n\\n  /// @dev Gets the balance of the underlying assets held by the Yield Service\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal override returns (uint256) {\\n    return cToken.balanceOfUnderlying(address(this));\\n  }\\n\\n  /// @dev Allows a user to supply asset tokens in exchange for yield-bearing tokens\\n  /// to be held in escrow by the Yield Service\\n  /// @param amount The amount of asset tokens to be supplied\\n  function _supply(uint256 amount) internal override {\\n    _token().safeApprove(address(cToken), amount);\\n    require(cToken.mint(amount) == 0, \\\"CompoundPrizePool/mint-failed\\\");\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as a prize enhancement\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal override view returns (bool) {\\n    return _externalToken != address(cToken);\\n  }\\n\\n  /// @dev Allows a user to redeem yield-bearing tokens in exchange for the underlying\\n  /// asset tokens held in escrow by the Yield Service\\n  /// @param amount The amount of underlying tokens to be redeemed\\n  /// @return The actual amount of tokens transferred\\n  function _redeem(uint256 amount) internal override returns (uint256) {\\n    IERC20Upgradeable assetToken = _token();\\n    uint256 before = assetToken.balanceOf(address(this));\\n    require(cToken.redeemUnderlying(amount) == 0, \\\"CompoundPrizePool/redeem-failed\\\");\\n    uint256 diff = assetToken.balanceOf(address(this)).sub(before);\\n    return diff;\\n  }\\n\\n  /// @dev Gets the underlying asset token used by the Yield Service\\n  /// @return A reference to the interface of the underling asset token\\n  function _token() internal override view returns (IERC20Upgradeable) {\\n    return IERC20Upgradeable(cToken.underlying());\\n  }\\n}\\n\",\"keccak256\":\"0x094f4926923fad2a264e41f6eaabc161dc9969a6db6dbf3a170c266d27162ab6\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/compound/CompoundPrizePoolProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./CompoundPrizePool.sol\\\";\\nimport \\\"../../external/openzeppelin/ProxyFactory.sol\\\";\\n\\n/// @title Compound Prize Pool Proxy Factory\\n/// @notice Minimal proxy pattern for creating new Compound Prize Pools\\ncontract CompoundPrizePoolProxyFactory is ProxyFactory {\\n\\n  /// @notice Contract template for deploying proxied Prize Pools\\n  CompoundPrizePool public instance;\\n\\n  /// @notice Initializes the Factory with an instance of the Compound Prize Pool\\n  constructor () public {\\n    instance = new CompoundPrizePool();\\n  }\\n\\n  /// @notice Creates a new Compound Prize Pool as a proxy of the template instance\\n  /// @return A reference to the new proxied Compound Prize Pool\\n  function create() external returns (CompoundPrizePool) {\\n    return CompoundPrizePool(deployMinimal(address(instance), \\\"\\\"));\\n  }\\n}\\n\",\"keccak256\":\"0xc78bee7f6a01f062e82e3304e52ab3d9dcbad9adfeea46489ee84883e126ccbd\",\"license\":\"GPL-3.0\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 9126,
                "contract": "contracts/prize-pool/compound/CompoundPrizePoolProxyFactory.sol:CompoundPrizePoolProxyFactory",
                "label": "instance",
                "offset": 0,
                "slot": "0",
                "type": "t_contract(CompoundPrizePool)9116"
              }
            ],
            "types": {
              "t_contract(CompoundPrizePool)9116": {
                "encoding": "inplace",
                "label": "contract CompoundPrizePool",
                "numberOfBytes": "20"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "constructor": "Initializes the Factory with an instance of the Compound Prize Pool",
              "create()": {
                "notice": "Creates a new Compound Prize Pool as a proxy of the template instance"
              },
              "instance()": {
                "notice": "Contract template for deploying proxied Prize Pools"
              }
            },
            "notice": "Minimal proxy pattern for creating new Compound Prize Pools",
            "version": 1
          }
        }
      },
      "contracts/prize-pool/stake/StakePrizePool.sol": {
        "StakePrizePool": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "AwardCaptured",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "Awarded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "AwardedExternalERC20",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256[]",
                  "name": "tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "AwardedExternalERC721",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract ControlledTokenInterface",
                  "name": "token",
                  "type": "address"
                }
              ],
              "name": "ControlledTokenAdded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "CreditBurned",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "CreditMinted",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint128",
                  "name": "creditLimitMantissa",
                  "type": "uint128"
                },
                {
                  "indexed": false,
                  "internalType": "uint128",
                  "name": "creditRateMantissa",
                  "type": "uint128"
                }
              ],
              "name": "CreditPlanSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "referrer",
                  "type": "address"
                }
              ],
              "name": "Deposited",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "bytes",
                  "name": "error",
                  "type": "bytes"
                }
              ],
              "name": "ErrorAwardingExternalERC721",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "reserveRegistry",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "maxExitFeeMantissa",
                  "type": "uint256"
                }
              ],
              "name": "Initialized",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "redeemed",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "exitFee",
                  "type": "uint256"
                }
              ],
              "name": "InstantWithdrawal",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "liquidityCap",
                  "type": "uint256"
                }
              ],
              "name": "LiquidityCapSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "prizeStrategy",
                  "type": "address"
                }
              ],
              "name": "PrizeStrategySet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "ReserveFeeCaptured",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "ReserveWithdrawal",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "stakeToken",
                  "type": "address"
                }
              ],
              "name": "StakePrizePoolInitialized",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "TransferredExternalERC20",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "VERSION",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "accountedBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "awardBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "awardExternalERC20",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256[]",
                  "name": "tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "awardExternalERC721",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "balance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "balanceOfCredit",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "beforeTokenTransfer",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "calculateEarlyExitFee",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "exitFee",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "burnedCredit",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "calculateReserveFee",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_externalToken",
                  "type": "address"
                }
              ],
              "name": "canAwardExternal",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "captureAwardBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract ICompLike",
                  "name": "compLike",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                }
              ],
              "name": "compLikeDelegate",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "creditPlanOf",
              "outputs": [
                {
                  "internalType": "uint128",
                  "name": "creditLimitMantissa",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "creditRateMantissa",
                  "type": "uint128"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "referrer",
                  "type": "address"
                }
              ],
              "name": "depositTo",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_principal",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "_interest",
                  "type": "uint256"
                }
              ],
              "name": "estimateCreditAccrualTime",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "durationSeconds",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "_reserveRegistry",
                  "type": "address"
                },
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "_controlledTokens",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256",
                  "name": "_maxExitFeeMantissa",
                  "type": "uint256"
                }
              ],
              "name": "initialize",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "_reserveRegistry",
                  "type": "address"
                },
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "_controlledTokens",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256",
                  "name": "_maxExitFeeMantissa",
                  "type": "uint256"
                },
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_stakeToken",
                  "type": "address"
                }
              ],
              "name": "initialize",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract ControlledTokenInterface",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "isControlled",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "liquidityCap",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "maxExitFeeMantissa",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "onERC721Received",
              "outputs": [
                {
                  "internalType": "bytes4",
                  "name": "",
                  "type": "bytes4"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizeStrategy",
              "outputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "renounceOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "reserveRegistry",
              "outputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "reserveTotalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint128",
                  "name": "_creditRateMantissa",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "_creditLimitMantissa",
                  "type": "uint128"
                }
              ],
              "name": "setCreditPlanOf",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_liquidityCap",
                  "type": "uint256"
                }
              ],
              "name": "setLiquidityCap",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "_prizeStrategy",
                  "type": "address"
                }
              ],
              "name": "setPrizeStrategy",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "token",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "tokens",
              "outputs": [
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "",
                  "type": "address[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transferExternalERC20",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "maximumExitFee",
                  "type": "uint256"
                }
              ],
              "name": "withdrawInstantlyFrom",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                }
              ],
              "name": "withdrawReserve",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "accountedBalance()": {
                "returns": {
                  "_0": "The current total of all tokens"
                }
              },
              "award(address,uint256,address)": {
                "details": "The amount awarded must be less than the awardBalance()",
                "params": {
                  "amount": "The amount of assets to be awarded",
                  "controlledToken": "The address of the asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "awardBalance()": {
                "details": "captureAwardBalance() should be called first",
                "returns": {
                  "_0": "The total amount of assets to be awarded for the current prize"
                }
              },
              "awardExternalERC20(address,address,uint256)": {
                "details": "Used to award any arbitrary tokens held by the Prize Pool",
                "params": {
                  "amount": "The amount of external assets to be awarded",
                  "externalToken": "The address of the external asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "awardExternalERC721(address,address,uint256[])": {
                "details": "Used to award any arbitrary NFTs held by the Prize Pool",
                "params": {
                  "externalToken": "The address of the external NFT token being awarded",
                  "to": "The address of the winner that receives the award",
                  "tokenIds": "An array of NFT Token IDs to be transferred"
                }
              },
              "balance()": {
                "details": "Returns the total underlying balance of all assets. This includes both principal and interest.",
                "returns": {
                  "_0": "The underlying balance of assets"
                }
              },
              "balanceOfCredit(address,address)": {
                "params": {
                  "user": "The user whose credit balance should be returned"
                },
                "returns": {
                  "_0": "The balance of the users credit"
                }
              },
              "beforeTokenTransfer(address,address,uint256)": {
                "params": {
                  "amount": "The amount of tokens being trasferred",
                  "from": "The address the tokens are being transferred from (0 if minting)",
                  "to": "The address the tokens are being transferred to (0 if burning)"
                }
              },
              "calculateEarlyExitFee(address,address,uint256)": {
                "params": {
                  "amount": "The amount of collateral to be withdrawn",
                  "controlledToken": "The type of collateral being withdrawn",
                  "from": "The user who is withdrawing"
                },
                "returns": {
                  "burnedCredit": "The user's credit that was burned",
                  "exitFee": "The exit fee"
                }
              },
              "calculateReserveFee(uint256)": {
                "params": {
                  "amount": "The prize amount"
                },
                "returns": {
                  "_0": "The size of the reserve portion of the prize"
                }
              },
              "canAwardExternal(address)": {
                "details": "Checks with the Prize Pool if a specific token type may be awarded as an external prize",
                "params": {
                  "_externalToken": "The address of the token to check"
                },
                "returns": {
                  "_0": "True if the token may be awarded, false otherwise"
                }
              },
              "captureAwardBalance()": {
                "details": "This function also captures the reserve fees.",
                "returns": {
                  "_0": "The total amount of assets to be awarded for the current prize"
                }
              },
              "compLikeDelegate(address,address)": {
                "params": {
                  "compLike": "The COMP-like token held by the prize pool that should be delegated",
                  "to": "The address to delegate to "
                }
              },
              "creditPlanOf(address)": {
                "params": {
                  "controlledToken": "The controlled token to retrieve the credit rates for"
                },
                "returns": {
                  "creditLimitMantissa": "The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.",
                  "creditRateMantissa": "The credit rate. This is the amount of tokens that accrue per second."
                }
              },
              "depositTo(address,uint256,address,address)": {
                "params": {
                  "amount": "The amount of assets to deposit",
                  "controlledToken": "The address of the type of token the user is minting",
                  "referrer": "The referrer of the deposit",
                  "to": "The address receiving the newly minted tokens"
                }
              },
              "estimateCreditAccrualTime(address,uint256,uint256)": {
                "params": {
                  "_interest": "The amount of interest that must accrue",
                  "_principal": "The principal amount on which interest is accruing"
                },
                "returns": {
                  "durationSeconds": "The duration of time it will take to accrue the given amount of interest, in seconds."
                }
              },
              "initialize(address,address[],uint256)": {
                "params": {
                  "_controlledTokens": "Array of ControlledTokens that are controlled by this Prize Pool.",
                  "_maxExitFeeMantissa": "The maximum exit fee size"
                }
              },
              "initialize(address,address[],uint256,address)": {
                "params": {
                  "_controlledTokens": "Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool",
                  "_maxExitFeeMantissa": "The maximum exit fee size, relative to the withdrawal amount",
                  "_stakeToken": "Address of the stake token"
                }
              },
              "isControlled(address)": {
                "details": "Checks if a specific token is controlled by the Prize Pool",
                "params": {
                  "controlledToken": "The address of the token to check"
                },
                "returns": {
                  "_0": "True if the token is a controlled token, false otherwise"
                }
              },
              "onERC721Received(address,address,uint256,bytes)": {
                "params": {
                  "data": "Additional data with no specified format, sent in call to `_to`.",
                  "from": "The current owner of the NFT",
                  "operator": "The address that acts on behalf of the owner",
                  "tokenId": "The NFT to transfer"
                }
              },
              "owner()": {
                "details": "Returns the address of the current owner."
              },
              "renounceOwnership()": {
                "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
              },
              "setCreditPlanOf(address,uint128,uint128)": {
                "params": {
                  "_controlledToken": "The controlled token for whom to set the credit plan",
                  "_creditLimitMantissa": "The credit limit to set.  Is a fixed point 18 decimal (like Ether).",
                  "_creditRateMantissa": "The credit rate to set.  Is a fixed point 18 decimal (like Ether)."
                }
              },
              "setLiquidityCap(uint256)": {
                "params": {
                  "_liquidityCap": "The new liquidity cap for the prize pool"
                }
              },
              "setPrizeStrategy(address)": {
                "params": {
                  "_prizeStrategy": "The new prize strategy"
                }
              },
              "token()": {
                "details": "Returns the address of the underlying ERC20 asset",
                "returns": {
                  "_0": "The address of the asset"
                }
              },
              "tokens()": {
                "returns": {
                  "_0": "An array of controlled token addresses"
                }
              },
              "transferExternalERC20(address,address,uint256)": {
                "details": "Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.",
                "params": {
                  "amount": "The amount of external assets to be awarded",
                  "externalToken": "The address of the external asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "transferOwnership(address)": {
                "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
              },
              "withdrawInstantlyFrom(address,uint256,address,uint256)": {
                "params": {
                  "amount": "The amount of tokens to redeem for assets.",
                  "controlledToken": "The address of the token to redeem (i.e. ticket or sponsorship)",
                  "from": "The address to redeem tokens from.",
                  "maximumExitFee": "The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn."
                },
                "returns": {
                  "_0": "The actual exit fee paid"
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50614011806100206000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c8063888c2b6f11610130578063a7b2cc31116100b8578063e6d8a94b1161007c578063e6d8a94b14610943578063edb4e1cf1461094b578063f2fde38b14610953578063fc0c546a14610979578063ffa1ad741461098157610227565b8063a7b2cc31146107ae578063b69ef8a8146107eb578063c5871485146107f3578063d4a1361d146108b2578063e323f8251461090757610227565b806398bf3eb6116100ff57806398bf3eb6146106ef5780639d63848a146106f75780639e1675191461074f5780639fe32a9114610757578063a016240b1461077457610227565b8063888c2b6f1461064e5780638da5cb5b1461069d5780638e71c1f6146106c157806391ca480e146106c957610227565b8063630665b4116101b357806376687d3d1161018257806376687d3d1461059b57806378b3d327146105a357806379cb8563146105c95780637b99adb1146105fb5780637cbab1c71461061857610227565b8063630665b41461051b5780636a3fd4f9146105235780636b1b863a1461055d578063715018a61461059357610227565b80632b0ab144116101fa5780632b0ab144146103b05780632f7627e3146103e65780633ede50c614610414578063494de9f7146104c757806352a387ab146104f557610227565b80630937eb541461022c57806313f55e3914610246578063150b7a021461027e57806316960d5514610329575b600080fd5b6102346109fe565b60408051918252519081900360200190f35b61027c6004803603606081101561025c57600080fd5b506001600160a01b03813581169160208101359091169060400135610a0d565b005b61030c6004803603608081101561029457600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156102ce57600080fd5b8201836020820111156102e057600080fd5b803590602001918460018302840111600160201b8311171561030157600080fd5b509092509050610acb565b604080516001600160e01b03199092168252519081900360200190f35b61027c6004803603606081101561033f57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561037257600080fd5b82018360208201111561038457600080fd5b803590602001918460208302840111600160201b831117156103a557600080fd5b509092509050610adc565b61027c600480360360608110156103c657600080fd5b506001600160a01b03813581169160208101359091169060400135610d89565b61027c600480360360408110156103fc57600080fd5b506001600160a01b0381358116916020013516610e46565b61027c6004803603606081101561042a57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561045457600080fd5b82018360208201111561046657600080fd5b803590602001918460208302840111600160201b8311171561048757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250610f95915050565b610234600480360360408110156104dd57600080fd5b506001600160a01b0381358116916020013516611187565b6102346004803603602081101561050b57600080fd5b50356001600160a01b031661128e565b6102346113dd565b6105496004803603602081101561053957600080fd5b50356001600160a01b03166113e3565b604080519115158252519081900360200190f35b61027c6004803603606081101561057357600080fd5b506001600160a01b038135811691602081013591604090910135166113f6565b61027c6115fe565b6102346116aa565b610549600480360360208110156105b957600080fd5b50356001600160a01b03166116b0565b610234600480360360608110156105df57600080fd5b506001600160a01b0381351690602081013590604001356116bb565b61027c6004803603602081101561061157600080fd5b50356116d0565b61027c6004803603606081101561062e57600080fd5b506001600160a01b0381358116916020810135909116906040013561173e565b6106846004803603606081101561066457600080fd5b506001600160a01b0381358116916020810135909116906040013561198a565b6040805192835260208301919091528051918290030190f35b6106a56119a4565b604080516001600160a01b039092168252519081900360200190f35b6106a56119b3565b61027c600480360360208110156106df57600080fd5b50356001600160a01b03166119c2565b6106a5611a2d565b6106ff611a3c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561073b578181015183820152602001610723565b505050509050019250505060405180910390f35b610234611a9e565b6102346004803603602081101561076d57600080fd5b5035611aa4565b6102346004803603608081101561078a57600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611bd2565b61027c600480360360608110156107c457600080fd5b506001600160a01b03813516906001600160801b0360208201358116916040013516611e09565b610234611f5f565b61027c6004803603608081101561080957600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561083357600080fd5b82018360208201111561084557600080fd5b803590602001918460208302840111600160201b8311171561086657600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602001356001600160a01b0316611f69565b6108d8600480360360208110156108c857600080fd5b50356001600160a01b03166120ac565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b61027c6004803603608081101561091d57600080fd5b506001600160a01b038135811691602081013591604082013581169160600135166120dc565b610234612291565b610234612407565b61027c6004803603602081101561096957600080fd5b50356001600160a01b031661240d565b6106a5612510565b61098961251a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156109c35781810151838201526020016109ab565b50505050905090810190601f1680156109f05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610a0861253b565b905090565b6099546001600160a01b0316610a21612646565b6001600160a01b031614610a6a576040805162461bcd60e51b815260206004820152601c6024820152600080516020613fbc833981519152604482015290519081900360640190fd5b610a7583838361264a565b15610ac657816001600160a01b0316836001600160a01b03167fb0bac59718cd343c80a813518afcf36846cfcfe6d56e2b3cab9bd49f5f9b251c836040518082815260200191505060405180910390a35b505050565b630a85bd0160e11b95945050505050565b6099546001600160a01b0316610af0612646565b6001600160a01b031614610b39576040805162461bcd60e51b815260206004820152601c6024820152600080516020613fbc833981519152604482015290519081900360640190fd5b610b42836126d2565b610b93576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b80610b9d57610d83565b60005b81811015610d0a57836001600160a01b03166342842e0e3087868686818110610bc557fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610c2257600080fd5b505af1925050508015610c33575060015b610d02573d808015610c61576040519150601f19603f3d011682016040523d82523d6000602084013e610c66565b606091505b507f17e975018310f88872b58d4d8263adca83cf5c1893496ea2a86923dab15276ad816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610cc6578181015183820152602001610cae565b50505050905090810190601f168015610cf35780820380516001836020036101000a031916815260200191505b509250505060405180910390a1505b600101610ba0565b50826001600160a01b0316846001600160a01b03167f69c2de32bc4d47f488e72626a6cfdee85089342e52675e7de79c4b417623960c848460405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a35b50505050565b6099546001600160a01b0316610d9d612646565b6001600160a01b031614610de6576040805162461bcd60e51b815260206004820152601c6024820152600080516020613fbc833981519152604482015290519081900360640190fd5b610df183838361264a565b15610ac657816001600160a01b0316836001600160a01b03167fc65f48aca3b7a99b7443d04b8ffbb073156179bc628dc3f7def5047748973469836040518082815260200191505060405180910390a3505050565b610e4e612646565b6001600160a01b0316610e5f6119a4565b6001600160a01b031614610ea8576040805162461bcd60e51b81526020600482018190526024820152600080516020613eda833981519152604482015290519081900360640190fd5b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610ef757600080fd5b505afa158015610f0b573d6000803e3d6000fd5b505050506040513d6020811015610f2157600080fd5b50511115610f9157816001600160a01b0316635c19a95c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015610f7857600080fd5b505af1158015610f8c573d6000803e3d6000fd5b505050505b5050565b600054610100900460ff1680610fae5750610fae6126e7565b80610fbc575060005460ff16155b610ff75760405162461bcd60e51b815260040180806020018281038252602e815260200180613e8b602e913960400191505060405180910390fd5b600054610100900460ff16158015611022576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0384166110675760405162461bcd60e51b8152600401808060200182810382526022815260200180613e436022913960400191505060405180910390fd5b82518067ffffffffffffffff8111801561108057600080fd5b506040519080825280602002602001820160405280156110aa578160200160208202803683370190505b5080516110bf91609891602090910190613d7a565b5060005b818110156110f65760008582815181106110d957fe5b602002602001015190506110ed81836126f8565b506001016110c3565b506110ff612823565b6111076128d4565b611112600019612969565b609780546001600160a01b0319166001600160a01b038716908117909155609a849055604080519182526020820185905280517f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce799281900390910190a1508015610d83576000805461ff001916905550505050565b600081611193816129a4565b6111d2576040805162461bcd60e51b81526020600482015260176024820152600080516020613f21833981519152604482015290519081900360640190fd5b6112578484856001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561122457600080fd5b505afa158015611238573d6000803e3d6000fd5b505050506040513d602081101561124e57600080fd5b50516000612a60565b50506001600160a01b039081166000908152609f60209081526040808320949093168252929092529020546001600160c01b031690565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112df57600080fd5b505afa1580156112f3573d6000803e3d6000fd5b505050506040513d602081101561130957600080fd5b505190506001600160a01b0381163314611363576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f6f6e6c792d7265736572766560501b604482015290519081900360640190fd5b609b80546000918290559061137782612a76565b90506113968582611386612a79565b6001600160a01b03169190612a88565b6040805183815290516001600160a01b038716917f1c71c8e11fd443227c8f8d3dc1a237a3a5e8310b540c7fbcf5169754aedf42c9919081900360200190a2949350505050565b609d5490565b60006113ee826126d2565b90505b919050565b6099546001600160a01b031661140a612646565b6001600160a01b031614611453576040805162461bcd60e51b815260206004820152601c6024820152600080516020613fbc833981519152604482015290519081900360640190fd5b8061145d816129a4565b61149c576040805162461bcd60e51b81526020600482015260176024820152600080516020613f21833981519152604482015290519081900360640190fd5b826114a657610d83565b609d548311156114fd576040805162461bcd60e51b815260206004820152601d60248201527f5072697a65506f6f6c2f61776172642d657863656564732d617661696c000000604482015290519081900360640190fd5b609d5461150a9084612ada565b609d5561151a8484846000612b3c565b60006115268385612c22565b90506115ac8584856001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561157a57600080fd5b505afa15801561158e573d6000803e3d6000fd5b505050506040513d60208110156115a457600080fd5b505184612a60565b826001600160a01b0316856001600160a01b03167fe2554529d99ab7a67db6b4cea2b32c7d55ae325f958861e05f304fdded867e31866040518082815260200191505060405180910390a35050505050565b611606612646565b6001600160a01b03166116176119a4565b6001600160a01b031614611660576040805162461bcd60e51b81526020600482018190526024820152600080516020613eda833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b609c5481565b60006113ee826129a4565b60006116c8848484612c5a565b949350505050565b6116d8612646565b6001600160a01b03166116e96119a4565b6001600160a01b031614611732576040805162461bcd60e51b81526020600482018190526024820152600080516020613eda833981519152604482015290519081900360640190fd5b61173b81612969565b50565b33611748816129a4565b611787576040805162461bcd60e51b81526020600482015260176024820152600080516020613f21833981519152604482015290519081900360640190fd5b6001600160a01b03841615611861576000336001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156117e557600080fd5b505afa1580156117f9573d6000803e3d6000fd5b505050506040513d602081101561180f57600080fd5b50519050600061182186338484612cb4565b9050846001600160a01b0316866001600160a01b031614611853576118503361184a8487612ada565b83612d43565b90505b61185e863383612d89565b50505b6001600160a01b0383161580159061188b5750836001600160a01b0316836001600160a01b031614155b156118e2576118e28333336001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561122457600080fd5b6001600160a01b0384161580159061190457506099546001600160a01b031615155b15610d83576099546040805163b221095760e01b81526001600160a01b0387811660048301528681166024830152604482018690523360648301529151919092169163b221095791608480830192600092919082900301818387803b15801561196c57600080fd5b505af1158015611980573d6000803e3d6000fd5b5050505050505050565b600080611998858585612f27565b90969095509350505050565b6033546001600160a01b031690565b6097546001600160a01b031681565b6119ca612646565b6001600160a01b03166119db6119a4565b6001600160a01b031614611a24576040805162461bcd60e51b81526020600482018190526024820152600080516020613eda833981519152604482015290519081900360640190fd5b61173b816130c5565b6099546001600160a01b031681565b60606098805480602002602001604051908101604052809291908181526020018280548015611a9457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a76575b5050505050905090565b609a5481565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611af557600080fd5b505afa158015611b09573d6000803e3d6000fd5b505050506040513d6020811015611b1f57600080fd5b505190506001600160a01b038116611b3b5760009150506113f1565b6000816001600160a01b031663010dfa58306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611b8a57600080fd5b505afa158015611b9e573d6000803e3d6000fd5b505050506040513d6020811015611bb457600080fd5b5051905080611bc8576000925050506113f1565b6116c884826131d8565b600060026065541415611c2c576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655582611c3b816129a4565b611c7a576040805162461bcd60e51b81526020600482015260176024820152600080516020613f21833981519152604482015290519081900360640190fd5b600080611c88888789612f27565b9150915084821115611ccb5760405162461bcd60e51b8152600401808060200182810382526027815260200180613efa6027913960400191505060405180910390fd5b611cd68887836131f9565b856001600160a01b031663631b5dfb611ced612646565b8a8a6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611d4557600080fd5b505af1158015611d59573d6000803e3d6000fd5b505050506000611d728389612ada90919063ffffffff16565b90506000611d7f82612a76565b9050611d8e8a82611386612a79565b876001600160a01b03168a6001600160a01b0316611daa612646565b604080518d81526020810186905280820189905290516001600160a01b0392909216917f0271704a58fd2953e49b87d67a0a3ce28a58147de98a5457f60b4686f63850309181900360600190a450506001606555509695505050505050565b82611e13816129a4565b611e52576040805162461bcd60e51b81526020600482015260176024820152600080516020613f21833981519152604482015290519081900360640190fd5b611e5a612646565b6001600160a01b0316611e6b6119a4565b6001600160a01b031614611eb4576040805162461bcd60e51b81526020600482018190526024820152600080516020613eda833981519152604482015290519081900360640190fd5b6040805180820182526001600160801b0380851680835286821660208085018281526001600160a01b038b166000818152609e84528890209651875492518716600160801b029087166fffffffffffffffffffffffffffffffff1990931692909217909516179094558451928352928201528083019190915290517ffb0ba2cf86a2b03bcf387753a2192da80a006afa99dd022bb301c78e323bf1b99181900360600190a150505050565b6000610a086132ba565b600054610100900460ff1680611f825750611f826126e7565b80611f90575060005460ff16155b611fcb5760405162461bcd60e51b815260040180806020018281038252602e815260200180613e8b602e913960400191505060405180910390fd5b600054610100900460ff16158015611ff6576000805460ff1961ff0019909116610100171660011790555b612001858585610f95565b6001600160a01b0382166120465760405162461bcd60e51b815260040180806020018281038252602b815260200180613f91602b913960400191505060405180910390fd5b60a080546001600160a01b0319166001600160a01b0384811691909117918290556040519116907fa81053747b04e643171034e5426f6deebb058fc29dfe032e33345a109224b31b90600090a280156120a5576000805461ff00191690555b5050505050565b6001600160a01b03166000908152609e60205260409020546001600160801b0380821692600160801b9092041690565b60026065541415612134576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655581612143816129a4565b612182576040805162461bcd60e51b81526020600482015260176024820152600080516020613f21833981519152604482015290519081900360640190fd5b8361218c81613336565b6121dd576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f657863656564732d6c69717569646974792d63617000604482015290519081900360640190fd5b60006121e7612646565b90506121f587878787612b3c565b612214813088612203612a79565b6001600160a01b031692919061335a565b61221d8661173b565b846001600160a01b0316876001600160a01b0316826001600160a01b03167f6ce569498e0f86f147466ac49211cb2a1ffe06195adb805e383b3f2365109160898860405180838152602001826001600160a01b031681526020019250505060405180910390a4505060016065555050505050565b6000600260655414156122eb576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655560006122fa61253b565b905060006123066132ba565b90506000828211612318576000612322565b6123228284612ada565b90506000609d548211612336576000612344565b609d54612344908390612ada565b905080156123f657600061235782611aa4565b905080156123b157609b5461236c90826133b4565b609b556123798282612ada565b6040805183815290519193507f5f1703ccfa2730d4245350f228079926a37f26a44ecf6978a7eeafff0af11407919081900360200190a15b609d546123be90836133b4565b609d556040805183815290517fce2b6e507c7ca1a20ce136810f524eefc19ba4c7e4866eb6cc0cba76e778d4be9181900360200190a1505b609d54945050505050600160655590565b609b5481565b612415612646565b6001600160a01b03166124266119a4565b6001600160a01b03161461246f576040805162461bcd60e51b81526020600482018190526024820152600080516020613eda833981519152604482015290519081900360640190fd5b6001600160a01b0381166124b45760405162461bcd60e51b8152600401808060200182810382526026815260200180613df66026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610a08612a79565b60405180604001604052806005815260200164332e342e3560d81b81525081565b600080609b5490506060609880548060200260200160405190810160405280929190818152602001828054801561259b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161257d575b505083519394506000925050505b8181101561263d576126338382815181106125c057fe5b60200260200101516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561260057600080fd5b505afa158015612614573d6000803e3d6000fd5b505050506040513d602081101561262a57600080fd5b505185906133b4565b93506001016125a9565b50919250505090565b3390565b6000612655836126d2565b6126a6576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b816126b3575060006126cb565b6126c76001600160a01b0384168584612a88565b5060015b9392505050565b60a0546001600160a01b039182169116141590565b60006126f23061340e565b15905090565b306001600160a01b0316826001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b15801561273b57600080fd5b505afa15801561274f573d6000803e3d6000fd5b505050506040513d602081101561276557600080fd5b50516001600160a01b0316146127c2576040805162461bcd60e51b815260206004820152601e60248201527f5072697a65506f6f6c2f746f6b656e2d6374726c722d6d69736d617463680000604482015290519081900360640190fd5b81609882815481106127d057fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051918416917f460e712b4a5d801d031ed673dea209b73ab854f7ddeb86b6c48082e92c3eee669190a25050565b600054610100900460ff168061283c575061283c6126e7565b8061284a575060005460ff16155b6128855760405162461bcd60e51b815260040180806020018281038252602e815260200180613e8b602e913960400191505060405180910390fd5b600054610100900460ff161580156128b0576000805460ff1961ff0019909116610100171660011790555b6128b8613414565b6128c06134b4565b801561173b576000805461ff001916905550565b600054610100900460ff16806128ed57506128ed6126e7565b806128fb575060005460ff16155b6129365760405162461bcd60e51b815260040180806020018281038252602e815260200180613e8b602e913960400191505060405180910390fd5b600054610100900460ff16158015612961576000805460ff1961ff0019909116610100171660011790555b6128c06135ad565b609c8190556040805182815290517f3ff20538222f568f27ff436c0c49dfd3e48d5b8f86533a3f759dc1c7089775ab9181900360200190a150565b6000606060988054806020026020016040519081016040528092919081815260200182805480156129fe57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116129e0575b505083519394506000925050505b81811015612a5557846001600160a01b0316838281518110612a2a57fe5b60200260200101516001600160a01b03161415612a4d57600193505050506113f1565b600101612a0c565b506000949350505050565b610d838484612a7187878787612cb4565b612d89565b90565b60a0546001600160a01b031690565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ac6908490613653565b600082821115612b31576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6099546001600160a01b031615612bcb57609954604080516304d7f3db60e41b81526001600160a01b038781166004830152602482018790528581166044830152848116606483015291519190921691634d7f3db091608480830192600092919082900301818387803b158015612bb257600080fd5b505af1158015612bc6573d6000803e3d6000fd5b505050505b816001600160a01b0316635d7b075885856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561196c57600080fd5b6001600160a01b0382166000908152609e60205260408120546126cb908390612c559082906001600160801b03166131d8565b613704565b6001600160a01b0383166000908152609e60205260408120548190612c90908590600160801b90046001600160801b03166131d8565b905080612ca15760009150506126cb565b612cab8382613729565b95945050505050565b6001600160a01b038381166000908152609f6020908152604080832093881683529290529081208054829190600160e01b900460ff16612cf75760009150612d39565b6000612d04888888613790565b8254909150612d359088908890612d30908990612d2a906001600160c01b0316876133b4565b906133b4565b612d43565b9250505b5095945050505050565b6001600160a01b0383166000908152609e60205260408120548190612d729085906001600160801b03166131d8565b905080831115612d80578092505b50909392505050565b6001600160a01b038083166000908152609f602090815260408083209387168352929052819020548151606081019092526001600160c01b03169080612dce84613841565b6001600160801b03168152602001612dec612de7613889565b61388d565b63ffffffff908116825260016020928301526001600160a01b038681166000908152609f84526040808220928a168252918452819020845181549486015195909201516001600160c01b03199094166001600160c01b039092169190911763ffffffff60c01b1916600160c01b94909216939093021760ff60e01b1916600160e01b9115159190910217905581811015612ecf576001600160a01b038084169085167f2f92d56910619b38bc29fd8e4ca5e56359edac7a0c086cdcd305fb603fa37491612eb98585612ada565b60408051918252519081900360200190a3610d83565b80821015610d83576001600160a01b038084169085167ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf612f108486612ada565b60408051918252519081900360200190a350505050565b6000806000846001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612f7957600080fd5b505afa158015612f8d573d6000803e3d6000fd5b505050506040513d6020811015612fa357600080fd5b5051905083811015612ff5576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f696e737566662d66756e647360501b604482015290519081900360640190fd5b6130028686836000612a60565b6000613017866130128488612ada565b612c22565b6001600160a01b038088166000908152609f60209081526040808320938c16835292905290812054919250906001600160c01b0316821161308e576001600160a01b038088166000908152609f60209081526040808320938c168352929052205461308b906001600160c01b031683612ada565b90505b600061309a8888612c22565b90508082116130a957816130ab565b805b94506130b78186612ada565b955050505050935093915050565b6001600160a01b038116613120576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f7072697a6553747261746567792d6e6f742d7a65726f604482015290519081900360640190fd5b61313d6001600160a01b038216600162a1cb1960e01b03196138d1565b61318e576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f7072697a6553747261746567792d696e76616c696400604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0383169081179091556040517f7f58dc86bc2e435cb77ca0edb1df55e25f90caf2d6bd866971715437d456a21290600090a250565b6000806131e583856138ed565b90506116c881670de0b6b3a7640000613946565b6001600160a01b038083166000908152609f602090815260408083209387168352929052205461323b90613236906001600160c01b031683612ada565b613841565b6001600160a01b038084166000818152609f602090815260408083209489168084529482529182902080546001600160c01b0319166001600160801b0396909616959095179094558051858152905191937ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf92918290030190a3505050565b60a054604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561330557600080fd5b505afa158015613319573d6000803e3d6000fd5b505050506040513d602081101561332f57600080fd5b5051905090565b60008061334161253b565b609c5490915061335182856133b4565b11159392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610d83908590613653565b6000828201838110156126cb576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3b151590565b600054610100900460ff168061342d575061342d6126e7565b8061343b575060005460ff16155b6134765760405162461bcd60e51b815260040180806020018281038252602e815260200180613e8b602e913960400191505060405180910390fd5b600054610100900460ff161580156128c0576000805460ff1961ff001990911661010017166001179055801561173b576000805461ff001916905550565b600054610100900460ff16806134cd57506134cd6126e7565b806134db575060005460ff16155b6135165760405162461bcd60e51b815260040180806020018281038252602e815260200180613e8b602e913960400191505060405180910390fd5b600054610100900460ff16158015613541576000805460ff1961ff0019909116610100171660011790555b600061354b612646565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561173b576000805461ff001916905550565b600054610100900460ff16806135c657506135c66126e7565b806135d4575060005460ff16155b61360f5760405162461bcd60e51b815260040180806020018281038252602e815260200180613e8b602e913960400191505060405180910390fd5b600054610100900460ff1615801561363a576000805460ff1961ff0019909116610100171660011790555b6001606555801561173b576000805461ff001916905550565b60606136a8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139889092919063ffffffff16565b805190915015610ac6578080602001905160208110156136c757600080fd5b5051610ac65760405162461bcd60e51b815260040180806020018281038252602a815260200180613f67602a913960400191505060405180910390fd5b60008061371384609a546131d8565b905080831115613721578092505b509092915050565b600080821161377f576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161378857fe5b049392505050565b6001600160a01b038281166000908152609f60209081526040808320938716835292905290812054600160c01b810463ffffffff1690600160e01b900460ff166137de5760009150506126cb565b60006137f2826137ec613889565b90612ada565b6001600160a01b0386166000908152609e60205260408120549192509061382a908390600160801b90046001600160801b03166138ed565b905061383685826131d8565b979650505050505050565b6000600160801b82106138855760405162461bcd60e51b8152600401808060200182810382526027815260200180613e1c6027913960400191505060405180910390fd5b5090565b4290565b6000600160201b82106138855760405162461bcd60e51b8152600401808060200182810382526026815260200180613f416026913960400191505060405180910390fd5b60006138dc83613997565b80156126cb57506126cb83836139ca565b6000826138fc57506000612b36565b8282028284828161390957fe5b04146126cb5760405162461bcd60e51b8152600401808060200182810382526021815260200180613eb96021913960400191505060405180910390fd5b60006126cb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506139ed565b60606116c88484600085613a8f565b60006139aa826301ffc9a760e01b6139ca565b80156113ee57506139c3826001600160e01b03196139ca565b1592915050565b60008060006139d98585613be0565b91509150818015612cab5750949350505050565b60008183613a795760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613a3e578181015183820152602001613a26565b50505050905090810190601f168015613a6b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613a8557fe5b0495945050505050565b606082471015613ad05760405162461bcd60e51b8152600401808060200182810382526026815260200180613e656026913960400191505060405180910390fd5b613ad98561340e565b613b2a576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613b695780518252601f199092019160209182019101613b4a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613bcb576040519150601f19603f3d011682016040523d82523d6000602084013e613bd0565b606091505b5091509150613836828286613d14565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b1781529151815160009384939284926060926001600160a01b038a169261753092879282918083835b60208310613c685780518252601f199092019160209182019101613c49565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114613cc9576040519150601f19603f3d011682016040523d82523d6000602084013e613cce565b606091505b5091509150602081511015613cec5760008094509450505050613d0d565b81818060200190516020811015613d0257600080fd5b505190955093505050505b9250929050565b60608315613d235750816126cb565b825115613d335782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315613a3e578181015183820152602001613a26565b828054828255906000526020600020908101928215613dcf579160200282015b82811115613dcf57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613d9a565b506138859291505b808211156138855780546001600160a01b0319168155600101613dd756fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e2031323820626974735072697a65506f6f6c2f7265736572766552656769737472792d6e6f742d7a65726f416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725072697a65506f6f6c2f657869742d6665652d657863656564732d757365722d6d6178696d756d5072697a65506f6f6c2f756e6b6e6f776e2d746f6b656e00000000000000000053616665436173743a2076616c756520646f65736e27742066697420696e20333220626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645374616b655072697a65506f6f6c2f7374616b652d746f6b656e2d6e6f742d7a65726f2d616464726573735072697a65506f6f6c2f6f6e6c792d7072697a65537472617465677900000000a264697066735822122010013c2db674dbeefb51bd0738605b9e7e65256da75fa287bb6d12238276cd4964736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4011 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x227 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x888C2B6F GT PUSH2 0x130 JUMPI DUP1 PUSH4 0xA7B2CC31 GT PUSH2 0xB8 JUMPI DUP1 PUSH4 0xE6D8A94B GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xE6D8A94B EQ PUSH2 0x943 JUMPI DUP1 PUSH4 0xEDB4E1CF EQ PUSH2 0x94B JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x953 JUMPI DUP1 PUSH4 0xFC0C546A EQ PUSH2 0x979 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x981 JUMPI PUSH2 0x227 JUMP JUMPDEST DUP1 PUSH4 0xA7B2CC31 EQ PUSH2 0x7AE JUMPI DUP1 PUSH4 0xB69EF8A8 EQ PUSH2 0x7EB JUMPI DUP1 PUSH4 0xC5871485 EQ PUSH2 0x7F3 JUMPI DUP1 PUSH4 0xD4A1361D EQ PUSH2 0x8B2 JUMPI DUP1 PUSH4 0xE323F825 EQ PUSH2 0x907 JUMPI PUSH2 0x227 JUMP JUMPDEST DUP1 PUSH4 0x98BF3EB6 GT PUSH2 0xFF JUMPI DUP1 PUSH4 0x98BF3EB6 EQ PUSH2 0x6EF JUMPI DUP1 PUSH4 0x9D63848A EQ PUSH2 0x6F7 JUMPI DUP1 PUSH4 0x9E167519 EQ PUSH2 0x74F JUMPI DUP1 PUSH4 0x9FE32A91 EQ PUSH2 0x757 JUMPI DUP1 PUSH4 0xA016240B EQ PUSH2 0x774 JUMPI PUSH2 0x227 JUMP JUMPDEST DUP1 PUSH4 0x888C2B6F EQ PUSH2 0x64E JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x69D JUMPI DUP1 PUSH4 0x8E71C1F6 EQ PUSH2 0x6C1 JUMPI DUP1 PUSH4 0x91CA480E EQ PUSH2 0x6C9 JUMPI PUSH2 0x227 JUMP JUMPDEST DUP1 PUSH4 0x630665B4 GT PUSH2 0x1B3 JUMPI DUP1 PUSH4 0x76687D3D GT PUSH2 0x182 JUMPI DUP1 PUSH4 0x76687D3D EQ PUSH2 0x59B JUMPI DUP1 PUSH4 0x78B3D327 EQ PUSH2 0x5A3 JUMPI DUP1 PUSH4 0x79CB8563 EQ PUSH2 0x5C9 JUMPI DUP1 PUSH4 0x7B99ADB1 EQ PUSH2 0x5FB JUMPI DUP1 PUSH4 0x7CBAB1C7 EQ PUSH2 0x618 JUMPI PUSH2 0x227 JUMP JUMPDEST DUP1 PUSH4 0x630665B4 EQ PUSH2 0x51B JUMPI DUP1 PUSH4 0x6A3FD4F9 EQ PUSH2 0x523 JUMPI DUP1 PUSH4 0x6B1B863A EQ PUSH2 0x55D JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x593 JUMPI PUSH2 0x227 JUMP JUMPDEST DUP1 PUSH4 0x2B0AB144 GT PUSH2 0x1FA JUMPI DUP1 PUSH4 0x2B0AB144 EQ PUSH2 0x3B0 JUMPI DUP1 PUSH4 0x2F7627E3 EQ PUSH2 0x3E6 JUMPI DUP1 PUSH4 0x3EDE50C6 EQ PUSH2 0x414 JUMPI DUP1 PUSH4 0x494DE9F7 EQ PUSH2 0x4C7 JUMPI DUP1 PUSH4 0x52A387AB EQ PUSH2 0x4F5 JUMPI PUSH2 0x227 JUMP JUMPDEST DUP1 PUSH4 0x937EB54 EQ PUSH2 0x22C JUMPI DUP1 PUSH4 0x13F55E39 EQ PUSH2 0x246 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x27E JUMPI DUP1 PUSH4 0x16960D55 EQ PUSH2 0x329 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x234 PUSH2 0x9FE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x25C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xA0D JUMP JUMPDEST STOP JUMPDEST PUSH2 0x30C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x294 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x2CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x2E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x301 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xACB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x33F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x384 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x3A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xADC JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x3C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xD89 JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xE46 JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x42A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x454 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x466 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x487 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0xF95 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x234 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x4DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x1187 JUMP JUMPDEST PUSH2 0x234 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x50B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x128E JUMP JUMPDEST PUSH2 0x234 PUSH2 0x13DD JUMP JUMPDEST PUSH2 0x549 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x539 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x13E3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x573 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 SWAP1 SWAP2 ADD CALLDATALOAD AND PUSH2 0x13F6 JUMP JUMPDEST PUSH2 0x27C PUSH2 0x15FE JUMP JUMPDEST PUSH2 0x234 PUSH2 0x16AA JUMP JUMPDEST PUSH2 0x549 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16B0 JUMP JUMPDEST PUSH2 0x234 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x5DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x16BB JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x611 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x16D0 JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x62E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x173E JUMP JUMPDEST PUSH2 0x684 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x664 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x198A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB ADD SWAP1 RETURN JUMPDEST PUSH2 0x6A5 PUSH2 0x19A4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x6A5 PUSH2 0x19B3 JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x19C2 JUMP JUMPDEST PUSH2 0x6A5 PUSH2 0x1A2D JUMP JUMPDEST PUSH2 0x6FF PUSH2 0x1A3C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x73B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x723 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x234 PUSH2 0x1A9E JUMP JUMPDEST PUSH2 0x234 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x76D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1AA4 JUMP JUMPDEST PUSH2 0x234 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x78A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x1BD2 JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x7C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x40 ADD CALLDATALOAD AND PUSH2 0x1E09 JUMP JUMPDEST PUSH2 0x234 PUSH2 0x1F5F JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x809 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x833 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x845 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x866 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1F69 JUMP JUMPDEST PUSH2 0x8D8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x8C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x20AC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x91D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x20DC JUMP JUMPDEST PUSH2 0x234 PUSH2 0x2291 JUMP JUMPDEST PUSH2 0x234 PUSH2 0x2407 JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x969 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x240D JUMP JUMPDEST PUSH2 0x6A5 PUSH2 0x2510 JUMP JUMPDEST PUSH2 0x989 PUSH2 0x251A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x9C3 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x9AB JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x9F0 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xA08 PUSH2 0x253B JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xA21 PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xA6A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FBC DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xA75 DUP4 DUP4 DUP4 PUSH2 0x264A JUMP JUMPDEST ISZERO PUSH2 0xAC6 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB0BAC59718CD343C80A813518AFCF36846CFCFE6D56E2B3CAB9BD49F5F9B251C DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0xA85BD01 PUSH1 0xE1 SHL SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xAF0 PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xB39 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FBC DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xB42 DUP4 PUSH2 0x26D2 JUMP JUMPDEST PUSH2 0xB93 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0xB9D JUMPI PUSH2 0xD83 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xD0A JUMPI DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x42842E0E ADDRESS DUP8 DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0xBC5 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC22 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0xC33 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xD02 JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0xC61 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xC66 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH32 0x17E975018310F88872B58D4D8263ADCA83CF5C1893496EA2A86923DAB15276AD DUP2 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xCC6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xCAE JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xCF3 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xBA0 JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x69C2DE32BC4D47F488E72626A6CFDEE85089342E52675E7DE79C4B417623960C DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP6 POP SWAP1 SWAP4 POP POP POP POP LOG3 JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xD9D PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xDE6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FBC DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xDF1 DUP4 DUP4 DUP4 PUSH2 0x264A JUMP JUMPDEST ISZERO PUSH2 0xAC6 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC65F48ACA3B7A99B7443D04B8FFBB073156179BC628DC3F7DEF5047748973469 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH2 0xE4E PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE5F PUSH2 0x19A4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xEA8 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3EDA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xEF7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xF0B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xF21 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD GT ISZERO PUSH2 0xF91 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5C19A95C DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF78 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF8C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0xFAE JUMPI POP PUSH2 0xFAE PUSH2 0x26E7 JUMP JUMPDEST DUP1 PUSH2 0xFBC JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0xFF7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1022 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x1067 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E43 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 MLOAD DUP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x1080 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x10AA JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP1 MLOAD PUSH2 0x10BF SWAP2 PUSH1 0x98 SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x3D7A JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x10F6 JUMPI PUSH1 0x0 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x10D9 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0x10ED DUP2 DUP4 PUSH2 0x26F8 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x10C3 JUMP JUMPDEST POP PUSH2 0x10FF PUSH2 0x2823 JUMP JUMPDEST PUSH2 0x1107 PUSH2 0x28D4 JUMP JUMPDEST PUSH2 0x1112 PUSH1 0x0 NOT PUSH2 0x2969 JUMP JUMPDEST PUSH1 0x97 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x9A DUP5 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP6 SWAP1 MSTORE DUP1 MLOAD PUSH32 0x25FF68DD81B34665B5BA7E553EE5511BF6812E12ADB4A7E2C0D9E26B3099CE79 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 POP DUP1 ISZERO PUSH2 0xD83 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x1193 DUP2 PUSH2 0x29A4 JUMP JUMPDEST PUSH2 0x11D2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F21 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1257 DUP5 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1224 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1238 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x124E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 PUSH2 0x2A60 JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP4 AND DUP3 MSTORE SWAP3 SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x12F3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1309 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ PUSH2 0x1363 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F6F6E6C792D72657365727665 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9B DUP1 SLOAD PUSH1 0x0 SWAP2 DUP3 SWAP1 SSTORE SWAP1 PUSH2 0x1377 DUP3 PUSH2 0x2A76 JUMP JUMPDEST SWAP1 POP PUSH2 0x1396 DUP6 DUP3 PUSH2 0x1386 PUSH2 0x2A79 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x2A88 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP2 PUSH32 0x1C71C8E11FD443227C8F8D3DC1A237A3A5E8310B540C7FBCF5169754AEDF42C9 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x9D SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x13EE DUP3 PUSH2 0x26D2 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x140A PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1453 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FBC DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x145D DUP2 PUSH2 0x29A4 JUMP JUMPDEST PUSH2 0x149C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F21 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 PUSH2 0x14A6 JUMPI PUSH2 0xD83 JUMP JUMPDEST PUSH1 0x9D SLOAD DUP4 GT ISZERO PUSH2 0x14FD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F61776172642D657863656564732D617661696C000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x150A SWAP1 DUP5 PUSH2 0x2ADA JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH2 0x151A DUP5 DUP5 DUP5 PUSH1 0x0 PUSH2 0x2B3C JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1526 DUP4 DUP6 PUSH2 0x2C22 JUMP JUMPDEST SWAP1 POP PUSH2 0x15AC DUP6 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x157A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x158E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x15A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP5 PUSH2 0x2A60 JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xE2554529D99AB7A67DB6B4CEA2B32C7D55AE325F958861E05F304FDDED867E31 DUP7 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1606 PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1617 PUSH2 0x19A4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1660 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3EDA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x13EE DUP3 PUSH2 0x29A4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x16C8 DUP5 DUP5 DUP5 PUSH2 0x2C5A JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x16D8 PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16E9 PUSH2 0x19A4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1732 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3EDA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x173B DUP2 PUSH2 0x2969 JUMP JUMPDEST POP JUMP JUMPDEST CALLER PUSH2 0x1748 DUP2 PUSH2 0x29A4 JUMP JUMPDEST PUSH2 0x1787 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F21 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO PUSH2 0x1861 JUMPI PUSH1 0x0 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP7 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x17E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x17F9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x180F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x1821 DUP7 CALLER DUP5 DUP5 PUSH2 0x2CB4 JUMP JUMPDEST SWAP1 POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1853 JUMPI PUSH2 0x1850 CALLER PUSH2 0x184A DUP5 DUP8 PUSH2 0x2ADA JUMP JUMPDEST DUP4 PUSH2 0x2D43 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x185E DUP7 CALLER DUP4 PUSH2 0x2D89 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x188B JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x18E2 JUMPI PUSH2 0x18E2 DUP4 CALLER CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1224 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1904 JUMPI POP PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xD83 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP7 SWAP1 MSTORE CALLER PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xB2210957 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x196C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1980 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1998 DUP6 DUP6 DUP6 PUSH2 0x2F27 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x97 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x19CA PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x19DB PUSH2 0x19A4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1A24 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3EDA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x173B DUP2 PUSH2 0x30C5 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1A94 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1A76 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1AF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B09 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1B1F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1B3B JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x13F1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x10DFA58 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1B8A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B9E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1BB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x1BC8 JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x13F1 JUMP JUMPDEST PUSH2 0x16C8 DUP5 DUP3 PUSH2 0x31D8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x1C2C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP3 PUSH2 0x1C3B DUP2 PUSH2 0x29A4 JUMP JUMPDEST PUSH2 0x1C7A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F21 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1C88 DUP9 DUP8 DUP10 PUSH2 0x2F27 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0x1CCB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3EFA PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1CD6 DUP9 DUP8 DUP4 PUSH2 0x31F9 JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x631B5DFB PUSH2 0x1CED PUSH2 0x2646 JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1D45 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D59 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 PUSH2 0x1D72 DUP4 DUP10 PUSH2 0x2ADA SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1D7F DUP3 PUSH2 0x2A76 JUMP JUMPDEST SWAP1 POP PUSH2 0x1D8E DUP11 DUP3 PUSH2 0x1386 PUSH2 0x2A79 JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1DAA PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP14 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE DUP1 DUP3 ADD DUP10 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x271704A58FD2953E49B87D67A0A3CE28A58147DE98A5457F60B4686F6385030 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH2 0x1E13 DUP2 PUSH2 0x29A4 JUMP JUMPDEST PUSH2 0x1E52 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F21 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1E5A PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E6B PUSH2 0x19A4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1EB4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3EDA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP6 AND DUP1 DUP4 MSTORE DUP7 DUP3 AND PUSH1 0x20 DUP1 DUP6 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9E DUP5 MSTORE DUP9 SWAP1 KECCAK256 SWAP7 MLOAD DUP8 SLOAD SWAP3 MLOAD DUP8 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP1 DUP8 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP6 AND OR SWAP1 SWAP5 SSTORE DUP5 MLOAD SWAP3 DUP4 MSTORE SWAP3 DUP3 ADD MSTORE DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 MLOAD PUSH32 0xFB0BA2CF86A2B03BCF387753A2192DA80A006AFA99DD022BB301C78E323BF1B9 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA08 PUSH2 0x32BA JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1F82 JUMPI POP PUSH2 0x1F82 PUSH2 0x26E7 JUMP JUMPDEST DUP1 PUSH2 0x1F90 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1FCB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1FF6 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2001 DUP6 DUP6 DUP6 PUSH2 0xF95 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x2046 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F91 PUSH1 0x2B SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xA0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 AND SWAP1 PUSH32 0xA81053747B04E643171034E5426F6DEEBB058FC29DFE032E33345A109224B31B SWAP1 PUSH1 0x0 SWAP1 LOG2 DUP1 ISZERO PUSH2 0x20A5 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP3 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND SWAP1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x2134 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP2 PUSH2 0x2143 DUP2 PUSH2 0x29A4 JUMP JUMPDEST PUSH2 0x2182 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F21 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP4 PUSH2 0x218C DUP2 PUSH2 0x3336 JUMP JUMPDEST PUSH2 0x21DD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F657863656564732D6C69717569646974792D63617000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x21E7 PUSH2 0x2646 JUMP JUMPDEST SWAP1 POP PUSH2 0x21F5 DUP8 DUP8 DUP8 DUP8 PUSH2 0x2B3C JUMP JUMPDEST PUSH2 0x2214 DUP2 ADDRESS DUP9 PUSH2 0x2203 PUSH2 0x2A79 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 SWAP1 PUSH2 0x335A JUMP JUMPDEST PUSH2 0x221D DUP7 PUSH2 0x173B JUMP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6CE569498E0F86F147466AC49211CB2A1FFE06195ADB805E383B3F2365109160 DUP10 DUP9 PUSH1 0x40 MLOAD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x22EB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE PUSH1 0x0 PUSH2 0x22FA PUSH2 0x253B JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2306 PUSH2 0x32BA JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 DUP3 GT PUSH2 0x2318 JUMPI PUSH1 0x0 PUSH2 0x2322 JUMP JUMPDEST PUSH2 0x2322 DUP3 DUP5 PUSH2 0x2ADA JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x9D SLOAD DUP3 GT PUSH2 0x2336 JUMPI PUSH1 0x0 PUSH2 0x2344 JUMP JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x2344 SWAP1 DUP4 SWAP1 PUSH2 0x2ADA JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x23F6 JUMPI PUSH1 0x0 PUSH2 0x2357 DUP3 PUSH2 0x1AA4 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x23B1 JUMPI PUSH1 0x9B SLOAD PUSH2 0x236C SWAP1 DUP3 PUSH2 0x33B4 JUMP JUMPDEST PUSH1 0x9B SSTORE PUSH2 0x2379 DUP3 DUP3 PUSH2 0x2ADA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 POP PUSH32 0x5F1703CCFA2730D4245350F228079926A37F26A44ECF6978A7EEAFFF0AF11407 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x23BE SWAP1 DUP4 PUSH2 0x33B4 JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xCE2B6E507C7CA1A20CE136810F524EEFC19BA4C7E4866EB6CC0CBA76E778D4BE SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH1 0x9D SLOAD SWAP5 POP POP POP POP POP PUSH1 0x1 PUSH1 0x65 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x9B SLOAD DUP2 JUMP JUMPDEST PUSH2 0x2415 PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2426 PUSH2 0x19A4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x246F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3EDA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x24B4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3DF6 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA08 PUSH2 0x2A79 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x9B SLOAD SWAP1 POP PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x259B JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x257D JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x263D JUMPI PUSH2 0x2633 DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x25C0 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2600 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2614 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x262A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP6 SWAP1 PUSH2 0x33B4 JUMP JUMPDEST SWAP4 POP PUSH1 0x1 ADD PUSH2 0x25A9 JUMP JUMPDEST POP SWAP2 SWAP3 POP POP POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2655 DUP4 PUSH2 0x26D2 JUMP JUMPDEST PUSH2 0x26A6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x26B3 JUMPI POP PUSH1 0x0 PUSH2 0x26CB JUMP JUMPDEST PUSH2 0x26C7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP6 DUP5 PUSH2 0x2A88 JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND SWAP2 AND EQ ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x26F2 ADDRESS PUSH2 0x340E JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF77C4791 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x273B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x274F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2765 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x27C2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F746F6B656E2D6374726C722D6D69736D617463680000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x98 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x27D0 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 DUP5 AND SWAP2 PUSH32 0x460E712B4A5D801D031ED673DEA209B73AB854F7DDEB86B6C48082E92C3EEE66 SWAP2 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x283C JUMPI POP PUSH2 0x283C PUSH2 0x26E7 JUMP JUMPDEST DUP1 PUSH2 0x284A JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2885 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x28B0 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x28B8 PUSH2 0x3414 JUMP JUMPDEST PUSH2 0x28C0 PUSH2 0x34B4 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x173B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x28ED JUMPI POP PUSH2 0x28ED PUSH2 0x26E7 JUMP JUMPDEST DUP1 PUSH2 0x28FB JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2936 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2961 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x28C0 PUSH2 0x35AD JUMP JUMPDEST PUSH1 0x9C DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3FF20538222F568F27FF436C0C49DFD3E48D5B8F86533A3F759DC1C7089775AB SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x29FE JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x29E0 JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2A55 JUMPI DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2A2A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x2A4D JUMPI PUSH1 0x1 SWAP4 POP POP POP POP PUSH2 0x13F1 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2A0C JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xD83 DUP5 DUP5 PUSH2 0x2A71 DUP8 DUP8 DUP8 DUP8 PUSH2 0x2CB4 JUMP JUMPDEST PUSH2 0x2D89 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xAC6 SWAP1 DUP5 SWAP1 PUSH2 0x3653 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2B31 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2BCB JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE DUP6 DUP2 AND PUSH1 0x44 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x4D7F3DB0 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2BB2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2BC6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5D7B0758 DUP6 DUP6 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x196C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x26CB SWAP1 DUP4 SWAP1 PUSH2 0x2C55 SWAP1 DUP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x31D8 JUMP JUMPDEST PUSH2 0x3704 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2C90 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x31D8 JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x2CA1 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x26CB JUMP JUMPDEST PUSH2 0x2CAB DUP4 DUP3 PUSH2 0x3729 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP3 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x2CF7 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x2D39 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2D04 DUP9 DUP9 DUP9 PUSH2 0x3790 JUMP JUMPDEST DUP3 SLOAD SWAP1 SWAP2 POP PUSH2 0x2D35 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x2D30 SWAP1 DUP10 SWAP1 PUSH2 0x2D2A SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP8 PUSH2 0x33B4 JUMP JUMPDEST SWAP1 PUSH2 0x33B4 JUMP JUMPDEST PUSH2 0x2D43 JUMP JUMPDEST SWAP3 POP POP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2D72 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x31D8 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x2D80 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE DUP2 SWAP1 KECCAK256 SLOAD DUP2 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 DUP1 PUSH2 0x2DCE DUP5 PUSH2 0x3841 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2DEC PUSH2 0x2DE7 PUSH2 0x3889 JUMP JUMPDEST PUSH2 0x388D JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP3 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 DUP11 AND DUP3 MSTORE SWAP2 DUP5 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP5 DUP7 ADD MLOAD SWAP6 SWAP1 SWAP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH4 0xFFFFFFFF PUSH1 0xC0 SHL NOT AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP5 SWAP1 SWAP3 AND SWAP4 SWAP1 SWAP4 MUL OR PUSH1 0xFF PUSH1 0xE0 SHL NOT AND PUSH1 0x1 PUSH1 0xE0 SHL SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE DUP2 DUP2 LT ISZERO PUSH2 0x2ECF JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0x2F92D56910619B38BC29FD8E4CA5E56359EDAC7A0C086CDCD305FB603FA37491 PUSH2 0x2EB9 DUP6 DUP6 PUSH2 0x2ADA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 PUSH2 0xD83 JUMP JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0xD83 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF PUSH2 0x2F10 DUP5 DUP7 PUSH2 0x2ADA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2F79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2F8D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2FA3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x2FF5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F696E737566662D66756E6473 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x3002 DUP7 DUP7 DUP4 PUSH1 0x0 PUSH2 0x2A60 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3017 DUP7 PUSH2 0x3012 DUP5 DUP9 PUSH2 0x2ADA JUMP JUMPDEST PUSH2 0x2C22 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP3 GT PUSH2 0x308E JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x308B SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2ADA JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x309A DUP9 DUP9 PUSH2 0x2C22 JUMP JUMPDEST SWAP1 POP DUP1 DUP3 GT PUSH2 0x30A9 JUMPI DUP2 PUSH2 0x30AB JUMP JUMPDEST DUP1 JUMPDEST SWAP5 POP PUSH2 0x30B7 DUP2 DUP7 PUSH2 0x2ADA JUMP JUMPDEST SWAP6 POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x3120 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D6E6F742D7A65726F PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x313D PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x38D1 JUMP JUMPDEST PUSH2 0x318E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D696E76616C696400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x99 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x7F58DC86BC2E435CB77CA0EDB1DF55E25F90CAF2D6BD866971715437D456A212 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x31E5 DUP4 DUP6 PUSH2 0x38ED JUMP JUMPDEST SWAP1 POP PUSH2 0x16C8 DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x3946 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x323B SWAP1 PUSH2 0x3236 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2ADA JUMP JUMPDEST PUSH2 0x3841 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3305 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3319 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x332F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3341 PUSH2 0x253B JUMP JUMPDEST PUSH1 0x9C SLOAD SWAP1 SWAP2 POP PUSH2 0x3351 DUP3 DUP6 PUSH2 0x33B4 JUMP JUMPDEST GT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x24 DUP4 ADD MSTORE DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x84 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xD83 SWAP1 DUP6 SWAP1 PUSH2 0x3653 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x26CB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x342D JUMPI POP PUSH2 0x342D PUSH2 0x26E7 JUMP JUMPDEST DUP1 PUSH2 0x343B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3476 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x28C0 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x173B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x34CD JUMPI POP PUSH2 0x34CD PUSH2 0x26E7 JUMP JUMPDEST DUP1 PUSH2 0x34DB JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3516 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3541 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x354B PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x173B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x35C6 JUMPI POP PUSH2 0x35C6 PUSH2 0x26E7 JUMP JUMPDEST DUP1 PUSH2 0x35D4 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x360F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x363A JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x65 SSTORE DUP1 ISZERO PUSH2 0x173B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x36A8 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3988 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xAC6 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x36C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xAC6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F67 PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3713 DUP5 PUSH1 0x9A SLOAD PUSH2 0x31D8 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x3721 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x377F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x3788 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xC0 SHL DUP2 DIV PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x37DE JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x26CB JUMP JUMPDEST PUSH1 0x0 PUSH2 0x37F2 DUP3 PUSH2 0x37EC PUSH2 0x3889 JUMP JUMPDEST SWAP1 PUSH2 0x2ADA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x382A SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x38ED JUMP JUMPDEST SWAP1 POP PUSH2 0x3836 DUP6 DUP3 PUSH2 0x31D8 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x3885 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E1C PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST TIMESTAMP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x20 SHL DUP3 LT PUSH2 0x3885 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F41 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x38DC DUP4 PUSH2 0x3997 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x26CB JUMPI POP PUSH2 0x26CB DUP4 DUP4 PUSH2 0x39CA JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x38FC JUMPI POP PUSH1 0x0 PUSH2 0x2B36 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x3909 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x26CB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3EB9 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x26CB DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x39ED JUMP JUMPDEST PUSH1 0x60 PUSH2 0x16C8 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x3A8F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x39AA DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x39CA JUMP JUMPDEST DUP1 ISZERO PUSH2 0x13EE JUMPI POP PUSH2 0x39C3 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x39CA JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x39D9 DUP6 DUP6 PUSH2 0x3BE0 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x2CAB JUMPI POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x3A79 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3A3E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3A26 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3A6B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x3A85 JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x3AD0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E65 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3AD9 DUP6 PUSH2 0x340E JUMP JUMPDEST PUSH2 0x3B2A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3B69 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3B4A JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3BCB JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3BD0 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x3836 DUP3 DUP3 DUP7 PUSH2 0x3D14 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x24 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP3 DUP5 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND SWAP3 PUSH2 0x7530 SWAP3 DUP8 SWAP3 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3C68 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3C49 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3CC9 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3CCE JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x3CEC JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x3D0D JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3D02 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x3D23 JUMPI POP DUP2 PUSH2 0x26CB JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x3D33 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x3A3E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3A26 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x3DCF JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x3DCF JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x3D9A JUMP JUMPDEST POP PUSH2 0x3885 SWAP3 SWAP2 POP JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x3885 JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x3DD7 JUMP INVALID 0x4F PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F206164647265737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E2031323820626974735072697A65 POP PUSH16 0x6F6C2F72657365727665526567697374 PUSH19 0x792D6E6F742D7A65726F416464726573733A20 PUSH10 0x6E73756666696369656E PUSH21 0x2062616C616E636520666F722063616C6C496E6974 PUSH10 0x616C697A61626C653A20 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 MSTORE8 PUSH2 0x6665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F774F776E61626C653A20 PUSH4 0x616C6C65 PUSH19 0x206973206E6F7420746865206F776E65725072 PUSH10 0x7A65506F6F6C2F657869 PUSH21 0x2D6665652D657863656564732D757365722D6D6178 PUSH10 0x6D756D5072697A65506F PUSH16 0x6C2F756E6B6E6F776E2D746F6B656E00 STOP STOP STOP STOP STOP STOP STOP STOP MSTORE8 PUSH2 0x6665 NUMBER PUSH2 0x7374 GASPRICE KECCAK256 PUSH23 0x616C756520646F65736E27742066697420696E20333220 PUSH3 0x697473 MSTORE8 PUSH2 0x6665 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x7563636565645374616B655072697A65506F6F6C 0x2F PUSH20 0x74616B652D746F6B656E2D6E6F742D7A65726F2D PUSH2 0x6464 PUSH19 0x6573735072697A65506F6F6C2F6F6E6C792D70 PUSH19 0x697A65537472617465677900000000A2646970 PUSH7 0x73582212201001 EXTCODECOPY 0x2D 0xB6 PUSH21 0xDBEEFB51BD0738605B9E7E65256DA75FA287BB6D12 0x23 DUP3 PUSH23 0xCD4964736F6C634300060C003300000000000000000000 ",
              "sourceMap": "171:2487:43:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106102275760003560e01c8063888c2b6f11610130578063a7b2cc31116100b8578063e6d8a94b1161007c578063e6d8a94b14610943578063edb4e1cf1461094b578063f2fde38b14610953578063fc0c546a14610979578063ffa1ad741461098157610227565b8063a7b2cc31146107ae578063b69ef8a8146107eb578063c5871485146107f3578063d4a1361d146108b2578063e323f8251461090757610227565b806398bf3eb6116100ff57806398bf3eb6146106ef5780639d63848a146106f75780639e1675191461074f5780639fe32a9114610757578063a016240b1461077457610227565b8063888c2b6f1461064e5780638da5cb5b1461069d5780638e71c1f6146106c157806391ca480e146106c957610227565b8063630665b4116101b357806376687d3d1161018257806376687d3d1461059b57806378b3d327146105a357806379cb8563146105c95780637b99adb1146105fb5780637cbab1c71461061857610227565b8063630665b41461051b5780636a3fd4f9146105235780636b1b863a1461055d578063715018a61461059357610227565b80632b0ab144116101fa5780632b0ab144146103b05780632f7627e3146103e65780633ede50c614610414578063494de9f7146104c757806352a387ab146104f557610227565b80630937eb541461022c57806313f55e3914610246578063150b7a021461027e57806316960d5514610329575b600080fd5b6102346109fe565b60408051918252519081900360200190f35b61027c6004803603606081101561025c57600080fd5b506001600160a01b03813581169160208101359091169060400135610a0d565b005b61030c6004803603608081101561029457600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156102ce57600080fd5b8201836020820111156102e057600080fd5b803590602001918460018302840111600160201b8311171561030157600080fd5b509092509050610acb565b604080516001600160e01b03199092168252519081900360200190f35b61027c6004803603606081101561033f57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561037257600080fd5b82018360208201111561038457600080fd5b803590602001918460208302840111600160201b831117156103a557600080fd5b509092509050610adc565b61027c600480360360608110156103c657600080fd5b506001600160a01b03813581169160208101359091169060400135610d89565b61027c600480360360408110156103fc57600080fd5b506001600160a01b0381358116916020013516610e46565b61027c6004803603606081101561042a57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561045457600080fd5b82018360208201111561046657600080fd5b803590602001918460208302840111600160201b8311171561048757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250610f95915050565b610234600480360360408110156104dd57600080fd5b506001600160a01b0381358116916020013516611187565b6102346004803603602081101561050b57600080fd5b50356001600160a01b031661128e565b6102346113dd565b6105496004803603602081101561053957600080fd5b50356001600160a01b03166113e3565b604080519115158252519081900360200190f35b61027c6004803603606081101561057357600080fd5b506001600160a01b038135811691602081013591604090910135166113f6565b61027c6115fe565b6102346116aa565b610549600480360360208110156105b957600080fd5b50356001600160a01b03166116b0565b610234600480360360608110156105df57600080fd5b506001600160a01b0381351690602081013590604001356116bb565b61027c6004803603602081101561061157600080fd5b50356116d0565b61027c6004803603606081101561062e57600080fd5b506001600160a01b0381358116916020810135909116906040013561173e565b6106846004803603606081101561066457600080fd5b506001600160a01b0381358116916020810135909116906040013561198a565b6040805192835260208301919091528051918290030190f35b6106a56119a4565b604080516001600160a01b039092168252519081900360200190f35b6106a56119b3565b61027c600480360360208110156106df57600080fd5b50356001600160a01b03166119c2565b6106a5611a2d565b6106ff611a3c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561073b578181015183820152602001610723565b505050509050019250505060405180910390f35b610234611a9e565b6102346004803603602081101561076d57600080fd5b5035611aa4565b6102346004803603608081101561078a57600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611bd2565b61027c600480360360608110156107c457600080fd5b506001600160a01b03813516906001600160801b0360208201358116916040013516611e09565b610234611f5f565b61027c6004803603608081101561080957600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561083357600080fd5b82018360208201111561084557600080fd5b803590602001918460208302840111600160201b8311171561086657600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602001356001600160a01b0316611f69565b6108d8600480360360208110156108c857600080fd5b50356001600160a01b03166120ac565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b61027c6004803603608081101561091d57600080fd5b506001600160a01b038135811691602081013591604082013581169160600135166120dc565b610234612291565b610234612407565b61027c6004803603602081101561096957600080fd5b50356001600160a01b031661240d565b6106a5612510565b61098961251a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156109c35781810151838201526020016109ab565b50505050905090810190601f1680156109f05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610a0861253b565b905090565b6099546001600160a01b0316610a21612646565b6001600160a01b031614610a6a576040805162461bcd60e51b815260206004820152601c6024820152600080516020613fbc833981519152604482015290519081900360640190fd5b610a7583838361264a565b15610ac657816001600160a01b0316836001600160a01b03167fb0bac59718cd343c80a813518afcf36846cfcfe6d56e2b3cab9bd49f5f9b251c836040518082815260200191505060405180910390a35b505050565b630a85bd0160e11b95945050505050565b6099546001600160a01b0316610af0612646565b6001600160a01b031614610b39576040805162461bcd60e51b815260206004820152601c6024820152600080516020613fbc833981519152604482015290519081900360640190fd5b610b42836126d2565b610b93576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b80610b9d57610d83565b60005b81811015610d0a57836001600160a01b03166342842e0e3087868686818110610bc557fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610c2257600080fd5b505af1925050508015610c33575060015b610d02573d808015610c61576040519150601f19603f3d011682016040523d82523d6000602084013e610c66565b606091505b507f17e975018310f88872b58d4d8263adca83cf5c1893496ea2a86923dab15276ad816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610cc6578181015183820152602001610cae565b50505050905090810190601f168015610cf35780820380516001836020036101000a031916815260200191505b509250505060405180910390a1505b600101610ba0565b50826001600160a01b0316846001600160a01b03167f69c2de32bc4d47f488e72626a6cfdee85089342e52675e7de79c4b417623960c848460405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a35b50505050565b6099546001600160a01b0316610d9d612646565b6001600160a01b031614610de6576040805162461bcd60e51b815260206004820152601c6024820152600080516020613fbc833981519152604482015290519081900360640190fd5b610df183838361264a565b15610ac657816001600160a01b0316836001600160a01b03167fc65f48aca3b7a99b7443d04b8ffbb073156179bc628dc3f7def5047748973469836040518082815260200191505060405180910390a3505050565b610e4e612646565b6001600160a01b0316610e5f6119a4565b6001600160a01b031614610ea8576040805162461bcd60e51b81526020600482018190526024820152600080516020613eda833981519152604482015290519081900360640190fd5b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610ef757600080fd5b505afa158015610f0b573d6000803e3d6000fd5b505050506040513d6020811015610f2157600080fd5b50511115610f9157816001600160a01b0316635c19a95c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015610f7857600080fd5b505af1158015610f8c573d6000803e3d6000fd5b505050505b5050565b600054610100900460ff1680610fae5750610fae6126e7565b80610fbc575060005460ff16155b610ff75760405162461bcd60e51b815260040180806020018281038252602e815260200180613e8b602e913960400191505060405180910390fd5b600054610100900460ff16158015611022576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0384166110675760405162461bcd60e51b8152600401808060200182810382526022815260200180613e436022913960400191505060405180910390fd5b82518067ffffffffffffffff8111801561108057600080fd5b506040519080825280602002602001820160405280156110aa578160200160208202803683370190505b5080516110bf91609891602090910190613d7a565b5060005b818110156110f65760008582815181106110d957fe5b602002602001015190506110ed81836126f8565b506001016110c3565b506110ff612823565b6111076128d4565b611112600019612969565b609780546001600160a01b0319166001600160a01b038716908117909155609a849055604080519182526020820185905280517f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce799281900390910190a1508015610d83576000805461ff001916905550505050565b600081611193816129a4565b6111d2576040805162461bcd60e51b81526020600482015260176024820152600080516020613f21833981519152604482015290519081900360640190fd5b6112578484856001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561122457600080fd5b505afa158015611238573d6000803e3d6000fd5b505050506040513d602081101561124e57600080fd5b50516000612a60565b50506001600160a01b039081166000908152609f60209081526040808320949093168252929092529020546001600160c01b031690565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112df57600080fd5b505afa1580156112f3573d6000803e3d6000fd5b505050506040513d602081101561130957600080fd5b505190506001600160a01b0381163314611363576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f6f6e6c792d7265736572766560501b604482015290519081900360640190fd5b609b80546000918290559061137782612a76565b90506113968582611386612a79565b6001600160a01b03169190612a88565b6040805183815290516001600160a01b038716917f1c71c8e11fd443227c8f8d3dc1a237a3a5e8310b540c7fbcf5169754aedf42c9919081900360200190a2949350505050565b609d5490565b60006113ee826126d2565b90505b919050565b6099546001600160a01b031661140a612646565b6001600160a01b031614611453576040805162461bcd60e51b815260206004820152601c6024820152600080516020613fbc833981519152604482015290519081900360640190fd5b8061145d816129a4565b61149c576040805162461bcd60e51b81526020600482015260176024820152600080516020613f21833981519152604482015290519081900360640190fd5b826114a657610d83565b609d548311156114fd576040805162461bcd60e51b815260206004820152601d60248201527f5072697a65506f6f6c2f61776172642d657863656564732d617661696c000000604482015290519081900360640190fd5b609d5461150a9084612ada565b609d5561151a8484846000612b3c565b60006115268385612c22565b90506115ac8584856001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561157a57600080fd5b505afa15801561158e573d6000803e3d6000fd5b505050506040513d60208110156115a457600080fd5b505184612a60565b826001600160a01b0316856001600160a01b03167fe2554529d99ab7a67db6b4cea2b32c7d55ae325f958861e05f304fdded867e31866040518082815260200191505060405180910390a35050505050565b611606612646565b6001600160a01b03166116176119a4565b6001600160a01b031614611660576040805162461bcd60e51b81526020600482018190526024820152600080516020613eda833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b609c5481565b60006113ee826129a4565b60006116c8848484612c5a565b949350505050565b6116d8612646565b6001600160a01b03166116e96119a4565b6001600160a01b031614611732576040805162461bcd60e51b81526020600482018190526024820152600080516020613eda833981519152604482015290519081900360640190fd5b61173b81612969565b50565b33611748816129a4565b611787576040805162461bcd60e51b81526020600482015260176024820152600080516020613f21833981519152604482015290519081900360640190fd5b6001600160a01b03841615611861576000336001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156117e557600080fd5b505afa1580156117f9573d6000803e3d6000fd5b505050506040513d602081101561180f57600080fd5b50519050600061182186338484612cb4565b9050846001600160a01b0316866001600160a01b031614611853576118503361184a8487612ada565b83612d43565b90505b61185e863383612d89565b50505b6001600160a01b0383161580159061188b5750836001600160a01b0316836001600160a01b031614155b156118e2576118e28333336001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561122457600080fd5b6001600160a01b0384161580159061190457506099546001600160a01b031615155b15610d83576099546040805163b221095760e01b81526001600160a01b0387811660048301528681166024830152604482018690523360648301529151919092169163b221095791608480830192600092919082900301818387803b15801561196c57600080fd5b505af1158015611980573d6000803e3d6000fd5b5050505050505050565b600080611998858585612f27565b90969095509350505050565b6033546001600160a01b031690565b6097546001600160a01b031681565b6119ca612646565b6001600160a01b03166119db6119a4565b6001600160a01b031614611a24576040805162461bcd60e51b81526020600482018190526024820152600080516020613eda833981519152604482015290519081900360640190fd5b61173b816130c5565b6099546001600160a01b031681565b60606098805480602002602001604051908101604052809291908181526020018280548015611a9457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a76575b5050505050905090565b609a5481565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611af557600080fd5b505afa158015611b09573d6000803e3d6000fd5b505050506040513d6020811015611b1f57600080fd5b505190506001600160a01b038116611b3b5760009150506113f1565b6000816001600160a01b031663010dfa58306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611b8a57600080fd5b505afa158015611b9e573d6000803e3d6000fd5b505050506040513d6020811015611bb457600080fd5b5051905080611bc8576000925050506113f1565b6116c884826131d8565b600060026065541415611c2c576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655582611c3b816129a4565b611c7a576040805162461bcd60e51b81526020600482015260176024820152600080516020613f21833981519152604482015290519081900360640190fd5b600080611c88888789612f27565b9150915084821115611ccb5760405162461bcd60e51b8152600401808060200182810382526027815260200180613efa6027913960400191505060405180910390fd5b611cd68887836131f9565b856001600160a01b031663631b5dfb611ced612646565b8a8a6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611d4557600080fd5b505af1158015611d59573d6000803e3d6000fd5b505050506000611d728389612ada90919063ffffffff16565b90506000611d7f82612a76565b9050611d8e8a82611386612a79565b876001600160a01b03168a6001600160a01b0316611daa612646565b604080518d81526020810186905280820189905290516001600160a01b0392909216917f0271704a58fd2953e49b87d67a0a3ce28a58147de98a5457f60b4686f63850309181900360600190a450506001606555509695505050505050565b82611e13816129a4565b611e52576040805162461bcd60e51b81526020600482015260176024820152600080516020613f21833981519152604482015290519081900360640190fd5b611e5a612646565b6001600160a01b0316611e6b6119a4565b6001600160a01b031614611eb4576040805162461bcd60e51b81526020600482018190526024820152600080516020613eda833981519152604482015290519081900360640190fd5b6040805180820182526001600160801b0380851680835286821660208085018281526001600160a01b038b166000818152609e84528890209651875492518716600160801b029087166fffffffffffffffffffffffffffffffff1990931692909217909516179094558451928352928201528083019190915290517ffb0ba2cf86a2b03bcf387753a2192da80a006afa99dd022bb301c78e323bf1b99181900360600190a150505050565b6000610a086132ba565b600054610100900460ff1680611f825750611f826126e7565b80611f90575060005460ff16155b611fcb5760405162461bcd60e51b815260040180806020018281038252602e815260200180613e8b602e913960400191505060405180910390fd5b600054610100900460ff16158015611ff6576000805460ff1961ff0019909116610100171660011790555b612001858585610f95565b6001600160a01b0382166120465760405162461bcd60e51b815260040180806020018281038252602b815260200180613f91602b913960400191505060405180910390fd5b60a080546001600160a01b0319166001600160a01b0384811691909117918290556040519116907fa81053747b04e643171034e5426f6deebb058fc29dfe032e33345a109224b31b90600090a280156120a5576000805461ff00191690555b5050505050565b6001600160a01b03166000908152609e60205260409020546001600160801b0380821692600160801b9092041690565b60026065541415612134576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655581612143816129a4565b612182576040805162461bcd60e51b81526020600482015260176024820152600080516020613f21833981519152604482015290519081900360640190fd5b8361218c81613336565b6121dd576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f657863656564732d6c69717569646974792d63617000604482015290519081900360640190fd5b60006121e7612646565b90506121f587878787612b3c565b612214813088612203612a79565b6001600160a01b031692919061335a565b61221d8661173b565b846001600160a01b0316876001600160a01b0316826001600160a01b03167f6ce569498e0f86f147466ac49211cb2a1ffe06195adb805e383b3f2365109160898860405180838152602001826001600160a01b031681526020019250505060405180910390a4505060016065555050505050565b6000600260655414156122eb576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655560006122fa61253b565b905060006123066132ba565b90506000828211612318576000612322565b6123228284612ada565b90506000609d548211612336576000612344565b609d54612344908390612ada565b905080156123f657600061235782611aa4565b905080156123b157609b5461236c90826133b4565b609b556123798282612ada565b6040805183815290519193507f5f1703ccfa2730d4245350f228079926a37f26a44ecf6978a7eeafff0af11407919081900360200190a15b609d546123be90836133b4565b609d556040805183815290517fce2b6e507c7ca1a20ce136810f524eefc19ba4c7e4866eb6cc0cba76e778d4be9181900360200190a1505b609d54945050505050600160655590565b609b5481565b612415612646565b6001600160a01b03166124266119a4565b6001600160a01b03161461246f576040805162461bcd60e51b81526020600482018190526024820152600080516020613eda833981519152604482015290519081900360640190fd5b6001600160a01b0381166124b45760405162461bcd60e51b8152600401808060200182810382526026815260200180613df66026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610a08612a79565b60405180604001604052806005815260200164332e342e3560d81b81525081565b600080609b5490506060609880548060200260200160405190810160405280929190818152602001828054801561259b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161257d575b505083519394506000925050505b8181101561263d576126338382815181106125c057fe5b60200260200101516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561260057600080fd5b505afa158015612614573d6000803e3d6000fd5b505050506040513d602081101561262a57600080fd5b505185906133b4565b93506001016125a9565b50919250505090565b3390565b6000612655836126d2565b6126a6576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b816126b3575060006126cb565b6126c76001600160a01b0384168584612a88565b5060015b9392505050565b60a0546001600160a01b039182169116141590565b60006126f23061340e565b15905090565b306001600160a01b0316826001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b15801561273b57600080fd5b505afa15801561274f573d6000803e3d6000fd5b505050506040513d602081101561276557600080fd5b50516001600160a01b0316146127c2576040805162461bcd60e51b815260206004820152601e60248201527f5072697a65506f6f6c2f746f6b656e2d6374726c722d6d69736d617463680000604482015290519081900360640190fd5b81609882815481106127d057fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051918416917f460e712b4a5d801d031ed673dea209b73ab854f7ddeb86b6c48082e92c3eee669190a25050565b600054610100900460ff168061283c575061283c6126e7565b8061284a575060005460ff16155b6128855760405162461bcd60e51b815260040180806020018281038252602e815260200180613e8b602e913960400191505060405180910390fd5b600054610100900460ff161580156128b0576000805460ff1961ff0019909116610100171660011790555b6128b8613414565b6128c06134b4565b801561173b576000805461ff001916905550565b600054610100900460ff16806128ed57506128ed6126e7565b806128fb575060005460ff16155b6129365760405162461bcd60e51b815260040180806020018281038252602e815260200180613e8b602e913960400191505060405180910390fd5b600054610100900460ff16158015612961576000805460ff1961ff0019909116610100171660011790555b6128c06135ad565b609c8190556040805182815290517f3ff20538222f568f27ff436c0c49dfd3e48d5b8f86533a3f759dc1c7089775ab9181900360200190a150565b6000606060988054806020026020016040519081016040528092919081815260200182805480156129fe57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116129e0575b505083519394506000925050505b81811015612a5557846001600160a01b0316838281518110612a2a57fe5b60200260200101516001600160a01b03161415612a4d57600193505050506113f1565b600101612a0c565b506000949350505050565b610d838484612a7187878787612cb4565b612d89565b90565b60a0546001600160a01b031690565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ac6908490613653565b600082821115612b31576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6099546001600160a01b031615612bcb57609954604080516304d7f3db60e41b81526001600160a01b038781166004830152602482018790528581166044830152848116606483015291519190921691634d7f3db091608480830192600092919082900301818387803b158015612bb257600080fd5b505af1158015612bc6573d6000803e3d6000fd5b505050505b816001600160a01b0316635d7b075885856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561196c57600080fd5b6001600160a01b0382166000908152609e60205260408120546126cb908390612c559082906001600160801b03166131d8565b613704565b6001600160a01b0383166000908152609e60205260408120548190612c90908590600160801b90046001600160801b03166131d8565b905080612ca15760009150506126cb565b612cab8382613729565b95945050505050565b6001600160a01b038381166000908152609f6020908152604080832093881683529290529081208054829190600160e01b900460ff16612cf75760009150612d39565b6000612d04888888613790565b8254909150612d359088908890612d30908990612d2a906001600160c01b0316876133b4565b906133b4565b612d43565b9250505b5095945050505050565b6001600160a01b0383166000908152609e60205260408120548190612d729085906001600160801b03166131d8565b905080831115612d80578092505b50909392505050565b6001600160a01b038083166000908152609f602090815260408083209387168352929052819020548151606081019092526001600160c01b03169080612dce84613841565b6001600160801b03168152602001612dec612de7613889565b61388d565b63ffffffff908116825260016020928301526001600160a01b038681166000908152609f84526040808220928a168252918452819020845181549486015195909201516001600160c01b03199094166001600160c01b039092169190911763ffffffff60c01b1916600160c01b94909216939093021760ff60e01b1916600160e01b9115159190910217905581811015612ecf576001600160a01b038084169085167f2f92d56910619b38bc29fd8e4ca5e56359edac7a0c086cdcd305fb603fa37491612eb98585612ada565b60408051918252519081900360200190a3610d83565b80821015610d83576001600160a01b038084169085167ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf612f108486612ada565b60408051918252519081900360200190a350505050565b6000806000846001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612f7957600080fd5b505afa158015612f8d573d6000803e3d6000fd5b505050506040513d6020811015612fa357600080fd5b5051905083811015612ff5576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f696e737566662d66756e647360501b604482015290519081900360640190fd5b6130028686836000612a60565b6000613017866130128488612ada565b612c22565b6001600160a01b038088166000908152609f60209081526040808320938c16835292905290812054919250906001600160c01b0316821161308e576001600160a01b038088166000908152609f60209081526040808320938c168352929052205461308b906001600160c01b031683612ada565b90505b600061309a8888612c22565b90508082116130a957816130ab565b805b94506130b78186612ada565b955050505050935093915050565b6001600160a01b038116613120576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f7072697a6553747261746567792d6e6f742d7a65726f604482015290519081900360640190fd5b61313d6001600160a01b038216600162a1cb1960e01b03196138d1565b61318e576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f7072697a6553747261746567792d696e76616c696400604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0383169081179091556040517f7f58dc86bc2e435cb77ca0edb1df55e25f90caf2d6bd866971715437d456a21290600090a250565b6000806131e583856138ed565b90506116c881670de0b6b3a7640000613946565b6001600160a01b038083166000908152609f602090815260408083209387168352929052205461323b90613236906001600160c01b031683612ada565b613841565b6001600160a01b038084166000818152609f602090815260408083209489168084529482529182902080546001600160c01b0319166001600160801b0396909616959095179094558051858152905191937ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf92918290030190a3505050565b60a054604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561330557600080fd5b505afa158015613319573d6000803e3d6000fd5b505050506040513d602081101561332f57600080fd5b5051905090565b60008061334161253b565b609c5490915061335182856133b4565b11159392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610d83908590613653565b6000828201838110156126cb576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3b151590565b600054610100900460ff168061342d575061342d6126e7565b8061343b575060005460ff16155b6134765760405162461bcd60e51b815260040180806020018281038252602e815260200180613e8b602e913960400191505060405180910390fd5b600054610100900460ff161580156128c0576000805460ff1961ff001990911661010017166001179055801561173b576000805461ff001916905550565b600054610100900460ff16806134cd57506134cd6126e7565b806134db575060005460ff16155b6135165760405162461bcd60e51b815260040180806020018281038252602e815260200180613e8b602e913960400191505060405180910390fd5b600054610100900460ff16158015613541576000805460ff1961ff0019909116610100171660011790555b600061354b612646565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561173b576000805461ff001916905550565b600054610100900460ff16806135c657506135c66126e7565b806135d4575060005460ff16155b61360f5760405162461bcd60e51b815260040180806020018281038252602e815260200180613e8b602e913960400191505060405180910390fd5b600054610100900460ff1615801561363a576000805460ff1961ff0019909116610100171660011790555b6001606555801561173b576000805461ff001916905550565b60606136a8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139889092919063ffffffff16565b805190915015610ac6578080602001905160208110156136c757600080fd5b5051610ac65760405162461bcd60e51b815260040180806020018281038252602a815260200180613f67602a913960400191505060405180910390fd5b60008061371384609a546131d8565b905080831115613721578092505b509092915050565b600080821161377f576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161378857fe5b049392505050565b6001600160a01b038281166000908152609f60209081526040808320938716835292905290812054600160c01b810463ffffffff1690600160e01b900460ff166137de5760009150506126cb565b60006137f2826137ec613889565b90612ada565b6001600160a01b0386166000908152609e60205260408120549192509061382a908390600160801b90046001600160801b03166138ed565b905061383685826131d8565b979650505050505050565b6000600160801b82106138855760405162461bcd60e51b8152600401808060200182810382526027815260200180613e1c6027913960400191505060405180910390fd5b5090565b4290565b6000600160201b82106138855760405162461bcd60e51b8152600401808060200182810382526026815260200180613f416026913960400191505060405180910390fd5b60006138dc83613997565b80156126cb57506126cb83836139ca565b6000826138fc57506000612b36565b8282028284828161390957fe5b04146126cb5760405162461bcd60e51b8152600401808060200182810382526021815260200180613eb96021913960400191505060405180910390fd5b60006126cb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506139ed565b60606116c88484600085613a8f565b60006139aa826301ffc9a760e01b6139ca565b80156113ee57506139c3826001600160e01b03196139ca565b1592915050565b60008060006139d98585613be0565b91509150818015612cab5750949350505050565b60008183613a795760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613a3e578181015183820152602001613a26565b50505050905090810190601f168015613a6b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613a8557fe5b0495945050505050565b606082471015613ad05760405162461bcd60e51b8152600401808060200182810382526026815260200180613e656026913960400191505060405180910390fd5b613ad98561340e565b613b2a576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613b695780518252601f199092019160209182019101613b4a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613bcb576040519150601f19603f3d011682016040523d82523d6000602084013e613bd0565b606091505b5091509150613836828286613d14565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b1781529151815160009384939284926060926001600160a01b038a169261753092879282918083835b60208310613c685780518252601f199092019160209182019101613c49565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114613cc9576040519150601f19603f3d011682016040523d82523d6000602084013e613cce565b606091505b5091509150602081511015613cec5760008094509450505050613d0d565b81818060200190516020811015613d0257600080fd5b505190955093505050505b9250929050565b60608315613d235750816126cb565b825115613d335782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315613a3e578181015183820152602001613a26565b828054828255906000526020600020908101928215613dcf579160200282015b82811115613dcf57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613d9a565b506138859291505b808211156138855780546001600160a01b0319168155600101613dd756fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e2031323820626974735072697a65506f6f6c2f7265736572766552656769737472792d6e6f742d7a65726f416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725072697a65506f6f6c2f657869742d6665652d657863656564732d757365722d6d6178696d756d5072697a65506f6f6c2f756e6b6e6f776e2d746f6b656e00000000000000000053616665436173743a2076616c756520646f65736e27742066697420696e20333220626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645374616b655072697a65506f6f6c2f7374616b652d746f6b656e2d6e6f742d7a65726f2d616464726573735072697a65506f6f6c2f6f6e6c792d7072697a65537472617465677900000000a264697066735822122010013c2db674dbeefb51bd0738605b9e7e65256da75fa287bb6d12238276cd4964736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x227 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x888C2B6F GT PUSH2 0x130 JUMPI DUP1 PUSH4 0xA7B2CC31 GT PUSH2 0xB8 JUMPI DUP1 PUSH4 0xE6D8A94B GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xE6D8A94B EQ PUSH2 0x943 JUMPI DUP1 PUSH4 0xEDB4E1CF EQ PUSH2 0x94B JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x953 JUMPI DUP1 PUSH4 0xFC0C546A EQ PUSH2 0x979 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x981 JUMPI PUSH2 0x227 JUMP JUMPDEST DUP1 PUSH4 0xA7B2CC31 EQ PUSH2 0x7AE JUMPI DUP1 PUSH4 0xB69EF8A8 EQ PUSH2 0x7EB JUMPI DUP1 PUSH4 0xC5871485 EQ PUSH2 0x7F3 JUMPI DUP1 PUSH4 0xD4A1361D EQ PUSH2 0x8B2 JUMPI DUP1 PUSH4 0xE323F825 EQ PUSH2 0x907 JUMPI PUSH2 0x227 JUMP JUMPDEST DUP1 PUSH4 0x98BF3EB6 GT PUSH2 0xFF JUMPI DUP1 PUSH4 0x98BF3EB6 EQ PUSH2 0x6EF JUMPI DUP1 PUSH4 0x9D63848A EQ PUSH2 0x6F7 JUMPI DUP1 PUSH4 0x9E167519 EQ PUSH2 0x74F JUMPI DUP1 PUSH4 0x9FE32A91 EQ PUSH2 0x757 JUMPI DUP1 PUSH4 0xA016240B EQ PUSH2 0x774 JUMPI PUSH2 0x227 JUMP JUMPDEST DUP1 PUSH4 0x888C2B6F EQ PUSH2 0x64E JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x69D JUMPI DUP1 PUSH4 0x8E71C1F6 EQ PUSH2 0x6C1 JUMPI DUP1 PUSH4 0x91CA480E EQ PUSH2 0x6C9 JUMPI PUSH2 0x227 JUMP JUMPDEST DUP1 PUSH4 0x630665B4 GT PUSH2 0x1B3 JUMPI DUP1 PUSH4 0x76687D3D GT PUSH2 0x182 JUMPI DUP1 PUSH4 0x76687D3D EQ PUSH2 0x59B JUMPI DUP1 PUSH4 0x78B3D327 EQ PUSH2 0x5A3 JUMPI DUP1 PUSH4 0x79CB8563 EQ PUSH2 0x5C9 JUMPI DUP1 PUSH4 0x7B99ADB1 EQ PUSH2 0x5FB JUMPI DUP1 PUSH4 0x7CBAB1C7 EQ PUSH2 0x618 JUMPI PUSH2 0x227 JUMP JUMPDEST DUP1 PUSH4 0x630665B4 EQ PUSH2 0x51B JUMPI DUP1 PUSH4 0x6A3FD4F9 EQ PUSH2 0x523 JUMPI DUP1 PUSH4 0x6B1B863A EQ PUSH2 0x55D JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x593 JUMPI PUSH2 0x227 JUMP JUMPDEST DUP1 PUSH4 0x2B0AB144 GT PUSH2 0x1FA JUMPI DUP1 PUSH4 0x2B0AB144 EQ PUSH2 0x3B0 JUMPI DUP1 PUSH4 0x2F7627E3 EQ PUSH2 0x3E6 JUMPI DUP1 PUSH4 0x3EDE50C6 EQ PUSH2 0x414 JUMPI DUP1 PUSH4 0x494DE9F7 EQ PUSH2 0x4C7 JUMPI DUP1 PUSH4 0x52A387AB EQ PUSH2 0x4F5 JUMPI PUSH2 0x227 JUMP JUMPDEST DUP1 PUSH4 0x937EB54 EQ PUSH2 0x22C JUMPI DUP1 PUSH4 0x13F55E39 EQ PUSH2 0x246 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x27E JUMPI DUP1 PUSH4 0x16960D55 EQ PUSH2 0x329 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x234 PUSH2 0x9FE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x25C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xA0D JUMP JUMPDEST STOP JUMPDEST PUSH2 0x30C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x294 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x2CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x2E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x301 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xACB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x33F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x384 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x3A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xADC JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x3C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xD89 JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xE46 JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x42A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x454 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x466 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x487 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0xF95 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x234 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x4DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x1187 JUMP JUMPDEST PUSH2 0x234 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x50B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x128E JUMP JUMPDEST PUSH2 0x234 PUSH2 0x13DD JUMP JUMPDEST PUSH2 0x549 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x539 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x13E3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x573 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 SWAP1 SWAP2 ADD CALLDATALOAD AND PUSH2 0x13F6 JUMP JUMPDEST PUSH2 0x27C PUSH2 0x15FE JUMP JUMPDEST PUSH2 0x234 PUSH2 0x16AA JUMP JUMPDEST PUSH2 0x549 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16B0 JUMP JUMPDEST PUSH2 0x234 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x5DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x16BB JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x611 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x16D0 JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x62E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x173E JUMP JUMPDEST PUSH2 0x684 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x664 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x198A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB ADD SWAP1 RETURN JUMPDEST PUSH2 0x6A5 PUSH2 0x19A4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x6A5 PUSH2 0x19B3 JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x19C2 JUMP JUMPDEST PUSH2 0x6A5 PUSH2 0x1A2D JUMP JUMPDEST PUSH2 0x6FF PUSH2 0x1A3C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x73B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x723 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x234 PUSH2 0x1A9E JUMP JUMPDEST PUSH2 0x234 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x76D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1AA4 JUMP JUMPDEST PUSH2 0x234 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x78A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x1BD2 JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x7C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x40 ADD CALLDATALOAD AND PUSH2 0x1E09 JUMP JUMPDEST PUSH2 0x234 PUSH2 0x1F5F JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x809 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x833 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x845 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x866 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1F69 JUMP JUMPDEST PUSH2 0x8D8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x8C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x20AC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x91D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x20DC JUMP JUMPDEST PUSH2 0x234 PUSH2 0x2291 JUMP JUMPDEST PUSH2 0x234 PUSH2 0x2407 JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x969 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x240D JUMP JUMPDEST PUSH2 0x6A5 PUSH2 0x2510 JUMP JUMPDEST PUSH2 0x989 PUSH2 0x251A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x9C3 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x9AB JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x9F0 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xA08 PUSH2 0x253B JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xA21 PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xA6A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FBC DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xA75 DUP4 DUP4 DUP4 PUSH2 0x264A JUMP JUMPDEST ISZERO PUSH2 0xAC6 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB0BAC59718CD343C80A813518AFCF36846CFCFE6D56E2B3CAB9BD49F5F9B251C DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0xA85BD01 PUSH1 0xE1 SHL SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xAF0 PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xB39 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FBC DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xB42 DUP4 PUSH2 0x26D2 JUMP JUMPDEST PUSH2 0xB93 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0xB9D JUMPI PUSH2 0xD83 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xD0A JUMPI DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x42842E0E ADDRESS DUP8 DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0xBC5 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC22 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0xC33 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xD02 JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0xC61 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xC66 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH32 0x17E975018310F88872B58D4D8263ADCA83CF5C1893496EA2A86923DAB15276AD DUP2 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xCC6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xCAE JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xCF3 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xBA0 JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x69C2DE32BC4D47F488E72626A6CFDEE85089342E52675E7DE79C4B417623960C DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP6 POP SWAP1 SWAP4 POP POP POP POP LOG3 JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xD9D PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xDE6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FBC DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xDF1 DUP4 DUP4 DUP4 PUSH2 0x264A JUMP JUMPDEST ISZERO PUSH2 0xAC6 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC65F48ACA3B7A99B7443D04B8FFBB073156179BC628DC3F7DEF5047748973469 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH2 0xE4E PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE5F PUSH2 0x19A4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xEA8 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3EDA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xEF7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xF0B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xF21 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD GT ISZERO PUSH2 0xF91 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5C19A95C DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF78 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF8C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0xFAE JUMPI POP PUSH2 0xFAE PUSH2 0x26E7 JUMP JUMPDEST DUP1 PUSH2 0xFBC JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0xFF7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1022 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x1067 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E43 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 MLOAD DUP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x1080 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x10AA JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP1 MLOAD PUSH2 0x10BF SWAP2 PUSH1 0x98 SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x3D7A JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x10F6 JUMPI PUSH1 0x0 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x10D9 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0x10ED DUP2 DUP4 PUSH2 0x26F8 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x10C3 JUMP JUMPDEST POP PUSH2 0x10FF PUSH2 0x2823 JUMP JUMPDEST PUSH2 0x1107 PUSH2 0x28D4 JUMP JUMPDEST PUSH2 0x1112 PUSH1 0x0 NOT PUSH2 0x2969 JUMP JUMPDEST PUSH1 0x97 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x9A DUP5 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP6 SWAP1 MSTORE DUP1 MLOAD PUSH32 0x25FF68DD81B34665B5BA7E553EE5511BF6812E12ADB4A7E2C0D9E26B3099CE79 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 POP DUP1 ISZERO PUSH2 0xD83 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x1193 DUP2 PUSH2 0x29A4 JUMP JUMPDEST PUSH2 0x11D2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F21 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1257 DUP5 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1224 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1238 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x124E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 PUSH2 0x2A60 JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP4 AND DUP3 MSTORE SWAP3 SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x12F3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1309 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ PUSH2 0x1363 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F6F6E6C792D72657365727665 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9B DUP1 SLOAD PUSH1 0x0 SWAP2 DUP3 SWAP1 SSTORE SWAP1 PUSH2 0x1377 DUP3 PUSH2 0x2A76 JUMP JUMPDEST SWAP1 POP PUSH2 0x1396 DUP6 DUP3 PUSH2 0x1386 PUSH2 0x2A79 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x2A88 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP2 PUSH32 0x1C71C8E11FD443227C8F8D3DC1A237A3A5E8310B540C7FBCF5169754AEDF42C9 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x9D SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x13EE DUP3 PUSH2 0x26D2 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x140A PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1453 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FBC DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x145D DUP2 PUSH2 0x29A4 JUMP JUMPDEST PUSH2 0x149C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F21 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 PUSH2 0x14A6 JUMPI PUSH2 0xD83 JUMP JUMPDEST PUSH1 0x9D SLOAD DUP4 GT ISZERO PUSH2 0x14FD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F61776172642D657863656564732D617661696C000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x150A SWAP1 DUP5 PUSH2 0x2ADA JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH2 0x151A DUP5 DUP5 DUP5 PUSH1 0x0 PUSH2 0x2B3C JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1526 DUP4 DUP6 PUSH2 0x2C22 JUMP JUMPDEST SWAP1 POP PUSH2 0x15AC DUP6 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x157A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x158E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x15A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP5 PUSH2 0x2A60 JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xE2554529D99AB7A67DB6B4CEA2B32C7D55AE325F958861E05F304FDDED867E31 DUP7 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1606 PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1617 PUSH2 0x19A4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1660 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3EDA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x13EE DUP3 PUSH2 0x29A4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x16C8 DUP5 DUP5 DUP5 PUSH2 0x2C5A JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x16D8 PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16E9 PUSH2 0x19A4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1732 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3EDA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x173B DUP2 PUSH2 0x2969 JUMP JUMPDEST POP JUMP JUMPDEST CALLER PUSH2 0x1748 DUP2 PUSH2 0x29A4 JUMP JUMPDEST PUSH2 0x1787 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F21 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO PUSH2 0x1861 JUMPI PUSH1 0x0 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP7 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x17E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x17F9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x180F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x1821 DUP7 CALLER DUP5 DUP5 PUSH2 0x2CB4 JUMP JUMPDEST SWAP1 POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1853 JUMPI PUSH2 0x1850 CALLER PUSH2 0x184A DUP5 DUP8 PUSH2 0x2ADA JUMP JUMPDEST DUP4 PUSH2 0x2D43 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x185E DUP7 CALLER DUP4 PUSH2 0x2D89 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x188B JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x18E2 JUMPI PUSH2 0x18E2 DUP4 CALLER CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1224 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1904 JUMPI POP PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xD83 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP7 SWAP1 MSTORE CALLER PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xB2210957 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x196C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1980 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1998 DUP6 DUP6 DUP6 PUSH2 0x2F27 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x97 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x19CA PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x19DB PUSH2 0x19A4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1A24 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3EDA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x173B DUP2 PUSH2 0x30C5 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1A94 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1A76 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1AF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B09 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1B1F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1B3B JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x13F1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x10DFA58 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1B8A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B9E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1BB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x1BC8 JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x13F1 JUMP JUMPDEST PUSH2 0x16C8 DUP5 DUP3 PUSH2 0x31D8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x1C2C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP3 PUSH2 0x1C3B DUP2 PUSH2 0x29A4 JUMP JUMPDEST PUSH2 0x1C7A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F21 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1C88 DUP9 DUP8 DUP10 PUSH2 0x2F27 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0x1CCB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3EFA PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1CD6 DUP9 DUP8 DUP4 PUSH2 0x31F9 JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x631B5DFB PUSH2 0x1CED PUSH2 0x2646 JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1D45 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D59 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 PUSH2 0x1D72 DUP4 DUP10 PUSH2 0x2ADA SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1D7F DUP3 PUSH2 0x2A76 JUMP JUMPDEST SWAP1 POP PUSH2 0x1D8E DUP11 DUP3 PUSH2 0x1386 PUSH2 0x2A79 JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1DAA PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP14 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE DUP1 DUP3 ADD DUP10 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x271704A58FD2953E49B87D67A0A3CE28A58147DE98A5457F60B4686F6385030 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH2 0x1E13 DUP2 PUSH2 0x29A4 JUMP JUMPDEST PUSH2 0x1E52 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F21 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1E5A PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E6B PUSH2 0x19A4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1EB4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3EDA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP6 AND DUP1 DUP4 MSTORE DUP7 DUP3 AND PUSH1 0x20 DUP1 DUP6 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9E DUP5 MSTORE DUP9 SWAP1 KECCAK256 SWAP7 MLOAD DUP8 SLOAD SWAP3 MLOAD DUP8 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP1 DUP8 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP6 AND OR SWAP1 SWAP5 SSTORE DUP5 MLOAD SWAP3 DUP4 MSTORE SWAP3 DUP3 ADD MSTORE DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 MLOAD PUSH32 0xFB0BA2CF86A2B03BCF387753A2192DA80A006AFA99DD022BB301C78E323BF1B9 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA08 PUSH2 0x32BA JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1F82 JUMPI POP PUSH2 0x1F82 PUSH2 0x26E7 JUMP JUMPDEST DUP1 PUSH2 0x1F90 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1FCB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1FF6 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2001 DUP6 DUP6 DUP6 PUSH2 0xF95 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x2046 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F91 PUSH1 0x2B SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xA0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 AND SWAP1 PUSH32 0xA81053747B04E643171034E5426F6DEEBB058FC29DFE032E33345A109224B31B SWAP1 PUSH1 0x0 SWAP1 LOG2 DUP1 ISZERO PUSH2 0x20A5 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP3 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND SWAP1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x2134 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP2 PUSH2 0x2143 DUP2 PUSH2 0x29A4 JUMP JUMPDEST PUSH2 0x2182 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F21 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP4 PUSH2 0x218C DUP2 PUSH2 0x3336 JUMP JUMPDEST PUSH2 0x21DD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F657863656564732D6C69717569646974792D63617000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x21E7 PUSH2 0x2646 JUMP JUMPDEST SWAP1 POP PUSH2 0x21F5 DUP8 DUP8 DUP8 DUP8 PUSH2 0x2B3C JUMP JUMPDEST PUSH2 0x2214 DUP2 ADDRESS DUP9 PUSH2 0x2203 PUSH2 0x2A79 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 SWAP1 PUSH2 0x335A JUMP JUMPDEST PUSH2 0x221D DUP7 PUSH2 0x173B JUMP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6CE569498E0F86F147466AC49211CB2A1FFE06195ADB805E383B3F2365109160 DUP10 DUP9 PUSH1 0x40 MLOAD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x22EB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE PUSH1 0x0 PUSH2 0x22FA PUSH2 0x253B JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2306 PUSH2 0x32BA JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 DUP3 GT PUSH2 0x2318 JUMPI PUSH1 0x0 PUSH2 0x2322 JUMP JUMPDEST PUSH2 0x2322 DUP3 DUP5 PUSH2 0x2ADA JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x9D SLOAD DUP3 GT PUSH2 0x2336 JUMPI PUSH1 0x0 PUSH2 0x2344 JUMP JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x2344 SWAP1 DUP4 SWAP1 PUSH2 0x2ADA JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x23F6 JUMPI PUSH1 0x0 PUSH2 0x2357 DUP3 PUSH2 0x1AA4 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x23B1 JUMPI PUSH1 0x9B SLOAD PUSH2 0x236C SWAP1 DUP3 PUSH2 0x33B4 JUMP JUMPDEST PUSH1 0x9B SSTORE PUSH2 0x2379 DUP3 DUP3 PUSH2 0x2ADA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 POP PUSH32 0x5F1703CCFA2730D4245350F228079926A37F26A44ECF6978A7EEAFFF0AF11407 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x23BE SWAP1 DUP4 PUSH2 0x33B4 JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xCE2B6E507C7CA1A20CE136810F524EEFC19BA4C7E4866EB6CC0CBA76E778D4BE SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH1 0x9D SLOAD SWAP5 POP POP POP POP POP PUSH1 0x1 PUSH1 0x65 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x9B SLOAD DUP2 JUMP JUMPDEST PUSH2 0x2415 PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2426 PUSH2 0x19A4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x246F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3EDA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x24B4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3DF6 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA08 PUSH2 0x2A79 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x9B SLOAD SWAP1 POP PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x259B JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x257D JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x263D JUMPI PUSH2 0x2633 DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x25C0 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2600 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2614 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x262A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP6 SWAP1 PUSH2 0x33B4 JUMP JUMPDEST SWAP4 POP PUSH1 0x1 ADD PUSH2 0x25A9 JUMP JUMPDEST POP SWAP2 SWAP3 POP POP POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2655 DUP4 PUSH2 0x26D2 JUMP JUMPDEST PUSH2 0x26A6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x26B3 JUMPI POP PUSH1 0x0 PUSH2 0x26CB JUMP JUMPDEST PUSH2 0x26C7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP6 DUP5 PUSH2 0x2A88 JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND SWAP2 AND EQ ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x26F2 ADDRESS PUSH2 0x340E JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF77C4791 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x273B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x274F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2765 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x27C2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F746F6B656E2D6374726C722D6D69736D617463680000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x98 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x27D0 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 DUP5 AND SWAP2 PUSH32 0x460E712B4A5D801D031ED673DEA209B73AB854F7DDEB86B6C48082E92C3EEE66 SWAP2 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x283C JUMPI POP PUSH2 0x283C PUSH2 0x26E7 JUMP JUMPDEST DUP1 PUSH2 0x284A JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2885 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x28B0 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x28B8 PUSH2 0x3414 JUMP JUMPDEST PUSH2 0x28C0 PUSH2 0x34B4 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x173B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x28ED JUMPI POP PUSH2 0x28ED PUSH2 0x26E7 JUMP JUMPDEST DUP1 PUSH2 0x28FB JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2936 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2961 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x28C0 PUSH2 0x35AD JUMP JUMPDEST PUSH1 0x9C DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3FF20538222F568F27FF436C0C49DFD3E48D5B8F86533A3F759DC1C7089775AB SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x29FE JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x29E0 JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2A55 JUMPI DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2A2A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x2A4D JUMPI PUSH1 0x1 SWAP4 POP POP POP POP PUSH2 0x13F1 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2A0C JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xD83 DUP5 DUP5 PUSH2 0x2A71 DUP8 DUP8 DUP8 DUP8 PUSH2 0x2CB4 JUMP JUMPDEST PUSH2 0x2D89 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xAC6 SWAP1 DUP5 SWAP1 PUSH2 0x3653 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2B31 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2BCB JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE DUP6 DUP2 AND PUSH1 0x44 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x4D7F3DB0 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2BB2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2BC6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5D7B0758 DUP6 DUP6 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x196C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x26CB SWAP1 DUP4 SWAP1 PUSH2 0x2C55 SWAP1 DUP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x31D8 JUMP JUMPDEST PUSH2 0x3704 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2C90 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x31D8 JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x2CA1 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x26CB JUMP JUMPDEST PUSH2 0x2CAB DUP4 DUP3 PUSH2 0x3729 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP3 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x2CF7 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x2D39 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2D04 DUP9 DUP9 DUP9 PUSH2 0x3790 JUMP JUMPDEST DUP3 SLOAD SWAP1 SWAP2 POP PUSH2 0x2D35 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x2D30 SWAP1 DUP10 SWAP1 PUSH2 0x2D2A SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP8 PUSH2 0x33B4 JUMP JUMPDEST SWAP1 PUSH2 0x33B4 JUMP JUMPDEST PUSH2 0x2D43 JUMP JUMPDEST SWAP3 POP POP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2D72 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x31D8 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x2D80 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE DUP2 SWAP1 KECCAK256 SLOAD DUP2 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 DUP1 PUSH2 0x2DCE DUP5 PUSH2 0x3841 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2DEC PUSH2 0x2DE7 PUSH2 0x3889 JUMP JUMPDEST PUSH2 0x388D JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP3 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 DUP11 AND DUP3 MSTORE SWAP2 DUP5 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP5 DUP7 ADD MLOAD SWAP6 SWAP1 SWAP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH4 0xFFFFFFFF PUSH1 0xC0 SHL NOT AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP5 SWAP1 SWAP3 AND SWAP4 SWAP1 SWAP4 MUL OR PUSH1 0xFF PUSH1 0xE0 SHL NOT AND PUSH1 0x1 PUSH1 0xE0 SHL SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE DUP2 DUP2 LT ISZERO PUSH2 0x2ECF JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0x2F92D56910619B38BC29FD8E4CA5E56359EDAC7A0C086CDCD305FB603FA37491 PUSH2 0x2EB9 DUP6 DUP6 PUSH2 0x2ADA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 PUSH2 0xD83 JUMP JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0xD83 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF PUSH2 0x2F10 DUP5 DUP7 PUSH2 0x2ADA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2F79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2F8D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2FA3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x2FF5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F696E737566662D66756E6473 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x3002 DUP7 DUP7 DUP4 PUSH1 0x0 PUSH2 0x2A60 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3017 DUP7 PUSH2 0x3012 DUP5 DUP9 PUSH2 0x2ADA JUMP JUMPDEST PUSH2 0x2C22 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP3 GT PUSH2 0x308E JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x308B SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2ADA JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x309A DUP9 DUP9 PUSH2 0x2C22 JUMP JUMPDEST SWAP1 POP DUP1 DUP3 GT PUSH2 0x30A9 JUMPI DUP2 PUSH2 0x30AB JUMP JUMPDEST DUP1 JUMPDEST SWAP5 POP PUSH2 0x30B7 DUP2 DUP7 PUSH2 0x2ADA JUMP JUMPDEST SWAP6 POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x3120 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D6E6F742D7A65726F PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x313D PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x38D1 JUMP JUMPDEST PUSH2 0x318E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D696E76616C696400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x99 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x7F58DC86BC2E435CB77CA0EDB1DF55E25F90CAF2D6BD866971715437D456A212 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x31E5 DUP4 DUP6 PUSH2 0x38ED JUMP JUMPDEST SWAP1 POP PUSH2 0x16C8 DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x3946 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x323B SWAP1 PUSH2 0x3236 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2ADA JUMP JUMPDEST PUSH2 0x3841 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3305 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3319 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x332F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3341 PUSH2 0x253B JUMP JUMPDEST PUSH1 0x9C SLOAD SWAP1 SWAP2 POP PUSH2 0x3351 DUP3 DUP6 PUSH2 0x33B4 JUMP JUMPDEST GT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x24 DUP4 ADD MSTORE DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x84 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xD83 SWAP1 DUP6 SWAP1 PUSH2 0x3653 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x26CB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x342D JUMPI POP PUSH2 0x342D PUSH2 0x26E7 JUMP JUMPDEST DUP1 PUSH2 0x343B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3476 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x28C0 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x173B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x34CD JUMPI POP PUSH2 0x34CD PUSH2 0x26E7 JUMP JUMPDEST DUP1 PUSH2 0x34DB JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3516 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3541 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x354B PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x173B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x35C6 JUMPI POP PUSH2 0x35C6 PUSH2 0x26E7 JUMP JUMPDEST DUP1 PUSH2 0x35D4 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x360F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x363A JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x65 SSTORE DUP1 ISZERO PUSH2 0x173B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x36A8 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3988 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xAC6 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x36C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xAC6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F67 PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3713 DUP5 PUSH1 0x9A SLOAD PUSH2 0x31D8 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x3721 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x377F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x3788 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xC0 SHL DUP2 DIV PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x37DE JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x26CB JUMP JUMPDEST PUSH1 0x0 PUSH2 0x37F2 DUP3 PUSH2 0x37EC PUSH2 0x3889 JUMP JUMPDEST SWAP1 PUSH2 0x2ADA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x382A SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x38ED JUMP JUMPDEST SWAP1 POP PUSH2 0x3836 DUP6 DUP3 PUSH2 0x31D8 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x3885 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E1C PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST TIMESTAMP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x20 SHL DUP3 LT PUSH2 0x3885 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F41 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x38DC DUP4 PUSH2 0x3997 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x26CB JUMPI POP PUSH2 0x26CB DUP4 DUP4 PUSH2 0x39CA JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x38FC JUMPI POP PUSH1 0x0 PUSH2 0x2B36 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x3909 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x26CB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3EB9 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x26CB DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x39ED JUMP JUMPDEST PUSH1 0x60 PUSH2 0x16C8 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x3A8F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x39AA DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x39CA JUMP JUMPDEST DUP1 ISZERO PUSH2 0x13EE JUMPI POP PUSH2 0x39C3 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x39CA JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x39D9 DUP6 DUP6 PUSH2 0x3BE0 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x2CAB JUMPI POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x3A79 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3A3E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3A26 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3A6B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x3A85 JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x3AD0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E65 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3AD9 DUP6 PUSH2 0x340E JUMP JUMPDEST PUSH2 0x3B2A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3B69 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3B4A JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3BCB JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3BD0 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x3836 DUP3 DUP3 DUP7 PUSH2 0x3D14 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x24 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP3 DUP5 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND SWAP3 PUSH2 0x7530 SWAP3 DUP8 SWAP3 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3C68 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3C49 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3CC9 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3CCE JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x3CEC JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x3D0D JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3D02 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x3D23 JUMPI POP DUP2 PUSH2 0x26CB JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x3D33 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x3A3E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3A26 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x3DCF JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x3DCF JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x3D9A JUMP JUMPDEST POP PUSH2 0x3885 SWAP3 SWAP2 POP JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x3885 JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x3DD7 JUMP INVALID 0x4F PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F206164647265737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E2031323820626974735072697A65 POP PUSH16 0x6F6C2F72657365727665526567697374 PUSH19 0x792D6E6F742D7A65726F416464726573733A20 PUSH10 0x6E73756666696369656E PUSH21 0x2062616C616E636520666F722063616C6C496E6974 PUSH10 0x616C697A61626C653A20 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 MSTORE8 PUSH2 0x6665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F774F776E61626C653A20 PUSH4 0x616C6C65 PUSH19 0x206973206E6F7420746865206F776E65725072 PUSH10 0x7A65506F6F6C2F657869 PUSH21 0x2D6665652D657863656564732D757365722D6D6178 PUSH10 0x6D756D5072697A65506F PUSH16 0x6C2F756E6B6E6F776E2D746F6B656E00 STOP STOP STOP STOP STOP STOP STOP STOP MSTORE8 PUSH2 0x6665 NUMBER PUSH2 0x7374 GASPRICE KECCAK256 PUSH23 0x616C756520646F65736E27742066697420696E20333220 PUSH3 0x697473 MSTORE8 PUSH2 0x6665 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x7563636565645374616B655072697A65506F6F6C 0x2F PUSH20 0x74616B652D746F6B656E2D6E6F742D7A65726F2D PUSH2 0x6464 PUSH19 0x6573735072697A65506F6F6C2F6F6E6C792D70 PUSH19 0x697A65537472617465677900000000A2646970 PUSH7 0x73582212201001 EXTCODECOPY 0x2D 0xB6 PUSH21 0xDBEEFB51BD0738605B9E7E65256DA75FA287BB6D12 0x23 DUP3 PUSH23 0xCD4964736F6C634300060C003300000000000000000000 ",
              "sourceMap": "171:2487:43:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31480:106:39;;;:::i;:::-;;;;;;;;;;;;;;;;14958:270;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14958:270:39;;;;;;;;;;;;;;;;;:::i;:::-;;32298:200;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32298:200:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32298:200:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32298:200:39;;;;;;;;;;-1:-1:-1;32298:200:39;;-1:-1:-1;32298:200:39;-1:-1:-1;32298:200:39;:::i;:::-;;;;-1:-1:-1;;;;;;32298:200:39;;;;;;;;;;;;;;;17185:617;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17185:617:39;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17185:617:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17185:617:39;;;;;;;;;;-1:-1:-1;17185:617:39;;-1:-1:-1;17185:617:39;-1:-1:-1;17185:617:39;:::i;15586:263::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15586:263:39;;;;;;;;;;;;;;;;;:::i;31811:166::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31811:166:39;;;;;;;;;;:::i;5948:860::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5948:860:39;;;;;;;;;;;;;-1:-1:-1;5948:860:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5948:860:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5948:860:39;;-1:-1:-1;;5948:860:39;;;-1:-1:-1;5948:860:39;;-1:-1:-1;;5948:860:39:i;25409:303::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25409:303:39;;;;;;;;;;:::i;13277:314::-;;;;;;;;;;;;;;;;-1:-1:-1;13277:314:39;-1:-1:-1;;;;;13277:314:39;;:::i;11940:103::-;;;:::i;7465:130::-;;;;;;;;;;;;;;;;-1:-1:-1;7465:130:39;-1:-1:-1;;;;;7465:130:39;;:::i;:::-;;;;;;;;;;;;;;;;;;13917:647;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13917:647:39;;;;;;;;;;;;;;;;;:::i;1967:145:0:-;;;:::i;5382:27:39:-;;;:::i;34141:141::-;;;;;;;;;;;;;;;;-1:-1:-1;34141:141:39;-1:-1:-1;;;;;34141:141:39;;:::i;19907:306::-;;;;;;;;;;;;;;;;-1:-1:-1;19907:306:39;;-1:-1:-1;;;;;19907:306:39;;;;;;;;;;;:::i;29377:118::-;;;;;;;;;;;;;;;;-1:-1:-1;29377:118:39;;:::i;10723:1018::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10723:1018:39;;;;;;;;;;;;;;;;;:::i;18806:302::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18806:302:39;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1335:85:0;;;:::i;:::-;;;;-1:-1:-1;;;;;1335:85:0;;;;;;;;;;;;;;4710:40:39;;;:::i;30219:137::-;;;;;;;;;;;;;;;;-1:-1:-1;30219:137:39;-1:-1:-1;;;;;30219:137:39;;:::i;4916:43::-;;;:::i;31052:110::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5172:33;;;:::i;18036:430::-;;;;;;;;;;;;;;;;-1:-1:-1;18036:430:39;;:::i;8890:921::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8890:921:39;;;;;;;;;;;;;;;;;;;;:::i;26123:455::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26123:455:39;;;;-1:-1:-1;;;;;26123:455:39;;;;;;;;;;;;:::i;7162:74::-;;;:::i;679:517:43:-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;679:517:43;;;;;;;;;;;;;-1:-1:-1;679:517:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;679:517:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;679:517:43;;-1:-1:-1;;679:517:43;;;-1:-1:-1;;;679:517:43;;;-1:-1:-1;;;;;679:517:43;;:::i;26965:343:39:-;;;;;;;;;;;;;;;;-1:-1:-1;26965:343:39;-1:-1:-1;;;;;26965:343:39;;:::i;:::-;;;;-1:-1:-1;;;;;26965:343:39;;;;;;;;;;;;;;;;;;;;;;;;7917:469;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7917:469:39;;;;;;;;;;;;;;;;;;;;;;:::i;12245:1028::-;;;:::i;5277:33::-;;;:::i;2261:240:0:-;;;;;;;;;;;;;;;;-1:-1:-1;2261:240:0;-1:-1:-1;;;;;2261:240:0;;:::i;6912:93:39:-;;;:::i;4615:40::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31480:106;31540:7;31562:19;:17;:19::i;:::-;31555:26;;31480:106;:::o;14958:270::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;15112:39:::1;15125:2;15129:13;15144:6;15112:12;:39::i;:::-;15108:116;;;15166:51;::::0;;;;;;;-1:-1:-1;;;;;15166:51:39;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;15108:116;14958:270:::0;;;:::o;32298:200::-;-1:-1:-1;;;;;32298:200:39;-1:-1:-1;;;;32298:200:39:o;17185:617::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;17354:32:::1;17372:13;17354:17;:32::i;:::-;17346:77;;;::::0;;-1:-1:-1;;;17346:77:39;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;17434:20:::0;17430:47:::1;;17464:7;;17430:47;17488:9;17483:253;17503:19:::0;;::::1;17483:253;;;-1:-1:-1::0;;;;;17541:50:39;::::1;;17600:4;17607:2:::0;17611:8;;17620:1;17611:11;;::::1;;;;;17541:82;::::0;;-1:-1:-1;;;;;;17541:82:39::1;::::0;;;;;;-1:-1:-1;;;;;17541:82:39;;::::1;;::::0;::::1;::::0;;;;::::1;::::0;;;;17611:11:::1;;::::0;;;::::1;;17541:82:::0;;;;-1:-1:-1;17541:82:39;;;;;;;-1:-1:-1;;17541:82:39;;;;;;;-1:-1:-1;17541:82:39;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;;;;;17537:186;;;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17680:34;17708:5;17680:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17640:83;17537:186;17524:3;;17483:253;;;-1:-1:-1::0;17747:50:39::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;-1:-1:-1;;;;;17747:50:39;;::::1;::::0;;;::::1;::::0;::::1;::::0;17788:8;;;;17747:50;;;;;;17788:8;;17747:50;::::1;::::0;17788:8;17747:50;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;17747:50:39::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;17747:50:39;;-1:-1:-1;;;;17747:50:39::1;36121:1;17185:617:::0;;;;:::o;15586:263::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;15737:39:::1;15750:2;15754:13;15769:6;15737:12;:39::i;:::-;15733:112;;;15791:47;::::0;;;;;;;-1:-1:-1;;;;;15791:47:39;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;15586:263:::0;;;:::o;31811:166::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;31898:33:39::1;::::0;;-1:-1:-1;;;31898:33:39;;31925:4:::1;31898:33;::::0;::::1;::::0;;;31934:1:::1;::::0;-1:-1:-1;;;;;31898:18:39;::::1;::::0;::::1;::::0;:33;;;;;::::1;::::0;;;;;;;;;:18;:33;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31898:33:39;:37:::1;31894:79;;;31945:21;::::0;;-1:-1:-1;;;31945:21:39;;-1:-1:-1;;;;;31945:21:39;;::::1;;::::0;::::1;::::0;;;:17;;::::1;::::0;::::1;::::0;:21;;;;;-1:-1:-1;;31945:21:39;;;;;;;;-1:-1:-1;31945:17:39;:21;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31894:79;31811:166:::0;;:::o;5948:860::-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;-1:-1:-1;;;;;6146:39:39;::::1;6138:86;;;;-1:-1:-1::0;;;6138:86:39::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6263:24:::0;;;6303:54:::1;::::0;::::1;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;6303:54:39::1;-1:-1:-1::0;6293:64:39;;::::1;::::0;:7:::1;::::0;:64:::1;::::0;;::::1;::::0;::::1;:::i;:::-;;6369:9;6364:178;6388:22;6384:1;:26;6364:178;;;6425:40;6468:17;6486:1;6468:20;;;;;;;;;;;;;;6425:63;;6496:39;6516:15;6533:1;6496:19;:39::i;:::-;-1:-1:-1::0;6412:3:39::1;;6364:178;;;;6547:16;:14;:16::i;:::-;6569:24;:22;:24::i;:::-;6599:29;-1:-1:-1::0;;6599:16:39::1;:29::i;:::-;6635:15;:34:::0;;-1:-1:-1;;;;;;6635:34:39::1;-1:-1:-1::0;;;;;6635:34:39;::::1;::::0;;::::1;::::0;;;6675:18:::1;:40:::0;;;6727:76:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;::::1;1778:1:9;1794:14:::0;1790:66;;;-1:-1:-1;;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;-1:-1:-1;;5948:860:39:o;25409:303::-;25537:7;25511:15;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;;;-1:-1:-1;;;35825:92:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;;;25589:50:::1;::::0;;-1:-1:-1;;;25589:50:39;;-1:-1:-1;;;;;25589:50:39;;::::1;;::::0;::::1;::::0;;;25552:91:::1;::::0;25566:4;;25572:15;;25589:44;;::::1;::::0;::::1;::::0;:50;;;;;::::1;::::0;;;;;;;;;:44;:50;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25589:50:39;25641:1:::1;25552:13;:91::i;:::-;-1:-1:-1::0;;;;;;;25656:37:39;;::::1;;::::0;;;:20:::1;:37;::::0;;;;;;;:43;;;::::1;::::0;;;;;;;;:51;-1:-1:-1;;;;;25656:51:39::1;::::0;25409:303::o;13277:314::-;36438:15;;:24;;;-1:-1:-1;;;36438:24:39;;;;13353:7;;;;-1:-1:-1;;;;;36438:15:39;;;;:22;;:24;;;;;;;;;;;;;;;:15;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36438:24:39;;-1:-1:-1;36497:10:39;-1:-1:-1;;;;;36477:30:39;;;36469:65;;;;;-1:-1:-1;;;36469:65:39;;;;;;;;;;;;-1:-1:-1;;;36469:65:39;;;;;;;;;;;;;;;13386:18:::1;::::0;;13369:14:::1;13410:22:::0;;;;13386:18;13457:15:::1;13386:18:::0;13457:7:::1;:15::i;:::-;13438:34;;13479:44;13509:2;13514:8;13479;:6;:8::i;:::-;-1:-1:-1::0;;;;;13479:21:39::1;::::0;;::::1;:44::i;:::-;13535:29;::::0;;;;;;;-1:-1:-1;;;;;13535:29:39;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;13578:8:::0;13277:314;-1:-1:-1;;;;13277:314:39:o;11940:103::-;12018:20;;11940:103;:::o;7465:130::-;7538:4;7557:33;7575:14;7557:17;:33::i;:::-;7550:40;;7465:130;;;;:::o;13917:647::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;14069:15:::1;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;::::0;;-1:-1:-1;;;35825:92:39;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;::::1;;14098:11:::0;14094:38:::2;;14119:7;;14094:38;14156:20;;14146:6;:30;;14138:72;;;::::0;;-1:-1:-1;;;14138:72:39;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;14239:20;::::0;:32:::2;::::0;14264:6;14239:24:::2;:32::i;:::-;14216:20;:55:::0;14278:46:::2;14284:2:::0;14288:6;14296:15;14321:1:::2;14278:5;:46::i;:::-;14331:19;14353:55;14384:15;14401:6;14353:30;:55::i;:::-;14449:48;::::0;;-1:-1:-1;;;14449:48:39;;-1:-1:-1;;;;;14449:48:39;;::::2;;::::0;::::2;::::0;;;14331:77;;-1:-1:-1;14414:97:39::2;::::0;14428:2;;14432:15;;14449:44;;::::2;::::0;::::2;::::0;:48;;;;;::::2;::::0;;;;;;;;;:44;:48;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;14449:48:39;14499:11;14414:13:::2;:97::i;:::-;14523:36;::::0;;;;;;;-1:-1:-1;;;;;14523:36:39;;::::2;::::0;;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;35923:1;36121::::1;13917:647:::0;;;:::o;1967:145:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;2057:6:::1;::::0;2036:40:::1;::::0;2073:1:::1;::::0;-1:-1:-1;;;;;2057:6:0::1;::::0;2036:40:::1;::::0;2073:1;;2036:40:::1;2086:6;:19:::0;;-1:-1:-1;;;;;;2086:19:0::1;::::0;;1967:145::o;5382:27:39:-;;;;:::o;34141:141::-;34228:4;34247:30;34261:15;34247:13;:30::i;19907:306::-;20067:23;20117:91;20151:16;20175:10;20193:9;20117:26;:91::i;:::-;20100:108;19907:306;-1:-1:-1;;;;19907:306:39:o;29377:118::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;29459:31:39::1;29476:13;29459:16;:31::i;:::-;29377:118:::0;:::o;10723:1018::-;10832:10;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;;;-1:-1:-1;;;35825:92:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;;;-1:-1:-1;;;;;10854:18:39;::::1;::::0;10850:579:::1;;10910:45;::::0;;-1:-1:-1;;;10910:45:39;;-1:-1:-1;;;;;10910:45:39;::::1;;::::0;::::1;::::0;;;10882:25:::1;::::0;10928:10:::1;::::0;10910:39:::1;::::0;:45;;;;;::::1;::::0;;;;;;;;;10928:10;10910:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;10910:45:39;;-1:-1:-1;11014:24:39::1;11041:63;11065:4:::0;11071:10:::1;10910:45:::0;11014:24;11041:23:::1;:63::i;:::-;11014:90:::0;-1:-1:-1;;;;;;11117:10:39;;::::1;::::0;;::::1;;11113:245;;11271:78;11289:10;11301:29;:17:::0;11323:6;11301:21:::1;:29::i;:::-;11332:16;11271:17;:78::i;:::-;11252:97;;11113:245;11366:56;11387:4;11393:10;11405:16;11366:20;:56::i;:::-;10850:579;;;-1:-1:-1::0;;;;;11438:16:39;::::1;::::0;;::::1;::::0;:30:::1;;-1:-1:-1::0;;;;;;11458:10:39;;::::1;::::0;;::::1;;;11438:30;11434:128;;;11508:43;::::0;;-1:-1:-1;;;11508:43:39;;-1:-1:-1;;;;;11508:43:39;::::1;;::::0;::::1;::::0;;;11478:77:::1;::::0;11492:2;;11496:10:::1;::::0;;;11508:39:::1;::::0;:43;;;;;::::1;::::0;;;;;;;;;11496:10;11508:43;::::1;;::::0;::::1;;;;::::0;::::1;11478:77;-1:-1:-1::0;;;;;11599:18:39;::::1;::::0;;::::1;::::0;:58:::1;;-1:-1:-1::0;11629:13:39::1;::::0;-1:-1:-1;;;;;11629:13:39::1;11621:36:::0;::::1;11599:58;11595:142;;;11667:13;::::0;:63:::1;::::0;;-1:-1:-1;;;11667:63:39;;-1:-1:-1;;;;;11667:63:39;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;;11719:10:::1;11667:63:::0;;;;;;:13;;;::::1;::::0;-1:-1:-1;;11667:63:39;;;;;-1:-1:-1;;11667:63:39;;;;;;;-1:-1:-1;11667:13:39;:63;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;10723:1018:::0;;;;:::o;18806:302::-;18950:15;18973:20;19034:69;19073:4;19079:15;19096:6;19034:38;:69::i;:::-;19008:95;;;;-1:-1:-1;18806:302:39;-1:-1:-1;;;;18806:302:39:o;1335:85:0:-;1407:6;;-1:-1:-1;;;;;1407:6:0;;1335:85::o;4710:40:39:-;;;-1:-1:-1;;;;;4710:40:39;;:::o;30219:137::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;30318:33:39::1;30336:14;30318:17;:33::i;4916:43::-:0;;;-1:-1:-1;;;;;4916:43:39;;:::o;31052:110::-;31102:33;31150:7;31143:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31143:14:39;;;-1:-1:-1;31143:14:39;;;;;;;;;;;;;;;;;;;31052:110;:::o;5172:33::-;;;;:::o;18036:430::-;18161:15;;:24;;;-1:-1:-1;;;18161:24:39;;;;18102:7;;;;-1:-1:-1;;;;;18161:15:39;;;;:22;;:24;;;;;;;;;;;;;;;:15;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18161:24:39;;-1:-1:-1;;;;;;18196:30:39;;18192:59;;18243:1;18236:8;;;;;18192:59;18286:42;;;-1:-1:-1;;;18286:42:39;;18322:4;18286:42;;;;;;18256:27;;-1:-1:-1;;;;;18286:27:39;;;;;:42;;;;;;;;;;;;;;;:27;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18286:42:39;;-1:-1:-1;18338:24:39;18334:53;;18379:1;18372:8;;;;;;18334:53;18399:62;18433:6;18441:19;18399:33;:62::i;8890:921::-;9113:7;1753:1:23;2495:7;;:19;;2487:63;;;;;-1:-1:-1;;;2487:63:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;1753:1;2625:7;:18;9083:15:39;35833:56:::1;9083:15:::0;35833:13:::1;:56::i;:::-;35825:92;;;::::0;;-1:-1:-1;;;35825:92:39;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;::::1;;9131:15:::2;9148:20:::0;9172:69:::2;9211:4;9217:15;9234:6;9172:38;:69::i;:::-;9130:111;;;;9266:14;9255:7;:25;;9247:77;;;;-1:-1:-1::0;;;9247:77:39::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9354:48;9366:4;9372:15;9389:12;9354:11;:48::i;:::-;-1:-1:-1::0;;;;;9433:51:39;::::2;;9485:12;:10;:12::i;:::-;9433:79;::::0;;-1:-1:-1;;;;;;9433:79:39::2;::::0;;;;;;-1:-1:-1;;;;;9433:79:39;;::::2;;::::0;::::2;::::0;;;::::2;::::0;;;;;;;;;;;;;;;;-1:-1:-1;;9433:79:39;;;;;;;-1:-1:-1;9433:79:39;;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;9558:21;9582:19;9593:7;9582:6;:10;;:19;;;;:::i;:::-;9558:43;;9607:16;9626:22;9634:13;9626:7;:22::i;:::-;9607:41;;9655:37;9677:4;9683:8;9655;:6;:8::i;:37::-;-1:-1:-1::0;;;;;9704:81:39;;::::2;::::0;;::::2;9722:12;:10;:12::i;:::-;9704:81;::::0;;;;;::::2;::::0;::::2;::::0;;;;;;;;;;;-1:-1:-1;;;;;9704:81:39;;;::::2;::::0;::::2;::::0;;;;;;;::::2;-1:-1:-1::0;;1710:1:23;2798:7;:22;-1:-1:-1;9799:7:39;8890:921;-1:-1:-1;;;;;;8890:921:39:o;26123:455::-;26295:16;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;;;-1:-1:-1;;;35825:92:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;;;1558:12:0::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;1547:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;1547:23:0::1;;1539:68;;;::::0;;-1:-1:-1;;;1539:68:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;::::1;;26373:114:39::2;::::0;;;;::::2;::::0;;-1:-1:-1;;;;;26373:114:39;;::::2;::::0;;;;;::::2;;::::0;;::::2;::::0;;;-1:-1:-1;;;;;26335:35:39;::::2;-1:-1:-1::0;26335:35:39;;;:17:::2;:35:::0;;;;;:152;;;;;;-1:-1:-1;;26335:152:39;;::::2;::::0;;::::2;;::::0;::::2;::::0;;;::::2;-1:-1:-1::0;;;26335:152:39::2;;::::0;;;26499:74;;;;;;;::::2;::::0;;;;;;;;;;::::2;::::0;;;;;;;;::::2;26123:455:::0;;;;:::o;7162:74::-;7199:7;7221:10;:8;:10::i;679:517:43:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;904:102:43::1;932:16;956:17;981:19;904:20;:102::i;:::-;-1:-1:-1::0;;;;;1021:34:43;::::1;1013:90;;;;-1:-1:-1::0;;;1013:90:43::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1109:10;:24:::0;;-1:-1:-1;;;;;;1109:24:43::1;-1:-1:-1::0;;;;;1109:24:43;;::::1;::::0;;;::::1;::::0;;;;1145:46:::1;::::0;1179:10;::::1;::::0;1145:46:::1;::::0;-1:-1:-1;;1145:46:43::1;1794:14:9::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1790:66;679:517:43;;;;;:::o;26965:343:39:-;-1:-1:-1;;;;;27169:34:39;27071:27;27169:34;;;:17;:34;;;;;:54;-1:-1:-1;;;;;27169:54:39;;;;-1:-1:-1;;;27250:53:39;;;;;26965:343::o;7917:469::-;1753:1:23;2495:7;;:19;;2487:63;;;;;-1:-1:-1;;;2487:63:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;1753:1;2625:7;:18;8090:15:39;35833:56:::1;8090:15:::0;35833:13:::1;:56::i;:::-;35825:92;;;::::0;;-1:-1:-1;;;35825:92:39;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;::::1;;8127:6:::2;36288:25;36305:7;36288:16;:25::i;:::-;36280:69;;;::::0;;-1:-1:-1;;;36280:69:39;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;8143:16:::3;8162:12;:10;:12::i;:::-;8143:31;;8181:44;8187:2;8191:6;8199:15;8216:8;8181:5;:44::i;:::-;8232:58;8258:8;8276:4;8283:6;8232:8;:6;:8::i;:::-;-1:-1:-1::0;;;;;8232:25:39::3;::::0;;:58;:25:::3;:58::i;:::-;8296:15;8304:6;8296:7;:15::i;:::-;8323:58;::::0;;;;;-1:-1:-1;;;;;8323:58:39;;::::3;;::::0;::::3;::::0;;;;;::::3;::::0;;;::::3;::::0;;;::::3;::::0;::::3;::::0;;;;;;;;;::::3;-1:-1:-1::0;;1710:1:23;2798:7;:22;-1:-1:-1;;;;;7917:469:39:o;12245:1028::-;12316:7;1753:1:23;2495:7;;:19;;2487:63;;;;;-1:-1:-1;;;2487:63:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;1753:1;2625:7;:18;12331:24:39::1;12358:19;:17;:19::i;:::-;12331:46;;12495:22;12520:10;:8;:10::i;:::-;12495:35;;12536:21;12578:16;12561:14;:33;12560:78;;12637:1;12560:78;;;12598:36;:14:::0;12617:16;12598:18:::1;:36::i;:::-;12536:102;;12644:31;12695:20;;12679:13;:36;12678:84;;12761:1;12678:84;;;12737:20;::::0;12719:39:::1;::::0;:13;;:17:::1;:39::i;:::-;12644:118:::0;-1:-1:-1;12773:27:39;;12769:466:::1;;12810:18;12831:44;12851:23;12831:19;:44::i;:::-;12810:65:::0;-1:-1:-1;12887:14:39;;12883:214:::1;;12934:18;::::0;:34:::1;::::0;12957:10;12934:22:::1;:34::i;:::-;12913:18;:55:::0;13004:39:::1;:23:::0;13032:10;13004:27:::1;:39::i;:::-;13058:30;::::0;;;;;;;12978:65;;-1:-1:-1;13058:30:39::1;::::0;;;;;::::1;::::0;;::::1;12883:214;13127:20;::::0;:49:::1;::::0;13152:23;13127:24:::1;:49::i;:::-;13104:20;:72:::0;13190:38:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;12769:466;;13248:20;;13241:27;;;;;;1710:1:23::0;2798:7;:22;12245:1028:39;:::o;5277:33::-;;;;:::o;2261:240:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;2349:22:0;::::1;2341:73;;;;-1:-1:-1::0;;;2341:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2450:6;::::0;2429:38:::1;::::0;-1:-1:-1;;;;;2429:38:0;;::::1;::::0;2450:6:::1;::::0;2429:38:::1;::::0;2450:6:::1;::::0;2429:38:::1;2477:6;:17:::0;;-1:-1:-1;;;;;;2477:17:0::1;-1:-1:-1::0;;;;;2477:17:0;;;::::1;::::0;;;::::1;::::0;;2261:240::o;6912:93:39:-;6961:7;6991:8;:6;:8::i;4615:40::-;;;;;;;;;;;;;-1:-1:-1;;;4615:40:39;;;;;:::o;32597:361::-;32649:7;32664:13;32680:18;;32664:34;;32704:40;32747:7;32704:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32704:50:39;;;-1:-1:-1;32704:50:39;;;;;;;;;;;;-1:-1:-1;;32794:13:39;;32704:50;;-1:-1:-1;32771:20:39;;-1:-1:-1;;;32818:117:39;32841:12;32837:1;:16;32818:117;;;32875:53;32903:6;32910:1;32903:9;;;;;;;;;;;;;;-1:-1:-1;;;;;32885:40:39;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32885:42:39;32875:5;;:9;:53::i;:::-;32867:61;-1:-1:-1;32855:3:39;;32818:117;;;-1:-1:-1;32948:5:39;;-1:-1:-1;;;32597:361:39;:::o;828:104:19:-;915:10;828:104;:::o;15853:343:39:-;15968:4;15990:32;16008:13;15990:17;:32::i;:::-;15982:77;;;;;-1:-1:-1;;;15982:77:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16070:11;16066:44;;-1:-1:-1;16098:5:39;16091:12;;16066:44;16116:57;-1:-1:-1;;;;;16116:45:39;;16162:2;16166:6;16116:45;:57::i;:::-;-1:-1:-1;16187:4:39;15853:343;;;;;;:::o;1601:144:43:-;1711:10;;-1:-1:-1;;;;;1711:10:43;;;1703:37;;;;;1601:144::o;1952:123:9:-;2000:4;2024:44;2062:4;2024:29;:44::i;:::-;2023:45;2016:52;;1952:123;:::o;29798:280:39:-;29908:29;;;-1:-1:-1;;;29908:29:39;;;;29941:4;;-1:-1:-1;;;;;29908:27:39;;;;;:29;;;;;;;;;;;;;;;:27;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29908:29:39;-1:-1:-1;;;;;29908:37:39;;29900:80;;;;;-1:-1:-1;;;29900:80:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;30008:16;29991:7;29999:5;29991:14;;;;;;;;;;;;;;;;:33;;-1:-1:-1;;;;;;29991:33:39;-1:-1:-1;;;;;29991:33:39;;;;;;30035:38;;;;;;;;29991:14;30035:38;29798:280;;:::o;935:126:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;992:26:0::1;:24;:26::i;:::-;1028;:24;:26::i;:::-;1794:14:9::0;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;935:126:0:o;1791:106:23:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1856:34:23::1;:32;:34::i;29499:138:39:-:0;29563:12;:28;;;29602:30;;;;;;;;;;;;;;;;;29499:138;:::o;33600:331::-;33688:4;33700:40;33743:7;33700:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33700:50:39;;;-1:-1:-1;33700:50:39;;;;;;;;;;;;-1:-1:-1;;33788:13:39;;33700:50;;-1:-1:-1;33765:20:39;;-1:-1:-1;;;33808:101:39;33831:12;33827:1;:16;33808:101;;;33861:9;;-1:-1:-1;;;;;33861:28:39;;;:6;;33868:1;;33861:9;;;;;;;;;;;;-1:-1:-1;;;;;33861:28:39;;33858:44;;;33898:4;33891:11;;;;;;;33858:44;33845:3;;33808:101;;;-1:-1:-1;33921:5:39;;33600:331;-1:-1:-1;;;;33600:331:39:o;21947:275::-;22071:146;22099:4;22111:15;22134:77;22158:4;22164:15;22181:22;22205:5;22134:23;:77::i;:::-;22071:20;:146::i;2551:105:43:-;2639:12;2551:105::o;2016:97::-;2098:10;;-1:-1:-1;;;;;2098:10:43;;2016:97::o;770:186:12:-;890:58;;;-1:-1:-1;;;;;890:58:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;890:58:12;-1:-1:-1;;;890:58:12;;;863:86;;883:5;;863:19;:86::i;3147:155:8:-;3205:7;3237:1;3232;:6;;3224:49;;;;;-1:-1:-1;;;3224:49:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3290:5:8;;;3147:155;;;;;:::o;16533:295:39:-;16646:13;;-1:-1:-1;;;;;16646:13:39;16638:36;16634:125;;16684:13;;:68;;;-1:-1:-1;;;16684:68:39;;-1:-1:-1;;;;;16684:68:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;;;;;:29;;:68;;;;;-1:-1:-1;;16684:68:39;;;;;;;-1:-1:-1;16684:13:39;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16634:125;16764:59;;;-1:-1:-1;;;16764:59:39;;-1:-1:-1;;;;;16764:59:39;;;;;;;;;;;;;;;:47;;;;;;:59;;;;;-1:-1:-1;;16764:59:39;;;;;;;;-1:-1:-1;16764:47:39;:59;;;;;;;;;;19258:269;-1:-1:-1;;;;;19461:34:39;;19362:7;19461:34;;;:17;:34;;;;;:54;19384:138;;19405:6;;19419:97;;19405:6;;-1:-1:-1;;;;;19461:54:39;19419:33;:97::i;:::-;19384:13;:138::i;20592:520::-;-1:-1:-1;;;;;20953:35:39;;20744:23;20953:35;;;:17;:35;;;;;:54;20744:23;;20907:101;;20941:10;;-1:-1:-1;;;20953:54:39;;-1:-1:-1;;;;;20953:54:39;20907:33;:101::i;:::-;20880:128;-1:-1:-1;21018:21:39;21014:50;;21056:1;21049:8;;;;;21014:50;21076:31;:9;21090:16;21076:13;:31::i;:::-;21069:38;20592:520;-1:-1:-1;;;;;20592:520:39:o;22226:598::-;-1:-1:-1;;;;;22445:37:39;;;22368:7;22445:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;22499:25;;22368:7;;22445:43;-1:-1:-1;;;22499:25:39;;;;22494:303;;22547:1;22534:14;;22494:303;;;22569:14;22586:70;22610:4;22616:15;22633:22;22586:23;:70::i;:::-;22744:21;;22569:87;;-1:-1:-1;22677:113:39;;22695:15;;22712:22;;22736:53;;22783:5;;22736:42;;-1:-1:-1;;;;;22744:21:39;22569:87;22736:34;:42::i;:::-;:46;;:53::i;:::-;22677:17;:113::i;:::-;22664:126;;22494:303;;-1:-1:-1;22809:10:39;22226:598;-1:-1:-1;;;;;22226:598:39:o;23848:410::-;-1:-1:-1;;;;;24086:34:39;;23978:7;24086:34;;;:17;:34;;;;;:54;23978:7;;24015:131;;24056:22;;-1:-1:-1;;;;;24086:54:39;24015:33;:131::i;:::-;23993:153;;24172:11;24156:13;:27;24152:75;;;24209:11;24193:27;;24152:75;-1:-1:-1;24240:13:39;;23848:410;-1:-1:-1;;;23848:410:39:o;22828:604::-;-1:-1:-1;;;;;22953:37:39;;;22932:18;22953:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;:51;23057:129;;;;;;;;-1:-1:-1;;;;;22953:51:39;;23057:129;23088:22;:10;:20;:22::i;:::-;-1:-1:-1;;;;;23057:129:39;;;;;23129:25;:14;:12;:14::i;:::-;:23;:25::i;:::-;23057:129;;;;;;23175:4;23057:129;;;;;-1:-1:-1;;;;;23011:37:39;;;-1:-1:-1;23011:37:39;;;:20;:37;;;;;;:43;;;;;;;;;;;:175;;;;;;;;;;;;;-1:-1:-1;;;;;;23011:175:39;;;-1:-1:-1;;;;;23011:175:39;;;;;;;-1:-1:-1;;;;23011:175:39;-1:-1:-1;;;23011:175:39;;;;;;;;;-1:-1:-1;;;;23011:175:39;-1:-1:-1;;;23011:175:39;;;;;;;;;;23197:23;;;23193:235;;;-1:-1:-1;;;;;23235:63:39;;;;;;;23271:26;:10;23286;23271:14;:26::i;:::-;23235:63;;;;;;;;;;;;;;;23193:235;;;23333:10;23320;:23;23316:112;;;-1:-1:-1;;;;;23358:63:39;;;;;;;23394:26;:10;23409;23394:14;:26::i;:::-;23358:63;;;;;;;;;;;;;;;22828:604;;;;:::o;27741:1468::-;27989:50;;;-1:-1:-1;;;27989:50:39;;-1:-1:-1;;;;;27989:50:39;;;;;;;;;27893:20;;;;;;27989:44;;;;;;:50;;;;;;;;;;;;;;;:44;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27989:50:39;;-1:-1:-1;28053:32:39;;;;28045:67;;;;;-1:-1:-1;;;28045:67:39;;;;;;;;;;;;-1:-1:-1;;;28045:67:39;;;;;;;;;;;;;;;28118:63;28132:4;28138:15;28155:22;28179:1;28118:13;:63::i;:::-;28575:24;28602:83;28633:15;28650:34;:22;28677:6;28650:26;:34::i;:::-;28602:30;:83::i;:::-;-1:-1:-1;;;;;28725:37:39;;;28692:23;28725:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;:51;28575:110;;-1:-1:-1;28692:23:39;-1:-1:-1;;;;;28725:51:39;-1:-1:-1;;28721:192:39;;-1:-1:-1;;;;;28832:37:39;;;;;;;:20;:37;;;;;;;;:43;;;;;;;;;:51;28824:82;;-1:-1:-1;;;;;28832:51:39;28889:16;28824:64;:82::i;:::-;28806:100;;28721:192;28989:20;29012:55;29043:15;29060:6;29012:30;:55::i;:::-;28989:78;;29107:12;29089:15;:30;29088:65;;29138:15;29088:65;;;29123:12;29088:65;29073:80;-1:-1:-1;29174:30:39;:12;29073:80;29174:16;:30::i;:::-;29159:45;;27741:1468;;;;;;;;;;:::o;30497:405::-;-1:-1:-1;;;;;30586:37:39;;30578:82;;;;;-1:-1:-1;;;30578:82:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30674:98;-1:-1:-1;;;;;30674:41:39;;-1:-1:-1;;;;;;30674:41:39;:98::i;:::-;30666:142;;;;;-1:-1:-1;;;30666:142:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;30814:13;:30;;-1:-1:-1;;;;;;30814:30:39;-1:-1:-1;;;;;30814:30:39;;;;;;;;30856:41;;;;-1:-1:-1;;30856:41:39;30497:405;:::o;1967:201:26:-;2051:7;;2087:15;:8;2100:1;2087:12;:15::i;:::-;2070:32;-1:-1:-1;2121:17:26;2070:32;1149:4;2121:10;:17::i;21258:289:39:-;-1:-1:-1;;;;;21411:37:39;;;;;;;:20;:37;;;;;;;;:43;;;;;;;;;:51;21403:84;;:72;;-1:-1:-1;;;;;21411:51:39;21468:6;21403:64;:72::i;:::-;:82;:84::i;:::-;-1:-1:-1;;;;;21349:37:39;;;;;;;:20;:37;;;;;;;;:43;;;;;;;;;;;;;:138;;-1:-1:-1;;;;;;21349:138:39;-1:-1:-1;;;;;21349:138:39;;;;;;;;;;;21499:43;;;;;;;21349:37;;21499:43;;;;;;;;;21258:289;;;:::o;1903:109:43:-;1972:10;;:35;;;-1:-1:-1;;;1972:35:43;;2001:4;1972:35;;;;;;-1:-1:-1;;;;;;;1972:10:43;;-1:-1:-1;;1972:35:43;;;;;;;;;;;;;;:10;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1972:35:43;;-1:-1:-1;1903:109:43;:::o;33203:189:39:-;33269:4;33281:24;33308:19;:17;:19::i;:::-;33374:12;;33281:46;;-1:-1:-1;33341:29:39;33281:46;33362:7;33341:20;:29::i;:::-;:45;;;33203:189;-1:-1:-1;;;33203:189:39:o;962:214:12:-;1100:68;;;-1:-1:-1;;;;;1100:68:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1100:68:12;-1:-1:-1;;;1100:68:12;;;1073:96;;1093:5;;1073:19;:96::i;2701:175:8:-;2759:7;2790:5;;;2813:6;;;;2805:46;;;;;-1:-1:-1;;;2805:46:8;;;;;;;;;;;;;;;;;;;;;;;;;;;737:413:18;1097:20;1135:8;;;737:413::o;759:64:19:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1794:14;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;759:64:19:o;1067:192:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1134:17:0::1;1154:12;:10;:12::i;:::-;1176:6;:18:::0;;-1:-1:-1;;;;;;1176:18:0::1;-1:-1:-1::0;;;;;1176:18:0;::::1;::::0;;::::1;::::0;;;1209:43:::1;::::0;1176:18;;-1:-1:-1;1176:18:0;-1:-1:-1;;1209:43:0::1;::::0;-1:-1:-1;;1209:43:0::1;1778:1:9;1794:14:::0;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;1067:192:0:o;1903:104:23:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1710:1:23::1;1978:7;:22:::0;1790:66:9;;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;1903:104:23:o;3088:762:12:-;3544:69;;;;;;;;;;;;;;;;;;3518:23;;3544:69;;-1:-1:-1;;;;;3544:27:12;;;3572:4;;3544:27;:69::i;:::-;3627:17;;3518:95;;-1:-1:-1;3627:21:12;3623:221;;3767:10;3756:30;;;;;;;;;;;;;;;-1:-1:-1;3756:30:12;3748:85;;;;-1:-1:-1;;;3748:85:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10138:275:39;10227:7;10242:14;10259:71;10293:16;10311:18;;10259:33;:71::i;:::-;10242:88;;10350:6;10340:7;:16;10336:53;;;10376:6;10366:16;;10336:53;-1:-1:-1;10401:7:39;;10138:275;-1:-1:-1;;10138:275:39:o;4228:150:8:-;4286:7;4317:1;4313;:5;4305:44;;;;;-1:-1:-1;;;4305:44:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;4370:1;4366;:5;;;;;;;4228:150;-1:-1:-1;;;4228:150:8:o;24612:558:39:-;-1:-1:-1;;;;;24778:37:39;;;24739:7;24778:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;:53;-1:-1:-1;;;24778:53:39;;;;;-1:-1:-1;;;24843:55:39;;;;24838:85;;24915:1;24908:8;;;;;24838:85;24929:17;24949:33;24968:13;24949:14;:12;:14::i;:::-;:18;;:33::i;:::-;-1:-1:-1;;;;;25026:34:39;;24988:21;25026:34;;;:17;:34;;;;;:53;24929;;-1:-1:-1;24988:21:39;25012:68;;24929:53;;-1:-1:-1;;;25026:53:39;;-1:-1:-1;;;;;25026:53:39;25012:13;:68::i;:::-;24988:92;;25093:72;25127:22;25151:13;25093:33;:72::i;:::-;25086:79;24612:558;-1:-1:-1;;;;;;;24612:558:39:o;1097:181:24:-;1154:7;-1:-1:-1;;;1181:14:24;;1173:67;;;;-1:-1:-1;;;1173:67:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1265:5:24;1097:181::o;31284:97:39:-;31361:15;31284:97;:::o;2028:176:24:-;2084:6;-1:-1:-1;2110:13:24;;2102:65;;;;-1:-1:-1;;;2102:65:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1369:286:5;1456:4;1563:23;1578:7;1563:14;:23::i;:::-;:85;;;;;1602:46;1627:7;1636:11;1602:24;:46::i;2266:459:27:-;2324:7;2565:6;2561:45;;-1:-1:-1;2594:1:27;2587:8;;2561:45;2628:5;;;2632:1;2628;:5;:1;2651:5;;;;;:10;2643:56;;;;-1:-1:-1;;;2643:56:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3187:130;3245:7;3271:39;3275:1;3278;3271:39;;;;;;;;;;;;;;;;;:3;:39::i;3592:193:18:-;3695:12;3726:52;3748:6;3756:4;3762:1;3765:12;3726:21;:52::i;757:394:5:-;821:4;1016:55;1041:7;-1:-1:-1;;;1016:24:5;:55::i;:::-;:128;;;;-1:-1:-1;1088:56:5;1113:7;-1:-1:-1;;;;;;1088:24:5;:56::i;:::-;1087:57;;757:394;-1:-1:-1;;757:394:5:o;4243:395::-;4336:4;4515:12;4529:11;4544:50;4573:7;4582:11;4544:28;:50::i;:::-;4514:80;;;;4613:7;:17;;;;-1:-1:-1;4624:6:5;4605:26;-1:-1:-1;;;;4243:395:5:o;3799:272:27:-;3885:7;3919:12;3912:5;3904:28;;;;-1:-1:-1;;;3904:28:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3942:9;3958:1;3954;:5;;;;;;;3799:272;-1:-1:-1;;;;;3799:272:27:o;4619:523:18:-;4746:12;4803:5;4778:21;:30;;4770:81;;;;-1:-1:-1;;;4770:81:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4869:18;4880:6;4869:10;:18::i;:::-;4861:60;;;;;-1:-1:-1;;;4861:60:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;4992:12;5006:23;5033:6;-1:-1:-1;;;;;5033:11:18;5053:5;5061:4;5033:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5033:33:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4991:75;;;;5083:52;5101:7;5110:10;5122:12;5083:17;:52::i;5155:444:5:-;5331:57;;;-1:-1:-1;;;;;;5331:57:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5331:57:5;-1:-1:-1;;;5331:57:5;;;5436:47;;;;-1:-1:-1;;;;5331:57:5;-1:-1:-1;;5302:26:5;;-1:-1:-1;;;;;5436:18:5;;;5461:5;;5331:57;;5436:47;;;;5331:57;5436:47;;;;;;;;;;-1:-1:-1;;5436:47:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5398:85;;;;5513:2;5497:6;:13;:18;5493:45;;;5525:5;5532;5517:21;;;;;;;;;5493:45;5556:7;5576:6;5565:26;;;;;;;;;;;;;;;-1:-1:-1;5565:26:5;5548:44;;-1:-1:-1;5565:26:5;-1:-1:-1;;;;5155:444:5;;;;;;:::o;6122:725:18:-;6237:12;6265:7;6261:580;;;-1:-1:-1;6295:10:18;6288:17;;6261:580;6406:17;;:21;6402:429;;6664:10;6658:17;6724:15;6711:10;6707:2;6703:19;6696:44;6613:145;6796:20;;-1:-1:-1;;;6796:20:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6796:20:18;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "3280200",
                "executionCost": "3643",
                "totalCost": "3283843"
              },
              "external": {
                "VERSION()": "infinite",
                "accountedBalance()": "infinite",
                "award(address,uint256,address)": "infinite",
                "awardBalance()": "1044",
                "awardExternalERC20(address,address,uint256)": "infinite",
                "awardExternalERC721(address,address,uint256[])": "infinite",
                "balance()": "infinite",
                "balanceOfCredit(address,address)": "infinite",
                "beforeTokenTransfer(address,address,uint256)": "infinite",
                "calculateEarlyExitFee(address,address,uint256)": "infinite",
                "calculateReserveFee(uint256)": "infinite",
                "canAwardExternal(address)": "1212",
                "captureAwardBalance()": "infinite",
                "compLikeDelegate(address,address)": "infinite",
                "creditPlanOf(address)": "1357",
                "depositTo(address,uint256,address,address)": "infinite",
                "estimateCreditAccrualTime(address,uint256,uint256)": "infinite",
                "initialize(address,address[],uint256)": "infinite",
                "initialize(address,address[],uint256,address)": "infinite",
                "isControlled(address)": "infinite",
                "liquidityCap()": "1043",
                "maxExitFeeMantissa()": "1087",
                "onERC721Received(address,address,uint256,bytes)": "629",
                "owner()": "1105",
                "prizeStrategy()": "1082",
                "renounceOwnership()": "infinite",
                "reserveRegistry()": "1127",
                "reserveTotalSupply()": "1064",
                "setCreditPlanOf(address,uint128,uint128)": "infinite",
                "setLiquidityCap(uint256)": "infinite",
                "setPrizeStrategy(address)": "infinite",
                "token()": "1182",
                "tokens()": "infinite",
                "transferExternalERC20(address,address,uint256)": "infinite",
                "transferOwnership(address)": "infinite",
                "withdrawInstantlyFrom(address,uint256,address,uint256)": "infinite",
                "withdrawReserve(address)": "infinite"
              },
              "internal": {
                "_balance()": "infinite",
                "_canAwardExternal(address)": "851",
                "_redeem(uint256)": "12",
                "_supply(uint256)": "infinite",
                "_token()": "833"
              }
            },
            "methodIdentifiers": {
              "VERSION()": "ffa1ad74",
              "accountedBalance()": "0937eb54",
              "award(address,uint256,address)": "6b1b863a",
              "awardBalance()": "630665b4",
              "awardExternalERC20(address,address,uint256)": "2b0ab144",
              "awardExternalERC721(address,address,uint256[])": "16960d55",
              "balance()": "b69ef8a8",
              "balanceOfCredit(address,address)": "494de9f7",
              "beforeTokenTransfer(address,address,uint256)": "7cbab1c7",
              "calculateEarlyExitFee(address,address,uint256)": "888c2b6f",
              "calculateReserveFee(uint256)": "9fe32a91",
              "canAwardExternal(address)": "6a3fd4f9",
              "captureAwardBalance()": "e6d8a94b",
              "compLikeDelegate(address,address)": "2f7627e3",
              "creditPlanOf(address)": "d4a1361d",
              "depositTo(address,uint256,address,address)": "e323f825",
              "estimateCreditAccrualTime(address,uint256,uint256)": "79cb8563",
              "initialize(address,address[],uint256)": "3ede50c6",
              "initialize(address,address[],uint256,address)": "c5871485",
              "isControlled(address)": "78b3d327",
              "liquidityCap()": "76687d3d",
              "maxExitFeeMantissa()": "9e167519",
              "onERC721Received(address,address,uint256,bytes)": "150b7a02",
              "owner()": "8da5cb5b",
              "prizeStrategy()": "98bf3eb6",
              "renounceOwnership()": "715018a6",
              "reserveRegistry()": "8e71c1f6",
              "reserveTotalSupply()": "edb4e1cf",
              "setCreditPlanOf(address,uint128,uint128)": "a7b2cc31",
              "setLiquidityCap(uint256)": "7b99adb1",
              "setPrizeStrategy(address)": "91ca480e",
              "token()": "fc0c546a",
              "tokens()": "9d63848a",
              "transferExternalERC20(address,address,uint256)": "13f55e39",
              "transferOwnership(address)": "f2fde38b",
              "withdrawInstantlyFrom(address,uint256,address,uint256)": "a016240b",
              "withdrawReserve(address)": "52a387ab"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"AwardCaptured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Awarded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"AwardedExternalERC20\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"AwardedExternalERC721\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract ControlledTokenInterface\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"ControlledTokenAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CreditBurned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CreditMinted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"creditLimitMantissa\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"creditRateMantissa\",\"type\":\"uint128\"}],\"name\":\"CreditPlanSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ErrorAwardingExternalERC721\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"reserveRegistry\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxExitFeeMantissa\",\"type\":\"uint256\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"redeemed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"exitFee\",\"type\":\"uint256\"}],\"name\":\"InstantWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"liquidityCap\",\"type\":\"uint256\"}],\"name\":\"LiquidityCapSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"prizeStrategy\",\"type\":\"address\"}],\"name\":\"PrizeStrategySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ReserveFeeCaptured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ReserveWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"stakeToken\",\"type\":\"address\"}],\"name\":\"StakePrizePoolInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferredExternalERC20\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accountedBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"awardBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"awardExternalERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"awardExternalERC721\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"balance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"balanceOfCredit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"beforeTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"calculateEarlyExitFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"exitFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"burnedCredit\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"calculateReserveFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_externalToken\",\"type\":\"address\"}],\"name\":\"canAwardExternal\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"captureAwardBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ICompLike\",\"name\":\"compLike\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"compLikeDelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"creditPlanOf\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"creditLimitMantissa\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"creditRateMantissa\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_principal\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_interest\",\"type\":\"uint256\"}],\"name\":\"estimateCreditAccrualTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"durationSeconds\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"_reserveRegistry\",\"type\":\"address\"},{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"_controlledTokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_maxExitFeeMantissa\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"_reserveRegistry\",\"type\":\"address\"},{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"_controlledTokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_maxExitFeeMantissa\",\"type\":\"uint256\"},{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_stakeToken\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ControlledTokenInterface\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"isControlled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"liquidityCap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxExitFeeMantissa\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizeStrategy\",\"outputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reserveRegistry\",\"outputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reserveTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"_creditRateMantissa\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"_creditLimitMantissa\",\"type\":\"uint128\"}],\"name\":\"setCreditPlanOf\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_liquidityCap\",\"type\":\"uint256\"}],\"name\":\"setLiquidityCap\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"_prizeStrategy\",\"type\":\"address\"}],\"name\":\"setPrizeStrategy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokens\",\"outputs\":[{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferExternalERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maximumExitFee\",\"type\":\"uint256\"}],\"name\":\"withdrawInstantlyFrom\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawReserve\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"accountedBalance()\":{\"returns\":{\"_0\":\"The current total of all tokens\"}},\"award(address,uint256,address)\":{\"details\":\"The amount awarded must be less than the awardBalance()\",\"params\":{\"amount\":\"The amount of assets to be awarded\",\"controlledToken\":\"The address of the asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"awardBalance()\":{\"details\":\"captureAwardBalance() should be called first\",\"returns\":{\"_0\":\"The total amount of assets to be awarded for the current prize\"}},\"awardExternalERC20(address,address,uint256)\":{\"details\":\"Used to award any arbitrary tokens held by the Prize Pool\",\"params\":{\"amount\":\"The amount of external assets to be awarded\",\"externalToken\":\"The address of the external asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"awardExternalERC721(address,address,uint256[])\":{\"details\":\"Used to award any arbitrary NFTs held by the Prize Pool\",\"params\":{\"externalToken\":\"The address of the external NFT token being awarded\",\"to\":\"The address of the winner that receives the award\",\"tokenIds\":\"An array of NFT Token IDs to be transferred\"}},\"balance()\":{\"details\":\"Returns the total underlying balance of all assets. This includes both principal and interest.\",\"returns\":{\"_0\":\"The underlying balance of assets\"}},\"balanceOfCredit(address,address)\":{\"params\":{\"user\":\"The user whose credit balance should be returned\"},\"returns\":{\"_0\":\"The balance of the users credit\"}},\"beforeTokenTransfer(address,address,uint256)\":{\"params\":{\"amount\":\"The amount of tokens being trasferred\",\"from\":\"The address the tokens are being transferred from (0 if minting)\",\"to\":\"The address the tokens are being transferred to (0 if burning)\"}},\"calculateEarlyExitFee(address,address,uint256)\":{\"params\":{\"amount\":\"The amount of collateral to be withdrawn\",\"controlledToken\":\"The type of collateral being withdrawn\",\"from\":\"The user who is withdrawing\"},\"returns\":{\"burnedCredit\":\"The user's credit that was burned\",\"exitFee\":\"The exit fee\"}},\"calculateReserveFee(uint256)\":{\"params\":{\"amount\":\"The prize amount\"},\"returns\":{\"_0\":\"The size of the reserve portion of the prize\"}},\"canAwardExternal(address)\":{\"details\":\"Checks with the Prize Pool if a specific token type may be awarded as an external prize\",\"params\":{\"_externalToken\":\"The address of the token to check\"},\"returns\":{\"_0\":\"True if the token may be awarded, false otherwise\"}},\"captureAwardBalance()\":{\"details\":\"This function also captures the reserve fees.\",\"returns\":{\"_0\":\"The total amount of assets to be awarded for the current prize\"}},\"compLikeDelegate(address,address)\":{\"params\":{\"compLike\":\"The COMP-like token held by the prize pool that should be delegated\",\"to\":\"The address to delegate to \"}},\"creditPlanOf(address)\":{\"params\":{\"controlledToken\":\"The controlled token to retrieve the credit rates for\"},\"returns\":{\"creditLimitMantissa\":\"The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\",\"creditRateMantissa\":\"The credit rate. This is the amount of tokens that accrue per second.\"}},\"depositTo(address,uint256,address,address)\":{\"params\":{\"amount\":\"The amount of assets to deposit\",\"controlledToken\":\"The address of the type of token the user is minting\",\"referrer\":\"The referrer of the deposit\",\"to\":\"The address receiving the newly minted tokens\"}},\"estimateCreditAccrualTime(address,uint256,uint256)\":{\"params\":{\"_interest\":\"The amount of interest that must accrue\",\"_principal\":\"The principal amount on which interest is accruing\"},\"returns\":{\"durationSeconds\":\"The duration of time it will take to accrue the given amount of interest, in seconds.\"}},\"initialize(address,address[],uint256)\":{\"params\":{\"_controlledTokens\":\"Array of ControlledTokens that are controlled by this Prize Pool.\",\"_maxExitFeeMantissa\":\"The maximum exit fee size\"}},\"initialize(address,address[],uint256,address)\":{\"params\":{\"_controlledTokens\":\"Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\",\"_maxExitFeeMantissa\":\"The maximum exit fee size, relative to the withdrawal amount\",\"_stakeToken\":\"Address of the stake token\"}},\"isControlled(address)\":{\"details\":\"Checks if a specific token is controlled by the Prize Pool\",\"params\":{\"controlledToken\":\"The address of the token to check\"},\"returns\":{\"_0\":\"True if the token is a controlled token, false otherwise\"}},\"onERC721Received(address,address,uint256,bytes)\":{\"params\":{\"data\":\"Additional data with no specified format, sent in call to `_to`.\",\"from\":\"The current owner of the NFT\",\"operator\":\"The address that acts on behalf of the owner\",\"tokenId\":\"The NFT to transfer\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setCreditPlanOf(address,uint128,uint128)\":{\"params\":{\"_controlledToken\":\"The controlled token for whom to set the credit plan\",\"_creditLimitMantissa\":\"The credit limit to set.  Is a fixed point 18 decimal (like Ether).\",\"_creditRateMantissa\":\"The credit rate to set.  Is a fixed point 18 decimal (like Ether).\"}},\"setLiquidityCap(uint256)\":{\"params\":{\"_liquidityCap\":\"The new liquidity cap for the prize pool\"}},\"setPrizeStrategy(address)\":{\"params\":{\"_prizeStrategy\":\"The new prize strategy\"}},\"token()\":{\"details\":\"Returns the address of the underlying ERC20 asset\",\"returns\":{\"_0\":\"The address of the asset\"}},\"tokens()\":{\"returns\":{\"_0\":\"An array of controlled token addresses\"}},\"transferExternalERC20(address,address,uint256)\":{\"details\":\"Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\",\"params\":{\"amount\":\"The amount of external assets to be awarded\",\"externalToken\":\"The address of the external asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"withdrawInstantlyFrom(address,uint256,address,uint256)\":{\"params\":{\"amount\":\"The amount of tokens to redeem for assets.\",\"controlledToken\":\"The address of the token to redeem (i.e. ticket or sponsorship)\",\"from\":\"The address to redeem tokens from.\",\"maximumExitFee\":\"The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\"},\"returns\":{\"_0\":\"The actual exit fee paid\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"VERSION()\":{\"notice\":\"Semver Version\"},\"accountedBalance()\":{\"notice\":\"The total of all controlled tokens\"},\"award(address,uint256,address)\":{\"notice\":\"Called by the prize strategy to award prizes.\"},\"awardBalance()\":{\"notice\":\"Returns the balance that is available to award.\"},\"awardExternalERC20(address,address,uint256)\":{\"notice\":\"Called by the Prize-Strategy to award external ERC20 prizes\"},\"awardExternalERC721(address,address,uint256[])\":{\"notice\":\"Called by the prize strategy to award external ERC721 prizes\"},\"balanceOfCredit(address,address)\":{\"notice\":\"Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\"},\"beforeTokenTransfer(address,address,uint256)\":{\"notice\":\"Updates the Prize Strategy when tokens are transferred between holders.\"},\"calculateEarlyExitFee(address,address,uint256)\":{\"notice\":\"Calculates the early exit fee for the given amount\"},\"calculateReserveFee(uint256)\":{\"notice\":\"Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\"},\"captureAwardBalance()\":{\"notice\":\"Captures any available interest as award balance.\"},\"compLikeDelegate(address,address)\":{\"notice\":\"Delegate the votes for a Compound COMP-like token held by the prize pool\"},\"creditPlanOf(address)\":{\"notice\":\"Returns the credit rate of a controlled token\"},\"depositTo(address,uint256,address,address)\":{\"notice\":\"Deposit assets into the Prize Pool in exchange for tokens\"},\"estimateCreditAccrualTime(address,uint256,uint256)\":{\"notice\":\"Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\"},\"initialize(address,address[],uint256)\":{\"notice\":\"Initializes the Prize Pool\"},\"initialize(address,address[],uint256,address)\":{\"notice\":\"Initializes the Prize Pool and Yield Service with the required contract connections\"},\"onERC721Received(address,address,uint256,bytes)\":{\"notice\":\"Required for ERC721 safe token transfers from smart contracts.\"},\"setCreditPlanOf(address,uint128,uint128)\":{\"notice\":\"Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\"},\"setLiquidityCap(uint256)\":{\"notice\":\"Allows the Governor to set a cap on the amount of liquidity that he pool can hold\"},\"setPrizeStrategy(address)\":{\"notice\":\"Sets the prize strategy of the prize pool.  Only callable by the owner.\"},\"tokens()\":{\"notice\":\"An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\"},\"transferExternalERC20(address,address,uint256)\":{\"notice\":\"Called by the Prize-Strategy to transfer out external ERC20 tokens\"},\"withdrawInstantlyFrom(address,uint256,address,uint256)\":{\"notice\":\"Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/prize-pool/stake/StakePrizePool.sol\":\"StakePrizePool\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../external/compound/ICompLike.sol\\\";\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../reserve/ReserveInterface.sol\\\";\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/TokenListenerLibrary.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\nimport \\\"./PrizePoolInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using SafeERC20Upgradeable for IERC721Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    address reserveRegistry,\\n    uint256 maxExitFeeMantissa\\n  );\\n\\n  /// @dev Event emitted when controlled token is added\\n  event ControlledTokenAdded(\\n    ControlledTokenInterface indexed token\\n  );\\n\\n  /// @dev Emitted when reserve is captured.\\n  event ReserveFeeCaptured(\\n    uint256 amount\\n  );\\n\\n  event AwardCaptured(\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when assets are deposited\\n  event Deposited(\\n    address indexed operator,\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount,\\n    address referrer\\n  );\\n\\n  /// @dev Event emitted when interest is awarded to a winner\\n  event Awarded(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are awarded to a winner\\n  event AwardedExternalERC20(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are transferred out\\n  event TransferredExternalERC20(\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC721s are awarded to a winner\\n  event AwardedExternalERC721(\\n    address indexed winner,\\n    address indexed token,\\n    uint256[] tokenIds\\n  );\\n\\n  /// @dev Event emitted when assets are withdrawn instantly\\n  event InstantWithdrawal(\\n    address indexed operator,\\n    address indexed from,\\n    address indexed token,\\n    uint256 amount,\\n    uint256 redeemed,\\n    uint256 exitFee\\n  );\\n\\n  event ReserveWithdrawal(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when the Liquidity Cap is set\\n  event LiquidityCapSet(\\n    uint256 liquidityCap\\n  );\\n\\n  /// @dev Event emitted when the Credit plan is set\\n  event CreditPlanSet(\\n    address token,\\n    uint128 creditLimitMantissa,\\n    uint128 creditRateMantissa\\n  );\\n\\n  /// @dev Event emitted when the Prize Strategy is set\\n  event PrizeStrategySet(\\n    address indexed prizeStrategy\\n  );\\n\\n  /// @dev Emitted when credit is minted\\n  event CreditMinted(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when credit is burned\\n  event CreditBurned(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\\n  event ErrorAwardingExternalERC721(bytes error);\\n\\n\\n  struct CreditPlan {\\n    uint128 creditLimitMantissa;\\n    uint128 creditRateMantissa;\\n  }\\n\\n  struct CreditBalance {\\n    uint192 balance;\\n    uint32 timestamp;\\n    bool initialized;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  /// @dev Reserve to which reserve fees are sent\\n  RegistryInterface public reserveRegistry;\\n\\n  /// @dev An array of all the controlled tokens\\n  ControlledTokenInterface[] internal _tokens;\\n\\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\\n  TokenListenerInterface public prizeStrategy;\\n\\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\\n  /// For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\\n  uint256 public maxExitFeeMantissa;\\n\\n  /// @dev The total funds that have been allocated to the reserve\\n  uint256 public reserveTotalSupply;\\n\\n  /// @dev The total amount of funds that the prize pool can hold.\\n  uint256 public liquidityCap;\\n\\n  /// @dev the The awardable balance\\n  uint256 internal _currentAwardBalance;\\n\\n  /// @dev Stores the credit plan for each token.\\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\\n\\n  /// @dev Stores each users balance of credit per token.\\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\\n\\n  /// @notice Initializes the Prize Pool\\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\\n  /// @param _maxExitFeeMantissa The maximum exit fee size\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_reserveRegistry) != address(0), \\\"PrizePool/reserveRegistry-not-zero\\\");\\n    uint256 controlledTokensLength = _controlledTokens.length;\\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\\n\\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\\n      _addControlledToken(controlledToken, i);\\n    }\\n    __Ownable_init();\\n    __ReentrancyGuard_init();\\n    _setLiquidityCap(uint256(-1));\\n\\n    reserveRegistry = _reserveRegistry;\\n    maxExitFeeMantissa = _maxExitFeeMantissa;\\n\\n    emit Initialized(\\n      address(_reserveRegistry),\\n      maxExitFeeMantissa\\n    );\\n  }\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external override view returns (address) {\\n    return address(_token());\\n  }\\n\\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\\n  /// @return The underlying balance of assets\\n  function balance() external returns (uint256) {\\n    return _balance();\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function canAwardExternal(address _externalToken) external view returns (bool) {\\n    return _canAwardExternal(_externalToken);\\n  }\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    canAddLiquidity(amount)\\n  {\\n    address operator = _msgSender();\\n\\n    _mint(to, amount, controlledToken, referrer);\\n\\n    _token().safeTransferFrom(operator, address(this), amount);\\n    _supply(amount);\\n\\n    emit Deposited(operator, to, controlledToken, amount, referrer);\\n  }\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    returns (uint256)\\n  {\\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n    require(exitFee <= maximumExitFee, \\\"PrizePool/exit-fee-exceeds-user-maximum\\\");\\n\\n    // burn the credit\\n    _burnCredit(from, controlledToken, burnedCredit);\\n\\n    // burn the tickets\\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\\n\\n    // redeem the tickets less the fee\\n    uint256 amountLessFee = amount.sub(exitFee);\\n    uint256 redeemed = _redeem(amountLessFee);\\n\\n    _token().safeTransfer(from, redeemed);\\n\\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\\n\\n    return exitFee;\\n  }\\n\\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\\n  /// @param exitFee The exit fee to check against the limit\\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\\n    if (exitFee > maxFee) {\\n      exitFee = maxFee;\\n    }\\n    return exitFee;\\n  }\\n\\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\\n  /// @param from The address the tokens are being transferred from (0 if minting)\\n  /// @param to The address the tokens are being transferred to (0 if burning)\\n  /// @param amount The amount of tokens being trasferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\\n    if (from != address(0)) {\\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\\n      // first accrue credit for their old balance\\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\\n\\n      if (from != to) {\\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\\n      }\\n\\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\\n    }\\n    if (to != address(0) && to != from) {\\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\\n    }\\n    // if we aren't minting\\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\\n    }\\n  }\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external override view returns (uint256) {\\n    return _currentAwardBalance;\\n  }\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n\\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\\n    uint256 currentBalance = _balance();\\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\\n\\n    if (unaccountedPrizeBalance > 0) {\\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\\n      if (reserveFee > 0) {\\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\\n        emit ReserveFeeCaptured(reserveFee);\\n      }\\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\\n\\n      emit AwardCaptured(unaccountedPrizeBalance);\\n    }\\n\\n    return _currentAwardBalance;\\n  }\\n\\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\\n\\n    uint256 amount = reserveTotalSupply;\\n    reserveTotalSupply = 0;\\n    uint256 redeemed = _redeem(amount);\\n\\n    _token().safeTransfer(address(to), redeemed);\\n\\n    emit ReserveWithdrawal(to, amount);\\n\\n    return redeemed;\\n  }\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external override\\n    onlyPrizeStrategy\\n    onlyControlledToken(controlledToken)\\n  {\\n    if (amount == 0) {\\n      return;\\n    }\\n\\n    require(amount <= _currentAwardBalance, \\\"PrizePool/award-exceeds-avail\\\");\\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\\n\\n    _mint(to, amount, controlledToken, address(0));\\n\\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\\n\\n    emit Awarded(to, controlledToken, amount);\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit TransferredExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit AwardedExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  function _transferOut(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (bool)\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (amount == 0) {\\n      return false;\\n    }\\n\\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\\n\\n    return true;\\n  }\\n\\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\\n  /// @param to The user who is receiving the tokens\\n  /// @param amount The amount of tokens they are receiving\\n  /// @param controlledToken The token that is going to be minted\\n  /// @param referrer The user who referred the minting\\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\\n    if (address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n    ControlledToken(controlledToken).controllerMint(to, amount);\\n  }\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (tokenIds.length == 0) {\\n      return;\\n    }\\n\\n    for (uint256 i = 0; i < tokenIds.length; i++) {\\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\\n\\n      }\\n      catch(bytes memory error){\\n        emit ErrorAwardingExternalERC721(error);\\n      }\\n      \\n    }\\n\\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\\n  }\\n\\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\\n  /// @param amount The prize amount\\n  /// @return The size of the reserve portion of the prize\\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    if (address(reserve) == address(0)) {\\n      return 0;\\n    }\\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\\n    if (reserveRateMantissa == 0) {\\n      return 0;\\n    }\\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\\n  }\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external override\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    )\\n  {\\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n  }\\n\\n  /// @dev Calculates the early exit fee for the given amount\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return Exit fee\\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\\n    return _limitExitFee(\\n      amount,\\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external override\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    durationSeconds =_estimateCreditAccrualTime(\\n      _controlledToken,\\n      _principal,\\n      _interest\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function _estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    internal\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    // interest = credit rate * principal * time\\n    // => time = interest / (credit rate * principal)\\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\\n    if (accruedPerSecond == 0) {\\n      return 0;\\n    }\\n    return _interest.div(accruedPerSecond);\\n  }\\n\\n  /// @notice Burns a users credit.\\n  /// @param user The user whose credit should be burned\\n  /// @param credit The amount of credit to burn\\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\\n\\n    emit CreditBurned(user, controlledToken, credit);\\n  }\\n\\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\\n  /// @param user The user for whom to accrue credit\\n  /// @param controlledToken The controlled token whose balance we are checking\\n  /// @param controlledTokenBalance The balance to use for the user\\n  /// @param extra Additional credit to be added\\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\\n    _updateCreditBalance(\\n      user,\\n      controlledToken,\\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\\n    );\\n  }\\n\\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\\n    uint256 newBalance;\\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\\n    if (!creditBalance.initialized) {\\n      newBalance = 0;\\n    } else {\\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\\n    }\\n    return newBalance;\\n  }\\n\\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\\n\\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\\n      balance: newBalance.toUint128(),\\n      timestamp: _currentTime().toUint32(),\\n      initialized: true\\n    });\\n\\n    if (oldBalance < newBalance) {\\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\\n    } \\n    else if (newBalance < oldBalance) {\\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\\n    }\\n  }\\n\\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\\n  /// @param creditBalance The new credit balance to be checked\\n  /// @return The users new credit balance.  Will not exceed the credit limit.\\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\\n      controlledTokenBalance,\\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\\n    );\\n    if (creditBalance > creditLimit) {\\n      creditBalance = creditLimit;\\n    }\\n\\n    return creditBalance;\\n  }\\n\\n  /// @notice Calculates the accrued interest for a user\\n  /// @param user The user whose credit should be calculated.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\\n  /// @return The credit that has accrued since the last credit update.\\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\\n\\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\\n      return 0;\\n    }\\n\\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\\n  }\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\\n    return _tokenCreditBalances[controlledToken][user].balance;\\n  }\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external override\\n    onlyControlledToken(_controlledToken)\\n    onlyOwner\\n  {\\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\\n      creditLimitMantissa: _creditLimitMantissa,\\n      creditRateMantissa: _creditRateMantissa\\n    });\\n\\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\\n  }\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external override\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    )\\n  {\\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\\n  }\\n\\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The token they are withdrawing\\n  /// @param amount The amount of funds they are withdrawing\\n  /// @return earlyExitFee The additional exit fee that should be charged.\\n  /// @return creditBurned The amount of credit that will be burned\\n  function _calculateEarlyExitFeeLessBurnedCredit(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (\\n      uint256 earlyExitFee,\\n      uint256 creditBurned\\n    )\\n  {\\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\\n    require(controlledTokenBalance >= amount, \\\"PrizePool/insuff-funds\\\");\\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\\n    /*\\n    The credit is used *last*.  Always charge the fees up-front.\\n\\n    How to calculate:\\n\\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\\n\\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\\n    */\\n\\n    // Determine available usable credit based on withdraw amount\\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\\n\\n    uint256 availableCredit;\\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\\n    }\\n\\n    // Determine amount of credit to burn and amount of fees required\\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\\n    earlyExitFee = totalExitFee.sub(creditBurned);\\n  }\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\\n    _setLiquidityCap(_liquidityCap);\\n  }\\n\\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\\n    liquidityCap = _liquidityCap;\\n    emit LiquidityCapSet(_liquidityCap);\\n  }\\n\\n  /// @notice Adds a new controlled token\\n  /// @param _controlledToken The controlled token to add.\\n  /// @param index The index to add the controlledToken\\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\\n    require(_controlledToken.controller() == this, \\\"PrizePool/token-ctrlr-mismatch\\\");\\n    \\n    _tokens[index] = _controlledToken;\\n    emit ControlledTokenAdded(_controlledToken);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\\n    _setPrizeStrategy(_prizeStrategy);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\\n    require(address(_prizeStrategy) != address(0), \\\"PrizePool/prizeStrategy-not-zero\\\");\\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PrizePool/prizeStrategy-invalid\\\");\\n    prizeStrategy = _prizeStrategy;\\n\\n    emit PrizeStrategySet(address(_prizeStrategy));\\n  }\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\\n    return _tokens;\\n  }\\n\\n  /// @dev Gets the current time as represented by the current block\\n  /// @return The timestamp of the current block\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external override view returns (uint256) {\\n    return _tokenTotalSupply();\\n  }\\n\\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\\n  /// @param to The address to delegate to \\n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\\n    if (compLike.balanceOf(address(this)) > 0) {\\n      compLike.delegate(to);\\n    }\\n  }\\n  \\n  /// @notice Required for ERC721 safe token transfers from smart contracts.\\n  /// @param operator The address that acts on behalf of the owner\\n  /// @param from The current owner of the NFT\\n  /// @param tokenId The NFT to transfer\\n  /// @param data Additional data with no specified format, sent in call to `_to`.\\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function _tokenTotalSupply() internal view returns (uint256) {\\n    uint256 total = reserveTotalSupply;\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \\n    uint256 tokensLength = tokens.length;\\n    \\n    for(uint256 i = 0; i < tokensLength; i++){\\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\\n    }\\n\\n    return total;\\n  }\\n\\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\\n  }\\n\\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\\n    uint256 tokensLength = tokens.length;\\n\\n    for(uint256 i = 0; i < tokensLength; i++) {\\n      if(tokens[i] == controlledToken) return true;\\n    }\\n    return false;\\n  }\\n  \\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\\n    return _isControlled(controlledToken);\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function _token() internal virtual view returns (IERC20Upgradeable);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal virtual returns (uint256);\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal virtual;\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\\n\\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  modifier onlyControlledToken(address controlledToken) {\\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \\\"PrizePool/unknown-token\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure caller is the prize-strategy\\n  modifier onlyPrizeStrategy() {\\n    require(_msgSender() == address(prizeStrategy), \\\"PrizePool/only-prizeStrategy\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\\n  modifier canAddLiquidity(uint256 _amount) {\\n    require(_canAddLiquidity(_amount), \\\"PrizePool/exceeds-liquidity-cap\\\");\\n    _;\\n  }\\n\\n  modifier onlyReserve() {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    require(address(reserve) == msg.sender, \\\"PrizePool/only-reserve\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x386ebc1c80ab4424f14125e716dd12641ff933b475bf1082b7b1a6eee4a969c3\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/stake/StakePrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"../PrizePool.sol\\\";\\n\\ncontract StakePrizePool is PrizePool {\\n\\n  IERC20Upgradeable private stakeToken;\\n\\n  event StakePrizePoolInitialized(address indexed stakeToken);\\n\\n  /// @notice Initializes the Prize Pool and Yield Service with the required contract connections\\n  /// @param _controlledTokens Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\\n  /// @param _maxExitFeeMantissa The maximum exit fee size, relative to the withdrawal amount\\n  /// @param _stakeToken Address of the stake token\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa,\\n    IERC20Upgradeable _stakeToken\\n  )\\n    public\\n    initializer\\n  {\\n    PrizePool.initialize(\\n      _reserveRegistry,\\n      _controlledTokens,\\n      _maxExitFeeMantissa\\n    );\\n\\n    require(address(_stakeToken) != address(0), \\\"StakePrizePool/stake-token-not-zero-address\\\");\\n    stakeToken = _stakeToken;\\n\\n    emit StakePrizePoolInitialized(address(stakeToken));\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal override view returns (bool) {\\n    return address(stakeToken) != _externalToken;\\n  }\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal override returns (uint256) {\\n    return stakeToken.balanceOf(address(this));\\n  }\\n\\n  function _token() internal override view returns (IERC20Upgradeable) {\\n    return stakeToken;\\n  }\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal override {\\n    // no-op because nothing else needs to be done\\n  }\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal override returns (uint256) {\\n    return redeemAmount;\\n  }\\n}\\n\",\"keccak256\":\"0x3410ac3873521a451484e54c6319be3042f2d92da8030511403f192edb3f5798\",\"license\":\"GPL-3.0\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/prize-pool/stake/StakePrizePool.sol:StakePrizePool",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/prize-pool/stake/StakePrizePool.sol:StakePrizePool",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/prize-pool/stake/StakePrizePool.sol:StakePrizePool",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 10,
                "contract": "contracts/prize-pool/stake/StakePrizePool.sol:StakePrizePool",
                "label": "_owner",
                "offset": 0,
                "slot": "51",
                "type": "t_address"
              },
              {
                "astId": 129,
                "contract": "contracts/prize-pool/stake/StakePrizePool.sol:StakePrizePool",
                "label": "__gap",
                "offset": 0,
                "slot": "52",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 4743,
                "contract": "contracts/prize-pool/stake/StakePrizePool.sol:StakePrizePool",
                "label": "_status",
                "offset": 0,
                "slot": "101",
                "type": "t_uint256"
              },
              {
                "astId": 4786,
                "contract": "contracts/prize-pool/stake/StakePrizePool.sol:StakePrizePool",
                "label": "__gap",
                "offset": 0,
                "slot": "102",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 6817,
                "contract": "contracts/prize-pool/stake/StakePrizePool.sol:StakePrizePool",
                "label": "reserveRegistry",
                "offset": 0,
                "slot": "151",
                "type": "t_contract(RegistryInterface)12458"
              },
              {
                "astId": 6821,
                "contract": "contracts/prize-pool/stake/StakePrizePool.sol:StakePrizePool",
                "label": "_tokens",
                "offset": 0,
                "slot": "152",
                "type": "t_array(t_contract(ControlledTokenInterface)15850)dyn_storage"
              },
              {
                "astId": 6824,
                "contract": "contracts/prize-pool/stake/StakePrizePool.sol:StakePrizePool",
                "label": "prizeStrategy",
                "offset": 0,
                "slot": "153",
                "type": "t_contract(TokenListenerInterface)16265"
              },
              {
                "astId": 6827,
                "contract": "contracts/prize-pool/stake/StakePrizePool.sol:StakePrizePool",
                "label": "maxExitFeeMantissa",
                "offset": 0,
                "slot": "154",
                "type": "t_uint256"
              },
              {
                "astId": 6830,
                "contract": "contracts/prize-pool/stake/StakePrizePool.sol:StakePrizePool",
                "label": "reserveTotalSupply",
                "offset": 0,
                "slot": "155",
                "type": "t_uint256"
              },
              {
                "astId": 6833,
                "contract": "contracts/prize-pool/stake/StakePrizePool.sol:StakePrizePool",
                "label": "liquidityCap",
                "offset": 0,
                "slot": "156",
                "type": "t_uint256"
              },
              {
                "astId": 6836,
                "contract": "contracts/prize-pool/stake/StakePrizePool.sol:StakePrizePool",
                "label": "_currentAwardBalance",
                "offset": 0,
                "slot": "157",
                "type": "t_uint256"
              },
              {
                "astId": 6841,
                "contract": "contracts/prize-pool/stake/StakePrizePool.sol:StakePrizePool",
                "label": "_tokenCreditPlans",
                "offset": 0,
                "slot": "158",
                "type": "t_mapping(t_address,t_struct(CreditPlan)6803_storage)"
              },
              {
                "astId": 6848,
                "contract": "contracts/prize-pool/stake/StakePrizePool.sol:StakePrizePool",
                "label": "_tokenCreditBalances",
                "offset": 0,
                "slot": "159",
                "type": "t_mapping(t_address,t_mapping(t_address,t_struct(CreditBalance)6810_storage))"
              },
              {
                "astId": 9163,
                "contract": "contracts/prize-pool/stake/StakePrizePool.sol:StakePrizePool",
                "label": "stakeToken",
                "offset": 0,
                "slot": "160",
                "type": "t_contract(IERC20Upgradeable)1960"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_contract(ControlledTokenInterface)15850)dyn_storage": {
                "base": "t_contract(ControlledTokenInterface)15850",
                "encoding": "dynamic_array",
                "label": "contract ControlledTokenInterface[]",
                "numberOfBytes": "32"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_contract(ControlledTokenInterface)15850": {
                "encoding": "inplace",
                "label": "contract ControlledTokenInterface",
                "numberOfBytes": "20"
              },
              "t_contract(IERC20Upgradeable)1960": {
                "encoding": "inplace",
                "label": "contract IERC20Upgradeable",
                "numberOfBytes": "20"
              },
              "t_contract(RegistryInterface)12458": {
                "encoding": "inplace",
                "label": "contract RegistryInterface",
                "numberOfBytes": "20"
              },
              "t_contract(TokenListenerInterface)16265": {
                "encoding": "inplace",
                "label": "contract TokenListenerInterface",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_mapping(t_address,t_struct(CreditBalance)6810_storage))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => struct PrizePool.CreditBalance))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_struct(CreditBalance)6810_storage)"
              },
              "t_mapping(t_address,t_struct(CreditBalance)6810_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct PrizePool.CreditBalance)",
                "numberOfBytes": "32",
                "value": "t_struct(CreditBalance)6810_storage"
              },
              "t_mapping(t_address,t_struct(CreditPlan)6803_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct PrizePool.CreditPlan)",
                "numberOfBytes": "32",
                "value": "t_struct(CreditPlan)6803_storage"
              },
              "t_struct(CreditBalance)6810_storage": {
                "encoding": "inplace",
                "label": "struct PrizePool.CreditBalance",
                "members": [
                  {
                    "astId": 6805,
                    "contract": "contracts/prize-pool/stake/StakePrizePool.sol:StakePrizePool",
                    "label": "balance",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint192"
                  },
                  {
                    "astId": 6807,
                    "contract": "contracts/prize-pool/stake/StakePrizePool.sol:StakePrizePool",
                    "label": "timestamp",
                    "offset": 24,
                    "slot": "0",
                    "type": "t_uint32"
                  },
                  {
                    "astId": 6809,
                    "contract": "contracts/prize-pool/stake/StakePrizePool.sol:StakePrizePool",
                    "label": "initialized",
                    "offset": 28,
                    "slot": "0",
                    "type": "t_bool"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_struct(CreditPlan)6803_storage": {
                "encoding": "inplace",
                "label": "struct PrizePool.CreditPlan",
                "members": [
                  {
                    "astId": 6800,
                    "contract": "contracts/prize-pool/stake/StakePrizePool.sol:StakePrizePool",
                    "label": "creditLimitMantissa",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint128"
                  },
                  {
                    "astId": 6802,
                    "contract": "contracts/prize-pool/stake/StakePrizePool.sol:StakePrizePool",
                    "label": "creditRateMantissa",
                    "offset": 16,
                    "slot": "0",
                    "type": "t_uint128"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_uint128": {
                "encoding": "inplace",
                "label": "uint128",
                "numberOfBytes": "16"
              },
              "t_uint192": {
                "encoding": "inplace",
                "label": "uint192",
                "numberOfBytes": "24"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint32": {
                "encoding": "inplace",
                "label": "uint32",
                "numberOfBytes": "4"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "VERSION()": {
                "notice": "Semver Version"
              },
              "accountedBalance()": {
                "notice": "The total of all controlled tokens"
              },
              "award(address,uint256,address)": {
                "notice": "Called by the prize strategy to award prizes."
              },
              "awardBalance()": {
                "notice": "Returns the balance that is available to award."
              },
              "awardExternalERC20(address,address,uint256)": {
                "notice": "Called by the Prize-Strategy to award external ERC20 prizes"
              },
              "awardExternalERC721(address,address,uint256[])": {
                "notice": "Called by the prize strategy to award external ERC721 prizes"
              },
              "balanceOfCredit(address,address)": {
                "notice": "Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit."
              },
              "beforeTokenTransfer(address,address,uint256)": {
                "notice": "Updates the Prize Strategy when tokens are transferred between holders."
              },
              "calculateEarlyExitFee(address,address,uint256)": {
                "notice": "Calculates the early exit fee for the given amount"
              },
              "calculateReserveFee(uint256)": {
                "notice": "Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero."
              },
              "captureAwardBalance()": {
                "notice": "Captures any available interest as award balance."
              },
              "compLikeDelegate(address,address)": {
                "notice": "Delegate the votes for a Compound COMP-like token held by the prize pool"
              },
              "creditPlanOf(address)": {
                "notice": "Returns the credit rate of a controlled token"
              },
              "depositTo(address,uint256,address,address)": {
                "notice": "Deposit assets into the Prize Pool in exchange for tokens"
              },
              "estimateCreditAccrualTime(address,uint256,uint256)": {
                "notice": "Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit."
              },
              "initialize(address,address[],uint256)": {
                "notice": "Initializes the Prize Pool"
              },
              "initialize(address,address[],uint256,address)": {
                "notice": "Initializes the Prize Pool and Yield Service with the required contract connections"
              },
              "onERC721Received(address,address,uint256,bytes)": {
                "notice": "Required for ERC721 safe token transfers from smart contracts."
              },
              "setCreditPlanOf(address,uint128,uint128)": {
                "notice": "Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether)."
              },
              "setLiquidityCap(uint256)": {
                "notice": "Allows the Governor to set a cap on the amount of liquidity that he pool can hold"
              },
              "setPrizeStrategy(address)": {
                "notice": "Sets the prize strategy of the prize pool.  Only callable by the owner."
              },
              "tokens()": {
                "notice": "An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)"
              },
              "transferExternalERC20(address,address,uint256)": {
                "notice": "Called by the Prize-Strategy to transfer out external ERC20 tokens"
              },
              "withdrawInstantlyFrom(address,uint256,address,uint256)": {
                "notice": "Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit."
              }
            },
            "version": 1
          }
        }
      },
      "contracts/prize-pool/stake/StakePrizePoolProxyFactory.sol": {
        "StakePrizePoolProxyFactory": {
          "abi": [
            {
              "inputs": [],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "name": "ProxyCreated",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "create",
              "outputs": [
                {
                  "internalType": "contract StakePrizePool",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_logic",
                  "type": "address"
                },
                {
                  "internalType": "bytes",
                  "name": "_data",
                  "type": "bytes"
                }
              ],
              "name": "deployMinimal",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "instance",
              "outputs": [
                {
                  "internalType": "contract StakePrizePool",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "create()": {
                "returns": {
                  "_0": "A reference to the new proxied Stake Prize Pool"
                }
              }
            },
            "title": "Stake Prize Pool Proxy Factory",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5060405161001d9061005f565b604051809103906000f080158015610039573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b039290921691909117905561006c565b614031806103b283390190565b6103378061007b6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063022ec09514610046578063b3eeb5e21461006a578063efc81a8c14610120575b600080fd5b61004e610128565b604080516001600160a01b039092168252519081900360200190f35b61004e6004803603604081101561008057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100ab57600080fd5b8201836020820111156100bd57600080fd5b803590602001918460018302840111640100000000831117156100df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610137945050505050565b61004e6102b3565b6000546001600160a01b031681565b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a18251156102ac576000826001600160a01b0316846040518082805190602001908083835b602083106102035780518252601f1990920191602091820191016101e4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610265576040519150601f19603f3d011682016040523d82523d6000602084013e61026a565b606091505b50509050806102aa5760405162461bcd60e51b81526004018080602001828103825260248152602001806102de6024913960400191505060405180910390fd5b505b5092915050565b6000805460408051602081019091528281526102d8916001600160a01b031690610137565b90509056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a26469706673582212203ef01bd8da74b6ddf5a24c4a3f0162aea619611e7e8fab758d6b81fb8cddf34364736f6c634300060c0033608060405234801561001057600080fd5b50614011806100206000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c8063888c2b6f11610130578063a7b2cc31116100b8578063e6d8a94b1161007c578063e6d8a94b14610943578063edb4e1cf1461094b578063f2fde38b14610953578063fc0c546a14610979578063ffa1ad741461098157610227565b8063a7b2cc31146107ae578063b69ef8a8146107eb578063c5871485146107f3578063d4a1361d146108b2578063e323f8251461090757610227565b806398bf3eb6116100ff57806398bf3eb6146106ef5780639d63848a146106f75780639e1675191461074f5780639fe32a9114610757578063a016240b1461077457610227565b8063888c2b6f1461064e5780638da5cb5b1461069d5780638e71c1f6146106c157806391ca480e146106c957610227565b8063630665b4116101b357806376687d3d1161018257806376687d3d1461059b57806378b3d327146105a357806379cb8563146105c95780637b99adb1146105fb5780637cbab1c71461061857610227565b8063630665b41461051b5780636a3fd4f9146105235780636b1b863a1461055d578063715018a61461059357610227565b80632b0ab144116101fa5780632b0ab144146103b05780632f7627e3146103e65780633ede50c614610414578063494de9f7146104c757806352a387ab146104f557610227565b80630937eb541461022c57806313f55e3914610246578063150b7a021461027e57806316960d5514610329575b600080fd5b6102346109fe565b60408051918252519081900360200190f35b61027c6004803603606081101561025c57600080fd5b506001600160a01b03813581169160208101359091169060400135610a0d565b005b61030c6004803603608081101561029457600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156102ce57600080fd5b8201836020820111156102e057600080fd5b803590602001918460018302840111600160201b8311171561030157600080fd5b509092509050610acb565b604080516001600160e01b03199092168252519081900360200190f35b61027c6004803603606081101561033f57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561037257600080fd5b82018360208201111561038457600080fd5b803590602001918460208302840111600160201b831117156103a557600080fd5b509092509050610adc565b61027c600480360360608110156103c657600080fd5b506001600160a01b03813581169160208101359091169060400135610d89565b61027c600480360360408110156103fc57600080fd5b506001600160a01b0381358116916020013516610e46565b61027c6004803603606081101561042a57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561045457600080fd5b82018360208201111561046657600080fd5b803590602001918460208302840111600160201b8311171561048757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250610f95915050565b610234600480360360408110156104dd57600080fd5b506001600160a01b0381358116916020013516611187565b6102346004803603602081101561050b57600080fd5b50356001600160a01b031661128e565b6102346113dd565b6105496004803603602081101561053957600080fd5b50356001600160a01b03166113e3565b604080519115158252519081900360200190f35b61027c6004803603606081101561057357600080fd5b506001600160a01b038135811691602081013591604090910135166113f6565b61027c6115fe565b6102346116aa565b610549600480360360208110156105b957600080fd5b50356001600160a01b03166116b0565b610234600480360360608110156105df57600080fd5b506001600160a01b0381351690602081013590604001356116bb565b61027c6004803603602081101561061157600080fd5b50356116d0565b61027c6004803603606081101561062e57600080fd5b506001600160a01b0381358116916020810135909116906040013561173e565b6106846004803603606081101561066457600080fd5b506001600160a01b0381358116916020810135909116906040013561198a565b6040805192835260208301919091528051918290030190f35b6106a56119a4565b604080516001600160a01b039092168252519081900360200190f35b6106a56119b3565b61027c600480360360208110156106df57600080fd5b50356001600160a01b03166119c2565b6106a5611a2d565b6106ff611a3c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561073b578181015183820152602001610723565b505050509050019250505060405180910390f35b610234611a9e565b6102346004803603602081101561076d57600080fd5b5035611aa4565b6102346004803603608081101561078a57600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611bd2565b61027c600480360360608110156107c457600080fd5b506001600160a01b03813516906001600160801b0360208201358116916040013516611e09565b610234611f5f565b61027c6004803603608081101561080957600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561083357600080fd5b82018360208201111561084557600080fd5b803590602001918460208302840111600160201b8311171561086657600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602001356001600160a01b0316611f69565b6108d8600480360360208110156108c857600080fd5b50356001600160a01b03166120ac565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b61027c6004803603608081101561091d57600080fd5b506001600160a01b038135811691602081013591604082013581169160600135166120dc565b610234612291565b610234612407565b61027c6004803603602081101561096957600080fd5b50356001600160a01b031661240d565b6106a5612510565b61098961251a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156109c35781810151838201526020016109ab565b50505050905090810190601f1680156109f05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610a0861253b565b905090565b6099546001600160a01b0316610a21612646565b6001600160a01b031614610a6a576040805162461bcd60e51b815260206004820152601c6024820152600080516020613fbc833981519152604482015290519081900360640190fd5b610a7583838361264a565b15610ac657816001600160a01b0316836001600160a01b03167fb0bac59718cd343c80a813518afcf36846cfcfe6d56e2b3cab9bd49f5f9b251c836040518082815260200191505060405180910390a35b505050565b630a85bd0160e11b95945050505050565b6099546001600160a01b0316610af0612646565b6001600160a01b031614610b39576040805162461bcd60e51b815260206004820152601c6024820152600080516020613fbc833981519152604482015290519081900360640190fd5b610b42836126d2565b610b93576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b80610b9d57610d83565b60005b81811015610d0a57836001600160a01b03166342842e0e3087868686818110610bc557fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610c2257600080fd5b505af1925050508015610c33575060015b610d02573d808015610c61576040519150601f19603f3d011682016040523d82523d6000602084013e610c66565b606091505b507f17e975018310f88872b58d4d8263adca83cf5c1893496ea2a86923dab15276ad816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610cc6578181015183820152602001610cae565b50505050905090810190601f168015610cf35780820380516001836020036101000a031916815260200191505b509250505060405180910390a1505b600101610ba0565b50826001600160a01b0316846001600160a01b03167f69c2de32bc4d47f488e72626a6cfdee85089342e52675e7de79c4b417623960c848460405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a35b50505050565b6099546001600160a01b0316610d9d612646565b6001600160a01b031614610de6576040805162461bcd60e51b815260206004820152601c6024820152600080516020613fbc833981519152604482015290519081900360640190fd5b610df183838361264a565b15610ac657816001600160a01b0316836001600160a01b03167fc65f48aca3b7a99b7443d04b8ffbb073156179bc628dc3f7def5047748973469836040518082815260200191505060405180910390a3505050565b610e4e612646565b6001600160a01b0316610e5f6119a4565b6001600160a01b031614610ea8576040805162461bcd60e51b81526020600482018190526024820152600080516020613eda833981519152604482015290519081900360640190fd5b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610ef757600080fd5b505afa158015610f0b573d6000803e3d6000fd5b505050506040513d6020811015610f2157600080fd5b50511115610f9157816001600160a01b0316635c19a95c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015610f7857600080fd5b505af1158015610f8c573d6000803e3d6000fd5b505050505b5050565b600054610100900460ff1680610fae5750610fae6126e7565b80610fbc575060005460ff16155b610ff75760405162461bcd60e51b815260040180806020018281038252602e815260200180613e8b602e913960400191505060405180910390fd5b600054610100900460ff16158015611022576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0384166110675760405162461bcd60e51b8152600401808060200182810382526022815260200180613e436022913960400191505060405180910390fd5b82518067ffffffffffffffff8111801561108057600080fd5b506040519080825280602002602001820160405280156110aa578160200160208202803683370190505b5080516110bf91609891602090910190613d7a565b5060005b818110156110f65760008582815181106110d957fe5b602002602001015190506110ed81836126f8565b506001016110c3565b506110ff612823565b6111076128d4565b611112600019612969565b609780546001600160a01b0319166001600160a01b038716908117909155609a849055604080519182526020820185905280517f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce799281900390910190a1508015610d83576000805461ff001916905550505050565b600081611193816129a4565b6111d2576040805162461bcd60e51b81526020600482015260176024820152600080516020613f21833981519152604482015290519081900360640190fd5b6112578484856001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561122457600080fd5b505afa158015611238573d6000803e3d6000fd5b505050506040513d602081101561124e57600080fd5b50516000612a60565b50506001600160a01b039081166000908152609f60209081526040808320949093168252929092529020546001600160c01b031690565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112df57600080fd5b505afa1580156112f3573d6000803e3d6000fd5b505050506040513d602081101561130957600080fd5b505190506001600160a01b0381163314611363576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f6f6e6c792d7265736572766560501b604482015290519081900360640190fd5b609b80546000918290559061137782612a76565b90506113968582611386612a79565b6001600160a01b03169190612a88565b6040805183815290516001600160a01b038716917f1c71c8e11fd443227c8f8d3dc1a237a3a5e8310b540c7fbcf5169754aedf42c9919081900360200190a2949350505050565b609d5490565b60006113ee826126d2565b90505b919050565b6099546001600160a01b031661140a612646565b6001600160a01b031614611453576040805162461bcd60e51b815260206004820152601c6024820152600080516020613fbc833981519152604482015290519081900360640190fd5b8061145d816129a4565b61149c576040805162461bcd60e51b81526020600482015260176024820152600080516020613f21833981519152604482015290519081900360640190fd5b826114a657610d83565b609d548311156114fd576040805162461bcd60e51b815260206004820152601d60248201527f5072697a65506f6f6c2f61776172642d657863656564732d617661696c000000604482015290519081900360640190fd5b609d5461150a9084612ada565b609d5561151a8484846000612b3c565b60006115268385612c22565b90506115ac8584856001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561157a57600080fd5b505afa15801561158e573d6000803e3d6000fd5b505050506040513d60208110156115a457600080fd5b505184612a60565b826001600160a01b0316856001600160a01b03167fe2554529d99ab7a67db6b4cea2b32c7d55ae325f958861e05f304fdded867e31866040518082815260200191505060405180910390a35050505050565b611606612646565b6001600160a01b03166116176119a4565b6001600160a01b031614611660576040805162461bcd60e51b81526020600482018190526024820152600080516020613eda833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b609c5481565b60006113ee826129a4565b60006116c8848484612c5a565b949350505050565b6116d8612646565b6001600160a01b03166116e96119a4565b6001600160a01b031614611732576040805162461bcd60e51b81526020600482018190526024820152600080516020613eda833981519152604482015290519081900360640190fd5b61173b81612969565b50565b33611748816129a4565b611787576040805162461bcd60e51b81526020600482015260176024820152600080516020613f21833981519152604482015290519081900360640190fd5b6001600160a01b03841615611861576000336001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156117e557600080fd5b505afa1580156117f9573d6000803e3d6000fd5b505050506040513d602081101561180f57600080fd5b50519050600061182186338484612cb4565b9050846001600160a01b0316866001600160a01b031614611853576118503361184a8487612ada565b83612d43565b90505b61185e863383612d89565b50505b6001600160a01b0383161580159061188b5750836001600160a01b0316836001600160a01b031614155b156118e2576118e28333336001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561122457600080fd5b6001600160a01b0384161580159061190457506099546001600160a01b031615155b15610d83576099546040805163b221095760e01b81526001600160a01b0387811660048301528681166024830152604482018690523360648301529151919092169163b221095791608480830192600092919082900301818387803b15801561196c57600080fd5b505af1158015611980573d6000803e3d6000fd5b5050505050505050565b600080611998858585612f27565b90969095509350505050565b6033546001600160a01b031690565b6097546001600160a01b031681565b6119ca612646565b6001600160a01b03166119db6119a4565b6001600160a01b031614611a24576040805162461bcd60e51b81526020600482018190526024820152600080516020613eda833981519152604482015290519081900360640190fd5b61173b816130c5565b6099546001600160a01b031681565b60606098805480602002602001604051908101604052809291908181526020018280548015611a9457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a76575b5050505050905090565b609a5481565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611af557600080fd5b505afa158015611b09573d6000803e3d6000fd5b505050506040513d6020811015611b1f57600080fd5b505190506001600160a01b038116611b3b5760009150506113f1565b6000816001600160a01b031663010dfa58306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611b8a57600080fd5b505afa158015611b9e573d6000803e3d6000fd5b505050506040513d6020811015611bb457600080fd5b5051905080611bc8576000925050506113f1565b6116c884826131d8565b600060026065541415611c2c576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655582611c3b816129a4565b611c7a576040805162461bcd60e51b81526020600482015260176024820152600080516020613f21833981519152604482015290519081900360640190fd5b600080611c88888789612f27565b9150915084821115611ccb5760405162461bcd60e51b8152600401808060200182810382526027815260200180613efa6027913960400191505060405180910390fd5b611cd68887836131f9565b856001600160a01b031663631b5dfb611ced612646565b8a8a6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611d4557600080fd5b505af1158015611d59573d6000803e3d6000fd5b505050506000611d728389612ada90919063ffffffff16565b90506000611d7f82612a76565b9050611d8e8a82611386612a79565b876001600160a01b03168a6001600160a01b0316611daa612646565b604080518d81526020810186905280820189905290516001600160a01b0392909216917f0271704a58fd2953e49b87d67a0a3ce28a58147de98a5457f60b4686f63850309181900360600190a450506001606555509695505050505050565b82611e13816129a4565b611e52576040805162461bcd60e51b81526020600482015260176024820152600080516020613f21833981519152604482015290519081900360640190fd5b611e5a612646565b6001600160a01b0316611e6b6119a4565b6001600160a01b031614611eb4576040805162461bcd60e51b81526020600482018190526024820152600080516020613eda833981519152604482015290519081900360640190fd5b6040805180820182526001600160801b0380851680835286821660208085018281526001600160a01b038b166000818152609e84528890209651875492518716600160801b029087166fffffffffffffffffffffffffffffffff1990931692909217909516179094558451928352928201528083019190915290517ffb0ba2cf86a2b03bcf387753a2192da80a006afa99dd022bb301c78e323bf1b99181900360600190a150505050565b6000610a086132ba565b600054610100900460ff1680611f825750611f826126e7565b80611f90575060005460ff16155b611fcb5760405162461bcd60e51b815260040180806020018281038252602e815260200180613e8b602e913960400191505060405180910390fd5b600054610100900460ff16158015611ff6576000805460ff1961ff0019909116610100171660011790555b612001858585610f95565b6001600160a01b0382166120465760405162461bcd60e51b815260040180806020018281038252602b815260200180613f91602b913960400191505060405180910390fd5b60a080546001600160a01b0319166001600160a01b0384811691909117918290556040519116907fa81053747b04e643171034e5426f6deebb058fc29dfe032e33345a109224b31b90600090a280156120a5576000805461ff00191690555b5050505050565b6001600160a01b03166000908152609e60205260409020546001600160801b0380821692600160801b9092041690565b60026065541415612134576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655581612143816129a4565b612182576040805162461bcd60e51b81526020600482015260176024820152600080516020613f21833981519152604482015290519081900360640190fd5b8361218c81613336565b6121dd576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f657863656564732d6c69717569646974792d63617000604482015290519081900360640190fd5b60006121e7612646565b90506121f587878787612b3c565b612214813088612203612a79565b6001600160a01b031692919061335a565b61221d8661173b565b846001600160a01b0316876001600160a01b0316826001600160a01b03167f6ce569498e0f86f147466ac49211cb2a1ffe06195adb805e383b3f2365109160898860405180838152602001826001600160a01b031681526020019250505060405180910390a4505060016065555050505050565b6000600260655414156122eb576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655560006122fa61253b565b905060006123066132ba565b90506000828211612318576000612322565b6123228284612ada565b90506000609d548211612336576000612344565b609d54612344908390612ada565b905080156123f657600061235782611aa4565b905080156123b157609b5461236c90826133b4565b609b556123798282612ada565b6040805183815290519193507f5f1703ccfa2730d4245350f228079926a37f26a44ecf6978a7eeafff0af11407919081900360200190a15b609d546123be90836133b4565b609d556040805183815290517fce2b6e507c7ca1a20ce136810f524eefc19ba4c7e4866eb6cc0cba76e778d4be9181900360200190a1505b609d54945050505050600160655590565b609b5481565b612415612646565b6001600160a01b03166124266119a4565b6001600160a01b03161461246f576040805162461bcd60e51b81526020600482018190526024820152600080516020613eda833981519152604482015290519081900360640190fd5b6001600160a01b0381166124b45760405162461bcd60e51b8152600401808060200182810382526026815260200180613df66026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610a08612a79565b60405180604001604052806005815260200164332e342e3560d81b81525081565b600080609b5490506060609880548060200260200160405190810160405280929190818152602001828054801561259b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161257d575b505083519394506000925050505b8181101561263d576126338382815181106125c057fe5b60200260200101516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561260057600080fd5b505afa158015612614573d6000803e3d6000fd5b505050506040513d602081101561262a57600080fd5b505185906133b4565b93506001016125a9565b50919250505090565b3390565b6000612655836126d2565b6126a6576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b816126b3575060006126cb565b6126c76001600160a01b0384168584612a88565b5060015b9392505050565b60a0546001600160a01b039182169116141590565b60006126f23061340e565b15905090565b306001600160a01b0316826001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b15801561273b57600080fd5b505afa15801561274f573d6000803e3d6000fd5b505050506040513d602081101561276557600080fd5b50516001600160a01b0316146127c2576040805162461bcd60e51b815260206004820152601e60248201527f5072697a65506f6f6c2f746f6b656e2d6374726c722d6d69736d617463680000604482015290519081900360640190fd5b81609882815481106127d057fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051918416917f460e712b4a5d801d031ed673dea209b73ab854f7ddeb86b6c48082e92c3eee669190a25050565b600054610100900460ff168061283c575061283c6126e7565b8061284a575060005460ff16155b6128855760405162461bcd60e51b815260040180806020018281038252602e815260200180613e8b602e913960400191505060405180910390fd5b600054610100900460ff161580156128b0576000805460ff1961ff0019909116610100171660011790555b6128b8613414565b6128c06134b4565b801561173b576000805461ff001916905550565b600054610100900460ff16806128ed57506128ed6126e7565b806128fb575060005460ff16155b6129365760405162461bcd60e51b815260040180806020018281038252602e815260200180613e8b602e913960400191505060405180910390fd5b600054610100900460ff16158015612961576000805460ff1961ff0019909116610100171660011790555b6128c06135ad565b609c8190556040805182815290517f3ff20538222f568f27ff436c0c49dfd3e48d5b8f86533a3f759dc1c7089775ab9181900360200190a150565b6000606060988054806020026020016040519081016040528092919081815260200182805480156129fe57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116129e0575b505083519394506000925050505b81811015612a5557846001600160a01b0316838281518110612a2a57fe5b60200260200101516001600160a01b03161415612a4d57600193505050506113f1565b600101612a0c565b506000949350505050565b610d838484612a7187878787612cb4565b612d89565b90565b60a0546001600160a01b031690565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ac6908490613653565b600082821115612b31576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6099546001600160a01b031615612bcb57609954604080516304d7f3db60e41b81526001600160a01b038781166004830152602482018790528581166044830152848116606483015291519190921691634d7f3db091608480830192600092919082900301818387803b158015612bb257600080fd5b505af1158015612bc6573d6000803e3d6000fd5b505050505b816001600160a01b0316635d7b075885856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561196c57600080fd5b6001600160a01b0382166000908152609e60205260408120546126cb908390612c559082906001600160801b03166131d8565b613704565b6001600160a01b0383166000908152609e60205260408120548190612c90908590600160801b90046001600160801b03166131d8565b905080612ca15760009150506126cb565b612cab8382613729565b95945050505050565b6001600160a01b038381166000908152609f6020908152604080832093881683529290529081208054829190600160e01b900460ff16612cf75760009150612d39565b6000612d04888888613790565b8254909150612d359088908890612d30908990612d2a906001600160c01b0316876133b4565b906133b4565b612d43565b9250505b5095945050505050565b6001600160a01b0383166000908152609e60205260408120548190612d729085906001600160801b03166131d8565b905080831115612d80578092505b50909392505050565b6001600160a01b038083166000908152609f602090815260408083209387168352929052819020548151606081019092526001600160c01b03169080612dce84613841565b6001600160801b03168152602001612dec612de7613889565b61388d565b63ffffffff908116825260016020928301526001600160a01b038681166000908152609f84526040808220928a168252918452819020845181549486015195909201516001600160c01b03199094166001600160c01b039092169190911763ffffffff60c01b1916600160c01b94909216939093021760ff60e01b1916600160e01b9115159190910217905581811015612ecf576001600160a01b038084169085167f2f92d56910619b38bc29fd8e4ca5e56359edac7a0c086cdcd305fb603fa37491612eb98585612ada565b60408051918252519081900360200190a3610d83565b80821015610d83576001600160a01b038084169085167ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf612f108486612ada565b60408051918252519081900360200190a350505050565b6000806000846001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612f7957600080fd5b505afa158015612f8d573d6000803e3d6000fd5b505050506040513d6020811015612fa357600080fd5b5051905083811015612ff5576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f696e737566662d66756e647360501b604482015290519081900360640190fd5b6130028686836000612a60565b6000613017866130128488612ada565b612c22565b6001600160a01b038088166000908152609f60209081526040808320938c16835292905290812054919250906001600160c01b0316821161308e576001600160a01b038088166000908152609f60209081526040808320938c168352929052205461308b906001600160c01b031683612ada565b90505b600061309a8888612c22565b90508082116130a957816130ab565b805b94506130b78186612ada565b955050505050935093915050565b6001600160a01b038116613120576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f7072697a6553747261746567792d6e6f742d7a65726f604482015290519081900360640190fd5b61313d6001600160a01b038216600162a1cb1960e01b03196138d1565b61318e576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f7072697a6553747261746567792d696e76616c696400604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0383169081179091556040517f7f58dc86bc2e435cb77ca0edb1df55e25f90caf2d6bd866971715437d456a21290600090a250565b6000806131e583856138ed565b90506116c881670de0b6b3a7640000613946565b6001600160a01b038083166000908152609f602090815260408083209387168352929052205461323b90613236906001600160c01b031683612ada565b613841565b6001600160a01b038084166000818152609f602090815260408083209489168084529482529182902080546001600160c01b0319166001600160801b0396909616959095179094558051858152905191937ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf92918290030190a3505050565b60a054604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561330557600080fd5b505afa158015613319573d6000803e3d6000fd5b505050506040513d602081101561332f57600080fd5b5051905090565b60008061334161253b565b609c5490915061335182856133b4565b11159392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610d83908590613653565b6000828201838110156126cb576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3b151590565b600054610100900460ff168061342d575061342d6126e7565b8061343b575060005460ff16155b6134765760405162461bcd60e51b815260040180806020018281038252602e815260200180613e8b602e913960400191505060405180910390fd5b600054610100900460ff161580156128c0576000805460ff1961ff001990911661010017166001179055801561173b576000805461ff001916905550565b600054610100900460ff16806134cd57506134cd6126e7565b806134db575060005460ff16155b6135165760405162461bcd60e51b815260040180806020018281038252602e815260200180613e8b602e913960400191505060405180910390fd5b600054610100900460ff16158015613541576000805460ff1961ff0019909116610100171660011790555b600061354b612646565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561173b576000805461ff001916905550565b600054610100900460ff16806135c657506135c66126e7565b806135d4575060005460ff16155b61360f5760405162461bcd60e51b815260040180806020018281038252602e815260200180613e8b602e913960400191505060405180910390fd5b600054610100900460ff1615801561363a576000805460ff1961ff0019909116610100171660011790555b6001606555801561173b576000805461ff001916905550565b60606136a8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139889092919063ffffffff16565b805190915015610ac6578080602001905160208110156136c757600080fd5b5051610ac65760405162461bcd60e51b815260040180806020018281038252602a815260200180613f67602a913960400191505060405180910390fd5b60008061371384609a546131d8565b905080831115613721578092505b509092915050565b600080821161377f576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161378857fe5b049392505050565b6001600160a01b038281166000908152609f60209081526040808320938716835292905290812054600160c01b810463ffffffff1690600160e01b900460ff166137de5760009150506126cb565b60006137f2826137ec613889565b90612ada565b6001600160a01b0386166000908152609e60205260408120549192509061382a908390600160801b90046001600160801b03166138ed565b905061383685826131d8565b979650505050505050565b6000600160801b82106138855760405162461bcd60e51b8152600401808060200182810382526027815260200180613e1c6027913960400191505060405180910390fd5b5090565b4290565b6000600160201b82106138855760405162461bcd60e51b8152600401808060200182810382526026815260200180613f416026913960400191505060405180910390fd5b60006138dc83613997565b80156126cb57506126cb83836139ca565b6000826138fc57506000612b36565b8282028284828161390957fe5b04146126cb5760405162461bcd60e51b8152600401808060200182810382526021815260200180613eb96021913960400191505060405180910390fd5b60006126cb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506139ed565b60606116c88484600085613a8f565b60006139aa826301ffc9a760e01b6139ca565b80156113ee57506139c3826001600160e01b03196139ca565b1592915050565b60008060006139d98585613be0565b91509150818015612cab5750949350505050565b60008183613a795760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613a3e578181015183820152602001613a26565b50505050905090810190601f168015613a6b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613a8557fe5b0495945050505050565b606082471015613ad05760405162461bcd60e51b8152600401808060200182810382526026815260200180613e656026913960400191505060405180910390fd5b613ad98561340e565b613b2a576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613b695780518252601f199092019160209182019101613b4a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613bcb576040519150601f19603f3d011682016040523d82523d6000602084013e613bd0565b606091505b5091509150613836828286613d14565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b1781529151815160009384939284926060926001600160a01b038a169261753092879282918083835b60208310613c685780518252601f199092019160209182019101613c49565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114613cc9576040519150601f19603f3d011682016040523d82523d6000602084013e613cce565b606091505b5091509150602081511015613cec5760008094509450505050613d0d565b81818060200190516020811015613d0257600080fd5b505190955093505050505b9250929050565b60608315613d235750816126cb565b825115613d335782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315613a3e578181015183820152602001613a26565b828054828255906000526020600020908101928215613dcf579160200282015b82811115613dcf57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613d9a565b506138859291505b808211156138855780546001600160a01b0319168155600101613dd756fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e2031323820626974735072697a65506f6f6c2f7265736572766552656769737472792d6e6f742d7a65726f416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725072697a65506f6f6c2f657869742d6665652d657863656564732d757365722d6d6178696d756d5072697a65506f6f6c2f756e6b6e6f776e2d746f6b656e00000000000000000053616665436173743a2076616c756520646f65736e27742066697420696e20333220626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645374616b655072697a65506f6f6c2f7374616b652d746f6b656e2d6e6f742d7a65726f2d616464726573735072697a65506f6f6c2f6f6e6c792d7072697a65537472617465677900000000a264697066735822122010013c2db674dbeefb51bd0738605b9e7e65256da75fa287bb6d12238276cd4964736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x1D SWAP1 PUSH2 0x5F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x39 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x6C JUMP JUMPDEST PUSH2 0x4031 DUP1 PUSH2 0x3B2 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH2 0x337 DUP1 PUSH2 0x7B PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x22EC095 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x6A JUMPI DUP1 PUSH4 0xEFC81A8C EQ PUSH2 0x120 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x128 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x137 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x4E PUSH2 0x2B3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x265 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x26A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2DE PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE DUP3 DUP2 MSTORE PUSH2 0x2D8 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x137 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 RETURNDATACOPY CREATE SHL 0xD8 0xDA PUSH21 0xB6DDF5A24C4A3F0162AEA619611E7E8FAB758D6B81 0xFB DUP13 0xDD RETURN NUMBER PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4011 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x227 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x888C2B6F GT PUSH2 0x130 JUMPI DUP1 PUSH4 0xA7B2CC31 GT PUSH2 0xB8 JUMPI DUP1 PUSH4 0xE6D8A94B GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xE6D8A94B EQ PUSH2 0x943 JUMPI DUP1 PUSH4 0xEDB4E1CF EQ PUSH2 0x94B JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x953 JUMPI DUP1 PUSH4 0xFC0C546A EQ PUSH2 0x979 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x981 JUMPI PUSH2 0x227 JUMP JUMPDEST DUP1 PUSH4 0xA7B2CC31 EQ PUSH2 0x7AE JUMPI DUP1 PUSH4 0xB69EF8A8 EQ PUSH2 0x7EB JUMPI DUP1 PUSH4 0xC5871485 EQ PUSH2 0x7F3 JUMPI DUP1 PUSH4 0xD4A1361D EQ PUSH2 0x8B2 JUMPI DUP1 PUSH4 0xE323F825 EQ PUSH2 0x907 JUMPI PUSH2 0x227 JUMP JUMPDEST DUP1 PUSH4 0x98BF3EB6 GT PUSH2 0xFF JUMPI DUP1 PUSH4 0x98BF3EB6 EQ PUSH2 0x6EF JUMPI DUP1 PUSH4 0x9D63848A EQ PUSH2 0x6F7 JUMPI DUP1 PUSH4 0x9E167519 EQ PUSH2 0x74F JUMPI DUP1 PUSH4 0x9FE32A91 EQ PUSH2 0x757 JUMPI DUP1 PUSH4 0xA016240B EQ PUSH2 0x774 JUMPI PUSH2 0x227 JUMP JUMPDEST DUP1 PUSH4 0x888C2B6F EQ PUSH2 0x64E JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x69D JUMPI DUP1 PUSH4 0x8E71C1F6 EQ PUSH2 0x6C1 JUMPI DUP1 PUSH4 0x91CA480E EQ PUSH2 0x6C9 JUMPI PUSH2 0x227 JUMP JUMPDEST DUP1 PUSH4 0x630665B4 GT PUSH2 0x1B3 JUMPI DUP1 PUSH4 0x76687D3D GT PUSH2 0x182 JUMPI DUP1 PUSH4 0x76687D3D EQ PUSH2 0x59B JUMPI DUP1 PUSH4 0x78B3D327 EQ PUSH2 0x5A3 JUMPI DUP1 PUSH4 0x79CB8563 EQ PUSH2 0x5C9 JUMPI DUP1 PUSH4 0x7B99ADB1 EQ PUSH2 0x5FB JUMPI DUP1 PUSH4 0x7CBAB1C7 EQ PUSH2 0x618 JUMPI PUSH2 0x227 JUMP JUMPDEST DUP1 PUSH4 0x630665B4 EQ PUSH2 0x51B JUMPI DUP1 PUSH4 0x6A3FD4F9 EQ PUSH2 0x523 JUMPI DUP1 PUSH4 0x6B1B863A EQ PUSH2 0x55D JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x593 JUMPI PUSH2 0x227 JUMP JUMPDEST DUP1 PUSH4 0x2B0AB144 GT PUSH2 0x1FA JUMPI DUP1 PUSH4 0x2B0AB144 EQ PUSH2 0x3B0 JUMPI DUP1 PUSH4 0x2F7627E3 EQ PUSH2 0x3E6 JUMPI DUP1 PUSH4 0x3EDE50C6 EQ PUSH2 0x414 JUMPI DUP1 PUSH4 0x494DE9F7 EQ PUSH2 0x4C7 JUMPI DUP1 PUSH4 0x52A387AB EQ PUSH2 0x4F5 JUMPI PUSH2 0x227 JUMP JUMPDEST DUP1 PUSH4 0x937EB54 EQ PUSH2 0x22C JUMPI DUP1 PUSH4 0x13F55E39 EQ PUSH2 0x246 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x27E JUMPI DUP1 PUSH4 0x16960D55 EQ PUSH2 0x329 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x234 PUSH2 0x9FE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x25C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xA0D JUMP JUMPDEST STOP JUMPDEST PUSH2 0x30C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x294 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x2CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x2E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x301 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xACB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x33F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x384 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x3A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xADC JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x3C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xD89 JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xE46 JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x42A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x454 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x466 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x487 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0xF95 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x234 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x4DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x1187 JUMP JUMPDEST PUSH2 0x234 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x50B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x128E JUMP JUMPDEST PUSH2 0x234 PUSH2 0x13DD JUMP JUMPDEST PUSH2 0x549 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x539 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x13E3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x573 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 SWAP1 SWAP2 ADD CALLDATALOAD AND PUSH2 0x13F6 JUMP JUMPDEST PUSH2 0x27C PUSH2 0x15FE JUMP JUMPDEST PUSH2 0x234 PUSH2 0x16AA JUMP JUMPDEST PUSH2 0x549 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16B0 JUMP JUMPDEST PUSH2 0x234 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x5DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x16BB JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x611 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x16D0 JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x62E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x173E JUMP JUMPDEST PUSH2 0x684 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x664 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x198A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB ADD SWAP1 RETURN JUMPDEST PUSH2 0x6A5 PUSH2 0x19A4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x6A5 PUSH2 0x19B3 JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x19C2 JUMP JUMPDEST PUSH2 0x6A5 PUSH2 0x1A2D JUMP JUMPDEST PUSH2 0x6FF PUSH2 0x1A3C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x73B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x723 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x234 PUSH2 0x1A9E JUMP JUMPDEST PUSH2 0x234 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x76D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1AA4 JUMP JUMPDEST PUSH2 0x234 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x78A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x1BD2 JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x7C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x40 ADD CALLDATALOAD AND PUSH2 0x1E09 JUMP JUMPDEST PUSH2 0x234 PUSH2 0x1F5F JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x809 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x833 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x845 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x866 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1F69 JUMP JUMPDEST PUSH2 0x8D8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x8C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x20AC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x91D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x20DC JUMP JUMPDEST PUSH2 0x234 PUSH2 0x2291 JUMP JUMPDEST PUSH2 0x234 PUSH2 0x2407 JUMP JUMPDEST PUSH2 0x27C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x969 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x240D JUMP JUMPDEST PUSH2 0x6A5 PUSH2 0x2510 JUMP JUMPDEST PUSH2 0x989 PUSH2 0x251A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x9C3 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x9AB JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x9F0 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xA08 PUSH2 0x253B JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xA21 PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xA6A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FBC DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xA75 DUP4 DUP4 DUP4 PUSH2 0x264A JUMP JUMPDEST ISZERO PUSH2 0xAC6 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB0BAC59718CD343C80A813518AFCF36846CFCFE6D56E2B3CAB9BD49F5F9B251C DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0xA85BD01 PUSH1 0xE1 SHL SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xAF0 PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xB39 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FBC DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xB42 DUP4 PUSH2 0x26D2 JUMP JUMPDEST PUSH2 0xB93 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0xB9D JUMPI PUSH2 0xD83 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xD0A JUMPI DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x42842E0E ADDRESS DUP8 DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0xBC5 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC22 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0xC33 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xD02 JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0xC61 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xC66 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH32 0x17E975018310F88872B58D4D8263ADCA83CF5C1893496EA2A86923DAB15276AD DUP2 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xCC6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xCAE JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xCF3 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xBA0 JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x69C2DE32BC4D47F488E72626A6CFDEE85089342E52675E7DE79C4B417623960C DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP6 POP SWAP1 SWAP4 POP POP POP POP LOG3 JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xD9D PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xDE6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FBC DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xDF1 DUP4 DUP4 DUP4 PUSH2 0x264A JUMP JUMPDEST ISZERO PUSH2 0xAC6 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC65F48ACA3B7A99B7443D04B8FFBB073156179BC628DC3F7DEF5047748973469 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH2 0xE4E PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE5F PUSH2 0x19A4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xEA8 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3EDA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xEF7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xF0B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xF21 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD GT ISZERO PUSH2 0xF91 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5C19A95C DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF78 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF8C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0xFAE JUMPI POP PUSH2 0xFAE PUSH2 0x26E7 JUMP JUMPDEST DUP1 PUSH2 0xFBC JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0xFF7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1022 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x1067 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E43 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 MLOAD DUP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x1080 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x10AA JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP1 MLOAD PUSH2 0x10BF SWAP2 PUSH1 0x98 SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x3D7A JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x10F6 JUMPI PUSH1 0x0 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x10D9 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0x10ED DUP2 DUP4 PUSH2 0x26F8 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x10C3 JUMP JUMPDEST POP PUSH2 0x10FF PUSH2 0x2823 JUMP JUMPDEST PUSH2 0x1107 PUSH2 0x28D4 JUMP JUMPDEST PUSH2 0x1112 PUSH1 0x0 NOT PUSH2 0x2969 JUMP JUMPDEST PUSH1 0x97 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x9A DUP5 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP6 SWAP1 MSTORE DUP1 MLOAD PUSH32 0x25FF68DD81B34665B5BA7E553EE5511BF6812E12ADB4A7E2C0D9E26B3099CE79 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 POP DUP1 ISZERO PUSH2 0xD83 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x1193 DUP2 PUSH2 0x29A4 JUMP JUMPDEST PUSH2 0x11D2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F21 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1257 DUP5 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1224 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1238 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x124E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 PUSH2 0x2A60 JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP4 AND DUP3 MSTORE SWAP3 SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x12F3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1309 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ PUSH2 0x1363 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F6F6E6C792D72657365727665 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9B DUP1 SLOAD PUSH1 0x0 SWAP2 DUP3 SWAP1 SSTORE SWAP1 PUSH2 0x1377 DUP3 PUSH2 0x2A76 JUMP JUMPDEST SWAP1 POP PUSH2 0x1396 DUP6 DUP3 PUSH2 0x1386 PUSH2 0x2A79 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x2A88 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP2 PUSH32 0x1C71C8E11FD443227C8F8D3DC1A237A3A5E8310B540C7FBCF5169754AEDF42C9 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x9D SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x13EE DUP3 PUSH2 0x26D2 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x140A PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1453 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FBC DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x145D DUP2 PUSH2 0x29A4 JUMP JUMPDEST PUSH2 0x149C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F21 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 PUSH2 0x14A6 JUMPI PUSH2 0xD83 JUMP JUMPDEST PUSH1 0x9D SLOAD DUP4 GT ISZERO PUSH2 0x14FD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F61776172642D657863656564732D617661696C000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x150A SWAP1 DUP5 PUSH2 0x2ADA JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH2 0x151A DUP5 DUP5 DUP5 PUSH1 0x0 PUSH2 0x2B3C JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1526 DUP4 DUP6 PUSH2 0x2C22 JUMP JUMPDEST SWAP1 POP PUSH2 0x15AC DUP6 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x157A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x158E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x15A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP5 PUSH2 0x2A60 JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xE2554529D99AB7A67DB6B4CEA2B32C7D55AE325F958861E05F304FDDED867E31 DUP7 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1606 PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1617 PUSH2 0x19A4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1660 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3EDA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x13EE DUP3 PUSH2 0x29A4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x16C8 DUP5 DUP5 DUP5 PUSH2 0x2C5A JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x16D8 PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16E9 PUSH2 0x19A4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1732 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3EDA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x173B DUP2 PUSH2 0x2969 JUMP JUMPDEST POP JUMP JUMPDEST CALLER PUSH2 0x1748 DUP2 PUSH2 0x29A4 JUMP JUMPDEST PUSH2 0x1787 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F21 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO PUSH2 0x1861 JUMPI PUSH1 0x0 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP7 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x17E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x17F9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x180F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x1821 DUP7 CALLER DUP5 DUP5 PUSH2 0x2CB4 JUMP JUMPDEST SWAP1 POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1853 JUMPI PUSH2 0x1850 CALLER PUSH2 0x184A DUP5 DUP8 PUSH2 0x2ADA JUMP JUMPDEST DUP4 PUSH2 0x2D43 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x185E DUP7 CALLER DUP4 PUSH2 0x2D89 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x188B JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x18E2 JUMPI PUSH2 0x18E2 DUP4 CALLER CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1224 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1904 JUMPI POP PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xD83 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP7 SWAP1 MSTORE CALLER PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xB2210957 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x196C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1980 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1998 DUP6 DUP6 DUP6 PUSH2 0x2F27 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x97 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x19CA PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x19DB PUSH2 0x19A4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1A24 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3EDA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x173B DUP2 PUSH2 0x30C5 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1A94 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1A76 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1AF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B09 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1B1F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1B3B JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x13F1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x10DFA58 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1B8A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B9E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1BB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x1BC8 JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x13F1 JUMP JUMPDEST PUSH2 0x16C8 DUP5 DUP3 PUSH2 0x31D8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x1C2C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP3 PUSH2 0x1C3B DUP2 PUSH2 0x29A4 JUMP JUMPDEST PUSH2 0x1C7A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F21 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1C88 DUP9 DUP8 DUP10 PUSH2 0x2F27 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0x1CCB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3EFA PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1CD6 DUP9 DUP8 DUP4 PUSH2 0x31F9 JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x631B5DFB PUSH2 0x1CED PUSH2 0x2646 JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1D45 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D59 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 PUSH2 0x1D72 DUP4 DUP10 PUSH2 0x2ADA SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1D7F DUP3 PUSH2 0x2A76 JUMP JUMPDEST SWAP1 POP PUSH2 0x1D8E DUP11 DUP3 PUSH2 0x1386 PUSH2 0x2A79 JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1DAA PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP14 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE DUP1 DUP3 ADD DUP10 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x271704A58FD2953E49B87D67A0A3CE28A58147DE98A5457F60B4686F6385030 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH2 0x1E13 DUP2 PUSH2 0x29A4 JUMP JUMPDEST PUSH2 0x1E52 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F21 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1E5A PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E6B PUSH2 0x19A4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1EB4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3EDA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP6 AND DUP1 DUP4 MSTORE DUP7 DUP3 AND PUSH1 0x20 DUP1 DUP6 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9E DUP5 MSTORE DUP9 SWAP1 KECCAK256 SWAP7 MLOAD DUP8 SLOAD SWAP3 MLOAD DUP8 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP1 DUP8 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP6 AND OR SWAP1 SWAP5 SSTORE DUP5 MLOAD SWAP3 DUP4 MSTORE SWAP3 DUP3 ADD MSTORE DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 MLOAD PUSH32 0xFB0BA2CF86A2B03BCF387753A2192DA80A006AFA99DD022BB301C78E323BF1B9 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA08 PUSH2 0x32BA JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1F82 JUMPI POP PUSH2 0x1F82 PUSH2 0x26E7 JUMP JUMPDEST DUP1 PUSH2 0x1F90 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1FCB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1FF6 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2001 DUP6 DUP6 DUP6 PUSH2 0xF95 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x2046 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F91 PUSH1 0x2B SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xA0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 AND SWAP1 PUSH32 0xA81053747B04E643171034E5426F6DEEBB058FC29DFE032E33345A109224B31B SWAP1 PUSH1 0x0 SWAP1 LOG2 DUP1 ISZERO PUSH2 0x20A5 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP3 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND SWAP1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x2134 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP2 PUSH2 0x2143 DUP2 PUSH2 0x29A4 JUMP JUMPDEST PUSH2 0x2182 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F21 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP4 PUSH2 0x218C DUP2 PUSH2 0x3336 JUMP JUMPDEST PUSH2 0x21DD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F657863656564732D6C69717569646974792D63617000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x21E7 PUSH2 0x2646 JUMP JUMPDEST SWAP1 POP PUSH2 0x21F5 DUP8 DUP8 DUP8 DUP8 PUSH2 0x2B3C JUMP JUMPDEST PUSH2 0x2214 DUP2 ADDRESS DUP9 PUSH2 0x2203 PUSH2 0x2A79 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 SWAP1 PUSH2 0x335A JUMP JUMPDEST PUSH2 0x221D DUP7 PUSH2 0x173B JUMP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6CE569498E0F86F147466AC49211CB2A1FFE06195ADB805E383B3F2365109160 DUP10 DUP9 PUSH1 0x40 MLOAD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x22EB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE PUSH1 0x0 PUSH2 0x22FA PUSH2 0x253B JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2306 PUSH2 0x32BA JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 DUP3 GT PUSH2 0x2318 JUMPI PUSH1 0x0 PUSH2 0x2322 JUMP JUMPDEST PUSH2 0x2322 DUP3 DUP5 PUSH2 0x2ADA JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x9D SLOAD DUP3 GT PUSH2 0x2336 JUMPI PUSH1 0x0 PUSH2 0x2344 JUMP JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x2344 SWAP1 DUP4 SWAP1 PUSH2 0x2ADA JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x23F6 JUMPI PUSH1 0x0 PUSH2 0x2357 DUP3 PUSH2 0x1AA4 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x23B1 JUMPI PUSH1 0x9B SLOAD PUSH2 0x236C SWAP1 DUP3 PUSH2 0x33B4 JUMP JUMPDEST PUSH1 0x9B SSTORE PUSH2 0x2379 DUP3 DUP3 PUSH2 0x2ADA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 POP PUSH32 0x5F1703CCFA2730D4245350F228079926A37F26A44ECF6978A7EEAFFF0AF11407 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x23BE SWAP1 DUP4 PUSH2 0x33B4 JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xCE2B6E507C7CA1A20CE136810F524EEFC19BA4C7E4866EB6CC0CBA76E778D4BE SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH1 0x9D SLOAD SWAP5 POP POP POP POP POP PUSH1 0x1 PUSH1 0x65 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x9B SLOAD DUP2 JUMP JUMPDEST PUSH2 0x2415 PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2426 PUSH2 0x19A4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x246F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3EDA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x24B4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3DF6 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA08 PUSH2 0x2A79 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x9B SLOAD SWAP1 POP PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x259B JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x257D JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x263D JUMPI PUSH2 0x2633 DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x25C0 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2600 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2614 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x262A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP6 SWAP1 PUSH2 0x33B4 JUMP JUMPDEST SWAP4 POP PUSH1 0x1 ADD PUSH2 0x25A9 JUMP JUMPDEST POP SWAP2 SWAP3 POP POP POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2655 DUP4 PUSH2 0x26D2 JUMP JUMPDEST PUSH2 0x26A6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x26B3 JUMPI POP PUSH1 0x0 PUSH2 0x26CB JUMP JUMPDEST PUSH2 0x26C7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP6 DUP5 PUSH2 0x2A88 JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND SWAP2 AND EQ ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x26F2 ADDRESS PUSH2 0x340E JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF77C4791 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x273B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x274F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2765 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x27C2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F746F6B656E2D6374726C722D6D69736D617463680000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x98 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x27D0 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 DUP5 AND SWAP2 PUSH32 0x460E712B4A5D801D031ED673DEA209B73AB854F7DDEB86B6C48082E92C3EEE66 SWAP2 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x283C JUMPI POP PUSH2 0x283C PUSH2 0x26E7 JUMP JUMPDEST DUP1 PUSH2 0x284A JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2885 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x28B0 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x28B8 PUSH2 0x3414 JUMP JUMPDEST PUSH2 0x28C0 PUSH2 0x34B4 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x173B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x28ED JUMPI POP PUSH2 0x28ED PUSH2 0x26E7 JUMP JUMPDEST DUP1 PUSH2 0x28FB JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2936 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2961 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x28C0 PUSH2 0x35AD JUMP JUMPDEST PUSH1 0x9C DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3FF20538222F568F27FF436C0C49DFD3E48D5B8F86533A3F759DC1C7089775AB SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x29FE JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x29E0 JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2A55 JUMPI DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2A2A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x2A4D JUMPI PUSH1 0x1 SWAP4 POP POP POP POP PUSH2 0x13F1 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2A0C JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xD83 DUP5 DUP5 PUSH2 0x2A71 DUP8 DUP8 DUP8 DUP8 PUSH2 0x2CB4 JUMP JUMPDEST PUSH2 0x2D89 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xAC6 SWAP1 DUP5 SWAP1 PUSH2 0x3653 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2B31 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2BCB JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE DUP6 DUP2 AND PUSH1 0x44 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x4D7F3DB0 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2BB2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2BC6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5D7B0758 DUP6 DUP6 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x196C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x26CB SWAP1 DUP4 SWAP1 PUSH2 0x2C55 SWAP1 DUP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x31D8 JUMP JUMPDEST PUSH2 0x3704 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2C90 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x31D8 JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x2CA1 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x26CB JUMP JUMPDEST PUSH2 0x2CAB DUP4 DUP3 PUSH2 0x3729 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP3 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x2CF7 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x2D39 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2D04 DUP9 DUP9 DUP9 PUSH2 0x3790 JUMP JUMPDEST DUP3 SLOAD SWAP1 SWAP2 POP PUSH2 0x2D35 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x2D30 SWAP1 DUP10 SWAP1 PUSH2 0x2D2A SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP8 PUSH2 0x33B4 JUMP JUMPDEST SWAP1 PUSH2 0x33B4 JUMP JUMPDEST PUSH2 0x2D43 JUMP JUMPDEST SWAP3 POP POP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2D72 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x31D8 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x2D80 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE DUP2 SWAP1 KECCAK256 SLOAD DUP2 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 DUP1 PUSH2 0x2DCE DUP5 PUSH2 0x3841 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2DEC PUSH2 0x2DE7 PUSH2 0x3889 JUMP JUMPDEST PUSH2 0x388D JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP3 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 DUP11 AND DUP3 MSTORE SWAP2 DUP5 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP5 DUP7 ADD MLOAD SWAP6 SWAP1 SWAP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH4 0xFFFFFFFF PUSH1 0xC0 SHL NOT AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP5 SWAP1 SWAP3 AND SWAP4 SWAP1 SWAP4 MUL OR PUSH1 0xFF PUSH1 0xE0 SHL NOT AND PUSH1 0x1 PUSH1 0xE0 SHL SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE DUP2 DUP2 LT ISZERO PUSH2 0x2ECF JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0x2F92D56910619B38BC29FD8E4CA5E56359EDAC7A0C086CDCD305FB603FA37491 PUSH2 0x2EB9 DUP6 DUP6 PUSH2 0x2ADA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 PUSH2 0xD83 JUMP JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0xD83 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF PUSH2 0x2F10 DUP5 DUP7 PUSH2 0x2ADA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2F79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2F8D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2FA3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x2FF5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F696E737566662D66756E6473 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x3002 DUP7 DUP7 DUP4 PUSH1 0x0 PUSH2 0x2A60 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3017 DUP7 PUSH2 0x3012 DUP5 DUP9 PUSH2 0x2ADA JUMP JUMPDEST PUSH2 0x2C22 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP3 GT PUSH2 0x308E JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x308B SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2ADA JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x309A DUP9 DUP9 PUSH2 0x2C22 JUMP JUMPDEST SWAP1 POP DUP1 DUP3 GT PUSH2 0x30A9 JUMPI DUP2 PUSH2 0x30AB JUMP JUMPDEST DUP1 JUMPDEST SWAP5 POP PUSH2 0x30B7 DUP2 DUP7 PUSH2 0x2ADA JUMP JUMPDEST SWAP6 POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x3120 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D6E6F742D7A65726F PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x313D PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x38D1 JUMP JUMPDEST PUSH2 0x318E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D696E76616C696400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x99 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x7F58DC86BC2E435CB77CA0EDB1DF55E25F90CAF2D6BD866971715437D456A212 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x31E5 DUP4 DUP6 PUSH2 0x38ED JUMP JUMPDEST SWAP1 POP PUSH2 0x16C8 DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x3946 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x323B SWAP1 PUSH2 0x3236 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2ADA JUMP JUMPDEST PUSH2 0x3841 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3305 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3319 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x332F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3341 PUSH2 0x253B JUMP JUMPDEST PUSH1 0x9C SLOAD SWAP1 SWAP2 POP PUSH2 0x3351 DUP3 DUP6 PUSH2 0x33B4 JUMP JUMPDEST GT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x24 DUP4 ADD MSTORE DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x84 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xD83 SWAP1 DUP6 SWAP1 PUSH2 0x3653 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x26CB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x342D JUMPI POP PUSH2 0x342D PUSH2 0x26E7 JUMP JUMPDEST DUP1 PUSH2 0x343B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3476 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x28C0 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x173B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x34CD JUMPI POP PUSH2 0x34CD PUSH2 0x26E7 JUMP JUMPDEST DUP1 PUSH2 0x34DB JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3516 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3541 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x354B PUSH2 0x2646 JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x173B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x35C6 JUMPI POP PUSH2 0x35C6 PUSH2 0x26E7 JUMP JUMPDEST DUP1 PUSH2 0x35D4 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x360F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x363A JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x65 SSTORE DUP1 ISZERO PUSH2 0x173B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x36A8 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3988 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xAC6 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x36C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xAC6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F67 PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3713 DUP5 PUSH1 0x9A SLOAD PUSH2 0x31D8 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x3721 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x377F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x3788 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xC0 SHL DUP2 DIV PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x37DE JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x26CB JUMP JUMPDEST PUSH1 0x0 PUSH2 0x37F2 DUP3 PUSH2 0x37EC PUSH2 0x3889 JUMP JUMPDEST SWAP1 PUSH2 0x2ADA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x382A SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x38ED JUMP JUMPDEST SWAP1 POP PUSH2 0x3836 DUP6 DUP3 PUSH2 0x31D8 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x3885 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E1C PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST TIMESTAMP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x20 SHL DUP3 LT PUSH2 0x3885 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F41 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x38DC DUP4 PUSH2 0x3997 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x26CB JUMPI POP PUSH2 0x26CB DUP4 DUP4 PUSH2 0x39CA JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x38FC JUMPI POP PUSH1 0x0 PUSH2 0x2B36 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x3909 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x26CB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3EB9 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x26CB DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x39ED JUMP JUMPDEST PUSH1 0x60 PUSH2 0x16C8 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x3A8F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x39AA DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x39CA JUMP JUMPDEST DUP1 ISZERO PUSH2 0x13EE JUMPI POP PUSH2 0x39C3 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x39CA JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x39D9 DUP6 DUP6 PUSH2 0x3BE0 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x2CAB JUMPI POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x3A79 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3A3E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3A26 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3A6B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x3A85 JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x3AD0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E65 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3AD9 DUP6 PUSH2 0x340E JUMP JUMPDEST PUSH2 0x3B2A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3B69 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3B4A JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3BCB JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3BD0 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x3836 DUP3 DUP3 DUP7 PUSH2 0x3D14 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x24 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP3 DUP5 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND SWAP3 PUSH2 0x7530 SWAP3 DUP8 SWAP3 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3C68 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3C49 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3CC9 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3CCE JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x3CEC JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x3D0D JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3D02 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x3D23 JUMPI POP DUP2 PUSH2 0x26CB JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x3D33 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x3A3E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3A26 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x3DCF JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x3DCF JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x3D9A JUMP JUMPDEST POP PUSH2 0x3885 SWAP3 SWAP2 POP JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x3885 JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x3DD7 JUMP INVALID 0x4F PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F206164647265737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E2031323820626974735072697A65 POP PUSH16 0x6F6C2F72657365727665526567697374 PUSH19 0x792D6E6F742D7A65726F416464726573733A20 PUSH10 0x6E73756666696369656E PUSH21 0x2062616C616E636520666F722063616C6C496E6974 PUSH10 0x616C697A61626C653A20 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 MSTORE8 PUSH2 0x6665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F774F776E61626C653A20 PUSH4 0x616C6C65 PUSH19 0x206973206E6F7420746865206F776E65725072 PUSH10 0x7A65506F6F6C2F657869 PUSH21 0x2D6665652D657863656564732D757365722D6D6178 PUSH10 0x6D756D5072697A65506F PUSH16 0x6C2F756E6B6E6F776E2D746F6B656E00 STOP STOP STOP STOP STOP STOP STOP STOP MSTORE8 PUSH2 0x6665 NUMBER PUSH2 0x7374 GASPRICE KECCAK256 PUSH23 0x616C756520646F65736E27742066697420696E20333220 PUSH3 0x697473 MSTORE8 PUSH2 0x6665 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x7563636565645374616B655072697A65506F6F6C 0x2F PUSH20 0x74616B652D746F6B656E2D6E6F742D7A65726F2D PUSH2 0x6464 PUSH19 0x6573735072697A65506F6F6C2F6F6E6C792D70 PUSH19 0x697A65537472617465677900000000A2646970 PUSH7 0x73582212201001 EXTCODECOPY 0x2D 0xB6 PUSH21 0xDBEEFB51BD0738605B9E7E65256DA75FA287BB6D12 0x23 DUP3 PUSH23 0xCD4964736F6C634300060C003300000000000000000000 ",
              "sourceMap": "260:572:44:-:0;;;497:64;;;;;;;;;;536:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;525:8:44;:31;;-1:-1:-1;;;;;;525:31:44;-1:-1:-1;;;;;525:31:44;;;;;;;;;;260:572;;;;;;;;;;:::o;:::-;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106100415760003560e01c8063022ec09514610046578063b3eeb5e21461006a578063efc81a8c14610120575b600080fd5b61004e610128565b604080516001600160a01b039092168252519081900360200190f35b61004e6004803603604081101561008057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100ab57600080fd5b8201836020820111156100bd57600080fd5b803590602001918460018302840111640100000000831117156100df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610137945050505050565b61004e6102b3565b6000546001600160a01b031681565b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a18251156102ac576000826001600160a01b0316846040518082805190602001908083835b602083106102035780518252601f1990920191602091820191016101e4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610265576040519150601f19603f3d011682016040523d82523d6000602084013e61026a565b606091505b50509050806102aa5760405162461bcd60e51b81526004018080602001828103825260248152602001806102de6024913960400191505060405180910390fd5b505b5092915050565b6000805460408051602081019091528281526102d8916001600160a01b031690610137565b90509056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a26469706673582212203ef01bd8da74b6ddf5a24c4a3f0162aea619611e7e8fab758d6b81fb8cddf34364736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x22EC095 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x6A JUMPI DUP1 PUSH4 0xEFC81A8C EQ PUSH2 0x120 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x128 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x137 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x4E PUSH2 0x2B3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x265 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x26A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2DE PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE DUP3 DUP2 MSTORE PUSH2 0x2D8 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x137 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 RETURNDATACOPY CREATE SHL 0xD8 0xDA PUSH21 0xB6DDF5A24C4A3F0162AEA619611E7E8FAB758D6B81 0xFB DUP13 0xDD RETURN NUMBER PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "260:572:44:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;383:30;;;:::i;:::-;;;;-1:-1:-1;;;;;383:30:44;;;;;;;;;;;;;;182:778:38;;;;;;;;;;;;;;;;-1:-1:-1;;;;;182:778:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;182:778:38;;-1:-1:-1;182:778:38;;-1:-1:-1;;;;;182:778:38:i;708:122:44:-;;;:::i;383:30::-;;;-1:-1:-1;;;;;383:30:44;;:::o;182:778:38:-;257:13;416:19;446:6;438:15;;416:37;;495:4;489:11;-1:-1:-1;;;514:5:38;507:81;620:11;613:4;606:5;602:16;595:37;-1:-1:-1;;;657:4:38;650:5;646:16;639:92;764:4;757:5;754:1;747:22;786:28;;;-1:-1:-1;;;;;786:28:38;;;;;;738:31;;-1:-1:-1;786:28:38;;-1:-1:-1;786:28:38;;;;;;;824:12;;:16;821:135;;851:12;868:5;-1:-1:-1;;;;;868:10:38;879:5;868:17;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;868:17:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;850:35;;;901:7;893:56;;;;-1:-1:-1;;;893:56:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;821:135;;182:778;;;;;:::o;708:122:44:-;744:14;810:8;;788:36;;;;;;;;;;;;;;-1:-1:-1;;;;;810:8:44;;788:13;:36::i;:::-;766:59;;708:122;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "164600",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "create()": "infinite",
                "deployMinimal(address,bytes)": "infinite",
                "instance()": "1015"
              }
            },
            "methodIdentifiers": {
              "create()": "efc81a8c",
              "deployMinimal(address,bytes)": "b3eeb5e2",
              "instance()": "022ec095"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"name\":\"ProxyCreated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract StakePrizePool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"deployMinimal\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"instance\",\"outputs\":[{\"internalType\":\"contract StakePrizePool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"create()\":{\"returns\":{\"_0\":\"A reference to the new proxied Stake Prize Pool\"}}},\"title\":\"Stake Prize Pool Proxy Factory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":\"Initializes the Factory with an instance of the Stake Prize Pool\",\"create()\":{\"notice\":\"Creates a new Stake Prize Pool as a proxy of the template instance\"},\"instance()\":{\"notice\":\"Contract template for deploying proxied Prize Pools\"}},\"notice\":\"Minimal proxy pattern for creating new Stake Prize Pools\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/prize-pool/stake/StakePrizePoolProxyFactory.sol\":\"StakePrizePoolProxyFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"},\"contracts/external/openzeppelin/ProxyFactory.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\n// solium-disable security/no-inline-assembly\\n// solium-disable security/no-low-level-calls\\ncontract ProxyFactory {\\n\\n  event ProxyCreated(address proxy);\\n\\n  function deployMinimal(address _logic, bytes memory _data) public returns (address proxy) {\\n    // Adapted from https://github.com/optionality/clone-factory/blob/32782f82dfc5a00d103a7e61a17a5dedbd1e8e9d/contracts/CloneFactory.sol\\n    bytes20 targetBytes = bytes20(_logic);\\n    assembly {\\n      let clone := mload(0x40)\\n      mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n      mstore(add(clone, 0x14), targetBytes)\\n      mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n      proxy := create(0, clone, 0x37)\\n    }\\n\\n    emit ProxyCreated(address(proxy));\\n\\n    if(_data.length > 0) {\\n      (bool success,) = proxy.call(_data);\\n      require(success, \\\"ProxyFactory/constructor-call-failed\\\");\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0xf0422303985796fdd8bdf772ac8e34331e2e63006f657989cca010fa4776d735\"},\"contracts/prize-pool/PrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../external/compound/ICompLike.sol\\\";\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../reserve/ReserveInterface.sol\\\";\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/TokenListenerLibrary.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\nimport \\\"./PrizePoolInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using SafeERC20Upgradeable for IERC721Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    address reserveRegistry,\\n    uint256 maxExitFeeMantissa\\n  );\\n\\n  /// @dev Event emitted when controlled token is added\\n  event ControlledTokenAdded(\\n    ControlledTokenInterface indexed token\\n  );\\n\\n  /// @dev Emitted when reserve is captured.\\n  event ReserveFeeCaptured(\\n    uint256 amount\\n  );\\n\\n  event AwardCaptured(\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when assets are deposited\\n  event Deposited(\\n    address indexed operator,\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount,\\n    address referrer\\n  );\\n\\n  /// @dev Event emitted when interest is awarded to a winner\\n  event Awarded(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are awarded to a winner\\n  event AwardedExternalERC20(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are transferred out\\n  event TransferredExternalERC20(\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC721s are awarded to a winner\\n  event AwardedExternalERC721(\\n    address indexed winner,\\n    address indexed token,\\n    uint256[] tokenIds\\n  );\\n\\n  /// @dev Event emitted when assets are withdrawn instantly\\n  event InstantWithdrawal(\\n    address indexed operator,\\n    address indexed from,\\n    address indexed token,\\n    uint256 amount,\\n    uint256 redeemed,\\n    uint256 exitFee\\n  );\\n\\n  event ReserveWithdrawal(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when the Liquidity Cap is set\\n  event LiquidityCapSet(\\n    uint256 liquidityCap\\n  );\\n\\n  /// @dev Event emitted when the Credit plan is set\\n  event CreditPlanSet(\\n    address token,\\n    uint128 creditLimitMantissa,\\n    uint128 creditRateMantissa\\n  );\\n\\n  /// @dev Event emitted when the Prize Strategy is set\\n  event PrizeStrategySet(\\n    address indexed prizeStrategy\\n  );\\n\\n  /// @dev Emitted when credit is minted\\n  event CreditMinted(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when credit is burned\\n  event CreditBurned(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\\n  event ErrorAwardingExternalERC721(bytes error);\\n\\n\\n  struct CreditPlan {\\n    uint128 creditLimitMantissa;\\n    uint128 creditRateMantissa;\\n  }\\n\\n  struct CreditBalance {\\n    uint192 balance;\\n    uint32 timestamp;\\n    bool initialized;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  /// @dev Reserve to which reserve fees are sent\\n  RegistryInterface public reserveRegistry;\\n\\n  /// @dev An array of all the controlled tokens\\n  ControlledTokenInterface[] internal _tokens;\\n\\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\\n  TokenListenerInterface public prizeStrategy;\\n\\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\\n  /// For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\\n  uint256 public maxExitFeeMantissa;\\n\\n  /// @dev The total funds that have been allocated to the reserve\\n  uint256 public reserveTotalSupply;\\n\\n  /// @dev The total amount of funds that the prize pool can hold.\\n  uint256 public liquidityCap;\\n\\n  /// @dev the The awardable balance\\n  uint256 internal _currentAwardBalance;\\n\\n  /// @dev Stores the credit plan for each token.\\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\\n\\n  /// @dev Stores each users balance of credit per token.\\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\\n\\n  /// @notice Initializes the Prize Pool\\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\\n  /// @param _maxExitFeeMantissa The maximum exit fee size\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_reserveRegistry) != address(0), \\\"PrizePool/reserveRegistry-not-zero\\\");\\n    uint256 controlledTokensLength = _controlledTokens.length;\\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\\n\\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\\n      _addControlledToken(controlledToken, i);\\n    }\\n    __Ownable_init();\\n    __ReentrancyGuard_init();\\n    _setLiquidityCap(uint256(-1));\\n\\n    reserveRegistry = _reserveRegistry;\\n    maxExitFeeMantissa = _maxExitFeeMantissa;\\n\\n    emit Initialized(\\n      address(_reserveRegistry),\\n      maxExitFeeMantissa\\n    );\\n  }\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external override view returns (address) {\\n    return address(_token());\\n  }\\n\\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\\n  /// @return The underlying balance of assets\\n  function balance() external returns (uint256) {\\n    return _balance();\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function canAwardExternal(address _externalToken) external view returns (bool) {\\n    return _canAwardExternal(_externalToken);\\n  }\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    canAddLiquidity(amount)\\n  {\\n    address operator = _msgSender();\\n\\n    _mint(to, amount, controlledToken, referrer);\\n\\n    _token().safeTransferFrom(operator, address(this), amount);\\n    _supply(amount);\\n\\n    emit Deposited(operator, to, controlledToken, amount, referrer);\\n  }\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    returns (uint256)\\n  {\\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n    require(exitFee <= maximumExitFee, \\\"PrizePool/exit-fee-exceeds-user-maximum\\\");\\n\\n    // burn the credit\\n    _burnCredit(from, controlledToken, burnedCredit);\\n\\n    // burn the tickets\\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\\n\\n    // redeem the tickets less the fee\\n    uint256 amountLessFee = amount.sub(exitFee);\\n    uint256 redeemed = _redeem(amountLessFee);\\n\\n    _token().safeTransfer(from, redeemed);\\n\\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\\n\\n    return exitFee;\\n  }\\n\\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\\n  /// @param exitFee The exit fee to check against the limit\\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\\n    if (exitFee > maxFee) {\\n      exitFee = maxFee;\\n    }\\n    return exitFee;\\n  }\\n\\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\\n  /// @param from The address the tokens are being transferred from (0 if minting)\\n  /// @param to The address the tokens are being transferred to (0 if burning)\\n  /// @param amount The amount of tokens being trasferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\\n    if (from != address(0)) {\\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\\n      // first accrue credit for their old balance\\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\\n\\n      if (from != to) {\\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\\n      }\\n\\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\\n    }\\n    if (to != address(0) && to != from) {\\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\\n    }\\n    // if we aren't minting\\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\\n    }\\n  }\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external override view returns (uint256) {\\n    return _currentAwardBalance;\\n  }\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n\\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\\n    uint256 currentBalance = _balance();\\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\\n\\n    if (unaccountedPrizeBalance > 0) {\\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\\n      if (reserveFee > 0) {\\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\\n        emit ReserveFeeCaptured(reserveFee);\\n      }\\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\\n\\n      emit AwardCaptured(unaccountedPrizeBalance);\\n    }\\n\\n    return _currentAwardBalance;\\n  }\\n\\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\\n\\n    uint256 amount = reserveTotalSupply;\\n    reserveTotalSupply = 0;\\n    uint256 redeemed = _redeem(amount);\\n\\n    _token().safeTransfer(address(to), redeemed);\\n\\n    emit ReserveWithdrawal(to, amount);\\n\\n    return redeemed;\\n  }\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external override\\n    onlyPrizeStrategy\\n    onlyControlledToken(controlledToken)\\n  {\\n    if (amount == 0) {\\n      return;\\n    }\\n\\n    require(amount <= _currentAwardBalance, \\\"PrizePool/award-exceeds-avail\\\");\\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\\n\\n    _mint(to, amount, controlledToken, address(0));\\n\\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\\n\\n    emit Awarded(to, controlledToken, amount);\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit TransferredExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit AwardedExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  function _transferOut(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (bool)\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (amount == 0) {\\n      return false;\\n    }\\n\\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\\n\\n    return true;\\n  }\\n\\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\\n  /// @param to The user who is receiving the tokens\\n  /// @param amount The amount of tokens they are receiving\\n  /// @param controlledToken The token that is going to be minted\\n  /// @param referrer The user who referred the minting\\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\\n    if (address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n    ControlledToken(controlledToken).controllerMint(to, amount);\\n  }\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (tokenIds.length == 0) {\\n      return;\\n    }\\n\\n    for (uint256 i = 0; i < tokenIds.length; i++) {\\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\\n\\n      }\\n      catch(bytes memory error){\\n        emit ErrorAwardingExternalERC721(error);\\n      }\\n      \\n    }\\n\\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\\n  }\\n\\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\\n  /// @param amount The prize amount\\n  /// @return The size of the reserve portion of the prize\\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    if (address(reserve) == address(0)) {\\n      return 0;\\n    }\\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\\n    if (reserveRateMantissa == 0) {\\n      return 0;\\n    }\\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\\n  }\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external override\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    )\\n  {\\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n  }\\n\\n  /// @dev Calculates the early exit fee for the given amount\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return Exit fee\\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\\n    return _limitExitFee(\\n      amount,\\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external override\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    durationSeconds =_estimateCreditAccrualTime(\\n      _controlledToken,\\n      _principal,\\n      _interest\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function _estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    internal\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    // interest = credit rate * principal * time\\n    // => time = interest / (credit rate * principal)\\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\\n    if (accruedPerSecond == 0) {\\n      return 0;\\n    }\\n    return _interest.div(accruedPerSecond);\\n  }\\n\\n  /// @notice Burns a users credit.\\n  /// @param user The user whose credit should be burned\\n  /// @param credit The amount of credit to burn\\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\\n\\n    emit CreditBurned(user, controlledToken, credit);\\n  }\\n\\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\\n  /// @param user The user for whom to accrue credit\\n  /// @param controlledToken The controlled token whose balance we are checking\\n  /// @param controlledTokenBalance The balance to use for the user\\n  /// @param extra Additional credit to be added\\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\\n    _updateCreditBalance(\\n      user,\\n      controlledToken,\\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\\n    );\\n  }\\n\\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\\n    uint256 newBalance;\\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\\n    if (!creditBalance.initialized) {\\n      newBalance = 0;\\n    } else {\\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\\n    }\\n    return newBalance;\\n  }\\n\\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\\n\\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\\n      balance: newBalance.toUint128(),\\n      timestamp: _currentTime().toUint32(),\\n      initialized: true\\n    });\\n\\n    if (oldBalance < newBalance) {\\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\\n    } \\n    else if (newBalance < oldBalance) {\\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\\n    }\\n  }\\n\\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\\n  /// @param creditBalance The new credit balance to be checked\\n  /// @return The users new credit balance.  Will not exceed the credit limit.\\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\\n      controlledTokenBalance,\\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\\n    );\\n    if (creditBalance > creditLimit) {\\n      creditBalance = creditLimit;\\n    }\\n\\n    return creditBalance;\\n  }\\n\\n  /// @notice Calculates the accrued interest for a user\\n  /// @param user The user whose credit should be calculated.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\\n  /// @return The credit that has accrued since the last credit update.\\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\\n\\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\\n      return 0;\\n    }\\n\\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\\n  }\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\\n    return _tokenCreditBalances[controlledToken][user].balance;\\n  }\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external override\\n    onlyControlledToken(_controlledToken)\\n    onlyOwner\\n  {\\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\\n      creditLimitMantissa: _creditLimitMantissa,\\n      creditRateMantissa: _creditRateMantissa\\n    });\\n\\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\\n  }\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external override\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    )\\n  {\\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\\n  }\\n\\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The token they are withdrawing\\n  /// @param amount The amount of funds they are withdrawing\\n  /// @return earlyExitFee The additional exit fee that should be charged.\\n  /// @return creditBurned The amount of credit that will be burned\\n  function _calculateEarlyExitFeeLessBurnedCredit(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (\\n      uint256 earlyExitFee,\\n      uint256 creditBurned\\n    )\\n  {\\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\\n    require(controlledTokenBalance >= amount, \\\"PrizePool/insuff-funds\\\");\\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\\n    /*\\n    The credit is used *last*.  Always charge the fees up-front.\\n\\n    How to calculate:\\n\\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\\n\\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\\n    */\\n\\n    // Determine available usable credit based on withdraw amount\\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\\n\\n    uint256 availableCredit;\\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\\n    }\\n\\n    // Determine amount of credit to burn and amount of fees required\\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\\n    earlyExitFee = totalExitFee.sub(creditBurned);\\n  }\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\\n    _setLiquidityCap(_liquidityCap);\\n  }\\n\\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\\n    liquidityCap = _liquidityCap;\\n    emit LiquidityCapSet(_liquidityCap);\\n  }\\n\\n  /// @notice Adds a new controlled token\\n  /// @param _controlledToken The controlled token to add.\\n  /// @param index The index to add the controlledToken\\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\\n    require(_controlledToken.controller() == this, \\\"PrizePool/token-ctrlr-mismatch\\\");\\n    \\n    _tokens[index] = _controlledToken;\\n    emit ControlledTokenAdded(_controlledToken);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\\n    _setPrizeStrategy(_prizeStrategy);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\\n    require(address(_prizeStrategy) != address(0), \\\"PrizePool/prizeStrategy-not-zero\\\");\\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PrizePool/prizeStrategy-invalid\\\");\\n    prizeStrategy = _prizeStrategy;\\n\\n    emit PrizeStrategySet(address(_prizeStrategy));\\n  }\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\\n    return _tokens;\\n  }\\n\\n  /// @dev Gets the current time as represented by the current block\\n  /// @return The timestamp of the current block\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external override view returns (uint256) {\\n    return _tokenTotalSupply();\\n  }\\n\\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\\n  /// @param to The address to delegate to \\n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\\n    if (compLike.balanceOf(address(this)) > 0) {\\n      compLike.delegate(to);\\n    }\\n  }\\n  \\n  /// @notice Required for ERC721 safe token transfers from smart contracts.\\n  /// @param operator The address that acts on behalf of the owner\\n  /// @param from The current owner of the NFT\\n  /// @param tokenId The NFT to transfer\\n  /// @param data Additional data with no specified format, sent in call to `_to`.\\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function _tokenTotalSupply() internal view returns (uint256) {\\n    uint256 total = reserveTotalSupply;\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \\n    uint256 tokensLength = tokens.length;\\n    \\n    for(uint256 i = 0; i < tokensLength; i++){\\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\\n    }\\n\\n    return total;\\n  }\\n\\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\\n  }\\n\\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\\n    uint256 tokensLength = tokens.length;\\n\\n    for(uint256 i = 0; i < tokensLength; i++) {\\n      if(tokens[i] == controlledToken) return true;\\n    }\\n    return false;\\n  }\\n  \\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\\n    return _isControlled(controlledToken);\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function _token() internal virtual view returns (IERC20Upgradeable);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal virtual returns (uint256);\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal virtual;\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\\n\\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  modifier onlyControlledToken(address controlledToken) {\\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \\\"PrizePool/unknown-token\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure caller is the prize-strategy\\n  modifier onlyPrizeStrategy() {\\n    require(_msgSender() == address(prizeStrategy), \\\"PrizePool/only-prizeStrategy\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\\n  modifier canAddLiquidity(uint256 _amount) {\\n    require(_canAddLiquidity(_amount), \\\"PrizePool/exceeds-liquidity-cap\\\");\\n    _;\\n  }\\n\\n  modifier onlyReserve() {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    require(address(reserve) == msg.sender, \\\"PrizePool/only-reserve\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x386ebc1c80ab4424f14125e716dd12641ff933b475bf1082b7b1a6eee4a969c3\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/stake/StakePrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"../PrizePool.sol\\\";\\n\\ncontract StakePrizePool is PrizePool {\\n\\n  IERC20Upgradeable private stakeToken;\\n\\n  event StakePrizePoolInitialized(address indexed stakeToken);\\n\\n  /// @notice Initializes the Prize Pool and Yield Service with the required contract connections\\n  /// @param _controlledTokens Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\\n  /// @param _maxExitFeeMantissa The maximum exit fee size, relative to the withdrawal amount\\n  /// @param _stakeToken Address of the stake token\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa,\\n    IERC20Upgradeable _stakeToken\\n  )\\n    public\\n    initializer\\n  {\\n    PrizePool.initialize(\\n      _reserveRegistry,\\n      _controlledTokens,\\n      _maxExitFeeMantissa\\n    );\\n\\n    require(address(_stakeToken) != address(0), \\\"StakePrizePool/stake-token-not-zero-address\\\");\\n    stakeToken = _stakeToken;\\n\\n    emit StakePrizePoolInitialized(address(stakeToken));\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal override view returns (bool) {\\n    return address(stakeToken) != _externalToken;\\n  }\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal override returns (uint256) {\\n    return stakeToken.balanceOf(address(this));\\n  }\\n\\n  function _token() internal override view returns (IERC20Upgradeable) {\\n    return stakeToken;\\n  }\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal override {\\n    // no-op because nothing else needs to be done\\n  }\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal override returns (uint256) {\\n    return redeemAmount;\\n  }\\n}\\n\",\"keccak256\":\"0x3410ac3873521a451484e54c6319be3042f2d92da8030511403f192edb3f5798\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/stake/StakePrizePoolProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./StakePrizePool.sol\\\";\\nimport \\\"../../external/openzeppelin/ProxyFactory.sol\\\";\\n\\n/// @title Stake Prize Pool Proxy Factory\\n/// @notice Minimal proxy pattern for creating new Stake Prize Pools\\ncontract StakePrizePoolProxyFactory is ProxyFactory {\\n\\n  /// @notice Contract template for deploying proxied Prize Pools\\n  StakePrizePool public instance;\\n\\n  /// @notice Initializes the Factory with an instance of the Stake Prize Pool\\n  constructor () public {\\n    instance = new StakePrizePool();\\n  }\\n\\n  /// @notice Creates a new Stake Prize Pool as a proxy of the template instance\\n  /// @return A reference to the new proxied Stake Prize Pool\\n  function create() external returns (StakePrizePool) {\\n    return StakePrizePool(deployMinimal(address(instance), \\\"\\\"));\\n  }\\n}\\n\",\"keccak256\":\"0xd105fb3c1531c4167fab9a6c15972411db9afc7a1ab6b1640d9fc746bc29ae10\",\"license\":\"GPL-3.0\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 9288,
                "contract": "contracts/prize-pool/stake/StakePrizePoolProxyFactory.sol:StakePrizePoolProxyFactory",
                "label": "instance",
                "offset": 0,
                "slot": "0",
                "type": "t_contract(StakePrizePool)9278"
              }
            ],
            "types": {
              "t_contract(StakePrizePool)9278": {
                "encoding": "inplace",
                "label": "contract StakePrizePool",
                "numberOfBytes": "20"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "constructor": "Initializes the Factory with an instance of the Stake Prize Pool",
              "create()": {
                "notice": "Creates a new Stake Prize Pool as a proxy of the template instance"
              },
              "instance()": {
                "notice": "Contract template for deploying proxied Prize Pools"
              }
            },
            "notice": "Minimal proxy pattern for creating new Stake Prize Pools",
            "version": 1
          }
        }
      },
      "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol": {
        "YieldSourcePrizePool": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "AwardCaptured",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "Awarded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "AwardedExternalERC20",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256[]",
                  "name": "tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "AwardedExternalERC721",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract ControlledTokenInterface",
                  "name": "token",
                  "type": "address"
                }
              ],
              "name": "ControlledTokenAdded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "CreditBurned",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "CreditMinted",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint128",
                  "name": "creditLimitMantissa",
                  "type": "uint128"
                },
                {
                  "indexed": false,
                  "internalType": "uint128",
                  "name": "creditRateMantissa",
                  "type": "uint128"
                }
              ],
              "name": "CreditPlanSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "referrer",
                  "type": "address"
                }
              ],
              "name": "Deposited",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "bytes",
                  "name": "error",
                  "type": "bytes"
                }
              ],
              "name": "ErrorAwardingExternalERC721",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "reserveRegistry",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "maxExitFeeMantissa",
                  "type": "uint256"
                }
              ],
              "name": "Initialized",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "redeemed",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "exitFee",
                  "type": "uint256"
                }
              ],
              "name": "InstantWithdrawal",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "liquidityCap",
                  "type": "uint256"
                }
              ],
              "name": "LiquidityCapSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "prizeStrategy",
                  "type": "address"
                }
              ],
              "name": "PrizeStrategySet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "ReserveFeeCaptured",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "ReserveWithdrawal",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "TransferredExternalERC20",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "yieldSource",
                  "type": "address"
                }
              ],
              "name": "YieldSourcePrizePoolInitialized",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "VERSION",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "accountedBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "awardBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "awardExternalERC20",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256[]",
                  "name": "tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "awardExternalERC721",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "balance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "balanceOfCredit",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "beforeTokenTransfer",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "calculateEarlyExitFee",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "exitFee",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "burnedCredit",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "calculateReserveFee",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_externalToken",
                  "type": "address"
                }
              ],
              "name": "canAwardExternal",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "captureAwardBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract ICompLike",
                  "name": "compLike",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                }
              ],
              "name": "compLikeDelegate",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "creditPlanOf",
              "outputs": [
                {
                  "internalType": "uint128",
                  "name": "creditLimitMantissa",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "creditRateMantissa",
                  "type": "uint128"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "referrer",
                  "type": "address"
                }
              ],
              "name": "depositTo",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_principal",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "_interest",
                  "type": "uint256"
                }
              ],
              "name": "estimateCreditAccrualTime",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "durationSeconds",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "_reserveRegistry",
                  "type": "address"
                },
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "_controlledTokens",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256",
                  "name": "_maxExitFeeMantissa",
                  "type": "uint256"
                }
              ],
              "name": "initialize",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "_reserveRegistry",
                  "type": "address"
                },
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "_controlledTokens",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256",
                  "name": "_maxExitFeeMantissa",
                  "type": "uint256"
                },
                {
                  "internalType": "contract IYieldSource",
                  "name": "_yieldSource",
                  "type": "address"
                }
              ],
              "name": "initializeYieldSourcePrizePool",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract ControlledTokenInterface",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "isControlled",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "liquidityCap",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "maxExitFeeMantissa",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "onERC721Received",
              "outputs": [
                {
                  "internalType": "bytes4",
                  "name": "",
                  "type": "bytes4"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizeStrategy",
              "outputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "renounceOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "reserveRegistry",
              "outputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "reserveTotalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint128",
                  "name": "_creditRateMantissa",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "_creditLimitMantissa",
                  "type": "uint128"
                }
              ],
              "name": "setCreditPlanOf",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_liquidityCap",
                  "type": "uint256"
                }
              ],
              "name": "setLiquidityCap",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "_prizeStrategy",
                  "type": "address"
                }
              ],
              "name": "setPrizeStrategy",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "token",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "tokens",
              "outputs": [
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "",
                  "type": "address[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transferExternalERC20",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "maximumExitFee",
                  "type": "uint256"
                }
              ],
              "name": "withdrawInstantlyFrom",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                }
              ],
              "name": "withdrawReserve",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "yieldSource",
              "outputs": [
                {
                  "internalType": "contract IYieldSource",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "accountedBalance()": {
                "returns": {
                  "_0": "The current total of all tokens"
                }
              },
              "award(address,uint256,address)": {
                "details": "The amount awarded must be less than the awardBalance()",
                "params": {
                  "amount": "The amount of assets to be awarded",
                  "controlledToken": "The address of the asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "awardBalance()": {
                "details": "captureAwardBalance() should be called first",
                "returns": {
                  "_0": "The total amount of assets to be awarded for the current prize"
                }
              },
              "awardExternalERC20(address,address,uint256)": {
                "details": "Used to award any arbitrary tokens held by the Prize Pool",
                "params": {
                  "amount": "The amount of external assets to be awarded",
                  "externalToken": "The address of the external asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "awardExternalERC721(address,address,uint256[])": {
                "details": "Used to award any arbitrary NFTs held by the Prize Pool",
                "params": {
                  "externalToken": "The address of the external NFT token being awarded",
                  "to": "The address of the winner that receives the award",
                  "tokenIds": "An array of NFT Token IDs to be transferred"
                }
              },
              "balance()": {
                "details": "Returns the total underlying balance of all assets. This includes both principal and interest.",
                "returns": {
                  "_0": "The underlying balance of assets"
                }
              },
              "balanceOfCredit(address,address)": {
                "params": {
                  "user": "The user whose credit balance should be returned"
                },
                "returns": {
                  "_0": "The balance of the users credit"
                }
              },
              "beforeTokenTransfer(address,address,uint256)": {
                "params": {
                  "amount": "The amount of tokens being trasferred",
                  "from": "The address the tokens are being transferred from (0 if minting)",
                  "to": "The address the tokens are being transferred to (0 if burning)"
                }
              },
              "calculateEarlyExitFee(address,address,uint256)": {
                "params": {
                  "amount": "The amount of collateral to be withdrawn",
                  "controlledToken": "The type of collateral being withdrawn",
                  "from": "The user who is withdrawing"
                },
                "returns": {
                  "burnedCredit": "The user's credit that was burned",
                  "exitFee": "The exit fee"
                }
              },
              "calculateReserveFee(uint256)": {
                "params": {
                  "amount": "The prize amount"
                },
                "returns": {
                  "_0": "The size of the reserve portion of the prize"
                }
              },
              "canAwardExternal(address)": {
                "details": "Checks with the Prize Pool if a specific token type may be awarded as an external prize",
                "params": {
                  "_externalToken": "The address of the token to check"
                },
                "returns": {
                  "_0": "True if the token may be awarded, false otherwise"
                }
              },
              "captureAwardBalance()": {
                "details": "This function also captures the reserve fees.",
                "returns": {
                  "_0": "The total amount of assets to be awarded for the current prize"
                }
              },
              "compLikeDelegate(address,address)": {
                "params": {
                  "compLike": "The COMP-like token held by the prize pool that should be delegated",
                  "to": "The address to delegate to "
                }
              },
              "creditPlanOf(address)": {
                "params": {
                  "controlledToken": "The controlled token to retrieve the credit rates for"
                },
                "returns": {
                  "creditLimitMantissa": "The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.",
                  "creditRateMantissa": "The credit rate. This is the amount of tokens that accrue per second."
                }
              },
              "depositTo(address,uint256,address,address)": {
                "params": {
                  "amount": "The amount of assets to deposit",
                  "controlledToken": "The address of the type of token the user is minting",
                  "referrer": "The referrer of the deposit",
                  "to": "The address receiving the newly minted tokens"
                }
              },
              "estimateCreditAccrualTime(address,uint256,uint256)": {
                "params": {
                  "_interest": "The amount of interest that must accrue",
                  "_principal": "The principal amount on which interest is accruing"
                },
                "returns": {
                  "durationSeconds": "The duration of time it will take to accrue the given amount of interest, in seconds."
                }
              },
              "initialize(address,address[],uint256)": {
                "params": {
                  "_controlledTokens": "Array of ControlledTokens that are controlled by this Prize Pool.",
                  "_maxExitFeeMantissa": "The maximum exit fee size"
                }
              },
              "initializeYieldSourcePrizePool(address,address[],uint256,address)": {
                "params": {
                  "_controlledTokens": "Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool",
                  "_maxExitFeeMantissa": "The maximum exit fee size, relative to the withdrawal amount",
                  "_yieldSource": "Address of the yield source"
                }
              },
              "isControlled(address)": {
                "details": "Checks if a specific token is controlled by the Prize Pool",
                "params": {
                  "controlledToken": "The address of the token to check"
                },
                "returns": {
                  "_0": "True if the token is a controlled token, false otherwise"
                }
              },
              "onERC721Received(address,address,uint256,bytes)": {
                "params": {
                  "data": "Additional data with no specified format, sent in call to `_to`.",
                  "from": "The current owner of the NFT",
                  "operator": "The address that acts on behalf of the owner",
                  "tokenId": "The NFT to transfer"
                }
              },
              "owner()": {
                "details": "Returns the address of the current owner."
              },
              "renounceOwnership()": {
                "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
              },
              "setCreditPlanOf(address,uint128,uint128)": {
                "params": {
                  "_controlledToken": "The controlled token for whom to set the credit plan",
                  "_creditLimitMantissa": "The credit limit to set.  Is a fixed point 18 decimal (like Ether).",
                  "_creditRateMantissa": "The credit rate to set.  Is a fixed point 18 decimal (like Ether)."
                }
              },
              "setLiquidityCap(uint256)": {
                "params": {
                  "_liquidityCap": "The new liquidity cap for the prize pool"
                }
              },
              "setPrizeStrategy(address)": {
                "params": {
                  "_prizeStrategy": "The new prize strategy"
                }
              },
              "token()": {
                "details": "Returns the address of the underlying ERC20 asset",
                "returns": {
                  "_0": "The address of the asset"
                }
              },
              "tokens()": {
                "returns": {
                  "_0": "An array of controlled token addresses"
                }
              },
              "transferExternalERC20(address,address,uint256)": {
                "details": "Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.",
                "params": {
                  "amount": "The amount of external assets to be awarded",
                  "externalToken": "The address of the external asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "transferOwnership(address)": {
                "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
              },
              "withdrawInstantlyFrom(address,uint256,address,uint256)": {
                "params": {
                  "amount": "The amount of tokens to redeem for assets.",
                  "controlledToken": "The address of the token to redeem (i.e. ticket or sponsorship)",
                  "from": "The address to redeem tokens from.",
                  "maximumExitFee": "The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn."
                },
                "returns": {
                  "_0": "The actual exit fee paid"
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5061440e806100206000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c80638da5cb5b11610130578063b2470e5c116100b8578063e6d8a94b1161007c578063e6d8a94b14610956578063edb4e1cf1461095e578063f2fde38b14610966578063fc0c546a1461098c578063ffa1ad741461099457610232565b8063b2470e5c146107f6578063b69ef8a8146107fe578063cfa2400714610806578063d4a1361d146108c5578063e323f8251461091a57610232565b80639d63848a116100ff5780639d63848a146107025780639e1675191461075a5780639fe32a9114610762578063a016240b1461077f578063a7b2cc31146107b957610232565b80638da5cb5b146106a85780638e71c1f6146106cc57806391ca480e146106d457806398bf3eb6146106fa57610232565b8063630665b4116101be57806378b3d3271161018257806378b3d327146105ae57806379cb8563146105d45780637b99adb1146106065780637cbab1c714610623578063888c2b6f1461065957610232565b8063630665b4146105265780636a3fd4f91461052e5780636b1b863a14610568578063715018a61461059e57806376687d3d146105a657610232565b80632b0ab144116102055780632b0ab144146103bb5780632f7627e3146103f15780633ede50c61461041f578063494de9f7146104d257806352a387ab1461050057610232565b80630937eb541461023757806313f55e3914610251578063150b7a021461028957806316960d5514610334575b600080fd5b61023f610a11565b60408051918252519081900360200190f35b6102876004803603606081101561026757600080fd5b506001600160a01b03813581169160208101359091169060400135610a20565b005b6103176004803603608081101561029f57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156102d957600080fd5b8201836020820111156102eb57600080fd5b803590602001918460018302840111600160201b8311171561030c57600080fd5b509092509050610ade565b604080516001600160e01b03199092168252519081900360200190f35b6102876004803603606081101561034a57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561037d57600080fd5b82018360208201111561038f57600080fd5b803590602001918460208302840111600160201b831117156103b057600080fd5b509092509050610aef565b610287600480360360608110156103d157600080fd5b506001600160a01b03813581169160208101359091169060400135610d9c565b6102876004803603604081101561040757600080fd5b506001600160a01b0381358116916020013516610e59565b6102876004803603606081101561043557600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561045f57600080fd5b82018360208201111561047157600080fd5b803590602001918460208302840111600160201b8311171561049257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250610fa8915050565b61023f600480360360408110156104e857600080fd5b506001600160a01b038135811691602001351661119a565b61023f6004803603602081101561051657600080fd5b50356001600160a01b03166112a1565b61023f6113f0565b6105546004803603602081101561054457600080fd5b50356001600160a01b03166113f6565b604080519115158252519081900360200190f35b6102876004803603606081101561057e57600080fd5b506001600160a01b03813581169160208101359160409091013516611409565b610287611611565b61023f6116bd565b610554600480360360208110156105c457600080fd5b50356001600160a01b03166116c3565b61023f600480360360608110156105ea57600080fd5b506001600160a01b0381351690602081013590604001356116ce565b6102876004803603602081101561061c57600080fd5b50356116e3565b6102876004803603606081101561063957600080fd5b506001600160a01b03813581169160208101359091169060400135611751565b61068f6004803603606081101561066f57600080fd5b506001600160a01b0381358116916020810135909116906040013561199d565b6040805192835260208301919091528051918290030190f35b6106b06119b7565b604080516001600160a01b039092168252519081900360200190f35b6106b06119c6565b610287600480360360208110156106ea57600080fd5b50356001600160a01b03166119d5565b6106b0611a40565b61070a611a4f565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561074657818101518382015260200161072e565b505050509050019250505060405180910390f35b61023f611ab1565b61023f6004803603602081101561077857600080fd5b5035611ab7565b61023f6004803603608081101561079557600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611be5565b610287600480360360608110156107cf57600080fd5b506001600160a01b03813516906001600160801b0360208201358116916040013516611e1c565b6106b0611f72565b61023f611f81565b6102876004803603608081101561081c57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561084657600080fd5b82018360208201111561085857600080fd5b803590602001918460208302840111600160201b8311171561087957600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602001356001600160a01b0316611f8b565b6108eb600480360360208110156108db57600080fd5b50356001600160a01b03166121d6565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b6102876004803603608081101561093057600080fd5b506001600160a01b03813581169160208101359160408201358116916060013516612206565b61023f6123bb565b61023f612531565b6102876004803603602081101561097c57600080fd5b50356001600160a01b0316612537565b6106b061263a565b61099c612644565b6040805160208082528351818301528351919283929083019185019080838360005b838110156109d65781810151838201526020016109be565b50505050905090810190601f168015610a035780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610a1b612665565b905090565b6099546001600160a01b0316610a34612770565b6001600160a01b031614610a7d576040805162461bcd60e51b815260206004820152601c60248201526000805160206143b9833981519152604482015290519081900360640190fd5b610a88838383612774565b15610ad957816001600160a01b0316836001600160a01b03167fb0bac59718cd343c80a813518afcf36846cfcfe6d56e2b3cab9bd49f5f9b251c836040518082815260200191505060405180910390a35b505050565b630a85bd0160e11b95945050505050565b6099546001600160a01b0316610b03612770565b6001600160a01b031614610b4c576040805162461bcd60e51b815260206004820152601c60248201526000805160206143b9833981519152604482015290519081900360640190fd5b610b55836127fc565b610ba6576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b80610bb057610d96565b60005b81811015610d1d57836001600160a01b03166342842e0e3087868686818110610bd857fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610c3557600080fd5b505af1925050508015610c46575060015b610d15573d808015610c74576040519150601f19603f3d011682016040523d82523d6000602084013e610c79565b606091505b507f17e975018310f88872b58d4d8263adca83cf5c1893496ea2a86923dab15276ad816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610cd9578181015183820152602001610cc1565b50505050905090810190601f168015610d065780820380516001836020036101000a031916815260200191505b509250505060405180910390a1505b600101610bb3565b50826001600160a01b0316846001600160a01b03167f69c2de32bc4d47f488e72626a6cfdee85089342e52675e7de79c4b417623960c848460405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a35b50505050565b6099546001600160a01b0316610db0612770565b6001600160a01b031614610df9576040805162461bcd60e51b815260206004820152601c60248201526000805160206143b9833981519152604482015290519081900360640190fd5b610e04838383612774565b15610ad957816001600160a01b0316836001600160a01b03167fc65f48aca3b7a99b7443d04b8ffbb073156179bc628dc3f7def5047748973469836040518082815260200191505060405180910390a3505050565b610e61612770565b6001600160a01b0316610e726119b7565b6001600160a01b031614610ebb576040805162461bcd60e51b81526020600482018190526024820152600080516020614296833981519152604482015290519081900360640190fd5b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f0a57600080fd5b505afa158015610f1e573d6000803e3d6000fd5b505050506040513d6020811015610f3457600080fd5b50511115610fa457816001600160a01b0316635c19a95c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015610f8b57600080fd5b505af1158015610f9f573d6000803e3d6000fd5b505050505b5050565b600054610100900460ff1680610fc15750610fc1612811565b80610fcf575060005460ff16155b61100a5760405162461bcd60e51b815260040180806020018281038252602e815260200180614247602e913960400191505060405180910390fd5b600054610100900460ff16158015611035576000805460ff1961ff0019909116610100171660011790555b6001600160a01b03841661107a5760405162461bcd60e51b81526004018080602001828103825260228152602001806141ff6022913960400191505060405180910390fd5b82518067ffffffffffffffff8111801561109357600080fd5b506040519080825280602002602001820160405280156110bd578160200160208202803683370190505b5080516110d29160989160209091019061410d565b5060005b818110156111095760008582815181106110ec57fe5b602002602001015190506111008183612822565b506001016110d6565b5061111261294d565b61111a6129fe565b611125600019612a93565b609780546001600160a01b0319166001600160a01b038716908117909155609a849055604080519182526020820185905280517f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce799281900390910190a1508015610d96576000805461ff001916905550505050565b6000816111a681612ace565b6111e5576040805162461bcd60e51b815260206004820152601760248201526000805160206142dd833981519152604482015290519081900360640190fd5b61126a8484856001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d602081101561126157600080fd5b50516000612b8a565b50506001600160a01b039081166000908152609f60209081526040808320949093168252929092529020546001600160c01b031690565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112f257600080fd5b505afa158015611306573d6000803e3d6000fd5b505050506040513d602081101561131c57600080fd5b505190506001600160a01b0381163314611376576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f6f6e6c792d7265736572766560501b604482015290519081900360640190fd5b609b80546000918290559061138a82612ba0565b90506113a98582611399612c1e565b6001600160a01b03169190612c94565b6040805183815290516001600160a01b038716917f1c71c8e11fd443227c8f8d3dc1a237a3a5e8310b540c7fbcf5169754aedf42c9919081900360200190a2949350505050565b609d5490565b6000611401826127fc565b90505b919050565b6099546001600160a01b031661141d612770565b6001600160a01b031614611466576040805162461bcd60e51b815260206004820152601c60248201526000805160206143b9833981519152604482015290519081900360640190fd5b8061147081612ace565b6114af576040805162461bcd60e51b815260206004820152601760248201526000805160206142dd833981519152604482015290519081900360640190fd5b826114b957610d96565b609d54831115611510576040805162461bcd60e51b815260206004820152601d60248201527f5072697a65506f6f6c2f61776172642d657863656564732d617661696c000000604482015290519081900360640190fd5b609d5461151d9084612ce6565b609d5561152d8484846000612d48565b60006115398385612e2e565b90506115bf8584856001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561158d57600080fd5b505afa1580156115a1573d6000803e3d6000fd5b505050506040513d60208110156115b757600080fd5b505184612b8a565b826001600160a01b0316856001600160a01b03167fe2554529d99ab7a67db6b4cea2b32c7d55ae325f958861e05f304fdded867e31866040518082815260200191505060405180910390a35050505050565b611619612770565b6001600160a01b031661162a6119b7565b6001600160a01b031614611673576040805162461bcd60e51b81526020600482018190526024820152600080516020614296833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b609c5481565b600061140182612ace565b60006116db848484612e66565b949350505050565b6116eb612770565b6001600160a01b03166116fc6119b7565b6001600160a01b031614611745576040805162461bcd60e51b81526020600482018190526024820152600080516020614296833981519152604482015290519081900360640190fd5b61174e81612a93565b50565b3361175b81612ace565b61179a576040805162461bcd60e51b815260206004820152601760248201526000805160206142dd833981519152604482015290519081900360640190fd5b6001600160a01b03841615611874576000336001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156117f857600080fd5b505afa15801561180c573d6000803e3d6000fd5b505050506040513d602081101561182257600080fd5b50519050600061183486338484612ec0565b9050846001600160a01b0316866001600160a01b031614611866576118633361185d8487612ce6565b83612f4f565b90505b611871863383612f95565b50505b6001600160a01b0383161580159061189e5750836001600160a01b0316836001600160a01b031614155b156118f5576118f58333336001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561123757600080fd5b6001600160a01b0384161580159061191757506099546001600160a01b031615155b15610d96576099546040805163b221095760e01b81526001600160a01b0387811660048301528681166024830152604482018690523360648301529151919092169163b221095791608480830192600092919082900301818387803b15801561197f57600080fd5b505af1158015611993573d6000803e3d6000fd5b5050505050505050565b6000806119ab858585613133565b90969095509350505050565b6033546001600160a01b031690565b6097546001600160a01b031681565b6119dd612770565b6001600160a01b03166119ee6119b7565b6001600160a01b031614611a37576040805162461bcd60e51b81526020600482018190526024820152600080516020614296833981519152604482015290519081900360640190fd5b61174e816132d1565b6099546001600160a01b031681565b60606098805480602002602001604051908101604052809291908181526020018280548015611aa757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a89575b5050505050905090565b609a5481565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b0857600080fd5b505afa158015611b1c573d6000803e3d6000fd5b505050506040513d6020811015611b3257600080fd5b505190506001600160a01b038116611b4e576000915050611404565b6000816001600160a01b031663010dfa58306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611b9d57600080fd5b505afa158015611bb1573d6000803e3d6000fd5b505050506040513d6020811015611bc757600080fd5b5051905080611bdb57600092505050611404565b6116db84826133e4565b600060026065541415611c3f576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655582611c4e81612ace565b611c8d576040805162461bcd60e51b815260206004820152601760248201526000805160206142dd833981519152604482015290519081900360640190fd5b600080611c9b888789613133565b9150915084821115611cde5760405162461bcd60e51b81526004018080602001828103825260278152602001806142b66027913960400191505060405180910390fd5b611ce9888783613405565b856001600160a01b031663631b5dfb611d00612770565b8a8a6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611d5857600080fd5b505af1158015611d6c573d6000803e3d6000fd5b505050506000611d858389612ce690919063ffffffff16565b90506000611d9282612ba0565b9050611da18a82611399612c1e565b876001600160a01b03168a6001600160a01b0316611dbd612770565b604080518d81526020810186905280820189905290516001600160a01b0392909216917f0271704a58fd2953e49b87d67a0a3ce28a58147de98a5457f60b4686f63850309181900360600190a450506001606555509695505050505050565b82611e2681612ace565b611e65576040805162461bcd60e51b815260206004820152601760248201526000805160206142dd833981519152604482015290519081900360640190fd5b611e6d612770565b6001600160a01b0316611e7e6119b7565b6001600160a01b031614611ec7576040805162461bcd60e51b81526020600482018190526024820152600080516020614296833981519152604482015290519081900360640190fd5b6040805180820182526001600160801b0380851680835286821660208085018281526001600160a01b038b166000818152609e84528890209651875492518716600160801b029087166fffffffffffffffffffffffffffffffff1990931692909217909516179094558451928352928201528083019190915290517ffb0ba2cf86a2b03bcf387753a2192da80a006afa99dd022bb301c78e323bf1b99181900360600190a150505050565b60a0546001600160a01b031681565b6000610a1b6134c6565b600054610100900460ff1680611fa45750611fa4612811565b80611fb2575060005460ff16155b611fed5760405162461bcd60e51b815260040180806020018281038252602e815260200180614247602e913960400191505060405180910390fd5b600054610100900460ff16158015612018576000805460ff1961ff0019909116610100171660011790555b61202a826001600160a01b0316613526565b6120655760405162461bcd60e51b815260040180806020018281038252603681526020018061434d6036913960400191505060405180910390fd5b612070858585610fa8565b60a080546001600160a01b0319166001600160a01b0384169081179091556040805163c89039c560e01b60208083019190915282518083038201815291830192839052815160009493918291908401908083835b602083106120e35780518252601f1990920191602091820191016120c4565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114612143576040519150601f19603f3d011682016040523d82523d6000602084013e612148565b606091505b50509050806121885760405162461bcd60e51b81526004018080602001828103825260298152602001806141896029913960400191505060405180910390fd5b6040516001600160a01b038416907f7a0ca506edc9fcd36e010dbcaad57dade17bbac71dfeb53269077098e863eeca90600090a25080156121cf576000805461ff00191690555b5050505050565b6001600160a01b03166000908152609e60205260409020546001600160801b0380821692600160801b9092041690565b6002606554141561225e576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026065558161226d81612ace565b6122ac576040805162461bcd60e51b815260206004820152601760248201526000805160206142dd833981519152604482015290519081900360640190fd5b836122b68161352c565b612307576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f657863656564732d6c69717569646974792d63617000604482015290519081900360640190fd5b6000612311612770565b905061231f87878787612d48565b61233e81308861232d612c1e565b6001600160a01b0316929190613550565b612347866135aa565b846001600160a01b0316876001600160a01b0316826001600160a01b03167f6ce569498e0f86f147466ac49211cb2a1ffe06195adb805e383b3f2365109160898860405180838152602001826001600160a01b031681526020019250505060405180910390a4505060016065555050505050565b600060026065541415612415576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026065556000612424612665565b905060006124306134c6565b9050600082821161244257600061244c565b61244c8284612ce6565b90506000609d54821161246057600061246e565b609d5461246e908390612ce6565b9050801561252057600061248182611ab7565b905080156124db57609b54612496908261363a565b609b556124a38282612ce6565b6040805183815290519193507f5f1703ccfa2730d4245350f228079926a37f26a44ecf6978a7eeafff0af11407919081900360200190a15b609d546124e8908361363a565b609d556040805183815290517fce2b6e507c7ca1a20ce136810f524eefc19ba4c7e4866eb6cc0cba76e778d4be9181900360200190a1505b609d54945050505050600160655590565b609b5481565b61253f612770565b6001600160a01b03166125506119b7565b6001600160a01b031614612599576040805162461bcd60e51b81526020600482018190526024820152600080516020614296833981519152604482015290519081900360640190fd5b6001600160a01b0381166125de5760405162461bcd60e51b81526004018080602001828103825260268152602001806141b26026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610a1b612c1e565b60405180604001604052806005815260200164332e342e3560d81b81525081565b600080609b549050606060988054806020026020016040519081016040528092919081815260200182805480156126c557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116126a7575b505083519394506000925050505b818110156127675761275d8382815181106126ea57fe5b60200260200101516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561272a57600080fd5b505afa15801561273e573d6000803e3d6000fd5b505050506040513d602081101561275457600080fd5b5051859061363a565b93506001016126d3565b50919250505090565b3390565b600061277f836127fc565b6127d0576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b816127dd575060006127f5565b6127f16001600160a01b0384168584612c94565b5060015b9392505050565b60a0546001600160a01b039081169116141590565b600061281c30613526565b15905090565b306001600160a01b0316826001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b15801561286557600080fd5b505afa158015612879573d6000803e3d6000fd5b505050506040513d602081101561288f57600080fd5b50516001600160a01b0316146128ec576040805162461bcd60e51b815260206004820152601e60248201527f5072697a65506f6f6c2f746f6b656e2d6374726c722d6d69736d617463680000604482015290519081900360640190fd5b81609882815481106128fa57fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051918416917f460e712b4a5d801d031ed673dea209b73ab854f7ddeb86b6c48082e92c3eee669190a25050565b600054610100900460ff16806129665750612966612811565b80612974575060005460ff16155b6129af5760405162461bcd60e51b815260040180806020018281038252602e815260200180614247602e913960400191505060405180910390fd5b600054610100900460ff161580156129da576000805460ff1961ff0019909116610100171660011790555b6129e2613694565b6129ea613734565b801561174e576000805461ff001916905550565b600054610100900460ff1680612a175750612a17612811565b80612a25575060005460ff16155b612a605760405162461bcd60e51b815260040180806020018281038252602e815260200180614247602e913960400191505060405180910390fd5b600054610100900460ff16158015612a8b576000805460ff1961ff0019909116610100171660011790555b6129ea61382d565b609c8190556040805182815290517f3ff20538222f568f27ff436c0c49dfd3e48d5b8f86533a3f759dc1c7089775ab9181900360200190a150565b600060606098805480602002602001604051908101604052809291908181526020018280548015612b2857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612b0a575b505083519394506000925050505b81811015612b7f57846001600160a01b0316838281518110612b5457fe5b60200260200101516001600160a01b03161415612b775760019350505050611404565b600101612b36565b506000949350505050565b610d968484612b9b87878787612ec0565b612f95565b60a0546040805162982a6160e11b81526004810184905290516000926001600160a01b03169163013054c291602480830192602092919082900301818787803b158015612bec57600080fd5b505af1158015612c00573d6000803e3d6000fd5b505050506040513d6020811015612c1657600080fd5b505192915050565b60a0546040805163c89039c560e01b815290516000926001600160a01b03169163c89039c5916004808301926020929190829003018186803b158015612c6357600080fd5b505afa158015612c77573d6000803e3d6000fd5b505050506040513d6020811015612c8d57600080fd5b5051905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ad99084906138d3565b600082821115612d3d576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6099546001600160a01b031615612dd757609954604080516304d7f3db60e41b81526001600160a01b038781166004830152602482018790528581166044830152848116606483015291519190921691634d7f3db091608480830192600092919082900301818387803b158015612dbe57600080fd5b505af1158015612dd2573d6000803e3d6000fd5b505050505b816001600160a01b0316635d7b075885856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561197f57600080fd5b6001600160a01b0382166000908152609e60205260408120546127f5908390612e619082906001600160801b03166133e4565b613984565b6001600160a01b0383166000908152609e60205260408120548190612e9c908590600160801b90046001600160801b03166133e4565b905080612ead5760009150506127f5565b612eb783826139a9565b95945050505050565b6001600160a01b038381166000908152609f6020908152604080832093881683529290529081208054829190600160e01b900460ff16612f035760009150612f45565b6000612f10888888613a10565b8254909150612f419088908890612f3c908990612f36906001600160c01b03168761363a565b9061363a565b612f4f565b9250505b5095945050505050565b6001600160a01b0383166000908152609e60205260408120548190612f7e9085906001600160801b03166133e4565b905080831115612f8c578092505b50909392505050565b6001600160a01b038083166000908152609f602090815260408083209387168352929052819020548151606081019092526001600160c01b03169080612fda84613ac1565b6001600160801b03168152602001612ff8612ff3613b09565b613b0d565b63ffffffff908116825260016020928301526001600160a01b038681166000908152609f84526040808220928a168252918452819020845181549486015195909201516001600160c01b03199094166001600160c01b039092169190911763ffffffff60c01b1916600160c01b94909216939093021760ff60e01b1916600160e01b91151591909102179055818110156130db576001600160a01b038084169085167f2f92d56910619b38bc29fd8e4ca5e56359edac7a0c086cdcd305fb603fa374916130c58585612ce6565b60408051918252519081900360200190a3610d96565b80821015610d96576001600160a01b038084169085167ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf61311c8486612ce6565b60408051918252519081900360200190a350505050565b6000806000846001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561318557600080fd5b505afa158015613199573d6000803e3d6000fd5b505050506040513d60208110156131af57600080fd5b5051905083811015613201576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f696e737566662d66756e647360501b604482015290519081900360640190fd5b61320e8686836000612b8a565b60006132238661321e8488612ce6565b612e2e565b6001600160a01b038088166000908152609f60209081526040808320938c16835292905290812054919250906001600160c01b0316821161329a576001600160a01b038088166000908152609f60209081526040808320938c1683529290522054613297906001600160c01b031683612ce6565b90505b60006132a68888612e2e565b90508082116132b557816132b7565b805b94506132c38186612ce6565b955050505050935093915050565b6001600160a01b03811661332c576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f7072697a6553747261746567792d6e6f742d7a65726f604482015290519081900360640190fd5b6133496001600160a01b038216600162a1cb1960e01b0319613b51565b61339a576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f7072697a6553747261746567792d696e76616c696400604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0383169081179091556040517f7f58dc86bc2e435cb77ca0edb1df55e25f90caf2d6bd866971715437d456a21290600090a250565b6000806133f18385613b6d565b90506116db81670de0b6b3a7640000613bc6565b6001600160a01b038083166000908152609f602090815260408083209387168352929052205461344790613442906001600160c01b031683612ce6565b613ac1565b6001600160a01b038084166000818152609f602090815260408083209489168084529482529182902080546001600160c01b0319166001600160801b0396909616959095179094558051858152905191937ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf92918290030190a3505050565b60a05460408051630b99152d60e41b815230600482015290516000926001600160a01b03169163b99152d091602480830192602092919082900301818787803b15801561351257600080fd5b505af1158015612c77573d6000803e3d6000fd5b3b151590565b600080613537612665565b609c54909150613547828561363a565b11159392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610d969085906138d3565b60a0546135d3906001600160a01b0316826135c3612c1e565b6001600160a01b03169190613c08565b60a054604080516387a6eeef60e01b81526004810184905230602482015290516001600160a01b03909216916387a6eeef9160448082019260009290919082900301818387803b15801561362657600080fd5b505af11580156121cf573d6000803e3d6000fd5b6000828201838110156127f5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600054610100900460ff16806136ad57506136ad612811565b806136bb575060005460ff16155b6136f65760405162461bcd60e51b815260040180806020018281038252602e815260200180614247602e913960400191505060405180910390fd5b600054610100900460ff161580156129ea576000805460ff1961ff001990911661010017166001179055801561174e576000805461ff001916905550565b600054610100900460ff168061374d575061374d612811565b8061375b575060005460ff16155b6137965760405162461bcd60e51b815260040180806020018281038252602e815260200180614247602e913960400191505060405180910390fd5b600054610100900460ff161580156137c1576000805460ff1961ff0019909116610100171660011790555b60006137cb612770565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561174e576000805461ff001916905550565b600054610100900460ff16806138465750613846612811565b80613854575060005460ff16155b61388f5760405162461bcd60e51b815260040180806020018281038252602e815260200180614247602e913960400191505060405180910390fd5b600054610100900460ff161580156138ba576000805460ff1961ff0019909116610100171660011790555b6001606555801561174e576000805461ff001916905550565b6060613928826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613d1b9092919063ffffffff16565b805190915015610ad95780806020019051602081101561394757600080fd5b5051610ad95760405162461bcd60e51b815260040180806020018281038252602a815260200180614323602a913960400191505060405180910390fd5b60008061399384609a546133e4565b9050808311156139a1578092505b509092915050565b60008082116139ff576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381613a0857fe5b049392505050565b6001600160a01b038281166000908152609f60209081526040808320938716835292905290812054600160c01b810463ffffffff1690600160e01b900460ff16613a5e5760009150506127f5565b6000613a7282613a6c613b09565b90612ce6565b6001600160a01b0386166000908152609e602052604081205491925090613aaa908390600160801b90046001600160801b0316613b6d565b9050613ab685826133e4565b979650505050505050565b6000600160801b8210613b055760405162461bcd60e51b81526004018080602001828103825260278152602001806141d86027913960400191505060405180910390fd5b5090565b4290565b6000600160201b8210613b055760405162461bcd60e51b81526004018080602001828103825260268152602001806142fd6026913960400191505060405180910390fd5b6000613b5c83613d2a565b80156127f557506127f58383613d5d565b600082613b7c57506000612d42565b82820282848281613b8957fe5b04146127f55760405162461bcd60e51b81526004018080602001828103825260218152602001806142756021913960400191505060405180910390fd5b60006127f583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613d80565b801580613c8e575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015613c6057600080fd5b505afa158015613c74573d6000803e3d6000fd5b505050506040513d6020811015613c8a57600080fd5b5051155b613cc95760405162461bcd60e51b81526004018080602001828103825260368152602001806143836036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610ad99084906138d3565b60606116db8484600085613e22565b6000613d3d826301ffc9a760e01b613d5d565b80156114015750613d56826001600160e01b0319613d5d565b1592915050565b6000806000613d6c8585613f73565b91509150818015612eb75750949350505050565b60008183613e0c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613dd1578181015183820152602001613db9565b50505050905090810190601f168015613dfe5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613e1857fe5b0495945050505050565b606082471015613e635760405162461bcd60e51b81526004018080602001828103825260268152602001806142216026913960400191505060405180910390fd5b613e6c85613526565b613ebd576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613efc5780518252601f199092019160209182019101613edd565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613f5e576040519150601f19603f3d011682016040523d82523d6000602084013e613f63565b606091505b5091509150613ab68282866140a7565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b1781529151815160009384939284926060926001600160a01b038a169261753092879282918083835b60208310613ffb5780518252601f199092019160209182019101613fdc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461405c576040519150601f19603f3d011682016040523d82523d6000602084013e614061565b606091505b509150915060208151101561407f57600080945094505050506140a0565b8181806020019051602081101561409557600080fd5b505190955093505050505b9250929050565b606083156140b65750816127f5565b8251156140c65782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315613dd1578181015183820152602001613db9565b828054828255906000526020600020908101928215614162579160200282015b8281111561416257825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061412d565b50613b059291505b80821115613b055780546001600160a01b031916815560010161416a56fe5969656c64536f757263655072697a65506f6f6c2f696e76616c69642d7969656c642d736f757263654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e2031323820626974735072697a65506f6f6c2f7265736572766552656769737472792d6e6f742d7a65726f416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725072697a65506f6f6c2f657869742d6665652d657863656564732d757365722d6d6178696d756d5072697a65506f6f6c2f756e6b6e6f776e2d746f6b656e00000000000000000053616665436173743a2076616c756520646f65736e27742066697420696e20333220626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645969656c64536f757263655072697a65506f6f6c2f7969656c642d736f757263652d6e6f742d636f6e74726163742d616464726573735361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e63655072697a65506f6f6c2f6f6e6c792d7072697a65537472617465677900000000a264697066735822122038da218bcde0fd024912bfb202d78047e0838cc1fffbb920fe789d126bd83f7b64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x440E DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x232 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0x130 JUMPI DUP1 PUSH4 0xB2470E5C GT PUSH2 0xB8 JUMPI DUP1 PUSH4 0xE6D8A94B GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xE6D8A94B EQ PUSH2 0x956 JUMPI DUP1 PUSH4 0xEDB4E1CF EQ PUSH2 0x95E JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x966 JUMPI DUP1 PUSH4 0xFC0C546A EQ PUSH2 0x98C JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x994 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0xB2470E5C EQ PUSH2 0x7F6 JUMPI DUP1 PUSH4 0xB69EF8A8 EQ PUSH2 0x7FE JUMPI DUP1 PUSH4 0xCFA24007 EQ PUSH2 0x806 JUMPI DUP1 PUSH4 0xD4A1361D EQ PUSH2 0x8C5 JUMPI DUP1 PUSH4 0xE323F825 EQ PUSH2 0x91A JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x9D63848A GT PUSH2 0xFF JUMPI DUP1 PUSH4 0x9D63848A EQ PUSH2 0x702 JUMPI DUP1 PUSH4 0x9E167519 EQ PUSH2 0x75A JUMPI DUP1 PUSH4 0x9FE32A91 EQ PUSH2 0x762 JUMPI DUP1 PUSH4 0xA016240B EQ PUSH2 0x77F JUMPI DUP1 PUSH4 0xA7B2CC31 EQ PUSH2 0x7B9 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x6A8 JUMPI DUP1 PUSH4 0x8E71C1F6 EQ PUSH2 0x6CC JUMPI DUP1 PUSH4 0x91CA480E EQ PUSH2 0x6D4 JUMPI DUP1 PUSH4 0x98BF3EB6 EQ PUSH2 0x6FA JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x630665B4 GT PUSH2 0x1BE JUMPI DUP1 PUSH4 0x78B3D327 GT PUSH2 0x182 JUMPI DUP1 PUSH4 0x78B3D327 EQ PUSH2 0x5AE JUMPI DUP1 PUSH4 0x79CB8563 EQ PUSH2 0x5D4 JUMPI DUP1 PUSH4 0x7B99ADB1 EQ PUSH2 0x606 JUMPI DUP1 PUSH4 0x7CBAB1C7 EQ PUSH2 0x623 JUMPI DUP1 PUSH4 0x888C2B6F EQ PUSH2 0x659 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x630665B4 EQ PUSH2 0x526 JUMPI DUP1 PUSH4 0x6A3FD4F9 EQ PUSH2 0x52E JUMPI DUP1 PUSH4 0x6B1B863A EQ PUSH2 0x568 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x59E JUMPI DUP1 PUSH4 0x76687D3D EQ PUSH2 0x5A6 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x2B0AB144 GT PUSH2 0x205 JUMPI DUP1 PUSH4 0x2B0AB144 EQ PUSH2 0x3BB JUMPI DUP1 PUSH4 0x2F7627E3 EQ PUSH2 0x3F1 JUMPI DUP1 PUSH4 0x3EDE50C6 EQ PUSH2 0x41F JUMPI DUP1 PUSH4 0x494DE9F7 EQ PUSH2 0x4D2 JUMPI DUP1 PUSH4 0x52A387AB EQ PUSH2 0x500 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x937EB54 EQ PUSH2 0x237 JUMPI DUP1 PUSH4 0x13F55E39 EQ PUSH2 0x251 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x289 JUMPI DUP1 PUSH4 0x16960D55 EQ PUSH2 0x334 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x23F PUSH2 0xA11 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x267 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xA20 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x317 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x29F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x2D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x2EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x30C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xADE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x34A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x37D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x38F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x3B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xAEF JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x3D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xD9C JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x407 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xE59 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x435 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x45F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x471 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x492 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0xFA8 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x4E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x119A JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x516 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x12A1 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x13F0 JUMP JUMPDEST PUSH2 0x554 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x544 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x13F6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x57E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 SWAP1 SWAP2 ADD CALLDATALOAD AND PUSH2 0x1409 JUMP JUMPDEST PUSH2 0x287 PUSH2 0x1611 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x16BD JUMP JUMPDEST PUSH2 0x554 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16C3 JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x5EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x16CE JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x61C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x16E3 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x639 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1751 JUMP JUMPDEST PUSH2 0x68F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x66F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x199D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB ADD SWAP1 RETURN JUMPDEST PUSH2 0x6B0 PUSH2 0x19B7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x6B0 PUSH2 0x19C6 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x19D5 JUMP JUMPDEST PUSH2 0x6B0 PUSH2 0x1A40 JUMP JUMPDEST PUSH2 0x70A PUSH2 0x1A4F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x746 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x72E JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x23F PUSH2 0x1AB1 JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x778 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1AB7 JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x795 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x1BE5 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x7CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x40 ADD CALLDATALOAD AND PUSH2 0x1E1C JUMP JUMPDEST PUSH2 0x6B0 PUSH2 0x1F72 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x1F81 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x81C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x846 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x858 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x879 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1F8B JUMP JUMPDEST PUSH2 0x8EB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x8DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x21D6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x930 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x2206 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x23BB JUMP JUMPDEST PUSH2 0x23F PUSH2 0x2531 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x97C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2537 JUMP JUMPDEST PUSH2 0x6B0 PUSH2 0x263A JUMP JUMPDEST PUSH2 0x99C PUSH2 0x2644 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x9D6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x9BE JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xA03 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xA1B PUSH2 0x2665 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xA34 PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xA7D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43B9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xA88 DUP4 DUP4 DUP4 PUSH2 0x2774 JUMP JUMPDEST ISZERO PUSH2 0xAD9 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB0BAC59718CD343C80A813518AFCF36846CFCFE6D56E2B3CAB9BD49F5F9B251C DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0xA85BD01 PUSH1 0xE1 SHL SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xB03 PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xB4C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43B9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xB55 DUP4 PUSH2 0x27FC JUMP JUMPDEST PUSH2 0xBA6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0xBB0 JUMPI PUSH2 0xD96 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xD1D JUMPI DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x42842E0E ADDRESS DUP8 DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0xBD8 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0xC46 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xD15 JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0xC74 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xC79 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH32 0x17E975018310F88872B58D4D8263ADCA83CF5C1893496EA2A86923DAB15276AD DUP2 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xCD9 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xCC1 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD06 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xBB3 JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x69C2DE32BC4D47F488E72626A6CFDEE85089342E52675E7DE79C4B417623960C DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP6 POP SWAP1 SWAP4 POP POP POP POP LOG3 JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xDB0 PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xDF9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43B9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xE04 DUP4 DUP4 DUP4 PUSH2 0x2774 JUMP JUMPDEST ISZERO PUSH2 0xAD9 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC65F48ACA3B7A99B7443D04B8FFBB073156179BC628DC3F7DEF5047748973469 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH2 0xE61 PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE72 PUSH2 0x19B7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xEBB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4296 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF0A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xF1E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xF34 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD GT ISZERO PUSH2 0xFA4 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5C19A95C DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF9F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0xFC1 JUMPI POP PUSH2 0xFC1 PUSH2 0x2811 JUMP JUMPDEST DUP1 PUSH2 0xFCF JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x100A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4247 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1035 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x107A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x41FF PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 MLOAD DUP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x1093 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x10BD JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP1 MLOAD PUSH2 0x10D2 SWAP2 PUSH1 0x98 SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x410D JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1109 JUMPI PUSH1 0x0 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x10EC JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0x1100 DUP2 DUP4 PUSH2 0x2822 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x10D6 JUMP JUMPDEST POP PUSH2 0x1112 PUSH2 0x294D JUMP JUMPDEST PUSH2 0x111A PUSH2 0x29FE JUMP JUMPDEST PUSH2 0x1125 PUSH1 0x0 NOT PUSH2 0x2A93 JUMP JUMPDEST PUSH1 0x97 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x9A DUP5 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP6 SWAP1 MSTORE DUP1 MLOAD PUSH32 0x25FF68DD81B34665B5BA7E553EE5511BF6812E12ADB4A7E2C0D9E26B3099CE79 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 POP DUP1 ISZERO PUSH2 0xD96 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x11A6 DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH2 0x11E5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42DD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x126A DUP5 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1237 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x124B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1261 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 PUSH2 0x2B8A JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP4 AND DUP3 MSTORE SWAP3 SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1306 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x131C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ PUSH2 0x1376 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F6F6E6C792D72657365727665 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9B DUP1 SLOAD PUSH1 0x0 SWAP2 DUP3 SWAP1 SSTORE SWAP1 PUSH2 0x138A DUP3 PUSH2 0x2BA0 JUMP JUMPDEST SWAP1 POP PUSH2 0x13A9 DUP6 DUP3 PUSH2 0x1399 PUSH2 0x2C1E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x2C94 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP2 PUSH32 0x1C71C8E11FD443227C8F8D3DC1A237A3A5E8310B540C7FBCF5169754AEDF42C9 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x9D SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1401 DUP3 PUSH2 0x27FC JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x141D PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1466 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43B9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x1470 DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH2 0x14AF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42DD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 PUSH2 0x14B9 JUMPI PUSH2 0xD96 JUMP JUMPDEST PUSH1 0x9D SLOAD DUP4 GT ISZERO PUSH2 0x1510 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F61776172642D657863656564732D617661696C000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x151D SWAP1 DUP5 PUSH2 0x2CE6 JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH2 0x152D DUP5 DUP5 DUP5 PUSH1 0x0 PUSH2 0x2D48 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1539 DUP4 DUP6 PUSH2 0x2E2E JUMP JUMPDEST SWAP1 POP PUSH2 0x15BF DUP6 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x158D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x15A1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x15B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP5 PUSH2 0x2B8A JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xE2554529D99AB7A67DB6B4CEA2B32C7D55AE325F958861E05F304FDDED867E31 DUP7 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1619 PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x162A PUSH2 0x19B7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1673 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4296 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1401 DUP3 PUSH2 0x2ACE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x16DB DUP5 DUP5 DUP5 PUSH2 0x2E66 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x16EB PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16FC PUSH2 0x19B7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1745 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4296 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x174E DUP2 PUSH2 0x2A93 JUMP JUMPDEST POP JUMP JUMPDEST CALLER PUSH2 0x175B DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH2 0x179A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42DD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO PUSH2 0x1874 JUMPI PUSH1 0x0 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP7 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x17F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x180C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1822 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x1834 DUP7 CALLER DUP5 DUP5 PUSH2 0x2EC0 JUMP JUMPDEST SWAP1 POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1866 JUMPI PUSH2 0x1863 CALLER PUSH2 0x185D DUP5 DUP8 PUSH2 0x2CE6 JUMP JUMPDEST DUP4 PUSH2 0x2F4F JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x1871 DUP7 CALLER DUP4 PUSH2 0x2F95 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x189E JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x18F5 JUMPI PUSH2 0x18F5 DUP4 CALLER CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1237 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1917 JUMPI POP PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xD96 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP7 SWAP1 MSTORE CALLER PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xB2210957 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x197F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1993 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x19AB DUP6 DUP6 DUP6 PUSH2 0x3133 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x97 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x19DD PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x19EE PUSH2 0x19B7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1A37 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4296 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x174E DUP2 PUSH2 0x32D1 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1AA7 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1A89 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1B08 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B1C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1B32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1B4E JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x1404 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x10DFA58 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1B9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1BB1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1BC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x1BDB JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x1404 JUMP JUMPDEST PUSH2 0x16DB DUP5 DUP3 PUSH2 0x33E4 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x1C3F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP3 PUSH2 0x1C4E DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH2 0x1C8D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42DD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1C9B DUP9 DUP8 DUP10 PUSH2 0x3133 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0x1CDE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42B6 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1CE9 DUP9 DUP8 DUP4 PUSH2 0x3405 JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x631B5DFB PUSH2 0x1D00 PUSH2 0x2770 JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1D58 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D6C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 PUSH2 0x1D85 DUP4 DUP10 PUSH2 0x2CE6 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1D92 DUP3 PUSH2 0x2BA0 JUMP JUMPDEST SWAP1 POP PUSH2 0x1DA1 DUP11 DUP3 PUSH2 0x1399 PUSH2 0x2C1E JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1DBD PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP14 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE DUP1 DUP3 ADD DUP10 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x271704A58FD2953E49B87D67A0A3CE28A58147DE98A5457F60B4686F6385030 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH2 0x1E26 DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH2 0x1E65 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42DD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1E6D PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E7E PUSH2 0x19B7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1EC7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4296 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP6 AND DUP1 DUP4 MSTORE DUP7 DUP3 AND PUSH1 0x20 DUP1 DUP6 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9E DUP5 MSTORE DUP9 SWAP1 KECCAK256 SWAP7 MLOAD DUP8 SLOAD SWAP3 MLOAD DUP8 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP1 DUP8 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP6 AND OR SWAP1 SWAP5 SSTORE DUP5 MLOAD SWAP3 DUP4 MSTORE SWAP3 DUP3 ADD MSTORE DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 MLOAD PUSH32 0xFB0BA2CF86A2B03BCF387753A2192DA80A006AFA99DD022BB301C78E323BF1B9 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA1B PUSH2 0x34C6 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1FA4 JUMPI POP PUSH2 0x1FA4 PUSH2 0x2811 JUMP JUMPDEST DUP1 PUSH2 0x1FB2 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1FED JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4247 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2018 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x202A DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3526 JUMP JUMPDEST PUSH2 0x2065 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x36 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x434D PUSH1 0x36 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x2070 DUP6 DUP6 DUP6 PUSH2 0xFA8 JUMP JUMPDEST PUSH1 0xA0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH4 0xC89039C5 PUSH1 0xE0 SHL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP3 ADD DUP2 MSTORE SWAP2 DUP4 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP5 SWAP4 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x20E3 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x20C4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x2143 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x2148 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2188 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4189 PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH32 0x7A0CA506EDC9FCD36E010DBCAAD57DADE17BBAC71DFEB53269077098E863EECA SWAP1 PUSH1 0x0 SWAP1 LOG2 POP DUP1 ISZERO PUSH2 0x21CF JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP3 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND SWAP1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x225E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP2 PUSH2 0x226D DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH2 0x22AC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42DD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP4 PUSH2 0x22B6 DUP2 PUSH2 0x352C JUMP JUMPDEST PUSH2 0x2307 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F657863656564732D6C69717569646974792D63617000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2311 PUSH2 0x2770 JUMP JUMPDEST SWAP1 POP PUSH2 0x231F DUP8 DUP8 DUP8 DUP8 PUSH2 0x2D48 JUMP JUMPDEST PUSH2 0x233E DUP2 ADDRESS DUP9 PUSH2 0x232D PUSH2 0x2C1E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 SWAP1 PUSH2 0x3550 JUMP JUMPDEST PUSH2 0x2347 DUP7 PUSH2 0x35AA JUMP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6CE569498E0F86F147466AC49211CB2A1FFE06195ADB805E383B3F2365109160 DUP10 DUP9 PUSH1 0x40 MLOAD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x2415 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE PUSH1 0x0 PUSH2 0x2424 PUSH2 0x2665 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2430 PUSH2 0x34C6 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 DUP3 GT PUSH2 0x2442 JUMPI PUSH1 0x0 PUSH2 0x244C JUMP JUMPDEST PUSH2 0x244C DUP3 DUP5 PUSH2 0x2CE6 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x9D SLOAD DUP3 GT PUSH2 0x2460 JUMPI PUSH1 0x0 PUSH2 0x246E JUMP JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x246E SWAP1 DUP4 SWAP1 PUSH2 0x2CE6 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x2520 JUMPI PUSH1 0x0 PUSH2 0x2481 DUP3 PUSH2 0x1AB7 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x24DB JUMPI PUSH1 0x9B SLOAD PUSH2 0x2496 SWAP1 DUP3 PUSH2 0x363A JUMP JUMPDEST PUSH1 0x9B SSTORE PUSH2 0x24A3 DUP3 DUP3 PUSH2 0x2CE6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 POP PUSH32 0x5F1703CCFA2730D4245350F228079926A37F26A44ECF6978A7EEAFFF0AF11407 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x24E8 SWAP1 DUP4 PUSH2 0x363A JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xCE2B6E507C7CA1A20CE136810F524EEFC19BA4C7E4866EB6CC0CBA76E778D4BE SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH1 0x9D SLOAD SWAP5 POP POP POP POP POP PUSH1 0x1 PUSH1 0x65 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x9B SLOAD DUP2 JUMP JUMPDEST PUSH2 0x253F PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2550 PUSH2 0x19B7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2599 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4296 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x25DE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x41B2 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA1B PUSH2 0x2C1E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x9B SLOAD SWAP1 POP PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x26C5 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x26A7 JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2767 JUMPI PUSH2 0x275D DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x26EA JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x272A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x273E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2754 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP6 SWAP1 PUSH2 0x363A JUMP JUMPDEST SWAP4 POP PUSH1 0x1 ADD PUSH2 0x26D3 JUMP JUMPDEST POP SWAP2 SWAP3 POP POP POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x277F DUP4 PUSH2 0x27FC JUMP JUMPDEST PUSH2 0x27D0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x27DD JUMPI POP PUSH1 0x0 PUSH2 0x27F5 JUMP JUMPDEST PUSH2 0x27F1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP6 DUP5 PUSH2 0x2C94 JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND SWAP2 AND EQ ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x281C ADDRESS PUSH2 0x3526 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF77C4791 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2865 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2879 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x288F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x28EC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F746F6B656E2D6374726C722D6D69736D617463680000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x98 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x28FA JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 DUP5 AND SWAP2 PUSH32 0x460E712B4A5D801D031ED673DEA209B73AB854F7DDEB86B6C48082E92C3EEE66 SWAP2 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2966 JUMPI POP PUSH2 0x2966 PUSH2 0x2811 JUMP JUMPDEST DUP1 PUSH2 0x2974 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x29AF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4247 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x29DA JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x29E2 PUSH2 0x3694 JUMP JUMPDEST PUSH2 0x29EA PUSH2 0x3734 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x174E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2A17 JUMPI POP PUSH2 0x2A17 PUSH2 0x2811 JUMP JUMPDEST DUP1 PUSH2 0x2A25 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2A60 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4247 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2A8B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x29EA PUSH2 0x382D JUMP JUMPDEST PUSH1 0x9C DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3FF20538222F568F27FF436C0C49DFD3E48D5B8F86533A3F759DC1C7089775AB SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2B28 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2B0A JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2B7F JUMPI DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2B54 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x2B77 JUMPI PUSH1 0x1 SWAP4 POP POP POP POP PUSH2 0x1404 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2B36 JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xD96 DUP5 DUP5 PUSH2 0x2B9B DUP8 DUP8 DUP8 DUP8 PUSH2 0x2EC0 JUMP JUMPDEST PUSH2 0x2F95 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH3 0x982A61 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x13054C2 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2BEC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2C00 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2C16 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xC89039C5 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xC89039C5 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2C63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2C77 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2C8D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xAD9 SWAP1 DUP5 SWAP1 PUSH2 0x38D3 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2D3D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2DD7 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE DUP6 DUP2 AND PUSH1 0x44 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x4D7F3DB0 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2DBE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2DD2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5D7B0758 DUP6 DUP6 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x197F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x27F5 SWAP1 DUP4 SWAP1 PUSH2 0x2E61 SWAP1 DUP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x33E4 JUMP JUMPDEST PUSH2 0x3984 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2E9C SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x33E4 JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x2EAD JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x27F5 JUMP JUMPDEST PUSH2 0x2EB7 DUP4 DUP3 PUSH2 0x39A9 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP3 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x2F03 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x2F45 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2F10 DUP9 DUP9 DUP9 PUSH2 0x3A10 JUMP JUMPDEST DUP3 SLOAD SWAP1 SWAP2 POP PUSH2 0x2F41 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x2F3C SWAP1 DUP10 SWAP1 PUSH2 0x2F36 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP8 PUSH2 0x363A JUMP JUMPDEST SWAP1 PUSH2 0x363A JUMP JUMPDEST PUSH2 0x2F4F JUMP JUMPDEST SWAP3 POP POP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2F7E SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x33E4 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x2F8C JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE DUP2 SWAP1 KECCAK256 SLOAD DUP2 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 DUP1 PUSH2 0x2FDA DUP5 PUSH2 0x3AC1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2FF8 PUSH2 0x2FF3 PUSH2 0x3B09 JUMP JUMPDEST PUSH2 0x3B0D JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP3 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 DUP11 AND DUP3 MSTORE SWAP2 DUP5 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP5 DUP7 ADD MLOAD SWAP6 SWAP1 SWAP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH4 0xFFFFFFFF PUSH1 0xC0 SHL NOT AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP5 SWAP1 SWAP3 AND SWAP4 SWAP1 SWAP4 MUL OR PUSH1 0xFF PUSH1 0xE0 SHL NOT AND PUSH1 0x1 PUSH1 0xE0 SHL SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE DUP2 DUP2 LT ISZERO PUSH2 0x30DB JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0x2F92D56910619B38BC29FD8E4CA5E56359EDAC7A0C086CDCD305FB603FA37491 PUSH2 0x30C5 DUP6 DUP6 PUSH2 0x2CE6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 PUSH2 0xD96 JUMP JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0xD96 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF PUSH2 0x311C DUP5 DUP7 PUSH2 0x2CE6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3185 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3199 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x31AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x3201 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F696E737566662D66756E6473 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x320E DUP7 DUP7 DUP4 PUSH1 0x0 PUSH2 0x2B8A JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3223 DUP7 PUSH2 0x321E DUP5 DUP9 PUSH2 0x2CE6 JUMP JUMPDEST PUSH2 0x2E2E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP3 GT PUSH2 0x329A JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x3297 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2CE6 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x32A6 DUP9 DUP9 PUSH2 0x2E2E JUMP JUMPDEST SWAP1 POP DUP1 DUP3 GT PUSH2 0x32B5 JUMPI DUP2 PUSH2 0x32B7 JUMP JUMPDEST DUP1 JUMPDEST SWAP5 POP PUSH2 0x32C3 DUP2 DUP7 PUSH2 0x2CE6 JUMP JUMPDEST SWAP6 POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x332C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D6E6F742D7A65726F PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x3349 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3B51 JUMP JUMPDEST PUSH2 0x339A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D696E76616C696400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x99 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x7F58DC86BC2E435CB77CA0EDB1DF55E25F90CAF2D6BD866971715437D456A212 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x33F1 DUP4 DUP6 PUSH2 0x3B6D JUMP JUMPDEST SWAP1 POP PUSH2 0x16DB DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x3BC6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x3447 SWAP1 PUSH2 0x3442 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2CE6 JUMP JUMPDEST PUSH2 0x3AC1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB99152D PUSH1 0xE4 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xB99152D0 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3512 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2C77 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3537 PUSH2 0x2665 JUMP JUMPDEST PUSH1 0x9C SLOAD SWAP1 SWAP2 POP PUSH2 0x3547 DUP3 DUP6 PUSH2 0x363A JUMP JUMPDEST GT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x24 DUP4 ADD MSTORE DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x84 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xD96 SWAP1 DUP6 SWAP1 PUSH2 0x38D3 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH2 0x35D3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH2 0x35C3 PUSH2 0x2C1E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x3C08 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x87A6EEEF PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x87A6EEEF SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3626 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x21CF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x27F5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x36AD JUMPI POP PUSH2 0x36AD PUSH2 0x2811 JUMP JUMPDEST DUP1 PUSH2 0x36BB JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x36F6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4247 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x29EA JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x174E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x374D JUMPI POP PUSH2 0x374D PUSH2 0x2811 JUMP JUMPDEST DUP1 PUSH2 0x375B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3796 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4247 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x37C1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x37CB PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x174E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3846 JUMPI POP PUSH2 0x3846 PUSH2 0x2811 JUMP JUMPDEST DUP1 PUSH2 0x3854 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x388F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4247 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x38BA JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x65 SSTORE DUP1 ISZERO PUSH2 0x174E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x3928 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3D1B SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xAD9 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3947 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xAD9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4323 PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3993 DUP5 PUSH1 0x9A SLOAD PUSH2 0x33E4 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x39A1 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x39FF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x3A08 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xC0 SHL DUP2 DIV PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x3A5E JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x27F5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A72 DUP3 PUSH2 0x3A6C PUSH2 0x3B09 JUMP JUMPDEST SWAP1 PUSH2 0x2CE6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x3AAA SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3B6D JUMP JUMPDEST SWAP1 POP PUSH2 0x3AB6 DUP6 DUP3 PUSH2 0x33E4 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x3B05 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x41D8 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST TIMESTAMP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x20 SHL DUP3 LT PUSH2 0x3B05 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42FD PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3B5C DUP4 PUSH2 0x3D2A JUMP JUMPDEST DUP1 ISZERO PUSH2 0x27F5 JUMPI POP PUSH2 0x27F5 DUP4 DUP4 PUSH2 0x3D5D JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3B7C JUMPI POP PUSH1 0x0 PUSH2 0x2D42 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x3B89 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x27F5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4275 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x27F5 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x3D80 JUMP JUMPDEST DUP1 ISZERO DUP1 PUSH2 0x3C8E JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH4 0x6EB1769F PUSH1 0xE1 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 DUP6 AND SWAP2 PUSH4 0xDD62ED3E SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3C60 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3C74 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3C8A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO JUMPDEST PUSH2 0x3CC9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x36 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4383 PUSH1 0x36 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x95EA7B3 PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xAD9 SWAP1 DUP5 SWAP1 PUSH2 0x38D3 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x16DB DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x3E22 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3D3D DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3D5D JUMP JUMPDEST DUP1 ISZERO PUSH2 0x1401 JUMPI POP PUSH2 0x3D56 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3D5D JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x3D6C DUP6 DUP6 PUSH2 0x3F73 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x2EB7 JUMPI POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x3E0C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3DD1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3DB9 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3DFE JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x3E18 JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x3E63 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4221 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3E6C DUP6 PUSH2 0x3526 JUMP JUMPDEST PUSH2 0x3EBD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3EFC JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3EDD JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3F5E JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3F63 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x3AB6 DUP3 DUP3 DUP7 PUSH2 0x40A7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x24 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP3 DUP5 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND SWAP3 PUSH2 0x7530 SWAP3 DUP8 SWAP3 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3FFB JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3FDC JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x405C JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4061 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x407F JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x40A0 JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4095 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x40B6 JUMPI POP DUP2 PUSH2 0x27F5 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x40C6 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x3DD1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3DB9 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x4162 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x4162 JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x412D JUMP JUMPDEST POP PUSH2 0x3B05 SWAP3 SWAP2 POP JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x3B05 JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x416A JUMP INVALID MSIZE PUSH10 0x656C64536F7572636550 PUSH19 0x697A65506F6F6C2F696E76616C69642D796965 PUSH13 0x642D736F757263654F776E6162 PUSH13 0x653A206E6577206F776E657220 PUSH10 0x7320746865207A65726F KECCAK256 PUSH2 0x6464 PUSH19 0x65737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E2031323820626974735072697A65 POP PUSH16 0x6F6C2F72657365727665526567697374 PUSH19 0x792D6E6F742D7A65726F416464726573733A20 PUSH10 0x6E73756666696369656E PUSH21 0x2062616C616E636520666F722063616C6C496E6974 PUSH10 0x616C697A61626C653A20 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 MSTORE8 PUSH2 0x6665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F774F776E61626C653A20 PUSH4 0x616C6C65 PUSH19 0x206973206E6F7420746865206F776E65725072 PUSH10 0x7A65506F6F6C2F657869 PUSH21 0x2D6665652D657863656564732D757365722D6D6178 PUSH10 0x6D756D5072697A65506F PUSH16 0x6C2F756E6B6E6F776E2D746F6B656E00 STOP STOP STOP STOP STOP STOP STOP STOP MSTORE8 PUSH2 0x6665 NUMBER PUSH2 0x7374 GASPRICE KECCAK256 PUSH23 0x616C756520646F65736E27742066697420696E20333220 PUSH3 0x697473 MSTORE8 PUSH2 0x6665 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x7563636565645969656C64536F75726365507269 PUSH27 0x65506F6F6C2F7969656C642D736F757263652D6E6F742D636F6E74 PUSH19 0x6163742D616464726573735361666545524332 ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F76652066726F6D206E6F6E2D7A65726F2074 PUSH16 0x206E6F6E2D7A65726F20616C6C6F7761 PUSH15 0x63655072697A65506F6F6C2F6F6E6C PUSH26 0x2D7072697A65537472617465677900000000A264697066735822 SLT KECCAK256 CODESIZE 0xDA 0x21 DUP12 0xCD 0xE0 REVERT MUL 0x49 SLT 0xBF 0xB2 MUL 0xD7 DUP1 SELFBALANCE 0xE0 DUP4 DUP13 0xC1 SELFDESTRUCT 0xFB 0xB9 KECCAK256 INVALID PUSH25 0x9D126BD83F7B64736F6C634300060C00330000000000000000 ",
              "sourceMap": "404:2999:45:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106102325760003560e01c80638da5cb5b11610130578063b2470e5c116100b8578063e6d8a94b1161007c578063e6d8a94b14610956578063edb4e1cf1461095e578063f2fde38b14610966578063fc0c546a1461098c578063ffa1ad741461099457610232565b8063b2470e5c146107f6578063b69ef8a8146107fe578063cfa2400714610806578063d4a1361d146108c5578063e323f8251461091a57610232565b80639d63848a116100ff5780639d63848a146107025780639e1675191461075a5780639fe32a9114610762578063a016240b1461077f578063a7b2cc31146107b957610232565b80638da5cb5b146106a85780638e71c1f6146106cc57806391ca480e146106d457806398bf3eb6146106fa57610232565b8063630665b4116101be57806378b3d3271161018257806378b3d327146105ae57806379cb8563146105d45780637b99adb1146106065780637cbab1c714610623578063888c2b6f1461065957610232565b8063630665b4146105265780636a3fd4f91461052e5780636b1b863a14610568578063715018a61461059e57806376687d3d146105a657610232565b80632b0ab144116102055780632b0ab144146103bb5780632f7627e3146103f15780633ede50c61461041f578063494de9f7146104d257806352a387ab1461050057610232565b80630937eb541461023757806313f55e3914610251578063150b7a021461028957806316960d5514610334575b600080fd5b61023f610a11565b60408051918252519081900360200190f35b6102876004803603606081101561026757600080fd5b506001600160a01b03813581169160208101359091169060400135610a20565b005b6103176004803603608081101561029f57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156102d957600080fd5b8201836020820111156102eb57600080fd5b803590602001918460018302840111600160201b8311171561030c57600080fd5b509092509050610ade565b604080516001600160e01b03199092168252519081900360200190f35b6102876004803603606081101561034a57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561037d57600080fd5b82018360208201111561038f57600080fd5b803590602001918460208302840111600160201b831117156103b057600080fd5b509092509050610aef565b610287600480360360608110156103d157600080fd5b506001600160a01b03813581169160208101359091169060400135610d9c565b6102876004803603604081101561040757600080fd5b506001600160a01b0381358116916020013516610e59565b6102876004803603606081101561043557600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561045f57600080fd5b82018360208201111561047157600080fd5b803590602001918460208302840111600160201b8311171561049257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250610fa8915050565b61023f600480360360408110156104e857600080fd5b506001600160a01b038135811691602001351661119a565b61023f6004803603602081101561051657600080fd5b50356001600160a01b03166112a1565b61023f6113f0565b6105546004803603602081101561054457600080fd5b50356001600160a01b03166113f6565b604080519115158252519081900360200190f35b6102876004803603606081101561057e57600080fd5b506001600160a01b03813581169160208101359160409091013516611409565b610287611611565b61023f6116bd565b610554600480360360208110156105c457600080fd5b50356001600160a01b03166116c3565b61023f600480360360608110156105ea57600080fd5b506001600160a01b0381351690602081013590604001356116ce565b6102876004803603602081101561061c57600080fd5b50356116e3565b6102876004803603606081101561063957600080fd5b506001600160a01b03813581169160208101359091169060400135611751565b61068f6004803603606081101561066f57600080fd5b506001600160a01b0381358116916020810135909116906040013561199d565b6040805192835260208301919091528051918290030190f35b6106b06119b7565b604080516001600160a01b039092168252519081900360200190f35b6106b06119c6565b610287600480360360208110156106ea57600080fd5b50356001600160a01b03166119d5565b6106b0611a40565b61070a611a4f565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561074657818101518382015260200161072e565b505050509050019250505060405180910390f35b61023f611ab1565b61023f6004803603602081101561077857600080fd5b5035611ab7565b61023f6004803603608081101561079557600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611be5565b610287600480360360608110156107cf57600080fd5b506001600160a01b03813516906001600160801b0360208201358116916040013516611e1c565b6106b0611f72565b61023f611f81565b6102876004803603608081101561081c57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561084657600080fd5b82018360208201111561085857600080fd5b803590602001918460208302840111600160201b8311171561087957600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602001356001600160a01b0316611f8b565b6108eb600480360360208110156108db57600080fd5b50356001600160a01b03166121d6565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b6102876004803603608081101561093057600080fd5b506001600160a01b03813581169160208101359160408201358116916060013516612206565b61023f6123bb565b61023f612531565b6102876004803603602081101561097c57600080fd5b50356001600160a01b0316612537565b6106b061263a565b61099c612644565b6040805160208082528351818301528351919283929083019185019080838360005b838110156109d65781810151838201526020016109be565b50505050905090810190601f168015610a035780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610a1b612665565b905090565b6099546001600160a01b0316610a34612770565b6001600160a01b031614610a7d576040805162461bcd60e51b815260206004820152601c60248201526000805160206143b9833981519152604482015290519081900360640190fd5b610a88838383612774565b15610ad957816001600160a01b0316836001600160a01b03167fb0bac59718cd343c80a813518afcf36846cfcfe6d56e2b3cab9bd49f5f9b251c836040518082815260200191505060405180910390a35b505050565b630a85bd0160e11b95945050505050565b6099546001600160a01b0316610b03612770565b6001600160a01b031614610b4c576040805162461bcd60e51b815260206004820152601c60248201526000805160206143b9833981519152604482015290519081900360640190fd5b610b55836127fc565b610ba6576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b80610bb057610d96565b60005b81811015610d1d57836001600160a01b03166342842e0e3087868686818110610bd857fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610c3557600080fd5b505af1925050508015610c46575060015b610d15573d808015610c74576040519150601f19603f3d011682016040523d82523d6000602084013e610c79565b606091505b507f17e975018310f88872b58d4d8263adca83cf5c1893496ea2a86923dab15276ad816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610cd9578181015183820152602001610cc1565b50505050905090810190601f168015610d065780820380516001836020036101000a031916815260200191505b509250505060405180910390a1505b600101610bb3565b50826001600160a01b0316846001600160a01b03167f69c2de32bc4d47f488e72626a6cfdee85089342e52675e7de79c4b417623960c848460405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a35b50505050565b6099546001600160a01b0316610db0612770565b6001600160a01b031614610df9576040805162461bcd60e51b815260206004820152601c60248201526000805160206143b9833981519152604482015290519081900360640190fd5b610e04838383612774565b15610ad957816001600160a01b0316836001600160a01b03167fc65f48aca3b7a99b7443d04b8ffbb073156179bc628dc3f7def5047748973469836040518082815260200191505060405180910390a3505050565b610e61612770565b6001600160a01b0316610e726119b7565b6001600160a01b031614610ebb576040805162461bcd60e51b81526020600482018190526024820152600080516020614296833981519152604482015290519081900360640190fd5b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f0a57600080fd5b505afa158015610f1e573d6000803e3d6000fd5b505050506040513d6020811015610f3457600080fd5b50511115610fa457816001600160a01b0316635c19a95c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015610f8b57600080fd5b505af1158015610f9f573d6000803e3d6000fd5b505050505b5050565b600054610100900460ff1680610fc15750610fc1612811565b80610fcf575060005460ff16155b61100a5760405162461bcd60e51b815260040180806020018281038252602e815260200180614247602e913960400191505060405180910390fd5b600054610100900460ff16158015611035576000805460ff1961ff0019909116610100171660011790555b6001600160a01b03841661107a5760405162461bcd60e51b81526004018080602001828103825260228152602001806141ff6022913960400191505060405180910390fd5b82518067ffffffffffffffff8111801561109357600080fd5b506040519080825280602002602001820160405280156110bd578160200160208202803683370190505b5080516110d29160989160209091019061410d565b5060005b818110156111095760008582815181106110ec57fe5b602002602001015190506111008183612822565b506001016110d6565b5061111261294d565b61111a6129fe565b611125600019612a93565b609780546001600160a01b0319166001600160a01b038716908117909155609a849055604080519182526020820185905280517f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce799281900390910190a1508015610d96576000805461ff001916905550505050565b6000816111a681612ace565b6111e5576040805162461bcd60e51b815260206004820152601760248201526000805160206142dd833981519152604482015290519081900360640190fd5b61126a8484856001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d602081101561126157600080fd5b50516000612b8a565b50506001600160a01b039081166000908152609f60209081526040808320949093168252929092529020546001600160c01b031690565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112f257600080fd5b505afa158015611306573d6000803e3d6000fd5b505050506040513d602081101561131c57600080fd5b505190506001600160a01b0381163314611376576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f6f6e6c792d7265736572766560501b604482015290519081900360640190fd5b609b80546000918290559061138a82612ba0565b90506113a98582611399612c1e565b6001600160a01b03169190612c94565b6040805183815290516001600160a01b038716917f1c71c8e11fd443227c8f8d3dc1a237a3a5e8310b540c7fbcf5169754aedf42c9919081900360200190a2949350505050565b609d5490565b6000611401826127fc565b90505b919050565b6099546001600160a01b031661141d612770565b6001600160a01b031614611466576040805162461bcd60e51b815260206004820152601c60248201526000805160206143b9833981519152604482015290519081900360640190fd5b8061147081612ace565b6114af576040805162461bcd60e51b815260206004820152601760248201526000805160206142dd833981519152604482015290519081900360640190fd5b826114b957610d96565b609d54831115611510576040805162461bcd60e51b815260206004820152601d60248201527f5072697a65506f6f6c2f61776172642d657863656564732d617661696c000000604482015290519081900360640190fd5b609d5461151d9084612ce6565b609d5561152d8484846000612d48565b60006115398385612e2e565b90506115bf8584856001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561158d57600080fd5b505afa1580156115a1573d6000803e3d6000fd5b505050506040513d60208110156115b757600080fd5b505184612b8a565b826001600160a01b0316856001600160a01b03167fe2554529d99ab7a67db6b4cea2b32c7d55ae325f958861e05f304fdded867e31866040518082815260200191505060405180910390a35050505050565b611619612770565b6001600160a01b031661162a6119b7565b6001600160a01b031614611673576040805162461bcd60e51b81526020600482018190526024820152600080516020614296833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b609c5481565b600061140182612ace565b60006116db848484612e66565b949350505050565b6116eb612770565b6001600160a01b03166116fc6119b7565b6001600160a01b031614611745576040805162461bcd60e51b81526020600482018190526024820152600080516020614296833981519152604482015290519081900360640190fd5b61174e81612a93565b50565b3361175b81612ace565b61179a576040805162461bcd60e51b815260206004820152601760248201526000805160206142dd833981519152604482015290519081900360640190fd5b6001600160a01b03841615611874576000336001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156117f857600080fd5b505afa15801561180c573d6000803e3d6000fd5b505050506040513d602081101561182257600080fd5b50519050600061183486338484612ec0565b9050846001600160a01b0316866001600160a01b031614611866576118633361185d8487612ce6565b83612f4f565b90505b611871863383612f95565b50505b6001600160a01b0383161580159061189e5750836001600160a01b0316836001600160a01b031614155b156118f5576118f58333336001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561123757600080fd5b6001600160a01b0384161580159061191757506099546001600160a01b031615155b15610d96576099546040805163b221095760e01b81526001600160a01b0387811660048301528681166024830152604482018690523360648301529151919092169163b221095791608480830192600092919082900301818387803b15801561197f57600080fd5b505af1158015611993573d6000803e3d6000fd5b5050505050505050565b6000806119ab858585613133565b90969095509350505050565b6033546001600160a01b031690565b6097546001600160a01b031681565b6119dd612770565b6001600160a01b03166119ee6119b7565b6001600160a01b031614611a37576040805162461bcd60e51b81526020600482018190526024820152600080516020614296833981519152604482015290519081900360640190fd5b61174e816132d1565b6099546001600160a01b031681565b60606098805480602002602001604051908101604052809291908181526020018280548015611aa757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a89575b5050505050905090565b609a5481565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b0857600080fd5b505afa158015611b1c573d6000803e3d6000fd5b505050506040513d6020811015611b3257600080fd5b505190506001600160a01b038116611b4e576000915050611404565b6000816001600160a01b031663010dfa58306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611b9d57600080fd5b505afa158015611bb1573d6000803e3d6000fd5b505050506040513d6020811015611bc757600080fd5b5051905080611bdb57600092505050611404565b6116db84826133e4565b600060026065541415611c3f576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655582611c4e81612ace565b611c8d576040805162461bcd60e51b815260206004820152601760248201526000805160206142dd833981519152604482015290519081900360640190fd5b600080611c9b888789613133565b9150915084821115611cde5760405162461bcd60e51b81526004018080602001828103825260278152602001806142b66027913960400191505060405180910390fd5b611ce9888783613405565b856001600160a01b031663631b5dfb611d00612770565b8a8a6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611d5857600080fd5b505af1158015611d6c573d6000803e3d6000fd5b505050506000611d858389612ce690919063ffffffff16565b90506000611d9282612ba0565b9050611da18a82611399612c1e565b876001600160a01b03168a6001600160a01b0316611dbd612770565b604080518d81526020810186905280820189905290516001600160a01b0392909216917f0271704a58fd2953e49b87d67a0a3ce28a58147de98a5457f60b4686f63850309181900360600190a450506001606555509695505050505050565b82611e2681612ace565b611e65576040805162461bcd60e51b815260206004820152601760248201526000805160206142dd833981519152604482015290519081900360640190fd5b611e6d612770565b6001600160a01b0316611e7e6119b7565b6001600160a01b031614611ec7576040805162461bcd60e51b81526020600482018190526024820152600080516020614296833981519152604482015290519081900360640190fd5b6040805180820182526001600160801b0380851680835286821660208085018281526001600160a01b038b166000818152609e84528890209651875492518716600160801b029087166fffffffffffffffffffffffffffffffff1990931692909217909516179094558451928352928201528083019190915290517ffb0ba2cf86a2b03bcf387753a2192da80a006afa99dd022bb301c78e323bf1b99181900360600190a150505050565b60a0546001600160a01b031681565b6000610a1b6134c6565b600054610100900460ff1680611fa45750611fa4612811565b80611fb2575060005460ff16155b611fed5760405162461bcd60e51b815260040180806020018281038252602e815260200180614247602e913960400191505060405180910390fd5b600054610100900460ff16158015612018576000805460ff1961ff0019909116610100171660011790555b61202a826001600160a01b0316613526565b6120655760405162461bcd60e51b815260040180806020018281038252603681526020018061434d6036913960400191505060405180910390fd5b612070858585610fa8565b60a080546001600160a01b0319166001600160a01b0384169081179091556040805163c89039c560e01b60208083019190915282518083038201815291830192839052815160009493918291908401908083835b602083106120e35780518252601f1990920191602091820191016120c4565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114612143576040519150601f19603f3d011682016040523d82523d6000602084013e612148565b606091505b50509050806121885760405162461bcd60e51b81526004018080602001828103825260298152602001806141896029913960400191505060405180910390fd5b6040516001600160a01b038416907f7a0ca506edc9fcd36e010dbcaad57dade17bbac71dfeb53269077098e863eeca90600090a25080156121cf576000805461ff00191690555b5050505050565b6001600160a01b03166000908152609e60205260409020546001600160801b0380821692600160801b9092041690565b6002606554141561225e576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026065558161226d81612ace565b6122ac576040805162461bcd60e51b815260206004820152601760248201526000805160206142dd833981519152604482015290519081900360640190fd5b836122b68161352c565b612307576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f657863656564732d6c69717569646974792d63617000604482015290519081900360640190fd5b6000612311612770565b905061231f87878787612d48565b61233e81308861232d612c1e565b6001600160a01b0316929190613550565b612347866135aa565b846001600160a01b0316876001600160a01b0316826001600160a01b03167f6ce569498e0f86f147466ac49211cb2a1ffe06195adb805e383b3f2365109160898860405180838152602001826001600160a01b031681526020019250505060405180910390a4505060016065555050505050565b600060026065541415612415576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026065556000612424612665565b905060006124306134c6565b9050600082821161244257600061244c565b61244c8284612ce6565b90506000609d54821161246057600061246e565b609d5461246e908390612ce6565b9050801561252057600061248182611ab7565b905080156124db57609b54612496908261363a565b609b556124a38282612ce6565b6040805183815290519193507f5f1703ccfa2730d4245350f228079926a37f26a44ecf6978a7eeafff0af11407919081900360200190a15b609d546124e8908361363a565b609d556040805183815290517fce2b6e507c7ca1a20ce136810f524eefc19ba4c7e4866eb6cc0cba76e778d4be9181900360200190a1505b609d54945050505050600160655590565b609b5481565b61253f612770565b6001600160a01b03166125506119b7565b6001600160a01b031614612599576040805162461bcd60e51b81526020600482018190526024820152600080516020614296833981519152604482015290519081900360640190fd5b6001600160a01b0381166125de5760405162461bcd60e51b81526004018080602001828103825260268152602001806141b26026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610a1b612c1e565b60405180604001604052806005815260200164332e342e3560d81b81525081565b600080609b549050606060988054806020026020016040519081016040528092919081815260200182805480156126c557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116126a7575b505083519394506000925050505b818110156127675761275d8382815181106126ea57fe5b60200260200101516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561272a57600080fd5b505afa15801561273e573d6000803e3d6000fd5b505050506040513d602081101561275457600080fd5b5051859061363a565b93506001016126d3565b50919250505090565b3390565b600061277f836127fc565b6127d0576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b816127dd575060006127f5565b6127f16001600160a01b0384168584612c94565b5060015b9392505050565b60a0546001600160a01b039081169116141590565b600061281c30613526565b15905090565b306001600160a01b0316826001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b15801561286557600080fd5b505afa158015612879573d6000803e3d6000fd5b505050506040513d602081101561288f57600080fd5b50516001600160a01b0316146128ec576040805162461bcd60e51b815260206004820152601e60248201527f5072697a65506f6f6c2f746f6b656e2d6374726c722d6d69736d617463680000604482015290519081900360640190fd5b81609882815481106128fa57fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051918416917f460e712b4a5d801d031ed673dea209b73ab854f7ddeb86b6c48082e92c3eee669190a25050565b600054610100900460ff16806129665750612966612811565b80612974575060005460ff16155b6129af5760405162461bcd60e51b815260040180806020018281038252602e815260200180614247602e913960400191505060405180910390fd5b600054610100900460ff161580156129da576000805460ff1961ff0019909116610100171660011790555b6129e2613694565b6129ea613734565b801561174e576000805461ff001916905550565b600054610100900460ff1680612a175750612a17612811565b80612a25575060005460ff16155b612a605760405162461bcd60e51b815260040180806020018281038252602e815260200180614247602e913960400191505060405180910390fd5b600054610100900460ff16158015612a8b576000805460ff1961ff0019909116610100171660011790555b6129ea61382d565b609c8190556040805182815290517f3ff20538222f568f27ff436c0c49dfd3e48d5b8f86533a3f759dc1c7089775ab9181900360200190a150565b600060606098805480602002602001604051908101604052809291908181526020018280548015612b2857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612b0a575b505083519394506000925050505b81811015612b7f57846001600160a01b0316838281518110612b5457fe5b60200260200101516001600160a01b03161415612b775760019350505050611404565b600101612b36565b506000949350505050565b610d968484612b9b87878787612ec0565b612f95565b60a0546040805162982a6160e11b81526004810184905290516000926001600160a01b03169163013054c291602480830192602092919082900301818787803b158015612bec57600080fd5b505af1158015612c00573d6000803e3d6000fd5b505050506040513d6020811015612c1657600080fd5b505192915050565b60a0546040805163c89039c560e01b815290516000926001600160a01b03169163c89039c5916004808301926020929190829003018186803b158015612c6357600080fd5b505afa158015612c77573d6000803e3d6000fd5b505050506040513d6020811015612c8d57600080fd5b5051905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ad99084906138d3565b600082821115612d3d576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6099546001600160a01b031615612dd757609954604080516304d7f3db60e41b81526001600160a01b038781166004830152602482018790528581166044830152848116606483015291519190921691634d7f3db091608480830192600092919082900301818387803b158015612dbe57600080fd5b505af1158015612dd2573d6000803e3d6000fd5b505050505b816001600160a01b0316635d7b075885856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561197f57600080fd5b6001600160a01b0382166000908152609e60205260408120546127f5908390612e619082906001600160801b03166133e4565b613984565b6001600160a01b0383166000908152609e60205260408120548190612e9c908590600160801b90046001600160801b03166133e4565b905080612ead5760009150506127f5565b612eb783826139a9565b95945050505050565b6001600160a01b038381166000908152609f6020908152604080832093881683529290529081208054829190600160e01b900460ff16612f035760009150612f45565b6000612f10888888613a10565b8254909150612f419088908890612f3c908990612f36906001600160c01b03168761363a565b9061363a565b612f4f565b9250505b5095945050505050565b6001600160a01b0383166000908152609e60205260408120548190612f7e9085906001600160801b03166133e4565b905080831115612f8c578092505b50909392505050565b6001600160a01b038083166000908152609f602090815260408083209387168352929052819020548151606081019092526001600160c01b03169080612fda84613ac1565b6001600160801b03168152602001612ff8612ff3613b09565b613b0d565b63ffffffff908116825260016020928301526001600160a01b038681166000908152609f84526040808220928a168252918452819020845181549486015195909201516001600160c01b03199094166001600160c01b039092169190911763ffffffff60c01b1916600160c01b94909216939093021760ff60e01b1916600160e01b91151591909102179055818110156130db576001600160a01b038084169085167f2f92d56910619b38bc29fd8e4ca5e56359edac7a0c086cdcd305fb603fa374916130c58585612ce6565b60408051918252519081900360200190a3610d96565b80821015610d96576001600160a01b038084169085167ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf61311c8486612ce6565b60408051918252519081900360200190a350505050565b6000806000846001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561318557600080fd5b505afa158015613199573d6000803e3d6000fd5b505050506040513d60208110156131af57600080fd5b5051905083811015613201576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f696e737566662d66756e647360501b604482015290519081900360640190fd5b61320e8686836000612b8a565b60006132238661321e8488612ce6565b612e2e565b6001600160a01b038088166000908152609f60209081526040808320938c16835292905290812054919250906001600160c01b0316821161329a576001600160a01b038088166000908152609f60209081526040808320938c1683529290522054613297906001600160c01b031683612ce6565b90505b60006132a68888612e2e565b90508082116132b557816132b7565b805b94506132c38186612ce6565b955050505050935093915050565b6001600160a01b03811661332c576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f7072697a6553747261746567792d6e6f742d7a65726f604482015290519081900360640190fd5b6133496001600160a01b038216600162a1cb1960e01b0319613b51565b61339a576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f7072697a6553747261746567792d696e76616c696400604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0383169081179091556040517f7f58dc86bc2e435cb77ca0edb1df55e25f90caf2d6bd866971715437d456a21290600090a250565b6000806133f18385613b6d565b90506116db81670de0b6b3a7640000613bc6565b6001600160a01b038083166000908152609f602090815260408083209387168352929052205461344790613442906001600160c01b031683612ce6565b613ac1565b6001600160a01b038084166000818152609f602090815260408083209489168084529482529182902080546001600160c01b0319166001600160801b0396909616959095179094558051858152905191937ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf92918290030190a3505050565b60a05460408051630b99152d60e41b815230600482015290516000926001600160a01b03169163b99152d091602480830192602092919082900301818787803b15801561351257600080fd5b505af1158015612c77573d6000803e3d6000fd5b3b151590565b600080613537612665565b609c54909150613547828561363a565b11159392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610d969085906138d3565b60a0546135d3906001600160a01b0316826135c3612c1e565b6001600160a01b03169190613c08565b60a054604080516387a6eeef60e01b81526004810184905230602482015290516001600160a01b03909216916387a6eeef9160448082019260009290919082900301818387803b15801561362657600080fd5b505af11580156121cf573d6000803e3d6000fd5b6000828201838110156127f5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600054610100900460ff16806136ad57506136ad612811565b806136bb575060005460ff16155b6136f65760405162461bcd60e51b815260040180806020018281038252602e815260200180614247602e913960400191505060405180910390fd5b600054610100900460ff161580156129ea576000805460ff1961ff001990911661010017166001179055801561174e576000805461ff001916905550565b600054610100900460ff168061374d575061374d612811565b8061375b575060005460ff16155b6137965760405162461bcd60e51b815260040180806020018281038252602e815260200180614247602e913960400191505060405180910390fd5b600054610100900460ff161580156137c1576000805460ff1961ff0019909116610100171660011790555b60006137cb612770565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561174e576000805461ff001916905550565b600054610100900460ff16806138465750613846612811565b80613854575060005460ff16155b61388f5760405162461bcd60e51b815260040180806020018281038252602e815260200180614247602e913960400191505060405180910390fd5b600054610100900460ff161580156138ba576000805460ff1961ff0019909116610100171660011790555b6001606555801561174e576000805461ff001916905550565b6060613928826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613d1b9092919063ffffffff16565b805190915015610ad95780806020019051602081101561394757600080fd5b5051610ad95760405162461bcd60e51b815260040180806020018281038252602a815260200180614323602a913960400191505060405180910390fd5b60008061399384609a546133e4565b9050808311156139a1578092505b509092915050565b60008082116139ff576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381613a0857fe5b049392505050565b6001600160a01b038281166000908152609f60209081526040808320938716835292905290812054600160c01b810463ffffffff1690600160e01b900460ff16613a5e5760009150506127f5565b6000613a7282613a6c613b09565b90612ce6565b6001600160a01b0386166000908152609e602052604081205491925090613aaa908390600160801b90046001600160801b0316613b6d565b9050613ab685826133e4565b979650505050505050565b6000600160801b8210613b055760405162461bcd60e51b81526004018080602001828103825260278152602001806141d86027913960400191505060405180910390fd5b5090565b4290565b6000600160201b8210613b055760405162461bcd60e51b81526004018080602001828103825260268152602001806142fd6026913960400191505060405180910390fd5b6000613b5c83613d2a565b80156127f557506127f58383613d5d565b600082613b7c57506000612d42565b82820282848281613b8957fe5b04146127f55760405162461bcd60e51b81526004018080602001828103825260218152602001806142756021913960400191505060405180910390fd5b60006127f583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613d80565b801580613c8e575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015613c6057600080fd5b505afa158015613c74573d6000803e3d6000fd5b505050506040513d6020811015613c8a57600080fd5b5051155b613cc95760405162461bcd60e51b81526004018080602001828103825260368152602001806143836036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610ad99084906138d3565b60606116db8484600085613e22565b6000613d3d826301ffc9a760e01b613d5d565b80156114015750613d56826001600160e01b0319613d5d565b1592915050565b6000806000613d6c8585613f73565b91509150818015612eb75750949350505050565b60008183613e0c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613dd1578181015183820152602001613db9565b50505050905090810190601f168015613dfe5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613e1857fe5b0495945050505050565b606082471015613e635760405162461bcd60e51b81526004018080602001828103825260268152602001806142216026913960400191505060405180910390fd5b613e6c85613526565b613ebd576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613efc5780518252601f199092019160209182019101613edd565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613f5e576040519150601f19603f3d011682016040523d82523d6000602084013e613f63565b606091505b5091509150613ab68282866140a7565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b1781529151815160009384939284926060926001600160a01b038a169261753092879282918083835b60208310613ffb5780518252601f199092019160209182019101613fdc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461405c576040519150601f19603f3d011682016040523d82523d6000602084013e614061565b606091505b509150915060208151101561407f57600080945094505050506140a0565b8181806020019051602081101561409557600080fd5b505190955093505050505b9250929050565b606083156140b65750816127f5565b8251156140c65782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315613dd1578181015183820152602001613db9565b828054828255906000526020600020908101928215614162579160200282015b8281111561416257825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061412d565b50613b059291505b80821115613b055780546001600160a01b031916815560010161416a56fe5969656c64536f757263655072697a65506f6f6c2f696e76616c69642d7969656c642d736f757263654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e2031323820626974735072697a65506f6f6c2f7265736572766552656769737472792d6e6f742d7a65726f416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725072697a65506f6f6c2f657869742d6665652d657863656564732d757365722d6d6178696d756d5072697a65506f6f6c2f756e6b6e6f776e2d746f6b656e00000000000000000053616665436173743a2076616c756520646f65736e27742066697420696e20333220626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645969656c64536f757263655072697a65506f6f6c2f7969656c642d736f757263652d6e6f742d636f6e74726163742d616464726573735361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e63655072697a65506f6f6c2f6f6e6c792d7072697a65537472617465677900000000a264697066735822122038da218bcde0fd024912bfb202d78047e0838cc1fffbb920fe789d126bd83f7b64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x232 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0x130 JUMPI DUP1 PUSH4 0xB2470E5C GT PUSH2 0xB8 JUMPI DUP1 PUSH4 0xE6D8A94B GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xE6D8A94B EQ PUSH2 0x956 JUMPI DUP1 PUSH4 0xEDB4E1CF EQ PUSH2 0x95E JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x966 JUMPI DUP1 PUSH4 0xFC0C546A EQ PUSH2 0x98C JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x994 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0xB2470E5C EQ PUSH2 0x7F6 JUMPI DUP1 PUSH4 0xB69EF8A8 EQ PUSH2 0x7FE JUMPI DUP1 PUSH4 0xCFA24007 EQ PUSH2 0x806 JUMPI DUP1 PUSH4 0xD4A1361D EQ PUSH2 0x8C5 JUMPI DUP1 PUSH4 0xE323F825 EQ PUSH2 0x91A JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x9D63848A GT PUSH2 0xFF JUMPI DUP1 PUSH4 0x9D63848A EQ PUSH2 0x702 JUMPI DUP1 PUSH4 0x9E167519 EQ PUSH2 0x75A JUMPI DUP1 PUSH4 0x9FE32A91 EQ PUSH2 0x762 JUMPI DUP1 PUSH4 0xA016240B EQ PUSH2 0x77F JUMPI DUP1 PUSH4 0xA7B2CC31 EQ PUSH2 0x7B9 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x6A8 JUMPI DUP1 PUSH4 0x8E71C1F6 EQ PUSH2 0x6CC JUMPI DUP1 PUSH4 0x91CA480E EQ PUSH2 0x6D4 JUMPI DUP1 PUSH4 0x98BF3EB6 EQ PUSH2 0x6FA JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x630665B4 GT PUSH2 0x1BE JUMPI DUP1 PUSH4 0x78B3D327 GT PUSH2 0x182 JUMPI DUP1 PUSH4 0x78B3D327 EQ PUSH2 0x5AE JUMPI DUP1 PUSH4 0x79CB8563 EQ PUSH2 0x5D4 JUMPI DUP1 PUSH4 0x7B99ADB1 EQ PUSH2 0x606 JUMPI DUP1 PUSH4 0x7CBAB1C7 EQ PUSH2 0x623 JUMPI DUP1 PUSH4 0x888C2B6F EQ PUSH2 0x659 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x630665B4 EQ PUSH2 0x526 JUMPI DUP1 PUSH4 0x6A3FD4F9 EQ PUSH2 0x52E JUMPI DUP1 PUSH4 0x6B1B863A EQ PUSH2 0x568 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x59E JUMPI DUP1 PUSH4 0x76687D3D EQ PUSH2 0x5A6 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x2B0AB144 GT PUSH2 0x205 JUMPI DUP1 PUSH4 0x2B0AB144 EQ PUSH2 0x3BB JUMPI DUP1 PUSH4 0x2F7627E3 EQ PUSH2 0x3F1 JUMPI DUP1 PUSH4 0x3EDE50C6 EQ PUSH2 0x41F JUMPI DUP1 PUSH4 0x494DE9F7 EQ PUSH2 0x4D2 JUMPI DUP1 PUSH4 0x52A387AB EQ PUSH2 0x500 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x937EB54 EQ PUSH2 0x237 JUMPI DUP1 PUSH4 0x13F55E39 EQ PUSH2 0x251 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x289 JUMPI DUP1 PUSH4 0x16960D55 EQ PUSH2 0x334 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x23F PUSH2 0xA11 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x267 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xA20 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x317 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x29F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x2D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x2EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x30C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xADE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x34A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x37D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x38F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x3B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xAEF JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x3D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xD9C JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x407 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xE59 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x435 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x45F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x471 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x492 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0xFA8 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x4E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x119A JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x516 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x12A1 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x13F0 JUMP JUMPDEST PUSH2 0x554 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x544 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x13F6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x57E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 SWAP1 SWAP2 ADD CALLDATALOAD AND PUSH2 0x1409 JUMP JUMPDEST PUSH2 0x287 PUSH2 0x1611 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x16BD JUMP JUMPDEST PUSH2 0x554 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16C3 JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x5EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x16CE JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x61C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x16E3 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x639 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1751 JUMP JUMPDEST PUSH2 0x68F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x66F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x199D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB ADD SWAP1 RETURN JUMPDEST PUSH2 0x6B0 PUSH2 0x19B7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x6B0 PUSH2 0x19C6 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x19D5 JUMP JUMPDEST PUSH2 0x6B0 PUSH2 0x1A40 JUMP JUMPDEST PUSH2 0x70A PUSH2 0x1A4F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x746 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x72E JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x23F PUSH2 0x1AB1 JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x778 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1AB7 JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x795 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x1BE5 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x7CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x40 ADD CALLDATALOAD AND PUSH2 0x1E1C JUMP JUMPDEST PUSH2 0x6B0 PUSH2 0x1F72 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x1F81 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x81C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x846 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x858 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x879 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1F8B JUMP JUMPDEST PUSH2 0x8EB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x8DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x21D6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x930 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x2206 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x23BB JUMP JUMPDEST PUSH2 0x23F PUSH2 0x2531 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x97C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2537 JUMP JUMPDEST PUSH2 0x6B0 PUSH2 0x263A JUMP JUMPDEST PUSH2 0x99C PUSH2 0x2644 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x9D6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x9BE JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xA03 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xA1B PUSH2 0x2665 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xA34 PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xA7D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43B9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xA88 DUP4 DUP4 DUP4 PUSH2 0x2774 JUMP JUMPDEST ISZERO PUSH2 0xAD9 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB0BAC59718CD343C80A813518AFCF36846CFCFE6D56E2B3CAB9BD49F5F9B251C DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0xA85BD01 PUSH1 0xE1 SHL SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xB03 PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xB4C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43B9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xB55 DUP4 PUSH2 0x27FC JUMP JUMPDEST PUSH2 0xBA6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0xBB0 JUMPI PUSH2 0xD96 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xD1D JUMPI DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x42842E0E ADDRESS DUP8 DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0xBD8 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0xC46 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xD15 JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0xC74 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xC79 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH32 0x17E975018310F88872B58D4D8263ADCA83CF5C1893496EA2A86923DAB15276AD DUP2 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xCD9 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xCC1 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD06 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xBB3 JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x69C2DE32BC4D47F488E72626A6CFDEE85089342E52675E7DE79C4B417623960C DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP6 POP SWAP1 SWAP4 POP POP POP POP LOG3 JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xDB0 PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xDF9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43B9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xE04 DUP4 DUP4 DUP4 PUSH2 0x2774 JUMP JUMPDEST ISZERO PUSH2 0xAD9 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC65F48ACA3B7A99B7443D04B8FFBB073156179BC628DC3F7DEF5047748973469 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH2 0xE61 PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE72 PUSH2 0x19B7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xEBB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4296 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF0A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xF1E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xF34 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD GT ISZERO PUSH2 0xFA4 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5C19A95C DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF9F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0xFC1 JUMPI POP PUSH2 0xFC1 PUSH2 0x2811 JUMP JUMPDEST DUP1 PUSH2 0xFCF JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x100A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4247 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1035 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x107A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x41FF PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 MLOAD DUP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x1093 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x10BD JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP1 MLOAD PUSH2 0x10D2 SWAP2 PUSH1 0x98 SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x410D JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1109 JUMPI PUSH1 0x0 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x10EC JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0x1100 DUP2 DUP4 PUSH2 0x2822 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x10D6 JUMP JUMPDEST POP PUSH2 0x1112 PUSH2 0x294D JUMP JUMPDEST PUSH2 0x111A PUSH2 0x29FE JUMP JUMPDEST PUSH2 0x1125 PUSH1 0x0 NOT PUSH2 0x2A93 JUMP JUMPDEST PUSH1 0x97 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x9A DUP5 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP6 SWAP1 MSTORE DUP1 MLOAD PUSH32 0x25FF68DD81B34665B5BA7E553EE5511BF6812E12ADB4A7E2C0D9E26B3099CE79 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 POP DUP1 ISZERO PUSH2 0xD96 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x11A6 DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH2 0x11E5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42DD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x126A DUP5 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1237 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x124B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1261 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 PUSH2 0x2B8A JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP4 AND DUP3 MSTORE SWAP3 SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1306 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x131C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ PUSH2 0x1376 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F6F6E6C792D72657365727665 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9B DUP1 SLOAD PUSH1 0x0 SWAP2 DUP3 SWAP1 SSTORE SWAP1 PUSH2 0x138A DUP3 PUSH2 0x2BA0 JUMP JUMPDEST SWAP1 POP PUSH2 0x13A9 DUP6 DUP3 PUSH2 0x1399 PUSH2 0x2C1E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x2C94 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP2 PUSH32 0x1C71C8E11FD443227C8F8D3DC1A237A3A5E8310B540C7FBCF5169754AEDF42C9 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x9D SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1401 DUP3 PUSH2 0x27FC JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x141D PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1466 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43B9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x1470 DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH2 0x14AF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42DD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 PUSH2 0x14B9 JUMPI PUSH2 0xD96 JUMP JUMPDEST PUSH1 0x9D SLOAD DUP4 GT ISZERO PUSH2 0x1510 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F61776172642D657863656564732D617661696C000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x151D SWAP1 DUP5 PUSH2 0x2CE6 JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH2 0x152D DUP5 DUP5 DUP5 PUSH1 0x0 PUSH2 0x2D48 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1539 DUP4 DUP6 PUSH2 0x2E2E JUMP JUMPDEST SWAP1 POP PUSH2 0x15BF DUP6 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x158D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x15A1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x15B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP5 PUSH2 0x2B8A JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xE2554529D99AB7A67DB6B4CEA2B32C7D55AE325F958861E05F304FDDED867E31 DUP7 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1619 PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x162A PUSH2 0x19B7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1673 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4296 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1401 DUP3 PUSH2 0x2ACE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x16DB DUP5 DUP5 DUP5 PUSH2 0x2E66 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x16EB PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16FC PUSH2 0x19B7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1745 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4296 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x174E DUP2 PUSH2 0x2A93 JUMP JUMPDEST POP JUMP JUMPDEST CALLER PUSH2 0x175B DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH2 0x179A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42DD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO PUSH2 0x1874 JUMPI PUSH1 0x0 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP7 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x17F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x180C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1822 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x1834 DUP7 CALLER DUP5 DUP5 PUSH2 0x2EC0 JUMP JUMPDEST SWAP1 POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1866 JUMPI PUSH2 0x1863 CALLER PUSH2 0x185D DUP5 DUP8 PUSH2 0x2CE6 JUMP JUMPDEST DUP4 PUSH2 0x2F4F JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x1871 DUP7 CALLER DUP4 PUSH2 0x2F95 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x189E JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x18F5 JUMPI PUSH2 0x18F5 DUP4 CALLER CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1237 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1917 JUMPI POP PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xD96 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP7 SWAP1 MSTORE CALLER PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xB2210957 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x197F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1993 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x19AB DUP6 DUP6 DUP6 PUSH2 0x3133 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x97 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x19DD PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x19EE PUSH2 0x19B7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1A37 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4296 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x174E DUP2 PUSH2 0x32D1 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1AA7 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1A89 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1B08 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B1C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1B32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1B4E JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x1404 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x10DFA58 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1B9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1BB1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1BC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x1BDB JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x1404 JUMP JUMPDEST PUSH2 0x16DB DUP5 DUP3 PUSH2 0x33E4 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x1C3F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP3 PUSH2 0x1C4E DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH2 0x1C8D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42DD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1C9B DUP9 DUP8 DUP10 PUSH2 0x3133 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0x1CDE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42B6 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1CE9 DUP9 DUP8 DUP4 PUSH2 0x3405 JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x631B5DFB PUSH2 0x1D00 PUSH2 0x2770 JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1D58 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D6C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 PUSH2 0x1D85 DUP4 DUP10 PUSH2 0x2CE6 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1D92 DUP3 PUSH2 0x2BA0 JUMP JUMPDEST SWAP1 POP PUSH2 0x1DA1 DUP11 DUP3 PUSH2 0x1399 PUSH2 0x2C1E JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1DBD PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP14 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE DUP1 DUP3 ADD DUP10 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x271704A58FD2953E49B87D67A0A3CE28A58147DE98A5457F60B4686F6385030 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH2 0x1E26 DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH2 0x1E65 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42DD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1E6D PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E7E PUSH2 0x19B7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1EC7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4296 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP6 AND DUP1 DUP4 MSTORE DUP7 DUP3 AND PUSH1 0x20 DUP1 DUP6 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9E DUP5 MSTORE DUP9 SWAP1 KECCAK256 SWAP7 MLOAD DUP8 SLOAD SWAP3 MLOAD DUP8 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP1 DUP8 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP6 AND OR SWAP1 SWAP5 SSTORE DUP5 MLOAD SWAP3 DUP4 MSTORE SWAP3 DUP3 ADD MSTORE DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 MLOAD PUSH32 0xFB0BA2CF86A2B03BCF387753A2192DA80A006AFA99DD022BB301C78E323BF1B9 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA1B PUSH2 0x34C6 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1FA4 JUMPI POP PUSH2 0x1FA4 PUSH2 0x2811 JUMP JUMPDEST DUP1 PUSH2 0x1FB2 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1FED JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4247 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2018 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x202A DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3526 JUMP JUMPDEST PUSH2 0x2065 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x36 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x434D PUSH1 0x36 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x2070 DUP6 DUP6 DUP6 PUSH2 0xFA8 JUMP JUMPDEST PUSH1 0xA0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH4 0xC89039C5 PUSH1 0xE0 SHL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP3 ADD DUP2 MSTORE SWAP2 DUP4 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP5 SWAP4 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x20E3 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x20C4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x2143 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x2148 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2188 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4189 PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH32 0x7A0CA506EDC9FCD36E010DBCAAD57DADE17BBAC71DFEB53269077098E863EECA SWAP1 PUSH1 0x0 SWAP1 LOG2 POP DUP1 ISZERO PUSH2 0x21CF JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP3 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND SWAP1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x225E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP2 PUSH2 0x226D DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH2 0x22AC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42DD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP4 PUSH2 0x22B6 DUP2 PUSH2 0x352C JUMP JUMPDEST PUSH2 0x2307 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F657863656564732D6C69717569646974792D63617000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2311 PUSH2 0x2770 JUMP JUMPDEST SWAP1 POP PUSH2 0x231F DUP8 DUP8 DUP8 DUP8 PUSH2 0x2D48 JUMP JUMPDEST PUSH2 0x233E DUP2 ADDRESS DUP9 PUSH2 0x232D PUSH2 0x2C1E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 SWAP1 PUSH2 0x3550 JUMP JUMPDEST PUSH2 0x2347 DUP7 PUSH2 0x35AA JUMP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6CE569498E0F86F147466AC49211CB2A1FFE06195ADB805E383B3F2365109160 DUP10 DUP9 PUSH1 0x40 MLOAD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x2415 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE PUSH1 0x0 PUSH2 0x2424 PUSH2 0x2665 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2430 PUSH2 0x34C6 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 DUP3 GT PUSH2 0x2442 JUMPI PUSH1 0x0 PUSH2 0x244C JUMP JUMPDEST PUSH2 0x244C DUP3 DUP5 PUSH2 0x2CE6 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x9D SLOAD DUP3 GT PUSH2 0x2460 JUMPI PUSH1 0x0 PUSH2 0x246E JUMP JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x246E SWAP1 DUP4 SWAP1 PUSH2 0x2CE6 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x2520 JUMPI PUSH1 0x0 PUSH2 0x2481 DUP3 PUSH2 0x1AB7 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x24DB JUMPI PUSH1 0x9B SLOAD PUSH2 0x2496 SWAP1 DUP3 PUSH2 0x363A JUMP JUMPDEST PUSH1 0x9B SSTORE PUSH2 0x24A3 DUP3 DUP3 PUSH2 0x2CE6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 POP PUSH32 0x5F1703CCFA2730D4245350F228079926A37F26A44ECF6978A7EEAFFF0AF11407 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x24E8 SWAP1 DUP4 PUSH2 0x363A JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xCE2B6E507C7CA1A20CE136810F524EEFC19BA4C7E4866EB6CC0CBA76E778D4BE SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH1 0x9D SLOAD SWAP5 POP POP POP POP POP PUSH1 0x1 PUSH1 0x65 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x9B SLOAD DUP2 JUMP JUMPDEST PUSH2 0x253F PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2550 PUSH2 0x19B7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2599 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4296 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x25DE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x41B2 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA1B PUSH2 0x2C1E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x9B SLOAD SWAP1 POP PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x26C5 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x26A7 JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2767 JUMPI PUSH2 0x275D DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x26EA JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x272A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x273E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2754 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP6 SWAP1 PUSH2 0x363A JUMP JUMPDEST SWAP4 POP PUSH1 0x1 ADD PUSH2 0x26D3 JUMP JUMPDEST POP SWAP2 SWAP3 POP POP POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x277F DUP4 PUSH2 0x27FC JUMP JUMPDEST PUSH2 0x27D0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x27DD JUMPI POP PUSH1 0x0 PUSH2 0x27F5 JUMP JUMPDEST PUSH2 0x27F1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP6 DUP5 PUSH2 0x2C94 JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND SWAP2 AND EQ ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x281C ADDRESS PUSH2 0x3526 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF77C4791 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2865 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2879 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x288F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x28EC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F746F6B656E2D6374726C722D6D69736D617463680000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x98 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x28FA JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 DUP5 AND SWAP2 PUSH32 0x460E712B4A5D801D031ED673DEA209B73AB854F7DDEB86B6C48082E92C3EEE66 SWAP2 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2966 JUMPI POP PUSH2 0x2966 PUSH2 0x2811 JUMP JUMPDEST DUP1 PUSH2 0x2974 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x29AF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4247 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x29DA JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x29E2 PUSH2 0x3694 JUMP JUMPDEST PUSH2 0x29EA PUSH2 0x3734 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x174E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2A17 JUMPI POP PUSH2 0x2A17 PUSH2 0x2811 JUMP JUMPDEST DUP1 PUSH2 0x2A25 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2A60 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4247 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2A8B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x29EA PUSH2 0x382D JUMP JUMPDEST PUSH1 0x9C DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3FF20538222F568F27FF436C0C49DFD3E48D5B8F86533A3F759DC1C7089775AB SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2B28 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2B0A JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2B7F JUMPI DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2B54 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x2B77 JUMPI PUSH1 0x1 SWAP4 POP POP POP POP PUSH2 0x1404 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2B36 JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xD96 DUP5 DUP5 PUSH2 0x2B9B DUP8 DUP8 DUP8 DUP8 PUSH2 0x2EC0 JUMP JUMPDEST PUSH2 0x2F95 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH3 0x982A61 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x13054C2 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2BEC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2C00 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2C16 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xC89039C5 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xC89039C5 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2C63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2C77 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2C8D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xAD9 SWAP1 DUP5 SWAP1 PUSH2 0x38D3 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2D3D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2DD7 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE DUP6 DUP2 AND PUSH1 0x44 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x4D7F3DB0 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2DBE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2DD2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5D7B0758 DUP6 DUP6 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x197F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x27F5 SWAP1 DUP4 SWAP1 PUSH2 0x2E61 SWAP1 DUP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x33E4 JUMP JUMPDEST PUSH2 0x3984 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2E9C SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x33E4 JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x2EAD JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x27F5 JUMP JUMPDEST PUSH2 0x2EB7 DUP4 DUP3 PUSH2 0x39A9 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP3 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x2F03 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x2F45 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2F10 DUP9 DUP9 DUP9 PUSH2 0x3A10 JUMP JUMPDEST DUP3 SLOAD SWAP1 SWAP2 POP PUSH2 0x2F41 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x2F3C SWAP1 DUP10 SWAP1 PUSH2 0x2F36 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP8 PUSH2 0x363A JUMP JUMPDEST SWAP1 PUSH2 0x363A JUMP JUMPDEST PUSH2 0x2F4F JUMP JUMPDEST SWAP3 POP POP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2F7E SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x33E4 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x2F8C JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE DUP2 SWAP1 KECCAK256 SLOAD DUP2 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 DUP1 PUSH2 0x2FDA DUP5 PUSH2 0x3AC1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2FF8 PUSH2 0x2FF3 PUSH2 0x3B09 JUMP JUMPDEST PUSH2 0x3B0D JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP3 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 DUP11 AND DUP3 MSTORE SWAP2 DUP5 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP5 DUP7 ADD MLOAD SWAP6 SWAP1 SWAP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH4 0xFFFFFFFF PUSH1 0xC0 SHL NOT AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP5 SWAP1 SWAP3 AND SWAP4 SWAP1 SWAP4 MUL OR PUSH1 0xFF PUSH1 0xE0 SHL NOT AND PUSH1 0x1 PUSH1 0xE0 SHL SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE DUP2 DUP2 LT ISZERO PUSH2 0x30DB JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0x2F92D56910619B38BC29FD8E4CA5E56359EDAC7A0C086CDCD305FB603FA37491 PUSH2 0x30C5 DUP6 DUP6 PUSH2 0x2CE6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 PUSH2 0xD96 JUMP JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0xD96 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF PUSH2 0x311C DUP5 DUP7 PUSH2 0x2CE6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3185 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3199 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x31AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x3201 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F696E737566662D66756E6473 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x320E DUP7 DUP7 DUP4 PUSH1 0x0 PUSH2 0x2B8A JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3223 DUP7 PUSH2 0x321E DUP5 DUP9 PUSH2 0x2CE6 JUMP JUMPDEST PUSH2 0x2E2E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP3 GT PUSH2 0x329A JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x3297 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2CE6 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x32A6 DUP9 DUP9 PUSH2 0x2E2E JUMP JUMPDEST SWAP1 POP DUP1 DUP3 GT PUSH2 0x32B5 JUMPI DUP2 PUSH2 0x32B7 JUMP JUMPDEST DUP1 JUMPDEST SWAP5 POP PUSH2 0x32C3 DUP2 DUP7 PUSH2 0x2CE6 JUMP JUMPDEST SWAP6 POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x332C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D6E6F742D7A65726F PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x3349 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3B51 JUMP JUMPDEST PUSH2 0x339A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D696E76616C696400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x99 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x7F58DC86BC2E435CB77CA0EDB1DF55E25F90CAF2D6BD866971715437D456A212 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x33F1 DUP4 DUP6 PUSH2 0x3B6D JUMP JUMPDEST SWAP1 POP PUSH2 0x16DB DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x3BC6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x3447 SWAP1 PUSH2 0x3442 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2CE6 JUMP JUMPDEST PUSH2 0x3AC1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB99152D PUSH1 0xE4 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xB99152D0 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3512 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2C77 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3537 PUSH2 0x2665 JUMP JUMPDEST PUSH1 0x9C SLOAD SWAP1 SWAP2 POP PUSH2 0x3547 DUP3 DUP6 PUSH2 0x363A JUMP JUMPDEST GT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x24 DUP4 ADD MSTORE DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x84 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xD96 SWAP1 DUP6 SWAP1 PUSH2 0x38D3 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH2 0x35D3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH2 0x35C3 PUSH2 0x2C1E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x3C08 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x87A6EEEF PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x87A6EEEF SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3626 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x21CF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x27F5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x36AD JUMPI POP PUSH2 0x36AD PUSH2 0x2811 JUMP JUMPDEST DUP1 PUSH2 0x36BB JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x36F6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4247 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x29EA JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x174E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x374D JUMPI POP PUSH2 0x374D PUSH2 0x2811 JUMP JUMPDEST DUP1 PUSH2 0x375B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3796 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4247 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x37C1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x37CB PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x174E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3846 JUMPI POP PUSH2 0x3846 PUSH2 0x2811 JUMP JUMPDEST DUP1 PUSH2 0x3854 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x388F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4247 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x38BA JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x65 SSTORE DUP1 ISZERO PUSH2 0x174E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x3928 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3D1B SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xAD9 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3947 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xAD9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4323 PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3993 DUP5 PUSH1 0x9A SLOAD PUSH2 0x33E4 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x39A1 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x39FF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x3A08 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xC0 SHL DUP2 DIV PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x3A5E JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x27F5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A72 DUP3 PUSH2 0x3A6C PUSH2 0x3B09 JUMP JUMPDEST SWAP1 PUSH2 0x2CE6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x3AAA SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3B6D JUMP JUMPDEST SWAP1 POP PUSH2 0x3AB6 DUP6 DUP3 PUSH2 0x33E4 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x3B05 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x41D8 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST TIMESTAMP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x20 SHL DUP3 LT PUSH2 0x3B05 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42FD PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3B5C DUP4 PUSH2 0x3D2A JUMP JUMPDEST DUP1 ISZERO PUSH2 0x27F5 JUMPI POP PUSH2 0x27F5 DUP4 DUP4 PUSH2 0x3D5D JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3B7C JUMPI POP PUSH1 0x0 PUSH2 0x2D42 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x3B89 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x27F5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4275 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x27F5 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x3D80 JUMP JUMPDEST DUP1 ISZERO DUP1 PUSH2 0x3C8E JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH4 0x6EB1769F PUSH1 0xE1 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 DUP6 AND SWAP2 PUSH4 0xDD62ED3E SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3C60 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3C74 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3C8A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO JUMPDEST PUSH2 0x3CC9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x36 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4383 PUSH1 0x36 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x95EA7B3 PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xAD9 SWAP1 DUP5 SWAP1 PUSH2 0x38D3 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x16DB DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x3E22 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3D3D DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3D5D JUMP JUMPDEST DUP1 ISZERO PUSH2 0x1401 JUMPI POP PUSH2 0x3D56 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3D5D JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x3D6C DUP6 DUP6 PUSH2 0x3F73 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x2EB7 JUMPI POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x3E0C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3DD1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3DB9 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3DFE JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x3E18 JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x3E63 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4221 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3E6C DUP6 PUSH2 0x3526 JUMP JUMPDEST PUSH2 0x3EBD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3EFC JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3EDD JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3F5E JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3F63 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x3AB6 DUP3 DUP3 DUP7 PUSH2 0x40A7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x24 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP3 DUP5 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND SWAP3 PUSH2 0x7530 SWAP3 DUP8 SWAP3 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3FFB JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3FDC JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x405C JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4061 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x407F JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x40A0 JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4095 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x40B6 JUMPI POP DUP2 PUSH2 0x27F5 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x40C6 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x3DD1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3DB9 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x4162 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x4162 JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x412D JUMP JUMPDEST POP PUSH2 0x3B05 SWAP3 SWAP2 POP JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x3B05 JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x416A JUMP INVALID MSIZE PUSH10 0x656C64536F7572636550 PUSH19 0x697A65506F6F6C2F696E76616C69642D796965 PUSH13 0x642D736F757263654F776E6162 PUSH13 0x653A206E6577206F776E657220 PUSH10 0x7320746865207A65726F KECCAK256 PUSH2 0x6464 PUSH19 0x65737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E2031323820626974735072697A65 POP PUSH16 0x6F6C2F72657365727665526567697374 PUSH19 0x792D6E6F742D7A65726F416464726573733A20 PUSH10 0x6E73756666696369656E PUSH21 0x2062616C616E636520666F722063616C6C496E6974 PUSH10 0x616C697A61626C653A20 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 MSTORE8 PUSH2 0x6665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F774F776E61626C653A20 PUSH4 0x616C6C65 PUSH19 0x206973206E6F7420746865206F776E65725072 PUSH10 0x7A65506F6F6C2F657869 PUSH21 0x2D6665652D657863656564732D757365722D6D6178 PUSH10 0x6D756D5072697A65506F PUSH16 0x6C2F756E6B6E6F776E2D746F6B656E00 STOP STOP STOP STOP STOP STOP STOP STOP MSTORE8 PUSH2 0x6665 NUMBER PUSH2 0x7374 GASPRICE KECCAK256 PUSH23 0x616C756520646F65736E27742066697420696E20333220 PUSH3 0x697473 MSTORE8 PUSH2 0x6665 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x7563636565645969656C64536F75726365507269 PUSH27 0x65506F6F6C2F7969656C642D736F757263652D6E6F742D636F6E74 PUSH19 0x6163742D616464726573735361666545524332 ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F76652066726F6D206E6F6E2D7A65726F2074 PUSH16 0x206E6F6E2D7A65726F20616C6C6F7761 PUSH15 0x63655072697A65506F6F6C2F6F6E6C PUSH26 0x2D7072697A65537472617465677900000000A264697066735822 SLT KECCAK256 CODESIZE 0xDA 0x21 DUP12 0xCD 0xE0 REVERT MUL 0x49 SLT 0xBF 0xB2 MUL 0xD7 DUP1 SELFBALANCE 0xE0 DUP4 DUP13 0xC1 SELFDESTRUCT 0xFB 0xB9 KECCAK256 INVALID PUSH25 0x9D126BD83F7B64736F6C634300060C00330000000000000000 ",
              "sourceMap": "404:2999:45:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31480:106:39;;;:::i;:::-;;;;;;;;;;;;;;;;14958:270;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14958:270:39;;;;;;;;;;;;;;;;;:::i;:::-;;32298:200;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32298:200:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32298:200:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32298:200:39;;;;;;;;;;-1:-1:-1;32298:200:39;;-1:-1:-1;32298:200:39;-1:-1:-1;32298:200:39;:::i;:::-;;;;-1:-1:-1;;;;;;32298:200:39;;;;;;;;;;;;;;;17185:617;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17185:617:39;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17185:617:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17185:617:39;;;;;;;;;;-1:-1:-1;17185:617:39;;-1:-1:-1;17185:617:39;-1:-1:-1;17185:617:39;:::i;15586:263::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15586:263:39;;;;;;;;;;;;;;;;;:::i;31811:166::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31811:166:39;;;;;;;;;;:::i;5948:860::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5948:860:39;;;;;;;;;;;;;-1:-1:-1;5948:860:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5948:860:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5948:860:39;;-1:-1:-1;;5948:860:39;;;-1:-1:-1;5948:860:39;;-1:-1:-1;;5948:860:39:i;25409:303::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25409:303:39;;;;;;;;;;:::i;13277:314::-;;;;;;;;;;;;;;;;-1:-1:-1;13277:314:39;-1:-1:-1;;;;;13277:314:39;;:::i;11940:103::-;;;:::i;7465:130::-;;;;;;;;;;;;;;;;-1:-1:-1;7465:130:39;-1:-1:-1;;;;;7465:130:39;;:::i;:::-;;;;;;;;;;;;;;;;;;13917:647;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13917:647:39;;;;;;;;;;;;;;;;;:::i;1967:145:0:-;;;:::i;5382:27:39:-;;;:::i;34141:141::-;;;;;;;;;;;;;;;;-1:-1:-1;34141:141:39;-1:-1:-1;;;;;34141:141:39;;:::i;19907:306::-;;;;;;;;;;;;;;;;-1:-1:-1;19907:306:39;;-1:-1:-1;;;;;19907:306:39;;;;;;;;;;;:::i;29377:118::-;;;;;;;;;;;;;;;;-1:-1:-1;29377:118:39;;:::i;10723:1018::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10723:1018:39;;;;;;;;;;;;;;;;;:::i;18806:302::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18806:302:39;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1335:85:0;;;:::i;:::-;;;;-1:-1:-1;;;;;1335:85:0;;;;;;;;;;;;;;4710:40:39;;;:::i;30219:137::-;;;;;;;;;;;;;;;;-1:-1:-1;30219:137:39;-1:-1:-1;;;;;30219:137:39;;:::i;4916:43::-;;;:::i;31052:110::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5172:33;;;:::i;18036:430::-;;;;;;;;;;;;;;;;-1:-1:-1;18036:430:39;;:::i;8890:921::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8890:921:39;;;;;;;;;;;;;;;;;;;;:::i;26123:455::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26123:455:39;;;;-1:-1:-1;;;;;26123:455:39;;;;;;;;;;;;:::i;545:31:45:-;;;:::i;7162:74:39:-;;;:::i;1015:792:45:-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1015:792:45;;;;;;;;;;;;;-1:-1:-1;1015:792:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1015:792:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1015:792:45;;-1:-1:-1;;1015:792:45;;;-1:-1:-1;;;1015:792:45;;;-1:-1:-1;;;;;1015:792:45;;:::i;26965:343:39:-;;;;;;;;;;;;;;;;-1:-1:-1;26965:343:39;-1:-1:-1;;;;;26965:343:39;;:::i;:::-;;;;-1:-1:-1;;;;;26965:343:39;;;;;;;;;;;;;;;;;;;;;;;;7917:469;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7917:469:39;;;;;;;;;;;;;;;;;;;;;;:::i;12245:1028::-;;;:::i;5277:33::-;;;:::i;2261:240:0:-;;;;;;;;;;;;;;;;-1:-1:-1;2261:240:0;-1:-1:-1;;;;;2261:240:0;;:::i;6912:93:39:-;;;:::i;4615:40::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31480:106;31540:7;31562:19;:17;:19::i;:::-;31555:26;;31480:106;:::o;14958:270::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;15112:39:::1;15125:2;15129:13;15144:6;15112:12;:39::i;:::-;15108:116;;;15166:51;::::0;;;;;;;-1:-1:-1;;;;;15166:51:39;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;15108:116;14958:270:::0;;;:::o;32298:200::-;-1:-1:-1;;;;;32298:200:39;-1:-1:-1;;;;32298:200:39:o;17185:617::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;17354:32:::1;17372:13;17354:17;:32::i;:::-;17346:77;;;::::0;;-1:-1:-1;;;17346:77:39;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;17434:20:::0;17430:47:::1;;17464:7;;17430:47;17488:9;17483:253;17503:19:::0;;::::1;17483:253;;;-1:-1:-1::0;;;;;17541:50:39;::::1;;17600:4;17607:2:::0;17611:8;;17620:1;17611:11;;::::1;;;;;17541:82;::::0;;-1:-1:-1;;;;;;17541:82:39::1;::::0;;;;;;-1:-1:-1;;;;;17541:82:39;;::::1;;::::0;::::1;::::0;;;;::::1;::::0;;;;17611:11:::1;;::::0;;;::::1;;17541:82:::0;;;;-1:-1:-1;17541:82:39;;;;;;;-1:-1:-1;;17541:82:39;;;;;;;-1:-1:-1;17541:82:39;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;;;;;17537:186;;;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17680:34;17708:5;17680:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17640:83;17537:186;17524:3;;17483:253;;;-1:-1:-1::0;17747:50:39::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;-1:-1:-1;;;;;17747:50:39;;::::1;::::0;;;::::1;::::0;::::1;::::0;17788:8;;;;17747:50;;;;;;17788:8;;17747:50;::::1;::::0;17788:8;17747:50;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;17747:50:39::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;17747:50:39;;-1:-1:-1;;;;17747:50:39::1;36121:1;17185:617:::0;;;;:::o;15586:263::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;15737:39:::1;15750:2;15754:13;15769:6;15737:12;:39::i;:::-;15733:112;;;15791:47;::::0;;;;;;;-1:-1:-1;;;;;15791:47:39;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;15586:263:::0;;;:::o;31811:166::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;31898:33:39::1;::::0;;-1:-1:-1;;;31898:33:39;;31925:4:::1;31898:33;::::0;::::1;::::0;;;31934:1:::1;::::0;-1:-1:-1;;;;;31898:18:39;::::1;::::0;::::1;::::0;:33;;;;;::::1;::::0;;;;;;;;;:18;:33;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31898:33:39;:37:::1;31894:79;;;31945:21;::::0;;-1:-1:-1;;;31945:21:39;;-1:-1:-1;;;;;31945:21:39;;::::1;;::::0;::::1;::::0;;;:17;;::::1;::::0;::::1;::::0;:21;;;;;-1:-1:-1;;31945:21:39;;;;;;;;-1:-1:-1;31945:17:39;:21;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31894:79;31811:166:::0;;:::o;5948:860::-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;-1:-1:-1;;;;;6146:39:39;::::1;6138:86;;;;-1:-1:-1::0;;;6138:86:39::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6263:24:::0;;;6303:54:::1;::::0;::::1;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;6303:54:39::1;-1:-1:-1::0;6293:64:39;;::::1;::::0;:7:::1;::::0;:64:::1;::::0;;::::1;::::0;::::1;:::i;:::-;;6369:9;6364:178;6388:22;6384:1;:26;6364:178;;;6425:40;6468:17;6486:1;6468:20;;;;;;;;;;;;;;6425:63;;6496:39;6516:15;6533:1;6496:19;:39::i;:::-;-1:-1:-1::0;6412:3:39::1;;6364:178;;;;6547:16;:14;:16::i;:::-;6569:24;:22;:24::i;:::-;6599:29;-1:-1:-1::0;;6599:16:39::1;:29::i;:::-;6635:15;:34:::0;;-1:-1:-1;;;;;;6635:34:39::1;-1:-1:-1::0;;;;;6635:34:39;::::1;::::0;;::::1;::::0;;;6675:18:::1;:40:::0;;;6727:76:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;::::1;1778:1:9;1794:14:::0;1790:66;;;-1:-1:-1;;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;-1:-1:-1;;5948:860:39:o;25409:303::-;25537:7;25511:15;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;;;-1:-1:-1;;;35825:92:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;;;25589:50:::1;::::0;;-1:-1:-1;;;25589:50:39;;-1:-1:-1;;;;;25589:50:39;;::::1;;::::0;::::1;::::0;;;25552:91:::1;::::0;25566:4;;25572:15;;25589:44;;::::1;::::0;::::1;::::0;:50;;;;;::::1;::::0;;;;;;;;;:44;:50;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25589:50:39;25641:1:::1;25552:13;:91::i;:::-;-1:-1:-1::0;;;;;;;25656:37:39;;::::1;;::::0;;;:20:::1;:37;::::0;;;;;;;:43;;;::::1;::::0;;;;;;;;:51;-1:-1:-1;;;;;25656:51:39::1;::::0;25409:303::o;13277:314::-;36438:15;;:24;;;-1:-1:-1;;;36438:24:39;;;;13353:7;;;;-1:-1:-1;;;;;36438:15:39;;;;:22;;:24;;;;;;;;;;;;;;;:15;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36438:24:39;;-1:-1:-1;36497:10:39;-1:-1:-1;;;;;36477:30:39;;;36469:65;;;;;-1:-1:-1;;;36469:65:39;;;;;;;;;;;;-1:-1:-1;;;36469:65:39;;;;;;;;;;;;;;;13386:18:::1;::::0;;13369:14:::1;13410:22:::0;;;;13386:18;13457:15:::1;13386:18:::0;13457:7:::1;:15::i;:::-;13438:34;;13479:44;13509:2;13514:8;13479;:6;:8::i;:::-;-1:-1:-1::0;;;;;13479:21:39::1;::::0;;::::1;:44::i;:::-;13535:29;::::0;;;;;;;-1:-1:-1;;;;;13535:29:39;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;13578:8:::0;13277:314;-1:-1:-1;;;;13277:314:39:o;11940:103::-;12018:20;;11940:103;:::o;7465:130::-;7538:4;7557:33;7575:14;7557:17;:33::i;:::-;7550:40;;7465:130;;;;:::o;13917:647::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;14069:15:::1;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;::::0;;-1:-1:-1;;;35825:92:39;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;::::1;;14098:11:::0;14094:38:::2;;14119:7;;14094:38;14156:20;;14146:6;:30;;14138:72;;;::::0;;-1:-1:-1;;;14138:72:39;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;14239:20;::::0;:32:::2;::::0;14264:6;14239:24:::2;:32::i;:::-;14216:20;:55:::0;14278:46:::2;14284:2:::0;14288:6;14296:15;14321:1:::2;14278:5;:46::i;:::-;14331:19;14353:55;14384:15;14401:6;14353:30;:55::i;:::-;14449:48;::::0;;-1:-1:-1;;;14449:48:39;;-1:-1:-1;;;;;14449:48:39;;::::2;;::::0;::::2;::::0;;;14331:77;;-1:-1:-1;14414:97:39::2;::::0;14428:2;;14432:15;;14449:44;;::::2;::::0;::::2;::::0;:48;;;;;::::2;::::0;;;;;;;;;:44;:48;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;14449:48:39;14499:11;14414:13:::2;:97::i;:::-;14523:36;::::0;;;;;;;-1:-1:-1;;;;;14523:36:39;;::::2;::::0;;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;35923:1;36121::::1;13917:647:::0;;;:::o;1967:145:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;2057:6:::1;::::0;2036:40:::1;::::0;2073:1:::1;::::0;-1:-1:-1;;;;;2057:6:0::1;::::0;2036:40:::1;::::0;2073:1;;2036:40:::1;2086:6;:19:::0;;-1:-1:-1;;;;;;2086:19:0::1;::::0;;1967:145::o;5382:27:39:-;;;;:::o;34141:141::-;34228:4;34247:30;34261:15;34247:13;:30::i;19907:306::-;20067:23;20117:91;20151:16;20175:10;20193:9;20117:26;:91::i;:::-;20100:108;19907:306;-1:-1:-1;;;;19907:306:39:o;29377:118::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;29459:31:39::1;29476:13;29459:16;:31::i;:::-;29377:118:::0;:::o;10723:1018::-;10832:10;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;;;-1:-1:-1;;;35825:92:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;;;-1:-1:-1;;;;;10854:18:39;::::1;::::0;10850:579:::1;;10910:45;::::0;;-1:-1:-1;;;10910:45:39;;-1:-1:-1;;;;;10910:45:39;::::1;;::::0;::::1;::::0;;;10882:25:::1;::::0;10928:10:::1;::::0;10910:39:::1;::::0;:45;;;;;::::1;::::0;;;;;;;;;10928:10;10910:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;10910:45:39;;-1:-1:-1;11014:24:39::1;11041:63;11065:4:::0;11071:10:::1;10910:45:::0;11014:24;11041:23:::1;:63::i;:::-;11014:90:::0;-1:-1:-1;;;;;;11117:10:39;;::::1;::::0;;::::1;;11113:245;;11271:78;11289:10;11301:29;:17:::0;11323:6;11301:21:::1;:29::i;:::-;11332:16;11271:17;:78::i;:::-;11252:97;;11113:245;11366:56;11387:4;11393:10;11405:16;11366:20;:56::i;:::-;10850:579;;;-1:-1:-1::0;;;;;11438:16:39;::::1;::::0;;::::1;::::0;:30:::1;;-1:-1:-1::0;;;;;;11458:10:39;;::::1;::::0;;::::1;;;11438:30;11434:128;;;11508:43;::::0;;-1:-1:-1;;;11508:43:39;;-1:-1:-1;;;;;11508:43:39;::::1;;::::0;::::1;::::0;;;11478:77:::1;::::0;11492:2;;11496:10:::1;::::0;;;11508:39:::1;::::0;:43;;;;;::::1;::::0;;;;;;;;;11496:10;11508:43;::::1;;::::0;::::1;;;;::::0;::::1;11478:77;-1:-1:-1::0;;;;;11599:18:39;::::1;::::0;;::::1;::::0;:58:::1;;-1:-1:-1::0;11629:13:39::1;::::0;-1:-1:-1;;;;;11629:13:39::1;11621:36:::0;::::1;11599:58;11595:142;;;11667:13;::::0;:63:::1;::::0;;-1:-1:-1;;;11667:63:39;;-1:-1:-1;;;;;11667:63:39;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;;11719:10:::1;11667:63:::0;;;;;;:13;;;::::1;::::0;-1:-1:-1;;11667:63:39;;;;;-1:-1:-1;;11667:63:39;;;;;;;-1:-1:-1;11667:13:39;:63;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;10723:1018:::0;;;;:::o;18806:302::-;18950:15;18973:20;19034:69;19073:4;19079:15;19096:6;19034:38;:69::i;:::-;19008:95;;;;-1:-1:-1;18806:302:39;-1:-1:-1;;;;18806:302:39:o;1335:85:0:-;1407:6;;-1:-1:-1;;;;;1407:6:0;;1335:85::o;4710:40:39:-;;;-1:-1:-1;;;;;4710:40:39;;:::o;30219:137::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;30318:33:39::1;30336:14;30318:17;:33::i;4916:43::-:0;;;-1:-1:-1;;;;;4916:43:39;;:::o;31052:110::-;31102:33;31150:7;31143:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31143:14:39;;;-1:-1:-1;31143:14:39;;;;;;;;;;;;;;;;;;;31052:110;:::o;5172:33::-;;;;:::o;18036:430::-;18161:15;;:24;;;-1:-1:-1;;;18161:24:39;;;;18102:7;;;;-1:-1:-1;;;;;18161:15:39;;;;:22;;:24;;;;;;;;;;;;;;;:15;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18161:24:39;;-1:-1:-1;;;;;;18196:30:39;;18192:59;;18243:1;18236:8;;;;;18192:59;18286:42;;;-1:-1:-1;;;18286:42:39;;18322:4;18286:42;;;;;;18256:27;;-1:-1:-1;;;;;18286:27:39;;;;;:42;;;;;;;;;;;;;;;:27;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18286:42:39;;-1:-1:-1;18338:24:39;18334:53;;18379:1;18372:8;;;;;;18334:53;18399:62;18433:6;18441:19;18399:33;:62::i;8890:921::-;9113:7;1753:1:23;2495:7;;:19;;2487:63;;;;;-1:-1:-1;;;2487:63:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;1753:1;2625:7;:18;9083:15:39;35833:56:::1;9083:15:::0;35833:13:::1;:56::i;:::-;35825:92;;;::::0;;-1:-1:-1;;;35825:92:39;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;::::1;;9131:15:::2;9148:20:::0;9172:69:::2;9211:4;9217:15;9234:6;9172:38;:69::i;:::-;9130:111;;;;9266:14;9255:7;:25;;9247:77;;;;-1:-1:-1::0;;;9247:77:39::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9354:48;9366:4;9372:15;9389:12;9354:11;:48::i;:::-;-1:-1:-1::0;;;;;9433:51:39;::::2;;9485:12;:10;:12::i;:::-;9433:79;::::0;;-1:-1:-1;;;;;;9433:79:39::2;::::0;;;;;;-1:-1:-1;;;;;9433:79:39;;::::2;;::::0;::::2;::::0;;;::::2;::::0;;;;;;;;;;;;;;;;-1:-1:-1;;9433:79:39;;;;;;;-1:-1:-1;9433:79:39;;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;9558:21;9582:19;9593:7;9582:6;:10;;:19;;;;:::i;:::-;9558:43;;9607:16;9626:22;9634:13;9626:7;:22::i;:::-;9607:41;;9655:37;9677:4;9683:8;9655;:6;:8::i;:37::-;-1:-1:-1::0;;;;;9704:81:39;;::::2;::::0;;::::2;9722:12;:10;:12::i;:::-;9704:81;::::0;;;;;::::2;::::0;::::2;::::0;;;;;;;;;;;-1:-1:-1;;;;;9704:81:39;;;::::2;::::0;::::2;::::0;;;;;;;::::2;-1:-1:-1::0;;1710:1:23;2798:7;:22;-1:-1:-1;9799:7:39;8890:921;-1:-1:-1;;;;;;8890:921:39:o;26123:455::-;26295:16;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;;;-1:-1:-1;;;35825:92:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;;;1558:12:0::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;1547:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;1547:23:0::1;;1539:68;;;::::0;;-1:-1:-1;;;1539:68:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;::::1;;26373:114:39::2;::::0;;;;::::2;::::0;;-1:-1:-1;;;;;26373:114:39;;::::2;::::0;;;;;::::2;;::::0;;::::2;::::0;;;-1:-1:-1;;;;;26335:35:39;::::2;-1:-1:-1::0;26335:35:39;;;:17:::2;:35:::0;;;;;:152;;;;;;-1:-1:-1;;26335:152:39;;::::2;::::0;;::::2;;::::0;::::2;::::0;;;::::2;-1:-1:-1::0;;;26335:152:39::2;;::::0;;;26499:74;;;;;;;::::2;::::0;;;;;;;;;;::::2;::::0;;;;;;;;::::2;26123:455:::0;;;;:::o;545:31:45:-;;;-1:-1:-1;;;;;545:31:45;;:::o;7162:74:39:-;7199:7;7221:10;:8;:10::i;1015:792:45:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1264:34:45::1;-1:-1:-1::0;;;;;1264:32:45;::::1;;:34::i;:::-;1256:101;;;;-1:-1:-1::0;;;1256:101:45::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1363:102;1391:16;1415:17;1440:19;1363:20;:102::i;:::-;1471:11;:26:::0;;-1:-1:-1;;;;;;1471:26:45::1;-1:-1:-1::0;;;;;1471:26:45;::::1;::::0;;::::1;::::0;;;1620:46:::1;::::0;;-1:-1:-1;;;1620:46:45::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;1587:80;;-1:-1:-1;;1471:26:45;1620:46;;;1587:80;;::::1;::::0;;1620:46;1587:80;::::1;;;;;;::::0;;;;-1:-1:-1;;1587:80:45;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1567:100;;;1681:9;1673:63;;;;-1:-1:-1::0;;;1673:63:45::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1748:54;::::0;-1:-1:-1;;;;;1748:54:45;::::1;::::0;::::1;::::0;;;::::1;1778:1:9;1794:14:::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1790:66;1015:792:45;;;;;:::o;26965:343:39:-;-1:-1:-1;;;;;27169:34:39;27071:27;27169:34;;;:17;:34;;;;;:54;-1:-1:-1;;;;;27169:54:39;;;;-1:-1:-1;;;27250:53:39;;;;;26965:343::o;7917:469::-;1753:1:23;2495:7;;:19;;2487:63;;;;;-1:-1:-1;;;2487:63:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;1753:1;2625:7;:18;8090:15:39;35833:56:::1;8090:15:::0;35833:13:::1;:56::i;:::-;35825:92;;;::::0;;-1:-1:-1;;;35825:92:39;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;::::1;;8127:6:::2;36288:25;36305:7;36288:16;:25::i;:::-;36280:69;;;::::0;;-1:-1:-1;;;36280:69:39;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;8143:16:::3;8162:12;:10;:12::i;:::-;8143:31;;8181:44;8187:2;8191:6;8199:15;8216:8;8181:5;:44::i;:::-;8232:58;8258:8;8276:4;8283:6;8232:8;:6;:8::i;:::-;-1:-1:-1::0;;;;;8232:25:39::3;::::0;;:58;:25:::3;:58::i;:::-;8296:15;8304:6;8296:7;:15::i;:::-;8323:58;::::0;;;;;-1:-1:-1;;;;;8323:58:39;;::::3;;::::0;::::3;::::0;;;;;::::3;::::0;;;::::3;::::0;;;::::3;::::0;::::3;::::0;;;;;;;;;::::3;-1:-1:-1::0;;1710:1:23;2798:7;:22;-1:-1:-1;;;;;7917:469:39:o;12245:1028::-;12316:7;1753:1:23;2495:7;;:19;;2487:63;;;;;-1:-1:-1;;;2487:63:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;1753:1;2625:7;:18;12331:24:39::1;12358:19;:17;:19::i;:::-;12331:46;;12495:22;12520:10;:8;:10::i;:::-;12495:35;;12536:21;12578:16;12561:14;:33;12560:78;;12637:1;12560:78;;;12598:36;:14:::0;12617:16;12598:18:::1;:36::i;:::-;12536:102;;12644:31;12695:20;;12679:13;:36;12678:84;;12761:1;12678:84;;;12737:20;::::0;12719:39:::1;::::0;:13;;:17:::1;:39::i;:::-;12644:118:::0;-1:-1:-1;12773:27:39;;12769:466:::1;;12810:18;12831:44;12851:23;12831:19;:44::i;:::-;12810:65:::0;-1:-1:-1;12887:14:39;;12883:214:::1;;12934:18;::::0;:34:::1;::::0;12957:10;12934:22:::1;:34::i;:::-;12913:18;:55:::0;13004:39:::1;:23:::0;13032:10;13004:27:::1;:39::i;:::-;13058:30;::::0;;;;;;;12978:65;;-1:-1:-1;13058:30:39::1;::::0;;;;;::::1;::::0;;::::1;12883:214;13127:20;::::0;:49:::1;::::0;13152:23;13127:24:::1;:49::i;:::-;13104:20;:72:::0;13190:38:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;12769:466;;13248:20;;13241:27;;;;;;1710:1:23::0;2798:7;:22;12245:1028:39;:::o;5277:33::-;;;;:::o;2261:240:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;2349:22:0;::::1;2341:73;;;;-1:-1:-1::0;;;2341:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2450:6;::::0;2429:38:::1;::::0;-1:-1:-1;;;;;2429:38:0;;::::1;::::0;2450:6:::1;::::0;2429:38:::1;::::0;2450:6:::1;::::0;2429:38:::1;2477:6;:17:::0;;-1:-1:-1;;;;;;2477:17:0::1;-1:-1:-1::0;;;;;2477:17:0;;;::::1;::::0;;;::::1;::::0;;2261:240::o;6912:93:39:-;6961:7;6991:8;:6;:8::i;4615:40::-;;;;;;;;;;;;;-1:-1:-1;;;4615:40:39;;;;;:::o;32597:361::-;32649:7;32664:13;32680:18;;32664:34;;32704:40;32747:7;32704:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32704:50:39;;;-1:-1:-1;32704:50:39;;;;;;;;;;;;-1:-1:-1;;32794:13:39;;32704:50;;-1:-1:-1;32771:20:39;;-1:-1:-1;;;32818:117:39;32841:12;32837:1;:16;32818:117;;;32875:53;32903:6;32910:1;32903:9;;;;;;;;;;;;;;-1:-1:-1;;;;;32885:40:39;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32885:42:39;32875:5;;:9;:53::i;:::-;32867:61;-1:-1:-1;32855:3:39;;32818:117;;;-1:-1:-1;32948:5:39;;-1:-1:-1;;;32597:361:39;:::o;828:104:19:-;915:10;828:104;:::o;15853:343:39:-;15968:4;15990:32;16008:13;15990:17;:32::i;:::-;15982:77;;;;;-1:-1:-1;;;15982:77:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16070:11;16066:44;;-1:-1:-1;16098:5:39;16091:12;;16066:44;16116:57;-1:-1:-1;;;;;16116:45:39;;16162:2;16166:6;16116:45;:57::i;:::-;-1:-1:-1;16187:4:39;15853:343;;;;;;:::o;2212:145:45:-;2340:11;;-1:-1:-1;;;;;2314:38:45;;;2340:11;;2314:38;;;2212:145::o;1952:123:9:-;2000:4;2024:44;2062:4;2024:29;:44::i;:::-;2023:45;2016:52;;1952:123;:::o;29798:280:39:-;29908:29;;;-1:-1:-1;;;29908:29:39;;;;29941:4;;-1:-1:-1;;;;;29908:27:39;;;;;:29;;;;;;;;;;;;;;;:27;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29908:29:39;-1:-1:-1;;;;;29908:37:39;;29900:80;;;;;-1:-1:-1;;;29900:80:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;30008:16;29991:7;29999:5;29991:14;;;;;;;;;;;;;;;;:33;;-1:-1:-1;;;;;;29991:33:39;-1:-1:-1;;;;;29991:33:39;;;;;;30035:38;;;;;;;;29991:14;30035:38;29798:280;;:::o;935:126:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;992:26:0::1;:24;:26::i;:::-;1028;:24;:26::i;:::-;1794:14:9::0;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;935:126:0:o;1791:106:23:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1856:34:23::1;:32;:34::i;29499:138:39:-:0;29563:12;:28;;;29602:30;;;;;;;;;;;;;;;;;29499:138;:::o;33600:331::-;33688:4;33700:40;33743:7;33700:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33700:50:39;;;-1:-1:-1;33700:50:39;;;;;;;;;;;;-1:-1:-1;;33788:13:39;;33700:50;;-1:-1:-1;33765:20:39;;-1:-1:-1;;;33808:101:39;33831:12;33827:1;:16;33808:101;;;33861:9;;-1:-1:-1;;;;;33861:28:39;;;:6;;33868:1;;33861:9;;;;;;;;;;;;-1:-1:-1;;;;;33861:28:39;;33858:44;;;33898:4;33891:11;;;;;;;33858:44;33845:3;;33808:101;;;-1:-1:-1;33921:5:39;;33600:331;-1:-1:-1;;;;33600:331:39:o;21947:275::-;22071:146;22099:4;22111:15;22134:77;22158:4;22164:15;22181:22;22205:5;22134:23;:77::i;:::-;22071:20;:146::i;3271:130:45:-;3359:11;;:37;;;-1:-1:-1;;;3359:37:45;;;;;;;;;;-1:-1:-1;;;;;;;3359:11:45;;:23;;:37;;;;;;;;;;;;;;-1:-1:-1;3359:11:45;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3359:37:45;;3271:130;-1:-1:-1;;3271:130:45:o;2634:132::-;2734:11;;:26;;;-1:-1:-1;;;2734:26:45;;;;2684:17;;-1:-1:-1;;;;;2734:11:45;;-1:-1:-1;;2734:26:45;;;;;;;;;;;;;;:11;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2734:26:45;;-1:-1:-1;2634:132:45;:::o;770:186:12:-;890:58;;;-1:-1:-1;;;;;890:58:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;890:58:12;-1:-1:-1;;;890:58:12;;;863:86;;883:5;;863:19;:86::i;3147:155:8:-;3205:7;3237:1;3232;:6;;3224:49;;;;;-1:-1:-1;;;3224:49:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3290:5:8;;;3147:155;;;;;:::o;16533:295:39:-;16646:13;;-1:-1:-1;;;;;16646:13:39;16638:36;16634:125;;16684:13;;:68;;;-1:-1:-1;;;16684:68:39;;-1:-1:-1;;;;;16684:68:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;;;;;:29;;:68;;;;;-1:-1:-1;;16684:68:39;;;;;;;-1:-1:-1;16684:13:39;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16634:125;16764:59;;;-1:-1:-1;;;16764:59:39;;-1:-1:-1;;;;;16764:59:39;;;;;;;;;;;;;;;:47;;;;;;:59;;;;;-1:-1:-1;;16764:59:39;;;;;;;;-1:-1:-1;16764:47:39;:59;;;;;;;;;;19258:269;-1:-1:-1;;;;;19461:34:39;;19362:7;19461:34;;;:17;:34;;;;;:54;19384:138;;19405:6;;19419:97;;19405:6;;-1:-1:-1;;;;;19461:54:39;19419:33;:97::i;:::-;19384:13;:138::i;20592:520::-;-1:-1:-1;;;;;20953:35:39;;20744:23;20953:35;;;:17;:35;;;;;:54;20744:23;;20907:101;;20941:10;;-1:-1:-1;;;20953:54:39;;-1:-1:-1;;;;;20953:54:39;20907:33;:101::i;:::-;20880:128;-1:-1:-1;21018:21:39;21014:50;;21056:1;21049:8;;;;;21014:50;21076:31;:9;21090:16;21076:13;:31::i;:::-;21069:38;20592:520;-1:-1:-1;;;;;20592:520:39:o;22226:598::-;-1:-1:-1;;;;;22445:37:39;;;22368:7;22445:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;22499:25;;22368:7;;22445:43;-1:-1:-1;;;22499:25:39;;;;22494:303;;22547:1;22534:14;;22494:303;;;22569:14;22586:70;22610:4;22616:15;22633:22;22586:23;:70::i;:::-;22744:21;;22569:87;;-1:-1:-1;22677:113:39;;22695:15;;22712:22;;22736:53;;22783:5;;22736:42;;-1:-1:-1;;;;;22744:21:39;22569:87;22736:34;:42::i;:::-;:46;;:53::i;:::-;22677:17;:113::i;:::-;22664:126;;22494:303;;-1:-1:-1;22809:10:39;22226:598;-1:-1:-1;;;;;22226:598:39:o;23848:410::-;-1:-1:-1;;;;;24086:34:39;;23978:7;24086:34;;;:17;:34;;;;;:54;23978:7;;24015:131;;24056:22;;-1:-1:-1;;;;;24086:54:39;24015:33;:131::i;:::-;23993:153;;24172:11;24156:13;:27;24152:75;;;24209:11;24193:27;;24152:75;-1:-1:-1;24240:13:39;;23848:410;-1:-1:-1;;;23848:410:39:o;22828:604::-;-1:-1:-1;;;;;22953:37:39;;;22932:18;22953:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;:51;23057:129;;;;;;;;-1:-1:-1;;;;;22953:51:39;;23057:129;23088:22;:10;:20;:22::i;:::-;-1:-1:-1;;;;;23057:129:39;;;;;23129:25;:14;:12;:14::i;:::-;:23;:25::i;:::-;23057:129;;;;;;23175:4;23057:129;;;;;-1:-1:-1;;;;;23011:37:39;;;-1:-1:-1;23011:37:39;;;:20;:37;;;;;;:43;;;;;;;;;;;:175;;;;;;;;;;;;;-1:-1:-1;;;;;;23011:175:39;;;-1:-1:-1;;;;;23011:175:39;;;;;;;-1:-1:-1;;;;23011:175:39;-1:-1:-1;;;23011:175:39;;;;;;;;;-1:-1:-1;;;;23011:175:39;-1:-1:-1;;;23011:175:39;;;;;;;;;;23197:23;;;23193:235;;;-1:-1:-1;;;;;23235:63:39;;;;;;;23271:26;:10;23286;23271:14;:26::i;:::-;23235:63;;;;;;;;;;;;;;;23193:235;;;23333:10;23320;:23;23316:112;;;-1:-1:-1;;;;;23358:63:39;;;;;;;23394:26;:10;23409;23394:14;:26::i;:::-;23358:63;;;;;;;;;;;;;;;22828:604;;;;:::o;27741:1468::-;27989:50;;;-1:-1:-1;;;27989:50:39;;-1:-1:-1;;;;;27989:50:39;;;;;;;;;27893:20;;;;;;27989:44;;;;;;:50;;;;;;;;;;;;;;;:44;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27989:50:39;;-1:-1:-1;28053:32:39;;;;28045:67;;;;;-1:-1:-1;;;28045:67:39;;;;;;;;;;;;-1:-1:-1;;;28045:67:39;;;;;;;;;;;;;;;28118:63;28132:4;28138:15;28155:22;28179:1;28118:13;:63::i;:::-;28575:24;28602:83;28633:15;28650:34;:22;28677:6;28650:26;:34::i;:::-;28602:30;:83::i;:::-;-1:-1:-1;;;;;28725:37:39;;;28692:23;28725:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;:51;28575:110;;-1:-1:-1;28692:23:39;-1:-1:-1;;;;;28725:51:39;-1:-1:-1;;28721:192:39;;-1:-1:-1;;;;;28832:37:39;;;;;;;:20;:37;;;;;;;;:43;;;;;;;;;:51;28824:82;;-1:-1:-1;;;;;28832:51:39;28889:16;28824:64;:82::i;:::-;28806:100;;28721:192;28989:20;29012:55;29043:15;29060:6;29012:30;:55::i;:::-;28989:78;;29107:12;29089:15;:30;29088:65;;29138:15;29088:65;;;29123:12;29088:65;29073:80;-1:-1:-1;29174:30:39;:12;29073:80;29174:16;:30::i;:::-;29159:45;;27741:1468;;;;;;;;;;:::o;30497:405::-;-1:-1:-1;;;;;30586:37:39;;30578:82;;;;;-1:-1:-1;;;30578:82:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30674:98;-1:-1:-1;;;;;30674:41:39;;-1:-1:-1;;;;;;30674:41:39;:98::i;:::-;30666:142;;;;;-1:-1:-1;;;30666:142:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;30814:13;:30;;-1:-1:-1;;;;;;30814:30:39;-1:-1:-1;;;;;30814:30:39;;;;;;;;30856:41;;;;-1:-1:-1;;30856:41:39;30497:405;:::o;1967:201:26:-;2051:7;;2087:15;:8;2100:1;2087:12;:15::i;:::-;2070:32;-1:-1:-1;2121:17:26;2070:32;1149:4;2121:10;:17::i;21258:289:39:-;-1:-1:-1;;;;;21411:37:39;;;;;;;:20;:37;;;;;;;;:43;;;;;;;;;:51;21403:84;;:72;;-1:-1:-1;;;;;21411:51:39;21468:6;21403:64;:72::i;:::-;:82;:84::i;:::-;-1:-1:-1;;;;;21349:37:39;;;;;;;:20;:37;;;;;;;;:43;;;;;;;;;;;;;:138;;-1:-1:-1;;;;;;21349:138:39;-1:-1:-1;;;;;21349:138:39;;;;;;;;;;;21499:43;;;;;;;21349:37;;21499:43;;;;;;;;;21258:289;;;:::o;2515:115:45:-;2584:11;;:41;;;-1:-1:-1;;;2584:41:45;;2619:4;2584:41;;;;;;-1:-1:-1;;;;;;;2584:11:45;;:26;;:41;;;;;;;;;;;;;;-1:-1:-1;2584:11:45;:41;;;;;;;;;;;;;;;;;;;;;;;;;;737:413:18;1097:20;1135:8;;;737:413::o;33203:189:39:-;33269:4;33281:24;33308:19;:17;:19::i;:::-;33374:12;;33281:46;;-1:-1:-1;33341:29:39;33281:46;33362:7;33341:20;:29::i;:::-;:45;;;33203:189;-1:-1:-1;;;33203:189:39:o;962:214:12:-;1100:68;;;-1:-1:-1;;;;;1100:68:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1100:68:12;-1:-1:-1;;;1100:68:12;;;1073:96;;1093:5;;1073:19;:96::i;2893:178:45:-;2983:11;;2954:54;;-1:-1:-1;;;;;2983:11:45;2997:10;2954:8;:6;:8::i;:::-;-1:-1:-1;;;;;2954:20:45;;;;:54::i;:::-;3014:11;;:52;;;-1:-1:-1;;;3014:52:45;;;;;;;;3060:4;3014:52;;;;;;-1:-1:-1;;;;;3014:11:45;;;;-1:-1:-1;;3014:52:45;;;;;-1:-1:-1;;3014:52:45;;;;;;;;-1:-1:-1;3014:11:45;:52;;;;;;;;;;;;;;;;;;;;;;;;;;2701:175:8;2759:7;2790:5;;;2813:6;;;;2805:46;;;;;-1:-1:-1;;;2805:46:8;;;;;;;;;;;;;;;;;;;;;;;;;;;759:64:19;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1794:14;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;759:64:19:o;1067:192:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1134:17:0::1;1154:12;:10;:12::i;:::-;1176:6;:18:::0;;-1:-1:-1;;;;;;1176:18:0::1;-1:-1:-1::0;;;;;1176:18:0;::::1;::::0;;::::1;::::0;;;1209:43:::1;::::0;1176:18;;-1:-1:-1;1176:18:0;-1:-1:-1;;1209:43:0::1;::::0;-1:-1:-1;;1209:43:0::1;1778:1:9;1794:14:::0;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;1067:192:0:o;1903:104:23:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1710:1:23::1;1978:7;:22:::0;1790:66:9;;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;1903:104:23:o;3088:762:12:-;3544:69;;;;;;;;;;;;;;;;;;3518:23;;3544:69;;-1:-1:-1;;;;;3544:27:12;;;3572:4;;3544:27;:69::i;:::-;3627:17;;3518:95;;-1:-1:-1;3627:21:12;3623:221;;3767:10;3756:30;;;;;;;;;;;;;;;-1:-1:-1;3756:30:12;3748:85;;;;-1:-1:-1;;;3748:85:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10138:275:39;10227:7;10242:14;10259:71;10293:16;10311:18;;10259:33;:71::i;:::-;10242:88;;10350:6;10340:7;:16;10336:53;;;10376:6;10366:16;;10336:53;-1:-1:-1;10401:7:39;;10138:275;-1:-1:-1;;10138:275:39:o;4228:150:8:-;4286:7;4317:1;4313;:5;4305:44;;;;;-1:-1:-1;;;4305:44:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;4370:1;4366;:5;;;;;;;4228:150;-1:-1:-1;;;4228:150:8:o;24612:558:39:-;-1:-1:-1;;;;;24778:37:39;;;24739:7;24778:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;:53;-1:-1:-1;;;24778:53:39;;;;;-1:-1:-1;;;24843:55:39;;;;24838:85;;24915:1;24908:8;;;;;24838:85;24929:17;24949:33;24968:13;24949:14;:12;:14::i;:::-;:18;;:33::i;:::-;-1:-1:-1;;;;;25026:34:39;;24988:21;25026:34;;;:17;:34;;;;;:53;24929;;-1:-1:-1;24988:21:39;25012:68;;24929:53;;-1:-1:-1;;;25026:53:39;;-1:-1:-1;;;;;25026:53:39;25012:13;:68::i;:::-;24988:92;;25093:72;25127:22;25151:13;25093:33;:72::i;:::-;25086:79;24612:558;-1:-1:-1;;;;;;;24612:558:39:o;1097:181:24:-;1154:7;-1:-1:-1;;;1181:14:24;;1173:67;;;;-1:-1:-1;;;1173:67:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1265:5:24;1097:181::o;31284:97:39:-;31361:15;31284:97;:::o;2028:176:24:-;2084:6;-1:-1:-1;2110:13:24;;2102:65;;;;-1:-1:-1;;;2102:65:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1369:286:5;1456:4;1563:23;1578:7;1563:14;:23::i;:::-;:85;;;;;1602:46;1627:7;1636:11;1602:24;:46::i;2266:459:27:-;2324:7;2565:6;2561:45;;-1:-1:-1;2594:1:27;2587:8;;2561:45;2628:5;;;2632:1;2628;:5;:1;2651:5;;;;;:10;2643:56;;;;-1:-1:-1;;;2643:56:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3187:130;3245:7;3271:39;3275:1;3278;3271:39;;;;;;;;;;;;;;;;;:3;:39::i;1436:624:12:-;1812:10;;;1811:62;;-1:-1:-1;1828:39:12;;;-1:-1:-1;;;1828:39:12;;1852:4;1828:39;;;;-1:-1:-1;;;;;1828:39:12;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1828:39:12;:44;1811:62;1803:150;;;;-1:-1:-1;;;1803:150:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1990:62;;;-1:-1:-1;;;;;1990:62:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1990:62:12;-1:-1:-1;;;1990:62:12;;;1963:90;;1983:5;;1963:19;:90::i;3592:193:18:-;3695:12;3726:52;3748:6;3756:4;3762:1;3765:12;3726:21;:52::i;757:394:5:-;821:4;1016:55;1041:7;-1:-1:-1;;;1016:24:5;:55::i;:::-;:128;;;;-1:-1:-1;1088:56:5;1113:7;-1:-1:-1;;;;;;1088:24:5;:56::i;:::-;1087:57;;757:394;-1:-1:-1;;757:394:5:o;4243:395::-;4336:4;4515:12;4529:11;4544:50;4573:7;4582:11;4544:28;:50::i;:::-;4514:80;;;;4613:7;:17;;;;-1:-1:-1;4624:6:5;4605:26;-1:-1:-1;;;;4243:395:5:o;3799:272:27:-;3885:7;3919:12;3912:5;3904:28;;;;-1:-1:-1;;;3904:28:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3942:9;3958:1;3954;:5;;;;;;;3799:272;-1:-1:-1;;;;;3799:272:27:o;4619:523:18:-;4746:12;4803:5;4778:21;:30;;4770:81;;;;-1:-1:-1;;;4770:81:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4869:18;4880:6;4869:10;:18::i;:::-;4861:60;;;;;-1:-1:-1;;;4861:60:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;4992:12;5006:23;5033:6;-1:-1:-1;;;;;5033:11:18;5053:5;5061:4;5033:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5033:33:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4991:75;;;;5083:52;5101:7;5110:10;5122:12;5083:17;:52::i;5155:444:5:-;5331:57;;;-1:-1:-1;;;;;;5331:57:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5331:57:5;-1:-1:-1;;;5331:57:5;;;5436:47;;;;-1:-1:-1;;;;5331:57:5;-1:-1:-1;;5302:26:5;;-1:-1:-1;;;;;5436:18:5;;;5461:5;;5331:57;;5436:47;;;;5331:57;5436:47;;;;;;;;;;-1:-1:-1;;5436:47:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5398:85;;;;5513:2;5497:6;:13;:18;5493:45;;;5525:5;5532;5517:21;;;;;;;;;5493:45;5556:7;5576:6;5565:26;;;;;;;;;;;;;;;-1:-1:-1;5565:26:5;5548:44;;-1:-1:-1;5565:26:5;-1:-1:-1;;;;5155:444:5;;;;;;:::o;6122:725:18:-;6237:12;6265:7;6261:580;;;-1:-1:-1;6295:10:18;6288:17;;6261:580;6406:17;;:21;6402:429;;6664:10;6658:17;6724:15;6711:10;6707:2;6703:19;6696:44;6613:145;6796:20;;-1:-1:-1;;;6796:20:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6796:20:18;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "3484400",
                "executionCost": "3901",
                "totalCost": "3488301"
              },
              "external": {
                "VERSION()": "infinite",
                "accountedBalance()": "infinite",
                "award(address,uint256,address)": "infinite",
                "awardBalance()": "1044",
                "awardExternalERC20(address,address,uint256)": "infinite",
                "awardExternalERC721(address,address,uint256[])": "infinite",
                "balance()": "infinite",
                "balanceOfCredit(address,address)": "infinite",
                "beforeTokenTransfer(address,address,uint256)": "infinite",
                "calculateEarlyExitFee(address,address,uint256)": "infinite",
                "calculateReserveFee(uint256)": "infinite",
                "canAwardExternal(address)": "1212",
                "captureAwardBalance()": "infinite",
                "compLikeDelegate(address,address)": "infinite",
                "creditPlanOf(address)": "1357",
                "depositTo(address,uint256,address,address)": "infinite",
                "estimateCreditAccrualTime(address,uint256,uint256)": "infinite",
                "initialize(address,address[],uint256)": "infinite",
                "initializeYieldSourcePrizePool(address,address[],uint256,address)": "infinite",
                "isControlled(address)": "infinite",
                "liquidityCap()": "1132",
                "maxExitFeeMantissa()": "1065",
                "onERC721Received(address,address,uint256,bytes)": "629",
                "owner()": "1083",
                "prizeStrategy()": "1149",
                "renounceOwnership()": "infinite",
                "reserveRegistry()": "1105",
                "reserveTotalSupply()": "1064",
                "setCreditPlanOf(address,uint128,uint128)": "infinite",
                "setLiquidityCap(uint256)": "infinite",
                "setPrizeStrategy(address)": "infinite",
                "token()": "infinite",
                "tokens()": "infinite",
                "transferExternalERC20(address,address,uint256)": "infinite",
                "transferOwnership(address)": "infinite",
                "withdrawInstantlyFrom(address,uint256,address,uint256)": "infinite",
                "withdrawReserve(address)": "infinite",
                "yieldSource()": "1082"
              },
              "internal": {
                "_balance()": "infinite",
                "_canAwardExternal(address)": "851",
                "_redeem(uint256)": "infinite",
                "_supply(uint256)": "infinite",
                "_token()": "infinite"
              }
            },
            "methodIdentifiers": {
              "VERSION()": "ffa1ad74",
              "accountedBalance()": "0937eb54",
              "award(address,uint256,address)": "6b1b863a",
              "awardBalance()": "630665b4",
              "awardExternalERC20(address,address,uint256)": "2b0ab144",
              "awardExternalERC721(address,address,uint256[])": "16960d55",
              "balance()": "b69ef8a8",
              "balanceOfCredit(address,address)": "494de9f7",
              "beforeTokenTransfer(address,address,uint256)": "7cbab1c7",
              "calculateEarlyExitFee(address,address,uint256)": "888c2b6f",
              "calculateReserveFee(uint256)": "9fe32a91",
              "canAwardExternal(address)": "6a3fd4f9",
              "captureAwardBalance()": "e6d8a94b",
              "compLikeDelegate(address,address)": "2f7627e3",
              "creditPlanOf(address)": "d4a1361d",
              "depositTo(address,uint256,address,address)": "e323f825",
              "estimateCreditAccrualTime(address,uint256,uint256)": "79cb8563",
              "initialize(address,address[],uint256)": "3ede50c6",
              "initializeYieldSourcePrizePool(address,address[],uint256,address)": "cfa24007",
              "isControlled(address)": "78b3d327",
              "liquidityCap()": "76687d3d",
              "maxExitFeeMantissa()": "9e167519",
              "onERC721Received(address,address,uint256,bytes)": "150b7a02",
              "owner()": "8da5cb5b",
              "prizeStrategy()": "98bf3eb6",
              "renounceOwnership()": "715018a6",
              "reserveRegistry()": "8e71c1f6",
              "reserveTotalSupply()": "edb4e1cf",
              "setCreditPlanOf(address,uint128,uint128)": "a7b2cc31",
              "setLiquidityCap(uint256)": "7b99adb1",
              "setPrizeStrategy(address)": "91ca480e",
              "token()": "fc0c546a",
              "tokens()": "9d63848a",
              "transferExternalERC20(address,address,uint256)": "13f55e39",
              "transferOwnership(address)": "f2fde38b",
              "withdrawInstantlyFrom(address,uint256,address,uint256)": "a016240b",
              "withdrawReserve(address)": "52a387ab",
              "yieldSource()": "b2470e5c"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"AwardCaptured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Awarded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"AwardedExternalERC20\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"AwardedExternalERC721\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract ControlledTokenInterface\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"ControlledTokenAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CreditBurned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CreditMinted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"creditLimitMantissa\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"creditRateMantissa\",\"type\":\"uint128\"}],\"name\":\"CreditPlanSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ErrorAwardingExternalERC721\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"reserveRegistry\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxExitFeeMantissa\",\"type\":\"uint256\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"redeemed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"exitFee\",\"type\":\"uint256\"}],\"name\":\"InstantWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"liquidityCap\",\"type\":\"uint256\"}],\"name\":\"LiquidityCapSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"prizeStrategy\",\"type\":\"address\"}],\"name\":\"PrizeStrategySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ReserveFeeCaptured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ReserveWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferredExternalERC20\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"yieldSource\",\"type\":\"address\"}],\"name\":\"YieldSourcePrizePoolInitialized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accountedBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"awardBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"awardExternalERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"awardExternalERC721\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"balance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"balanceOfCredit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"beforeTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"calculateEarlyExitFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"exitFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"burnedCredit\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"calculateReserveFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_externalToken\",\"type\":\"address\"}],\"name\":\"canAwardExternal\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"captureAwardBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ICompLike\",\"name\":\"compLike\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"compLikeDelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"creditPlanOf\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"creditLimitMantissa\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"creditRateMantissa\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_principal\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_interest\",\"type\":\"uint256\"}],\"name\":\"estimateCreditAccrualTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"durationSeconds\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"_reserveRegistry\",\"type\":\"address\"},{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"_controlledTokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_maxExitFeeMantissa\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"_reserveRegistry\",\"type\":\"address\"},{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"_controlledTokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_maxExitFeeMantissa\",\"type\":\"uint256\"},{\"internalType\":\"contract IYieldSource\",\"name\":\"_yieldSource\",\"type\":\"address\"}],\"name\":\"initializeYieldSourcePrizePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ControlledTokenInterface\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"isControlled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"liquidityCap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxExitFeeMantissa\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizeStrategy\",\"outputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reserveRegistry\",\"outputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reserveTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"_creditRateMantissa\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"_creditLimitMantissa\",\"type\":\"uint128\"}],\"name\":\"setCreditPlanOf\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_liquidityCap\",\"type\":\"uint256\"}],\"name\":\"setLiquidityCap\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"_prizeStrategy\",\"type\":\"address\"}],\"name\":\"setPrizeStrategy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokens\",\"outputs\":[{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferExternalERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maximumExitFee\",\"type\":\"uint256\"}],\"name\":\"withdrawInstantlyFrom\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawReserve\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"yieldSource\",\"outputs\":[{\"internalType\":\"contract IYieldSource\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"accountedBalance()\":{\"returns\":{\"_0\":\"The current total of all tokens\"}},\"award(address,uint256,address)\":{\"details\":\"The amount awarded must be less than the awardBalance()\",\"params\":{\"amount\":\"The amount of assets to be awarded\",\"controlledToken\":\"The address of the asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"awardBalance()\":{\"details\":\"captureAwardBalance() should be called first\",\"returns\":{\"_0\":\"The total amount of assets to be awarded for the current prize\"}},\"awardExternalERC20(address,address,uint256)\":{\"details\":\"Used to award any arbitrary tokens held by the Prize Pool\",\"params\":{\"amount\":\"The amount of external assets to be awarded\",\"externalToken\":\"The address of the external asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"awardExternalERC721(address,address,uint256[])\":{\"details\":\"Used to award any arbitrary NFTs held by the Prize Pool\",\"params\":{\"externalToken\":\"The address of the external NFT token being awarded\",\"to\":\"The address of the winner that receives the award\",\"tokenIds\":\"An array of NFT Token IDs to be transferred\"}},\"balance()\":{\"details\":\"Returns the total underlying balance of all assets. This includes both principal and interest.\",\"returns\":{\"_0\":\"The underlying balance of assets\"}},\"balanceOfCredit(address,address)\":{\"params\":{\"user\":\"The user whose credit balance should be returned\"},\"returns\":{\"_0\":\"The balance of the users credit\"}},\"beforeTokenTransfer(address,address,uint256)\":{\"params\":{\"amount\":\"The amount of tokens being trasferred\",\"from\":\"The address the tokens are being transferred from (0 if minting)\",\"to\":\"The address the tokens are being transferred to (0 if burning)\"}},\"calculateEarlyExitFee(address,address,uint256)\":{\"params\":{\"amount\":\"The amount of collateral to be withdrawn\",\"controlledToken\":\"The type of collateral being withdrawn\",\"from\":\"The user who is withdrawing\"},\"returns\":{\"burnedCredit\":\"The user's credit that was burned\",\"exitFee\":\"The exit fee\"}},\"calculateReserveFee(uint256)\":{\"params\":{\"amount\":\"The prize amount\"},\"returns\":{\"_0\":\"The size of the reserve portion of the prize\"}},\"canAwardExternal(address)\":{\"details\":\"Checks with the Prize Pool if a specific token type may be awarded as an external prize\",\"params\":{\"_externalToken\":\"The address of the token to check\"},\"returns\":{\"_0\":\"True if the token may be awarded, false otherwise\"}},\"captureAwardBalance()\":{\"details\":\"This function also captures the reserve fees.\",\"returns\":{\"_0\":\"The total amount of assets to be awarded for the current prize\"}},\"compLikeDelegate(address,address)\":{\"params\":{\"compLike\":\"The COMP-like token held by the prize pool that should be delegated\",\"to\":\"The address to delegate to \"}},\"creditPlanOf(address)\":{\"params\":{\"controlledToken\":\"The controlled token to retrieve the credit rates for\"},\"returns\":{\"creditLimitMantissa\":\"The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\",\"creditRateMantissa\":\"The credit rate. This is the amount of tokens that accrue per second.\"}},\"depositTo(address,uint256,address,address)\":{\"params\":{\"amount\":\"The amount of assets to deposit\",\"controlledToken\":\"The address of the type of token the user is minting\",\"referrer\":\"The referrer of the deposit\",\"to\":\"The address receiving the newly minted tokens\"}},\"estimateCreditAccrualTime(address,uint256,uint256)\":{\"params\":{\"_interest\":\"The amount of interest that must accrue\",\"_principal\":\"The principal amount on which interest is accruing\"},\"returns\":{\"durationSeconds\":\"The duration of time it will take to accrue the given amount of interest, in seconds.\"}},\"initialize(address,address[],uint256)\":{\"params\":{\"_controlledTokens\":\"Array of ControlledTokens that are controlled by this Prize Pool.\",\"_maxExitFeeMantissa\":\"The maximum exit fee size\"}},\"initializeYieldSourcePrizePool(address,address[],uint256,address)\":{\"params\":{\"_controlledTokens\":\"Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\",\"_maxExitFeeMantissa\":\"The maximum exit fee size, relative to the withdrawal amount\",\"_yieldSource\":\"Address of the yield source\"}},\"isControlled(address)\":{\"details\":\"Checks if a specific token is controlled by the Prize Pool\",\"params\":{\"controlledToken\":\"The address of the token to check\"},\"returns\":{\"_0\":\"True if the token is a controlled token, false otherwise\"}},\"onERC721Received(address,address,uint256,bytes)\":{\"params\":{\"data\":\"Additional data with no specified format, sent in call to `_to`.\",\"from\":\"The current owner of the NFT\",\"operator\":\"The address that acts on behalf of the owner\",\"tokenId\":\"The NFT to transfer\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setCreditPlanOf(address,uint128,uint128)\":{\"params\":{\"_controlledToken\":\"The controlled token for whom to set the credit plan\",\"_creditLimitMantissa\":\"The credit limit to set.  Is a fixed point 18 decimal (like Ether).\",\"_creditRateMantissa\":\"The credit rate to set.  Is a fixed point 18 decimal (like Ether).\"}},\"setLiquidityCap(uint256)\":{\"params\":{\"_liquidityCap\":\"The new liquidity cap for the prize pool\"}},\"setPrizeStrategy(address)\":{\"params\":{\"_prizeStrategy\":\"The new prize strategy\"}},\"token()\":{\"details\":\"Returns the address of the underlying ERC20 asset\",\"returns\":{\"_0\":\"The address of the asset\"}},\"tokens()\":{\"returns\":{\"_0\":\"An array of controlled token addresses\"}},\"transferExternalERC20(address,address,uint256)\":{\"details\":\"Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\",\"params\":{\"amount\":\"The amount of external assets to be awarded\",\"externalToken\":\"The address of the external asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"withdrawInstantlyFrom(address,uint256,address,uint256)\":{\"params\":{\"amount\":\"The amount of tokens to redeem for assets.\",\"controlledToken\":\"The address of the token to redeem (i.e. ticket or sponsorship)\",\"from\":\"The address to redeem tokens from.\",\"maximumExitFee\":\"The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\"},\"returns\":{\"_0\":\"The actual exit fee paid\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"VERSION()\":{\"notice\":\"Semver Version\"},\"accountedBalance()\":{\"notice\":\"The total of all controlled tokens\"},\"award(address,uint256,address)\":{\"notice\":\"Called by the prize strategy to award prizes.\"},\"awardBalance()\":{\"notice\":\"Returns the balance that is available to award.\"},\"awardExternalERC20(address,address,uint256)\":{\"notice\":\"Called by the Prize-Strategy to award external ERC20 prizes\"},\"awardExternalERC721(address,address,uint256[])\":{\"notice\":\"Called by the prize strategy to award external ERC721 prizes\"},\"balanceOfCredit(address,address)\":{\"notice\":\"Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\"},\"beforeTokenTransfer(address,address,uint256)\":{\"notice\":\"Updates the Prize Strategy when tokens are transferred between holders.\"},\"calculateEarlyExitFee(address,address,uint256)\":{\"notice\":\"Calculates the early exit fee for the given amount\"},\"calculateReserveFee(uint256)\":{\"notice\":\"Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\"},\"captureAwardBalance()\":{\"notice\":\"Captures any available interest as award balance.\"},\"compLikeDelegate(address,address)\":{\"notice\":\"Delegate the votes for a Compound COMP-like token held by the prize pool\"},\"creditPlanOf(address)\":{\"notice\":\"Returns the credit rate of a controlled token\"},\"depositTo(address,uint256,address,address)\":{\"notice\":\"Deposit assets into the Prize Pool in exchange for tokens\"},\"estimateCreditAccrualTime(address,uint256,uint256)\":{\"notice\":\"Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\"},\"initialize(address,address[],uint256)\":{\"notice\":\"Initializes the Prize Pool\"},\"initializeYieldSourcePrizePool(address,address[],uint256,address)\":{\"notice\":\"Initializes the Prize Pool and Yield Service with the required contract connections\"},\"onERC721Received(address,address,uint256,bytes)\":{\"notice\":\"Required for ERC721 safe token transfers from smart contracts.\"},\"setCreditPlanOf(address,uint128,uint128)\":{\"notice\":\"Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\"},\"setLiquidityCap(uint256)\":{\"notice\":\"Allows the Governor to set a cap on the amount of liquidity that he pool can hold\"},\"setPrizeStrategy(address)\":{\"notice\":\"Sets the prize strategy of the prize pool.  Only callable by the owner.\"},\"tokens()\":{\"notice\":\"An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\"},\"transferExternalERC20(address,address,uint256)\":{\"notice\":\"Called by the Prize-Strategy to transfer out external ERC20 tokens\"},\"withdrawInstantlyFrom(address,uint256,address,uint256)\":{\"notice\":\"Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/prize-pool/yield-source/YieldSourcePrizePool.sol\":\"YieldSourcePrizePool\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"@pooltogether/yield-source-interface/contracts/IYieldSource.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.4.0 <0.8.0;\\n\\n/// @title Defines the functions used to interact with a yield source.  The Prize Pool inherits this contract.\\n/// @notice Prize Pools subclasses need to implement this interface so that yield can be generated.\\ninterface IYieldSource {\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function depositToken() external view returns (address);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function balanceOfToken(address addr) external returns (uint256);\\n\\n  /// @notice Supplies tokens to the yield source.  Allows assets to be supplied on other user's behalf using the `to` param.\\n  /// @param amount The amount of `token()` to be supplied\\n  /// @param to The user whose balance will receive the tokens\\n  function supplyTokenTo(uint256 amount, address to) external;\\n\\n  /// @notice Redeems tokens from the yield source.\\n  /// @param amount The amount of `token()` to withdraw.  Denominated in `token()` as above.\\n  /// @return The actual amount of tokens that were redeemed.\\n  function redeemToken(uint256 amount) external returns (uint256);\\n\\n}\\n\",\"keccak256\":\"0xee862089c29ec1f9b2a1df7c01953d88ef5dfcfb2c2198e8926f692ec76537f1\",\"license\":\"MIT\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../external/compound/ICompLike.sol\\\";\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../reserve/ReserveInterface.sol\\\";\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/TokenListenerLibrary.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\nimport \\\"./PrizePoolInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using SafeERC20Upgradeable for IERC721Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    address reserveRegistry,\\n    uint256 maxExitFeeMantissa\\n  );\\n\\n  /// @dev Event emitted when controlled token is added\\n  event ControlledTokenAdded(\\n    ControlledTokenInterface indexed token\\n  );\\n\\n  /// @dev Emitted when reserve is captured.\\n  event ReserveFeeCaptured(\\n    uint256 amount\\n  );\\n\\n  event AwardCaptured(\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when assets are deposited\\n  event Deposited(\\n    address indexed operator,\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount,\\n    address referrer\\n  );\\n\\n  /// @dev Event emitted when interest is awarded to a winner\\n  event Awarded(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are awarded to a winner\\n  event AwardedExternalERC20(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are transferred out\\n  event TransferredExternalERC20(\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC721s are awarded to a winner\\n  event AwardedExternalERC721(\\n    address indexed winner,\\n    address indexed token,\\n    uint256[] tokenIds\\n  );\\n\\n  /// @dev Event emitted when assets are withdrawn instantly\\n  event InstantWithdrawal(\\n    address indexed operator,\\n    address indexed from,\\n    address indexed token,\\n    uint256 amount,\\n    uint256 redeemed,\\n    uint256 exitFee\\n  );\\n\\n  event ReserveWithdrawal(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when the Liquidity Cap is set\\n  event LiquidityCapSet(\\n    uint256 liquidityCap\\n  );\\n\\n  /// @dev Event emitted when the Credit plan is set\\n  event CreditPlanSet(\\n    address token,\\n    uint128 creditLimitMantissa,\\n    uint128 creditRateMantissa\\n  );\\n\\n  /// @dev Event emitted when the Prize Strategy is set\\n  event PrizeStrategySet(\\n    address indexed prizeStrategy\\n  );\\n\\n  /// @dev Emitted when credit is minted\\n  event CreditMinted(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when credit is burned\\n  event CreditBurned(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\\n  event ErrorAwardingExternalERC721(bytes error);\\n\\n\\n  struct CreditPlan {\\n    uint128 creditLimitMantissa;\\n    uint128 creditRateMantissa;\\n  }\\n\\n  struct CreditBalance {\\n    uint192 balance;\\n    uint32 timestamp;\\n    bool initialized;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  /// @dev Reserve to which reserve fees are sent\\n  RegistryInterface public reserveRegistry;\\n\\n  /// @dev An array of all the controlled tokens\\n  ControlledTokenInterface[] internal _tokens;\\n\\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\\n  TokenListenerInterface public prizeStrategy;\\n\\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\\n  /// For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\\n  uint256 public maxExitFeeMantissa;\\n\\n  /// @dev The total funds that have been allocated to the reserve\\n  uint256 public reserveTotalSupply;\\n\\n  /// @dev The total amount of funds that the prize pool can hold.\\n  uint256 public liquidityCap;\\n\\n  /// @dev the The awardable balance\\n  uint256 internal _currentAwardBalance;\\n\\n  /// @dev Stores the credit plan for each token.\\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\\n\\n  /// @dev Stores each users balance of credit per token.\\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\\n\\n  /// @notice Initializes the Prize Pool\\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\\n  /// @param _maxExitFeeMantissa The maximum exit fee size\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_reserveRegistry) != address(0), \\\"PrizePool/reserveRegistry-not-zero\\\");\\n    uint256 controlledTokensLength = _controlledTokens.length;\\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\\n\\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\\n      _addControlledToken(controlledToken, i);\\n    }\\n    __Ownable_init();\\n    __ReentrancyGuard_init();\\n    _setLiquidityCap(uint256(-1));\\n\\n    reserveRegistry = _reserveRegistry;\\n    maxExitFeeMantissa = _maxExitFeeMantissa;\\n\\n    emit Initialized(\\n      address(_reserveRegistry),\\n      maxExitFeeMantissa\\n    );\\n  }\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external override view returns (address) {\\n    return address(_token());\\n  }\\n\\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\\n  /// @return The underlying balance of assets\\n  function balance() external returns (uint256) {\\n    return _balance();\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function canAwardExternal(address _externalToken) external view returns (bool) {\\n    return _canAwardExternal(_externalToken);\\n  }\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    canAddLiquidity(amount)\\n  {\\n    address operator = _msgSender();\\n\\n    _mint(to, amount, controlledToken, referrer);\\n\\n    _token().safeTransferFrom(operator, address(this), amount);\\n    _supply(amount);\\n\\n    emit Deposited(operator, to, controlledToken, amount, referrer);\\n  }\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    returns (uint256)\\n  {\\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n    require(exitFee <= maximumExitFee, \\\"PrizePool/exit-fee-exceeds-user-maximum\\\");\\n\\n    // burn the credit\\n    _burnCredit(from, controlledToken, burnedCredit);\\n\\n    // burn the tickets\\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\\n\\n    // redeem the tickets less the fee\\n    uint256 amountLessFee = amount.sub(exitFee);\\n    uint256 redeemed = _redeem(amountLessFee);\\n\\n    _token().safeTransfer(from, redeemed);\\n\\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\\n\\n    return exitFee;\\n  }\\n\\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\\n  /// @param exitFee The exit fee to check against the limit\\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\\n    if (exitFee > maxFee) {\\n      exitFee = maxFee;\\n    }\\n    return exitFee;\\n  }\\n\\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\\n  /// @param from The address the tokens are being transferred from (0 if minting)\\n  /// @param to The address the tokens are being transferred to (0 if burning)\\n  /// @param amount The amount of tokens being trasferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\\n    if (from != address(0)) {\\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\\n      // first accrue credit for their old balance\\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\\n\\n      if (from != to) {\\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\\n      }\\n\\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\\n    }\\n    if (to != address(0) && to != from) {\\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\\n    }\\n    // if we aren't minting\\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\\n    }\\n  }\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external override view returns (uint256) {\\n    return _currentAwardBalance;\\n  }\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n\\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\\n    uint256 currentBalance = _balance();\\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\\n\\n    if (unaccountedPrizeBalance > 0) {\\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\\n      if (reserveFee > 0) {\\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\\n        emit ReserveFeeCaptured(reserveFee);\\n      }\\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\\n\\n      emit AwardCaptured(unaccountedPrizeBalance);\\n    }\\n\\n    return _currentAwardBalance;\\n  }\\n\\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\\n\\n    uint256 amount = reserveTotalSupply;\\n    reserveTotalSupply = 0;\\n    uint256 redeemed = _redeem(amount);\\n\\n    _token().safeTransfer(address(to), redeemed);\\n\\n    emit ReserveWithdrawal(to, amount);\\n\\n    return redeemed;\\n  }\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external override\\n    onlyPrizeStrategy\\n    onlyControlledToken(controlledToken)\\n  {\\n    if (amount == 0) {\\n      return;\\n    }\\n\\n    require(amount <= _currentAwardBalance, \\\"PrizePool/award-exceeds-avail\\\");\\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\\n\\n    _mint(to, amount, controlledToken, address(0));\\n\\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\\n\\n    emit Awarded(to, controlledToken, amount);\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit TransferredExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit AwardedExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  function _transferOut(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (bool)\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (amount == 0) {\\n      return false;\\n    }\\n\\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\\n\\n    return true;\\n  }\\n\\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\\n  /// @param to The user who is receiving the tokens\\n  /// @param amount The amount of tokens they are receiving\\n  /// @param controlledToken The token that is going to be minted\\n  /// @param referrer The user who referred the minting\\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\\n    if (address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n    ControlledToken(controlledToken).controllerMint(to, amount);\\n  }\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (tokenIds.length == 0) {\\n      return;\\n    }\\n\\n    for (uint256 i = 0; i < tokenIds.length; i++) {\\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\\n\\n      }\\n      catch(bytes memory error){\\n        emit ErrorAwardingExternalERC721(error);\\n      }\\n      \\n    }\\n\\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\\n  }\\n\\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\\n  /// @param amount The prize amount\\n  /// @return The size of the reserve portion of the prize\\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    if (address(reserve) == address(0)) {\\n      return 0;\\n    }\\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\\n    if (reserveRateMantissa == 0) {\\n      return 0;\\n    }\\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\\n  }\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external override\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    )\\n  {\\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n  }\\n\\n  /// @dev Calculates the early exit fee for the given amount\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return Exit fee\\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\\n    return _limitExitFee(\\n      amount,\\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external override\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    durationSeconds =_estimateCreditAccrualTime(\\n      _controlledToken,\\n      _principal,\\n      _interest\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function _estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    internal\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    // interest = credit rate * principal * time\\n    // => time = interest / (credit rate * principal)\\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\\n    if (accruedPerSecond == 0) {\\n      return 0;\\n    }\\n    return _interest.div(accruedPerSecond);\\n  }\\n\\n  /// @notice Burns a users credit.\\n  /// @param user The user whose credit should be burned\\n  /// @param credit The amount of credit to burn\\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\\n\\n    emit CreditBurned(user, controlledToken, credit);\\n  }\\n\\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\\n  /// @param user The user for whom to accrue credit\\n  /// @param controlledToken The controlled token whose balance we are checking\\n  /// @param controlledTokenBalance The balance to use for the user\\n  /// @param extra Additional credit to be added\\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\\n    _updateCreditBalance(\\n      user,\\n      controlledToken,\\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\\n    );\\n  }\\n\\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\\n    uint256 newBalance;\\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\\n    if (!creditBalance.initialized) {\\n      newBalance = 0;\\n    } else {\\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\\n    }\\n    return newBalance;\\n  }\\n\\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\\n\\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\\n      balance: newBalance.toUint128(),\\n      timestamp: _currentTime().toUint32(),\\n      initialized: true\\n    });\\n\\n    if (oldBalance < newBalance) {\\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\\n    } \\n    else if (newBalance < oldBalance) {\\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\\n    }\\n  }\\n\\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\\n  /// @param creditBalance The new credit balance to be checked\\n  /// @return The users new credit balance.  Will not exceed the credit limit.\\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\\n      controlledTokenBalance,\\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\\n    );\\n    if (creditBalance > creditLimit) {\\n      creditBalance = creditLimit;\\n    }\\n\\n    return creditBalance;\\n  }\\n\\n  /// @notice Calculates the accrued interest for a user\\n  /// @param user The user whose credit should be calculated.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\\n  /// @return The credit that has accrued since the last credit update.\\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\\n\\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\\n      return 0;\\n    }\\n\\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\\n  }\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\\n    return _tokenCreditBalances[controlledToken][user].balance;\\n  }\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external override\\n    onlyControlledToken(_controlledToken)\\n    onlyOwner\\n  {\\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\\n      creditLimitMantissa: _creditLimitMantissa,\\n      creditRateMantissa: _creditRateMantissa\\n    });\\n\\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\\n  }\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external override\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    )\\n  {\\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\\n  }\\n\\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The token they are withdrawing\\n  /// @param amount The amount of funds they are withdrawing\\n  /// @return earlyExitFee The additional exit fee that should be charged.\\n  /// @return creditBurned The amount of credit that will be burned\\n  function _calculateEarlyExitFeeLessBurnedCredit(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (\\n      uint256 earlyExitFee,\\n      uint256 creditBurned\\n    )\\n  {\\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\\n    require(controlledTokenBalance >= amount, \\\"PrizePool/insuff-funds\\\");\\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\\n    /*\\n    The credit is used *last*.  Always charge the fees up-front.\\n\\n    How to calculate:\\n\\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\\n\\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\\n    */\\n\\n    // Determine available usable credit based on withdraw amount\\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\\n\\n    uint256 availableCredit;\\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\\n    }\\n\\n    // Determine amount of credit to burn and amount of fees required\\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\\n    earlyExitFee = totalExitFee.sub(creditBurned);\\n  }\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\\n    _setLiquidityCap(_liquidityCap);\\n  }\\n\\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\\n    liquidityCap = _liquidityCap;\\n    emit LiquidityCapSet(_liquidityCap);\\n  }\\n\\n  /// @notice Adds a new controlled token\\n  /// @param _controlledToken The controlled token to add.\\n  /// @param index The index to add the controlledToken\\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\\n    require(_controlledToken.controller() == this, \\\"PrizePool/token-ctrlr-mismatch\\\");\\n    \\n    _tokens[index] = _controlledToken;\\n    emit ControlledTokenAdded(_controlledToken);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\\n    _setPrizeStrategy(_prizeStrategy);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\\n    require(address(_prizeStrategy) != address(0), \\\"PrizePool/prizeStrategy-not-zero\\\");\\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PrizePool/prizeStrategy-invalid\\\");\\n    prizeStrategy = _prizeStrategy;\\n\\n    emit PrizeStrategySet(address(_prizeStrategy));\\n  }\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\\n    return _tokens;\\n  }\\n\\n  /// @dev Gets the current time as represented by the current block\\n  /// @return The timestamp of the current block\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external override view returns (uint256) {\\n    return _tokenTotalSupply();\\n  }\\n\\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\\n  /// @param to The address to delegate to \\n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\\n    if (compLike.balanceOf(address(this)) > 0) {\\n      compLike.delegate(to);\\n    }\\n  }\\n  \\n  /// @notice Required for ERC721 safe token transfers from smart contracts.\\n  /// @param operator The address that acts on behalf of the owner\\n  /// @param from The current owner of the NFT\\n  /// @param tokenId The NFT to transfer\\n  /// @param data Additional data with no specified format, sent in call to `_to`.\\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function _tokenTotalSupply() internal view returns (uint256) {\\n    uint256 total = reserveTotalSupply;\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \\n    uint256 tokensLength = tokens.length;\\n    \\n    for(uint256 i = 0; i < tokensLength; i++){\\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\\n    }\\n\\n    return total;\\n  }\\n\\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\\n  }\\n\\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\\n    uint256 tokensLength = tokens.length;\\n\\n    for(uint256 i = 0; i < tokensLength; i++) {\\n      if(tokens[i] == controlledToken) return true;\\n    }\\n    return false;\\n  }\\n  \\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\\n    return _isControlled(controlledToken);\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function _token() internal virtual view returns (IERC20Upgradeable);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal virtual returns (uint256);\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal virtual;\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\\n\\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  modifier onlyControlledToken(address controlledToken) {\\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \\\"PrizePool/unknown-token\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure caller is the prize-strategy\\n  modifier onlyPrizeStrategy() {\\n    require(_msgSender() == address(prizeStrategy), \\\"PrizePool/only-prizeStrategy\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\\n  modifier canAddLiquidity(uint256 _amount) {\\n    require(_canAddLiquidity(_amount), \\\"PrizePool/exceeds-liquidity-cap\\\");\\n    _;\\n  }\\n\\n  modifier onlyReserve() {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    require(address(reserve) == msg.sender, \\\"PrizePool/only-reserve\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x386ebc1c80ab4424f14125e716dd12641ff933b475bf1082b7b1a6eee4a969c3\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/yield-source/YieldSourcePrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\\\";\\n\\nimport \\\"@pooltogether/yield-source-interface/contracts/IYieldSource.sol\\\";\\n\\nimport \\\"../PrizePool.sol\\\";\\n\\ncontract YieldSourcePrizePool is PrizePool {\\n\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using AddressUpgradeable for address;\\n\\n  IYieldSource public yieldSource;\\n\\n  event YieldSourcePrizePoolInitialized(address indexed yieldSource);\\n\\n  /// @notice Initializes the Prize Pool and Yield Service with the required contract connections\\n  /// @param _controlledTokens Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\\n  /// @param _maxExitFeeMantissa The maximum exit fee size, relative to the withdrawal amount\\n  /// @param _yieldSource Address of the yield source\\n  function initializeYieldSourcePrizePool (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa,\\n    IYieldSource _yieldSource\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_yieldSource).isContract(), \\\"YieldSourcePrizePool/yield-source-not-contract-address\\\");\\n    PrizePool.initialize(\\n      _reserveRegistry,\\n      _controlledTokens,\\n      _maxExitFeeMantissa\\n    );\\n    yieldSource = _yieldSource;\\n\\n    // A hack to determine whether it's an actual yield source\\n    (bool succeeded,) = address(_yieldSource).staticcall(abi.encode(_yieldSource.depositToken.selector));\\n    require(succeeded, \\\"YieldSourcePrizePool/invalid-yield-source\\\");\\n\\n    emit YieldSourcePrizePoolInitialized(address(_yieldSource));\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal override view returns (bool) {\\n    return _externalToken != address(yieldSource);\\n  }\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal override returns (uint256) {\\n    return yieldSource.balanceOfToken(address(this));\\n  }\\n\\n  function _token() internal override view returns (IERC20Upgradeable) {\\n    return IERC20Upgradeable(yieldSource.depositToken());\\n  }\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal override {\\n    _token().safeApprove(address(yieldSource), mintAmount);\\n    yieldSource.supplyTokenTo(mintAmount, address(this));\\n  }\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal override returns (uint256) {\\n    return yieldSource.redeemToken(redeemAmount);\\n  }\\n}\",\"keccak256\":\"0x74b0899be05f0fa46f6818359aabb09b10ce1e6f14b407b733adc207d5b72104\",\"license\":\"GPL-3.0\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol:YieldSourcePrizePool",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol:YieldSourcePrizePool",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol:YieldSourcePrizePool",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 10,
                "contract": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol:YieldSourcePrizePool",
                "label": "_owner",
                "offset": 0,
                "slot": "51",
                "type": "t_address"
              },
              {
                "astId": 129,
                "contract": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol:YieldSourcePrizePool",
                "label": "__gap",
                "offset": 0,
                "slot": "52",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 4743,
                "contract": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol:YieldSourcePrizePool",
                "label": "_status",
                "offset": 0,
                "slot": "101",
                "type": "t_uint256"
              },
              {
                "astId": 4786,
                "contract": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol:YieldSourcePrizePool",
                "label": "__gap",
                "offset": 0,
                "slot": "102",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 6817,
                "contract": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol:YieldSourcePrizePool",
                "label": "reserveRegistry",
                "offset": 0,
                "slot": "151",
                "type": "t_contract(RegistryInterface)12458"
              },
              {
                "astId": 6821,
                "contract": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol:YieldSourcePrizePool",
                "label": "_tokens",
                "offset": 0,
                "slot": "152",
                "type": "t_array(t_contract(ControlledTokenInterface)15850)dyn_storage"
              },
              {
                "astId": 6824,
                "contract": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol:YieldSourcePrizePool",
                "label": "prizeStrategy",
                "offset": 0,
                "slot": "153",
                "type": "t_contract(TokenListenerInterface)16265"
              },
              {
                "astId": 6827,
                "contract": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol:YieldSourcePrizePool",
                "label": "maxExitFeeMantissa",
                "offset": 0,
                "slot": "154",
                "type": "t_uint256"
              },
              {
                "astId": 6830,
                "contract": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol:YieldSourcePrizePool",
                "label": "reserveTotalSupply",
                "offset": 0,
                "slot": "155",
                "type": "t_uint256"
              },
              {
                "astId": 6833,
                "contract": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol:YieldSourcePrizePool",
                "label": "liquidityCap",
                "offset": 0,
                "slot": "156",
                "type": "t_uint256"
              },
              {
                "astId": 6836,
                "contract": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol:YieldSourcePrizePool",
                "label": "_currentAwardBalance",
                "offset": 0,
                "slot": "157",
                "type": "t_uint256"
              },
              {
                "astId": 6841,
                "contract": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol:YieldSourcePrizePool",
                "label": "_tokenCreditPlans",
                "offset": 0,
                "slot": "158",
                "type": "t_mapping(t_address,t_struct(CreditPlan)6803_storage)"
              },
              {
                "astId": 6848,
                "contract": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol:YieldSourcePrizePool",
                "label": "_tokenCreditBalances",
                "offset": 0,
                "slot": "159",
                "type": "t_mapping(t_address,t_mapping(t_address,t_struct(CreditBalance)6810_storage))"
              },
              {
                "astId": 9334,
                "contract": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol:YieldSourcePrizePool",
                "label": "yieldSource",
                "offset": 0,
                "slot": "160",
                "type": "t_contract(IYieldSource)5623"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_contract(ControlledTokenInterface)15850)dyn_storage": {
                "base": "t_contract(ControlledTokenInterface)15850",
                "encoding": "dynamic_array",
                "label": "contract ControlledTokenInterface[]",
                "numberOfBytes": "32"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_contract(ControlledTokenInterface)15850": {
                "encoding": "inplace",
                "label": "contract ControlledTokenInterface",
                "numberOfBytes": "20"
              },
              "t_contract(IYieldSource)5623": {
                "encoding": "inplace",
                "label": "contract IYieldSource",
                "numberOfBytes": "20"
              },
              "t_contract(RegistryInterface)12458": {
                "encoding": "inplace",
                "label": "contract RegistryInterface",
                "numberOfBytes": "20"
              },
              "t_contract(TokenListenerInterface)16265": {
                "encoding": "inplace",
                "label": "contract TokenListenerInterface",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_mapping(t_address,t_struct(CreditBalance)6810_storage))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => struct PrizePool.CreditBalance))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_struct(CreditBalance)6810_storage)"
              },
              "t_mapping(t_address,t_struct(CreditBalance)6810_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct PrizePool.CreditBalance)",
                "numberOfBytes": "32",
                "value": "t_struct(CreditBalance)6810_storage"
              },
              "t_mapping(t_address,t_struct(CreditPlan)6803_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct PrizePool.CreditPlan)",
                "numberOfBytes": "32",
                "value": "t_struct(CreditPlan)6803_storage"
              },
              "t_struct(CreditBalance)6810_storage": {
                "encoding": "inplace",
                "label": "struct PrizePool.CreditBalance",
                "members": [
                  {
                    "astId": 6805,
                    "contract": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol:YieldSourcePrizePool",
                    "label": "balance",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint192"
                  },
                  {
                    "astId": 6807,
                    "contract": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol:YieldSourcePrizePool",
                    "label": "timestamp",
                    "offset": 24,
                    "slot": "0",
                    "type": "t_uint32"
                  },
                  {
                    "astId": 6809,
                    "contract": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol:YieldSourcePrizePool",
                    "label": "initialized",
                    "offset": 28,
                    "slot": "0",
                    "type": "t_bool"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_struct(CreditPlan)6803_storage": {
                "encoding": "inplace",
                "label": "struct PrizePool.CreditPlan",
                "members": [
                  {
                    "astId": 6800,
                    "contract": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol:YieldSourcePrizePool",
                    "label": "creditLimitMantissa",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint128"
                  },
                  {
                    "astId": 6802,
                    "contract": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol:YieldSourcePrizePool",
                    "label": "creditRateMantissa",
                    "offset": 16,
                    "slot": "0",
                    "type": "t_uint128"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_uint128": {
                "encoding": "inplace",
                "label": "uint128",
                "numberOfBytes": "16"
              },
              "t_uint192": {
                "encoding": "inplace",
                "label": "uint192",
                "numberOfBytes": "24"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint32": {
                "encoding": "inplace",
                "label": "uint32",
                "numberOfBytes": "4"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "VERSION()": {
                "notice": "Semver Version"
              },
              "accountedBalance()": {
                "notice": "The total of all controlled tokens"
              },
              "award(address,uint256,address)": {
                "notice": "Called by the prize strategy to award prizes."
              },
              "awardBalance()": {
                "notice": "Returns the balance that is available to award."
              },
              "awardExternalERC20(address,address,uint256)": {
                "notice": "Called by the Prize-Strategy to award external ERC20 prizes"
              },
              "awardExternalERC721(address,address,uint256[])": {
                "notice": "Called by the prize strategy to award external ERC721 prizes"
              },
              "balanceOfCredit(address,address)": {
                "notice": "Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit."
              },
              "beforeTokenTransfer(address,address,uint256)": {
                "notice": "Updates the Prize Strategy when tokens are transferred between holders."
              },
              "calculateEarlyExitFee(address,address,uint256)": {
                "notice": "Calculates the early exit fee for the given amount"
              },
              "calculateReserveFee(uint256)": {
                "notice": "Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero."
              },
              "captureAwardBalance()": {
                "notice": "Captures any available interest as award balance."
              },
              "compLikeDelegate(address,address)": {
                "notice": "Delegate the votes for a Compound COMP-like token held by the prize pool"
              },
              "creditPlanOf(address)": {
                "notice": "Returns the credit rate of a controlled token"
              },
              "depositTo(address,uint256,address,address)": {
                "notice": "Deposit assets into the Prize Pool in exchange for tokens"
              },
              "estimateCreditAccrualTime(address,uint256,uint256)": {
                "notice": "Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit."
              },
              "initialize(address,address[],uint256)": {
                "notice": "Initializes the Prize Pool"
              },
              "initializeYieldSourcePrizePool(address,address[],uint256,address)": {
                "notice": "Initializes the Prize Pool and Yield Service with the required contract connections"
              },
              "onERC721Received(address,address,uint256,bytes)": {
                "notice": "Required for ERC721 safe token transfers from smart contracts."
              },
              "setCreditPlanOf(address,uint128,uint128)": {
                "notice": "Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether)."
              },
              "setLiquidityCap(uint256)": {
                "notice": "Allows the Governor to set a cap on the amount of liquidity that he pool can hold"
              },
              "setPrizeStrategy(address)": {
                "notice": "Sets the prize strategy of the prize pool.  Only callable by the owner."
              },
              "tokens()": {
                "notice": "An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)"
              },
              "transferExternalERC20(address,address,uint256)": {
                "notice": "Called by the Prize-Strategy to transfer out external ERC20 tokens"
              },
              "withdrawInstantlyFrom(address,uint256,address,uint256)": {
                "notice": "Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit."
              }
            },
            "version": 1
          }
        }
      },
      "contracts/prize-pool/yield-source/YieldSourcePrizePoolProxyFactory.sol": {
        "YieldSourcePrizePoolProxyFactory": {
          "abi": [
            {
              "inputs": [],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "name": "ProxyCreated",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "create",
              "outputs": [
                {
                  "internalType": "contract YieldSourcePrizePool",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_logic",
                  "type": "address"
                },
                {
                  "internalType": "bytes",
                  "name": "_data",
                  "type": "bytes"
                }
              ],
              "name": "deployMinimal",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "instance",
              "outputs": [
                {
                  "internalType": "contract YieldSourcePrizePool",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "create()": {
                "returns": {
                  "_0": "A reference to the new proxied Yield Source Prize Pool"
                }
              }
            },
            "title": "Yield Source Prize Pool Proxy Factory",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5060405161001d9061005f565b604051809103906000f080158015610039573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b039290921691909117905561006c565b61442e806103b283390190565b6103378061007b6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063022ec09514610046578063b3eeb5e21461006a578063efc81a8c14610120575b600080fd5b61004e610128565b604080516001600160a01b039092168252519081900360200190f35b61004e6004803603604081101561008057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100ab57600080fd5b8201836020820111156100bd57600080fd5b803590602001918460018302840111640100000000831117156100df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610137945050505050565b61004e6102b3565b6000546001600160a01b031681565b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a18251156102ac576000826001600160a01b0316846040518082805190602001908083835b602083106102035780518252601f1990920191602091820191016101e4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610265576040519150601f19603f3d011682016040523d82523d6000602084013e61026a565b606091505b50509050806102aa5760405162461bcd60e51b81526004018080602001828103825260248152602001806102de6024913960400191505060405180910390fd5b505b5092915050565b6000805460408051602081019091528281526102d8916001600160a01b031690610137565b90509056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a26469706673582212204026620bfe8834cb70bd60f478762020d516e89ee15643e3763e4ffa81a2b37564736f6c634300060c0033608060405234801561001057600080fd5b5061440e806100206000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c80638da5cb5b11610130578063b2470e5c116100b8578063e6d8a94b1161007c578063e6d8a94b14610956578063edb4e1cf1461095e578063f2fde38b14610966578063fc0c546a1461098c578063ffa1ad741461099457610232565b8063b2470e5c146107f6578063b69ef8a8146107fe578063cfa2400714610806578063d4a1361d146108c5578063e323f8251461091a57610232565b80639d63848a116100ff5780639d63848a146107025780639e1675191461075a5780639fe32a9114610762578063a016240b1461077f578063a7b2cc31146107b957610232565b80638da5cb5b146106a85780638e71c1f6146106cc57806391ca480e146106d457806398bf3eb6146106fa57610232565b8063630665b4116101be57806378b3d3271161018257806378b3d327146105ae57806379cb8563146105d45780637b99adb1146106065780637cbab1c714610623578063888c2b6f1461065957610232565b8063630665b4146105265780636a3fd4f91461052e5780636b1b863a14610568578063715018a61461059e57806376687d3d146105a657610232565b80632b0ab144116102055780632b0ab144146103bb5780632f7627e3146103f15780633ede50c61461041f578063494de9f7146104d257806352a387ab1461050057610232565b80630937eb541461023757806313f55e3914610251578063150b7a021461028957806316960d5514610334575b600080fd5b61023f610a11565b60408051918252519081900360200190f35b6102876004803603606081101561026757600080fd5b506001600160a01b03813581169160208101359091169060400135610a20565b005b6103176004803603608081101561029f57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156102d957600080fd5b8201836020820111156102eb57600080fd5b803590602001918460018302840111600160201b8311171561030c57600080fd5b509092509050610ade565b604080516001600160e01b03199092168252519081900360200190f35b6102876004803603606081101561034a57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561037d57600080fd5b82018360208201111561038f57600080fd5b803590602001918460208302840111600160201b831117156103b057600080fd5b509092509050610aef565b610287600480360360608110156103d157600080fd5b506001600160a01b03813581169160208101359091169060400135610d9c565b6102876004803603604081101561040757600080fd5b506001600160a01b0381358116916020013516610e59565b6102876004803603606081101561043557600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561045f57600080fd5b82018360208201111561047157600080fd5b803590602001918460208302840111600160201b8311171561049257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250610fa8915050565b61023f600480360360408110156104e857600080fd5b506001600160a01b038135811691602001351661119a565b61023f6004803603602081101561051657600080fd5b50356001600160a01b03166112a1565b61023f6113f0565b6105546004803603602081101561054457600080fd5b50356001600160a01b03166113f6565b604080519115158252519081900360200190f35b6102876004803603606081101561057e57600080fd5b506001600160a01b03813581169160208101359160409091013516611409565b610287611611565b61023f6116bd565b610554600480360360208110156105c457600080fd5b50356001600160a01b03166116c3565b61023f600480360360608110156105ea57600080fd5b506001600160a01b0381351690602081013590604001356116ce565b6102876004803603602081101561061c57600080fd5b50356116e3565b6102876004803603606081101561063957600080fd5b506001600160a01b03813581169160208101359091169060400135611751565b61068f6004803603606081101561066f57600080fd5b506001600160a01b0381358116916020810135909116906040013561199d565b6040805192835260208301919091528051918290030190f35b6106b06119b7565b604080516001600160a01b039092168252519081900360200190f35b6106b06119c6565b610287600480360360208110156106ea57600080fd5b50356001600160a01b03166119d5565b6106b0611a40565b61070a611a4f565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561074657818101518382015260200161072e565b505050509050019250505060405180910390f35b61023f611ab1565b61023f6004803603602081101561077857600080fd5b5035611ab7565b61023f6004803603608081101561079557600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611be5565b610287600480360360608110156107cf57600080fd5b506001600160a01b03813516906001600160801b0360208201358116916040013516611e1c565b6106b0611f72565b61023f611f81565b6102876004803603608081101561081c57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561084657600080fd5b82018360208201111561085857600080fd5b803590602001918460208302840111600160201b8311171561087957600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602001356001600160a01b0316611f8b565b6108eb600480360360208110156108db57600080fd5b50356001600160a01b03166121d6565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b6102876004803603608081101561093057600080fd5b506001600160a01b03813581169160208101359160408201358116916060013516612206565b61023f6123bb565b61023f612531565b6102876004803603602081101561097c57600080fd5b50356001600160a01b0316612537565b6106b061263a565b61099c612644565b6040805160208082528351818301528351919283929083019185019080838360005b838110156109d65781810151838201526020016109be565b50505050905090810190601f168015610a035780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610a1b612665565b905090565b6099546001600160a01b0316610a34612770565b6001600160a01b031614610a7d576040805162461bcd60e51b815260206004820152601c60248201526000805160206143b9833981519152604482015290519081900360640190fd5b610a88838383612774565b15610ad957816001600160a01b0316836001600160a01b03167fb0bac59718cd343c80a813518afcf36846cfcfe6d56e2b3cab9bd49f5f9b251c836040518082815260200191505060405180910390a35b505050565b630a85bd0160e11b95945050505050565b6099546001600160a01b0316610b03612770565b6001600160a01b031614610b4c576040805162461bcd60e51b815260206004820152601c60248201526000805160206143b9833981519152604482015290519081900360640190fd5b610b55836127fc565b610ba6576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b80610bb057610d96565b60005b81811015610d1d57836001600160a01b03166342842e0e3087868686818110610bd857fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610c3557600080fd5b505af1925050508015610c46575060015b610d15573d808015610c74576040519150601f19603f3d011682016040523d82523d6000602084013e610c79565b606091505b507f17e975018310f88872b58d4d8263adca83cf5c1893496ea2a86923dab15276ad816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610cd9578181015183820152602001610cc1565b50505050905090810190601f168015610d065780820380516001836020036101000a031916815260200191505b509250505060405180910390a1505b600101610bb3565b50826001600160a01b0316846001600160a01b03167f69c2de32bc4d47f488e72626a6cfdee85089342e52675e7de79c4b417623960c848460405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a35b50505050565b6099546001600160a01b0316610db0612770565b6001600160a01b031614610df9576040805162461bcd60e51b815260206004820152601c60248201526000805160206143b9833981519152604482015290519081900360640190fd5b610e04838383612774565b15610ad957816001600160a01b0316836001600160a01b03167fc65f48aca3b7a99b7443d04b8ffbb073156179bc628dc3f7def5047748973469836040518082815260200191505060405180910390a3505050565b610e61612770565b6001600160a01b0316610e726119b7565b6001600160a01b031614610ebb576040805162461bcd60e51b81526020600482018190526024820152600080516020614296833981519152604482015290519081900360640190fd5b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f0a57600080fd5b505afa158015610f1e573d6000803e3d6000fd5b505050506040513d6020811015610f3457600080fd5b50511115610fa457816001600160a01b0316635c19a95c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015610f8b57600080fd5b505af1158015610f9f573d6000803e3d6000fd5b505050505b5050565b600054610100900460ff1680610fc15750610fc1612811565b80610fcf575060005460ff16155b61100a5760405162461bcd60e51b815260040180806020018281038252602e815260200180614247602e913960400191505060405180910390fd5b600054610100900460ff16158015611035576000805460ff1961ff0019909116610100171660011790555b6001600160a01b03841661107a5760405162461bcd60e51b81526004018080602001828103825260228152602001806141ff6022913960400191505060405180910390fd5b82518067ffffffffffffffff8111801561109357600080fd5b506040519080825280602002602001820160405280156110bd578160200160208202803683370190505b5080516110d29160989160209091019061410d565b5060005b818110156111095760008582815181106110ec57fe5b602002602001015190506111008183612822565b506001016110d6565b5061111261294d565b61111a6129fe565b611125600019612a93565b609780546001600160a01b0319166001600160a01b038716908117909155609a849055604080519182526020820185905280517f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce799281900390910190a1508015610d96576000805461ff001916905550505050565b6000816111a681612ace565b6111e5576040805162461bcd60e51b815260206004820152601760248201526000805160206142dd833981519152604482015290519081900360640190fd5b61126a8484856001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d602081101561126157600080fd5b50516000612b8a565b50506001600160a01b039081166000908152609f60209081526040808320949093168252929092529020546001600160c01b031690565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156112f257600080fd5b505afa158015611306573d6000803e3d6000fd5b505050506040513d602081101561131c57600080fd5b505190506001600160a01b0381163314611376576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f6f6e6c792d7265736572766560501b604482015290519081900360640190fd5b609b80546000918290559061138a82612ba0565b90506113a98582611399612c1e565b6001600160a01b03169190612c94565b6040805183815290516001600160a01b038716917f1c71c8e11fd443227c8f8d3dc1a237a3a5e8310b540c7fbcf5169754aedf42c9919081900360200190a2949350505050565b609d5490565b6000611401826127fc565b90505b919050565b6099546001600160a01b031661141d612770565b6001600160a01b031614611466576040805162461bcd60e51b815260206004820152601c60248201526000805160206143b9833981519152604482015290519081900360640190fd5b8061147081612ace565b6114af576040805162461bcd60e51b815260206004820152601760248201526000805160206142dd833981519152604482015290519081900360640190fd5b826114b957610d96565b609d54831115611510576040805162461bcd60e51b815260206004820152601d60248201527f5072697a65506f6f6c2f61776172642d657863656564732d617661696c000000604482015290519081900360640190fd5b609d5461151d9084612ce6565b609d5561152d8484846000612d48565b60006115398385612e2e565b90506115bf8584856001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561158d57600080fd5b505afa1580156115a1573d6000803e3d6000fd5b505050506040513d60208110156115b757600080fd5b505184612b8a565b826001600160a01b0316856001600160a01b03167fe2554529d99ab7a67db6b4cea2b32c7d55ae325f958861e05f304fdded867e31866040518082815260200191505060405180910390a35050505050565b611619612770565b6001600160a01b031661162a6119b7565b6001600160a01b031614611673576040805162461bcd60e51b81526020600482018190526024820152600080516020614296833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b609c5481565b600061140182612ace565b60006116db848484612e66565b949350505050565b6116eb612770565b6001600160a01b03166116fc6119b7565b6001600160a01b031614611745576040805162461bcd60e51b81526020600482018190526024820152600080516020614296833981519152604482015290519081900360640190fd5b61174e81612a93565b50565b3361175b81612ace565b61179a576040805162461bcd60e51b815260206004820152601760248201526000805160206142dd833981519152604482015290519081900360640190fd5b6001600160a01b03841615611874576000336001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156117f857600080fd5b505afa15801561180c573d6000803e3d6000fd5b505050506040513d602081101561182257600080fd5b50519050600061183486338484612ec0565b9050846001600160a01b0316866001600160a01b031614611866576118633361185d8487612ce6565b83612f4f565b90505b611871863383612f95565b50505b6001600160a01b0383161580159061189e5750836001600160a01b0316836001600160a01b031614155b156118f5576118f58333336001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561123757600080fd5b6001600160a01b0384161580159061191757506099546001600160a01b031615155b15610d96576099546040805163b221095760e01b81526001600160a01b0387811660048301528681166024830152604482018690523360648301529151919092169163b221095791608480830192600092919082900301818387803b15801561197f57600080fd5b505af1158015611993573d6000803e3d6000fd5b5050505050505050565b6000806119ab858585613133565b90969095509350505050565b6033546001600160a01b031690565b6097546001600160a01b031681565b6119dd612770565b6001600160a01b03166119ee6119b7565b6001600160a01b031614611a37576040805162461bcd60e51b81526020600482018190526024820152600080516020614296833981519152604482015290519081900360640190fd5b61174e816132d1565b6099546001600160a01b031681565b60606098805480602002602001604051908101604052809291908181526020018280548015611aa757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a89575b5050505050905090565b609a5481565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b0857600080fd5b505afa158015611b1c573d6000803e3d6000fd5b505050506040513d6020811015611b3257600080fd5b505190506001600160a01b038116611b4e576000915050611404565b6000816001600160a01b031663010dfa58306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611b9d57600080fd5b505afa158015611bb1573d6000803e3d6000fd5b505050506040513d6020811015611bc757600080fd5b5051905080611bdb57600092505050611404565b6116db84826133e4565b600060026065541415611c3f576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655582611c4e81612ace565b611c8d576040805162461bcd60e51b815260206004820152601760248201526000805160206142dd833981519152604482015290519081900360640190fd5b600080611c9b888789613133565b9150915084821115611cde5760405162461bcd60e51b81526004018080602001828103825260278152602001806142b66027913960400191505060405180910390fd5b611ce9888783613405565b856001600160a01b031663631b5dfb611d00612770565b8a8a6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611d5857600080fd5b505af1158015611d6c573d6000803e3d6000fd5b505050506000611d858389612ce690919063ffffffff16565b90506000611d9282612ba0565b9050611da18a82611399612c1e565b876001600160a01b03168a6001600160a01b0316611dbd612770565b604080518d81526020810186905280820189905290516001600160a01b0392909216917f0271704a58fd2953e49b87d67a0a3ce28a58147de98a5457f60b4686f63850309181900360600190a450506001606555509695505050505050565b82611e2681612ace565b611e65576040805162461bcd60e51b815260206004820152601760248201526000805160206142dd833981519152604482015290519081900360640190fd5b611e6d612770565b6001600160a01b0316611e7e6119b7565b6001600160a01b031614611ec7576040805162461bcd60e51b81526020600482018190526024820152600080516020614296833981519152604482015290519081900360640190fd5b6040805180820182526001600160801b0380851680835286821660208085018281526001600160a01b038b166000818152609e84528890209651875492518716600160801b029087166fffffffffffffffffffffffffffffffff1990931692909217909516179094558451928352928201528083019190915290517ffb0ba2cf86a2b03bcf387753a2192da80a006afa99dd022bb301c78e323bf1b99181900360600190a150505050565b60a0546001600160a01b031681565b6000610a1b6134c6565b600054610100900460ff1680611fa45750611fa4612811565b80611fb2575060005460ff16155b611fed5760405162461bcd60e51b815260040180806020018281038252602e815260200180614247602e913960400191505060405180910390fd5b600054610100900460ff16158015612018576000805460ff1961ff0019909116610100171660011790555b61202a826001600160a01b0316613526565b6120655760405162461bcd60e51b815260040180806020018281038252603681526020018061434d6036913960400191505060405180910390fd5b612070858585610fa8565b60a080546001600160a01b0319166001600160a01b0384169081179091556040805163c89039c560e01b60208083019190915282518083038201815291830192839052815160009493918291908401908083835b602083106120e35780518252601f1990920191602091820191016120c4565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114612143576040519150601f19603f3d011682016040523d82523d6000602084013e612148565b606091505b50509050806121885760405162461bcd60e51b81526004018080602001828103825260298152602001806141896029913960400191505060405180910390fd5b6040516001600160a01b038416907f7a0ca506edc9fcd36e010dbcaad57dade17bbac71dfeb53269077098e863eeca90600090a25080156121cf576000805461ff00191690555b5050505050565b6001600160a01b03166000908152609e60205260409020546001600160801b0380821692600160801b9092041690565b6002606554141561225e576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026065558161226d81612ace565b6122ac576040805162461bcd60e51b815260206004820152601760248201526000805160206142dd833981519152604482015290519081900360640190fd5b836122b68161352c565b612307576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f657863656564732d6c69717569646974792d63617000604482015290519081900360640190fd5b6000612311612770565b905061231f87878787612d48565b61233e81308861232d612c1e565b6001600160a01b0316929190613550565b612347866135aa565b846001600160a01b0316876001600160a01b0316826001600160a01b03167f6ce569498e0f86f147466ac49211cb2a1ffe06195adb805e383b3f2365109160898860405180838152602001826001600160a01b031681526020019250505060405180910390a4505060016065555050505050565b600060026065541415612415576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026065556000612424612665565b905060006124306134c6565b9050600082821161244257600061244c565b61244c8284612ce6565b90506000609d54821161246057600061246e565b609d5461246e908390612ce6565b9050801561252057600061248182611ab7565b905080156124db57609b54612496908261363a565b609b556124a38282612ce6565b6040805183815290519193507f5f1703ccfa2730d4245350f228079926a37f26a44ecf6978a7eeafff0af11407919081900360200190a15b609d546124e8908361363a565b609d556040805183815290517fce2b6e507c7ca1a20ce136810f524eefc19ba4c7e4866eb6cc0cba76e778d4be9181900360200190a1505b609d54945050505050600160655590565b609b5481565b61253f612770565b6001600160a01b03166125506119b7565b6001600160a01b031614612599576040805162461bcd60e51b81526020600482018190526024820152600080516020614296833981519152604482015290519081900360640190fd5b6001600160a01b0381166125de5760405162461bcd60e51b81526004018080602001828103825260268152602001806141b26026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610a1b612c1e565b60405180604001604052806005815260200164332e342e3560d81b81525081565b600080609b549050606060988054806020026020016040519081016040528092919081815260200182805480156126c557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116126a7575b505083519394506000925050505b818110156127675761275d8382815181106126ea57fe5b60200260200101516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561272a57600080fd5b505afa15801561273e573d6000803e3d6000fd5b505050506040513d602081101561275457600080fd5b5051859061363a565b93506001016126d3565b50919250505090565b3390565b600061277f836127fc565b6127d0576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b816127dd575060006127f5565b6127f16001600160a01b0384168584612c94565b5060015b9392505050565b60a0546001600160a01b039081169116141590565b600061281c30613526565b15905090565b306001600160a01b0316826001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b15801561286557600080fd5b505afa158015612879573d6000803e3d6000fd5b505050506040513d602081101561288f57600080fd5b50516001600160a01b0316146128ec576040805162461bcd60e51b815260206004820152601e60248201527f5072697a65506f6f6c2f746f6b656e2d6374726c722d6d69736d617463680000604482015290519081900360640190fd5b81609882815481106128fa57fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051918416917f460e712b4a5d801d031ed673dea209b73ab854f7ddeb86b6c48082e92c3eee669190a25050565b600054610100900460ff16806129665750612966612811565b80612974575060005460ff16155b6129af5760405162461bcd60e51b815260040180806020018281038252602e815260200180614247602e913960400191505060405180910390fd5b600054610100900460ff161580156129da576000805460ff1961ff0019909116610100171660011790555b6129e2613694565b6129ea613734565b801561174e576000805461ff001916905550565b600054610100900460ff1680612a175750612a17612811565b80612a25575060005460ff16155b612a605760405162461bcd60e51b815260040180806020018281038252602e815260200180614247602e913960400191505060405180910390fd5b600054610100900460ff16158015612a8b576000805460ff1961ff0019909116610100171660011790555b6129ea61382d565b609c8190556040805182815290517f3ff20538222f568f27ff436c0c49dfd3e48d5b8f86533a3f759dc1c7089775ab9181900360200190a150565b600060606098805480602002602001604051908101604052809291908181526020018280548015612b2857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612b0a575b505083519394506000925050505b81811015612b7f57846001600160a01b0316838281518110612b5457fe5b60200260200101516001600160a01b03161415612b775760019350505050611404565b600101612b36565b506000949350505050565b610d968484612b9b87878787612ec0565b612f95565b60a0546040805162982a6160e11b81526004810184905290516000926001600160a01b03169163013054c291602480830192602092919082900301818787803b158015612bec57600080fd5b505af1158015612c00573d6000803e3d6000fd5b505050506040513d6020811015612c1657600080fd5b505192915050565b60a0546040805163c89039c560e01b815290516000926001600160a01b03169163c89039c5916004808301926020929190829003018186803b158015612c6357600080fd5b505afa158015612c77573d6000803e3d6000fd5b505050506040513d6020811015612c8d57600080fd5b5051905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ad99084906138d3565b600082821115612d3d576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6099546001600160a01b031615612dd757609954604080516304d7f3db60e41b81526001600160a01b038781166004830152602482018790528581166044830152848116606483015291519190921691634d7f3db091608480830192600092919082900301818387803b158015612dbe57600080fd5b505af1158015612dd2573d6000803e3d6000fd5b505050505b816001600160a01b0316635d7b075885856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561197f57600080fd5b6001600160a01b0382166000908152609e60205260408120546127f5908390612e619082906001600160801b03166133e4565b613984565b6001600160a01b0383166000908152609e60205260408120548190612e9c908590600160801b90046001600160801b03166133e4565b905080612ead5760009150506127f5565b612eb783826139a9565b95945050505050565b6001600160a01b038381166000908152609f6020908152604080832093881683529290529081208054829190600160e01b900460ff16612f035760009150612f45565b6000612f10888888613a10565b8254909150612f419088908890612f3c908990612f36906001600160c01b03168761363a565b9061363a565b612f4f565b9250505b5095945050505050565b6001600160a01b0383166000908152609e60205260408120548190612f7e9085906001600160801b03166133e4565b905080831115612f8c578092505b50909392505050565b6001600160a01b038083166000908152609f602090815260408083209387168352929052819020548151606081019092526001600160c01b03169080612fda84613ac1565b6001600160801b03168152602001612ff8612ff3613b09565b613b0d565b63ffffffff908116825260016020928301526001600160a01b038681166000908152609f84526040808220928a168252918452819020845181549486015195909201516001600160c01b03199094166001600160c01b039092169190911763ffffffff60c01b1916600160c01b94909216939093021760ff60e01b1916600160e01b91151591909102179055818110156130db576001600160a01b038084169085167f2f92d56910619b38bc29fd8e4ca5e56359edac7a0c086cdcd305fb603fa374916130c58585612ce6565b60408051918252519081900360200190a3610d96565b80821015610d96576001600160a01b038084169085167ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf61311c8486612ce6565b60408051918252519081900360200190a350505050565b6000806000846001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561318557600080fd5b505afa158015613199573d6000803e3d6000fd5b505050506040513d60208110156131af57600080fd5b5051905083811015613201576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f696e737566662d66756e647360501b604482015290519081900360640190fd5b61320e8686836000612b8a565b60006132238661321e8488612ce6565b612e2e565b6001600160a01b038088166000908152609f60209081526040808320938c16835292905290812054919250906001600160c01b0316821161329a576001600160a01b038088166000908152609f60209081526040808320938c1683529290522054613297906001600160c01b031683612ce6565b90505b60006132a68888612e2e565b90508082116132b557816132b7565b805b94506132c38186612ce6565b955050505050935093915050565b6001600160a01b03811661332c576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f7072697a6553747261746567792d6e6f742d7a65726f604482015290519081900360640190fd5b6133496001600160a01b038216600162a1cb1960e01b0319613b51565b61339a576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f7072697a6553747261746567792d696e76616c696400604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0383169081179091556040517f7f58dc86bc2e435cb77ca0edb1df55e25f90caf2d6bd866971715437d456a21290600090a250565b6000806133f18385613b6d565b90506116db81670de0b6b3a7640000613bc6565b6001600160a01b038083166000908152609f602090815260408083209387168352929052205461344790613442906001600160c01b031683612ce6565b613ac1565b6001600160a01b038084166000818152609f602090815260408083209489168084529482529182902080546001600160c01b0319166001600160801b0396909616959095179094558051858152905191937ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf92918290030190a3505050565b60a05460408051630b99152d60e41b815230600482015290516000926001600160a01b03169163b99152d091602480830192602092919082900301818787803b15801561351257600080fd5b505af1158015612c77573d6000803e3d6000fd5b3b151590565b600080613537612665565b609c54909150613547828561363a565b11159392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610d969085906138d3565b60a0546135d3906001600160a01b0316826135c3612c1e565b6001600160a01b03169190613c08565b60a054604080516387a6eeef60e01b81526004810184905230602482015290516001600160a01b03909216916387a6eeef9160448082019260009290919082900301818387803b15801561362657600080fd5b505af11580156121cf573d6000803e3d6000fd5b6000828201838110156127f5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600054610100900460ff16806136ad57506136ad612811565b806136bb575060005460ff16155b6136f65760405162461bcd60e51b815260040180806020018281038252602e815260200180614247602e913960400191505060405180910390fd5b600054610100900460ff161580156129ea576000805460ff1961ff001990911661010017166001179055801561174e576000805461ff001916905550565b600054610100900460ff168061374d575061374d612811565b8061375b575060005460ff16155b6137965760405162461bcd60e51b815260040180806020018281038252602e815260200180614247602e913960400191505060405180910390fd5b600054610100900460ff161580156137c1576000805460ff1961ff0019909116610100171660011790555b60006137cb612770565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561174e576000805461ff001916905550565b600054610100900460ff16806138465750613846612811565b80613854575060005460ff16155b61388f5760405162461bcd60e51b815260040180806020018281038252602e815260200180614247602e913960400191505060405180910390fd5b600054610100900460ff161580156138ba576000805460ff1961ff0019909116610100171660011790555b6001606555801561174e576000805461ff001916905550565b6060613928826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613d1b9092919063ffffffff16565b805190915015610ad95780806020019051602081101561394757600080fd5b5051610ad95760405162461bcd60e51b815260040180806020018281038252602a815260200180614323602a913960400191505060405180910390fd5b60008061399384609a546133e4565b9050808311156139a1578092505b509092915050565b60008082116139ff576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381613a0857fe5b049392505050565b6001600160a01b038281166000908152609f60209081526040808320938716835292905290812054600160c01b810463ffffffff1690600160e01b900460ff16613a5e5760009150506127f5565b6000613a7282613a6c613b09565b90612ce6565b6001600160a01b0386166000908152609e602052604081205491925090613aaa908390600160801b90046001600160801b0316613b6d565b9050613ab685826133e4565b979650505050505050565b6000600160801b8210613b055760405162461bcd60e51b81526004018080602001828103825260278152602001806141d86027913960400191505060405180910390fd5b5090565b4290565b6000600160201b8210613b055760405162461bcd60e51b81526004018080602001828103825260268152602001806142fd6026913960400191505060405180910390fd5b6000613b5c83613d2a565b80156127f557506127f58383613d5d565b600082613b7c57506000612d42565b82820282848281613b8957fe5b04146127f55760405162461bcd60e51b81526004018080602001828103825260218152602001806142756021913960400191505060405180910390fd5b60006127f583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613d80565b801580613c8e575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015613c6057600080fd5b505afa158015613c74573d6000803e3d6000fd5b505050506040513d6020811015613c8a57600080fd5b5051155b613cc95760405162461bcd60e51b81526004018080602001828103825260368152602001806143836036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610ad99084906138d3565b60606116db8484600085613e22565b6000613d3d826301ffc9a760e01b613d5d565b80156114015750613d56826001600160e01b0319613d5d565b1592915050565b6000806000613d6c8585613f73565b91509150818015612eb75750949350505050565b60008183613e0c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613dd1578181015183820152602001613db9565b50505050905090810190601f168015613dfe5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613e1857fe5b0495945050505050565b606082471015613e635760405162461bcd60e51b81526004018080602001828103825260268152602001806142216026913960400191505060405180910390fd5b613e6c85613526565b613ebd576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613efc5780518252601f199092019160209182019101613edd565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613f5e576040519150601f19603f3d011682016040523d82523d6000602084013e613f63565b606091505b5091509150613ab68282866140a7565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b1781529151815160009384939284926060926001600160a01b038a169261753092879282918083835b60208310613ffb5780518252601f199092019160209182019101613fdc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461405c576040519150601f19603f3d011682016040523d82523d6000602084013e614061565b606091505b509150915060208151101561407f57600080945094505050506140a0565b8181806020019051602081101561409557600080fd5b505190955093505050505b9250929050565b606083156140b65750816127f5565b8251156140c65782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315613dd1578181015183820152602001613db9565b828054828255906000526020600020908101928215614162579160200282015b8281111561416257825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061412d565b50613b059291505b80821115613b055780546001600160a01b031916815560010161416a56fe5969656c64536f757263655072697a65506f6f6c2f696e76616c69642d7969656c642d736f757263654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e2031323820626974735072697a65506f6f6c2f7265736572766552656769737472792d6e6f742d7a65726f416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725072697a65506f6f6c2f657869742d6665652d657863656564732d757365722d6d6178696d756d5072697a65506f6f6c2f756e6b6e6f776e2d746f6b656e00000000000000000053616665436173743a2076616c756520646f65736e27742066697420696e20333220626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645969656c64536f757263655072697a65506f6f6c2f7969656c642d736f757263652d6e6f742d636f6e74726163742d616464726573735361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e63655072697a65506f6f6c2f6f6e6c792d7072697a65537472617465677900000000a264697066735822122038da218bcde0fd024912bfb202d78047e0838cc1fffbb920fe789d126bd83f7b64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x1D SWAP1 PUSH2 0x5F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x39 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x6C JUMP JUMPDEST PUSH2 0x442E DUP1 PUSH2 0x3B2 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH2 0x337 DUP1 PUSH2 0x7B PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x22EC095 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x6A JUMPI DUP1 PUSH4 0xEFC81A8C EQ PUSH2 0x120 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x128 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x137 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x4E PUSH2 0x2B3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x265 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x26A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2DE PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE DUP3 DUP2 MSTORE PUSH2 0x2D8 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x137 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 BLOCKHASH 0x26 PUSH3 0xBFE88 CALLVALUE 0xCB PUSH17 0xBD60F478762020D516E89EE15643E3763E 0x4F STATICCALL DUP2 LOG2 0xB3 PUSH22 0x64736F6C634300060C00336080604052348015610010 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x440E DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x232 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0x130 JUMPI DUP1 PUSH4 0xB2470E5C GT PUSH2 0xB8 JUMPI DUP1 PUSH4 0xE6D8A94B GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xE6D8A94B EQ PUSH2 0x956 JUMPI DUP1 PUSH4 0xEDB4E1CF EQ PUSH2 0x95E JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x966 JUMPI DUP1 PUSH4 0xFC0C546A EQ PUSH2 0x98C JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x994 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0xB2470E5C EQ PUSH2 0x7F6 JUMPI DUP1 PUSH4 0xB69EF8A8 EQ PUSH2 0x7FE JUMPI DUP1 PUSH4 0xCFA24007 EQ PUSH2 0x806 JUMPI DUP1 PUSH4 0xD4A1361D EQ PUSH2 0x8C5 JUMPI DUP1 PUSH4 0xE323F825 EQ PUSH2 0x91A JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x9D63848A GT PUSH2 0xFF JUMPI DUP1 PUSH4 0x9D63848A EQ PUSH2 0x702 JUMPI DUP1 PUSH4 0x9E167519 EQ PUSH2 0x75A JUMPI DUP1 PUSH4 0x9FE32A91 EQ PUSH2 0x762 JUMPI DUP1 PUSH4 0xA016240B EQ PUSH2 0x77F JUMPI DUP1 PUSH4 0xA7B2CC31 EQ PUSH2 0x7B9 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x6A8 JUMPI DUP1 PUSH4 0x8E71C1F6 EQ PUSH2 0x6CC JUMPI DUP1 PUSH4 0x91CA480E EQ PUSH2 0x6D4 JUMPI DUP1 PUSH4 0x98BF3EB6 EQ PUSH2 0x6FA JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x630665B4 GT PUSH2 0x1BE JUMPI DUP1 PUSH4 0x78B3D327 GT PUSH2 0x182 JUMPI DUP1 PUSH4 0x78B3D327 EQ PUSH2 0x5AE JUMPI DUP1 PUSH4 0x79CB8563 EQ PUSH2 0x5D4 JUMPI DUP1 PUSH4 0x7B99ADB1 EQ PUSH2 0x606 JUMPI DUP1 PUSH4 0x7CBAB1C7 EQ PUSH2 0x623 JUMPI DUP1 PUSH4 0x888C2B6F EQ PUSH2 0x659 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x630665B4 EQ PUSH2 0x526 JUMPI DUP1 PUSH4 0x6A3FD4F9 EQ PUSH2 0x52E JUMPI DUP1 PUSH4 0x6B1B863A EQ PUSH2 0x568 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x59E JUMPI DUP1 PUSH4 0x76687D3D EQ PUSH2 0x5A6 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x2B0AB144 GT PUSH2 0x205 JUMPI DUP1 PUSH4 0x2B0AB144 EQ PUSH2 0x3BB JUMPI DUP1 PUSH4 0x2F7627E3 EQ PUSH2 0x3F1 JUMPI DUP1 PUSH4 0x3EDE50C6 EQ PUSH2 0x41F JUMPI DUP1 PUSH4 0x494DE9F7 EQ PUSH2 0x4D2 JUMPI DUP1 PUSH4 0x52A387AB EQ PUSH2 0x500 JUMPI PUSH2 0x232 JUMP JUMPDEST DUP1 PUSH4 0x937EB54 EQ PUSH2 0x237 JUMPI DUP1 PUSH4 0x13F55E39 EQ PUSH2 0x251 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x289 JUMPI DUP1 PUSH4 0x16960D55 EQ PUSH2 0x334 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x23F PUSH2 0xA11 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x267 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xA20 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x317 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x29F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x2D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x2EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x30C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xADE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x34A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x37D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x38F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x3B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xAEF JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x3D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xD9C JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x407 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xE59 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x435 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x45F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x471 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x492 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0xFA8 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x4E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x119A JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x516 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x12A1 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x13F0 JUMP JUMPDEST PUSH2 0x554 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x544 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x13F6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x57E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 SWAP1 SWAP2 ADD CALLDATALOAD AND PUSH2 0x1409 JUMP JUMPDEST PUSH2 0x287 PUSH2 0x1611 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x16BD JUMP JUMPDEST PUSH2 0x554 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16C3 JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x5EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x16CE JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x61C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x16E3 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x639 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1751 JUMP JUMPDEST PUSH2 0x68F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x66F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x199D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB ADD SWAP1 RETURN JUMPDEST PUSH2 0x6B0 PUSH2 0x19B7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x6B0 PUSH2 0x19C6 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x19D5 JUMP JUMPDEST PUSH2 0x6B0 PUSH2 0x1A40 JUMP JUMPDEST PUSH2 0x70A PUSH2 0x1A4F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x746 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x72E JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x23F PUSH2 0x1AB1 JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x778 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1AB7 JUMP JUMPDEST PUSH2 0x23F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x795 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x1BE5 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x7CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x40 ADD CALLDATALOAD AND PUSH2 0x1E1C JUMP JUMPDEST PUSH2 0x6B0 PUSH2 0x1F72 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x1F81 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x81C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x846 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x858 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x879 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1F8B JUMP JUMPDEST PUSH2 0x8EB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x8DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x21D6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x930 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x2206 JUMP JUMPDEST PUSH2 0x23F PUSH2 0x23BB JUMP JUMPDEST PUSH2 0x23F PUSH2 0x2531 JUMP JUMPDEST PUSH2 0x287 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x97C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2537 JUMP JUMPDEST PUSH2 0x6B0 PUSH2 0x263A JUMP JUMPDEST PUSH2 0x99C PUSH2 0x2644 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x9D6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x9BE JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xA03 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xA1B PUSH2 0x2665 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xA34 PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xA7D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43B9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xA88 DUP4 DUP4 DUP4 PUSH2 0x2774 JUMP JUMPDEST ISZERO PUSH2 0xAD9 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB0BAC59718CD343C80A813518AFCF36846CFCFE6D56E2B3CAB9BD49F5F9B251C DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0xA85BD01 PUSH1 0xE1 SHL SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xB03 PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xB4C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43B9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xB55 DUP4 PUSH2 0x27FC JUMP JUMPDEST PUSH2 0xBA6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0xBB0 JUMPI PUSH2 0xD96 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xD1D JUMPI DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x42842E0E ADDRESS DUP8 DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0xBD8 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0xC46 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xD15 JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0xC74 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xC79 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH32 0x17E975018310F88872B58D4D8263ADCA83CF5C1893496EA2A86923DAB15276AD DUP2 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xCD9 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xCC1 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD06 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xBB3 JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x69C2DE32BC4D47F488E72626A6CFDEE85089342E52675E7DE79C4B417623960C DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP6 POP SWAP1 SWAP4 POP POP POP POP LOG3 JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xDB0 PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xDF9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43B9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xE04 DUP4 DUP4 DUP4 PUSH2 0x2774 JUMP JUMPDEST ISZERO PUSH2 0xAD9 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC65F48ACA3B7A99B7443D04B8FFBB073156179BC628DC3F7DEF5047748973469 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH2 0xE61 PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE72 PUSH2 0x19B7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xEBB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4296 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF0A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xF1E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xF34 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD GT ISZERO PUSH2 0xFA4 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5C19A95C DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF9F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0xFC1 JUMPI POP PUSH2 0xFC1 PUSH2 0x2811 JUMP JUMPDEST DUP1 PUSH2 0xFCF JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x100A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4247 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1035 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x107A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x41FF PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 MLOAD DUP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x1093 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x10BD JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP1 MLOAD PUSH2 0x10D2 SWAP2 PUSH1 0x98 SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x410D JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1109 JUMPI PUSH1 0x0 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x10EC JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0x1100 DUP2 DUP4 PUSH2 0x2822 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x10D6 JUMP JUMPDEST POP PUSH2 0x1112 PUSH2 0x294D JUMP JUMPDEST PUSH2 0x111A PUSH2 0x29FE JUMP JUMPDEST PUSH2 0x1125 PUSH1 0x0 NOT PUSH2 0x2A93 JUMP JUMPDEST PUSH1 0x97 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x9A DUP5 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP6 SWAP1 MSTORE DUP1 MLOAD PUSH32 0x25FF68DD81B34665B5BA7E553EE5511BF6812E12ADB4A7E2C0D9E26B3099CE79 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 POP DUP1 ISZERO PUSH2 0xD96 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x11A6 DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH2 0x11E5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42DD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x126A DUP5 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1237 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x124B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1261 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 PUSH2 0x2B8A JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP4 AND DUP3 MSTORE SWAP3 SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1306 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x131C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ PUSH2 0x1376 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F6F6E6C792D72657365727665 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9B DUP1 SLOAD PUSH1 0x0 SWAP2 DUP3 SWAP1 SSTORE SWAP1 PUSH2 0x138A DUP3 PUSH2 0x2BA0 JUMP JUMPDEST SWAP1 POP PUSH2 0x13A9 DUP6 DUP3 PUSH2 0x1399 PUSH2 0x2C1E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x2C94 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP2 PUSH32 0x1C71C8E11FD443227C8F8D3DC1A237A3A5E8310B540C7FBCF5169754AEDF42C9 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x9D SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1401 DUP3 PUSH2 0x27FC JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x141D PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1466 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43B9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x1470 DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH2 0x14AF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42DD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 PUSH2 0x14B9 JUMPI PUSH2 0xD96 JUMP JUMPDEST PUSH1 0x9D SLOAD DUP4 GT ISZERO PUSH2 0x1510 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F61776172642D657863656564732D617661696C000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x151D SWAP1 DUP5 PUSH2 0x2CE6 JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH2 0x152D DUP5 DUP5 DUP5 PUSH1 0x0 PUSH2 0x2D48 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1539 DUP4 DUP6 PUSH2 0x2E2E JUMP JUMPDEST SWAP1 POP PUSH2 0x15BF DUP6 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x158D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x15A1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x15B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP5 PUSH2 0x2B8A JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xE2554529D99AB7A67DB6B4CEA2B32C7D55AE325F958861E05F304FDDED867E31 DUP7 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1619 PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x162A PUSH2 0x19B7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1673 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4296 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1401 DUP3 PUSH2 0x2ACE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x16DB DUP5 DUP5 DUP5 PUSH2 0x2E66 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x16EB PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16FC PUSH2 0x19B7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1745 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4296 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x174E DUP2 PUSH2 0x2A93 JUMP JUMPDEST POP JUMP JUMPDEST CALLER PUSH2 0x175B DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH2 0x179A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42DD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO PUSH2 0x1874 JUMPI PUSH1 0x0 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP7 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x17F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x180C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1822 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x1834 DUP7 CALLER DUP5 DUP5 PUSH2 0x2EC0 JUMP JUMPDEST SWAP1 POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1866 JUMPI PUSH2 0x1863 CALLER PUSH2 0x185D DUP5 DUP8 PUSH2 0x2CE6 JUMP JUMPDEST DUP4 PUSH2 0x2F4F JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x1871 DUP7 CALLER DUP4 PUSH2 0x2F95 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x189E JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x18F5 JUMPI PUSH2 0x18F5 DUP4 CALLER CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1237 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1917 JUMPI POP PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xD96 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP7 SWAP1 MSTORE CALLER PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xB2210957 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x197F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1993 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x19AB DUP6 DUP6 DUP6 PUSH2 0x3133 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x97 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x19DD PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x19EE PUSH2 0x19B7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1A37 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4296 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x174E DUP2 PUSH2 0x32D1 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1AA7 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1A89 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1B08 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B1C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1B32 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1B4E JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x1404 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x10DFA58 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1B9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1BB1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1BC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x1BDB JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x1404 JUMP JUMPDEST PUSH2 0x16DB DUP5 DUP3 PUSH2 0x33E4 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x1C3F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP3 PUSH2 0x1C4E DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH2 0x1C8D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42DD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1C9B DUP9 DUP8 DUP10 PUSH2 0x3133 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0x1CDE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42B6 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1CE9 DUP9 DUP8 DUP4 PUSH2 0x3405 JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x631B5DFB PUSH2 0x1D00 PUSH2 0x2770 JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1D58 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D6C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 PUSH2 0x1D85 DUP4 DUP10 PUSH2 0x2CE6 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1D92 DUP3 PUSH2 0x2BA0 JUMP JUMPDEST SWAP1 POP PUSH2 0x1DA1 DUP11 DUP3 PUSH2 0x1399 PUSH2 0x2C1E JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1DBD PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP14 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE DUP1 DUP3 ADD DUP10 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x271704A58FD2953E49B87D67A0A3CE28A58147DE98A5457F60B4686F6385030 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH2 0x1E26 DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH2 0x1E65 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42DD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1E6D PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E7E PUSH2 0x19B7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1EC7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4296 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP6 AND DUP1 DUP4 MSTORE DUP7 DUP3 AND PUSH1 0x20 DUP1 DUP6 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9E DUP5 MSTORE DUP9 SWAP1 KECCAK256 SWAP7 MLOAD DUP8 SLOAD SWAP3 MLOAD DUP8 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP1 DUP8 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP6 AND OR SWAP1 SWAP5 SSTORE DUP5 MLOAD SWAP3 DUP4 MSTORE SWAP3 DUP3 ADD MSTORE DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 MLOAD PUSH32 0xFB0BA2CF86A2B03BCF387753A2192DA80A006AFA99DD022BB301C78E323BF1B9 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA1B PUSH2 0x34C6 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1FA4 JUMPI POP PUSH2 0x1FA4 PUSH2 0x2811 JUMP JUMPDEST DUP1 PUSH2 0x1FB2 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1FED JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4247 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2018 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x202A DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3526 JUMP JUMPDEST PUSH2 0x2065 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x36 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x434D PUSH1 0x36 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x2070 DUP6 DUP6 DUP6 PUSH2 0xFA8 JUMP JUMPDEST PUSH1 0xA0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH4 0xC89039C5 PUSH1 0xE0 SHL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP3 ADD DUP2 MSTORE SWAP2 DUP4 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP5 SWAP4 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x20E3 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x20C4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x2143 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x2148 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2188 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4189 PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH32 0x7A0CA506EDC9FCD36E010DBCAAD57DADE17BBAC71DFEB53269077098E863EECA SWAP1 PUSH1 0x0 SWAP1 LOG2 POP DUP1 ISZERO PUSH2 0x21CF JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP3 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND SWAP1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x225E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP2 PUSH2 0x226D DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH2 0x22AC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x42DD DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP4 PUSH2 0x22B6 DUP2 PUSH2 0x352C JUMP JUMPDEST PUSH2 0x2307 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F657863656564732D6C69717569646974792D63617000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2311 PUSH2 0x2770 JUMP JUMPDEST SWAP1 POP PUSH2 0x231F DUP8 DUP8 DUP8 DUP8 PUSH2 0x2D48 JUMP JUMPDEST PUSH2 0x233E DUP2 ADDRESS DUP9 PUSH2 0x232D PUSH2 0x2C1E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 SWAP1 PUSH2 0x3550 JUMP JUMPDEST PUSH2 0x2347 DUP7 PUSH2 0x35AA JUMP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6CE569498E0F86F147466AC49211CB2A1FFE06195ADB805E383B3F2365109160 DUP10 DUP9 PUSH1 0x40 MLOAD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x2415 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE PUSH1 0x0 PUSH2 0x2424 PUSH2 0x2665 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2430 PUSH2 0x34C6 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 DUP3 GT PUSH2 0x2442 JUMPI PUSH1 0x0 PUSH2 0x244C JUMP JUMPDEST PUSH2 0x244C DUP3 DUP5 PUSH2 0x2CE6 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x9D SLOAD DUP3 GT PUSH2 0x2460 JUMPI PUSH1 0x0 PUSH2 0x246E JUMP JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x246E SWAP1 DUP4 SWAP1 PUSH2 0x2CE6 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x2520 JUMPI PUSH1 0x0 PUSH2 0x2481 DUP3 PUSH2 0x1AB7 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x24DB JUMPI PUSH1 0x9B SLOAD PUSH2 0x2496 SWAP1 DUP3 PUSH2 0x363A JUMP JUMPDEST PUSH1 0x9B SSTORE PUSH2 0x24A3 DUP3 DUP3 PUSH2 0x2CE6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 POP PUSH32 0x5F1703CCFA2730D4245350F228079926A37F26A44ECF6978A7EEAFFF0AF11407 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x24E8 SWAP1 DUP4 PUSH2 0x363A JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xCE2B6E507C7CA1A20CE136810F524EEFC19BA4C7E4866EB6CC0CBA76E778D4BE SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH1 0x9D SLOAD SWAP5 POP POP POP POP POP PUSH1 0x1 PUSH1 0x65 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x9B SLOAD DUP2 JUMP JUMPDEST PUSH2 0x253F PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2550 PUSH2 0x19B7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2599 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4296 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x25DE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x41B2 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA1B PUSH2 0x2C1E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x9B SLOAD SWAP1 POP PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x26C5 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x26A7 JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2767 JUMPI PUSH2 0x275D DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x26EA JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x272A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x273E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2754 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP6 SWAP1 PUSH2 0x363A JUMP JUMPDEST SWAP4 POP PUSH1 0x1 ADD PUSH2 0x26D3 JUMP JUMPDEST POP SWAP2 SWAP3 POP POP POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x277F DUP4 PUSH2 0x27FC JUMP JUMPDEST PUSH2 0x27D0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x27DD JUMPI POP PUSH1 0x0 PUSH2 0x27F5 JUMP JUMPDEST PUSH2 0x27F1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP6 DUP5 PUSH2 0x2C94 JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND SWAP2 AND EQ ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x281C ADDRESS PUSH2 0x3526 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF77C4791 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2865 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2879 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x288F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x28EC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F746F6B656E2D6374726C722D6D69736D617463680000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x98 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x28FA JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 DUP5 AND SWAP2 PUSH32 0x460E712B4A5D801D031ED673DEA209B73AB854F7DDEB86B6C48082E92C3EEE66 SWAP2 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2966 JUMPI POP PUSH2 0x2966 PUSH2 0x2811 JUMP JUMPDEST DUP1 PUSH2 0x2974 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x29AF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4247 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x29DA JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x29E2 PUSH2 0x3694 JUMP JUMPDEST PUSH2 0x29EA PUSH2 0x3734 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x174E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2A17 JUMPI POP PUSH2 0x2A17 PUSH2 0x2811 JUMP JUMPDEST DUP1 PUSH2 0x2A25 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2A60 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4247 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2A8B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x29EA PUSH2 0x382D JUMP JUMPDEST PUSH1 0x9C DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3FF20538222F568F27FF436C0C49DFD3E48D5B8F86533A3F759DC1C7089775AB SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2B28 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2B0A JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2B7F JUMPI DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2B54 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x2B77 JUMPI PUSH1 0x1 SWAP4 POP POP POP POP PUSH2 0x1404 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2B36 JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xD96 DUP5 DUP5 PUSH2 0x2B9B DUP8 DUP8 DUP8 DUP8 PUSH2 0x2EC0 JUMP JUMPDEST PUSH2 0x2F95 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH3 0x982A61 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x13054C2 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2BEC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2C00 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2C16 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xC89039C5 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xC89039C5 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2C63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2C77 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2C8D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xAD9 SWAP1 DUP5 SWAP1 PUSH2 0x38D3 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2D3D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2DD7 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE DUP6 DUP2 AND PUSH1 0x44 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x4D7F3DB0 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2DBE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2DD2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5D7B0758 DUP6 DUP6 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x197F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x27F5 SWAP1 DUP4 SWAP1 PUSH2 0x2E61 SWAP1 DUP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x33E4 JUMP JUMPDEST PUSH2 0x3984 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2E9C SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x33E4 JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x2EAD JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x27F5 JUMP JUMPDEST PUSH2 0x2EB7 DUP4 DUP3 PUSH2 0x39A9 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP3 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x2F03 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x2F45 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2F10 DUP9 DUP9 DUP9 PUSH2 0x3A10 JUMP JUMPDEST DUP3 SLOAD SWAP1 SWAP2 POP PUSH2 0x2F41 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x2F3C SWAP1 DUP10 SWAP1 PUSH2 0x2F36 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP8 PUSH2 0x363A JUMP JUMPDEST SWAP1 PUSH2 0x363A JUMP JUMPDEST PUSH2 0x2F4F JUMP JUMPDEST SWAP3 POP POP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2F7E SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x33E4 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x2F8C JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE DUP2 SWAP1 KECCAK256 SLOAD DUP2 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 DUP1 PUSH2 0x2FDA DUP5 PUSH2 0x3AC1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2FF8 PUSH2 0x2FF3 PUSH2 0x3B09 JUMP JUMPDEST PUSH2 0x3B0D JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP3 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 DUP11 AND DUP3 MSTORE SWAP2 DUP5 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP5 DUP7 ADD MLOAD SWAP6 SWAP1 SWAP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH4 0xFFFFFFFF PUSH1 0xC0 SHL NOT AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP5 SWAP1 SWAP3 AND SWAP4 SWAP1 SWAP4 MUL OR PUSH1 0xFF PUSH1 0xE0 SHL NOT AND PUSH1 0x1 PUSH1 0xE0 SHL SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE DUP2 DUP2 LT ISZERO PUSH2 0x30DB JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0x2F92D56910619B38BC29FD8E4CA5E56359EDAC7A0C086CDCD305FB603FA37491 PUSH2 0x30C5 DUP6 DUP6 PUSH2 0x2CE6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 PUSH2 0xD96 JUMP JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0xD96 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF PUSH2 0x311C DUP5 DUP7 PUSH2 0x2CE6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3185 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3199 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x31AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x3201 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F696E737566662D66756E6473 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x320E DUP7 DUP7 DUP4 PUSH1 0x0 PUSH2 0x2B8A JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3223 DUP7 PUSH2 0x321E DUP5 DUP9 PUSH2 0x2CE6 JUMP JUMPDEST PUSH2 0x2E2E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP3 GT PUSH2 0x329A JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x3297 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2CE6 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x32A6 DUP9 DUP9 PUSH2 0x2E2E JUMP JUMPDEST SWAP1 POP DUP1 DUP3 GT PUSH2 0x32B5 JUMPI DUP2 PUSH2 0x32B7 JUMP JUMPDEST DUP1 JUMPDEST SWAP5 POP PUSH2 0x32C3 DUP2 DUP7 PUSH2 0x2CE6 JUMP JUMPDEST SWAP6 POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x332C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D6E6F742D7A65726F PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x3349 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3B51 JUMP JUMPDEST PUSH2 0x339A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D696E76616C696400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x99 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x7F58DC86BC2E435CB77CA0EDB1DF55E25F90CAF2D6BD866971715437D456A212 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x33F1 DUP4 DUP6 PUSH2 0x3B6D JUMP JUMPDEST SWAP1 POP PUSH2 0x16DB DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x3BC6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x3447 SWAP1 PUSH2 0x3442 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2CE6 JUMP JUMPDEST PUSH2 0x3AC1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB99152D PUSH1 0xE4 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xB99152D0 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3512 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2C77 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3537 PUSH2 0x2665 JUMP JUMPDEST PUSH1 0x9C SLOAD SWAP1 SWAP2 POP PUSH2 0x3547 DUP3 DUP6 PUSH2 0x363A JUMP JUMPDEST GT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x24 DUP4 ADD MSTORE DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x84 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xD96 SWAP1 DUP6 SWAP1 PUSH2 0x38D3 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH2 0x35D3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH2 0x35C3 PUSH2 0x2C1E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x3C08 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x87A6EEEF PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x87A6EEEF SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3626 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x21CF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x27F5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x36AD JUMPI POP PUSH2 0x36AD PUSH2 0x2811 JUMP JUMPDEST DUP1 PUSH2 0x36BB JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x36F6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4247 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x29EA JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x174E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x374D JUMPI POP PUSH2 0x374D PUSH2 0x2811 JUMP JUMPDEST DUP1 PUSH2 0x375B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3796 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4247 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x37C1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x37CB PUSH2 0x2770 JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x174E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3846 JUMPI POP PUSH2 0x3846 PUSH2 0x2811 JUMP JUMPDEST DUP1 PUSH2 0x3854 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x388F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4247 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x38BA JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x65 SSTORE DUP1 ISZERO PUSH2 0x174E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x3928 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3D1B SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xAD9 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3947 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xAD9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4323 PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3993 DUP5 PUSH1 0x9A SLOAD PUSH2 0x33E4 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x39A1 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x39FF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x3A08 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xC0 SHL DUP2 DIV PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x3A5E JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x27F5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A72 DUP3 PUSH2 0x3A6C PUSH2 0x3B09 JUMP JUMPDEST SWAP1 PUSH2 0x2CE6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x3AAA SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3B6D JUMP JUMPDEST SWAP1 POP PUSH2 0x3AB6 DUP6 DUP3 PUSH2 0x33E4 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x3B05 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x41D8 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST TIMESTAMP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x20 SHL DUP3 LT PUSH2 0x3B05 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42FD PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3B5C DUP4 PUSH2 0x3D2A JUMP JUMPDEST DUP1 ISZERO PUSH2 0x27F5 JUMPI POP PUSH2 0x27F5 DUP4 DUP4 PUSH2 0x3D5D JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3B7C JUMPI POP PUSH1 0x0 PUSH2 0x2D42 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x3B89 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x27F5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4275 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x27F5 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x3D80 JUMP JUMPDEST DUP1 ISZERO DUP1 PUSH2 0x3C8E JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH4 0x6EB1769F PUSH1 0xE1 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 DUP6 AND SWAP2 PUSH4 0xDD62ED3E SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3C60 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3C74 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3C8A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO JUMPDEST PUSH2 0x3CC9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x36 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4383 PUSH1 0x36 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x95EA7B3 PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xAD9 SWAP1 DUP5 SWAP1 PUSH2 0x38D3 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x16DB DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x3E22 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3D3D DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3D5D JUMP JUMPDEST DUP1 ISZERO PUSH2 0x1401 JUMPI POP PUSH2 0x3D56 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3D5D JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x3D6C DUP6 DUP6 PUSH2 0x3F73 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x2EB7 JUMPI POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x3E0C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3DD1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3DB9 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3DFE JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x3E18 JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x3E63 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4221 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3E6C DUP6 PUSH2 0x3526 JUMP JUMPDEST PUSH2 0x3EBD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3EFC JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3EDD JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3F5E JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3F63 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x3AB6 DUP3 DUP3 DUP7 PUSH2 0x40A7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x24 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP3 DUP5 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND SWAP3 PUSH2 0x7530 SWAP3 DUP8 SWAP3 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3FFB JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3FDC JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x405C JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4061 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x407F JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x40A0 JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4095 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x40B6 JUMPI POP DUP2 PUSH2 0x27F5 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x40C6 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x3DD1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3DB9 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x4162 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x4162 JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x412D JUMP JUMPDEST POP PUSH2 0x3B05 SWAP3 SWAP2 POP JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x3B05 JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x416A JUMP INVALID MSIZE PUSH10 0x656C64536F7572636550 PUSH19 0x697A65506F6F6C2F696E76616C69642D796965 PUSH13 0x642D736F757263654F776E6162 PUSH13 0x653A206E6577206F776E657220 PUSH10 0x7320746865207A65726F KECCAK256 PUSH2 0x6464 PUSH19 0x65737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E2031323820626974735072697A65 POP PUSH16 0x6F6C2F72657365727665526567697374 PUSH19 0x792D6E6F742D7A65726F416464726573733A20 PUSH10 0x6E73756666696369656E PUSH21 0x2062616C616E636520666F722063616C6C496E6974 PUSH10 0x616C697A61626C653A20 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 MSTORE8 PUSH2 0x6665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F774F776E61626C653A20 PUSH4 0x616C6C65 PUSH19 0x206973206E6F7420746865206F776E65725072 PUSH10 0x7A65506F6F6C2F657869 PUSH21 0x2D6665652D657863656564732D757365722D6D6178 PUSH10 0x6D756D5072697A65506F PUSH16 0x6C2F756E6B6E6F776E2D746F6B656E00 STOP STOP STOP STOP STOP STOP STOP STOP MSTORE8 PUSH2 0x6665 NUMBER PUSH2 0x7374 GASPRICE KECCAK256 PUSH23 0x616C756520646F65736E27742066697420696E20333220 PUSH3 0x697473 MSTORE8 PUSH2 0x6665 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x7563636565645969656C64536F75726365507269 PUSH27 0x65506F6F6C2F7969656C642D736F757263652D6E6F742D636F6E74 PUSH19 0x6163742D616464726573735361666545524332 ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F76652066726F6D206E6F6E2D7A65726F2074 PUSH16 0x206E6F6E2D7A65726F20616C6C6F7761 PUSH15 0x63655072697A65506F6F6C2F6F6E6C PUSH26 0x2D7072697A65537472617465677900000000A264697066735822 SLT KECCAK256 CODESIZE 0xDA 0x21 DUP12 0xCD 0xE0 REVERT MUL 0x49 SLT 0xBF 0xB2 MUL 0xD7 DUP1 SELFBALANCE 0xE0 DUP4 DUP13 0xC1 SELFDESTRUCT 0xFB 0xB9 KECCAK256 INVALID PUSH25 0x9D126BD83F7B64736F6C634300060C00330000000000000000 ",
              "sourceMap": "280:623:46:-:0;;;536:70;;;;;;;;;;575:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;564:8:46;:37;;-1:-1:-1;;;;;;564:37:46;-1:-1:-1;;;;;564:37:46;;;;;;;;;;280:623;;;;;;;;;;:::o;:::-;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106100415760003560e01c8063022ec09514610046578063b3eeb5e21461006a578063efc81a8c14610120575b600080fd5b61004e610128565b604080516001600160a01b039092168252519081900360200190f35b61004e6004803603604081101561008057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100ab57600080fd5b8201836020820111156100bd57600080fd5b803590602001918460018302840111640100000000831117156100df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610137945050505050565b61004e6102b3565b6000546001600160a01b031681565b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a18251156102ac576000826001600160a01b0316846040518082805190602001908083835b602083106102035780518252601f1990920191602091820191016101e4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610265576040519150601f19603f3d011682016040523d82523d6000602084013e61026a565b606091505b50509050806102aa5760405162461bcd60e51b81526004018080602001828103825260248152602001806102de6024913960400191505060405180910390fd5b505b5092915050565b6000805460408051602081019091528281526102d8916001600160a01b031690610137565b90509056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a26469706673582212204026620bfe8834cb70bd60f478762020d516e89ee15643e3763e4ffa81a2b37564736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x22EC095 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x6A JUMPI DUP1 PUSH4 0xEFC81A8C EQ PUSH2 0x120 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x128 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x137 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x4E PUSH2 0x2B3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x265 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x26A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2DE PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE DUP3 DUP2 MSTORE PUSH2 0x2D8 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x137 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 BLOCKHASH 0x26 PUSH3 0xBFE88 CALLVALUE 0xCB PUSH17 0xBD60F478762020D516E89EE15643E3763E 0x4F STATICCALL DUP2 LOG2 0xB3 PUSH22 0x64736F6C634300060C00330000000000000000000000 ",
              "sourceMap": "280:623:46:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;409:36;;;:::i;:::-;;;;-1:-1:-1;;;;;409:36:46;;;;;;;;;;;;;;182:778:38;;;;;;;;;;;;;;;;-1:-1:-1;;;;;182:778:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;182:778:38;;-1:-1:-1;182:778:38;;-1:-1:-1;;;;;182:778:38:i;767:134:46:-;;;:::i;409:36::-;;;-1:-1:-1;;;;;409:36:46;;:::o;182:778:38:-;257:13;416:19;446:6;438:15;;416:37;;495:4;489:11;-1:-1:-1;;;514:5:38;507:81;620:11;613:4;606:5;602:16;595:37;-1:-1:-1;;;657:4:38;650:5;646:16;639:92;764:4;757:5;754:1;747:22;786:28;;;-1:-1:-1;;;;;786:28:38;;;;;;738:31;;-1:-1:-1;786:28:38;;-1:-1:-1;786:28:38;;;;;;;824:12;;:16;821:135;;851:12;868:5;-1:-1:-1;;;;;868:10:38;879:5;868:17;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;868:17:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;850:35;;;901:7;893:56;;;;-1:-1:-1;;;893:56:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;821:135;;182:778;;;;;:::o;767:134:46:-;803:20;881:8;;859:36;;;;;;;;;;;;;;-1:-1:-1;;;;;881:8:46;;859:13;:36::i;:::-;831:65;;767:134;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "164600",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "create()": "infinite",
                "deployMinimal(address,bytes)": "infinite",
                "instance()": "1015"
              }
            },
            "methodIdentifiers": {
              "create()": "efc81a8c",
              "deployMinimal(address,bytes)": "b3eeb5e2",
              "instance()": "022ec095"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"name\":\"ProxyCreated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract YieldSourcePrizePool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"deployMinimal\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"instance\",\"outputs\":[{\"internalType\":\"contract YieldSourcePrizePool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"create()\":{\"returns\":{\"_0\":\"A reference to the new proxied Yield Source Prize Pool\"}}},\"title\":\"Yield Source Prize Pool Proxy Factory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":\"Initializes the Factory with an instance of the Yield Source Prize Pool\",\"create()\":{\"notice\":\"Creates a new Yield Source Prize Pool as a proxy of the template instance\"},\"instance()\":{\"notice\":\"Contract template for deploying proxied Prize Pools\"}},\"notice\":\"Minimal proxy pattern for creating new Yield Source Prize Pools\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/prize-pool/yield-source/YieldSourcePrizePoolProxyFactory.sol\":\"YieldSourcePrizePoolProxyFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"@pooltogether/yield-source-interface/contracts/IYieldSource.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.4.0 <0.8.0;\\n\\n/// @title Defines the functions used to interact with a yield source.  The Prize Pool inherits this contract.\\n/// @notice Prize Pools subclasses need to implement this interface so that yield can be generated.\\ninterface IYieldSource {\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function depositToken() external view returns (address);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function balanceOfToken(address addr) external returns (uint256);\\n\\n  /// @notice Supplies tokens to the yield source.  Allows assets to be supplied on other user's behalf using the `to` param.\\n  /// @param amount The amount of `token()` to be supplied\\n  /// @param to The user whose balance will receive the tokens\\n  function supplyTokenTo(uint256 amount, address to) external;\\n\\n  /// @notice Redeems tokens from the yield source.\\n  /// @param amount The amount of `token()` to withdraw.  Denominated in `token()` as above.\\n  /// @return The actual amount of tokens that were redeemed.\\n  function redeemToken(uint256 amount) external returns (uint256);\\n\\n}\\n\",\"keccak256\":\"0xee862089c29ec1f9b2a1df7c01953d88ef5dfcfb2c2198e8926f692ec76537f1\",\"license\":\"MIT\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"},\"contracts/external/openzeppelin/ProxyFactory.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\n// solium-disable security/no-inline-assembly\\n// solium-disable security/no-low-level-calls\\ncontract ProxyFactory {\\n\\n  event ProxyCreated(address proxy);\\n\\n  function deployMinimal(address _logic, bytes memory _data) public returns (address proxy) {\\n    // Adapted from https://github.com/optionality/clone-factory/blob/32782f82dfc5a00d103a7e61a17a5dedbd1e8e9d/contracts/CloneFactory.sol\\n    bytes20 targetBytes = bytes20(_logic);\\n    assembly {\\n      let clone := mload(0x40)\\n      mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n      mstore(add(clone, 0x14), targetBytes)\\n      mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n      proxy := create(0, clone, 0x37)\\n    }\\n\\n    emit ProxyCreated(address(proxy));\\n\\n    if(_data.length > 0) {\\n      (bool success,) = proxy.call(_data);\\n      require(success, \\\"ProxyFactory/constructor-call-failed\\\");\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0xf0422303985796fdd8bdf772ac8e34331e2e63006f657989cca010fa4776d735\"},\"contracts/prize-pool/PrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../external/compound/ICompLike.sol\\\";\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../reserve/ReserveInterface.sol\\\";\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/TokenListenerLibrary.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\nimport \\\"./PrizePoolInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using SafeERC20Upgradeable for IERC721Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    address reserveRegistry,\\n    uint256 maxExitFeeMantissa\\n  );\\n\\n  /// @dev Event emitted when controlled token is added\\n  event ControlledTokenAdded(\\n    ControlledTokenInterface indexed token\\n  );\\n\\n  /// @dev Emitted when reserve is captured.\\n  event ReserveFeeCaptured(\\n    uint256 amount\\n  );\\n\\n  event AwardCaptured(\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when assets are deposited\\n  event Deposited(\\n    address indexed operator,\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount,\\n    address referrer\\n  );\\n\\n  /// @dev Event emitted when interest is awarded to a winner\\n  event Awarded(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are awarded to a winner\\n  event AwardedExternalERC20(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are transferred out\\n  event TransferredExternalERC20(\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC721s are awarded to a winner\\n  event AwardedExternalERC721(\\n    address indexed winner,\\n    address indexed token,\\n    uint256[] tokenIds\\n  );\\n\\n  /// @dev Event emitted when assets are withdrawn instantly\\n  event InstantWithdrawal(\\n    address indexed operator,\\n    address indexed from,\\n    address indexed token,\\n    uint256 amount,\\n    uint256 redeemed,\\n    uint256 exitFee\\n  );\\n\\n  event ReserveWithdrawal(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when the Liquidity Cap is set\\n  event LiquidityCapSet(\\n    uint256 liquidityCap\\n  );\\n\\n  /// @dev Event emitted when the Credit plan is set\\n  event CreditPlanSet(\\n    address token,\\n    uint128 creditLimitMantissa,\\n    uint128 creditRateMantissa\\n  );\\n\\n  /// @dev Event emitted when the Prize Strategy is set\\n  event PrizeStrategySet(\\n    address indexed prizeStrategy\\n  );\\n\\n  /// @dev Emitted when credit is minted\\n  event CreditMinted(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when credit is burned\\n  event CreditBurned(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\\n  event ErrorAwardingExternalERC721(bytes error);\\n\\n\\n  struct CreditPlan {\\n    uint128 creditLimitMantissa;\\n    uint128 creditRateMantissa;\\n  }\\n\\n  struct CreditBalance {\\n    uint192 balance;\\n    uint32 timestamp;\\n    bool initialized;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  /// @dev Reserve to which reserve fees are sent\\n  RegistryInterface public reserveRegistry;\\n\\n  /// @dev An array of all the controlled tokens\\n  ControlledTokenInterface[] internal _tokens;\\n\\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\\n  TokenListenerInterface public prizeStrategy;\\n\\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\\n  /// For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\\n  uint256 public maxExitFeeMantissa;\\n\\n  /// @dev The total funds that have been allocated to the reserve\\n  uint256 public reserveTotalSupply;\\n\\n  /// @dev The total amount of funds that the prize pool can hold.\\n  uint256 public liquidityCap;\\n\\n  /// @dev the The awardable balance\\n  uint256 internal _currentAwardBalance;\\n\\n  /// @dev Stores the credit plan for each token.\\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\\n\\n  /// @dev Stores each users balance of credit per token.\\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\\n\\n  /// @notice Initializes the Prize Pool\\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\\n  /// @param _maxExitFeeMantissa The maximum exit fee size\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_reserveRegistry) != address(0), \\\"PrizePool/reserveRegistry-not-zero\\\");\\n    uint256 controlledTokensLength = _controlledTokens.length;\\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\\n\\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\\n      _addControlledToken(controlledToken, i);\\n    }\\n    __Ownable_init();\\n    __ReentrancyGuard_init();\\n    _setLiquidityCap(uint256(-1));\\n\\n    reserveRegistry = _reserveRegistry;\\n    maxExitFeeMantissa = _maxExitFeeMantissa;\\n\\n    emit Initialized(\\n      address(_reserveRegistry),\\n      maxExitFeeMantissa\\n    );\\n  }\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external override view returns (address) {\\n    return address(_token());\\n  }\\n\\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\\n  /// @return The underlying balance of assets\\n  function balance() external returns (uint256) {\\n    return _balance();\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function canAwardExternal(address _externalToken) external view returns (bool) {\\n    return _canAwardExternal(_externalToken);\\n  }\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    canAddLiquidity(amount)\\n  {\\n    address operator = _msgSender();\\n\\n    _mint(to, amount, controlledToken, referrer);\\n\\n    _token().safeTransferFrom(operator, address(this), amount);\\n    _supply(amount);\\n\\n    emit Deposited(operator, to, controlledToken, amount, referrer);\\n  }\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    returns (uint256)\\n  {\\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n    require(exitFee <= maximumExitFee, \\\"PrizePool/exit-fee-exceeds-user-maximum\\\");\\n\\n    // burn the credit\\n    _burnCredit(from, controlledToken, burnedCredit);\\n\\n    // burn the tickets\\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\\n\\n    // redeem the tickets less the fee\\n    uint256 amountLessFee = amount.sub(exitFee);\\n    uint256 redeemed = _redeem(amountLessFee);\\n\\n    _token().safeTransfer(from, redeemed);\\n\\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\\n\\n    return exitFee;\\n  }\\n\\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\\n  /// @param exitFee The exit fee to check against the limit\\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\\n    if (exitFee > maxFee) {\\n      exitFee = maxFee;\\n    }\\n    return exitFee;\\n  }\\n\\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\\n  /// @param from The address the tokens are being transferred from (0 if minting)\\n  /// @param to The address the tokens are being transferred to (0 if burning)\\n  /// @param amount The amount of tokens being trasferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\\n    if (from != address(0)) {\\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\\n      // first accrue credit for their old balance\\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\\n\\n      if (from != to) {\\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\\n      }\\n\\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\\n    }\\n    if (to != address(0) && to != from) {\\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\\n    }\\n    // if we aren't minting\\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\\n    }\\n  }\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external override view returns (uint256) {\\n    return _currentAwardBalance;\\n  }\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n\\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\\n    uint256 currentBalance = _balance();\\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\\n\\n    if (unaccountedPrizeBalance > 0) {\\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\\n      if (reserveFee > 0) {\\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\\n        emit ReserveFeeCaptured(reserveFee);\\n      }\\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\\n\\n      emit AwardCaptured(unaccountedPrizeBalance);\\n    }\\n\\n    return _currentAwardBalance;\\n  }\\n\\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\\n\\n    uint256 amount = reserveTotalSupply;\\n    reserveTotalSupply = 0;\\n    uint256 redeemed = _redeem(amount);\\n\\n    _token().safeTransfer(address(to), redeemed);\\n\\n    emit ReserveWithdrawal(to, amount);\\n\\n    return redeemed;\\n  }\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external override\\n    onlyPrizeStrategy\\n    onlyControlledToken(controlledToken)\\n  {\\n    if (amount == 0) {\\n      return;\\n    }\\n\\n    require(amount <= _currentAwardBalance, \\\"PrizePool/award-exceeds-avail\\\");\\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\\n\\n    _mint(to, amount, controlledToken, address(0));\\n\\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\\n\\n    emit Awarded(to, controlledToken, amount);\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit TransferredExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit AwardedExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  function _transferOut(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (bool)\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (amount == 0) {\\n      return false;\\n    }\\n\\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\\n\\n    return true;\\n  }\\n\\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\\n  /// @param to The user who is receiving the tokens\\n  /// @param amount The amount of tokens they are receiving\\n  /// @param controlledToken The token that is going to be minted\\n  /// @param referrer The user who referred the minting\\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\\n    if (address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n    ControlledToken(controlledToken).controllerMint(to, amount);\\n  }\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (tokenIds.length == 0) {\\n      return;\\n    }\\n\\n    for (uint256 i = 0; i < tokenIds.length; i++) {\\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\\n\\n      }\\n      catch(bytes memory error){\\n        emit ErrorAwardingExternalERC721(error);\\n      }\\n      \\n    }\\n\\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\\n  }\\n\\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\\n  /// @param amount The prize amount\\n  /// @return The size of the reserve portion of the prize\\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    if (address(reserve) == address(0)) {\\n      return 0;\\n    }\\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\\n    if (reserveRateMantissa == 0) {\\n      return 0;\\n    }\\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\\n  }\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external override\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    )\\n  {\\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n  }\\n\\n  /// @dev Calculates the early exit fee for the given amount\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return Exit fee\\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\\n    return _limitExitFee(\\n      amount,\\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external override\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    durationSeconds =_estimateCreditAccrualTime(\\n      _controlledToken,\\n      _principal,\\n      _interest\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function _estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    internal\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    // interest = credit rate * principal * time\\n    // => time = interest / (credit rate * principal)\\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\\n    if (accruedPerSecond == 0) {\\n      return 0;\\n    }\\n    return _interest.div(accruedPerSecond);\\n  }\\n\\n  /// @notice Burns a users credit.\\n  /// @param user The user whose credit should be burned\\n  /// @param credit The amount of credit to burn\\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\\n\\n    emit CreditBurned(user, controlledToken, credit);\\n  }\\n\\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\\n  /// @param user The user for whom to accrue credit\\n  /// @param controlledToken The controlled token whose balance we are checking\\n  /// @param controlledTokenBalance The balance to use for the user\\n  /// @param extra Additional credit to be added\\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\\n    _updateCreditBalance(\\n      user,\\n      controlledToken,\\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\\n    );\\n  }\\n\\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\\n    uint256 newBalance;\\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\\n    if (!creditBalance.initialized) {\\n      newBalance = 0;\\n    } else {\\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\\n    }\\n    return newBalance;\\n  }\\n\\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\\n\\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\\n      balance: newBalance.toUint128(),\\n      timestamp: _currentTime().toUint32(),\\n      initialized: true\\n    });\\n\\n    if (oldBalance < newBalance) {\\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\\n    } \\n    else if (newBalance < oldBalance) {\\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\\n    }\\n  }\\n\\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\\n  /// @param creditBalance The new credit balance to be checked\\n  /// @return The users new credit balance.  Will not exceed the credit limit.\\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\\n      controlledTokenBalance,\\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\\n    );\\n    if (creditBalance > creditLimit) {\\n      creditBalance = creditLimit;\\n    }\\n\\n    return creditBalance;\\n  }\\n\\n  /// @notice Calculates the accrued interest for a user\\n  /// @param user The user whose credit should be calculated.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\\n  /// @return The credit that has accrued since the last credit update.\\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\\n\\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\\n      return 0;\\n    }\\n\\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\\n  }\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\\n    return _tokenCreditBalances[controlledToken][user].balance;\\n  }\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external override\\n    onlyControlledToken(_controlledToken)\\n    onlyOwner\\n  {\\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\\n      creditLimitMantissa: _creditLimitMantissa,\\n      creditRateMantissa: _creditRateMantissa\\n    });\\n\\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\\n  }\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external override\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    )\\n  {\\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\\n  }\\n\\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The token they are withdrawing\\n  /// @param amount The amount of funds they are withdrawing\\n  /// @return earlyExitFee The additional exit fee that should be charged.\\n  /// @return creditBurned The amount of credit that will be burned\\n  function _calculateEarlyExitFeeLessBurnedCredit(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (\\n      uint256 earlyExitFee,\\n      uint256 creditBurned\\n    )\\n  {\\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\\n    require(controlledTokenBalance >= amount, \\\"PrizePool/insuff-funds\\\");\\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\\n    /*\\n    The credit is used *last*.  Always charge the fees up-front.\\n\\n    How to calculate:\\n\\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\\n\\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\\n    */\\n\\n    // Determine available usable credit based on withdraw amount\\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\\n\\n    uint256 availableCredit;\\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\\n    }\\n\\n    // Determine amount of credit to burn and amount of fees required\\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\\n    earlyExitFee = totalExitFee.sub(creditBurned);\\n  }\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\\n    _setLiquidityCap(_liquidityCap);\\n  }\\n\\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\\n    liquidityCap = _liquidityCap;\\n    emit LiquidityCapSet(_liquidityCap);\\n  }\\n\\n  /// @notice Adds a new controlled token\\n  /// @param _controlledToken The controlled token to add.\\n  /// @param index The index to add the controlledToken\\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\\n    require(_controlledToken.controller() == this, \\\"PrizePool/token-ctrlr-mismatch\\\");\\n    \\n    _tokens[index] = _controlledToken;\\n    emit ControlledTokenAdded(_controlledToken);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\\n    _setPrizeStrategy(_prizeStrategy);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\\n    require(address(_prizeStrategy) != address(0), \\\"PrizePool/prizeStrategy-not-zero\\\");\\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PrizePool/prizeStrategy-invalid\\\");\\n    prizeStrategy = _prizeStrategy;\\n\\n    emit PrizeStrategySet(address(_prizeStrategy));\\n  }\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\\n    return _tokens;\\n  }\\n\\n  /// @dev Gets the current time as represented by the current block\\n  /// @return The timestamp of the current block\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external override view returns (uint256) {\\n    return _tokenTotalSupply();\\n  }\\n\\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\\n  /// @param to The address to delegate to \\n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\\n    if (compLike.balanceOf(address(this)) > 0) {\\n      compLike.delegate(to);\\n    }\\n  }\\n  \\n  /// @notice Required for ERC721 safe token transfers from smart contracts.\\n  /// @param operator The address that acts on behalf of the owner\\n  /// @param from The current owner of the NFT\\n  /// @param tokenId The NFT to transfer\\n  /// @param data Additional data with no specified format, sent in call to `_to`.\\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function _tokenTotalSupply() internal view returns (uint256) {\\n    uint256 total = reserveTotalSupply;\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \\n    uint256 tokensLength = tokens.length;\\n    \\n    for(uint256 i = 0; i < tokensLength; i++){\\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\\n    }\\n\\n    return total;\\n  }\\n\\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\\n  }\\n\\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\\n    uint256 tokensLength = tokens.length;\\n\\n    for(uint256 i = 0; i < tokensLength; i++) {\\n      if(tokens[i] == controlledToken) return true;\\n    }\\n    return false;\\n  }\\n  \\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\\n    return _isControlled(controlledToken);\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function _token() internal virtual view returns (IERC20Upgradeable);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal virtual returns (uint256);\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal virtual;\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\\n\\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  modifier onlyControlledToken(address controlledToken) {\\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \\\"PrizePool/unknown-token\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure caller is the prize-strategy\\n  modifier onlyPrizeStrategy() {\\n    require(_msgSender() == address(prizeStrategy), \\\"PrizePool/only-prizeStrategy\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\\n  modifier canAddLiquidity(uint256 _amount) {\\n    require(_canAddLiquidity(_amount), \\\"PrizePool/exceeds-liquidity-cap\\\");\\n    _;\\n  }\\n\\n  modifier onlyReserve() {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    require(address(reserve) == msg.sender, \\\"PrizePool/only-reserve\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x386ebc1c80ab4424f14125e716dd12641ff933b475bf1082b7b1a6eee4a969c3\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/yield-source/YieldSourcePrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\\\";\\n\\nimport \\\"@pooltogether/yield-source-interface/contracts/IYieldSource.sol\\\";\\n\\nimport \\\"../PrizePool.sol\\\";\\n\\ncontract YieldSourcePrizePool is PrizePool {\\n\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using AddressUpgradeable for address;\\n\\n  IYieldSource public yieldSource;\\n\\n  event YieldSourcePrizePoolInitialized(address indexed yieldSource);\\n\\n  /// @notice Initializes the Prize Pool and Yield Service with the required contract connections\\n  /// @param _controlledTokens Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\\n  /// @param _maxExitFeeMantissa The maximum exit fee size, relative to the withdrawal amount\\n  /// @param _yieldSource Address of the yield source\\n  function initializeYieldSourcePrizePool (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa,\\n    IYieldSource _yieldSource\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_yieldSource).isContract(), \\\"YieldSourcePrizePool/yield-source-not-contract-address\\\");\\n    PrizePool.initialize(\\n      _reserveRegistry,\\n      _controlledTokens,\\n      _maxExitFeeMantissa\\n    );\\n    yieldSource = _yieldSource;\\n\\n    // A hack to determine whether it's an actual yield source\\n    (bool succeeded,) = address(_yieldSource).staticcall(abi.encode(_yieldSource.depositToken.selector));\\n    require(succeeded, \\\"YieldSourcePrizePool/invalid-yield-source\\\");\\n\\n    emit YieldSourcePrizePoolInitialized(address(_yieldSource));\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal override view returns (bool) {\\n    return _externalToken != address(yieldSource);\\n  }\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal override returns (uint256) {\\n    return yieldSource.balanceOfToken(address(this));\\n  }\\n\\n  function _token() internal override view returns (IERC20Upgradeable) {\\n    return IERC20Upgradeable(yieldSource.depositToken());\\n  }\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal override {\\n    _token().safeApprove(address(yieldSource), mintAmount);\\n    yieldSource.supplyTokenTo(mintAmount, address(this));\\n  }\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal override returns (uint256) {\\n    return yieldSource.redeemToken(redeemAmount);\\n  }\\n}\",\"keccak256\":\"0x74b0899be05f0fa46f6818359aabb09b10ce1e6f14b407b733adc207d5b72104\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/yield-source/YieldSourcePrizePoolProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./YieldSourcePrizePool.sol\\\";\\nimport \\\"../../external/openzeppelin/ProxyFactory.sol\\\";\\n\\n/// @title Yield Source Prize Pool Proxy Factory\\n/// @notice Minimal proxy pattern for creating new Yield Source Prize Pools\\ncontract YieldSourcePrizePoolProxyFactory is ProxyFactory {\\n\\n  /// @notice Contract template for deploying proxied Prize Pools\\n  YieldSourcePrizePool public instance;\\n\\n  /// @notice Initializes the Factory with an instance of the Yield Source Prize Pool\\n  constructor () public {\\n    instance = new YieldSourcePrizePool();\\n  }\\n\\n  /// @notice Creates a new Yield Source Prize Pool as a proxy of the template instance\\n  /// @return A reference to the new proxied Yield Source Prize Pool\\n  function create() external returns (YieldSourcePrizePool) {\\n    return YieldSourcePrizePool(deployMinimal(address(instance), \\\"\\\"));\\n  }\\n}\\n\",\"keccak256\":\"0xaff3efd083782dd317e241f88d0409f9bade2f918417736e0c7a2f6f27e07117\",\"license\":\"GPL-3.0\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 9503,
                "contract": "contracts/prize-pool/yield-source/YieldSourcePrizePoolProxyFactory.sol:YieldSourcePrizePoolProxyFactory",
                "label": "instance",
                "offset": 0,
                "slot": "0",
                "type": "t_contract(YieldSourcePrizePool)9493"
              }
            ],
            "types": {
              "t_contract(YieldSourcePrizePool)9493": {
                "encoding": "inplace",
                "label": "contract YieldSourcePrizePool",
                "numberOfBytes": "20"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "constructor": "Initializes the Factory with an instance of the Yield Source Prize Pool",
              "create()": {
                "notice": "Creates a new Yield Source Prize Pool as a proxy of the template instance"
              },
              "instance()": {
                "notice": "Contract template for deploying proxied Prize Pools"
              }
            },
            "notice": "Minimal proxy pattern for creating new Yield Source Prize Pools",
            "version": 1
          }
        }
      },
      "contracts/prize-strategy/BeforeAwardListener.sol": {
        "BeforeAwardListener": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "randomNumber",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "prizePeriodStartedAt",
                  "type": "uint256"
                }
              ],
              "name": "beforePrizePoolAwarded",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes4",
                  "name": "interfaceId",
                  "type": "bytes4"
                }
              ],
              "name": "supportsInterface",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "supportsInterface(bytes4)": {
                "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "beforePrizePoolAwarded(uint256,uint256)": "4cdf9c3e",
              "supportsInterface(bytes4)": "01ffc9a7"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"randomNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prizePeriodStartedAt\",\"type\":\"uint256\"}],\"name\":\"beforePrizePoolAwarded\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"beforePrizePoolAwarded(uint256,uint256)\":{\"notice\":\"Called immediately before the award is distributed\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/prize-strategy/BeforeAwardListener.sol\":\"BeforeAwardListener\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"contracts/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary Constants {\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC721 = 0x80ac58cd;\\n}\",\"keccak256\":\"0x5dc8f8bda4e9668a9ffae6a941774f849adcb368cc2275fd8a91e6ada8fad7fb\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListener.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./BeforeAwardListenerInterface.sol\\\";\\nimport \\\"../Constants.sol\\\";\\nimport \\\"./BeforeAwardListenerLibrary.sol\\\";\\n\\nabstract contract BeforeAwardListener is BeforeAwardListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == BeforeAwardListenerLibrary.ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER\\n    );\\n  }\\n}\",\"keccak256\":\"0x5da2a7332421d6136d793ef55410c2da63a7fb719e8522697f78ac4c50391505\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @notice The interface for the Periodic Prize Strategy before award listener.  This listener will be called immediately before the award is distributed.\\ninterface BeforeAwardListenerInterface is IERC165Upgradeable {\\n  /// @notice Called immediately before the award is distributed\\n  function beforePrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x96145efe8fc65aff97d11ffaf0905d53baf4b87c4a575a84d691804468f12083\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary BeforeAwardListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforePrizePoolAwarded(uint256,uint256)')) == 0x4cdf9c3e\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER = 0x4cdf9c3e;\\n}\",\"keccak256\":\"0xeac08a7b8e2e7d508a0af89c05c31c36e2b060674d05dfa9a5016cf2d12cf500\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "beforePrizePoolAwarded(uint256,uint256)": {
                "notice": "Called immediately before the award is distributed"
              }
            },
            "version": 1
          }
        }
      },
      "contracts/prize-strategy/BeforeAwardListenerInterface.sol": {
        "BeforeAwardListenerInterface": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "randomNumber",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "prizePeriodStartedAt",
                  "type": "uint256"
                }
              ],
              "name": "beforePrizePoolAwarded",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes4",
                  "name": "interfaceId",
                  "type": "bytes4"
                }
              ],
              "name": "supportsInterface",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "supportsInterface(bytes4)": {
                "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "beforePrizePoolAwarded(uint256,uint256)": "4cdf9c3e",
              "supportsInterface(bytes4)": "01ffc9a7"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"randomNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prizePeriodStartedAt\",\"type\":\"uint256\"}],\"name\":\"beforePrizePoolAwarded\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"beforePrizePoolAwarded(uint256,uint256)\":{\"notice\":\"Called immediately before the award is distributed\"}},\"notice\":\"The interface for the Periodic Prize Strategy before award listener.  This listener will be called immediately before the award is distributed.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/prize-strategy/BeforeAwardListenerInterface.sol\":\"BeforeAwardListenerInterface\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"contracts/prize-strategy/BeforeAwardListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @notice The interface for the Periodic Prize Strategy before award listener.  This listener will be called immediately before the award is distributed.\\ninterface BeforeAwardListenerInterface is IERC165Upgradeable {\\n  /// @notice Called immediately before the award is distributed\\n  function beforePrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x96145efe8fc65aff97d11ffaf0905d53baf4b87c4a575a84d691804468f12083\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "beforePrizePoolAwarded(uint256,uint256)": {
                "notice": "Called immediately before the award is distributed"
              }
            },
            "notice": "The interface for the Periodic Prize Strategy before award listener.  This listener will be called immediately before the award is distributed.",
            "version": 1
          }
        }
      },
      "contracts/prize-strategy/BeforeAwardListenerLibrary.sol": {
        "BeforeAwardListenerLibrary": {
          "abi": [
            {
              "inputs": [],
              "name": "ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER",
              "outputs": [
                {
                  "internalType": "bytes4",
                  "name": "",
                  "type": "bytes4"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "609c610024600b82828239805160001a607314601757fe5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361060335760003560e01c80638a741914146038575b600080fd5b603e605b565b604080516001600160e01b03199092168252519081900360200190f35b63266fce1f60e11b8156fea2646970667358221220170b847f54d5bc0151207a06f1c84218d31ca1d0abdeebe38ffb71e661d481f564736f6c634300060c0033",
              "opcodes": "PUSH1 0x9C PUSH2 0x24 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x17 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH1 0x33 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8A741914 EQ PUSH1 0x38 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3E PUSH1 0x5B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH4 0x266FCE1F PUSH1 0xE1 SHL DUP2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 OR SIGNEXTEND DUP5 PUSH32 0x54D5BC0151207A06F1C84218D31CA1D0ABDEEBE38FFB71E661D481F564736F6C PUSH4 0x4300060C STOP CALLER ",
              "sourceMap": "62:216:49:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "730000000000000000000000000000000000000000301460806040526004361060335760003560e01c80638a741914146038575b600080fd5b603e605b565b604080516001600160e01b03199092168252519081900360200190f35b63266fce1f60e11b8156fea2646970667358221220170b847f54d5bc0151207a06f1c84218d31ca1d0abdeebe38ffb71e661d481f564736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH1 0x33 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8A741914 EQ PUSH1 0x38 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3E PUSH1 0x5B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH4 0x266FCE1F PUSH1 0xE1 SHL DUP2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 OR SIGNEXTEND DUP5 PUSH32 0x54D5BC0151207A06F1C84218D31CA1D0ABDEEBE38FFB71E661D481F564736F6C PUSH4 0x4300060C STOP CALLER ",
              "sourceMap": "62:216:49:-:0;;;;;;;;;;;;;;;;;;;;;;;;198:77;;;:::i;:::-;;;;-1:-1:-1;;;;;;198:77:49;;;;;;;;;;;;;;;-1:-1:-1;;;198:77:49;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "31200",
                "executionCost": "109",
                "totalCost": "31309"
              },
              "external": {
                "ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER()": "190"
              }
            },
            "methodIdentifiers": {
              "ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER()": "8a741914"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/prize-strategy/BeforeAwardListenerLibrary.sol\":\"BeforeAwardListenerLibrary\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/prize-strategy/BeforeAwardListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary BeforeAwardListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforePrizePoolAwarded(uint256,uint256)')) == 0x4cdf9c3e\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER = 0x4cdf9c3e;\\n}\",\"keccak256\":\"0xeac08a7b8e2e7d508a0af89c05c31c36e2b060674d05dfa9a5016cf2d12cf500\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/prize-strategy/PeriodicPrizeStrategy.sol": {
        "PeriodicPrizeStrategy": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract BeforeAwardListenerInterface",
                  "name": "beforeAwardListener",
                  "type": "address"
                }
              ],
              "name": "BeforeAwardListenerSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20Upgradeable",
                  "name": "externalErc20",
                  "type": "address"
                }
              ],
              "name": "ExternalErc20AwardAdded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20Upgradeable",
                  "name": "externalErc20Award",
                  "type": "address"
                }
              ],
              "name": "ExternalErc20AwardRemoved",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC721Upgradeable",
                  "name": "externalErc721",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256[]",
                  "name": "tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "ExternalErc721AwardAdded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC721Upgradeable",
                  "name": "externalErc721Award",
                  "type": "address"
                }
              ],
              "name": "ExternalErc721AwardRemoved",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "prizePeriodStart",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "prizePeriodSeconds",
                  "type": "uint256"
                },
                {
                  "indexed": true,
                  "internalType": "contract PrizePool",
                  "name": "prizePool",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "contract TicketInterface",
                  "name": "ticket",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "contract IERC20Upgradeable",
                  "name": "sponsorship",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "contract RNGInterface",
                  "name": "rng",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "contract IERC20Upgradeable[]",
                  "name": "externalErc20Awards",
                  "type": "address[]"
                }
              ],
              "name": "Initialized",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract PeriodicPrizeStrategyListenerInterface",
                  "name": "periodicPrizeStrategyListener",
                  "type": "address"
                }
              ],
              "name": "PeriodicPrizeStrategyListenerSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "prizePeriodSeconds",
                  "type": "uint256"
                }
              ],
              "name": "PrizePeriodSecondsUpdated",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "prizePool",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint32",
                  "name": "rngRequestId",
                  "type": "uint32"
                },
                {
                  "indexed": false,
                  "internalType": "uint32",
                  "name": "rngLockBlock",
                  "type": "uint32"
                }
              ],
              "name": "PrizePoolAwardCancelled",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "prizePool",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint32",
                  "name": "rngRequestId",
                  "type": "uint32"
                },
                {
                  "indexed": false,
                  "internalType": "uint32",
                  "name": "rngLockBlock",
                  "type": "uint32"
                }
              ],
              "name": "PrizePoolAwardStarted",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "randomNumber",
                  "type": "uint256"
                }
              ],
              "name": "PrizePoolAwarded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint256",
                  "name": "prizePeriodStartedAt",
                  "type": "uint256"
                }
              ],
              "name": "PrizePoolOpened",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [],
              "name": "RngRequestFailed",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint32",
                  "name": "rngRequestTimeout",
                  "type": "uint32"
                }
              ],
              "name": "RngRequestTimeoutSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract RNGInterface",
                  "name": "rngService",
                  "type": "address"
                }
              ],
              "name": "RngServiceUpdated",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract TokenListenerInterface",
                  "name": "tokenListener",
                  "type": "address"
                }
              ],
              "name": "TokenListenerUpdated",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "VERSION",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_externalErc20",
                  "type": "address"
                }
              ],
              "name": "addExternalErc20Award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20Upgradeable[]",
                  "name": "_externalErc20s",
                  "type": "address[]"
                }
              ],
              "name": "addExternalErc20Awards",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC721Upgradeable",
                  "name": "_externalErc721",
                  "type": "address"
                },
                {
                  "internalType": "uint256[]",
                  "name": "_tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "addExternalErc721Award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "beforeAwardListener",
              "outputs": [
                {
                  "internalType": "contract BeforeAwardListenerInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "referrer",
                  "type": "address"
                }
              ],
              "name": "beforeTokenMint",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "beforeTokenTransfer",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "currentTime",
                  "type": "uint256"
                }
              ],
              "name": "calculateNextPrizePeriodStartTime",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "canCompleteAward",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "canStartAward",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "cancelAward",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "completeAward",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "currentPrize",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "secondsPerBlockMantissa",
                  "type": "uint256"
                }
              ],
              "name": "estimateRemainingBlocksToPrize",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "getExternalErc20Awards",
              "outputs": [
                {
                  "internalType": "address[]",
                  "name": "",
                  "type": "address[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC721Upgradeable",
                  "name": "_externalErc721",
                  "type": "address"
                }
              ],
              "name": "getExternalErc721AwardTokenIds",
              "outputs": [
                {
                  "internalType": "uint256[]",
                  "name": "",
                  "type": "uint256[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "getExternalErc721Awards",
              "outputs": [
                {
                  "internalType": "address[]",
                  "name": "",
                  "type": "address[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "getLastRngLockBlock",
              "outputs": [
                {
                  "internalType": "uint32",
                  "name": "",
                  "type": "uint32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "getLastRngRequestId",
              "outputs": [
                {
                  "internalType": "uint32",
                  "name": "",
                  "type": "uint32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_prizePeriodStart",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "_prizePeriodSeconds",
                  "type": "uint256"
                },
                {
                  "internalType": "contract PrizePool",
                  "name": "_prizePool",
                  "type": "address"
                },
                {
                  "internalType": "contract TicketInterface",
                  "name": "_ticket",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_sponsorship",
                  "type": "address"
                },
                {
                  "internalType": "contract RNGInterface",
                  "name": "_rng",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20Upgradeable[]",
                  "name": "externalErc20Awards",
                  "type": "address[]"
                }
              ],
              "name": "initialize",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "isPrizePeriodOver",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "isRngCompleted",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "isRngRequested",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "isRngTimedOut",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "periodicPrizeStrategyListener",
              "outputs": [
                {
                  "internalType": "contract PeriodicPrizeStrategyListenerInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizePeriodEndAt",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizePeriodRemainingSeconds",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizePeriodSeconds",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizePeriodStartedAt",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizePool",
              "outputs": [
                {
                  "internalType": "contract PrizePool",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_externalErc20",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_prevExternalErc20",
                  "type": "address"
                }
              ],
              "name": "removeExternalErc20Award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC721Upgradeable",
                  "name": "_externalErc721",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC721Upgradeable",
                  "name": "_prevExternalErc721",
                  "type": "address"
                }
              ],
              "name": "removeExternalErc721Award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "renounceOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "rng",
              "outputs": [
                {
                  "internalType": "contract RNGInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "rngRequestTimeout",
              "outputs": [
                {
                  "internalType": "uint32",
                  "name": "",
                  "type": "uint32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract BeforeAwardListenerInterface",
                  "name": "_beforeAwardListener",
                  "type": "address"
                }
              ],
              "name": "setBeforeAwardListener",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract PeriodicPrizeStrategyListenerInterface",
                  "name": "_periodicPrizeStrategyListener",
                  "type": "address"
                }
              ],
              "name": "setPeriodicPrizeStrategyListener",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_prizePeriodSeconds",
                  "type": "uint256"
                }
              ],
              "name": "setPrizePeriodSeconds",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint32",
                  "name": "_rngRequestTimeout",
                  "type": "uint32"
                }
              ],
              "name": "setRngRequestTimeout",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract RNGInterface",
                  "name": "rngService",
                  "type": "address"
                }
              ],
              "name": "setRngService",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "_tokenListener",
                  "type": "address"
                }
              ],
              "name": "setTokenListener",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "sponsorship",
              "outputs": [
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "startAward",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes4",
                  "name": "interfaceId",
                  "type": "bytes4"
                }
              ],
              "name": "supportsInterface",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "ticket",
              "outputs": [
                {
                  "internalType": "contract TicketInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "tokenListener",
              "outputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "addExternalErc20Award(address)": {
                "details": "Only the Prize-Strategy owner/creator can assign external tokens, and they must be approved by the Prize-Pool",
                "params": {
                  "_externalErc20": "The address of an ERC20 token to be awarded"
                }
              },
              "addExternalErc721Award(address,uint256[])": {
                "details": "Only the Prize-Strategy owner/creator can assign external tokens, and they must be approved by the Prize-Pool NOTE: The NFT must already be owned by the Prize-Pool",
                "params": {
                  "_externalErc721": "The address of an ERC721 token to be awarded",
                  "_tokenIds": "An array of token IDs of the ERC721 to be awarded"
                }
              },
              "beforeTokenMint(address,uint256,address,address)": {
                "params": {
                  "controlledToken": "The type of collateral that is being minted"
                }
              },
              "beforeTokenTransfer(address,address,uint256,address)": {
                "details": "Note that this is only for *transfers*, not mints or burns",
                "params": {
                  "controlledToken": "The type of collateral that is being sent"
                }
              },
              "calculateNextPrizePeriodStartTime(uint256)": {
                "params": {
                  "currentTime": "The timestamp to use as the current time"
                },
                "returns": {
                  "_0": "The timestamp at which the next prize period would start"
                }
              },
              "canCompleteAward()": {
                "returns": {
                  "_0": "True if an award can be completed, false otherwise."
                }
              },
              "canStartAward()": {
                "returns": {
                  "_0": "True if an award can be started, false otherwise."
                }
              },
              "currentPrize()": {
                "returns": {
                  "_0": "The current prize size"
                }
              },
              "estimateRemainingBlocksToPrize(uint256)": {
                "params": {
                  "secondsPerBlockMantissa": "The number of seconds per block to use for the calculation.  Should be a fixed point 18 number like Ether."
                },
                "returns": {
                  "_0": "The estimated number of blocks remaining until the prize can be awarded."
                }
              },
              "getExternalErc20Awards()": {
                "returns": {
                  "_0": "An array of External ERC20 token addresses"
                }
              },
              "getExternalErc721AwardTokenIds(address)": {
                "returns": {
                  "_0": "An array of External ERC721 token addresses"
                }
              },
              "getExternalErc721Awards()": {
                "returns": {
                  "_0": "An array of External ERC721 token addresses"
                }
              },
              "getLastRngLockBlock()": {
                "returns": {
                  "_0": "The block number that the RNG request is locked to"
                }
              },
              "getLastRngRequestId()": {
                "returns": {
                  "_0": "The current Request ID"
                }
              },
              "initialize(uint256,uint256,address,address,address,address,address[])": {
                "params": {
                  "_prizePeriodSeconds": "The duration of the prize period in seconds",
                  "_prizePeriodStart": "The starting timestamp of the prize period.",
                  "_prizePool": "The prize pool to award",
                  "_rng": "The RNG service to use",
                  "_sponsorship": "The sponsorship token",
                  "_ticket": "The ticket to use to draw winners"
                }
              },
              "isPrizePeriodOver()": {
                "returns": {
                  "_0": "True if the prize period is over, false otherwise"
                }
              },
              "isRngCompleted()": {
                "returns": {
                  "_0": "True if a random number request has completed, false otherwise."
                }
              },
              "isRngRequested()": {
                "returns": {
                  "_0": "True if a random number has been requested, false otherwise."
                }
              },
              "owner()": {
                "details": "Returns the address of the current owner."
              },
              "prizePeriodEndAt()": {
                "returns": {
                  "_0": "The timestamp at which the prize period ends."
                }
              },
              "prizePeriodRemainingSeconds()": {
                "returns": {
                  "_0": "The number of seconds remaining until the prize can be awarded."
                }
              },
              "removeExternalErc20Award(address,address)": {
                "details": "Only the Prize-Strategy owner/creator can remove external tokens",
                "params": {
                  "_externalErc20": "The address of an ERC20 token to be removed",
                  "_prevExternalErc20": "The address of the previous ERC20 token in the `externalErc20s` list. If the ERC20 is the first address, then the previous address is the SENTINEL address: 0x0000000000000000000000000000000000000001"
                }
              },
              "removeExternalErc721Award(address,address)": {
                "details": "Only the Prize-Strategy owner/creator can remove external tokens",
                "params": {
                  "_externalErc721": "The address of an ERC721 token to be removed",
                  "_prevExternalErc721": "The address of the previous ERC721 token in the list. If no previous, then pass the SENTINEL address: 0x0000000000000000000000000000000000000001"
                }
              },
              "renounceOwnership()": {
                "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
              },
              "setBeforeAwardListener(address)": {
                "details": "The listener must implement ERC165 and the BeforeAwardListenerInterface",
                "params": {
                  "_beforeAwardListener": "The address of the listener contract"
                }
              },
              "setPeriodicPrizeStrategyListener(address)": {
                "params": {
                  "_periodicPrizeStrategyListener": "The address of the listener contract"
                }
              },
              "setPrizePeriodSeconds(uint256)": {
                "params": {
                  "_prizePeriodSeconds": "The new prize period in seconds.  Must be greater than zero."
                }
              },
              "setRngRequestTimeout(uint32)": {
                "params": {
                  "_rngRequestTimeout": "The RNG request timeout in seconds."
                }
              },
              "setRngService(address)": {
                "params": {
                  "rngService": "The address of the new RNG service interface"
                }
              },
              "setTokenListener(address)": {
                "params": {
                  "_tokenListener": "A contract that implements the token listener interface."
                }
              },
              "startAward()": {
                "details": "The RNG-Request-Fee is expected to be held within this contract before calling this function"
              },
              "supportsInterface(bytes4)": {
                "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."
              },
              "transferOwnership(address)": {
                "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "VERSION()": "ffa1ad74",
              "addExternalErc20Award(address)": "4e5d08e0",
              "addExternalErc20Awards(address[])": "66968221",
              "addExternalErc721Award(address,uint256[])": "c48ddbcb",
              "beforeAwardListener()": "0d847fc4",
              "beforeTokenMint(address,uint256,address,address)": "4d7f3db0",
              "beforeTokenTransfer(address,address,uint256,address)": "b2210957",
              "calculateNextPrizePeriodStartTime(uint256)": "47bed998",
              "canCompleteAward()": "6a74f107",
              "canStartAward()": "876f5c7e",
              "cancelAward()": "4c169f4f",
              "completeAward()": "dfb2f13b",
              "currentPrize()": "c42b42a0",
              "estimateRemainingBlocksToPrize(uint256)": "01b48e34",
              "getExternalErc20Awards()": "62c77a61",
              "getExternalErc721AwardTokenIds(address)": "9417783f",
              "getExternalErc721Awards()": "42d09209",
              "getLastRngLockBlock()": "6bea5344",
              "getLastRngRequestId()": "2a7ad609",
              "initialize(uint256,uint256,address,address,address,address,address[])": "f97700e2",
              "isPrizePeriodOver()": "95e5f9ee",
              "isRngCompleted()": "4aba4f6b",
              "isRngRequested()": "111070e4",
              "isRngTimedOut()": "738bbea8",
              "owner()": "8da5cb5b",
              "periodicPrizeStrategyListener()": "c2f19ee8",
              "prizePeriodEndAt()": "2c8fe73d",
              "prizePeriodRemainingSeconds()": "d5ad6bf6",
              "prizePeriodSeconds()": "94144c6b",
              "prizePeriodStartedAt()": "72f33ea9",
              "prizePool()": "719ce73e",
              "removeExternalErc20Award(address,address)": "b0244682",
              "removeExternalErc721Award(address,address)": "671137c4",
              "renounceOwnership()": "715018a6",
              "rng()": "d605787b",
              "rngRequestTimeout()": "acca5b95",
              "setBeforeAwardListener(address)": "30fcdf41",
              "setPeriodicPrizeStrategyListener(address)": "8aa3ec6f",
              "setPrizePeriodSeconds(uint256)": "884a4448",
              "setRngRequestTimeout(uint32)": "c6853270",
              "setRngService(address)": "7f4296d7",
              "setTokenListener(address)": "605e25ac",
              "sponsorship()": "500db70d",
              "startAward()": "b9ee1e05",
              "supportsInterface(bytes4)": "01ffc9a7",
              "ticket()": "6cc25db7",
              "tokenListener()": "6be51c4f",
              "transferOwnership(address)": "f2fde38b"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract BeforeAwardListenerInterface\",\"name\":\"beforeAwardListener\",\"type\":\"address\"}],\"name\":\"BeforeAwardListenerSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"externalErc20\",\"type\":\"address\"}],\"name\":\"ExternalErc20AwardAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"externalErc20Award\",\"type\":\"address\"}],\"name\":\"ExternalErc20AwardRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"externalErc721\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"ExternalErc721AwardAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"externalErc721Award\",\"type\":\"address\"}],\"name\":\"ExternalErc721AwardRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"prizePeriodStart\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"prizePeriodSeconds\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"contract PrizePool\",\"name\":\"prizePool\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract TicketInterface\",\"name\":\"ticket\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"sponsorship\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract RNGInterface\",\"name\":\"rng\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract IERC20Upgradeable[]\",\"name\":\"externalErc20Awards\",\"type\":\"address[]\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract PeriodicPrizeStrategyListenerInterface\",\"name\":\"periodicPrizeStrategyListener\",\"type\":\"address\"}],\"name\":\"PeriodicPrizeStrategyListenerSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"prizePeriodSeconds\",\"type\":\"uint256\"}],\"name\":\"PrizePeriodSecondsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"prizePool\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"rngRequestId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"rngLockBlock\",\"type\":\"uint32\"}],\"name\":\"PrizePoolAwardCancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"prizePool\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"rngRequestId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"rngLockBlock\",\"type\":\"uint32\"}],\"name\":\"PrizePoolAwardStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"randomNumber\",\"type\":\"uint256\"}],\"name\":\"PrizePoolAwarded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"prizePeriodStartedAt\",\"type\":\"uint256\"}],\"name\":\"PrizePoolOpened\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"RngRequestFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"rngRequestTimeout\",\"type\":\"uint32\"}],\"name\":\"RngRequestTimeoutSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract RNGInterface\",\"name\":\"rngService\",\"type\":\"address\"}],\"name\":\"RngServiceUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract TokenListenerInterface\",\"name\":\"tokenListener\",\"type\":\"address\"}],\"name\":\"TokenListenerUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_externalErc20\",\"type\":\"address\"}],\"name\":\"addExternalErc20Award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20Upgradeable[]\",\"name\":\"_externalErc20s\",\"type\":\"address[]\"}],\"name\":\"addExternalErc20Awards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"_externalErc721\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"_tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"addExternalErc721Award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"beforeAwardListener\",\"outputs\":[{\"internalType\":\"contract BeforeAwardListenerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"}],\"name\":\"beforeTokenMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"beforeTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTime\",\"type\":\"uint256\"}],\"name\":\"calculateNextPrizePeriodStartTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"canCompleteAward\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"canStartAward\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancelAward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"completeAward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentPrize\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"secondsPerBlockMantissa\",\"type\":\"uint256\"}],\"name\":\"estimateRemainingBlocksToPrize\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExternalErc20Awards\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"_externalErc721\",\"type\":\"address\"}],\"name\":\"getExternalErc721AwardTokenIds\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExternalErc721Awards\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastRngLockBlock\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastRngRequestId\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_prizePeriodStart\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_prizePeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"contract PrizePool\",\"name\":\"_prizePool\",\"type\":\"address\"},{\"internalType\":\"contract TicketInterface\",\"name\":\"_ticket\",\"type\":\"address\"},{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_sponsorship\",\"type\":\"address\"},{\"internalType\":\"contract RNGInterface\",\"name\":\"_rng\",\"type\":\"address\"},{\"internalType\":\"contract IERC20Upgradeable[]\",\"name\":\"externalErc20Awards\",\"type\":\"address[]\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPrizePeriodOver\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isRngCompleted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isRngRequested\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isRngTimedOut\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"periodicPrizeStrategyListener\",\"outputs\":[{\"internalType\":\"contract PeriodicPrizeStrategyListenerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizePeriodEndAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizePeriodRemainingSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizePeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizePeriodStartedAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizePool\",\"outputs\":[{\"internalType\":\"contract PrizePool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_externalErc20\",\"type\":\"address\"},{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_prevExternalErc20\",\"type\":\"address\"}],\"name\":\"removeExternalErc20Award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"_externalErc721\",\"type\":\"address\"},{\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"_prevExternalErc721\",\"type\":\"address\"}],\"name\":\"removeExternalErc721Award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rng\",\"outputs\":[{\"internalType\":\"contract RNGInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rngRequestTimeout\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract BeforeAwardListenerInterface\",\"name\":\"_beforeAwardListener\",\"type\":\"address\"}],\"name\":\"setBeforeAwardListener\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract PeriodicPrizeStrategyListenerInterface\",\"name\":\"_periodicPrizeStrategyListener\",\"type\":\"address\"}],\"name\":\"setPeriodicPrizeStrategyListener\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_prizePeriodSeconds\",\"type\":\"uint256\"}],\"name\":\"setPrizePeriodSeconds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_rngRequestTimeout\",\"type\":\"uint32\"}],\"name\":\"setRngRequestTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract RNGInterface\",\"name\":\"rngService\",\"type\":\"address\"}],\"name\":\"setRngService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"_tokenListener\",\"type\":\"address\"}],\"name\":\"setTokenListener\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sponsorship\",\"outputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startAward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ticket\",\"outputs\":[{\"internalType\":\"contract TicketInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenListener\",\"outputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addExternalErc20Award(address)\":{\"details\":\"Only the Prize-Strategy owner/creator can assign external tokens, and they must be approved by the Prize-Pool\",\"params\":{\"_externalErc20\":\"The address of an ERC20 token to be awarded\"}},\"addExternalErc721Award(address,uint256[])\":{\"details\":\"Only the Prize-Strategy owner/creator can assign external tokens, and they must be approved by the Prize-Pool NOTE: The NFT must already be owned by the Prize-Pool\",\"params\":{\"_externalErc721\":\"The address of an ERC721 token to be awarded\",\"_tokenIds\":\"An array of token IDs of the ERC721 to be awarded\"}},\"beforeTokenMint(address,uint256,address,address)\":{\"params\":{\"controlledToken\":\"The type of collateral that is being minted\"}},\"beforeTokenTransfer(address,address,uint256,address)\":{\"details\":\"Note that this is only for *transfers*, not mints or burns\",\"params\":{\"controlledToken\":\"The type of collateral that is being sent\"}},\"calculateNextPrizePeriodStartTime(uint256)\":{\"params\":{\"currentTime\":\"The timestamp to use as the current time\"},\"returns\":{\"_0\":\"The timestamp at which the next prize period would start\"}},\"canCompleteAward()\":{\"returns\":{\"_0\":\"True if an award can be completed, false otherwise.\"}},\"canStartAward()\":{\"returns\":{\"_0\":\"True if an award can be started, false otherwise.\"}},\"currentPrize()\":{\"returns\":{\"_0\":\"The current prize size\"}},\"estimateRemainingBlocksToPrize(uint256)\":{\"params\":{\"secondsPerBlockMantissa\":\"The number of seconds per block to use for the calculation.  Should be a fixed point 18 number like Ether.\"},\"returns\":{\"_0\":\"The estimated number of blocks remaining until the prize can be awarded.\"}},\"getExternalErc20Awards()\":{\"returns\":{\"_0\":\"An array of External ERC20 token addresses\"}},\"getExternalErc721AwardTokenIds(address)\":{\"returns\":{\"_0\":\"An array of External ERC721 token addresses\"}},\"getExternalErc721Awards()\":{\"returns\":{\"_0\":\"An array of External ERC721 token addresses\"}},\"getLastRngLockBlock()\":{\"returns\":{\"_0\":\"The block number that the RNG request is locked to\"}},\"getLastRngRequestId()\":{\"returns\":{\"_0\":\"The current Request ID\"}},\"initialize(uint256,uint256,address,address,address,address,address[])\":{\"params\":{\"_prizePeriodSeconds\":\"The duration of the prize period in seconds\",\"_prizePeriodStart\":\"The starting timestamp of the prize period.\",\"_prizePool\":\"The prize pool to award\",\"_rng\":\"The RNG service to use\",\"_sponsorship\":\"The sponsorship token\",\"_ticket\":\"The ticket to use to draw winners\"}},\"isPrizePeriodOver()\":{\"returns\":{\"_0\":\"True if the prize period is over, false otherwise\"}},\"isRngCompleted()\":{\"returns\":{\"_0\":\"True if a random number request has completed, false otherwise.\"}},\"isRngRequested()\":{\"returns\":{\"_0\":\"True if a random number has been requested, false otherwise.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"prizePeriodEndAt()\":{\"returns\":{\"_0\":\"The timestamp at which the prize period ends.\"}},\"prizePeriodRemainingSeconds()\":{\"returns\":{\"_0\":\"The number of seconds remaining until the prize can be awarded.\"}},\"removeExternalErc20Award(address,address)\":{\"details\":\"Only the Prize-Strategy owner/creator can remove external tokens\",\"params\":{\"_externalErc20\":\"The address of an ERC20 token to be removed\",\"_prevExternalErc20\":\"The address of the previous ERC20 token in the `externalErc20s` list. If the ERC20 is the first address, then the previous address is the SENTINEL address: 0x0000000000000000000000000000000000000001\"}},\"removeExternalErc721Award(address,address)\":{\"details\":\"Only the Prize-Strategy owner/creator can remove external tokens\",\"params\":{\"_externalErc721\":\"The address of an ERC721 token to be removed\",\"_prevExternalErc721\":\"The address of the previous ERC721 token in the list. If no previous, then pass the SENTINEL address: 0x0000000000000000000000000000000000000001\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setBeforeAwardListener(address)\":{\"details\":\"The listener must implement ERC165 and the BeforeAwardListenerInterface\",\"params\":{\"_beforeAwardListener\":\"The address of the listener contract\"}},\"setPeriodicPrizeStrategyListener(address)\":{\"params\":{\"_periodicPrizeStrategyListener\":\"The address of the listener contract\"}},\"setPrizePeriodSeconds(uint256)\":{\"params\":{\"_prizePeriodSeconds\":\"The new prize period in seconds.  Must be greater than zero.\"}},\"setRngRequestTimeout(uint32)\":{\"params\":{\"_rngRequestTimeout\":\"The RNG request timeout in seconds.\"}},\"setRngService(address)\":{\"params\":{\"rngService\":\"The address of the new RNG service interface\"}},\"setTokenListener(address)\":{\"params\":{\"_tokenListener\":\"A contract that implements the token listener interface.\"}},\"startAward()\":{\"details\":\"The RNG-Request-Fee is expected to be held within this contract before calling this function\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"VERSION()\":{\"notice\":\"Semver Version\"},\"addExternalErc20Award(address)\":{\"notice\":\"Adds an external ERC20 token type as an additional prize that can be awarded\"},\"addExternalErc721Award(address,uint256[])\":{\"notice\":\"Adds an external ERC721 token as an additional prize that can be awarded\"},\"beforeAwardListener()\":{\"notice\":\"A listener that is called before the prize is awarded\"},\"beforeTokenMint(address,uint256,address,address)\":{\"notice\":\"Called by the PrizePool when minting controlled tokens\"},\"beforeTokenTransfer(address,address,uint256,address)\":{\"notice\":\"Called by the PrizePool for transfers of controlled tokens\"},\"calculateNextPrizePeriodStartTime(uint256)\":{\"notice\":\"Calculates when the next prize period will start\"},\"canCompleteAward()\":{\"notice\":\"Returns whether an award process can be completed\"},\"canStartAward()\":{\"notice\":\"Returns whether an award process can be started\"},\"cancelAward()\":{\"notice\":\"Can be called by anyone to unlock the tickets if the RNG has timed out.\"},\"completeAward()\":{\"notice\":\"Completes the award process and awards the winners.  The random number must have been requested and is now available.\"},\"currentPrize()\":{\"notice\":\"Calculates and returns the currently accrued prize\"},\"estimateRemainingBlocksToPrize(uint256)\":{\"notice\":\"Estimates the remaining blocks until the prize given a number of seconds per block\"},\"getExternalErc20Awards()\":{\"notice\":\"Gets the current list of External ERC20 tokens that will be awarded with the current prize\"},\"getExternalErc721AwardTokenIds(address)\":{\"notice\":\"Gets the current list of External ERC721 tokens that will be awarded with the current prize\"},\"getExternalErc721Awards()\":{\"notice\":\"Gets the current list of External ERC721 tokens that will be awarded with the current prize\"},\"getLastRngLockBlock()\":{\"notice\":\"Returns the block number that the current RNG request has been locked to\"},\"getLastRngRequestId()\":{\"notice\":\"Returns the current RNG Request ID\"},\"initialize(uint256,uint256,address,address,address,address,address[])\":{\"notice\":\"Initializes a new strategy\"},\"isPrizePeriodOver()\":{\"notice\":\"Returns whether the prize period is over\"},\"isRngCompleted()\":{\"notice\":\"Returns whether the random number request has completed.\"},\"isRngRequested()\":{\"notice\":\"Returns whether a random number has been requested\"},\"periodicPrizeStrategyListener()\":{\"notice\":\"A listener that is called after the prize is awarded\"},\"prizePeriodEndAt()\":{\"notice\":\"Returns the timestamp at which the prize period ends\"},\"prizePeriodRemainingSeconds()\":{\"notice\":\"Returns the number of seconds remaining until the prize can be awarded.\"},\"removeExternalErc20Award(address,address)\":{\"notice\":\"Removes an external ERC20 token type as an additional prize that can be awarded\"},\"removeExternalErc721Award(address,address)\":{\"notice\":\"Removes an external ERC721 token as an additional prize that can be awarded\"},\"rngRequestTimeout()\":{\"notice\":\"RNG Request Timeout.  In fact, this is really a \\\"complete award\\\" timeout. If the rng completes the award can still be cancelled.\"},\"setBeforeAwardListener(address)\":{\"notice\":\"Allows the owner to set a listener that is triggered immediately before the award is distributed\"},\"setPeriodicPrizeStrategyListener(address)\":{\"notice\":\"Allows the owner to set a listener for prize strategy callbacks.\"},\"setPrizePeriodSeconds(uint256)\":{\"notice\":\"Allows the owner to set the prize period in seconds.\"},\"setRngRequestTimeout(uint32)\":{\"notice\":\"Allows the owner to set the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\"},\"setRngService(address)\":{\"notice\":\"Sets the RNG service that the Prize Strategy is connected to\"},\"setTokenListener(address)\":{\"notice\":\"Allows the owner to set the token listener\"},\"startAward()\":{\"notice\":\"Starts the award process by starting random number request.  The prize period must have ended.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/prize-strategy/PeriodicPrizeStrategy.sol\":\"PeriodicPrizeStrategy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.6.0;\\n\\n/// @title Random Number Generator Interface\\n/// @notice Provides an interface for requesting random numbers from 3rd-party RNG services (Chainlink VRF, Starkware VDF, etc..)\\ninterface RNGInterface {\\n\\n  /// @notice Emitted when a new request for a random number has been submitted\\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\\n  /// @param sender The indexed address of the sender of the request\\n  event RandomNumberRequested(uint32 indexed requestId, address indexed sender);\\n\\n  /// @notice Emitted when an existing request for a random number has been completed\\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\\n  /// @param randomNumber The random number produced by the 3rd-party service\\n  event RandomNumberCompleted(uint32 indexed requestId, uint256 randomNumber);\\n\\n  /// @notice Gets the last request id used by the RNG service\\n  /// @return requestId The last request id used in the last request\\n  function getLastRequestId() external view returns (uint32 requestId);\\n\\n  /// @notice Gets the Fee for making a Request against an RNG service\\n  /// @return feeToken The address of the token that is used to pay fees\\n  /// @return requestFee The fee required to be paid to make a request\\n  function getRequestFee() external view returns (address feeToken, uint256 requestFee);\\n\\n  /// @notice Sends a request for a random number to the 3rd-party service\\n  /// @dev Some services will complete the request immediately, others may have a time-delay\\n  /// @dev Some services require payment in the form of a token, such as $LINK for Chainlink VRF\\n  /// @return requestId The ID of the request used to get the results of the RNG service\\n  /// @return lockBlock The block number at which the RNG service will start generating time-delayed randomness.  The calling contract\\n  /// should \\\"lock\\\" all activity until the result is available via the `requestId`\\n  function requestRandomNumber() external returns (uint32 requestId, uint32 lockBlock);\\n\\n  /// @notice Checks if the request for randomness from the 3rd-party service has completed\\n  /// @dev For time-delayed requests, this function is used to check/confirm completion\\n  /// @param requestId The ID of the request used to get the results of the RNG service\\n  /// @return isCompleted True if the request has completed and a random number is available, false otherwise\\n  function isRequestComplete(uint32 requestId) external view returns (bool isCompleted);\\n\\n  /// @notice Gets the random number produced by the 3rd-party service\\n  /// @param requestId The ID of the request used to get the results of the RNG service\\n  /// @return randomNum The random number\\n  function randomNumber(uint32 requestId) external returns (uint256 randomNum);\\n}\\n\",\"keccak256\":\"0xf917c68439d7476cd226f475e8fce940e0cf1d32cb0ff12e8537072a07f2b1da\",\"license\":\"GPL-3.0\"},\"contracts/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary Constants {\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC721 = 0x80ac58cd;\\n}\",\"keccak256\":\"0x5dc8f8bda4e9668a9ffae6a941774f849adcb368cc2275fd8a91e6ada8fad7fb\",\"license\":\"GPL-3.0\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../external/compound/ICompLike.sol\\\";\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../reserve/ReserveInterface.sol\\\";\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/TokenListenerLibrary.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\nimport \\\"./PrizePoolInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using SafeERC20Upgradeable for IERC721Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    address reserveRegistry,\\n    uint256 maxExitFeeMantissa\\n  );\\n\\n  /// @dev Event emitted when controlled token is added\\n  event ControlledTokenAdded(\\n    ControlledTokenInterface indexed token\\n  );\\n\\n  /// @dev Emitted when reserve is captured.\\n  event ReserveFeeCaptured(\\n    uint256 amount\\n  );\\n\\n  event AwardCaptured(\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when assets are deposited\\n  event Deposited(\\n    address indexed operator,\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount,\\n    address referrer\\n  );\\n\\n  /// @dev Event emitted when interest is awarded to a winner\\n  event Awarded(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are awarded to a winner\\n  event AwardedExternalERC20(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are transferred out\\n  event TransferredExternalERC20(\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC721s are awarded to a winner\\n  event AwardedExternalERC721(\\n    address indexed winner,\\n    address indexed token,\\n    uint256[] tokenIds\\n  );\\n\\n  /// @dev Event emitted when assets are withdrawn instantly\\n  event InstantWithdrawal(\\n    address indexed operator,\\n    address indexed from,\\n    address indexed token,\\n    uint256 amount,\\n    uint256 redeemed,\\n    uint256 exitFee\\n  );\\n\\n  event ReserveWithdrawal(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when the Liquidity Cap is set\\n  event LiquidityCapSet(\\n    uint256 liquidityCap\\n  );\\n\\n  /// @dev Event emitted when the Credit plan is set\\n  event CreditPlanSet(\\n    address token,\\n    uint128 creditLimitMantissa,\\n    uint128 creditRateMantissa\\n  );\\n\\n  /// @dev Event emitted when the Prize Strategy is set\\n  event PrizeStrategySet(\\n    address indexed prizeStrategy\\n  );\\n\\n  /// @dev Emitted when credit is minted\\n  event CreditMinted(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when credit is burned\\n  event CreditBurned(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\\n  event ErrorAwardingExternalERC721(bytes error);\\n\\n\\n  struct CreditPlan {\\n    uint128 creditLimitMantissa;\\n    uint128 creditRateMantissa;\\n  }\\n\\n  struct CreditBalance {\\n    uint192 balance;\\n    uint32 timestamp;\\n    bool initialized;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  /// @dev Reserve to which reserve fees are sent\\n  RegistryInterface public reserveRegistry;\\n\\n  /// @dev An array of all the controlled tokens\\n  ControlledTokenInterface[] internal _tokens;\\n\\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\\n  TokenListenerInterface public prizeStrategy;\\n\\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\\n  /// For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\\n  uint256 public maxExitFeeMantissa;\\n\\n  /// @dev The total funds that have been allocated to the reserve\\n  uint256 public reserveTotalSupply;\\n\\n  /// @dev The total amount of funds that the prize pool can hold.\\n  uint256 public liquidityCap;\\n\\n  /// @dev the The awardable balance\\n  uint256 internal _currentAwardBalance;\\n\\n  /// @dev Stores the credit plan for each token.\\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\\n\\n  /// @dev Stores each users balance of credit per token.\\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\\n\\n  /// @notice Initializes the Prize Pool\\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\\n  /// @param _maxExitFeeMantissa The maximum exit fee size\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_reserveRegistry) != address(0), \\\"PrizePool/reserveRegistry-not-zero\\\");\\n    uint256 controlledTokensLength = _controlledTokens.length;\\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\\n\\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\\n      _addControlledToken(controlledToken, i);\\n    }\\n    __Ownable_init();\\n    __ReentrancyGuard_init();\\n    _setLiquidityCap(uint256(-1));\\n\\n    reserveRegistry = _reserveRegistry;\\n    maxExitFeeMantissa = _maxExitFeeMantissa;\\n\\n    emit Initialized(\\n      address(_reserveRegistry),\\n      maxExitFeeMantissa\\n    );\\n  }\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external override view returns (address) {\\n    return address(_token());\\n  }\\n\\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\\n  /// @return The underlying balance of assets\\n  function balance() external returns (uint256) {\\n    return _balance();\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function canAwardExternal(address _externalToken) external view returns (bool) {\\n    return _canAwardExternal(_externalToken);\\n  }\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    canAddLiquidity(amount)\\n  {\\n    address operator = _msgSender();\\n\\n    _mint(to, amount, controlledToken, referrer);\\n\\n    _token().safeTransferFrom(operator, address(this), amount);\\n    _supply(amount);\\n\\n    emit Deposited(operator, to, controlledToken, amount, referrer);\\n  }\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    returns (uint256)\\n  {\\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n    require(exitFee <= maximumExitFee, \\\"PrizePool/exit-fee-exceeds-user-maximum\\\");\\n\\n    // burn the credit\\n    _burnCredit(from, controlledToken, burnedCredit);\\n\\n    // burn the tickets\\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\\n\\n    // redeem the tickets less the fee\\n    uint256 amountLessFee = amount.sub(exitFee);\\n    uint256 redeemed = _redeem(amountLessFee);\\n\\n    _token().safeTransfer(from, redeemed);\\n\\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\\n\\n    return exitFee;\\n  }\\n\\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\\n  /// @param exitFee The exit fee to check against the limit\\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\\n    if (exitFee > maxFee) {\\n      exitFee = maxFee;\\n    }\\n    return exitFee;\\n  }\\n\\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\\n  /// @param from The address the tokens are being transferred from (0 if minting)\\n  /// @param to The address the tokens are being transferred to (0 if burning)\\n  /// @param amount The amount of tokens being trasferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\\n    if (from != address(0)) {\\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\\n      // first accrue credit for their old balance\\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\\n\\n      if (from != to) {\\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\\n      }\\n\\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\\n    }\\n    if (to != address(0) && to != from) {\\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\\n    }\\n    // if we aren't minting\\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\\n    }\\n  }\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external override view returns (uint256) {\\n    return _currentAwardBalance;\\n  }\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n\\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\\n    uint256 currentBalance = _balance();\\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\\n\\n    if (unaccountedPrizeBalance > 0) {\\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\\n      if (reserveFee > 0) {\\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\\n        emit ReserveFeeCaptured(reserveFee);\\n      }\\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\\n\\n      emit AwardCaptured(unaccountedPrizeBalance);\\n    }\\n\\n    return _currentAwardBalance;\\n  }\\n\\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\\n\\n    uint256 amount = reserveTotalSupply;\\n    reserveTotalSupply = 0;\\n    uint256 redeemed = _redeem(amount);\\n\\n    _token().safeTransfer(address(to), redeemed);\\n\\n    emit ReserveWithdrawal(to, amount);\\n\\n    return redeemed;\\n  }\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external override\\n    onlyPrizeStrategy\\n    onlyControlledToken(controlledToken)\\n  {\\n    if (amount == 0) {\\n      return;\\n    }\\n\\n    require(amount <= _currentAwardBalance, \\\"PrizePool/award-exceeds-avail\\\");\\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\\n\\n    _mint(to, amount, controlledToken, address(0));\\n\\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\\n\\n    emit Awarded(to, controlledToken, amount);\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit TransferredExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit AwardedExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  function _transferOut(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (bool)\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (amount == 0) {\\n      return false;\\n    }\\n\\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\\n\\n    return true;\\n  }\\n\\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\\n  /// @param to The user who is receiving the tokens\\n  /// @param amount The amount of tokens they are receiving\\n  /// @param controlledToken The token that is going to be minted\\n  /// @param referrer The user who referred the minting\\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\\n    if (address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n    ControlledToken(controlledToken).controllerMint(to, amount);\\n  }\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (tokenIds.length == 0) {\\n      return;\\n    }\\n\\n    for (uint256 i = 0; i < tokenIds.length; i++) {\\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\\n\\n      }\\n      catch(bytes memory error){\\n        emit ErrorAwardingExternalERC721(error);\\n      }\\n      \\n    }\\n\\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\\n  }\\n\\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\\n  /// @param amount The prize amount\\n  /// @return The size of the reserve portion of the prize\\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    if (address(reserve) == address(0)) {\\n      return 0;\\n    }\\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\\n    if (reserveRateMantissa == 0) {\\n      return 0;\\n    }\\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\\n  }\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external override\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    )\\n  {\\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n  }\\n\\n  /// @dev Calculates the early exit fee for the given amount\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return Exit fee\\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\\n    return _limitExitFee(\\n      amount,\\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external override\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    durationSeconds =_estimateCreditAccrualTime(\\n      _controlledToken,\\n      _principal,\\n      _interest\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function _estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    internal\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    // interest = credit rate * principal * time\\n    // => time = interest / (credit rate * principal)\\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\\n    if (accruedPerSecond == 0) {\\n      return 0;\\n    }\\n    return _interest.div(accruedPerSecond);\\n  }\\n\\n  /// @notice Burns a users credit.\\n  /// @param user The user whose credit should be burned\\n  /// @param credit The amount of credit to burn\\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\\n\\n    emit CreditBurned(user, controlledToken, credit);\\n  }\\n\\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\\n  /// @param user The user for whom to accrue credit\\n  /// @param controlledToken The controlled token whose balance we are checking\\n  /// @param controlledTokenBalance The balance to use for the user\\n  /// @param extra Additional credit to be added\\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\\n    _updateCreditBalance(\\n      user,\\n      controlledToken,\\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\\n    );\\n  }\\n\\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\\n    uint256 newBalance;\\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\\n    if (!creditBalance.initialized) {\\n      newBalance = 0;\\n    } else {\\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\\n    }\\n    return newBalance;\\n  }\\n\\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\\n\\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\\n      balance: newBalance.toUint128(),\\n      timestamp: _currentTime().toUint32(),\\n      initialized: true\\n    });\\n\\n    if (oldBalance < newBalance) {\\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\\n    } \\n    else if (newBalance < oldBalance) {\\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\\n    }\\n  }\\n\\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\\n  /// @param creditBalance The new credit balance to be checked\\n  /// @return The users new credit balance.  Will not exceed the credit limit.\\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\\n      controlledTokenBalance,\\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\\n    );\\n    if (creditBalance > creditLimit) {\\n      creditBalance = creditLimit;\\n    }\\n\\n    return creditBalance;\\n  }\\n\\n  /// @notice Calculates the accrued interest for a user\\n  /// @param user The user whose credit should be calculated.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\\n  /// @return The credit that has accrued since the last credit update.\\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\\n\\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\\n      return 0;\\n    }\\n\\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\\n  }\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\\n    return _tokenCreditBalances[controlledToken][user].balance;\\n  }\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external override\\n    onlyControlledToken(_controlledToken)\\n    onlyOwner\\n  {\\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\\n      creditLimitMantissa: _creditLimitMantissa,\\n      creditRateMantissa: _creditRateMantissa\\n    });\\n\\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\\n  }\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external override\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    )\\n  {\\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\\n  }\\n\\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The token they are withdrawing\\n  /// @param amount The amount of funds they are withdrawing\\n  /// @return earlyExitFee The additional exit fee that should be charged.\\n  /// @return creditBurned The amount of credit that will be burned\\n  function _calculateEarlyExitFeeLessBurnedCredit(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (\\n      uint256 earlyExitFee,\\n      uint256 creditBurned\\n    )\\n  {\\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\\n    require(controlledTokenBalance >= amount, \\\"PrizePool/insuff-funds\\\");\\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\\n    /*\\n    The credit is used *last*.  Always charge the fees up-front.\\n\\n    How to calculate:\\n\\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\\n\\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\\n    */\\n\\n    // Determine available usable credit based on withdraw amount\\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\\n\\n    uint256 availableCredit;\\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\\n    }\\n\\n    // Determine amount of credit to burn and amount of fees required\\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\\n    earlyExitFee = totalExitFee.sub(creditBurned);\\n  }\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\\n    _setLiquidityCap(_liquidityCap);\\n  }\\n\\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\\n    liquidityCap = _liquidityCap;\\n    emit LiquidityCapSet(_liquidityCap);\\n  }\\n\\n  /// @notice Adds a new controlled token\\n  /// @param _controlledToken The controlled token to add.\\n  /// @param index The index to add the controlledToken\\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\\n    require(_controlledToken.controller() == this, \\\"PrizePool/token-ctrlr-mismatch\\\");\\n    \\n    _tokens[index] = _controlledToken;\\n    emit ControlledTokenAdded(_controlledToken);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\\n    _setPrizeStrategy(_prizeStrategy);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\\n    require(address(_prizeStrategy) != address(0), \\\"PrizePool/prizeStrategy-not-zero\\\");\\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PrizePool/prizeStrategy-invalid\\\");\\n    prizeStrategy = _prizeStrategy;\\n\\n    emit PrizeStrategySet(address(_prizeStrategy));\\n  }\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\\n    return _tokens;\\n  }\\n\\n  /// @dev Gets the current time as represented by the current block\\n  /// @return The timestamp of the current block\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external override view returns (uint256) {\\n    return _tokenTotalSupply();\\n  }\\n\\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\\n  /// @param to The address to delegate to \\n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\\n    if (compLike.balanceOf(address(this)) > 0) {\\n      compLike.delegate(to);\\n    }\\n  }\\n  \\n  /// @notice Required for ERC721 safe token transfers from smart contracts.\\n  /// @param operator The address that acts on behalf of the owner\\n  /// @param from The current owner of the NFT\\n  /// @param tokenId The NFT to transfer\\n  /// @param data Additional data with no specified format, sent in call to `_to`.\\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function _tokenTotalSupply() internal view returns (uint256) {\\n    uint256 total = reserveTotalSupply;\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \\n    uint256 tokensLength = tokens.length;\\n    \\n    for(uint256 i = 0; i < tokensLength; i++){\\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\\n    }\\n\\n    return total;\\n  }\\n\\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\\n  }\\n\\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\\n    uint256 tokensLength = tokens.length;\\n\\n    for(uint256 i = 0; i < tokensLength; i++) {\\n      if(tokens[i] == controlledToken) return true;\\n    }\\n    return false;\\n  }\\n  \\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\\n    return _isControlled(controlledToken);\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function _token() internal virtual view returns (IERC20Upgradeable);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal virtual returns (uint256);\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal virtual;\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\\n\\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  modifier onlyControlledToken(address controlledToken) {\\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \\\"PrizePool/unknown-token\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure caller is the prize-strategy\\n  modifier onlyPrizeStrategy() {\\n    require(_msgSender() == address(prizeStrategy), \\\"PrizePool/only-prizeStrategy\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\\n  modifier canAddLiquidity(uint256 _amount) {\\n    require(_canAddLiquidity(_amount), \\\"PrizePool/exceeds-liquidity-cap\\\");\\n    _;\\n  }\\n\\n  modifier onlyReserve() {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    require(address(reserve) == msg.sender, \\\"PrizePool/only-reserve\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x386ebc1c80ab4424f14125e716dd12641ff933b475bf1082b7b1a6eee4a969c3\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListener.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./BeforeAwardListenerInterface.sol\\\";\\nimport \\\"../Constants.sol\\\";\\nimport \\\"./BeforeAwardListenerLibrary.sol\\\";\\n\\nabstract contract BeforeAwardListener is BeforeAwardListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == BeforeAwardListenerLibrary.ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER\\n    );\\n  }\\n}\",\"keccak256\":\"0x5da2a7332421d6136d793ef55410c2da63a7fb719e8522697f78ac4c50391505\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @notice The interface for the Periodic Prize Strategy before award listener.  This listener will be called immediately before the award is distributed.\\ninterface BeforeAwardListenerInterface is IERC165Upgradeable {\\n  /// @notice Called immediately before the award is distributed\\n  function beforePrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x96145efe8fc65aff97d11ffaf0905d53baf4b87c4a575a84d691804468f12083\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary BeforeAwardListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforePrizePoolAwarded(uint256,uint256)')) == 0x4cdf9c3e\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER = 0x4cdf9c3e;\\n}\",\"keccak256\":\"0xeac08a7b8e2e7d508a0af89c05c31c36e2b060674d05dfa9a5016cf2d12cf500\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategy.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\\\";\\nimport \\\"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../token/TokenListener.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TicketInterface.sol\\\";\\nimport \\\"../prize-pool/PrizePool.sol\\\";\\nimport \\\"../Constants.sol\\\";\\nimport \\\"./PeriodicPrizeStrategyListenerInterface.sol\\\";\\nimport \\\"./PeriodicPrizeStrategyListenerLibrary.sol\\\";\\nimport \\\"./BeforeAwardListener.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\nabstract contract PeriodicPrizeStrategy is Initializable,\\n                                           OwnableUpgradeable,\\n                                           TokenListener {\\n\\n  using SafeMathUpgradeable for uint256;\\n  using SafeMathUpgradeable for uint16;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using AddressUpgradeable for address;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  uint256 internal constant ETHEREUM_BLOCK_TIME_ESTIMATE_MANTISSA = 13.4 ether;\\n\\n  event PrizePoolOpened(\\n    address indexed operator,\\n    uint256 indexed prizePeriodStartedAt\\n  );\\n\\n  event RngRequestFailed();\\n\\n  event PrizePoolAwardStarted(\\n    address indexed operator,\\n    address indexed prizePool,\\n    uint32 indexed rngRequestId,\\n    uint32 rngLockBlock\\n  );\\n\\n  event PrizePoolAwardCancelled(\\n    address indexed operator,\\n    address indexed prizePool,\\n    uint32 indexed rngRequestId,\\n    uint32 rngLockBlock\\n  );\\n\\n  event PrizePoolAwarded(\\n    address indexed operator,\\n    uint256 randomNumber\\n  );\\n\\n  event RngServiceUpdated(\\n    RNGInterface indexed rngService\\n  );\\n\\n  event TokenListenerUpdated(\\n    TokenListenerInterface indexed tokenListener\\n  );\\n\\n  event RngRequestTimeoutSet(\\n    uint32 rngRequestTimeout\\n  );\\n\\n  event PrizePeriodSecondsUpdated(\\n    uint256 prizePeriodSeconds\\n  );\\n\\n  event BeforeAwardListenerSet(\\n    BeforeAwardListenerInterface indexed beforeAwardListener\\n  );\\n\\n  event PeriodicPrizeStrategyListenerSet(\\n    PeriodicPrizeStrategyListenerInterface indexed periodicPrizeStrategyListener\\n  );\\n\\n  event ExternalErc721AwardAdded(\\n    IERC721Upgradeable indexed externalErc721,\\n    uint256[] tokenIds\\n  );\\n\\n  event ExternalErc20AwardAdded(\\n    IERC20Upgradeable indexed externalErc20\\n  );\\n\\n  event ExternalErc721AwardRemoved(\\n    IERC721Upgradeable indexed externalErc721Award\\n  );\\n\\n  event ExternalErc20AwardRemoved(\\n    IERC20Upgradeable indexed externalErc20Award\\n  );\\n\\n  event Initialized(\\n    uint256 prizePeriodStart,\\n    uint256 prizePeriodSeconds,\\n    PrizePool indexed prizePool,\\n    TicketInterface ticket,\\n    IERC20Upgradeable sponsorship,\\n    RNGInterface rng,\\n    IERC20Upgradeable[] externalErc20Awards\\n  );\\n\\n  struct RngRequest {\\n    uint32 id;\\n    uint32 lockBlock;\\n    uint32 requestedAt;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  // Comptroller\\n  TokenListenerInterface public tokenListener;\\n\\n  // Contract Interfaces\\n  PrizePool public prizePool;\\n  TicketInterface public ticket;\\n  IERC20Upgradeable public sponsorship;\\n  RNGInterface public rng;\\n\\n  // Current RNG Request\\n  RngRequest internal rngRequest;\\n\\n  /// @notice RNG Request Timeout.  In fact, this is really a \\\"complete award\\\" timeout.\\n  /// If the rng completes the award can still be cancelled.\\n  uint32 public rngRequestTimeout;\\n\\n  // Prize period\\n  uint256 public prizePeriodSeconds;\\n  uint256 public prizePeriodStartedAt;\\n\\n  // External tokens awarded as part of prize\\n  MappedSinglyLinkedList.Mapping internal externalErc20s;\\n  MappedSinglyLinkedList.Mapping internal externalErc721s;\\n\\n  // External NFT token IDs to be awarded\\n  //   NFT Address => TokenIds\\n  mapping (IERC721Upgradeable => uint256[]) internal externalErc721TokenIds;\\n\\n  /// @notice A listener that is called before the prize is awarded\\n  BeforeAwardListenerInterface public beforeAwardListener;\\n\\n  /// @notice A listener that is called after the prize is awarded\\n  PeriodicPrizeStrategyListenerInterface public periodicPrizeStrategyListener;\\n\\n  /// @notice Initializes a new strategy\\n  /// @param _prizePeriodStart The starting timestamp of the prize period.\\n  /// @param _prizePeriodSeconds The duration of the prize period in seconds\\n  /// @param _prizePool The prize pool to award\\n  /// @param _ticket The ticket to use to draw winners\\n  /// @param _sponsorship The sponsorship token\\n  /// @param _rng The RNG service to use\\n  function initialize (\\n    uint256 _prizePeriodStart,\\n    uint256 _prizePeriodSeconds,\\n    PrizePool _prizePool,\\n    TicketInterface _ticket,\\n    IERC20Upgradeable _sponsorship,\\n    RNGInterface _rng,\\n    IERC20Upgradeable[] memory externalErc20Awards\\n  ) public initializer {\\n    require(address(_prizePool) != address(0), \\\"PeriodicPrizeStrategy/prize-pool-not-zero\\\");\\n    require(address(_ticket) != address(0), \\\"PeriodicPrizeStrategy/ticket-not-zero\\\");\\n    require(address(_sponsorship) != address(0), \\\"PeriodicPrizeStrategy/sponsorship-not-zero\\\");\\n    require(address(_rng) != address(0), \\\"PeriodicPrizeStrategy/rng-not-zero\\\");\\n    prizePool = _prizePool;\\n    ticket = _ticket;\\n    rng = _rng;\\n    sponsorship = _sponsorship;\\n    _setPrizePeriodSeconds(_prizePeriodSeconds);\\n\\n    __Ownable_init();\\n\\n    externalErc20s.initialize();\\n    for (uint256 i = 0; i < externalErc20Awards.length; i++) {\\n      _addExternalErc20Award(externalErc20Awards[i]);\\n    }\\n\\n    prizePeriodSeconds = _prizePeriodSeconds;\\n    prizePeriodStartedAt = _prizePeriodStart;\\n\\n    externalErc721s.initialize();\\n\\n    // 30 min timeout\\n    _setRngRequestTimeout(1800);\\n\\n    emit Initialized(\\n      _prizePeriodStart,\\n      _prizePeriodSeconds,\\n      _prizePool,\\n      _ticket,\\n      _sponsorship,\\n      _rng,\\n      externalErc20Awards\\n    );\\n    emit PrizePoolOpened(_msgSender(), prizePeriodStartedAt);\\n  }\\n\\n  function _distribute(uint256 randomNumber) internal virtual;\\n\\n  /// @notice Calculates and returns the currently accrued prize\\n  /// @return The current prize size\\n  function currentPrize() public view returns (uint256) {\\n    return prizePool.awardBalance();\\n  }\\n\\n  /// @notice Allows the owner to set the token listener\\n  /// @param _tokenListener A contract that implements the token listener interface.\\n  function setTokenListener(TokenListenerInterface _tokenListener) external onlyOwner requireAwardNotInProgress {\\n    require(address(0) == address(_tokenListener) || address(_tokenListener).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PeriodicPrizeStrategy/token-listener-invalid\\\");\\n\\n    tokenListener = _tokenListener;\\n\\n    emit TokenListenerUpdated(tokenListener);\\n  }\\n\\n  /// @notice Estimates the remaining blocks until the prize given a number of seconds per block\\n  /// @param secondsPerBlockMantissa The number of seconds per block to use for the calculation.  Should be a fixed point 18 number like Ether.\\n  /// @return The estimated number of blocks remaining until the prize can be awarded.\\n  function estimateRemainingBlocksToPrize(uint256 secondsPerBlockMantissa) public view returns (uint256) {\\n    return FixedPoint.divideUintByMantissa(\\n      _prizePeriodRemainingSeconds(),\\n      secondsPerBlockMantissa\\n    );\\n  }\\n\\n  /// @notice Returns the number of seconds remaining until the prize can be awarded.\\n  /// @return The number of seconds remaining until the prize can be awarded.\\n  function prizePeriodRemainingSeconds() external view returns (uint256) {\\n    return _prizePeriodRemainingSeconds();\\n  }\\n\\n  /// @notice Returns the number of seconds remaining until the prize can be awarded.\\n  /// @return The number of seconds remaining until the prize can be awarded.\\n  function _prizePeriodRemainingSeconds() internal view returns (uint256) {\\n    uint256 endAt = _prizePeriodEndAt();\\n    uint256 time = _currentTime();\\n    if (time > endAt) {\\n      return 0;\\n    }\\n    return endAt.sub(time);\\n  }\\n\\n  /// @notice Returns whether the prize period is over\\n  /// @return True if the prize period is over, false otherwise\\n  function isPrizePeriodOver() external view returns (bool) {\\n    return _isPrizePeriodOver();\\n  }\\n\\n  /// @notice Returns whether the prize period is over\\n  /// @return True if the prize period is over, false otherwise\\n  function _isPrizePeriodOver() internal view returns (bool) {\\n    return _currentTime() >= _prizePeriodEndAt();\\n  }\\n\\n  /// @notice Awards collateral as tickets to a user\\n  /// @param user Recipient of minted tokens\\n  /// @param amount Amount of minted tokens\\n  function _awardTickets(address user, uint256 amount) internal {\\n    prizePool.award(user, amount, address(ticket));\\n  }\\n  \\n  /// @notice Mints ticket or sponsorship tokens for user.\\n  /// @dev Mints ticket or sponsorship tokens by looking up the address in the prizePool.tokens mapping. \\n  /// @param user Recipient of minted tokens\\n  /// @param amount Amount of minted tokens\\n  /// @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\\n  function _awardToken(address user, uint256 amount, uint8 tokenIndex) internal {\\n    ControlledTokenInterface[] memory _controlledTokens = prizePool.tokens();\\n    require(tokenIndex <= _controlledTokens.length, \\\"PeriodicPrizeStrategy/award-invalid-token-index\\\");\\n    ControlledTokenInterface _token = _controlledTokens[tokenIndex];\\n    prizePool.award(user, amount, address(_token));\\n  }\\n\\n  /// @notice Awards all external tokens with non-zero balances to the given user.  The external tokens must be held by the PrizePool contract.\\n  /// @param winner The user to transfer the tokens to\\n  function _awardAllExternalTokens(address winner) internal {\\n    _awardExternalErc20s(winner);\\n    _awardExternalErc721s(winner);\\n  }\\n\\n  /// @notice Awards all external ERC20 tokens with non-zero balances to the given user.\\n  /// The external tokens must be held by the PrizePool contract.\\n  /// @param winner The user to transfer the tokens to\\n  function _awardExternalErc20s(address winner) internal {\\n    address currentToken = externalErc20s.start();\\n    while (currentToken != address(0) && currentToken != externalErc20s.end()) {\\n      uint256 balance = IERC20Upgradeable(currentToken).balanceOf(address(prizePool));\\n      if (balance > 0) {\\n        prizePool.awardExternalERC20(winner, currentToken, balance);\\n      }\\n      currentToken = externalErc20s.next(currentToken);\\n    }\\n  }\\n\\n  /// @notice Awards all external ERC721 tokens to the given user.\\n  /// The external tokens must be held by the PrizePool contract.\\n  /// @dev The list of ERC721s is reset after every award\\n  /// @param winner The user to transfer the tokens to\\n  function _awardExternalErc721s(address winner) internal {\\n    address currentToken = externalErc721s.start();\\n    while (currentToken != address(0) && currentToken != externalErc721s.end()) {\\n      uint256 balance = IERC721Upgradeable(currentToken).balanceOf(address(prizePool));\\n      if (balance > 0) {\\n        prizePool.awardExternalERC721(winner, currentToken, externalErc721TokenIds[IERC721Upgradeable(currentToken)]);\\n        _removeExternalErc721AwardTokens(IERC721Upgradeable(currentToken));\\n      }\\n      currentToken = externalErc721s.next(currentToken);\\n    }\\n    externalErc721s.clearAll();\\n  }\\n\\n  /// @notice Returns the timestamp at which the prize period ends\\n  /// @return The timestamp at which the prize period ends.\\n  function prizePeriodEndAt() external view returns (uint256) {\\n    // current prize started at is non-inclusive, so add one\\n    return _prizePeriodEndAt();\\n  }\\n\\n  /// @notice Returns the timestamp at which the prize period ends\\n  /// @return The timestamp at which the prize period ends.\\n  function _prizePeriodEndAt() internal view returns (uint256) {\\n    // current prize started at is non-inclusive, so add one\\n    return prizePeriodStartedAt.add(prizePeriodSeconds);\\n  }\\n\\n  /// @notice Called by the PrizePool for transfers of controlled tokens\\n  /// @dev Note that this is only for *transfers*, not mints or burns\\n  /// @param controlledToken The type of collateral that is being sent\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external override onlyPrizePool {\\n    require(from != to, \\\"PeriodicPrizeStrategy/transfer-to-self\\\");\\n\\n    if (controlledToken == address(ticket)) {\\n      _requireAwardNotInProgress();\\n    }\\n\\n    if (address(tokenListener) != address(0)) {\\n      tokenListener.beforeTokenTransfer(from, to, amount, controlledToken);\\n    }\\n  }\\n\\n  /// @notice Called by the PrizePool when minting controlled tokens\\n  /// @param controlledToken The type of collateral that is being minted\\n  function beforeTokenMint(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external\\n    override\\n    onlyPrizePool\\n  {\\n    if (controlledToken == address(ticket)) {\\n      _requireAwardNotInProgress();\\n    }\\n    if (address(tokenListener) != address(0)) {\\n      tokenListener.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n  }\\n\\n  /// @notice returns the current time.  Used for testing.\\n  /// @return The current time (block.timestamp)\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice returns the current time.  Used for testing.\\n  /// @return The current time (block.timestamp)\\n  function _currentBlock() internal virtual view returns (uint256) {\\n    return block.number;\\n  }\\n\\n  /// @notice Starts the award process by starting random number request.  The prize period must have ended.\\n  /// @dev The RNG-Request-Fee is expected to be held within this contract before calling this function\\n  function startAward() external requireCanStartAward {\\n    (address feeToken, uint256 requestFee) = rng.getRequestFee();\\n    if (feeToken != address(0) && requestFee > 0) {\\n      IERC20Upgradeable(feeToken).safeApprove(address(rng), requestFee);\\n    }\\n\\n    (uint32 requestId, uint32 lockBlock) = rng.requestRandomNumber();\\n    rngRequest.id = requestId;\\n    rngRequest.lockBlock = lockBlock;\\n    rngRequest.requestedAt = _currentTime().toUint32();\\n\\n    emit PrizePoolAwardStarted(_msgSender(), address(prizePool), requestId, lockBlock);\\n  }\\n\\n  /// @notice Can be called by anyone to unlock the tickets if the RNG has timed out.\\n  function cancelAward() public {\\n    require(isRngTimedOut(), \\\"PeriodicPrizeStrategy/rng-not-timedout\\\");\\n    uint32 requestId = rngRequest.id;\\n    uint32 lockBlock = rngRequest.lockBlock;\\n    delete rngRequest;\\n    emit RngRequestFailed();\\n    emit PrizePoolAwardCancelled(msg.sender, address(prizePool), requestId, lockBlock);\\n  }\\n\\n  /// @notice Completes the award process and awards the winners.  The random number must have been requested and is now available.\\n  function completeAward() external requireCanCompleteAward {\\n    uint256 randomNumber = rng.randomNumber(rngRequest.id);\\n    delete rngRequest;\\n\\n    if (address(beforeAwardListener) != address(0)) {\\n      beforeAwardListener.beforePrizePoolAwarded(randomNumber, prizePeriodStartedAt);\\n    }\\n    _distribute(randomNumber);\\n    if (address(periodicPrizeStrategyListener) != address(0)) {\\n      periodicPrizeStrategyListener.afterPrizePoolAwarded(randomNumber, prizePeriodStartedAt);\\n    }\\n\\n    // to avoid clock drift, we should calculate the start time based on the previous period start time.\\n    prizePeriodStartedAt = _calculateNextPrizePeriodStartTime(_currentTime());\\n\\n    emit PrizePoolAwarded(_msgSender(), randomNumber);\\n    emit PrizePoolOpened(_msgSender(), prizePeriodStartedAt);\\n  }\\n\\n  /// @notice Allows the owner to set a listener that is triggered immediately before the award is distributed\\n  /// @dev The listener must implement ERC165 and the BeforeAwardListenerInterface\\n  /// @param _beforeAwardListener The address of the listener contract\\n  function setBeforeAwardListener(BeforeAwardListenerInterface _beforeAwardListener) external onlyOwner requireAwardNotInProgress {\\n    require(\\n      address(0) == address(_beforeAwardListener) || address(_beforeAwardListener).supportsInterface(BeforeAwardListenerLibrary.ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER),\\n      \\\"PeriodicPrizeStrategy/beforeAwardListener-invalid\\\"\\n    );\\n\\n    beforeAwardListener = _beforeAwardListener;\\n\\n    emit BeforeAwardListenerSet(_beforeAwardListener);\\n  }\\n\\n  /// @notice Allows the owner to set a listener for prize strategy callbacks.\\n  /// @param _periodicPrizeStrategyListener The address of the listener contract\\n  function setPeriodicPrizeStrategyListener(PeriodicPrizeStrategyListenerInterface _periodicPrizeStrategyListener) external onlyOwner requireAwardNotInProgress {\\n    require(\\n      address(0) == address(_periodicPrizeStrategyListener) || address(_periodicPrizeStrategyListener).supportsInterface(PeriodicPrizeStrategyListenerLibrary.ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER),\\n      \\\"PeriodicPrizeStrategy/prizeStrategyListener-invalid\\\"\\n    );\\n\\n    periodicPrizeStrategyListener = _periodicPrizeStrategyListener;\\n\\n    emit PeriodicPrizeStrategyListenerSet(_periodicPrizeStrategyListener);\\n  }\\n\\n  function _calculateNextPrizePeriodStartTime(uint256 currentTime) internal view returns (uint256) {\\n    uint256 elapsedPeriods = currentTime.sub(prizePeriodStartedAt).div(prizePeriodSeconds);\\n    return prizePeriodStartedAt.add(elapsedPeriods.mul(prizePeriodSeconds));\\n  }\\n\\n  /// @notice Calculates when the next prize period will start\\n  /// @param currentTime The timestamp to use as the current time\\n  /// @return The timestamp at which the next prize period would start\\n  function calculateNextPrizePeriodStartTime(uint256 currentTime) external view returns (uint256) {\\n    return _calculateNextPrizePeriodStartTime(currentTime);\\n  }\\n\\n  /// @notice Returns whether an award process can be started\\n  /// @return True if an award can be started, false otherwise.\\n  function canStartAward() external view returns (bool) {\\n    return _isPrizePeriodOver() && !isRngRequested();\\n  }\\n\\n  /// @notice Returns whether an award process can be completed\\n  /// @return True if an award can be completed, false otherwise.\\n  function canCompleteAward() external view returns (bool) {\\n    return isRngRequested() && isRngCompleted();\\n  }\\n\\n  /// @notice Returns whether a random number has been requested\\n  /// @return True if a random number has been requested, false otherwise.\\n  function isRngRequested() public view returns (bool) {\\n    return rngRequest.id != 0;\\n  }\\n\\n  /// @notice Returns whether the random number request has completed.\\n  /// @return True if a random number request has completed, false otherwise.\\n  function isRngCompleted() public view returns (bool) {\\n    return rng.isRequestComplete(rngRequest.id);\\n  }\\n\\n  /// @notice Returns the block number that the current RNG request has been locked to\\n  /// @return The block number that the RNG request is locked to\\n  function getLastRngLockBlock() external view returns (uint32) {\\n    return rngRequest.lockBlock;\\n  }\\n\\n  /// @notice Returns the current RNG Request ID\\n  /// @return The current Request ID\\n  function getLastRngRequestId() external view returns (uint32) {\\n    return rngRequest.id;\\n  }\\n\\n  /// @notice Sets the RNG service that the Prize Strategy is connected to\\n  /// @param rngService The address of the new RNG service interface\\n  function setRngService(RNGInterface rngService) external onlyOwner requireAwardNotInProgress {\\n    require(!isRngRequested(), \\\"PeriodicPrizeStrategy/rng-in-flight\\\");\\n\\n    rng = rngService;\\n    emit RngServiceUpdated(rngService);\\n  }\\n\\n  /// @notice Allows the owner to set the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\\n  /// @param _rngRequestTimeout The RNG request timeout in seconds.\\n  function setRngRequestTimeout(uint32 _rngRequestTimeout) external onlyOwner requireAwardNotInProgress {\\n    _setRngRequestTimeout(_rngRequestTimeout);\\n  }\\n\\n  /// @notice Sets the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\\n  /// @param _rngRequestTimeout The RNG request timeout in seconds.\\n  function _setRngRequestTimeout(uint32 _rngRequestTimeout) internal {\\n    require(_rngRequestTimeout > 60, \\\"PeriodicPrizeStrategy/rng-timeout-gt-60-secs\\\");\\n    rngRequestTimeout = _rngRequestTimeout;\\n    emit RngRequestTimeoutSet(rngRequestTimeout);\\n  }\\n\\n  /// @notice Allows the owner to set the prize period in seconds.\\n  /// @param _prizePeriodSeconds The new prize period in seconds.  Must be greater than zero.\\n  function setPrizePeriodSeconds(uint256 _prizePeriodSeconds) external onlyOwner requireAwardNotInProgress {\\n    _setPrizePeriodSeconds(_prizePeriodSeconds);\\n  }\\n\\n  /// @notice Sets the prize period in seconds.\\n  /// @param _prizePeriodSeconds The new prize period in seconds.  Must be greater than zero.\\n  function _setPrizePeriodSeconds(uint256 _prizePeriodSeconds) internal {\\n    require(_prizePeriodSeconds > 0, \\\"PeriodicPrizeStrategy/prize-period-greater-than-zero\\\");\\n    prizePeriodSeconds = _prizePeriodSeconds;\\n\\n    emit PrizePeriodSecondsUpdated(prizePeriodSeconds);\\n  }\\n\\n  /// @notice Gets the current list of External ERC20 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC20 token addresses\\n  function getExternalErc20Awards() external view returns (address[] memory) {\\n    return externalErc20s.addressArray();\\n  }\\n\\n  /// @notice Adds an external ERC20 token type as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can assign external tokens,\\n  /// and they must be approved by the Prize-Pool\\n  /// @param _externalErc20 The address of an ERC20 token to be awarded\\n  function addExternalErc20Award(IERC20Upgradeable _externalErc20) external onlyOwnerOrListener requireAwardNotInProgress {\\n    _addExternalErc20Award(_externalErc20);\\n  }\\n\\n  function _addExternalErc20Award(IERC20Upgradeable _externalErc20) internal {\\n    require(address(_externalErc20).isContract(), \\\"PeriodicPrizeStrategy/erc20-null\\\");\\n    require(prizePool.canAwardExternal(address(_externalErc20)), \\\"PeriodicPrizeStrategy/cannot-award-external\\\");\\n    (bool succeeded, bytes memory returnValue) = address(_externalErc20).staticcall(abi.encodeWithSignature(\\\"totalSupply()\\\"));\\n    require(succeeded, \\\"PeriodicPrizeStrategy/erc20-invalid\\\");\\n    externalErc20s.addAddress(address(_externalErc20));\\n    emit ExternalErc20AwardAdded(_externalErc20);\\n  }\\n\\n  function addExternalErc20Awards(IERC20Upgradeable[] calldata _externalErc20s) external onlyOwnerOrListener requireAwardNotInProgress {\\n    for (uint256 i = 0; i < _externalErc20s.length; i++) {\\n      _addExternalErc20Award(_externalErc20s[i]);\\n    }\\n  }\\n\\n  /// @notice Removes an external ERC20 token type as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can remove external tokens\\n  /// @param _externalErc20 The address of an ERC20 token to be removed\\n  /// @param _prevExternalErc20 The address of the previous ERC20 token in the `externalErc20s` list.\\n  /// If the ERC20 is the first address, then the previous address is the SENTINEL address: 0x0000000000000000000000000000000000000001\\n  function removeExternalErc20Award(IERC20Upgradeable _externalErc20, IERC20Upgradeable _prevExternalErc20) external onlyOwner requireAwardNotInProgress {\\n    externalErc20s.removeAddress(address(_prevExternalErc20), address(_externalErc20));\\n    emit ExternalErc20AwardRemoved(_externalErc20);\\n  }\\n\\n  /// @notice Gets the current list of External ERC721 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC721 token addresses\\n  function getExternalErc721Awards() external view returns (address[] memory) {\\n    return externalErc721s.addressArray();\\n  }\\n\\n  /// @notice Gets the current list of External ERC721 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC721 token addresses\\n  function getExternalErc721AwardTokenIds(IERC721Upgradeable _externalErc721) external view returns (uint256[] memory) {\\n    return externalErc721TokenIds[_externalErc721];\\n  }\\n\\n  /// @notice Adds an external ERC721 token as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can assign external tokens,\\n  /// and they must be approved by the Prize-Pool\\n  /// NOTE: The NFT must already be owned by the Prize-Pool\\n  /// @param _externalErc721 The address of an ERC721 token to be awarded\\n  /// @param _tokenIds An array of token IDs of the ERC721 to be awarded\\n  function addExternalErc721Award(IERC721Upgradeable _externalErc721, uint256[] calldata _tokenIds) external onlyOwnerOrListener requireAwardNotInProgress {\\n    require(prizePool.canAwardExternal(address(_externalErc721)), \\\"PeriodicPrizeStrategy/cannot-award-external\\\");\\n    require(address(_externalErc721).supportsInterface(Constants.ERC165_INTERFACE_ID_ERC721), \\\"PeriodicPrizeStrategy/erc721-invalid\\\");\\n    \\n    if (!externalErc721s.contains(address(_externalErc721))) {\\n      externalErc721s.addAddress(address(_externalErc721));\\n    }\\n\\n    for (uint256 i = 0; i < _tokenIds.length; i++) {\\n      _addExternalErc721Award(_externalErc721, _tokenIds[i]);\\n    }\\n\\n    emit ExternalErc721AwardAdded(_externalErc721, _tokenIds);\\n  }\\n\\n  function _addExternalErc721Award(IERC721Upgradeable _externalErc721, uint256 _tokenId) internal {\\n    require(IERC721Upgradeable(_externalErc721).ownerOf(_tokenId) == address(prizePool), \\\"PeriodicPrizeStrategy/unavailable-token\\\");\\n    for (uint256 i = 0; i < externalErc721TokenIds[_externalErc721].length; i++) {\\n      if (externalErc721TokenIds[_externalErc721][i] == _tokenId) {\\n        revert(\\\"PeriodicPrizeStrategy/erc721-duplicate\\\");\\n      }\\n    }\\n    externalErc721TokenIds[_externalErc721].push(_tokenId);\\n  }\\n\\n  /// @notice Removes an external ERC721 token as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can remove external tokens\\n  /// @param _externalErc721 The address of an ERC721 token to be removed\\n  /// @param _prevExternalErc721 The address of the previous ERC721 token in the list.\\n  /// If no previous, then pass the SENTINEL address: 0x0000000000000000000000000000000000000001\\n  function removeExternalErc721Award(\\n    IERC721Upgradeable _externalErc721,\\n    IERC721Upgradeable _prevExternalErc721\\n  )\\n    external\\n    onlyOwner\\n    requireAwardNotInProgress\\n  {\\n    externalErc721s.removeAddress(address(_prevExternalErc721), address(_externalErc721));\\n    _removeExternalErc721AwardTokens(_externalErc721);\\n  }\\n\\n  function _removeExternalErc721AwardTokens(\\n    IERC721Upgradeable _externalErc721\\n  )\\n    internal\\n  {\\n    delete externalErc721TokenIds[_externalErc721];\\n    emit ExternalErc721AwardRemoved(_externalErc721);\\n  }\\n\\n  function _requireAwardNotInProgress() internal view {\\n    uint256 currentBlock = _currentBlock();\\n    require(rngRequest.lockBlock == 0 || currentBlock < rngRequest.lockBlock, \\\"PeriodicPrizeStrategy/rng-in-flight\\\");\\n  }\\n\\n  function isRngTimedOut() public view returns (bool) {\\n    if (rngRequest.requestedAt == 0) {\\n      return false;\\n    } else {\\n      return _currentTime() > uint256(rngRequestTimeout).add(rngRequest.requestedAt);\\n    }\\n  }\\n\\n  modifier onlyOwnerOrListener() {\\n    require(_msgSender() == owner() ||\\n            _msgSender() == address(periodicPrizeStrategyListener) ||\\n            _msgSender() == address(beforeAwardListener),\\n            \\\"PeriodicPrizeStrategy/only-owner-or-listener\\\");\\n    _;\\n  }\\n\\n  modifier requireAwardNotInProgress() {\\n    _requireAwardNotInProgress();\\n    _;\\n  }\\n\\n  modifier requireCanStartAward() {\\n    require(_isPrizePeriodOver(), \\\"PeriodicPrizeStrategy/prize-period-not-over\\\");\\n    require(!isRngRequested(), \\\"PeriodicPrizeStrategy/rng-already-requested\\\");\\n    _;\\n  }\\n\\n  modifier requireCanCompleteAward() {\\n    require(isRngRequested(), \\\"PeriodicPrizeStrategy/rng-not-requested\\\");\\n    require(isRngCompleted(), \\\"PeriodicPrizeStrategy/rng-not-complete\\\");\\n    _;\\n  }\\n\\n  modifier onlyPrizePool() {\\n    require(_msgSender() == address(prizePool), \\\"PeriodicPrizeStrategy/only-prize-pool\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0xd7bf198ab616ed4b3e9c29d20477887d5a1e000e137e447da20bcec73b7cf997\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ninterface PeriodicPrizeStrategyListenerInterface is IERC165Upgradeable {\\n  function afterPrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x229624266562f60200b4e40ebc95a35a8aad799c0ff95a42df243af98a44d198\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary PeriodicPrizeStrategyListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('afterPrizePoolAwarded(uint256,uint256)')) == 0x575072c6\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER = 0x575072c6;\\n}\\n\",\"keccak256\":\"0xed291b9a33e265535032557f0a5430a150701c9eb58b0138c120eb02bc13b514\",\"license\":\"GPL-3.0\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TicketInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface TicketInterface {\\n  /// @notice Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\\n  /// @param randomNumber The random number to use to select a user.\\n  /// @return The winner\\n  function draw(uint256 randomNumber) external view returns (address);\\n}\",\"keccak256\":\"0x5201a9a22748781592abd2003801289224d4899292195b7de937cd5748be87dd\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListener.sol\":{\"content\":\"pragma solidity ^0.6.4;\\n\\nimport \\\"./TokenListenerInterface.sol\\\";\\nimport \\\"./TokenListenerLibrary.sol\\\";\\nimport \\\"../Constants.sol\\\";\\n\\nabstract contract TokenListener is TokenListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER\\n    );\\n  }\\n}\\n\",\"keccak256\":\"0xb0e98d10b004602e1d4f4369a70e6382002dc0c0c5713698eb6a92943aef2265\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 10,
                "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                "label": "_owner",
                "offset": 0,
                "slot": "51",
                "type": "t_address"
              },
              {
                "astId": 129,
                "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                "label": "__gap",
                "offset": 0,
                "slot": "52",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 9738,
                "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                "label": "tokenListener",
                "offset": 0,
                "slot": "101",
                "type": "t_contract(TokenListenerInterface)16265"
              },
              {
                "astId": 9740,
                "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                "label": "prizePool",
                "offset": 0,
                "slot": "102",
                "type": "t_contract(PrizePool)8751"
              },
              {
                "astId": 9742,
                "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                "label": "ticket",
                "offset": 0,
                "slot": "103",
                "type": "t_contract(TicketInterface)16152"
              },
              {
                "astId": 9744,
                "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                "label": "sponsorship",
                "offset": 0,
                "slot": "104",
                "type": "t_contract(IERC20Upgradeable)1960"
              },
              {
                "astId": 9746,
                "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                "label": "rng",
                "offset": 0,
                "slot": "105",
                "type": "t_contract(RNGInterface)5531"
              },
              {
                "astId": 9748,
                "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                "label": "rngRequest",
                "offset": 0,
                "slot": "106",
                "type": "t_struct(RngRequest)9732_storage"
              },
              {
                "astId": 9751,
                "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                "label": "rngRequestTimeout",
                "offset": 0,
                "slot": "107",
                "type": "t_uint32"
              },
              {
                "astId": 9753,
                "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                "label": "prizePeriodSeconds",
                "offset": 0,
                "slot": "108",
                "type": "t_uint256"
              },
              {
                "astId": 9755,
                "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                "label": "prizePeriodStartedAt",
                "offset": 0,
                "slot": "109",
                "type": "t_uint256"
              },
              {
                "astId": 9757,
                "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                "label": "externalErc20s",
                "offset": 0,
                "slot": "110",
                "type": "t_struct(Mapping)16337_storage"
              },
              {
                "astId": 9759,
                "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                "label": "externalErc721s",
                "offset": 0,
                "slot": "112",
                "type": "t_struct(Mapping)16337_storage"
              },
              {
                "astId": 9764,
                "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                "label": "externalErc721TokenIds",
                "offset": 0,
                "slot": "114",
                "type": "t_mapping(t_contract(IERC721Upgradeable)3338,t_array(t_uint256)dyn_storage)"
              },
              {
                "astId": 9767,
                "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                "label": "beforeAwardListener",
                "offset": 0,
                "slot": "115",
                "type": "t_contract(BeforeAwardListenerInterface)9575"
              },
              {
                "astId": 9770,
                "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                "label": "periodicPrizeStrategyListener",
                "offset": 0,
                "slot": "116",
                "type": "t_contract(PeriodicPrizeStrategyListenerInterface)11432"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_array(t_uint256)dyn_storage": {
                "base": "t_uint256",
                "encoding": "dynamic_array",
                "label": "uint256[]",
                "numberOfBytes": "32"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_contract(BeforeAwardListenerInterface)9575": {
                "encoding": "inplace",
                "label": "contract BeforeAwardListenerInterface",
                "numberOfBytes": "20"
              },
              "t_contract(IERC20Upgradeable)1960": {
                "encoding": "inplace",
                "label": "contract IERC20Upgradeable",
                "numberOfBytes": "20"
              },
              "t_contract(IERC721Upgradeable)3338": {
                "encoding": "inplace",
                "label": "contract IERC721Upgradeable",
                "numberOfBytes": "20"
              },
              "t_contract(PeriodicPrizeStrategyListenerInterface)11432": {
                "encoding": "inplace",
                "label": "contract PeriodicPrizeStrategyListenerInterface",
                "numberOfBytes": "20"
              },
              "t_contract(PrizePool)8751": {
                "encoding": "inplace",
                "label": "contract PrizePool",
                "numberOfBytes": "20"
              },
              "t_contract(RNGInterface)5531": {
                "encoding": "inplace",
                "label": "contract RNGInterface",
                "numberOfBytes": "20"
              },
              "t_contract(TicketInterface)16152": {
                "encoding": "inplace",
                "label": "contract TicketInterface",
                "numberOfBytes": "20"
              },
              "t_contract(TokenListenerInterface)16265": {
                "encoding": "inplace",
                "label": "contract TokenListenerInterface",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_address)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => address)",
                "numberOfBytes": "32",
                "value": "t_address"
              },
              "t_mapping(t_contract(IERC721Upgradeable)3338,t_array(t_uint256)dyn_storage)": {
                "encoding": "mapping",
                "key": "t_contract(IERC721Upgradeable)3338",
                "label": "mapping(contract IERC721Upgradeable => uint256[])",
                "numberOfBytes": "32",
                "value": "t_array(t_uint256)dyn_storage"
              },
              "t_struct(Mapping)16337_storage": {
                "encoding": "inplace",
                "label": "struct MappedSinglyLinkedList.Mapping",
                "members": [
                  {
                    "astId": 16332,
                    "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                    "label": "count",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint256"
                  },
                  {
                    "astId": 16336,
                    "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                    "label": "addressMap",
                    "offset": 0,
                    "slot": "1",
                    "type": "t_mapping(t_address,t_address)"
                  }
                ],
                "numberOfBytes": "64"
              },
              "t_struct(RngRequest)9732_storage": {
                "encoding": "inplace",
                "label": "struct PeriodicPrizeStrategy.RngRequest",
                "members": [
                  {
                    "astId": 9727,
                    "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                    "label": "id",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint32"
                  },
                  {
                    "astId": 9729,
                    "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                    "label": "lockBlock",
                    "offset": 4,
                    "slot": "0",
                    "type": "t_uint32"
                  },
                  {
                    "astId": 9731,
                    "contract": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:PeriodicPrizeStrategy",
                    "label": "requestedAt",
                    "offset": 8,
                    "slot": "0",
                    "type": "t_uint32"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint32": {
                "encoding": "inplace",
                "label": "uint32",
                "numberOfBytes": "4"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "VERSION()": {
                "notice": "Semver Version"
              },
              "addExternalErc20Award(address)": {
                "notice": "Adds an external ERC20 token type as an additional prize that can be awarded"
              },
              "addExternalErc721Award(address,uint256[])": {
                "notice": "Adds an external ERC721 token as an additional prize that can be awarded"
              },
              "beforeAwardListener()": {
                "notice": "A listener that is called before the prize is awarded"
              },
              "beforeTokenMint(address,uint256,address,address)": {
                "notice": "Called by the PrizePool when minting controlled tokens"
              },
              "beforeTokenTransfer(address,address,uint256,address)": {
                "notice": "Called by the PrizePool for transfers of controlled tokens"
              },
              "calculateNextPrizePeriodStartTime(uint256)": {
                "notice": "Calculates when the next prize period will start"
              },
              "canCompleteAward()": {
                "notice": "Returns whether an award process can be completed"
              },
              "canStartAward()": {
                "notice": "Returns whether an award process can be started"
              },
              "cancelAward()": {
                "notice": "Can be called by anyone to unlock the tickets if the RNG has timed out."
              },
              "completeAward()": {
                "notice": "Completes the award process and awards the winners.  The random number must have been requested and is now available."
              },
              "currentPrize()": {
                "notice": "Calculates and returns the currently accrued prize"
              },
              "estimateRemainingBlocksToPrize(uint256)": {
                "notice": "Estimates the remaining blocks until the prize given a number of seconds per block"
              },
              "getExternalErc20Awards()": {
                "notice": "Gets the current list of External ERC20 tokens that will be awarded with the current prize"
              },
              "getExternalErc721AwardTokenIds(address)": {
                "notice": "Gets the current list of External ERC721 tokens that will be awarded with the current prize"
              },
              "getExternalErc721Awards()": {
                "notice": "Gets the current list of External ERC721 tokens that will be awarded with the current prize"
              },
              "getLastRngLockBlock()": {
                "notice": "Returns the block number that the current RNG request has been locked to"
              },
              "getLastRngRequestId()": {
                "notice": "Returns the current RNG Request ID"
              },
              "initialize(uint256,uint256,address,address,address,address,address[])": {
                "notice": "Initializes a new strategy"
              },
              "isPrizePeriodOver()": {
                "notice": "Returns whether the prize period is over"
              },
              "isRngCompleted()": {
                "notice": "Returns whether the random number request has completed."
              },
              "isRngRequested()": {
                "notice": "Returns whether a random number has been requested"
              },
              "periodicPrizeStrategyListener()": {
                "notice": "A listener that is called after the prize is awarded"
              },
              "prizePeriodEndAt()": {
                "notice": "Returns the timestamp at which the prize period ends"
              },
              "prizePeriodRemainingSeconds()": {
                "notice": "Returns the number of seconds remaining until the prize can be awarded."
              },
              "removeExternalErc20Award(address,address)": {
                "notice": "Removes an external ERC20 token type as an additional prize that can be awarded"
              },
              "removeExternalErc721Award(address,address)": {
                "notice": "Removes an external ERC721 token as an additional prize that can be awarded"
              },
              "rngRequestTimeout()": {
                "notice": "RNG Request Timeout.  In fact, this is really a \"complete award\" timeout. If the rng completes the award can still be cancelled."
              },
              "setBeforeAwardListener(address)": {
                "notice": "Allows the owner to set a listener that is triggered immediately before the award is distributed"
              },
              "setPeriodicPrizeStrategyListener(address)": {
                "notice": "Allows the owner to set a listener for prize strategy callbacks."
              },
              "setPrizePeriodSeconds(uint256)": {
                "notice": "Allows the owner to set the prize period in seconds."
              },
              "setRngRequestTimeout(uint32)": {
                "notice": "Allows the owner to set the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked."
              },
              "setRngService(address)": {
                "notice": "Sets the RNG service that the Prize Strategy is connected to"
              },
              "setTokenListener(address)": {
                "notice": "Allows the owner to set the token listener"
              },
              "startAward()": {
                "notice": "Starts the award process by starting random number request.  The prize period must have ended."
              }
            },
            "version": 1
          }
        }
      },
      "contracts/prize-strategy/PeriodicPrizeStrategyListener.sol": {
        "PeriodicPrizeStrategyListener": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "randomNumber",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "prizePeriodStartedAt",
                  "type": "uint256"
                }
              ],
              "name": "afterPrizePoolAwarded",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes4",
                  "name": "interfaceId",
                  "type": "bytes4"
                }
              ],
              "name": "supportsInterface",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "supportsInterface(bytes4)": {
                "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "afterPrizePoolAwarded(uint256,uint256)": "575072c6",
              "supportsInterface(bytes4)": "01ffc9a7"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"randomNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prizePeriodStartedAt\",\"type\":\"uint256\"}],\"name\":\"afterPrizePoolAwarded\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/prize-strategy/PeriodicPrizeStrategyListener.sol\":\"PeriodicPrizeStrategyListener\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"contracts/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary Constants {\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC721 = 0x80ac58cd;\\n}\",\"keccak256\":\"0x5dc8f8bda4e9668a9ffae6a941774f849adcb368cc2275fd8a91e6ada8fad7fb\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListener.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./PeriodicPrizeStrategyListenerInterface.sol\\\";\\nimport \\\"./PeriodicPrizeStrategyListenerLibrary.sol\\\";\\nimport \\\"../Constants.sol\\\";\\n\\nabstract contract PeriodicPrizeStrategyListener is PeriodicPrizeStrategyListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == PeriodicPrizeStrategyListenerLibrary.ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER\\n    );\\n  }\\n}\",\"keccak256\":\"0x27259202d2bfa4521832a9469447b58919df102b90b2b253b38cc48a0c37e521\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ninterface PeriodicPrizeStrategyListenerInterface is IERC165Upgradeable {\\n  function afterPrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x229624266562f60200b4e40ebc95a35a8aad799c0ff95a42df243af98a44d198\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary PeriodicPrizeStrategyListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('afterPrizePoolAwarded(uint256,uint256)')) == 0x575072c6\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER = 0x575072c6;\\n}\\n\",\"keccak256\":\"0xed291b9a33e265535032557f0a5430a150701c9eb58b0138c120eb02bc13b514\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/prize-strategy/PeriodicPrizeStrategyListenerInterface.sol": {
        "PeriodicPrizeStrategyListenerInterface": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "randomNumber",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "prizePeriodStartedAt",
                  "type": "uint256"
                }
              ],
              "name": "afterPrizePoolAwarded",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes4",
                  "name": "interfaceId",
                  "type": "bytes4"
                }
              ],
              "name": "supportsInterface",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "supportsInterface(bytes4)": {
                "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "afterPrizePoolAwarded(uint256,uint256)": "575072c6",
              "supportsInterface(bytes4)": "01ffc9a7"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"randomNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prizePeriodStartedAt\",\"type\":\"uint256\"}],\"name\":\"afterPrizePoolAwarded\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/prize-strategy/PeriodicPrizeStrategyListenerInterface.sol\":\"PeriodicPrizeStrategyListenerInterface\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ninterface PeriodicPrizeStrategyListenerInterface is IERC165Upgradeable {\\n  function afterPrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x229624266562f60200b4e40ebc95a35a8aad799c0ff95a42df243af98a44d198\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/prize-strategy/PeriodicPrizeStrategyListenerLibrary.sol": {
        "PeriodicPrizeStrategyListenerLibrary": {
          "abi": [
            {
              "inputs": [],
              "name": "ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER",
              "outputs": [
                {
                  "internalType": "bytes4",
                  "name": "",
                  "type": "bytes4"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "609c610024600b82828239805160001a607314601757fe5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361060335760003560e01c80631511e54f146038575b600080fd5b603e605b565b604080516001600160e01b03199092168252519081900360200190f35b632ba8396360e11b8156fea26469706673582212201278caaf3e3429d1124361b8253d30a6c2fbc2a6df238f6b303314ee450a180b64736f6c634300060c0033",
              "opcodes": "PUSH1 0x9C PUSH2 0x24 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x17 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH1 0x33 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1511E54F EQ PUSH1 0x38 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3E PUSH1 0x5B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH4 0x2BA83963 PUSH1 0xE1 SHL DUP2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SLT PUSH25 0xCAAF3E3429D1124361B8253D30A6C2FBC2A6DF238F6B303314 0xEE GASLIMIT EXP XOR SIGNEXTEND PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "62:236:53:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "730000000000000000000000000000000000000000301460806040526004361060335760003560e01c80631511e54f146038575b600080fd5b603e605b565b604080516001600160e01b03199092168252519081900360200190f35b632ba8396360e11b8156fea26469706673582212201278caaf3e3429d1124361b8253d30a6c2fbc2a6df238f6b303314ee450a180b64736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH1 0x33 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1511E54F EQ PUSH1 0x38 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3E PUSH1 0x5B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH4 0x2BA83963 PUSH1 0xE1 SHL DUP2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SLT PUSH25 0xCAAF3E3429D1124361B8253D30A6C2FBC2A6DF238F6B303314 0xEE GASLIMIT EXP XOR SIGNEXTEND PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "62:236:53:-:0;;;;;;;;;;;;;;;;;;;;;;;;207:88;;;:::i;:::-;;;;-1:-1:-1;;;;;;207:88:53;;;;;;;;;;;;;;;-1:-1:-1;;;207:88:53;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "31200",
                "executionCost": "109",
                "totalCost": "31309"
              },
              "external": {
                "ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER()": "190"
              }
            },
            "methodIdentifiers": {
              "ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER()": "1511e54f"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/prize-strategy/PeriodicPrizeStrategyListenerLibrary.sol\":\"PeriodicPrizeStrategyListenerLibrary\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/prize-strategy/PeriodicPrizeStrategyListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary PeriodicPrizeStrategyListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('afterPrizePoolAwarded(uint256,uint256)')) == 0x575072c6\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER = 0x575072c6;\\n}\\n\",\"keccak256\":\"0xed291b9a33e265535032557f0a5430a150701c9eb58b0138c120eb02bc13b514\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/prize-strategy/PrizeSplit.sol": {
        "PrizeSplit": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "uint256",
                  "name": "target",
                  "type": "uint256"
                }
              ],
              "name": "PrizeSplitRemoved",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "target",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint16",
                  "name": "percentage",
                  "type": "uint16"
                },
                {
                  "indexed": false,
                  "internalType": "uint8",
                  "name": "token",
                  "type": "uint8"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "index",
                  "type": "uint256"
                }
              ],
              "name": "PrizeSplitSet",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "prizeSplitIndex",
                  "type": "uint256"
                }
              ],
              "name": "prizeSplit",
              "outputs": [
                {
                  "components": [
                    {
                      "internalType": "address",
                      "name": "target",
                      "type": "address"
                    },
                    {
                      "internalType": "uint16",
                      "name": "percentage",
                      "type": "uint16"
                    },
                    {
                      "internalType": "uint8",
                      "name": "token",
                      "type": "uint8"
                    }
                  ],
                  "internalType": "struct PrizeSplit.PrizeSplitConfig",
                  "name": "",
                  "type": "tuple"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizeSplits",
              "outputs": [
                {
                  "components": [
                    {
                      "internalType": "address",
                      "name": "target",
                      "type": "address"
                    },
                    {
                      "internalType": "uint16",
                      "name": "percentage",
                      "type": "uint16"
                    },
                    {
                      "internalType": "uint8",
                      "name": "token",
                      "type": "uint8"
                    }
                  ],
                  "internalType": "struct PrizeSplit.PrizeSplitConfig[]",
                  "name": "",
                  "type": "tuple[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "renounceOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "components": [
                    {
                      "internalType": "address",
                      "name": "target",
                      "type": "address"
                    },
                    {
                      "internalType": "uint16",
                      "name": "percentage",
                      "type": "uint16"
                    },
                    {
                      "internalType": "uint8",
                      "name": "token",
                      "type": "uint8"
                    }
                  ],
                  "internalType": "struct PrizeSplit.PrizeSplitConfig",
                  "name": "prizeStrategySplit",
                  "type": "tuple"
                },
                {
                  "internalType": "uint8",
                  "name": "prizeSplitIndex",
                  "type": "uint8"
                }
              ],
              "name": "setPrizeSplit",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "components": [
                    {
                      "internalType": "address",
                      "name": "target",
                      "type": "address"
                    },
                    {
                      "internalType": "uint16",
                      "name": "percentage",
                      "type": "uint16"
                    },
                    {
                      "internalType": "uint8",
                      "name": "token",
                      "type": "uint8"
                    }
                  ],
                  "internalType": "struct PrizeSplit.PrizeSplitConfig[]",
                  "name": "newPrizeSplits",
                  "type": "tuple[]"
                }
              ],
              "name": "setPrizeSplits",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "author": "Kames Geraghty (PoolTogether Inc)",
            "events": {
              "PrizeSplitRemoved(uint256)": {
                "details": "Emitted when a PrizeSplitConfig config is removed from the _prizeSplits array.",
                "params": {
                  "target": "Index of a previously active prize split config"
                }
              },
              "PrizeSplitSet(address,uint16,uint8,uint256)": {
                "details": "Emitted when aPrizeSplitConfig config is added or updated in setPrizeSplits or setPrizeSplit.",
                "params": {
                  "index": "Index of prize split in the prizeSplts array",
                  "percentage": "Percentage of prize split. Must be between 0 and 1000 for single decimal precision",
                  "target": "Address of prize split recipient",
                  "token": "Index (0 or 1) of token in the prizePool.tokens mapping"
                }
              }
            },
            "kind": "dev",
            "methods": {
              "owner()": {
                "details": "Returns the address of the current owner."
              },
              "prizeSplit(uint256)": {
                "details": "Read PrizeSplitConfig struct from _prizeSplits array.",
                "params": {
                  "prizeSplitIndex": "Index position of PrizeSplitConfig"
                },
                "returns": {
                  "_0": "PrizeSplitConfig Single prize split config"
                }
              },
              "prizeSplits()": {
                "details": "Read all PrizeSplitConfig structs stored in _prizeSplits.",
                "returns": {
                  "_0": "_prizeSplits Array of PrizeSplitConfig structs"
                }
              },
              "renounceOwnership()": {
                "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
              },
              "setPrizeSplit((address,uint16,uint8),uint8)": {
                "details": "Updates a prize split config by passing a new PrizeSplitConfig struct and current index position. Limited to contract owner.",
                "params": {
                  "prizeSplitIndex": "Index position of PrizeSplitConfig to update",
                  "prizeStrategySplit": "PrizeSplitConfig config struct"
                }
              },
              "setPrizeSplits((address,uint16,uint8)[])": {
                "details": "Set and remove prize split configs by passing a new PrizeSplitConfig structs array. Will remove existing PrizeSplitConfig(s) if passed array length is less than existing _prizeSplits length.",
                "params": {
                  "newPrizeSplits": "Array of PrizeSplitConfig structs"
                }
              },
              "transferOwnership(address)": {
                "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
              }
            },
            "title": "Abstract prize split contract for adding unique award distribution to static addresses. ",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "owner()": "8da5cb5b",
              "prizeSplit(uint256)": "eefc8ad1",
              "prizeSplits()": "8d5f10c4",
              "renounceOwnership()": "715018a6",
              "setPrizeSplit((address,uint16,uint8),uint8)": "fbf0953e",
              "setPrizeSplits((address,uint16,uint8)[])": "c25a9c32",
              "transferOwnership(address)": "f2fde38b"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"target\",\"type\":\"uint256\"}],\"name\":\"PrizeSplitRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"PrizeSplitSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"prizeSplitIndex\",\"type\":\"uint256\"}],\"name\":\"prizeSplit\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"}],\"internalType\":\"struct PrizeSplit.PrizeSplitConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizeSplits\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"}],\"internalType\":\"struct PrizeSplit.PrizeSplitConfig[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"}],\"internalType\":\"struct PrizeSplit.PrizeSplitConfig\",\"name\":\"prizeStrategySplit\",\"type\":\"tuple\"},{\"internalType\":\"uint8\",\"name\":\"prizeSplitIndex\",\"type\":\"uint8\"}],\"name\":\"setPrizeSplit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"}],\"internalType\":\"struct PrizeSplit.PrizeSplitConfig[]\",\"name\":\"newPrizeSplits\",\"type\":\"tuple[]\"}],\"name\":\"setPrizeSplits\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Kames Geraghty (PoolTogether Inc)\",\"events\":{\"PrizeSplitRemoved(uint256)\":{\"details\":\"Emitted when a PrizeSplitConfig config is removed from the _prizeSplits array.\",\"params\":{\"target\":\"Index of a previously active prize split config\"}},\"PrizeSplitSet(address,uint16,uint8,uint256)\":{\"details\":\"Emitted when aPrizeSplitConfig config is added or updated in setPrizeSplits or setPrizeSplit.\",\"params\":{\"index\":\"Index of prize split in the prizeSplts array\",\"percentage\":\"Percentage of prize split. Must be between 0 and 1000 for single decimal precision\",\"target\":\"Address of prize split recipient\",\"token\":\"Index (0 or 1) of token in the prizePool.tokens mapping\"}}},\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"prizeSplit(uint256)\":{\"details\":\"Read PrizeSplitConfig struct from _prizeSplits array.\",\"params\":{\"prizeSplitIndex\":\"Index position of PrizeSplitConfig\"},\"returns\":{\"_0\":\"PrizeSplitConfig Single prize split config\"}},\"prizeSplits()\":{\"details\":\"Read all PrizeSplitConfig structs stored in _prizeSplits.\",\"returns\":{\"_0\":\"_prizeSplits Array of PrizeSplitConfig structs\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setPrizeSplit((address,uint16,uint8),uint8)\":{\"details\":\"Updates a prize split config by passing a new PrizeSplitConfig struct and current index position. Limited to contract owner.\",\"params\":{\"prizeSplitIndex\":\"Index position of PrizeSplitConfig to update\",\"prizeStrategySplit\":\"PrizeSplitConfig config struct\"}},\"setPrizeSplits((address,uint16,uint8)[])\":{\"details\":\"Set and remove prize split configs by passing a new PrizeSplitConfig structs array. Will remove existing PrizeSplitConfig(s) if passed array length is less than existing _prizeSplits length.\",\"params\":{\"newPrizeSplits\":\"Array of PrizeSplitConfig structs\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"Abstract prize split contract for adding unique award distribution to static addresses. \",\"version\":1},\"userdoc\":{\"events\":{\"PrizeSplitRemoved(uint256)\":{\"notice\":\"Emitted when a PrizeSplitConfig config is removed.\"},\"PrizeSplitSet(address,uint16,uint8,uint256)\":{\"notice\":\"Emitted when a PrizeSplitConfig config is added or updated.\"}},\"kind\":\"user\",\"methods\":{\"prizeSplit(uint256)\":{\"notice\":\"Read prize split config from active PrizeSplits.\"},\"prizeSplits()\":{\"notice\":\"Read all prize splits configs.\"},\"setPrizeSplit((address,uint16,uint8),uint8)\":{\"notice\":\"Updates a previously set prize split config.\"},\"setPrizeSplits((address,uint16,uint8)[])\":{\"notice\":\"Set and remove prize split(s) configs.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/prize-strategy/PrizeSplit.sol\":\"PrizeSplit\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"contracts/prize-strategy/PrizeSplit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\n\\n/**\\n  * @title Abstract prize split contract for adding unique award distribution to static addresses. \\n  * @author Kames Geraghty (PoolTogether Inc)\\n*/\\nabstract contract PrizeSplit is OwnableUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  \\n  PrizeSplitConfig[] internal _prizeSplits;\\n\\n  /**\\n    * @notice The prize split configuration struct.\\n    * @dev The prize split configuration struct used to award prize splits during distribution.\\n    * @param target Address of recipient receiving the prize split distribution\\n    * @param percentage Percentage of prize split using a 0-1000 range for single decimal precision i.e. 125 = 12.5%\\n    * @param token Position of controlled token in prizePool.tokens (i.e. ticket or sponsorship)\\n  */\\n  struct PrizeSplitConfig {\\n      address target;\\n      uint16 percentage;\\n      uint8 token;\\n  }\\n\\n  /**\\n    * @notice Emitted when a PrizeSplitConfig config is added or updated.\\n    * @dev Emitted when aPrizeSplitConfig config is added or updated in setPrizeSplits or setPrizeSplit.\\n    * @param target Address of prize split recipient\\n    * @param percentage Percentage of prize split. Must be between 0 and 1000 for single decimal precision\\n    * @param token Index (0 or 1) of token in the prizePool.tokens mapping\\n    * @param index Index of prize split in the prizeSplts array\\n  */\\n  event PrizeSplitSet(address indexed target, uint16 percentage, uint8 token, uint256 index);\\n\\n  /**\\n    * @notice Emitted when a PrizeSplitConfig config is removed.\\n    * @dev Emitted when a PrizeSplitConfig config is removed from the _prizeSplits array.\\n    * @param target Index of a previously active prize split config\\n  */\\n  event PrizeSplitRemoved(uint256 indexed target);\\n\\n  /**\\n    * @notice Mints ticket or sponsorship tokens to prize split recipient.\\n    * @dev Mints ticket or sponsorship tokens to prize split recipient via the linked PrizePool contract.\\n    * @param target Recipient of minted tokens\\n    * @param amount Amount of minted tokens\\n    * @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\\n  */\\n  function _awardPrizeSplitAmount(address target, uint256 amount, uint8 tokenIndex) virtual internal;\\n\\n  /**\\n    * @notice Read all prize splits configs.\\n    * @dev Read all PrizeSplitConfig structs stored in _prizeSplits.\\n    * @return _prizeSplits Array of PrizeSplitConfig structs\\n  */\\n  function prizeSplits() external view returns (PrizeSplitConfig[] memory) {\\n    return _prizeSplits;\\n  }\\n\\n  /**\\n    * @notice Read prize split config from active PrizeSplits.\\n    * @dev Read PrizeSplitConfig struct from _prizeSplits array.\\n    * @param prizeSplitIndex Index position of PrizeSplitConfig\\n    * @return PrizeSplitConfig Single prize split config\\n  */\\n  function prizeSplit(uint256 prizeSplitIndex) external view returns (PrizeSplitConfig memory) {\\n    return _prizeSplits[prizeSplitIndex];\\n  }\\n\\n  /**\\n    * @notice Set and remove prize split(s) configs.\\n    * @dev Set and remove prize split configs by passing a new PrizeSplitConfig structs array. Will remove existing PrizeSplitConfig(s) if passed array length is less than existing _prizeSplits length.\\n    * @param newPrizeSplits Array of PrizeSplitConfig structs\\n  */\\n  function setPrizeSplits(PrizeSplitConfig[] calldata newPrizeSplits) external onlyOwner {\\n    uint256 newPrizeSplitsLength = newPrizeSplits.length;\\n\\n    // Add and/or update prize split configs using newPrizeSplits PrizeSplitConfig structs array.\\n    for (uint256 index = 0; index < newPrizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = newPrizeSplits[index];\\n      require(split.token <= 1, \\\"MultipleWinners/invalid-prizesplit-token\\\");\\n      require(split.target != address(0), \\\"MultipleWinners/invalid-prizesplit-target\\\");\\n      \\n      if (_prizeSplits.length <= index) {\\n        _prizeSplits.push(split);\\n      } else {\\n        PrizeSplitConfig memory currentSplit = _prizeSplits[index];\\n        if (split.target != currentSplit.target || split.percentage != currentSplit.percentage || split.token != currentSplit.token) {\\n          _prizeSplits[index] = split;\\n        } else {\\n          continue;\\n        }\\n      }\\n\\n      // Emit the added/updated prize split config.\\n      emit PrizeSplitSet(split.target, split.percentage, split.token, index);\\n    }\\n\\n    // Remove old prize splits configs. Match storage _prizesSplits.length with the passed newPrizeSplits.length\\n    while (_prizeSplits.length > newPrizeSplitsLength) {\\n      uint256 _index = _prizeSplits.length.sub(1);\\n      _prizeSplits.pop();\\n      emit PrizeSplitRemoved(_index);\\n    }\\n\\n    // Total prize split do not exceed 100%\\n    uint256 totalPercentage = _totalPrizeSplitPercentageAmount();\\n    require(totalPercentage <= 1000, \\\"MultipleWinners/invalid-prizesplit-percentage-total\\\");\\n  }\\n\\n  /**\\n    * @notice Updates a previously set prize split config.\\n    * @dev Updates a prize split config by passing a new PrizeSplitConfig struct and current index position. Limited to contract owner.\\n    * @param prizeStrategySplit PrizeSplitConfig config struct\\n    * @param prizeSplitIndex Index position of PrizeSplitConfig to update\\n  */\\n  function setPrizeSplit(PrizeSplitConfig memory prizeStrategySplit, uint8 prizeSplitIndex) external onlyOwner {\\n    require(prizeSplitIndex < _prizeSplits.length, \\\"MultipleWinners/nonexistent-prizesplit\\\");\\n    require(prizeStrategySplit.token <= 1, \\\"MultipleWinners/invalid-prizesplit-token\\\");\\n    require(prizeStrategySplit.target != address(0), \\\"MultipleWinners/invalid-prizesplit-target\\\");\\n    \\n    // Update the prize split config\\n    _prizeSplits[prizeSplitIndex] = prizeStrategySplit;\\n\\n    // Total prize split do not exceed 100%\\n    uint256 totalPercentage = _totalPrizeSplitPercentageAmount();\\n    require(totalPercentage <= 1000, \\\"MultipleWinners/invalid-prizesplit-percentage-total\\\");\\n\\n    // Emit updated prize split config\\n    emit PrizeSplitSet(prizeStrategySplit.target, prizeStrategySplit.percentage, prizeStrategySplit.token, prizeSplitIndex);\\n  }\\n\\n  /**\\n  * @notice Calculate single prize split distribution amount.\\n  * @dev Calculate single prize split distribution amount using the total prize amount and prize split percentage.\\n  * @param amount Total prize award distribution amount\\n  * @param percentage Percentage with single decimal precision using 0-1000 ranges\\n  */\\n  function _getPrizeSplitAmount(uint256 amount, uint16 percentage) internal pure returns (uint256) {\\n    return (amount * percentage).div(1000);\\n  }\\n\\n  /**\\n  * @notice Calculates total prize split percentage amount.\\n  * @dev Calculates total PrizeSplitConfig percentage(s) amount. Used to check the total does not exceed 100% of award distribution.\\n  * @return Total prize split(s) percentage amount\\n  */\\n  function _totalPrizeSplitPercentageAmount() internal view returns (uint256) {\\n    uint256 _tempTotalPercentage;\\n    uint256 prizeSplitsLength = _prizeSplits.length;\\n    for (uint8 index = 0; index < prizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = _prizeSplits[index];\\n      _tempTotalPercentage = _tempTotalPercentage.add(split.percentage);\\n    }\\n    return _tempTotalPercentage;\\n  }\\n\\n  /**\\n  * @notice Distributes prize split(s).\\n  * @dev Distributes prize split(s) by awarding ticket or sponsorship tokens.\\n  * @param prize Starting prize award amount\\n  * @return Total prize award distribution amount exlcuding the awarded prize split(s)\\n  */\\n  function _distributePrizeSplits(uint256 prize) internal returns (uint256) {\\n    // Store temporary total prize amount for multiple calculations using initial prize amount.\\n    uint256 _prizeTemp = prize;\\n    uint256 prizeSplitsLength = _prizeSplits.length;\\n    for (uint256 index = 0; index < prizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = _prizeSplits[index];\\n      uint256 _splitAmount = _getPrizeSplitAmount(_prizeTemp, split.percentage);\\n\\n      // Award the prize split distribution amount.\\n      _awardPrizeSplitAmount(split.target, _splitAmount, split.token);\\n\\n      // Update the remaining prize amount after distributing the prize split percentage.\\n      prize = prize.sub(_splitAmount);\\n    }\\n\\n    return prize;\\n  }\\n\\n}\",\"keccak256\":\"0xc736c25922cf9065c73a06108d4d05c18af9a9e393c5280ba5d4cdb1863f3dbd\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/prize-strategy/PrizeSplit.sol:PrizeSplit",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/prize-strategy/PrizeSplit.sol:PrizeSplit",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/prize-strategy/PrizeSplit.sol:PrizeSplit",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 10,
                "contract": "contracts/prize-strategy/PrizeSplit.sol:PrizeSplit",
                "label": "_owner",
                "offset": 0,
                "slot": "51",
                "type": "t_address"
              },
              {
                "astId": 129,
                "contract": "contracts/prize-strategy/PrizeSplit.sol:PrizeSplit",
                "label": "__gap",
                "offset": 0,
                "slot": "52",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 11452,
                "contract": "contracts/prize-strategy/PrizeSplit.sol:PrizeSplit",
                "label": "_prizeSplits",
                "offset": 0,
                "slot": "101",
                "type": "t_array(t_struct(PrizeSplitConfig)11459_storage)dyn_storage"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_struct(PrizeSplitConfig)11459_storage)dyn_storage": {
                "base": "t_struct(PrizeSplitConfig)11459_storage",
                "encoding": "dynamic_array",
                "label": "struct PrizeSplit.PrizeSplitConfig[]",
                "numberOfBytes": "32"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_struct(PrizeSplitConfig)11459_storage": {
                "encoding": "inplace",
                "label": "struct PrizeSplit.PrizeSplitConfig",
                "members": [
                  {
                    "astId": 11454,
                    "contract": "contracts/prize-strategy/PrizeSplit.sol:PrizeSplit",
                    "label": "target",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_address"
                  },
                  {
                    "astId": 11456,
                    "contract": "contracts/prize-strategy/PrizeSplit.sol:PrizeSplit",
                    "label": "percentage",
                    "offset": 20,
                    "slot": "0",
                    "type": "t_uint16"
                  },
                  {
                    "astId": 11458,
                    "contract": "contracts/prize-strategy/PrizeSplit.sol:PrizeSplit",
                    "label": "token",
                    "offset": 22,
                    "slot": "0",
                    "type": "t_uint8"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_uint16": {
                "encoding": "inplace",
                "label": "uint16",
                "numberOfBytes": "2"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint8": {
                "encoding": "inplace",
                "label": "uint8",
                "numberOfBytes": "1"
              }
            }
          },
          "userdoc": {
            "events": {
              "PrizeSplitRemoved(uint256)": {
                "notice": "Emitted when a PrizeSplitConfig config is removed."
              },
              "PrizeSplitSet(address,uint16,uint8,uint256)": {
                "notice": "Emitted when a PrizeSplitConfig config is added or updated."
              }
            },
            "kind": "user",
            "methods": {
              "prizeSplit(uint256)": {
                "notice": "Read prize split config from active PrizeSplits."
              },
              "prizeSplits()": {
                "notice": "Read all prize splits configs."
              },
              "setPrizeSplit((address,uint16,uint8),uint8)": {
                "notice": "Updates a previously set prize split config."
              },
              "setPrizeSplits((address,uint16,uint8)[])": {
                "notice": "Set and remove prize split(s) configs."
              }
            },
            "version": 1
          }
        }
      },
      "contracts/prize-strategy/multiple-winners/MultipleWinners.sol": {
        "MultipleWinners": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract BeforeAwardListenerInterface",
                  "name": "beforeAwardListener",
                  "type": "address"
                }
              ],
              "name": "BeforeAwardListenerSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "bool",
                  "name": "carry",
                  "type": "bool"
                }
              ],
              "name": "BlocklistCarrySet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "count",
                  "type": "uint256"
                }
              ],
              "name": "BlocklistRetryCountSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "bool",
                  "name": "isBlocked",
                  "type": "bool"
                }
              ],
              "name": "BlocklistSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20Upgradeable",
                  "name": "externalErc20",
                  "type": "address"
                }
              ],
              "name": "ExternalErc20AwardAdded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20Upgradeable",
                  "name": "externalErc20Award",
                  "type": "address"
                }
              ],
              "name": "ExternalErc20AwardRemoved",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC721Upgradeable",
                  "name": "externalErc721",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256[]",
                  "name": "tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "ExternalErc721AwardAdded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC721Upgradeable",
                  "name": "externalErc721Award",
                  "type": "address"
                }
              ],
              "name": "ExternalErc721AwardRemoved",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "prizePeriodStart",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "prizePeriodSeconds",
                  "type": "uint256"
                },
                {
                  "indexed": true,
                  "internalType": "contract PrizePool",
                  "name": "prizePool",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "contract TicketInterface",
                  "name": "ticket",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "contract IERC20Upgradeable",
                  "name": "sponsorship",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "contract RNGInterface",
                  "name": "rng",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "contract IERC20Upgradeable[]",
                  "name": "externalErc20Awards",
                  "type": "address[]"
                }
              ],
              "name": "Initialized",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [],
              "name": "NoWinners",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "numberOfWinners",
                  "type": "uint256"
                }
              ],
              "name": "NumberOfWinnersSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract PeriodicPrizeStrategyListenerInterface",
                  "name": "periodicPrizeStrategyListener",
                  "type": "address"
                }
              ],
              "name": "PeriodicPrizeStrategyListenerSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "prizePeriodSeconds",
                  "type": "uint256"
                }
              ],
              "name": "PrizePeriodSecondsUpdated",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "prizePool",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint32",
                  "name": "rngRequestId",
                  "type": "uint32"
                },
                {
                  "indexed": false,
                  "internalType": "uint32",
                  "name": "rngLockBlock",
                  "type": "uint32"
                }
              ],
              "name": "PrizePoolAwardCancelled",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "prizePool",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint32",
                  "name": "rngRequestId",
                  "type": "uint32"
                },
                {
                  "indexed": false,
                  "internalType": "uint32",
                  "name": "rngLockBlock",
                  "type": "uint32"
                }
              ],
              "name": "PrizePoolAwardStarted",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "randomNumber",
                  "type": "uint256"
                }
              ],
              "name": "PrizePoolAwarded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint256",
                  "name": "prizePeriodStartedAt",
                  "type": "uint256"
                }
              ],
              "name": "PrizePoolOpened",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "uint256",
                  "name": "target",
                  "type": "uint256"
                }
              ],
              "name": "PrizeSplitRemoved",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "target",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint16",
                  "name": "percentage",
                  "type": "uint16"
                },
                {
                  "indexed": false,
                  "internalType": "uint8",
                  "name": "token",
                  "type": "uint8"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "index",
                  "type": "uint256"
                }
              ],
              "name": "PrizeSplitSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "numberOfWinners",
                  "type": "uint256"
                }
              ],
              "name": "RetryMaxLimitReached",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [],
              "name": "RngRequestFailed",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint32",
                  "name": "rngRequestTimeout",
                  "type": "uint32"
                }
              ],
              "name": "RngRequestTimeoutSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract RNGInterface",
                  "name": "rngService",
                  "type": "address"
                }
              ],
              "name": "RngServiceUpdated",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "bool",
                  "name": "splitExternalErc20Awards",
                  "type": "bool"
                }
              ],
              "name": "SplitExternalErc20AwardsSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract TokenListenerInterface",
                  "name": "tokenListener",
                  "type": "address"
                }
              ],
              "name": "TokenListenerUpdated",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "VERSION",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_externalErc20",
                  "type": "address"
                }
              ],
              "name": "addExternalErc20Award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20Upgradeable[]",
                  "name": "_externalErc20s",
                  "type": "address[]"
                }
              ],
              "name": "addExternalErc20Awards",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC721Upgradeable",
                  "name": "_externalErc721",
                  "type": "address"
                },
                {
                  "internalType": "uint256[]",
                  "name": "_tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "addExternalErc721Award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "beforeAwardListener",
              "outputs": [
                {
                  "internalType": "contract BeforeAwardListenerInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "referrer",
                  "type": "address"
                }
              ],
              "name": "beforeTokenMint",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "beforeTokenTransfer",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "blocklistRetryCount",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "currentTime",
                  "type": "uint256"
                }
              ],
              "name": "calculateNextPrizePeriodStartTime",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "canCompleteAward",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "canStartAward",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "cancelAward",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "carryOverBlocklist",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "completeAward",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "currentPrize",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "secondsPerBlockMantissa",
                  "type": "uint256"
                }
              ],
              "name": "estimateRemainingBlocksToPrize",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "getExternalErc20Awards",
              "outputs": [
                {
                  "internalType": "address[]",
                  "name": "",
                  "type": "address[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC721Upgradeable",
                  "name": "_externalErc721",
                  "type": "address"
                }
              ],
              "name": "getExternalErc721AwardTokenIds",
              "outputs": [
                {
                  "internalType": "uint256[]",
                  "name": "",
                  "type": "uint256[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "getExternalErc721Awards",
              "outputs": [
                {
                  "internalType": "address[]",
                  "name": "",
                  "type": "address[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "getLastRngLockBlock",
              "outputs": [
                {
                  "internalType": "uint32",
                  "name": "",
                  "type": "uint32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "getLastRngRequestId",
              "outputs": [
                {
                  "internalType": "uint32",
                  "name": "",
                  "type": "uint32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_prizePeriodStart",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "_prizePeriodSeconds",
                  "type": "uint256"
                },
                {
                  "internalType": "contract PrizePool",
                  "name": "_prizePool",
                  "type": "address"
                },
                {
                  "internalType": "contract TicketInterface",
                  "name": "_ticket",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_sponsorship",
                  "type": "address"
                },
                {
                  "internalType": "contract RNGInterface",
                  "name": "_rng",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20Upgradeable[]",
                  "name": "externalErc20Awards",
                  "type": "address[]"
                }
              ],
              "name": "initialize",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_prizePeriodStart",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "_prizePeriodSeconds",
                  "type": "uint256"
                },
                {
                  "internalType": "contract PrizePool",
                  "name": "_prizePool",
                  "type": "address"
                },
                {
                  "internalType": "contract TicketInterface",
                  "name": "_ticket",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_sponsorship",
                  "type": "address"
                },
                {
                  "internalType": "contract RNGInterface",
                  "name": "_rng",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_numberOfWinners",
                  "type": "uint256"
                }
              ],
              "name": "initializeMultipleWinners",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "isBlocklisted",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "isPrizePeriodOver",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "isRngCompleted",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "isRngRequested",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "isRngTimedOut",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "numberOfWinners",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "periodicPrizeStrategyListener",
              "outputs": [
                {
                  "internalType": "contract PeriodicPrizeStrategyListenerInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizePeriodEndAt",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizePeriodRemainingSeconds",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizePeriodSeconds",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizePeriodStartedAt",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizePool",
              "outputs": [
                {
                  "internalType": "contract PrizePool",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "prizeSplitIndex",
                  "type": "uint256"
                }
              ],
              "name": "prizeSplit",
              "outputs": [
                {
                  "components": [
                    {
                      "internalType": "address",
                      "name": "target",
                      "type": "address"
                    },
                    {
                      "internalType": "uint16",
                      "name": "percentage",
                      "type": "uint16"
                    },
                    {
                      "internalType": "uint8",
                      "name": "token",
                      "type": "uint8"
                    }
                  ],
                  "internalType": "struct PrizeSplit.PrizeSplitConfig",
                  "name": "",
                  "type": "tuple"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizeSplits",
              "outputs": [
                {
                  "components": [
                    {
                      "internalType": "address",
                      "name": "target",
                      "type": "address"
                    },
                    {
                      "internalType": "uint16",
                      "name": "percentage",
                      "type": "uint16"
                    },
                    {
                      "internalType": "uint8",
                      "name": "token",
                      "type": "uint8"
                    }
                  ],
                  "internalType": "struct PrizeSplit.PrizeSplitConfig[]",
                  "name": "",
                  "type": "tuple[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_externalErc20",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_prevExternalErc20",
                  "type": "address"
                }
              ],
              "name": "removeExternalErc20Award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC721Upgradeable",
                  "name": "_externalErc721",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC721Upgradeable",
                  "name": "_prevExternalErc721",
                  "type": "address"
                }
              ],
              "name": "removeExternalErc721Award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "renounceOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "rng",
              "outputs": [
                {
                  "internalType": "contract RNGInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "rngRequestTimeout",
              "outputs": [
                {
                  "internalType": "uint32",
                  "name": "",
                  "type": "uint32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract BeforeAwardListenerInterface",
                  "name": "_beforeAwardListener",
                  "type": "address"
                }
              ],
              "name": "setBeforeAwardListener",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_count",
                  "type": "uint256"
                }
              ],
              "name": "setBlocklistRetryCount",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_user",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "_isBlocked",
                  "type": "bool"
                }
              ],
              "name": "setBlocklisted",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bool",
                  "name": "_carry",
                  "type": "bool"
                }
              ],
              "name": "setCarryBlocklist",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "count",
                  "type": "uint256"
                }
              ],
              "name": "setNumberOfWinners",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract PeriodicPrizeStrategyListenerInterface",
                  "name": "_periodicPrizeStrategyListener",
                  "type": "address"
                }
              ],
              "name": "setPeriodicPrizeStrategyListener",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_prizePeriodSeconds",
                  "type": "uint256"
                }
              ],
              "name": "setPrizePeriodSeconds",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "components": [
                    {
                      "internalType": "address",
                      "name": "target",
                      "type": "address"
                    },
                    {
                      "internalType": "uint16",
                      "name": "percentage",
                      "type": "uint16"
                    },
                    {
                      "internalType": "uint8",
                      "name": "token",
                      "type": "uint8"
                    }
                  ],
                  "internalType": "struct PrizeSplit.PrizeSplitConfig",
                  "name": "prizeStrategySplit",
                  "type": "tuple"
                },
                {
                  "internalType": "uint8",
                  "name": "prizeSplitIndex",
                  "type": "uint8"
                }
              ],
              "name": "setPrizeSplit",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "components": [
                    {
                      "internalType": "address",
                      "name": "target",
                      "type": "address"
                    },
                    {
                      "internalType": "uint16",
                      "name": "percentage",
                      "type": "uint16"
                    },
                    {
                      "internalType": "uint8",
                      "name": "token",
                      "type": "uint8"
                    }
                  ],
                  "internalType": "struct PrizeSplit.PrizeSplitConfig[]",
                  "name": "newPrizeSplits",
                  "type": "tuple[]"
                }
              ],
              "name": "setPrizeSplits",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint32",
                  "name": "_rngRequestTimeout",
                  "type": "uint32"
                }
              ],
              "name": "setRngRequestTimeout",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract RNGInterface",
                  "name": "rngService",
                  "type": "address"
                }
              ],
              "name": "setRngService",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bool",
                  "name": "_splitExternalErc20Awards",
                  "type": "bool"
                }
              ],
              "name": "setSplitExternalErc20Awards",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "_tokenListener",
                  "type": "address"
                }
              ],
              "name": "setTokenListener",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "splitExternalErc20Awards",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "sponsorship",
              "outputs": [
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "startAward",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes4",
                  "name": "interfaceId",
                  "type": "bytes4"
                }
              ],
              "name": "supportsInterface",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "ticket",
              "outputs": [
                {
                  "internalType": "contract TicketInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "tokenListener",
              "outputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "events": {
              "BlocklistCarrySet(bool)": {
                "details": "Emitted when carryOverBlocklist is toggled for distribution of the primary and secondary prizes.",
                "params": {
                  "carry": "Awarded prize carry over status"
                }
              },
              "BlocklistRetryCountSet(uint256)": {
                "details": "Emitted when a new draw retry limit is set. Retry limit is set to limit gas spendings if a blocked user continues to be drawn.",
                "params": {
                  "count": "Number of winner selection retry attempts "
                }
              },
              "BlocklistSet(address,bool)": {
                "details": "Emitted when a contract owner blocks/unblocks user from award selection in _distribute.",
                "params": {
                  "isBlocked": "User blocked status",
                  "user": "Address of user to block or unblock"
                }
              },
              "NoWinners()": {
                "details": "Emitted when no winner can be selected in _distribute due to ticket.totalSupply() equaling zero."
              },
              "NumberOfWinnersSet(uint256)": {
                "details": "Emitted when numberOfWinners is set, which limits the maximum number of potentially selected winners.",
                "params": {
                  "numberOfWinners": "Maximum potentially selected winners"
                }
              },
              "RetryMaxLimitReached(uint256)": {
                "details": "Emitted when the maximum number of users has not been selected after the blocklistRetryCount is reached.",
                "params": {
                  "numberOfWinners": "Total number of winners selected before the blocklistRetryCount is reached."
                }
              },
              "SplitExternalErc20AwardsSet(bool)": {
                "details": "Emitted when splitExternalErc20Awards is toggled between awarding external ERC20 to main or all winners."
              }
            },
            "kind": "dev",
            "methods": {
              "addExternalErc20Award(address)": {
                "details": "Only the Prize-Strategy owner/creator can assign external tokens, and they must be approved by the Prize-Pool",
                "params": {
                  "_externalErc20": "The address of an ERC20 token to be awarded"
                }
              },
              "addExternalErc721Award(address,uint256[])": {
                "details": "Only the Prize-Strategy owner/creator can assign external tokens, and they must be approved by the Prize-Pool NOTE: The NFT must already be owned by the Prize-Pool",
                "params": {
                  "_externalErc721": "The address of an ERC721 token to be awarded",
                  "_tokenIds": "An array of token IDs of the ERC721 to be awarded"
                }
              },
              "beforeTokenMint(address,uint256,address,address)": {
                "params": {
                  "controlledToken": "The type of collateral that is being minted"
                }
              },
              "beforeTokenTransfer(address,address,uint256,address)": {
                "details": "Note that this is only for *transfers*, not mints or burns",
                "params": {
                  "controlledToken": "The type of collateral that is being sent"
                }
              },
              "calculateNextPrizePeriodStartTime(uint256)": {
                "params": {
                  "currentTime": "The timestamp to use as the current time"
                },
                "returns": {
                  "_0": "The timestamp at which the next prize period would start"
                }
              },
              "canCompleteAward()": {
                "returns": {
                  "_0": "True if an award can be completed, false otherwise."
                }
              },
              "canStartAward()": {
                "returns": {
                  "_0": "True if an award can be started, false otherwise."
                }
              },
              "currentPrize()": {
                "returns": {
                  "_0": "The current prize size"
                }
              },
              "estimateRemainingBlocksToPrize(uint256)": {
                "params": {
                  "secondsPerBlockMantissa": "The number of seconds per block to use for the calculation.  Should be a fixed point 18 number like Ether."
                },
                "returns": {
                  "_0": "The estimated number of blocks remaining until the prize can be awarded."
                }
              },
              "getExternalErc20Awards()": {
                "returns": {
                  "_0": "An array of External ERC20 token addresses"
                }
              },
              "getExternalErc721AwardTokenIds(address)": {
                "returns": {
                  "_0": "An array of External ERC721 token addresses"
                }
              },
              "getExternalErc721Awards()": {
                "returns": {
                  "_0": "An array of External ERC721 token addresses"
                }
              },
              "getLastRngLockBlock()": {
                "returns": {
                  "_0": "The block number that the RNG request is locked to"
                }
              },
              "getLastRngRequestId()": {
                "returns": {
                  "_0": "The current Request ID"
                }
              },
              "initialize(uint256,uint256,address,address,address,address,address[])": {
                "params": {
                  "_prizePeriodSeconds": "The duration of the prize period in seconds",
                  "_prizePeriodStart": "The starting timestamp of the prize period.",
                  "_prizePool": "The prize pool to award",
                  "_rng": "The RNG service to use",
                  "_sponsorship": "The sponsorship token",
                  "_ticket": "The ticket to use to draw winners"
                }
              },
              "isPrizePeriodOver()": {
                "returns": {
                  "_0": "True if the prize period is over, false otherwise"
                }
              },
              "isRngCompleted()": {
                "returns": {
                  "_0": "True if a random number request has completed, false otherwise."
                }
              },
              "isRngRequested()": {
                "returns": {
                  "_0": "True if a random number has been requested, false otherwise."
                }
              },
              "numberOfWinners()": {
                "details": "Read maximum number of winners per award distribution period from internal __numberOfWinners variable.",
                "returns": {
                  "_0": "__numberOfWinners The total number of winners per prize award."
                }
              },
              "owner()": {
                "details": "Returns the address of the current owner."
              },
              "prizePeriodEndAt()": {
                "returns": {
                  "_0": "The timestamp at which the prize period ends."
                }
              },
              "prizePeriodRemainingSeconds()": {
                "returns": {
                  "_0": "The number of seconds remaining until the prize can be awarded."
                }
              },
              "prizeSplit(uint256)": {
                "details": "Read PrizeSplitConfig struct from _prizeSplits array.",
                "params": {
                  "prizeSplitIndex": "Index position of PrizeSplitConfig"
                },
                "returns": {
                  "_0": "PrizeSplitConfig Single prize split config"
                }
              },
              "prizeSplits()": {
                "details": "Read all PrizeSplitConfig structs stored in _prizeSplits.",
                "returns": {
                  "_0": "_prizeSplits Array of PrizeSplitConfig structs"
                }
              },
              "removeExternalErc20Award(address,address)": {
                "details": "Only the Prize-Strategy owner/creator can remove external tokens",
                "params": {
                  "_externalErc20": "The address of an ERC20 token to be removed",
                  "_prevExternalErc20": "The address of the previous ERC20 token in the `externalErc20s` list. If the ERC20 is the first address, then the previous address is the SENTINEL address: 0x0000000000000000000000000000000000000001"
                }
              },
              "removeExternalErc721Award(address,address)": {
                "details": "Only the Prize-Strategy owner/creator can remove external tokens",
                "params": {
                  "_externalErc721": "The address of an ERC721 token to be removed",
                  "_prevExternalErc721": "The address of the previous ERC721 token in the list. If no previous, then pass the SENTINEL address: 0x0000000000000000000000000000000000000001"
                }
              },
              "renounceOwnership()": {
                "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
              },
              "setBeforeAwardListener(address)": {
                "details": "The listener must implement ERC165 and the BeforeAwardListenerInterface",
                "params": {
                  "_beforeAwardListener": "The address of the listener contract"
                }
              },
              "setBlocklistRetryCount(uint256)": {
                "details": "Limits winner selection (ticket.draw) retries to avoid to gas limit reached errors. Increases the probability of not reaching the maximum number of winners if to low.",
                "params": {
                  "_count": "Number of retry attempts"
                }
              },
              "setBlocklisted(address,bool)": {
                "details": "Block/unblock a user from winning award in prize distribution by updating the isBlocklisted mapping.",
                "params": {
                  "_isBlocked": "Blocked Status (true or false) of user",
                  "_user": "Address of blocked user"
                }
              },
              "setCarryBlocklist(bool)": {
                "details": "Toggles if the main prize (prizePool.captureAwardBalance) and secondary prizes (LootBox) should be kept for the next draw or evenly distrubted if maximum number of winners is not selected. ",
                "params": {
                  "_carry": "Award carry over status (true or false)"
                }
              },
              "setNumberOfWinners(uint256)": {
                "details": "Sets maximum number of winners per award distribution period.",
                "params": {
                  "count": "Number of winners."
                }
              },
              "setPeriodicPrizeStrategyListener(address)": {
                "params": {
                  "_periodicPrizeStrategyListener": "The address of the listener contract"
                }
              },
              "setPrizePeriodSeconds(uint256)": {
                "params": {
                  "_prizePeriodSeconds": "The new prize period in seconds.  Must be greater than zero."
                }
              },
              "setPrizeSplit((address,uint16,uint8),uint8)": {
                "details": "Updates a prize split config by passing a new PrizeSplitConfig struct and current index position. Limited to contract owner.",
                "params": {
                  "prizeSplitIndex": "Index position of PrizeSplitConfig to update",
                  "prizeStrategySplit": "PrizeSplitConfig config struct"
                }
              },
              "setPrizeSplits((address,uint16,uint8)[])": {
                "details": "Set and remove prize split configs by passing a new PrizeSplitConfig structs array. Will remove existing PrizeSplitConfig(s) if passed array length is less than existing _prizeSplits length.",
                "params": {
                  "newPrizeSplits": "Array of PrizeSplitConfig structs"
                }
              },
              "setRngRequestTimeout(uint32)": {
                "params": {
                  "_rngRequestTimeout": "The RNG request timeout in seconds."
                }
              },
              "setRngService(address)": {
                "params": {
                  "rngService": "The address of the new RNG service interface"
                }
              },
              "setSplitExternalErc20Awards(bool)": {
                "details": "Toggle external ERC20 awards for all prize winners. If unset will distribute external ERC20 awards to main winner.",
                "params": {
                  "_splitExternalErc20Awards": "Toggle splitting external ERC20 awards."
                }
              },
              "setTokenListener(address)": {
                "params": {
                  "_tokenListener": "A contract that implements the token listener interface."
                }
              },
              "startAward()": {
                "details": "The RNG-Request-Fee is expected to be held within this contract before calling this function"
              },
              "supportsInterface(bytes4)": {
                "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."
              },
              "transferOwnership(address)": {
                "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50615b6a80620000216000396000f3fe608060405234801561001057600080fd5b50600436106103c55760003560e01c8063738bbea8116101ff578063b02446821161011a578063d5ad6bf6116100ad578063f2fde38b1161007c578063f2fde38b14610733578063f97700e214610746578063fbf0953e14610759578063ffa1ad741461076c576103c5565b8063d5ad6bf6146106fb578063d605787b14610703578063dfb2f13b1461070b578063eefc8ad114610713576103c5565b8063c2f19ee8116100e9578063c2f19ee8146106c5578063c42b42a0146106cd578063c48ddbcb146106d5578063c6853270146106e8576103c5565b8063b024468214610684578063b221095714610697578063b9ee1e05146106aa578063c25a9c32146106b2576103c5565b80638da5cb5b1161019257806395e5f9ee1161016157806395e5f9ee146106595780639dafafb014610661578063a4e075ca14610669578063acca5b951461067c576103c5565b80638da5cb5b146106165780638e204c431461061e57806394144c6b146106315780639417783f14610639576103c5565b8063884a4448116101ce578063884a4448146105d35780638aa3ec6f146105e65780638acfaca9146105f95780638d5f10c414610601576103c5565b8063738bbea81461059d5780637f2be9fc146105a55780637f4296d7146105b8578063876f5c7e146105cb576103c5565b80634e5d08e0116102ef5780636be51c4f116102825780636f46f221116102515780636f46f2211461057d578063715018a614610585578063719ce73e1461058d57806372f33ea914610595576103c5565b80636be51c4f146105525780636bea53441461055a5780636cc25db7146105625780636dfb03861461056a576103c5565b806362c77a61116102be57806362c77a611461051c5780636696822114610524578063671137c4146105375780636a74f1071461054a576103c5565b80634e5d08e0146104db578063500db70d146104ee57806352a30109146104f6578063605e25ac14610509576103c5565b80632c8fe73d1161036757806347bed9981161033657806347bed998146104a55780634aba4f6b146104b85780634c169f4f146104c05780634d7f3db0146104c8576103c5565b80632c8fe73d1461046057806330fcdf411461046857806338a9b4b61461047d57806342d0920914610490576103c5565b80630faf125f116103a35780630faf125f14610428578063111070e414610430578063152d308c146104385780632a7ad6091461044b576103c5565b806301b48e34146103ca57806301ffc9a7146103f35780630d847fc414610413575b600080fd5b6103dd6103d83660046148a5565b610781565b6040516103ea9190614ad7565b60405180910390f35b6104066104013660046147ae565b61079a565b6040516103ea9190614d2c565b61041b6107d0565b6040516103ea9190614ae0565b6103dd6107df565b6104066107e5565b61040661044636600461457c565b6107f4565b6104536108ab565b6040516103ea9190615a7b565b6103dd6108b7565b61047b6104763660046144f2565b6108c6565b005b61047b61048b366004614776565b61099e565b610498610a34565b6040516103ea9190614c2b565b6103dd6104b33660046148a5565b610a40565b610406610a4b565b61047b610ad4565b61047b6104d63660046145e1565b610b9e565b61047b6104e93660046144f2565b610c76565b61041b610d13565b6104066105043660046148a5565b610d22565b61047b6105173660046144f2565b610db0565b610498610e91565b61047b6105323660046146c6565b610e9d565b61047b6105453660046147d6565b610f6f565b610406610fcf565b61041b610fe8565b610453610ff7565b61041b61100b565b61047b6105783660046148a5565b61101a565b61040661106a565b61047b611073565b61041b6110fc565b6103dd61110b565b610406611111565b61047b6105b33660046149ce565b611164565b61047b6105c63660046144f2565b611208565b6104066112be565b61047b6105e13660046148a5565b6112dd565b61047b6105f43660046144f2565b61132d565b6103dd611405565b61060961140b565b6040516103ea9190614c78565b61041b611490565b61040661062c3660046144f2565b61149f565b6103dd6114b4565b61064c6106473660046144f2565b6114ba565b6040516103ea9190614cf4565b610406611526565b610406611530565b610406610677366004614776565b611539565b6104536115c0565b61047b6106923660046147d6565b6115cc565b61047b6106a536600461452a565b611657565b61047b611728565b61047b6106c0366004614706565b611970565b61041b611cff565b6103dd611d0e565b61047b6106e3366004614803565b611d8b565b61047b6106f6366004614a48565b611f80565b6103dd611fd0565b61041b611fda565b61047b611fe9565b6107266107213660046148a5565b61226b565b6040516103ea91906159a5565b61047b6107413660046144f2565b6122d0565b61047b6107543660046148d5565b612391565b61047b610767366004614871565b6125f2565b610774612791565b6040516103ea9190614d4c565b600061079461078e6127b2565b836127ef565b92915050565b60006001600160e01b031982166301ffc9a760e01b14806107945750506001600160e01b031916600162a1cb1960e01b03191490565b6073546001600160a01b031681565b607a5481565b606a5463ffffffff1615155b90565b60006107fe612818565b6001600160a01b031661080f611490565b6001600160a01b03161461083e5760405162461bcd60e51b815260040161083590615487565b60405180910390fd5b61084661281c565b6001600160a01b03831660008181526078602052604090819020805460ff1916851515179055517fd1ac9a365c0e3bfad562e0a809a5ded3842a2b489f839b3327e4e34ee0128f289061089a908590614d2c565b60405180910390a250600192915050565b606a5463ffffffff1690565b60006108c1612871565b905090565b6108ce612818565b6001600160a01b03166108df611490565b6001600160a01b0316146109055760405162461bcd60e51b815260040161083590615487565b61090d61281c565b6001600160a01b038116158061093857506109386001600160a01b03821663266fce1f60e11b61288a565b6109545760405162461bcd60e51b815260040161083590615535565b607380546001600160a01b0319166001600160a01b0383169081179091556040517fc4feff61630891ea2cb42a54fbe3ff2e65422f2ed17323ac6b65f4521112e87e90600090a250565b6109a6612818565b6001600160a01b03166109b7611490565b6001600160a01b0316146109dd5760405162461bcd60e51b815260040161083590615487565b6109e561281c565b6077805460ff191682151517908190556040517f6959d02e8fb6264d1d39bf37f1e725001f342714933cf38f8627a2442efc43fd91610a299160ff90911690614d2c565b60405180910390a150565b60606108c160706128ad565b60006107948261298d565b606954606a54604051630e866e6f60e21b81526000926001600160a01b031691633a19b9bc91610a849163ffffffff1690600401615a7b565b60206040518083038186803b158015610a9c57600080fd5b505afa158015610ab0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c19190614792565b610adc611111565b610af85760405162461bcd60e51b815260040161083590615885565b606a80546bffffffffffffffffffffffff19811690915560405163ffffffff80831692640100000000900416907fee6702c46c5618e6fc7e625c71f4c85df9c91d456cb16a3aea71ab83b1fee00590600090a160665460405163ffffffff8416916001600160a01b03169033907fd50026ee0824513af20cdf5e72d1fbfbe8fd646ee0576378e080326f1a695e5890610b92908690615a7b565b60405180910390a45050565b6066546001600160a01b0316610bb2612818565b6001600160a01b031614610bd85760405162461bcd60e51b81526004016108359061505f565b6067546001600160a01b0383811691161415610bf657610bf661281c565b6065546001600160a01b031615610c70576065546040516304d7f3db60e41b81526001600160a01b0390911690634d7f3db090610c3d908790879087908790600401614c00565b600060405180830381600087803b158015610c5757600080fd5b505af1158015610c6b573d6000803e3d6000fd5b505050505b50505050565b610c7e611490565b6001600160a01b0316610c8f612818565b6001600160a01b03161480610cbe57506074546001600160a01b0316610cb3612818565b6001600160a01b0316145b80610ce357506073546001600160a01b0316610cd8612818565b6001600160a01b0316145b610cff5760405162461bcd60e51b815260040161083590614ef6565b610d0761281c565b610d10816129d4565b50565b6068546001600160a01b031681565b6000610d2c612818565b6001600160a01b0316610d3d611490565b6001600160a01b031614610d635760405162461bcd60e51b815260040161083590615487565b610d6b61281c565b607a8290556040517f63e4e34f49d12428c03e04e61340c7167e36eb0ff6f0b1970c7544026179403990610da0908490614ad7565b60405180910390a1506001919050565b610db8612818565b6001600160a01b0316610dc9611490565b6001600160a01b031614610def5760405162461bcd60e51b815260040161083590615487565b610df761281c565b6001600160a01b0381161580610e255750610e256001600160a01b038216600162a1cb1960e01b031961288a565b610e415760405162461bcd60e51b815260040161083590614dc3565b606580546001600160a01b0319166001600160a01b0383811691909117918290556040519116907f9fc437aa70ad4ee5f33f6772bf338eed41e21b95435820817ab8b4df161ce4dd90600090a250565b60606108c1606e6128ad565b610ea5611490565b6001600160a01b0316610eb6612818565b6001600160a01b03161480610ee557506074546001600160a01b0316610eda612818565b6001600160a01b0316145b80610f0a57506073546001600160a01b0316610eff612818565b6001600160a01b0316145b610f265760405162461bcd60e51b815260040161083590614ef6565b610f2e61281c565b60005b81811015610f6a57610f62838383818110610f4857fe5b9050602002016020810190610f5d91906144f2565b6129d4565b600101610f31565b505050565b610f77612818565b6001600160a01b0316610f88611490565b6001600160a01b031614610fae5760405162461bcd60e51b815260040161083590615487565b610fb661281c565b610fc260708284612b88565b610fcb82612c52565b5050565b6000610fd96107e5565b80156108c157506108c1610a4b565b6065546001600160a01b031681565b606a54640100000000900463ffffffff1690565b6067546001600160a01b031681565b611022612818565b6001600160a01b0316611033611490565b6001600160a01b0316146110595760405162461bcd60e51b815260040161083590615487565b61106161281c565b610d1081612caa565b60795460ff1681565b61107b612818565b6001600160a01b031661108c611490565b6001600160a01b0316146110b25760405162461bcd60e51b815260040161083590615487565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6066546001600160a01b031681565b606d5481565b606a54600090600160401b900463ffffffff16611130575060006107f1565b606a54606b546111549163ffffffff91821691600160401b909104811690612cff16565b61115c612d24565b1190506107f1565b600054610100900460ff168061117d575061117d612d28565b8061118b575060005460ff16155b6111a75760405162461bcd60e51b8152600401610835906152fb565b600054610100900460ff161580156111d2576000805460ff1961ff0019909116610100171660011790555b60606111e389898989898987612391565b6111ec83612caa565b508015610c6b576000805461ff00191690555050505050505050565b611210612818565b6001600160a01b0316611221611490565b6001600160a01b0316146112475760405162461bcd60e51b815260040161083590615487565b61124f61281c565b6112576107e5565b156112745760405162461bcd60e51b815260040161083590615842565b606980546001600160a01b0319166001600160a01b0383169081179091556040517ff935763cc7c57ee8ed6318ed71e756cca0731294c9f46ff5b386f36d6ff1417a90600090a250565b60006112c8612d33565b80156108c157506112d76107e5565b15905090565b6112e5612818565b6001600160a01b03166112f6611490565b6001600160a01b03161461131c5760405162461bcd60e51b815260040161083590615487565b61132461281c565b610d1081612d4c565b611335612818565b6001600160a01b0316611346611490565b6001600160a01b03161461136c5760405162461bcd60e51b815260040161083590615487565b61137461281c565b6001600160a01b038116158061139f575061139f6001600160a01b038216632ba8396360e11b61288a565b6113bb5760405162461bcd60e51b815260040161083590615753565b607480546001600160a01b0319166001600160a01b0383169081179091556040517fda05d50a3a1ec0ffab059f1d457ae59f68ccfb3ffbb4dad283c516f9103d584b90600090a250565b60765490565b60606075805480602002602001604051908101604052809291908181526020016000905b8282101561148757600084815260209081902060408051606081018252918501546001600160a01b0381168352600160a01b810461ffff1683850152600160b01b900460ff169082015282526001909201910161142f565b50505050905090565b6033546001600160a01b031690565b60786020526000908152604090205460ff1681565b606c5481565b6001600160a01b03811660009081526072602090815260409182902080548351818402810184019094528084526060939283018282801561151a57602002820191906000526020600020905b815481526020019060010190808311611506575b50505050509050919050565b60006108c1612d33565b60775460ff1681565b6000611543612818565b6001600160a01b0316611554611490565b6001600160a01b03161461157a5760405162461bcd60e51b815260040161083590615487565b61158261281c565b6079805460ff19168315151790556040517f2b4b6ffe286f7ce4ccc6b136bb14987b0a00092174d88938a0c667a104a4a73190610da0908490614d2c565b606b5463ffffffff1681565b6115d4612818565b6001600160a01b03166115e5611490565b6001600160a01b03161461160b5760405162461bcd60e51b815260040161083590615487565b61161361281c565b61161f606e8284612b88565b6040516001600160a01b038316907f58982464497acdab11ad29d39907e076b0d3b8daf1d9b734174c7c3a2a0e8c7490600090a25050565b6066546001600160a01b031661166b612818565b6001600160a01b0316146116915760405162461bcd60e51b81526004016108359061505f565b826001600160a01b0316846001600160a01b031614156116c35760405162461bcd60e51b8152600401610835906150a4565b6067546001600160a01b03828116911614156116e1576116e161281c565b6065546001600160a01b031615610c705760655460405163b221095760e01b81526001600160a01b039091169063b221095790610c3d908790879087908790600401614b99565b611730612d33565b61174c5760405162461bcd60e51b815260040161083590614e65565b6117546107e5565b156117715760405162461bcd60e51b8152600401610835906153c4565b60695460408051630d37b53760e01b8152815160009384936001600160a01b0390911692630d37b5379260048083019392829003018186803b1580156117b657600080fd5b505afa1580156117ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ee91906145b4565b90925090506001600160a01b0382161580159061180b5750600081115b1561182a5760695461182a906001600160a01b03848116911683612da1565b6069546040805163433c53d960e11b8152815160009384936001600160a01b0390911692638678a7b2926004808301939282900301818787803b15801561187057600080fd5b505af1158015611884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a89190614a64565b606a805463ffffffff8084166401000000000267ffffffff000000001991861663ffffffff19909316929092171617905590925090506118ee6118e9612d24565b612e9b565b606a80546bffffffff00000000000000001916600160401b63ffffffff93841602179055606654908316906001600160a01b031661192a612818565b6001600160a01b03167f4d31e658dcf617bb3a3c8cf7c6dddb33f7030ac588e271631ecdb5d76c2e91ef846040516119629190615a7b565b60405180910390a450505050565b611978612818565b6001600160a01b0316611989611490565b6001600160a01b0316146119af5760405162461bcd60e51b815260040161083590615487565b8060005b81811015611c54576119c36143f5565b8484838181106119cf57fe5b9050606002018036038101906119e59190614856565b90506001816040015160ff161115611a0f5760405162461bcd60e51b815260040161083590614fc3565b80516001600160a01b0316611a365760405162461bcd60e51b81526004016108359061526f565b6075548210611ad2576075805460018101825560009190915281517f9a8d93986a7b9e6294572ea6736696119c195c1a9f5eae642d3c5fcd44e49dea90910180546020840151604085015160ff16600160b01b0260ff60b01b1961ffff909216600160a01b0261ffff60a01b196001600160a01b039096166001600160a01b031990941693909317949094169190911716919091179055611bf9565b611ada6143f5565b60758381548110611ae757fe5b60009182526020918290206040805160608101825292909101546001600160a01b03808216808552600160a01b830461ffff1695850195909552600160b01b90910460ff1691830191909152845191935016141580611b565750806020015161ffff16826020015161ffff1614155b80611b6f5750806040015160ff16826040015160ff1614155b15611bf0578160758481548110611b8257fe5b6000918252602091829020835191018054928401516040909401516001600160a01b03199093166001600160a01b039092169190911761ffff60a01b1916600160a01b61ffff909416939093029290921760ff60b01b1916600160b01b60ff90921691909102179055611bf7565b5050611c4c565b505b80600001516001600160a01b03167fc1bf93444a0055a24a7d0154b75fedf78edfe355c06a2ce8e47f9f39087205598260200151836040015185604051611c42939291906159b3565b60405180910390a2505b6001016119b3565b505b607554811015611cd157607554600090611c71906001612ec5565b90506075805480611c7e57fe5b600082815260208120820160001990810180546001600160b81b031916905590910190915560405182917f99fa473fdf53414bcd014cf6e7509fc58c68f7b86174767faa6ad5100cd5bae591a250611c56565b6000611cdb612eed565b90506103e8811115610c705760405162461bcd60e51b8152600401610835906154e2565b6074546001600160a01b031681565b606654604080516318c1996d60e21b815290516000926001600160a01b03169163630665b4916004808301926020929190829003018186803b158015611d5357600080fd5b505afa158015611d67573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c191906148bd565b611d93611490565b6001600160a01b0316611da4612818565b6001600160a01b03161480611dd357506074546001600160a01b0316611dc8612818565b6001600160a01b0316145b80611df857506073546001600160a01b0316611ded612818565b6001600160a01b0316145b611e145760405162461bcd60e51b815260040161083590614ef6565b611e1c61281c565b606654604051636a3fd4f960e01b81526001600160a01b0390911690636a3fd4f990611e4c908690600401614ae0565b60206040518083038186803b158015611e6457600080fd5b505afa158015611e78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9c9190614792565b611eb85760405162461bcd60e51b815260040161083590615586565b611ed26001600160a01b0384166380ac58cd60e01b61288a565b611eee5760405162461bcd60e51b815260040161083590614d7f565b611ef9607084612f7f565b611f0857611f08607084612fd0565b60005b81811015611f3757611f2f84848484818110611f2357fe5b90506020020135613098565b600101611f0b565b50826001600160a01b03167f51541dc4b4c08a16085809cccdc4cc77d8000b60fbb00142e57f236d842986758383604051611f73929190614cba565b60405180910390a2505050565b611f88612818565b6001600160a01b0316611f99611490565b6001600160a01b031614611fbf5760405162461bcd60e51b815260040161083590615487565b611fc761281c565b610d10816131e9565b60006108c16127b2565b6069546001600160a01b031681565b611ff16107e5565b61200d5760405162461bcd60e51b815260040161083590615917565b612015610a4b565b6120315760405162461bcd60e51b815260040161083590615229565b606954606a546040516313a54bf360e31b81526000926001600160a01b031691639d2a5f989161206a9163ffffffff1690600401615a7b565b602060405180830381600087803b15801561208457600080fd5b505af1158015612098573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120bc91906148bd565b606a80546bffffffffffffffffffffffff191690556073549091506001600160a01b03161561214c57607354606d5460405163266fce1f60e11b81526001600160a01b0390921691634cdf9c3e91612119918591906004016159f1565b600060405180830381600087803b15801561213357600080fd5b505af1158015612147573d6000803e3d6000fd5b505050505b6121558161325a565b6074546001600160a01b0316156121cd57607454606d54604051632ba8396360e11b81526001600160a01b039092169163575072c69161219a918591906004016159f1565b600060405180830381600087803b1580156121b457600080fd5b505af11580156121c8573d6000803e3d6000fd5b505050505b6121dd6121d8612d24565b61298d565b606d556121e8612818565b6001600160a01b03167f9c4163ece98173eab9a496c4db8bf3e2c8edcc5d2854377880597ccb858b7a9d826040516122209190614ad7565b60405180910390a2606d54612233612818565b6001600160a01b03167fc61852c20f0b03b31d782f3022f2bf20322ac17ce66c5349fb6e24740cdd645660405160405180910390a350565b6122736143f5565b6075828154811061228057fe5b60009182526020918290206040805160608101825292909101546001600160a01b0381168352600160a01b810461ffff1693830193909352600160b01b90920460ff169181019190915292915050565b6122d8612818565b6001600160a01b03166122e9611490565b6001600160a01b03161461230f5760405162461bcd60e51b815260040161083590615487565b6001600160a01b0381166123355760405162461bcd60e51b815260040161083590614eb0565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff16806123aa57506123aa612d28565b806123b8575060005460ff16155b6123d45760405162461bcd60e51b8152600401610835906152fb565b600054610100900460ff161580156123ff576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0386166124255760405162461bcd60e51b815260040161083590615121565b6001600160a01b03851661244b5760405162461bcd60e51b8152600401610835906156c4565b6001600160a01b0384166124715760405162461bcd60e51b815260040161083590614f79565b6001600160a01b0383166124975760405162461bcd60e51b8152600401610835906151b0565b606680546001600160a01b038089166001600160a01b031992831617909255606780548884169083161790556069805486841690831617905560688054928716929091169190911790556124ea87612d4c565b6124f26137e7565b6124fc606e613879565b60005b825181101561252c5761252483828151811061251757fe5b60200260200101516129d4565b6001016124ff565b50606c879055606d8890556125416070613879565b61254c6107086131e9565b856001600160a01b03167ff9632d212436344a25150ff0c161dabf412aade556621c2dea146ca63ff643f589898888888860405161258f969594939291906159ff565b60405180910390a2606d546125a2612818565b6001600160a01b03167fc61852c20f0b03b31d782f3022f2bf20322ac17ce66c5349fb6e24740cdd645660405160405180910390a38015610c6b576000805461ff00191690555050505050505050565b6125fa612818565b6001600160a01b031661260b611490565b6001600160a01b0316146126315760405162461bcd60e51b815260040161083590615487565b60755460ff8216106126555760405162461bcd60e51b815260040161083590615349565b6001826040015160ff16111561267d5760405162461bcd60e51b815260040161083590614fc3565b81516001600160a01b03166126a45760405162461bcd60e51b81526004016108359061526f565b8160758260ff16815481106126b557fe5b600091825260208083208451920180549185015160409095015160ff16600160b01b0260ff60b01b1961ffff909616600160a01b0261ffff60a01b196001600160a01b039095166001600160a01b03199094169390931793909316919091179390931617909155612724612eed565b90506103e88111156127485760405162461bcd60e51b8152600401610835906154e2565b82600001516001600160a01b03167fc1bf93444a0055a24a7d0154b75fedf78edfe355c06a2ce8e47f9f39087205598460200151856040015185604051611f73939291906159d2565b60405180604001604052806005815260200164332e342e3560d81b81525081565b6000806127bd612871565b905060006127c9612d24565b9050818111156127de576000925050506107f1565b6127e88282612ec5565b9250505090565b600080612804670de0b6b3a7640000856138bd565b905061281081846138f7565b949350505050565b3390565b6000612826613939565b606a54909150640100000000900463ffffffff1615806128555750606a54640100000000900463ffffffff1681105b610d105760405162461bcd60e51b815260040161083590615842565b60006108c1606c54606d54612cff90919063ffffffff16565b60006128958361393d565b80156128a657506128a68383613970565b9392505050565b606080826000015467ffffffffffffffff811180156128cb57600080fd5b506040519080825280602002602001820160405280156128f5578160200160208202803683370190505b50600160008181529085016020526040812054919250906001600160a01b03165b6001600160a01b0381161580159061293857506001600160a01b038116600114155b15612984578083838151811061294a57fe5b6001600160a01b03928316602091820292909201810191909152918116600090815260018088019093526040902054929091019116612916565b50909392505050565b6000806129b1606c546129ab606d5486612ec590919063ffffffff16565b90613996565b90506128a66129cb606c54836138bd90919063ffffffff16565b606d5490612cff565b6129e6816001600160a01b03166139c8565b612a025760405162461bcd60e51b81526004016108359061538f565b606654604051636a3fd4f960e01b81526001600160a01b0390911690636a3fd4f990612a32908490600401614ae0565b60206040518083038186803b158015612a4a57600080fd5b505afa158015612a5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a829190614792565b612a9e5760405162461bcd60e51b815260040161083590615586565b60408051600481526024810182526020810180516001600160e01b03166318160ddd60e01b17905290516000916060916001600160a01b03851691612ae291614abb565b600060405180830381855afa9150503d8060008114612b1d576040519150601f19603f3d011682016040523d82523d6000602084013e612b22565b606091505b509150915081612b445760405162461bcd60e51b8152600401610835906152b8565b612b4f606e84612fd0565b6040516001600160a01b038416907fbcd6d991f3416e288bf59a2997b423772937b62c7ea7dd1a54af7771de1f741890600090a2505050565b6001600160a01b038116600114801590612baa57506001600160a01b03811615155b612bc65760405162461bcd60e51b815260040161083590614e0f565b6001600160a01b038281166000908152600185016020526040902054811690821614612c045760405162461bcd60e51b815260040161083590614e38565b6001600160a01b039081166000818152600185016020526040808220805495851683529082208054959094166001600160a01b03199586161790935552805490911690558054600019019055565b6001600160a01b0381166000908152607260205260408120612c7391614415565b6040516001600160a01b038216907fcd64d9dacd230c5ccf1278ea5332b0621aa28c950fb0e61c8fbc9e2011c88a3490600090a250565b60008111612cca5760405162461bcd60e51b81526004016108359061540f565b60768190556040517fc44c7222e8df09744ced394101df47e78dedb642d3065267bb388901de9df6d490610a29908390614ad7565b6000828201838110156128a65760405162461bcd60e51b815260040161083590614f42565b4290565b60006112d7306139c8565b6000612d3d612871565b612d45612d24565b1015905090565b60008111612d6c5760405162461bcd60e51b81526004016108359061500b565b606c8190556040517f0d379c1a7282461e725a9dc2d74e65246c77e98ae93835e26c2f1654c48ee4ec90610a29908390614ad7565b801580612e295750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90612dd79030908690600401614af4565b60206040518083038186803b158015612def57600080fd5b505afa158015612e03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e2791906148bd565b155b612e455760405162461bcd60e51b8152600401610835906157a6565b610f6a8363095ea7b360e01b8484604051602401612e64929190614bc4565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526139ce565b60006401000000008210612ec15760405162461bcd60e51b8152600401610835906155f8565b5090565b600082821115612ee75760405162461bcd60e51b8152600401610835906150ea565b50900390565b6075546000908190815b818160ff161015612f7757612f0a6143f5565b60758260ff1681548110612f1a57fe5b60009182526020918290206040805160608101825292909101546001600160a01b0381168352600160a01b810461ffff16938301849052600160b01b900460ff16908201529150612f6c908590612cff565b935050600101612ef7565b509091505090565b60006001600160a01b038216600114801590612fa357506001600160a01b03821615155b80156128a65750506001600160a01b03908116600090815260019290920160205260409091205416151590565b6001600160a01b038116600114801590612ff257506001600160a01b03811615155b61300e5760405162461bcd60e51b815260040161083590614e0f565b6001600160a01b03818116600090815260018401602052604090205416156130485760405162461bcd60e51b8152600401610835906155d1565b60016000818152838201602052604080822080546001600160a01b039586168085529284208054969091166001600160a01b03199687161790559183905281549093169092179091558154019055565b6066546040516331a9108f60e11b81526001600160a01b0391821691841690636352211e906130cb908590600401614ad7565b60206040518083038186803b1580156130e357600080fd5b505afa1580156130f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061311b919061450e565b6001600160a01b0316146131415760405162461bcd60e51b81526004016108359061595e565b60005b6001600160a01b0383166000908152607260205260409020548110156131bc576001600160a01b038316600090815260726020526040902080548391908390811061318b57fe5b906000526020600020015414156131b45760405162461bcd60e51b8152600401610835906157fc565b600101613144565b506001600160a01b0390911660009081526072602090815260408220805460018101825590835291200155565b603c8163ffffffff161161320f5760405162461bcd60e51b8152600401610835906158cb565b606b805463ffffffff191663ffffffff83811691909117918290556040517f4f27f6f220ffad585e728389bc2f0f6b74eeebeb43f95f53752a647cb6e7e68792610a29921690615a7b565b6066546040805163e6d8a94b60e01b815290516000926001600160a01b03169163e6d8a94b91600480830192602092919082900301818787803b1580156132a057600080fd5b505af11580156132b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132d891906148bd565b90506132e381613a5d565b9050606760009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561333357600080fd5b505afa158015613347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061336b91906148bd565b61339e576040517f3728feb3fc1ef1bf4a24036afbe7d34b59c551bf0d2ab5564e87ec1734fa80dd90600090a150610d10565b60795460765460ff9091169060608167ffffffffffffffff811180156133c357600080fd5b506040519080825280602002602001820160405280156133ed578160200160208202803683370190505b50607a54909150859060009081905b8583101561359857606754604051633b30414760e01b81526000916001600160a01b031690633b30414790613435908890600401614ad7565b60206040518083038186803b15801561344d57600080fd5b505afa158015613461573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613485919061450e565b6001600160a01b03811660009081526078602052604090205490915060ff166134e057808685806001019650815181106134bb57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050613559565b818360010193508310613559577fb5f728fcb182000eb8e953c15f6795f07b6cda75b35ef0b65645b53aac6369458460405161351c9190614ad7565b60405180910390a183613553576040517f3728feb3fc1ef1bf4a24036afbe7d34b59c551bf0d2ab5564e87ec1734fa80dd90600090a15b50613598565b60008461020902866101f301016040516020016135769190614ad7565b60408051601f19818403018152919052805160209091012095506133fc915050565b6135b5856000815181106135a857fe5b6020026020010151613b0a565b6000876135cb576135c68985613996565b6135d5565b6135d58988613996565b9050801561360f5760005b8481101561360d576136058782815181106135f757fe5b602002602001015183613c7a565b6001016135e0565b505b60775460ff16156137be576000613626606e613ce7565b90505b6001600160a01b0381161580159061365c5750613646606e613d04565b6001600160a01b0316816001600160a01b031614155b156137b8576066546040516370a0823160e01b81526000916001600160a01b03808516926370a0823192613694921690600401614ae0565b60206040518083038186803b1580156136ac57600080fd5b505afa1580156136c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136e491906148bd565b905060008a6136fc576136f78288613996565b613706565b613706828b613996565b905080156137a45760005b878110156137a2576066548a516001600160a01b0390911690632b0ab144908c908490811061373c57fe5b602002602001015186856040518463ffffffff1660e01b815260040161376493929190614b75565b600060405180830381600087803b15801561377e57600080fd5b505af1158015613792573d6000803e3d6000fd5b5050600190920191506137119050565b505b6137af606e84613d0a565b92505050613629565b506137db565b6137db866000815181106137ce57fe5b6020026020010151613d2d565b50505050505050505050565b600054610100900460ff16806138005750613800612d28565b8061380e575060005460ff16155b61382a5760405162461bcd60e51b8152600401610835906152fb565b600054610100900460ff16158015613855576000805460ff1961ff0019909116610100171660011790555b61385d613e79565b613865613efa565b8015610d10576000805461ff001916905550565b8054156138985760405162461bcd60e51b8152600401610835906154bc565b60016000818152918101602052604090912080546001600160a01b0319169091179055565b6000826138cc57506000610794565b828202828482816138d957fe5b04146128a65760405162461bcd60e51b815260040161083590615446565b60006128a683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613fd4565b4390565b6000613950826301ffc9a760e01b613970565b80156107945750613969826001600160e01b0319613970565b1592915050565b600080600061397f858561400b565b9150915081801561398d5750805b95945050505050565b60008082116139b75760405162461bcd60e51b8152600401610835906151f2565b8183816139c057fe5b049392505050565b3b151590565b6060613a23826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166141009092919063ffffffff16565b805190915015610f6a5780806020019051810190613a419190614792565b610f6a5760405162461bcd60e51b815260040161083590615709565b6075546000908290825b81811015613b0157613a776143f5565b60758281548110613a8457fe5b600091825260208083206040805160608101825293909101546001600160a01b0381168452600160a01b810461ffff16928401839052600160b01b900460ff1690830152909250613ad690869061410f565b9050613aeb8260000151828460400151614123565b613af58782612ec5565b96505050600101613a67565b50929392505050565b6000613b166070613ce7565b90505b6001600160a01b03811615801590613b4c5750613b366070613d04565b6001600160a01b0316816001600160a01b031614155b15613c70576066546040516370a0823160e01b81526000916001600160a01b03808516926370a0823192613b84921690600401614ae0565b60206040518083038186803b158015613b9c57600080fd5b505afa158015613bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bd491906148bd565b90508015613c5d576066546001600160a01b038381166000908152607260205260409081902090516316960d5560e01b815291909216916316960d5591613c22918791879190600401614b0e565b600060405180830381600087803b158015613c3c57600080fd5b505af1158015613c50573d6000803e3d6000fd5b50505050613c5d82612c52565b613c68607083613d0a565b915050613b19565b610fcb607061412e565b60665460675460405163358dc31d60e11b81526001600160a01b0392831692636b1b863a92613cb192879287921690600401614bdd565b600060405180830381600087803b158015613ccb57600080fd5b505af1158015613cdf573d6000803e3d6000fd5b505050505050565b60016000818152910160205260409020546001600160a01b031690565b50600190565b6001600160a01b0380821660009081526001840160205260409020541692915050565b6000613d39606e613ce7565b90505b6001600160a01b03811615801590613d6f5750613d59606e613d04565b6001600160a01b0316816001600160a01b031614155b15610fcb576066546040516370a0823160e01b81526000916001600160a01b03808516926370a0823192613da7921690600401614ae0565b60206040518083038186803b158015613dbf57600080fd5b505afa158015613dd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613df791906148bd565b90508015613e6657606654604051630ac2ac5160e21b81526001600160a01b0390911690632b0ab14490613e3390869086908690600401614b75565b600060405180830381600087803b158015613e4d57600080fd5b505af1158015613e61573d6000803e3d6000fd5b505050505b613e71606e83613d0a565b915050613d3c565b600054610100900460ff1680613e925750613e92612d28565b80613ea0575060005460ff16155b613ebc5760405162461bcd60e51b8152600401610835906152fb565b600054610100900460ff16158015613865576000805460ff1961ff0019909116610100171660011790558015610d10576000805461ff001916905550565b600054610100900460ff1680613f135750613f13612d28565b80613f21575060005460ff16155b613f3d5760405162461bcd60e51b8152600401610835906152fb565b600054610100900460ff16158015613f68576000805460ff1961ff0019909116610100171660011790555b6000613f72612818565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610d10576000805461ff001916905550565b60008183613ff55760405162461bcd60e51b81526004016108359190614d4c565b50600083858161400157fe5b0495945050505050565b60008060606301ffc9a760e01b846040516024016140299190614d37565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060866001600160a01b03166175308460405161407d9190614abb565b6000604051808303818686fa925050503d80600081146140b9576040519150601f19603f3d011682016040523d82523d6000602084013e6140be565b606091505b50915091506020815110156140dc57600080945094505050506140f9565b81818060200190518101906140f19190614792565b945094505050505b9250929050565b606061281084846000856141ca565b60006128a661ffff831684026103e8613996565b610f6a83838361428b565b6001600081815290820160205260409020546001600160a01b03165b6001600160a01b0381161580159061416c57506001600160a01b038116600114155b156141a2576001600160a01b039081166000908152600183016020526040902080546001600160a01b031981169091551661414a565b50600160008181528282016020526040812080546001600160a01b0319169092179091559055565b6060824710156141ec5760405162461bcd60e51b81526004016108359061516a565b6141f5856139c8565b6142115760405162461bcd60e51b81526004016108359061563e565b60006060866001600160a01b0316858760405161422e9190614abb565b60006040518083038185875af1925050503d806000811461426b576040519150601f19603f3d011682016040523d82523d6000602084013e614270565b606091505b50915091506142808282866143bc565b979650505050505050565b60665460408051634eb1c24560e11b815290516060926001600160a01b031691639d63848a916004808301926000929190829003018186803b1580156142d057600080fd5b505afa1580156142e4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261430c9190810190614628565b905080518260ff1611156143325760405162461bcd60e51b815260040161083590615675565b6000818360ff168151811061434357fe5b602090810291909101015160665460405163358dc31d60e11b81529192506001600160a01b031690636b1b863a9061438390889088908690600401614bdd565b600060405180830381600087803b15801561439d57600080fd5b505af11580156143b1573d6000803e3d6000fd5b505050505050505050565b606083156143cb5750816128a6565b8251156143db5782518084602001fd5b8160405162461bcd60e51b81526004016108359190614d4c565b604080516060810182526000808252602082018190529181019190915290565b5080546000825590600052602060002090810190610d1091905b80821115612ec1576000815560010161442f565b60008083601f840112614454578081fd5b50813567ffffffffffffffff81111561446b578182fd5b60208301915083602080830285010111156140f957600080fd5b600060608284031215614496578081fd5b6144a06060615a8c565b905081356144ad81615aff565b8152602082013561ffff811681146144c457600080fd5b60208201526144d683604084016144e1565b604082015292915050565b803560ff8116811461079457600080fd5b600060208284031215614503578081fd5b81356128a681615aff565b60006020828403121561451f578081fd5b81516128a681615aff565b6000806000806080858703121561453f578283fd5b843561454a81615aff565b9350602085013561455a81615aff565b925060408501359150606085013561457181615aff565b939692955090935050565b6000806040838503121561458e578081fd5b823561459981615aff565b915060208301356145a981615b14565b809150509250929050565b600080604083850312156145c6578182fd5b82516145d181615aff565b6020939093015192949293505050565b600080600080608085870312156145f6578182fd5b843561460181615aff565b935060208501359250604085013561461881615aff565b9150606085013561457181615aff565b6000602080838503121561463a578182fd5b825167ffffffffffffffff811115614650578283fd5b8301601f81018513614660578283fd5b805161467361466e82615ab3565b615a8c565b818152838101908385018584028501860189101561468f578687fd5b8694505b838510156146ba5780516146a681615aff565b835260019490940193918501918501614693565b50979650505050505050565b600080602083850312156146d8578182fd5b823567ffffffffffffffff8111156146ee578283fd5b6146fa85828601614443565b90969095509350505050565b60008060208385031215614718578182fd5b823567ffffffffffffffff8082111561472f578384fd5b818501915085601f830112614742578384fd5b813581811115614750578485fd5b866020606083028501011115614764578485fd5b60209290920196919550909350505050565b600060208284031215614787578081fd5b81356128a681615b14565b6000602082840312156147a3578081fd5b81516128a681615b14565b6000602082840312156147bf578081fd5b81356001600160e01b0319811681146128a6578182fd5b600080604083850312156147e8578182fd5b82356147f381615aff565b915060208301356145a981615aff565b600080600060408486031215614817578081fd5b833561482281615aff565b9250602084013567ffffffffffffffff81111561483d578182fd5b61484986828701614443565b9497909650939450505050565b600060608284031215614867578081fd5b6128a68383614485565b60008060808385031215614883578182fd5b61488d8484614485565b915061489c84606085016144e1565b90509250929050565b6000602082840312156148b6578081fd5b5035919050565b6000602082840312156148ce578081fd5b5051919050565b600080600080600080600060e0888a0312156148ef578485fd5b873596506020808901359650604089013561490981615aff565b9550606089013561491981615aff565b9450608089013561492981615aff565b935060a089013561493981615aff565b925060c089013567ffffffffffffffff811115614954578283fd5b8901601f81018b13614964578283fd5b803561497261466e82615ab3565b81815283810190838501858402850186018f101561498e578687fd5b8694505b838510156149b95780356149a581615aff565b835260019490940193918501918501614992565b50809550505050505092959891949750929550565b600080600080600080600060e0888a0312156149e8578081fd5b87359650602088013595506040880135614a0181615aff565b94506060880135614a1181615aff565b93506080880135614a2181615aff565b925060a0880135614a3181615aff565b8092505060c0880135905092959891949750929550565b600060208284031215614a59578081fd5b81356128a681615b22565b60008060408385031215614a76578182fd5b8251614a8181615b22565b60208401519092506145a981615b22565b80516001600160a01b0316825260208082015161ffff169083015260409081015160ff16910152565b60008251614acd818460208701615ad3565b9190910192915050565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03848116825283166020808301919091526060604083018190528354908301819052600084815282812090929091608085019190845b81811015614b6757845484526001948501949383019301614b4b565b509198975050505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03948516815292841660208401526040830191909152909116606082015260800190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6001600160a01b03948516815260208101939093529083166040830152909116606082015260800190565b6020808252825182820181905260009190848201906040850190845b81811015614c6c5783516001600160a01b031683529284019291840191600101614c47565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614c6c57614ca7838551614a92565b9284019260609290920191600101614c94565b6020808252810182905260006001600160fb1b03831115614cd9578081fd5b60208302808560408501379190910160400190815292915050565b6020808252825182820181905260009190848201906040850190845b81811015614c6c57835183529284019291840191600101614d10565b901515815260200190565b6001600160e01b031991909116815260200190565b6000602082528251806020840152614d6b816040850160208701615ad3565b601f01601f19169190910160400192915050565b60208082526024908201527f506572696f6469635072697a6553747261746567792f6572633732312d696e76604082015263185b1a5960e21b606082015260800190565b6020808252602c908201527f506572696f6469635072697a6553747261746567792f746f6b656e2d6c69737460408201526b195b995c8b5a5b9d985b1a5960a21b606082015260800190565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b602080825260139082015272496e76616c696420707265764164647265737360681b604082015260600190565b6020808252602b908201527f506572696f6469635072697a6553747261746567792f7072697a652d7065726960408201526a37b216b737ba16b7bb32b960a91b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252602c908201527f506572696f6469635072697a6553747261746567792f6f6e6c792d6f776e657260408201526b16b7b916b634b9ba32b732b960a11b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252602a908201527f506572696f6469635072697a6553747261746567792f73706f6e736f72736869604082015269702d6e6f742d7a65726f60b01b606082015260800190565b60208082526028908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c60408201526734ba16ba37b5b2b760c11b606082015260800190565b60208082526034908201527f506572696f6469635072697a6553747261746567792f7072697a652d706572696040820152736f642d677265617465722d7468616e2d7a65726f60601b606082015260800190565b60208082526025908201527f506572696f6469635072697a6553747261746567792f6f6e6c792d7072697a656040820152640b5c1bdbdb60da1b606082015260800190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f7472616e736665722d746040820152653796b9b2b63360d11b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526029908201527f506572696f6469635072697a6553747261746567792f7072697a652d706f6f6c6040820152682d6e6f742d7a65726f60b81b606082015260800190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526022908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d7a65604082015261726f60f01b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d636f6040820152656d706c65746560d01b606082015260800190565b60208082526029908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c6040820152681a5d0b5d185c99d95d60ba1b606082015260800190565b60208082526023908201527f506572696f6469635072697a6553747261746567792f65726332302d696e76616040820152621b1a5960ea1b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526026908201527f4d756c7469706c6557696e6e6572732f6e6f6e6578697374656e742d7072697a604082015265195cdc1b1a5d60d21b606082015260800190565b6020808252818101527f506572696f6469635072697a6553747261746567792f65726332302d6e756c6c604082015260600190565b6020808252602b908201527f506572696f6469635072697a6553747261746567792f726e672d616c7265616460408201526a1e4b5c995c5d595cdd195960aa1b606082015260800190565b6020808252601f908201527f4d756c7469706c6557696e6e6572732f77696e6e6572732d6774652d6f6e6500604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600c908201526b105b1c9958591e481a5b9a5d60a21b604082015260600190565b60208082526033908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c6040820152721a5d0b5c195c98d95b9d1859d94b5d1bdd185b606a1b606082015260800190565b60208082526031908201527f506572696f6469635072697a6553747261746567792f6265666f72654177617260408201527019131a5cdd195b995c8b5a5b9d985b1a59607a1b606082015260800190565b6020808252602b908201527f506572696f6469635072697a6553747261746567792f63616e6e6f742d61776160408201526a1c990b595e1d195c9b985b60aa1b606082015260800190565b6020808252600d908201526c105b1c9958591e481859191959609a1b604082015260600190565b60208082526026908201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360408201526532206269747360d01b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602f908201527f506572696f6469635072697a6553747261746567792f61776172642d696e766160408201526e0d8d2c85ae8ded6cadc5ad2dcc8caf608b1b606082015260800190565b60208082526025908201527f506572696f6469635072697a6553747261746567792f7469636b65742d6e6f746040820152642d7a65726f60d81b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526033908201527f506572696f6469635072697a6553747261746567792f7072697a6553747261746040820152721959de531a5cdd195b995c8b5a5b9d985b1a59606a1b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f6572633732312d6475706040820152656c696361746560d01b606082015260800190565b60208082526023908201527f506572696f6469635072697a6553747261746567792f726e672d696e2d666c6960408201526219da1d60ea1b606082015260800190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d74696040820152651b59591bdd5d60d21b606082015260800190565b6020808252602c908201527f506572696f6469635072697a6553747261746567792f726e672d74696d656f7560408201526b742d67742d36302d7365637360a01b606082015260800190565b60208082526027908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d72656040820152661c5d595cdd195960ca1b606082015260800190565b60208082526027908201527f506572696f6469635072697a6553747261746567792f756e617661696c61626c6040820152663296ba37b5b2b760c91b606082015260800190565b606081016107948284614a92565b61ffff93909316835260ff919091166020830152604082015260600190565b61ffff93909316835260ff918216602084015216604082015260600190565b918252602082015260400190565b86815260208082018790526001600160a01b0386811660408401528581166060840152848116608084015260c060a08401819052845190840181905260009285810192909160e0860190855b81811015615a69578551841683529484019491840191600101615a4b565b50909c9b505050505050505050505050565b63ffffffff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615aab57600080fd5b604052919050565b600067ffffffffffffffff821115615ac9578081fd5b5060209081020190565b60005b83811015615aee578181015183820152602001615ad6565b83811115610c705750506000910152565b6001600160a01b0381168114610d1057600080fd5b8015158114610d1057600080fd5b63ffffffff81168114610d1057600080fdfea2646970667358221220be37152a59f38c03d66ba04fe9d77a5fb0e1ee0351e66a3db2328c356197edad64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5B6A DUP1 PUSH3 0x21 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x3C5 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x738BBEA8 GT PUSH2 0x1FF JUMPI DUP1 PUSH4 0xB0244682 GT PUSH2 0x11A JUMPI DUP1 PUSH4 0xD5AD6BF6 GT PUSH2 0xAD JUMPI DUP1 PUSH4 0xF2FDE38B GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x733 JUMPI DUP1 PUSH4 0xF97700E2 EQ PUSH2 0x746 JUMPI DUP1 PUSH4 0xFBF0953E EQ PUSH2 0x759 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x76C JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0xD5AD6BF6 EQ PUSH2 0x6FB JUMPI DUP1 PUSH4 0xD605787B EQ PUSH2 0x703 JUMPI DUP1 PUSH4 0xDFB2F13B EQ PUSH2 0x70B JUMPI DUP1 PUSH4 0xEEFC8AD1 EQ PUSH2 0x713 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0xC2F19EE8 GT PUSH2 0xE9 JUMPI DUP1 PUSH4 0xC2F19EE8 EQ PUSH2 0x6C5 JUMPI DUP1 PUSH4 0xC42B42A0 EQ PUSH2 0x6CD JUMPI DUP1 PUSH4 0xC48DDBCB EQ PUSH2 0x6D5 JUMPI DUP1 PUSH4 0xC6853270 EQ PUSH2 0x6E8 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0xB0244682 EQ PUSH2 0x684 JUMPI DUP1 PUSH4 0xB2210957 EQ PUSH2 0x697 JUMPI DUP1 PUSH4 0xB9EE1E05 EQ PUSH2 0x6AA JUMPI DUP1 PUSH4 0xC25A9C32 EQ PUSH2 0x6B2 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0x192 JUMPI DUP1 PUSH4 0x95E5F9EE GT PUSH2 0x161 JUMPI DUP1 PUSH4 0x95E5F9EE EQ PUSH2 0x659 JUMPI DUP1 PUSH4 0x9DAFAFB0 EQ PUSH2 0x661 JUMPI DUP1 PUSH4 0xA4E075CA EQ PUSH2 0x669 JUMPI DUP1 PUSH4 0xACCA5B95 EQ PUSH2 0x67C JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x616 JUMPI DUP1 PUSH4 0x8E204C43 EQ PUSH2 0x61E JUMPI DUP1 PUSH4 0x94144C6B EQ PUSH2 0x631 JUMPI DUP1 PUSH4 0x9417783F EQ PUSH2 0x639 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x884A4448 GT PUSH2 0x1CE JUMPI DUP1 PUSH4 0x884A4448 EQ PUSH2 0x5D3 JUMPI DUP1 PUSH4 0x8AA3EC6F EQ PUSH2 0x5E6 JUMPI DUP1 PUSH4 0x8ACFACA9 EQ PUSH2 0x5F9 JUMPI DUP1 PUSH4 0x8D5F10C4 EQ PUSH2 0x601 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x738BBEA8 EQ PUSH2 0x59D JUMPI DUP1 PUSH4 0x7F2BE9FC EQ PUSH2 0x5A5 JUMPI DUP1 PUSH4 0x7F4296D7 EQ PUSH2 0x5B8 JUMPI DUP1 PUSH4 0x876F5C7E EQ PUSH2 0x5CB JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x4E5D08E0 GT PUSH2 0x2EF JUMPI DUP1 PUSH4 0x6BE51C4F GT PUSH2 0x282 JUMPI DUP1 PUSH4 0x6F46F221 GT PUSH2 0x251 JUMPI DUP1 PUSH4 0x6F46F221 EQ PUSH2 0x57D JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x585 JUMPI DUP1 PUSH4 0x719CE73E EQ PUSH2 0x58D JUMPI DUP1 PUSH4 0x72F33EA9 EQ PUSH2 0x595 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x6BE51C4F EQ PUSH2 0x552 JUMPI DUP1 PUSH4 0x6BEA5344 EQ PUSH2 0x55A JUMPI DUP1 PUSH4 0x6CC25DB7 EQ PUSH2 0x562 JUMPI DUP1 PUSH4 0x6DFB0386 EQ PUSH2 0x56A JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x62C77A61 GT PUSH2 0x2BE JUMPI DUP1 PUSH4 0x62C77A61 EQ PUSH2 0x51C JUMPI DUP1 PUSH4 0x66968221 EQ PUSH2 0x524 JUMPI DUP1 PUSH4 0x671137C4 EQ PUSH2 0x537 JUMPI DUP1 PUSH4 0x6A74F107 EQ PUSH2 0x54A JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x4E5D08E0 EQ PUSH2 0x4DB JUMPI DUP1 PUSH4 0x500DB70D EQ PUSH2 0x4EE JUMPI DUP1 PUSH4 0x52A30109 EQ PUSH2 0x4F6 JUMPI DUP1 PUSH4 0x605E25AC EQ PUSH2 0x509 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x2C8FE73D GT PUSH2 0x367 JUMPI DUP1 PUSH4 0x47BED998 GT PUSH2 0x336 JUMPI DUP1 PUSH4 0x47BED998 EQ PUSH2 0x4A5 JUMPI DUP1 PUSH4 0x4ABA4F6B EQ PUSH2 0x4B8 JUMPI DUP1 PUSH4 0x4C169F4F EQ PUSH2 0x4C0 JUMPI DUP1 PUSH4 0x4D7F3DB0 EQ PUSH2 0x4C8 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x2C8FE73D EQ PUSH2 0x460 JUMPI DUP1 PUSH4 0x30FCDF41 EQ PUSH2 0x468 JUMPI DUP1 PUSH4 0x38A9B4B6 EQ PUSH2 0x47D JUMPI DUP1 PUSH4 0x42D09209 EQ PUSH2 0x490 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0xFAF125F GT PUSH2 0x3A3 JUMPI DUP1 PUSH4 0xFAF125F EQ PUSH2 0x428 JUMPI DUP1 PUSH4 0x111070E4 EQ PUSH2 0x430 JUMPI DUP1 PUSH4 0x152D308C EQ PUSH2 0x438 JUMPI DUP1 PUSH4 0x2A7AD609 EQ PUSH2 0x44B JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x1B48E34 EQ PUSH2 0x3CA JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x3F3 JUMPI DUP1 PUSH4 0xD847FC4 EQ PUSH2 0x413 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3DD PUSH2 0x3D8 CALLDATASIZE PUSH1 0x4 PUSH2 0x48A5 JUMP JUMPDEST PUSH2 0x781 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x406 PUSH2 0x401 CALLDATASIZE PUSH1 0x4 PUSH2 0x47AE JUMP JUMPDEST PUSH2 0x79A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x4D2C JUMP JUMPDEST PUSH2 0x41B PUSH2 0x7D0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x4AE0 JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x7DF JUMP JUMPDEST PUSH2 0x406 PUSH2 0x7E5 JUMP JUMPDEST PUSH2 0x406 PUSH2 0x446 CALLDATASIZE PUSH1 0x4 PUSH2 0x457C JUMP JUMPDEST PUSH2 0x7F4 JUMP JUMPDEST PUSH2 0x453 PUSH2 0x8AB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x5A7B JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x8B7 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x476 CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0x8C6 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x47B PUSH2 0x48B CALLDATASIZE PUSH1 0x4 PUSH2 0x4776 JUMP JUMPDEST PUSH2 0x99E JUMP JUMPDEST PUSH2 0x498 PUSH2 0xA34 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x4C2B JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x4B3 CALLDATASIZE PUSH1 0x4 PUSH2 0x48A5 JUMP JUMPDEST PUSH2 0xA40 JUMP JUMPDEST PUSH2 0x406 PUSH2 0xA4B JUMP JUMPDEST PUSH2 0x47B PUSH2 0xAD4 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x4D6 CALLDATASIZE PUSH1 0x4 PUSH2 0x45E1 JUMP JUMPDEST PUSH2 0xB9E JUMP JUMPDEST PUSH2 0x47B PUSH2 0x4E9 CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0xC76 JUMP JUMPDEST PUSH2 0x41B PUSH2 0xD13 JUMP JUMPDEST PUSH2 0x406 PUSH2 0x504 CALLDATASIZE PUSH1 0x4 PUSH2 0x48A5 JUMP JUMPDEST PUSH2 0xD22 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x517 CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0xDB0 JUMP JUMPDEST PUSH2 0x498 PUSH2 0xE91 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x532 CALLDATASIZE PUSH1 0x4 PUSH2 0x46C6 JUMP JUMPDEST PUSH2 0xE9D JUMP JUMPDEST PUSH2 0x47B PUSH2 0x545 CALLDATASIZE PUSH1 0x4 PUSH2 0x47D6 JUMP JUMPDEST PUSH2 0xF6F JUMP JUMPDEST PUSH2 0x406 PUSH2 0xFCF JUMP JUMPDEST PUSH2 0x41B PUSH2 0xFE8 JUMP JUMPDEST PUSH2 0x453 PUSH2 0xFF7 JUMP JUMPDEST PUSH2 0x41B PUSH2 0x100B JUMP JUMPDEST PUSH2 0x47B PUSH2 0x578 CALLDATASIZE PUSH1 0x4 PUSH2 0x48A5 JUMP JUMPDEST PUSH2 0x101A JUMP JUMPDEST PUSH2 0x406 PUSH2 0x106A JUMP JUMPDEST PUSH2 0x47B PUSH2 0x1073 JUMP JUMPDEST PUSH2 0x41B PUSH2 0x10FC JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x110B JUMP JUMPDEST PUSH2 0x406 PUSH2 0x1111 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x5B3 CALLDATASIZE PUSH1 0x4 PUSH2 0x49CE JUMP JUMPDEST PUSH2 0x1164 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x5C6 CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0x1208 JUMP JUMPDEST PUSH2 0x406 PUSH2 0x12BE JUMP JUMPDEST PUSH2 0x47B PUSH2 0x5E1 CALLDATASIZE PUSH1 0x4 PUSH2 0x48A5 JUMP JUMPDEST PUSH2 0x12DD JUMP JUMPDEST PUSH2 0x47B PUSH2 0x5F4 CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0x132D JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x1405 JUMP JUMPDEST PUSH2 0x609 PUSH2 0x140B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x4C78 JUMP JUMPDEST PUSH2 0x41B PUSH2 0x1490 JUMP JUMPDEST PUSH2 0x406 PUSH2 0x62C CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0x149F JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x14B4 JUMP JUMPDEST PUSH2 0x64C PUSH2 0x647 CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0x14BA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x4CF4 JUMP JUMPDEST PUSH2 0x406 PUSH2 0x1526 JUMP JUMPDEST PUSH2 0x406 PUSH2 0x1530 JUMP JUMPDEST PUSH2 0x406 PUSH2 0x677 CALLDATASIZE PUSH1 0x4 PUSH2 0x4776 JUMP JUMPDEST PUSH2 0x1539 JUMP JUMPDEST PUSH2 0x453 PUSH2 0x15C0 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x692 CALLDATASIZE PUSH1 0x4 PUSH2 0x47D6 JUMP JUMPDEST PUSH2 0x15CC JUMP JUMPDEST PUSH2 0x47B PUSH2 0x6A5 CALLDATASIZE PUSH1 0x4 PUSH2 0x452A JUMP JUMPDEST PUSH2 0x1657 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x1728 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x6C0 CALLDATASIZE PUSH1 0x4 PUSH2 0x4706 JUMP JUMPDEST PUSH2 0x1970 JUMP JUMPDEST PUSH2 0x41B PUSH2 0x1CFF JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x1D0E JUMP JUMPDEST PUSH2 0x47B PUSH2 0x6E3 CALLDATASIZE PUSH1 0x4 PUSH2 0x4803 JUMP JUMPDEST PUSH2 0x1D8B JUMP JUMPDEST PUSH2 0x47B PUSH2 0x6F6 CALLDATASIZE PUSH1 0x4 PUSH2 0x4A48 JUMP JUMPDEST PUSH2 0x1F80 JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x1FD0 JUMP JUMPDEST PUSH2 0x41B PUSH2 0x1FDA JUMP JUMPDEST PUSH2 0x47B PUSH2 0x1FE9 JUMP JUMPDEST PUSH2 0x726 PUSH2 0x721 CALLDATASIZE PUSH1 0x4 PUSH2 0x48A5 JUMP JUMPDEST PUSH2 0x226B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x59A5 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x741 CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0x22D0 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x754 CALLDATASIZE PUSH1 0x4 PUSH2 0x48D5 JUMP JUMPDEST PUSH2 0x2391 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x767 CALLDATASIZE PUSH1 0x4 PUSH2 0x4871 JUMP JUMPDEST PUSH2 0x25F2 JUMP JUMPDEST PUSH2 0x774 PUSH2 0x2791 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x4D4C JUMP JUMPDEST PUSH1 0x0 PUSH2 0x794 PUSH2 0x78E PUSH2 0x27B2 JUMP JUMPDEST DUP4 PUSH2 0x27EF JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL EQ DUP1 PUSH2 0x794 JUMPI POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT EQ SWAP1 JUMP JUMPDEST PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x7A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH4 0xFFFFFFFF AND ISZERO ISZERO JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7FE PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x80F PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x83E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x846 PUSH2 0x281C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x78 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP6 ISZERO ISZERO OR SWAP1 SSTORE MLOAD PUSH32 0xD1AC9A365C0E3BFAD562E0A809A5DED3842A2B489F839B3327E4E34EE0128F28 SWAP1 PUSH2 0x89A SWAP1 DUP6 SWAP1 PUSH2 0x4D2C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8C1 PUSH2 0x2871 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x8CE PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x8DF PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x905 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x90D PUSH2 0x281C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0x938 JUMPI POP PUSH2 0x938 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH4 0x266FCE1F PUSH1 0xE1 SHL PUSH2 0x288A JUMP JUMPDEST PUSH2 0x954 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5535 JUMP JUMPDEST PUSH1 0x73 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xC4FEFF61630891EA2CB42A54FBE3FF2E65422F2ED17323AC6B65F4521112E87E SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH2 0x9A6 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x9B7 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x9DD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x9E5 PUSH2 0x281C JUMP JUMPDEST PUSH1 0x77 DUP1 SLOAD PUSH1 0xFF NOT AND DUP3 ISZERO ISZERO OR SWAP1 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x6959D02E8FB6264D1D39BF37F1E725001F342714933CF38F8627A2442EFC43FD SWAP2 PUSH2 0xA29 SWAP2 PUSH1 0xFF SWAP1 SWAP2 AND SWAP1 PUSH2 0x4D2C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x8C1 PUSH1 0x70 PUSH2 0x28AD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x794 DUP3 PUSH2 0x298D JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x6A SLOAD PUSH1 0x40 MLOAD PUSH4 0xE866E6F PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x3A19B9BC SWAP2 PUSH2 0xA84 SWAP2 PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x4 ADD PUSH2 0x5A7B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA9C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xAB0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x8C1 SWAP2 SWAP1 PUSH2 0x4792 JUMP JUMPDEST PUSH2 0xADC PUSH2 0x1111 JUMP JUMPDEST PUSH2 0xAF8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5885 JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF NOT DUP2 AND SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH4 0xFFFFFFFF DUP1 DUP4 AND SWAP3 PUSH5 0x100000000 SWAP1 DIV AND SWAP1 PUSH32 0xEE6702C46C5618E6FC7E625C71F4C85DF9C91D456CB16A3AEA71AB83B1FEE005 SWAP1 PUSH1 0x0 SWAP1 LOG1 PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0xFFFFFFFF DUP5 AND SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 CALLER SWAP1 PUSH32 0xD50026EE0824513AF20CDF5E72D1FBFBE8FD646EE0576378E080326F1A695E58 SWAP1 PUSH2 0xB92 SWAP1 DUP7 SWAP1 PUSH2 0x5A7B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xBB2 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xBD8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x505F JUMP JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0xBF6 JUMPI PUSH2 0xBF6 PUSH2 0x281C JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0xC70 JUMPI PUSH1 0x65 SLOAD PUSH1 0x40 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x4D7F3DB0 SWAP1 PUSH2 0xC3D SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x4C00 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC57 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xC6B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0xC7E PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xC8F PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0xCBE JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xCB3 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0xCE3 JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xCD8 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0xCFF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4EF6 JUMP JUMPDEST PUSH2 0xD07 PUSH2 0x281C JUMP JUMPDEST PUSH2 0xD10 DUP2 PUSH2 0x29D4 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xD2C PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xD3D PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xD63 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0xD6B PUSH2 0x281C JUMP JUMPDEST PUSH1 0x7A DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x63E4E34F49D12428C03E04E61340C7167E36EB0FF6F0B1970C75440261794039 SWAP1 PUSH2 0xDA0 SWAP1 DUP5 SWAP1 PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP PUSH1 0x1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xDB8 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xDC9 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xDEF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0xDF7 PUSH2 0x281C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0xE25 JUMPI POP PUSH2 0xE25 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x288A JUMP JUMPDEST PUSH2 0xE41 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4DC3 JUMP JUMPDEST PUSH1 0x65 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 AND SWAP1 PUSH32 0x9FC437AA70AD4EE5F33F6772BF338EED41E21B95435820817AB8B4DF161CE4DD SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x8C1 PUSH1 0x6E PUSH2 0x28AD JUMP JUMPDEST PUSH2 0xEA5 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xEB6 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0xEE5 JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xEDA PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0xF0A JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xEFF PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0xF26 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4EF6 JUMP JUMPDEST PUSH2 0xF2E PUSH2 0x281C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xF6A JUMPI PUSH2 0xF62 DUP4 DUP4 DUP4 DUP2 DUP2 LT PUSH2 0xF48 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0xF5D SWAP2 SWAP1 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0x29D4 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xF31 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xF77 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF88 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xFAE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0xFB6 PUSH2 0x281C JUMP JUMPDEST PUSH2 0xFC2 PUSH1 0x70 DUP3 DUP5 PUSH2 0x2B88 JUMP JUMPDEST PUSH2 0xFCB DUP3 PUSH2 0x2C52 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFD9 PUSH2 0x7E5 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x8C1 JUMPI POP PUSH2 0x8C1 PUSH2 0xA4B JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH5 0x100000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1022 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1033 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1059 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x1061 PUSH2 0x281C JUMP JUMPDEST PUSH2 0xD10 DUP2 PUSH2 0x2CAA JUMP JUMPDEST PUSH1 0x79 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x107B PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x108C PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x10B2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x6D SLOAD DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND PUSH2 0x1130 JUMPI POP PUSH1 0x0 PUSH2 0x7F1 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH1 0x6B SLOAD PUSH2 0x1154 SWAP2 PUSH4 0xFFFFFFFF SWAP2 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 SWAP2 DIV DUP2 AND SWAP1 PUSH2 0x2CFF AND JUMP JUMPDEST PUSH2 0x115C PUSH2 0x2D24 JUMP JUMPDEST GT SWAP1 POP PUSH2 0x7F1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x117D JUMPI POP PUSH2 0x117D PUSH2 0x2D28 JUMP JUMPDEST DUP1 PUSH2 0x118B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x11A7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x52FB JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x11D2 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x60 PUSH2 0x11E3 DUP10 DUP10 DUP10 DUP10 DUP10 DUP10 DUP8 PUSH2 0x2391 JUMP JUMPDEST PUSH2 0x11EC DUP4 PUSH2 0x2CAA JUMP JUMPDEST POP DUP1 ISZERO PUSH2 0xC6B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1210 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1221 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1247 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x124F PUSH2 0x281C JUMP JUMPDEST PUSH2 0x1257 PUSH2 0x7E5 JUMP JUMPDEST ISZERO PUSH2 0x1274 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5842 JUMP JUMPDEST PUSH1 0x69 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xF935763CC7C57EE8ED6318ED71E756CCA0731294C9F46FF5B386F36D6FF1417A SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x12C8 PUSH2 0x2D33 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x8C1 JUMPI POP PUSH2 0x12D7 PUSH2 0x7E5 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x12E5 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x12F6 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x131C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x1324 PUSH2 0x281C JUMP JUMPDEST PUSH2 0xD10 DUP2 PUSH2 0x2D4C JUMP JUMPDEST PUSH2 0x1335 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1346 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x136C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x1374 PUSH2 0x281C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0x139F JUMPI POP PUSH2 0x139F PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH4 0x2BA83963 PUSH1 0xE1 SHL PUSH2 0x288A JUMP JUMPDEST PUSH2 0x13BB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5753 JUMP JUMPDEST PUSH1 0x74 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xDA05D50A3A1EC0FFAB059F1D457AE59F68CCFB3FFBB4DAD283C516F9103D584B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x76 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x75 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0x1487 JUMPI PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 SWAP1 DUP2 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP2 DUP6 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND DUP4 DUP6 ADD MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP3 ADD MSTORE DUP3 MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 ADD PUSH2 0x142F JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x78 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x6C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD DUP4 MLOAD DUP2 DUP5 MUL DUP2 ADD DUP5 ADD SWAP1 SWAP5 MSTORE DUP1 DUP5 MSTORE PUSH1 0x60 SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x151A JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x1506 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8C1 PUSH2 0x2D33 JUMP JUMPDEST PUSH1 0x77 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1543 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1554 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x157A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x1582 PUSH2 0x281C JUMP JUMPDEST PUSH1 0x79 DUP1 SLOAD PUSH1 0xFF NOT AND DUP4 ISZERO ISZERO OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x2B4B6FFE286F7CE4CCC6B136BB14987B0A00092174D88938A0C667A104A4A731 SWAP1 PUSH2 0xDA0 SWAP1 DUP5 SWAP1 PUSH2 0x4D2C JUMP JUMPDEST PUSH1 0x6B SLOAD PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x15D4 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x15E5 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x160B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x1613 PUSH2 0x281C JUMP JUMPDEST PUSH2 0x161F PUSH1 0x6E DUP3 DUP5 PUSH2 0x2B88 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 PUSH32 0x58982464497ACDAB11AD29D39907E076B0D3B8DAF1D9B734174C7C3A2A0E8C74 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x166B PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1691 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x505F JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x16C3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x50A4 JUMP JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x16E1 JUMPI PUSH2 0x16E1 PUSH2 0x281C JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0xC70 JUMPI PUSH1 0x65 SLOAD PUSH1 0x40 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xB2210957 SWAP1 PUSH2 0xC3D SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B99 JUMP JUMPDEST PUSH2 0x1730 PUSH2 0x2D33 JUMP JUMPDEST PUSH2 0x174C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4E65 JUMP JUMPDEST PUSH2 0x1754 PUSH2 0x7E5 JUMP JUMPDEST ISZERO PUSH2 0x1771 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x53C4 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xD37B537 PUSH1 0xE0 SHL DUP2 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP3 PUSH4 0xD37B537 SWAP3 PUSH1 0x4 DUP1 DUP4 ADD SWAP4 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x17B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x17CA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x17EE SWAP2 SWAP1 PUSH2 0x45B4 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x180B JUMPI POP PUSH1 0x0 DUP2 GT JUMPDEST ISZERO PUSH2 0x182A JUMPI PUSH1 0x69 SLOAD PUSH2 0x182A SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND SWAP2 AND DUP4 PUSH2 0x2DA1 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x433C53D9 PUSH1 0xE1 SHL DUP2 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP3 PUSH4 0x8678A7B2 SWAP3 PUSH1 0x4 DUP1 DUP4 ADD SWAP4 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1870 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1884 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x18A8 SWAP2 SWAP1 PUSH2 0x4A64 JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH4 0xFFFFFFFF DUP1 DUP5 AND PUSH5 0x100000000 MUL PUSH8 0xFFFFFFFF00000000 NOT SWAP2 DUP7 AND PUSH4 0xFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR AND OR SWAP1 SSTORE SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x18EE PUSH2 0x18E9 PUSH2 0x2D24 JUMP JUMPDEST PUSH2 0x2E9B JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFF0000000000000000 NOT AND PUSH1 0x1 PUSH1 0x40 SHL PUSH4 0xFFFFFFFF SWAP4 DUP5 AND MUL OR SWAP1 SSTORE PUSH1 0x66 SLOAD SWAP1 DUP4 AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x192A PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x4D31E658DCF617BB3A3C8CF7C6DDDB33F7030AC588E271631ECDB5D76C2E91EF DUP5 PUSH1 0x40 MLOAD PUSH2 0x1962 SWAP2 SWAP1 PUSH2 0x5A7B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1978 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1989 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x19AF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1C54 JUMPI PUSH2 0x19C3 PUSH2 0x43F5 JUMP JUMPDEST DUP5 DUP5 DUP4 DUP2 DUP2 LT PUSH2 0x19CF JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x60 MUL ADD DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x19E5 SWAP2 SWAP1 PUSH2 0x4856 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP2 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND GT ISZERO PUSH2 0x1A0F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4FC3 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A36 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x526F JUMP JUMPDEST PUSH1 0x75 SLOAD DUP3 LT PUSH2 0x1AD2 JUMPI PUSH1 0x75 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE PUSH1 0x0 SWAP2 SWAP1 SWAP2 MSTORE DUP2 MLOAD PUSH32 0x9A8D93986A7B9E6294572EA6736696119C195C1A9F5EAE642D3C5FCD44E49DEA SWAP1 SWAP2 ADD DUP1 SLOAD PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x40 DUP6 ADD MLOAD PUSH1 0xFF AND PUSH1 0x1 PUSH1 0xB0 SHL MUL PUSH1 0xFF PUSH1 0xB0 SHL NOT PUSH2 0xFFFF SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xA0 SHL MUL PUSH2 0xFFFF PUSH1 0xA0 SHL NOT PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP7 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP5 SWAP1 SWAP5 AND SWAP2 SWAP1 SWAP2 OR AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x1BF9 JUMP JUMPDEST PUSH2 0x1ADA PUSH2 0x43F5 JUMP JUMPDEST PUSH1 0x75 DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x1AE7 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND DUP1 DUP6 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP4 DIV PUSH2 0xFFFF AND SWAP6 DUP6 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 SWAP2 DIV PUSH1 0xFF AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP5 MLOAD SWAP2 SWAP4 POP AND EQ ISZERO DUP1 PUSH2 0x1B56 JUMPI POP DUP1 PUSH1 0x20 ADD MLOAD PUSH2 0xFFFF AND DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0xFFFF AND EQ ISZERO JUMPDEST DUP1 PUSH2 0x1B6F JUMPI POP DUP1 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND DUP3 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x1BF0 JUMPI DUP2 PUSH1 0x75 DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x1B82 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 DUP4 MLOAD SWAP2 ADD DUP1 SLOAD SWAP3 DUP5 ADD MLOAD PUSH1 0x40 SWAP1 SWAP5 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP4 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH2 0xFFFF PUSH1 0xA0 SHL NOT AND PUSH1 0x1 PUSH1 0xA0 SHL PUSH2 0xFFFF SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 MUL SWAP3 SWAP1 SWAP3 OR PUSH1 0xFF PUSH1 0xB0 SHL NOT AND PUSH1 0x1 PUSH1 0xB0 SHL PUSH1 0xFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE PUSH2 0x1BF7 JUMP JUMPDEST POP POP PUSH2 0x1C4C JUMP JUMPDEST POP JUMPDEST DUP1 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC1BF93444A0055A24A7D0154B75FEDF78EDFE355C06A2CE8E47F9F3908720559 DUP3 PUSH1 0x20 ADD MLOAD DUP4 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 MLOAD PUSH2 0x1C42 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x59B3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x19B3 JUMP JUMPDEST POP JUMPDEST PUSH1 0x75 SLOAD DUP2 LT ISZERO PUSH2 0x1CD1 JUMPI PUSH1 0x75 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x1C71 SWAP1 PUSH1 0x1 PUSH2 0x2EC5 JUMP JUMPDEST SWAP1 POP PUSH1 0x75 DUP1 SLOAD DUP1 PUSH2 0x1C7E JUMPI INVALID JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 DUP3 ADD PUSH1 0x0 NOT SWAP1 DUP2 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xB8 SHL SUB NOT AND SWAP1 SSTORE SWAP1 SWAP2 ADD SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD DUP3 SWAP2 PUSH32 0x99FA473FDF53414BCD014CF6E7509FC58C68F7B86174767FAA6AD5100CD5BAE5 SWAP2 LOG2 POP PUSH2 0x1C56 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1CDB PUSH2 0x2EED JUMP JUMPDEST SWAP1 POP PUSH2 0x3E8 DUP2 GT ISZERO PUSH2 0xC70 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x54E2 JUMP JUMPDEST PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x18C1996D PUSH1 0xE2 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x630665B4 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1D53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1D67 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x8C1 SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST PUSH2 0x1D93 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1DA4 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0x1DD3 JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1DC8 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0x1DF8 JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1DED PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0x1E14 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4EF6 JUMP JUMPDEST PUSH2 0x1E1C PUSH2 0x281C JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x6A3FD4F9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x6A3FD4F9 SWAP1 PUSH2 0x1E4C SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4AE0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E64 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1E78 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1E9C SWAP2 SWAP1 PUSH2 0x4792 JUMP JUMPDEST PUSH2 0x1EB8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5586 JUMP JUMPDEST PUSH2 0x1ED2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH4 0x80AC58CD PUSH1 0xE0 SHL PUSH2 0x288A JUMP JUMPDEST PUSH2 0x1EEE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4D7F JUMP JUMPDEST PUSH2 0x1EF9 PUSH1 0x70 DUP5 PUSH2 0x2F7F JUMP JUMPDEST PUSH2 0x1F08 JUMPI PUSH2 0x1F08 PUSH1 0x70 DUP5 PUSH2 0x2FD0 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1F37 JUMPI PUSH2 0x1F2F DUP5 DUP5 DUP5 DUP5 DUP2 DUP2 LT PUSH2 0x1F23 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH2 0x3098 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x1F0B JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x51541DC4B4C08A16085809CCCDC4CC77D8000B60FBB00142E57F236D84298675 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH2 0x1F73 SWAP3 SWAP2 SWAP1 PUSH2 0x4CBA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP JUMP JUMPDEST PUSH2 0x1F88 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1F99 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1FBF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x1FC7 PUSH2 0x281C JUMP JUMPDEST PUSH2 0xD10 DUP2 PUSH2 0x31E9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8C1 PUSH2 0x27B2 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1FF1 PUSH2 0x7E5 JUMP JUMPDEST PUSH2 0x200D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5917 JUMP JUMPDEST PUSH2 0x2015 PUSH2 0xA4B JUMP JUMPDEST PUSH2 0x2031 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5229 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x6A SLOAD PUSH1 0x40 MLOAD PUSH4 0x13A54BF3 PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x9D2A5F98 SWAP2 PUSH2 0x206A SWAP2 PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x4 ADD PUSH2 0x5A7B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2084 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2098 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x20BC SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE PUSH1 0x73 SLOAD SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x214C JUMPI PUSH1 0x73 SLOAD PUSH1 0x6D SLOAD PUSH1 0x40 MLOAD PUSH4 0x266FCE1F PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x4CDF9C3E SWAP2 PUSH2 0x2119 SWAP2 DUP6 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x59F1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2133 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2147 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x2155 DUP2 PUSH2 0x325A JUMP JUMPDEST PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x21CD JUMPI PUSH1 0x74 SLOAD PUSH1 0x6D SLOAD PUSH1 0x40 MLOAD PUSH4 0x2BA83963 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x575072C6 SWAP2 PUSH2 0x219A SWAP2 DUP6 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x59F1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x21B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x21C8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x21DD PUSH2 0x21D8 PUSH2 0x2D24 JUMP JUMPDEST PUSH2 0x298D JUMP JUMPDEST PUSH1 0x6D SSTORE PUSH2 0x21E8 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x9C4163ECE98173EAB9A496C4DB8BF3E2C8EDCC5D2854377880597CCB858B7A9D DUP3 PUSH1 0x40 MLOAD PUSH2 0x2220 SWAP2 SWAP1 PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x6D SLOAD PUSH2 0x2233 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC61852C20F0B03B31D782F3022F2BF20322AC17CE66C5349FB6E24740CDD6456 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP JUMP JUMPDEST PUSH2 0x2273 PUSH2 0x43F5 JUMP JUMPDEST PUSH1 0x75 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x2280 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP4 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 SWAP3 DIV PUSH1 0xFF AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x22D8 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x22E9 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x230F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x2335 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4EB0 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x23AA JUMPI POP PUSH2 0x23AA PUSH2 0x2D28 JUMP JUMPDEST DUP1 PUSH2 0x23B8 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x23D4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x52FB JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x23FF JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH2 0x2425 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5121 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x244B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x56C4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x2471 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4F79 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x2497 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x51B0 JUMP JUMPDEST PUSH1 0x66 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP10 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SWAP3 SSTORE PUSH1 0x67 DUP1 SLOAD DUP9 DUP5 AND SWAP1 DUP4 AND OR SWAP1 SSTORE PUSH1 0x69 DUP1 SLOAD DUP7 DUP5 AND SWAP1 DUP4 AND OR SWAP1 SSTORE PUSH1 0x68 DUP1 SLOAD SWAP3 DUP8 AND SWAP3 SWAP1 SWAP2 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x24EA DUP8 PUSH2 0x2D4C JUMP JUMPDEST PUSH2 0x24F2 PUSH2 0x37E7 JUMP JUMPDEST PUSH2 0x24FC PUSH1 0x6E PUSH2 0x3879 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 MLOAD DUP2 LT ISZERO PUSH2 0x252C JUMPI PUSH2 0x2524 DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2517 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x29D4 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x24FF JUMP JUMPDEST POP PUSH1 0x6C DUP8 SWAP1 SSTORE PUSH1 0x6D DUP9 SWAP1 SSTORE PUSH2 0x2541 PUSH1 0x70 PUSH2 0x3879 JUMP JUMPDEST PUSH2 0x254C PUSH2 0x708 PUSH2 0x31E9 JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xF9632D212436344A25150FF0C161DABF412AADE556621C2DEA146CA63FF643F5 DUP10 DUP10 DUP9 DUP9 DUP9 DUP9 PUSH1 0x40 MLOAD PUSH2 0x258F SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x59FF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x6D SLOAD PUSH2 0x25A2 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC61852C20F0B03B31D782F3022F2BF20322AC17CE66C5349FB6E24740CDD6456 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 DUP1 ISZERO PUSH2 0xC6B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x25FA PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x260B PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2631 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH1 0x75 SLOAD PUSH1 0xFF DUP3 AND LT PUSH2 0x2655 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5349 JUMP JUMPDEST PUSH1 0x1 DUP3 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND GT ISZERO PUSH2 0x267D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4FC3 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x26A4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x526F JUMP JUMPDEST DUP2 PUSH1 0x75 DUP3 PUSH1 0xFF AND DUP2 SLOAD DUP2 LT PUSH2 0x26B5 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 DUP5 MLOAD SWAP3 ADD DUP1 SLOAD SWAP2 DUP6 ADD MLOAD PUSH1 0x40 SWAP1 SWAP6 ADD MLOAD PUSH1 0xFF AND PUSH1 0x1 PUSH1 0xB0 SHL MUL PUSH1 0xFF PUSH1 0xB0 SHL NOT PUSH2 0xFFFF SWAP1 SWAP7 AND PUSH1 0x1 PUSH1 0xA0 SHL MUL PUSH2 0xFFFF PUSH1 0xA0 SHL NOT PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP4 SWAP1 SWAP4 AND SWAP2 SWAP1 SWAP2 OR SWAP4 SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE PUSH2 0x2724 PUSH2 0x2EED JUMP JUMPDEST SWAP1 POP PUSH2 0x3E8 DUP2 GT ISZERO PUSH2 0x2748 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x54E2 JUMP JUMPDEST DUP3 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC1BF93444A0055A24A7D0154B75FEDF78EDFE355C06A2CE8E47F9F3908720559 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 MLOAD PUSH2 0x1F73 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x59D2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x27BD PUSH2 0x2871 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x27C9 PUSH2 0x2D24 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 GT ISZERO PUSH2 0x27DE JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x7F1 JUMP JUMPDEST PUSH2 0x27E8 DUP3 DUP3 PUSH2 0x2EC5 JUMP JUMPDEST SWAP3 POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2804 PUSH8 0xDE0B6B3A7640000 DUP6 PUSH2 0x38BD JUMP JUMPDEST SWAP1 POP PUSH2 0x2810 DUP2 DUP5 PUSH2 0x38F7 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2826 PUSH2 0x3939 JUMP JUMPDEST PUSH1 0x6A SLOAD SWAP1 SWAP2 POP PUSH5 0x100000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND ISZERO DUP1 PUSH2 0x2855 JUMPI POP PUSH1 0x6A SLOAD PUSH5 0x100000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP2 LT JUMPDEST PUSH2 0xD10 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5842 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8C1 PUSH1 0x6C SLOAD PUSH1 0x6D SLOAD PUSH2 0x2CFF SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2895 DUP4 PUSH2 0x393D JUMP JUMPDEST DUP1 ISZERO PUSH2 0x28A6 JUMPI POP PUSH2 0x28A6 DUP4 DUP4 PUSH2 0x3970 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 PUSH1 0x0 ADD SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x28CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x28F5 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x2938 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST ISZERO PUSH2 0x2984 JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x294A JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x20 SWAP2 DUP3 MUL SWAP3 SWAP1 SWAP3 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP1 DUP9 ADD SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP3 SWAP1 SWAP2 ADD SWAP2 AND PUSH2 0x2916 JUMP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x29B1 PUSH1 0x6C SLOAD PUSH2 0x29AB PUSH1 0x6D SLOAD DUP7 PUSH2 0x2EC5 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 PUSH2 0x3996 JUMP JUMPDEST SWAP1 POP PUSH2 0x28A6 PUSH2 0x29CB PUSH1 0x6C SLOAD DUP4 PUSH2 0x38BD SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x6D SLOAD SWAP1 PUSH2 0x2CFF JUMP JUMPDEST PUSH2 0x29E6 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x39C8 JUMP JUMPDEST PUSH2 0x2A02 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x538F JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x6A3FD4F9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x6A3FD4F9 SWAP1 PUSH2 0x2A32 SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH2 0x4AE0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2A4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2A5E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2A82 SWAP2 SWAP1 PUSH2 0x4792 JUMP JUMPDEST PUSH2 0x2A9E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5586 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x4 DUP2 MSTORE PUSH1 0x24 DUP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0xE0 SHL OR SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x60 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP2 PUSH2 0x2AE2 SWAP2 PUSH2 0x4ABB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x2B1D JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x2B22 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x2B44 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x52B8 JUMP JUMPDEST PUSH2 0x2B4F PUSH1 0x6E DUP5 PUSH2 0x2FD0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH32 0xBCD6D991F3416E288BF59A2997B423772937B62C7EA7DD1A54AF7771DE1F7418 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x2BAA JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO ISZERO JUMPDEST PUSH2 0x2BC6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4E0F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 AND SWAP1 DUP3 AND EQ PUSH2 0x2C04 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4E38 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD SWAP6 DUP6 AND DUP4 MSTORE SWAP1 DUP3 KECCAK256 DUP1 SLOAD SWAP6 SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP6 DUP7 AND OR SWAP1 SWAP4 SSTORE MSTORE DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x2C73 SWAP2 PUSH2 0x4415 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH32 0xCD64D9DACD230C5CCF1278EA5332B0621AA28C950FB0E61C8FBC9E2011C88A34 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP2 GT PUSH2 0x2CCA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x540F JUMP JUMPDEST PUSH1 0x76 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0xC44C7222E8DF09744CED394101DF47E78DEDB642D3065267BB388901DE9DF6D4 SWAP1 PUSH2 0xA29 SWAP1 DUP4 SWAP1 PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x28A6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4F42 JUMP JUMPDEST TIMESTAMP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x12D7 ADDRESS PUSH2 0x39C8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2D3D PUSH2 0x2871 JUMP JUMPDEST PUSH2 0x2D45 PUSH2 0x2D24 JUMP JUMPDEST LT ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 GT PUSH2 0x2D6C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x500B JUMP JUMPDEST PUSH1 0x6C DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0xD379C1A7282461E725A9DC2D74E65246C77E98AE93835E26C2F1654C48EE4EC SWAP1 PUSH2 0xA29 SWAP1 DUP4 SWAP1 PUSH2 0x4AD7 JUMP JUMPDEST DUP1 ISZERO DUP1 PUSH2 0x2E29 JUMPI POP PUSH1 0x40 MLOAD PUSH4 0x6EB1769F PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH4 0xDD62ED3E SWAP1 PUSH2 0x2DD7 SWAP1 ADDRESS SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4AF4 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2DEF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2E03 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2E27 SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST ISZERO JUMPDEST PUSH2 0x2E45 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x57A6 JUMP JUMPDEST PUSH2 0xF6A DUP4 PUSH4 0x95EA7B3 PUSH1 0xE0 SHL DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2E64 SWAP3 SWAP2 SWAP1 PUSH2 0x4BC4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE PUSH2 0x39CE JUMP JUMPDEST PUSH1 0x0 PUSH5 0x100000000 DUP3 LT PUSH2 0x2EC1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x55F8 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2EE7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x50EA JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x75 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP2 JUMPDEST DUP2 DUP2 PUSH1 0xFF AND LT ISZERO PUSH2 0x2F77 JUMPI PUSH2 0x2F0A PUSH2 0x43F5 JUMP JUMPDEST PUSH1 0x75 DUP3 PUSH1 0xFF AND DUP2 SLOAD DUP2 LT PUSH2 0x2F1A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP3 ADD MSTORE SWAP2 POP PUSH2 0x2F6C SWAP1 DUP6 SWAP1 PUSH2 0x2CFF JUMP JUMPDEST SWAP4 POP POP PUSH1 0x1 ADD PUSH2 0x2EF7 JUMP JUMPDEST POP SWAP1 SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x2FA3 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x28A6 JUMPI POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD AND ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x2FF2 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO ISZERO JUMPDEST PUSH2 0x300E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4E0F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x3048 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x55D1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE DUP4 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP6 DUP7 AND DUP1 DUP6 MSTORE SWAP3 DUP5 KECCAK256 DUP1 SLOAD SWAP7 SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP7 DUP8 AND OR SWAP1 SSTORE SWAP2 DUP4 SWAP1 MSTORE DUP2 SLOAD SWAP1 SWAP4 AND SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x31A9108F PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND SWAP2 DUP5 AND SWAP1 PUSH4 0x6352211E SWAP1 PUSH2 0x30CB SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x30E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x30F7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x311B SWAP2 SWAP1 PUSH2 0x450E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x3141 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x595E JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 LT ISZERO PUSH2 0x31BC JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP4 SWAP2 SWAP1 DUP4 SWAP1 DUP2 LT PUSH2 0x318B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD EQ ISZERO PUSH2 0x31B4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x57FC JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x3144 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE SWAP1 DUP4 MSTORE SWAP2 KECCAK256 ADD SSTORE JUMP JUMPDEST PUSH1 0x3C DUP2 PUSH4 0xFFFFFFFF AND GT PUSH2 0x320F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x58CB JUMP JUMPDEST PUSH1 0x6B DUP1 SLOAD PUSH4 0xFFFFFFFF NOT AND PUSH4 0xFFFFFFFF DUP4 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x4F27F6F220FFAD585E728389BC2F0F6B74EEEBEB43F95F53752A647CB6E7E687 SWAP3 PUSH2 0xA29 SWAP3 AND SWAP1 PUSH2 0x5A7B JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xE6D8A94B PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xE6D8A94B SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x32A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x32B4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x32D8 SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST SWAP1 POP PUSH2 0x32E3 DUP2 PUSH2 0x3A5D JUMP JUMPDEST SWAP1 POP PUSH1 0x67 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3333 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3347 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x336B SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST PUSH2 0x339E JUMPI PUSH1 0x40 MLOAD PUSH32 0x3728FEB3FC1EF1BF4A24036AFBE7D34B59C551BF0D2AB5564E87EC1734FA80DD SWAP1 PUSH1 0x0 SWAP1 LOG1 POP PUSH2 0xD10 JUMP JUMPDEST PUSH1 0x79 SLOAD PUSH1 0x76 SLOAD PUSH1 0xFF SWAP1 SWAP2 AND SWAP1 PUSH1 0x60 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x33C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x33ED JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x7A SLOAD SWAP1 SWAP2 POP DUP6 SWAP1 PUSH1 0x0 SWAP1 DUP2 SWAP1 JUMPDEST DUP6 DUP4 LT ISZERO PUSH2 0x3598 JUMPI PUSH1 0x67 SLOAD PUSH1 0x40 MLOAD PUSH4 0x3B304147 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x3B304147 SWAP1 PUSH2 0x3435 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x344D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3461 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3485 SWAP2 SWAP1 PUSH2 0x450E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x78 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND PUSH2 0x34E0 JUMPI DUP1 DUP7 DUP6 DUP1 PUSH1 0x1 ADD SWAP7 POP DUP2 MLOAD DUP2 LT PUSH2 0x34BB JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP PUSH2 0x3559 JUMP JUMPDEST DUP2 DUP4 PUSH1 0x1 ADD SWAP4 POP DUP4 LT PUSH2 0x3559 JUMPI PUSH32 0xB5F728FCB182000EB8E953C15F6795F07B6CDA75B35EF0B65645B53AAC636945 DUP5 PUSH1 0x40 MLOAD PUSH2 0x351C SWAP2 SWAP1 PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP4 PUSH2 0x3553 JUMPI PUSH1 0x40 MLOAD PUSH32 0x3728FEB3FC1EF1BF4A24036AFBE7D34B59C551BF0D2AB5564E87EC1734FA80DD SWAP1 PUSH1 0x0 SWAP1 LOG1 JUMPDEST POP PUSH2 0x3598 JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH2 0x209 MUL DUP7 PUSH2 0x1F3 ADD ADD PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x3576 SWAP2 SWAP1 PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SWAP6 POP PUSH2 0x33FC SWAP2 POP POP JUMP JUMPDEST PUSH2 0x35B5 DUP6 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x35A8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x3B0A JUMP JUMPDEST PUSH1 0x0 DUP8 PUSH2 0x35CB JUMPI PUSH2 0x35C6 DUP10 DUP6 PUSH2 0x3996 JUMP JUMPDEST PUSH2 0x35D5 JUMP JUMPDEST PUSH2 0x35D5 DUP10 DUP9 PUSH2 0x3996 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x360F JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x360D JUMPI PUSH2 0x3605 DUP8 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x35F7 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP4 PUSH2 0x3C7A JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x35E0 JUMP JUMPDEST POP JUMPDEST PUSH1 0x77 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x37BE JUMPI PUSH1 0x0 PUSH2 0x3626 PUSH1 0x6E PUSH2 0x3CE7 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x365C JUMPI POP PUSH2 0x3646 PUSH1 0x6E PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x37B8 JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP3 PUSH4 0x70A08231 SWAP3 PUSH2 0x3694 SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4AE0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x36AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x36C0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x36E4 SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP11 PUSH2 0x36FC JUMPI PUSH2 0x36F7 DUP3 DUP9 PUSH2 0x3996 JUMP JUMPDEST PUSH2 0x3706 JUMP JUMPDEST PUSH2 0x3706 DUP3 DUP12 PUSH2 0x3996 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x37A4 JUMPI PUSH1 0x0 JUMPDEST DUP8 DUP2 LT ISZERO PUSH2 0x37A2 JUMPI PUSH1 0x66 SLOAD DUP11 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x2B0AB144 SWAP1 DUP13 SWAP1 DUP5 SWAP1 DUP2 LT PUSH2 0x373C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP7 DUP6 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3764 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4B75 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x377E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3792 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0x3711 SWAP1 POP JUMP JUMPDEST POP JUMPDEST PUSH2 0x37AF PUSH1 0x6E DUP5 PUSH2 0x3D0A JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x3629 JUMP JUMPDEST POP PUSH2 0x37DB JUMP JUMPDEST PUSH2 0x37DB DUP7 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x37CE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x3D2D JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3800 JUMPI POP PUSH2 0x3800 PUSH2 0x2D28 JUMP JUMPDEST DUP1 PUSH2 0x380E JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x382A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x52FB JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3855 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x385D PUSH2 0x3E79 JUMP JUMPDEST PUSH2 0x3865 PUSH2 0x3EFA JUMP JUMPDEST DUP1 ISZERO PUSH2 0xD10 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST DUP1 SLOAD ISZERO PUSH2 0x3898 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x54BC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP2 DUP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x38CC JUMPI POP PUSH1 0x0 PUSH2 0x794 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x38D9 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x28A6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5446 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28A6 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x3FD4 JUMP JUMPDEST NUMBER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3950 DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3970 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x794 JUMPI POP PUSH2 0x3969 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3970 JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x397F DUP6 DUP6 PUSH2 0x400B JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x398D JUMPI POP DUP1 JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x39B7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x51F2 JUMP JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x39C0 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x3A23 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x4100 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xF6A JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x3A41 SWAP2 SWAP1 PUSH2 0x4792 JUMP JUMPDEST PUSH2 0xF6A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5709 JUMP JUMPDEST PUSH1 0x75 SLOAD PUSH1 0x0 SWAP1 DUP3 SWAP1 DUP3 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x3B01 JUMPI PUSH2 0x3A77 PUSH2 0x43F5 JUMP JUMPDEST PUSH1 0x75 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x3A84 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP4 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP5 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP3 DUP5 ADD DUP4 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP4 ADD MSTORE SWAP1 SWAP3 POP PUSH2 0x3AD6 SWAP1 DUP7 SWAP1 PUSH2 0x410F JUMP JUMPDEST SWAP1 POP PUSH2 0x3AEB DUP3 PUSH1 0x0 ADD MLOAD DUP3 DUP5 PUSH1 0x40 ADD MLOAD PUSH2 0x4123 JUMP JUMPDEST PUSH2 0x3AF5 DUP8 DUP3 PUSH2 0x2EC5 JUMP JUMPDEST SWAP7 POP POP POP PUSH1 0x1 ADD PUSH2 0x3A67 JUMP JUMPDEST POP SWAP3 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3B16 PUSH1 0x70 PUSH2 0x3CE7 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x3B4C JUMPI POP PUSH2 0x3B36 PUSH1 0x70 PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x3C70 JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP3 PUSH4 0x70A08231 SWAP3 PUSH2 0x3B84 SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4AE0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3B9C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3BB0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3BD4 SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x3C5D JUMPI PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SWAP1 MLOAD PUSH4 0x16960D55 PUSH1 0xE0 SHL DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x16960D55 SWAP2 PUSH2 0x3C22 SWAP2 DUP8 SWAP2 DUP8 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B0E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3C3C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3C50 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x3C5D DUP3 PUSH2 0x2C52 JUMP JUMPDEST PUSH2 0x3C68 PUSH1 0x70 DUP4 PUSH2 0x3D0A JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3B19 JUMP JUMPDEST PUSH2 0xFCB PUSH1 0x70 PUSH2 0x412E JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x67 SLOAD PUSH1 0x40 MLOAD PUSH4 0x358DC31D PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 PUSH4 0x6B1B863A SWAP3 PUSH2 0x3CB1 SWAP3 DUP8 SWAP3 DUP8 SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4BDD JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3CCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3CDF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3D39 PUSH1 0x6E PUSH2 0x3CE7 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x3D6F JUMPI POP PUSH2 0x3D59 PUSH1 0x6E PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0xFCB JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP3 PUSH4 0x70A08231 SWAP3 PUSH2 0x3DA7 SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4AE0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3DBF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3DD3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3DF7 SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x3E66 JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0xAC2AC51 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x2B0AB144 SWAP1 PUSH2 0x3E33 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B75 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3E4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3E61 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x3E71 PUSH1 0x6E DUP4 PUSH2 0x3D0A JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3D3C JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3E92 JUMPI POP PUSH2 0x3E92 PUSH2 0x2D28 JUMP JUMPDEST DUP1 PUSH2 0x3EA0 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3EBC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x52FB JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3865 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xD10 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3F13 JUMPI POP PUSH2 0x3F13 PUSH2 0x2D28 JUMP JUMPDEST DUP1 PUSH2 0x3F21 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3F3D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x52FB JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3F68 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x3F72 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0xD10 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x3FF5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP2 SWAP1 PUSH2 0x4D4C JUMP JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x4001 JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x4029 SWAP2 SWAP1 PUSH2 0x4D37 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x7530 DUP5 PUSH1 0x40 MLOAD PUSH2 0x407D SWAP2 SWAP1 PUSH2 0x4ABB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x40B9 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x40BE JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x40DC JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x40F9 JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x40F1 SWAP2 SWAP1 PUSH2 0x4792 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x2810 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x41CA JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28A6 PUSH2 0xFFFF DUP4 AND DUP5 MUL PUSH2 0x3E8 PUSH2 0x3996 JUMP JUMPDEST PUSH2 0xF6A DUP4 DUP4 DUP4 PUSH2 0x428B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP1 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x416C JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST ISZERO PUSH2 0x41A2 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP4 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP2 AND SWAP1 SWAP2 SSTORE AND PUSH2 0x414A JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE DUP3 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x41EC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x516A JUMP JUMPDEST PUSH2 0x41F5 DUP6 PUSH2 0x39C8 JUMP JUMPDEST PUSH2 0x4211 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x563E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD PUSH2 0x422E SWAP2 SWAP1 PUSH2 0x4ABB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x426B JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4270 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x4280 DUP3 DUP3 DUP7 PUSH2 0x43BC JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4EB1C245 PUSH1 0xE1 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x9D63848A SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x42D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x42E4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x430C SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4628 JUMP JUMPDEST SWAP1 POP DUP1 MLOAD DUP3 PUSH1 0xFF AND GT ISZERO PUSH2 0x4332 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5675 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH1 0xFF AND DUP2 MLOAD DUP2 LT PUSH2 0x4343 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x358DC31D PUSH1 0xE1 SHL DUP2 MSTORE SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x6B1B863A SWAP1 PUSH2 0x4383 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4BDD JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x439D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x43B1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x43CB JUMPI POP DUP2 PUSH2 0x28A6 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x43DB JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST DUP2 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP2 SWAP1 PUSH2 0x4D4C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST POP DUP1 SLOAD PUSH1 0x0 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0xD10 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x2EC1 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x442F JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x4454 JUMPI DUP1 DUP2 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x446B JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x40F9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4496 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x44A0 PUSH1 0x60 PUSH2 0x5A8C JUMP JUMPDEST SWAP1 POP DUP2 CALLDATALOAD PUSH2 0x44AD DUP2 PUSH2 0x5AFF JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH2 0xFFFF DUP2 AND DUP2 EQ PUSH2 0x44C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x44D6 DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x44E1 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x794 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4503 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x28A6 DUP2 PUSH2 0x5AFF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x451F JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x28A6 DUP2 PUSH2 0x5AFF JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x453F JUMPI DUP3 DUP4 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x454A DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x455A DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x4571 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x458E JUMPI DUP1 DUP2 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x4599 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x45A9 DUP2 PUSH2 0x5B14 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x45C6 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x45D1 DUP2 PUSH2 0x5AFF JUMP JUMPDEST PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD MLOAD SWAP3 SWAP5 SWAP3 SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x45F6 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x4601 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x4618 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x4571 DUP2 PUSH2 0x5AFF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x463A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4650 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x4660 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 MLOAD PUSH2 0x4673 PUSH2 0x466E DUP3 PUSH2 0x5AB3 JUMP JUMPDEST PUSH2 0x5A8C JUMP JUMPDEST DUP2 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP4 DUP6 ADD DUP6 DUP5 MUL DUP6 ADD DUP7 ADD DUP10 LT ISZERO PUSH2 0x468F JUMPI DUP7 DUP8 REVERT JUMPDEST DUP7 SWAP5 POP JUMPDEST DUP4 DUP6 LT ISZERO PUSH2 0x46BA JUMPI DUP1 MLOAD PUSH2 0x46A6 DUP2 PUSH2 0x5AFF JUMP JUMPDEST DUP4 MSTORE PUSH1 0x1 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP2 DUP6 ADD SWAP2 DUP6 ADD PUSH2 0x4693 JUMP JUMPDEST POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x46D8 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x46EE JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x46FA DUP6 DUP3 DUP7 ADD PUSH2 0x4443 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4718 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x472F JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x4742 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x4750 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 PUSH1 0x60 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x4764 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4787 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x28A6 DUP2 PUSH2 0x5B14 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x47A3 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x28A6 DUP2 PUSH2 0x5B14 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x47BF JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND DUP2 EQ PUSH2 0x28A6 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x47E8 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x47F3 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x45A9 DUP2 PUSH2 0x5AFF JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4817 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x4822 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x483D JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x4849 DUP7 DUP3 DUP8 ADD PUSH2 0x4443 JUMP JUMPDEST SWAP5 SWAP8 SWAP1 SWAP7 POP SWAP4 SWAP5 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4867 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x28A6 DUP4 DUP4 PUSH2 0x4485 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x80 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4883 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x488D DUP5 DUP5 PUSH2 0x4485 JUMP JUMPDEST SWAP2 POP PUSH2 0x489C DUP5 PUSH1 0x60 DUP6 ADD PUSH2 0x44E1 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x48B6 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x48CE JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x48EF JUMPI DUP5 DUP6 REVERT JUMPDEST DUP8 CALLDATALOAD SWAP7 POP PUSH1 0x20 DUP1 DUP10 ADD CALLDATALOAD SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x4909 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD PUSH2 0x4919 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH2 0x4929 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP4 POP PUSH1 0xA0 DUP10 ADD CALLDATALOAD PUSH2 0x4939 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP3 POP PUSH1 0xC0 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4954 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP10 ADD PUSH1 0x1F DUP2 ADD DUP12 SGT PUSH2 0x4964 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x4972 PUSH2 0x466E DUP3 PUSH2 0x5AB3 JUMP JUMPDEST DUP2 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP4 DUP6 ADD DUP6 DUP5 MUL DUP6 ADD DUP7 ADD DUP16 LT ISZERO PUSH2 0x498E JUMPI DUP7 DUP8 REVERT JUMPDEST DUP7 SWAP5 POP JUMPDEST DUP4 DUP6 LT ISZERO PUSH2 0x49B9 JUMPI DUP1 CALLDATALOAD PUSH2 0x49A5 DUP2 PUSH2 0x5AFF JUMP JUMPDEST DUP4 MSTORE PUSH1 0x1 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP2 DUP6 ADD SWAP2 DUP6 ADD PUSH2 0x4992 JUMP JUMPDEST POP DUP1 SWAP6 POP POP POP POP POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x49E8 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP8 CALLDATALOAD SWAP7 POP PUSH1 0x20 DUP9 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH2 0x4A01 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP5 POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH2 0x4A11 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP4 POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH2 0x4A21 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP3 POP PUSH1 0xA0 DUP9 ADD CALLDATALOAD PUSH2 0x4A31 DUP2 PUSH2 0x5AFF JUMP JUMPDEST DUP1 SWAP3 POP POP PUSH1 0xC0 DUP9 ADD CALLDATALOAD SWAP1 POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4A59 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x28A6 DUP2 PUSH2 0x5B22 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4A76 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x4A81 DUP2 PUSH2 0x5B22 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH2 0x45A9 DUP2 PUSH2 0x5B22 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH2 0xFFFF AND SWAP1 DUP4 ADD MSTORE PUSH1 0x40 SWAP1 DUP2 ADD MLOAD PUSH1 0xFF AND SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x4ACD DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x5AD3 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND DUP3 MSTORE DUP4 AND PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 PUSH1 0x40 DUP4 ADD DUP2 SWAP1 MSTORE DUP4 SLOAD SWAP1 DUP4 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 DUP5 DUP2 MSTORE DUP3 DUP2 KECCAK256 SWAP1 SWAP3 SWAP1 SWAP2 PUSH1 0x80 DUP6 ADD SWAP2 SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4B67 JUMPI DUP5 SLOAD DUP5 MSTORE PUSH1 0x1 SWAP5 DUP6 ADD SWAP5 SWAP4 DUP4 ADD SWAP4 ADD PUSH2 0x4B4B JUMP JUMPDEST POP SWAP2 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND DUP2 MSTORE SWAP3 DUP5 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 SWAP2 AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE SWAP1 DUP4 AND PUSH1 0x40 DUP4 ADD MSTORE SWAP1 SWAP2 AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4C6C JUMPI DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x4C47 JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4C6C JUMPI PUSH2 0x4CA7 DUP4 DUP6 MLOAD PUSH2 0x4A92 JUMP JUMPDEST SWAP3 DUP5 ADD SWAP3 PUSH1 0x60 SWAP3 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x4C94 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xFB SHL SUB DUP4 GT ISZERO PUSH2 0x4CD9 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH1 0x20 DUP4 MUL DUP1 DUP6 PUSH1 0x40 DUP6 ADD CALLDATACOPY SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP1 DUP2 MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4C6C JUMPI DUP4 MLOAD DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x4D10 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x4D6B DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x5AD3 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x24 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6572633732312D696E76 PUSH1 0x40 DUP3 ADD MSTORE PUSH4 0x185B1A59 PUSH1 0xE2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2C SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F746F6B656E2D6C697374 PUSH1 0x40 DUP3 ADD MSTORE PUSH12 0x195B995C8B5A5B9D985B1A59 PUSH1 0xA2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xF SWAP1 DUP3 ADD MSTORE PUSH15 0x496E76616C69642061646472657373 PUSH1 0x88 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x13 SWAP1 DUP3 ADD MSTORE PUSH19 0x496E76616C6964207072657641646472657373 PUSH1 0x68 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2B SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A652D70657269 PUSH1 0x40 DUP3 ADD MSTORE PUSH11 0x37B216B737BA16B7BB32B9 PUSH1 0xA9 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x646472657373 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2C SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6F6E6C792D6F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH12 0x16B7B916B634B9BA32B732B9 PUSH1 0xA1 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2A SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F73706F6E736F72736869 PUSH1 0x40 DUP3 ADD MSTORE PUSH10 0x702D6E6F742D7A65726F PUSH1 0xB0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x28 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH8 0x34BA16BA37B5B2B7 PUSH1 0xC1 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x34 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A652D70657269 PUSH1 0x40 DUP3 ADD MSTORE PUSH20 0x6F642D677265617465722D7468616E2D7A65726F PUSH1 0x60 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6F6E6C792D7072697A65 PUSH1 0x40 DUP3 ADD MSTORE PUSH5 0xB5C1BDBDB PUSH1 0xDA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7472616E736665722D74 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x3796B9B2B633 PUSH1 0xD1 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1E SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x29 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A652D706F6F6C PUSH1 0x40 DUP3 ADD MSTORE PUSH9 0x2D6E6F742D7A65726F PUSH1 0xB8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x416464726573733A20696E73756666696369656E742062616C616E636520666F PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x1C8818D85B1B PUSH1 0xD2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x22 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D7A65 PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x726F PUSH1 0xF0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1A SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D636F PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x6D706C657465 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x29 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH9 0x1A5D0B5D185C99D95D PUSH1 0xBA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x23 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F65726332302D696E7661 PUSH1 0x40 DUP3 ADD MSTORE PUSH3 0x1B1A59 PUSH1 0xEA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2E SWAP1 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x40 DUP3 ADD MSTORE PUSH14 0x191E481A5B9A5D1A585B1A5E9959 PUSH1 0x92 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F6E6F6E6578697374656E742D7072697A PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x195CDC1B1A5D PUSH1 0xD2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F65726332302D6E756C6C PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2B SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D616C72656164 PUSH1 0x40 DUP3 ADD MSTORE PUSH11 0x1E4B5C995C5D595CDD1959 PUSH1 0xAA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1F SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F77696E6E6572732D6774652D6F6E6500 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x21 SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206D756C7469706C69636174696F6E206F766572666C6F PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x77 PUSH1 0xF8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xC SWAP1 DUP3 ADD MSTORE PUSH12 0x105B1C9958591E481A5B9A5D PUSH1 0xA2 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x33 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH19 0x1A5D0B5C195C98D95B9D1859D94B5D1BDD185B PUSH1 0x6A SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x31 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6265666F726541776172 PUSH1 0x40 DUP3 ADD MSTORE PUSH17 0x19131A5CDD195B995C8B5A5B9D985B1A59 PUSH1 0x7A SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2B SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F63616E6E6F742D617761 PUSH1 0x40 DUP3 ADD MSTORE PUSH11 0x1C990B595E1D195C9B985B PUSH1 0xAA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xD SWAP1 DUP3 ADD MSTORE PUSH13 0x105B1C9958591E481859191959 PUSH1 0x9A SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x53616665436173743A2076616C756520646F65736E27742066697420696E2033 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x322062697473 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2F SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F61776172642D696E7661 PUSH1 0x40 DUP3 ADD MSTORE PUSH15 0xD8D2C85AE8DED6CADC5AD2DCC8CAF PUSH1 0x8B SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7469636B65742D6E6F74 PUSH1 0x40 DUP3 ADD MSTORE PUSH5 0x2D7A65726F PUSH1 0xD8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2A SWAP1 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A204552433230206F7065726174696F6E20646964206E PUSH1 0x40 DUP3 ADD MSTORE PUSH10 0x1BDD081CDD58D8D95959 PUSH1 0xB2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x33 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A655374726174 PUSH1 0x40 DUP3 ADD MSTORE PUSH19 0x1959DE531A5CDD195B995C8B5A5B9D985B1A59 PUSH1 0x6A SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x36 SWAP1 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A20617070726F76652066726F6D206E6F6E2D7A65726F PUSH1 0x40 DUP3 ADD MSTORE PUSH22 0x20746F206E6F6E2D7A65726F20616C6C6F77616E6365 PUSH1 0x50 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6572633732312D647570 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x6C6963617465 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x23 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D696E2D666C69 PUSH1 0x40 DUP3 ADD MSTORE PUSH3 0x19DA1D PUSH1 0xEA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D7469 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x1B59591BDD5D PUSH1 0xD2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2C SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D74696D656F75 PUSH1 0x40 DUP3 ADD MSTORE PUSH12 0x742D67742D36302D73656373 PUSH1 0xA0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x27 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D7265 PUSH1 0x40 DUP3 ADD MSTORE PUSH7 0x1C5D595CDD1959 PUSH1 0xCA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x27 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F756E617661696C61626C PUSH1 0x40 DUP3 ADD MSTORE PUSH7 0x3296BA37B5B2B7 PUSH1 0xC9 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x794 DUP3 DUP5 PUSH2 0x4A92 JUMP JUMPDEST PUSH2 0xFFFF SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0xFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH2 0xFFFF SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0xFF SWAP2 DUP3 AND PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP7 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP8 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x40 DUP5 ADD MSTORE DUP6 DUP2 AND PUSH1 0x60 DUP5 ADD MSTORE DUP5 DUP2 AND PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0xC0 PUSH1 0xA0 DUP5 ADD DUP2 SWAP1 MSTORE DUP5 MLOAD SWAP1 DUP5 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP3 DUP6 DUP2 ADD SWAP3 SWAP1 SWAP2 PUSH1 0xE0 DUP7 ADD SWAP1 DUP6 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x5A69 JUMPI DUP6 MLOAD DUP5 AND DUP4 MSTORE SWAP5 DUP5 ADD SWAP5 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x5A4B JUMP JUMPDEST POP SWAP1 SWAP13 SWAP12 POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5AAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x5AC9 JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5AEE JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x5AD6 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xC70 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xD10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xD10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xD10 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBE CALLDATACOPY ISZERO 0x2A MSIZE RETURN DUP13 SUB 0xD6 PUSH12 0xA04FE9D77A5FB0E1EE0351E6 PUSH11 0x3DB2328C356197EDAD6473 PUSH16 0x6C634300060C00330000000000000000 ",
              "sourceMap": "160:9726:55:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106103c55760003560e01c8063738bbea8116101ff578063b02446821161011a578063d5ad6bf6116100ad578063f2fde38b1161007c578063f2fde38b14610733578063f97700e214610746578063fbf0953e14610759578063ffa1ad741461076c576103c5565b8063d5ad6bf6146106fb578063d605787b14610703578063dfb2f13b1461070b578063eefc8ad114610713576103c5565b8063c2f19ee8116100e9578063c2f19ee8146106c5578063c42b42a0146106cd578063c48ddbcb146106d5578063c6853270146106e8576103c5565b8063b024468214610684578063b221095714610697578063b9ee1e05146106aa578063c25a9c32146106b2576103c5565b80638da5cb5b1161019257806395e5f9ee1161016157806395e5f9ee146106595780639dafafb014610661578063a4e075ca14610669578063acca5b951461067c576103c5565b80638da5cb5b146106165780638e204c431461061e57806394144c6b146106315780639417783f14610639576103c5565b8063884a4448116101ce578063884a4448146105d35780638aa3ec6f146105e65780638acfaca9146105f95780638d5f10c414610601576103c5565b8063738bbea81461059d5780637f2be9fc146105a55780637f4296d7146105b8578063876f5c7e146105cb576103c5565b80634e5d08e0116102ef5780636be51c4f116102825780636f46f221116102515780636f46f2211461057d578063715018a614610585578063719ce73e1461058d57806372f33ea914610595576103c5565b80636be51c4f146105525780636bea53441461055a5780636cc25db7146105625780636dfb03861461056a576103c5565b806362c77a61116102be57806362c77a611461051c5780636696822114610524578063671137c4146105375780636a74f1071461054a576103c5565b80634e5d08e0146104db578063500db70d146104ee57806352a30109146104f6578063605e25ac14610509576103c5565b80632c8fe73d1161036757806347bed9981161033657806347bed998146104a55780634aba4f6b146104b85780634c169f4f146104c05780634d7f3db0146104c8576103c5565b80632c8fe73d1461046057806330fcdf411461046857806338a9b4b61461047d57806342d0920914610490576103c5565b80630faf125f116103a35780630faf125f14610428578063111070e414610430578063152d308c146104385780632a7ad6091461044b576103c5565b806301b48e34146103ca57806301ffc9a7146103f35780630d847fc414610413575b600080fd5b6103dd6103d83660046148a5565b610781565b6040516103ea9190614ad7565b60405180910390f35b6104066104013660046147ae565b61079a565b6040516103ea9190614d2c565b61041b6107d0565b6040516103ea9190614ae0565b6103dd6107df565b6104066107e5565b61040661044636600461457c565b6107f4565b6104536108ab565b6040516103ea9190615a7b565b6103dd6108b7565b61047b6104763660046144f2565b6108c6565b005b61047b61048b366004614776565b61099e565b610498610a34565b6040516103ea9190614c2b565b6103dd6104b33660046148a5565b610a40565b610406610a4b565b61047b610ad4565b61047b6104d63660046145e1565b610b9e565b61047b6104e93660046144f2565b610c76565b61041b610d13565b6104066105043660046148a5565b610d22565b61047b6105173660046144f2565b610db0565b610498610e91565b61047b6105323660046146c6565b610e9d565b61047b6105453660046147d6565b610f6f565b610406610fcf565b61041b610fe8565b610453610ff7565b61041b61100b565b61047b6105783660046148a5565b61101a565b61040661106a565b61047b611073565b61041b6110fc565b6103dd61110b565b610406611111565b61047b6105b33660046149ce565b611164565b61047b6105c63660046144f2565b611208565b6104066112be565b61047b6105e13660046148a5565b6112dd565b61047b6105f43660046144f2565b61132d565b6103dd611405565b61060961140b565b6040516103ea9190614c78565b61041b611490565b61040661062c3660046144f2565b61149f565b6103dd6114b4565b61064c6106473660046144f2565b6114ba565b6040516103ea9190614cf4565b610406611526565b610406611530565b610406610677366004614776565b611539565b6104536115c0565b61047b6106923660046147d6565b6115cc565b61047b6106a536600461452a565b611657565b61047b611728565b61047b6106c0366004614706565b611970565b61041b611cff565b6103dd611d0e565b61047b6106e3366004614803565b611d8b565b61047b6106f6366004614a48565b611f80565b6103dd611fd0565b61041b611fda565b61047b611fe9565b6107266107213660046148a5565b61226b565b6040516103ea91906159a5565b61047b6107413660046144f2565b6122d0565b61047b6107543660046148d5565b612391565b61047b610767366004614871565b6125f2565b610774612791565b6040516103ea9190614d4c565b600061079461078e6127b2565b836127ef565b92915050565b60006001600160e01b031982166301ffc9a760e01b14806107945750506001600160e01b031916600162a1cb1960e01b03191490565b6073546001600160a01b031681565b607a5481565b606a5463ffffffff1615155b90565b60006107fe612818565b6001600160a01b031661080f611490565b6001600160a01b03161461083e5760405162461bcd60e51b815260040161083590615487565b60405180910390fd5b61084661281c565b6001600160a01b03831660008181526078602052604090819020805460ff1916851515179055517fd1ac9a365c0e3bfad562e0a809a5ded3842a2b489f839b3327e4e34ee0128f289061089a908590614d2c565b60405180910390a250600192915050565b606a5463ffffffff1690565b60006108c1612871565b905090565b6108ce612818565b6001600160a01b03166108df611490565b6001600160a01b0316146109055760405162461bcd60e51b815260040161083590615487565b61090d61281c565b6001600160a01b038116158061093857506109386001600160a01b03821663266fce1f60e11b61288a565b6109545760405162461bcd60e51b815260040161083590615535565b607380546001600160a01b0319166001600160a01b0383169081179091556040517fc4feff61630891ea2cb42a54fbe3ff2e65422f2ed17323ac6b65f4521112e87e90600090a250565b6109a6612818565b6001600160a01b03166109b7611490565b6001600160a01b0316146109dd5760405162461bcd60e51b815260040161083590615487565b6109e561281c565b6077805460ff191682151517908190556040517f6959d02e8fb6264d1d39bf37f1e725001f342714933cf38f8627a2442efc43fd91610a299160ff90911690614d2c565b60405180910390a150565b60606108c160706128ad565b60006107948261298d565b606954606a54604051630e866e6f60e21b81526000926001600160a01b031691633a19b9bc91610a849163ffffffff1690600401615a7b565b60206040518083038186803b158015610a9c57600080fd5b505afa158015610ab0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c19190614792565b610adc611111565b610af85760405162461bcd60e51b815260040161083590615885565b606a80546bffffffffffffffffffffffff19811690915560405163ffffffff80831692640100000000900416907fee6702c46c5618e6fc7e625c71f4c85df9c91d456cb16a3aea71ab83b1fee00590600090a160665460405163ffffffff8416916001600160a01b03169033907fd50026ee0824513af20cdf5e72d1fbfbe8fd646ee0576378e080326f1a695e5890610b92908690615a7b565b60405180910390a45050565b6066546001600160a01b0316610bb2612818565b6001600160a01b031614610bd85760405162461bcd60e51b81526004016108359061505f565b6067546001600160a01b0383811691161415610bf657610bf661281c565b6065546001600160a01b031615610c70576065546040516304d7f3db60e41b81526001600160a01b0390911690634d7f3db090610c3d908790879087908790600401614c00565b600060405180830381600087803b158015610c5757600080fd5b505af1158015610c6b573d6000803e3d6000fd5b505050505b50505050565b610c7e611490565b6001600160a01b0316610c8f612818565b6001600160a01b03161480610cbe57506074546001600160a01b0316610cb3612818565b6001600160a01b0316145b80610ce357506073546001600160a01b0316610cd8612818565b6001600160a01b0316145b610cff5760405162461bcd60e51b815260040161083590614ef6565b610d0761281c565b610d10816129d4565b50565b6068546001600160a01b031681565b6000610d2c612818565b6001600160a01b0316610d3d611490565b6001600160a01b031614610d635760405162461bcd60e51b815260040161083590615487565b610d6b61281c565b607a8290556040517f63e4e34f49d12428c03e04e61340c7167e36eb0ff6f0b1970c7544026179403990610da0908490614ad7565b60405180910390a1506001919050565b610db8612818565b6001600160a01b0316610dc9611490565b6001600160a01b031614610def5760405162461bcd60e51b815260040161083590615487565b610df761281c565b6001600160a01b0381161580610e255750610e256001600160a01b038216600162a1cb1960e01b031961288a565b610e415760405162461bcd60e51b815260040161083590614dc3565b606580546001600160a01b0319166001600160a01b0383811691909117918290556040519116907f9fc437aa70ad4ee5f33f6772bf338eed41e21b95435820817ab8b4df161ce4dd90600090a250565b60606108c1606e6128ad565b610ea5611490565b6001600160a01b0316610eb6612818565b6001600160a01b03161480610ee557506074546001600160a01b0316610eda612818565b6001600160a01b0316145b80610f0a57506073546001600160a01b0316610eff612818565b6001600160a01b0316145b610f265760405162461bcd60e51b815260040161083590614ef6565b610f2e61281c565b60005b81811015610f6a57610f62838383818110610f4857fe5b9050602002016020810190610f5d91906144f2565b6129d4565b600101610f31565b505050565b610f77612818565b6001600160a01b0316610f88611490565b6001600160a01b031614610fae5760405162461bcd60e51b815260040161083590615487565b610fb661281c565b610fc260708284612b88565b610fcb82612c52565b5050565b6000610fd96107e5565b80156108c157506108c1610a4b565b6065546001600160a01b031681565b606a54640100000000900463ffffffff1690565b6067546001600160a01b031681565b611022612818565b6001600160a01b0316611033611490565b6001600160a01b0316146110595760405162461bcd60e51b815260040161083590615487565b61106161281c565b610d1081612caa565b60795460ff1681565b61107b612818565b6001600160a01b031661108c611490565b6001600160a01b0316146110b25760405162461bcd60e51b815260040161083590615487565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6066546001600160a01b031681565b606d5481565b606a54600090600160401b900463ffffffff16611130575060006107f1565b606a54606b546111549163ffffffff91821691600160401b909104811690612cff16565b61115c612d24565b1190506107f1565b600054610100900460ff168061117d575061117d612d28565b8061118b575060005460ff16155b6111a75760405162461bcd60e51b8152600401610835906152fb565b600054610100900460ff161580156111d2576000805460ff1961ff0019909116610100171660011790555b60606111e389898989898987612391565b6111ec83612caa565b508015610c6b576000805461ff00191690555050505050505050565b611210612818565b6001600160a01b0316611221611490565b6001600160a01b0316146112475760405162461bcd60e51b815260040161083590615487565b61124f61281c565b6112576107e5565b156112745760405162461bcd60e51b815260040161083590615842565b606980546001600160a01b0319166001600160a01b0383169081179091556040517ff935763cc7c57ee8ed6318ed71e756cca0731294c9f46ff5b386f36d6ff1417a90600090a250565b60006112c8612d33565b80156108c157506112d76107e5565b15905090565b6112e5612818565b6001600160a01b03166112f6611490565b6001600160a01b03161461131c5760405162461bcd60e51b815260040161083590615487565b61132461281c565b610d1081612d4c565b611335612818565b6001600160a01b0316611346611490565b6001600160a01b03161461136c5760405162461bcd60e51b815260040161083590615487565b61137461281c565b6001600160a01b038116158061139f575061139f6001600160a01b038216632ba8396360e11b61288a565b6113bb5760405162461bcd60e51b815260040161083590615753565b607480546001600160a01b0319166001600160a01b0383169081179091556040517fda05d50a3a1ec0ffab059f1d457ae59f68ccfb3ffbb4dad283c516f9103d584b90600090a250565b60765490565b60606075805480602002602001604051908101604052809291908181526020016000905b8282101561148757600084815260209081902060408051606081018252918501546001600160a01b0381168352600160a01b810461ffff1683850152600160b01b900460ff169082015282526001909201910161142f565b50505050905090565b6033546001600160a01b031690565b60786020526000908152604090205460ff1681565b606c5481565b6001600160a01b03811660009081526072602090815260409182902080548351818402810184019094528084526060939283018282801561151a57602002820191906000526020600020905b815481526020019060010190808311611506575b50505050509050919050565b60006108c1612d33565b60775460ff1681565b6000611543612818565b6001600160a01b0316611554611490565b6001600160a01b03161461157a5760405162461bcd60e51b815260040161083590615487565b61158261281c565b6079805460ff19168315151790556040517f2b4b6ffe286f7ce4ccc6b136bb14987b0a00092174d88938a0c667a104a4a73190610da0908490614d2c565b606b5463ffffffff1681565b6115d4612818565b6001600160a01b03166115e5611490565b6001600160a01b03161461160b5760405162461bcd60e51b815260040161083590615487565b61161361281c565b61161f606e8284612b88565b6040516001600160a01b038316907f58982464497acdab11ad29d39907e076b0d3b8daf1d9b734174c7c3a2a0e8c7490600090a25050565b6066546001600160a01b031661166b612818565b6001600160a01b0316146116915760405162461bcd60e51b81526004016108359061505f565b826001600160a01b0316846001600160a01b031614156116c35760405162461bcd60e51b8152600401610835906150a4565b6067546001600160a01b03828116911614156116e1576116e161281c565b6065546001600160a01b031615610c705760655460405163b221095760e01b81526001600160a01b039091169063b221095790610c3d908790879087908790600401614b99565b611730612d33565b61174c5760405162461bcd60e51b815260040161083590614e65565b6117546107e5565b156117715760405162461bcd60e51b8152600401610835906153c4565b60695460408051630d37b53760e01b8152815160009384936001600160a01b0390911692630d37b5379260048083019392829003018186803b1580156117b657600080fd5b505afa1580156117ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ee91906145b4565b90925090506001600160a01b0382161580159061180b5750600081115b1561182a5760695461182a906001600160a01b03848116911683612da1565b6069546040805163433c53d960e11b8152815160009384936001600160a01b0390911692638678a7b2926004808301939282900301818787803b15801561187057600080fd5b505af1158015611884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a89190614a64565b606a805463ffffffff8084166401000000000267ffffffff000000001991861663ffffffff19909316929092171617905590925090506118ee6118e9612d24565b612e9b565b606a80546bffffffff00000000000000001916600160401b63ffffffff93841602179055606654908316906001600160a01b031661192a612818565b6001600160a01b03167f4d31e658dcf617bb3a3c8cf7c6dddb33f7030ac588e271631ecdb5d76c2e91ef846040516119629190615a7b565b60405180910390a450505050565b611978612818565b6001600160a01b0316611989611490565b6001600160a01b0316146119af5760405162461bcd60e51b815260040161083590615487565b8060005b81811015611c54576119c36143f5565b8484838181106119cf57fe5b9050606002018036038101906119e59190614856565b90506001816040015160ff161115611a0f5760405162461bcd60e51b815260040161083590614fc3565b80516001600160a01b0316611a365760405162461bcd60e51b81526004016108359061526f565b6075548210611ad2576075805460018101825560009190915281517f9a8d93986a7b9e6294572ea6736696119c195c1a9f5eae642d3c5fcd44e49dea90910180546020840151604085015160ff16600160b01b0260ff60b01b1961ffff909216600160a01b0261ffff60a01b196001600160a01b039096166001600160a01b031990941693909317949094169190911716919091179055611bf9565b611ada6143f5565b60758381548110611ae757fe5b60009182526020918290206040805160608101825292909101546001600160a01b03808216808552600160a01b830461ffff1695850195909552600160b01b90910460ff1691830191909152845191935016141580611b565750806020015161ffff16826020015161ffff1614155b80611b6f5750806040015160ff16826040015160ff1614155b15611bf0578160758481548110611b8257fe5b6000918252602091829020835191018054928401516040909401516001600160a01b03199093166001600160a01b039092169190911761ffff60a01b1916600160a01b61ffff909416939093029290921760ff60b01b1916600160b01b60ff90921691909102179055611bf7565b5050611c4c565b505b80600001516001600160a01b03167fc1bf93444a0055a24a7d0154b75fedf78edfe355c06a2ce8e47f9f39087205598260200151836040015185604051611c42939291906159b3565b60405180910390a2505b6001016119b3565b505b607554811015611cd157607554600090611c71906001612ec5565b90506075805480611c7e57fe5b600082815260208120820160001990810180546001600160b81b031916905590910190915560405182917f99fa473fdf53414bcd014cf6e7509fc58c68f7b86174767faa6ad5100cd5bae591a250611c56565b6000611cdb612eed565b90506103e8811115610c705760405162461bcd60e51b8152600401610835906154e2565b6074546001600160a01b031681565b606654604080516318c1996d60e21b815290516000926001600160a01b03169163630665b4916004808301926020929190829003018186803b158015611d5357600080fd5b505afa158015611d67573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c191906148bd565b611d93611490565b6001600160a01b0316611da4612818565b6001600160a01b03161480611dd357506074546001600160a01b0316611dc8612818565b6001600160a01b0316145b80611df857506073546001600160a01b0316611ded612818565b6001600160a01b0316145b611e145760405162461bcd60e51b815260040161083590614ef6565b611e1c61281c565b606654604051636a3fd4f960e01b81526001600160a01b0390911690636a3fd4f990611e4c908690600401614ae0565b60206040518083038186803b158015611e6457600080fd5b505afa158015611e78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9c9190614792565b611eb85760405162461bcd60e51b815260040161083590615586565b611ed26001600160a01b0384166380ac58cd60e01b61288a565b611eee5760405162461bcd60e51b815260040161083590614d7f565b611ef9607084612f7f565b611f0857611f08607084612fd0565b60005b81811015611f3757611f2f84848484818110611f2357fe5b90506020020135613098565b600101611f0b565b50826001600160a01b03167f51541dc4b4c08a16085809cccdc4cc77d8000b60fbb00142e57f236d842986758383604051611f73929190614cba565b60405180910390a2505050565b611f88612818565b6001600160a01b0316611f99611490565b6001600160a01b031614611fbf5760405162461bcd60e51b815260040161083590615487565b611fc761281c565b610d10816131e9565b60006108c16127b2565b6069546001600160a01b031681565b611ff16107e5565b61200d5760405162461bcd60e51b815260040161083590615917565b612015610a4b565b6120315760405162461bcd60e51b815260040161083590615229565b606954606a546040516313a54bf360e31b81526000926001600160a01b031691639d2a5f989161206a9163ffffffff1690600401615a7b565b602060405180830381600087803b15801561208457600080fd5b505af1158015612098573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120bc91906148bd565b606a80546bffffffffffffffffffffffff191690556073549091506001600160a01b03161561214c57607354606d5460405163266fce1f60e11b81526001600160a01b0390921691634cdf9c3e91612119918591906004016159f1565b600060405180830381600087803b15801561213357600080fd5b505af1158015612147573d6000803e3d6000fd5b505050505b6121558161325a565b6074546001600160a01b0316156121cd57607454606d54604051632ba8396360e11b81526001600160a01b039092169163575072c69161219a918591906004016159f1565b600060405180830381600087803b1580156121b457600080fd5b505af11580156121c8573d6000803e3d6000fd5b505050505b6121dd6121d8612d24565b61298d565b606d556121e8612818565b6001600160a01b03167f9c4163ece98173eab9a496c4db8bf3e2c8edcc5d2854377880597ccb858b7a9d826040516122209190614ad7565b60405180910390a2606d54612233612818565b6001600160a01b03167fc61852c20f0b03b31d782f3022f2bf20322ac17ce66c5349fb6e24740cdd645660405160405180910390a350565b6122736143f5565b6075828154811061228057fe5b60009182526020918290206040805160608101825292909101546001600160a01b0381168352600160a01b810461ffff1693830193909352600160b01b90920460ff169181019190915292915050565b6122d8612818565b6001600160a01b03166122e9611490565b6001600160a01b03161461230f5760405162461bcd60e51b815260040161083590615487565b6001600160a01b0381166123355760405162461bcd60e51b815260040161083590614eb0565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff16806123aa57506123aa612d28565b806123b8575060005460ff16155b6123d45760405162461bcd60e51b8152600401610835906152fb565b600054610100900460ff161580156123ff576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0386166124255760405162461bcd60e51b815260040161083590615121565b6001600160a01b03851661244b5760405162461bcd60e51b8152600401610835906156c4565b6001600160a01b0384166124715760405162461bcd60e51b815260040161083590614f79565b6001600160a01b0383166124975760405162461bcd60e51b8152600401610835906151b0565b606680546001600160a01b038089166001600160a01b031992831617909255606780548884169083161790556069805486841690831617905560688054928716929091169190911790556124ea87612d4c565b6124f26137e7565b6124fc606e613879565b60005b825181101561252c5761252483828151811061251757fe5b60200260200101516129d4565b6001016124ff565b50606c879055606d8890556125416070613879565b61254c6107086131e9565b856001600160a01b03167ff9632d212436344a25150ff0c161dabf412aade556621c2dea146ca63ff643f589898888888860405161258f969594939291906159ff565b60405180910390a2606d546125a2612818565b6001600160a01b03167fc61852c20f0b03b31d782f3022f2bf20322ac17ce66c5349fb6e24740cdd645660405160405180910390a38015610c6b576000805461ff00191690555050505050505050565b6125fa612818565b6001600160a01b031661260b611490565b6001600160a01b0316146126315760405162461bcd60e51b815260040161083590615487565b60755460ff8216106126555760405162461bcd60e51b815260040161083590615349565b6001826040015160ff16111561267d5760405162461bcd60e51b815260040161083590614fc3565b81516001600160a01b03166126a45760405162461bcd60e51b81526004016108359061526f565b8160758260ff16815481106126b557fe5b600091825260208083208451920180549185015160409095015160ff16600160b01b0260ff60b01b1961ffff909616600160a01b0261ffff60a01b196001600160a01b039095166001600160a01b03199094169390931793909316919091179390931617909155612724612eed565b90506103e88111156127485760405162461bcd60e51b8152600401610835906154e2565b82600001516001600160a01b03167fc1bf93444a0055a24a7d0154b75fedf78edfe355c06a2ce8e47f9f39087205598460200151856040015185604051611f73939291906159d2565b60405180604001604052806005815260200164332e342e3560d81b81525081565b6000806127bd612871565b905060006127c9612d24565b9050818111156127de576000925050506107f1565b6127e88282612ec5565b9250505090565b600080612804670de0b6b3a7640000856138bd565b905061281081846138f7565b949350505050565b3390565b6000612826613939565b606a54909150640100000000900463ffffffff1615806128555750606a54640100000000900463ffffffff1681105b610d105760405162461bcd60e51b815260040161083590615842565b60006108c1606c54606d54612cff90919063ffffffff16565b60006128958361393d565b80156128a657506128a68383613970565b9392505050565b606080826000015467ffffffffffffffff811180156128cb57600080fd5b506040519080825280602002602001820160405280156128f5578160200160208202803683370190505b50600160008181529085016020526040812054919250906001600160a01b03165b6001600160a01b0381161580159061293857506001600160a01b038116600114155b15612984578083838151811061294a57fe5b6001600160a01b03928316602091820292909201810191909152918116600090815260018088019093526040902054929091019116612916565b50909392505050565b6000806129b1606c546129ab606d5486612ec590919063ffffffff16565b90613996565b90506128a66129cb606c54836138bd90919063ffffffff16565b606d5490612cff565b6129e6816001600160a01b03166139c8565b612a025760405162461bcd60e51b81526004016108359061538f565b606654604051636a3fd4f960e01b81526001600160a01b0390911690636a3fd4f990612a32908490600401614ae0565b60206040518083038186803b158015612a4a57600080fd5b505afa158015612a5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a829190614792565b612a9e5760405162461bcd60e51b815260040161083590615586565b60408051600481526024810182526020810180516001600160e01b03166318160ddd60e01b17905290516000916060916001600160a01b03851691612ae291614abb565b600060405180830381855afa9150503d8060008114612b1d576040519150601f19603f3d011682016040523d82523d6000602084013e612b22565b606091505b509150915081612b445760405162461bcd60e51b8152600401610835906152b8565b612b4f606e84612fd0565b6040516001600160a01b038416907fbcd6d991f3416e288bf59a2997b423772937b62c7ea7dd1a54af7771de1f741890600090a2505050565b6001600160a01b038116600114801590612baa57506001600160a01b03811615155b612bc65760405162461bcd60e51b815260040161083590614e0f565b6001600160a01b038281166000908152600185016020526040902054811690821614612c045760405162461bcd60e51b815260040161083590614e38565b6001600160a01b039081166000818152600185016020526040808220805495851683529082208054959094166001600160a01b03199586161790935552805490911690558054600019019055565b6001600160a01b0381166000908152607260205260408120612c7391614415565b6040516001600160a01b038216907fcd64d9dacd230c5ccf1278ea5332b0621aa28c950fb0e61c8fbc9e2011c88a3490600090a250565b60008111612cca5760405162461bcd60e51b81526004016108359061540f565b60768190556040517fc44c7222e8df09744ced394101df47e78dedb642d3065267bb388901de9df6d490610a29908390614ad7565b6000828201838110156128a65760405162461bcd60e51b815260040161083590614f42565b4290565b60006112d7306139c8565b6000612d3d612871565b612d45612d24565b1015905090565b60008111612d6c5760405162461bcd60e51b81526004016108359061500b565b606c8190556040517f0d379c1a7282461e725a9dc2d74e65246c77e98ae93835e26c2f1654c48ee4ec90610a29908390614ad7565b801580612e295750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90612dd79030908690600401614af4565b60206040518083038186803b158015612def57600080fd5b505afa158015612e03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e2791906148bd565b155b612e455760405162461bcd60e51b8152600401610835906157a6565b610f6a8363095ea7b360e01b8484604051602401612e64929190614bc4565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526139ce565b60006401000000008210612ec15760405162461bcd60e51b8152600401610835906155f8565b5090565b600082821115612ee75760405162461bcd60e51b8152600401610835906150ea565b50900390565b6075546000908190815b818160ff161015612f7757612f0a6143f5565b60758260ff1681548110612f1a57fe5b60009182526020918290206040805160608101825292909101546001600160a01b0381168352600160a01b810461ffff16938301849052600160b01b900460ff16908201529150612f6c908590612cff565b935050600101612ef7565b509091505090565b60006001600160a01b038216600114801590612fa357506001600160a01b03821615155b80156128a65750506001600160a01b03908116600090815260019290920160205260409091205416151590565b6001600160a01b038116600114801590612ff257506001600160a01b03811615155b61300e5760405162461bcd60e51b815260040161083590614e0f565b6001600160a01b03818116600090815260018401602052604090205416156130485760405162461bcd60e51b8152600401610835906155d1565b60016000818152838201602052604080822080546001600160a01b039586168085529284208054969091166001600160a01b03199687161790559183905281549093169092179091558154019055565b6066546040516331a9108f60e11b81526001600160a01b0391821691841690636352211e906130cb908590600401614ad7565b60206040518083038186803b1580156130e357600080fd5b505afa1580156130f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061311b919061450e565b6001600160a01b0316146131415760405162461bcd60e51b81526004016108359061595e565b60005b6001600160a01b0383166000908152607260205260409020548110156131bc576001600160a01b038316600090815260726020526040902080548391908390811061318b57fe5b906000526020600020015414156131b45760405162461bcd60e51b8152600401610835906157fc565b600101613144565b506001600160a01b0390911660009081526072602090815260408220805460018101825590835291200155565b603c8163ffffffff161161320f5760405162461bcd60e51b8152600401610835906158cb565b606b805463ffffffff191663ffffffff83811691909117918290556040517f4f27f6f220ffad585e728389bc2f0f6b74eeebeb43f95f53752a647cb6e7e68792610a29921690615a7b565b6066546040805163e6d8a94b60e01b815290516000926001600160a01b03169163e6d8a94b91600480830192602092919082900301818787803b1580156132a057600080fd5b505af11580156132b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132d891906148bd565b90506132e381613a5d565b9050606760009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561333357600080fd5b505afa158015613347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061336b91906148bd565b61339e576040517f3728feb3fc1ef1bf4a24036afbe7d34b59c551bf0d2ab5564e87ec1734fa80dd90600090a150610d10565b60795460765460ff9091169060608167ffffffffffffffff811180156133c357600080fd5b506040519080825280602002602001820160405280156133ed578160200160208202803683370190505b50607a54909150859060009081905b8583101561359857606754604051633b30414760e01b81526000916001600160a01b031690633b30414790613435908890600401614ad7565b60206040518083038186803b15801561344d57600080fd5b505afa158015613461573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613485919061450e565b6001600160a01b03811660009081526078602052604090205490915060ff166134e057808685806001019650815181106134bb57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050613559565b818360010193508310613559577fb5f728fcb182000eb8e953c15f6795f07b6cda75b35ef0b65645b53aac6369458460405161351c9190614ad7565b60405180910390a183613553576040517f3728feb3fc1ef1bf4a24036afbe7d34b59c551bf0d2ab5564e87ec1734fa80dd90600090a15b50613598565b60008461020902866101f301016040516020016135769190614ad7565b60408051601f19818403018152919052805160209091012095506133fc915050565b6135b5856000815181106135a857fe5b6020026020010151613b0a565b6000876135cb576135c68985613996565b6135d5565b6135d58988613996565b9050801561360f5760005b8481101561360d576136058782815181106135f757fe5b602002602001015183613c7a565b6001016135e0565b505b60775460ff16156137be576000613626606e613ce7565b90505b6001600160a01b0381161580159061365c5750613646606e613d04565b6001600160a01b0316816001600160a01b031614155b156137b8576066546040516370a0823160e01b81526000916001600160a01b03808516926370a0823192613694921690600401614ae0565b60206040518083038186803b1580156136ac57600080fd5b505afa1580156136c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136e491906148bd565b905060008a6136fc576136f78288613996565b613706565b613706828b613996565b905080156137a45760005b878110156137a2576066548a516001600160a01b0390911690632b0ab144908c908490811061373c57fe5b602002602001015186856040518463ffffffff1660e01b815260040161376493929190614b75565b600060405180830381600087803b15801561377e57600080fd5b505af1158015613792573d6000803e3d6000fd5b5050600190920191506137119050565b505b6137af606e84613d0a565b92505050613629565b506137db565b6137db866000815181106137ce57fe5b6020026020010151613d2d565b50505050505050505050565b600054610100900460ff16806138005750613800612d28565b8061380e575060005460ff16155b61382a5760405162461bcd60e51b8152600401610835906152fb565b600054610100900460ff16158015613855576000805460ff1961ff0019909116610100171660011790555b61385d613e79565b613865613efa565b8015610d10576000805461ff001916905550565b8054156138985760405162461bcd60e51b8152600401610835906154bc565b60016000818152918101602052604090912080546001600160a01b0319169091179055565b6000826138cc57506000610794565b828202828482816138d957fe5b04146128a65760405162461bcd60e51b815260040161083590615446565b60006128a683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613fd4565b4390565b6000613950826301ffc9a760e01b613970565b80156107945750613969826001600160e01b0319613970565b1592915050565b600080600061397f858561400b565b9150915081801561398d5750805b95945050505050565b60008082116139b75760405162461bcd60e51b8152600401610835906151f2565b8183816139c057fe5b049392505050565b3b151590565b6060613a23826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166141009092919063ffffffff16565b805190915015610f6a5780806020019051810190613a419190614792565b610f6a5760405162461bcd60e51b815260040161083590615709565b6075546000908290825b81811015613b0157613a776143f5565b60758281548110613a8457fe5b600091825260208083206040805160608101825293909101546001600160a01b0381168452600160a01b810461ffff16928401839052600160b01b900460ff1690830152909250613ad690869061410f565b9050613aeb8260000151828460400151614123565b613af58782612ec5565b96505050600101613a67565b50929392505050565b6000613b166070613ce7565b90505b6001600160a01b03811615801590613b4c5750613b366070613d04565b6001600160a01b0316816001600160a01b031614155b15613c70576066546040516370a0823160e01b81526000916001600160a01b03808516926370a0823192613b84921690600401614ae0565b60206040518083038186803b158015613b9c57600080fd5b505afa158015613bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bd491906148bd565b90508015613c5d576066546001600160a01b038381166000908152607260205260409081902090516316960d5560e01b815291909216916316960d5591613c22918791879190600401614b0e565b600060405180830381600087803b158015613c3c57600080fd5b505af1158015613c50573d6000803e3d6000fd5b50505050613c5d82612c52565b613c68607083613d0a565b915050613b19565b610fcb607061412e565b60665460675460405163358dc31d60e11b81526001600160a01b0392831692636b1b863a92613cb192879287921690600401614bdd565b600060405180830381600087803b158015613ccb57600080fd5b505af1158015613cdf573d6000803e3d6000fd5b505050505050565b60016000818152910160205260409020546001600160a01b031690565b50600190565b6001600160a01b0380821660009081526001840160205260409020541692915050565b6000613d39606e613ce7565b90505b6001600160a01b03811615801590613d6f5750613d59606e613d04565b6001600160a01b0316816001600160a01b031614155b15610fcb576066546040516370a0823160e01b81526000916001600160a01b03808516926370a0823192613da7921690600401614ae0565b60206040518083038186803b158015613dbf57600080fd5b505afa158015613dd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613df791906148bd565b90508015613e6657606654604051630ac2ac5160e21b81526001600160a01b0390911690632b0ab14490613e3390869086908690600401614b75565b600060405180830381600087803b158015613e4d57600080fd5b505af1158015613e61573d6000803e3d6000fd5b505050505b613e71606e83613d0a565b915050613d3c565b600054610100900460ff1680613e925750613e92612d28565b80613ea0575060005460ff16155b613ebc5760405162461bcd60e51b8152600401610835906152fb565b600054610100900460ff16158015613865576000805460ff1961ff0019909116610100171660011790558015610d10576000805461ff001916905550565b600054610100900460ff1680613f135750613f13612d28565b80613f21575060005460ff16155b613f3d5760405162461bcd60e51b8152600401610835906152fb565b600054610100900460ff16158015613f68576000805460ff1961ff0019909116610100171660011790555b6000613f72612818565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610d10576000805461ff001916905550565b60008183613ff55760405162461bcd60e51b81526004016108359190614d4c565b50600083858161400157fe5b0495945050505050565b60008060606301ffc9a760e01b846040516024016140299190614d37565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060866001600160a01b03166175308460405161407d9190614abb565b6000604051808303818686fa925050503d80600081146140b9576040519150601f19603f3d011682016040523d82523d6000602084013e6140be565b606091505b50915091506020815110156140dc57600080945094505050506140f9565b81818060200190518101906140f19190614792565b945094505050505b9250929050565b606061281084846000856141ca565b60006128a661ffff831684026103e8613996565b610f6a83838361428b565b6001600081815290820160205260409020546001600160a01b03165b6001600160a01b0381161580159061416c57506001600160a01b038116600114155b156141a2576001600160a01b039081166000908152600183016020526040902080546001600160a01b031981169091551661414a565b50600160008181528282016020526040812080546001600160a01b0319169092179091559055565b6060824710156141ec5760405162461bcd60e51b81526004016108359061516a565b6141f5856139c8565b6142115760405162461bcd60e51b81526004016108359061563e565b60006060866001600160a01b0316858760405161422e9190614abb565b60006040518083038185875af1925050503d806000811461426b576040519150601f19603f3d011682016040523d82523d6000602084013e614270565b606091505b50915091506142808282866143bc565b979650505050505050565b60665460408051634eb1c24560e11b815290516060926001600160a01b031691639d63848a916004808301926000929190829003018186803b1580156142d057600080fd5b505afa1580156142e4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261430c9190810190614628565b905080518260ff1611156143325760405162461bcd60e51b815260040161083590615675565b6000818360ff168151811061434357fe5b602090810291909101015160665460405163358dc31d60e11b81529192506001600160a01b031690636b1b863a9061438390889088908690600401614bdd565b600060405180830381600087803b15801561439d57600080fd5b505af11580156143b1573d6000803e3d6000fd5b505050505050505050565b606083156143cb5750816128a6565b8251156143db5782518084602001fd5b8160405162461bcd60e51b81526004016108359190614d4c565b604080516060810182526000808252602082018190529181019190915290565b5080546000825590600052602060002090810190610d1091905b80821115612ec1576000815560010161442f565b60008083601f840112614454578081fd5b50813567ffffffffffffffff81111561446b578182fd5b60208301915083602080830285010111156140f957600080fd5b600060608284031215614496578081fd5b6144a06060615a8c565b905081356144ad81615aff565b8152602082013561ffff811681146144c457600080fd5b60208201526144d683604084016144e1565b604082015292915050565b803560ff8116811461079457600080fd5b600060208284031215614503578081fd5b81356128a681615aff565b60006020828403121561451f578081fd5b81516128a681615aff565b6000806000806080858703121561453f578283fd5b843561454a81615aff565b9350602085013561455a81615aff565b925060408501359150606085013561457181615aff565b939692955090935050565b6000806040838503121561458e578081fd5b823561459981615aff565b915060208301356145a981615b14565b809150509250929050565b600080604083850312156145c6578182fd5b82516145d181615aff565b6020939093015192949293505050565b600080600080608085870312156145f6578182fd5b843561460181615aff565b935060208501359250604085013561461881615aff565b9150606085013561457181615aff565b6000602080838503121561463a578182fd5b825167ffffffffffffffff811115614650578283fd5b8301601f81018513614660578283fd5b805161467361466e82615ab3565b615a8c565b818152838101908385018584028501860189101561468f578687fd5b8694505b838510156146ba5780516146a681615aff565b835260019490940193918501918501614693565b50979650505050505050565b600080602083850312156146d8578182fd5b823567ffffffffffffffff8111156146ee578283fd5b6146fa85828601614443565b90969095509350505050565b60008060208385031215614718578182fd5b823567ffffffffffffffff8082111561472f578384fd5b818501915085601f830112614742578384fd5b813581811115614750578485fd5b866020606083028501011115614764578485fd5b60209290920196919550909350505050565b600060208284031215614787578081fd5b81356128a681615b14565b6000602082840312156147a3578081fd5b81516128a681615b14565b6000602082840312156147bf578081fd5b81356001600160e01b0319811681146128a6578182fd5b600080604083850312156147e8578182fd5b82356147f381615aff565b915060208301356145a981615aff565b600080600060408486031215614817578081fd5b833561482281615aff565b9250602084013567ffffffffffffffff81111561483d578182fd5b61484986828701614443565b9497909650939450505050565b600060608284031215614867578081fd5b6128a68383614485565b60008060808385031215614883578182fd5b61488d8484614485565b915061489c84606085016144e1565b90509250929050565b6000602082840312156148b6578081fd5b5035919050565b6000602082840312156148ce578081fd5b5051919050565b600080600080600080600060e0888a0312156148ef578485fd5b873596506020808901359650604089013561490981615aff565b9550606089013561491981615aff565b9450608089013561492981615aff565b935060a089013561493981615aff565b925060c089013567ffffffffffffffff811115614954578283fd5b8901601f81018b13614964578283fd5b803561497261466e82615ab3565b81815283810190838501858402850186018f101561498e578687fd5b8694505b838510156149b95780356149a581615aff565b835260019490940193918501918501614992565b50809550505050505092959891949750929550565b600080600080600080600060e0888a0312156149e8578081fd5b87359650602088013595506040880135614a0181615aff565b94506060880135614a1181615aff565b93506080880135614a2181615aff565b925060a0880135614a3181615aff565b8092505060c0880135905092959891949750929550565b600060208284031215614a59578081fd5b81356128a681615b22565b60008060408385031215614a76578182fd5b8251614a8181615b22565b60208401519092506145a981615b22565b80516001600160a01b0316825260208082015161ffff169083015260409081015160ff16910152565b60008251614acd818460208701615ad3565b9190910192915050565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03848116825283166020808301919091526060604083018190528354908301819052600084815282812090929091608085019190845b81811015614b6757845484526001948501949383019301614b4b565b509198975050505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03948516815292841660208401526040830191909152909116606082015260800190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6001600160a01b03948516815260208101939093529083166040830152909116606082015260800190565b6020808252825182820181905260009190848201906040850190845b81811015614c6c5783516001600160a01b031683529284019291840191600101614c47565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614c6c57614ca7838551614a92565b9284019260609290920191600101614c94565b6020808252810182905260006001600160fb1b03831115614cd9578081fd5b60208302808560408501379190910160400190815292915050565b6020808252825182820181905260009190848201906040850190845b81811015614c6c57835183529284019291840191600101614d10565b901515815260200190565b6001600160e01b031991909116815260200190565b6000602082528251806020840152614d6b816040850160208701615ad3565b601f01601f19169190910160400192915050565b60208082526024908201527f506572696f6469635072697a6553747261746567792f6572633732312d696e76604082015263185b1a5960e21b606082015260800190565b6020808252602c908201527f506572696f6469635072697a6553747261746567792f746f6b656e2d6c69737460408201526b195b995c8b5a5b9d985b1a5960a21b606082015260800190565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b602080825260139082015272496e76616c696420707265764164647265737360681b604082015260600190565b6020808252602b908201527f506572696f6469635072697a6553747261746567792f7072697a652d7065726960408201526a37b216b737ba16b7bb32b960a91b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252602c908201527f506572696f6469635072697a6553747261746567792f6f6e6c792d6f776e657260408201526b16b7b916b634b9ba32b732b960a11b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252602a908201527f506572696f6469635072697a6553747261746567792f73706f6e736f72736869604082015269702d6e6f742d7a65726f60b01b606082015260800190565b60208082526028908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c60408201526734ba16ba37b5b2b760c11b606082015260800190565b60208082526034908201527f506572696f6469635072697a6553747261746567792f7072697a652d706572696040820152736f642d677265617465722d7468616e2d7a65726f60601b606082015260800190565b60208082526025908201527f506572696f6469635072697a6553747261746567792f6f6e6c792d7072697a656040820152640b5c1bdbdb60da1b606082015260800190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f7472616e736665722d746040820152653796b9b2b63360d11b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526029908201527f506572696f6469635072697a6553747261746567792f7072697a652d706f6f6c6040820152682d6e6f742d7a65726f60b81b606082015260800190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526022908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d7a65604082015261726f60f01b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d636f6040820152656d706c65746560d01b606082015260800190565b60208082526029908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c6040820152681a5d0b5d185c99d95d60ba1b606082015260800190565b60208082526023908201527f506572696f6469635072697a6553747261746567792f65726332302d696e76616040820152621b1a5960ea1b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526026908201527f4d756c7469706c6557696e6e6572732f6e6f6e6578697374656e742d7072697a604082015265195cdc1b1a5d60d21b606082015260800190565b6020808252818101527f506572696f6469635072697a6553747261746567792f65726332302d6e756c6c604082015260600190565b6020808252602b908201527f506572696f6469635072697a6553747261746567792f726e672d616c7265616460408201526a1e4b5c995c5d595cdd195960aa1b606082015260800190565b6020808252601f908201527f4d756c7469706c6557696e6e6572732f77696e6e6572732d6774652d6f6e6500604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600c908201526b105b1c9958591e481a5b9a5d60a21b604082015260600190565b60208082526033908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c6040820152721a5d0b5c195c98d95b9d1859d94b5d1bdd185b606a1b606082015260800190565b60208082526031908201527f506572696f6469635072697a6553747261746567792f6265666f72654177617260408201527019131a5cdd195b995c8b5a5b9d985b1a59607a1b606082015260800190565b6020808252602b908201527f506572696f6469635072697a6553747261746567792f63616e6e6f742d61776160408201526a1c990b595e1d195c9b985b60aa1b606082015260800190565b6020808252600d908201526c105b1c9958591e481859191959609a1b604082015260600190565b60208082526026908201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360408201526532206269747360d01b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602f908201527f506572696f6469635072697a6553747261746567792f61776172642d696e766160408201526e0d8d2c85ae8ded6cadc5ad2dcc8caf608b1b606082015260800190565b60208082526025908201527f506572696f6469635072697a6553747261746567792f7469636b65742d6e6f746040820152642d7a65726f60d81b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526033908201527f506572696f6469635072697a6553747261746567792f7072697a6553747261746040820152721959de531a5cdd195b995c8b5a5b9d985b1a59606a1b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f6572633732312d6475706040820152656c696361746560d01b606082015260800190565b60208082526023908201527f506572696f6469635072697a6553747261746567792f726e672d696e2d666c6960408201526219da1d60ea1b606082015260800190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d74696040820152651b59591bdd5d60d21b606082015260800190565b6020808252602c908201527f506572696f6469635072697a6553747261746567792f726e672d74696d656f7560408201526b742d67742d36302d7365637360a01b606082015260800190565b60208082526027908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d72656040820152661c5d595cdd195960ca1b606082015260800190565b60208082526027908201527f506572696f6469635072697a6553747261746567792f756e617661696c61626c6040820152663296ba37b5b2b760c91b606082015260800190565b606081016107948284614a92565b61ffff93909316835260ff919091166020830152604082015260600190565b61ffff93909316835260ff918216602084015216604082015260600190565b918252602082015260400190565b86815260208082018790526001600160a01b0386811660408401528581166060840152848116608084015260c060a08401819052845190840181905260009285810192909160e0860190855b81811015615a69578551841683529484019491840191600101615a4b565b50909c9b505050505050505050505050565b63ffffffff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615aab57600080fd5b604052919050565b600067ffffffffffffffff821115615ac9578081fd5b5060209081020190565b60005b83811015615aee578181015183820152602001615ad6565b83811115610c705750506000910152565b6001600160a01b0381168114610d1057600080fd5b8015158114610d1057600080fd5b63ffffffff81168114610d1057600080fdfea2646970667358221220be37152a59f38c03d66ba04fe9d77a5fb0e1ee0351e66a3db2328c356197edad64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x3C5 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x738BBEA8 GT PUSH2 0x1FF JUMPI DUP1 PUSH4 0xB0244682 GT PUSH2 0x11A JUMPI DUP1 PUSH4 0xD5AD6BF6 GT PUSH2 0xAD JUMPI DUP1 PUSH4 0xF2FDE38B GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x733 JUMPI DUP1 PUSH4 0xF97700E2 EQ PUSH2 0x746 JUMPI DUP1 PUSH4 0xFBF0953E EQ PUSH2 0x759 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x76C JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0xD5AD6BF6 EQ PUSH2 0x6FB JUMPI DUP1 PUSH4 0xD605787B EQ PUSH2 0x703 JUMPI DUP1 PUSH4 0xDFB2F13B EQ PUSH2 0x70B JUMPI DUP1 PUSH4 0xEEFC8AD1 EQ PUSH2 0x713 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0xC2F19EE8 GT PUSH2 0xE9 JUMPI DUP1 PUSH4 0xC2F19EE8 EQ PUSH2 0x6C5 JUMPI DUP1 PUSH4 0xC42B42A0 EQ PUSH2 0x6CD JUMPI DUP1 PUSH4 0xC48DDBCB EQ PUSH2 0x6D5 JUMPI DUP1 PUSH4 0xC6853270 EQ PUSH2 0x6E8 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0xB0244682 EQ PUSH2 0x684 JUMPI DUP1 PUSH4 0xB2210957 EQ PUSH2 0x697 JUMPI DUP1 PUSH4 0xB9EE1E05 EQ PUSH2 0x6AA JUMPI DUP1 PUSH4 0xC25A9C32 EQ PUSH2 0x6B2 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0x192 JUMPI DUP1 PUSH4 0x95E5F9EE GT PUSH2 0x161 JUMPI DUP1 PUSH4 0x95E5F9EE EQ PUSH2 0x659 JUMPI DUP1 PUSH4 0x9DAFAFB0 EQ PUSH2 0x661 JUMPI DUP1 PUSH4 0xA4E075CA EQ PUSH2 0x669 JUMPI DUP1 PUSH4 0xACCA5B95 EQ PUSH2 0x67C JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x616 JUMPI DUP1 PUSH4 0x8E204C43 EQ PUSH2 0x61E JUMPI DUP1 PUSH4 0x94144C6B EQ PUSH2 0x631 JUMPI DUP1 PUSH4 0x9417783F EQ PUSH2 0x639 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x884A4448 GT PUSH2 0x1CE JUMPI DUP1 PUSH4 0x884A4448 EQ PUSH2 0x5D3 JUMPI DUP1 PUSH4 0x8AA3EC6F EQ PUSH2 0x5E6 JUMPI DUP1 PUSH4 0x8ACFACA9 EQ PUSH2 0x5F9 JUMPI DUP1 PUSH4 0x8D5F10C4 EQ PUSH2 0x601 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x738BBEA8 EQ PUSH2 0x59D JUMPI DUP1 PUSH4 0x7F2BE9FC EQ PUSH2 0x5A5 JUMPI DUP1 PUSH4 0x7F4296D7 EQ PUSH2 0x5B8 JUMPI DUP1 PUSH4 0x876F5C7E EQ PUSH2 0x5CB JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x4E5D08E0 GT PUSH2 0x2EF JUMPI DUP1 PUSH4 0x6BE51C4F GT PUSH2 0x282 JUMPI DUP1 PUSH4 0x6F46F221 GT PUSH2 0x251 JUMPI DUP1 PUSH4 0x6F46F221 EQ PUSH2 0x57D JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x585 JUMPI DUP1 PUSH4 0x719CE73E EQ PUSH2 0x58D JUMPI DUP1 PUSH4 0x72F33EA9 EQ PUSH2 0x595 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x6BE51C4F EQ PUSH2 0x552 JUMPI DUP1 PUSH4 0x6BEA5344 EQ PUSH2 0x55A JUMPI DUP1 PUSH4 0x6CC25DB7 EQ PUSH2 0x562 JUMPI DUP1 PUSH4 0x6DFB0386 EQ PUSH2 0x56A JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x62C77A61 GT PUSH2 0x2BE JUMPI DUP1 PUSH4 0x62C77A61 EQ PUSH2 0x51C JUMPI DUP1 PUSH4 0x66968221 EQ PUSH2 0x524 JUMPI DUP1 PUSH4 0x671137C4 EQ PUSH2 0x537 JUMPI DUP1 PUSH4 0x6A74F107 EQ PUSH2 0x54A JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x4E5D08E0 EQ PUSH2 0x4DB JUMPI DUP1 PUSH4 0x500DB70D EQ PUSH2 0x4EE JUMPI DUP1 PUSH4 0x52A30109 EQ PUSH2 0x4F6 JUMPI DUP1 PUSH4 0x605E25AC EQ PUSH2 0x509 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x2C8FE73D GT PUSH2 0x367 JUMPI DUP1 PUSH4 0x47BED998 GT PUSH2 0x336 JUMPI DUP1 PUSH4 0x47BED998 EQ PUSH2 0x4A5 JUMPI DUP1 PUSH4 0x4ABA4F6B EQ PUSH2 0x4B8 JUMPI DUP1 PUSH4 0x4C169F4F EQ PUSH2 0x4C0 JUMPI DUP1 PUSH4 0x4D7F3DB0 EQ PUSH2 0x4C8 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x2C8FE73D EQ PUSH2 0x460 JUMPI DUP1 PUSH4 0x30FCDF41 EQ PUSH2 0x468 JUMPI DUP1 PUSH4 0x38A9B4B6 EQ PUSH2 0x47D JUMPI DUP1 PUSH4 0x42D09209 EQ PUSH2 0x490 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0xFAF125F GT PUSH2 0x3A3 JUMPI DUP1 PUSH4 0xFAF125F EQ PUSH2 0x428 JUMPI DUP1 PUSH4 0x111070E4 EQ PUSH2 0x430 JUMPI DUP1 PUSH4 0x152D308C EQ PUSH2 0x438 JUMPI DUP1 PUSH4 0x2A7AD609 EQ PUSH2 0x44B JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x1B48E34 EQ PUSH2 0x3CA JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x3F3 JUMPI DUP1 PUSH4 0xD847FC4 EQ PUSH2 0x413 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3DD PUSH2 0x3D8 CALLDATASIZE PUSH1 0x4 PUSH2 0x48A5 JUMP JUMPDEST PUSH2 0x781 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x406 PUSH2 0x401 CALLDATASIZE PUSH1 0x4 PUSH2 0x47AE JUMP JUMPDEST PUSH2 0x79A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x4D2C JUMP JUMPDEST PUSH2 0x41B PUSH2 0x7D0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x4AE0 JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x7DF JUMP JUMPDEST PUSH2 0x406 PUSH2 0x7E5 JUMP JUMPDEST PUSH2 0x406 PUSH2 0x446 CALLDATASIZE PUSH1 0x4 PUSH2 0x457C JUMP JUMPDEST PUSH2 0x7F4 JUMP JUMPDEST PUSH2 0x453 PUSH2 0x8AB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x5A7B JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x8B7 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x476 CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0x8C6 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x47B PUSH2 0x48B CALLDATASIZE PUSH1 0x4 PUSH2 0x4776 JUMP JUMPDEST PUSH2 0x99E JUMP JUMPDEST PUSH2 0x498 PUSH2 0xA34 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x4C2B JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x4B3 CALLDATASIZE PUSH1 0x4 PUSH2 0x48A5 JUMP JUMPDEST PUSH2 0xA40 JUMP JUMPDEST PUSH2 0x406 PUSH2 0xA4B JUMP JUMPDEST PUSH2 0x47B PUSH2 0xAD4 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x4D6 CALLDATASIZE PUSH1 0x4 PUSH2 0x45E1 JUMP JUMPDEST PUSH2 0xB9E JUMP JUMPDEST PUSH2 0x47B PUSH2 0x4E9 CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0xC76 JUMP JUMPDEST PUSH2 0x41B PUSH2 0xD13 JUMP JUMPDEST PUSH2 0x406 PUSH2 0x504 CALLDATASIZE PUSH1 0x4 PUSH2 0x48A5 JUMP JUMPDEST PUSH2 0xD22 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x517 CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0xDB0 JUMP JUMPDEST PUSH2 0x498 PUSH2 0xE91 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x532 CALLDATASIZE PUSH1 0x4 PUSH2 0x46C6 JUMP JUMPDEST PUSH2 0xE9D JUMP JUMPDEST PUSH2 0x47B PUSH2 0x545 CALLDATASIZE PUSH1 0x4 PUSH2 0x47D6 JUMP JUMPDEST PUSH2 0xF6F JUMP JUMPDEST PUSH2 0x406 PUSH2 0xFCF JUMP JUMPDEST PUSH2 0x41B PUSH2 0xFE8 JUMP JUMPDEST PUSH2 0x453 PUSH2 0xFF7 JUMP JUMPDEST PUSH2 0x41B PUSH2 0x100B JUMP JUMPDEST PUSH2 0x47B PUSH2 0x578 CALLDATASIZE PUSH1 0x4 PUSH2 0x48A5 JUMP JUMPDEST PUSH2 0x101A JUMP JUMPDEST PUSH2 0x406 PUSH2 0x106A JUMP JUMPDEST PUSH2 0x47B PUSH2 0x1073 JUMP JUMPDEST PUSH2 0x41B PUSH2 0x10FC JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x110B JUMP JUMPDEST PUSH2 0x406 PUSH2 0x1111 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x5B3 CALLDATASIZE PUSH1 0x4 PUSH2 0x49CE JUMP JUMPDEST PUSH2 0x1164 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x5C6 CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0x1208 JUMP JUMPDEST PUSH2 0x406 PUSH2 0x12BE JUMP JUMPDEST PUSH2 0x47B PUSH2 0x5E1 CALLDATASIZE PUSH1 0x4 PUSH2 0x48A5 JUMP JUMPDEST PUSH2 0x12DD JUMP JUMPDEST PUSH2 0x47B PUSH2 0x5F4 CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0x132D JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x1405 JUMP JUMPDEST PUSH2 0x609 PUSH2 0x140B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x4C78 JUMP JUMPDEST PUSH2 0x41B PUSH2 0x1490 JUMP JUMPDEST PUSH2 0x406 PUSH2 0x62C CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0x149F JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x14B4 JUMP JUMPDEST PUSH2 0x64C PUSH2 0x647 CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0x14BA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x4CF4 JUMP JUMPDEST PUSH2 0x406 PUSH2 0x1526 JUMP JUMPDEST PUSH2 0x406 PUSH2 0x1530 JUMP JUMPDEST PUSH2 0x406 PUSH2 0x677 CALLDATASIZE PUSH1 0x4 PUSH2 0x4776 JUMP JUMPDEST PUSH2 0x1539 JUMP JUMPDEST PUSH2 0x453 PUSH2 0x15C0 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x692 CALLDATASIZE PUSH1 0x4 PUSH2 0x47D6 JUMP JUMPDEST PUSH2 0x15CC JUMP JUMPDEST PUSH2 0x47B PUSH2 0x6A5 CALLDATASIZE PUSH1 0x4 PUSH2 0x452A JUMP JUMPDEST PUSH2 0x1657 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x1728 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x6C0 CALLDATASIZE PUSH1 0x4 PUSH2 0x4706 JUMP JUMPDEST PUSH2 0x1970 JUMP JUMPDEST PUSH2 0x41B PUSH2 0x1CFF JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x1D0E JUMP JUMPDEST PUSH2 0x47B PUSH2 0x6E3 CALLDATASIZE PUSH1 0x4 PUSH2 0x4803 JUMP JUMPDEST PUSH2 0x1D8B JUMP JUMPDEST PUSH2 0x47B PUSH2 0x6F6 CALLDATASIZE PUSH1 0x4 PUSH2 0x4A48 JUMP JUMPDEST PUSH2 0x1F80 JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x1FD0 JUMP JUMPDEST PUSH2 0x41B PUSH2 0x1FDA JUMP JUMPDEST PUSH2 0x47B PUSH2 0x1FE9 JUMP JUMPDEST PUSH2 0x726 PUSH2 0x721 CALLDATASIZE PUSH1 0x4 PUSH2 0x48A5 JUMP JUMPDEST PUSH2 0x226B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x59A5 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x741 CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0x22D0 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x754 CALLDATASIZE PUSH1 0x4 PUSH2 0x48D5 JUMP JUMPDEST PUSH2 0x2391 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x767 CALLDATASIZE PUSH1 0x4 PUSH2 0x4871 JUMP JUMPDEST PUSH2 0x25F2 JUMP JUMPDEST PUSH2 0x774 PUSH2 0x2791 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x4D4C JUMP JUMPDEST PUSH1 0x0 PUSH2 0x794 PUSH2 0x78E PUSH2 0x27B2 JUMP JUMPDEST DUP4 PUSH2 0x27EF JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL EQ DUP1 PUSH2 0x794 JUMPI POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT EQ SWAP1 JUMP JUMPDEST PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x7A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH4 0xFFFFFFFF AND ISZERO ISZERO JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7FE PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x80F PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x83E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x846 PUSH2 0x281C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x78 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP6 ISZERO ISZERO OR SWAP1 SSTORE MLOAD PUSH32 0xD1AC9A365C0E3BFAD562E0A809A5DED3842A2B489F839B3327E4E34EE0128F28 SWAP1 PUSH2 0x89A SWAP1 DUP6 SWAP1 PUSH2 0x4D2C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8C1 PUSH2 0x2871 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x8CE PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x8DF PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x905 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x90D PUSH2 0x281C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0x938 JUMPI POP PUSH2 0x938 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH4 0x266FCE1F PUSH1 0xE1 SHL PUSH2 0x288A JUMP JUMPDEST PUSH2 0x954 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5535 JUMP JUMPDEST PUSH1 0x73 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xC4FEFF61630891EA2CB42A54FBE3FF2E65422F2ED17323AC6B65F4521112E87E SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH2 0x9A6 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x9B7 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x9DD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x9E5 PUSH2 0x281C JUMP JUMPDEST PUSH1 0x77 DUP1 SLOAD PUSH1 0xFF NOT AND DUP3 ISZERO ISZERO OR SWAP1 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x6959D02E8FB6264D1D39BF37F1E725001F342714933CF38F8627A2442EFC43FD SWAP2 PUSH2 0xA29 SWAP2 PUSH1 0xFF SWAP1 SWAP2 AND SWAP1 PUSH2 0x4D2C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x8C1 PUSH1 0x70 PUSH2 0x28AD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x794 DUP3 PUSH2 0x298D JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x6A SLOAD PUSH1 0x40 MLOAD PUSH4 0xE866E6F PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x3A19B9BC SWAP2 PUSH2 0xA84 SWAP2 PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x4 ADD PUSH2 0x5A7B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA9C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xAB0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x8C1 SWAP2 SWAP1 PUSH2 0x4792 JUMP JUMPDEST PUSH2 0xADC PUSH2 0x1111 JUMP JUMPDEST PUSH2 0xAF8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5885 JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF NOT DUP2 AND SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH4 0xFFFFFFFF DUP1 DUP4 AND SWAP3 PUSH5 0x100000000 SWAP1 DIV AND SWAP1 PUSH32 0xEE6702C46C5618E6FC7E625C71F4C85DF9C91D456CB16A3AEA71AB83B1FEE005 SWAP1 PUSH1 0x0 SWAP1 LOG1 PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0xFFFFFFFF DUP5 AND SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 CALLER SWAP1 PUSH32 0xD50026EE0824513AF20CDF5E72D1FBFBE8FD646EE0576378E080326F1A695E58 SWAP1 PUSH2 0xB92 SWAP1 DUP7 SWAP1 PUSH2 0x5A7B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xBB2 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xBD8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x505F JUMP JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0xBF6 JUMPI PUSH2 0xBF6 PUSH2 0x281C JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0xC70 JUMPI PUSH1 0x65 SLOAD PUSH1 0x40 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x4D7F3DB0 SWAP1 PUSH2 0xC3D SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x4C00 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC57 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xC6B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0xC7E PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xC8F PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0xCBE JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xCB3 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0xCE3 JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xCD8 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0xCFF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4EF6 JUMP JUMPDEST PUSH2 0xD07 PUSH2 0x281C JUMP JUMPDEST PUSH2 0xD10 DUP2 PUSH2 0x29D4 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xD2C PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xD3D PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xD63 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0xD6B PUSH2 0x281C JUMP JUMPDEST PUSH1 0x7A DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x63E4E34F49D12428C03E04E61340C7167E36EB0FF6F0B1970C75440261794039 SWAP1 PUSH2 0xDA0 SWAP1 DUP5 SWAP1 PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP PUSH1 0x1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xDB8 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xDC9 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xDEF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0xDF7 PUSH2 0x281C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0xE25 JUMPI POP PUSH2 0xE25 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x288A JUMP JUMPDEST PUSH2 0xE41 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4DC3 JUMP JUMPDEST PUSH1 0x65 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 AND SWAP1 PUSH32 0x9FC437AA70AD4EE5F33F6772BF338EED41E21B95435820817AB8B4DF161CE4DD SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x8C1 PUSH1 0x6E PUSH2 0x28AD JUMP JUMPDEST PUSH2 0xEA5 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xEB6 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0xEE5 JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xEDA PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0xF0A JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xEFF PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0xF26 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4EF6 JUMP JUMPDEST PUSH2 0xF2E PUSH2 0x281C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xF6A JUMPI PUSH2 0xF62 DUP4 DUP4 DUP4 DUP2 DUP2 LT PUSH2 0xF48 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0xF5D SWAP2 SWAP1 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0x29D4 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xF31 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xF77 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF88 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xFAE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0xFB6 PUSH2 0x281C JUMP JUMPDEST PUSH2 0xFC2 PUSH1 0x70 DUP3 DUP5 PUSH2 0x2B88 JUMP JUMPDEST PUSH2 0xFCB DUP3 PUSH2 0x2C52 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFD9 PUSH2 0x7E5 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x8C1 JUMPI POP PUSH2 0x8C1 PUSH2 0xA4B JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH5 0x100000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1022 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1033 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1059 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x1061 PUSH2 0x281C JUMP JUMPDEST PUSH2 0xD10 DUP2 PUSH2 0x2CAA JUMP JUMPDEST PUSH1 0x79 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x107B PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x108C PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x10B2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x6D SLOAD DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND PUSH2 0x1130 JUMPI POP PUSH1 0x0 PUSH2 0x7F1 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH1 0x6B SLOAD PUSH2 0x1154 SWAP2 PUSH4 0xFFFFFFFF SWAP2 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 SWAP2 DIV DUP2 AND SWAP1 PUSH2 0x2CFF AND JUMP JUMPDEST PUSH2 0x115C PUSH2 0x2D24 JUMP JUMPDEST GT SWAP1 POP PUSH2 0x7F1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x117D JUMPI POP PUSH2 0x117D PUSH2 0x2D28 JUMP JUMPDEST DUP1 PUSH2 0x118B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x11A7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x52FB JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x11D2 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x60 PUSH2 0x11E3 DUP10 DUP10 DUP10 DUP10 DUP10 DUP10 DUP8 PUSH2 0x2391 JUMP JUMPDEST PUSH2 0x11EC DUP4 PUSH2 0x2CAA JUMP JUMPDEST POP DUP1 ISZERO PUSH2 0xC6B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1210 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1221 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1247 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x124F PUSH2 0x281C JUMP JUMPDEST PUSH2 0x1257 PUSH2 0x7E5 JUMP JUMPDEST ISZERO PUSH2 0x1274 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5842 JUMP JUMPDEST PUSH1 0x69 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xF935763CC7C57EE8ED6318ED71E756CCA0731294C9F46FF5B386F36D6FF1417A SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x12C8 PUSH2 0x2D33 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x8C1 JUMPI POP PUSH2 0x12D7 PUSH2 0x7E5 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x12E5 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x12F6 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x131C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x1324 PUSH2 0x281C JUMP JUMPDEST PUSH2 0xD10 DUP2 PUSH2 0x2D4C JUMP JUMPDEST PUSH2 0x1335 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1346 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x136C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x1374 PUSH2 0x281C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0x139F JUMPI POP PUSH2 0x139F PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH4 0x2BA83963 PUSH1 0xE1 SHL PUSH2 0x288A JUMP JUMPDEST PUSH2 0x13BB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5753 JUMP JUMPDEST PUSH1 0x74 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xDA05D50A3A1EC0FFAB059F1D457AE59F68CCFB3FFBB4DAD283C516F9103D584B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x76 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x75 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0x1487 JUMPI PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 SWAP1 DUP2 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP2 DUP6 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND DUP4 DUP6 ADD MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP3 ADD MSTORE DUP3 MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 ADD PUSH2 0x142F JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x78 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x6C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD DUP4 MLOAD DUP2 DUP5 MUL DUP2 ADD DUP5 ADD SWAP1 SWAP5 MSTORE DUP1 DUP5 MSTORE PUSH1 0x60 SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x151A JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x1506 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8C1 PUSH2 0x2D33 JUMP JUMPDEST PUSH1 0x77 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1543 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1554 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x157A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x1582 PUSH2 0x281C JUMP JUMPDEST PUSH1 0x79 DUP1 SLOAD PUSH1 0xFF NOT AND DUP4 ISZERO ISZERO OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x2B4B6FFE286F7CE4CCC6B136BB14987B0A00092174D88938A0C667A104A4A731 SWAP1 PUSH2 0xDA0 SWAP1 DUP5 SWAP1 PUSH2 0x4D2C JUMP JUMPDEST PUSH1 0x6B SLOAD PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x15D4 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x15E5 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x160B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x1613 PUSH2 0x281C JUMP JUMPDEST PUSH2 0x161F PUSH1 0x6E DUP3 DUP5 PUSH2 0x2B88 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 PUSH32 0x58982464497ACDAB11AD29D39907E076B0D3B8DAF1D9B734174C7C3A2A0E8C74 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x166B PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1691 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x505F JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x16C3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x50A4 JUMP JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x16E1 JUMPI PUSH2 0x16E1 PUSH2 0x281C JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0xC70 JUMPI PUSH1 0x65 SLOAD PUSH1 0x40 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xB2210957 SWAP1 PUSH2 0xC3D SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B99 JUMP JUMPDEST PUSH2 0x1730 PUSH2 0x2D33 JUMP JUMPDEST PUSH2 0x174C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4E65 JUMP JUMPDEST PUSH2 0x1754 PUSH2 0x7E5 JUMP JUMPDEST ISZERO PUSH2 0x1771 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x53C4 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xD37B537 PUSH1 0xE0 SHL DUP2 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP3 PUSH4 0xD37B537 SWAP3 PUSH1 0x4 DUP1 DUP4 ADD SWAP4 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x17B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x17CA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x17EE SWAP2 SWAP1 PUSH2 0x45B4 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x180B JUMPI POP PUSH1 0x0 DUP2 GT JUMPDEST ISZERO PUSH2 0x182A JUMPI PUSH1 0x69 SLOAD PUSH2 0x182A SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND SWAP2 AND DUP4 PUSH2 0x2DA1 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x433C53D9 PUSH1 0xE1 SHL DUP2 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP3 PUSH4 0x8678A7B2 SWAP3 PUSH1 0x4 DUP1 DUP4 ADD SWAP4 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1870 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1884 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x18A8 SWAP2 SWAP1 PUSH2 0x4A64 JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH4 0xFFFFFFFF DUP1 DUP5 AND PUSH5 0x100000000 MUL PUSH8 0xFFFFFFFF00000000 NOT SWAP2 DUP7 AND PUSH4 0xFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR AND OR SWAP1 SSTORE SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x18EE PUSH2 0x18E9 PUSH2 0x2D24 JUMP JUMPDEST PUSH2 0x2E9B JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFF0000000000000000 NOT AND PUSH1 0x1 PUSH1 0x40 SHL PUSH4 0xFFFFFFFF SWAP4 DUP5 AND MUL OR SWAP1 SSTORE PUSH1 0x66 SLOAD SWAP1 DUP4 AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x192A PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x4D31E658DCF617BB3A3C8CF7C6DDDB33F7030AC588E271631ECDB5D76C2E91EF DUP5 PUSH1 0x40 MLOAD PUSH2 0x1962 SWAP2 SWAP1 PUSH2 0x5A7B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1978 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1989 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x19AF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1C54 JUMPI PUSH2 0x19C3 PUSH2 0x43F5 JUMP JUMPDEST DUP5 DUP5 DUP4 DUP2 DUP2 LT PUSH2 0x19CF JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x60 MUL ADD DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x19E5 SWAP2 SWAP1 PUSH2 0x4856 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP2 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND GT ISZERO PUSH2 0x1A0F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4FC3 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A36 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x526F JUMP JUMPDEST PUSH1 0x75 SLOAD DUP3 LT PUSH2 0x1AD2 JUMPI PUSH1 0x75 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE PUSH1 0x0 SWAP2 SWAP1 SWAP2 MSTORE DUP2 MLOAD PUSH32 0x9A8D93986A7B9E6294572EA6736696119C195C1A9F5EAE642D3C5FCD44E49DEA SWAP1 SWAP2 ADD DUP1 SLOAD PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x40 DUP6 ADD MLOAD PUSH1 0xFF AND PUSH1 0x1 PUSH1 0xB0 SHL MUL PUSH1 0xFF PUSH1 0xB0 SHL NOT PUSH2 0xFFFF SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xA0 SHL MUL PUSH2 0xFFFF PUSH1 0xA0 SHL NOT PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP7 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP5 SWAP1 SWAP5 AND SWAP2 SWAP1 SWAP2 OR AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x1BF9 JUMP JUMPDEST PUSH2 0x1ADA PUSH2 0x43F5 JUMP JUMPDEST PUSH1 0x75 DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x1AE7 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND DUP1 DUP6 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP4 DIV PUSH2 0xFFFF AND SWAP6 DUP6 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 SWAP2 DIV PUSH1 0xFF AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP5 MLOAD SWAP2 SWAP4 POP AND EQ ISZERO DUP1 PUSH2 0x1B56 JUMPI POP DUP1 PUSH1 0x20 ADD MLOAD PUSH2 0xFFFF AND DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0xFFFF AND EQ ISZERO JUMPDEST DUP1 PUSH2 0x1B6F JUMPI POP DUP1 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND DUP3 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x1BF0 JUMPI DUP2 PUSH1 0x75 DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x1B82 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 DUP4 MLOAD SWAP2 ADD DUP1 SLOAD SWAP3 DUP5 ADD MLOAD PUSH1 0x40 SWAP1 SWAP5 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP4 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH2 0xFFFF PUSH1 0xA0 SHL NOT AND PUSH1 0x1 PUSH1 0xA0 SHL PUSH2 0xFFFF SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 MUL SWAP3 SWAP1 SWAP3 OR PUSH1 0xFF PUSH1 0xB0 SHL NOT AND PUSH1 0x1 PUSH1 0xB0 SHL PUSH1 0xFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE PUSH2 0x1BF7 JUMP JUMPDEST POP POP PUSH2 0x1C4C JUMP JUMPDEST POP JUMPDEST DUP1 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC1BF93444A0055A24A7D0154B75FEDF78EDFE355C06A2CE8E47F9F3908720559 DUP3 PUSH1 0x20 ADD MLOAD DUP4 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 MLOAD PUSH2 0x1C42 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x59B3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x19B3 JUMP JUMPDEST POP JUMPDEST PUSH1 0x75 SLOAD DUP2 LT ISZERO PUSH2 0x1CD1 JUMPI PUSH1 0x75 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x1C71 SWAP1 PUSH1 0x1 PUSH2 0x2EC5 JUMP JUMPDEST SWAP1 POP PUSH1 0x75 DUP1 SLOAD DUP1 PUSH2 0x1C7E JUMPI INVALID JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 DUP3 ADD PUSH1 0x0 NOT SWAP1 DUP2 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xB8 SHL SUB NOT AND SWAP1 SSTORE SWAP1 SWAP2 ADD SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD DUP3 SWAP2 PUSH32 0x99FA473FDF53414BCD014CF6E7509FC58C68F7B86174767FAA6AD5100CD5BAE5 SWAP2 LOG2 POP PUSH2 0x1C56 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1CDB PUSH2 0x2EED JUMP JUMPDEST SWAP1 POP PUSH2 0x3E8 DUP2 GT ISZERO PUSH2 0xC70 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x54E2 JUMP JUMPDEST PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x18C1996D PUSH1 0xE2 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x630665B4 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1D53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1D67 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x8C1 SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST PUSH2 0x1D93 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1DA4 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0x1DD3 JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1DC8 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0x1DF8 JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1DED PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0x1E14 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4EF6 JUMP JUMPDEST PUSH2 0x1E1C PUSH2 0x281C JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x6A3FD4F9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x6A3FD4F9 SWAP1 PUSH2 0x1E4C SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4AE0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E64 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1E78 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1E9C SWAP2 SWAP1 PUSH2 0x4792 JUMP JUMPDEST PUSH2 0x1EB8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5586 JUMP JUMPDEST PUSH2 0x1ED2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH4 0x80AC58CD PUSH1 0xE0 SHL PUSH2 0x288A JUMP JUMPDEST PUSH2 0x1EEE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4D7F JUMP JUMPDEST PUSH2 0x1EF9 PUSH1 0x70 DUP5 PUSH2 0x2F7F JUMP JUMPDEST PUSH2 0x1F08 JUMPI PUSH2 0x1F08 PUSH1 0x70 DUP5 PUSH2 0x2FD0 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1F37 JUMPI PUSH2 0x1F2F DUP5 DUP5 DUP5 DUP5 DUP2 DUP2 LT PUSH2 0x1F23 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH2 0x3098 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x1F0B JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x51541DC4B4C08A16085809CCCDC4CC77D8000B60FBB00142E57F236D84298675 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH2 0x1F73 SWAP3 SWAP2 SWAP1 PUSH2 0x4CBA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP JUMP JUMPDEST PUSH2 0x1F88 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1F99 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1FBF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x1FC7 PUSH2 0x281C JUMP JUMPDEST PUSH2 0xD10 DUP2 PUSH2 0x31E9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8C1 PUSH2 0x27B2 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1FF1 PUSH2 0x7E5 JUMP JUMPDEST PUSH2 0x200D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5917 JUMP JUMPDEST PUSH2 0x2015 PUSH2 0xA4B JUMP JUMPDEST PUSH2 0x2031 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5229 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x6A SLOAD PUSH1 0x40 MLOAD PUSH4 0x13A54BF3 PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x9D2A5F98 SWAP2 PUSH2 0x206A SWAP2 PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x4 ADD PUSH2 0x5A7B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2084 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2098 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x20BC SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE PUSH1 0x73 SLOAD SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x214C JUMPI PUSH1 0x73 SLOAD PUSH1 0x6D SLOAD PUSH1 0x40 MLOAD PUSH4 0x266FCE1F PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x4CDF9C3E SWAP2 PUSH2 0x2119 SWAP2 DUP6 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x59F1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2133 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2147 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x2155 DUP2 PUSH2 0x325A JUMP JUMPDEST PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x21CD JUMPI PUSH1 0x74 SLOAD PUSH1 0x6D SLOAD PUSH1 0x40 MLOAD PUSH4 0x2BA83963 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x575072C6 SWAP2 PUSH2 0x219A SWAP2 DUP6 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x59F1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x21B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x21C8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x21DD PUSH2 0x21D8 PUSH2 0x2D24 JUMP JUMPDEST PUSH2 0x298D JUMP JUMPDEST PUSH1 0x6D SSTORE PUSH2 0x21E8 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x9C4163ECE98173EAB9A496C4DB8BF3E2C8EDCC5D2854377880597CCB858B7A9D DUP3 PUSH1 0x40 MLOAD PUSH2 0x2220 SWAP2 SWAP1 PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x6D SLOAD PUSH2 0x2233 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC61852C20F0B03B31D782F3022F2BF20322AC17CE66C5349FB6E24740CDD6456 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP JUMP JUMPDEST PUSH2 0x2273 PUSH2 0x43F5 JUMP JUMPDEST PUSH1 0x75 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x2280 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP4 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 SWAP3 DIV PUSH1 0xFF AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x22D8 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x22E9 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x230F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x2335 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4EB0 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x23AA JUMPI POP PUSH2 0x23AA PUSH2 0x2D28 JUMP JUMPDEST DUP1 PUSH2 0x23B8 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x23D4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x52FB JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x23FF JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH2 0x2425 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5121 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x244B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x56C4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x2471 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4F79 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x2497 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x51B0 JUMP JUMPDEST PUSH1 0x66 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP10 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SWAP3 SSTORE PUSH1 0x67 DUP1 SLOAD DUP9 DUP5 AND SWAP1 DUP4 AND OR SWAP1 SSTORE PUSH1 0x69 DUP1 SLOAD DUP7 DUP5 AND SWAP1 DUP4 AND OR SWAP1 SSTORE PUSH1 0x68 DUP1 SLOAD SWAP3 DUP8 AND SWAP3 SWAP1 SWAP2 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x24EA DUP8 PUSH2 0x2D4C JUMP JUMPDEST PUSH2 0x24F2 PUSH2 0x37E7 JUMP JUMPDEST PUSH2 0x24FC PUSH1 0x6E PUSH2 0x3879 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 MLOAD DUP2 LT ISZERO PUSH2 0x252C JUMPI PUSH2 0x2524 DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2517 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x29D4 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x24FF JUMP JUMPDEST POP PUSH1 0x6C DUP8 SWAP1 SSTORE PUSH1 0x6D DUP9 SWAP1 SSTORE PUSH2 0x2541 PUSH1 0x70 PUSH2 0x3879 JUMP JUMPDEST PUSH2 0x254C PUSH2 0x708 PUSH2 0x31E9 JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xF9632D212436344A25150FF0C161DABF412AADE556621C2DEA146CA63FF643F5 DUP10 DUP10 DUP9 DUP9 DUP9 DUP9 PUSH1 0x40 MLOAD PUSH2 0x258F SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x59FF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x6D SLOAD PUSH2 0x25A2 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC61852C20F0B03B31D782F3022F2BF20322AC17CE66C5349FB6E24740CDD6456 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 DUP1 ISZERO PUSH2 0xC6B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x25FA PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x260B PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2631 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH1 0x75 SLOAD PUSH1 0xFF DUP3 AND LT PUSH2 0x2655 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5349 JUMP JUMPDEST PUSH1 0x1 DUP3 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND GT ISZERO PUSH2 0x267D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4FC3 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x26A4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x526F JUMP JUMPDEST DUP2 PUSH1 0x75 DUP3 PUSH1 0xFF AND DUP2 SLOAD DUP2 LT PUSH2 0x26B5 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 DUP5 MLOAD SWAP3 ADD DUP1 SLOAD SWAP2 DUP6 ADD MLOAD PUSH1 0x40 SWAP1 SWAP6 ADD MLOAD PUSH1 0xFF AND PUSH1 0x1 PUSH1 0xB0 SHL MUL PUSH1 0xFF PUSH1 0xB0 SHL NOT PUSH2 0xFFFF SWAP1 SWAP7 AND PUSH1 0x1 PUSH1 0xA0 SHL MUL PUSH2 0xFFFF PUSH1 0xA0 SHL NOT PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP4 SWAP1 SWAP4 AND SWAP2 SWAP1 SWAP2 OR SWAP4 SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE PUSH2 0x2724 PUSH2 0x2EED JUMP JUMPDEST SWAP1 POP PUSH2 0x3E8 DUP2 GT ISZERO PUSH2 0x2748 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x54E2 JUMP JUMPDEST DUP3 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC1BF93444A0055A24A7D0154B75FEDF78EDFE355C06A2CE8E47F9F3908720559 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 MLOAD PUSH2 0x1F73 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x59D2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x27BD PUSH2 0x2871 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x27C9 PUSH2 0x2D24 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 GT ISZERO PUSH2 0x27DE JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x7F1 JUMP JUMPDEST PUSH2 0x27E8 DUP3 DUP3 PUSH2 0x2EC5 JUMP JUMPDEST SWAP3 POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2804 PUSH8 0xDE0B6B3A7640000 DUP6 PUSH2 0x38BD JUMP JUMPDEST SWAP1 POP PUSH2 0x2810 DUP2 DUP5 PUSH2 0x38F7 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2826 PUSH2 0x3939 JUMP JUMPDEST PUSH1 0x6A SLOAD SWAP1 SWAP2 POP PUSH5 0x100000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND ISZERO DUP1 PUSH2 0x2855 JUMPI POP PUSH1 0x6A SLOAD PUSH5 0x100000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP2 LT JUMPDEST PUSH2 0xD10 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5842 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8C1 PUSH1 0x6C SLOAD PUSH1 0x6D SLOAD PUSH2 0x2CFF SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2895 DUP4 PUSH2 0x393D JUMP JUMPDEST DUP1 ISZERO PUSH2 0x28A6 JUMPI POP PUSH2 0x28A6 DUP4 DUP4 PUSH2 0x3970 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 PUSH1 0x0 ADD SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x28CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x28F5 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x2938 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST ISZERO PUSH2 0x2984 JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x294A JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x20 SWAP2 DUP3 MUL SWAP3 SWAP1 SWAP3 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP1 DUP9 ADD SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP3 SWAP1 SWAP2 ADD SWAP2 AND PUSH2 0x2916 JUMP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x29B1 PUSH1 0x6C SLOAD PUSH2 0x29AB PUSH1 0x6D SLOAD DUP7 PUSH2 0x2EC5 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 PUSH2 0x3996 JUMP JUMPDEST SWAP1 POP PUSH2 0x28A6 PUSH2 0x29CB PUSH1 0x6C SLOAD DUP4 PUSH2 0x38BD SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x6D SLOAD SWAP1 PUSH2 0x2CFF JUMP JUMPDEST PUSH2 0x29E6 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x39C8 JUMP JUMPDEST PUSH2 0x2A02 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x538F JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x6A3FD4F9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x6A3FD4F9 SWAP1 PUSH2 0x2A32 SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH2 0x4AE0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2A4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2A5E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2A82 SWAP2 SWAP1 PUSH2 0x4792 JUMP JUMPDEST PUSH2 0x2A9E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5586 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x4 DUP2 MSTORE PUSH1 0x24 DUP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0xE0 SHL OR SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x60 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP2 PUSH2 0x2AE2 SWAP2 PUSH2 0x4ABB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x2B1D JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x2B22 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x2B44 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x52B8 JUMP JUMPDEST PUSH2 0x2B4F PUSH1 0x6E DUP5 PUSH2 0x2FD0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH32 0xBCD6D991F3416E288BF59A2997B423772937B62C7EA7DD1A54AF7771DE1F7418 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x2BAA JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO ISZERO JUMPDEST PUSH2 0x2BC6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4E0F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 AND SWAP1 DUP3 AND EQ PUSH2 0x2C04 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4E38 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD SWAP6 DUP6 AND DUP4 MSTORE SWAP1 DUP3 KECCAK256 DUP1 SLOAD SWAP6 SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP6 DUP7 AND OR SWAP1 SWAP4 SSTORE MSTORE DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x2C73 SWAP2 PUSH2 0x4415 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH32 0xCD64D9DACD230C5CCF1278EA5332B0621AA28C950FB0E61C8FBC9E2011C88A34 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP2 GT PUSH2 0x2CCA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x540F JUMP JUMPDEST PUSH1 0x76 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0xC44C7222E8DF09744CED394101DF47E78DEDB642D3065267BB388901DE9DF6D4 SWAP1 PUSH2 0xA29 SWAP1 DUP4 SWAP1 PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x28A6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4F42 JUMP JUMPDEST TIMESTAMP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x12D7 ADDRESS PUSH2 0x39C8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2D3D PUSH2 0x2871 JUMP JUMPDEST PUSH2 0x2D45 PUSH2 0x2D24 JUMP JUMPDEST LT ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 GT PUSH2 0x2D6C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x500B JUMP JUMPDEST PUSH1 0x6C DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0xD379C1A7282461E725A9DC2D74E65246C77E98AE93835E26C2F1654C48EE4EC SWAP1 PUSH2 0xA29 SWAP1 DUP4 SWAP1 PUSH2 0x4AD7 JUMP JUMPDEST DUP1 ISZERO DUP1 PUSH2 0x2E29 JUMPI POP PUSH1 0x40 MLOAD PUSH4 0x6EB1769F PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH4 0xDD62ED3E SWAP1 PUSH2 0x2DD7 SWAP1 ADDRESS SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4AF4 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2DEF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2E03 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2E27 SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST ISZERO JUMPDEST PUSH2 0x2E45 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x57A6 JUMP JUMPDEST PUSH2 0xF6A DUP4 PUSH4 0x95EA7B3 PUSH1 0xE0 SHL DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2E64 SWAP3 SWAP2 SWAP1 PUSH2 0x4BC4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE PUSH2 0x39CE JUMP JUMPDEST PUSH1 0x0 PUSH5 0x100000000 DUP3 LT PUSH2 0x2EC1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x55F8 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2EE7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x50EA JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x75 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP2 JUMPDEST DUP2 DUP2 PUSH1 0xFF AND LT ISZERO PUSH2 0x2F77 JUMPI PUSH2 0x2F0A PUSH2 0x43F5 JUMP JUMPDEST PUSH1 0x75 DUP3 PUSH1 0xFF AND DUP2 SLOAD DUP2 LT PUSH2 0x2F1A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP3 ADD MSTORE SWAP2 POP PUSH2 0x2F6C SWAP1 DUP6 SWAP1 PUSH2 0x2CFF JUMP JUMPDEST SWAP4 POP POP PUSH1 0x1 ADD PUSH2 0x2EF7 JUMP JUMPDEST POP SWAP1 SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x2FA3 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x28A6 JUMPI POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD AND ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x2FF2 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO ISZERO JUMPDEST PUSH2 0x300E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4E0F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x3048 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x55D1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE DUP4 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP6 DUP7 AND DUP1 DUP6 MSTORE SWAP3 DUP5 KECCAK256 DUP1 SLOAD SWAP7 SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP7 DUP8 AND OR SWAP1 SSTORE SWAP2 DUP4 SWAP1 MSTORE DUP2 SLOAD SWAP1 SWAP4 AND SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x31A9108F PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND SWAP2 DUP5 AND SWAP1 PUSH4 0x6352211E SWAP1 PUSH2 0x30CB SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x30E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x30F7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x311B SWAP2 SWAP1 PUSH2 0x450E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x3141 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x595E JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 LT ISZERO PUSH2 0x31BC JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP4 SWAP2 SWAP1 DUP4 SWAP1 DUP2 LT PUSH2 0x318B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD EQ ISZERO PUSH2 0x31B4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x57FC JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x3144 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE SWAP1 DUP4 MSTORE SWAP2 KECCAK256 ADD SSTORE JUMP JUMPDEST PUSH1 0x3C DUP2 PUSH4 0xFFFFFFFF AND GT PUSH2 0x320F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x58CB JUMP JUMPDEST PUSH1 0x6B DUP1 SLOAD PUSH4 0xFFFFFFFF NOT AND PUSH4 0xFFFFFFFF DUP4 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x4F27F6F220FFAD585E728389BC2F0F6B74EEEBEB43F95F53752A647CB6E7E687 SWAP3 PUSH2 0xA29 SWAP3 AND SWAP1 PUSH2 0x5A7B JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xE6D8A94B PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xE6D8A94B SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x32A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x32B4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x32D8 SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST SWAP1 POP PUSH2 0x32E3 DUP2 PUSH2 0x3A5D JUMP JUMPDEST SWAP1 POP PUSH1 0x67 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3333 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3347 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x336B SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST PUSH2 0x339E JUMPI PUSH1 0x40 MLOAD PUSH32 0x3728FEB3FC1EF1BF4A24036AFBE7D34B59C551BF0D2AB5564E87EC1734FA80DD SWAP1 PUSH1 0x0 SWAP1 LOG1 POP PUSH2 0xD10 JUMP JUMPDEST PUSH1 0x79 SLOAD PUSH1 0x76 SLOAD PUSH1 0xFF SWAP1 SWAP2 AND SWAP1 PUSH1 0x60 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x33C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x33ED JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x7A SLOAD SWAP1 SWAP2 POP DUP6 SWAP1 PUSH1 0x0 SWAP1 DUP2 SWAP1 JUMPDEST DUP6 DUP4 LT ISZERO PUSH2 0x3598 JUMPI PUSH1 0x67 SLOAD PUSH1 0x40 MLOAD PUSH4 0x3B304147 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x3B304147 SWAP1 PUSH2 0x3435 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x344D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3461 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3485 SWAP2 SWAP1 PUSH2 0x450E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x78 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND PUSH2 0x34E0 JUMPI DUP1 DUP7 DUP6 DUP1 PUSH1 0x1 ADD SWAP7 POP DUP2 MLOAD DUP2 LT PUSH2 0x34BB JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP PUSH2 0x3559 JUMP JUMPDEST DUP2 DUP4 PUSH1 0x1 ADD SWAP4 POP DUP4 LT PUSH2 0x3559 JUMPI PUSH32 0xB5F728FCB182000EB8E953C15F6795F07B6CDA75B35EF0B65645B53AAC636945 DUP5 PUSH1 0x40 MLOAD PUSH2 0x351C SWAP2 SWAP1 PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP4 PUSH2 0x3553 JUMPI PUSH1 0x40 MLOAD PUSH32 0x3728FEB3FC1EF1BF4A24036AFBE7D34B59C551BF0D2AB5564E87EC1734FA80DD SWAP1 PUSH1 0x0 SWAP1 LOG1 JUMPDEST POP PUSH2 0x3598 JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH2 0x209 MUL DUP7 PUSH2 0x1F3 ADD ADD PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x3576 SWAP2 SWAP1 PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SWAP6 POP PUSH2 0x33FC SWAP2 POP POP JUMP JUMPDEST PUSH2 0x35B5 DUP6 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x35A8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x3B0A JUMP JUMPDEST PUSH1 0x0 DUP8 PUSH2 0x35CB JUMPI PUSH2 0x35C6 DUP10 DUP6 PUSH2 0x3996 JUMP JUMPDEST PUSH2 0x35D5 JUMP JUMPDEST PUSH2 0x35D5 DUP10 DUP9 PUSH2 0x3996 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x360F JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x360D JUMPI PUSH2 0x3605 DUP8 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x35F7 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP4 PUSH2 0x3C7A JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x35E0 JUMP JUMPDEST POP JUMPDEST PUSH1 0x77 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x37BE JUMPI PUSH1 0x0 PUSH2 0x3626 PUSH1 0x6E PUSH2 0x3CE7 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x365C JUMPI POP PUSH2 0x3646 PUSH1 0x6E PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x37B8 JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP3 PUSH4 0x70A08231 SWAP3 PUSH2 0x3694 SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4AE0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x36AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x36C0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x36E4 SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP11 PUSH2 0x36FC JUMPI PUSH2 0x36F7 DUP3 DUP9 PUSH2 0x3996 JUMP JUMPDEST PUSH2 0x3706 JUMP JUMPDEST PUSH2 0x3706 DUP3 DUP12 PUSH2 0x3996 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x37A4 JUMPI PUSH1 0x0 JUMPDEST DUP8 DUP2 LT ISZERO PUSH2 0x37A2 JUMPI PUSH1 0x66 SLOAD DUP11 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x2B0AB144 SWAP1 DUP13 SWAP1 DUP5 SWAP1 DUP2 LT PUSH2 0x373C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP7 DUP6 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3764 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4B75 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x377E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3792 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0x3711 SWAP1 POP JUMP JUMPDEST POP JUMPDEST PUSH2 0x37AF PUSH1 0x6E DUP5 PUSH2 0x3D0A JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x3629 JUMP JUMPDEST POP PUSH2 0x37DB JUMP JUMPDEST PUSH2 0x37DB DUP7 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x37CE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x3D2D JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3800 JUMPI POP PUSH2 0x3800 PUSH2 0x2D28 JUMP JUMPDEST DUP1 PUSH2 0x380E JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x382A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x52FB JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3855 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x385D PUSH2 0x3E79 JUMP JUMPDEST PUSH2 0x3865 PUSH2 0x3EFA JUMP JUMPDEST DUP1 ISZERO PUSH2 0xD10 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST DUP1 SLOAD ISZERO PUSH2 0x3898 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x54BC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP2 DUP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x38CC JUMPI POP PUSH1 0x0 PUSH2 0x794 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x38D9 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x28A6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5446 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28A6 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x3FD4 JUMP JUMPDEST NUMBER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3950 DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3970 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x794 JUMPI POP PUSH2 0x3969 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3970 JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x397F DUP6 DUP6 PUSH2 0x400B JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x398D JUMPI POP DUP1 JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x39B7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x51F2 JUMP JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x39C0 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x3A23 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x4100 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xF6A JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x3A41 SWAP2 SWAP1 PUSH2 0x4792 JUMP JUMPDEST PUSH2 0xF6A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5709 JUMP JUMPDEST PUSH1 0x75 SLOAD PUSH1 0x0 SWAP1 DUP3 SWAP1 DUP3 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x3B01 JUMPI PUSH2 0x3A77 PUSH2 0x43F5 JUMP JUMPDEST PUSH1 0x75 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x3A84 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP4 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP5 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP3 DUP5 ADD DUP4 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP4 ADD MSTORE SWAP1 SWAP3 POP PUSH2 0x3AD6 SWAP1 DUP7 SWAP1 PUSH2 0x410F JUMP JUMPDEST SWAP1 POP PUSH2 0x3AEB DUP3 PUSH1 0x0 ADD MLOAD DUP3 DUP5 PUSH1 0x40 ADD MLOAD PUSH2 0x4123 JUMP JUMPDEST PUSH2 0x3AF5 DUP8 DUP3 PUSH2 0x2EC5 JUMP JUMPDEST SWAP7 POP POP POP PUSH1 0x1 ADD PUSH2 0x3A67 JUMP JUMPDEST POP SWAP3 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3B16 PUSH1 0x70 PUSH2 0x3CE7 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x3B4C JUMPI POP PUSH2 0x3B36 PUSH1 0x70 PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x3C70 JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP3 PUSH4 0x70A08231 SWAP3 PUSH2 0x3B84 SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4AE0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3B9C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3BB0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3BD4 SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x3C5D JUMPI PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SWAP1 MLOAD PUSH4 0x16960D55 PUSH1 0xE0 SHL DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x16960D55 SWAP2 PUSH2 0x3C22 SWAP2 DUP8 SWAP2 DUP8 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B0E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3C3C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3C50 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x3C5D DUP3 PUSH2 0x2C52 JUMP JUMPDEST PUSH2 0x3C68 PUSH1 0x70 DUP4 PUSH2 0x3D0A JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3B19 JUMP JUMPDEST PUSH2 0xFCB PUSH1 0x70 PUSH2 0x412E JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x67 SLOAD PUSH1 0x40 MLOAD PUSH4 0x358DC31D PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 PUSH4 0x6B1B863A SWAP3 PUSH2 0x3CB1 SWAP3 DUP8 SWAP3 DUP8 SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4BDD JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3CCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3CDF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3D39 PUSH1 0x6E PUSH2 0x3CE7 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x3D6F JUMPI POP PUSH2 0x3D59 PUSH1 0x6E PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0xFCB JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP3 PUSH4 0x70A08231 SWAP3 PUSH2 0x3DA7 SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4AE0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3DBF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3DD3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3DF7 SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x3E66 JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0xAC2AC51 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x2B0AB144 SWAP1 PUSH2 0x3E33 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B75 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3E4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3E61 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x3E71 PUSH1 0x6E DUP4 PUSH2 0x3D0A JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3D3C JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3E92 JUMPI POP PUSH2 0x3E92 PUSH2 0x2D28 JUMP JUMPDEST DUP1 PUSH2 0x3EA0 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3EBC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x52FB JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3865 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xD10 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3F13 JUMPI POP PUSH2 0x3F13 PUSH2 0x2D28 JUMP JUMPDEST DUP1 PUSH2 0x3F21 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3F3D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x52FB JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3F68 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x3F72 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0xD10 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x3FF5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP2 SWAP1 PUSH2 0x4D4C JUMP JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x4001 JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x4029 SWAP2 SWAP1 PUSH2 0x4D37 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x7530 DUP5 PUSH1 0x40 MLOAD PUSH2 0x407D SWAP2 SWAP1 PUSH2 0x4ABB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x40B9 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x40BE JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x40DC JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x40F9 JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x40F1 SWAP2 SWAP1 PUSH2 0x4792 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x2810 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x41CA JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28A6 PUSH2 0xFFFF DUP4 AND DUP5 MUL PUSH2 0x3E8 PUSH2 0x3996 JUMP JUMPDEST PUSH2 0xF6A DUP4 DUP4 DUP4 PUSH2 0x428B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP1 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x416C JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST ISZERO PUSH2 0x41A2 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP4 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP2 AND SWAP1 SWAP2 SSTORE AND PUSH2 0x414A JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE DUP3 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x41EC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x516A JUMP JUMPDEST PUSH2 0x41F5 DUP6 PUSH2 0x39C8 JUMP JUMPDEST PUSH2 0x4211 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x563E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD PUSH2 0x422E SWAP2 SWAP1 PUSH2 0x4ABB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x426B JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4270 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x4280 DUP3 DUP3 DUP7 PUSH2 0x43BC JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4EB1C245 PUSH1 0xE1 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x9D63848A SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x42D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x42E4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x430C SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4628 JUMP JUMPDEST SWAP1 POP DUP1 MLOAD DUP3 PUSH1 0xFF AND GT ISZERO PUSH2 0x4332 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5675 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH1 0xFF AND DUP2 MLOAD DUP2 LT PUSH2 0x4343 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x358DC31D PUSH1 0xE1 SHL DUP2 MSTORE SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x6B1B863A SWAP1 PUSH2 0x4383 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4BDD JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x439D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x43B1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x43CB JUMPI POP DUP2 PUSH2 0x28A6 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x43DB JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST DUP2 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP2 SWAP1 PUSH2 0x4D4C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST POP DUP1 SLOAD PUSH1 0x0 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0xD10 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x2EC1 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x442F JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x4454 JUMPI DUP1 DUP2 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x446B JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x40F9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4496 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x44A0 PUSH1 0x60 PUSH2 0x5A8C JUMP JUMPDEST SWAP1 POP DUP2 CALLDATALOAD PUSH2 0x44AD DUP2 PUSH2 0x5AFF JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH2 0xFFFF DUP2 AND DUP2 EQ PUSH2 0x44C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x44D6 DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x44E1 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x794 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4503 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x28A6 DUP2 PUSH2 0x5AFF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x451F JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x28A6 DUP2 PUSH2 0x5AFF JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x453F JUMPI DUP3 DUP4 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x454A DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x455A DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x4571 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x458E JUMPI DUP1 DUP2 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x4599 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x45A9 DUP2 PUSH2 0x5B14 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x45C6 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x45D1 DUP2 PUSH2 0x5AFF JUMP JUMPDEST PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD MLOAD SWAP3 SWAP5 SWAP3 SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x45F6 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x4601 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x4618 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x4571 DUP2 PUSH2 0x5AFF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x463A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4650 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x4660 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 MLOAD PUSH2 0x4673 PUSH2 0x466E DUP3 PUSH2 0x5AB3 JUMP JUMPDEST PUSH2 0x5A8C JUMP JUMPDEST DUP2 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP4 DUP6 ADD DUP6 DUP5 MUL DUP6 ADD DUP7 ADD DUP10 LT ISZERO PUSH2 0x468F JUMPI DUP7 DUP8 REVERT JUMPDEST DUP7 SWAP5 POP JUMPDEST DUP4 DUP6 LT ISZERO PUSH2 0x46BA JUMPI DUP1 MLOAD PUSH2 0x46A6 DUP2 PUSH2 0x5AFF JUMP JUMPDEST DUP4 MSTORE PUSH1 0x1 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP2 DUP6 ADD SWAP2 DUP6 ADD PUSH2 0x4693 JUMP JUMPDEST POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x46D8 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x46EE JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x46FA DUP6 DUP3 DUP7 ADD PUSH2 0x4443 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4718 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x472F JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x4742 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x4750 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 PUSH1 0x60 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x4764 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4787 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x28A6 DUP2 PUSH2 0x5B14 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x47A3 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x28A6 DUP2 PUSH2 0x5B14 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x47BF JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND DUP2 EQ PUSH2 0x28A6 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x47E8 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x47F3 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x45A9 DUP2 PUSH2 0x5AFF JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4817 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x4822 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x483D JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x4849 DUP7 DUP3 DUP8 ADD PUSH2 0x4443 JUMP JUMPDEST SWAP5 SWAP8 SWAP1 SWAP7 POP SWAP4 SWAP5 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4867 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x28A6 DUP4 DUP4 PUSH2 0x4485 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x80 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4883 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x488D DUP5 DUP5 PUSH2 0x4485 JUMP JUMPDEST SWAP2 POP PUSH2 0x489C DUP5 PUSH1 0x60 DUP6 ADD PUSH2 0x44E1 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x48B6 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x48CE JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x48EF JUMPI DUP5 DUP6 REVERT JUMPDEST DUP8 CALLDATALOAD SWAP7 POP PUSH1 0x20 DUP1 DUP10 ADD CALLDATALOAD SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x4909 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD PUSH2 0x4919 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH2 0x4929 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP4 POP PUSH1 0xA0 DUP10 ADD CALLDATALOAD PUSH2 0x4939 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP3 POP PUSH1 0xC0 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4954 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP10 ADD PUSH1 0x1F DUP2 ADD DUP12 SGT PUSH2 0x4964 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x4972 PUSH2 0x466E DUP3 PUSH2 0x5AB3 JUMP JUMPDEST DUP2 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP4 DUP6 ADD DUP6 DUP5 MUL DUP6 ADD DUP7 ADD DUP16 LT ISZERO PUSH2 0x498E JUMPI DUP7 DUP8 REVERT JUMPDEST DUP7 SWAP5 POP JUMPDEST DUP4 DUP6 LT ISZERO PUSH2 0x49B9 JUMPI DUP1 CALLDATALOAD PUSH2 0x49A5 DUP2 PUSH2 0x5AFF JUMP JUMPDEST DUP4 MSTORE PUSH1 0x1 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP2 DUP6 ADD SWAP2 DUP6 ADD PUSH2 0x4992 JUMP JUMPDEST POP DUP1 SWAP6 POP POP POP POP POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x49E8 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP8 CALLDATALOAD SWAP7 POP PUSH1 0x20 DUP9 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH2 0x4A01 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP5 POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH2 0x4A11 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP4 POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH2 0x4A21 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP3 POP PUSH1 0xA0 DUP9 ADD CALLDATALOAD PUSH2 0x4A31 DUP2 PUSH2 0x5AFF JUMP JUMPDEST DUP1 SWAP3 POP POP PUSH1 0xC0 DUP9 ADD CALLDATALOAD SWAP1 POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4A59 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x28A6 DUP2 PUSH2 0x5B22 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4A76 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x4A81 DUP2 PUSH2 0x5B22 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH2 0x45A9 DUP2 PUSH2 0x5B22 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH2 0xFFFF AND SWAP1 DUP4 ADD MSTORE PUSH1 0x40 SWAP1 DUP2 ADD MLOAD PUSH1 0xFF AND SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x4ACD DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x5AD3 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND DUP3 MSTORE DUP4 AND PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 PUSH1 0x40 DUP4 ADD DUP2 SWAP1 MSTORE DUP4 SLOAD SWAP1 DUP4 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 DUP5 DUP2 MSTORE DUP3 DUP2 KECCAK256 SWAP1 SWAP3 SWAP1 SWAP2 PUSH1 0x80 DUP6 ADD SWAP2 SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4B67 JUMPI DUP5 SLOAD DUP5 MSTORE PUSH1 0x1 SWAP5 DUP6 ADD SWAP5 SWAP4 DUP4 ADD SWAP4 ADD PUSH2 0x4B4B JUMP JUMPDEST POP SWAP2 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND DUP2 MSTORE SWAP3 DUP5 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 SWAP2 AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE SWAP1 DUP4 AND PUSH1 0x40 DUP4 ADD MSTORE SWAP1 SWAP2 AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4C6C JUMPI DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x4C47 JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4C6C JUMPI PUSH2 0x4CA7 DUP4 DUP6 MLOAD PUSH2 0x4A92 JUMP JUMPDEST SWAP3 DUP5 ADD SWAP3 PUSH1 0x60 SWAP3 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x4C94 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xFB SHL SUB DUP4 GT ISZERO PUSH2 0x4CD9 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH1 0x20 DUP4 MUL DUP1 DUP6 PUSH1 0x40 DUP6 ADD CALLDATACOPY SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP1 DUP2 MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4C6C JUMPI DUP4 MLOAD DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x4D10 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x4D6B DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x5AD3 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x24 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6572633732312D696E76 PUSH1 0x40 DUP3 ADD MSTORE PUSH4 0x185B1A59 PUSH1 0xE2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2C SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F746F6B656E2D6C697374 PUSH1 0x40 DUP3 ADD MSTORE PUSH12 0x195B995C8B5A5B9D985B1A59 PUSH1 0xA2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xF SWAP1 DUP3 ADD MSTORE PUSH15 0x496E76616C69642061646472657373 PUSH1 0x88 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x13 SWAP1 DUP3 ADD MSTORE PUSH19 0x496E76616C6964207072657641646472657373 PUSH1 0x68 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2B SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A652D70657269 PUSH1 0x40 DUP3 ADD MSTORE PUSH11 0x37B216B737BA16B7BB32B9 PUSH1 0xA9 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x646472657373 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2C SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6F6E6C792D6F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH12 0x16B7B916B634B9BA32B732B9 PUSH1 0xA1 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2A SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F73706F6E736F72736869 PUSH1 0x40 DUP3 ADD MSTORE PUSH10 0x702D6E6F742D7A65726F PUSH1 0xB0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x28 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH8 0x34BA16BA37B5B2B7 PUSH1 0xC1 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x34 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A652D70657269 PUSH1 0x40 DUP3 ADD MSTORE PUSH20 0x6F642D677265617465722D7468616E2D7A65726F PUSH1 0x60 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6F6E6C792D7072697A65 PUSH1 0x40 DUP3 ADD MSTORE PUSH5 0xB5C1BDBDB PUSH1 0xDA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7472616E736665722D74 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x3796B9B2B633 PUSH1 0xD1 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1E SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x29 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A652D706F6F6C PUSH1 0x40 DUP3 ADD MSTORE PUSH9 0x2D6E6F742D7A65726F PUSH1 0xB8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x416464726573733A20696E73756666696369656E742062616C616E636520666F PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x1C8818D85B1B PUSH1 0xD2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x22 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D7A65 PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x726F PUSH1 0xF0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1A SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D636F PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x6D706C657465 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x29 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH9 0x1A5D0B5D185C99D95D PUSH1 0xBA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x23 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F65726332302D696E7661 PUSH1 0x40 DUP3 ADD MSTORE PUSH3 0x1B1A59 PUSH1 0xEA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2E SWAP1 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x40 DUP3 ADD MSTORE PUSH14 0x191E481A5B9A5D1A585B1A5E9959 PUSH1 0x92 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F6E6F6E6578697374656E742D7072697A PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x195CDC1B1A5D PUSH1 0xD2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F65726332302D6E756C6C PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2B SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D616C72656164 PUSH1 0x40 DUP3 ADD MSTORE PUSH11 0x1E4B5C995C5D595CDD1959 PUSH1 0xAA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1F SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F77696E6E6572732D6774652D6F6E6500 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x21 SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206D756C7469706C69636174696F6E206F766572666C6F PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x77 PUSH1 0xF8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xC SWAP1 DUP3 ADD MSTORE PUSH12 0x105B1C9958591E481A5B9A5D PUSH1 0xA2 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x33 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH19 0x1A5D0B5C195C98D95B9D1859D94B5D1BDD185B PUSH1 0x6A SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x31 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6265666F726541776172 PUSH1 0x40 DUP3 ADD MSTORE PUSH17 0x19131A5CDD195B995C8B5A5B9D985B1A59 PUSH1 0x7A SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2B SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F63616E6E6F742D617761 PUSH1 0x40 DUP3 ADD MSTORE PUSH11 0x1C990B595E1D195C9B985B PUSH1 0xAA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xD SWAP1 DUP3 ADD MSTORE PUSH13 0x105B1C9958591E481859191959 PUSH1 0x9A SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x53616665436173743A2076616C756520646F65736E27742066697420696E2033 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x322062697473 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2F SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F61776172642D696E7661 PUSH1 0x40 DUP3 ADD MSTORE PUSH15 0xD8D2C85AE8DED6CADC5AD2DCC8CAF PUSH1 0x8B SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7469636B65742D6E6F74 PUSH1 0x40 DUP3 ADD MSTORE PUSH5 0x2D7A65726F PUSH1 0xD8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2A SWAP1 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A204552433230206F7065726174696F6E20646964206E PUSH1 0x40 DUP3 ADD MSTORE PUSH10 0x1BDD081CDD58D8D95959 PUSH1 0xB2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x33 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A655374726174 PUSH1 0x40 DUP3 ADD MSTORE PUSH19 0x1959DE531A5CDD195B995C8B5A5B9D985B1A59 PUSH1 0x6A SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x36 SWAP1 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A20617070726F76652066726F6D206E6F6E2D7A65726F PUSH1 0x40 DUP3 ADD MSTORE PUSH22 0x20746F206E6F6E2D7A65726F20616C6C6F77616E6365 PUSH1 0x50 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6572633732312D647570 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x6C6963617465 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x23 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D696E2D666C69 PUSH1 0x40 DUP3 ADD MSTORE PUSH3 0x19DA1D PUSH1 0xEA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D7469 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x1B59591BDD5D PUSH1 0xD2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2C SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D74696D656F75 PUSH1 0x40 DUP3 ADD MSTORE PUSH12 0x742D67742D36302D73656373 PUSH1 0xA0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x27 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D7265 PUSH1 0x40 DUP3 ADD MSTORE PUSH7 0x1C5D595CDD1959 PUSH1 0xCA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x27 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F756E617661696C61626C PUSH1 0x40 DUP3 ADD MSTORE PUSH7 0x3296BA37B5B2B7 PUSH1 0xC9 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x794 DUP3 DUP5 PUSH2 0x4A92 JUMP JUMPDEST PUSH2 0xFFFF SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0xFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH2 0xFFFF SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0xFF SWAP2 DUP3 AND PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP7 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP8 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x40 DUP5 ADD MSTORE DUP6 DUP2 AND PUSH1 0x60 DUP5 ADD MSTORE DUP5 DUP2 AND PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0xC0 PUSH1 0xA0 DUP5 ADD DUP2 SWAP1 MSTORE DUP5 MLOAD SWAP1 DUP5 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP3 DUP6 DUP2 ADD SWAP3 SWAP1 SWAP2 PUSH1 0xE0 DUP7 ADD SWAP1 DUP6 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x5A69 JUMPI DUP6 MLOAD DUP5 AND DUP4 MSTORE SWAP5 DUP5 ADD SWAP5 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x5A4B JUMP JUMPDEST POP SWAP1 SWAP13 SWAP12 POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5AAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x5AC9 JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5AEE JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x5AD6 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xC70 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xD10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xD10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xD10 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBE CALLDATACOPY ISZERO 0x2A MSIZE RETURN DUP13 SUB 0xD6 PUSH12 0xA04FE9D77A5FB0E1EE0351E6 PUSH11 0x3DB2328C356197EDAD6473 PUSH16 0x6C634300060C00330000000000000000 ",
              "sourceMap": "160:9726:55:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7667:227:50;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;191:249:95;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4550:55:50:-;;;:::i;:::-;;;;;;;:::i;835:34:55:-;;;:::i;18960:89:50:-;;;:::i;3846:221:55:-;;;;;;:::i;:::-;;:::i;19655:93:50:-;;;:::i;:::-;;;;;;;:::i;12004:158::-;;;:::i;16435:488::-;;;;;;:::i;:::-;;:::i;:::-;;5490:242:55;;;;;;:::i;:::-;;:::i;24282:124:50:-;;;:::i;:::-;;;;;;;:::i;18167:161::-;;;;;;:::i;:::-;;:::i;19202:107::-;;;:::i;14908:330::-;;;:::i;13261:385::-;;;;;;:::i;:::-;;:::i;22329:169::-;;;;;;:::i;:::-;;:::i;3759:36::-;;;:::i;4995:207:55:-;;;;;;:::i;:::-;;:::i;6934:401:50:-;;;;;;:::i;:::-;;:::i;21913:122::-;;;:::i;23082:253::-;;;;;;:::i;:::-;;:::i;26849:333::-;;;;;;:::i;:::-;;:::i;18705:111::-;;;:::i;3623:43::-;;;:::i;19465:100::-;;;:::i;3726:29::-;;;:::i;5904:125:55:-;;;;;;:::i;:::-;;:::i;709:30::-;;;:::i;1967:145:0:-;;;:::i;3696:26:50:-;;;:::i;4127:35::-;;;:::i;27625:221::-;;;:::i;2979:559:55:-;;;;;;:::i;:::-;;:::i;19896:232:50:-;;;;;;:::i;:::-;;:::i;18458:113::-;;;:::i;21170:159::-;;;;;;:::i;:::-;;:::i;17087:601::-;;;;;;:::i;:::-;;:::i;6614:94:55:-;;;:::i;2617:103:54:-;;;:::i;:::-;;;;;;;:::i;1335:85:0:-;;;:::i;551:45:55:-;;;;;;:::i;:::-;;:::i;4090:33:50:-;;;:::i;24574:174::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;8699:96::-;;;:::i;403:36:55:-;;;:::i;4469:193::-;;;;;;:::i;:::-;;:::i;4036:31:50:-;;;:::i;23818:296::-;;;;;;:::i;:::-;;:::i;12695:420::-;;;;;;:::i;:::-;;:::i;14279:539::-;;;:::i;3456:1572:54:-;;;;;;:::i;:::-;;:::i;4677:75:50:-;;;:::i;6692:96::-;;;:::i;25173:727::-;;;;;;:::i;:::-;;:::i;20373:154::-;;;;;;:::i;:::-;;:::i;8062:119::-;;;:::i;3799:23::-;;;:::i;15374:792::-;;;:::i;2984:140:54:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2261:240:0:-;;;;;;:::i;:::-;;:::i;5142:1380:50:-;;;;;;:::i;:::-;;:::i;5375:862:54:-;;;;;;:::i;:::-;;:::i;3561:40:50:-;;;:::i;:::-;;;;;;;:::i;7667:227::-;7761:7;7783:106;7822:30;:28;:30::i;:::-;7860:23;7783:31;:106::i;:::-;7776:113;7667:227;-1:-1:-1;;7667:227:50:o;191:249:95:-;270:4;-1:-1:-1;;;;;;;;;297:51:95;;;;:132;;-1:-1:-1;;;;;;;;359:70:95;-1:-1:-1;;;;;;359:70:95;;191:249::o;4550:55:50:-;;;-1:-1:-1;;;;;4550:55:50;;:::o;835:34:55:-;;;;:::o;18960:89:50:-;19026:10;:13;;;:18;;18960:89;;:::o;3846:221:55:-;3956:4;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;;;;;;;;;28168:28:50::1;:26;:28::i;:::-;-1:-1:-1::0;;;;;3968:20:55;::::2;;::::0;;;:13:::2;:20;::::0;;;;;;:33;;-1:-1:-1;;3968:33:55::2;::::0;::::2;;;::::0;;4013:31;::::2;::::0;::::2;::::0;3968:33;;4013:31:::2;:::i;:::-;;;;;;;;-1:-1:-1::0;4058:4:55::2;3846:221:::0;;;;:::o;19655:93:50:-;19730:10;:13;;;19655:93;:::o;12004:158::-;12055:7;12138:19;:17;:19::i;:::-;12131:26;;12004:158;:::o;16435:488::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;-1:-1:-1::0;;;;;16584:43:50;::::2;::::0;;:164:::2;;-1:-1:-1::0;16631:117:50::2;-1:-1:-1::0;;;;;16631:47:50;::::2;-1:-1:-1::0;;;16631:47:50::2;:117::i;:::-;16569:244;;;::::0;-1:-1:-1;;;16569:244:50;;::::2;::::0;::::2;;;:::i;:::-;16820:19;:42:::0;;-1:-1:-1;;;;;;16820:42:50::2;-1:-1:-1::0;;;;;16820:42:50;::::2;::::0;;::::2;::::0;;;16874:44:::2;::::0;::::2;::::0;-1:-1:-1;;16874:44:50::2;16435:488:::0;:::o;5490:242:55:-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;5610:24:55::2;:52:::0;;-1:-1:-1;;5610:52:55::2;::::0;::::2;;;::::0;;;;5674:53:::2;::::0;::::2;::::0;::::2;::::0;5610:52:::2;5702:24:::0;;::::2;::::0;5674:53:::2;:::i;:::-;;;;;;;;5490:242:::0;:::o;24282:124:50:-;24340:16;24371:30;:15;:28;:30::i;18167:161::-;18254:7;18276:47;18311:11;18276:34;:47::i;19202:107::-;19268:3;;19290:10;:13;19268:36;;-1:-1:-1;;;19268:36:50;;19249:4;;-1:-1:-1;;;;;19268:3:50;;:21;;:36;;19290:13;;;19268:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14908:330::-;14952:15;:13;:15::i;:::-;14944:66;;;;-1:-1:-1;;;14944:66:50;;;;;;;:::i;:::-;15035:10;:13;;-1:-1:-1;;15099:17:50;;;;;15127:18;;15035:13;;;;;15073:20;;;;;15127:18;;-1:-1:-1;;15127:18:50;15200:9;;15156:77;;;;;;-1:-1:-1;;;;;15200:9:50;;15180:10;;15156:77;;;;15223:9;;15156:77;:::i;:::-;;;;;;;;14908:330;;:::o;13261:385::-;28682:9;;-1:-1:-1;;;;;28682:9:50;28658:12;:10;:12::i;:::-;-1:-1:-1;;;;;28658:34:50;;28650:84;;;;-1:-1:-1;;;28650:84:50;;;;;;;:::i;:::-;13460:6:::1;::::0;-1:-1:-1;;;;;13433:34:50;;::::1;13460:6:::0;::::1;13433:34;13429:83;;;13477:28;:26;:28::i;:::-;13529:13;::::0;-1:-1:-1;;;;;13529:13:50::1;13521:36:::0;13517:125:::1;;13567:13;::::0;:68:::1;::::0;-1:-1:-1;;;13567:68:50;;-1:-1:-1;;;;;13567:13:50;;::::1;::::0;:29:::1;::::0;:68:::1;::::0;13597:2;;13601:6;;13609:15;;13626:8;;13567:68:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;13517:125;13261:385:::0;;;;:::o;22329:169::-;27911:7;:5;:7::i;:::-;-1:-1:-1;;;;;27895:23:50;:12;:10;:12::i;:::-;-1:-1:-1;;;;;27895:23:50;;;:93;;-1:-1:-1;27958:29:50;;-1:-1:-1;;;;;27958:29:50;27934:12;:10;:12::i;:::-;-1:-1:-1;;;;;27934:54:50;;27895:93;:153;;;-1:-1:-1;28028:19:50;;-1:-1:-1;;;;;28028:19:50;28004:12;:10;:12::i;:::-;-1:-1:-1;;;;;28004:44:50;;27895:153;27887:222;;;;-1:-1:-1;;;27887:222:50;;;;;;;:::i;:::-;28168:28:::1;:26;:28::i;:::-;22455:38:::2;22478:14;22455:22;:38::i;:::-;22329:169:::0;:::o;3759:36::-;;;-1:-1:-1;;;;;3759:36:50;;:::o;4995:207:55:-;5097:4;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;5109:19:55::2;:28:::0;;;5149:30:::2;::::0;::::2;::::0;::::2;::::0;5131:6;;5149:30:::2;:::i;:::-;;;;;;;;-1:-1:-1::0;5193:4:55::2;4995:207:::0;;;:::o;6934:401:50:-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;-1:-1:-1::0;;;;;7058:37:50;::::2;::::0;;:139:::2;;-1:-1:-1::0;7099:98:50::2;-1:-1:-1::0;;;;;7099:41:50;::::2;-1:-1:-1::0;;;;;;7099:41:50::2;:98::i;:::-;7050:196;;;::::0;-1:-1:-1;;;7050:196:50;;::::2;::::0;::::2;;;:::i;:::-;7253:13;:30:::0;;-1:-1:-1;;;;;;7253:30:50::2;-1:-1:-1::0;;;;;7253:30:50;;::::2;::::0;;;::::2;::::0;;;;7295:35:::2;::::0;7316:13;::::2;::::0;7295:35:::2;::::0;-1:-1:-1;;7295:35:50::2;6934:401:::0;:::o;21913:122::-;21970:16;22001:29;:14;:27;:29::i;23082:253::-;27911:7;:5;:7::i;:::-;-1:-1:-1;;;;;27895:23:50;:12;:10;:12::i;:::-;-1:-1:-1;;;;;27895:23:50;;;:93;;-1:-1:-1;27958:29:50;;-1:-1:-1;;;;;27958:29:50;27934:12;:10;:12::i;:::-;-1:-1:-1;;;;;27934:54:50;;27895:93;:153;;;-1:-1:-1;28028:19:50;;-1:-1:-1;;;;;28028:19:50;28004:12;:10;:12::i;:::-;-1:-1:-1;;;;;28004:44:50;;27895:153;27887:222;;;;-1:-1:-1;;;27887:222:50;;;;;;;:::i;:::-;28168:28:::1;:26;:28::i;:::-;23226:9:::2;23221:110;23241:26:::0;;::::2;23221:110;;;23282:42;23305:15;;23321:1;23305:18;;;;;;;;;;;;;;;;;;;;:::i;:::-;23282:22;:42::i;:::-;23269:3;;23221:110;;;;23082:253:::0;;:::o;26849:333::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;27037:85:::2;:15;27075:19:::0;27105:15;27037:29:::2;:85::i;:::-;27128:49;27161:15;27128:32;:49::i;:::-;26849:333:::0;;:::o;18705:111::-;18756:4;18775:16;:14;:16::i;:::-;:36;;;;;18795:16;:14;:16::i;3623:43::-;;;-1:-1:-1;;;;;3623:43:50;;:::o;19465:100::-;19540:10;:20;;;;;;;19465:100::o;3726:29::-;;;-1:-1:-1;;;;;3726:29:50;;:::o;5904:125:55:-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;5998:26:55::2;6018:5;5998:19;:26::i;709:30::-:0;;;;;;:::o;1967:145:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;2057:6:::1;::::0;2036:40:::1;::::0;2073:1:::1;::::0;-1:-1:-1;;;;;2057:6:0::1;::::0;2036:40:::1;::::0;2073:1;;2036:40:::1;2086:6;:19:::0;;-1:-1:-1;;;;;;2086:19:0::1;::::0;;1967:145::o;3696:26:50:-;;;-1:-1:-1;;;;;3696:26:50;;:::o;4127:35::-;;;;:::o;27625:221::-;27687:10;:22;27671:4;;-1:-1:-1;;;27687:22:50;;;;27683:159;;-1:-1:-1;27731:5:50;27724:12;;27683:159;27812:10;:22;27789:17;;27781:54;;27812:22;27789:17;;;;-1:-1:-1;;;27812:22:50;;;;;;27781:30;:54;:::i;:::-;27764:14;:12;:14::i;:::-;:71;27757:78;;;;2979:559:55;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;:::i;:::-;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;3252:47:55::1;3306:183;3346:17;3371:19;3398:10;3416:7;3431:12;3451:4;3463:20;3306:32;:183::i;:::-;3496:37;3516:16;3496:19;:37::i;:::-;1778:1:9;1794:14:::0;1790:66;;;-1:-1:-1;;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;-1:-1:-1;;;;;;2979:559:55:o;19896:232:50:-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;20004:16:::2;:14;:16::i;:::-;20003:17;19995:65;;;::::0;-1:-1:-1;;;19995:65:50;;::::2;::::0;::::2;;;:::i;:::-;20067:3;:16:::0;;-1:-1:-1;;;;;;20067:16:50::2;-1:-1:-1::0;;;;;20067:16:50;::::2;::::0;;::::2;::::0;;;20094:29:::2;::::0;::::2;::::0;-1:-1:-1;;20094:29:50::2;19896:232:::0;:::o;18458:113::-;18506:4;18525:20;:18;:20::i;:::-;:41;;;;;18550:16;:14;:16::i;:::-;18549:17;18518:48;;18458:113;:::o;21170:159::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;21281:43:::2;21304:19;21281:22;:43::i;17087:601::-:0;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;-1:-1:-1::0;;;;;17266:53:50;::::2;::::0;;:205:::2;;-1:-1:-1::0;17323:148:50::2;-1:-1:-1::0;;;;;17323:57:50;::::2;-1:-1:-1::0;;;17323:57:50::2;:148::i;:::-;17251:287;;;::::0;-1:-1:-1;;;17251:287:50;;::::2;::::0;::::2;;;:::i;:::-;17545:29;:62:::0;;-1:-1:-1;;;;;;17545:62:50::2;-1:-1:-1::0;;;;;17545:62:50;::::2;::::0;;::::2;::::0;;;17619:64:::2;::::0;::::2;::::0;-1:-1:-1;;17619:64:50::2;17087:601:::0;:::o;6614:94:55:-;6686:17;;6614:94;:::o;2617:103:54:-;2663:25;2703:12;2696:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2696:19:54;;;;-1:-1:-1;;;2696:19:54;;;;;;;;-1:-1:-1;;;2696:19:54;;;;;;;;;;-1:-1:-1;2696:19:54;;;;;;;;;;;;;;2617:103;:::o;1335:85:0:-;1407:6;;-1:-1:-1;;;;;1407:6:0;;1335:85::o;551:45:55:-;;;;;;;;;;;;;;;:::o;4090:33:50:-;;;;:::o;24574:174::-;-1:-1:-1;;;;;24704:39:50;;;;;;:22;:39;;;;;;;;;24697:46;;;;;;;;;;;;;;;;;24673:16;;24697:46;;;24704:39;24697:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24574:174;;;:::o;8699:96::-;8751:4;8770:20;:18;:20::i;403:36:55:-;;;;;;:::o;4469:193::-;4563:4;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;4575:18:55::2;:27:::0;;-1:-1:-1;;4575:27:55::2;::::0;::::2;;;::::0;;4614:25:::2;::::0;::::2;::::0;::::2;::::0;4575:27;;4614:25:::2;:::i;4036:31:50:-:0;;;;;;:::o;23818:296::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;23975:82:::2;:14;24012:18:::0;24041:14;23975:28:::2;:82::i;:::-;24068:41;::::0;-1:-1:-1;;;;;24068:41:50;::::2;::::0;::::2;::::0;;;::::2;23818:296:::0;;:::o;12695:420::-;28682:9;;-1:-1:-1;;;;;28682:9:50;28658:12;:10;:12::i;:::-;-1:-1:-1;;;;;28658:34:50;;28650:84;;;;-1:-1:-1;;;28650:84:50;;;;;;;:::i;:::-;-1:-1:-1;;;;;12837:10:50;;::::1;::::0;;::::1;;;12829:61;;;::::0;-1:-1:-1;;;12829:61:50;;::::1;::::0;::::1;;;:::i;:::-;12928:6;::::0;-1:-1:-1;;;;;12901:34:50;;::::1;12928:6:::0;::::1;12901:34;12897:83;;;12945:28;:26;:28::i;:::-;12998:13;::::0;-1:-1:-1;;;;;12998:13:50::1;12990:36:::0;12986:125:::1;;13036:13;::::0;:68:::1;::::0;-1:-1:-1;;;13036:68:50;;-1:-1:-1;;;;;13036:13:50;;::::1;::::0;-1:-1:-1;;13036:68:50::1;::::0;13070:4;;13076:2;;13080:6;;13088:15;;13036:68:::1;;;:::i;14279:539::-:0;28258:20;:18;:20::i;:::-;28250:76;;;;-1:-1:-1;;;28250:76:50;;;;;;;:::i;:::-;28341:16;:14;:16::i;:::-;28340:17;28332:73;;;;-1:-1:-1;;;28332:73:50;;;;;;;:::i;:::-;14378:3:::1;::::0;:19:::1;::::0;;-1:-1:-1;;;14378:19:50;;;;14338:16:::1;::::0;;;-1:-1:-1;;;;;14378:3:50;;::::1;::::0;-1:-1:-1;;14378:19:50::1;::::0;;::::1;::::0;;;;;;;:3;:19;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14337:60:::0;;-1:-1:-1;14337:60:50;-1:-1:-1;;;;;;14407:22:50;::::1;::::0;;::::1;::::0;:40:::1;;;14446:1;14433:10;:14;14407:40;14403:126;;;14505:3;::::0;14457:65:::1;::::0;-1:-1:-1;;;;;14457:39:50;;::::1;::::0;14505:3:::1;14511:10:::0;14457:39:::1;:65::i;:::-;14574:3;::::0;:25:::1;::::0;;-1:-1:-1;;;14574:25:50;;;;14536:16:::1;::::0;;;-1:-1:-1;;;;;14574:3:50;;::::1;::::0;:23:::1;::::0;:25:::1;::::0;;::::1;::::0;;;;;;;14536:16;14574:3;:25;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14605:10;:25:::0;;::::1;14636:32:::0;;::::1;::::0;::::1;-1:-1:-1::0;;14605:25:50;;::::1;-1:-1:-1::0;;14605:25:50;;::::1;::::0;;;::::1;14636:32;;::::0;;14605:25;;-1:-1:-1;14636:32:50;-1:-1:-1;14699:25:50::1;:14;:12;:14::i;:::-;:23;:25::i;:::-;14674:10;:50:::0;;-1:-1:-1;;14674:50:50::1;-1:-1:-1::0;;;14674:50:50::1;::::0;;::::1;;;::::0;;14780:9:::1;::::0;14736:77;;::::1;::::0;-1:-1:-1;;;;;14780:9:50::1;14758:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;14736:77:50::1;;14803:9;14736:77;;;;;;:::i;:::-;;;;;;;;28411:1;;;;14279:539::o:0;3456:1572:54:-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;3580:14:54;3549:28:::1;3706:822;3738:20;3730:5;:28;3706:822;;;3777:29;;:::i;:::-;3809:14;;3824:5;3809:21;;;;;;;;;;;;3777:53;;;;;;;;;;:::i;:::-;;;3861:1;3846:5;:11;;;:16;;;;3838:69;;;::::0;-1:-1:-1;;;3838:69:54;;::::1;::::0;::::1;;;:::i;:::-;3923:12:::0;;-1:-1:-1;;;;;3923:26:54::1;3915:80;;;::::0;-1:-1:-1;;;3915:80:54;;::::1;::::0;::::1;;;:::i;:::-;4014:12;:19:::0;:28;-1:-1:-1;4010:381:54::1;;4054:12;:24:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;4054:24:54;;;;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;;-1:-1:-1::0;;;4054:24:54::1;-1:-1:-1::0;;;;4054:24:54::1;::::0;;::::1;-1:-1:-1::0;;;4054:24:54::1;-1:-1:-1::0;;;;;;;;;4054:24:54;;::::1;-1:-1:-1::0;;;;;;4054:24:54;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;;4010:381:::1;;;4103:36;;:::i;:::-;4142:12;4155:5;4142:19;;;;;;;;;::::0;;;::::1;::::0;;;;4103:58:::1;::::0;;::::1;::::0;::::1;::::0;;4142:19;;;::::1;4103:58:::0;-1:-1:-1;;;;;4103:58:54;;::::1;::::0;;;-1:-1:-1;;;4103:58:54;::::1;;;::::0;;::::1;::::0;;;;-1:-1:-1;;;4103:58:54;;::::1;;;::::0;;;;;;;4175:12;;4103:58;;-1:-1:-1;4175:35:54::1;;;::::0;:82:::1;;;4234:12;:23;;;4214:43;;:5;:16;;;:43;;;;4175:82;:119;;;;4276:12;:18;;;4261:33;;:5;:11;;;:33;;;;4175:119;4171:212;;;4330:5;4308:12;4321:5;4308:19;;;;;;;;;::::0;;;::::1;::::0;;;;:27;;:19;::::1;:27:::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;;;4308:27:54;;::::1;-1:-1:-1::0;;;;;4308:27:54;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;4308:27:54::1;-1:-1:-1::0;;;;4308:27:54;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;4308:27:54::1;-1:-1:-1::0;;;;4308:27:54;;::::1;::::0;;;::::1;;::::0;;4171:212:::1;;;4364:8;;;;4171:212;4010:381;;4470:12:::0;;4484:16:::1;::::0;::::1;::::0;4502:11:::1;::::0;;::::1;::::0;4456:65;;-1:-1:-1;;;;;4456:65:54;;::::1;::::0;::::1;::::0;::::1;::::0;4484:16;;4515:5;;4456:65:::1;:::i;:::-;;;;;;;;3706:822;;3760:7;;3706:822;;;;4647:173;4654:12;:19:::0;:42;-1:-1:-1;4647:173:54::1;;;4723:12;:19:::0;4706:14:::1;::::0;4723:26:::1;::::0;4747:1:::1;4723:23;:26::i;:::-;4706:43;;4757:12;:18;;;;;;;;::::0;;;::::1;::::0;;-1:-1:-1;;4757:18:54;;;;;;;-1:-1:-1;;;;;;4757:18:54;;;;;;;;;4788:25:::1;::::0;4806:6;;4788:25:::1;::::0;::::1;4647:173;;;;4870:23;4896:34;:32;:34::i;:::-;4870:60;;4963:4;4944:15;:23;;4936:87;;;::::0;-1:-1:-1;;;4936:87:54;;::::1;::::0;::::1;;;:::i;4677:75:50:-:0;;;-1:-1:-1;;;;;4677:75:50;;:::o;6692:96::-;6759:9;;:24;;;-1:-1:-1;;;6759:24:50;;;;6737:7;;-1:-1:-1;;;;;6759:9:50;;:22;;:24;;;;;;;;;;;;;;:9;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25173:727::-;27911:7;:5;:7::i;:::-;-1:-1:-1;;;;;27895:23:50;:12;:10;:12::i;:::-;-1:-1:-1;;;;;27895:23:50;;;:93;;-1:-1:-1;27958:29:50;;-1:-1:-1;;;;;27958:29:50;27934:12;:10;:12::i;:::-;-1:-1:-1;;;;;27934:54:50;;27895:93;:153;;;-1:-1:-1;28028:19:50;;-1:-1:-1;;;;;28028:19:50;28004:12;:10;:12::i;:::-;-1:-1:-1;;;;;28004:44:50;;27895:153;27887:222;;;;-1:-1:-1;;;27887:222:50;;;;;;;:::i;:::-;28168:28:::1;:26;:28::i;:::-;25340:9:::2;::::0;:52:::2;::::0;-1:-1:-1;;;25340:52:50;;-1:-1:-1;;;;;25340:9:50;;::::2;::::0;-1:-1:-1;;25340:52:50::2;::::0;25375:15;;25340:52:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25332:108;;;::::0;-1:-1:-1;;;25332:108:50;;::::2;::::0;::::2;;;:::i;:::-;25454:80;-1:-1:-1::0;;;;;25454:42:50;::::2;-1:-1:-1::0;;;25454:42:50::2;:80::i;:::-;25446:129;;;::::0;-1:-1:-1;;;25446:129:50;;::::2;::::0;::::2;;;:::i;:::-;25591:50;:15;25624::::0;25591:24:::2;:50::i;:::-;25586:124;;25651:52;:15;25686::::0;25651:26:::2;:52::i;:::-;25721:9;25716:116;25736:20:::0;;::::2;25716:116;;;25771:54;25795:15;25812:9;;25822:1;25812:12;;;;;;;;;;;;;25771:23;:54::i;:::-;25758:3;;25716:116;;;-1:-1:-1::0;25843:52:50::2;::::0;-1:-1:-1;;;;;25843:52:50;::::2;::::0;::::2;::::0;::::2;::::0;25885:9;;;;25843:52:::2;:::i;:::-;;;;;;;;25173:727:::0;;;:::o;20373:154::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;20481:41:::2;20503:18;20481:21;:41::i;8062:119::-:0;8124:7;8146:30;:28;:30::i;3799:23::-;;;-1:-1:-1;;;;;3799:23:50;;:::o;15374:792::-;28470:16;:14;:16::i;:::-;28462:68;;;;-1:-1:-1;;;28462:68:50;;;;;;;:::i;:::-;28544:16;:14;:16::i;:::-;28536:67;;;;-1:-1:-1;;;28536:67:50;;;;;;;:::i;:::-;15461:3:::1;::::0;15478:10:::1;:13:::0;15461:31:::1;::::0;-1:-1:-1;;;15461:31:50;;15438:20:::1;::::0;-1:-1:-1;;;;;15461:3:50::1;::::0;:16:::1;::::0;:31:::1;::::0;15478:13:::1;;::::0;15461:31:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15505:10;15498:17:::0;;-1:-1:-1;;15498:17:50;;;15534:19:::1;::::0;15438:54;;-1:-1:-1;;;;;;15534:19:50::1;15526:42:::0;15522:141:::1;;15578:19;::::0;15635:20:::1;::::0;15578:78:::1;::::0;-1:-1:-1;;;15578:78:50;;-1:-1:-1;;;;;15578:19:50;;::::1;::::0;:42:::1;::::0;:78:::1;::::0;15621:12;;15635:20;15578:78:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;15522:141;15668:25;15680:12;15668:11;:25::i;:::-;15711:29;::::0;-1:-1:-1;;;;;15711:29:50::1;15703:52:::0;15699:160:::1;;15765:29;::::0;15831:20:::1;::::0;15765:87:::1;::::0;-1:-1:-1;;;15765:87:50;;-1:-1:-1;;;;;15765:29:50;;::::1;::::0;:51:::1;::::0;:87:::1;::::0;15817:12;;15831:20;15765:87:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;15699:160;15993:50;16028:14;:12;:14::i;:::-;15993:34;:50::i;:::-;15970:20;:73:::0;16072:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;16055:44:50::1;;16086:12;16055:44;;;;;;:::i;:::-;;;;;;;;16140:20;;16126:12;:10;:12::i;:::-;16110:51;::::0;-1:-1:-1;;;;;16110:51:50;;;::::1;::::0;::::1;::::0;;;::::1;28609:1;15374:792::o:0;2984:140:54:-;3052:23;;:::i;:::-;3090:12;3103:15;3090:29;;;;;;;;;;;;;;;;;3083:36;;;;;;;;3090:29;;;;3083:36;-1:-1:-1;;;;;3083:36:54;;;;-1:-1:-1;;;3083:36:54;;;;;;;;;;;-1:-1:-1;;;3083:36:54;;;;;;;;;;;;;;-1:-1:-1;;2984:140:54:o;2261:240:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2349:22:0;::::1;2341:73;;;::::0;-1:-1:-1;;;2341:73:0;;::::1;::::0;::::1;;;:::i;:::-;2450:6;::::0;2429:38:::1;::::0;-1:-1:-1;;;;;2429:38:0;;::::1;::::0;2450:6:::1;::::0;2429:38:::1;::::0;2450:6:::1;::::0;2429:38:::1;2477:6;:17:::0;;-1:-1:-1;;;;;;2477:17:0::1;-1:-1:-1::0;;;;;2477:17:0;;;::::1;::::0;;;::::1;::::0;;2261:240::o;5142:1380:50:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;:::i;:::-;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;-1:-1:-1;;;;;5430:33:50;::::1;5422:87;;;::::0;-1:-1:-1;;;5422:87:50;;::::1;::::0;::::1;;;:::i;:::-;-1:-1:-1::0;;;;;5523:30:50;::::1;5515:80;;;::::0;-1:-1:-1;;;5515:80:50;;::::1;::::0;::::1;;;:::i;:::-;-1:-1:-1::0;;;;;5609:35:50;::::1;5601:90;;;::::0;-1:-1:-1;;;5601:90:50;;::::1;::::0;::::1;;;:::i;:::-;-1:-1:-1::0;;;;;5705:27:50;::::1;5697:74;;;::::0;-1:-1:-1;;;5697:74:50;;::::1;::::0;::::1;;;:::i;:::-;5777:9;:22:::0;;-1:-1:-1;;;;;;5777:22:50;;::::1;-1:-1:-1::0;;;;;5777:22:50;;::::1;::::0;;;::::1;::::0;;;5805:6:::1;:16:::0;;;::::1;::::0;;::::1;;::::0;;5827:3:::1;:10:::0;;;::::1;::::0;;::::1;;::::0;;5843:11:::1;:26:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;5875:43:::1;5898:19:::0;5875:22:::1;:43::i;:::-;5925:16;:14;:16::i;:::-;5948:27;:14;:25;:27::i;:::-;5986:9;5981:118;6005:19;:26;6001:1;:30;5981:118;;;6046:46;6069:19;6089:1;6069:22;;;;;;;;;;;;;;6046;:46::i;:::-;6033:3;;5981:118;;;-1:-1:-1::0;6105:18:50::1;:40:::0;;;6151:20:::1;:40:::0;;;6198:28:::1;:15;:26;:28::i;:::-;6255:27;6277:4;6255:21;:27::i;:::-;6294:161;::::0;-1:-1:-1;;;;;6294:161:50;::::1;::::0;::::1;::::0;::::1;::::0;6313:17;;6338:19;;6383:7;;6398:12;;6418:4;;6430:19;;6294:161:::1;:::i;:::-;;;;;;;;6496:20;;6482:12;:10;:12::i;:::-;6466:51;::::0;-1:-1:-1;;;;;6466:51:50;;;::::1;::::0;::::1;::::0;;;::::1;1794:14:9::0;1790:66;;;-1:-1:-1;;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;-1:-1:-1;;;;;;5142:1380:50:o;5375:862:54:-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;5516:12:54::1;:19:::0;5498:37:::1;::::0;::::1;;5490:88;;;::::0;-1:-1:-1;;;5490:88:54;;::::1;::::0;::::1;;;:::i;:::-;5620:1;5592:18;:24;;;:29;;;;5584:82;;;::::0;-1:-1:-1;;;5584:82:54;;::::1;::::0;::::1;;;:::i;:::-;5680:25:::0;;-1:-1:-1;;;;;5680:39:54::1;5672:93;;;::::0;-1:-1:-1;;;5672:93:54;;::::1;::::0;::::1;;;:::i;:::-;5845:18;5813:12;5826:15;5813:29;;;;;;;;;;;::::0;;;::::1;::::0;;;:50;;:29;::::1;:50:::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;;5813:50:54::1;-1:-1:-1::0;;;;5813:50:54::1;::::0;;::::1;-1:-1:-1::0;;;5813:50:54::1;-1:-1:-1::0;;;;;;;;;5813:50:54;;::::1;-1:-1:-1::0;;;;;;5813:50:54;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;;::::0;;;5940:34:::1;:32;:34::i;:::-;5914:60;;6007:4;5988:15;:23;;5980:87;;;::::0;-1:-1:-1;;;5980:87:54;;::::1;::::0;::::1;;;:::i;:::-;6132:25:::0;;6159:29:::1;::::0;::::1;::::0;6190:24:::1;::::0;;::::1;::::0;6118:114;;-1:-1:-1;;;;;6118:114:54;;::::1;::::0;::::1;::::0;::::1;::::0;6159:29;;6216:15;;6118:114:::1;:::i;3561:40:50:-:0;;;;;;;;;;;;;-1:-1:-1;;;3561:40:50;;;;;:::o;8349:227::-;8412:7;8427:13;8443:19;:17;:19::i;:::-;8427:35;;8468:12;8483:14;:12;:14::i;:::-;8468:29;;8514:5;8507:4;:12;8503:41;;;8536:1;8529:8;;;;;;8503:41;8556:15;:5;8566:4;8556:9;:15::i;:::-;8549:22;;;;8349:227;:::o;2461:213:26:-;2550:7;;2586:19;1149:4;2596:8;2586:9;:19::i;:::-;2569:36;-1:-1:-1;2624:20:26;2569:36;2635:8;2624:10;:20::i;:::-;2615:29;2461:213;-1:-1:-1;;;;2461:213:26:o;828:104:19:-;915:10;828:104;:::o;27402:219:50:-;27460:20;27483:15;:13;:15::i;:::-;27512:10;:20;27460:38;;-1:-1:-1;27512:20:50;;;;;:25;;:64;;-1:-1:-1;27556:10:50;:20;;;;;;27541:35;;27512:64;27504:112;;;;-1:-1:-1;;;27504:112:50;;;;;;;:::i;12293:184::-;12345:7;12428:44;12453:18;;12428:20;;:24;;:44;;;;:::i;1369:286:5:-;1456:4;1563:23;1578:7;1563:14;:23::i;:::-;:85;;;;;1602:46;1627:7;1636:11;1602:24;:46::i;:::-;1556:92;1369:286;-1:-1:-1;;;1369:286:5:o;3321:426:99:-;3388:16;3412:22;3451:4;:10;;;3437:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3437:25:99;-1:-1:-1;3512:15:99;3468:13;3512:25;;;:15;;;:25;;;;;;3412:50;;-1:-1:-1;3468:13:99;-1:-1:-1;;;;;3512:25:99;3543:182;-1:-1:-1;;;;;3550:28:99;;;;;;:58;;-1:-1:-1;;;;;;3582:26:99;;-1:-1:-1;3582:26:99;;3550:58;3543:182;;;3633:14;3618:5;3624;3618:12;;;;;;;;-1:-1:-1;;;;;3618:29:99;;;:12;;;;;;;;;;:29;;;;3672:31;;;;;;;-1:-1:-1;3672:15:99;;;:31;;;;;;;3711:7;;;;;3672:31;3543:182;;;-1:-1:-1;3737:5:99;;3321:426;-1:-1:-1;;;3321:426:99:o;17692:271:50:-;17780:7;17795:22;17820:61;17862:18;;17820:37;17836:20;;17820:11;:15;;:37;;;;:::i;:::-;:41;;:61::i;:::-;17795:86;;17894:64;17919:38;17938:18;;17919:14;:18;;:38;;;;:::i;:::-;17894:20;;;:24;:64::i;22502:576::-;22591:36;-1:-1:-1;;;;;22591:34:50;;;:36::i;:::-;22583:81;;;;-1:-1:-1;;;22583:81:50;;;;;;;:::i;:::-;22678:9;;:51;;-1:-1:-1;;;22678:51:50;;-1:-1:-1;;;;;22678:9:50;;;;-1:-1:-1;;22678:51:50;;22713:14;;22678:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22670:107;;;;-1:-1:-1;;;22670:107:50;;;;;;;:::i;:::-;22863:40;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22863:40:50;-1:-1:-1;;;22863:40:50;;;22828:76;;-1:-1:-1;;22800:24:50;;-1:-1:-1;;;;;22828:34:50;;;:76;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22783:121;;;;22918:9;22910:57;;;;-1:-1:-1;;;22910:57:50;;;;;;;:::i;:::-;22973:50;:14;23007;22973:25;:50::i;:::-;23034:39;;-1:-1:-1;;;;;23034:39:50;;;;;;;;22502:576;;;:::o;2266:365:99:-;-1:-1:-1;;;;;2369:16:99;;-1:-1:-1;2369:16:99;;;;:38;;-1:-1:-1;;;;;;2389:18:99;;;;2369:38;2361:66;;;;-1:-1:-1;;;2361:66:99;;;;;;;:::i;:::-;-1:-1:-1;;;;;2441:28:99;;;;;;;-1:-1:-1;2441:15:99;;:28;;;;;;:36;;;:28;;:36;2433:68;;;;-1:-1:-1;;;2433:68:99;;;;;;;:::i;:::-;-1:-1:-1;;;;;2538:21:99;;;;;;;-1:-1:-1;2538:15:99;;:21;;;;;;;;2507:28;;;;;;;;:52;;2538:21;;;;-1:-1:-1;;;;;;2507:52:99;;;;;;;2572:21;2565:28;;;;;;;2612:10;;-1:-1:-1;;2612:14:99;2599:27;;2266:365::o;27186:212:50:-;-1:-1:-1;;;;;27300:39:50;;;;;;:22;:39;;;;;27293:46;;;:::i;:::-;27350:43;;-1:-1:-1;;;;;27350:43:50;;;;;;;;27186:212;:::o;6153:185:55:-;6228:1;6220:5;:9;6212:53;;;;-1:-1:-1;;;6212:53:55;;;;;;;:::i;:::-;6272:17;:25;;;6308;;;;;;6292:5;;6308:25;:::i;2701:175:8:-;2759:7;2790:5;;;2813:6;;;;2805:46;;;;-1:-1:-1;;;2805:46:8;;;;;;;:::i;13758:97:50:-;13835:15;13758:97;:::o;1952:123:9:-;2000:4;2024:44;2062:4;2024:29;:44::i;8918:114:50:-;8971:4;9008:19;:17;:19::i;:::-;8990:14;:12;:14::i;:::-;:37;;8983:44;;8918:114;:::o;21475:272::-;21581:1;21559:19;:23;21551:88;;;;-1:-1:-1;;;21551:88:50;;;;;;;:::i;:::-;21645:18;:40;;;21697:45;;;;;;21666:19;;21697:45;:::i;1436:624:12:-;1812:10;;;1811:62;;-1:-1:-1;1828:39:12;;-1:-1:-1;;;1828:39:12;;-1:-1:-1;;;;;1828:15:12;;;;;:39;;1852:4;;1859:7;;1828:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;1811:62;1803:150;;;;-1:-1:-1;;;1803:150:12;;;;;;;:::i;:::-;1963:90;1983:5;2013:22;;;2037:7;2046:5;1990:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1990:62:12;;;;;;;;;;;;;;-1:-1:-1;;;;;1990:62:12;-1:-1:-1;;;;;;1990:62:12;;;;;;;;;;;1963:19;:90::i;2028:176:24:-;2084:6;2118:5;2110;:13;2102:65;;;;-1:-1:-1;;;2102:65:24;;;;;;;:::i;:::-;-1:-1:-1;2191:5:24;2028:176::o;3147:155:8:-;3205:7;3237:1;3232;:6;;3224:49;;;;-1:-1:-1;;;3224:49:8;;;;;;;:::i;:::-;-1:-1:-1;3290:5:8;;;3147:155::o;6973:403:54:-;7117:12;:19;7040:7;;;;;7142:197;7172:17;7164:5;:25;;;7142:197;;;7208:29;;:::i;:::-;7240:12;7253:5;7240:19;;;;;;;;;;;;;;;;;;;7208:51;;;;;;;;7240:19;;;;7208:51;-1:-1:-1;;;;;7208:51:54;;;;-1:-1:-1;;;7208:51:54;;;;;;;;;;-1:-1:-1;;;7208:51:54;;;;;;;;;-1:-1:-1;7290:42:54;;:20;;:24;:42::i;:::-;7267:65;-1:-1:-1;;7191:7:54;;7142:197;;;-1:-1:-1;7351:20:54;;-1:-1:-1;;6973:403:54;:::o;2879:178:99:-;2956:4;-1:-1:-1;;;;;2975:16:99;;-1:-1:-1;2975:16:99;;;;:38;;-1:-1:-1;;;;;;2995:18:99;;;;2975:38;:77;;;;-1:-1:-1;;;;;;;3017:21:99;;;3050:1;3017:21;;;-1:-1:-1;3017:15:99;;;;:21;;;;;;;;:35;;;2879:178::o;1597:371::-;-1:-1:-1;;;;;1682:22:99;;-1:-1:-1;1682:22:99;;;;:50;;-1:-1:-1;;;;;;1708:24:99;;;;1682:50;1674:78;;;;-1:-1:-1;;;1674:78:99;;;;;;;:::i;:::-;-1:-1:-1;;;;;1766:27:99;;;1805:1;1766:27;;;-1:-1:-1;1766:15:99;;:27;;;;;;;:41;1758:67;;;;-1:-1:-1;;;1758:67:99;;;;;;;:::i;:::-;1861:15;:25;;;;:15;;;:25;;;;;;;;-1:-1:-1;;;;;1831:27:99;;;;;;;;;:55;;1861:25;;;;-1:-1:-1;;;;;;1831:55:99;;;;;;1892:25;;;;:38;;;;;;;;;;;1949:10;;:14;1936:27;;1597:371::o;25904:517:50:-;26079:9;;26014:53;;-1:-1:-1;;;26014:53:50;;-1:-1:-1;;;;;26079:9:50;;;;26014:43;;;;;:53;;26058:8;;26014:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;26014:75:50;;26006:127;;;;-1:-1:-1;;;26006:127:50;;;;;;;:::i;:::-;26144:9;26139:218;-1:-1:-1;;;;;26163:39:50;;;;;;:22;:39;;;;;:46;26159:50;;26139:218;;;-1:-1:-1;;;;;26228:39:50;;;;;;:22;:39;;;;;:42;;26274:8;;26228:39;26268:1;;26228:42;;;;;;;;;;;;;;:54;26224:127;;;26294:48;;-1:-1:-1;;;26294:48:50;;;;;;;:::i;26224:127::-;26211:3;;26139:218;;;-1:-1:-1;;;;;;26362:39:50;;;;;;;;:22;:39;;;;;;;:54;;-1:-1:-1;26362:54:50;;;;;;;;;;;25904:517::o;20753:252::-;20855:2;20834:18;:23;;;20826:80;;;;-1:-1:-1;;;20826:80:50;;;;;;;:::i;:::-;20912:17;:38;;-1:-1:-1;;20912:38:50;;;;;;;;;;;;;20961:39;;;;;;20982:17;;20961:39;:::i;7498:2386:55:-;7581:9;;:31;;;-1:-1:-1;;;7581:31:55;;;;7565:13;;-1:-1:-1;;;;;7581:9:55;;-1:-1:-1;;7581:31:55;;;;;;;;;;;;;;7565:13;7581:9;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7565:47;;7701:29;7724:5;7701:22;:29::i;:::-;7767:6;;7741:48;;;-1:-1:-1;;;7741:48:55;;;;7693:37;;-1:-1:-1;;;;;;7767:6:55;;;;7741:46;;:48;;;;;;;;;;;;;;;7767:6;7741:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7737:104;;7809:11;;;;;;;7828:7;;;7737:104;7880:18;;7984:17;;7880:18;;;;;8007:24;7984:17;8034:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8034:30:55;-1:-1:-1;8185:19:55;;8007:57;;-1:-1:-1;8091:12:55;;8070:18;;;;8210:617;8231:15;8217:11;:29;8210:617;;;8273:6;;:23;;-1:-1:-1;;;8273:23:55;;8256:14;;-1:-1:-1;;;;;8273:6:55;;-1:-1:-1;;8273:23:55;;8285:10;;8273:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;8310:21:55;;;;;;:13;:21;;;;;;;;-1:-1:-1;8310:21:55;;8305:255;;8368:6;8343:7;8351:13;;;;;;8343:22;;;;;;;;-1:-1:-1;;;;;8343:31:55;;;:22;;;;;;;;;;;:31;8305:255;;;8406:11;8393:9;;;;;;:24;8389:171;;8434:33;8455:11;8434:33;;;;;;:::i;:::-;;;;;;;;8480:16;8477:60;;8515:11;;;;;;;8477:60;8546:5;;;8389:171;8688:22;8759:11;8771:3;8759:15;8740:10;8753:3;8740:16;:34;8723:52;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;8723:52:55;;;;;;8713:63;;8723:52;8713:63;;;;;-1:-1:-1;8210:617:55;;-1:-1:-1;;8210:617:55;;8884:33;8906:7;8914:1;8906:10;;;;;;;;;;;;;;8884:21;:33::i;:::-;8973:18;8994:25;:79;;9051:22;:5;9061:11;9051:9;:22::i;:::-;8994:79;;;9022:26;:5;9032:15;9022:9;:26::i;:::-;8973:100;-1:-1:-1;9083:14:55;;9079:129;;9112:6;9107:95;9128:11;9124:1;:15;9107:95;;;9156:37;9170:7;9178:1;9170:10;;;;;;;;;;;;;;9182;9156:13;:37::i;:::-;9141:3;;9107:95;;;;9079:129;9218:24;;;;9214:666;;;9252:20;9275:22;:14;:20;:22::i;:::-;9252:45;;9305:516;-1:-1:-1;;;;;9312:26:55;;;;;;:66;;;9358:20;:14;:18;:20::i;:::-;-1:-1:-1;;;;;9342:36:55;;;;;;;9312:66;9305:516;;;9458:9;;9408:61;;-1:-1:-1;;;9408:61:55;;9390:15;;-1:-1:-1;;;;;9408:41:55;;;;-1:-1:-1;;9408:61:55;;9458:9;;9408:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9390:79;;9479:13;9495:25;:83;;9554:24;:7;9566:11;9554;:24::i;:::-;9495:83;;;9523:28;:7;9535:15;9523:11;:28::i;:::-;9479:99;-1:-1:-1;9592:9:55;;9588:167;;9620:9;9615:130;9639:11;9635:1;:15;9615:130;;;9671:9;;9700:10;;-1:-1:-1;;;;;9671:9:55;;;;:28;;9700:10;;9708:1;;9700:10;;;;;;;;;;;;9712:12;9726:5;9671:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9652:3:55;;;;;-1:-1:-1;9615:130:55;;-1:-1:-1;9615:130:55;;;9588:167;9779:33;:14;9799:12;9779:19;:33::i;:::-;9764:48;;9305:516;;;;;9214:666;;;;9841:32;9862:7;9870:1;9862:10;;;;;;;;;;;;;;9841:20;:32::i;:::-;7498:2386;;;;;;;;;;:::o;935:126:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;:::i;:::-;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;992:26:0::1;:24;:26::i;:::-;1028;:24;:26::i;:::-;1794:14:9::0;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;935:126:0:o;726:144:99:-;791:10;;:15;783:40;;;;-1:-1:-1;;;783:40:99;;;;;;;:::i;:::-;451:3;829:25;;;;:15;;;:25;;;;;;:36;;-1:-1:-1;;;;;;829:36:99;;;;;;726:144::o;2266:459:27:-;2324:7;2565:6;2561:45;;-1:-1:-1;2594:1:27;2587:8;;2561:45;2628:5;;;2632:1;2628;:5;:1;2651:5;;;;;:10;2643:56;;;;-1:-1:-1;;;2643:56:27;;;;;;;:::i;3187:130::-;3245:7;3271:39;3275:1;3278;3271:39;;;;;;;;;;;;;;;;;:3;:39::i;13967:95:50:-;14045:12;13967:95;:::o;757:394:5:-;821:4;1016:55;1041:7;-1:-1:-1;;;1016:24:5;:55::i;:::-;:128;;;;-1:-1:-1;1088:56:5;1113:7;-1:-1:-1;;;;;;1088:24:5;:56::i;:::-;1087:57;;757:394;-1:-1:-1;;757:394:5:o;4243:395::-;4336:4;4515:12;4529:11;4544:50;4573:7;4582:11;4544:28;:50::i;:::-;4514:80;;;;4613:7;:17;;;;;4624:6;4613:17;4605:26;4243:395;-1:-1:-1;;;;;4243:395:5:o;4228:150:8:-;4286:7;4317:1;4313;:5;4305:44;;;;-1:-1:-1;;;4305:44:8;;;;;;;:::i;:::-;4370:1;4366;:5;;;;;;;4228:150;-1:-1:-1;;;4228:150:8:o;737:413:18:-;1097:20;1135:8;;;737:413::o;3088:762:12:-;3544:69;;;;;;;;;;;;;;;;;;3518:23;;3544:69;;-1:-1:-1;;;;;3544:27:12;;;3572:4;;3544:27;:69::i;:::-;3627:17;;3518:95;;-1:-1:-1;3627:21:12;3623:221;;3767:10;3756:30;;;;;;;;;;;;:::i;:::-;3748:85;;;;-1:-1:-1;;;3748:85:12;;;;;;;:::i;7641:745:54:-;7877:12;:19;7706:7;;7838:5;;7706:7;7902:461;7934:17;7926:5;:25;7902:461;;;7970:29;;:::i;:::-;8002:12;8015:5;8002:19;;;;;;;;;;;;;;;;7970:51;;;;;;;;8002:19;;;;7970:51;-1:-1:-1;;;;;7970:51:54;;;;-1:-1:-1;;;7970:51:54;;;;;;;;;;-1:-1:-1;;;7970:51:54;;;;;;;;;;-1:-1:-1;8052:50:54;;8073:10;;8052:20;:50::i;:::-;8029:73;;8163:63;8186:5;:12;;;8200;8214:5;:11;;;8163:22;:63::i;:::-;8333:23;:5;8343:12;8333:9;:23::i;:::-;8325:31;-1:-1:-1;;;7953:7:54;;7902:461;;;-1:-1:-1;8376:5:54;;7641:745;-1:-1:-1;;;7641:745:54:o;11267:606:50:-;11329:20;11352:23;:15;:21;:23::i;:::-;11329:46;;11381:456;-1:-1:-1;;;;;11388:26:50;;;;;;:67;;;11434:21;:15;:19;:21::i;:::-;-1:-1:-1;;;;;11418:37:50;;;;;;;11388:67;11381:456;;;11534:9;;11483:62;;-1:-1:-1;;;11483:62:50;;11465:15;;-1:-1:-1;;;;;11483:42:50;;;;-1:-1:-1;;11483:62:50;;11534:9;;11483:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11465:80;-1:-1:-1;11557:11:50;;11553:221;;11580:9;;-1:-1:-1;;;;;11632:56:50;;;11580:9;11632:56;;;:22;:56;;;;;;;11580:109;;-1:-1:-1;;;11580:109:50;;:9;;;;;-1:-1:-1;;11580:109:50;;11610:6;;11632:56;;;11580:109;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11699:66;11751:12;11699:32;:66::i;:::-;11796:34;:15;11817:12;11796:20;:34::i;:::-;11781:49;;11381:456;;;;11842:26;:15;:24;:26::i;9178:119::-;9246:9;;9284:6;;9246:46;;-1:-1:-1;;;9246:46:50;;-1:-1:-1;;;;;9246:9:50;;;;:15;;:46;;9262:4;;9268:6;;9284;;9246:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9178:119;;:::o;874:112:99:-;956:15;934:7;956:25;;;:15;;:25;;;;;;-1:-1:-1;;;;;956:25:99;;874:112::o;1121:88::-;-1:-1:-1;451:3:99;;1121:88::o;990:127::-;-1:-1:-1;;;;;1088:24:99;;;1066:7;1088:24;;;-1:-1:-1;1088:15:99;;;;:24;;;;;;;;;990:127::o;10574:443:50:-;10635:20;10658:22;:14;:20;:22::i;:::-;10635:45;;10686:327;-1:-1:-1;;;;;10693:26:50;;;;;;:66;;;10739:20;:14;:18;:20::i;:::-;-1:-1:-1;;;;;10723:36:50;;;;;;;10693:66;10686:327;;;10837:9;;10787:61;;-1:-1:-1;;;10787:61:50;;10769:15;;-1:-1:-1;;;;;10787:41:50;;;;-1:-1:-1;;10787:61:50;;10837:9;;10787:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10769:79;-1:-1:-1;10860:11:50;;10856:95;;10883:9;;:59;;-1:-1:-1;;;10883:59:50;;-1:-1:-1;;;;;10883:9:50;;;;:28;;:59;;10912:6;;10920:12;;10934:7;;10883:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10856:95;10973:33;:14;10993:12;10973:19;:33::i;:::-;10958:48;;10686:327;;;759:64:19;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;:::i;:::-;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1794:14;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;759:64:19:o;1067:192:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;:::i;:::-;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1134:17:0::1;1154:12;:10;:12::i;:::-;1176:6;:18:::0;;-1:-1:-1;;;;;;1176:18:0::1;-1:-1:-1::0;;;;;1176:18:0;::::1;::::0;;::::1;::::0;;;1209:43:::1;::::0;1176:18;;-1:-1:-1;1176:18:0;-1:-1:-1;;1209:43:0::1;::::0;-1:-1:-1;;1209:43:0::1;1778:1:9;1794:14:::0;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;1067:192:0:o;3799:272:27:-;3885:7;3919:12;3912:5;3904:28;;;;-1:-1:-1;;;3904:28:27;;;;;;;;:::i;:::-;;3942:9;3958:1;3954;:5;;;;;;;3799:272;-1:-1:-1;;;;;3799:272:27:o;5155:444:5:-;5276:4;5282;5302:26;652:10;5354:20;;5376:11;5331:57;;;;;;;;:::i;:::-;;;;-1:-1:-1;;5331:57:5;;;;;;;;;;;;;;-1:-1:-1;;;;;5331:57:5;-1:-1:-1;;;;;;5331:57:5;;;;;;;;;;5436:47;;5331:57;;-1:-1:-1;;;5413:19:5;;-1:-1:-1;;;;;5436:18:5;;;5461:5;;5436:47;;5331:57;;5436:47;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5398:85;;;;5513:2;5497:6;:13;:18;5493:45;;;5525:5;5532;5517:21;;;;;;;;;5493:45;5556:7;5576:6;5565:26;;;;;;;;;;;;:::i;:::-;5548:44;;;;;;;5155:444;;;;;;:::o;3592:193:18:-;3695:12;3726:52;3748:6;3756:4;3762:1;3765:12;3726:21;:52::i;6568:146:54:-;6656:7;6678:31;6679:19;;;;;6704:4;6678:25;:31::i;7077:150:55:-;7183:39;7195:6;7203;7211:10;7183:11;:39::i;3872:394:99:-;3952:15;3927:22;3952:25;;;:15;;;:25;;;;;;-1:-1:-1;;;;;3952:25:99;3983:217;-1:-1:-1;;;;;3990:28:99;;;;;;:58;;-1:-1:-1;;;;;;4022:26:99;;-1:-1:-1;4022:26:99;;3990:58;3983:217;;;-1:-1:-1;;;;;4080:31:99;;;4058:19;4080:31;;;-1:-1:-1;4080:15:99;;:31;;;;;;;-1:-1:-1;;;;;;4119:38:99;;;;;4080:31;3983:217;;;-1:-1:-1;451:3:99;4205:25;;;;:15;;;:25;;;;;:36;;-1:-1:-1;;;;;;4205:36:99;;;;;;;4247:14;;3872:394::o;4619:523:18:-;4746:12;4803:5;4778:21;:30;;4770:81;;;;-1:-1:-1;;;4770:81:18;;;;;;;:::i;:::-;4869:18;4880:6;4869:10;:18::i;:::-;4861:60;;;;-1:-1:-1;;;4861:60:18;;;;;;;:::i;:::-;4992:12;5006:23;5033:6;-1:-1:-1;;;;;5033:11:18;5053:5;5061:4;5033:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4991:75;;;;5083:52;5101:7;5110:10;5122:12;5083:17;:52::i;:::-;5076:59;4619:523;-1:-1:-1;;;;;;;4619:523:18:o;9639:386:50:-;9777:9;;:18;;;-1:-1:-1;;;9777:18:50;;;;9723:51;;-1:-1:-1;;;;;9777:9:50;;:16;;:18;;;;;:9;;:18;;;;;;;:9;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9777:18:50;;;;;;;;;;;;:::i;:::-;9723:72;;9823:17;:24;9809:10;:38;;;;9801:98;;;;-1:-1:-1;;;9801:98:50;;;;;;;:::i;:::-;9905:31;9939:17;9957:10;9939:29;;;;;;;;;;;;;;;;;;;;9974:9;;:46;;-1:-1:-1;;;9974:46:50;;9939:29;;-1:-1:-1;;;;;;9974:9:50;;:15;;:46;;9990:4;;9996:6;;9939:29;;9974:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9639:386;;;;;:::o;6122:725:18:-;6237:12;6265:7;6261:580;;;-1:-1:-1;6295:10:18;6288:17;;6261:580;6406:17;;:21;6402:429;;6664:10;6658:17;6724:15;6711:10;6707:2;6703:19;6696:44;6613:145;6796:20;;-1:-1:-1;;;6796:20:18;;;;6803:12;;6796:20;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1196:378;;;1352:3;1345:4;1337:6;1333:17;1329:27;1319:2;;-1:-1;;1360:12;1319:2;-1:-1;1390:20;;1430:18;1419:30;;1416:2;;;-1:-1;;1452:12;1416:2;1496:4;1488:6;1484:17;1472:29;;1547:3;1496:4;;1531:6;1527:17;1488:6;1513:32;;1510:41;1507:2;;;1564:1;;1554:12;5447:627;;5571:4;5559:9;5554:3;5550:19;5546:30;5543:2;;;-1:-1;;5579:12;5543:2;5607:20;5571:4;5607:20;:::i;:::-;5598:29;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5686:75;;5828:2;5881:22;;6147:20;84721:6;84710:18;;90677:34;;90667:2;;-1:-1;;90715:12;90667:2;5828;5843:16;;5836:74;6005:47;6048:3;5972:2;6024:22;;6005:47;:::i;:::-;5972:2;5991:5;5987:16;5980:73;5537:537;;;;:::o;6768:126::-;6833:20;;85113:4;85102:16;;91044:33;;91034:2;;91091:1;;91081:12;6901:241;;7005:2;6993:9;6984:7;6980:23;6976:32;6973:2;;;-1:-1;;7011:12;6973:2;85:6;72:20;97:33;124:5;97:33;:::i;7149:263::-;;7264:2;7252:9;7243:7;7239:23;7235:32;7232:2;;;-1:-1;;7270:12;7232:2;226:6;220:13;238:33;265:5;238:33;:::i;7419:617::-;;;;;7574:3;7562:9;7553:7;7549:23;7545:33;7542:2;;;-1:-1;;7581:12;7542:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;7633:63;-1:-1;7733:2;7772:22;;72:20;97:33;72:20;97:33;:::i;:::-;7741:63;-1:-1;7841:2;7880:22;;6283:20;;-1:-1;7949:2;7988:22;;72:20;97:33;72:20;97:33;:::i;:::-;7536:500;;;;-1:-1;7536:500;;-1:-1;;7536:500::o;8043:360::-;;;8161:2;8149:9;8140:7;8136:23;8132:32;8129:2;;;-1:-1;;8167:12;8129:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;8219:63;-1:-1;8319:2;8355:22;;3296:20;3321:30;3296:20;3321:30;:::i;:::-;8327:60;;;;8123:280;;;;;:::o;8410:399::-;;;8542:2;8530:9;8521:7;8517:23;8513:32;8510:2;;;-1:-1;;8548:12;8510:2;226:6;220:13;238:33;265:5;238:33;:::i;:::-;8711:2;8761:22;;;;6431:13;8600:74;;6431:13;;-1:-1;;;8504:305::o;8816:617::-;;;;;8971:3;8959:9;8950:7;8946:23;8942:33;8939:2;;;-1:-1;;8978:12;8939:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;9030:63;-1:-1;9130:2;9169:22;;6283:20;;-1:-1;9238:2;9277:22;;72:20;97:33;72:20;97:33;:::i;:::-;9246:63;-1:-1;9346:2;9385:22;;72:20;97:33;72:20;97:33;:::i;9440:460::-;;9614:2;;9602:9;9593:7;9589:23;9585:32;9582:2;;;-1:-1;;9620:12;9582:2;9671:17;9665:24;9709:18;9701:6;9698:30;9695:2;;;-1:-1;;9731:12;9695:2;9852:22;;482:4;470:17;;466:27;-1:-1;456:2;;-1:-1;;497:12;456:2;537:6;531:13;559:114;574:98;665:6;574:98;:::i;:::-;559:114;:::i;:::-;701:21;;;758:14;;;;733:17;;;847;;;838:27;;;;835:36;-1:-1;832:2;;;-1:-1;;874:12;832:2;-1:-1;900:10;;894:251;919:6;916:1;913:13;894:251;;;3962:6;3956:13;3974:67;4035:5;3974:67;:::i;:::-;987:95;;941:1;934:9;;;;;1096:14;;;;1124;;894:251;;;-1:-1;9751:133;9576:324;-1:-1;;;;;;;9576:324::o;9907:449::-;;;10072:2;10060:9;10051:7;10047:23;10043:32;10040:2;;;-1:-1;;10078:12;10040:2;10136:17;10123:31;10174:18;10166:6;10163:30;10160:2;;;-1:-1;;10196:12;10160:2;10234:106;10332:7;10323:6;10312:9;10308:22;10234:106;:::i;:::-;10216:124;;;;-1:-1;10034:322;-1:-1;;;;10034:322::o;10363:471::-;;;10539:2;10527:9;10518:7;10514:23;10510:32;10507:2;;;-1:-1;;10545:12;10507:2;10603:17;10590:31;10641:18;;10633:6;10630:30;10627:2;;;-1:-1;;10663:12;10627:2;10801:6;10790:9;10786:22;;;2624:3;2617:4;2609:6;2605:17;2601:27;2591:2;;-1:-1;;2632:12;2591:2;2675:6;2662:20;10641:18;2694:6;2691:30;2688:2;;;-1:-1;;2724:12;2688:2;2819:3;10539:2;2811:4;2803:6;2799:17;2760:6;2785:32;;2782:41;2779:2;;;-1:-1;;2826:12;2779:2;10539;2756:17;;;;;10683:135;;-1:-1;10501:333;;-1:-1;;;;10501:333::o;10841:235::-;;10942:2;10930:9;10921:7;10917:23;10913:32;10910:2;;;-1:-1;;10948:12;10910:2;3309:6;3296:20;3321:30;3345:5;3321:30;:::i;11083:257::-;;11195:2;11183:9;11174:7;11170:23;11166:32;11163:2;;;-1:-1;;11201:12;11163:2;3444:6;3438:13;3456:30;3480:5;3456:30;:::i;11347:239::-;;11450:2;11438:9;11429:7;11425:23;11421:32;11418:2;;;-1:-1;;11456:12;11418:2;3564:20;;-1:-1;;;;;;83409:78;;88903:34;;88893:2;;-1:-1;;88941:12;12215:470;;;12388:2;12376:9;12367:7;12363:23;12359:32;12356:2;;;-1:-1;;12394:12;12356:2;4159:6;4146:20;4171:59;4224:5;4171:59;:::i;:::-;12446:89;-1:-1;12572:2;12637:22;;4146:20;4171:59;4146:20;4171:59;:::i;12994:576::-;;;;13177:2;13165:9;13156:7;13152:23;13148:32;13145:2;;;-1:-1;;13183:12;13145:2;4349:6;4336:20;4361:60;4415:5;4361:60;:::i;:::-;13235:90;-1:-1;13390:2;13375:18;;13362:32;13414:18;13403:30;;13400:2;;;-1:-1;;13436:12;13400:2;13474:80;13546:7;13537:6;13526:9;13522:22;13474:80;:::i;:::-;13139:431;;13456:98;;-1:-1;13456:98;;-1:-1;;;;13139:431::o;15004:311::-;;15143:2;15131:9;15122:7;15118:23;15114:32;15111:2;;;-1:-1;;15149:12;15111:2;15211:88;15291:7;15267:22;15211:88;:::i;15322:433::-;;;15476:3;15464:9;15455:7;15451:23;15447:33;15444:2;;;-1:-1;;15483:12;15444:2;15545:88;15625:7;15601:22;15545:88;:::i;:::-;15535:98;;15688:51;15731:7;15670:2;15711:9;15707:22;15688:51;:::i;:::-;15678:61;;15438:317;;;;;:::o;15762:241::-;;15866:2;15854:9;15845:7;15841:23;15837:32;15834:2;;;-1:-1;;15872:12;15834:2;-1:-1;6283:20;;15828:175;-1:-1;15828:175::o;16010:263::-;;16125:2;16113:9;16104:7;16100:23;16096:32;16093:2;;;-1:-1;;16131:12;16093:2;-1:-1;6431:13;;16087:186;-1:-1;16087:186::o;16280:1363::-;;;;;;;;16627:3;16615:9;16606:7;16602:23;16598:33;16595:2;;;-1:-1;;16634:12;16595:2;6296:6;6283:20;16686:63;;16786:2;;16829:9;16825:22;6283:20;16794:63;;16894:2;16955:9;16951:22;4751:20;4776:51;4821:5;4776:51;:::i;:::-;16902:81;-1:-1;17020:2;17084:22;;5110:20;5135:58;5110:20;5135:58;:::i;:::-;17028:88;-1:-1;17153:3;17219:22;;4146:20;4171:59;4146:20;4171:59;:::i;:::-;17162:89;-1:-1;17288:3;17349:22;;4927:20;4952:54;4927:20;4952:54;:::i;:::-;17297:84;-1:-1;17446:3;17431:19;;17418:33;17471:18;17460:30;;17457:2;;;-1:-1;;17493:12;17457:2;17595:22;;1755:4;1743:17;;1739:27;-1:-1;1729:2;;-1:-1;;1770:12;1729:2;1817:6;1804:20;1839:106;1854:90;1937:6;1854:90;:::i;1839:106::-;1973:21;;;2030:14;;;;2005:17;;;2119;;;2110:27;;;;2107:36;-1:-1;2104:2;;;-1:-1;;2146:12;2104:2;-1:-1;2172:10;;2166:232;2191:6;2188:1;2185:13;2166:232;;;4159:6;4146:20;4171:59;4224:5;4171:59;:::i;:::-;2259:76;;2213:1;2206:9;;;;;2349:14;;;;2377;;2166:232;;;2170:14;17513:114;;;;;;;;16589:1054;;;;;;;;;;:::o;17650:1175::-;;;;;;;;17946:3;17934:9;17925:7;17921:23;17917:33;17914:2;;;-1:-1;;17953:12;17914:2;6296:6;6283:20;18005:63;;18105:2;18148:9;18144:22;6283:20;18113:63;;18213:2;18274:9;18270:22;4751:20;4776:51;4821:5;4776:51;:::i;:::-;18221:81;-1:-1;18339:2;18403:22;;5110:20;5135:58;5110:20;5135:58;:::i;:::-;18347:88;-1:-1;18472:3;18538:22;;4146:20;4171:59;4146:20;4171:59;:::i;:::-;18481:89;-1:-1;18607:3;18668:22;;4927:20;4952:54;4927:20;4952:54;:::i;:::-;18616:84;;;;18737:3;18781:9;18777:22;6283:20;18746:63;;17908:917;;;;;;;;;;:::o;18832:239::-;;18935:2;18923:9;18914:7;18910:23;18906:32;18903:2;;;-1:-1;;18941:12;18903:2;6573:6;6560:20;6585:32;6611:5;6585:32;:::i;19078:395::-;;;19208:2;19196:9;19187:7;19183:23;19179:32;19176:2;;;-1:-1;;19214:12;19176:2;6712:6;6706:13;6724:32;6750:5;6724:32;:::i;:::-;19376:2;19425:22;;6706:13;19266:73;;-1:-1;6724:32;6706:13;6724:32;:::i;45048:643::-;45269:23;;-1:-1;;;;;84802:54;20461:37;;45446:4;45435:16;;;45429:23;84721:6;84710:18;45504:14;;;46496:36;45599:4;45588:16;;;45582:23;85113:4;85102:16;45655:14;;47353:35;45174:517::o;47514:271::-;;25671:5;80573:12;25782:52;25827:6;25822:3;25815:4;25808:5;25804:16;25782:52;:::i;:::-;25846:16;;;;;47648:137;-1:-1;;47648:137::o;47792:253::-;46722:37;;;48017:2;48008:12;;47908:137::o;48052:222::-;-1:-1;;;;;84802:54;;;;20461:37;;48179:2;48164:18;;48150:124::o;48281:333::-;-1:-1;;;;;84802:54;;;20461:37;;84802:54;;48600:2;48585:18;;20461:37;48436:2;48421:18;;48407:207::o;48621:586::-;-1:-1;;;;;84802:54;;;20461:37;;84802:54;;49015:2;49000:18;;;20461:37;;;;48851:2;49052;49037:18;;49030:48;;;81213:12;;48836:18;;;82264:19;;;-1:-1;80400:14;;;80429:18;;;-1:-1;;80429:18;;82304:14;;;;49015:2;-1:-1;24965:288;24990:6;24987:1;24984:13;24965:288;;;88364:11;;46722:37;;25012:1;82119:14;;;;20372;;;;25005:9;24965:288;;;-1:-1;49084:113;;48822:385;-1:-1;;;;;;;;48822:385::o;49214:444::-;-1:-1;;;;;84802:54;;;20461:37;;84802:54;;;;49561:2;49546:18;;20461:37;49644:2;49629:18;;46722:37;;;;49397:2;49382:18;;49368:290::o;49665:556::-;-1:-1;;;;;84802:54;;;20461:37;;84802:54;;;50041:2;50026:18;;20461:37;50124:2;50109:18;;46722:37;;;;84802:54;;;50207:2;50192:18;;20461:37;49876:3;49861:19;;49847:374::o;50228:333::-;-1:-1;;;;;84802:54;;;;20461:37;;50547:2;50532:18;;46722:37;50383:2;50368:18;;50354:207::o;50568:444::-;-1:-1;;;;;84802:54;;;20461:37;;50915:2;50900:18;;46722:37;;;;84802:54;;;50998:2;50983:18;;20461:37;50751:2;50736:18;;50722:290::o;51019:556::-;-1:-1;;;;;84802:54;;;20461:37;;51395:2;51380:18;;46722:37;;;;84802:54;;;51478:2;51463:18;;20461:37;84802:54;;;51561:2;51546:18;;20461:37;51230:3;51215:19;;51201:374::o;51582:370::-;51759:2;51773:47;;;80573:12;;51744:18;;;82264:19;;;51582:370;;51759:2;79712:14;;;;82304;;;;51582:370;21069:260;21094:6;21091:1;21088:13;21069:260;;;21155:13;;-1:-1;;;;;84802:54;20461:37;;81601:14;;;;19634;;;;-1:-1;21109:9;21069:260;;;-1:-1;51826:116;;51730:222;-1:-1;;;;;;51730:222::o;51959:510::-;52206:2;52220:47;;;80573:12;;52191:18;;;82264:19;;;51959:510;;52206:2;79712:14;;;;82304;;;;51959:510;22905:365;22930:6;22927:1;22924:13;22905:365;;;20054:116;20166:3;22997:6;22991:13;20054:116;:::i;:::-;81601:14;;;;20199:4;20190:14;;;;;22952:1;22945:9;22905:365;;52476:390;52663:2;52677:47;;;52648:18;;82264:19;;;-1:-1;;;;;;23579:78;;23576:2;;;-1:-1;;23660:12;23576:2;52663;23695:6;23691:17;87645:6;87640:3;82304:14;52652:9;82304:14;87622:30;87683:16;;;;82304:14;87683:16;87676:27;;;87683:16;52634:232;-1:-1;;52634:232::o;52873:370::-;53050:2;53064:47;;;80573:12;;53035:18;;;82264:19;;;52873:370;;53050:2;79712:14;;;;82304;;;;52873:370;24245:260;24270:6;24267:1;24264:13;24245:260;;;24331:13;;46722:37;;81601:14;;;;20372;;;;24292:1;24285:9;24245:260;;53250:210;83322:13;;83315:21;25348:34;;53371:2;53356:18;;53342:118::o;53467:218::-;-1:-1;;;;;;83409:78;;;;25463:36;;53592:2;53577:18;;53563:122::o;55709:310::-;;55856:2;55877:17;55870:47;27539:5;80573:12;82276:6;55856:2;55845:9;55841:18;82264:19;27633:52;27678:6;82304:14;55845:9;82304:14;55856:2;27659:5;27655:16;27633:52;:::i;:::-;88472:7;88456:14;-1:-1;;88452:28;27697:39;;;;82304:14;27697:39;;55827:192;-1:-1;;55827:192::o;56026:416::-;56226:2;56240:47;;;27973:2;56211:18;;;82264:19;28009:34;82304:14;;;27989:55;-1:-1;;;28064:12;;;28057:28;28104:12;;;56197:245::o;56449:416::-;56649:2;56663:47;;;28355:2;56634:18;;;82264:19;28391:34;82304:14;;;28371:55;-1:-1;;;28446:12;;;28439:36;28494:12;;;56620:245::o;56872:416::-;57072:2;57086:47;;;28745:2;57057:18;;;82264:19;-1:-1;;;82304:14;;;28761:38;28818:12;;;57043:245::o;57295:416::-;57495:2;57509:47;;;29069:2;57480:18;;;82264:19;-1:-1;;;82304:14;;;29085:42;29146:12;;;57466:245::o;57718:416::-;57918:2;57932:47;;;29397:2;57903:18;;;82264:19;29433:34;82304:14;;;29413:55;-1:-1;;;29488:12;;;29481:35;29535:12;;;57889:245::o;58141:416::-;58341:2;58355:47;;;29786:2;58326:18;;;82264:19;29822:34;82304:14;;;29802:55;-1:-1;;;29877:12;;;29870:30;29919:12;;;58312:245::o;58564:416::-;58764:2;58778:47;;;30170:2;58749:18;;;82264:19;30206:34;82304:14;;;30186:55;-1:-1;;;30261:12;;;30254:36;30309:12;;;58735:245::o;58987:416::-;59187:2;59201:47;;;30560:2;59172:18;;;82264:19;30596:29;82304:14;;;30576:50;30645:12;;;59158:245::o;59410:416::-;59610:2;59624:47;;;30896:2;59595:18;;;82264:19;30932:34;82304:14;;;30912:55;-1:-1;;;30987:12;;;30980:34;31033:12;;;59581:245::o;59833:416::-;60033:2;60047:47;;;31284:2;60018:18;;;82264:19;31320:34;82304:14;;;31300:55;-1:-1;;;31375:12;;;31368:32;31419:12;;;60004:245::o;60256:416::-;60456:2;60470:47;;;31670:2;60441:18;;;82264:19;31706:34;82304:14;;;31686:55;-1:-1;;;;31761:12;;31754:44;31817:12;;;60427:245::o;60679:416::-;60879:2;60893:47;;;32068:2;60864:18;;;82264:19;32104:34;82304:14;;;32084:55;-1:-1;;;32159:12;;;32152:29;32200:12;;;60850:245::o;61102:416::-;61302:2;61316:47;;;32451:2;61287:18;;;82264:19;32487:34;82304:14;;;32467:55;-1:-1;;;32542:12;;;32535:30;32584:12;;;61273:245::o;61525:416::-;61725:2;61739:47;;;32835:2;61710:18;;;82264:19;32871:32;82304:14;;;32851:53;32923:12;;;61696:245::o;61948:416::-;62148:2;62162:47;;;33174:2;62133:18;;;82264:19;33210:34;82304:14;;;33190:55;-1:-1;;;33265:12;;;33258:33;33310:12;;;62119:245::o;62371:416::-;62571:2;62585:47;;;33561:2;62556:18;;;82264:19;33597:34;82304:14;;;33577:55;-1:-1;;;33652:12;;;33645:30;33694:12;;;62542:245::o;62794:416::-;62994:2;63008:47;;;33945:2;62979:18;;;82264:19;33981:34;82304:14;;;33961:55;-1:-1;;;34036:12;;;34029:26;34074:12;;;62965:245::o;63217:416::-;63417:2;63431:47;;;34325:2;63402:18;;;82264:19;34361:28;82304:14;;;34341:49;34409:12;;;63388:245::o;63640:416::-;63840:2;63854:47;;;34660:2;63825:18;;;82264:19;34696:34;82304:14;;;34676:55;-1:-1;;;34751:12;;;34744:30;34793:12;;;63811:245::o;64063:416::-;64263:2;64277:47;;;35044:2;64248:18;;;82264:19;35080:34;82304:14;;;35060:55;-1:-1;;;35135:12;;;35128:33;35180:12;;;64234:245::o;64486:416::-;64686:2;64700:47;;;35431:2;64671:18;;;82264:19;35467:34;82304:14;;;35447:55;-1:-1;;;35522:12;;;35515:27;35561:12;;;64657:245::o;64909:416::-;65109:2;65123:47;;;35812:2;65094:18;;;82264:19;35848:34;82304:14;;;35828:55;-1:-1;;;35903:12;;;35896:38;35953:12;;;65080:245::o;65332:416::-;65532:2;65546:47;;;36204:2;65517:18;;;82264:19;36240:34;82304:14;;;36220:55;-1:-1;;;36295:12;;;36288:30;36337:12;;;65503:245::o;65755:416::-;65955:2;65969:47;;;65940:18;;;82264:19;36624:34;82304:14;;;36604:55;36678:12;;;65926:245::o;66178:416::-;66378:2;66392:47;;;36929:2;66363:18;;;82264:19;36965:34;82304:14;;;36945:55;-1:-1;;;37020:12;;;37013:35;37067:12;;;66349:245::o;66601:416::-;66801:2;66815:47;;;37318:2;66786:18;;;82264:19;37354:33;82304:14;;;37334:54;37407:12;;;66772:245::o;67024:416::-;67224:2;67238:47;;;37658:2;67209:18;;;82264:19;37694:34;82304:14;;;37674:55;-1:-1;;;37749:12;;;37742:25;37786:12;;;67195:245::o;67447:416::-;67647:2;67661:47;;;67632:18;;;82264:19;38073:34;82304:14;;;38053:55;38127:12;;;67618:245::o;67870:416::-;68070:2;68084:47;;;38378:2;68055:18;;;82264:19;-1:-1;;;82304:14;;;38394:35;38448:12;;;68041:245::o;68293:416::-;68493:2;68507:47;;;38699:2;68478:18;;;82264:19;38735:34;82304:14;;;38715:55;-1:-1;;;38790:12;;;38783:43;38845:12;;;68464:245::o;68716:416::-;68916:2;68930:47;;;39096:2;68901:18;;;82264:19;39132:34;82304:14;;;39112:55;-1:-1;;;39187:12;;;39180:41;39240:12;;;68887:245::o;69139:416::-;69339:2;69353:47;;;39491:2;69324:18;;;82264:19;39527:34;82304:14;;;39507:55;-1:-1;;;39582:12;;;39575:35;39629:12;;;69310:245::o;69562:416::-;69762:2;69776:47;;;39880:2;69747:18;;;82264:19;-1:-1;;;82304:14;;;39896:36;39951:12;;;69733:245::o;69985:416::-;70185:2;70199:47;;;40202:2;70170:18;;;82264:19;40238:34;82304:14;;;40218:55;-1:-1;;;40293:12;;;40286:30;40335:12;;;70156:245::o;70408:416::-;70608:2;70622:47;;;40586:2;70593:18;;;82264:19;40622:31;82304:14;;;40602:52;40673:12;;;70579:245::o;70831:416::-;71031:2;71045:47;;;40924:2;71016:18;;;82264:19;40960:34;82304:14;;;40940:55;-1:-1;;;41015:12;;;41008:39;41066:12;;;71002:245::o;71254:416::-;71454:2;71468:47;;;41317:2;71439:18;;;82264:19;41353:34;82304:14;;;41333:55;-1:-1;;;41408:12;;;41401:29;41449:12;;;71425:245::o;71677:416::-;71877:2;71891:47;;;41700:2;71862:18;;;82264:19;41736:34;82304:14;;;41716:55;-1:-1;;;41791:12;;;41784:34;41837:12;;;71848:245::o;72100:416::-;72300:2;72314:47;;;42088:2;72285:18;;;82264:19;42124:34;82304:14;;;42104:55;-1:-1;;;42179:12;;;42172:43;42234:12;;;72271:245::o;72523:416::-;72723:2;72737:47;;;42485:2;72708:18;;;82264:19;42521:34;82304:14;;;42501:55;-1:-1;;;42576:12;;;42569:46;42634:12;;;72694:245::o;72946:416::-;73146:2;73160:47;;;42885:2;73131:18;;;82264:19;42921:34;82304:14;;;42901:55;-1:-1;;;42976:12;;;42969:30;43018:12;;;73117:245::o;73369:416::-;73569:2;73583:47;;;43269:2;73554:18;;;82264:19;43305:34;82304:14;;;43285:55;-1:-1;;;43360:12;;;43353:27;43399:12;;;73540:245::o;73792:416::-;73992:2;74006:47;;;43650:2;73977:18;;;82264:19;43686:34;82304:14;;;43666:55;-1:-1;;;43741:12;;;43734:30;43783:12;;;73963:245::o;74215:416::-;74415:2;74429:47;;;44034:2;74400:18;;;82264:19;44070:34;82304:14;;;44050:55;-1:-1;;;44125:12;;;44118:36;44173:12;;;74386:245::o;74638:416::-;74838:2;74852:47;;;44424:2;74823:18;;;82264:19;44460:34;82304:14;;;44440:55;-1:-1;;;44515:12;;;44508:31;44558:12;;;74809:245::o;75061:416::-;75261:2;75275:47;;;44809:2;75246:18;;;82264:19;44845:34;82304:14;;;44825:55;-1:-1;;;44900:12;;;44893:31;44943:12;;;75232:245::o;75484:362::-;75681:2;75666:18;;75695:141;75670:9;75809:6;75695:141;:::i;75853:432::-;84721:6;84710:18;;;;46496:36;;85113:4;85102:16;;;;76188:2;76173:18;;47353:35;76271:2;76256:18;;46722:37;76030:2;76015:18;;76001:284::o;76292:428::-;84721:6;84710:18;;;;46496:36;;85113:4;85102:16;;;76625:2;76610:18;;47353:35;85102:16;76706:2;76691:18;;47236:48;76467:2;76452:18;;76438:282::o;76956:333::-;46722:37;;;77275:2;77260:18;;46722:37;77111:2;77096:18;;77082:207::o;77296:1124::-;46722:37;;;77876:2;77861:18;;;46722:37;;;-1:-1;;;;;84802:54;;;77984:2;77969:18;;25982:87;84802:54;;;78093:2;78078:18;;25982:87;84802:54;;;78197:3;78182:19;;25982:87;77711:3;-1:-1;78220:19;;78213:49;;;80573:12;;77696:19;;;82264;;;-1:-1;;79712:14;;;;77876:2;;82304:14;;;;-1:-1;21895:312;21920:6;21917:1;21914:13;21895:312;;;21981:13;;84802:54;;20461:37;;81601:14;;;;19868;;;;21942:1;21935:9;21895:312;;;-1:-1;78268:142;;77682:738;-1:-1;;;;;;;;;;;;77682:738::o;78427:218::-;85019:10;85008:22;;;;47119:36;;78552:2;78537:18;;78523:122::o;78652:256::-;78714:2;78708:9;78740:17;;;78815:18;78800:34;;78836:22;;;78797:62;78794:2;;;78872:1;;78862:12;78794:2;78714;78881:22;78692:216;;-1:-1;78692:216::o;78915:338::-;;79108:18;79100:6;79097:30;79094:2;;;-1:-1;;79130:12;79094:2;-1:-1;79175:4;79163:17;;;79228:15;;79031:222::o;87718:268::-;87783:1;87790:101;87804:6;87801:1;87798:13;87790:101;;;87871:11;;;87865:18;87852:11;;;87845:39;87826:2;87819:10;87790:101;;;87906:6;87903:1;87900:13;87897:2;;;-1:-1;;87783:1;87953:16;;87946:27;87767:219::o;88603:117::-;-1:-1;;;;;84802:54;;88662:35;;88652:2;;88711:1;;88701:12;88727:111;88808:5;83322:13;83315:21;88786:5;88783:32;88773:2;;88829:1;;88819:12;90865:115;85019:10;90950:5;85008:22;90926:5;90923:34;90913:2;;90971:1;;90961:12"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "4680400",
                "executionCost": "5489",
                "totalCost": "4685889"
              },
              "external": {
                "VERSION()": "infinite",
                "addExternalErc20Award(address)": "infinite",
                "addExternalErc20Awards(address[])": "infinite",
                "addExternalErc721Award(address,uint256[])": "infinite",
                "beforeAwardListener()": "1184",
                "beforeTokenMint(address,uint256,address,address)": "infinite",
                "beforeTokenTransfer(address,address,uint256,address)": "infinite",
                "blocklistRetryCount()": "1097",
                "calculateNextPrizePeriodStartTime(uint256)": "infinite",
                "canCompleteAward()": "infinite",
                "canStartAward()": "infinite",
                "cancelAward()": "infinite",
                "carryOverBlocklist()": "1107",
                "completeAward()": "infinite",
                "currentPrize()": "infinite",
                "estimateRemainingBlocksToPrize(uint256)": "infinite",
                "getExternalErc20Awards()": "infinite",
                "getExternalErc721AwardTokenIds(address)": "infinite",
                "getExternalErc721Awards()": "infinite",
                "getLastRngLockBlock()": "1147",
                "getLastRngRequestId()": "1181",
                "initialize(uint256,uint256,address,address,address,address,address[])": "infinite",
                "initializeMultipleWinners(uint256,uint256,address,address,address,address,uint256)": "infinite",
                "isBlocklisted(address)": "1348",
                "isPrizePeriodOver()": "infinite",
                "isRngCompleted()": "infinite",
                "isRngRequested()": "1138",
                "isRngTimedOut()": "infinite",
                "numberOfWinners()": "1140",
                "owner()": "1138",
                "periodicPrizeStrategyListener()": "1137",
                "prizePeriodEndAt()": "infinite",
                "prizePeriodRemainingSeconds()": "infinite",
                "prizePeriodSeconds()": "1140",
                "prizePeriodStartedAt()": "1161",
                "prizePool()": "1181",
                "prizeSplit(uint256)": "2535",
                "prizeSplits()": "infinite",
                "removeExternalErc20Award(address,address)": "infinite",
                "removeExternalErc721Award(address,address)": "infinite",
                "renounceOwnership()": "24341",
                "rng()": "1159",
                "rngRequestTimeout()": "1179",
                "setBeforeAwardListener(address)": "infinite",
                "setBlocklistRetryCount(uint256)": "24208",
                "setBlocklisted(address,bool)": "infinite",
                "setCarryBlocklist(bool)": "infinite",
                "setNumberOfWinners(uint256)": "infinite",
                "setPeriodicPrizeStrategyListener(address)": "infinite",
                "setPrizePeriodSeconds(uint256)": "infinite",
                "setPrizeSplit((address,uint16,uint8),uint8)": "infinite",
                "setPrizeSplits((address,uint16,uint8)[])": "infinite",
                "setRngRequestTimeout(uint32)": "infinite",
                "setRngService(address)": "infinite",
                "setSplitExternalErc20Awards(bool)": "infinite",
                "setTokenListener(address)": "infinite",
                "splitExternalErc20Awards()": "1129",
                "sponsorship()": "1161",
                "startAward()": "infinite",
                "supportsInterface(bytes4)": "550",
                "ticket()": "1182",
                "tokenListener()": "1138",
                "transferOwnership(address)": "24550"
              },
              "internal": {
                "_awardPrizeSplitAmount(address,uint256,uint8)": "infinite",
                "_distribute(uint256)": "infinite",
                "_setNumberOfWinners(uint256)": "infinite"
              }
            },
            "methodIdentifiers": {
              "VERSION()": "ffa1ad74",
              "addExternalErc20Award(address)": "4e5d08e0",
              "addExternalErc20Awards(address[])": "66968221",
              "addExternalErc721Award(address,uint256[])": "c48ddbcb",
              "beforeAwardListener()": "0d847fc4",
              "beforeTokenMint(address,uint256,address,address)": "4d7f3db0",
              "beforeTokenTransfer(address,address,uint256,address)": "b2210957",
              "blocklistRetryCount()": "0faf125f",
              "calculateNextPrizePeriodStartTime(uint256)": "47bed998",
              "canCompleteAward()": "6a74f107",
              "canStartAward()": "876f5c7e",
              "cancelAward()": "4c169f4f",
              "carryOverBlocklist()": "6f46f221",
              "completeAward()": "dfb2f13b",
              "currentPrize()": "c42b42a0",
              "estimateRemainingBlocksToPrize(uint256)": "01b48e34",
              "getExternalErc20Awards()": "62c77a61",
              "getExternalErc721AwardTokenIds(address)": "9417783f",
              "getExternalErc721Awards()": "42d09209",
              "getLastRngLockBlock()": "6bea5344",
              "getLastRngRequestId()": "2a7ad609",
              "initialize(uint256,uint256,address,address,address,address,address[])": "f97700e2",
              "initializeMultipleWinners(uint256,uint256,address,address,address,address,uint256)": "7f2be9fc",
              "isBlocklisted(address)": "8e204c43",
              "isPrizePeriodOver()": "95e5f9ee",
              "isRngCompleted()": "4aba4f6b",
              "isRngRequested()": "111070e4",
              "isRngTimedOut()": "738bbea8",
              "numberOfWinners()": "8acfaca9",
              "owner()": "8da5cb5b",
              "periodicPrizeStrategyListener()": "c2f19ee8",
              "prizePeriodEndAt()": "2c8fe73d",
              "prizePeriodRemainingSeconds()": "d5ad6bf6",
              "prizePeriodSeconds()": "94144c6b",
              "prizePeriodStartedAt()": "72f33ea9",
              "prizePool()": "719ce73e",
              "prizeSplit(uint256)": "eefc8ad1",
              "prizeSplits()": "8d5f10c4",
              "removeExternalErc20Award(address,address)": "b0244682",
              "removeExternalErc721Award(address,address)": "671137c4",
              "renounceOwnership()": "715018a6",
              "rng()": "d605787b",
              "rngRequestTimeout()": "acca5b95",
              "setBeforeAwardListener(address)": "30fcdf41",
              "setBlocklistRetryCount(uint256)": "52a30109",
              "setBlocklisted(address,bool)": "152d308c",
              "setCarryBlocklist(bool)": "a4e075ca",
              "setNumberOfWinners(uint256)": "6dfb0386",
              "setPeriodicPrizeStrategyListener(address)": "8aa3ec6f",
              "setPrizePeriodSeconds(uint256)": "884a4448",
              "setPrizeSplit((address,uint16,uint8),uint8)": "fbf0953e",
              "setPrizeSplits((address,uint16,uint8)[])": "c25a9c32",
              "setRngRequestTimeout(uint32)": "c6853270",
              "setRngService(address)": "7f4296d7",
              "setSplitExternalErc20Awards(bool)": "38a9b4b6",
              "setTokenListener(address)": "605e25ac",
              "splitExternalErc20Awards()": "9dafafb0",
              "sponsorship()": "500db70d",
              "startAward()": "b9ee1e05",
              "supportsInterface(bytes4)": "01ffc9a7",
              "ticket()": "6cc25db7",
              "tokenListener()": "6be51c4f",
              "transferOwnership(address)": "f2fde38b"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract BeforeAwardListenerInterface\",\"name\":\"beforeAwardListener\",\"type\":\"address\"}],\"name\":\"BeforeAwardListenerSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"carry\",\"type\":\"bool\"}],\"name\":\"BlocklistCarrySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"name\":\"BlocklistRetryCountSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isBlocked\",\"type\":\"bool\"}],\"name\":\"BlocklistSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"externalErc20\",\"type\":\"address\"}],\"name\":\"ExternalErc20AwardAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"externalErc20Award\",\"type\":\"address\"}],\"name\":\"ExternalErc20AwardRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"externalErc721\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"ExternalErc721AwardAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"externalErc721Award\",\"type\":\"address\"}],\"name\":\"ExternalErc721AwardRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"prizePeriodStart\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"prizePeriodSeconds\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"contract PrizePool\",\"name\":\"prizePool\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract TicketInterface\",\"name\":\"ticket\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"sponsorship\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract RNGInterface\",\"name\":\"rng\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract IERC20Upgradeable[]\",\"name\":\"externalErc20Awards\",\"type\":\"address[]\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"NoWinners\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"numberOfWinners\",\"type\":\"uint256\"}],\"name\":\"NumberOfWinnersSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract PeriodicPrizeStrategyListenerInterface\",\"name\":\"periodicPrizeStrategyListener\",\"type\":\"address\"}],\"name\":\"PeriodicPrizeStrategyListenerSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"prizePeriodSeconds\",\"type\":\"uint256\"}],\"name\":\"PrizePeriodSecondsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"prizePool\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"rngRequestId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"rngLockBlock\",\"type\":\"uint32\"}],\"name\":\"PrizePoolAwardCancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"prizePool\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"rngRequestId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"rngLockBlock\",\"type\":\"uint32\"}],\"name\":\"PrizePoolAwardStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"randomNumber\",\"type\":\"uint256\"}],\"name\":\"PrizePoolAwarded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"prizePeriodStartedAt\",\"type\":\"uint256\"}],\"name\":\"PrizePoolOpened\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"target\",\"type\":\"uint256\"}],\"name\":\"PrizeSplitRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"PrizeSplitSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"numberOfWinners\",\"type\":\"uint256\"}],\"name\":\"RetryMaxLimitReached\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"RngRequestFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"rngRequestTimeout\",\"type\":\"uint32\"}],\"name\":\"RngRequestTimeoutSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract RNGInterface\",\"name\":\"rngService\",\"type\":\"address\"}],\"name\":\"RngServiceUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"splitExternalErc20Awards\",\"type\":\"bool\"}],\"name\":\"SplitExternalErc20AwardsSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract TokenListenerInterface\",\"name\":\"tokenListener\",\"type\":\"address\"}],\"name\":\"TokenListenerUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_externalErc20\",\"type\":\"address\"}],\"name\":\"addExternalErc20Award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20Upgradeable[]\",\"name\":\"_externalErc20s\",\"type\":\"address[]\"}],\"name\":\"addExternalErc20Awards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"_externalErc721\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"_tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"addExternalErc721Award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"beforeAwardListener\",\"outputs\":[{\"internalType\":\"contract BeforeAwardListenerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"}],\"name\":\"beforeTokenMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"beforeTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"blocklistRetryCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTime\",\"type\":\"uint256\"}],\"name\":\"calculateNextPrizePeriodStartTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"canCompleteAward\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"canStartAward\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancelAward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"carryOverBlocklist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"completeAward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentPrize\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"secondsPerBlockMantissa\",\"type\":\"uint256\"}],\"name\":\"estimateRemainingBlocksToPrize\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExternalErc20Awards\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"_externalErc721\",\"type\":\"address\"}],\"name\":\"getExternalErc721AwardTokenIds\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExternalErc721Awards\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastRngLockBlock\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastRngRequestId\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_prizePeriodStart\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_prizePeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"contract PrizePool\",\"name\":\"_prizePool\",\"type\":\"address\"},{\"internalType\":\"contract TicketInterface\",\"name\":\"_ticket\",\"type\":\"address\"},{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_sponsorship\",\"type\":\"address\"},{\"internalType\":\"contract RNGInterface\",\"name\":\"_rng\",\"type\":\"address\"},{\"internalType\":\"contract IERC20Upgradeable[]\",\"name\":\"externalErc20Awards\",\"type\":\"address[]\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_prizePeriodStart\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_prizePeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"contract PrizePool\",\"name\":\"_prizePool\",\"type\":\"address\"},{\"internalType\":\"contract TicketInterface\",\"name\":\"_ticket\",\"type\":\"address\"},{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_sponsorship\",\"type\":\"address\"},{\"internalType\":\"contract RNGInterface\",\"name\":\"_rng\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_numberOfWinners\",\"type\":\"uint256\"}],\"name\":\"initializeMultipleWinners\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isBlocklisted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPrizePeriodOver\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isRngCompleted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isRngRequested\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isRngTimedOut\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"numberOfWinners\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"periodicPrizeStrategyListener\",\"outputs\":[{\"internalType\":\"contract PeriodicPrizeStrategyListenerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizePeriodEndAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizePeriodRemainingSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizePeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizePeriodStartedAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizePool\",\"outputs\":[{\"internalType\":\"contract PrizePool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"prizeSplitIndex\",\"type\":\"uint256\"}],\"name\":\"prizeSplit\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"}],\"internalType\":\"struct PrizeSplit.PrizeSplitConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizeSplits\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"}],\"internalType\":\"struct PrizeSplit.PrizeSplitConfig[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_externalErc20\",\"type\":\"address\"},{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_prevExternalErc20\",\"type\":\"address\"}],\"name\":\"removeExternalErc20Award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"_externalErc721\",\"type\":\"address\"},{\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"_prevExternalErc721\",\"type\":\"address\"}],\"name\":\"removeExternalErc721Award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rng\",\"outputs\":[{\"internalType\":\"contract RNGInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rngRequestTimeout\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract BeforeAwardListenerInterface\",\"name\":\"_beforeAwardListener\",\"type\":\"address\"}],\"name\":\"setBeforeAwardListener\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"setBlocklistRetryCount\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_isBlocked\",\"type\":\"bool\"}],\"name\":\"setBlocklisted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_carry\",\"type\":\"bool\"}],\"name\":\"setCarryBlocklist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"name\":\"setNumberOfWinners\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract PeriodicPrizeStrategyListenerInterface\",\"name\":\"_periodicPrizeStrategyListener\",\"type\":\"address\"}],\"name\":\"setPeriodicPrizeStrategyListener\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_prizePeriodSeconds\",\"type\":\"uint256\"}],\"name\":\"setPrizePeriodSeconds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"}],\"internalType\":\"struct PrizeSplit.PrizeSplitConfig\",\"name\":\"prizeStrategySplit\",\"type\":\"tuple\"},{\"internalType\":\"uint8\",\"name\":\"prizeSplitIndex\",\"type\":\"uint8\"}],\"name\":\"setPrizeSplit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"}],\"internalType\":\"struct PrizeSplit.PrizeSplitConfig[]\",\"name\":\"newPrizeSplits\",\"type\":\"tuple[]\"}],\"name\":\"setPrizeSplits\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_rngRequestTimeout\",\"type\":\"uint32\"}],\"name\":\"setRngRequestTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract RNGInterface\",\"name\":\"rngService\",\"type\":\"address\"}],\"name\":\"setRngService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_splitExternalErc20Awards\",\"type\":\"bool\"}],\"name\":\"setSplitExternalErc20Awards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"_tokenListener\",\"type\":\"address\"}],\"name\":\"setTokenListener\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"splitExternalErc20Awards\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sponsorship\",\"outputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startAward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ticket\",\"outputs\":[{\"internalType\":\"contract TicketInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenListener\",\"outputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"BlocklistCarrySet(bool)\":{\"details\":\"Emitted when carryOverBlocklist is toggled for distribution of the primary and secondary prizes.\",\"params\":{\"carry\":\"Awarded prize carry over status\"}},\"BlocklistRetryCountSet(uint256)\":{\"details\":\"Emitted when a new draw retry limit is set. Retry limit is set to limit gas spendings if a blocked user continues to be drawn.\",\"params\":{\"count\":\"Number of winner selection retry attempts \"}},\"BlocklistSet(address,bool)\":{\"details\":\"Emitted when a contract owner blocks/unblocks user from award selection in _distribute.\",\"params\":{\"isBlocked\":\"User blocked status\",\"user\":\"Address of user to block or unblock\"}},\"NoWinners()\":{\"details\":\"Emitted when no winner can be selected in _distribute due to ticket.totalSupply() equaling zero.\"},\"NumberOfWinnersSet(uint256)\":{\"details\":\"Emitted when numberOfWinners is set, which limits the maximum number of potentially selected winners.\",\"params\":{\"numberOfWinners\":\"Maximum potentially selected winners\"}},\"RetryMaxLimitReached(uint256)\":{\"details\":\"Emitted when the maximum number of users has not been selected after the blocklistRetryCount is reached.\",\"params\":{\"numberOfWinners\":\"Total number of winners selected before the blocklistRetryCount is reached.\"}},\"SplitExternalErc20AwardsSet(bool)\":{\"details\":\"Emitted when splitExternalErc20Awards is toggled between awarding external ERC20 to main or all winners.\"}},\"kind\":\"dev\",\"methods\":{\"addExternalErc20Award(address)\":{\"details\":\"Only the Prize-Strategy owner/creator can assign external tokens, and they must be approved by the Prize-Pool\",\"params\":{\"_externalErc20\":\"The address of an ERC20 token to be awarded\"}},\"addExternalErc721Award(address,uint256[])\":{\"details\":\"Only the Prize-Strategy owner/creator can assign external tokens, and they must be approved by the Prize-Pool NOTE: The NFT must already be owned by the Prize-Pool\",\"params\":{\"_externalErc721\":\"The address of an ERC721 token to be awarded\",\"_tokenIds\":\"An array of token IDs of the ERC721 to be awarded\"}},\"beforeTokenMint(address,uint256,address,address)\":{\"params\":{\"controlledToken\":\"The type of collateral that is being minted\"}},\"beforeTokenTransfer(address,address,uint256,address)\":{\"details\":\"Note that this is only for *transfers*, not mints or burns\",\"params\":{\"controlledToken\":\"The type of collateral that is being sent\"}},\"calculateNextPrizePeriodStartTime(uint256)\":{\"params\":{\"currentTime\":\"The timestamp to use as the current time\"},\"returns\":{\"_0\":\"The timestamp at which the next prize period would start\"}},\"canCompleteAward()\":{\"returns\":{\"_0\":\"True if an award can be completed, false otherwise.\"}},\"canStartAward()\":{\"returns\":{\"_0\":\"True if an award can be started, false otherwise.\"}},\"currentPrize()\":{\"returns\":{\"_0\":\"The current prize size\"}},\"estimateRemainingBlocksToPrize(uint256)\":{\"params\":{\"secondsPerBlockMantissa\":\"The number of seconds per block to use for the calculation.  Should be a fixed point 18 number like Ether.\"},\"returns\":{\"_0\":\"The estimated number of blocks remaining until the prize can be awarded.\"}},\"getExternalErc20Awards()\":{\"returns\":{\"_0\":\"An array of External ERC20 token addresses\"}},\"getExternalErc721AwardTokenIds(address)\":{\"returns\":{\"_0\":\"An array of External ERC721 token addresses\"}},\"getExternalErc721Awards()\":{\"returns\":{\"_0\":\"An array of External ERC721 token addresses\"}},\"getLastRngLockBlock()\":{\"returns\":{\"_0\":\"The block number that the RNG request is locked to\"}},\"getLastRngRequestId()\":{\"returns\":{\"_0\":\"The current Request ID\"}},\"initialize(uint256,uint256,address,address,address,address,address[])\":{\"params\":{\"_prizePeriodSeconds\":\"The duration of the prize period in seconds\",\"_prizePeriodStart\":\"The starting timestamp of the prize period.\",\"_prizePool\":\"The prize pool to award\",\"_rng\":\"The RNG service to use\",\"_sponsorship\":\"The sponsorship token\",\"_ticket\":\"The ticket to use to draw winners\"}},\"isPrizePeriodOver()\":{\"returns\":{\"_0\":\"True if the prize period is over, false otherwise\"}},\"isRngCompleted()\":{\"returns\":{\"_0\":\"True if a random number request has completed, false otherwise.\"}},\"isRngRequested()\":{\"returns\":{\"_0\":\"True if a random number has been requested, false otherwise.\"}},\"numberOfWinners()\":{\"details\":\"Read maximum number of winners per award distribution period from internal __numberOfWinners variable.\",\"returns\":{\"_0\":\"__numberOfWinners The total number of winners per prize award.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"prizePeriodEndAt()\":{\"returns\":{\"_0\":\"The timestamp at which the prize period ends.\"}},\"prizePeriodRemainingSeconds()\":{\"returns\":{\"_0\":\"The number of seconds remaining until the prize can be awarded.\"}},\"prizeSplit(uint256)\":{\"details\":\"Read PrizeSplitConfig struct from _prizeSplits array.\",\"params\":{\"prizeSplitIndex\":\"Index position of PrizeSplitConfig\"},\"returns\":{\"_0\":\"PrizeSplitConfig Single prize split config\"}},\"prizeSplits()\":{\"details\":\"Read all PrizeSplitConfig structs stored in _prizeSplits.\",\"returns\":{\"_0\":\"_prizeSplits Array of PrizeSplitConfig structs\"}},\"removeExternalErc20Award(address,address)\":{\"details\":\"Only the Prize-Strategy owner/creator can remove external tokens\",\"params\":{\"_externalErc20\":\"The address of an ERC20 token to be removed\",\"_prevExternalErc20\":\"The address of the previous ERC20 token in the `externalErc20s` list. If the ERC20 is the first address, then the previous address is the SENTINEL address: 0x0000000000000000000000000000000000000001\"}},\"removeExternalErc721Award(address,address)\":{\"details\":\"Only the Prize-Strategy owner/creator can remove external tokens\",\"params\":{\"_externalErc721\":\"The address of an ERC721 token to be removed\",\"_prevExternalErc721\":\"The address of the previous ERC721 token in the list. If no previous, then pass the SENTINEL address: 0x0000000000000000000000000000000000000001\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setBeforeAwardListener(address)\":{\"details\":\"The listener must implement ERC165 and the BeforeAwardListenerInterface\",\"params\":{\"_beforeAwardListener\":\"The address of the listener contract\"}},\"setBlocklistRetryCount(uint256)\":{\"details\":\"Limits winner selection (ticket.draw) retries to avoid to gas limit reached errors. Increases the probability of not reaching the maximum number of winners if to low.\",\"params\":{\"_count\":\"Number of retry attempts\"}},\"setBlocklisted(address,bool)\":{\"details\":\"Block/unblock a user from winning award in prize distribution by updating the isBlocklisted mapping.\",\"params\":{\"_isBlocked\":\"Blocked Status (true or false) of user\",\"_user\":\"Address of blocked user\"}},\"setCarryBlocklist(bool)\":{\"details\":\"Toggles if the main prize (prizePool.captureAwardBalance) and secondary prizes (LootBox) should be kept for the next draw or evenly distrubted if maximum number of winners is not selected. \",\"params\":{\"_carry\":\"Award carry over status (true or false)\"}},\"setNumberOfWinners(uint256)\":{\"details\":\"Sets maximum number of winners per award distribution period.\",\"params\":{\"count\":\"Number of winners.\"}},\"setPeriodicPrizeStrategyListener(address)\":{\"params\":{\"_periodicPrizeStrategyListener\":\"The address of the listener contract\"}},\"setPrizePeriodSeconds(uint256)\":{\"params\":{\"_prizePeriodSeconds\":\"The new prize period in seconds.  Must be greater than zero.\"}},\"setPrizeSplit((address,uint16,uint8),uint8)\":{\"details\":\"Updates a prize split config by passing a new PrizeSplitConfig struct and current index position. Limited to contract owner.\",\"params\":{\"prizeSplitIndex\":\"Index position of PrizeSplitConfig to update\",\"prizeStrategySplit\":\"PrizeSplitConfig config struct\"}},\"setPrizeSplits((address,uint16,uint8)[])\":{\"details\":\"Set and remove prize split configs by passing a new PrizeSplitConfig structs array. Will remove existing PrizeSplitConfig(s) if passed array length is less than existing _prizeSplits length.\",\"params\":{\"newPrizeSplits\":\"Array of PrizeSplitConfig structs\"}},\"setRngRequestTimeout(uint32)\":{\"params\":{\"_rngRequestTimeout\":\"The RNG request timeout in seconds.\"}},\"setRngService(address)\":{\"params\":{\"rngService\":\"The address of the new RNG service interface\"}},\"setSplitExternalErc20Awards(bool)\":{\"details\":\"Toggle external ERC20 awards for all prize winners. If unset will distribute external ERC20 awards to main winner.\",\"params\":{\"_splitExternalErc20Awards\":\"Toggle splitting external ERC20 awards.\"}},\"setTokenListener(address)\":{\"params\":{\"_tokenListener\":\"A contract that implements the token listener interface.\"}},\"startAward()\":{\"details\":\"The RNG-Request-Fee is expected to be held within this contract before calling this function\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"events\":{\"BlocklistCarrySet(bool)\":{\"notice\":\"Emitted when carryOverBlocklist is toggled.\"},\"BlocklistRetryCountSet(uint256)\":{\"notice\":\"Emitted when a new draw retry limit is set.\"},\"BlocklistSet(address,bool)\":{\"notice\":\"Emitted when a user is blocked/unblocked from receiving a prize award.\"},\"NoWinners()\":{\"notice\":\"Emitted when no winner can be selected during the prize distribution. \"},\"NumberOfWinnersSet(uint256)\":{\"notice\":\"Emitted when numberOfWinners is set.\"},\"PrizeSplitRemoved(uint256)\":{\"notice\":\"Emitted when a PrizeSplitConfig config is removed.\"},\"PrizeSplitSet(address,uint16,uint8,uint256)\":{\"notice\":\"Emitted when a PrizeSplitConfig config is added or updated.\"},\"RetryMaxLimitReached(uint256)\":{\"notice\":\"Emitted when the winner selection retry limit is reached during award distribution.\"},\"SplitExternalErc20AwardsSet(bool)\":{\"notice\":\"Emitted when splitExternalErc20Awards is toggled.\"}},\"kind\":\"user\",\"methods\":{\"VERSION()\":{\"notice\":\"Semver Version\"},\"addExternalErc20Award(address)\":{\"notice\":\"Adds an external ERC20 token type as an additional prize that can be awarded\"},\"addExternalErc721Award(address,uint256[])\":{\"notice\":\"Adds an external ERC721 token as an additional prize that can be awarded\"},\"beforeAwardListener()\":{\"notice\":\"A listener that is called before the prize is awarded\"},\"beforeTokenMint(address,uint256,address,address)\":{\"notice\":\"Called by the PrizePool when minting controlled tokens\"},\"beforeTokenTransfer(address,address,uint256,address)\":{\"notice\":\"Called by the PrizePool for transfers of controlled tokens\"},\"calculateNextPrizePeriodStartTime(uint256)\":{\"notice\":\"Calculates when the next prize period will start\"},\"canCompleteAward()\":{\"notice\":\"Returns whether an award process can be completed\"},\"canStartAward()\":{\"notice\":\"Returns whether an award process can be started\"},\"cancelAward()\":{\"notice\":\"Can be called by anyone to unlock the tickets if the RNG has timed out.\"},\"completeAward()\":{\"notice\":\"Completes the award process and awards the winners.  The random number must have been requested and is now available.\"},\"currentPrize()\":{\"notice\":\"Calculates and returns the currently accrued prize\"},\"estimateRemainingBlocksToPrize(uint256)\":{\"notice\":\"Estimates the remaining blocks until the prize given a number of seconds per block\"},\"getExternalErc20Awards()\":{\"notice\":\"Gets the current list of External ERC20 tokens that will be awarded with the current prize\"},\"getExternalErc721AwardTokenIds(address)\":{\"notice\":\"Gets the current list of External ERC721 tokens that will be awarded with the current prize\"},\"getExternalErc721Awards()\":{\"notice\":\"Gets the current list of External ERC721 tokens that will be awarded with the current prize\"},\"getLastRngLockBlock()\":{\"notice\":\"Returns the block number that the current RNG request has been locked to\"},\"getLastRngRequestId()\":{\"notice\":\"Returns the current RNG Request ID\"},\"initialize(uint256,uint256,address,address,address,address,address[])\":{\"notice\":\"Initializes a new strategy\"},\"isPrizePeriodOver()\":{\"notice\":\"Returns whether the prize period is over\"},\"isRngCompleted()\":{\"notice\":\"Returns whether the random number request has completed.\"},\"isRngRequested()\":{\"notice\":\"Returns whether a random number has been requested\"},\"numberOfWinners()\":{\"notice\":\"Maximum number of winners per award distribution period\"},\"periodicPrizeStrategyListener()\":{\"notice\":\"A listener that is called after the prize is awarded\"},\"prizePeriodEndAt()\":{\"notice\":\"Returns the timestamp at which the prize period ends\"},\"prizePeriodRemainingSeconds()\":{\"notice\":\"Returns the number of seconds remaining until the prize can be awarded.\"},\"prizeSplit(uint256)\":{\"notice\":\"Read prize split config from active PrizeSplits.\"},\"prizeSplits()\":{\"notice\":\"Read all prize splits configs.\"},\"removeExternalErc20Award(address,address)\":{\"notice\":\"Removes an external ERC20 token type as an additional prize that can be awarded\"},\"removeExternalErc721Award(address,address)\":{\"notice\":\"Removes an external ERC721 token as an additional prize that can be awarded\"},\"rngRequestTimeout()\":{\"notice\":\"RNG Request Timeout.  In fact, this is really a \\\"complete award\\\" timeout. If the rng completes the award can still be cancelled.\"},\"setBeforeAwardListener(address)\":{\"notice\":\"Allows the owner to set a listener that is triggered immediately before the award is distributed\"},\"setBlocklistRetryCount(uint256)\":{\"notice\":\"Sets the number of attempts for winner selection if a blocked address is chosen.\"},\"setBlocklisted(address,bool)\":{\"notice\":\"Block/unblock a user from winning during prize distribution.\"},\"setCarryBlocklist(bool)\":{\"notice\":\"Toggle if an unawarded prize amount should be kept for the next draw or evenly distrubted to selected winners. \"},\"setNumberOfWinners(uint256)\":{\"notice\":\"Sets maximum number of winners.\"},\"setPeriodicPrizeStrategyListener(address)\":{\"notice\":\"Allows the owner to set a listener for prize strategy callbacks.\"},\"setPrizePeriodSeconds(uint256)\":{\"notice\":\"Allows the owner to set the prize period in seconds.\"},\"setPrizeSplit((address,uint16,uint8),uint8)\":{\"notice\":\"Updates a previously set prize split config.\"},\"setPrizeSplits((address,uint16,uint8)[])\":{\"notice\":\"Set and remove prize split(s) configs.\"},\"setRngRequestTimeout(uint32)\":{\"notice\":\"Allows the owner to set the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\"},\"setRngService(address)\":{\"notice\":\"Sets the RNG service that the Prize Strategy is connected to\"},\"setSplitExternalErc20Awards(bool)\":{\"notice\":\"Toggle external ERC20 awards for all prize winners.\"},\"setTokenListener(address)\":{\"notice\":\"Allows the owner to set the token listener\"},\"startAward()\":{\"notice\":\"Starts the award process by starting random number request.  The prize period must have ended.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/prize-strategy/multiple-winners/MultipleWinners.sol\":\"MultipleWinners\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.6.0;\\n\\n/// @title Random Number Generator Interface\\n/// @notice Provides an interface for requesting random numbers from 3rd-party RNG services (Chainlink VRF, Starkware VDF, etc..)\\ninterface RNGInterface {\\n\\n  /// @notice Emitted when a new request for a random number has been submitted\\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\\n  /// @param sender The indexed address of the sender of the request\\n  event RandomNumberRequested(uint32 indexed requestId, address indexed sender);\\n\\n  /// @notice Emitted when an existing request for a random number has been completed\\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\\n  /// @param randomNumber The random number produced by the 3rd-party service\\n  event RandomNumberCompleted(uint32 indexed requestId, uint256 randomNumber);\\n\\n  /// @notice Gets the last request id used by the RNG service\\n  /// @return requestId The last request id used in the last request\\n  function getLastRequestId() external view returns (uint32 requestId);\\n\\n  /// @notice Gets the Fee for making a Request against an RNG service\\n  /// @return feeToken The address of the token that is used to pay fees\\n  /// @return requestFee The fee required to be paid to make a request\\n  function getRequestFee() external view returns (address feeToken, uint256 requestFee);\\n\\n  /// @notice Sends a request for a random number to the 3rd-party service\\n  /// @dev Some services will complete the request immediately, others may have a time-delay\\n  /// @dev Some services require payment in the form of a token, such as $LINK for Chainlink VRF\\n  /// @return requestId The ID of the request used to get the results of the RNG service\\n  /// @return lockBlock The block number at which the RNG service will start generating time-delayed randomness.  The calling contract\\n  /// should \\\"lock\\\" all activity until the result is available via the `requestId`\\n  function requestRandomNumber() external returns (uint32 requestId, uint32 lockBlock);\\n\\n  /// @notice Checks if the request for randomness from the 3rd-party service has completed\\n  /// @dev For time-delayed requests, this function is used to check/confirm completion\\n  /// @param requestId The ID of the request used to get the results of the RNG service\\n  /// @return isCompleted True if the request has completed and a random number is available, false otherwise\\n  function isRequestComplete(uint32 requestId) external view returns (bool isCompleted);\\n\\n  /// @notice Gets the random number produced by the 3rd-party service\\n  /// @param requestId The ID of the request used to get the results of the RNG service\\n  /// @return randomNum The random number\\n  function randomNumber(uint32 requestId) external returns (uint256 randomNum);\\n}\\n\",\"keccak256\":\"0xf917c68439d7476cd226f475e8fce940e0cf1d32cb0ff12e8537072a07f2b1da\",\"license\":\"GPL-3.0\"},\"contracts/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary Constants {\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC721 = 0x80ac58cd;\\n}\",\"keccak256\":\"0x5dc8f8bda4e9668a9ffae6a941774f849adcb368cc2275fd8a91e6ada8fad7fb\",\"license\":\"GPL-3.0\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../external/compound/ICompLike.sol\\\";\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../reserve/ReserveInterface.sol\\\";\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/TokenListenerLibrary.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\nimport \\\"./PrizePoolInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using SafeERC20Upgradeable for IERC721Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    address reserveRegistry,\\n    uint256 maxExitFeeMantissa\\n  );\\n\\n  /// @dev Event emitted when controlled token is added\\n  event ControlledTokenAdded(\\n    ControlledTokenInterface indexed token\\n  );\\n\\n  /// @dev Emitted when reserve is captured.\\n  event ReserveFeeCaptured(\\n    uint256 amount\\n  );\\n\\n  event AwardCaptured(\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when assets are deposited\\n  event Deposited(\\n    address indexed operator,\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount,\\n    address referrer\\n  );\\n\\n  /// @dev Event emitted when interest is awarded to a winner\\n  event Awarded(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are awarded to a winner\\n  event AwardedExternalERC20(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are transferred out\\n  event TransferredExternalERC20(\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC721s are awarded to a winner\\n  event AwardedExternalERC721(\\n    address indexed winner,\\n    address indexed token,\\n    uint256[] tokenIds\\n  );\\n\\n  /// @dev Event emitted when assets are withdrawn instantly\\n  event InstantWithdrawal(\\n    address indexed operator,\\n    address indexed from,\\n    address indexed token,\\n    uint256 amount,\\n    uint256 redeemed,\\n    uint256 exitFee\\n  );\\n\\n  event ReserveWithdrawal(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when the Liquidity Cap is set\\n  event LiquidityCapSet(\\n    uint256 liquidityCap\\n  );\\n\\n  /// @dev Event emitted when the Credit plan is set\\n  event CreditPlanSet(\\n    address token,\\n    uint128 creditLimitMantissa,\\n    uint128 creditRateMantissa\\n  );\\n\\n  /// @dev Event emitted when the Prize Strategy is set\\n  event PrizeStrategySet(\\n    address indexed prizeStrategy\\n  );\\n\\n  /// @dev Emitted when credit is minted\\n  event CreditMinted(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when credit is burned\\n  event CreditBurned(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\\n  event ErrorAwardingExternalERC721(bytes error);\\n\\n\\n  struct CreditPlan {\\n    uint128 creditLimitMantissa;\\n    uint128 creditRateMantissa;\\n  }\\n\\n  struct CreditBalance {\\n    uint192 balance;\\n    uint32 timestamp;\\n    bool initialized;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  /// @dev Reserve to which reserve fees are sent\\n  RegistryInterface public reserveRegistry;\\n\\n  /// @dev An array of all the controlled tokens\\n  ControlledTokenInterface[] internal _tokens;\\n\\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\\n  TokenListenerInterface public prizeStrategy;\\n\\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\\n  /// For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\\n  uint256 public maxExitFeeMantissa;\\n\\n  /// @dev The total funds that have been allocated to the reserve\\n  uint256 public reserveTotalSupply;\\n\\n  /// @dev The total amount of funds that the prize pool can hold.\\n  uint256 public liquidityCap;\\n\\n  /// @dev the The awardable balance\\n  uint256 internal _currentAwardBalance;\\n\\n  /// @dev Stores the credit plan for each token.\\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\\n\\n  /// @dev Stores each users balance of credit per token.\\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\\n\\n  /// @notice Initializes the Prize Pool\\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\\n  /// @param _maxExitFeeMantissa The maximum exit fee size\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_reserveRegistry) != address(0), \\\"PrizePool/reserveRegistry-not-zero\\\");\\n    uint256 controlledTokensLength = _controlledTokens.length;\\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\\n\\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\\n      _addControlledToken(controlledToken, i);\\n    }\\n    __Ownable_init();\\n    __ReentrancyGuard_init();\\n    _setLiquidityCap(uint256(-1));\\n\\n    reserveRegistry = _reserveRegistry;\\n    maxExitFeeMantissa = _maxExitFeeMantissa;\\n\\n    emit Initialized(\\n      address(_reserveRegistry),\\n      maxExitFeeMantissa\\n    );\\n  }\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external override view returns (address) {\\n    return address(_token());\\n  }\\n\\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\\n  /// @return The underlying balance of assets\\n  function balance() external returns (uint256) {\\n    return _balance();\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function canAwardExternal(address _externalToken) external view returns (bool) {\\n    return _canAwardExternal(_externalToken);\\n  }\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    canAddLiquidity(amount)\\n  {\\n    address operator = _msgSender();\\n\\n    _mint(to, amount, controlledToken, referrer);\\n\\n    _token().safeTransferFrom(operator, address(this), amount);\\n    _supply(amount);\\n\\n    emit Deposited(operator, to, controlledToken, amount, referrer);\\n  }\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    returns (uint256)\\n  {\\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n    require(exitFee <= maximumExitFee, \\\"PrizePool/exit-fee-exceeds-user-maximum\\\");\\n\\n    // burn the credit\\n    _burnCredit(from, controlledToken, burnedCredit);\\n\\n    // burn the tickets\\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\\n\\n    // redeem the tickets less the fee\\n    uint256 amountLessFee = amount.sub(exitFee);\\n    uint256 redeemed = _redeem(amountLessFee);\\n\\n    _token().safeTransfer(from, redeemed);\\n\\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\\n\\n    return exitFee;\\n  }\\n\\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\\n  /// @param exitFee The exit fee to check against the limit\\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\\n    if (exitFee > maxFee) {\\n      exitFee = maxFee;\\n    }\\n    return exitFee;\\n  }\\n\\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\\n  /// @param from The address the tokens are being transferred from (0 if minting)\\n  /// @param to The address the tokens are being transferred to (0 if burning)\\n  /// @param amount The amount of tokens being trasferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\\n    if (from != address(0)) {\\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\\n      // first accrue credit for their old balance\\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\\n\\n      if (from != to) {\\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\\n      }\\n\\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\\n    }\\n    if (to != address(0) && to != from) {\\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\\n    }\\n    // if we aren't minting\\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\\n    }\\n  }\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external override view returns (uint256) {\\n    return _currentAwardBalance;\\n  }\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n\\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\\n    uint256 currentBalance = _balance();\\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\\n\\n    if (unaccountedPrizeBalance > 0) {\\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\\n      if (reserveFee > 0) {\\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\\n        emit ReserveFeeCaptured(reserveFee);\\n      }\\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\\n\\n      emit AwardCaptured(unaccountedPrizeBalance);\\n    }\\n\\n    return _currentAwardBalance;\\n  }\\n\\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\\n\\n    uint256 amount = reserveTotalSupply;\\n    reserveTotalSupply = 0;\\n    uint256 redeemed = _redeem(amount);\\n\\n    _token().safeTransfer(address(to), redeemed);\\n\\n    emit ReserveWithdrawal(to, amount);\\n\\n    return redeemed;\\n  }\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external override\\n    onlyPrizeStrategy\\n    onlyControlledToken(controlledToken)\\n  {\\n    if (amount == 0) {\\n      return;\\n    }\\n\\n    require(amount <= _currentAwardBalance, \\\"PrizePool/award-exceeds-avail\\\");\\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\\n\\n    _mint(to, amount, controlledToken, address(0));\\n\\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\\n\\n    emit Awarded(to, controlledToken, amount);\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit TransferredExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit AwardedExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  function _transferOut(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (bool)\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (amount == 0) {\\n      return false;\\n    }\\n\\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\\n\\n    return true;\\n  }\\n\\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\\n  /// @param to The user who is receiving the tokens\\n  /// @param amount The amount of tokens they are receiving\\n  /// @param controlledToken The token that is going to be minted\\n  /// @param referrer The user who referred the minting\\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\\n    if (address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n    ControlledToken(controlledToken).controllerMint(to, amount);\\n  }\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (tokenIds.length == 0) {\\n      return;\\n    }\\n\\n    for (uint256 i = 0; i < tokenIds.length; i++) {\\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\\n\\n      }\\n      catch(bytes memory error){\\n        emit ErrorAwardingExternalERC721(error);\\n      }\\n      \\n    }\\n\\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\\n  }\\n\\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\\n  /// @param amount The prize amount\\n  /// @return The size of the reserve portion of the prize\\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    if (address(reserve) == address(0)) {\\n      return 0;\\n    }\\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\\n    if (reserveRateMantissa == 0) {\\n      return 0;\\n    }\\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\\n  }\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external override\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    )\\n  {\\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n  }\\n\\n  /// @dev Calculates the early exit fee for the given amount\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return Exit fee\\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\\n    return _limitExitFee(\\n      amount,\\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external override\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    durationSeconds =_estimateCreditAccrualTime(\\n      _controlledToken,\\n      _principal,\\n      _interest\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function _estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    internal\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    // interest = credit rate * principal * time\\n    // => time = interest / (credit rate * principal)\\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\\n    if (accruedPerSecond == 0) {\\n      return 0;\\n    }\\n    return _interest.div(accruedPerSecond);\\n  }\\n\\n  /// @notice Burns a users credit.\\n  /// @param user The user whose credit should be burned\\n  /// @param credit The amount of credit to burn\\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\\n\\n    emit CreditBurned(user, controlledToken, credit);\\n  }\\n\\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\\n  /// @param user The user for whom to accrue credit\\n  /// @param controlledToken The controlled token whose balance we are checking\\n  /// @param controlledTokenBalance The balance to use for the user\\n  /// @param extra Additional credit to be added\\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\\n    _updateCreditBalance(\\n      user,\\n      controlledToken,\\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\\n    );\\n  }\\n\\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\\n    uint256 newBalance;\\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\\n    if (!creditBalance.initialized) {\\n      newBalance = 0;\\n    } else {\\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\\n    }\\n    return newBalance;\\n  }\\n\\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\\n\\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\\n      balance: newBalance.toUint128(),\\n      timestamp: _currentTime().toUint32(),\\n      initialized: true\\n    });\\n\\n    if (oldBalance < newBalance) {\\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\\n    } \\n    else if (newBalance < oldBalance) {\\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\\n    }\\n  }\\n\\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\\n  /// @param creditBalance The new credit balance to be checked\\n  /// @return The users new credit balance.  Will not exceed the credit limit.\\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\\n      controlledTokenBalance,\\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\\n    );\\n    if (creditBalance > creditLimit) {\\n      creditBalance = creditLimit;\\n    }\\n\\n    return creditBalance;\\n  }\\n\\n  /// @notice Calculates the accrued interest for a user\\n  /// @param user The user whose credit should be calculated.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\\n  /// @return The credit that has accrued since the last credit update.\\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\\n\\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\\n      return 0;\\n    }\\n\\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\\n  }\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\\n    return _tokenCreditBalances[controlledToken][user].balance;\\n  }\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external override\\n    onlyControlledToken(_controlledToken)\\n    onlyOwner\\n  {\\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\\n      creditLimitMantissa: _creditLimitMantissa,\\n      creditRateMantissa: _creditRateMantissa\\n    });\\n\\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\\n  }\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external override\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    )\\n  {\\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\\n  }\\n\\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The token they are withdrawing\\n  /// @param amount The amount of funds they are withdrawing\\n  /// @return earlyExitFee The additional exit fee that should be charged.\\n  /// @return creditBurned The amount of credit that will be burned\\n  function _calculateEarlyExitFeeLessBurnedCredit(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (\\n      uint256 earlyExitFee,\\n      uint256 creditBurned\\n    )\\n  {\\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\\n    require(controlledTokenBalance >= amount, \\\"PrizePool/insuff-funds\\\");\\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\\n    /*\\n    The credit is used *last*.  Always charge the fees up-front.\\n\\n    How to calculate:\\n\\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\\n\\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\\n    */\\n\\n    // Determine available usable credit based on withdraw amount\\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\\n\\n    uint256 availableCredit;\\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\\n    }\\n\\n    // Determine amount of credit to burn and amount of fees required\\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\\n    earlyExitFee = totalExitFee.sub(creditBurned);\\n  }\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\\n    _setLiquidityCap(_liquidityCap);\\n  }\\n\\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\\n    liquidityCap = _liquidityCap;\\n    emit LiquidityCapSet(_liquidityCap);\\n  }\\n\\n  /// @notice Adds a new controlled token\\n  /// @param _controlledToken The controlled token to add.\\n  /// @param index The index to add the controlledToken\\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\\n    require(_controlledToken.controller() == this, \\\"PrizePool/token-ctrlr-mismatch\\\");\\n    \\n    _tokens[index] = _controlledToken;\\n    emit ControlledTokenAdded(_controlledToken);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\\n    _setPrizeStrategy(_prizeStrategy);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\\n    require(address(_prizeStrategy) != address(0), \\\"PrizePool/prizeStrategy-not-zero\\\");\\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PrizePool/prizeStrategy-invalid\\\");\\n    prizeStrategy = _prizeStrategy;\\n\\n    emit PrizeStrategySet(address(_prizeStrategy));\\n  }\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\\n    return _tokens;\\n  }\\n\\n  /// @dev Gets the current time as represented by the current block\\n  /// @return The timestamp of the current block\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external override view returns (uint256) {\\n    return _tokenTotalSupply();\\n  }\\n\\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\\n  /// @param to The address to delegate to \\n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\\n    if (compLike.balanceOf(address(this)) > 0) {\\n      compLike.delegate(to);\\n    }\\n  }\\n  \\n  /// @notice Required for ERC721 safe token transfers from smart contracts.\\n  /// @param operator The address that acts on behalf of the owner\\n  /// @param from The current owner of the NFT\\n  /// @param tokenId The NFT to transfer\\n  /// @param data Additional data with no specified format, sent in call to `_to`.\\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function _tokenTotalSupply() internal view returns (uint256) {\\n    uint256 total = reserveTotalSupply;\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \\n    uint256 tokensLength = tokens.length;\\n    \\n    for(uint256 i = 0; i < tokensLength; i++){\\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\\n    }\\n\\n    return total;\\n  }\\n\\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\\n  }\\n\\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\\n    uint256 tokensLength = tokens.length;\\n\\n    for(uint256 i = 0; i < tokensLength; i++) {\\n      if(tokens[i] == controlledToken) return true;\\n    }\\n    return false;\\n  }\\n  \\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\\n    return _isControlled(controlledToken);\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function _token() internal virtual view returns (IERC20Upgradeable);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal virtual returns (uint256);\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal virtual;\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\\n\\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  modifier onlyControlledToken(address controlledToken) {\\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \\\"PrizePool/unknown-token\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure caller is the prize-strategy\\n  modifier onlyPrizeStrategy() {\\n    require(_msgSender() == address(prizeStrategy), \\\"PrizePool/only-prizeStrategy\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\\n  modifier canAddLiquidity(uint256 _amount) {\\n    require(_canAddLiquidity(_amount), \\\"PrizePool/exceeds-liquidity-cap\\\");\\n    _;\\n  }\\n\\n  modifier onlyReserve() {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    require(address(reserve) == msg.sender, \\\"PrizePool/only-reserve\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x386ebc1c80ab4424f14125e716dd12641ff933b475bf1082b7b1a6eee4a969c3\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListener.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./BeforeAwardListenerInterface.sol\\\";\\nimport \\\"../Constants.sol\\\";\\nimport \\\"./BeforeAwardListenerLibrary.sol\\\";\\n\\nabstract contract BeforeAwardListener is BeforeAwardListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == BeforeAwardListenerLibrary.ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER\\n    );\\n  }\\n}\",\"keccak256\":\"0x5da2a7332421d6136d793ef55410c2da63a7fb719e8522697f78ac4c50391505\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @notice The interface for the Periodic Prize Strategy before award listener.  This listener will be called immediately before the award is distributed.\\ninterface BeforeAwardListenerInterface is IERC165Upgradeable {\\n  /// @notice Called immediately before the award is distributed\\n  function beforePrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x96145efe8fc65aff97d11ffaf0905d53baf4b87c4a575a84d691804468f12083\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary BeforeAwardListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforePrizePoolAwarded(uint256,uint256)')) == 0x4cdf9c3e\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER = 0x4cdf9c3e;\\n}\",\"keccak256\":\"0xeac08a7b8e2e7d508a0af89c05c31c36e2b060674d05dfa9a5016cf2d12cf500\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategy.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\\\";\\nimport \\\"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../token/TokenListener.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TicketInterface.sol\\\";\\nimport \\\"../prize-pool/PrizePool.sol\\\";\\nimport \\\"../Constants.sol\\\";\\nimport \\\"./PeriodicPrizeStrategyListenerInterface.sol\\\";\\nimport \\\"./PeriodicPrizeStrategyListenerLibrary.sol\\\";\\nimport \\\"./BeforeAwardListener.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\nabstract contract PeriodicPrizeStrategy is Initializable,\\n                                           OwnableUpgradeable,\\n                                           TokenListener {\\n\\n  using SafeMathUpgradeable for uint256;\\n  using SafeMathUpgradeable for uint16;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using AddressUpgradeable for address;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  uint256 internal constant ETHEREUM_BLOCK_TIME_ESTIMATE_MANTISSA = 13.4 ether;\\n\\n  event PrizePoolOpened(\\n    address indexed operator,\\n    uint256 indexed prizePeriodStartedAt\\n  );\\n\\n  event RngRequestFailed();\\n\\n  event PrizePoolAwardStarted(\\n    address indexed operator,\\n    address indexed prizePool,\\n    uint32 indexed rngRequestId,\\n    uint32 rngLockBlock\\n  );\\n\\n  event PrizePoolAwardCancelled(\\n    address indexed operator,\\n    address indexed prizePool,\\n    uint32 indexed rngRequestId,\\n    uint32 rngLockBlock\\n  );\\n\\n  event PrizePoolAwarded(\\n    address indexed operator,\\n    uint256 randomNumber\\n  );\\n\\n  event RngServiceUpdated(\\n    RNGInterface indexed rngService\\n  );\\n\\n  event TokenListenerUpdated(\\n    TokenListenerInterface indexed tokenListener\\n  );\\n\\n  event RngRequestTimeoutSet(\\n    uint32 rngRequestTimeout\\n  );\\n\\n  event PrizePeriodSecondsUpdated(\\n    uint256 prizePeriodSeconds\\n  );\\n\\n  event BeforeAwardListenerSet(\\n    BeforeAwardListenerInterface indexed beforeAwardListener\\n  );\\n\\n  event PeriodicPrizeStrategyListenerSet(\\n    PeriodicPrizeStrategyListenerInterface indexed periodicPrizeStrategyListener\\n  );\\n\\n  event ExternalErc721AwardAdded(\\n    IERC721Upgradeable indexed externalErc721,\\n    uint256[] tokenIds\\n  );\\n\\n  event ExternalErc20AwardAdded(\\n    IERC20Upgradeable indexed externalErc20\\n  );\\n\\n  event ExternalErc721AwardRemoved(\\n    IERC721Upgradeable indexed externalErc721Award\\n  );\\n\\n  event ExternalErc20AwardRemoved(\\n    IERC20Upgradeable indexed externalErc20Award\\n  );\\n\\n  event Initialized(\\n    uint256 prizePeriodStart,\\n    uint256 prizePeriodSeconds,\\n    PrizePool indexed prizePool,\\n    TicketInterface ticket,\\n    IERC20Upgradeable sponsorship,\\n    RNGInterface rng,\\n    IERC20Upgradeable[] externalErc20Awards\\n  );\\n\\n  struct RngRequest {\\n    uint32 id;\\n    uint32 lockBlock;\\n    uint32 requestedAt;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  // Comptroller\\n  TokenListenerInterface public tokenListener;\\n\\n  // Contract Interfaces\\n  PrizePool public prizePool;\\n  TicketInterface public ticket;\\n  IERC20Upgradeable public sponsorship;\\n  RNGInterface public rng;\\n\\n  // Current RNG Request\\n  RngRequest internal rngRequest;\\n\\n  /// @notice RNG Request Timeout.  In fact, this is really a \\\"complete award\\\" timeout.\\n  /// If the rng completes the award can still be cancelled.\\n  uint32 public rngRequestTimeout;\\n\\n  // Prize period\\n  uint256 public prizePeriodSeconds;\\n  uint256 public prizePeriodStartedAt;\\n\\n  // External tokens awarded as part of prize\\n  MappedSinglyLinkedList.Mapping internal externalErc20s;\\n  MappedSinglyLinkedList.Mapping internal externalErc721s;\\n\\n  // External NFT token IDs to be awarded\\n  //   NFT Address => TokenIds\\n  mapping (IERC721Upgradeable => uint256[]) internal externalErc721TokenIds;\\n\\n  /// @notice A listener that is called before the prize is awarded\\n  BeforeAwardListenerInterface public beforeAwardListener;\\n\\n  /// @notice A listener that is called after the prize is awarded\\n  PeriodicPrizeStrategyListenerInterface public periodicPrizeStrategyListener;\\n\\n  /// @notice Initializes a new strategy\\n  /// @param _prizePeriodStart The starting timestamp of the prize period.\\n  /// @param _prizePeriodSeconds The duration of the prize period in seconds\\n  /// @param _prizePool The prize pool to award\\n  /// @param _ticket The ticket to use to draw winners\\n  /// @param _sponsorship The sponsorship token\\n  /// @param _rng The RNG service to use\\n  function initialize (\\n    uint256 _prizePeriodStart,\\n    uint256 _prizePeriodSeconds,\\n    PrizePool _prizePool,\\n    TicketInterface _ticket,\\n    IERC20Upgradeable _sponsorship,\\n    RNGInterface _rng,\\n    IERC20Upgradeable[] memory externalErc20Awards\\n  ) public initializer {\\n    require(address(_prizePool) != address(0), \\\"PeriodicPrizeStrategy/prize-pool-not-zero\\\");\\n    require(address(_ticket) != address(0), \\\"PeriodicPrizeStrategy/ticket-not-zero\\\");\\n    require(address(_sponsorship) != address(0), \\\"PeriodicPrizeStrategy/sponsorship-not-zero\\\");\\n    require(address(_rng) != address(0), \\\"PeriodicPrizeStrategy/rng-not-zero\\\");\\n    prizePool = _prizePool;\\n    ticket = _ticket;\\n    rng = _rng;\\n    sponsorship = _sponsorship;\\n    _setPrizePeriodSeconds(_prizePeriodSeconds);\\n\\n    __Ownable_init();\\n\\n    externalErc20s.initialize();\\n    for (uint256 i = 0; i < externalErc20Awards.length; i++) {\\n      _addExternalErc20Award(externalErc20Awards[i]);\\n    }\\n\\n    prizePeriodSeconds = _prizePeriodSeconds;\\n    prizePeriodStartedAt = _prizePeriodStart;\\n\\n    externalErc721s.initialize();\\n\\n    // 30 min timeout\\n    _setRngRequestTimeout(1800);\\n\\n    emit Initialized(\\n      _prizePeriodStart,\\n      _prizePeriodSeconds,\\n      _prizePool,\\n      _ticket,\\n      _sponsorship,\\n      _rng,\\n      externalErc20Awards\\n    );\\n    emit PrizePoolOpened(_msgSender(), prizePeriodStartedAt);\\n  }\\n\\n  function _distribute(uint256 randomNumber) internal virtual;\\n\\n  /// @notice Calculates and returns the currently accrued prize\\n  /// @return The current prize size\\n  function currentPrize() public view returns (uint256) {\\n    return prizePool.awardBalance();\\n  }\\n\\n  /// @notice Allows the owner to set the token listener\\n  /// @param _tokenListener A contract that implements the token listener interface.\\n  function setTokenListener(TokenListenerInterface _tokenListener) external onlyOwner requireAwardNotInProgress {\\n    require(address(0) == address(_tokenListener) || address(_tokenListener).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PeriodicPrizeStrategy/token-listener-invalid\\\");\\n\\n    tokenListener = _tokenListener;\\n\\n    emit TokenListenerUpdated(tokenListener);\\n  }\\n\\n  /// @notice Estimates the remaining blocks until the prize given a number of seconds per block\\n  /// @param secondsPerBlockMantissa The number of seconds per block to use for the calculation.  Should be a fixed point 18 number like Ether.\\n  /// @return The estimated number of blocks remaining until the prize can be awarded.\\n  function estimateRemainingBlocksToPrize(uint256 secondsPerBlockMantissa) public view returns (uint256) {\\n    return FixedPoint.divideUintByMantissa(\\n      _prizePeriodRemainingSeconds(),\\n      secondsPerBlockMantissa\\n    );\\n  }\\n\\n  /// @notice Returns the number of seconds remaining until the prize can be awarded.\\n  /// @return The number of seconds remaining until the prize can be awarded.\\n  function prizePeriodRemainingSeconds() external view returns (uint256) {\\n    return _prizePeriodRemainingSeconds();\\n  }\\n\\n  /// @notice Returns the number of seconds remaining until the prize can be awarded.\\n  /// @return The number of seconds remaining until the prize can be awarded.\\n  function _prizePeriodRemainingSeconds() internal view returns (uint256) {\\n    uint256 endAt = _prizePeriodEndAt();\\n    uint256 time = _currentTime();\\n    if (time > endAt) {\\n      return 0;\\n    }\\n    return endAt.sub(time);\\n  }\\n\\n  /// @notice Returns whether the prize period is over\\n  /// @return True if the prize period is over, false otherwise\\n  function isPrizePeriodOver() external view returns (bool) {\\n    return _isPrizePeriodOver();\\n  }\\n\\n  /// @notice Returns whether the prize period is over\\n  /// @return True if the prize period is over, false otherwise\\n  function _isPrizePeriodOver() internal view returns (bool) {\\n    return _currentTime() >= _prizePeriodEndAt();\\n  }\\n\\n  /// @notice Awards collateral as tickets to a user\\n  /// @param user Recipient of minted tokens\\n  /// @param amount Amount of minted tokens\\n  function _awardTickets(address user, uint256 amount) internal {\\n    prizePool.award(user, amount, address(ticket));\\n  }\\n  \\n  /// @notice Mints ticket or sponsorship tokens for user.\\n  /// @dev Mints ticket or sponsorship tokens by looking up the address in the prizePool.tokens mapping. \\n  /// @param user Recipient of minted tokens\\n  /// @param amount Amount of minted tokens\\n  /// @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\\n  function _awardToken(address user, uint256 amount, uint8 tokenIndex) internal {\\n    ControlledTokenInterface[] memory _controlledTokens = prizePool.tokens();\\n    require(tokenIndex <= _controlledTokens.length, \\\"PeriodicPrizeStrategy/award-invalid-token-index\\\");\\n    ControlledTokenInterface _token = _controlledTokens[tokenIndex];\\n    prizePool.award(user, amount, address(_token));\\n  }\\n\\n  /// @notice Awards all external tokens with non-zero balances to the given user.  The external tokens must be held by the PrizePool contract.\\n  /// @param winner The user to transfer the tokens to\\n  function _awardAllExternalTokens(address winner) internal {\\n    _awardExternalErc20s(winner);\\n    _awardExternalErc721s(winner);\\n  }\\n\\n  /// @notice Awards all external ERC20 tokens with non-zero balances to the given user.\\n  /// The external tokens must be held by the PrizePool contract.\\n  /// @param winner The user to transfer the tokens to\\n  function _awardExternalErc20s(address winner) internal {\\n    address currentToken = externalErc20s.start();\\n    while (currentToken != address(0) && currentToken != externalErc20s.end()) {\\n      uint256 balance = IERC20Upgradeable(currentToken).balanceOf(address(prizePool));\\n      if (balance > 0) {\\n        prizePool.awardExternalERC20(winner, currentToken, balance);\\n      }\\n      currentToken = externalErc20s.next(currentToken);\\n    }\\n  }\\n\\n  /// @notice Awards all external ERC721 tokens to the given user.\\n  /// The external tokens must be held by the PrizePool contract.\\n  /// @dev The list of ERC721s is reset after every award\\n  /// @param winner The user to transfer the tokens to\\n  function _awardExternalErc721s(address winner) internal {\\n    address currentToken = externalErc721s.start();\\n    while (currentToken != address(0) && currentToken != externalErc721s.end()) {\\n      uint256 balance = IERC721Upgradeable(currentToken).balanceOf(address(prizePool));\\n      if (balance > 0) {\\n        prizePool.awardExternalERC721(winner, currentToken, externalErc721TokenIds[IERC721Upgradeable(currentToken)]);\\n        _removeExternalErc721AwardTokens(IERC721Upgradeable(currentToken));\\n      }\\n      currentToken = externalErc721s.next(currentToken);\\n    }\\n    externalErc721s.clearAll();\\n  }\\n\\n  /// @notice Returns the timestamp at which the prize period ends\\n  /// @return The timestamp at which the prize period ends.\\n  function prizePeriodEndAt() external view returns (uint256) {\\n    // current prize started at is non-inclusive, so add one\\n    return _prizePeriodEndAt();\\n  }\\n\\n  /// @notice Returns the timestamp at which the prize period ends\\n  /// @return The timestamp at which the prize period ends.\\n  function _prizePeriodEndAt() internal view returns (uint256) {\\n    // current prize started at is non-inclusive, so add one\\n    return prizePeriodStartedAt.add(prizePeriodSeconds);\\n  }\\n\\n  /// @notice Called by the PrizePool for transfers of controlled tokens\\n  /// @dev Note that this is only for *transfers*, not mints or burns\\n  /// @param controlledToken The type of collateral that is being sent\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external override onlyPrizePool {\\n    require(from != to, \\\"PeriodicPrizeStrategy/transfer-to-self\\\");\\n\\n    if (controlledToken == address(ticket)) {\\n      _requireAwardNotInProgress();\\n    }\\n\\n    if (address(tokenListener) != address(0)) {\\n      tokenListener.beforeTokenTransfer(from, to, amount, controlledToken);\\n    }\\n  }\\n\\n  /// @notice Called by the PrizePool when minting controlled tokens\\n  /// @param controlledToken The type of collateral that is being minted\\n  function beforeTokenMint(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external\\n    override\\n    onlyPrizePool\\n  {\\n    if (controlledToken == address(ticket)) {\\n      _requireAwardNotInProgress();\\n    }\\n    if (address(tokenListener) != address(0)) {\\n      tokenListener.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n  }\\n\\n  /// @notice returns the current time.  Used for testing.\\n  /// @return The current time (block.timestamp)\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice returns the current time.  Used for testing.\\n  /// @return The current time (block.timestamp)\\n  function _currentBlock() internal virtual view returns (uint256) {\\n    return block.number;\\n  }\\n\\n  /// @notice Starts the award process by starting random number request.  The prize period must have ended.\\n  /// @dev The RNG-Request-Fee is expected to be held within this contract before calling this function\\n  function startAward() external requireCanStartAward {\\n    (address feeToken, uint256 requestFee) = rng.getRequestFee();\\n    if (feeToken != address(0) && requestFee > 0) {\\n      IERC20Upgradeable(feeToken).safeApprove(address(rng), requestFee);\\n    }\\n\\n    (uint32 requestId, uint32 lockBlock) = rng.requestRandomNumber();\\n    rngRequest.id = requestId;\\n    rngRequest.lockBlock = lockBlock;\\n    rngRequest.requestedAt = _currentTime().toUint32();\\n\\n    emit PrizePoolAwardStarted(_msgSender(), address(prizePool), requestId, lockBlock);\\n  }\\n\\n  /// @notice Can be called by anyone to unlock the tickets if the RNG has timed out.\\n  function cancelAward() public {\\n    require(isRngTimedOut(), \\\"PeriodicPrizeStrategy/rng-not-timedout\\\");\\n    uint32 requestId = rngRequest.id;\\n    uint32 lockBlock = rngRequest.lockBlock;\\n    delete rngRequest;\\n    emit RngRequestFailed();\\n    emit PrizePoolAwardCancelled(msg.sender, address(prizePool), requestId, lockBlock);\\n  }\\n\\n  /// @notice Completes the award process and awards the winners.  The random number must have been requested and is now available.\\n  function completeAward() external requireCanCompleteAward {\\n    uint256 randomNumber = rng.randomNumber(rngRequest.id);\\n    delete rngRequest;\\n\\n    if (address(beforeAwardListener) != address(0)) {\\n      beforeAwardListener.beforePrizePoolAwarded(randomNumber, prizePeriodStartedAt);\\n    }\\n    _distribute(randomNumber);\\n    if (address(periodicPrizeStrategyListener) != address(0)) {\\n      periodicPrizeStrategyListener.afterPrizePoolAwarded(randomNumber, prizePeriodStartedAt);\\n    }\\n\\n    // to avoid clock drift, we should calculate the start time based on the previous period start time.\\n    prizePeriodStartedAt = _calculateNextPrizePeriodStartTime(_currentTime());\\n\\n    emit PrizePoolAwarded(_msgSender(), randomNumber);\\n    emit PrizePoolOpened(_msgSender(), prizePeriodStartedAt);\\n  }\\n\\n  /// @notice Allows the owner to set a listener that is triggered immediately before the award is distributed\\n  /// @dev The listener must implement ERC165 and the BeforeAwardListenerInterface\\n  /// @param _beforeAwardListener The address of the listener contract\\n  function setBeforeAwardListener(BeforeAwardListenerInterface _beforeAwardListener) external onlyOwner requireAwardNotInProgress {\\n    require(\\n      address(0) == address(_beforeAwardListener) || address(_beforeAwardListener).supportsInterface(BeforeAwardListenerLibrary.ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER),\\n      \\\"PeriodicPrizeStrategy/beforeAwardListener-invalid\\\"\\n    );\\n\\n    beforeAwardListener = _beforeAwardListener;\\n\\n    emit BeforeAwardListenerSet(_beforeAwardListener);\\n  }\\n\\n  /// @notice Allows the owner to set a listener for prize strategy callbacks.\\n  /// @param _periodicPrizeStrategyListener The address of the listener contract\\n  function setPeriodicPrizeStrategyListener(PeriodicPrizeStrategyListenerInterface _periodicPrizeStrategyListener) external onlyOwner requireAwardNotInProgress {\\n    require(\\n      address(0) == address(_periodicPrizeStrategyListener) || address(_periodicPrizeStrategyListener).supportsInterface(PeriodicPrizeStrategyListenerLibrary.ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER),\\n      \\\"PeriodicPrizeStrategy/prizeStrategyListener-invalid\\\"\\n    );\\n\\n    periodicPrizeStrategyListener = _periodicPrizeStrategyListener;\\n\\n    emit PeriodicPrizeStrategyListenerSet(_periodicPrizeStrategyListener);\\n  }\\n\\n  function _calculateNextPrizePeriodStartTime(uint256 currentTime) internal view returns (uint256) {\\n    uint256 elapsedPeriods = currentTime.sub(prizePeriodStartedAt).div(prizePeriodSeconds);\\n    return prizePeriodStartedAt.add(elapsedPeriods.mul(prizePeriodSeconds));\\n  }\\n\\n  /// @notice Calculates when the next prize period will start\\n  /// @param currentTime The timestamp to use as the current time\\n  /// @return The timestamp at which the next prize period would start\\n  function calculateNextPrizePeriodStartTime(uint256 currentTime) external view returns (uint256) {\\n    return _calculateNextPrizePeriodStartTime(currentTime);\\n  }\\n\\n  /// @notice Returns whether an award process can be started\\n  /// @return True if an award can be started, false otherwise.\\n  function canStartAward() external view returns (bool) {\\n    return _isPrizePeriodOver() && !isRngRequested();\\n  }\\n\\n  /// @notice Returns whether an award process can be completed\\n  /// @return True if an award can be completed, false otherwise.\\n  function canCompleteAward() external view returns (bool) {\\n    return isRngRequested() && isRngCompleted();\\n  }\\n\\n  /// @notice Returns whether a random number has been requested\\n  /// @return True if a random number has been requested, false otherwise.\\n  function isRngRequested() public view returns (bool) {\\n    return rngRequest.id != 0;\\n  }\\n\\n  /// @notice Returns whether the random number request has completed.\\n  /// @return True if a random number request has completed, false otherwise.\\n  function isRngCompleted() public view returns (bool) {\\n    return rng.isRequestComplete(rngRequest.id);\\n  }\\n\\n  /// @notice Returns the block number that the current RNG request has been locked to\\n  /// @return The block number that the RNG request is locked to\\n  function getLastRngLockBlock() external view returns (uint32) {\\n    return rngRequest.lockBlock;\\n  }\\n\\n  /// @notice Returns the current RNG Request ID\\n  /// @return The current Request ID\\n  function getLastRngRequestId() external view returns (uint32) {\\n    return rngRequest.id;\\n  }\\n\\n  /// @notice Sets the RNG service that the Prize Strategy is connected to\\n  /// @param rngService The address of the new RNG service interface\\n  function setRngService(RNGInterface rngService) external onlyOwner requireAwardNotInProgress {\\n    require(!isRngRequested(), \\\"PeriodicPrizeStrategy/rng-in-flight\\\");\\n\\n    rng = rngService;\\n    emit RngServiceUpdated(rngService);\\n  }\\n\\n  /// @notice Allows the owner to set the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\\n  /// @param _rngRequestTimeout The RNG request timeout in seconds.\\n  function setRngRequestTimeout(uint32 _rngRequestTimeout) external onlyOwner requireAwardNotInProgress {\\n    _setRngRequestTimeout(_rngRequestTimeout);\\n  }\\n\\n  /// @notice Sets the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\\n  /// @param _rngRequestTimeout The RNG request timeout in seconds.\\n  function _setRngRequestTimeout(uint32 _rngRequestTimeout) internal {\\n    require(_rngRequestTimeout > 60, \\\"PeriodicPrizeStrategy/rng-timeout-gt-60-secs\\\");\\n    rngRequestTimeout = _rngRequestTimeout;\\n    emit RngRequestTimeoutSet(rngRequestTimeout);\\n  }\\n\\n  /// @notice Allows the owner to set the prize period in seconds.\\n  /// @param _prizePeriodSeconds The new prize period in seconds.  Must be greater than zero.\\n  function setPrizePeriodSeconds(uint256 _prizePeriodSeconds) external onlyOwner requireAwardNotInProgress {\\n    _setPrizePeriodSeconds(_prizePeriodSeconds);\\n  }\\n\\n  /// @notice Sets the prize period in seconds.\\n  /// @param _prizePeriodSeconds The new prize period in seconds.  Must be greater than zero.\\n  function _setPrizePeriodSeconds(uint256 _prizePeriodSeconds) internal {\\n    require(_prizePeriodSeconds > 0, \\\"PeriodicPrizeStrategy/prize-period-greater-than-zero\\\");\\n    prizePeriodSeconds = _prizePeriodSeconds;\\n\\n    emit PrizePeriodSecondsUpdated(prizePeriodSeconds);\\n  }\\n\\n  /// @notice Gets the current list of External ERC20 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC20 token addresses\\n  function getExternalErc20Awards() external view returns (address[] memory) {\\n    return externalErc20s.addressArray();\\n  }\\n\\n  /// @notice Adds an external ERC20 token type as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can assign external tokens,\\n  /// and they must be approved by the Prize-Pool\\n  /// @param _externalErc20 The address of an ERC20 token to be awarded\\n  function addExternalErc20Award(IERC20Upgradeable _externalErc20) external onlyOwnerOrListener requireAwardNotInProgress {\\n    _addExternalErc20Award(_externalErc20);\\n  }\\n\\n  function _addExternalErc20Award(IERC20Upgradeable _externalErc20) internal {\\n    require(address(_externalErc20).isContract(), \\\"PeriodicPrizeStrategy/erc20-null\\\");\\n    require(prizePool.canAwardExternal(address(_externalErc20)), \\\"PeriodicPrizeStrategy/cannot-award-external\\\");\\n    (bool succeeded, bytes memory returnValue) = address(_externalErc20).staticcall(abi.encodeWithSignature(\\\"totalSupply()\\\"));\\n    require(succeeded, \\\"PeriodicPrizeStrategy/erc20-invalid\\\");\\n    externalErc20s.addAddress(address(_externalErc20));\\n    emit ExternalErc20AwardAdded(_externalErc20);\\n  }\\n\\n  function addExternalErc20Awards(IERC20Upgradeable[] calldata _externalErc20s) external onlyOwnerOrListener requireAwardNotInProgress {\\n    for (uint256 i = 0; i < _externalErc20s.length; i++) {\\n      _addExternalErc20Award(_externalErc20s[i]);\\n    }\\n  }\\n\\n  /// @notice Removes an external ERC20 token type as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can remove external tokens\\n  /// @param _externalErc20 The address of an ERC20 token to be removed\\n  /// @param _prevExternalErc20 The address of the previous ERC20 token in the `externalErc20s` list.\\n  /// If the ERC20 is the first address, then the previous address is the SENTINEL address: 0x0000000000000000000000000000000000000001\\n  function removeExternalErc20Award(IERC20Upgradeable _externalErc20, IERC20Upgradeable _prevExternalErc20) external onlyOwner requireAwardNotInProgress {\\n    externalErc20s.removeAddress(address(_prevExternalErc20), address(_externalErc20));\\n    emit ExternalErc20AwardRemoved(_externalErc20);\\n  }\\n\\n  /// @notice Gets the current list of External ERC721 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC721 token addresses\\n  function getExternalErc721Awards() external view returns (address[] memory) {\\n    return externalErc721s.addressArray();\\n  }\\n\\n  /// @notice Gets the current list of External ERC721 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC721 token addresses\\n  function getExternalErc721AwardTokenIds(IERC721Upgradeable _externalErc721) external view returns (uint256[] memory) {\\n    return externalErc721TokenIds[_externalErc721];\\n  }\\n\\n  /// @notice Adds an external ERC721 token as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can assign external tokens,\\n  /// and they must be approved by the Prize-Pool\\n  /// NOTE: The NFT must already be owned by the Prize-Pool\\n  /// @param _externalErc721 The address of an ERC721 token to be awarded\\n  /// @param _tokenIds An array of token IDs of the ERC721 to be awarded\\n  function addExternalErc721Award(IERC721Upgradeable _externalErc721, uint256[] calldata _tokenIds) external onlyOwnerOrListener requireAwardNotInProgress {\\n    require(prizePool.canAwardExternal(address(_externalErc721)), \\\"PeriodicPrizeStrategy/cannot-award-external\\\");\\n    require(address(_externalErc721).supportsInterface(Constants.ERC165_INTERFACE_ID_ERC721), \\\"PeriodicPrizeStrategy/erc721-invalid\\\");\\n    \\n    if (!externalErc721s.contains(address(_externalErc721))) {\\n      externalErc721s.addAddress(address(_externalErc721));\\n    }\\n\\n    for (uint256 i = 0; i < _tokenIds.length; i++) {\\n      _addExternalErc721Award(_externalErc721, _tokenIds[i]);\\n    }\\n\\n    emit ExternalErc721AwardAdded(_externalErc721, _tokenIds);\\n  }\\n\\n  function _addExternalErc721Award(IERC721Upgradeable _externalErc721, uint256 _tokenId) internal {\\n    require(IERC721Upgradeable(_externalErc721).ownerOf(_tokenId) == address(prizePool), \\\"PeriodicPrizeStrategy/unavailable-token\\\");\\n    for (uint256 i = 0; i < externalErc721TokenIds[_externalErc721].length; i++) {\\n      if (externalErc721TokenIds[_externalErc721][i] == _tokenId) {\\n        revert(\\\"PeriodicPrizeStrategy/erc721-duplicate\\\");\\n      }\\n    }\\n    externalErc721TokenIds[_externalErc721].push(_tokenId);\\n  }\\n\\n  /// @notice Removes an external ERC721 token as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can remove external tokens\\n  /// @param _externalErc721 The address of an ERC721 token to be removed\\n  /// @param _prevExternalErc721 The address of the previous ERC721 token in the list.\\n  /// If no previous, then pass the SENTINEL address: 0x0000000000000000000000000000000000000001\\n  function removeExternalErc721Award(\\n    IERC721Upgradeable _externalErc721,\\n    IERC721Upgradeable _prevExternalErc721\\n  )\\n    external\\n    onlyOwner\\n    requireAwardNotInProgress\\n  {\\n    externalErc721s.removeAddress(address(_prevExternalErc721), address(_externalErc721));\\n    _removeExternalErc721AwardTokens(_externalErc721);\\n  }\\n\\n  function _removeExternalErc721AwardTokens(\\n    IERC721Upgradeable _externalErc721\\n  )\\n    internal\\n  {\\n    delete externalErc721TokenIds[_externalErc721];\\n    emit ExternalErc721AwardRemoved(_externalErc721);\\n  }\\n\\n  function _requireAwardNotInProgress() internal view {\\n    uint256 currentBlock = _currentBlock();\\n    require(rngRequest.lockBlock == 0 || currentBlock < rngRequest.lockBlock, \\\"PeriodicPrizeStrategy/rng-in-flight\\\");\\n  }\\n\\n  function isRngTimedOut() public view returns (bool) {\\n    if (rngRequest.requestedAt == 0) {\\n      return false;\\n    } else {\\n      return _currentTime() > uint256(rngRequestTimeout).add(rngRequest.requestedAt);\\n    }\\n  }\\n\\n  modifier onlyOwnerOrListener() {\\n    require(_msgSender() == owner() ||\\n            _msgSender() == address(periodicPrizeStrategyListener) ||\\n            _msgSender() == address(beforeAwardListener),\\n            \\\"PeriodicPrizeStrategy/only-owner-or-listener\\\");\\n    _;\\n  }\\n\\n  modifier requireAwardNotInProgress() {\\n    _requireAwardNotInProgress();\\n    _;\\n  }\\n\\n  modifier requireCanStartAward() {\\n    require(_isPrizePeriodOver(), \\\"PeriodicPrizeStrategy/prize-period-not-over\\\");\\n    require(!isRngRequested(), \\\"PeriodicPrizeStrategy/rng-already-requested\\\");\\n    _;\\n  }\\n\\n  modifier requireCanCompleteAward() {\\n    require(isRngRequested(), \\\"PeriodicPrizeStrategy/rng-not-requested\\\");\\n    require(isRngCompleted(), \\\"PeriodicPrizeStrategy/rng-not-complete\\\");\\n    _;\\n  }\\n\\n  modifier onlyPrizePool() {\\n    require(_msgSender() == address(prizePool), \\\"PeriodicPrizeStrategy/only-prize-pool\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0xd7bf198ab616ed4b3e9c29d20477887d5a1e000e137e447da20bcec73b7cf997\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ninterface PeriodicPrizeStrategyListenerInterface is IERC165Upgradeable {\\n  function afterPrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x229624266562f60200b4e40ebc95a35a8aad799c0ff95a42df243af98a44d198\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary PeriodicPrizeStrategyListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('afterPrizePoolAwarded(uint256,uint256)')) == 0x575072c6\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER = 0x575072c6;\\n}\\n\",\"keccak256\":\"0xed291b9a33e265535032557f0a5430a150701c9eb58b0138c120eb02bc13b514\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PrizeSplit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\n\\n/**\\n  * @title Abstract prize split contract for adding unique award distribution to static addresses. \\n  * @author Kames Geraghty (PoolTogether Inc)\\n*/\\nabstract contract PrizeSplit is OwnableUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  \\n  PrizeSplitConfig[] internal _prizeSplits;\\n\\n  /**\\n    * @notice The prize split configuration struct.\\n    * @dev The prize split configuration struct used to award prize splits during distribution.\\n    * @param target Address of recipient receiving the prize split distribution\\n    * @param percentage Percentage of prize split using a 0-1000 range for single decimal precision i.e. 125 = 12.5%\\n    * @param token Position of controlled token in prizePool.tokens (i.e. ticket or sponsorship)\\n  */\\n  struct PrizeSplitConfig {\\n      address target;\\n      uint16 percentage;\\n      uint8 token;\\n  }\\n\\n  /**\\n    * @notice Emitted when a PrizeSplitConfig config is added or updated.\\n    * @dev Emitted when aPrizeSplitConfig config is added or updated in setPrizeSplits or setPrizeSplit.\\n    * @param target Address of prize split recipient\\n    * @param percentage Percentage of prize split. Must be between 0 and 1000 for single decimal precision\\n    * @param token Index (0 or 1) of token in the prizePool.tokens mapping\\n    * @param index Index of prize split in the prizeSplts array\\n  */\\n  event PrizeSplitSet(address indexed target, uint16 percentage, uint8 token, uint256 index);\\n\\n  /**\\n    * @notice Emitted when a PrizeSplitConfig config is removed.\\n    * @dev Emitted when a PrizeSplitConfig config is removed from the _prizeSplits array.\\n    * @param target Index of a previously active prize split config\\n  */\\n  event PrizeSplitRemoved(uint256 indexed target);\\n\\n  /**\\n    * @notice Mints ticket or sponsorship tokens to prize split recipient.\\n    * @dev Mints ticket or sponsorship tokens to prize split recipient via the linked PrizePool contract.\\n    * @param target Recipient of minted tokens\\n    * @param amount Amount of minted tokens\\n    * @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\\n  */\\n  function _awardPrizeSplitAmount(address target, uint256 amount, uint8 tokenIndex) virtual internal;\\n\\n  /**\\n    * @notice Read all prize splits configs.\\n    * @dev Read all PrizeSplitConfig structs stored in _prizeSplits.\\n    * @return _prizeSplits Array of PrizeSplitConfig structs\\n  */\\n  function prizeSplits() external view returns (PrizeSplitConfig[] memory) {\\n    return _prizeSplits;\\n  }\\n\\n  /**\\n    * @notice Read prize split config from active PrizeSplits.\\n    * @dev Read PrizeSplitConfig struct from _prizeSplits array.\\n    * @param prizeSplitIndex Index position of PrizeSplitConfig\\n    * @return PrizeSplitConfig Single prize split config\\n  */\\n  function prizeSplit(uint256 prizeSplitIndex) external view returns (PrizeSplitConfig memory) {\\n    return _prizeSplits[prizeSplitIndex];\\n  }\\n\\n  /**\\n    * @notice Set and remove prize split(s) configs.\\n    * @dev Set and remove prize split configs by passing a new PrizeSplitConfig structs array. Will remove existing PrizeSplitConfig(s) if passed array length is less than existing _prizeSplits length.\\n    * @param newPrizeSplits Array of PrizeSplitConfig structs\\n  */\\n  function setPrizeSplits(PrizeSplitConfig[] calldata newPrizeSplits) external onlyOwner {\\n    uint256 newPrizeSplitsLength = newPrizeSplits.length;\\n\\n    // Add and/or update prize split configs using newPrizeSplits PrizeSplitConfig structs array.\\n    for (uint256 index = 0; index < newPrizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = newPrizeSplits[index];\\n      require(split.token <= 1, \\\"MultipleWinners/invalid-prizesplit-token\\\");\\n      require(split.target != address(0), \\\"MultipleWinners/invalid-prizesplit-target\\\");\\n      \\n      if (_prizeSplits.length <= index) {\\n        _prizeSplits.push(split);\\n      } else {\\n        PrizeSplitConfig memory currentSplit = _prizeSplits[index];\\n        if (split.target != currentSplit.target || split.percentage != currentSplit.percentage || split.token != currentSplit.token) {\\n          _prizeSplits[index] = split;\\n        } else {\\n          continue;\\n        }\\n      }\\n\\n      // Emit the added/updated prize split config.\\n      emit PrizeSplitSet(split.target, split.percentage, split.token, index);\\n    }\\n\\n    // Remove old prize splits configs. Match storage _prizesSplits.length with the passed newPrizeSplits.length\\n    while (_prizeSplits.length > newPrizeSplitsLength) {\\n      uint256 _index = _prizeSplits.length.sub(1);\\n      _prizeSplits.pop();\\n      emit PrizeSplitRemoved(_index);\\n    }\\n\\n    // Total prize split do not exceed 100%\\n    uint256 totalPercentage = _totalPrizeSplitPercentageAmount();\\n    require(totalPercentage <= 1000, \\\"MultipleWinners/invalid-prizesplit-percentage-total\\\");\\n  }\\n\\n  /**\\n    * @notice Updates a previously set prize split config.\\n    * @dev Updates a prize split config by passing a new PrizeSplitConfig struct and current index position. Limited to contract owner.\\n    * @param prizeStrategySplit PrizeSplitConfig config struct\\n    * @param prizeSplitIndex Index position of PrizeSplitConfig to update\\n  */\\n  function setPrizeSplit(PrizeSplitConfig memory prizeStrategySplit, uint8 prizeSplitIndex) external onlyOwner {\\n    require(prizeSplitIndex < _prizeSplits.length, \\\"MultipleWinners/nonexistent-prizesplit\\\");\\n    require(prizeStrategySplit.token <= 1, \\\"MultipleWinners/invalid-prizesplit-token\\\");\\n    require(prizeStrategySplit.target != address(0), \\\"MultipleWinners/invalid-prizesplit-target\\\");\\n    \\n    // Update the prize split config\\n    _prizeSplits[prizeSplitIndex] = prizeStrategySplit;\\n\\n    // Total prize split do not exceed 100%\\n    uint256 totalPercentage = _totalPrizeSplitPercentageAmount();\\n    require(totalPercentage <= 1000, \\\"MultipleWinners/invalid-prizesplit-percentage-total\\\");\\n\\n    // Emit updated prize split config\\n    emit PrizeSplitSet(prizeStrategySplit.target, prizeStrategySplit.percentage, prizeStrategySplit.token, prizeSplitIndex);\\n  }\\n\\n  /**\\n  * @notice Calculate single prize split distribution amount.\\n  * @dev Calculate single prize split distribution amount using the total prize amount and prize split percentage.\\n  * @param amount Total prize award distribution amount\\n  * @param percentage Percentage with single decimal precision using 0-1000 ranges\\n  */\\n  function _getPrizeSplitAmount(uint256 amount, uint16 percentage) internal pure returns (uint256) {\\n    return (amount * percentage).div(1000);\\n  }\\n\\n  /**\\n  * @notice Calculates total prize split percentage amount.\\n  * @dev Calculates total PrizeSplitConfig percentage(s) amount. Used to check the total does not exceed 100% of award distribution.\\n  * @return Total prize split(s) percentage amount\\n  */\\n  function _totalPrizeSplitPercentageAmount() internal view returns (uint256) {\\n    uint256 _tempTotalPercentage;\\n    uint256 prizeSplitsLength = _prizeSplits.length;\\n    for (uint8 index = 0; index < prizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = _prizeSplits[index];\\n      _tempTotalPercentage = _tempTotalPercentage.add(split.percentage);\\n    }\\n    return _tempTotalPercentage;\\n  }\\n\\n  /**\\n  * @notice Distributes prize split(s).\\n  * @dev Distributes prize split(s) by awarding ticket or sponsorship tokens.\\n  * @param prize Starting prize award amount\\n  * @return Total prize award distribution amount exlcuding the awarded prize split(s)\\n  */\\n  function _distributePrizeSplits(uint256 prize) internal returns (uint256) {\\n    // Store temporary total prize amount for multiple calculations using initial prize amount.\\n    uint256 _prizeTemp = prize;\\n    uint256 prizeSplitsLength = _prizeSplits.length;\\n    for (uint256 index = 0; index < prizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = _prizeSplits[index];\\n      uint256 _splitAmount = _getPrizeSplitAmount(_prizeTemp, split.percentage);\\n\\n      // Award the prize split distribution amount.\\n      _awardPrizeSplitAmount(split.target, _splitAmount, split.token);\\n\\n      // Update the remaining prize amount after distributing the prize split percentage.\\n      prize = prize.sub(_splitAmount);\\n    }\\n\\n    return prize;\\n  }\\n\\n}\",\"keccak256\":\"0xc736c25922cf9065c73a06108d4d05c18af9a9e393c5280ba5d4cdb1863f3dbd\",\"license\":\"MIT\"},\"contracts/prize-strategy/multiple-winners/MultipleWinners.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"../PrizeSplit.sol\\\";\\nimport \\\"../PeriodicPrizeStrategy.sol\\\";\\n\\ncontract MultipleWinners is PeriodicPrizeStrategy, PrizeSplit {\\n\\n  // Maximum number number of winners per award distribution period\\n  uint256 internal __numberOfWinners;\\n  \\n  // Toggle for distributing external ERC 20 awards to all winners\\n  bool public splitExternalErc20Awards;\\n\\n  // Mapping of addresses isBlocked status. Can prevent an address from selected during award distribution\\n  mapping(address => bool) public isBlocklisted;\\n\\n  // Carry over the awarded prize for the next drawing when selected winners is less than __numberOfWinners\\n  bool public carryOverBlocklist;\\n\\n  // Limit ticket.draw() retry attempts when a blocked address is selected in _distribute.\\n  uint256 public blocklistRetryCount;\\n\\n  /**\\n    * @notice Emitted when splitExternalErc20Awards is toggled.\\n    * @dev Emitted when splitExternalErc20Awards is toggled between awarding external ERC20 to main or all winners.\\n  */\\n  event SplitExternalErc20AwardsSet(bool splitExternalErc20Awards);\\n\\n  /**\\n    * @notice Emitted when numberOfWinners is set.\\n    * @dev Emitted when numberOfWinners is set, which limits the maximum number of potentially selected winners.\\n    * @param numberOfWinners Maximum potentially selected winners\\n  */\\n  event NumberOfWinnersSet(uint256 numberOfWinners);\\n\\n  /**\\n    * @notice Emitted when carryOverBlocklist is toggled.\\n    * @dev Emitted when carryOverBlocklist is toggled for distribution of the primary and secondary prizes.\\n    * @param carry Awarded prize carry over status\\n  */\\n  event BlocklistCarrySet(bool carry);\\n\\n  /**\\n    * @notice Emitted when a user is blocked/unblocked from receiving a prize award.\\n    * @dev Emitted when a contract owner blocks/unblocks user from award selection in _distribute.\\n    * @param user Address of user to block or unblock\\n    * @param isBlocked User blocked status\\n  */\\n  event BlocklistSet(address indexed user, bool isBlocked);\\n\\n  /**\\n    * @notice Emitted when a new draw retry limit is set.\\n    * @dev Emitted when a new draw retry limit is set. Retry limit is set to limit gas spendings if a blocked user continues to be drawn.\\n    * @param count Number of winner selection retry attempts \\n  */\\n  event BlocklistRetryCountSet(uint256 count);\\n\\n  /**\\n    * @notice Emitted when the winner selection retry limit is reached during award distribution.\\n    * @dev Emitted when the maximum number of users has not been selected after the blocklistRetryCount is reached.\\n    * @param numberOfWinners Total number of winners selected before the blocklistRetryCount is reached.\\n  */\\n  event RetryMaxLimitReached(uint256 numberOfWinners);\\n\\n  /**\\n    * @notice Emitted when no winner can be selected during the prize distribution. \\n    * @dev Emitted when no winner can be selected in _distribute due to ticket.totalSupply() equaling zero.\\n  */\\n  event NoWinners();\\n\\n  function initializeMultipleWinners (\\n    uint256 _prizePeriodStart,\\n    uint256 _prizePeriodSeconds,\\n    PrizePool _prizePool,\\n    TicketInterface _ticket,\\n    IERC20Upgradeable _sponsorship,\\n    RNGInterface _rng,\\n    uint256 _numberOfWinners\\n  ) public initializer {\\n    IERC20Upgradeable[] memory _externalErc20Awards;\\n\\n    PeriodicPrizeStrategy.initialize(\\n      _prizePeriodStart,\\n      _prizePeriodSeconds,\\n      _prizePool,\\n      _ticket,\\n      _sponsorship,\\n      _rng,\\n      _externalErc20Awards\\n    );\\n\\n    _setNumberOfWinners(_numberOfWinners);\\n  }\\n\\n  /**\\n    * @notice Block/unblock a user from winning during prize distribution.\\n    * @dev Block/unblock a user from winning award in prize distribution by updating the isBlocklisted mapping.\\n    * @param _user Address of blocked user\\n    * @param _isBlocked Blocked Status (true or false) of user\\n  */\\n  function setBlocklisted(address _user, bool _isBlocked) external onlyOwner requireAwardNotInProgress returns (bool) {\\n    isBlocklisted[_user] = _isBlocked;\\n\\n    emit BlocklistSet(_user, _isBlocked);\\n\\n    return true;\\n  }\\n\\n  /**\\n    * @notice Toggle if an unawarded prize amount should be kept for the next draw or evenly distrubted to selected winners. \\n    * @dev Toggles if the main prize (prizePool.captureAwardBalance) and secondary prizes (LootBox) should be kept for the next draw or evenly distrubted if maximum number of winners is not selected. \\n    * @param _carry Award carry over status (true or false)\\n  */\\n  function setCarryBlocklist(bool _carry) external onlyOwner requireAwardNotInProgress returns (bool) {\\n    carryOverBlocklist = _carry;\\n\\n    emit BlocklistCarrySet(_carry);\\n\\n    return true;\\n  }\\n\\n  /**\\n    * @notice Sets the number of attempts for winner selection if a blocked address is chosen.\\n    * @dev Limits winner selection (ticket.draw) retries to avoid to gas limit reached errors. Increases the probability of not reaching the maximum number of winners if to low.\\n    * @param _count Number of retry attempts\\n  */\\n  function setBlocklistRetryCount(uint256 _count) external onlyOwner requireAwardNotInProgress returns (bool) {\\n    blocklistRetryCount = _count;\\n\\n    emit BlocklistRetryCountSet(_count);\\n\\n    return true;\\n  }\\n  \\n  /**\\n    * @notice Toggle external ERC20 awards for all prize winners.\\n    * @dev Toggle external ERC20 awards for all prize winners. If unset will distribute external ERC20 awards to main winner.\\n    * @param _splitExternalErc20Awards Toggle splitting external ERC20 awards.\\n  */\\n  function setSplitExternalErc20Awards(bool _splitExternalErc20Awards) external onlyOwner requireAwardNotInProgress {\\n    splitExternalErc20Awards = _splitExternalErc20Awards;\\n\\n    emit SplitExternalErc20AwardsSet(splitExternalErc20Awards);\\n  }\\n\\n  /**\\n    * @notice Sets maximum number of winners.\\n    * @dev Sets maximum number of winners per award distribution period.\\n    * @param count Number of winners.\\n  */\\n  function setNumberOfWinners(uint256 count) external onlyOwner requireAwardNotInProgress {\\n    _setNumberOfWinners(count);\\n  }\\n\\n   /**\\n    * @dev Set the maximum number of winners. Must be greater than 0.\\n    * @param count Number of winners.\\n  */\\n  function _setNumberOfWinners(uint256 count) internal {\\n    require(count > 0, \\\"MultipleWinners/winners-gte-one\\\");\\n\\n    __numberOfWinners = count;\\n    emit NumberOfWinnersSet(count);\\n  }\\n\\n  /**\\n    * @notice Maximum number of winners per award distribution period\\n    * @dev Read maximum number of winners per award distribution period from internal __numberOfWinners variable.\\n    * @return __numberOfWinners The total number of winners per prize award.\\n  */\\n  function numberOfWinners() external view returns (uint256) {\\n    return __numberOfWinners;\\n  }\\n\\n  /**\\n    * @notice Award ticket or sponsorship tokens to prize split recipient.\\n    * @dev Award ticket or sponsorship tokens to prize split recipient via the linked PrizePool contract.\\n    * @param target Recipient of minted tokens\\n    * @param amount Amount of minted tokens\\n    * @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\\n  */\\n  function _awardPrizeSplitAmount(address target, uint256 amount, uint8 tokenIndex) override internal {\\n    _awardToken(target, amount, tokenIndex);\\n  }\\n\\n  /**\\n    * @notice Distributes captured award balance to winners\\n    * @dev Distributes the captured award balance to the main winner and secondary winners if __numberOfWinners greater than 1.\\n    * @param randomNumber Random number seed used to select winners\\n  */\\n  function _distribute(uint256 randomNumber) internal override {\\n    uint256 prize = prizePool.captureAwardBalance();\\n    \\n    // distributes prize to prize splits and returns remaining award.\\n    prize = _distributePrizeSplits(prize);\\n\\n    if (IERC20Upgradeable(address(ticket)).totalSupply() == 0) {\\n      emit NoWinners();\\n      return;\\n    }\\n\\n    bool _carryOverBlocklistPrizes = carryOverBlocklist;\\n\\n    // main winner is simply the first that is drawn\\n    uint256 numberOfWinners = __numberOfWinners;\\n    address[] memory winners = new address[](numberOfWinners);\\n    uint256 nextRandom = randomNumber;\\n    uint256 winnerCount = 0;\\n    uint256 retries = 0;\\n    uint256 _retryCount = blocklistRetryCount;\\n    while (winnerCount < numberOfWinners) {\\n      address winner = ticket.draw(nextRandom);\\n\\n      if (!isBlocklisted[winner]) {\\n        winners[winnerCount++] = winner;\\n      } else if (++retries >= _retryCount) {\\n        emit RetryMaxLimitReached(winnerCount);\\n        if(winnerCount == 0) {\\n          emit NoWinners();\\n        }\\n        break;\\n      }\\n\\n      // add some arbitrary numbers to the previous random number to ensure no matches with the UniformRandomNumber lib\\n      bytes32 nextRandomHash = keccak256(abi.encodePacked(nextRandom + 499 + winnerCount*521));\\n      nextRandom = uint256(nextRandomHash);\\n    }\\n\\n    // main winner gets all external ERC721 tokens\\n    _awardExternalErc721s(winners[0]);\\n\\n    // yield prize is split up among all winners\\n    uint256 prizeShare = _carryOverBlocklistPrizes ? prize.div(numberOfWinners) : prize.div(winnerCount);\\n    if (prizeShare > 0) {\\n      for (uint i = 0; i < winnerCount; i++) {\\n        _awardTickets(winners[i], prizeShare);\\n      }\\n    }\\n\\n    if (splitExternalErc20Awards) {\\n      address currentToken = externalErc20s.start();\\n      while (currentToken != address(0) && currentToken != externalErc20s.end()) {\\n        uint256 balance = IERC20Upgradeable(currentToken).balanceOf(address(prizePool));\\n        uint256 split = _carryOverBlocklistPrizes ? balance.div(numberOfWinners) : balance.div(winnerCount);\\n        if (split > 0) {\\n          for (uint256 i = 0; i < winnerCount; i++) {\\n            prizePool.awardExternalERC20(winners[i], currentToken, split);\\n          }\\n        }\\n        currentToken = externalErc20s.next(currentToken);\\n      }\\n    } else {\\n      _awardExternalErc20s(winners[0]);\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0x26fbb59d9251cd6d66a423abaea29d5ea182e539365767ebfed726fe6248a29a\",\"license\":\"MIT\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TicketInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface TicketInterface {\\n  /// @notice Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\\n  /// @param randomNumber The random number to use to select a user.\\n  /// @return The winner\\n  function draw(uint256 randomNumber) external view returns (address);\\n}\",\"keccak256\":\"0x5201a9a22748781592abd2003801289224d4899292195b7de937cd5748be87dd\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListener.sol\":{\"content\":\"pragma solidity ^0.6.4;\\n\\nimport \\\"./TokenListenerInterface.sol\\\";\\nimport \\\"./TokenListenerLibrary.sol\\\";\\nimport \\\"../Constants.sol\\\";\\n\\nabstract contract TokenListener is TokenListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER\\n    );\\n  }\\n}\\n\",\"keccak256\":\"0xb0e98d10b004602e1d4f4369a70e6382002dc0c0c5713698eb6a92943aef2265\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 10,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "_owner",
                "offset": 0,
                "slot": "51",
                "type": "t_address"
              },
              {
                "astId": 129,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "__gap",
                "offset": 0,
                "slot": "52",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 9738,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "tokenListener",
                "offset": 0,
                "slot": "101",
                "type": "t_contract(TokenListenerInterface)16265"
              },
              {
                "astId": 9740,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "prizePool",
                "offset": 0,
                "slot": "102",
                "type": "t_contract(PrizePool)8751"
              },
              {
                "astId": 9742,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "ticket",
                "offset": 0,
                "slot": "103",
                "type": "t_contract(TicketInterface)16152"
              },
              {
                "astId": 9744,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "sponsorship",
                "offset": 0,
                "slot": "104",
                "type": "t_contract(IERC20Upgradeable)1960"
              },
              {
                "astId": 9746,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "rng",
                "offset": 0,
                "slot": "105",
                "type": "t_contract(RNGInterface)5531"
              },
              {
                "astId": 9748,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "rngRequest",
                "offset": 0,
                "slot": "106",
                "type": "t_struct(RngRequest)9732_storage"
              },
              {
                "astId": 9751,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "rngRequestTimeout",
                "offset": 0,
                "slot": "107",
                "type": "t_uint32"
              },
              {
                "astId": 9753,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "prizePeriodSeconds",
                "offset": 0,
                "slot": "108",
                "type": "t_uint256"
              },
              {
                "astId": 9755,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "prizePeriodStartedAt",
                "offset": 0,
                "slot": "109",
                "type": "t_uint256"
              },
              {
                "astId": 9757,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "externalErc20s",
                "offset": 0,
                "slot": "110",
                "type": "t_struct(Mapping)16337_storage"
              },
              {
                "astId": 9759,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "externalErc721s",
                "offset": 0,
                "slot": "112",
                "type": "t_struct(Mapping)16337_storage"
              },
              {
                "astId": 9764,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "externalErc721TokenIds",
                "offset": 0,
                "slot": "114",
                "type": "t_mapping(t_contract(IERC721Upgradeable)3338,t_array(t_uint256)dyn_storage)"
              },
              {
                "astId": 9767,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "beforeAwardListener",
                "offset": 0,
                "slot": "115",
                "type": "t_contract(BeforeAwardListenerInterface)9575"
              },
              {
                "astId": 9770,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "periodicPrizeStrategyListener",
                "offset": 0,
                "slot": "116",
                "type": "t_contract(PeriodicPrizeStrategyListenerInterface)11432"
              },
              {
                "astId": 11452,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "_prizeSplits",
                "offset": 0,
                "slot": "117",
                "type": "t_array(t_struct(PrizeSplitConfig)11459_storage)dyn_storage"
              },
              {
                "astId": 11852,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "__numberOfWinners",
                "offset": 0,
                "slot": "118",
                "type": "t_uint256"
              },
              {
                "astId": 11854,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "splitExternalErc20Awards",
                "offset": 0,
                "slot": "119",
                "type": "t_bool"
              },
              {
                "astId": 11858,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "isBlocklisted",
                "offset": 0,
                "slot": "120",
                "type": "t_mapping(t_address,t_bool)"
              },
              {
                "astId": 11860,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "carryOverBlocklist",
                "offset": 0,
                "slot": "121",
                "type": "t_bool"
              },
              {
                "astId": 11862,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                "label": "blocklistRetryCount",
                "offset": 0,
                "slot": "122",
                "type": "t_uint256"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_struct(PrizeSplitConfig)11459_storage)dyn_storage": {
                "base": "t_struct(PrizeSplitConfig)11459_storage",
                "encoding": "dynamic_array",
                "label": "struct PrizeSplit.PrizeSplitConfig[]",
                "numberOfBytes": "32"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_array(t_uint256)dyn_storage": {
                "base": "t_uint256",
                "encoding": "dynamic_array",
                "label": "uint256[]",
                "numberOfBytes": "32"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_contract(BeforeAwardListenerInterface)9575": {
                "encoding": "inplace",
                "label": "contract BeforeAwardListenerInterface",
                "numberOfBytes": "20"
              },
              "t_contract(IERC20Upgradeable)1960": {
                "encoding": "inplace",
                "label": "contract IERC20Upgradeable",
                "numberOfBytes": "20"
              },
              "t_contract(IERC721Upgradeable)3338": {
                "encoding": "inplace",
                "label": "contract IERC721Upgradeable",
                "numberOfBytes": "20"
              },
              "t_contract(PeriodicPrizeStrategyListenerInterface)11432": {
                "encoding": "inplace",
                "label": "contract PeriodicPrizeStrategyListenerInterface",
                "numberOfBytes": "20"
              },
              "t_contract(PrizePool)8751": {
                "encoding": "inplace",
                "label": "contract PrizePool",
                "numberOfBytes": "20"
              },
              "t_contract(RNGInterface)5531": {
                "encoding": "inplace",
                "label": "contract RNGInterface",
                "numberOfBytes": "20"
              },
              "t_contract(TicketInterface)16152": {
                "encoding": "inplace",
                "label": "contract TicketInterface",
                "numberOfBytes": "20"
              },
              "t_contract(TokenListenerInterface)16265": {
                "encoding": "inplace",
                "label": "contract TokenListenerInterface",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_address)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => address)",
                "numberOfBytes": "32",
                "value": "t_address"
              },
              "t_mapping(t_address,t_bool)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => bool)",
                "numberOfBytes": "32",
                "value": "t_bool"
              },
              "t_mapping(t_contract(IERC721Upgradeable)3338,t_array(t_uint256)dyn_storage)": {
                "encoding": "mapping",
                "key": "t_contract(IERC721Upgradeable)3338",
                "label": "mapping(contract IERC721Upgradeable => uint256[])",
                "numberOfBytes": "32",
                "value": "t_array(t_uint256)dyn_storage"
              },
              "t_struct(Mapping)16337_storage": {
                "encoding": "inplace",
                "label": "struct MappedSinglyLinkedList.Mapping",
                "members": [
                  {
                    "astId": 16332,
                    "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                    "label": "count",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint256"
                  },
                  {
                    "astId": 16336,
                    "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                    "label": "addressMap",
                    "offset": 0,
                    "slot": "1",
                    "type": "t_mapping(t_address,t_address)"
                  }
                ],
                "numberOfBytes": "64"
              },
              "t_struct(PrizeSplitConfig)11459_storage": {
                "encoding": "inplace",
                "label": "struct PrizeSplit.PrizeSplitConfig",
                "members": [
                  {
                    "astId": 11454,
                    "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                    "label": "target",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_address"
                  },
                  {
                    "astId": 11456,
                    "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                    "label": "percentage",
                    "offset": 20,
                    "slot": "0",
                    "type": "t_uint16"
                  },
                  {
                    "astId": 11458,
                    "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                    "label": "token",
                    "offset": 22,
                    "slot": "0",
                    "type": "t_uint8"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_struct(RngRequest)9732_storage": {
                "encoding": "inplace",
                "label": "struct PeriodicPrizeStrategy.RngRequest",
                "members": [
                  {
                    "astId": 9727,
                    "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                    "label": "id",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint32"
                  },
                  {
                    "astId": 9729,
                    "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                    "label": "lockBlock",
                    "offset": 4,
                    "slot": "0",
                    "type": "t_uint32"
                  },
                  {
                    "astId": 9731,
                    "contract": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:MultipleWinners",
                    "label": "requestedAt",
                    "offset": 8,
                    "slot": "0",
                    "type": "t_uint32"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_uint16": {
                "encoding": "inplace",
                "label": "uint16",
                "numberOfBytes": "2"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint32": {
                "encoding": "inplace",
                "label": "uint32",
                "numberOfBytes": "4"
              },
              "t_uint8": {
                "encoding": "inplace",
                "label": "uint8",
                "numberOfBytes": "1"
              }
            }
          },
          "userdoc": {
            "events": {
              "BlocklistCarrySet(bool)": {
                "notice": "Emitted when carryOverBlocklist is toggled."
              },
              "BlocklistRetryCountSet(uint256)": {
                "notice": "Emitted when a new draw retry limit is set."
              },
              "BlocklistSet(address,bool)": {
                "notice": "Emitted when a user is blocked/unblocked from receiving a prize award."
              },
              "NoWinners()": {
                "notice": "Emitted when no winner can be selected during the prize distribution. "
              },
              "NumberOfWinnersSet(uint256)": {
                "notice": "Emitted when numberOfWinners is set."
              },
              "PrizeSplitRemoved(uint256)": {
                "notice": "Emitted when a PrizeSplitConfig config is removed."
              },
              "PrizeSplitSet(address,uint16,uint8,uint256)": {
                "notice": "Emitted when a PrizeSplitConfig config is added or updated."
              },
              "RetryMaxLimitReached(uint256)": {
                "notice": "Emitted when the winner selection retry limit is reached during award distribution."
              },
              "SplitExternalErc20AwardsSet(bool)": {
                "notice": "Emitted when splitExternalErc20Awards is toggled."
              }
            },
            "kind": "user",
            "methods": {
              "VERSION()": {
                "notice": "Semver Version"
              },
              "addExternalErc20Award(address)": {
                "notice": "Adds an external ERC20 token type as an additional prize that can be awarded"
              },
              "addExternalErc721Award(address,uint256[])": {
                "notice": "Adds an external ERC721 token as an additional prize that can be awarded"
              },
              "beforeAwardListener()": {
                "notice": "A listener that is called before the prize is awarded"
              },
              "beforeTokenMint(address,uint256,address,address)": {
                "notice": "Called by the PrizePool when minting controlled tokens"
              },
              "beforeTokenTransfer(address,address,uint256,address)": {
                "notice": "Called by the PrizePool for transfers of controlled tokens"
              },
              "calculateNextPrizePeriodStartTime(uint256)": {
                "notice": "Calculates when the next prize period will start"
              },
              "canCompleteAward()": {
                "notice": "Returns whether an award process can be completed"
              },
              "canStartAward()": {
                "notice": "Returns whether an award process can be started"
              },
              "cancelAward()": {
                "notice": "Can be called by anyone to unlock the tickets if the RNG has timed out."
              },
              "completeAward()": {
                "notice": "Completes the award process and awards the winners.  The random number must have been requested and is now available."
              },
              "currentPrize()": {
                "notice": "Calculates and returns the currently accrued prize"
              },
              "estimateRemainingBlocksToPrize(uint256)": {
                "notice": "Estimates the remaining blocks until the prize given a number of seconds per block"
              },
              "getExternalErc20Awards()": {
                "notice": "Gets the current list of External ERC20 tokens that will be awarded with the current prize"
              },
              "getExternalErc721AwardTokenIds(address)": {
                "notice": "Gets the current list of External ERC721 tokens that will be awarded with the current prize"
              },
              "getExternalErc721Awards()": {
                "notice": "Gets the current list of External ERC721 tokens that will be awarded with the current prize"
              },
              "getLastRngLockBlock()": {
                "notice": "Returns the block number that the current RNG request has been locked to"
              },
              "getLastRngRequestId()": {
                "notice": "Returns the current RNG Request ID"
              },
              "initialize(uint256,uint256,address,address,address,address,address[])": {
                "notice": "Initializes a new strategy"
              },
              "isPrizePeriodOver()": {
                "notice": "Returns whether the prize period is over"
              },
              "isRngCompleted()": {
                "notice": "Returns whether the random number request has completed."
              },
              "isRngRequested()": {
                "notice": "Returns whether a random number has been requested"
              },
              "numberOfWinners()": {
                "notice": "Maximum number of winners per award distribution period"
              },
              "periodicPrizeStrategyListener()": {
                "notice": "A listener that is called after the prize is awarded"
              },
              "prizePeriodEndAt()": {
                "notice": "Returns the timestamp at which the prize period ends"
              },
              "prizePeriodRemainingSeconds()": {
                "notice": "Returns the number of seconds remaining until the prize can be awarded."
              },
              "prizeSplit(uint256)": {
                "notice": "Read prize split config from active PrizeSplits."
              },
              "prizeSplits()": {
                "notice": "Read all prize splits configs."
              },
              "removeExternalErc20Award(address,address)": {
                "notice": "Removes an external ERC20 token type as an additional prize that can be awarded"
              },
              "removeExternalErc721Award(address,address)": {
                "notice": "Removes an external ERC721 token as an additional prize that can be awarded"
              },
              "rngRequestTimeout()": {
                "notice": "RNG Request Timeout.  In fact, this is really a \"complete award\" timeout. If the rng completes the award can still be cancelled."
              },
              "setBeforeAwardListener(address)": {
                "notice": "Allows the owner to set a listener that is triggered immediately before the award is distributed"
              },
              "setBlocklistRetryCount(uint256)": {
                "notice": "Sets the number of attempts for winner selection if a blocked address is chosen."
              },
              "setBlocklisted(address,bool)": {
                "notice": "Block/unblock a user from winning during prize distribution."
              },
              "setCarryBlocklist(bool)": {
                "notice": "Toggle if an unawarded prize amount should be kept for the next draw or evenly distrubted to selected winners. "
              },
              "setNumberOfWinners(uint256)": {
                "notice": "Sets maximum number of winners."
              },
              "setPeriodicPrizeStrategyListener(address)": {
                "notice": "Allows the owner to set a listener for prize strategy callbacks."
              },
              "setPrizePeriodSeconds(uint256)": {
                "notice": "Allows the owner to set the prize period in seconds."
              },
              "setPrizeSplit((address,uint16,uint8),uint8)": {
                "notice": "Updates a previously set prize split config."
              },
              "setPrizeSplits((address,uint16,uint8)[])": {
                "notice": "Set and remove prize split(s) configs."
              },
              "setRngRequestTimeout(uint32)": {
                "notice": "Allows the owner to set the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked."
              },
              "setRngService(address)": {
                "notice": "Sets the RNG service that the Prize Strategy is connected to"
              },
              "setSplitExternalErc20Awards(bool)": {
                "notice": "Toggle external ERC20 awards for all prize winners."
              },
              "setTokenListener(address)": {
                "notice": "Allows the owner to set the token listener"
              },
              "startAward()": {
                "notice": "Starts the award process by starting random number request.  The prize period must have ended."
              }
            },
            "version": 1
          }
        }
      },
      "contracts/prize-strategy/multiple-winners/MultipleWinnersProxyFactory.sol": {
        "MultipleWinnersProxyFactory": {
          "abi": [
            {
              "inputs": [],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "name": "ProxyCreated",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "create",
              "outputs": [
                {
                  "internalType": "contract MultipleWinners",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_logic",
                  "type": "address"
                },
                {
                  "internalType": "bytes",
                  "name": "_data",
                  "type": "bytes"
                }
              ],
              "name": "deployMinimal",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "instance",
              "outputs": [
                {
                  "internalType": "contract MultipleWinners",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "title": "Creates a minimal proxy to the MultipleWinners prize strategy.  Very cheap to deploy.",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5060405161001d9061005f565b604051809103906000f080158015610039573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b039290921691909117905561006c565b615b8b806103b283390190565b6103378061007b6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063022ec09514610046578063b3eeb5e21461006a578063efc81a8c14610120575b600080fd5b61004e610128565b604080516001600160a01b039092168252519081900360200190f35b61004e6004803603604081101561008057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100ab57600080fd5b8201836020820111156100bd57600080fd5b803590602001918460018302840111640100000000831117156100df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610137945050505050565b61004e6102b3565b6000546001600160a01b031681565b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a18251156102ac576000826001600160a01b0316846040518082805190602001908083835b602083106102035780518252601f1990920191602091820191016101e4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610265576040519150601f19603f3d011682016040523d82523d6000602084013e61026a565b606091505b50509050806102aa5760405162461bcd60e51b81526004018080602001828103825260248152602001806102de6024913960400191505060405180910390fd5b505b5092915050565b6000805460408051602081019091528281526102d8916001600160a01b031690610137565b90509056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a2646970667358221220502fb653b5e28d059579c4eb876de83d623b7114af0ca39e146bb36d9574328464736f6c634300060c0033608060405234801561001057600080fd5b50615b6a80620000216000396000f3fe608060405234801561001057600080fd5b50600436106103c55760003560e01c8063738bbea8116101ff578063b02446821161011a578063d5ad6bf6116100ad578063f2fde38b1161007c578063f2fde38b14610733578063f97700e214610746578063fbf0953e14610759578063ffa1ad741461076c576103c5565b8063d5ad6bf6146106fb578063d605787b14610703578063dfb2f13b1461070b578063eefc8ad114610713576103c5565b8063c2f19ee8116100e9578063c2f19ee8146106c5578063c42b42a0146106cd578063c48ddbcb146106d5578063c6853270146106e8576103c5565b8063b024468214610684578063b221095714610697578063b9ee1e05146106aa578063c25a9c32146106b2576103c5565b80638da5cb5b1161019257806395e5f9ee1161016157806395e5f9ee146106595780639dafafb014610661578063a4e075ca14610669578063acca5b951461067c576103c5565b80638da5cb5b146106165780638e204c431461061e57806394144c6b146106315780639417783f14610639576103c5565b8063884a4448116101ce578063884a4448146105d35780638aa3ec6f146105e65780638acfaca9146105f95780638d5f10c414610601576103c5565b8063738bbea81461059d5780637f2be9fc146105a55780637f4296d7146105b8578063876f5c7e146105cb576103c5565b80634e5d08e0116102ef5780636be51c4f116102825780636f46f221116102515780636f46f2211461057d578063715018a614610585578063719ce73e1461058d57806372f33ea914610595576103c5565b80636be51c4f146105525780636bea53441461055a5780636cc25db7146105625780636dfb03861461056a576103c5565b806362c77a61116102be57806362c77a611461051c5780636696822114610524578063671137c4146105375780636a74f1071461054a576103c5565b80634e5d08e0146104db578063500db70d146104ee57806352a30109146104f6578063605e25ac14610509576103c5565b80632c8fe73d1161036757806347bed9981161033657806347bed998146104a55780634aba4f6b146104b85780634c169f4f146104c05780634d7f3db0146104c8576103c5565b80632c8fe73d1461046057806330fcdf411461046857806338a9b4b61461047d57806342d0920914610490576103c5565b80630faf125f116103a35780630faf125f14610428578063111070e414610430578063152d308c146104385780632a7ad6091461044b576103c5565b806301b48e34146103ca57806301ffc9a7146103f35780630d847fc414610413575b600080fd5b6103dd6103d83660046148a5565b610781565b6040516103ea9190614ad7565b60405180910390f35b6104066104013660046147ae565b61079a565b6040516103ea9190614d2c565b61041b6107d0565b6040516103ea9190614ae0565b6103dd6107df565b6104066107e5565b61040661044636600461457c565b6107f4565b6104536108ab565b6040516103ea9190615a7b565b6103dd6108b7565b61047b6104763660046144f2565b6108c6565b005b61047b61048b366004614776565b61099e565b610498610a34565b6040516103ea9190614c2b565b6103dd6104b33660046148a5565b610a40565b610406610a4b565b61047b610ad4565b61047b6104d63660046145e1565b610b9e565b61047b6104e93660046144f2565b610c76565b61041b610d13565b6104066105043660046148a5565b610d22565b61047b6105173660046144f2565b610db0565b610498610e91565b61047b6105323660046146c6565b610e9d565b61047b6105453660046147d6565b610f6f565b610406610fcf565b61041b610fe8565b610453610ff7565b61041b61100b565b61047b6105783660046148a5565b61101a565b61040661106a565b61047b611073565b61041b6110fc565b6103dd61110b565b610406611111565b61047b6105b33660046149ce565b611164565b61047b6105c63660046144f2565b611208565b6104066112be565b61047b6105e13660046148a5565b6112dd565b61047b6105f43660046144f2565b61132d565b6103dd611405565b61060961140b565b6040516103ea9190614c78565b61041b611490565b61040661062c3660046144f2565b61149f565b6103dd6114b4565b61064c6106473660046144f2565b6114ba565b6040516103ea9190614cf4565b610406611526565b610406611530565b610406610677366004614776565b611539565b6104536115c0565b61047b6106923660046147d6565b6115cc565b61047b6106a536600461452a565b611657565b61047b611728565b61047b6106c0366004614706565b611970565b61041b611cff565b6103dd611d0e565b61047b6106e3366004614803565b611d8b565b61047b6106f6366004614a48565b611f80565b6103dd611fd0565b61041b611fda565b61047b611fe9565b6107266107213660046148a5565b61226b565b6040516103ea91906159a5565b61047b6107413660046144f2565b6122d0565b61047b6107543660046148d5565b612391565b61047b610767366004614871565b6125f2565b610774612791565b6040516103ea9190614d4c565b600061079461078e6127b2565b836127ef565b92915050565b60006001600160e01b031982166301ffc9a760e01b14806107945750506001600160e01b031916600162a1cb1960e01b03191490565b6073546001600160a01b031681565b607a5481565b606a5463ffffffff1615155b90565b60006107fe612818565b6001600160a01b031661080f611490565b6001600160a01b03161461083e5760405162461bcd60e51b815260040161083590615487565b60405180910390fd5b61084661281c565b6001600160a01b03831660008181526078602052604090819020805460ff1916851515179055517fd1ac9a365c0e3bfad562e0a809a5ded3842a2b489f839b3327e4e34ee0128f289061089a908590614d2c565b60405180910390a250600192915050565b606a5463ffffffff1690565b60006108c1612871565b905090565b6108ce612818565b6001600160a01b03166108df611490565b6001600160a01b0316146109055760405162461bcd60e51b815260040161083590615487565b61090d61281c565b6001600160a01b038116158061093857506109386001600160a01b03821663266fce1f60e11b61288a565b6109545760405162461bcd60e51b815260040161083590615535565b607380546001600160a01b0319166001600160a01b0383169081179091556040517fc4feff61630891ea2cb42a54fbe3ff2e65422f2ed17323ac6b65f4521112e87e90600090a250565b6109a6612818565b6001600160a01b03166109b7611490565b6001600160a01b0316146109dd5760405162461bcd60e51b815260040161083590615487565b6109e561281c565b6077805460ff191682151517908190556040517f6959d02e8fb6264d1d39bf37f1e725001f342714933cf38f8627a2442efc43fd91610a299160ff90911690614d2c565b60405180910390a150565b60606108c160706128ad565b60006107948261298d565b606954606a54604051630e866e6f60e21b81526000926001600160a01b031691633a19b9bc91610a849163ffffffff1690600401615a7b565b60206040518083038186803b158015610a9c57600080fd5b505afa158015610ab0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c19190614792565b610adc611111565b610af85760405162461bcd60e51b815260040161083590615885565b606a80546bffffffffffffffffffffffff19811690915560405163ffffffff80831692640100000000900416907fee6702c46c5618e6fc7e625c71f4c85df9c91d456cb16a3aea71ab83b1fee00590600090a160665460405163ffffffff8416916001600160a01b03169033907fd50026ee0824513af20cdf5e72d1fbfbe8fd646ee0576378e080326f1a695e5890610b92908690615a7b565b60405180910390a45050565b6066546001600160a01b0316610bb2612818565b6001600160a01b031614610bd85760405162461bcd60e51b81526004016108359061505f565b6067546001600160a01b0383811691161415610bf657610bf661281c565b6065546001600160a01b031615610c70576065546040516304d7f3db60e41b81526001600160a01b0390911690634d7f3db090610c3d908790879087908790600401614c00565b600060405180830381600087803b158015610c5757600080fd5b505af1158015610c6b573d6000803e3d6000fd5b505050505b50505050565b610c7e611490565b6001600160a01b0316610c8f612818565b6001600160a01b03161480610cbe57506074546001600160a01b0316610cb3612818565b6001600160a01b0316145b80610ce357506073546001600160a01b0316610cd8612818565b6001600160a01b0316145b610cff5760405162461bcd60e51b815260040161083590614ef6565b610d0761281c565b610d10816129d4565b50565b6068546001600160a01b031681565b6000610d2c612818565b6001600160a01b0316610d3d611490565b6001600160a01b031614610d635760405162461bcd60e51b815260040161083590615487565b610d6b61281c565b607a8290556040517f63e4e34f49d12428c03e04e61340c7167e36eb0ff6f0b1970c7544026179403990610da0908490614ad7565b60405180910390a1506001919050565b610db8612818565b6001600160a01b0316610dc9611490565b6001600160a01b031614610def5760405162461bcd60e51b815260040161083590615487565b610df761281c565b6001600160a01b0381161580610e255750610e256001600160a01b038216600162a1cb1960e01b031961288a565b610e415760405162461bcd60e51b815260040161083590614dc3565b606580546001600160a01b0319166001600160a01b0383811691909117918290556040519116907f9fc437aa70ad4ee5f33f6772bf338eed41e21b95435820817ab8b4df161ce4dd90600090a250565b60606108c1606e6128ad565b610ea5611490565b6001600160a01b0316610eb6612818565b6001600160a01b03161480610ee557506074546001600160a01b0316610eda612818565b6001600160a01b0316145b80610f0a57506073546001600160a01b0316610eff612818565b6001600160a01b0316145b610f265760405162461bcd60e51b815260040161083590614ef6565b610f2e61281c565b60005b81811015610f6a57610f62838383818110610f4857fe5b9050602002016020810190610f5d91906144f2565b6129d4565b600101610f31565b505050565b610f77612818565b6001600160a01b0316610f88611490565b6001600160a01b031614610fae5760405162461bcd60e51b815260040161083590615487565b610fb661281c565b610fc260708284612b88565b610fcb82612c52565b5050565b6000610fd96107e5565b80156108c157506108c1610a4b565b6065546001600160a01b031681565b606a54640100000000900463ffffffff1690565b6067546001600160a01b031681565b611022612818565b6001600160a01b0316611033611490565b6001600160a01b0316146110595760405162461bcd60e51b815260040161083590615487565b61106161281c565b610d1081612caa565b60795460ff1681565b61107b612818565b6001600160a01b031661108c611490565b6001600160a01b0316146110b25760405162461bcd60e51b815260040161083590615487565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6066546001600160a01b031681565b606d5481565b606a54600090600160401b900463ffffffff16611130575060006107f1565b606a54606b546111549163ffffffff91821691600160401b909104811690612cff16565b61115c612d24565b1190506107f1565b600054610100900460ff168061117d575061117d612d28565b8061118b575060005460ff16155b6111a75760405162461bcd60e51b8152600401610835906152fb565b600054610100900460ff161580156111d2576000805460ff1961ff0019909116610100171660011790555b60606111e389898989898987612391565b6111ec83612caa565b508015610c6b576000805461ff00191690555050505050505050565b611210612818565b6001600160a01b0316611221611490565b6001600160a01b0316146112475760405162461bcd60e51b815260040161083590615487565b61124f61281c565b6112576107e5565b156112745760405162461bcd60e51b815260040161083590615842565b606980546001600160a01b0319166001600160a01b0383169081179091556040517ff935763cc7c57ee8ed6318ed71e756cca0731294c9f46ff5b386f36d6ff1417a90600090a250565b60006112c8612d33565b80156108c157506112d76107e5565b15905090565b6112e5612818565b6001600160a01b03166112f6611490565b6001600160a01b03161461131c5760405162461bcd60e51b815260040161083590615487565b61132461281c565b610d1081612d4c565b611335612818565b6001600160a01b0316611346611490565b6001600160a01b03161461136c5760405162461bcd60e51b815260040161083590615487565b61137461281c565b6001600160a01b038116158061139f575061139f6001600160a01b038216632ba8396360e11b61288a565b6113bb5760405162461bcd60e51b815260040161083590615753565b607480546001600160a01b0319166001600160a01b0383169081179091556040517fda05d50a3a1ec0ffab059f1d457ae59f68ccfb3ffbb4dad283c516f9103d584b90600090a250565b60765490565b60606075805480602002602001604051908101604052809291908181526020016000905b8282101561148757600084815260209081902060408051606081018252918501546001600160a01b0381168352600160a01b810461ffff1683850152600160b01b900460ff169082015282526001909201910161142f565b50505050905090565b6033546001600160a01b031690565b60786020526000908152604090205460ff1681565b606c5481565b6001600160a01b03811660009081526072602090815260409182902080548351818402810184019094528084526060939283018282801561151a57602002820191906000526020600020905b815481526020019060010190808311611506575b50505050509050919050565b60006108c1612d33565b60775460ff1681565b6000611543612818565b6001600160a01b0316611554611490565b6001600160a01b03161461157a5760405162461bcd60e51b815260040161083590615487565b61158261281c565b6079805460ff19168315151790556040517f2b4b6ffe286f7ce4ccc6b136bb14987b0a00092174d88938a0c667a104a4a73190610da0908490614d2c565b606b5463ffffffff1681565b6115d4612818565b6001600160a01b03166115e5611490565b6001600160a01b03161461160b5760405162461bcd60e51b815260040161083590615487565b61161361281c565b61161f606e8284612b88565b6040516001600160a01b038316907f58982464497acdab11ad29d39907e076b0d3b8daf1d9b734174c7c3a2a0e8c7490600090a25050565b6066546001600160a01b031661166b612818565b6001600160a01b0316146116915760405162461bcd60e51b81526004016108359061505f565b826001600160a01b0316846001600160a01b031614156116c35760405162461bcd60e51b8152600401610835906150a4565b6067546001600160a01b03828116911614156116e1576116e161281c565b6065546001600160a01b031615610c705760655460405163b221095760e01b81526001600160a01b039091169063b221095790610c3d908790879087908790600401614b99565b611730612d33565b61174c5760405162461bcd60e51b815260040161083590614e65565b6117546107e5565b156117715760405162461bcd60e51b8152600401610835906153c4565b60695460408051630d37b53760e01b8152815160009384936001600160a01b0390911692630d37b5379260048083019392829003018186803b1580156117b657600080fd5b505afa1580156117ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ee91906145b4565b90925090506001600160a01b0382161580159061180b5750600081115b1561182a5760695461182a906001600160a01b03848116911683612da1565b6069546040805163433c53d960e11b8152815160009384936001600160a01b0390911692638678a7b2926004808301939282900301818787803b15801561187057600080fd5b505af1158015611884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a89190614a64565b606a805463ffffffff8084166401000000000267ffffffff000000001991861663ffffffff19909316929092171617905590925090506118ee6118e9612d24565b612e9b565b606a80546bffffffff00000000000000001916600160401b63ffffffff93841602179055606654908316906001600160a01b031661192a612818565b6001600160a01b03167f4d31e658dcf617bb3a3c8cf7c6dddb33f7030ac588e271631ecdb5d76c2e91ef846040516119629190615a7b565b60405180910390a450505050565b611978612818565b6001600160a01b0316611989611490565b6001600160a01b0316146119af5760405162461bcd60e51b815260040161083590615487565b8060005b81811015611c54576119c36143f5565b8484838181106119cf57fe5b9050606002018036038101906119e59190614856565b90506001816040015160ff161115611a0f5760405162461bcd60e51b815260040161083590614fc3565b80516001600160a01b0316611a365760405162461bcd60e51b81526004016108359061526f565b6075548210611ad2576075805460018101825560009190915281517f9a8d93986a7b9e6294572ea6736696119c195c1a9f5eae642d3c5fcd44e49dea90910180546020840151604085015160ff16600160b01b0260ff60b01b1961ffff909216600160a01b0261ffff60a01b196001600160a01b039096166001600160a01b031990941693909317949094169190911716919091179055611bf9565b611ada6143f5565b60758381548110611ae757fe5b60009182526020918290206040805160608101825292909101546001600160a01b03808216808552600160a01b830461ffff1695850195909552600160b01b90910460ff1691830191909152845191935016141580611b565750806020015161ffff16826020015161ffff1614155b80611b6f5750806040015160ff16826040015160ff1614155b15611bf0578160758481548110611b8257fe5b6000918252602091829020835191018054928401516040909401516001600160a01b03199093166001600160a01b039092169190911761ffff60a01b1916600160a01b61ffff909416939093029290921760ff60b01b1916600160b01b60ff90921691909102179055611bf7565b5050611c4c565b505b80600001516001600160a01b03167fc1bf93444a0055a24a7d0154b75fedf78edfe355c06a2ce8e47f9f39087205598260200151836040015185604051611c42939291906159b3565b60405180910390a2505b6001016119b3565b505b607554811015611cd157607554600090611c71906001612ec5565b90506075805480611c7e57fe5b600082815260208120820160001990810180546001600160b81b031916905590910190915560405182917f99fa473fdf53414bcd014cf6e7509fc58c68f7b86174767faa6ad5100cd5bae591a250611c56565b6000611cdb612eed565b90506103e8811115610c705760405162461bcd60e51b8152600401610835906154e2565b6074546001600160a01b031681565b606654604080516318c1996d60e21b815290516000926001600160a01b03169163630665b4916004808301926020929190829003018186803b158015611d5357600080fd5b505afa158015611d67573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c191906148bd565b611d93611490565b6001600160a01b0316611da4612818565b6001600160a01b03161480611dd357506074546001600160a01b0316611dc8612818565b6001600160a01b0316145b80611df857506073546001600160a01b0316611ded612818565b6001600160a01b0316145b611e145760405162461bcd60e51b815260040161083590614ef6565b611e1c61281c565b606654604051636a3fd4f960e01b81526001600160a01b0390911690636a3fd4f990611e4c908690600401614ae0565b60206040518083038186803b158015611e6457600080fd5b505afa158015611e78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9c9190614792565b611eb85760405162461bcd60e51b815260040161083590615586565b611ed26001600160a01b0384166380ac58cd60e01b61288a565b611eee5760405162461bcd60e51b815260040161083590614d7f565b611ef9607084612f7f565b611f0857611f08607084612fd0565b60005b81811015611f3757611f2f84848484818110611f2357fe5b90506020020135613098565b600101611f0b565b50826001600160a01b03167f51541dc4b4c08a16085809cccdc4cc77d8000b60fbb00142e57f236d842986758383604051611f73929190614cba565b60405180910390a2505050565b611f88612818565b6001600160a01b0316611f99611490565b6001600160a01b031614611fbf5760405162461bcd60e51b815260040161083590615487565b611fc761281c565b610d10816131e9565b60006108c16127b2565b6069546001600160a01b031681565b611ff16107e5565b61200d5760405162461bcd60e51b815260040161083590615917565b612015610a4b565b6120315760405162461bcd60e51b815260040161083590615229565b606954606a546040516313a54bf360e31b81526000926001600160a01b031691639d2a5f989161206a9163ffffffff1690600401615a7b565b602060405180830381600087803b15801561208457600080fd5b505af1158015612098573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120bc91906148bd565b606a80546bffffffffffffffffffffffff191690556073549091506001600160a01b03161561214c57607354606d5460405163266fce1f60e11b81526001600160a01b0390921691634cdf9c3e91612119918591906004016159f1565b600060405180830381600087803b15801561213357600080fd5b505af1158015612147573d6000803e3d6000fd5b505050505b6121558161325a565b6074546001600160a01b0316156121cd57607454606d54604051632ba8396360e11b81526001600160a01b039092169163575072c69161219a918591906004016159f1565b600060405180830381600087803b1580156121b457600080fd5b505af11580156121c8573d6000803e3d6000fd5b505050505b6121dd6121d8612d24565b61298d565b606d556121e8612818565b6001600160a01b03167f9c4163ece98173eab9a496c4db8bf3e2c8edcc5d2854377880597ccb858b7a9d826040516122209190614ad7565b60405180910390a2606d54612233612818565b6001600160a01b03167fc61852c20f0b03b31d782f3022f2bf20322ac17ce66c5349fb6e24740cdd645660405160405180910390a350565b6122736143f5565b6075828154811061228057fe5b60009182526020918290206040805160608101825292909101546001600160a01b0381168352600160a01b810461ffff1693830193909352600160b01b90920460ff169181019190915292915050565b6122d8612818565b6001600160a01b03166122e9611490565b6001600160a01b03161461230f5760405162461bcd60e51b815260040161083590615487565b6001600160a01b0381166123355760405162461bcd60e51b815260040161083590614eb0565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff16806123aa57506123aa612d28565b806123b8575060005460ff16155b6123d45760405162461bcd60e51b8152600401610835906152fb565b600054610100900460ff161580156123ff576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0386166124255760405162461bcd60e51b815260040161083590615121565b6001600160a01b03851661244b5760405162461bcd60e51b8152600401610835906156c4565b6001600160a01b0384166124715760405162461bcd60e51b815260040161083590614f79565b6001600160a01b0383166124975760405162461bcd60e51b8152600401610835906151b0565b606680546001600160a01b038089166001600160a01b031992831617909255606780548884169083161790556069805486841690831617905560688054928716929091169190911790556124ea87612d4c565b6124f26137e7565b6124fc606e613879565b60005b825181101561252c5761252483828151811061251757fe5b60200260200101516129d4565b6001016124ff565b50606c879055606d8890556125416070613879565b61254c6107086131e9565b856001600160a01b03167ff9632d212436344a25150ff0c161dabf412aade556621c2dea146ca63ff643f589898888888860405161258f969594939291906159ff565b60405180910390a2606d546125a2612818565b6001600160a01b03167fc61852c20f0b03b31d782f3022f2bf20322ac17ce66c5349fb6e24740cdd645660405160405180910390a38015610c6b576000805461ff00191690555050505050505050565b6125fa612818565b6001600160a01b031661260b611490565b6001600160a01b0316146126315760405162461bcd60e51b815260040161083590615487565b60755460ff8216106126555760405162461bcd60e51b815260040161083590615349565b6001826040015160ff16111561267d5760405162461bcd60e51b815260040161083590614fc3565b81516001600160a01b03166126a45760405162461bcd60e51b81526004016108359061526f565b8160758260ff16815481106126b557fe5b600091825260208083208451920180549185015160409095015160ff16600160b01b0260ff60b01b1961ffff909616600160a01b0261ffff60a01b196001600160a01b039095166001600160a01b03199094169390931793909316919091179390931617909155612724612eed565b90506103e88111156127485760405162461bcd60e51b8152600401610835906154e2565b82600001516001600160a01b03167fc1bf93444a0055a24a7d0154b75fedf78edfe355c06a2ce8e47f9f39087205598460200151856040015185604051611f73939291906159d2565b60405180604001604052806005815260200164332e342e3560d81b81525081565b6000806127bd612871565b905060006127c9612d24565b9050818111156127de576000925050506107f1565b6127e88282612ec5565b9250505090565b600080612804670de0b6b3a7640000856138bd565b905061281081846138f7565b949350505050565b3390565b6000612826613939565b606a54909150640100000000900463ffffffff1615806128555750606a54640100000000900463ffffffff1681105b610d105760405162461bcd60e51b815260040161083590615842565b60006108c1606c54606d54612cff90919063ffffffff16565b60006128958361393d565b80156128a657506128a68383613970565b9392505050565b606080826000015467ffffffffffffffff811180156128cb57600080fd5b506040519080825280602002602001820160405280156128f5578160200160208202803683370190505b50600160008181529085016020526040812054919250906001600160a01b03165b6001600160a01b0381161580159061293857506001600160a01b038116600114155b15612984578083838151811061294a57fe5b6001600160a01b03928316602091820292909201810191909152918116600090815260018088019093526040902054929091019116612916565b50909392505050565b6000806129b1606c546129ab606d5486612ec590919063ffffffff16565b90613996565b90506128a66129cb606c54836138bd90919063ffffffff16565b606d5490612cff565b6129e6816001600160a01b03166139c8565b612a025760405162461bcd60e51b81526004016108359061538f565b606654604051636a3fd4f960e01b81526001600160a01b0390911690636a3fd4f990612a32908490600401614ae0565b60206040518083038186803b158015612a4a57600080fd5b505afa158015612a5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a829190614792565b612a9e5760405162461bcd60e51b815260040161083590615586565b60408051600481526024810182526020810180516001600160e01b03166318160ddd60e01b17905290516000916060916001600160a01b03851691612ae291614abb565b600060405180830381855afa9150503d8060008114612b1d576040519150601f19603f3d011682016040523d82523d6000602084013e612b22565b606091505b509150915081612b445760405162461bcd60e51b8152600401610835906152b8565b612b4f606e84612fd0565b6040516001600160a01b038416907fbcd6d991f3416e288bf59a2997b423772937b62c7ea7dd1a54af7771de1f741890600090a2505050565b6001600160a01b038116600114801590612baa57506001600160a01b03811615155b612bc65760405162461bcd60e51b815260040161083590614e0f565b6001600160a01b038281166000908152600185016020526040902054811690821614612c045760405162461bcd60e51b815260040161083590614e38565b6001600160a01b039081166000818152600185016020526040808220805495851683529082208054959094166001600160a01b03199586161790935552805490911690558054600019019055565b6001600160a01b0381166000908152607260205260408120612c7391614415565b6040516001600160a01b038216907fcd64d9dacd230c5ccf1278ea5332b0621aa28c950fb0e61c8fbc9e2011c88a3490600090a250565b60008111612cca5760405162461bcd60e51b81526004016108359061540f565b60768190556040517fc44c7222e8df09744ced394101df47e78dedb642d3065267bb388901de9df6d490610a29908390614ad7565b6000828201838110156128a65760405162461bcd60e51b815260040161083590614f42565b4290565b60006112d7306139c8565b6000612d3d612871565b612d45612d24565b1015905090565b60008111612d6c5760405162461bcd60e51b81526004016108359061500b565b606c8190556040517f0d379c1a7282461e725a9dc2d74e65246c77e98ae93835e26c2f1654c48ee4ec90610a29908390614ad7565b801580612e295750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90612dd79030908690600401614af4565b60206040518083038186803b158015612def57600080fd5b505afa158015612e03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e2791906148bd565b155b612e455760405162461bcd60e51b8152600401610835906157a6565b610f6a8363095ea7b360e01b8484604051602401612e64929190614bc4565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526139ce565b60006401000000008210612ec15760405162461bcd60e51b8152600401610835906155f8565b5090565b600082821115612ee75760405162461bcd60e51b8152600401610835906150ea565b50900390565b6075546000908190815b818160ff161015612f7757612f0a6143f5565b60758260ff1681548110612f1a57fe5b60009182526020918290206040805160608101825292909101546001600160a01b0381168352600160a01b810461ffff16938301849052600160b01b900460ff16908201529150612f6c908590612cff565b935050600101612ef7565b509091505090565b60006001600160a01b038216600114801590612fa357506001600160a01b03821615155b80156128a65750506001600160a01b03908116600090815260019290920160205260409091205416151590565b6001600160a01b038116600114801590612ff257506001600160a01b03811615155b61300e5760405162461bcd60e51b815260040161083590614e0f565b6001600160a01b03818116600090815260018401602052604090205416156130485760405162461bcd60e51b8152600401610835906155d1565b60016000818152838201602052604080822080546001600160a01b039586168085529284208054969091166001600160a01b03199687161790559183905281549093169092179091558154019055565b6066546040516331a9108f60e11b81526001600160a01b0391821691841690636352211e906130cb908590600401614ad7565b60206040518083038186803b1580156130e357600080fd5b505afa1580156130f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061311b919061450e565b6001600160a01b0316146131415760405162461bcd60e51b81526004016108359061595e565b60005b6001600160a01b0383166000908152607260205260409020548110156131bc576001600160a01b038316600090815260726020526040902080548391908390811061318b57fe5b906000526020600020015414156131b45760405162461bcd60e51b8152600401610835906157fc565b600101613144565b506001600160a01b0390911660009081526072602090815260408220805460018101825590835291200155565b603c8163ffffffff161161320f5760405162461bcd60e51b8152600401610835906158cb565b606b805463ffffffff191663ffffffff83811691909117918290556040517f4f27f6f220ffad585e728389bc2f0f6b74eeebeb43f95f53752a647cb6e7e68792610a29921690615a7b565b6066546040805163e6d8a94b60e01b815290516000926001600160a01b03169163e6d8a94b91600480830192602092919082900301818787803b1580156132a057600080fd5b505af11580156132b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132d891906148bd565b90506132e381613a5d565b9050606760009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561333357600080fd5b505afa158015613347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061336b91906148bd565b61339e576040517f3728feb3fc1ef1bf4a24036afbe7d34b59c551bf0d2ab5564e87ec1734fa80dd90600090a150610d10565b60795460765460ff9091169060608167ffffffffffffffff811180156133c357600080fd5b506040519080825280602002602001820160405280156133ed578160200160208202803683370190505b50607a54909150859060009081905b8583101561359857606754604051633b30414760e01b81526000916001600160a01b031690633b30414790613435908890600401614ad7565b60206040518083038186803b15801561344d57600080fd5b505afa158015613461573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613485919061450e565b6001600160a01b03811660009081526078602052604090205490915060ff166134e057808685806001019650815181106134bb57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050613559565b818360010193508310613559577fb5f728fcb182000eb8e953c15f6795f07b6cda75b35ef0b65645b53aac6369458460405161351c9190614ad7565b60405180910390a183613553576040517f3728feb3fc1ef1bf4a24036afbe7d34b59c551bf0d2ab5564e87ec1734fa80dd90600090a15b50613598565b60008461020902866101f301016040516020016135769190614ad7565b60408051601f19818403018152919052805160209091012095506133fc915050565b6135b5856000815181106135a857fe5b6020026020010151613b0a565b6000876135cb576135c68985613996565b6135d5565b6135d58988613996565b9050801561360f5760005b8481101561360d576136058782815181106135f757fe5b602002602001015183613c7a565b6001016135e0565b505b60775460ff16156137be576000613626606e613ce7565b90505b6001600160a01b0381161580159061365c5750613646606e613d04565b6001600160a01b0316816001600160a01b031614155b156137b8576066546040516370a0823160e01b81526000916001600160a01b03808516926370a0823192613694921690600401614ae0565b60206040518083038186803b1580156136ac57600080fd5b505afa1580156136c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136e491906148bd565b905060008a6136fc576136f78288613996565b613706565b613706828b613996565b905080156137a45760005b878110156137a2576066548a516001600160a01b0390911690632b0ab144908c908490811061373c57fe5b602002602001015186856040518463ffffffff1660e01b815260040161376493929190614b75565b600060405180830381600087803b15801561377e57600080fd5b505af1158015613792573d6000803e3d6000fd5b5050600190920191506137119050565b505b6137af606e84613d0a565b92505050613629565b506137db565b6137db866000815181106137ce57fe5b6020026020010151613d2d565b50505050505050505050565b600054610100900460ff16806138005750613800612d28565b8061380e575060005460ff16155b61382a5760405162461bcd60e51b8152600401610835906152fb565b600054610100900460ff16158015613855576000805460ff1961ff0019909116610100171660011790555b61385d613e79565b613865613efa565b8015610d10576000805461ff001916905550565b8054156138985760405162461bcd60e51b8152600401610835906154bc565b60016000818152918101602052604090912080546001600160a01b0319169091179055565b6000826138cc57506000610794565b828202828482816138d957fe5b04146128a65760405162461bcd60e51b815260040161083590615446565b60006128a683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613fd4565b4390565b6000613950826301ffc9a760e01b613970565b80156107945750613969826001600160e01b0319613970565b1592915050565b600080600061397f858561400b565b9150915081801561398d5750805b95945050505050565b60008082116139b75760405162461bcd60e51b8152600401610835906151f2565b8183816139c057fe5b049392505050565b3b151590565b6060613a23826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166141009092919063ffffffff16565b805190915015610f6a5780806020019051810190613a419190614792565b610f6a5760405162461bcd60e51b815260040161083590615709565b6075546000908290825b81811015613b0157613a776143f5565b60758281548110613a8457fe5b600091825260208083206040805160608101825293909101546001600160a01b0381168452600160a01b810461ffff16928401839052600160b01b900460ff1690830152909250613ad690869061410f565b9050613aeb8260000151828460400151614123565b613af58782612ec5565b96505050600101613a67565b50929392505050565b6000613b166070613ce7565b90505b6001600160a01b03811615801590613b4c5750613b366070613d04565b6001600160a01b0316816001600160a01b031614155b15613c70576066546040516370a0823160e01b81526000916001600160a01b03808516926370a0823192613b84921690600401614ae0565b60206040518083038186803b158015613b9c57600080fd5b505afa158015613bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bd491906148bd565b90508015613c5d576066546001600160a01b038381166000908152607260205260409081902090516316960d5560e01b815291909216916316960d5591613c22918791879190600401614b0e565b600060405180830381600087803b158015613c3c57600080fd5b505af1158015613c50573d6000803e3d6000fd5b50505050613c5d82612c52565b613c68607083613d0a565b915050613b19565b610fcb607061412e565b60665460675460405163358dc31d60e11b81526001600160a01b0392831692636b1b863a92613cb192879287921690600401614bdd565b600060405180830381600087803b158015613ccb57600080fd5b505af1158015613cdf573d6000803e3d6000fd5b505050505050565b60016000818152910160205260409020546001600160a01b031690565b50600190565b6001600160a01b0380821660009081526001840160205260409020541692915050565b6000613d39606e613ce7565b90505b6001600160a01b03811615801590613d6f5750613d59606e613d04565b6001600160a01b0316816001600160a01b031614155b15610fcb576066546040516370a0823160e01b81526000916001600160a01b03808516926370a0823192613da7921690600401614ae0565b60206040518083038186803b158015613dbf57600080fd5b505afa158015613dd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613df791906148bd565b90508015613e6657606654604051630ac2ac5160e21b81526001600160a01b0390911690632b0ab14490613e3390869086908690600401614b75565b600060405180830381600087803b158015613e4d57600080fd5b505af1158015613e61573d6000803e3d6000fd5b505050505b613e71606e83613d0a565b915050613d3c565b600054610100900460ff1680613e925750613e92612d28565b80613ea0575060005460ff16155b613ebc5760405162461bcd60e51b8152600401610835906152fb565b600054610100900460ff16158015613865576000805460ff1961ff0019909116610100171660011790558015610d10576000805461ff001916905550565b600054610100900460ff1680613f135750613f13612d28565b80613f21575060005460ff16155b613f3d5760405162461bcd60e51b8152600401610835906152fb565b600054610100900460ff16158015613f68576000805460ff1961ff0019909116610100171660011790555b6000613f72612818565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610d10576000805461ff001916905550565b60008183613ff55760405162461bcd60e51b81526004016108359190614d4c565b50600083858161400157fe5b0495945050505050565b60008060606301ffc9a760e01b846040516024016140299190614d37565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060866001600160a01b03166175308460405161407d9190614abb565b6000604051808303818686fa925050503d80600081146140b9576040519150601f19603f3d011682016040523d82523d6000602084013e6140be565b606091505b50915091506020815110156140dc57600080945094505050506140f9565b81818060200190518101906140f19190614792565b945094505050505b9250929050565b606061281084846000856141ca565b60006128a661ffff831684026103e8613996565b610f6a83838361428b565b6001600081815290820160205260409020546001600160a01b03165b6001600160a01b0381161580159061416c57506001600160a01b038116600114155b156141a2576001600160a01b039081166000908152600183016020526040902080546001600160a01b031981169091551661414a565b50600160008181528282016020526040812080546001600160a01b0319169092179091559055565b6060824710156141ec5760405162461bcd60e51b81526004016108359061516a565b6141f5856139c8565b6142115760405162461bcd60e51b81526004016108359061563e565b60006060866001600160a01b0316858760405161422e9190614abb565b60006040518083038185875af1925050503d806000811461426b576040519150601f19603f3d011682016040523d82523d6000602084013e614270565b606091505b50915091506142808282866143bc565b979650505050505050565b60665460408051634eb1c24560e11b815290516060926001600160a01b031691639d63848a916004808301926000929190829003018186803b1580156142d057600080fd5b505afa1580156142e4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261430c9190810190614628565b905080518260ff1611156143325760405162461bcd60e51b815260040161083590615675565b6000818360ff168151811061434357fe5b602090810291909101015160665460405163358dc31d60e11b81529192506001600160a01b031690636b1b863a9061438390889088908690600401614bdd565b600060405180830381600087803b15801561439d57600080fd5b505af11580156143b1573d6000803e3d6000fd5b505050505050505050565b606083156143cb5750816128a6565b8251156143db5782518084602001fd5b8160405162461bcd60e51b81526004016108359190614d4c565b604080516060810182526000808252602082018190529181019190915290565b5080546000825590600052602060002090810190610d1091905b80821115612ec1576000815560010161442f565b60008083601f840112614454578081fd5b50813567ffffffffffffffff81111561446b578182fd5b60208301915083602080830285010111156140f957600080fd5b600060608284031215614496578081fd5b6144a06060615a8c565b905081356144ad81615aff565b8152602082013561ffff811681146144c457600080fd5b60208201526144d683604084016144e1565b604082015292915050565b803560ff8116811461079457600080fd5b600060208284031215614503578081fd5b81356128a681615aff565b60006020828403121561451f578081fd5b81516128a681615aff565b6000806000806080858703121561453f578283fd5b843561454a81615aff565b9350602085013561455a81615aff565b925060408501359150606085013561457181615aff565b939692955090935050565b6000806040838503121561458e578081fd5b823561459981615aff565b915060208301356145a981615b14565b809150509250929050565b600080604083850312156145c6578182fd5b82516145d181615aff565b6020939093015192949293505050565b600080600080608085870312156145f6578182fd5b843561460181615aff565b935060208501359250604085013561461881615aff565b9150606085013561457181615aff565b6000602080838503121561463a578182fd5b825167ffffffffffffffff811115614650578283fd5b8301601f81018513614660578283fd5b805161467361466e82615ab3565b615a8c565b818152838101908385018584028501860189101561468f578687fd5b8694505b838510156146ba5780516146a681615aff565b835260019490940193918501918501614693565b50979650505050505050565b600080602083850312156146d8578182fd5b823567ffffffffffffffff8111156146ee578283fd5b6146fa85828601614443565b90969095509350505050565b60008060208385031215614718578182fd5b823567ffffffffffffffff8082111561472f578384fd5b818501915085601f830112614742578384fd5b813581811115614750578485fd5b866020606083028501011115614764578485fd5b60209290920196919550909350505050565b600060208284031215614787578081fd5b81356128a681615b14565b6000602082840312156147a3578081fd5b81516128a681615b14565b6000602082840312156147bf578081fd5b81356001600160e01b0319811681146128a6578182fd5b600080604083850312156147e8578182fd5b82356147f381615aff565b915060208301356145a981615aff565b600080600060408486031215614817578081fd5b833561482281615aff565b9250602084013567ffffffffffffffff81111561483d578182fd5b61484986828701614443565b9497909650939450505050565b600060608284031215614867578081fd5b6128a68383614485565b60008060808385031215614883578182fd5b61488d8484614485565b915061489c84606085016144e1565b90509250929050565b6000602082840312156148b6578081fd5b5035919050565b6000602082840312156148ce578081fd5b5051919050565b600080600080600080600060e0888a0312156148ef578485fd5b873596506020808901359650604089013561490981615aff565b9550606089013561491981615aff565b9450608089013561492981615aff565b935060a089013561493981615aff565b925060c089013567ffffffffffffffff811115614954578283fd5b8901601f81018b13614964578283fd5b803561497261466e82615ab3565b81815283810190838501858402850186018f101561498e578687fd5b8694505b838510156149b95780356149a581615aff565b835260019490940193918501918501614992565b50809550505050505092959891949750929550565b600080600080600080600060e0888a0312156149e8578081fd5b87359650602088013595506040880135614a0181615aff565b94506060880135614a1181615aff565b93506080880135614a2181615aff565b925060a0880135614a3181615aff565b8092505060c0880135905092959891949750929550565b600060208284031215614a59578081fd5b81356128a681615b22565b60008060408385031215614a76578182fd5b8251614a8181615b22565b60208401519092506145a981615b22565b80516001600160a01b0316825260208082015161ffff169083015260409081015160ff16910152565b60008251614acd818460208701615ad3565b9190910192915050565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03848116825283166020808301919091526060604083018190528354908301819052600084815282812090929091608085019190845b81811015614b6757845484526001948501949383019301614b4b565b509198975050505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03948516815292841660208401526040830191909152909116606082015260800190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6001600160a01b03948516815260208101939093529083166040830152909116606082015260800190565b6020808252825182820181905260009190848201906040850190845b81811015614c6c5783516001600160a01b031683529284019291840191600101614c47565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614c6c57614ca7838551614a92565b9284019260609290920191600101614c94565b6020808252810182905260006001600160fb1b03831115614cd9578081fd5b60208302808560408501379190910160400190815292915050565b6020808252825182820181905260009190848201906040850190845b81811015614c6c57835183529284019291840191600101614d10565b901515815260200190565b6001600160e01b031991909116815260200190565b6000602082528251806020840152614d6b816040850160208701615ad3565b601f01601f19169190910160400192915050565b60208082526024908201527f506572696f6469635072697a6553747261746567792f6572633732312d696e76604082015263185b1a5960e21b606082015260800190565b6020808252602c908201527f506572696f6469635072697a6553747261746567792f746f6b656e2d6c69737460408201526b195b995c8b5a5b9d985b1a5960a21b606082015260800190565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b602080825260139082015272496e76616c696420707265764164647265737360681b604082015260600190565b6020808252602b908201527f506572696f6469635072697a6553747261746567792f7072697a652d7065726960408201526a37b216b737ba16b7bb32b960a91b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252602c908201527f506572696f6469635072697a6553747261746567792f6f6e6c792d6f776e657260408201526b16b7b916b634b9ba32b732b960a11b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252602a908201527f506572696f6469635072697a6553747261746567792f73706f6e736f72736869604082015269702d6e6f742d7a65726f60b01b606082015260800190565b60208082526028908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c60408201526734ba16ba37b5b2b760c11b606082015260800190565b60208082526034908201527f506572696f6469635072697a6553747261746567792f7072697a652d706572696040820152736f642d677265617465722d7468616e2d7a65726f60601b606082015260800190565b60208082526025908201527f506572696f6469635072697a6553747261746567792f6f6e6c792d7072697a656040820152640b5c1bdbdb60da1b606082015260800190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f7472616e736665722d746040820152653796b9b2b63360d11b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526029908201527f506572696f6469635072697a6553747261746567792f7072697a652d706f6f6c6040820152682d6e6f742d7a65726f60b81b606082015260800190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526022908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d7a65604082015261726f60f01b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d636f6040820152656d706c65746560d01b606082015260800190565b60208082526029908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c6040820152681a5d0b5d185c99d95d60ba1b606082015260800190565b60208082526023908201527f506572696f6469635072697a6553747261746567792f65726332302d696e76616040820152621b1a5960ea1b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526026908201527f4d756c7469706c6557696e6e6572732f6e6f6e6578697374656e742d7072697a604082015265195cdc1b1a5d60d21b606082015260800190565b6020808252818101527f506572696f6469635072697a6553747261746567792f65726332302d6e756c6c604082015260600190565b6020808252602b908201527f506572696f6469635072697a6553747261746567792f726e672d616c7265616460408201526a1e4b5c995c5d595cdd195960aa1b606082015260800190565b6020808252601f908201527f4d756c7469706c6557696e6e6572732f77696e6e6572732d6774652d6f6e6500604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600c908201526b105b1c9958591e481a5b9a5d60a21b604082015260600190565b60208082526033908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c6040820152721a5d0b5c195c98d95b9d1859d94b5d1bdd185b606a1b606082015260800190565b60208082526031908201527f506572696f6469635072697a6553747261746567792f6265666f72654177617260408201527019131a5cdd195b995c8b5a5b9d985b1a59607a1b606082015260800190565b6020808252602b908201527f506572696f6469635072697a6553747261746567792f63616e6e6f742d61776160408201526a1c990b595e1d195c9b985b60aa1b606082015260800190565b6020808252600d908201526c105b1c9958591e481859191959609a1b604082015260600190565b60208082526026908201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360408201526532206269747360d01b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602f908201527f506572696f6469635072697a6553747261746567792f61776172642d696e766160408201526e0d8d2c85ae8ded6cadc5ad2dcc8caf608b1b606082015260800190565b60208082526025908201527f506572696f6469635072697a6553747261746567792f7469636b65742d6e6f746040820152642d7a65726f60d81b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526033908201527f506572696f6469635072697a6553747261746567792f7072697a6553747261746040820152721959de531a5cdd195b995c8b5a5b9d985b1a59606a1b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f6572633732312d6475706040820152656c696361746560d01b606082015260800190565b60208082526023908201527f506572696f6469635072697a6553747261746567792f726e672d696e2d666c6960408201526219da1d60ea1b606082015260800190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d74696040820152651b59591bdd5d60d21b606082015260800190565b6020808252602c908201527f506572696f6469635072697a6553747261746567792f726e672d74696d656f7560408201526b742d67742d36302d7365637360a01b606082015260800190565b60208082526027908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d72656040820152661c5d595cdd195960ca1b606082015260800190565b60208082526027908201527f506572696f6469635072697a6553747261746567792f756e617661696c61626c6040820152663296ba37b5b2b760c91b606082015260800190565b606081016107948284614a92565b61ffff93909316835260ff919091166020830152604082015260600190565b61ffff93909316835260ff918216602084015216604082015260600190565b918252602082015260400190565b86815260208082018790526001600160a01b0386811660408401528581166060840152848116608084015260c060a08401819052845190840181905260009285810192909160e0860190855b81811015615a69578551841683529484019491840191600101615a4b565b50909c9b505050505050505050505050565b63ffffffff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615aab57600080fd5b604052919050565b600067ffffffffffffffff821115615ac9578081fd5b5060209081020190565b60005b83811015615aee578181015183820152602001615ad6565b83811115610c705750506000910152565b6001600160a01b0381168114610d1057600080fd5b8015158114610d1057600080fd5b63ffffffff81168114610d1057600080fdfea2646970667358221220be37152a59f38c03d66ba04fe9d77a5fb0e1ee0351e66a3db2328c356197edad64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x1D SWAP1 PUSH2 0x5F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x39 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x6C JUMP JUMPDEST PUSH2 0x5B8B DUP1 PUSH2 0x3B2 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH2 0x337 DUP1 PUSH2 0x7B PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x22EC095 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x6A JUMPI DUP1 PUSH4 0xEFC81A8C EQ PUSH2 0x120 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x128 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x137 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x4E PUSH2 0x2B3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x265 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x26A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2DE PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE DUP3 DUP2 MSTORE PUSH2 0x2D8 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x137 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 POP 0x2F 0xB6 MSTORE8 0xB5 0xE2 DUP14 SDIV SWAP6 PUSH26 0xC4EB876DE83D623B7114AF0CA39E146BB36D9574328464736F6C PUSH4 0x4300060C STOP CALLER PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5B6A DUP1 PUSH3 0x21 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x3C5 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x738BBEA8 GT PUSH2 0x1FF JUMPI DUP1 PUSH4 0xB0244682 GT PUSH2 0x11A JUMPI DUP1 PUSH4 0xD5AD6BF6 GT PUSH2 0xAD JUMPI DUP1 PUSH4 0xF2FDE38B GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x733 JUMPI DUP1 PUSH4 0xF97700E2 EQ PUSH2 0x746 JUMPI DUP1 PUSH4 0xFBF0953E EQ PUSH2 0x759 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x76C JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0xD5AD6BF6 EQ PUSH2 0x6FB JUMPI DUP1 PUSH4 0xD605787B EQ PUSH2 0x703 JUMPI DUP1 PUSH4 0xDFB2F13B EQ PUSH2 0x70B JUMPI DUP1 PUSH4 0xEEFC8AD1 EQ PUSH2 0x713 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0xC2F19EE8 GT PUSH2 0xE9 JUMPI DUP1 PUSH4 0xC2F19EE8 EQ PUSH2 0x6C5 JUMPI DUP1 PUSH4 0xC42B42A0 EQ PUSH2 0x6CD JUMPI DUP1 PUSH4 0xC48DDBCB EQ PUSH2 0x6D5 JUMPI DUP1 PUSH4 0xC6853270 EQ PUSH2 0x6E8 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0xB0244682 EQ PUSH2 0x684 JUMPI DUP1 PUSH4 0xB2210957 EQ PUSH2 0x697 JUMPI DUP1 PUSH4 0xB9EE1E05 EQ PUSH2 0x6AA JUMPI DUP1 PUSH4 0xC25A9C32 EQ PUSH2 0x6B2 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0x192 JUMPI DUP1 PUSH4 0x95E5F9EE GT PUSH2 0x161 JUMPI DUP1 PUSH4 0x95E5F9EE EQ PUSH2 0x659 JUMPI DUP1 PUSH4 0x9DAFAFB0 EQ PUSH2 0x661 JUMPI DUP1 PUSH4 0xA4E075CA EQ PUSH2 0x669 JUMPI DUP1 PUSH4 0xACCA5B95 EQ PUSH2 0x67C JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x616 JUMPI DUP1 PUSH4 0x8E204C43 EQ PUSH2 0x61E JUMPI DUP1 PUSH4 0x94144C6B EQ PUSH2 0x631 JUMPI DUP1 PUSH4 0x9417783F EQ PUSH2 0x639 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x884A4448 GT PUSH2 0x1CE JUMPI DUP1 PUSH4 0x884A4448 EQ PUSH2 0x5D3 JUMPI DUP1 PUSH4 0x8AA3EC6F EQ PUSH2 0x5E6 JUMPI DUP1 PUSH4 0x8ACFACA9 EQ PUSH2 0x5F9 JUMPI DUP1 PUSH4 0x8D5F10C4 EQ PUSH2 0x601 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x738BBEA8 EQ PUSH2 0x59D JUMPI DUP1 PUSH4 0x7F2BE9FC EQ PUSH2 0x5A5 JUMPI DUP1 PUSH4 0x7F4296D7 EQ PUSH2 0x5B8 JUMPI DUP1 PUSH4 0x876F5C7E EQ PUSH2 0x5CB JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x4E5D08E0 GT PUSH2 0x2EF JUMPI DUP1 PUSH4 0x6BE51C4F GT PUSH2 0x282 JUMPI DUP1 PUSH4 0x6F46F221 GT PUSH2 0x251 JUMPI DUP1 PUSH4 0x6F46F221 EQ PUSH2 0x57D JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x585 JUMPI DUP1 PUSH4 0x719CE73E EQ PUSH2 0x58D JUMPI DUP1 PUSH4 0x72F33EA9 EQ PUSH2 0x595 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x6BE51C4F EQ PUSH2 0x552 JUMPI DUP1 PUSH4 0x6BEA5344 EQ PUSH2 0x55A JUMPI DUP1 PUSH4 0x6CC25DB7 EQ PUSH2 0x562 JUMPI DUP1 PUSH4 0x6DFB0386 EQ PUSH2 0x56A JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x62C77A61 GT PUSH2 0x2BE JUMPI DUP1 PUSH4 0x62C77A61 EQ PUSH2 0x51C JUMPI DUP1 PUSH4 0x66968221 EQ PUSH2 0x524 JUMPI DUP1 PUSH4 0x671137C4 EQ PUSH2 0x537 JUMPI DUP1 PUSH4 0x6A74F107 EQ PUSH2 0x54A JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x4E5D08E0 EQ PUSH2 0x4DB JUMPI DUP1 PUSH4 0x500DB70D EQ PUSH2 0x4EE JUMPI DUP1 PUSH4 0x52A30109 EQ PUSH2 0x4F6 JUMPI DUP1 PUSH4 0x605E25AC EQ PUSH2 0x509 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x2C8FE73D GT PUSH2 0x367 JUMPI DUP1 PUSH4 0x47BED998 GT PUSH2 0x336 JUMPI DUP1 PUSH4 0x47BED998 EQ PUSH2 0x4A5 JUMPI DUP1 PUSH4 0x4ABA4F6B EQ PUSH2 0x4B8 JUMPI DUP1 PUSH4 0x4C169F4F EQ PUSH2 0x4C0 JUMPI DUP1 PUSH4 0x4D7F3DB0 EQ PUSH2 0x4C8 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x2C8FE73D EQ PUSH2 0x460 JUMPI DUP1 PUSH4 0x30FCDF41 EQ PUSH2 0x468 JUMPI DUP1 PUSH4 0x38A9B4B6 EQ PUSH2 0x47D JUMPI DUP1 PUSH4 0x42D09209 EQ PUSH2 0x490 JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0xFAF125F GT PUSH2 0x3A3 JUMPI DUP1 PUSH4 0xFAF125F EQ PUSH2 0x428 JUMPI DUP1 PUSH4 0x111070E4 EQ PUSH2 0x430 JUMPI DUP1 PUSH4 0x152D308C EQ PUSH2 0x438 JUMPI DUP1 PUSH4 0x2A7AD609 EQ PUSH2 0x44B JUMPI PUSH2 0x3C5 JUMP JUMPDEST DUP1 PUSH4 0x1B48E34 EQ PUSH2 0x3CA JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x3F3 JUMPI DUP1 PUSH4 0xD847FC4 EQ PUSH2 0x413 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3DD PUSH2 0x3D8 CALLDATASIZE PUSH1 0x4 PUSH2 0x48A5 JUMP JUMPDEST PUSH2 0x781 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x406 PUSH2 0x401 CALLDATASIZE PUSH1 0x4 PUSH2 0x47AE JUMP JUMPDEST PUSH2 0x79A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x4D2C JUMP JUMPDEST PUSH2 0x41B PUSH2 0x7D0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x4AE0 JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x7DF JUMP JUMPDEST PUSH2 0x406 PUSH2 0x7E5 JUMP JUMPDEST PUSH2 0x406 PUSH2 0x446 CALLDATASIZE PUSH1 0x4 PUSH2 0x457C JUMP JUMPDEST PUSH2 0x7F4 JUMP JUMPDEST PUSH2 0x453 PUSH2 0x8AB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x5A7B JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x8B7 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x476 CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0x8C6 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x47B PUSH2 0x48B CALLDATASIZE PUSH1 0x4 PUSH2 0x4776 JUMP JUMPDEST PUSH2 0x99E JUMP JUMPDEST PUSH2 0x498 PUSH2 0xA34 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x4C2B JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x4B3 CALLDATASIZE PUSH1 0x4 PUSH2 0x48A5 JUMP JUMPDEST PUSH2 0xA40 JUMP JUMPDEST PUSH2 0x406 PUSH2 0xA4B JUMP JUMPDEST PUSH2 0x47B PUSH2 0xAD4 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x4D6 CALLDATASIZE PUSH1 0x4 PUSH2 0x45E1 JUMP JUMPDEST PUSH2 0xB9E JUMP JUMPDEST PUSH2 0x47B PUSH2 0x4E9 CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0xC76 JUMP JUMPDEST PUSH2 0x41B PUSH2 0xD13 JUMP JUMPDEST PUSH2 0x406 PUSH2 0x504 CALLDATASIZE PUSH1 0x4 PUSH2 0x48A5 JUMP JUMPDEST PUSH2 0xD22 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x517 CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0xDB0 JUMP JUMPDEST PUSH2 0x498 PUSH2 0xE91 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x532 CALLDATASIZE PUSH1 0x4 PUSH2 0x46C6 JUMP JUMPDEST PUSH2 0xE9D JUMP JUMPDEST PUSH2 0x47B PUSH2 0x545 CALLDATASIZE PUSH1 0x4 PUSH2 0x47D6 JUMP JUMPDEST PUSH2 0xF6F JUMP JUMPDEST PUSH2 0x406 PUSH2 0xFCF JUMP JUMPDEST PUSH2 0x41B PUSH2 0xFE8 JUMP JUMPDEST PUSH2 0x453 PUSH2 0xFF7 JUMP JUMPDEST PUSH2 0x41B PUSH2 0x100B JUMP JUMPDEST PUSH2 0x47B PUSH2 0x578 CALLDATASIZE PUSH1 0x4 PUSH2 0x48A5 JUMP JUMPDEST PUSH2 0x101A JUMP JUMPDEST PUSH2 0x406 PUSH2 0x106A JUMP JUMPDEST PUSH2 0x47B PUSH2 0x1073 JUMP JUMPDEST PUSH2 0x41B PUSH2 0x10FC JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x110B JUMP JUMPDEST PUSH2 0x406 PUSH2 0x1111 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x5B3 CALLDATASIZE PUSH1 0x4 PUSH2 0x49CE JUMP JUMPDEST PUSH2 0x1164 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x5C6 CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0x1208 JUMP JUMPDEST PUSH2 0x406 PUSH2 0x12BE JUMP JUMPDEST PUSH2 0x47B PUSH2 0x5E1 CALLDATASIZE PUSH1 0x4 PUSH2 0x48A5 JUMP JUMPDEST PUSH2 0x12DD JUMP JUMPDEST PUSH2 0x47B PUSH2 0x5F4 CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0x132D JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x1405 JUMP JUMPDEST PUSH2 0x609 PUSH2 0x140B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x4C78 JUMP JUMPDEST PUSH2 0x41B PUSH2 0x1490 JUMP JUMPDEST PUSH2 0x406 PUSH2 0x62C CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0x149F JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x14B4 JUMP JUMPDEST PUSH2 0x64C PUSH2 0x647 CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0x14BA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x4CF4 JUMP JUMPDEST PUSH2 0x406 PUSH2 0x1526 JUMP JUMPDEST PUSH2 0x406 PUSH2 0x1530 JUMP JUMPDEST PUSH2 0x406 PUSH2 0x677 CALLDATASIZE PUSH1 0x4 PUSH2 0x4776 JUMP JUMPDEST PUSH2 0x1539 JUMP JUMPDEST PUSH2 0x453 PUSH2 0x15C0 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x692 CALLDATASIZE PUSH1 0x4 PUSH2 0x47D6 JUMP JUMPDEST PUSH2 0x15CC JUMP JUMPDEST PUSH2 0x47B PUSH2 0x6A5 CALLDATASIZE PUSH1 0x4 PUSH2 0x452A JUMP JUMPDEST PUSH2 0x1657 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x1728 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x6C0 CALLDATASIZE PUSH1 0x4 PUSH2 0x4706 JUMP JUMPDEST PUSH2 0x1970 JUMP JUMPDEST PUSH2 0x41B PUSH2 0x1CFF JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x1D0E JUMP JUMPDEST PUSH2 0x47B PUSH2 0x6E3 CALLDATASIZE PUSH1 0x4 PUSH2 0x4803 JUMP JUMPDEST PUSH2 0x1D8B JUMP JUMPDEST PUSH2 0x47B PUSH2 0x6F6 CALLDATASIZE PUSH1 0x4 PUSH2 0x4A48 JUMP JUMPDEST PUSH2 0x1F80 JUMP JUMPDEST PUSH2 0x3DD PUSH2 0x1FD0 JUMP JUMPDEST PUSH2 0x41B PUSH2 0x1FDA JUMP JUMPDEST PUSH2 0x47B PUSH2 0x1FE9 JUMP JUMPDEST PUSH2 0x726 PUSH2 0x721 CALLDATASIZE PUSH1 0x4 PUSH2 0x48A5 JUMP JUMPDEST PUSH2 0x226B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x59A5 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x741 CALLDATASIZE PUSH1 0x4 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0x22D0 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x754 CALLDATASIZE PUSH1 0x4 PUSH2 0x48D5 JUMP JUMPDEST PUSH2 0x2391 JUMP JUMPDEST PUSH2 0x47B PUSH2 0x767 CALLDATASIZE PUSH1 0x4 PUSH2 0x4871 JUMP JUMPDEST PUSH2 0x25F2 JUMP JUMPDEST PUSH2 0x774 PUSH2 0x2791 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x3EA SWAP2 SWAP1 PUSH2 0x4D4C JUMP JUMPDEST PUSH1 0x0 PUSH2 0x794 PUSH2 0x78E PUSH2 0x27B2 JUMP JUMPDEST DUP4 PUSH2 0x27EF JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL EQ DUP1 PUSH2 0x794 JUMPI POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT EQ SWAP1 JUMP JUMPDEST PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x7A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH4 0xFFFFFFFF AND ISZERO ISZERO JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7FE PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x80F PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x83E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x846 PUSH2 0x281C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x78 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP6 ISZERO ISZERO OR SWAP1 SSTORE MLOAD PUSH32 0xD1AC9A365C0E3BFAD562E0A809A5DED3842A2B489F839B3327E4E34EE0128F28 SWAP1 PUSH2 0x89A SWAP1 DUP6 SWAP1 PUSH2 0x4D2C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8C1 PUSH2 0x2871 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x8CE PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x8DF PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x905 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x90D PUSH2 0x281C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0x938 JUMPI POP PUSH2 0x938 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH4 0x266FCE1F PUSH1 0xE1 SHL PUSH2 0x288A JUMP JUMPDEST PUSH2 0x954 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5535 JUMP JUMPDEST PUSH1 0x73 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xC4FEFF61630891EA2CB42A54FBE3FF2E65422F2ED17323AC6B65F4521112E87E SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH2 0x9A6 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x9B7 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x9DD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x9E5 PUSH2 0x281C JUMP JUMPDEST PUSH1 0x77 DUP1 SLOAD PUSH1 0xFF NOT AND DUP3 ISZERO ISZERO OR SWAP1 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x6959D02E8FB6264D1D39BF37F1E725001F342714933CF38F8627A2442EFC43FD SWAP2 PUSH2 0xA29 SWAP2 PUSH1 0xFF SWAP1 SWAP2 AND SWAP1 PUSH2 0x4D2C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x8C1 PUSH1 0x70 PUSH2 0x28AD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x794 DUP3 PUSH2 0x298D JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x6A SLOAD PUSH1 0x40 MLOAD PUSH4 0xE866E6F PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x3A19B9BC SWAP2 PUSH2 0xA84 SWAP2 PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x4 ADD PUSH2 0x5A7B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA9C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xAB0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x8C1 SWAP2 SWAP1 PUSH2 0x4792 JUMP JUMPDEST PUSH2 0xADC PUSH2 0x1111 JUMP JUMPDEST PUSH2 0xAF8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5885 JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF NOT DUP2 AND SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH4 0xFFFFFFFF DUP1 DUP4 AND SWAP3 PUSH5 0x100000000 SWAP1 DIV AND SWAP1 PUSH32 0xEE6702C46C5618E6FC7E625C71F4C85DF9C91D456CB16A3AEA71AB83B1FEE005 SWAP1 PUSH1 0x0 SWAP1 LOG1 PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0xFFFFFFFF DUP5 AND SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 CALLER SWAP1 PUSH32 0xD50026EE0824513AF20CDF5E72D1FBFBE8FD646EE0576378E080326F1A695E58 SWAP1 PUSH2 0xB92 SWAP1 DUP7 SWAP1 PUSH2 0x5A7B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xBB2 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xBD8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x505F JUMP JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0xBF6 JUMPI PUSH2 0xBF6 PUSH2 0x281C JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0xC70 JUMPI PUSH1 0x65 SLOAD PUSH1 0x40 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x4D7F3DB0 SWAP1 PUSH2 0xC3D SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x4C00 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC57 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xC6B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0xC7E PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xC8F PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0xCBE JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xCB3 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0xCE3 JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xCD8 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0xCFF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4EF6 JUMP JUMPDEST PUSH2 0xD07 PUSH2 0x281C JUMP JUMPDEST PUSH2 0xD10 DUP2 PUSH2 0x29D4 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xD2C PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xD3D PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xD63 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0xD6B PUSH2 0x281C JUMP JUMPDEST PUSH1 0x7A DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x63E4E34F49D12428C03E04E61340C7167E36EB0FF6F0B1970C75440261794039 SWAP1 PUSH2 0xDA0 SWAP1 DUP5 SWAP1 PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP PUSH1 0x1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xDB8 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xDC9 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xDEF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0xDF7 PUSH2 0x281C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0xE25 JUMPI POP PUSH2 0xE25 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x288A JUMP JUMPDEST PUSH2 0xE41 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4DC3 JUMP JUMPDEST PUSH1 0x65 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 AND SWAP1 PUSH32 0x9FC437AA70AD4EE5F33F6772BF338EED41E21B95435820817AB8B4DF161CE4DD SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x8C1 PUSH1 0x6E PUSH2 0x28AD JUMP JUMPDEST PUSH2 0xEA5 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xEB6 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0xEE5 JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xEDA PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0xF0A JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xEFF PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0xF26 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4EF6 JUMP JUMPDEST PUSH2 0xF2E PUSH2 0x281C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xF6A JUMPI PUSH2 0xF62 DUP4 DUP4 DUP4 DUP2 DUP2 LT PUSH2 0xF48 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0xF5D SWAP2 SWAP1 PUSH2 0x44F2 JUMP JUMPDEST PUSH2 0x29D4 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xF31 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xF77 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF88 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xFAE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0xFB6 PUSH2 0x281C JUMP JUMPDEST PUSH2 0xFC2 PUSH1 0x70 DUP3 DUP5 PUSH2 0x2B88 JUMP JUMPDEST PUSH2 0xFCB DUP3 PUSH2 0x2C52 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFD9 PUSH2 0x7E5 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x8C1 JUMPI POP PUSH2 0x8C1 PUSH2 0xA4B JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH5 0x100000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1022 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1033 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1059 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x1061 PUSH2 0x281C JUMP JUMPDEST PUSH2 0xD10 DUP2 PUSH2 0x2CAA JUMP JUMPDEST PUSH1 0x79 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x107B PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x108C PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x10B2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x6D SLOAD DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND PUSH2 0x1130 JUMPI POP PUSH1 0x0 PUSH2 0x7F1 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH1 0x6B SLOAD PUSH2 0x1154 SWAP2 PUSH4 0xFFFFFFFF SWAP2 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 SWAP2 DIV DUP2 AND SWAP1 PUSH2 0x2CFF AND JUMP JUMPDEST PUSH2 0x115C PUSH2 0x2D24 JUMP JUMPDEST GT SWAP1 POP PUSH2 0x7F1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x117D JUMPI POP PUSH2 0x117D PUSH2 0x2D28 JUMP JUMPDEST DUP1 PUSH2 0x118B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x11A7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x52FB JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x11D2 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x60 PUSH2 0x11E3 DUP10 DUP10 DUP10 DUP10 DUP10 DUP10 DUP8 PUSH2 0x2391 JUMP JUMPDEST PUSH2 0x11EC DUP4 PUSH2 0x2CAA JUMP JUMPDEST POP DUP1 ISZERO PUSH2 0xC6B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1210 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1221 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1247 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x124F PUSH2 0x281C JUMP JUMPDEST PUSH2 0x1257 PUSH2 0x7E5 JUMP JUMPDEST ISZERO PUSH2 0x1274 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5842 JUMP JUMPDEST PUSH1 0x69 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xF935763CC7C57EE8ED6318ED71E756CCA0731294C9F46FF5B386F36D6FF1417A SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x12C8 PUSH2 0x2D33 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x8C1 JUMPI POP PUSH2 0x12D7 PUSH2 0x7E5 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x12E5 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x12F6 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x131C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x1324 PUSH2 0x281C JUMP JUMPDEST PUSH2 0xD10 DUP2 PUSH2 0x2D4C JUMP JUMPDEST PUSH2 0x1335 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1346 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x136C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x1374 PUSH2 0x281C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0x139F JUMPI POP PUSH2 0x139F PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH4 0x2BA83963 PUSH1 0xE1 SHL PUSH2 0x288A JUMP JUMPDEST PUSH2 0x13BB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5753 JUMP JUMPDEST PUSH1 0x74 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xDA05D50A3A1EC0FFAB059F1D457AE59F68CCFB3FFBB4DAD283C516F9103D584B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x76 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x75 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0x1487 JUMPI PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 SWAP1 DUP2 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP2 DUP6 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND DUP4 DUP6 ADD MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP3 ADD MSTORE DUP3 MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 ADD PUSH2 0x142F JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x78 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x6C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD DUP4 MLOAD DUP2 DUP5 MUL DUP2 ADD DUP5 ADD SWAP1 SWAP5 MSTORE DUP1 DUP5 MSTORE PUSH1 0x60 SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x151A JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x1506 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8C1 PUSH2 0x2D33 JUMP JUMPDEST PUSH1 0x77 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1543 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1554 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x157A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x1582 PUSH2 0x281C JUMP JUMPDEST PUSH1 0x79 DUP1 SLOAD PUSH1 0xFF NOT AND DUP4 ISZERO ISZERO OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x2B4B6FFE286F7CE4CCC6B136BB14987B0A00092174D88938A0C667A104A4A731 SWAP1 PUSH2 0xDA0 SWAP1 DUP5 SWAP1 PUSH2 0x4D2C JUMP JUMPDEST PUSH1 0x6B SLOAD PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x15D4 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x15E5 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x160B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x1613 PUSH2 0x281C JUMP JUMPDEST PUSH2 0x161F PUSH1 0x6E DUP3 DUP5 PUSH2 0x2B88 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 PUSH32 0x58982464497ACDAB11AD29D39907E076B0D3B8DAF1D9B734174C7C3A2A0E8C74 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x166B PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1691 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x505F JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x16C3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x50A4 JUMP JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x16E1 JUMPI PUSH2 0x16E1 PUSH2 0x281C JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0xC70 JUMPI PUSH1 0x65 SLOAD PUSH1 0x40 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xB2210957 SWAP1 PUSH2 0xC3D SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B99 JUMP JUMPDEST PUSH2 0x1730 PUSH2 0x2D33 JUMP JUMPDEST PUSH2 0x174C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4E65 JUMP JUMPDEST PUSH2 0x1754 PUSH2 0x7E5 JUMP JUMPDEST ISZERO PUSH2 0x1771 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x53C4 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xD37B537 PUSH1 0xE0 SHL DUP2 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP3 PUSH4 0xD37B537 SWAP3 PUSH1 0x4 DUP1 DUP4 ADD SWAP4 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x17B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x17CA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x17EE SWAP2 SWAP1 PUSH2 0x45B4 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x180B JUMPI POP PUSH1 0x0 DUP2 GT JUMPDEST ISZERO PUSH2 0x182A JUMPI PUSH1 0x69 SLOAD PUSH2 0x182A SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND SWAP2 AND DUP4 PUSH2 0x2DA1 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x433C53D9 PUSH1 0xE1 SHL DUP2 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP3 PUSH4 0x8678A7B2 SWAP3 PUSH1 0x4 DUP1 DUP4 ADD SWAP4 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1870 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1884 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x18A8 SWAP2 SWAP1 PUSH2 0x4A64 JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH4 0xFFFFFFFF DUP1 DUP5 AND PUSH5 0x100000000 MUL PUSH8 0xFFFFFFFF00000000 NOT SWAP2 DUP7 AND PUSH4 0xFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR AND OR SWAP1 SSTORE SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x18EE PUSH2 0x18E9 PUSH2 0x2D24 JUMP JUMPDEST PUSH2 0x2E9B JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFF0000000000000000 NOT AND PUSH1 0x1 PUSH1 0x40 SHL PUSH4 0xFFFFFFFF SWAP4 DUP5 AND MUL OR SWAP1 SSTORE PUSH1 0x66 SLOAD SWAP1 DUP4 AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x192A PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x4D31E658DCF617BB3A3C8CF7C6DDDB33F7030AC588E271631ECDB5D76C2E91EF DUP5 PUSH1 0x40 MLOAD PUSH2 0x1962 SWAP2 SWAP1 PUSH2 0x5A7B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1978 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1989 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x19AF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1C54 JUMPI PUSH2 0x19C3 PUSH2 0x43F5 JUMP JUMPDEST DUP5 DUP5 DUP4 DUP2 DUP2 LT PUSH2 0x19CF JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x60 MUL ADD DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x19E5 SWAP2 SWAP1 PUSH2 0x4856 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP2 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND GT ISZERO PUSH2 0x1A0F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4FC3 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A36 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x526F JUMP JUMPDEST PUSH1 0x75 SLOAD DUP3 LT PUSH2 0x1AD2 JUMPI PUSH1 0x75 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE PUSH1 0x0 SWAP2 SWAP1 SWAP2 MSTORE DUP2 MLOAD PUSH32 0x9A8D93986A7B9E6294572EA6736696119C195C1A9F5EAE642D3C5FCD44E49DEA SWAP1 SWAP2 ADD DUP1 SLOAD PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x40 DUP6 ADD MLOAD PUSH1 0xFF AND PUSH1 0x1 PUSH1 0xB0 SHL MUL PUSH1 0xFF PUSH1 0xB0 SHL NOT PUSH2 0xFFFF SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xA0 SHL MUL PUSH2 0xFFFF PUSH1 0xA0 SHL NOT PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP7 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP5 SWAP1 SWAP5 AND SWAP2 SWAP1 SWAP2 OR AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x1BF9 JUMP JUMPDEST PUSH2 0x1ADA PUSH2 0x43F5 JUMP JUMPDEST PUSH1 0x75 DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x1AE7 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND DUP1 DUP6 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP4 DIV PUSH2 0xFFFF AND SWAP6 DUP6 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 SWAP2 DIV PUSH1 0xFF AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP5 MLOAD SWAP2 SWAP4 POP AND EQ ISZERO DUP1 PUSH2 0x1B56 JUMPI POP DUP1 PUSH1 0x20 ADD MLOAD PUSH2 0xFFFF AND DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0xFFFF AND EQ ISZERO JUMPDEST DUP1 PUSH2 0x1B6F JUMPI POP DUP1 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND DUP3 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x1BF0 JUMPI DUP2 PUSH1 0x75 DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x1B82 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 DUP4 MLOAD SWAP2 ADD DUP1 SLOAD SWAP3 DUP5 ADD MLOAD PUSH1 0x40 SWAP1 SWAP5 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP4 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH2 0xFFFF PUSH1 0xA0 SHL NOT AND PUSH1 0x1 PUSH1 0xA0 SHL PUSH2 0xFFFF SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 MUL SWAP3 SWAP1 SWAP3 OR PUSH1 0xFF PUSH1 0xB0 SHL NOT AND PUSH1 0x1 PUSH1 0xB0 SHL PUSH1 0xFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE PUSH2 0x1BF7 JUMP JUMPDEST POP POP PUSH2 0x1C4C JUMP JUMPDEST POP JUMPDEST DUP1 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC1BF93444A0055A24A7D0154B75FEDF78EDFE355C06A2CE8E47F9F3908720559 DUP3 PUSH1 0x20 ADD MLOAD DUP4 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 MLOAD PUSH2 0x1C42 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x59B3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x19B3 JUMP JUMPDEST POP JUMPDEST PUSH1 0x75 SLOAD DUP2 LT ISZERO PUSH2 0x1CD1 JUMPI PUSH1 0x75 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x1C71 SWAP1 PUSH1 0x1 PUSH2 0x2EC5 JUMP JUMPDEST SWAP1 POP PUSH1 0x75 DUP1 SLOAD DUP1 PUSH2 0x1C7E JUMPI INVALID JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 DUP3 ADD PUSH1 0x0 NOT SWAP1 DUP2 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xB8 SHL SUB NOT AND SWAP1 SSTORE SWAP1 SWAP2 ADD SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD DUP3 SWAP2 PUSH32 0x99FA473FDF53414BCD014CF6E7509FC58C68F7B86174767FAA6AD5100CD5BAE5 SWAP2 LOG2 POP PUSH2 0x1C56 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1CDB PUSH2 0x2EED JUMP JUMPDEST SWAP1 POP PUSH2 0x3E8 DUP2 GT ISZERO PUSH2 0xC70 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x54E2 JUMP JUMPDEST PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x18C1996D PUSH1 0xE2 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x630665B4 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1D53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1D67 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x8C1 SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST PUSH2 0x1D93 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1DA4 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0x1DD3 JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1DC8 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0x1DF8 JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1DED PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0x1E14 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4EF6 JUMP JUMPDEST PUSH2 0x1E1C PUSH2 0x281C JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x6A3FD4F9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x6A3FD4F9 SWAP1 PUSH2 0x1E4C SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4AE0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E64 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1E78 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1E9C SWAP2 SWAP1 PUSH2 0x4792 JUMP JUMPDEST PUSH2 0x1EB8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5586 JUMP JUMPDEST PUSH2 0x1ED2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH4 0x80AC58CD PUSH1 0xE0 SHL PUSH2 0x288A JUMP JUMPDEST PUSH2 0x1EEE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4D7F JUMP JUMPDEST PUSH2 0x1EF9 PUSH1 0x70 DUP5 PUSH2 0x2F7F JUMP JUMPDEST PUSH2 0x1F08 JUMPI PUSH2 0x1F08 PUSH1 0x70 DUP5 PUSH2 0x2FD0 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1F37 JUMPI PUSH2 0x1F2F DUP5 DUP5 DUP5 DUP5 DUP2 DUP2 LT PUSH2 0x1F23 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH2 0x3098 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x1F0B JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x51541DC4B4C08A16085809CCCDC4CC77D8000B60FBB00142E57F236D84298675 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH2 0x1F73 SWAP3 SWAP2 SWAP1 PUSH2 0x4CBA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP JUMP JUMPDEST PUSH2 0x1F88 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1F99 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1FBF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH2 0x1FC7 PUSH2 0x281C JUMP JUMPDEST PUSH2 0xD10 DUP2 PUSH2 0x31E9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8C1 PUSH2 0x27B2 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1FF1 PUSH2 0x7E5 JUMP JUMPDEST PUSH2 0x200D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5917 JUMP JUMPDEST PUSH2 0x2015 PUSH2 0xA4B JUMP JUMPDEST PUSH2 0x2031 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5229 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x6A SLOAD PUSH1 0x40 MLOAD PUSH4 0x13A54BF3 PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x9D2A5F98 SWAP2 PUSH2 0x206A SWAP2 PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x4 ADD PUSH2 0x5A7B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2084 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2098 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x20BC SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE PUSH1 0x73 SLOAD SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x214C JUMPI PUSH1 0x73 SLOAD PUSH1 0x6D SLOAD PUSH1 0x40 MLOAD PUSH4 0x266FCE1F PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x4CDF9C3E SWAP2 PUSH2 0x2119 SWAP2 DUP6 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x59F1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2133 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2147 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x2155 DUP2 PUSH2 0x325A JUMP JUMPDEST PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x21CD JUMPI PUSH1 0x74 SLOAD PUSH1 0x6D SLOAD PUSH1 0x40 MLOAD PUSH4 0x2BA83963 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x575072C6 SWAP2 PUSH2 0x219A SWAP2 DUP6 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x59F1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x21B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x21C8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x21DD PUSH2 0x21D8 PUSH2 0x2D24 JUMP JUMPDEST PUSH2 0x298D JUMP JUMPDEST PUSH1 0x6D SSTORE PUSH2 0x21E8 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x9C4163ECE98173EAB9A496C4DB8BF3E2C8EDCC5D2854377880597CCB858B7A9D DUP3 PUSH1 0x40 MLOAD PUSH2 0x2220 SWAP2 SWAP1 PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x6D SLOAD PUSH2 0x2233 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC61852C20F0B03B31D782F3022F2BF20322AC17CE66C5349FB6E24740CDD6456 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP JUMP JUMPDEST PUSH2 0x2273 PUSH2 0x43F5 JUMP JUMPDEST PUSH1 0x75 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x2280 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP4 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 SWAP3 DIV PUSH1 0xFF AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x22D8 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x22E9 PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x230F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x2335 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4EB0 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x23AA JUMPI POP PUSH2 0x23AA PUSH2 0x2D28 JUMP JUMPDEST DUP1 PUSH2 0x23B8 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x23D4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x52FB JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x23FF JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH2 0x2425 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5121 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x244B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x56C4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x2471 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4F79 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x2497 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x51B0 JUMP JUMPDEST PUSH1 0x66 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP10 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SWAP3 SSTORE PUSH1 0x67 DUP1 SLOAD DUP9 DUP5 AND SWAP1 DUP4 AND OR SWAP1 SSTORE PUSH1 0x69 DUP1 SLOAD DUP7 DUP5 AND SWAP1 DUP4 AND OR SWAP1 SSTORE PUSH1 0x68 DUP1 SLOAD SWAP3 DUP8 AND SWAP3 SWAP1 SWAP2 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x24EA DUP8 PUSH2 0x2D4C JUMP JUMPDEST PUSH2 0x24F2 PUSH2 0x37E7 JUMP JUMPDEST PUSH2 0x24FC PUSH1 0x6E PUSH2 0x3879 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 MLOAD DUP2 LT ISZERO PUSH2 0x252C JUMPI PUSH2 0x2524 DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2517 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x29D4 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x24FF JUMP JUMPDEST POP PUSH1 0x6C DUP8 SWAP1 SSTORE PUSH1 0x6D DUP9 SWAP1 SSTORE PUSH2 0x2541 PUSH1 0x70 PUSH2 0x3879 JUMP JUMPDEST PUSH2 0x254C PUSH2 0x708 PUSH2 0x31E9 JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xF9632D212436344A25150FF0C161DABF412AADE556621C2DEA146CA63FF643F5 DUP10 DUP10 DUP9 DUP9 DUP9 DUP9 PUSH1 0x40 MLOAD PUSH2 0x258F SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x59FF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x6D SLOAD PUSH2 0x25A2 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC61852C20F0B03B31D782F3022F2BF20322AC17CE66C5349FB6E24740CDD6456 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 DUP1 ISZERO PUSH2 0xC6B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x25FA PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x260B PUSH2 0x1490 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2631 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5487 JUMP JUMPDEST PUSH1 0x75 SLOAD PUSH1 0xFF DUP3 AND LT PUSH2 0x2655 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5349 JUMP JUMPDEST PUSH1 0x1 DUP3 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND GT ISZERO PUSH2 0x267D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4FC3 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x26A4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x526F JUMP JUMPDEST DUP2 PUSH1 0x75 DUP3 PUSH1 0xFF AND DUP2 SLOAD DUP2 LT PUSH2 0x26B5 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 DUP5 MLOAD SWAP3 ADD DUP1 SLOAD SWAP2 DUP6 ADD MLOAD PUSH1 0x40 SWAP1 SWAP6 ADD MLOAD PUSH1 0xFF AND PUSH1 0x1 PUSH1 0xB0 SHL MUL PUSH1 0xFF PUSH1 0xB0 SHL NOT PUSH2 0xFFFF SWAP1 SWAP7 AND PUSH1 0x1 PUSH1 0xA0 SHL MUL PUSH2 0xFFFF PUSH1 0xA0 SHL NOT PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP4 SWAP1 SWAP4 AND SWAP2 SWAP1 SWAP2 OR SWAP4 SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE PUSH2 0x2724 PUSH2 0x2EED JUMP JUMPDEST SWAP1 POP PUSH2 0x3E8 DUP2 GT ISZERO PUSH2 0x2748 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x54E2 JUMP JUMPDEST DUP3 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC1BF93444A0055A24A7D0154B75FEDF78EDFE355C06A2CE8E47F9F3908720559 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 MLOAD PUSH2 0x1F73 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x59D2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x27BD PUSH2 0x2871 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x27C9 PUSH2 0x2D24 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 GT ISZERO PUSH2 0x27DE JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x7F1 JUMP JUMPDEST PUSH2 0x27E8 DUP3 DUP3 PUSH2 0x2EC5 JUMP JUMPDEST SWAP3 POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2804 PUSH8 0xDE0B6B3A7640000 DUP6 PUSH2 0x38BD JUMP JUMPDEST SWAP1 POP PUSH2 0x2810 DUP2 DUP5 PUSH2 0x38F7 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2826 PUSH2 0x3939 JUMP JUMPDEST PUSH1 0x6A SLOAD SWAP1 SWAP2 POP PUSH5 0x100000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND ISZERO DUP1 PUSH2 0x2855 JUMPI POP PUSH1 0x6A SLOAD PUSH5 0x100000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP2 LT JUMPDEST PUSH2 0xD10 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5842 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8C1 PUSH1 0x6C SLOAD PUSH1 0x6D SLOAD PUSH2 0x2CFF SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2895 DUP4 PUSH2 0x393D JUMP JUMPDEST DUP1 ISZERO PUSH2 0x28A6 JUMPI POP PUSH2 0x28A6 DUP4 DUP4 PUSH2 0x3970 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 PUSH1 0x0 ADD SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x28CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x28F5 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x2938 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST ISZERO PUSH2 0x2984 JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x294A JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x20 SWAP2 DUP3 MUL SWAP3 SWAP1 SWAP3 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP1 DUP9 ADD SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP3 SWAP1 SWAP2 ADD SWAP2 AND PUSH2 0x2916 JUMP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x29B1 PUSH1 0x6C SLOAD PUSH2 0x29AB PUSH1 0x6D SLOAD DUP7 PUSH2 0x2EC5 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 PUSH2 0x3996 JUMP JUMPDEST SWAP1 POP PUSH2 0x28A6 PUSH2 0x29CB PUSH1 0x6C SLOAD DUP4 PUSH2 0x38BD SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x6D SLOAD SWAP1 PUSH2 0x2CFF JUMP JUMPDEST PUSH2 0x29E6 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x39C8 JUMP JUMPDEST PUSH2 0x2A02 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x538F JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x6A3FD4F9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x6A3FD4F9 SWAP1 PUSH2 0x2A32 SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH2 0x4AE0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2A4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2A5E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2A82 SWAP2 SWAP1 PUSH2 0x4792 JUMP JUMPDEST PUSH2 0x2A9E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5586 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x4 DUP2 MSTORE PUSH1 0x24 DUP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0xE0 SHL OR SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x60 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP2 PUSH2 0x2AE2 SWAP2 PUSH2 0x4ABB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x2B1D JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x2B22 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x2B44 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x52B8 JUMP JUMPDEST PUSH2 0x2B4F PUSH1 0x6E DUP5 PUSH2 0x2FD0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH32 0xBCD6D991F3416E288BF59A2997B423772937B62C7EA7DD1A54AF7771DE1F7418 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x2BAA JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO ISZERO JUMPDEST PUSH2 0x2BC6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4E0F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 AND SWAP1 DUP3 AND EQ PUSH2 0x2C04 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4E38 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD SWAP6 DUP6 AND DUP4 MSTORE SWAP1 DUP3 KECCAK256 DUP1 SLOAD SWAP6 SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP6 DUP7 AND OR SWAP1 SWAP4 SSTORE MSTORE DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x2C73 SWAP2 PUSH2 0x4415 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH32 0xCD64D9DACD230C5CCF1278EA5332B0621AA28C950FB0E61C8FBC9E2011C88A34 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP2 GT PUSH2 0x2CCA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x540F JUMP JUMPDEST PUSH1 0x76 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0xC44C7222E8DF09744CED394101DF47E78DEDB642D3065267BB388901DE9DF6D4 SWAP1 PUSH2 0xA29 SWAP1 DUP4 SWAP1 PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x28A6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4F42 JUMP JUMPDEST TIMESTAMP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x12D7 ADDRESS PUSH2 0x39C8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2D3D PUSH2 0x2871 JUMP JUMPDEST PUSH2 0x2D45 PUSH2 0x2D24 JUMP JUMPDEST LT ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 GT PUSH2 0x2D6C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x500B JUMP JUMPDEST PUSH1 0x6C DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0xD379C1A7282461E725A9DC2D74E65246C77E98AE93835E26C2F1654C48EE4EC SWAP1 PUSH2 0xA29 SWAP1 DUP4 SWAP1 PUSH2 0x4AD7 JUMP JUMPDEST DUP1 ISZERO DUP1 PUSH2 0x2E29 JUMPI POP PUSH1 0x40 MLOAD PUSH4 0x6EB1769F PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH4 0xDD62ED3E SWAP1 PUSH2 0x2DD7 SWAP1 ADDRESS SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4AF4 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2DEF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2E03 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2E27 SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST ISZERO JUMPDEST PUSH2 0x2E45 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x57A6 JUMP JUMPDEST PUSH2 0xF6A DUP4 PUSH4 0x95EA7B3 PUSH1 0xE0 SHL DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2E64 SWAP3 SWAP2 SWAP1 PUSH2 0x4BC4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE PUSH2 0x39CE JUMP JUMPDEST PUSH1 0x0 PUSH5 0x100000000 DUP3 LT PUSH2 0x2EC1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x55F8 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2EE7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x50EA JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x75 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP2 JUMPDEST DUP2 DUP2 PUSH1 0xFF AND LT ISZERO PUSH2 0x2F77 JUMPI PUSH2 0x2F0A PUSH2 0x43F5 JUMP JUMPDEST PUSH1 0x75 DUP3 PUSH1 0xFF AND DUP2 SLOAD DUP2 LT PUSH2 0x2F1A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP3 ADD MSTORE SWAP2 POP PUSH2 0x2F6C SWAP1 DUP6 SWAP1 PUSH2 0x2CFF JUMP JUMPDEST SWAP4 POP POP PUSH1 0x1 ADD PUSH2 0x2EF7 JUMP JUMPDEST POP SWAP1 SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x2FA3 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x28A6 JUMPI POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD AND ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x2FF2 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO ISZERO JUMPDEST PUSH2 0x300E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x4E0F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x3048 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x55D1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE DUP4 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP6 DUP7 AND DUP1 DUP6 MSTORE SWAP3 DUP5 KECCAK256 DUP1 SLOAD SWAP7 SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP7 DUP8 AND OR SWAP1 SSTORE SWAP2 DUP4 SWAP1 MSTORE DUP2 SLOAD SWAP1 SWAP4 AND SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x31A9108F PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND SWAP2 DUP5 AND SWAP1 PUSH4 0x6352211E SWAP1 PUSH2 0x30CB SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x30E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x30F7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x311B SWAP2 SWAP1 PUSH2 0x450E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x3141 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x595E JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 LT ISZERO PUSH2 0x31BC JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP4 SWAP2 SWAP1 DUP4 SWAP1 DUP2 LT PUSH2 0x318B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD EQ ISZERO PUSH2 0x31B4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x57FC JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x3144 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE SWAP1 DUP4 MSTORE SWAP2 KECCAK256 ADD SSTORE JUMP JUMPDEST PUSH1 0x3C DUP2 PUSH4 0xFFFFFFFF AND GT PUSH2 0x320F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x58CB JUMP JUMPDEST PUSH1 0x6B DUP1 SLOAD PUSH4 0xFFFFFFFF NOT AND PUSH4 0xFFFFFFFF DUP4 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x4F27F6F220FFAD585E728389BC2F0F6B74EEEBEB43F95F53752A647CB6E7E687 SWAP3 PUSH2 0xA29 SWAP3 AND SWAP1 PUSH2 0x5A7B JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xE6D8A94B PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xE6D8A94B SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x32A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x32B4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x32D8 SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST SWAP1 POP PUSH2 0x32E3 DUP2 PUSH2 0x3A5D JUMP JUMPDEST SWAP1 POP PUSH1 0x67 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3333 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3347 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x336B SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST PUSH2 0x339E JUMPI PUSH1 0x40 MLOAD PUSH32 0x3728FEB3FC1EF1BF4A24036AFBE7D34B59C551BF0D2AB5564E87EC1734FA80DD SWAP1 PUSH1 0x0 SWAP1 LOG1 POP PUSH2 0xD10 JUMP JUMPDEST PUSH1 0x79 SLOAD PUSH1 0x76 SLOAD PUSH1 0xFF SWAP1 SWAP2 AND SWAP1 PUSH1 0x60 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x33C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x33ED JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x7A SLOAD SWAP1 SWAP2 POP DUP6 SWAP1 PUSH1 0x0 SWAP1 DUP2 SWAP1 JUMPDEST DUP6 DUP4 LT ISZERO PUSH2 0x3598 JUMPI PUSH1 0x67 SLOAD PUSH1 0x40 MLOAD PUSH4 0x3B304147 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x3B304147 SWAP1 PUSH2 0x3435 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x344D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3461 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3485 SWAP2 SWAP1 PUSH2 0x450E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x78 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND PUSH2 0x34E0 JUMPI DUP1 DUP7 DUP6 DUP1 PUSH1 0x1 ADD SWAP7 POP DUP2 MLOAD DUP2 LT PUSH2 0x34BB JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP PUSH2 0x3559 JUMP JUMPDEST DUP2 DUP4 PUSH1 0x1 ADD SWAP4 POP DUP4 LT PUSH2 0x3559 JUMPI PUSH32 0xB5F728FCB182000EB8E953C15F6795F07B6CDA75B35EF0B65645B53AAC636945 DUP5 PUSH1 0x40 MLOAD PUSH2 0x351C SWAP2 SWAP1 PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP4 PUSH2 0x3553 JUMPI PUSH1 0x40 MLOAD PUSH32 0x3728FEB3FC1EF1BF4A24036AFBE7D34B59C551BF0D2AB5564E87EC1734FA80DD SWAP1 PUSH1 0x0 SWAP1 LOG1 JUMPDEST POP PUSH2 0x3598 JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH2 0x209 MUL DUP7 PUSH2 0x1F3 ADD ADD PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x3576 SWAP2 SWAP1 PUSH2 0x4AD7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SWAP6 POP PUSH2 0x33FC SWAP2 POP POP JUMP JUMPDEST PUSH2 0x35B5 DUP6 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x35A8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x3B0A JUMP JUMPDEST PUSH1 0x0 DUP8 PUSH2 0x35CB JUMPI PUSH2 0x35C6 DUP10 DUP6 PUSH2 0x3996 JUMP JUMPDEST PUSH2 0x35D5 JUMP JUMPDEST PUSH2 0x35D5 DUP10 DUP9 PUSH2 0x3996 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x360F JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x360D JUMPI PUSH2 0x3605 DUP8 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x35F7 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP4 PUSH2 0x3C7A JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x35E0 JUMP JUMPDEST POP JUMPDEST PUSH1 0x77 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x37BE JUMPI PUSH1 0x0 PUSH2 0x3626 PUSH1 0x6E PUSH2 0x3CE7 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x365C JUMPI POP PUSH2 0x3646 PUSH1 0x6E PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x37B8 JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP3 PUSH4 0x70A08231 SWAP3 PUSH2 0x3694 SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4AE0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x36AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x36C0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x36E4 SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP11 PUSH2 0x36FC JUMPI PUSH2 0x36F7 DUP3 DUP9 PUSH2 0x3996 JUMP JUMPDEST PUSH2 0x3706 JUMP JUMPDEST PUSH2 0x3706 DUP3 DUP12 PUSH2 0x3996 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x37A4 JUMPI PUSH1 0x0 JUMPDEST DUP8 DUP2 LT ISZERO PUSH2 0x37A2 JUMPI PUSH1 0x66 SLOAD DUP11 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x2B0AB144 SWAP1 DUP13 SWAP1 DUP5 SWAP1 DUP2 LT PUSH2 0x373C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP7 DUP6 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3764 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4B75 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x377E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3792 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0x3711 SWAP1 POP JUMP JUMPDEST POP JUMPDEST PUSH2 0x37AF PUSH1 0x6E DUP5 PUSH2 0x3D0A JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x3629 JUMP JUMPDEST POP PUSH2 0x37DB JUMP JUMPDEST PUSH2 0x37DB DUP7 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x37CE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x3D2D JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3800 JUMPI POP PUSH2 0x3800 PUSH2 0x2D28 JUMP JUMPDEST DUP1 PUSH2 0x380E JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x382A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x52FB JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3855 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x385D PUSH2 0x3E79 JUMP JUMPDEST PUSH2 0x3865 PUSH2 0x3EFA JUMP JUMPDEST DUP1 ISZERO PUSH2 0xD10 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST DUP1 SLOAD ISZERO PUSH2 0x3898 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x54BC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP2 DUP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x38CC JUMPI POP PUSH1 0x0 PUSH2 0x794 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x38D9 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x28A6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5446 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28A6 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x3FD4 JUMP JUMPDEST NUMBER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3950 DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3970 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x794 JUMPI POP PUSH2 0x3969 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3970 JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x397F DUP6 DUP6 PUSH2 0x400B JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x398D JUMPI POP DUP1 JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x39B7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x51F2 JUMP JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x39C0 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x3A23 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x4100 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xF6A JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x3A41 SWAP2 SWAP1 PUSH2 0x4792 JUMP JUMPDEST PUSH2 0xF6A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5709 JUMP JUMPDEST PUSH1 0x75 SLOAD PUSH1 0x0 SWAP1 DUP3 SWAP1 DUP3 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x3B01 JUMPI PUSH2 0x3A77 PUSH2 0x43F5 JUMP JUMPDEST PUSH1 0x75 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x3A84 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP4 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP5 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP3 DUP5 ADD DUP4 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP4 ADD MSTORE SWAP1 SWAP3 POP PUSH2 0x3AD6 SWAP1 DUP7 SWAP1 PUSH2 0x410F JUMP JUMPDEST SWAP1 POP PUSH2 0x3AEB DUP3 PUSH1 0x0 ADD MLOAD DUP3 DUP5 PUSH1 0x40 ADD MLOAD PUSH2 0x4123 JUMP JUMPDEST PUSH2 0x3AF5 DUP8 DUP3 PUSH2 0x2EC5 JUMP JUMPDEST SWAP7 POP POP POP PUSH1 0x1 ADD PUSH2 0x3A67 JUMP JUMPDEST POP SWAP3 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3B16 PUSH1 0x70 PUSH2 0x3CE7 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x3B4C JUMPI POP PUSH2 0x3B36 PUSH1 0x70 PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x3C70 JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP3 PUSH4 0x70A08231 SWAP3 PUSH2 0x3B84 SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4AE0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3B9C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3BB0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3BD4 SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x3C5D JUMPI PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SWAP1 MLOAD PUSH4 0x16960D55 PUSH1 0xE0 SHL DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x16960D55 SWAP2 PUSH2 0x3C22 SWAP2 DUP8 SWAP2 DUP8 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B0E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3C3C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3C50 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x3C5D DUP3 PUSH2 0x2C52 JUMP JUMPDEST PUSH2 0x3C68 PUSH1 0x70 DUP4 PUSH2 0x3D0A JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3B19 JUMP JUMPDEST PUSH2 0xFCB PUSH1 0x70 PUSH2 0x412E JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x67 SLOAD PUSH1 0x40 MLOAD PUSH4 0x358DC31D PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 PUSH4 0x6B1B863A SWAP3 PUSH2 0x3CB1 SWAP3 DUP8 SWAP3 DUP8 SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4BDD JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3CCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3CDF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3D39 PUSH1 0x6E PUSH2 0x3CE7 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x3D6F JUMPI POP PUSH2 0x3D59 PUSH1 0x6E PUSH2 0x3D04 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0xFCB JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP3 PUSH4 0x70A08231 SWAP3 PUSH2 0x3DA7 SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4AE0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3DBF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3DD3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3DF7 SWAP2 SWAP1 PUSH2 0x48BD JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x3E66 JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0xAC2AC51 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x2B0AB144 SWAP1 PUSH2 0x3E33 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B75 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3E4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3E61 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x3E71 PUSH1 0x6E DUP4 PUSH2 0x3D0A JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3D3C JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3E92 JUMPI POP PUSH2 0x3E92 PUSH2 0x2D28 JUMP JUMPDEST DUP1 PUSH2 0x3EA0 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3EBC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x52FB JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3865 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xD10 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3F13 JUMPI POP PUSH2 0x3F13 PUSH2 0x2D28 JUMP JUMPDEST DUP1 PUSH2 0x3F21 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3F3D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x52FB JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3F68 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x3F72 PUSH2 0x2818 JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0xD10 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x3FF5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP2 SWAP1 PUSH2 0x4D4C JUMP JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x4001 JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x4029 SWAP2 SWAP1 PUSH2 0x4D37 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x7530 DUP5 PUSH1 0x40 MLOAD PUSH2 0x407D SWAP2 SWAP1 PUSH2 0x4ABB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x40B9 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x40BE JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x40DC JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x40F9 JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x40F1 SWAP2 SWAP1 PUSH2 0x4792 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x2810 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x41CA JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28A6 PUSH2 0xFFFF DUP4 AND DUP5 MUL PUSH2 0x3E8 PUSH2 0x3996 JUMP JUMPDEST PUSH2 0xF6A DUP4 DUP4 DUP4 PUSH2 0x428B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP1 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x416C JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST ISZERO PUSH2 0x41A2 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP4 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP2 AND SWAP1 SWAP2 SSTORE AND PUSH2 0x414A JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE DUP3 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x41EC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x516A JUMP JUMPDEST PUSH2 0x41F5 DUP6 PUSH2 0x39C8 JUMP JUMPDEST PUSH2 0x4211 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x563E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD PUSH2 0x422E SWAP2 SWAP1 PUSH2 0x4ABB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x426B JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4270 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x4280 DUP3 DUP3 DUP7 PUSH2 0x43BC JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4EB1C245 PUSH1 0xE1 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x9D63848A SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x42D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x42E4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x430C SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x4628 JUMP JUMPDEST SWAP1 POP DUP1 MLOAD DUP3 PUSH1 0xFF AND GT ISZERO PUSH2 0x4332 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP1 PUSH2 0x5675 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH1 0xFF AND DUP2 MLOAD DUP2 LT PUSH2 0x4343 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x358DC31D PUSH1 0xE1 SHL DUP2 MSTORE SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x6B1B863A SWAP1 PUSH2 0x4383 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4BDD JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x439D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x43B1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x43CB JUMPI POP DUP2 PUSH2 0x28A6 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x43DB JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST DUP2 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x835 SWAP2 SWAP1 PUSH2 0x4D4C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST POP DUP1 SLOAD PUSH1 0x0 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0xD10 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x2EC1 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x442F JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x4454 JUMPI DUP1 DUP2 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x446B JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x40F9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4496 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x44A0 PUSH1 0x60 PUSH2 0x5A8C JUMP JUMPDEST SWAP1 POP DUP2 CALLDATALOAD PUSH2 0x44AD DUP2 PUSH2 0x5AFF JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH2 0xFFFF DUP2 AND DUP2 EQ PUSH2 0x44C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x44D6 DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x44E1 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x794 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4503 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x28A6 DUP2 PUSH2 0x5AFF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x451F JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x28A6 DUP2 PUSH2 0x5AFF JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x453F JUMPI DUP3 DUP4 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x454A DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x455A DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x4571 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x458E JUMPI DUP1 DUP2 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x4599 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x45A9 DUP2 PUSH2 0x5B14 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x45C6 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x45D1 DUP2 PUSH2 0x5AFF JUMP JUMPDEST PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD MLOAD SWAP3 SWAP5 SWAP3 SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x45F6 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x4601 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x4618 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x4571 DUP2 PUSH2 0x5AFF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x463A JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4650 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x4660 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 MLOAD PUSH2 0x4673 PUSH2 0x466E DUP3 PUSH2 0x5AB3 JUMP JUMPDEST PUSH2 0x5A8C JUMP JUMPDEST DUP2 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP4 DUP6 ADD DUP6 DUP5 MUL DUP6 ADD DUP7 ADD DUP10 LT ISZERO PUSH2 0x468F JUMPI DUP7 DUP8 REVERT JUMPDEST DUP7 SWAP5 POP JUMPDEST DUP4 DUP6 LT ISZERO PUSH2 0x46BA JUMPI DUP1 MLOAD PUSH2 0x46A6 DUP2 PUSH2 0x5AFF JUMP JUMPDEST DUP4 MSTORE PUSH1 0x1 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP2 DUP6 ADD SWAP2 DUP6 ADD PUSH2 0x4693 JUMP JUMPDEST POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x46D8 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x46EE JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x46FA DUP6 DUP3 DUP7 ADD PUSH2 0x4443 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4718 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x472F JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x4742 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x4750 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 PUSH1 0x60 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x4764 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4787 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x28A6 DUP2 PUSH2 0x5B14 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x47A3 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x28A6 DUP2 PUSH2 0x5B14 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x47BF JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND DUP2 EQ PUSH2 0x28A6 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x47E8 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x47F3 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x45A9 DUP2 PUSH2 0x5AFF JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4817 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x4822 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x483D JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x4849 DUP7 DUP3 DUP8 ADD PUSH2 0x4443 JUMP JUMPDEST SWAP5 SWAP8 SWAP1 SWAP7 POP SWAP4 SWAP5 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4867 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x28A6 DUP4 DUP4 PUSH2 0x4485 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x80 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4883 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x488D DUP5 DUP5 PUSH2 0x4485 JUMP JUMPDEST SWAP2 POP PUSH2 0x489C DUP5 PUSH1 0x60 DUP6 ADD PUSH2 0x44E1 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x48B6 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x48CE JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x48EF JUMPI DUP5 DUP6 REVERT JUMPDEST DUP8 CALLDATALOAD SWAP7 POP PUSH1 0x20 DUP1 DUP10 ADD CALLDATALOAD SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x4909 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD PUSH2 0x4919 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH2 0x4929 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP4 POP PUSH1 0xA0 DUP10 ADD CALLDATALOAD PUSH2 0x4939 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP3 POP PUSH1 0xC0 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4954 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP10 ADD PUSH1 0x1F DUP2 ADD DUP12 SGT PUSH2 0x4964 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x4972 PUSH2 0x466E DUP3 PUSH2 0x5AB3 JUMP JUMPDEST DUP2 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP4 DUP6 ADD DUP6 DUP5 MUL DUP6 ADD DUP7 ADD DUP16 LT ISZERO PUSH2 0x498E JUMPI DUP7 DUP8 REVERT JUMPDEST DUP7 SWAP5 POP JUMPDEST DUP4 DUP6 LT ISZERO PUSH2 0x49B9 JUMPI DUP1 CALLDATALOAD PUSH2 0x49A5 DUP2 PUSH2 0x5AFF JUMP JUMPDEST DUP4 MSTORE PUSH1 0x1 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP2 DUP6 ADD SWAP2 DUP6 ADD PUSH2 0x4992 JUMP JUMPDEST POP DUP1 SWAP6 POP POP POP POP POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x49E8 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP8 CALLDATALOAD SWAP7 POP PUSH1 0x20 DUP9 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH2 0x4A01 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP5 POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH2 0x4A11 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP4 POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH2 0x4A21 DUP2 PUSH2 0x5AFF JUMP JUMPDEST SWAP3 POP PUSH1 0xA0 DUP9 ADD CALLDATALOAD PUSH2 0x4A31 DUP2 PUSH2 0x5AFF JUMP JUMPDEST DUP1 SWAP3 POP POP PUSH1 0xC0 DUP9 ADD CALLDATALOAD SWAP1 POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4A59 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x28A6 DUP2 PUSH2 0x5B22 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4A76 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x4A81 DUP2 PUSH2 0x5B22 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH2 0x45A9 DUP2 PUSH2 0x5B22 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH2 0xFFFF AND SWAP1 DUP4 ADD MSTORE PUSH1 0x40 SWAP1 DUP2 ADD MLOAD PUSH1 0xFF AND SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x4ACD DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x5AD3 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND DUP3 MSTORE DUP4 AND PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 PUSH1 0x40 DUP4 ADD DUP2 SWAP1 MSTORE DUP4 SLOAD SWAP1 DUP4 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 DUP5 DUP2 MSTORE DUP3 DUP2 KECCAK256 SWAP1 SWAP3 SWAP1 SWAP2 PUSH1 0x80 DUP6 ADD SWAP2 SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4B67 JUMPI DUP5 SLOAD DUP5 MSTORE PUSH1 0x1 SWAP5 DUP6 ADD SWAP5 SWAP4 DUP4 ADD SWAP4 ADD PUSH2 0x4B4B JUMP JUMPDEST POP SWAP2 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND DUP2 MSTORE SWAP3 DUP5 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 SWAP2 AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE SWAP1 DUP4 AND PUSH1 0x40 DUP4 ADD MSTORE SWAP1 SWAP2 AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4C6C JUMPI DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x4C47 JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4C6C JUMPI PUSH2 0x4CA7 DUP4 DUP6 MLOAD PUSH2 0x4A92 JUMP JUMPDEST SWAP3 DUP5 ADD SWAP3 PUSH1 0x60 SWAP3 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x4C94 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xFB SHL SUB DUP4 GT ISZERO PUSH2 0x4CD9 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH1 0x20 DUP4 MUL DUP1 DUP6 PUSH1 0x40 DUP6 ADD CALLDATACOPY SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP1 DUP2 MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4C6C JUMPI DUP4 MLOAD DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x4D10 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x4D6B DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x5AD3 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x24 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6572633732312D696E76 PUSH1 0x40 DUP3 ADD MSTORE PUSH4 0x185B1A59 PUSH1 0xE2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2C SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F746F6B656E2D6C697374 PUSH1 0x40 DUP3 ADD MSTORE PUSH12 0x195B995C8B5A5B9D985B1A59 PUSH1 0xA2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xF SWAP1 DUP3 ADD MSTORE PUSH15 0x496E76616C69642061646472657373 PUSH1 0x88 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x13 SWAP1 DUP3 ADD MSTORE PUSH19 0x496E76616C6964207072657641646472657373 PUSH1 0x68 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2B SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A652D70657269 PUSH1 0x40 DUP3 ADD MSTORE PUSH11 0x37B216B737BA16B7BB32B9 PUSH1 0xA9 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x646472657373 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2C SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6F6E6C792D6F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH12 0x16B7B916B634B9BA32B732B9 PUSH1 0xA1 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2A SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F73706F6E736F72736869 PUSH1 0x40 DUP3 ADD MSTORE PUSH10 0x702D6E6F742D7A65726F PUSH1 0xB0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x28 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH8 0x34BA16BA37B5B2B7 PUSH1 0xC1 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x34 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A652D70657269 PUSH1 0x40 DUP3 ADD MSTORE PUSH20 0x6F642D677265617465722D7468616E2D7A65726F PUSH1 0x60 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6F6E6C792D7072697A65 PUSH1 0x40 DUP3 ADD MSTORE PUSH5 0xB5C1BDBDB PUSH1 0xDA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7472616E736665722D74 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x3796B9B2B633 PUSH1 0xD1 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1E SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x29 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A652D706F6F6C PUSH1 0x40 DUP3 ADD MSTORE PUSH9 0x2D6E6F742D7A65726F PUSH1 0xB8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x416464726573733A20696E73756666696369656E742062616C616E636520666F PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x1C8818D85B1B PUSH1 0xD2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x22 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D7A65 PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x726F PUSH1 0xF0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1A SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D636F PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x6D706C657465 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x29 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH9 0x1A5D0B5D185C99D95D PUSH1 0xBA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x23 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F65726332302D696E7661 PUSH1 0x40 DUP3 ADD MSTORE PUSH3 0x1B1A59 PUSH1 0xEA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2E SWAP1 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x40 DUP3 ADD MSTORE PUSH14 0x191E481A5B9A5D1A585B1A5E9959 PUSH1 0x92 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F6E6F6E6578697374656E742D7072697A PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x195CDC1B1A5D PUSH1 0xD2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F65726332302D6E756C6C PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2B SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D616C72656164 PUSH1 0x40 DUP3 ADD MSTORE PUSH11 0x1E4B5C995C5D595CDD1959 PUSH1 0xAA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1F SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F77696E6E6572732D6774652D6F6E6500 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x21 SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206D756C7469706C69636174696F6E206F766572666C6F PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x77 PUSH1 0xF8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xC SWAP1 DUP3 ADD MSTORE PUSH12 0x105B1C9958591E481A5B9A5D PUSH1 0xA2 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x33 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH19 0x1A5D0B5C195C98D95B9D1859D94B5D1BDD185B PUSH1 0x6A SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x31 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6265666F726541776172 PUSH1 0x40 DUP3 ADD MSTORE PUSH17 0x19131A5CDD195B995C8B5A5B9D985B1A59 PUSH1 0x7A SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2B SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F63616E6E6F742D617761 PUSH1 0x40 DUP3 ADD MSTORE PUSH11 0x1C990B595E1D195C9B985B PUSH1 0xAA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xD SWAP1 DUP3 ADD MSTORE PUSH13 0x105B1C9958591E481859191959 PUSH1 0x9A SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x53616665436173743A2076616C756520646F65736E27742066697420696E2033 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x322062697473 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2F SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F61776172642D696E7661 PUSH1 0x40 DUP3 ADD MSTORE PUSH15 0xD8D2C85AE8DED6CADC5AD2DCC8CAF PUSH1 0x8B SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7469636B65742D6E6F74 PUSH1 0x40 DUP3 ADD MSTORE PUSH5 0x2D7A65726F PUSH1 0xD8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2A SWAP1 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A204552433230206F7065726174696F6E20646964206E PUSH1 0x40 DUP3 ADD MSTORE PUSH10 0x1BDD081CDD58D8D95959 PUSH1 0xB2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x33 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A655374726174 PUSH1 0x40 DUP3 ADD MSTORE PUSH19 0x1959DE531A5CDD195B995C8B5A5B9D985B1A59 PUSH1 0x6A SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x36 SWAP1 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A20617070726F76652066726F6D206E6F6E2D7A65726F PUSH1 0x40 DUP3 ADD MSTORE PUSH22 0x20746F206E6F6E2D7A65726F20616C6C6F77616E6365 PUSH1 0x50 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6572633732312D647570 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x6C6963617465 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x23 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D696E2D666C69 PUSH1 0x40 DUP3 ADD MSTORE PUSH3 0x19DA1D PUSH1 0xEA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D7469 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x1B59591BDD5D PUSH1 0xD2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2C SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D74696D656F75 PUSH1 0x40 DUP3 ADD MSTORE PUSH12 0x742D67742D36302D73656373 PUSH1 0xA0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x27 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D7265 PUSH1 0x40 DUP3 ADD MSTORE PUSH7 0x1C5D595CDD1959 PUSH1 0xCA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x27 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F756E617661696C61626C PUSH1 0x40 DUP3 ADD MSTORE PUSH7 0x3296BA37B5B2B7 PUSH1 0xC9 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x794 DUP3 DUP5 PUSH2 0x4A92 JUMP JUMPDEST PUSH2 0xFFFF SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0xFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH2 0xFFFF SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0xFF SWAP2 DUP3 AND PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP7 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP8 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x40 DUP5 ADD MSTORE DUP6 DUP2 AND PUSH1 0x60 DUP5 ADD MSTORE DUP5 DUP2 AND PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0xC0 PUSH1 0xA0 DUP5 ADD DUP2 SWAP1 MSTORE DUP5 MLOAD SWAP1 DUP5 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP3 DUP6 DUP2 ADD SWAP3 SWAP1 SWAP2 PUSH1 0xE0 DUP7 ADD SWAP1 DUP6 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x5A69 JUMPI DUP6 MLOAD DUP5 AND DUP4 MSTORE SWAP5 DUP5 ADD SWAP5 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x5A4B JUMP JUMPDEST POP SWAP1 SWAP13 SWAP12 POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5AAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x5AC9 JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5AEE JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x5AD6 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xC70 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xD10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xD10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xD10 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xBE CALLDATACOPY ISZERO 0x2A MSIZE RETURN DUP13 SUB 0xD6 PUSH12 0xA04FE9D77A5FB0E1EE0351E6 PUSH11 0x3DB2328C356197EDAD6473 PUSH16 0x6C634300060C00330000000000000000 ",
              "sourceMap": "247:290:56:-:0;;;341:65;;;;;;;;;;380:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;369:8:56;:32;;-1:-1:-1;;;;;;369:32:56;-1:-1:-1;;;;;369:32:56;;;;;;;;;;247:290;;;;;;;;;;:::o;:::-;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106100415760003560e01c8063022ec09514610046578063b3eeb5e21461006a578063efc81a8c14610120575b600080fd5b61004e610128565b604080516001600160a01b039092168252519081900360200190f35b61004e6004803603604081101561008057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100ab57600080fd5b8201836020820111156100bd57600080fd5b803590602001918460018302840111640100000000831117156100df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610137945050505050565b61004e6102b3565b6000546001600160a01b031681565b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a18251156102ac576000826001600160a01b0316846040518082805190602001908083835b602083106102035780518252601f1990920191602091820191016101e4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610265576040519150601f19603f3d011682016040523d82523d6000602084013e61026a565b606091505b50509050806102aa5760405162461bcd60e51b81526004018080602001828103825260248152602001806102de6024913960400191505060405180910390fd5b505b5092915050565b6000805460408051602081019091528281526102d8916001600160a01b031690610137565b90509056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a2646970667358221220502fb653b5e28d059579c4eb876de83d623b7114af0ca39e146bb36d9574328464736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x22EC095 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x6A JUMPI DUP1 PUSH4 0xEFC81A8C EQ PUSH2 0x120 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x128 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x137 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x4E PUSH2 0x2B3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x265 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x26A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2DE PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE DUP3 DUP2 MSTORE PUSH2 0x2D8 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x137 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 POP 0x2F 0xB6 MSTORE8 0xB5 0xE2 DUP14 SDIV SWAP6 PUSH26 0xC4EB876DE83D623B7114AF0CA39E146BB36D9574328464736F6C PUSH4 0x4300060C STOP CALLER ",
              "sourceMap": "247:290:56:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;305:31;;;:::i;:::-;;;;-1:-1:-1;;;;;305:31:56;;;;;;;;;;;;;;182:778:38;;;;;;;;;;;;;;;;-1:-1:-1;;;;;182:778:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;182:778:38;;-1:-1:-1;182:778:38;;-1:-1:-1;;;;;182:778:38:i;410:124:56:-;;;:::i;305:31::-;;;-1:-1:-1;;;;;305:31:56;;:::o;182:778:38:-;257:13;416:19;446:6;438:15;;416:37;;495:4;489:11;-1:-1:-1;;;514:5:38;507:81;620:11;613:4;606:5;602:16;595:37;-1:-1:-1;;;657:4:38;650:5;646:16;639:92;764:4;757:5;754:1;747:22;786:28;;;-1:-1:-1;;;;;786:28:38;;;;;;738:31;;-1:-1:-1;786:28:38;;-1:-1:-1;786:28:38;;;;;;;824:12;;:16;821:135;;851:12;868:5;-1:-1:-1;;;;;868:10:38;879:5;868:17;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;868:17:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;850:35;;;901:7;893:56;;;;-1:-1:-1;;;893:56:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;821:135;;182:778;;;;;:::o;410:124:56:-;446:15;514:8;;492:36;;;;;;;;;;;;;;-1:-1:-1;;;;;514:8:56;;492:13;:36::i;:::-;469:60;;410:124;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "164600",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "create()": "infinite",
                "deployMinimal(address,bytes)": "infinite",
                "instance()": "1015"
              }
            },
            "methodIdentifiers": {
              "create()": "efc81a8c",
              "deployMinimal(address,bytes)": "b3eeb5e2",
              "instance()": "022ec095"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"name\":\"ProxyCreated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract MultipleWinners\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"deployMinimal\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"instance\",\"outputs\":[{\"internalType\":\"contract MultipleWinners\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"title\":\"Creates a minimal proxy to the MultipleWinners prize strategy.  Very cheap to deploy.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/prize-strategy/multiple-winners/MultipleWinnersProxyFactory.sol\":\"MultipleWinnersProxyFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.6.0;\\n\\n/// @title Random Number Generator Interface\\n/// @notice Provides an interface for requesting random numbers from 3rd-party RNG services (Chainlink VRF, Starkware VDF, etc..)\\ninterface RNGInterface {\\n\\n  /// @notice Emitted when a new request for a random number has been submitted\\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\\n  /// @param sender The indexed address of the sender of the request\\n  event RandomNumberRequested(uint32 indexed requestId, address indexed sender);\\n\\n  /// @notice Emitted when an existing request for a random number has been completed\\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\\n  /// @param randomNumber The random number produced by the 3rd-party service\\n  event RandomNumberCompleted(uint32 indexed requestId, uint256 randomNumber);\\n\\n  /// @notice Gets the last request id used by the RNG service\\n  /// @return requestId The last request id used in the last request\\n  function getLastRequestId() external view returns (uint32 requestId);\\n\\n  /// @notice Gets the Fee for making a Request against an RNG service\\n  /// @return feeToken The address of the token that is used to pay fees\\n  /// @return requestFee The fee required to be paid to make a request\\n  function getRequestFee() external view returns (address feeToken, uint256 requestFee);\\n\\n  /// @notice Sends a request for a random number to the 3rd-party service\\n  /// @dev Some services will complete the request immediately, others may have a time-delay\\n  /// @dev Some services require payment in the form of a token, such as $LINK for Chainlink VRF\\n  /// @return requestId The ID of the request used to get the results of the RNG service\\n  /// @return lockBlock The block number at which the RNG service will start generating time-delayed randomness.  The calling contract\\n  /// should \\\"lock\\\" all activity until the result is available via the `requestId`\\n  function requestRandomNumber() external returns (uint32 requestId, uint32 lockBlock);\\n\\n  /// @notice Checks if the request for randomness from the 3rd-party service has completed\\n  /// @dev For time-delayed requests, this function is used to check/confirm completion\\n  /// @param requestId The ID of the request used to get the results of the RNG service\\n  /// @return isCompleted True if the request has completed and a random number is available, false otherwise\\n  function isRequestComplete(uint32 requestId) external view returns (bool isCompleted);\\n\\n  /// @notice Gets the random number produced by the 3rd-party service\\n  /// @param requestId The ID of the request used to get the results of the RNG service\\n  /// @return randomNum The random number\\n  function randomNumber(uint32 requestId) external returns (uint256 randomNum);\\n}\\n\",\"keccak256\":\"0xf917c68439d7476cd226f475e8fce940e0cf1d32cb0ff12e8537072a07f2b1da\",\"license\":\"GPL-3.0\"},\"contracts/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary Constants {\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC721 = 0x80ac58cd;\\n}\",\"keccak256\":\"0x5dc8f8bda4e9668a9ffae6a941774f849adcb368cc2275fd8a91e6ada8fad7fb\",\"license\":\"GPL-3.0\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"},\"contracts/external/openzeppelin/ProxyFactory.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\n// solium-disable security/no-inline-assembly\\n// solium-disable security/no-low-level-calls\\ncontract ProxyFactory {\\n\\n  event ProxyCreated(address proxy);\\n\\n  function deployMinimal(address _logic, bytes memory _data) public returns (address proxy) {\\n    // Adapted from https://github.com/optionality/clone-factory/blob/32782f82dfc5a00d103a7e61a17a5dedbd1e8e9d/contracts/CloneFactory.sol\\n    bytes20 targetBytes = bytes20(_logic);\\n    assembly {\\n      let clone := mload(0x40)\\n      mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n      mstore(add(clone, 0x14), targetBytes)\\n      mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n      proxy := create(0, clone, 0x37)\\n    }\\n\\n    emit ProxyCreated(address(proxy));\\n\\n    if(_data.length > 0) {\\n      (bool success,) = proxy.call(_data);\\n      require(success, \\\"ProxyFactory/constructor-call-failed\\\");\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0xf0422303985796fdd8bdf772ac8e34331e2e63006f657989cca010fa4776d735\"},\"contracts/prize-pool/PrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../external/compound/ICompLike.sol\\\";\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../reserve/ReserveInterface.sol\\\";\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/TokenListenerLibrary.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\nimport \\\"./PrizePoolInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using SafeERC20Upgradeable for IERC721Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    address reserveRegistry,\\n    uint256 maxExitFeeMantissa\\n  );\\n\\n  /// @dev Event emitted when controlled token is added\\n  event ControlledTokenAdded(\\n    ControlledTokenInterface indexed token\\n  );\\n\\n  /// @dev Emitted when reserve is captured.\\n  event ReserveFeeCaptured(\\n    uint256 amount\\n  );\\n\\n  event AwardCaptured(\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when assets are deposited\\n  event Deposited(\\n    address indexed operator,\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount,\\n    address referrer\\n  );\\n\\n  /// @dev Event emitted when interest is awarded to a winner\\n  event Awarded(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are awarded to a winner\\n  event AwardedExternalERC20(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are transferred out\\n  event TransferredExternalERC20(\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC721s are awarded to a winner\\n  event AwardedExternalERC721(\\n    address indexed winner,\\n    address indexed token,\\n    uint256[] tokenIds\\n  );\\n\\n  /// @dev Event emitted when assets are withdrawn instantly\\n  event InstantWithdrawal(\\n    address indexed operator,\\n    address indexed from,\\n    address indexed token,\\n    uint256 amount,\\n    uint256 redeemed,\\n    uint256 exitFee\\n  );\\n\\n  event ReserveWithdrawal(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when the Liquidity Cap is set\\n  event LiquidityCapSet(\\n    uint256 liquidityCap\\n  );\\n\\n  /// @dev Event emitted when the Credit plan is set\\n  event CreditPlanSet(\\n    address token,\\n    uint128 creditLimitMantissa,\\n    uint128 creditRateMantissa\\n  );\\n\\n  /// @dev Event emitted when the Prize Strategy is set\\n  event PrizeStrategySet(\\n    address indexed prizeStrategy\\n  );\\n\\n  /// @dev Emitted when credit is minted\\n  event CreditMinted(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when credit is burned\\n  event CreditBurned(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\\n  event ErrorAwardingExternalERC721(bytes error);\\n\\n\\n  struct CreditPlan {\\n    uint128 creditLimitMantissa;\\n    uint128 creditRateMantissa;\\n  }\\n\\n  struct CreditBalance {\\n    uint192 balance;\\n    uint32 timestamp;\\n    bool initialized;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  /// @dev Reserve to which reserve fees are sent\\n  RegistryInterface public reserveRegistry;\\n\\n  /// @dev An array of all the controlled tokens\\n  ControlledTokenInterface[] internal _tokens;\\n\\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\\n  TokenListenerInterface public prizeStrategy;\\n\\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\\n  /// For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\\n  uint256 public maxExitFeeMantissa;\\n\\n  /// @dev The total funds that have been allocated to the reserve\\n  uint256 public reserveTotalSupply;\\n\\n  /// @dev The total amount of funds that the prize pool can hold.\\n  uint256 public liquidityCap;\\n\\n  /// @dev the The awardable balance\\n  uint256 internal _currentAwardBalance;\\n\\n  /// @dev Stores the credit plan for each token.\\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\\n\\n  /// @dev Stores each users balance of credit per token.\\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\\n\\n  /// @notice Initializes the Prize Pool\\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\\n  /// @param _maxExitFeeMantissa The maximum exit fee size\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_reserveRegistry) != address(0), \\\"PrizePool/reserveRegistry-not-zero\\\");\\n    uint256 controlledTokensLength = _controlledTokens.length;\\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\\n\\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\\n      _addControlledToken(controlledToken, i);\\n    }\\n    __Ownable_init();\\n    __ReentrancyGuard_init();\\n    _setLiquidityCap(uint256(-1));\\n\\n    reserveRegistry = _reserveRegistry;\\n    maxExitFeeMantissa = _maxExitFeeMantissa;\\n\\n    emit Initialized(\\n      address(_reserveRegistry),\\n      maxExitFeeMantissa\\n    );\\n  }\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external override view returns (address) {\\n    return address(_token());\\n  }\\n\\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\\n  /// @return The underlying balance of assets\\n  function balance() external returns (uint256) {\\n    return _balance();\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function canAwardExternal(address _externalToken) external view returns (bool) {\\n    return _canAwardExternal(_externalToken);\\n  }\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    canAddLiquidity(amount)\\n  {\\n    address operator = _msgSender();\\n\\n    _mint(to, amount, controlledToken, referrer);\\n\\n    _token().safeTransferFrom(operator, address(this), amount);\\n    _supply(amount);\\n\\n    emit Deposited(operator, to, controlledToken, amount, referrer);\\n  }\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    returns (uint256)\\n  {\\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n    require(exitFee <= maximumExitFee, \\\"PrizePool/exit-fee-exceeds-user-maximum\\\");\\n\\n    // burn the credit\\n    _burnCredit(from, controlledToken, burnedCredit);\\n\\n    // burn the tickets\\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\\n\\n    // redeem the tickets less the fee\\n    uint256 amountLessFee = amount.sub(exitFee);\\n    uint256 redeemed = _redeem(amountLessFee);\\n\\n    _token().safeTransfer(from, redeemed);\\n\\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\\n\\n    return exitFee;\\n  }\\n\\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\\n  /// @param exitFee The exit fee to check against the limit\\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\\n    if (exitFee > maxFee) {\\n      exitFee = maxFee;\\n    }\\n    return exitFee;\\n  }\\n\\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\\n  /// @param from The address the tokens are being transferred from (0 if minting)\\n  /// @param to The address the tokens are being transferred to (0 if burning)\\n  /// @param amount The amount of tokens being trasferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\\n    if (from != address(0)) {\\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\\n      // first accrue credit for their old balance\\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\\n\\n      if (from != to) {\\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\\n      }\\n\\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\\n    }\\n    if (to != address(0) && to != from) {\\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\\n    }\\n    // if we aren't minting\\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\\n    }\\n  }\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external override view returns (uint256) {\\n    return _currentAwardBalance;\\n  }\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n\\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\\n    uint256 currentBalance = _balance();\\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\\n\\n    if (unaccountedPrizeBalance > 0) {\\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\\n      if (reserveFee > 0) {\\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\\n        emit ReserveFeeCaptured(reserveFee);\\n      }\\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\\n\\n      emit AwardCaptured(unaccountedPrizeBalance);\\n    }\\n\\n    return _currentAwardBalance;\\n  }\\n\\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\\n\\n    uint256 amount = reserveTotalSupply;\\n    reserveTotalSupply = 0;\\n    uint256 redeemed = _redeem(amount);\\n\\n    _token().safeTransfer(address(to), redeemed);\\n\\n    emit ReserveWithdrawal(to, amount);\\n\\n    return redeemed;\\n  }\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external override\\n    onlyPrizeStrategy\\n    onlyControlledToken(controlledToken)\\n  {\\n    if (amount == 0) {\\n      return;\\n    }\\n\\n    require(amount <= _currentAwardBalance, \\\"PrizePool/award-exceeds-avail\\\");\\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\\n\\n    _mint(to, amount, controlledToken, address(0));\\n\\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\\n\\n    emit Awarded(to, controlledToken, amount);\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit TransferredExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit AwardedExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  function _transferOut(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (bool)\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (amount == 0) {\\n      return false;\\n    }\\n\\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\\n\\n    return true;\\n  }\\n\\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\\n  /// @param to The user who is receiving the tokens\\n  /// @param amount The amount of tokens they are receiving\\n  /// @param controlledToken The token that is going to be minted\\n  /// @param referrer The user who referred the minting\\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\\n    if (address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n    ControlledToken(controlledToken).controllerMint(to, amount);\\n  }\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (tokenIds.length == 0) {\\n      return;\\n    }\\n\\n    for (uint256 i = 0; i < tokenIds.length; i++) {\\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\\n\\n      }\\n      catch(bytes memory error){\\n        emit ErrorAwardingExternalERC721(error);\\n      }\\n      \\n    }\\n\\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\\n  }\\n\\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\\n  /// @param amount The prize amount\\n  /// @return The size of the reserve portion of the prize\\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    if (address(reserve) == address(0)) {\\n      return 0;\\n    }\\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\\n    if (reserveRateMantissa == 0) {\\n      return 0;\\n    }\\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\\n  }\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external override\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    )\\n  {\\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n  }\\n\\n  /// @dev Calculates the early exit fee for the given amount\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return Exit fee\\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\\n    return _limitExitFee(\\n      amount,\\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external override\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    durationSeconds =_estimateCreditAccrualTime(\\n      _controlledToken,\\n      _principal,\\n      _interest\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function _estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    internal\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    // interest = credit rate * principal * time\\n    // => time = interest / (credit rate * principal)\\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\\n    if (accruedPerSecond == 0) {\\n      return 0;\\n    }\\n    return _interest.div(accruedPerSecond);\\n  }\\n\\n  /// @notice Burns a users credit.\\n  /// @param user The user whose credit should be burned\\n  /// @param credit The amount of credit to burn\\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\\n\\n    emit CreditBurned(user, controlledToken, credit);\\n  }\\n\\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\\n  /// @param user The user for whom to accrue credit\\n  /// @param controlledToken The controlled token whose balance we are checking\\n  /// @param controlledTokenBalance The balance to use for the user\\n  /// @param extra Additional credit to be added\\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\\n    _updateCreditBalance(\\n      user,\\n      controlledToken,\\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\\n    );\\n  }\\n\\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\\n    uint256 newBalance;\\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\\n    if (!creditBalance.initialized) {\\n      newBalance = 0;\\n    } else {\\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\\n    }\\n    return newBalance;\\n  }\\n\\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\\n\\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\\n      balance: newBalance.toUint128(),\\n      timestamp: _currentTime().toUint32(),\\n      initialized: true\\n    });\\n\\n    if (oldBalance < newBalance) {\\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\\n    } \\n    else if (newBalance < oldBalance) {\\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\\n    }\\n  }\\n\\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\\n  /// @param creditBalance The new credit balance to be checked\\n  /// @return The users new credit balance.  Will not exceed the credit limit.\\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\\n      controlledTokenBalance,\\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\\n    );\\n    if (creditBalance > creditLimit) {\\n      creditBalance = creditLimit;\\n    }\\n\\n    return creditBalance;\\n  }\\n\\n  /// @notice Calculates the accrued interest for a user\\n  /// @param user The user whose credit should be calculated.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\\n  /// @return The credit that has accrued since the last credit update.\\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\\n\\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\\n      return 0;\\n    }\\n\\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\\n  }\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\\n    return _tokenCreditBalances[controlledToken][user].balance;\\n  }\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external override\\n    onlyControlledToken(_controlledToken)\\n    onlyOwner\\n  {\\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\\n      creditLimitMantissa: _creditLimitMantissa,\\n      creditRateMantissa: _creditRateMantissa\\n    });\\n\\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\\n  }\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external override\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    )\\n  {\\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\\n  }\\n\\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The token they are withdrawing\\n  /// @param amount The amount of funds they are withdrawing\\n  /// @return earlyExitFee The additional exit fee that should be charged.\\n  /// @return creditBurned The amount of credit that will be burned\\n  function _calculateEarlyExitFeeLessBurnedCredit(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (\\n      uint256 earlyExitFee,\\n      uint256 creditBurned\\n    )\\n  {\\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\\n    require(controlledTokenBalance >= amount, \\\"PrizePool/insuff-funds\\\");\\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\\n    /*\\n    The credit is used *last*.  Always charge the fees up-front.\\n\\n    How to calculate:\\n\\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\\n\\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\\n    */\\n\\n    // Determine available usable credit based on withdraw amount\\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\\n\\n    uint256 availableCredit;\\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\\n    }\\n\\n    // Determine amount of credit to burn and amount of fees required\\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\\n    earlyExitFee = totalExitFee.sub(creditBurned);\\n  }\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\\n    _setLiquidityCap(_liquidityCap);\\n  }\\n\\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\\n    liquidityCap = _liquidityCap;\\n    emit LiquidityCapSet(_liquidityCap);\\n  }\\n\\n  /// @notice Adds a new controlled token\\n  /// @param _controlledToken The controlled token to add.\\n  /// @param index The index to add the controlledToken\\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\\n    require(_controlledToken.controller() == this, \\\"PrizePool/token-ctrlr-mismatch\\\");\\n    \\n    _tokens[index] = _controlledToken;\\n    emit ControlledTokenAdded(_controlledToken);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\\n    _setPrizeStrategy(_prizeStrategy);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\\n    require(address(_prizeStrategy) != address(0), \\\"PrizePool/prizeStrategy-not-zero\\\");\\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PrizePool/prizeStrategy-invalid\\\");\\n    prizeStrategy = _prizeStrategy;\\n\\n    emit PrizeStrategySet(address(_prizeStrategy));\\n  }\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\\n    return _tokens;\\n  }\\n\\n  /// @dev Gets the current time as represented by the current block\\n  /// @return The timestamp of the current block\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external override view returns (uint256) {\\n    return _tokenTotalSupply();\\n  }\\n\\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\\n  /// @param to The address to delegate to \\n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\\n    if (compLike.balanceOf(address(this)) > 0) {\\n      compLike.delegate(to);\\n    }\\n  }\\n  \\n  /// @notice Required for ERC721 safe token transfers from smart contracts.\\n  /// @param operator The address that acts on behalf of the owner\\n  /// @param from The current owner of the NFT\\n  /// @param tokenId The NFT to transfer\\n  /// @param data Additional data with no specified format, sent in call to `_to`.\\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function _tokenTotalSupply() internal view returns (uint256) {\\n    uint256 total = reserveTotalSupply;\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \\n    uint256 tokensLength = tokens.length;\\n    \\n    for(uint256 i = 0; i < tokensLength; i++){\\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\\n    }\\n\\n    return total;\\n  }\\n\\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\\n  }\\n\\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\\n    uint256 tokensLength = tokens.length;\\n\\n    for(uint256 i = 0; i < tokensLength; i++) {\\n      if(tokens[i] == controlledToken) return true;\\n    }\\n    return false;\\n  }\\n  \\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\\n    return _isControlled(controlledToken);\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function _token() internal virtual view returns (IERC20Upgradeable);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal virtual returns (uint256);\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal virtual;\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\\n\\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  modifier onlyControlledToken(address controlledToken) {\\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \\\"PrizePool/unknown-token\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure caller is the prize-strategy\\n  modifier onlyPrizeStrategy() {\\n    require(_msgSender() == address(prizeStrategy), \\\"PrizePool/only-prizeStrategy\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\\n  modifier canAddLiquidity(uint256 _amount) {\\n    require(_canAddLiquidity(_amount), \\\"PrizePool/exceeds-liquidity-cap\\\");\\n    _;\\n  }\\n\\n  modifier onlyReserve() {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    require(address(reserve) == msg.sender, \\\"PrizePool/only-reserve\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x386ebc1c80ab4424f14125e716dd12641ff933b475bf1082b7b1a6eee4a969c3\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListener.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./BeforeAwardListenerInterface.sol\\\";\\nimport \\\"../Constants.sol\\\";\\nimport \\\"./BeforeAwardListenerLibrary.sol\\\";\\n\\nabstract contract BeforeAwardListener is BeforeAwardListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == BeforeAwardListenerLibrary.ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER\\n    );\\n  }\\n}\",\"keccak256\":\"0x5da2a7332421d6136d793ef55410c2da63a7fb719e8522697f78ac4c50391505\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @notice The interface for the Periodic Prize Strategy before award listener.  This listener will be called immediately before the award is distributed.\\ninterface BeforeAwardListenerInterface is IERC165Upgradeable {\\n  /// @notice Called immediately before the award is distributed\\n  function beforePrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x96145efe8fc65aff97d11ffaf0905d53baf4b87c4a575a84d691804468f12083\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary BeforeAwardListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforePrizePoolAwarded(uint256,uint256)')) == 0x4cdf9c3e\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER = 0x4cdf9c3e;\\n}\",\"keccak256\":\"0xeac08a7b8e2e7d508a0af89c05c31c36e2b060674d05dfa9a5016cf2d12cf500\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategy.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\\\";\\nimport \\\"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../token/TokenListener.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TicketInterface.sol\\\";\\nimport \\\"../prize-pool/PrizePool.sol\\\";\\nimport \\\"../Constants.sol\\\";\\nimport \\\"./PeriodicPrizeStrategyListenerInterface.sol\\\";\\nimport \\\"./PeriodicPrizeStrategyListenerLibrary.sol\\\";\\nimport \\\"./BeforeAwardListener.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\nabstract contract PeriodicPrizeStrategy is Initializable,\\n                                           OwnableUpgradeable,\\n                                           TokenListener {\\n\\n  using SafeMathUpgradeable for uint256;\\n  using SafeMathUpgradeable for uint16;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using AddressUpgradeable for address;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  uint256 internal constant ETHEREUM_BLOCK_TIME_ESTIMATE_MANTISSA = 13.4 ether;\\n\\n  event PrizePoolOpened(\\n    address indexed operator,\\n    uint256 indexed prizePeriodStartedAt\\n  );\\n\\n  event RngRequestFailed();\\n\\n  event PrizePoolAwardStarted(\\n    address indexed operator,\\n    address indexed prizePool,\\n    uint32 indexed rngRequestId,\\n    uint32 rngLockBlock\\n  );\\n\\n  event PrizePoolAwardCancelled(\\n    address indexed operator,\\n    address indexed prizePool,\\n    uint32 indexed rngRequestId,\\n    uint32 rngLockBlock\\n  );\\n\\n  event PrizePoolAwarded(\\n    address indexed operator,\\n    uint256 randomNumber\\n  );\\n\\n  event RngServiceUpdated(\\n    RNGInterface indexed rngService\\n  );\\n\\n  event TokenListenerUpdated(\\n    TokenListenerInterface indexed tokenListener\\n  );\\n\\n  event RngRequestTimeoutSet(\\n    uint32 rngRequestTimeout\\n  );\\n\\n  event PrizePeriodSecondsUpdated(\\n    uint256 prizePeriodSeconds\\n  );\\n\\n  event BeforeAwardListenerSet(\\n    BeforeAwardListenerInterface indexed beforeAwardListener\\n  );\\n\\n  event PeriodicPrizeStrategyListenerSet(\\n    PeriodicPrizeStrategyListenerInterface indexed periodicPrizeStrategyListener\\n  );\\n\\n  event ExternalErc721AwardAdded(\\n    IERC721Upgradeable indexed externalErc721,\\n    uint256[] tokenIds\\n  );\\n\\n  event ExternalErc20AwardAdded(\\n    IERC20Upgradeable indexed externalErc20\\n  );\\n\\n  event ExternalErc721AwardRemoved(\\n    IERC721Upgradeable indexed externalErc721Award\\n  );\\n\\n  event ExternalErc20AwardRemoved(\\n    IERC20Upgradeable indexed externalErc20Award\\n  );\\n\\n  event Initialized(\\n    uint256 prizePeriodStart,\\n    uint256 prizePeriodSeconds,\\n    PrizePool indexed prizePool,\\n    TicketInterface ticket,\\n    IERC20Upgradeable sponsorship,\\n    RNGInterface rng,\\n    IERC20Upgradeable[] externalErc20Awards\\n  );\\n\\n  struct RngRequest {\\n    uint32 id;\\n    uint32 lockBlock;\\n    uint32 requestedAt;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  // Comptroller\\n  TokenListenerInterface public tokenListener;\\n\\n  // Contract Interfaces\\n  PrizePool public prizePool;\\n  TicketInterface public ticket;\\n  IERC20Upgradeable public sponsorship;\\n  RNGInterface public rng;\\n\\n  // Current RNG Request\\n  RngRequest internal rngRequest;\\n\\n  /// @notice RNG Request Timeout.  In fact, this is really a \\\"complete award\\\" timeout.\\n  /// If the rng completes the award can still be cancelled.\\n  uint32 public rngRequestTimeout;\\n\\n  // Prize period\\n  uint256 public prizePeriodSeconds;\\n  uint256 public prizePeriodStartedAt;\\n\\n  // External tokens awarded as part of prize\\n  MappedSinglyLinkedList.Mapping internal externalErc20s;\\n  MappedSinglyLinkedList.Mapping internal externalErc721s;\\n\\n  // External NFT token IDs to be awarded\\n  //   NFT Address => TokenIds\\n  mapping (IERC721Upgradeable => uint256[]) internal externalErc721TokenIds;\\n\\n  /// @notice A listener that is called before the prize is awarded\\n  BeforeAwardListenerInterface public beforeAwardListener;\\n\\n  /// @notice A listener that is called after the prize is awarded\\n  PeriodicPrizeStrategyListenerInterface public periodicPrizeStrategyListener;\\n\\n  /// @notice Initializes a new strategy\\n  /// @param _prizePeriodStart The starting timestamp of the prize period.\\n  /// @param _prizePeriodSeconds The duration of the prize period in seconds\\n  /// @param _prizePool The prize pool to award\\n  /// @param _ticket The ticket to use to draw winners\\n  /// @param _sponsorship The sponsorship token\\n  /// @param _rng The RNG service to use\\n  function initialize (\\n    uint256 _prizePeriodStart,\\n    uint256 _prizePeriodSeconds,\\n    PrizePool _prizePool,\\n    TicketInterface _ticket,\\n    IERC20Upgradeable _sponsorship,\\n    RNGInterface _rng,\\n    IERC20Upgradeable[] memory externalErc20Awards\\n  ) public initializer {\\n    require(address(_prizePool) != address(0), \\\"PeriodicPrizeStrategy/prize-pool-not-zero\\\");\\n    require(address(_ticket) != address(0), \\\"PeriodicPrizeStrategy/ticket-not-zero\\\");\\n    require(address(_sponsorship) != address(0), \\\"PeriodicPrizeStrategy/sponsorship-not-zero\\\");\\n    require(address(_rng) != address(0), \\\"PeriodicPrizeStrategy/rng-not-zero\\\");\\n    prizePool = _prizePool;\\n    ticket = _ticket;\\n    rng = _rng;\\n    sponsorship = _sponsorship;\\n    _setPrizePeriodSeconds(_prizePeriodSeconds);\\n\\n    __Ownable_init();\\n\\n    externalErc20s.initialize();\\n    for (uint256 i = 0; i < externalErc20Awards.length; i++) {\\n      _addExternalErc20Award(externalErc20Awards[i]);\\n    }\\n\\n    prizePeriodSeconds = _prizePeriodSeconds;\\n    prizePeriodStartedAt = _prizePeriodStart;\\n\\n    externalErc721s.initialize();\\n\\n    // 30 min timeout\\n    _setRngRequestTimeout(1800);\\n\\n    emit Initialized(\\n      _prizePeriodStart,\\n      _prizePeriodSeconds,\\n      _prizePool,\\n      _ticket,\\n      _sponsorship,\\n      _rng,\\n      externalErc20Awards\\n    );\\n    emit PrizePoolOpened(_msgSender(), prizePeriodStartedAt);\\n  }\\n\\n  function _distribute(uint256 randomNumber) internal virtual;\\n\\n  /// @notice Calculates and returns the currently accrued prize\\n  /// @return The current prize size\\n  function currentPrize() public view returns (uint256) {\\n    return prizePool.awardBalance();\\n  }\\n\\n  /// @notice Allows the owner to set the token listener\\n  /// @param _tokenListener A contract that implements the token listener interface.\\n  function setTokenListener(TokenListenerInterface _tokenListener) external onlyOwner requireAwardNotInProgress {\\n    require(address(0) == address(_tokenListener) || address(_tokenListener).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PeriodicPrizeStrategy/token-listener-invalid\\\");\\n\\n    tokenListener = _tokenListener;\\n\\n    emit TokenListenerUpdated(tokenListener);\\n  }\\n\\n  /// @notice Estimates the remaining blocks until the prize given a number of seconds per block\\n  /// @param secondsPerBlockMantissa The number of seconds per block to use for the calculation.  Should be a fixed point 18 number like Ether.\\n  /// @return The estimated number of blocks remaining until the prize can be awarded.\\n  function estimateRemainingBlocksToPrize(uint256 secondsPerBlockMantissa) public view returns (uint256) {\\n    return FixedPoint.divideUintByMantissa(\\n      _prizePeriodRemainingSeconds(),\\n      secondsPerBlockMantissa\\n    );\\n  }\\n\\n  /// @notice Returns the number of seconds remaining until the prize can be awarded.\\n  /// @return The number of seconds remaining until the prize can be awarded.\\n  function prizePeriodRemainingSeconds() external view returns (uint256) {\\n    return _prizePeriodRemainingSeconds();\\n  }\\n\\n  /// @notice Returns the number of seconds remaining until the prize can be awarded.\\n  /// @return The number of seconds remaining until the prize can be awarded.\\n  function _prizePeriodRemainingSeconds() internal view returns (uint256) {\\n    uint256 endAt = _prizePeriodEndAt();\\n    uint256 time = _currentTime();\\n    if (time > endAt) {\\n      return 0;\\n    }\\n    return endAt.sub(time);\\n  }\\n\\n  /// @notice Returns whether the prize period is over\\n  /// @return True if the prize period is over, false otherwise\\n  function isPrizePeriodOver() external view returns (bool) {\\n    return _isPrizePeriodOver();\\n  }\\n\\n  /// @notice Returns whether the prize period is over\\n  /// @return True if the prize period is over, false otherwise\\n  function _isPrizePeriodOver() internal view returns (bool) {\\n    return _currentTime() >= _prizePeriodEndAt();\\n  }\\n\\n  /// @notice Awards collateral as tickets to a user\\n  /// @param user Recipient of minted tokens\\n  /// @param amount Amount of minted tokens\\n  function _awardTickets(address user, uint256 amount) internal {\\n    prizePool.award(user, amount, address(ticket));\\n  }\\n  \\n  /// @notice Mints ticket or sponsorship tokens for user.\\n  /// @dev Mints ticket or sponsorship tokens by looking up the address in the prizePool.tokens mapping. \\n  /// @param user Recipient of minted tokens\\n  /// @param amount Amount of minted tokens\\n  /// @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\\n  function _awardToken(address user, uint256 amount, uint8 tokenIndex) internal {\\n    ControlledTokenInterface[] memory _controlledTokens = prizePool.tokens();\\n    require(tokenIndex <= _controlledTokens.length, \\\"PeriodicPrizeStrategy/award-invalid-token-index\\\");\\n    ControlledTokenInterface _token = _controlledTokens[tokenIndex];\\n    prizePool.award(user, amount, address(_token));\\n  }\\n\\n  /// @notice Awards all external tokens with non-zero balances to the given user.  The external tokens must be held by the PrizePool contract.\\n  /// @param winner The user to transfer the tokens to\\n  function _awardAllExternalTokens(address winner) internal {\\n    _awardExternalErc20s(winner);\\n    _awardExternalErc721s(winner);\\n  }\\n\\n  /// @notice Awards all external ERC20 tokens with non-zero balances to the given user.\\n  /// The external tokens must be held by the PrizePool contract.\\n  /// @param winner The user to transfer the tokens to\\n  function _awardExternalErc20s(address winner) internal {\\n    address currentToken = externalErc20s.start();\\n    while (currentToken != address(0) && currentToken != externalErc20s.end()) {\\n      uint256 balance = IERC20Upgradeable(currentToken).balanceOf(address(prizePool));\\n      if (balance > 0) {\\n        prizePool.awardExternalERC20(winner, currentToken, balance);\\n      }\\n      currentToken = externalErc20s.next(currentToken);\\n    }\\n  }\\n\\n  /// @notice Awards all external ERC721 tokens to the given user.\\n  /// The external tokens must be held by the PrizePool contract.\\n  /// @dev The list of ERC721s is reset after every award\\n  /// @param winner The user to transfer the tokens to\\n  function _awardExternalErc721s(address winner) internal {\\n    address currentToken = externalErc721s.start();\\n    while (currentToken != address(0) && currentToken != externalErc721s.end()) {\\n      uint256 balance = IERC721Upgradeable(currentToken).balanceOf(address(prizePool));\\n      if (balance > 0) {\\n        prizePool.awardExternalERC721(winner, currentToken, externalErc721TokenIds[IERC721Upgradeable(currentToken)]);\\n        _removeExternalErc721AwardTokens(IERC721Upgradeable(currentToken));\\n      }\\n      currentToken = externalErc721s.next(currentToken);\\n    }\\n    externalErc721s.clearAll();\\n  }\\n\\n  /// @notice Returns the timestamp at which the prize period ends\\n  /// @return The timestamp at which the prize period ends.\\n  function prizePeriodEndAt() external view returns (uint256) {\\n    // current prize started at is non-inclusive, so add one\\n    return _prizePeriodEndAt();\\n  }\\n\\n  /// @notice Returns the timestamp at which the prize period ends\\n  /// @return The timestamp at which the prize period ends.\\n  function _prizePeriodEndAt() internal view returns (uint256) {\\n    // current prize started at is non-inclusive, so add one\\n    return prizePeriodStartedAt.add(prizePeriodSeconds);\\n  }\\n\\n  /// @notice Called by the PrizePool for transfers of controlled tokens\\n  /// @dev Note that this is only for *transfers*, not mints or burns\\n  /// @param controlledToken The type of collateral that is being sent\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external override onlyPrizePool {\\n    require(from != to, \\\"PeriodicPrizeStrategy/transfer-to-self\\\");\\n\\n    if (controlledToken == address(ticket)) {\\n      _requireAwardNotInProgress();\\n    }\\n\\n    if (address(tokenListener) != address(0)) {\\n      tokenListener.beforeTokenTransfer(from, to, amount, controlledToken);\\n    }\\n  }\\n\\n  /// @notice Called by the PrizePool when minting controlled tokens\\n  /// @param controlledToken The type of collateral that is being minted\\n  function beforeTokenMint(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external\\n    override\\n    onlyPrizePool\\n  {\\n    if (controlledToken == address(ticket)) {\\n      _requireAwardNotInProgress();\\n    }\\n    if (address(tokenListener) != address(0)) {\\n      tokenListener.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n  }\\n\\n  /// @notice returns the current time.  Used for testing.\\n  /// @return The current time (block.timestamp)\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice returns the current time.  Used for testing.\\n  /// @return The current time (block.timestamp)\\n  function _currentBlock() internal virtual view returns (uint256) {\\n    return block.number;\\n  }\\n\\n  /// @notice Starts the award process by starting random number request.  The prize period must have ended.\\n  /// @dev The RNG-Request-Fee is expected to be held within this contract before calling this function\\n  function startAward() external requireCanStartAward {\\n    (address feeToken, uint256 requestFee) = rng.getRequestFee();\\n    if (feeToken != address(0) && requestFee > 0) {\\n      IERC20Upgradeable(feeToken).safeApprove(address(rng), requestFee);\\n    }\\n\\n    (uint32 requestId, uint32 lockBlock) = rng.requestRandomNumber();\\n    rngRequest.id = requestId;\\n    rngRequest.lockBlock = lockBlock;\\n    rngRequest.requestedAt = _currentTime().toUint32();\\n\\n    emit PrizePoolAwardStarted(_msgSender(), address(prizePool), requestId, lockBlock);\\n  }\\n\\n  /// @notice Can be called by anyone to unlock the tickets if the RNG has timed out.\\n  function cancelAward() public {\\n    require(isRngTimedOut(), \\\"PeriodicPrizeStrategy/rng-not-timedout\\\");\\n    uint32 requestId = rngRequest.id;\\n    uint32 lockBlock = rngRequest.lockBlock;\\n    delete rngRequest;\\n    emit RngRequestFailed();\\n    emit PrizePoolAwardCancelled(msg.sender, address(prizePool), requestId, lockBlock);\\n  }\\n\\n  /// @notice Completes the award process and awards the winners.  The random number must have been requested and is now available.\\n  function completeAward() external requireCanCompleteAward {\\n    uint256 randomNumber = rng.randomNumber(rngRequest.id);\\n    delete rngRequest;\\n\\n    if (address(beforeAwardListener) != address(0)) {\\n      beforeAwardListener.beforePrizePoolAwarded(randomNumber, prizePeriodStartedAt);\\n    }\\n    _distribute(randomNumber);\\n    if (address(periodicPrizeStrategyListener) != address(0)) {\\n      periodicPrizeStrategyListener.afterPrizePoolAwarded(randomNumber, prizePeriodStartedAt);\\n    }\\n\\n    // to avoid clock drift, we should calculate the start time based on the previous period start time.\\n    prizePeriodStartedAt = _calculateNextPrizePeriodStartTime(_currentTime());\\n\\n    emit PrizePoolAwarded(_msgSender(), randomNumber);\\n    emit PrizePoolOpened(_msgSender(), prizePeriodStartedAt);\\n  }\\n\\n  /// @notice Allows the owner to set a listener that is triggered immediately before the award is distributed\\n  /// @dev The listener must implement ERC165 and the BeforeAwardListenerInterface\\n  /// @param _beforeAwardListener The address of the listener contract\\n  function setBeforeAwardListener(BeforeAwardListenerInterface _beforeAwardListener) external onlyOwner requireAwardNotInProgress {\\n    require(\\n      address(0) == address(_beforeAwardListener) || address(_beforeAwardListener).supportsInterface(BeforeAwardListenerLibrary.ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER),\\n      \\\"PeriodicPrizeStrategy/beforeAwardListener-invalid\\\"\\n    );\\n\\n    beforeAwardListener = _beforeAwardListener;\\n\\n    emit BeforeAwardListenerSet(_beforeAwardListener);\\n  }\\n\\n  /// @notice Allows the owner to set a listener for prize strategy callbacks.\\n  /// @param _periodicPrizeStrategyListener The address of the listener contract\\n  function setPeriodicPrizeStrategyListener(PeriodicPrizeStrategyListenerInterface _periodicPrizeStrategyListener) external onlyOwner requireAwardNotInProgress {\\n    require(\\n      address(0) == address(_periodicPrizeStrategyListener) || address(_periodicPrizeStrategyListener).supportsInterface(PeriodicPrizeStrategyListenerLibrary.ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER),\\n      \\\"PeriodicPrizeStrategy/prizeStrategyListener-invalid\\\"\\n    );\\n\\n    periodicPrizeStrategyListener = _periodicPrizeStrategyListener;\\n\\n    emit PeriodicPrizeStrategyListenerSet(_periodicPrizeStrategyListener);\\n  }\\n\\n  function _calculateNextPrizePeriodStartTime(uint256 currentTime) internal view returns (uint256) {\\n    uint256 elapsedPeriods = currentTime.sub(prizePeriodStartedAt).div(prizePeriodSeconds);\\n    return prizePeriodStartedAt.add(elapsedPeriods.mul(prizePeriodSeconds));\\n  }\\n\\n  /// @notice Calculates when the next prize period will start\\n  /// @param currentTime The timestamp to use as the current time\\n  /// @return The timestamp at which the next prize period would start\\n  function calculateNextPrizePeriodStartTime(uint256 currentTime) external view returns (uint256) {\\n    return _calculateNextPrizePeriodStartTime(currentTime);\\n  }\\n\\n  /// @notice Returns whether an award process can be started\\n  /// @return True if an award can be started, false otherwise.\\n  function canStartAward() external view returns (bool) {\\n    return _isPrizePeriodOver() && !isRngRequested();\\n  }\\n\\n  /// @notice Returns whether an award process can be completed\\n  /// @return True if an award can be completed, false otherwise.\\n  function canCompleteAward() external view returns (bool) {\\n    return isRngRequested() && isRngCompleted();\\n  }\\n\\n  /// @notice Returns whether a random number has been requested\\n  /// @return True if a random number has been requested, false otherwise.\\n  function isRngRequested() public view returns (bool) {\\n    return rngRequest.id != 0;\\n  }\\n\\n  /// @notice Returns whether the random number request has completed.\\n  /// @return True if a random number request has completed, false otherwise.\\n  function isRngCompleted() public view returns (bool) {\\n    return rng.isRequestComplete(rngRequest.id);\\n  }\\n\\n  /// @notice Returns the block number that the current RNG request has been locked to\\n  /// @return The block number that the RNG request is locked to\\n  function getLastRngLockBlock() external view returns (uint32) {\\n    return rngRequest.lockBlock;\\n  }\\n\\n  /// @notice Returns the current RNG Request ID\\n  /// @return The current Request ID\\n  function getLastRngRequestId() external view returns (uint32) {\\n    return rngRequest.id;\\n  }\\n\\n  /// @notice Sets the RNG service that the Prize Strategy is connected to\\n  /// @param rngService The address of the new RNG service interface\\n  function setRngService(RNGInterface rngService) external onlyOwner requireAwardNotInProgress {\\n    require(!isRngRequested(), \\\"PeriodicPrizeStrategy/rng-in-flight\\\");\\n\\n    rng = rngService;\\n    emit RngServiceUpdated(rngService);\\n  }\\n\\n  /// @notice Allows the owner to set the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\\n  /// @param _rngRequestTimeout The RNG request timeout in seconds.\\n  function setRngRequestTimeout(uint32 _rngRequestTimeout) external onlyOwner requireAwardNotInProgress {\\n    _setRngRequestTimeout(_rngRequestTimeout);\\n  }\\n\\n  /// @notice Sets the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\\n  /// @param _rngRequestTimeout The RNG request timeout in seconds.\\n  function _setRngRequestTimeout(uint32 _rngRequestTimeout) internal {\\n    require(_rngRequestTimeout > 60, \\\"PeriodicPrizeStrategy/rng-timeout-gt-60-secs\\\");\\n    rngRequestTimeout = _rngRequestTimeout;\\n    emit RngRequestTimeoutSet(rngRequestTimeout);\\n  }\\n\\n  /// @notice Allows the owner to set the prize period in seconds.\\n  /// @param _prizePeriodSeconds The new prize period in seconds.  Must be greater than zero.\\n  function setPrizePeriodSeconds(uint256 _prizePeriodSeconds) external onlyOwner requireAwardNotInProgress {\\n    _setPrizePeriodSeconds(_prizePeriodSeconds);\\n  }\\n\\n  /// @notice Sets the prize period in seconds.\\n  /// @param _prizePeriodSeconds The new prize period in seconds.  Must be greater than zero.\\n  function _setPrizePeriodSeconds(uint256 _prizePeriodSeconds) internal {\\n    require(_prizePeriodSeconds > 0, \\\"PeriodicPrizeStrategy/prize-period-greater-than-zero\\\");\\n    prizePeriodSeconds = _prizePeriodSeconds;\\n\\n    emit PrizePeriodSecondsUpdated(prizePeriodSeconds);\\n  }\\n\\n  /// @notice Gets the current list of External ERC20 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC20 token addresses\\n  function getExternalErc20Awards() external view returns (address[] memory) {\\n    return externalErc20s.addressArray();\\n  }\\n\\n  /// @notice Adds an external ERC20 token type as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can assign external tokens,\\n  /// and they must be approved by the Prize-Pool\\n  /// @param _externalErc20 The address of an ERC20 token to be awarded\\n  function addExternalErc20Award(IERC20Upgradeable _externalErc20) external onlyOwnerOrListener requireAwardNotInProgress {\\n    _addExternalErc20Award(_externalErc20);\\n  }\\n\\n  function _addExternalErc20Award(IERC20Upgradeable _externalErc20) internal {\\n    require(address(_externalErc20).isContract(), \\\"PeriodicPrizeStrategy/erc20-null\\\");\\n    require(prizePool.canAwardExternal(address(_externalErc20)), \\\"PeriodicPrizeStrategy/cannot-award-external\\\");\\n    (bool succeeded, bytes memory returnValue) = address(_externalErc20).staticcall(abi.encodeWithSignature(\\\"totalSupply()\\\"));\\n    require(succeeded, \\\"PeriodicPrizeStrategy/erc20-invalid\\\");\\n    externalErc20s.addAddress(address(_externalErc20));\\n    emit ExternalErc20AwardAdded(_externalErc20);\\n  }\\n\\n  function addExternalErc20Awards(IERC20Upgradeable[] calldata _externalErc20s) external onlyOwnerOrListener requireAwardNotInProgress {\\n    for (uint256 i = 0; i < _externalErc20s.length; i++) {\\n      _addExternalErc20Award(_externalErc20s[i]);\\n    }\\n  }\\n\\n  /// @notice Removes an external ERC20 token type as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can remove external tokens\\n  /// @param _externalErc20 The address of an ERC20 token to be removed\\n  /// @param _prevExternalErc20 The address of the previous ERC20 token in the `externalErc20s` list.\\n  /// If the ERC20 is the first address, then the previous address is the SENTINEL address: 0x0000000000000000000000000000000000000001\\n  function removeExternalErc20Award(IERC20Upgradeable _externalErc20, IERC20Upgradeable _prevExternalErc20) external onlyOwner requireAwardNotInProgress {\\n    externalErc20s.removeAddress(address(_prevExternalErc20), address(_externalErc20));\\n    emit ExternalErc20AwardRemoved(_externalErc20);\\n  }\\n\\n  /// @notice Gets the current list of External ERC721 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC721 token addresses\\n  function getExternalErc721Awards() external view returns (address[] memory) {\\n    return externalErc721s.addressArray();\\n  }\\n\\n  /// @notice Gets the current list of External ERC721 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC721 token addresses\\n  function getExternalErc721AwardTokenIds(IERC721Upgradeable _externalErc721) external view returns (uint256[] memory) {\\n    return externalErc721TokenIds[_externalErc721];\\n  }\\n\\n  /// @notice Adds an external ERC721 token as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can assign external tokens,\\n  /// and they must be approved by the Prize-Pool\\n  /// NOTE: The NFT must already be owned by the Prize-Pool\\n  /// @param _externalErc721 The address of an ERC721 token to be awarded\\n  /// @param _tokenIds An array of token IDs of the ERC721 to be awarded\\n  function addExternalErc721Award(IERC721Upgradeable _externalErc721, uint256[] calldata _tokenIds) external onlyOwnerOrListener requireAwardNotInProgress {\\n    require(prizePool.canAwardExternal(address(_externalErc721)), \\\"PeriodicPrizeStrategy/cannot-award-external\\\");\\n    require(address(_externalErc721).supportsInterface(Constants.ERC165_INTERFACE_ID_ERC721), \\\"PeriodicPrizeStrategy/erc721-invalid\\\");\\n    \\n    if (!externalErc721s.contains(address(_externalErc721))) {\\n      externalErc721s.addAddress(address(_externalErc721));\\n    }\\n\\n    for (uint256 i = 0; i < _tokenIds.length; i++) {\\n      _addExternalErc721Award(_externalErc721, _tokenIds[i]);\\n    }\\n\\n    emit ExternalErc721AwardAdded(_externalErc721, _tokenIds);\\n  }\\n\\n  function _addExternalErc721Award(IERC721Upgradeable _externalErc721, uint256 _tokenId) internal {\\n    require(IERC721Upgradeable(_externalErc721).ownerOf(_tokenId) == address(prizePool), \\\"PeriodicPrizeStrategy/unavailable-token\\\");\\n    for (uint256 i = 0; i < externalErc721TokenIds[_externalErc721].length; i++) {\\n      if (externalErc721TokenIds[_externalErc721][i] == _tokenId) {\\n        revert(\\\"PeriodicPrizeStrategy/erc721-duplicate\\\");\\n      }\\n    }\\n    externalErc721TokenIds[_externalErc721].push(_tokenId);\\n  }\\n\\n  /// @notice Removes an external ERC721 token as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can remove external tokens\\n  /// @param _externalErc721 The address of an ERC721 token to be removed\\n  /// @param _prevExternalErc721 The address of the previous ERC721 token in the list.\\n  /// If no previous, then pass the SENTINEL address: 0x0000000000000000000000000000000000000001\\n  function removeExternalErc721Award(\\n    IERC721Upgradeable _externalErc721,\\n    IERC721Upgradeable _prevExternalErc721\\n  )\\n    external\\n    onlyOwner\\n    requireAwardNotInProgress\\n  {\\n    externalErc721s.removeAddress(address(_prevExternalErc721), address(_externalErc721));\\n    _removeExternalErc721AwardTokens(_externalErc721);\\n  }\\n\\n  function _removeExternalErc721AwardTokens(\\n    IERC721Upgradeable _externalErc721\\n  )\\n    internal\\n  {\\n    delete externalErc721TokenIds[_externalErc721];\\n    emit ExternalErc721AwardRemoved(_externalErc721);\\n  }\\n\\n  function _requireAwardNotInProgress() internal view {\\n    uint256 currentBlock = _currentBlock();\\n    require(rngRequest.lockBlock == 0 || currentBlock < rngRequest.lockBlock, \\\"PeriodicPrizeStrategy/rng-in-flight\\\");\\n  }\\n\\n  function isRngTimedOut() public view returns (bool) {\\n    if (rngRequest.requestedAt == 0) {\\n      return false;\\n    } else {\\n      return _currentTime() > uint256(rngRequestTimeout).add(rngRequest.requestedAt);\\n    }\\n  }\\n\\n  modifier onlyOwnerOrListener() {\\n    require(_msgSender() == owner() ||\\n            _msgSender() == address(periodicPrizeStrategyListener) ||\\n            _msgSender() == address(beforeAwardListener),\\n            \\\"PeriodicPrizeStrategy/only-owner-or-listener\\\");\\n    _;\\n  }\\n\\n  modifier requireAwardNotInProgress() {\\n    _requireAwardNotInProgress();\\n    _;\\n  }\\n\\n  modifier requireCanStartAward() {\\n    require(_isPrizePeriodOver(), \\\"PeriodicPrizeStrategy/prize-period-not-over\\\");\\n    require(!isRngRequested(), \\\"PeriodicPrizeStrategy/rng-already-requested\\\");\\n    _;\\n  }\\n\\n  modifier requireCanCompleteAward() {\\n    require(isRngRequested(), \\\"PeriodicPrizeStrategy/rng-not-requested\\\");\\n    require(isRngCompleted(), \\\"PeriodicPrizeStrategy/rng-not-complete\\\");\\n    _;\\n  }\\n\\n  modifier onlyPrizePool() {\\n    require(_msgSender() == address(prizePool), \\\"PeriodicPrizeStrategy/only-prize-pool\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0xd7bf198ab616ed4b3e9c29d20477887d5a1e000e137e447da20bcec73b7cf997\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ninterface PeriodicPrizeStrategyListenerInterface is IERC165Upgradeable {\\n  function afterPrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x229624266562f60200b4e40ebc95a35a8aad799c0ff95a42df243af98a44d198\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary PeriodicPrizeStrategyListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('afterPrizePoolAwarded(uint256,uint256)')) == 0x575072c6\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER = 0x575072c6;\\n}\\n\",\"keccak256\":\"0xed291b9a33e265535032557f0a5430a150701c9eb58b0138c120eb02bc13b514\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PrizeSplit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\n\\n/**\\n  * @title Abstract prize split contract for adding unique award distribution to static addresses. \\n  * @author Kames Geraghty (PoolTogether Inc)\\n*/\\nabstract contract PrizeSplit is OwnableUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  \\n  PrizeSplitConfig[] internal _prizeSplits;\\n\\n  /**\\n    * @notice The prize split configuration struct.\\n    * @dev The prize split configuration struct used to award prize splits during distribution.\\n    * @param target Address of recipient receiving the prize split distribution\\n    * @param percentage Percentage of prize split using a 0-1000 range for single decimal precision i.e. 125 = 12.5%\\n    * @param token Position of controlled token in prizePool.tokens (i.e. ticket or sponsorship)\\n  */\\n  struct PrizeSplitConfig {\\n      address target;\\n      uint16 percentage;\\n      uint8 token;\\n  }\\n\\n  /**\\n    * @notice Emitted when a PrizeSplitConfig config is added or updated.\\n    * @dev Emitted when aPrizeSplitConfig config is added or updated in setPrizeSplits or setPrizeSplit.\\n    * @param target Address of prize split recipient\\n    * @param percentage Percentage of prize split. Must be between 0 and 1000 for single decimal precision\\n    * @param token Index (0 or 1) of token in the prizePool.tokens mapping\\n    * @param index Index of prize split in the prizeSplts array\\n  */\\n  event PrizeSplitSet(address indexed target, uint16 percentage, uint8 token, uint256 index);\\n\\n  /**\\n    * @notice Emitted when a PrizeSplitConfig config is removed.\\n    * @dev Emitted when a PrizeSplitConfig config is removed from the _prizeSplits array.\\n    * @param target Index of a previously active prize split config\\n  */\\n  event PrizeSplitRemoved(uint256 indexed target);\\n\\n  /**\\n    * @notice Mints ticket or sponsorship tokens to prize split recipient.\\n    * @dev Mints ticket or sponsorship tokens to prize split recipient via the linked PrizePool contract.\\n    * @param target Recipient of minted tokens\\n    * @param amount Amount of minted tokens\\n    * @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\\n  */\\n  function _awardPrizeSplitAmount(address target, uint256 amount, uint8 tokenIndex) virtual internal;\\n\\n  /**\\n    * @notice Read all prize splits configs.\\n    * @dev Read all PrizeSplitConfig structs stored in _prizeSplits.\\n    * @return _prizeSplits Array of PrizeSplitConfig structs\\n  */\\n  function prizeSplits() external view returns (PrizeSplitConfig[] memory) {\\n    return _prizeSplits;\\n  }\\n\\n  /**\\n    * @notice Read prize split config from active PrizeSplits.\\n    * @dev Read PrizeSplitConfig struct from _prizeSplits array.\\n    * @param prizeSplitIndex Index position of PrizeSplitConfig\\n    * @return PrizeSplitConfig Single prize split config\\n  */\\n  function prizeSplit(uint256 prizeSplitIndex) external view returns (PrizeSplitConfig memory) {\\n    return _prizeSplits[prizeSplitIndex];\\n  }\\n\\n  /**\\n    * @notice Set and remove prize split(s) configs.\\n    * @dev Set and remove prize split configs by passing a new PrizeSplitConfig structs array. Will remove existing PrizeSplitConfig(s) if passed array length is less than existing _prizeSplits length.\\n    * @param newPrizeSplits Array of PrizeSplitConfig structs\\n  */\\n  function setPrizeSplits(PrizeSplitConfig[] calldata newPrizeSplits) external onlyOwner {\\n    uint256 newPrizeSplitsLength = newPrizeSplits.length;\\n\\n    // Add and/or update prize split configs using newPrizeSplits PrizeSplitConfig structs array.\\n    for (uint256 index = 0; index < newPrizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = newPrizeSplits[index];\\n      require(split.token <= 1, \\\"MultipleWinners/invalid-prizesplit-token\\\");\\n      require(split.target != address(0), \\\"MultipleWinners/invalid-prizesplit-target\\\");\\n      \\n      if (_prizeSplits.length <= index) {\\n        _prizeSplits.push(split);\\n      } else {\\n        PrizeSplitConfig memory currentSplit = _prizeSplits[index];\\n        if (split.target != currentSplit.target || split.percentage != currentSplit.percentage || split.token != currentSplit.token) {\\n          _prizeSplits[index] = split;\\n        } else {\\n          continue;\\n        }\\n      }\\n\\n      // Emit the added/updated prize split config.\\n      emit PrizeSplitSet(split.target, split.percentage, split.token, index);\\n    }\\n\\n    // Remove old prize splits configs. Match storage _prizesSplits.length with the passed newPrizeSplits.length\\n    while (_prizeSplits.length > newPrizeSplitsLength) {\\n      uint256 _index = _prizeSplits.length.sub(1);\\n      _prizeSplits.pop();\\n      emit PrizeSplitRemoved(_index);\\n    }\\n\\n    // Total prize split do not exceed 100%\\n    uint256 totalPercentage = _totalPrizeSplitPercentageAmount();\\n    require(totalPercentage <= 1000, \\\"MultipleWinners/invalid-prizesplit-percentage-total\\\");\\n  }\\n\\n  /**\\n    * @notice Updates a previously set prize split config.\\n    * @dev Updates a prize split config by passing a new PrizeSplitConfig struct and current index position. Limited to contract owner.\\n    * @param prizeStrategySplit PrizeSplitConfig config struct\\n    * @param prizeSplitIndex Index position of PrizeSplitConfig to update\\n  */\\n  function setPrizeSplit(PrizeSplitConfig memory prizeStrategySplit, uint8 prizeSplitIndex) external onlyOwner {\\n    require(prizeSplitIndex < _prizeSplits.length, \\\"MultipleWinners/nonexistent-prizesplit\\\");\\n    require(prizeStrategySplit.token <= 1, \\\"MultipleWinners/invalid-prizesplit-token\\\");\\n    require(prizeStrategySplit.target != address(0), \\\"MultipleWinners/invalid-prizesplit-target\\\");\\n    \\n    // Update the prize split config\\n    _prizeSplits[prizeSplitIndex] = prizeStrategySplit;\\n\\n    // Total prize split do not exceed 100%\\n    uint256 totalPercentage = _totalPrizeSplitPercentageAmount();\\n    require(totalPercentage <= 1000, \\\"MultipleWinners/invalid-prizesplit-percentage-total\\\");\\n\\n    // Emit updated prize split config\\n    emit PrizeSplitSet(prizeStrategySplit.target, prizeStrategySplit.percentage, prizeStrategySplit.token, prizeSplitIndex);\\n  }\\n\\n  /**\\n  * @notice Calculate single prize split distribution amount.\\n  * @dev Calculate single prize split distribution amount using the total prize amount and prize split percentage.\\n  * @param amount Total prize award distribution amount\\n  * @param percentage Percentage with single decimal precision using 0-1000 ranges\\n  */\\n  function _getPrizeSplitAmount(uint256 amount, uint16 percentage) internal pure returns (uint256) {\\n    return (amount * percentage).div(1000);\\n  }\\n\\n  /**\\n  * @notice Calculates total prize split percentage amount.\\n  * @dev Calculates total PrizeSplitConfig percentage(s) amount. Used to check the total does not exceed 100% of award distribution.\\n  * @return Total prize split(s) percentage amount\\n  */\\n  function _totalPrizeSplitPercentageAmount() internal view returns (uint256) {\\n    uint256 _tempTotalPercentage;\\n    uint256 prizeSplitsLength = _prizeSplits.length;\\n    for (uint8 index = 0; index < prizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = _prizeSplits[index];\\n      _tempTotalPercentage = _tempTotalPercentage.add(split.percentage);\\n    }\\n    return _tempTotalPercentage;\\n  }\\n\\n  /**\\n  * @notice Distributes prize split(s).\\n  * @dev Distributes prize split(s) by awarding ticket or sponsorship tokens.\\n  * @param prize Starting prize award amount\\n  * @return Total prize award distribution amount exlcuding the awarded prize split(s)\\n  */\\n  function _distributePrizeSplits(uint256 prize) internal returns (uint256) {\\n    // Store temporary total prize amount for multiple calculations using initial prize amount.\\n    uint256 _prizeTemp = prize;\\n    uint256 prizeSplitsLength = _prizeSplits.length;\\n    for (uint256 index = 0; index < prizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = _prizeSplits[index];\\n      uint256 _splitAmount = _getPrizeSplitAmount(_prizeTemp, split.percentage);\\n\\n      // Award the prize split distribution amount.\\n      _awardPrizeSplitAmount(split.target, _splitAmount, split.token);\\n\\n      // Update the remaining prize amount after distributing the prize split percentage.\\n      prize = prize.sub(_splitAmount);\\n    }\\n\\n    return prize;\\n  }\\n\\n}\",\"keccak256\":\"0xc736c25922cf9065c73a06108d4d05c18af9a9e393c5280ba5d4cdb1863f3dbd\",\"license\":\"MIT\"},\"contracts/prize-strategy/multiple-winners/MultipleWinners.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"../PrizeSplit.sol\\\";\\nimport \\\"../PeriodicPrizeStrategy.sol\\\";\\n\\ncontract MultipleWinners is PeriodicPrizeStrategy, PrizeSplit {\\n\\n  // Maximum number number of winners per award distribution period\\n  uint256 internal __numberOfWinners;\\n  \\n  // Toggle for distributing external ERC 20 awards to all winners\\n  bool public splitExternalErc20Awards;\\n\\n  // Mapping of addresses isBlocked status. Can prevent an address from selected during award distribution\\n  mapping(address => bool) public isBlocklisted;\\n\\n  // Carry over the awarded prize for the next drawing when selected winners is less than __numberOfWinners\\n  bool public carryOverBlocklist;\\n\\n  // Limit ticket.draw() retry attempts when a blocked address is selected in _distribute.\\n  uint256 public blocklistRetryCount;\\n\\n  /**\\n    * @notice Emitted when splitExternalErc20Awards is toggled.\\n    * @dev Emitted when splitExternalErc20Awards is toggled between awarding external ERC20 to main or all winners.\\n  */\\n  event SplitExternalErc20AwardsSet(bool splitExternalErc20Awards);\\n\\n  /**\\n    * @notice Emitted when numberOfWinners is set.\\n    * @dev Emitted when numberOfWinners is set, which limits the maximum number of potentially selected winners.\\n    * @param numberOfWinners Maximum potentially selected winners\\n  */\\n  event NumberOfWinnersSet(uint256 numberOfWinners);\\n\\n  /**\\n    * @notice Emitted when carryOverBlocklist is toggled.\\n    * @dev Emitted when carryOverBlocklist is toggled for distribution of the primary and secondary prizes.\\n    * @param carry Awarded prize carry over status\\n  */\\n  event BlocklistCarrySet(bool carry);\\n\\n  /**\\n    * @notice Emitted when a user is blocked/unblocked from receiving a prize award.\\n    * @dev Emitted when a contract owner blocks/unblocks user from award selection in _distribute.\\n    * @param user Address of user to block or unblock\\n    * @param isBlocked User blocked status\\n  */\\n  event BlocklistSet(address indexed user, bool isBlocked);\\n\\n  /**\\n    * @notice Emitted when a new draw retry limit is set.\\n    * @dev Emitted when a new draw retry limit is set. Retry limit is set to limit gas spendings if a blocked user continues to be drawn.\\n    * @param count Number of winner selection retry attempts \\n  */\\n  event BlocklistRetryCountSet(uint256 count);\\n\\n  /**\\n    * @notice Emitted when the winner selection retry limit is reached during award distribution.\\n    * @dev Emitted when the maximum number of users has not been selected after the blocklistRetryCount is reached.\\n    * @param numberOfWinners Total number of winners selected before the blocklistRetryCount is reached.\\n  */\\n  event RetryMaxLimitReached(uint256 numberOfWinners);\\n\\n  /**\\n    * @notice Emitted when no winner can be selected during the prize distribution. \\n    * @dev Emitted when no winner can be selected in _distribute due to ticket.totalSupply() equaling zero.\\n  */\\n  event NoWinners();\\n\\n  function initializeMultipleWinners (\\n    uint256 _prizePeriodStart,\\n    uint256 _prizePeriodSeconds,\\n    PrizePool _prizePool,\\n    TicketInterface _ticket,\\n    IERC20Upgradeable _sponsorship,\\n    RNGInterface _rng,\\n    uint256 _numberOfWinners\\n  ) public initializer {\\n    IERC20Upgradeable[] memory _externalErc20Awards;\\n\\n    PeriodicPrizeStrategy.initialize(\\n      _prizePeriodStart,\\n      _prizePeriodSeconds,\\n      _prizePool,\\n      _ticket,\\n      _sponsorship,\\n      _rng,\\n      _externalErc20Awards\\n    );\\n\\n    _setNumberOfWinners(_numberOfWinners);\\n  }\\n\\n  /**\\n    * @notice Block/unblock a user from winning during prize distribution.\\n    * @dev Block/unblock a user from winning award in prize distribution by updating the isBlocklisted mapping.\\n    * @param _user Address of blocked user\\n    * @param _isBlocked Blocked Status (true or false) of user\\n  */\\n  function setBlocklisted(address _user, bool _isBlocked) external onlyOwner requireAwardNotInProgress returns (bool) {\\n    isBlocklisted[_user] = _isBlocked;\\n\\n    emit BlocklistSet(_user, _isBlocked);\\n\\n    return true;\\n  }\\n\\n  /**\\n    * @notice Toggle if an unawarded prize amount should be kept for the next draw or evenly distrubted to selected winners. \\n    * @dev Toggles if the main prize (prizePool.captureAwardBalance) and secondary prizes (LootBox) should be kept for the next draw or evenly distrubted if maximum number of winners is not selected. \\n    * @param _carry Award carry over status (true or false)\\n  */\\n  function setCarryBlocklist(bool _carry) external onlyOwner requireAwardNotInProgress returns (bool) {\\n    carryOverBlocklist = _carry;\\n\\n    emit BlocklistCarrySet(_carry);\\n\\n    return true;\\n  }\\n\\n  /**\\n    * @notice Sets the number of attempts for winner selection if a blocked address is chosen.\\n    * @dev Limits winner selection (ticket.draw) retries to avoid to gas limit reached errors. Increases the probability of not reaching the maximum number of winners if to low.\\n    * @param _count Number of retry attempts\\n  */\\n  function setBlocklistRetryCount(uint256 _count) external onlyOwner requireAwardNotInProgress returns (bool) {\\n    blocklistRetryCount = _count;\\n\\n    emit BlocklistRetryCountSet(_count);\\n\\n    return true;\\n  }\\n  \\n  /**\\n    * @notice Toggle external ERC20 awards for all prize winners.\\n    * @dev Toggle external ERC20 awards for all prize winners. If unset will distribute external ERC20 awards to main winner.\\n    * @param _splitExternalErc20Awards Toggle splitting external ERC20 awards.\\n  */\\n  function setSplitExternalErc20Awards(bool _splitExternalErc20Awards) external onlyOwner requireAwardNotInProgress {\\n    splitExternalErc20Awards = _splitExternalErc20Awards;\\n\\n    emit SplitExternalErc20AwardsSet(splitExternalErc20Awards);\\n  }\\n\\n  /**\\n    * @notice Sets maximum number of winners.\\n    * @dev Sets maximum number of winners per award distribution period.\\n    * @param count Number of winners.\\n  */\\n  function setNumberOfWinners(uint256 count) external onlyOwner requireAwardNotInProgress {\\n    _setNumberOfWinners(count);\\n  }\\n\\n   /**\\n    * @dev Set the maximum number of winners. Must be greater than 0.\\n    * @param count Number of winners.\\n  */\\n  function _setNumberOfWinners(uint256 count) internal {\\n    require(count > 0, \\\"MultipleWinners/winners-gte-one\\\");\\n\\n    __numberOfWinners = count;\\n    emit NumberOfWinnersSet(count);\\n  }\\n\\n  /**\\n    * @notice Maximum number of winners per award distribution period\\n    * @dev Read maximum number of winners per award distribution period from internal __numberOfWinners variable.\\n    * @return __numberOfWinners The total number of winners per prize award.\\n  */\\n  function numberOfWinners() external view returns (uint256) {\\n    return __numberOfWinners;\\n  }\\n\\n  /**\\n    * @notice Award ticket or sponsorship tokens to prize split recipient.\\n    * @dev Award ticket or sponsorship tokens to prize split recipient via the linked PrizePool contract.\\n    * @param target Recipient of minted tokens\\n    * @param amount Amount of minted tokens\\n    * @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\\n  */\\n  function _awardPrizeSplitAmount(address target, uint256 amount, uint8 tokenIndex) override internal {\\n    _awardToken(target, amount, tokenIndex);\\n  }\\n\\n  /**\\n    * @notice Distributes captured award balance to winners\\n    * @dev Distributes the captured award balance to the main winner and secondary winners if __numberOfWinners greater than 1.\\n    * @param randomNumber Random number seed used to select winners\\n  */\\n  function _distribute(uint256 randomNumber) internal override {\\n    uint256 prize = prizePool.captureAwardBalance();\\n    \\n    // distributes prize to prize splits and returns remaining award.\\n    prize = _distributePrizeSplits(prize);\\n\\n    if (IERC20Upgradeable(address(ticket)).totalSupply() == 0) {\\n      emit NoWinners();\\n      return;\\n    }\\n\\n    bool _carryOverBlocklistPrizes = carryOverBlocklist;\\n\\n    // main winner is simply the first that is drawn\\n    uint256 numberOfWinners = __numberOfWinners;\\n    address[] memory winners = new address[](numberOfWinners);\\n    uint256 nextRandom = randomNumber;\\n    uint256 winnerCount = 0;\\n    uint256 retries = 0;\\n    uint256 _retryCount = blocklistRetryCount;\\n    while (winnerCount < numberOfWinners) {\\n      address winner = ticket.draw(nextRandom);\\n\\n      if (!isBlocklisted[winner]) {\\n        winners[winnerCount++] = winner;\\n      } else if (++retries >= _retryCount) {\\n        emit RetryMaxLimitReached(winnerCount);\\n        if(winnerCount == 0) {\\n          emit NoWinners();\\n        }\\n        break;\\n      }\\n\\n      // add some arbitrary numbers to the previous random number to ensure no matches with the UniformRandomNumber lib\\n      bytes32 nextRandomHash = keccak256(abi.encodePacked(nextRandom + 499 + winnerCount*521));\\n      nextRandom = uint256(nextRandomHash);\\n    }\\n\\n    // main winner gets all external ERC721 tokens\\n    _awardExternalErc721s(winners[0]);\\n\\n    // yield prize is split up among all winners\\n    uint256 prizeShare = _carryOverBlocklistPrizes ? prize.div(numberOfWinners) : prize.div(winnerCount);\\n    if (prizeShare > 0) {\\n      for (uint i = 0; i < winnerCount; i++) {\\n        _awardTickets(winners[i], prizeShare);\\n      }\\n    }\\n\\n    if (splitExternalErc20Awards) {\\n      address currentToken = externalErc20s.start();\\n      while (currentToken != address(0) && currentToken != externalErc20s.end()) {\\n        uint256 balance = IERC20Upgradeable(currentToken).balanceOf(address(prizePool));\\n        uint256 split = _carryOverBlocklistPrizes ? balance.div(numberOfWinners) : balance.div(winnerCount);\\n        if (split > 0) {\\n          for (uint256 i = 0; i < winnerCount; i++) {\\n            prizePool.awardExternalERC20(winners[i], currentToken, split);\\n          }\\n        }\\n        currentToken = externalErc20s.next(currentToken);\\n      }\\n    } else {\\n      _awardExternalErc20s(winners[0]);\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0x26fbb59d9251cd6d66a423abaea29d5ea182e539365767ebfed726fe6248a29a\",\"license\":\"MIT\"},\"contracts/prize-strategy/multiple-winners/MultipleWinnersProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./MultipleWinners.sol\\\";\\nimport \\\"../../external/openzeppelin/ProxyFactory.sol\\\";\\n\\n/// @title Creates a minimal proxy to the MultipleWinners prize strategy.  Very cheap to deploy.\\ncontract MultipleWinnersProxyFactory is ProxyFactory {\\n\\n  MultipleWinners public instance;\\n\\n  constructor () public {\\n    instance = new MultipleWinners();\\n  }\\n\\n  function create() external returns (MultipleWinners) {\\n    return MultipleWinners(deployMinimal(address(instance), \\\"\\\"));\\n  }\\n\\n}\",\"keccak256\":\"0x005d4b6c74b67d7dc49a928a3910c132295d39258dddaa991c79437e95a600ae\",\"license\":\"GPL-3.0\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TicketInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface TicketInterface {\\n  /// @notice Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\\n  /// @param randomNumber The random number to use to select a user.\\n  /// @return The winner\\n  function draw(uint256 randomNumber) external view returns (address);\\n}\",\"keccak256\":\"0x5201a9a22748781592abd2003801289224d4899292195b7de937cd5748be87dd\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListener.sol\":{\"content\":\"pragma solidity ^0.6.4;\\n\\nimport \\\"./TokenListenerInterface.sol\\\";\\nimport \\\"./TokenListenerLibrary.sol\\\";\\nimport \\\"../Constants.sol\\\";\\n\\nabstract contract TokenListener is TokenListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER\\n    );\\n  }\\n}\\n\",\"keccak256\":\"0xb0e98d10b004602e1d4f4369a70e6382002dc0c0c5713698eb6a92943aef2265\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 12374,
                "contract": "contracts/prize-strategy/multiple-winners/MultipleWinnersProxyFactory.sol:MultipleWinnersProxyFactory",
                "label": "instance",
                "offset": 0,
                "slot": "0",
                "type": "t_contract(MultipleWinners)12365"
              }
            ],
            "types": {
              "t_contract(MultipleWinners)12365": {
                "encoding": "inplace",
                "label": "contract MultipleWinners",
                "numberOfBytes": "20"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/registry/Registry.sol": {
        "Registry": {
          "abi": [
            {
              "inputs": [],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "pointer",
                  "type": "address"
                }
              ],
              "name": "Registered",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "lookup",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_pointer",
                  "type": "address"
                }
              ],
              "name": "register",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "renounceOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "owner()": {
                "details": "Returns the address of the current owner."
              },
              "renounceOwnership()": {
                "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
              },
              "transferOwnership(address)": {
                "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
              }
            },
            "title": "Interface that allows a user to draw an address using an index",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5061001961001e565b61028e565b600054610100900460ff168061003757506100376100d0565b80610045575060005460ff16155b6100805760405162461bcd60e51b815260040180806020018281038252602e815260200180610696602e913960400191505060405180910390fd5b600054610100900460ff161580156100ab576000805460ff1961ff0019909116610100171660011790555b6100b36100eb565b6100bb61018b565b80156100cd576000805461ff00191690555b50565b60006100e53061028460201b6103931760201c565b15905090565b600054610100900460ff168061010457506101046100d0565b80610112575060005460ff16155b61014d5760405162461bcd60e51b815260040180806020018281038252602e815260200180610696602e913960400191505060405180910390fd5b600054610100900460ff161580156100bb576000805460ff1961ff00199091166101001716600117905580156100cd576000805461ff001916905550565b600054610100900460ff16806101a457506101a46100d0565b806101b2575060005460ff16155b6101ed5760405162461bcd60e51b815260040180806020018281038252602e815260200180610696602e913960400191505060405180910390fd5b600054610100900460ff16158015610218576000805460ff1961ff0019909116610100171660011790555b600061022261028a565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156100cd576000805461ff001916905550565b3b151590565b3390565b6103f98061029d6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80634420e4861461005c578063715018a6146100845780638da5cb5b1461008c578063f2fde38b146100b0578063f5e3542b146100d6575b600080fd5b6100826004803603602081101561007257600080fd5b50356001600160a01b03166100de565b005b6100826101a2565b610094610260565b604080516001600160a01b039092168252519081900360200190f35b610082600480360360208110156100c657600080fd5b50356001600160a01b031661026f565b610094610384565b6100e6610399565b6001600160a01b03166100f7610260565b6001600160a01b031614610152576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b606580546001600160a01b0319166001600160a01b0383811691909117918290556040519116907f2d3734a8e47ac8316e500ac231c90a6e1848ca2285f40d07eaa52005e4b3a0e990600090a250565b6101aa610399565b6001600160a01b03166101bb610260565b6001600160a01b031614610216576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6033546001600160a01b031690565b610277610399565b6001600160a01b0316610288610260565b6001600160a01b0316146102e3576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166103285760405162461bcd60e51b815260040180806020018281038252602681526020018061039e6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031690565b3b151590565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a264697066735822122065685abb140a09f89e42f60ff949b05baf05a82610b3a955cf0a05d09e9f498b64736f6c634300060c0033496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19 PUSH2 0x1E JUMP JUMPDEST PUSH2 0x28E JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x37 JUMPI POP PUSH2 0x37 PUSH2 0xD0 JUMP JUMPDEST DUP1 PUSH2 0x45 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x80 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x696 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0xB3 PUSH2 0xEB JUMP JUMPDEST PUSH2 0xBB PUSH2 0x18B JUMP JUMPDEST DUP1 ISZERO PUSH2 0xCD JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE5 ADDRESS PUSH2 0x284 PUSH1 0x20 SHL PUSH2 0x393 OR PUSH1 0x20 SHR JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x104 JUMPI POP PUSH2 0x104 PUSH2 0xD0 JUMP JUMPDEST DUP1 PUSH2 0x112 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x14D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x696 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0xBB JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xCD JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1A4 JUMPI POP PUSH2 0x1A4 PUSH2 0xD0 JUMP JUMPDEST DUP1 PUSH2 0x1B2 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1ED JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x696 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x218 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x222 PUSH2 0x28A JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0xCD JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH2 0x3F9 DUP1 PUSH2 0x29D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x57 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x4420E486 EQ PUSH2 0x5C JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x84 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x8C JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0xB0 JUMPI DUP1 PUSH4 0xF5E3542B EQ PUSH2 0xD6 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x82 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x72 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xDE JUMP JUMPDEST STOP JUMPDEST PUSH2 0x82 PUSH2 0x1A2 JUMP JUMPDEST PUSH2 0x94 PUSH2 0x260 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x82 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xC6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x26F JUMP JUMPDEST PUSH2 0x94 PUSH2 0x384 JUMP JUMPDEST PUSH2 0xE6 PUSH2 0x399 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF7 PUSH2 0x260 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x152 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x65 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 AND SWAP1 PUSH32 0x2D3734A8E47AC8316E500AC231C90A6E1848CA2285F40D07EAA52005E4B3A0E9 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH2 0x1AA PUSH2 0x399 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1BB PUSH2 0x260 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x216 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x277 PUSH2 0x399 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x288 PUSH2 0x260 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2E3 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x328 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x39E PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP INVALID 0x4F PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F2061646472657373A264697066735822122065685ABB140A MULMOD 0xF8 SWAP15 TIMESTAMP 0xF6 0xF 0xF9 0x49 0xB0 JUMPDEST 0xAF SDIV 0xA8 0x26 LT 0xB3 0xA9 SSTORE 0xCF EXP SDIV 0xD0 SWAP15 SWAP16 0x49 DUP12 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER 0x49 PUSH15 0x697469616C697A61626C653A20636F PUSH15 0x747261637420697320616C72656164 PUSH26 0x20696E697469616C697A65640000000000000000000000000000 ",
              "sourceMap": "256:395:57:-:0;;;393:49;;;;;;;;;-1:-1:-1;421:16:57;:14;:16::i;:::-;256:395;;935:126:0;1512:13:9;;;;;;;;:33;;-1:-1:-1;1529:16:9;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;992:26:0::1;:24;:26::i;:::-;1028;:24;:26::i;:::-;1794:14:9::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1790:66;935:126:0;:::o;1952:123:9:-;2000:4;2024:44;2062:4;2024:29;;;;;:44;;:::i;:::-;2023:45;2016:52;;1952:123;:::o;759:64:19:-;1512:13:9;;;;;;;;:33;;-1:-1:-1;1529:16:9;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1794:14;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;759:64:19;:::o;1067:192:0:-;1512:13:9;;;;;;;;:33;;-1:-1:-1;1529:16:9;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1134:17:0::1;1154:12;:10;:12::i;:::-;1176:6;:18:::0;;-1:-1:-1;;;;;;1176:18:0::1;-1:-1:-1::0;;;;;1176:18:0;::::1;::::0;;::::1;::::0;;;1209:43:::1;::::0;1176:18;;-1:-1:-1;1176:18:0;-1:-1:-1;;1209:43:0::1;::::0;-1:-1:-1;;1209:43:0::1;1778:1:9;1794:14:::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1067:192:0;:::o;737:413:18:-;1097:20;1135:8;;;737:413::o;828:104:19:-;915:10;828:104;:::o;256:395:57:-;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106100575760003560e01c80634420e4861461005c578063715018a6146100845780638da5cb5b1461008c578063f2fde38b146100b0578063f5e3542b146100d6575b600080fd5b6100826004803603602081101561007257600080fd5b50356001600160a01b03166100de565b005b6100826101a2565b610094610260565b604080516001600160a01b039092168252519081900360200190f35b610082600480360360208110156100c657600080fd5b50356001600160a01b031661026f565b610094610384565b6100e6610399565b6001600160a01b03166100f7610260565b6001600160a01b031614610152576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b606580546001600160a01b0319166001600160a01b0383811691909117918290556040519116907f2d3734a8e47ac8316e500ac231c90a6e1848ca2285f40d07eaa52005e4b3a0e990600090a250565b6101aa610399565b6001600160a01b03166101bb610260565b6001600160a01b031614610216576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6033546001600160a01b031690565b610277610399565b6001600160a01b0316610288610260565b6001600160a01b0316146102e3576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166103285760405162461bcd60e51b815260040180806020018281038252602681526020018061039e6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031690565b3b151590565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a264697066735822122065685abb140a09f89e42f60ff949b05baf05a82610b3a955cf0a05d09e9f498b64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x57 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x4420E486 EQ PUSH2 0x5C JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x84 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x8C JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0xB0 JUMPI DUP1 PUSH4 0xF5E3542B EQ PUSH2 0xD6 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x82 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x72 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xDE JUMP JUMPDEST STOP JUMPDEST PUSH2 0x82 PUSH2 0x1A2 JUMP JUMPDEST PUSH2 0x94 PUSH2 0x260 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x82 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xC6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x26F JUMP JUMPDEST PUSH2 0x94 PUSH2 0x384 JUMP JUMPDEST PUSH2 0xE6 PUSH2 0x399 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF7 PUSH2 0x260 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x152 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x65 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 AND SWAP1 PUSH32 0x2D3734A8E47AC8316E500AC231C90A6E1848CA2285F40D07EAA52005E4B3A0E9 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH2 0x1AA PUSH2 0x399 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1BB PUSH2 0x260 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x216 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x277 PUSH2 0x399 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x288 PUSH2 0x260 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2E3 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x328 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x39E PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP INVALID 0x4F PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F2061646472657373A264697066735822122065685ABB140A MULMOD 0xF8 SWAP15 TIMESTAMP 0xF6 0xF 0xF9 0x49 0xB0 JUMPDEST 0xAF SDIV 0xA8 0x26 LT 0xB3 0xA9 SSTORE 0xCF EXP SDIV 0xD0 SWAP15 SWAP16 0x49 DUP12 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "256:395:57:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;446:115;;;;;;;;;;;;;;;;-1:-1:-1;446:115:57;-1:-1:-1;;;;;446:115:57;;:::i;:::-;;1967:145:0;;;:::i;1335:85::-;;;:::i;:::-;;;;-1:-1:-1;;;;;1335:85:0;;;;;;;;;;;;;;2261:240;;;;;;;;;;;;;;;;-1:-1:-1;2261:240:0;-1:-1:-1;;;;;2261:240:0;;:::i;565:84:57:-;;;:::i;446:115::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;507:7:57::1;:18:::0;;-1:-1:-1;;;;;;507:18:57::1;-1:-1:-1::0;;;;;507:18:57;;::::1;::::0;;;::::1;::::0;;;;537:19:::1;::::0;548:7;::::1;::::0;537:19:::1;::::0;-1:-1:-1;;537:19:57::1;446:115:::0;:::o;1967:145:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2057:6:::1;::::0;2036:40:::1;::::0;2073:1:::1;::::0;-1:-1:-1;;;;;2057:6:0::1;::::0;2036:40:::1;::::0;2073:1;;2036:40:::1;2086:6;:19:::0;;-1:-1:-1;;;;;;2086:19:0::1;::::0;;1967:145::o;1335:85::-;1407:6;;-1:-1:-1;;;;;1407:6:0;1335:85;:::o;2261:240::-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2349:22:0;::::1;2341:73;;;;-1:-1:-1::0;;;2341:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2450:6;::::0;2429:38:::1;::::0;-1:-1:-1;;;;;2429:38:0;;::::1;::::0;2450:6:::1;::::0;2429:38:::1;::::0;2450:6:::1;::::0;2429:38:::1;2477:6;:17:::0;;-1:-1:-1;;;;;;2477:17:0::1;-1:-1:-1::0;;;;;2477:17:0;;;::::1;::::0;;;::::1;::::0;;2261:240::o;565:84:57:-;637:7;;-1:-1:-1;;;;;637:7:57;565:84;:::o;737:413:18:-;1097:20;1135:8;;;737:413::o;828:104:19:-;915:10;828:104;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "203400",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "lookup()": "1103",
                "owner()": "1059",
                "register(address)": "23138",
                "renounceOwnership()": "24252",
                "transferOwnership(address)": "infinite"
              }
            },
            "methodIdentifiers": {
              "lookup()": "f5e3542b",
              "owner()": "8da5cb5b",
              "register(address)": "4420e486",
              "renounceOwnership()": "715018a6",
              "transferOwnership(address)": "f2fde38b"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"pointer\",\"type\":\"address\"}],\"name\":\"Registered\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"lookup\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_pointer\",\"type\":\"address\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"Interface that allows a user to draw an address using an index\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/registry/Registry.sol\":\"Registry\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"contracts/registry/Registry.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\n\\nimport \\\"./RegistryInterface.sol\\\";\\n\\n/// @title Interface that allows a user to draw an address using an index\\ncontract Registry is OwnableUpgradeable, RegistryInterface {\\n  address private pointer;\\n\\n  event Registered(address indexed pointer);\\n\\n  constructor () public {\\n    __Ownable_init();\\n  }\\n\\n  function register(address _pointer) external onlyOwner {\\n    pointer = _pointer;\\n\\n    emit Registered(pointer);\\n  }\\n\\n  function lookup() external override view returns (address) {\\n    return pointer;\\n  }\\n}\\n\",\"keccak256\":\"0xf62c33152819e318f002457972598d1ce950ef96a251cd3ce3b2420c717eb242\",\"license\":\"GPL-3.0\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/registry/Registry.sol:Registry",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/registry/Registry.sol:Registry",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/registry/Registry.sol:Registry",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 10,
                "contract": "contracts/registry/Registry.sol:Registry",
                "label": "_owner",
                "offset": 0,
                "slot": "51",
                "type": "t_address"
              },
              {
                "astId": 129,
                "contract": "contracts/registry/Registry.sol:Registry",
                "label": "__gap",
                "offset": 0,
                "slot": "52",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 12412,
                "contract": "contracts/registry/Registry.sol:Registry",
                "label": "pointer",
                "offset": 0,
                "slot": "101",
                "type": "t_address"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/registry/RegistryInterface.sol": {
        "RegistryInterface": {
          "abi": [
            {
              "inputs": [],
              "name": "lookup",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "title": "Interface that allows a user to draw an address using an index",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "lookup()": "f5e3542b"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"lookup\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"title\":\"Interface that allows a user to draw an address using an index\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/registry/RegistryInterface.sol\":\"RegistryInterface\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/reserve/Reserve.sol": {
        "Reserve": {
          "abi": [
            {
              "inputs": [],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "rateMantissa",
                  "type": "uint256"
                }
              ],
              "name": "ReserveRateMantissaSet",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "rateMantissa",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "renounceOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "reserveRateMantissa",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_rateMantissa",
                  "type": "uint256"
                }
              ],
              "name": "setRateMantissa",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "prizePool",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                }
              ],
              "name": "withdrawReserve",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "owner()": {
                "details": "Returns the address of the current owner."
              },
              "renounceOwnership()": {
                "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
              },
              "transferOwnership(address)": {
                "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
              }
            },
            "title": "Interface that allows a user to draw an address using an index",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5061001961001e565b61028e565b600054610100900460ff168061003757506100376100d0565b80610045575060005460ff16155b6100805760405162461bcd60e51b815260040180806020018281038252602e8152602001806107d2602e913960400191505060405180910390fd5b600054610100900460ff161580156100ab576000805460ff1961ff0019909116610100171660011790555b6100b36100eb565b6100bb61018b565b80156100cd576000805461ff00191690555b50565b60006100e53061028460201b6104af1760201c565b15905090565b600054610100900460ff168061010457506101046100d0565b80610112575060005460ff16155b61014d5760405162461bcd60e51b815260040180806020018281038252602e8152602001806107d2602e913960400191505060405180910390fd5b600054610100900460ff161580156100bb576000805460ff1961ff00199091166101001716600117905580156100cd576000805461ff001916905550565b600054610100900460ff16806101a457506101a46100d0565b806101b2575060005460ff16155b6101ed5760405162461bcd60e51b815260040180806020018281038252602e8152602001806107d2602e913960400191505060405180910390fd5b600054610100900460ff16158015610218576000805460ff1961ff0019909116610100171660011790555b600061022261028a565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156100cd576000805461ff001916905550565b3b151590565b3390565b6105358061029d6000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063715018a61161005b578063715018a6146100f057806381b659d2146100fa5780638da5cb5b14610117578063f2fde38b1461013b5761007d565b8063010dfa58146100825780633e0b06db146100ba57806361853b42146100c2575b600080fd5b6100a86004803603602081101561009857600080fd5b50356001600160a01b0316610161565b60408051918252519081900360200190f35b6100a8610168565b6100a8600480360360408110156100d857600080fd5b506001600160a01b038135811691602001351661016e565b6100f8610254565b005b6100f86004803603602081101561011057600080fd5b5035610300565b61011f61039d565b604080516001600160a01b039092168252519081900360200190f35b6100f86004803603602081101561015157600080fd5b50356001600160a01b03166103ac565b5060655490565b60655481565b60006101786104b5565b6001600160a01b031661018961039d565b6001600160a01b0316146101d2576040805162461bcd60e51b815260206004820181905260248201526000805160206104e0833981519152604482015290519081900360640190fd5b826001600160a01b03166352a387ab836040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561022157600080fd5b505af1158015610235573d6000803e3d6000fd5b505050506040513d602081101561024b57600080fd5b50519392505050565b61025c6104b5565b6001600160a01b031661026d61039d565b6001600160a01b0316146102b6576040805162461bcd60e51b815260206004820181905260248201526000805160206104e0833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6103086104b5565b6001600160a01b031661031961039d565b6001600160a01b031614610362576040805162461bcd60e51b815260206004820181905260248201526000805160206104e0833981519152604482015290519081900360640190fd5b60658190556040805182815290517f596f4db485f9f39633eefcb1b04b10114fc6bc60e5feff327e5b2cace874129f9181900360200190a150565b6033546001600160a01b031690565b6103b46104b5565b6001600160a01b03166103c561039d565b6001600160a01b03161461040e576040805162461bcd60e51b815260206004820181905260248201526000805160206104e0833981519152604482015290519081900360640190fd5b6001600160a01b0381166104535760405162461bcd60e51b81526004018080602001828103825260268152602001806104ba6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b3b151590565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212206285f5dff1143ffcb3d6471a9b40e20d03b38873aaeb7b2221dce5d1ac152a0364736f6c634300060c0033496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19 PUSH2 0x1E JUMP JUMPDEST PUSH2 0x28E JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x37 JUMPI POP PUSH2 0x37 PUSH2 0xD0 JUMP JUMPDEST DUP1 PUSH2 0x45 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x80 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x7D2 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0xB3 PUSH2 0xEB JUMP JUMPDEST PUSH2 0xBB PUSH2 0x18B JUMP JUMPDEST DUP1 ISZERO PUSH2 0xCD JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE5 ADDRESS PUSH2 0x284 PUSH1 0x20 SHL PUSH2 0x4AF OR PUSH1 0x20 SHR JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x104 JUMPI POP PUSH2 0x104 PUSH2 0xD0 JUMP JUMPDEST DUP1 PUSH2 0x112 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x14D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x7D2 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0xBB JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xCD JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1A4 JUMPI POP PUSH2 0x1A4 PUSH2 0xD0 JUMP JUMPDEST DUP1 PUSH2 0x1B2 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1ED JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x7D2 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x218 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x222 PUSH2 0x28A JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0xCD JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH2 0x535 DUP1 PUSH2 0x29D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x7D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x715018A6 GT PUSH2 0x5B JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0xF0 JUMPI DUP1 PUSH4 0x81B659D2 EQ PUSH2 0xFA JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x117 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x13B JUMPI PUSH2 0x7D JUMP JUMPDEST DUP1 PUSH4 0x10DFA58 EQ PUSH2 0x82 JUMPI DUP1 PUSH4 0x3E0B06DB EQ PUSH2 0xBA JUMPI DUP1 PUSH4 0x61853B42 EQ PUSH2 0xC2 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x98 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x161 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0xA8 PUSH2 0x168 JUMP JUMPDEST PUSH2 0xA8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x16E JUMP JUMPDEST PUSH2 0xF8 PUSH2 0x254 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xF8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x110 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x300 JUMP JUMPDEST PUSH2 0x11F PUSH2 0x39D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0xF8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x151 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3AC JUMP JUMPDEST POP PUSH1 0x65 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x65 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x178 PUSH2 0x4B5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x189 PUSH2 0x39D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1D2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4E0 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x52A387AB DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x221 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x235 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x24B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x25C PUSH2 0x4B5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x26D PUSH2 0x39D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2B6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4E0 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x308 PUSH2 0x4B5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x319 PUSH2 0x39D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x362 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4E0 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x65 DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x596F4DB485F9F39633EEFCB1B04B10114FC6BC60E5FEFF327E5B2CACE874129F SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x3B4 PUSH2 0x4B5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3C5 PUSH2 0x39D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x40E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4E0 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x453 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4BA PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP INVALID 0x4F PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F20616464726573734F776E61626C653A2063616C6C657220 PUSH10 0x73206E6F742074686520 PUSH16 0x776E6572A26469706673582212206285 CREATE2 0xDF CALL EQ EXTCODEHASH 0xFC 0xB3 0xD6 SELFBALANCE BYTE SWAP12 BLOCKHASH 0xE2 0xD SUB 0xB3 DUP9 PUSH20 0xAAEB7B2221DCE5D1AC152A0364736F6C63430006 0xC STOP CALLER 0x49 PUSH15 0x697469616C697A61626C653A20636F PUSH15 0x747261637420697320616C72656164 PUSH26 0x20696E697469616C697A65640000000000000000000000000000 ",
              "sourceMap": "302:653:59:-:0;;;451:49;;;;;;;;;-1:-1:-1;479:16:59;:14;:16::i;:::-;302:653;;935:126:0;1512:13:9;;;;;;;;:33;;-1:-1:-1;1529:16:9;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;992:26:0::1;:24;:26::i;:::-;1028;:24;:26::i;:::-;1794:14:9::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1790:66;935:126:0;:::o;1952:123:9:-;2000:4;2024:44;2062:4;2024:29;;;;;:44;;:::i;:::-;2023:45;2016:52;;1952:123;:::o;759:64:19:-;1512:13:9;;;;;;;;:33;;-1:-1:-1;1529:16:9;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1794:14;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;759:64:19;:::o;1067:192:0:-;1512:13:9;;;;;;;;:33;;-1:-1:-1;1529:16:9;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1134:17:0::1;1154:12;:10;:12::i;:::-;1176:6;:18:::0;;-1:-1:-1;;;;;;1176:18:0::1;-1:-1:-1::0;;;;;1176:18:0;::::1;::::0;;::::1;::::0;;;1209:43:::1;::::0;1176:18;;-1:-1:-1;1176:18:0;-1:-1:-1;;1209:43:0::1;::::0;-1:-1:-1;;1209:43:0::1;1778:1:9;1794:14:::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1067:192:0;:::o;737:413:18:-;1097:20;1135:8;;;737:413::o;828:104:19:-;915:10;828:104;:::o;302:653:59:-;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506004361061007d5760003560e01c8063715018a61161005b578063715018a6146100f057806381b659d2146100fa5780638da5cb5b14610117578063f2fde38b1461013b5761007d565b8063010dfa58146100825780633e0b06db146100ba57806361853b42146100c2575b600080fd5b6100a86004803603602081101561009857600080fd5b50356001600160a01b0316610161565b60408051918252519081900360200190f35b6100a8610168565b6100a8600480360360408110156100d857600080fd5b506001600160a01b038135811691602001351661016e565b6100f8610254565b005b6100f86004803603602081101561011057600080fd5b5035610300565b61011f61039d565b604080516001600160a01b039092168252519081900360200190f35b6100f86004803603602081101561015157600080fd5b50356001600160a01b03166103ac565b5060655490565b60655481565b60006101786104b5565b6001600160a01b031661018961039d565b6001600160a01b0316146101d2576040805162461bcd60e51b815260206004820181905260248201526000805160206104e0833981519152604482015290519081900360640190fd5b826001600160a01b03166352a387ab836040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561022157600080fd5b505af1158015610235573d6000803e3d6000fd5b505050506040513d602081101561024b57600080fd5b50519392505050565b61025c6104b5565b6001600160a01b031661026d61039d565b6001600160a01b0316146102b6576040805162461bcd60e51b815260206004820181905260248201526000805160206104e0833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6103086104b5565b6001600160a01b031661031961039d565b6001600160a01b031614610362576040805162461bcd60e51b815260206004820181905260248201526000805160206104e0833981519152604482015290519081900360640190fd5b60658190556040805182815290517f596f4db485f9f39633eefcb1b04b10114fc6bc60e5feff327e5b2cace874129f9181900360200190a150565b6033546001600160a01b031690565b6103b46104b5565b6001600160a01b03166103c561039d565b6001600160a01b03161461040e576040805162461bcd60e51b815260206004820181905260248201526000805160206104e0833981519152604482015290519081900360640190fd5b6001600160a01b0381166104535760405162461bcd60e51b81526004018080602001828103825260268152602001806104ba6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b3b151590565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212206285f5dff1143ffcb3d6471a9b40e20d03b38873aaeb7b2221dce5d1ac152a0364736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x7D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x715018A6 GT PUSH2 0x5B JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0xF0 JUMPI DUP1 PUSH4 0x81B659D2 EQ PUSH2 0xFA JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x117 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x13B JUMPI PUSH2 0x7D JUMP JUMPDEST DUP1 PUSH4 0x10DFA58 EQ PUSH2 0x82 JUMPI DUP1 PUSH4 0x3E0B06DB EQ PUSH2 0xBA JUMPI DUP1 PUSH4 0x61853B42 EQ PUSH2 0xC2 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x98 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x161 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0xA8 PUSH2 0x168 JUMP JUMPDEST PUSH2 0xA8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x16E JUMP JUMPDEST PUSH2 0xF8 PUSH2 0x254 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xF8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x110 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x300 JUMP JUMPDEST PUSH2 0x11F PUSH2 0x39D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0xF8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x151 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3AC JUMP JUMPDEST POP PUSH1 0x65 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x65 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x178 PUSH2 0x4B5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x189 PUSH2 0x39D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1D2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4E0 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x52A387AB DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x221 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x235 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x24B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x25C PUSH2 0x4B5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x26D PUSH2 0x39D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2B6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4E0 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x308 PUSH2 0x4B5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x319 PUSH2 0x39D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x362 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4E0 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x65 DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x596F4DB485F9F39633EEFCB1B04B10114FC6BC60E5FEFF327E5B2CACE874129F SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x3B4 PUSH2 0x4B5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3C5 PUSH2 0x39D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x40E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4E0 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x453 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4BA PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP INVALID 0x4F PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F20616464726573734F776E61626C653A2063616C6C657220 PUSH10 0x73206E6F742074686520 PUSH16 0x776E6572A26469706673582212206285 CREATE2 0xDF CALL EQ EXTCODEHASH 0xFC 0xB3 0xD6 SELFBALANCE BYTE SWAP12 BLOCKHASH 0xE2 0xD SUB 0xB3 DUP9 PUSH20 0xAAEB7B2221DCE5D1AC152A0364736F6C63430006 0xC STOP CALLER ",
              "sourceMap": "302:653:59:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;844:109;;;;;;;;;;;;;;;;-1:-1:-1;844:109:59;-1:-1:-1;;;;;844:109:59;;:::i;:::-;;;;;;;;;;;;;;;;419:27;;;:::i;680:160::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;680:160:59;;;;;;;;;;:::i;1967:145:0:-;;;:::i;:::-;;504:172:59;;;;;;;;;;;;;;;;-1:-1:-1;504:172:59;;:::i;1335:85:0:-;;;:::i;:::-;;;;-1:-1:-1;;;;;1335:85:0;;;;;;;;;;;;;;2261:240;;;;;;;;;;;;;;;;-1:-1:-1;2261:240:0;-1:-1:-1;;;;;2261:240:0;;:::i;844:109:59:-;-1:-1:-1;936:12:59;;;844:109::o;419:27::-;;;;:::o;680:160::-;764:7;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;805:9:59::1;-1:-1:-1::0;;;;;786:45:59::1;;832:2;786:49;;;;;;;;;;;;;-1:-1:-1::0;;;;;786:49:59::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;786:49:59;;680:160;-1:-1:-1;;;680:160:59:o;1967:145:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;2057:6:::1;::::0;2036:40:::1;::::0;2073:1:::1;::::0;-1:-1:-1;;;;;2057:6:0::1;::::0;2036:40:::1;::::0;2073:1;;2036:40:::1;2086:6;:19:::0;;-1:-1:-1;;;;;;2086:19:0::1;::::0;;1967:145::o;504:172:59:-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;595:12:59::1;:28:::0;;;635:36:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;504:172:::0;:::o;1335:85:0:-;1407:6;;-1:-1:-1;;;;;1407:6:0;1335:85;:::o;2261:240::-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;2349:22:0;::::1;2341:73;;;;-1:-1:-1::0;;;2341:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2450:6;::::0;2429:38:::1;::::0;-1:-1:-1;;;;;2429:38:0;;::::1;::::0;2450:6:::1;::::0;2429:38:::1;::::0;2450:6:::1;::::0;2429:38:::1;2477:6;:17:::0;;-1:-1:-1;;;;;;2477:17:0::1;-1:-1:-1::0;;;;;2477:17:0;;;::::1;::::0;;;::::1;::::0;;2261:240::o;737:413:18:-;1097:20;1135:8;;;737:413::o;828:104:19:-;915:10;828:104;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "266600",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "owner()": "1081",
                "rateMantissa()": "1021",
                "renounceOwnership()": "infinite",
                "reserveRateMantissa(address)": "1061",
                "setRateMantissa(uint256)": "infinite",
                "transferOwnership(address)": "infinite",
                "withdrawReserve(address,address)": "infinite"
              }
            },
            "methodIdentifiers": {
              "owner()": "8da5cb5b",
              "rateMantissa()": "3e0b06db",
              "renounceOwnership()": "715018a6",
              "reserveRateMantissa(address)": "010dfa58",
              "setRateMantissa(uint256)": "81b659d2",
              "transferOwnership(address)": "f2fde38b",
              "withdrawReserve(address,address)": "61853b42"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rateMantissa\",\"type\":\"uint256\"}],\"name\":\"ReserveRateMantissaSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rateMantissa\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"reserveRateMantissa\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_rateMantissa\",\"type\":\"uint256\"}],\"name\":\"setRateMantissa\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"prizePool\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawReserve\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"Interface that allows a user to draw an address using an index\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/reserve/Reserve.sol\":\"Reserve\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/reserve/Reserve.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\n\\nimport \\\"./ReserveInterface.sol\\\";\\nimport \\\"../prize-pool/PrizePoolInterface.sol\\\";\\n\\n/// @title Interface that allows a user to draw an address using an index\\ncontract Reserve is OwnableUpgradeable, ReserveInterface {\\n\\n  event ReserveRateMantissaSet(uint256 rateMantissa);\\n\\n  uint256 public rateMantissa;\\n\\n  constructor () public {\\n    __Ownable_init();\\n  }\\n\\n  function setRateMantissa(\\n    uint256 _rateMantissa\\n  )\\n    external\\n    onlyOwner\\n  {\\n    rateMantissa = _rateMantissa;\\n\\n    emit ReserveRateMantissaSet(rateMantissa);\\n  }\\n\\n  function withdrawReserve(address prizePool, address to) external onlyOwner returns (uint256) {\\n    return PrizePoolInterface(prizePool).withdrawReserve(to);\\n  }\\n\\n  function reserveRateMantissa(address) external view override returns (uint256) {\\n    return rateMantissa;\\n  }\\n}\\n\",\"keccak256\":\"0x7d284a7c518c5092f8cb7f5fe1841d0813b2a8aeae35774ee2d4ba56bf2fc06c\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/reserve/Reserve.sol:Reserve",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/reserve/Reserve.sol:Reserve",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/reserve/Reserve.sol:Reserve",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 10,
                "contract": "contracts/reserve/Reserve.sol:Reserve",
                "label": "_owner",
                "offset": 0,
                "slot": "51",
                "type": "t_address"
              },
              {
                "astId": 129,
                "contract": "contracts/reserve/Reserve.sol:Reserve",
                "label": "__gap",
                "offset": 0,
                "slot": "52",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 12474,
                "contract": "contracts/reserve/Reserve.sol:Reserve",
                "label": "rateMantissa",
                "offset": 0,
                "slot": "101",
                "type": "t_uint256"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/reserve/ReserveInterface.sol": {
        "ReserveInterface": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "prizePool",
                  "type": "address"
                }
              ],
              "name": "reserveRateMantissa",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "title": "Interface that allows a user to draw an address using an index",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "reserveRateMantissa(address)": "010dfa58"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"prizePool\",\"type\":\"address\"}],\"name\":\"reserveRateMantissa\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"title\":\"Interface that allows a user to draw an address using an index\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/reserve/ReserveInterface.sol\":\"ReserveInterface\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/test/BeforeAwardListenerStub.sol": {
        "BeforeAwardListenerStub": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [],
              "name": "Awarded",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "randomNumber",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "prizePeriodStartedAt",
                  "type": "uint256"
                }
              ],
              "name": "beforePrizePoolAwarded",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes4",
                  "name": "interfaceId",
                  "type": "bytes4"
                }
              ],
              "name": "supportsInterface",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "supportsInterface(bytes4)": {
                "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5061012a806100206000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c806301ffc9a71460375780634cdf9c3e14606f575b600080fd5b605b60048036036020811015604b57600080fd5b50356001600160e01b0319166091565b604080519115158252519081900360200190f35b608f60048036036040811015608357600080fd5b508035906020013560c7565b005b60006001600160e01b031982166301ffc9a760e01b148060c157506001600160e01b0319821663266fce1f60e11b145b92915050565b6040517fff25434fb2c7a5b6e29600471de5f2b833288fc8658779d4766cb8f8f6fbdc3090600090a1505056fea2646970667358221220996ed0433f0849c7398ca98570aa5786ed65156bb1a3c874570402cfab7026e164736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x12A DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH1 0x32 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH1 0x37 JUMPI DUP1 PUSH4 0x4CDF9C3E EQ PUSH1 0x6F JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x5B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH1 0x4B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x91 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x8F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH1 0x83 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH1 0xC7 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL EQ DUP1 PUSH1 0xC1 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0x266FCE1F PUSH1 0xE1 SHL EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFF25434FB2C7A5B6E29600471DE5F2B833288FC8658779D4766CB8F8F6FBDC30 SWAP1 PUSH1 0x0 SWAP1 LOG1 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP10 PUSH15 0xD0433F0849C7398CA98570AA5786ED PUSH6 0x156BB1A3C874 JUMPI DIV MUL 0xCF 0xAB PUSH17 0x26E164736F6C634300060C003300000000 ",
              "sourceMap": "125:210:61:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "6080604052348015600f57600080fd5b506004361060325760003560e01c806301ffc9a71460375780634cdf9c3e14606f575b600080fd5b605b60048036036020811015604b57600080fd5b50356001600160e01b0319166091565b604080519115158252519081900360200190f35b608f60048036036040811015608357600080fd5b508035906020013560c7565b005b60006001600160e01b031982166301ffc9a760e01b148060c157506001600160e01b0319821663266fce1f60e11b145b92915050565b6040517fff25434fb2c7a5b6e29600471de5f2b833288fc8658779d4766cb8f8f6fbdc3090600090a1505056fea2646970667358221220996ed0433f0849c7398ca98570aa5786ed65156bb1a3c874570402cfab7026e164736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH1 0x32 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH1 0x37 JUMPI DUP1 PUSH4 0x4CDF9C3E EQ PUSH1 0x6F JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x5B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH1 0x4B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x91 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x8F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH1 0x83 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH1 0xC7 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL EQ DUP1 PUSH1 0xC1 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0x266FCE1F PUSH1 0xE1 SHL EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFF25434FB2C7A5B6E29600471DE5F2B833288FC8658779D4766CB8F8F6FBDC30 SWAP1 PUSH1 0x0 SWAP1 LOG1 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP10 PUSH15 0xD0433F0849C7398CA98570AA5786ED PUSH6 0x156BB1A3C874 JUMPI DIV MUL 0xCF 0xAB PUSH17 0x26E164736F6C634300060C003300000000 ",
              "sourceMap": "125:210:61:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;252:262:47;;;;;;;;;;;;;;;;-1:-1:-1;252:262:47;-1:-1:-1;;;;;;252:262:47;;:::i;:::-;;;;;;;;;;;;;;;;;;206:127:61;;;;;;;;;;;;;;;;-1:-1:-1;206:127:61;;;;;;;:::i;:::-;;252:262:47;331:4;-1:-1:-1;;;;;;358:51:47;;-1:-1:-1;;;358:51:47;;:145;;-1:-1:-1;;;;;;;420:83:47;;-1:-1:-1;;;420:83:47;358:145;343:166;252:262;-1:-1:-1;;252:262:47:o;206:127:61:-;319:9;;;;;;;206:127;;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "59600",
                "executionCost": "111",
                "totalCost": "59711"
              },
              "external": {
                "beforePrizePoolAwarded(uint256,uint256)": "973",
                "supportsInterface(bytes4)": "343"
              }
            },
            "methodIdentifiers": {
              "beforePrizePoolAwarded(uint256,uint256)": "4cdf9c3e",
              "supportsInterface(bytes4)": "01ffc9a7"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[],\"name\":\"Awarded\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"randomNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prizePeriodStartedAt\",\"type\":\"uint256\"}],\"name\":\"beforePrizePoolAwarded\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"beforePrizePoolAwarded(uint256,uint256)\":{\"notice\":\"Called immediately before the award is distributed\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/BeforeAwardListenerStub.sol\":\"BeforeAwardListenerStub\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"contracts/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary Constants {\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC721 = 0x80ac58cd;\\n}\",\"keccak256\":\"0x5dc8f8bda4e9668a9ffae6a941774f849adcb368cc2275fd8a91e6ada8fad7fb\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListener.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./BeforeAwardListenerInterface.sol\\\";\\nimport \\\"../Constants.sol\\\";\\nimport \\\"./BeforeAwardListenerLibrary.sol\\\";\\n\\nabstract contract BeforeAwardListener is BeforeAwardListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == BeforeAwardListenerLibrary.ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER\\n    );\\n  }\\n}\",\"keccak256\":\"0x5da2a7332421d6136d793ef55410c2da63a7fb719e8522697f78ac4c50391505\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @notice The interface for the Periodic Prize Strategy before award listener.  This listener will be called immediately before the award is distributed.\\ninterface BeforeAwardListenerInterface is IERC165Upgradeable {\\n  /// @notice Called immediately before the award is distributed\\n  function beforePrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x96145efe8fc65aff97d11ffaf0905d53baf4b87c4a575a84d691804468f12083\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary BeforeAwardListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforePrizePoolAwarded(uint256,uint256)')) == 0x4cdf9c3e\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER = 0x4cdf9c3e;\\n}\",\"keccak256\":\"0xeac08a7b8e2e7d508a0af89c05c31c36e2b060674d05dfa9a5016cf2d12cf500\",\"license\":\"GPL-3.0\"},\"contracts/test/BeforeAwardListenerStub.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"../prize-strategy/BeforeAwardListener.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ncontract BeforeAwardListenerStub is BeforeAwardListener {\\n\\n  event Awarded();\\n\\n  function beforePrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external override {\\n    emit Awarded();\\n  }\\n}\",\"keccak256\":\"0x426efa7f4bbc4677c4943c568f534b82e671e76ef723a5e5e03a7a908c0f951f\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "beforePrizePoolAwarded(uint256,uint256)": {
                "notice": "Called immediately before the award is distributed"
              }
            },
            "version": 1
          }
        }
      },
      "contracts/test/CTokenMock.sol": {
        "CTokenMock": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "contract ERC20Mintable",
                  "name": "_token",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_supplyRatePerBlock",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Approval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Transfer",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "accrue",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "accrueCustom",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                }
              ],
              "name": "allowance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "approve",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                }
              ],
              "name": "balanceOfUnderlying",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "burn",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "tokens",
                  "type": "uint256"
                }
              ],
              "name": "cTokenValueOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "decimals",
              "outputs": [
                {
                  "internalType": "uint8",
                  "name": "",
                  "type": "uint8"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "subtractedValue",
                  "type": "uint256"
                }
              ],
              "name": "decreaseAllowance",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "exchangeRateCurrent",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "getCash",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "addedValue",
                  "type": "uint256"
                }
              ],
              "name": "increaseAllowance",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "mint",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "name",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "requestedAmount",
                  "type": "uint256"
                }
              ],
              "name": "redeemUnderlying",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_supplyRatePerBlock",
                  "type": "uint256"
                }
              ],
              "name": "setSupplyRateMantissa",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "supplyRatePerBlock",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "symbol",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transfer",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "sender",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transferFrom",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "underlying",
              "outputs": [
                {
                  "internalType": "contract ERC20Mintable",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "allowance(address,address)": {
                "details": "See {IERC20-allowance}."
              },
              "approve(address,uint256)": {
                "details": "See {IERC20-approve}. Requirements: - `spender` cannot be the zero address."
              },
              "balanceOf(address)": {
                "details": "See {IERC20-balanceOf}."
              },
              "decimals()": {
                "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is called. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."
              },
              "decreaseAllowance(address,uint256)": {
                "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."
              },
              "increaseAllowance(address,uint256)": {
                "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address."
              },
              "name()": {
                "details": "Returns the name of the token."
              },
              "symbol()": {
                "details": "Returns the symbol of the token, usually a shorter version of the name."
              },
              "totalSupply()": {
                "details": "See {IERC20-totalSupply}."
              },
              "transfer(address,uint256)": {
                "details": "See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`."
              },
              "transferFrom(address,address,uint256)": {
                "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5060405161162d38038061162d8339818101604052604081101561003357600080fd5b5080516020909101516001600160a01b038216610097576040805162461bcd60e51b815260206004820152601460248201527f746f6b656e206973206e6f7420646566696e6564000000000000000000000000604482015290519081900360640190fd5b606680546001600160a01b0319166001600160a01b039390931692909217909155606755611563806100ca6000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80636f307dc3116100c3578063a457c2d71161007c578063a457c2d7146103d9578063a9059cbb14610405578063ae9d70b014610431578063bd6d894d14610439578063dd62ed3e14610441578063f8ba4cff1461046f5761014d565b80636f307dc31461033057806370a08231146103545780637dabc3ce1461037a578063852a12e31461039757806395d89b41146103b4578063a0712d68146103bc5761014d565b80633950935111610115578063395093511461027d5780633af9e669146102a95780633b1d21a2146102cf57806342966c68146102d75780634c1fb633146102f65780635a2c37ca146103135761014d565b806306fdde0314610152578063095ea7b3146101cf57806318160ddd1461020f57806323b872dd14610229578063313ce5671461025f575b600080fd5b61015a610477565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561019457818101518382015260200161017c565b50505050905090810190601f1680156101c15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101fb600480360360408110156101e557600080fd5b506001600160a01b03813516906020013561050e565b604080519115158252519081900360200190f35b61021761052c565b60408051918252519081900360200190f35b6101fb6004803603606081101561023f57600080fd5b506001600160a01b03813581169160208101359091169060400135610532565b6102676105b9565b6040805160ff9092168252519081900360200190f35b6101fb6004803603604081101561029357600080fd5b506001600160a01b0381351690602001356105c2565b610217600480360360208110156102bf57600080fd5b50356001600160a01b0316610610565b61021761062b565b6102f4600480360360208110156102ed57600080fd5b50356106a7565b005b6102f46004803603602081101561030c57600080fd5b503561072a565b6102f46004803603602081101561032957600080fd5b503561077e565b610338610783565b604080516001600160a01b039092168252519081900360200190f35b6102176004803603602081101561036a57600080fd5b50356001600160a01b0316610792565b6102176004803603602081101561039057600080fd5b50356107ad565b610217600480360360208110156103ad57600080fd5b50356107c0565b61015a6108ab565b610217600480360360208110156103d257600080fd5b503561090c565b6101fb600480360360408110156103ef57600080fd5b506001600160a01b038135169060200135610aa4565b6101fb6004803603604081101561041b57600080fd5b506001600160a01b038135169060200135610b0c565b610217610b20565b610217610b26565b6102176004803603604081101561045757600080fd5b506001600160a01b0381358116916020013516610bcf565b6102f4610bfa565b60368054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105035780601f106104d857610100808354040283529160200191610503565b820191906000526020600020905b8154815290600101906020018083116104e657829003601f168201915b505050505090505b90565b600061052261051b610cd9565b8484610cdd565b5060015b92915050565b60355490565b600061053f848484610dc9565b6105af8461054b610cd9565b6105aa85604051806060016040528060288152602001611477602891396001600160a01b038a16600090815260346020526040812090610589610cd9565b6001600160a01b031681526020810191909152604001600020549190610f26565b610cdd565b5060019392505050565b60385460ff1690565b60006105226105cf610cd9565b846105aa85603460006105e0610cd9565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490610fbd565b600061052661061e83610792565b610626610b26565b61101e565b606654604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561067657600080fd5b505afa15801561068a573d6000803e3d6000fd5b505050506040513d60208110156106a057600080fd5b5051905090565b60665460408051632770a7eb60e21b81523060048201526024810184905290516001600160a01b0390921691639dc29fac916044808201926020929091908290030181600087803b1580156106fb57600080fd5b505af115801561070f573d6000803e3d6000fd5b505050506040513d602081101561072557600080fd5b505050565b606654604080516340c10f1960e01b81523060048201526024810184905290516001600160a01b03909216916340c10f19916044808201926020929091908290030181600087803b1580156106fb57600080fd5b606755565b6066546001600160a01b031681565b6001600160a01b031660009081526033602052604090205490565b6000610526826107bb610b26565b611047565b6000806107cc836107ad565b90506107d83382611068565b6066546040805163a9059cbb60e01b81523360048201526024810186905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561082c57600080fd5b505af1158015610840573d6000803e3d6000fd5b505050506040513d602081101561085657600080fd5b50516108a5576040805162461bcd60e51b8152602060048201526019602482015278636f756c64206e6f74207472616e7366657220746f6b656e7360381b604482015290519081900360640190fd5b50919050565b60378054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105035780601f106104d857610100808354040283529160200191610503565b60008061091761052c565b6109225750816109be565b606654604080516370a0823160e01b815230600482015290516000926109a79287926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561097657600080fd5b505afa15801561098a573d6000803e3d6000fd5b505050506040513d60208110156109a057600080fd5b5051611164565b90506109ba6109b461052c565b8261101e565b9150505b6109c83382611179565b606654604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015610a2257600080fd5b505af1158015610a36573d6000803e3d6000fd5b505050506040513d6020811015610a4c57600080fd5b5051610a9b576040805162461bcd60e51b8152602060048201526019602482015278636f756c64206e6f74207472616e7366657220746f6b656e7360381b604482015290519081900360640190fd5b50600092915050565b6000610522610ab1610cd9565b846105aa856040518060600160405280602581526020016115096025913960346000610adb610cd9565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190610f26565b6000610522610b19610cd9565b8484610dc9565b60675490565b6000610b3061052c565b610b435750670de0b6b3a764000061050b565b606654604080516370a0823160e01b81523060048201529051610bc8926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610b8f57600080fd5b505afa158015610ba3573d6000803e3d6000fd5b505050506040513d6020811015610bb957600080fd5b5051610bc361052c565b611164565b905061050b565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b606654604080516370a0823160e01b815230600482015290516000926064926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b158015610c4b57600080fd5b505afa158015610c5f573d6000803e3d6000fd5b505050506040513d6020811015610c7557600080fd5b505160780281610c8157fe5b606654604080516340c10f1960e01b8152306004820152939092046024840181905291519193506001600160a01b0316916340c10f199160448083019260209291908290030181600087803b1580156106fb57600080fd5b3390565b6001600160a01b038316610d225760405162461bcd60e51b81526004018080602001828103825260248152602001806114e56024913960400191505060405180910390fd5b6001600160a01b038216610d675760405162461bcd60e51b815260040180806020018281038252602281526020018061140e6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610e0e5760405162461bcd60e51b81526004018080602001828103825260258152602001806114c06025913960400191505060405180910390fd5b6001600160a01b038216610e535760405162461bcd60e51b81526004018080602001828103825260238152602001806113c96023913960400191505060405180910390fd5b610e5e838383610725565b610e9b81604051806060016040528060268152602001611430602691396001600160a01b0386166000908152603360205260409020549190610f26565b6001600160a01b038085166000908152603360205260408082209390935590841681522054610eca9082610fbd565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115610fb55760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610f7a578181015183820152602001610f62565b50505050905090810190601f168015610fa75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015611017576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008061102b838561126b565b905061103f81670de0b6b3a76400006112c4565b949350505050565b60008061105c670de0b6b3a76400008561126b565b905061103f81846112c4565b6001600160a01b0382166110ad5760405162461bcd60e51b815260040180806020018281038252602181526020018061149f6021913960400191505060405180910390fd5b6110b982600083610725565b6110f6816040518060600160405280602281526020016113ec602291396001600160a01b0385166000908152603360205260409020549190610f26565b6001600160a01b03831660009081526033602052604090205560355461111c9082611306565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b60008061105c84670de0b6b3a764000061126b565b6001600160a01b0382166111d4576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6111e060008383610725565b6035546111ed9082610fbd565b6035556001600160a01b0382166000908152603360205260409020546112139082610fbd565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008261127a57506000610526565b8282028284828161128757fe5b04146110175760405162461bcd60e51b81526004018080602001828103825260218152602001806114566021913960400191505060405180910390fd5b600061101783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611363565b60008282111561135d576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600081836113b25760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f7a578181015183820152602001610f62565b5060008385816113be57fe5b049594505050505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220f1905ca793200e5af05c6a1f4edba1dfb645a02c10aebb11be788c35b9bca3de64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x162D CODESIZE SUB DUP1 PUSH2 0x162D DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x33 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x97 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x14 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x746F6B656E206973206E6F7420646566696E6564000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x66 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE PUSH1 0x67 SSTORE PUSH2 0x1563 DUP1 PUSH2 0xCA PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x14D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6F307DC3 GT PUSH2 0xC3 JUMPI DUP1 PUSH4 0xA457C2D7 GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x3D9 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x405 JUMPI DUP1 PUSH4 0xAE9D70B0 EQ PUSH2 0x431 JUMPI DUP1 PUSH4 0xBD6D894D EQ PUSH2 0x439 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x441 JUMPI DUP1 PUSH4 0xF8BA4CFF EQ PUSH2 0x46F JUMPI PUSH2 0x14D JUMP JUMPDEST DUP1 PUSH4 0x6F307DC3 EQ PUSH2 0x330 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x354 JUMPI DUP1 PUSH4 0x7DABC3CE EQ PUSH2 0x37A JUMPI DUP1 PUSH4 0x852A12E3 EQ PUSH2 0x397 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x3B4 JUMPI DUP1 PUSH4 0xA0712D68 EQ PUSH2 0x3BC JUMPI PUSH2 0x14D JUMP JUMPDEST DUP1 PUSH4 0x39509351 GT PUSH2 0x115 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x27D JUMPI DUP1 PUSH4 0x3AF9E669 EQ PUSH2 0x2A9 JUMPI DUP1 PUSH4 0x3B1D21A2 EQ PUSH2 0x2CF JUMPI DUP1 PUSH4 0x42966C68 EQ PUSH2 0x2D7 JUMPI DUP1 PUSH4 0x4C1FB633 EQ PUSH2 0x2F6 JUMPI DUP1 PUSH4 0x5A2C37CA EQ PUSH2 0x313 JUMPI PUSH2 0x14D JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x152 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x1CF JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x20F JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x229 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x25F JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x15A PUSH2 0x477 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x194 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x17C JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1C1 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1FB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x50E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x217 PUSH2 0x52C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1FB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x23F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x532 JUMP JUMPDEST PUSH2 0x267 PUSH2 0x5B9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1FB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x293 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x5C2 JUMP JUMPDEST PUSH2 0x217 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x610 JUMP JUMPDEST PUSH2 0x217 PUSH2 0x62B JUMP JUMPDEST PUSH2 0x2F4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x6A7 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x2F4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x30C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x72A JUMP JUMPDEST PUSH2 0x2F4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x329 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x77E JUMP JUMPDEST PUSH2 0x338 PUSH2 0x783 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x217 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x36A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x792 JUMP JUMPDEST PUSH2 0x217 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x390 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x7AD JUMP JUMPDEST PUSH2 0x217 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x7C0 JUMP JUMPDEST PUSH2 0x15A PUSH2 0x8AB JUMP JUMPDEST PUSH2 0x217 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x90C JUMP JUMPDEST PUSH2 0x1FB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0xAA4 JUMP JUMPDEST PUSH2 0x1FB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x41B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0xB0C JUMP JUMPDEST PUSH2 0x217 PUSH2 0xB20 JUMP JUMPDEST PUSH2 0x217 PUSH2 0xB26 JUMP JUMPDEST PUSH2 0x217 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x457 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xBCF JUMP JUMPDEST PUSH2 0x2F4 PUSH2 0xBFA JUMP JUMPDEST PUSH1 0x36 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x503 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x4D8 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x503 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x4E6 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x522 PUSH2 0x51B PUSH2 0xCD9 JUMP JUMPDEST DUP5 DUP5 PUSH2 0xCDD JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x35 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x53F DUP5 DUP5 DUP5 PUSH2 0xDC9 JUMP JUMPDEST PUSH2 0x5AF DUP5 PUSH2 0x54B PUSH2 0xCD9 JUMP JUMPDEST PUSH2 0x5AA DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1477 PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP1 PUSH2 0x589 PUSH2 0xCD9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0xF26 JUMP JUMPDEST PUSH2 0xCDD JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x38 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x522 PUSH2 0x5CF PUSH2 0xCD9 JUMP JUMPDEST DUP5 PUSH2 0x5AA DUP6 PUSH1 0x34 PUSH1 0x0 PUSH2 0x5E0 PUSH2 0xCD9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP13 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP1 PUSH2 0xFBD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x526 PUSH2 0x61E DUP4 PUSH2 0x792 JUMP JUMPDEST PUSH2 0x626 PUSH2 0xB26 JUMP JUMPDEST PUSH2 0x101E JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x676 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x68A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x2770A7EB PUSH1 0xE2 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x9DC29FAC SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x70F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x725 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x40C10F19 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x40C10F19 SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x67 SSTORE JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x526 DUP3 PUSH2 0x7BB PUSH2 0xB26 JUMP JUMPDEST PUSH2 0x1047 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x7CC DUP4 PUSH2 0x7AD JUMP JUMPDEST SWAP1 POP PUSH2 0x7D8 CALLER DUP3 PUSH2 0x1068 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0xA9059CBB SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x82C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x840 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x856 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0x8A5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH25 0x636F756C64206E6F74207472616E7366657220746F6B656E73 PUSH1 0x38 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x37 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x503 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x4D8 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x503 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x917 PUSH2 0x52C JUMP JUMPDEST PUSH2 0x922 JUMPI POP DUP2 PUSH2 0x9BE JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH2 0x9A7 SWAP3 DUP8 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x976 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x98A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x9A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0x1164 JUMP JUMPDEST SWAP1 POP PUSH2 0x9BA PUSH2 0x9B4 PUSH2 0x52C JUMP JUMPDEST DUP3 PUSH2 0x101E JUMP JUMPDEST SWAP2 POP POP JUMPDEST PUSH2 0x9C8 CALLER DUP3 PUSH2 0x1179 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD DUP7 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x23B872DD SWAP2 PUSH1 0x64 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA22 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA36 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xA4C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xA9B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH25 0x636F756C64206E6F74207472616E7366657220746F6B656E73 PUSH1 0x38 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x522 PUSH2 0xAB1 PUSH2 0xCD9 JUMP JUMPDEST DUP5 PUSH2 0x5AA DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1509 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x34 PUSH1 0x0 PUSH2 0xADB PUSH2 0xCD9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP14 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0xF26 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x522 PUSH2 0xB19 PUSH2 0xCD9 JUMP JUMPDEST DUP5 DUP5 PUSH2 0xDC9 JUMP JUMPDEST PUSH1 0x67 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB30 PUSH2 0x52C JUMP JUMPDEST PUSH2 0xB43 JUMPI POP PUSH8 0xDE0B6B3A7640000 PUSH2 0x50B JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH2 0xBC8 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB8F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xBA3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xBB9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xBC3 PUSH2 0x52C JUMP JUMPDEST PUSH2 0x1164 JUMP JUMPDEST SWAP1 POP PUSH2 0x50B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x64 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC4B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xC5F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xC75 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x78 MUL DUP2 PUSH2 0xC81 JUMPI INVALID JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x40C10F19 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP4 SWAP1 SWAP3 DIV PUSH1 0x24 DUP5 ADD DUP2 SWAP1 MSTORE SWAP2 MLOAD SWAP2 SWAP4 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x40C10F19 SWAP2 PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0xD22 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x14E5 PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xD67 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x140E PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE DUP2 MLOAD DUP6 DUP2 MSTORE SWAP2 MLOAD PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0xE0E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x14C0 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xE53 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x13C9 PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xE5E DUP4 DUP4 DUP4 PUSH2 0x725 JUMP JUMPDEST PUSH2 0xE9B DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1430 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0xF26 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP5 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0xECA SWAP1 DUP3 PUSH2 0xFBD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 SWAP3 DUP8 AND SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP5 DUP5 GT ISZERO PUSH2 0xFB5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF7A JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xF62 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xFA7 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1017 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x102B DUP4 DUP6 PUSH2 0x126B JUMP JUMPDEST SWAP1 POP PUSH2 0x103F DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x12C4 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x105C PUSH8 0xDE0B6B3A7640000 DUP6 PUSH2 0x126B JUMP JUMPDEST SWAP1 POP PUSH2 0x103F DUP2 DUP5 PUSH2 0x12C4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x10AD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x149F PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x10B9 DUP3 PUSH1 0x0 DUP4 PUSH2 0x725 JUMP JUMPDEST PUSH2 0x10F6 DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x13EC PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0xF26 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x35 SLOAD PUSH2 0x111C SWAP1 DUP3 PUSH2 0x1306 JUMP JUMPDEST PUSH1 0x35 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x105C DUP5 PUSH8 0xDE0B6B3A7640000 PUSH2 0x126B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x11D4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x11E0 PUSH1 0x0 DUP4 DUP4 PUSH2 0x725 JUMP JUMPDEST PUSH1 0x35 SLOAD PUSH2 0x11ED SWAP1 DUP3 PUSH2 0xFBD JUMP JUMPDEST PUSH1 0x35 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x1213 SWAP1 DUP3 PUSH2 0xFBD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP4 MLOAD DUP6 DUP2 MSTORE SWAP4 MLOAD SWAP3 SWAP4 SWAP2 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x127A JUMPI POP PUSH1 0x0 PUSH2 0x526 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x1287 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x1017 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1456 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1017 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x1363 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x135D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x13B2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP4 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP4 MLOAD SWAP1 SWAP3 DUP4 SWAP3 PUSH1 0x44 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0xF7A JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xF62 JUMP JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x13BE JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP INVALID GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220746F20746865207A65726F2061 PUSH5 0x6472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH3 0x75726E KECCAK256 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545524332 ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F766520746F20746865207A65726F20616464 PUSH19 0x65737345524332303A207472616E7366657220 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636553616665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F7745524332303A207472 PUSH2 0x6E73 PUSH7 0x657220616D6F75 PUSH15 0x74206578636565647320616C6C6F77 PUSH2 0x6E63 PUSH6 0x45524332303A KECCAK256 PUSH3 0x75726E KECCAK256 PUSH7 0x726F6D20746865 KECCAK256 PUSH27 0x65726F206164647265737345524332303A207472616E7366657220 PUSH7 0x726F6D20746865 KECCAK256 PUSH27 0x65726F206164647265737345524332303A20617070726F76652066 PUSH19 0x6F6D20746865207A65726F2061646472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH5 0x6563726561 PUSH20 0x656420616C6C6F77616E63652062656C6F77207A PUSH6 0x726FA2646970 PUSH7 0x7358221220F190 0x5C 0xA7 SWAP4 KECCAK256 0xE GAS CREATE 0x5C PUSH11 0x1F4EDBA1DFB645A02C10AE 0xBB GT 0xBE PUSH25 0x8C35B9BCA3DE64736F6C634300060C00330000000000000000 ",
              "sourceMap": "876:2540:62:-:0;;;1056:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1056:229:62;;;;;;;-1:-1:-1;;;;;1153:29:62;;1145:62;;;;;-1:-1:-1;;;1145:62:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;1213:10;:19;;-1:-1:-1;;;;;;1213:19:62;-1:-1:-1;;;;;1213:19:62;;;;;;;;;;;1238:20;:42;876:2540;;;-1:-1:-1;876:2540:62;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506004361061014d5760003560e01c80636f307dc3116100c3578063a457c2d71161007c578063a457c2d7146103d9578063a9059cbb14610405578063ae9d70b014610431578063bd6d894d14610439578063dd62ed3e14610441578063f8ba4cff1461046f5761014d565b80636f307dc31461033057806370a08231146103545780637dabc3ce1461037a578063852a12e31461039757806395d89b41146103b4578063a0712d68146103bc5761014d565b80633950935111610115578063395093511461027d5780633af9e669146102a95780633b1d21a2146102cf57806342966c68146102d75780634c1fb633146102f65780635a2c37ca146103135761014d565b806306fdde0314610152578063095ea7b3146101cf57806318160ddd1461020f57806323b872dd14610229578063313ce5671461025f575b600080fd5b61015a610477565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561019457818101518382015260200161017c565b50505050905090810190601f1680156101c15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101fb600480360360408110156101e557600080fd5b506001600160a01b03813516906020013561050e565b604080519115158252519081900360200190f35b61021761052c565b60408051918252519081900360200190f35b6101fb6004803603606081101561023f57600080fd5b506001600160a01b03813581169160208101359091169060400135610532565b6102676105b9565b6040805160ff9092168252519081900360200190f35b6101fb6004803603604081101561029357600080fd5b506001600160a01b0381351690602001356105c2565b610217600480360360208110156102bf57600080fd5b50356001600160a01b0316610610565b61021761062b565b6102f4600480360360208110156102ed57600080fd5b50356106a7565b005b6102f46004803603602081101561030c57600080fd5b503561072a565b6102f46004803603602081101561032957600080fd5b503561077e565b610338610783565b604080516001600160a01b039092168252519081900360200190f35b6102176004803603602081101561036a57600080fd5b50356001600160a01b0316610792565b6102176004803603602081101561039057600080fd5b50356107ad565b610217600480360360208110156103ad57600080fd5b50356107c0565b61015a6108ab565b610217600480360360208110156103d257600080fd5b503561090c565b6101fb600480360360408110156103ef57600080fd5b506001600160a01b038135169060200135610aa4565b6101fb6004803603604081101561041b57600080fd5b506001600160a01b038135169060200135610b0c565b610217610b20565b610217610b26565b6102176004803603604081101561045757600080fd5b506001600160a01b0381358116916020013516610bcf565b6102f4610bfa565b60368054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105035780601f106104d857610100808354040283529160200191610503565b820191906000526020600020905b8154815290600101906020018083116104e657829003601f168201915b505050505090505b90565b600061052261051b610cd9565b8484610cdd565b5060015b92915050565b60355490565b600061053f848484610dc9565b6105af8461054b610cd9565b6105aa85604051806060016040528060288152602001611477602891396001600160a01b038a16600090815260346020526040812090610589610cd9565b6001600160a01b031681526020810191909152604001600020549190610f26565b610cdd565b5060019392505050565b60385460ff1690565b60006105226105cf610cd9565b846105aa85603460006105e0610cd9565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490610fbd565b600061052661061e83610792565b610626610b26565b61101e565b606654604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561067657600080fd5b505afa15801561068a573d6000803e3d6000fd5b505050506040513d60208110156106a057600080fd5b5051905090565b60665460408051632770a7eb60e21b81523060048201526024810184905290516001600160a01b0390921691639dc29fac916044808201926020929091908290030181600087803b1580156106fb57600080fd5b505af115801561070f573d6000803e3d6000fd5b505050506040513d602081101561072557600080fd5b505050565b606654604080516340c10f1960e01b81523060048201526024810184905290516001600160a01b03909216916340c10f19916044808201926020929091908290030181600087803b1580156106fb57600080fd5b606755565b6066546001600160a01b031681565b6001600160a01b031660009081526033602052604090205490565b6000610526826107bb610b26565b611047565b6000806107cc836107ad565b90506107d83382611068565b6066546040805163a9059cbb60e01b81523360048201526024810186905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561082c57600080fd5b505af1158015610840573d6000803e3d6000fd5b505050506040513d602081101561085657600080fd5b50516108a5576040805162461bcd60e51b8152602060048201526019602482015278636f756c64206e6f74207472616e7366657220746f6b656e7360381b604482015290519081900360640190fd5b50919050565b60378054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105035780601f106104d857610100808354040283529160200191610503565b60008061091761052c565b6109225750816109be565b606654604080516370a0823160e01b815230600482015290516000926109a79287926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561097657600080fd5b505afa15801561098a573d6000803e3d6000fd5b505050506040513d60208110156109a057600080fd5b5051611164565b90506109ba6109b461052c565b8261101e565b9150505b6109c83382611179565b606654604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015610a2257600080fd5b505af1158015610a36573d6000803e3d6000fd5b505050506040513d6020811015610a4c57600080fd5b5051610a9b576040805162461bcd60e51b8152602060048201526019602482015278636f756c64206e6f74207472616e7366657220746f6b656e7360381b604482015290519081900360640190fd5b50600092915050565b6000610522610ab1610cd9565b846105aa856040518060600160405280602581526020016115096025913960346000610adb610cd9565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190610f26565b6000610522610b19610cd9565b8484610dc9565b60675490565b6000610b3061052c565b610b435750670de0b6b3a764000061050b565b606654604080516370a0823160e01b81523060048201529051610bc8926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610b8f57600080fd5b505afa158015610ba3573d6000803e3d6000fd5b505050506040513d6020811015610bb957600080fd5b5051610bc361052c565b611164565b905061050b565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b606654604080516370a0823160e01b815230600482015290516000926064926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b158015610c4b57600080fd5b505afa158015610c5f573d6000803e3d6000fd5b505050506040513d6020811015610c7557600080fd5b505160780281610c8157fe5b606654604080516340c10f1960e01b8152306004820152939092046024840181905291519193506001600160a01b0316916340c10f199160448083019260209291908290030181600087803b1580156106fb57600080fd5b3390565b6001600160a01b038316610d225760405162461bcd60e51b81526004018080602001828103825260248152602001806114e56024913960400191505060405180910390fd5b6001600160a01b038216610d675760405162461bcd60e51b815260040180806020018281038252602281526020018061140e6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610e0e5760405162461bcd60e51b81526004018080602001828103825260258152602001806114c06025913960400191505060405180910390fd5b6001600160a01b038216610e535760405162461bcd60e51b81526004018080602001828103825260238152602001806113c96023913960400191505060405180910390fd5b610e5e838383610725565b610e9b81604051806060016040528060268152602001611430602691396001600160a01b0386166000908152603360205260409020549190610f26565b6001600160a01b038085166000908152603360205260408082209390935590841681522054610eca9082610fbd565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115610fb55760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610f7a578181015183820152602001610f62565b50505050905090810190601f168015610fa75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015611017576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008061102b838561126b565b905061103f81670de0b6b3a76400006112c4565b949350505050565b60008061105c670de0b6b3a76400008561126b565b905061103f81846112c4565b6001600160a01b0382166110ad5760405162461bcd60e51b815260040180806020018281038252602181526020018061149f6021913960400191505060405180910390fd5b6110b982600083610725565b6110f6816040518060600160405280602281526020016113ec602291396001600160a01b0385166000908152603360205260409020549190610f26565b6001600160a01b03831660009081526033602052604090205560355461111c9082611306565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b60008061105c84670de0b6b3a764000061126b565b6001600160a01b0382166111d4576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6111e060008383610725565b6035546111ed9082610fbd565b6035556001600160a01b0382166000908152603360205260409020546112139082610fbd565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008261127a57506000610526565b8282028284828161128757fe5b04146110175760405162461bcd60e51b81526004018080602001828103825260218152602001806114566021913960400191505060405180910390fd5b600061101783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611363565b60008282111561135d576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600081836113b25760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610f7a578181015183820152602001610f62565b5060008385816113be57fe5b049594505050505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220f1905ca793200e5af05c6a1f4edba1dfb645a02c10aebb11be788c35b9bca3de64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x14D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x6F307DC3 GT PUSH2 0xC3 JUMPI DUP1 PUSH4 0xA457C2D7 GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x3D9 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x405 JUMPI DUP1 PUSH4 0xAE9D70B0 EQ PUSH2 0x431 JUMPI DUP1 PUSH4 0xBD6D894D EQ PUSH2 0x439 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x441 JUMPI DUP1 PUSH4 0xF8BA4CFF EQ PUSH2 0x46F JUMPI PUSH2 0x14D JUMP JUMPDEST DUP1 PUSH4 0x6F307DC3 EQ PUSH2 0x330 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x354 JUMPI DUP1 PUSH4 0x7DABC3CE EQ PUSH2 0x37A JUMPI DUP1 PUSH4 0x852A12E3 EQ PUSH2 0x397 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x3B4 JUMPI DUP1 PUSH4 0xA0712D68 EQ PUSH2 0x3BC JUMPI PUSH2 0x14D JUMP JUMPDEST DUP1 PUSH4 0x39509351 GT PUSH2 0x115 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x27D JUMPI DUP1 PUSH4 0x3AF9E669 EQ PUSH2 0x2A9 JUMPI DUP1 PUSH4 0x3B1D21A2 EQ PUSH2 0x2CF JUMPI DUP1 PUSH4 0x42966C68 EQ PUSH2 0x2D7 JUMPI DUP1 PUSH4 0x4C1FB633 EQ PUSH2 0x2F6 JUMPI DUP1 PUSH4 0x5A2C37CA EQ PUSH2 0x313 JUMPI PUSH2 0x14D JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x152 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x1CF JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x20F JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x229 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x25F JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x15A PUSH2 0x477 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x194 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x17C JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1C1 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1FB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x50E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x217 PUSH2 0x52C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1FB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x23F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x532 JUMP JUMPDEST PUSH2 0x267 PUSH2 0x5B9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1FB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x293 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x5C2 JUMP JUMPDEST PUSH2 0x217 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x610 JUMP JUMPDEST PUSH2 0x217 PUSH2 0x62B JUMP JUMPDEST PUSH2 0x2F4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x6A7 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x2F4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x30C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x72A JUMP JUMPDEST PUSH2 0x2F4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x329 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x77E JUMP JUMPDEST PUSH2 0x338 PUSH2 0x783 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x217 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x36A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x792 JUMP JUMPDEST PUSH2 0x217 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x390 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x7AD JUMP JUMPDEST PUSH2 0x217 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x7C0 JUMP JUMPDEST PUSH2 0x15A PUSH2 0x8AB JUMP JUMPDEST PUSH2 0x217 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x90C JUMP JUMPDEST PUSH2 0x1FB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0xAA4 JUMP JUMPDEST PUSH2 0x1FB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x41B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0xB0C JUMP JUMPDEST PUSH2 0x217 PUSH2 0xB20 JUMP JUMPDEST PUSH2 0x217 PUSH2 0xB26 JUMP JUMPDEST PUSH2 0x217 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x457 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xBCF JUMP JUMPDEST PUSH2 0x2F4 PUSH2 0xBFA JUMP JUMPDEST PUSH1 0x36 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x503 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x4D8 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x503 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x4E6 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x522 PUSH2 0x51B PUSH2 0xCD9 JUMP JUMPDEST DUP5 DUP5 PUSH2 0xCDD JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x35 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x53F DUP5 DUP5 DUP5 PUSH2 0xDC9 JUMP JUMPDEST PUSH2 0x5AF DUP5 PUSH2 0x54B PUSH2 0xCD9 JUMP JUMPDEST PUSH2 0x5AA DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1477 PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP1 PUSH2 0x589 PUSH2 0xCD9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0xF26 JUMP JUMPDEST PUSH2 0xCDD JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x38 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x522 PUSH2 0x5CF PUSH2 0xCD9 JUMP JUMPDEST DUP5 PUSH2 0x5AA DUP6 PUSH1 0x34 PUSH1 0x0 PUSH2 0x5E0 PUSH2 0xCD9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP13 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP1 PUSH2 0xFBD JUMP JUMPDEST PUSH1 0x0 PUSH2 0x526 PUSH2 0x61E DUP4 PUSH2 0x792 JUMP JUMPDEST PUSH2 0x626 PUSH2 0xB26 JUMP JUMPDEST PUSH2 0x101E JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x676 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x68A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x2770A7EB PUSH1 0xE2 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x9DC29FAC SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x70F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x725 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x40C10F19 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x40C10F19 SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x67 SSTORE JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x526 DUP3 PUSH2 0x7BB PUSH2 0xB26 JUMP JUMPDEST PUSH2 0x1047 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x7CC DUP4 PUSH2 0x7AD JUMP JUMPDEST SWAP1 POP PUSH2 0x7D8 CALLER DUP3 PUSH2 0x1068 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0xA9059CBB SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x82C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x840 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x856 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0x8A5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH25 0x636F756C64206E6F74207472616E7366657220746F6B656E73 PUSH1 0x38 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x37 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x503 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x4D8 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x503 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x917 PUSH2 0x52C JUMP JUMPDEST PUSH2 0x922 JUMPI POP DUP2 PUSH2 0x9BE JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH2 0x9A7 SWAP3 DUP8 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x976 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x98A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x9A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0x1164 JUMP JUMPDEST SWAP1 POP PUSH2 0x9BA PUSH2 0x9B4 PUSH2 0x52C JUMP JUMPDEST DUP3 PUSH2 0x101E JUMP JUMPDEST SWAP2 POP POP JUMPDEST PUSH2 0x9C8 CALLER DUP3 PUSH2 0x1179 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD DUP7 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x23B872DD SWAP2 PUSH1 0x64 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA22 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA36 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xA4C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xA9B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH25 0x636F756C64206E6F74207472616E7366657220746F6B656E73 PUSH1 0x38 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x522 PUSH2 0xAB1 PUSH2 0xCD9 JUMP JUMPDEST DUP5 PUSH2 0x5AA DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1509 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x34 PUSH1 0x0 PUSH2 0xADB PUSH2 0xCD9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP14 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0xF26 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x522 PUSH2 0xB19 PUSH2 0xCD9 JUMP JUMPDEST DUP5 DUP5 PUSH2 0xDC9 JUMP JUMPDEST PUSH1 0x67 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB30 PUSH2 0x52C JUMP JUMPDEST PUSH2 0xB43 JUMPI POP PUSH8 0xDE0B6B3A7640000 PUSH2 0x50B JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH2 0xBC8 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB8F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xBA3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xBB9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xBC3 PUSH2 0x52C JUMP JUMPDEST PUSH2 0x1164 JUMP JUMPDEST SWAP1 POP PUSH2 0x50B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x64 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC4B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xC5F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xC75 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x78 MUL DUP2 PUSH2 0xC81 JUMPI INVALID JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x40C10F19 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP4 SWAP1 SWAP3 DIV PUSH1 0x24 DUP5 ADD DUP2 SWAP1 MSTORE SWAP2 MLOAD SWAP2 SWAP4 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x40C10F19 SWAP2 PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0xD22 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x14E5 PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xD67 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x140E PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE DUP2 MLOAD DUP6 DUP2 MSTORE SWAP2 MLOAD PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0xE0E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x14C0 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xE53 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x13C9 PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xE5E DUP4 DUP4 DUP4 PUSH2 0x725 JUMP JUMPDEST PUSH2 0xE9B DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1430 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0xF26 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP5 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0xECA SWAP1 DUP3 PUSH2 0xFBD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 SWAP3 DUP8 AND SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP5 DUP5 GT ISZERO PUSH2 0xFB5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF7A JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xF62 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xFA7 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1017 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x102B DUP4 DUP6 PUSH2 0x126B JUMP JUMPDEST SWAP1 POP PUSH2 0x103F DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x12C4 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x105C PUSH8 0xDE0B6B3A7640000 DUP6 PUSH2 0x126B JUMP JUMPDEST SWAP1 POP PUSH2 0x103F DUP2 DUP5 PUSH2 0x12C4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x10AD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x149F PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x10B9 DUP3 PUSH1 0x0 DUP4 PUSH2 0x725 JUMP JUMPDEST PUSH2 0x10F6 DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x13EC PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0xF26 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x35 SLOAD PUSH2 0x111C SWAP1 DUP3 PUSH2 0x1306 JUMP JUMPDEST PUSH1 0x35 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x105C DUP5 PUSH8 0xDE0B6B3A7640000 PUSH2 0x126B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x11D4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x11E0 PUSH1 0x0 DUP4 DUP4 PUSH2 0x725 JUMP JUMPDEST PUSH1 0x35 SLOAD PUSH2 0x11ED SWAP1 DUP3 PUSH2 0xFBD JUMP JUMPDEST PUSH1 0x35 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x1213 SWAP1 DUP3 PUSH2 0xFBD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP4 MLOAD DUP6 DUP2 MSTORE SWAP4 MLOAD SWAP3 SWAP4 SWAP2 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x127A JUMPI POP PUSH1 0x0 PUSH2 0x526 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x1287 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x1017 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1456 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1017 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x1363 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x135D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x13B2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP4 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP4 MLOAD SWAP1 SWAP3 DUP4 SWAP3 PUSH1 0x44 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0xF7A JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xF62 JUMP JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x13BE JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP INVALID GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220746F20746865207A65726F2061 PUSH5 0x6472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH3 0x75726E KECCAK256 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545524332 ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F766520746F20746865207A65726F20616464 PUSH19 0x65737345524332303A207472616E7366657220 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636553616665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F7745524332303A207472 PUSH2 0x6E73 PUSH7 0x657220616D6F75 PUSH15 0x74206578636565647320616C6C6F77 PUSH2 0x6E63 PUSH6 0x45524332303A KECCAK256 PUSH3 0x75726E KECCAK256 PUSH7 0x726F6D20746865 KECCAK256 PUSH27 0x65726F206164647265737345524332303A207472616E7366657220 PUSH7 0x726F6D20746865 KECCAK256 PUSH27 0x65726F206164647265737345524332303A20617070726F76652066 PUSH19 0x6F6D20746865207A65726F2061646472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH5 0x6563726561 PUSH20 0x656420616C6C6F77616E63652062656C6F77207A PUSH6 0x726FA2646970 PUSH7 0x7358221220F190 0x5C 0xA7 SWAP4 KECCAK256 0xE GAS CREATE 0x5C PUSH11 0x1F4EDBA1DFB645A02C10AE 0xBB GT 0xBE PUSH25 0x8C35B9BCA3DE64736F6C634300060C00330000000000000000 ",
              "sourceMap": "876:2540:62:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2517:89:10;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4593:166;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4593:166:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;3584:106;;;:::i;:::-;;;;;;;;;;;;;;;;5226:317;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5226:317:10;;;;;;;;;;;;;;;;;:::i;3435:89::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5938:215;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5938:215:10;;;;;;;;:::i;2775:167:62:-;;;;;;;;;;;;;;;;-1:-1:-1;2775:167:62;-1:-1:-1;;;;;2775:167:62;;:::i;1905:101::-;;;:::i;2530:88::-;;;;;;;;;;;;;;;;-1:-1:-1;2530:88:62;;:::i;:::-;;2430:96;;;;;;;;;;;;;;;;-1:-1:-1;2430:96:62;;:::i;3292:122::-;;;;;;;;;;;;;;;;-1:-1:-1;3292:122:62;;:::i;978:31::-;;;:::i;:::-;;;;-1:-1:-1;;;;;978:31:62;;;;;;;;;;;;;;3748:125:10;;;;;;;;;;;;;;;;-1:-1:-1;3748:125:10;-1:-1:-1;;;;;3748:125:10;;:::i;2622:149:62:-;;;;;;;;;;;;;;;;-1:-1:-1;2622:149:62;;:::i;2010:258::-;;;;;;;;;;;;;;;;-1:-1:-1;2010:258:62;;:::i;2719:93:10:-;;;:::i;1289:612:62:-;;;;;;;;;;;;;;;;-1:-1:-1;1289:612:62;;:::i;6640:266:10:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;6640:266:10;;;;;;;;:::i;4076:172::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4076:172:10;;;;;;;;:::i;3191:97:62:-;;;:::i;2946:241::-;;;:::i;4306:149:10:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4306:149:10;;;;;;;;;;:::i;2272:154:62:-;;;:::i;2517:89:10:-;2594:5;2587:12;;;;;;;;-1:-1:-1;;2587:12:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2562:13;;2587:12;;2594:5;;2587:12;;2594:5;2587:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2517:89;;:::o;4593:166::-;4676:4;4692:39;4701:12;:10;:12::i;:::-;4715:7;4724:6;4692:8;:39::i;:::-;-1:-1:-1;4748:4:10;4593:166;;;;;:::o;3584:106::-;3671:12;;3584:106;:::o;5226:317::-;5332:4;5348:36;5358:6;5366:9;5377:6;5348:9;:36::i;:::-;5394:121;5403:6;5411:12;:10;:12::i;:::-;5425:89;5463:6;5425:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5425:19:10;;;;;;:11;:19;;;;;;5445:12;:10;:12::i;:::-;-1:-1:-1;;;;;5425:33:10;;;;;;;;;;;;-1:-1:-1;5425:33:10;;;:89;:37;:89::i;:::-;5394:8;:121::i;:::-;-1:-1:-1;5532:4:10;5226:317;;;;;:::o;3435:89::-;3508:9;;;;3435:89;:::o;5938:215::-;6026:4;6042:83;6051:12;:10;:12::i;:::-;6065:7;6074:50;6113:10;6074:11;:25;6086:12;:10;:12::i;:::-;-1:-1:-1;;;;;6074:25:10;;;;;;;;;;;;;;;;;-1:-1:-1;6074:25:10;;;:34;;;;;;;;;;;:38;:50::i;2775:167:62:-;2842:4;2861:76;2895:18;2905:7;2895:9;:18::i;:::-;2915:21;:19;:21::i;:::-;2861:33;:76::i;1905:101::-;1966:10;;:35;;;-1:-1:-1;;;1966:35:62;;1995:4;1966:35;;;;;;1947:4;;-1:-1:-1;;;;;1966:10:62;;:20;;:35;;;;;;;;;;;;;;:10;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1966:35:62;;-1:-1:-1;1905:101:62;:::o;2530:88::-;2575:10;;:38;;;-1:-1:-1;;;2575:38:62;;2599:4;2575:38;;;;;;;;;;;;-1:-1:-1;;;;;2575:10:62;;;;:15;;:38;;;;;;;;;;;;;;;:10;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2530:88:62:o;2430:96::-;2483:10;;:38;;;-1:-1:-1;;;2483:38:62;;2507:4;2483:38;;;;;;;;;;;;-1:-1:-1;;;;;2483:10:62;;;;:15;;:38;;;;;;;;;;;;;;;:10;;:38;;;;;;;;;;3292:122;3367:20;:42;3292:122::o;978:31::-;;;-1:-1:-1;;;;;978:31:62;;:::o;3748:125:10:-;-1:-1:-1;;;;;3848:18:10;3822:7;3848:18;;;:9;:18;;;;;;;3748:125::o;2622:149:62:-;2682:7;2704:62;2736:6;2744:21;:19;:21::i;:::-;2704:31;:62::i;2010:258::-;2079:4;2091:15;2109:30;2123:15;2109:13;:30::i;:::-;2091:48;;2145:26;2151:10;2163:7;2145:5;:26::i;:::-;2185:10;;:48;;;-1:-1:-1;;;2185:48:62;;2205:10;2185:48;;;;;;;;;;;;-1:-1:-1;;;;;2185:10:62;;;;:19;;:48;;;;;;;;;;;;;;;:10;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2185:48:62;2177:86;;;;;-1:-1:-1;;;2177:86:62;;;;;;;;;;;;-1:-1:-1;;;2177:86:62;;;;;;;;;;;;;;;2010:258;;;;:::o;2719:93:10:-;2798:7;2791:14;;;;;;;;-1:-1:-1;;2791:14:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2766:13;;2791:14;;2798:7;;2791:14;;2798:7;2791:14;;;;;;;;;;;;;;;;;;;;;;;;1289:612:62;1337:4;1349:18;1377:13;:11;:13::i;:::-;1373:373;;-1:-1:-1;1418:6:62;1373:373;;;1616:10;;:35;;;-1:-1:-1;;;1616:35:62;;1645:4;1616:35;;;;;;1552:24;;1579:73;;1608:6;;-1:-1:-1;;;;;1616:10:62;;;;:20;;:35;;;;;;;;;;;;;;;:10;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1616:35:62;1579:28;:73::i;:::-;1552:100;;1673:66;1707:13;:11;:13::i;:::-;1722:16;1673:33;:66::i;:::-;1660:79;;1373:373;;1751:29;1757:10;1769;1751:5;:29::i;:::-;1794:10;;:58;;;-1:-1:-1;;;1794:58:62;;1818:10;1794:58;;;;1838:4;1794:58;;;;;;;;;;;;-1:-1:-1;;;;;1794:10:62;;;;:23;;:58;;;;;;;;;;;;;;;:10;;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1794:58:62;1786:96;;;;;-1:-1:-1;;;1786:96:62;;;;;;;;;;;;-1:-1:-1;;;1786:96:62;;;;;;;;;;;;;;;-1:-1:-1;1895:1:62;;1289:612;-1:-1:-1;;1289:612:62:o;6640:266:10:-;6733:4;6749:129;6758:12;:10;:12::i;:::-;6772:7;6781:96;6820:15;6781:96;;;;;;;;;;;;;;;;;:11;:25;6793:12;:10;:12::i;:::-;-1:-1:-1;;;;;6781:25:10;;;;;;;;;;;;;;;;;-1:-1:-1;6781:25:10;;;:34;;;;;;;;;;;:96;:38;:96::i;4076:172::-;4162:4;4178:42;4188:12;:10;:12::i;:::-;4202:9;4213:6;4178:9;:42::i;3191:97:62:-;3263:20;;3191:97;:::o;2946:241::-;2998:7;3017:13;:11;:13::i;:::-;3013:170;;-1:-1:-1;1149:4:26;3045:23:62;;3013:170;3125:10;;:35;;;-1:-1:-1;;;3125:35:62;;3154:4;3125:35;;;;;;3096:80;;-1:-1:-1;;;;;3125:10:62;;:20;;:35;;;;;;;;;;;;;;:10;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3125:35:62;3162:13;:11;:13::i;:::-;3096:28;:80::i;:::-;3089:87;;;;4306:149:10;-1:-1:-1;;;;;4421:18:10;;;4395:7;4421:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4306:149::o;2272:154:62:-;2326:10;;:35;;;-1:-1:-1;;;2326:35:62;;2355:4;2326:35;;;;;;2305:17;;2371:3;;-1:-1:-1;;;;;2326:10:62;;;;:20;;:35;;;;;;;;;;;;;;;:10;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2326:35:62;2364:3;2326:41;2325:49;;;;;2380:10;;:41;;;-1:-1:-1;;;2380:41:62;;2404:4;2380:41;;;;2325:49;;;;2380:41;;;;;;;;2325:49;;-1:-1:-1;;;;;;2380:10:62;;:15;;:41;;;;;;;;;;;;;;:10;;:41;;;;;;;;;;828:104:19;915:10;828:104;:::o;9704:340:10:-;-1:-1:-1;;;;;9805:19:10;;9797:68;;;;-1:-1:-1;;;9797:68:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9883:21:10;;9875:68;;;;-1:-1:-1;;;9875:68:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9954:18:10;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10005:32;;;;;;;;;;;;;;;;;9704:340;;;:::o;7380:530::-;-1:-1:-1;;;;;7485:20:10;;7477:70;;;;-1:-1:-1;;;7477:70:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7565:23:10;;7557:71;;;;-1:-1:-1;;;7557:71:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7639:47;7660:6;7668:9;7679:6;7639:20;:47::i;:::-;7717:71;7739:6;7717:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7717:17:10;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;7697:17:10;;;;;;;:9;:17;;;;;;:91;;;;7821:20;;;;;;;:32;;7846:6;7821:24;:32::i;:::-;-1:-1:-1;;;;;7798:20:10;;;;;;;:9;:20;;;;;;;;;:55;;;;7868:35;;;;;;;7798:20;;7868:35;;;;;;;;;;;;;7380:530;;;:::o;5443:163:8:-;5529:7;5564:12;5556:6;;;;5548:29;;;;-1:-1:-1;;;5548:29:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5594:5:8;;;5443:163::o;2701:175::-;2759:7;2790:5;;;2813:6;;;;2805:46;;;;;-1:-1:-1;;;2805:46:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;2868:1;2701:175;-1:-1:-1;;;2701:175:8:o;1967:201:26:-;2051:7;;2087:15;:8;2100:1;2087:12;:15::i;:::-;2070:32;-1:-1:-1;2121:17:26;2070:32;1149:4;2121:10;:17::i;:::-;2112:26;1967:201;-1:-1:-1;;;;1967:201:26:o;2461:213::-;2550:7;;2586:19;1149:4;2596:8;2586:9;:19::i;:::-;2569:36;-1:-1:-1;2624:20:26;2569:36;2635:8;2624:10;:20::i;8871:410:10:-;-1:-1:-1;;;;;8954:21:10;;8946:67;;;;-1:-1:-1;;;8946:67:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9024:49;9045:7;9062:1;9066:6;9024:20;:49::i;:::-;9105:68;9128:6;9105:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9105:18:10;;;;;;:9;:18;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;9084:18:10;;;;;;:9;:18;;;;;:89;9198:12;;:24;;9215:6;9198:16;:24::i;:::-;9183:12;:39;9237:37;;;;;;;;9263:1;;-1:-1:-1;;;;;9237:37:10;;;;;;;;;;;;8871:410;;:::o;1484:226:26:-;1574:7;;1612:20;:9;1149:4;1612:13;:20::i;8181:370:10:-;-1:-1:-1;;;;;8264:21:10;;8256:65;;;;;-1:-1:-1;;;8256:65:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;8332:49;8361:1;8365:7;8374:6;8332:20;:49::i;:::-;8407:12;;:24;;8424:6;8407:16;:24::i;:::-;8392:12;:39;-1:-1:-1;;;;;8462:18:10;;;;;;:9;:18;;;;;;:30;;8485:6;8462:22;:30::i;:::-;-1:-1:-1;;;;;8441:18:10;;;;;;:9;:18;;;;;;;;:51;;;;8507:37;;;;;;;8441:18;;;;8507:37;;;;;;;;;;8181:370;;:::o;2266:459:27:-;2324:7;2565:6;2561:45;;-1:-1:-1;2594:1:27;2587:8;;2561:45;2628:5;;;2632:1;2628;:5;:1;2651:5;;;;;:10;2643:56;;;;-1:-1:-1;;;2643:56:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3187:130;3245:7;3271:39;3275:1;3278;3271:39;;;;;;;;;;;;;;;;;:3;:39::i;3147:155:8:-;3205:7;3237:1;3232;:6;;3224:49;;;;;-1:-1:-1;;;3224:49:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3290:5:8;;;3147:155::o;3799:272:27:-;3885:7;3919:12;3912:5;3904:28;;;;-1:-1:-1;;;3904:28:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3942:9;3958:1;3954;:5;;;;;;;3799:272;-1:-1:-1;;;;;3799:272:27:o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "1095000",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "accrue()": "infinite",
                "accrueCustom(uint256)": "infinite",
                "allowance(address,address)": "1360",
                "approve(address,uint256)": "infinite",
                "balanceOf(address)": "1187",
                "balanceOfUnderlying(address)": "infinite",
                "burn(uint256)": "infinite",
                "cTokenValueOf(uint256)": "infinite",
                "decimals()": "1125",
                "decreaseAllowance(address,uint256)": "infinite",
                "exchangeRateCurrent()": "infinite",
                "getCash()": "infinite",
                "increaseAllowance(address,uint256)": "infinite",
                "mint(uint256)": "infinite",
                "name()": "infinite",
                "redeemUnderlying(uint256)": "infinite",
                "setSupplyRateMantissa(uint256)": "20322",
                "supplyRatePerBlock()": "1064",
                "symbol()": "infinite",
                "totalSupply()": "1066",
                "transfer(address,uint256)": "infinite",
                "transferFrom(address,address,uint256)": "infinite",
                "underlying()": "1060"
              }
            },
            "methodIdentifiers": {
              "accrue()": "f8ba4cff",
              "accrueCustom(uint256)": "4c1fb633",
              "allowance(address,address)": "dd62ed3e",
              "approve(address,uint256)": "095ea7b3",
              "balanceOf(address)": "70a08231",
              "balanceOfUnderlying(address)": "3af9e669",
              "burn(uint256)": "42966c68",
              "cTokenValueOf(uint256)": "7dabc3ce",
              "decimals()": "313ce567",
              "decreaseAllowance(address,uint256)": "a457c2d7",
              "exchangeRateCurrent()": "bd6d894d",
              "getCash()": "3b1d21a2",
              "increaseAllowance(address,uint256)": "39509351",
              "mint(uint256)": "a0712d68",
              "name()": "06fdde03",
              "redeemUnderlying(uint256)": "852a12e3",
              "setSupplyRateMantissa(uint256)": "5a2c37ca",
              "supplyRatePerBlock()": "ae9d70b0",
              "symbol()": "95d89b41",
              "totalSupply()": "18160ddd",
              "transfer(address,uint256)": "a9059cbb",
              "transferFrom(address,address,uint256)": "23b872dd",
              "underlying()": "6f307dc3"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract ERC20Mintable\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_supplyRatePerBlock\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"accrue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"accrueCustom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOfUnderlying\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"cTokenValueOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"exchangeRateCurrent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCash\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requestedAmount\",\"type\":\"uint256\"}],\"name\":\"redeemUnderlying\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_supplyRatePerBlock\",\"type\":\"uint256\"}],\"name\":\"setSupplyRateMantissa\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"supplyRatePerBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"underlying\",\"outputs\":[{\"internalType\":\"contract ERC20Mintable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is called. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/CTokenMock.sol\":\"CTokenMock\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"contracts/test/CTokenMock.sol\":{\"content\":\"/**\\nCopyright 2019 PoolTogether LLC\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\nimport \\\"hardhat/console.sol\\\";\\n\\nimport \\\"./ERC20Mintable.sol\\\";\\n\\ncontract CTokenMock is ERC20Upgradeable {\\n  mapping(address => uint256) internal ownerTokenAmounts;\\n  ERC20Mintable public underlying;\\n\\n  uint256 internal __supplyRatePerBlock;\\n\\n  constructor (\\n    ERC20Mintable _token,\\n    uint256 _supplyRatePerBlock\\n  ) public {\\n    require(address(_token) != address(0), \\\"token is not defined\\\");\\n    underlying = _token;\\n    __supplyRatePerBlock = _supplyRatePerBlock;\\n  }\\n\\n  function mint(uint256 amount) external returns (uint) {\\n    uint256 newCTokens;\\n    if (totalSupply() == 0) {\\n      newCTokens = amount;\\n    } else {\\n      // they need to hold the same assets as tokens.\\n      // Need to calculate the current exchange rate\\n      uint256 fractionOfCredit = FixedPoint.calculateMantissa(amount, underlying.balanceOf(address(this)));\\n      newCTokens = FixedPoint.multiplyUintByMantissa(totalSupply(), fractionOfCredit);\\n    }\\n    _mint(msg.sender, newCTokens);\\n    require(underlying.transferFrom(msg.sender, address(this), amount), \\\"could not transfer tokens\\\");\\n    return 0;\\n  }\\n\\n  function getCash() external view returns (uint) {\\n    return underlying.balanceOf(address(this));\\n  }\\n\\n  function redeemUnderlying(uint256 requestedAmount) external returns (uint) {\\n    uint256 cTokens = cTokenValueOf(requestedAmount);\\n    _burn(msg.sender, cTokens);\\n    require(underlying.transfer(msg.sender, requestedAmount), \\\"could not transfer tokens\\\");\\n  }\\n\\n  function accrue() external {\\n    uint256 newTokens = (underlying.balanceOf(address(this)) * 120) / 100;\\n    underlying.mint(address(this), newTokens);\\n  }\\n\\n  function accrueCustom(uint256 amount) external {\\n    underlying.mint(address(this), amount);\\n  }\\n\\n  function burn(uint256 amount) external {\\n    underlying.burn(address(this), amount);\\n  }\\n\\n  function cTokenValueOf(uint256 tokens) public view returns (uint256) {\\n    return FixedPoint.divideUintByMantissa(tokens, exchangeRateCurrent());\\n  }\\n\\n  function balanceOfUnderlying(address account) public view returns (uint) {\\n    return FixedPoint.multiplyUintByMantissa(balanceOf(account), exchangeRateCurrent());\\n  }\\n\\n  function exchangeRateCurrent() public view returns (uint256) {\\n    if (totalSupply() == 0) {\\n      return FixedPoint.SCALE;\\n    } else {\\n      return FixedPoint.calculateMantissa(underlying.balanceOf(address(this)), totalSupply());\\n    }\\n  }\\n\\n  function supplyRatePerBlock() external view returns (uint) {\\n    return __supplyRatePerBlock;\\n  }\\n\\n  function setSupplyRateMantissa(uint256 _supplyRatePerBlock) external {\\n    __supplyRatePerBlock = _supplyRatePerBlock;\\n  }\\n}\\n\",\"keccak256\":\"0x5afe0d5a9dc3155dea56abcf074b454399fda11756228d5489ae1028c858c7e5\"},\"contracts/test/ERC20Mintable.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\\\";\\n\\n/**\\n * @dev Extension of {ERC20} that adds a set of accounts with the {MinterRole},\\n * which have permission to mint (create) new tokens as they see fit.\\n *\\n * At construction, the deployer of the contract is the only minter.\\n */\\ncontract ERC20Mintable is ERC20Upgradeable {\\n\\n    constructor(string memory _name, string memory _symbol) public {\\n        __ERC20_init(_name, _symbol);\\n    }\\n\\n    /**\\n     * @dev See {ERC20-_mint}.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have the {MinterRole}.\\n     */\\n    function mint(address account, uint256 amount) public returns (bool) {\\n        _mint(account, amount);\\n        return true;\\n    }\\n\\n    function burn(address account, uint256 amount) public returns (bool) {\\n        _burn(account, amount);\\n        return true;\\n    }\\n\\n    function masterTransfer(address from, address to, uint256 amount) public {\\n        _transfer(from, to, amount);\\n    }\\n}\\n\",\"keccak256\":\"0x7734575f2e59cfc85b4c4a39c065f8b2c6ecc97c5d7b6d96c0749b0884eacb6f\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x72b6a1d297cd3b033d7c2e4a7e7864934bb767db6453623f1c3082c6534547f4\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/test/CTokenMock.sol:CTokenMock",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/test/CTokenMock.sol:CTokenMock",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/test/CTokenMock.sol:CTokenMock",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 1372,
                "contract": "contracts/test/CTokenMock.sol:CTokenMock",
                "label": "_balances",
                "offset": 0,
                "slot": "51",
                "type": "t_mapping(t_address,t_uint256)"
              },
              {
                "astId": 1378,
                "contract": "contracts/test/CTokenMock.sol:CTokenMock",
                "label": "_allowances",
                "offset": 0,
                "slot": "52",
                "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
              },
              {
                "astId": 1380,
                "contract": "contracts/test/CTokenMock.sol:CTokenMock",
                "label": "_totalSupply",
                "offset": 0,
                "slot": "53",
                "type": "t_uint256"
              },
              {
                "astId": 1382,
                "contract": "contracts/test/CTokenMock.sol:CTokenMock",
                "label": "_name",
                "offset": 0,
                "slot": "54",
                "type": "t_string_storage"
              },
              {
                "astId": 1384,
                "contract": "contracts/test/CTokenMock.sol:CTokenMock",
                "label": "_symbol",
                "offset": 0,
                "slot": "55",
                "type": "t_string_storage"
              },
              {
                "astId": 1386,
                "contract": "contracts/test/CTokenMock.sol:CTokenMock",
                "label": "_decimals",
                "offset": 0,
                "slot": "56",
                "type": "t_uint8"
              },
              {
                "astId": 1881,
                "contract": "contracts/test/CTokenMock.sol:CTokenMock",
                "label": "__gap",
                "offset": 0,
                "slot": "57",
                "type": "t_array(t_uint256)44_storage"
              },
              {
                "astId": 12571,
                "contract": "contracts/test/CTokenMock.sol:CTokenMock",
                "label": "ownerTokenAmounts",
                "offset": 0,
                "slot": "101",
                "type": "t_mapping(t_address,t_uint256)"
              },
              {
                "astId": 12573,
                "contract": "contracts/test/CTokenMock.sol:CTokenMock",
                "label": "underlying",
                "offset": 0,
                "slot": "102",
                "type": "t_contract(ERC20Mintable)13680"
              },
              {
                "astId": 12575,
                "contract": "contracts/test/CTokenMock.sol:CTokenMock",
                "label": "__supplyRatePerBlock",
                "offset": 0,
                "slot": "103",
                "type": "t_uint256"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_uint256)44_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[44]",
                "numberOfBytes": "1408"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_contract(ERC20Mintable)13680": {
                "encoding": "inplace",
                "label": "contract ERC20Mintable",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_mapping(t_address,t_uint256))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => uint256))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_uint256)"
              },
              "t_mapping(t_address,t_uint256)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => uint256)",
                "numberOfBytes": "32",
                "value": "t_uint256"
              },
              "t_string_storage": {
                "encoding": "bytes",
                "label": "string",
                "numberOfBytes": "32"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint8": {
                "encoding": "inplace",
                "label": "uint8",
                "numberOfBytes": "1"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/test/CompoundPrizePoolHarness.sol": {
        "CompoundPrizePoolHarness": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "AwardCaptured",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "Awarded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "AwardedExternalERC20",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256[]",
                  "name": "tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "AwardedExternalERC721",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "cToken",
                  "type": "address"
                }
              ],
              "name": "CompoundPrizePoolInitialized",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract ControlledTokenInterface",
                  "name": "token",
                  "type": "address"
                }
              ],
              "name": "ControlledTokenAdded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "CreditBurned",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "CreditMinted",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint128",
                  "name": "creditLimitMantissa",
                  "type": "uint128"
                },
                {
                  "indexed": false,
                  "internalType": "uint128",
                  "name": "creditRateMantissa",
                  "type": "uint128"
                }
              ],
              "name": "CreditPlanSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "referrer",
                  "type": "address"
                }
              ],
              "name": "Deposited",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "bytes",
                  "name": "error",
                  "type": "bytes"
                }
              ],
              "name": "ErrorAwardingExternalERC721",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "reserveRegistry",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "maxExitFeeMantissa",
                  "type": "uint256"
                }
              ],
              "name": "Initialized",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "redeemed",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "exitFee",
                  "type": "uint256"
                }
              ],
              "name": "InstantWithdrawal",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "liquidityCap",
                  "type": "uint256"
                }
              ],
              "name": "LiquidityCapSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "prizeStrategy",
                  "type": "address"
                }
              ],
              "name": "PrizeStrategySet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "ReserveFeeCaptured",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "ReserveWithdrawal",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "TransferredExternalERC20",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "VERSION",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "accountedBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "awardBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "awardExternalERC20",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256[]",
                  "name": "tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "awardExternalERC721",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "balance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "balanceOfCredit",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "beforeTokenTransfer",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "cToken",
              "outputs": [
                {
                  "internalType": "contract CTokenInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "calculateEarlyExitFee",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "exitFee",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "burnedCredit",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "calculateReserveFee",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_externalToken",
                  "type": "address"
                }
              ],
              "name": "canAwardExternal",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "captureAwardBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract ICompLike",
                  "name": "compLike",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                }
              ],
              "name": "compLikeDelegate",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "creditPlanOf",
              "outputs": [
                {
                  "internalType": "uint128",
                  "name": "creditLimitMantissa",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "creditRateMantissa",
                  "type": "uint128"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "currentTime",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "referrer",
                  "type": "address"
                }
              ],
              "name": "depositTo",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_principal",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "_interest",
                  "type": "uint256"
                }
              ],
              "name": "estimateCreditAccrualTime",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "durationSeconds",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "_reserveRegistry",
                  "type": "address"
                },
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "_controlledTokens",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256",
                  "name": "_maxExitFeeMantissa",
                  "type": "uint256"
                }
              ],
              "name": "initialize",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "_reserveRegistry",
                  "type": "address"
                },
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "_controlledTokens",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256",
                  "name": "_maxExitFeeMantissa",
                  "type": "uint256"
                },
                {
                  "internalType": "contract CTokenInterface",
                  "name": "_cToken",
                  "type": "address"
                }
              ],
              "name": "initialize",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract ControlledTokenInterface",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "isControlled",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "liquidityCap",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "maxExitFeeMantissa",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "onERC721Received",
              "outputs": [
                {
                  "internalType": "bytes4",
                  "name": "",
                  "type": "bytes4"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizeStrategy",
              "outputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "redeemAmount",
                  "type": "uint256"
                }
              ],
              "name": "redeem",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "renounceOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "reserveRegistry",
              "outputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "reserveTotalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint128",
                  "name": "_creditRateMantissa",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "_creditLimitMantissa",
                  "type": "uint128"
                }
              ],
              "name": "setCreditPlanOf",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_currentTime",
                  "type": "uint256"
                }
              ],
              "name": "setCurrentTime",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_liquidityCap",
                  "type": "uint256"
                }
              ],
              "name": "setLiquidityCap",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "_prizeStrategy",
                  "type": "address"
                }
              ],
              "name": "setPrizeStrategy",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "mintAmount",
                  "type": "uint256"
                }
              ],
              "name": "supply",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "token",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "tokens",
              "outputs": [
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "",
                  "type": "address[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transferExternalERC20",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "maximumExitFee",
                  "type": "uint256"
                }
              ],
              "name": "withdrawInstantlyFrom",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                }
              ],
              "name": "withdrawReserve",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "accountedBalance()": {
                "returns": {
                  "_0": "The current total of all tokens"
                }
              },
              "award(address,uint256,address)": {
                "details": "The amount awarded must be less than the awardBalance()",
                "params": {
                  "amount": "The amount of assets to be awarded",
                  "controlledToken": "The address of the asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "awardBalance()": {
                "details": "captureAwardBalance() should be called first",
                "returns": {
                  "_0": "The total amount of assets to be awarded for the current prize"
                }
              },
              "awardExternalERC20(address,address,uint256)": {
                "details": "Used to award any arbitrary tokens held by the Prize Pool",
                "params": {
                  "amount": "The amount of external assets to be awarded",
                  "externalToken": "The address of the external asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "awardExternalERC721(address,address,uint256[])": {
                "details": "Used to award any arbitrary NFTs held by the Prize Pool",
                "params": {
                  "externalToken": "The address of the external NFT token being awarded",
                  "to": "The address of the winner that receives the award",
                  "tokenIds": "An array of NFT Token IDs to be transferred"
                }
              },
              "balance()": {
                "details": "Returns the total underlying balance of all assets. This includes both principal and interest.",
                "returns": {
                  "_0": "The underlying balance of assets"
                }
              },
              "balanceOfCredit(address,address)": {
                "params": {
                  "user": "The user whose credit balance should be returned"
                },
                "returns": {
                  "_0": "The balance of the users credit"
                }
              },
              "beforeTokenTransfer(address,address,uint256)": {
                "params": {
                  "amount": "The amount of tokens being trasferred",
                  "from": "The address the tokens are being transferred from (0 if minting)",
                  "to": "The address the tokens are being transferred to (0 if burning)"
                }
              },
              "calculateEarlyExitFee(address,address,uint256)": {
                "params": {
                  "amount": "The amount of collateral to be withdrawn",
                  "controlledToken": "The type of collateral being withdrawn",
                  "from": "The user who is withdrawing"
                },
                "returns": {
                  "burnedCredit": "The user's credit that was burned",
                  "exitFee": "The exit fee"
                }
              },
              "calculateReserveFee(uint256)": {
                "params": {
                  "amount": "The prize amount"
                },
                "returns": {
                  "_0": "The size of the reserve portion of the prize"
                }
              },
              "canAwardExternal(address)": {
                "details": "Checks with the Prize Pool if a specific token type may be awarded as an external prize",
                "params": {
                  "_externalToken": "The address of the token to check"
                },
                "returns": {
                  "_0": "True if the token may be awarded, false otherwise"
                }
              },
              "captureAwardBalance()": {
                "details": "This function also captures the reserve fees.",
                "returns": {
                  "_0": "The total amount of assets to be awarded for the current prize"
                }
              },
              "compLikeDelegate(address,address)": {
                "params": {
                  "compLike": "The COMP-like token held by the prize pool that should be delegated",
                  "to": "The address to delegate to "
                }
              },
              "creditPlanOf(address)": {
                "params": {
                  "controlledToken": "The controlled token to retrieve the credit rates for"
                },
                "returns": {
                  "creditLimitMantissa": "The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.",
                  "creditRateMantissa": "The credit rate. This is the amount of tokens that accrue per second."
                }
              },
              "depositTo(address,uint256,address,address)": {
                "params": {
                  "amount": "The amount of assets to deposit",
                  "controlledToken": "The address of the type of token the user is minting",
                  "referrer": "The referrer of the deposit",
                  "to": "The address receiving the newly minted tokens"
                }
              },
              "estimateCreditAccrualTime(address,uint256,uint256)": {
                "params": {
                  "_interest": "The amount of interest that must accrue",
                  "_principal": "The principal amount on which interest is accruing"
                },
                "returns": {
                  "durationSeconds": "The duration of time it will take to accrue the given amount of interest, in seconds."
                }
              },
              "initialize(address,address[],uint256)": {
                "params": {
                  "_controlledTokens": "Array of ControlledTokens that are controlled by this Prize Pool.",
                  "_maxExitFeeMantissa": "The maximum exit fee size"
                }
              },
              "initialize(address,address[],uint256,address)": {
                "params": {
                  "_cToken": "Address of the Compound cToken interface",
                  "_controlledTokens": "Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool",
                  "_maxExitFeeMantissa": "The maximum exit fee size, relative to the withdrawal amount"
                }
              },
              "isControlled(address)": {
                "details": "Checks if a specific token is controlled by the Prize Pool",
                "params": {
                  "controlledToken": "The address of the token to check"
                },
                "returns": {
                  "_0": "True if the token is a controlled token, false otherwise"
                }
              },
              "onERC721Received(address,address,uint256,bytes)": {
                "params": {
                  "data": "Additional data with no specified format, sent in call to `_to`.",
                  "from": "The current owner of the NFT",
                  "operator": "The address that acts on behalf of the owner",
                  "tokenId": "The NFT to transfer"
                }
              },
              "owner()": {
                "details": "Returns the address of the current owner."
              },
              "renounceOwnership()": {
                "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
              },
              "setCreditPlanOf(address,uint128,uint128)": {
                "params": {
                  "_controlledToken": "The controlled token for whom to set the credit plan",
                  "_creditLimitMantissa": "The credit limit to set.  Is a fixed point 18 decimal (like Ether).",
                  "_creditRateMantissa": "The credit rate to set.  Is a fixed point 18 decimal (like Ether)."
                }
              },
              "setLiquidityCap(uint256)": {
                "params": {
                  "_liquidityCap": "The new liquidity cap for the prize pool"
                }
              },
              "setPrizeStrategy(address)": {
                "params": {
                  "_prizeStrategy": "The new prize strategy"
                }
              },
              "token()": {
                "details": "Returns the address of the underlying ERC20 asset",
                "returns": {
                  "_0": "The address of the asset"
                }
              },
              "tokens()": {
                "returns": {
                  "_0": "An array of controlled token addresses"
                }
              },
              "transferExternalERC20(address,address,uint256)": {
                "details": "Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.",
                "params": {
                  "amount": "The amount of external assets to be awarded",
                  "externalToken": "The address of the external asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "transferOwnership(address)": {
                "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
              },
              "withdrawInstantlyFrom(address,uint256,address,uint256)": {
                "params": {
                  "amount": "The amount of tokens to redeem for assets.",
                  "controlledToken": "The address of the token to redeem (i.e. ticket or sponsorship)",
                  "from": "The address to redeem tokens from.",
                  "maximumExitFee": "The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn."
                },
                "returns": {
                  "_0": "The actual exit fee paid"
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506144d1806100206000396000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c8063888c2b6f11610146578063b69ef8a8116100c3578063e323f82511610087578063e323f825146109a5578063e6d8a94b146109e1578063edb4e1cf146109e9578063f2fde38b146109f1578063fc0c546a14610a17578063ffa1ad7414610a1f5761025e565b8063b69ef8a814610864578063c58714851461086c578063d18e81b31461092b578063d4a1361d14610933578063db006a75146109885761025e565b80639d63848a1161010a5780639d63848a146107705780639e167519146107c85780639fe32a91146107d0578063a016240b146107ed578063a7b2cc31146108275761025e565b8063888c2b6f146106e35780638da5cb5b146107325780638e71c1f61461073a57806391ca480e1461074257806398bf3eb6146107685761025e565b806352a387ab116101df578063715018a6116101a3578063715018a61461062857806376687d3d1461063057806378b3d3271461063857806379cb85631461065e5780637b99adb1146106905780637cbab1c7146106ad5761025e565b806352a387ab14610566578063630665b41461058c57806369e527da146105945780636a3fd4f9146105b85780636b1b863a146105f25761025e565b80632b0ab144116102265780632b0ab144146104045780632f7627e31461043a57806335403023146104685780633ede50c614610485578063494de9f7146105385761025e565b80630937eb541461026357806313f55e391461027d578063150b7a02146102b557806316960d551461036057806322f8e566146103e7575b600080fd5b61026b610a9c565b60408051918252519081900360200190f35b6102b36004803603606081101561029357600080fd5b506001600160a01b03813581169160208101359091169060400135610aab565b005b610343600480360360808110156102cb57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561030557600080fd5b82018360208201111561031757600080fd5b803590602001918460018302840111600160201b8311171561033857600080fd5b509092509050610b69565b604080516001600160e01b03199092168252519081900360200190f35b6102b36004803603606081101561037657600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b8111156103a957600080fd5b8201836020820111156103bb57600080fd5b803590602001918460208302840111600160201b831117156103dc57600080fd5b509092509050610b7a565b6102b3600480360360208110156103fd57600080fd5b5035610e27565b6102b36004803603606081101561041a57600080fd5b506001600160a01b03813581169160208101359091169060400135610e2c565b6102b36004803603604081101561045057600080fd5b506001600160a01b0381358116916020013516610ee9565b6102b36004803603602081101561047e57600080fd5b5035611038565b6102b36004803603606081101561049b57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156104c557600080fd5b8201836020820111156104d757600080fd5b803590602001918460208302840111600160201b831117156104f857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611044915050565b61026b6004803603604081101561054e57600080fd5b506001600160a01b0381358116916020013516611236565b61026b6004803603602081101561057c57600080fd5b50356001600160a01b031661133d565b61026b61148c565b61059c611492565b604080516001600160a01b039092168252519081900360200190f35b6105de600480360360208110156105ce57600080fd5b50356001600160a01b03166114a1565b604080519115158252519081900360200190f35b6102b36004803603606081101561060857600080fd5b506001600160a01b038135811691602081013591604090910135166114b4565b6102b36116bc565b61026b611768565b6105de6004803603602081101561064e57600080fd5b50356001600160a01b031661176e565b61026b6004803603606081101561067457600080fd5b506001600160a01b038135169060208101359060400135611779565b6102b3600480360360208110156106a657600080fd5b503561178e565b6102b3600480360360608110156106c357600080fd5b506001600160a01b038135811691602081013590911690604001356117f9565b610719600480360360608110156106f957600080fd5b506001600160a01b03813581169160208101359091169060400135611a45565b6040805192835260208301919091528051918290030190f35b61059c611a5f565b61059c611a6e565b6102b36004803603602081101561075857600080fd5b50356001600160a01b0316611a7d565b61059c611ae8565b610778611af7565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156107b457818101518382015260200161079c565b505050509050019250505060405180910390f35b61026b611b59565b61026b600480360360208110156107e657600080fd5b5035611b5f565b61026b6004803603608081101561080357600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611c8d565b6102b36004803603606081101561083d57600080fd5b506001600160a01b03813516906001600160801b0360208201358116916040013516611ec4565b61026b61201a565b6102b36004803603608081101561088257600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156108ac57600080fd5b8201836020820111156108be57600080fd5b803590602001918460208302840111600160201b831117156108df57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602001356001600160a01b0316612024565b61026b612122565b6109596004803603602081101561094957600080fd5b50356001600160a01b0316612128565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b61026b6004803603602081101561099e57600080fd5b5035612158565b6102b3600480360360808110156109bb57600080fd5b506001600160a01b03813581169160208101359160408201358116916060013516612163565b61026b612318565b61026b61248e565b6102b360048036036020811015610a0757600080fd5b50356001600160a01b0316612494565b61059c612597565b610a276125a1565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610a61578181015183820152602001610a49565b50505050905090810190601f168015610a8e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610aa66125c2565b905090565b6099546001600160a01b0316610abf6126cd565b6001600160a01b031614610b08576040805162461bcd60e51b815260206004820152601c602482015260008051602061447c833981519152604482015290519081900360640190fd5b610b138383836126d1565b15610b6457816001600160a01b0316836001600160a01b03167fb0bac59718cd343c80a813518afcf36846cfcfe6d56e2b3cab9bd49f5f9b251c836040518082815260200191505060405180910390a35b505050565b630a85bd0160e11b95945050505050565b6099546001600160a01b0316610b8e6126cd565b6001600160a01b031614610bd7576040805162461bcd60e51b815260206004820152601c602482015260008051602061447c833981519152604482015290519081900360640190fd5b610be083612759565b610c31576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b80610c3b57610e21565b60005b81811015610da857836001600160a01b03166342842e0e3087868686818110610c6357fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610cc057600080fd5b505af1925050508015610cd1575060015b610da0573d808015610cff576040519150601f19603f3d011682016040523d82523d6000602084013e610d04565b606091505b507f17e975018310f88872b58d4d8263adca83cf5c1893496ea2a86923dab15276ad816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d64578181015183820152602001610d4c565b50505050905090810190601f168015610d915780820380516001836020036101000a031916815260200191505b509250505060405180910390a1505b600101610c3e565b50826001600160a01b0316846001600160a01b03167f69c2de32bc4d47f488e72626a6cfdee85089342e52675e7de79c4b417623960c848460405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a35b50505050565b60a155565b6099546001600160a01b0316610e406126cd565b6001600160a01b031614610e89576040805162461bcd60e51b815260206004820152601c602482015260008051602061447c833981519152604482015290519081900360640190fd5b610e948383836126d1565b15610b6457816001600160a01b0316836001600160a01b03167fc65f48aca3b7a99b7443d04b8ffbb073156179bc628dc3f7def5047748973469836040518082815260200191505060405180910390a3505050565b610ef16126cd565b6001600160a01b0316610f02611a5f565b6001600160a01b031614610f4b576040805162461bcd60e51b8152602060048201819052602482015260008051602061438f833981519152604482015290519081900360640190fd5b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f9a57600080fd5b505afa158015610fae573d6000803e3d6000fd5b505050506040513d6020811015610fc457600080fd5b5051111561103457816001600160a01b0316635c19a95c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561101b57600080fd5b505af115801561102f573d6000803e3d6000fd5b505050505b5050565b6110418161276e565b50565b600054610100900460ff168061105d575061105d612863565b8061106b575060005460ff16155b6110a65760405162461bcd60e51b815260040180806020018281038252602e815260200180614340602e913960400191505060405180910390fd5b600054610100900460ff161580156110d1576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0384166111165760405162461bcd60e51b81526004018080602001828103825260228152602001806142f86022913960400191505060405180910390fd5b82518067ffffffffffffffff8111801561112f57600080fd5b50604051908082528060200260200182016040528015611159578160200160208202803683370190505b50805161116e9160989160209091019061422f565b5060005b818110156111a557600085828151811061118857fe5b6020026020010151905061119c8183612874565b50600101611172565b506111ae61299f565b6111b6612a50565b6111c1600019612ae5565b609780546001600160a01b0319166001600160a01b038716908117909155609a849055604080519182526020820185905280517f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce799281900390910190a1508015610e21576000805461ff001916905550505050565b60008161124281612b20565b611281576040805162461bcd60e51b815260206004820152601760248201526000805160206143d6833981519152604482015290519081900360640190fd5b6113068484856001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112d357600080fd5b505afa1580156112e7573d6000803e3d6000fd5b505050506040513d60208110156112fd57600080fd5b50516000612bdc565b50506001600160a01b039081166000908152609f60209081526040808320949093168252929092529020546001600160c01b031690565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561138e57600080fd5b505afa1580156113a2573d6000803e3d6000fd5b505050506040513d60208110156113b857600080fd5b505190506001600160a01b0381163314611412576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f6f6e6c792d7265736572766560501b604482015290519081900360640190fd5b609b80546000918290559061142682612bf2565b90506114458582611435612dd7565b6001600160a01b03169190612e4d565b6040805183815290516001600160a01b038716917f1c71c8e11fd443227c8f8d3dc1a237a3a5e8310b540c7fbcf5169754aedf42c9919081900360200190a2949350505050565b609d5490565b60a0546001600160a01b031681565b60006114ac82612759565b90505b919050565b6099546001600160a01b03166114c86126cd565b6001600160a01b031614611511576040805162461bcd60e51b815260206004820152601c602482015260008051602061447c833981519152604482015290519081900360640190fd5b8061151b81612b20565b61155a576040805162461bcd60e51b815260206004820152601760248201526000805160206143d6833981519152604482015290519081900360640190fd5b8261156457610e21565b609d548311156115bb576040805162461bcd60e51b815260206004820152601d60248201527f5072697a65506f6f6c2f61776172642d657863656564732d617661696c000000604482015290519081900360640190fd5b609d546115c89084612e9f565b609d556115d88484846000612f01565b60006115e48385612fe7565b905061166a8584856001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561163857600080fd5b505afa15801561164c573d6000803e3d6000fd5b505050506040513d602081101561166257600080fd5b505184612bdc565b826001600160a01b0316856001600160a01b03167fe2554529d99ab7a67db6b4cea2b32c7d55ae325f958861e05f304fdded867e31866040518082815260200191505060405180910390a35050505050565b6116c46126cd565b6001600160a01b03166116d5611a5f565b6001600160a01b03161461171e576040805162461bcd60e51b8152602060048201819052602482015260008051602061438f833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b609c5481565b60006114ac82612b20565b600061178684848461301f565b949350505050565b6117966126cd565b6001600160a01b03166117a7611a5f565b6001600160a01b0316146117f0576040805162461bcd60e51b8152602060048201819052602482015260008051602061438f833981519152604482015290519081900360640190fd5b61104181612ae5565b3361180381612b20565b611842576040805162461bcd60e51b815260206004820152601760248201526000805160206143d6833981519152604482015290519081900360640190fd5b6001600160a01b0384161561191c576000336001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156118a057600080fd5b505afa1580156118b4573d6000803e3d6000fd5b505050506040513d60208110156118ca57600080fd5b5051905060006118dc86338484613070565b9050846001600160a01b0316866001600160a01b03161461190e5761190b336119058487612e9f565b836130ff565b90505b611919863383613145565b50505b6001600160a01b038316158015906119465750836001600160a01b0316836001600160a01b031614155b1561199d5761199d8333336001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112d357600080fd5b6001600160a01b038416158015906119bf57506099546001600160a01b031615155b15610e21576099546040805163b221095760e01b81526001600160a01b0387811660048301528681166024830152604482018690523360648301529151919092169163b221095791608480830192600092919082900301818387803b158015611a2757600080fd5b505af1158015611a3b573d6000803e3d6000fd5b5050505050505050565b600080611a538585856132e3565b90969095509350505050565b6033546001600160a01b031690565b6097546001600160a01b031681565b611a856126cd565b6001600160a01b0316611a96611a5f565b6001600160a01b031614611adf576040805162461bcd60e51b8152602060048201819052602482015260008051602061438f833981519152604482015290519081900360640190fd5b61104181613481565b6099546001600160a01b031681565b60606098805480602002602001604051908101604052809291908181526020018280548015611b4f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b31575b5050505050905090565b609a5481565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611bb057600080fd5b505afa158015611bc4573d6000803e3d6000fd5b505050506040513d6020811015611bda57600080fd5b505190506001600160a01b038116611bf65760009150506114af565b6000816001600160a01b031663010dfa58306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611c4557600080fd5b505afa158015611c59573d6000803e3d6000fd5b505050506040513d6020811015611c6f57600080fd5b5051905080611c83576000925050506114af565b6117868482613594565b600060026065541415611ce7576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655582611cf681612b20565b611d35576040805162461bcd60e51b815260206004820152601760248201526000805160206143d6833981519152604482015290519081900360640190fd5b600080611d438887896132e3565b9150915084821115611d865760405162461bcd60e51b81526004018080602001828103825260278152602001806143af6027913960400191505060405180910390fd5b611d918887836135b5565b856001600160a01b031663631b5dfb611da86126cd565b8a8a6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611e0057600080fd5b505af1158015611e14573d6000803e3d6000fd5b505050506000611e2d8389612e9f90919063ffffffff16565b90506000611e3a82612bf2565b9050611e498a82611435612dd7565b876001600160a01b03168a6001600160a01b0316611e656126cd565b604080518d81526020810186905280820189905290516001600160a01b0392909216917f0271704a58fd2953e49b87d67a0a3ce28a58147de98a5457f60b4686f63850309181900360600190a450506001606555509695505050505050565b82611ece81612b20565b611f0d576040805162461bcd60e51b815260206004820152601760248201526000805160206143d6833981519152604482015290519081900360640190fd5b611f156126cd565b6001600160a01b0316611f26611a5f565b6001600160a01b031614611f6f576040805162461bcd60e51b8152602060048201819052602482015260008051602061438f833981519152604482015290519081900360640190fd5b6040805180820182526001600160801b0380851680835286821660208085018281526001600160a01b038b166000818152609e84528890209651875492518716600160801b029087166fffffffffffffffffffffffffffffffff1990931692909217909516179094558451928352928201528083019190915290517ffb0ba2cf86a2b03bcf387753a2192da80a006afa99dd022bb301c78e323bf1b99181900360600190a150505050565b6000610aa6613676565b600054610100900460ff168061203d575061203d612863565b8061204b575060005460ff16155b6120865760405162461bcd60e51b815260040180806020018281038252602e815260200180614340602e913960400191505060405180910390fd5b600054610100900460ff161580156120b1576000805460ff1961ff0019909116610100171660011790555b6120bc858585611044565b60a080546001600160a01b0319166001600160a01b0384811691909117918290556040519116907fa5670b49a0ee863080ae28858bb5d9bcc1eb0d2a6f4c9c3a8accc43b8f445d2590600090a2801561211b576000805461ff00191690555b5050505050565b60a15481565b6001600160a01b03166000908152609e60205260409020546001600160801b0380821692600160801b9092041690565b60006114ac82612bf2565b600260655414156121bb576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002606555816121ca81612b20565b612209576040805162461bcd60e51b815260206004820152601760248201526000805160206143d6833981519152604482015290519081900360640190fd5b83612213816136d6565b612264576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f657863656564732d6c69717569646974792d63617000604482015290519081900360640190fd5b600061226e6126cd565b905061227c87878787612f01565b61229b81308861228a612dd7565b6001600160a01b03169291906136fa565b6122a48661276e565b846001600160a01b0316876001600160a01b0316826001600160a01b03167f6ce569498e0f86f147466ac49211cb2a1ffe06195adb805e383b3f2365109160898860405180838152602001826001600160a01b031681526020019250505060405180910390a4505060016065555050505050565b600060026065541415612372576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655560006123816125c2565b9050600061238d613676565b9050600082821161239f5760006123a9565b6123a98284612e9f565b90506000609d5482116123bd5760006123cb565b609d546123cb908390612e9f565b9050801561247d5760006123de82611b5f565b9050801561243857609b546123f39082613754565b609b556124008282612e9f565b6040805183815290519193507f5f1703ccfa2730d4245350f228079926a37f26a44ecf6978a7eeafff0af11407919081900360200190a15b609d546124459083613754565b609d556040805183815290517fce2b6e507c7ca1a20ce136810f524eefc19ba4c7e4866eb6cc0cba76e778d4be9181900360200190a1505b609d54945050505050600160655590565b609b5481565b61249c6126cd565b6001600160a01b03166124ad611a5f565b6001600160a01b0316146124f6576040805162461bcd60e51b8152602060048201819052602482015260008051602061438f833981519152604482015290519081900360640190fd5b6001600160a01b03811661253b5760405162461bcd60e51b81526004018080602001828103825260268152602001806142ab6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610aa6612dd7565b60405180604001604052806005815260200164332e342e3560d81b81525081565b600080609b5490506060609880548060200260200160405190810160405280929190818152602001828054801561262257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612604575b505083519394506000925050505b818110156126c4576126ba83828151811061264757fe5b60200260200101516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561268757600080fd5b505afa15801561269b573d6000803e3d6000fd5b505050506040513d60208110156126b157600080fd5b50518590613754565b9350600101612630565b50919250505090565b3390565b60006126dc83612759565b61272d576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b8161273a57506000612752565b61274e6001600160a01b0384168584612e4d565b5060015b9392505050565b60a0546001600160a01b039081169116141590565b60a054612797906001600160a01b031682612787612dd7565b6001600160a01b031691906137ae565b60a0546040805163140e25ad60e31b81526004810184905290516001600160a01b039092169163a0712d68916024808201926020929091908290030181600087803b1580156127e557600080fd5b505af11580156127f9573d6000803e3d6000fd5b505050506040513d602081101561280f57600080fd5b505115611041576040805162461bcd60e51b815260206004820152601d60248201527f436f6d706f756e645072697a65506f6f6c2f6d696e742d6661696c6564000000604482015290519081900360640190fd5b600061286e306138c1565b15905090565b306001600160a01b0316826001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b1580156128b757600080fd5b505afa1580156128cb573d6000803e3d6000fd5b505050506040513d60208110156128e157600080fd5b50516001600160a01b03161461293e576040805162461bcd60e51b815260206004820152601e60248201527f5072697a65506f6f6c2f746f6b656e2d6374726c722d6d69736d617463680000604482015290519081900360640190fd5b816098828154811061294c57fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051918416917f460e712b4a5d801d031ed673dea209b73ab854f7ddeb86b6c48082e92c3eee669190a25050565b600054610100900460ff16806129b857506129b8612863565b806129c6575060005460ff16155b612a015760405162461bcd60e51b815260040180806020018281038252602e815260200180614340602e913960400191505060405180910390fd5b600054610100900460ff16158015612a2c576000805460ff1961ff0019909116610100171660011790555b612a346138c7565b612a3c613967565b8015611041576000805461ff001916905550565b600054610100900460ff1680612a695750612a69612863565b80612a77575060005460ff16155b612ab25760405162461bcd60e51b815260040180806020018281038252602e815260200180614340602e913960400191505060405180910390fd5b600054610100900460ff16158015612add576000805460ff1961ff0019909116610100171660011790555b612a3c613a60565b609c8190556040805182815290517f3ff20538222f568f27ff436c0c49dfd3e48d5b8f86533a3f759dc1c7089775ab9181900360200190a150565b600060606098805480602002602001604051908101604052809291908181526020018280548015612b7a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612b5c575b505083519394506000925050505b81811015612bd157846001600160a01b0316838281518110612ba657fe5b60200260200101516001600160a01b03161415612bc957600193505050506114af565b600101612b88565b506000949350505050565b610e218484612bed87878787613070565b613145565b600080612bfd612dd7565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612c4e57600080fd5b505afa158015612c62573d6000803e3d6000fd5b505050506040513d6020811015612c7857600080fd5b505160a0546040805163852a12e360e01b81526004810188905290519293506001600160a01b039091169163852a12e3916024808201926020929091908290030181600087803b158015612ccb57600080fd5b505af1158015612cdf573d6000803e3d6000fd5b505050506040513d6020811015612cf557600080fd5b505115612d49576040805162461bcd60e51b815260206004820152601f60248201527f436f6d706f756e645072697a65506f6f6c2f72656465656d2d6661696c656400604482015290519081900360640190fd5b6000612dce82846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612d9c57600080fd5b505afa158015612db0573d6000803e3d6000fd5b505050506040513d6020811015612dc657600080fd5b505190612e9f565b95945050505050565b60a05460408051636f307dc360e01b815290516000926001600160a01b031691636f307dc3916004808301926020929190829003018186803b158015612e1c57600080fd5b505afa158015612e30573d6000803e3d6000fd5b505050506040513d6020811015612e4657600080fd5b5051905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610b64908490613b06565b600082821115612ef6576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6099546001600160a01b031615612f9057609954604080516304d7f3db60e41b81526001600160a01b038781166004830152602482018790528581166044830152848116606483015291519190921691634d7f3db091608480830192600092919082900301818387803b158015612f7757600080fd5b505af1158015612f8b573d6000803e3d6000fd5b505050505b816001600160a01b0316635d7b075885856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611a2757600080fd5b6001600160a01b0382166000908152609e602052604081205461275290839061301a9082906001600160801b0316613594565b613bb7565b6001600160a01b0383166000908152609e60205260408120548190613055908590600160801b90046001600160801b0316613594565b905080613066576000915050612752565b612dce8382613bdc565b6001600160a01b038381166000908152609f6020908152604080832093881683529290529081208054829190600160e01b900460ff166130b357600091506130f5565b60006130c0888888613c43565b82549091506130f190889088906130ec9089906130e6906001600160c01b031687613754565b90613754565b6130ff565b9250505b5095945050505050565b6001600160a01b0383166000908152609e6020526040812054819061312e9085906001600160801b0316613594565b90508083111561313c578092505b50909392505050565b6001600160a01b038083166000908152609f602090815260408083209387168352929052819020548151606081019092526001600160c01b0316908061318a84613cf4565b6001600160801b031681526020016131a86131a3613d3c565b613d42565b63ffffffff908116825260016020928301526001600160a01b038681166000908152609f84526040808220928a168252918452819020845181549486015195909201516001600160c01b03199094166001600160c01b039092169190911763ffffffff60c01b1916600160c01b94909216939093021760ff60e01b1916600160e01b911515919091021790558181101561328b576001600160a01b038084169085167f2f92d56910619b38bc29fd8e4ca5e56359edac7a0c086cdcd305fb603fa374916132758585612e9f565b60408051918252519081900360200190a3610e21565b80821015610e21576001600160a01b038084169085167ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf6132cc8486612e9f565b60408051918252519081900360200190a350505050565b6000806000846001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561333557600080fd5b505afa158015613349573d6000803e3d6000fd5b505050506040513d602081101561335f57600080fd5b50519050838110156133b1576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f696e737566662d66756e647360501b604482015290519081900360640190fd5b6133be8686836000612bdc565b60006133d3866133ce8488612e9f565b612fe7565b6001600160a01b038088166000908152609f60209081526040808320938c16835292905290812054919250906001600160c01b0316821161344a576001600160a01b038088166000908152609f60209081526040808320938c1683529290522054613447906001600160c01b031683612e9f565b90505b60006134568888612fe7565b90508082116134655781613467565b805b94506134738186612e9f565b955050505050935093915050565b6001600160a01b0381166134dc576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f7072697a6553747261746567792d6e6f742d7a65726f604482015290519081900360640190fd5b6134f96001600160a01b038216600162a1cb1960e01b0319613d86565b61354a576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f7072697a6553747261746567792d696e76616c696400604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0383169081179091556040517f7f58dc86bc2e435cb77ca0edb1df55e25f90caf2d6bd866971715437d456a21290600090a250565b6000806135a18385613da2565b905061178681670de0b6b3a7640000613dfb565b6001600160a01b038083166000908152609f60209081526040808320938716835292905220546135f7906135f2906001600160c01b031683612e9f565b613cf4565b6001600160a01b038084166000818152609f602090815260408083209489168084529482529182902080546001600160c01b0319166001600160801b0396909616959095179094558051858152905191937ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf92918290030190a3505050565b60a05460408051633af9e66960e01b815230600482015290516000926001600160a01b031691633af9e66991602480830192602092919082900301818787803b1580156136c257600080fd5b505af1158015612e30573d6000803e3d6000fd5b6000806136e16125c2565b609c549091506136f18285613754565b11159392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610e21908590613b06565b600082820183811015612752576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b801580613834575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561380657600080fd5b505afa15801561381a573d6000803e3d6000fd5b505050506040513d602081101561383057600080fd5b5051155b61386f5760405162461bcd60e51b81526004018080602001828103825260368152602001806144466036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610b64908490613b06565b3b151590565b600054610100900460ff16806138e057506138e0612863565b806138ee575060005460ff16155b6139295760405162461bcd60e51b815260040180806020018281038252602e815260200180614340602e913960400191505060405180910390fd5b600054610100900460ff16158015612a3c576000805460ff1961ff0019909116610100171660011790558015611041576000805461ff001916905550565b600054610100900460ff16806139805750613980612863565b8061398e575060005460ff16155b6139c95760405162461bcd60e51b815260040180806020018281038252602e815260200180614340602e913960400191505060405180910390fd5b600054610100900460ff161580156139f4576000805460ff1961ff0019909116610100171660011790555b60006139fe6126cd565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015611041576000805461ff001916905550565b600054610100900460ff1680613a795750613a79612863565b80613a87575060005460ff16155b613ac25760405162461bcd60e51b815260040180806020018281038252602e815260200180614340602e913960400191505060405180910390fd5b600054610100900460ff16158015613aed576000805460ff1961ff0019909116610100171660011790555b60016065558015611041576000805461ff001916905550565b6060613b5b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613e3d9092919063ffffffff16565b805190915015610b6457808060200190516020811015613b7a57600080fd5b5051610b645760405162461bcd60e51b815260040180806020018281038252602a81526020018061441c602a913960400191505060405180910390fd5b600080613bc684609a54613594565b905080831115613bd4578092505b509092915050565b6000808211613c32576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381613c3b57fe5b049392505050565b6001600160a01b038281166000908152609f60209081526040808320938716835292905290812054600160c01b810463ffffffff1690600160e01b900460ff16613c91576000915050612752565b6000613ca582613c9f613d3c565b90612e9f565b6001600160a01b0386166000908152609e602052604081205491925090613cdd908390600160801b90046001600160801b0316613da2565b9050613ce98582613594565b979650505050505050565b6000600160801b8210613d385760405162461bcd60e51b81526004018080602001828103825260278152602001806142d16027913960400191505060405180910390fd5b5090565b60a15490565b6000600160201b8210613d385760405162461bcd60e51b81526004018080602001828103825260268152602001806143f66026913960400191505060405180910390fd5b6000613d9183613e4c565b801561275257506127528383613e7f565b600082613db157506000612efb565b82820282848281613dbe57fe5b04146127525760405162461bcd60e51b815260040180806020018281038252602181526020018061436e6021913960400191505060405180910390fd5b600061275283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ea2565b60606117868484600085613f44565b6000613e5f826301ffc9a760e01b613e7f565b80156114ac5750613e78826001600160e01b0319613e7f565b1592915050565b6000806000613e8e8585614095565b91509150818015612dce5750949350505050565b60008183613f2e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ef3578181015183820152602001613edb565b50505050905090810190601f168015613f205780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613f3a57fe5b0495945050505050565b606082471015613f855760405162461bcd60e51b815260040180806020018281038252602681526020018061431a6026913960400191505060405180910390fd5b613f8e856138c1565b613fdf576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061401e5780518252601f199092019160209182019101613fff565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614080576040519150601f19603f3d011682016040523d82523d6000602084013e614085565b606091505b5091509150613ce98282866141c9565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b1781529151815160009384939284926060926001600160a01b038a169261753092879282918083835b6020831061411d5780518252601f1990920191602091820191016140fe565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461417e576040519150601f19603f3d011682016040523d82523d6000602084013e614183565b606091505b50915091506020815110156141a157600080945094505050506141c2565b818180602001905160208110156141b757600080fd5b505190955093505050505b9250929050565b606083156141d8575081612752565b8251156141e85782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315613ef3578181015183820152602001613edb565b828054828255906000526020600020908101928215614284579160200282015b8281111561428457825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061424f565b50613d389291505b80821115613d385780546001600160a01b031916815560010161428c56fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e2031323820626974735072697a65506f6f6c2f7265736572766552656769737472792d6e6f742d7a65726f416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725072697a65506f6f6c2f657869742d6665652d657863656564732d757365722d6d6178696d756d5072697a65506f6f6c2f756e6b6e6f776e2d746f6b656e00000000000000000053616665436173743a2076616c756520646f65736e27742066697420696e20333220626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e63655072697a65506f6f6c2f6f6e6c792d7072697a65537472617465677900000000a264697066735822122034aae2b6add5a6f099bfd26707f324945e51b2cb08344b3d5aad7dc87c6b254c64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x44D1 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x25E JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x888C2B6F GT PUSH2 0x146 JUMPI DUP1 PUSH4 0xB69EF8A8 GT PUSH2 0xC3 JUMPI DUP1 PUSH4 0xE323F825 GT PUSH2 0x87 JUMPI DUP1 PUSH4 0xE323F825 EQ PUSH2 0x9A5 JUMPI DUP1 PUSH4 0xE6D8A94B EQ PUSH2 0x9E1 JUMPI DUP1 PUSH4 0xEDB4E1CF EQ PUSH2 0x9E9 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x9F1 JUMPI DUP1 PUSH4 0xFC0C546A EQ PUSH2 0xA17 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0xA1F JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0xB69EF8A8 EQ PUSH2 0x864 JUMPI DUP1 PUSH4 0xC5871485 EQ PUSH2 0x86C JUMPI DUP1 PUSH4 0xD18E81B3 EQ PUSH2 0x92B JUMPI DUP1 PUSH4 0xD4A1361D EQ PUSH2 0x933 JUMPI DUP1 PUSH4 0xDB006A75 EQ PUSH2 0x988 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x9D63848A GT PUSH2 0x10A JUMPI DUP1 PUSH4 0x9D63848A EQ PUSH2 0x770 JUMPI DUP1 PUSH4 0x9E167519 EQ PUSH2 0x7C8 JUMPI DUP1 PUSH4 0x9FE32A91 EQ PUSH2 0x7D0 JUMPI DUP1 PUSH4 0xA016240B EQ PUSH2 0x7ED JUMPI DUP1 PUSH4 0xA7B2CC31 EQ PUSH2 0x827 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x888C2B6F EQ PUSH2 0x6E3 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x732 JUMPI DUP1 PUSH4 0x8E71C1F6 EQ PUSH2 0x73A JUMPI DUP1 PUSH4 0x91CA480E EQ PUSH2 0x742 JUMPI DUP1 PUSH4 0x98BF3EB6 EQ PUSH2 0x768 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x52A387AB GT PUSH2 0x1DF JUMPI DUP1 PUSH4 0x715018A6 GT PUSH2 0x1A3 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x628 JUMPI DUP1 PUSH4 0x76687D3D EQ PUSH2 0x630 JUMPI DUP1 PUSH4 0x78B3D327 EQ PUSH2 0x638 JUMPI DUP1 PUSH4 0x79CB8563 EQ PUSH2 0x65E JUMPI DUP1 PUSH4 0x7B99ADB1 EQ PUSH2 0x690 JUMPI DUP1 PUSH4 0x7CBAB1C7 EQ PUSH2 0x6AD JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x52A387AB EQ PUSH2 0x566 JUMPI DUP1 PUSH4 0x630665B4 EQ PUSH2 0x58C JUMPI DUP1 PUSH4 0x69E527DA EQ PUSH2 0x594 JUMPI DUP1 PUSH4 0x6A3FD4F9 EQ PUSH2 0x5B8 JUMPI DUP1 PUSH4 0x6B1B863A EQ PUSH2 0x5F2 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x2B0AB144 GT PUSH2 0x226 JUMPI DUP1 PUSH4 0x2B0AB144 EQ PUSH2 0x404 JUMPI DUP1 PUSH4 0x2F7627E3 EQ PUSH2 0x43A JUMPI DUP1 PUSH4 0x35403023 EQ PUSH2 0x468 JUMPI DUP1 PUSH4 0x3EDE50C6 EQ PUSH2 0x485 JUMPI DUP1 PUSH4 0x494DE9F7 EQ PUSH2 0x538 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x937EB54 EQ PUSH2 0x263 JUMPI DUP1 PUSH4 0x13F55E39 EQ PUSH2 0x27D JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x2B5 JUMPI DUP1 PUSH4 0x16960D55 EQ PUSH2 0x360 JUMPI DUP1 PUSH4 0x22F8E566 EQ PUSH2 0x3E7 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26B PUSH2 0xA9C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x293 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xAAB JUMP JUMPDEST STOP JUMPDEST PUSH2 0x343 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x2CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x305 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x317 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x338 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xB69 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x376 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x3A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x3BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x3DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xB7A JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xE27 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x41A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xE2C JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x450 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xEE9 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x47E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1038 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x49B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x4C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x4D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x4F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0x1044 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x54E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x1236 JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x57C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x133D JUMP JUMPDEST PUSH2 0x26B PUSH2 0x148C JUMP JUMPDEST PUSH2 0x59C PUSH2 0x1492 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x5DE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x14A1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x608 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 SWAP1 SWAP2 ADD CALLDATALOAD AND PUSH2 0x14B4 JUMP JUMPDEST PUSH2 0x2B3 PUSH2 0x16BC JUMP JUMPDEST PUSH2 0x26B PUSH2 0x1768 JUMP JUMPDEST PUSH2 0x5DE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x64E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x176E JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x674 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1779 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x178E JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x6C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x17F9 JUMP JUMPDEST PUSH2 0x719 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x6F9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1A45 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB ADD SWAP1 RETURN JUMPDEST PUSH2 0x59C PUSH2 0x1A5F JUMP JUMPDEST PUSH2 0x59C PUSH2 0x1A6E JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x758 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A7D JUMP JUMPDEST PUSH2 0x59C PUSH2 0x1AE8 JUMP JUMPDEST PUSH2 0x778 PUSH2 0x1AF7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x7B4 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x79C JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x26B PUSH2 0x1B59 JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x7E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1B5F JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x803 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x1C8D JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x83D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x40 ADD CALLDATALOAD AND PUSH2 0x1EC4 JUMP JUMPDEST PUSH2 0x26B PUSH2 0x201A JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x882 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x8AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x8BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x8DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2024 JUMP JUMPDEST PUSH2 0x26B PUSH2 0x2122 JUMP JUMPDEST PUSH2 0x959 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x949 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2128 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x99E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x2158 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x9BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x2163 JUMP JUMPDEST PUSH2 0x26B PUSH2 0x2318 JUMP JUMPDEST PUSH2 0x26B PUSH2 0x248E JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xA07 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2494 JUMP JUMPDEST PUSH2 0x59C PUSH2 0x2597 JUMP JUMPDEST PUSH2 0xA27 PUSH2 0x25A1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xA61 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xA49 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xA8E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xAA6 PUSH2 0x25C2 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xABF PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xB08 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x447C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xB13 DUP4 DUP4 DUP4 PUSH2 0x26D1 JUMP JUMPDEST ISZERO PUSH2 0xB64 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB0BAC59718CD343C80A813518AFCF36846CFCFE6D56E2B3CAB9BD49F5F9B251C DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0xA85BD01 PUSH1 0xE1 SHL SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xB8E PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xBD7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x447C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xBE0 DUP4 PUSH2 0x2759 JUMP JUMPDEST PUSH2 0xC31 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0xC3B JUMPI PUSH2 0xE21 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xDA8 JUMPI DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x42842E0E ADDRESS DUP8 DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0xC63 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0xCD1 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xDA0 JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0xCFF JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xD04 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH32 0x17E975018310F88872B58D4D8263ADCA83CF5C1893496EA2A86923DAB15276AD DUP2 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD64 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD4C JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD91 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xC3E JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x69C2DE32BC4D47F488E72626A6CFDEE85089342E52675E7DE79C4B417623960C DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP6 POP SWAP1 SWAP4 POP POP POP POP LOG3 JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0xA1 SSTORE JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE40 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xE89 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x447C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xE94 DUP4 DUP4 DUP4 PUSH2 0x26D1 JUMP JUMPDEST ISZERO PUSH2 0xB64 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC65F48ACA3B7A99B7443D04B8FFBB073156179BC628DC3F7DEF5047748973469 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH2 0xEF1 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF02 PUSH2 0x1A5F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xF4B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x438F DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xFAE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xFC4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD GT ISZERO PUSH2 0x1034 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5C19A95C DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x101B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x102F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x1041 DUP2 PUSH2 0x276E JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x105D JUMPI POP PUSH2 0x105D PUSH2 0x2863 JUMP JUMPDEST DUP1 PUSH2 0x106B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x10A6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4340 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x10D1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x1116 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F8 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 MLOAD DUP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x112F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1159 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP1 MLOAD PUSH2 0x116E SWAP2 PUSH1 0x98 SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x422F JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x11A5 JUMPI PUSH1 0x0 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1188 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0x119C DUP2 DUP4 PUSH2 0x2874 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x1172 JUMP JUMPDEST POP PUSH2 0x11AE PUSH2 0x299F JUMP JUMPDEST PUSH2 0x11B6 PUSH2 0x2A50 JUMP JUMPDEST PUSH2 0x11C1 PUSH1 0x0 NOT PUSH2 0x2AE5 JUMP JUMPDEST PUSH1 0x97 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x9A DUP5 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP6 SWAP1 MSTORE DUP1 MLOAD PUSH32 0x25FF68DD81B34665B5BA7E553EE5511BF6812E12ADB4A7E2C0D9E26B3099CE79 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 POP DUP1 ISZERO PUSH2 0xE21 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x1242 DUP2 PUSH2 0x2B20 JUMP JUMPDEST PUSH2 0x1281 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1306 DUP5 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x12E7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x12FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 PUSH2 0x2BDC JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP4 AND DUP3 MSTORE SWAP3 SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x138E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x13A2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x13B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ PUSH2 0x1412 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F6F6E6C792D72657365727665 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9B DUP1 SLOAD PUSH1 0x0 SWAP2 DUP3 SWAP1 SSTORE SWAP1 PUSH2 0x1426 DUP3 PUSH2 0x2BF2 JUMP JUMPDEST SWAP1 POP PUSH2 0x1445 DUP6 DUP3 PUSH2 0x1435 PUSH2 0x2DD7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x2E4D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP2 PUSH32 0x1C71C8E11FD443227C8F8D3DC1A237A3A5E8310B540C7FBCF5169754AEDF42C9 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x9D SLOAD SWAP1 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14AC DUP3 PUSH2 0x2759 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x14C8 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1511 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x447C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x151B DUP2 PUSH2 0x2B20 JUMP JUMPDEST PUSH2 0x155A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 PUSH2 0x1564 JUMPI PUSH2 0xE21 JUMP JUMPDEST PUSH1 0x9D SLOAD DUP4 GT ISZERO PUSH2 0x15BB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F61776172642D657863656564732D617661696C000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x15C8 SWAP1 DUP5 PUSH2 0x2E9F JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH2 0x15D8 DUP5 DUP5 DUP5 PUSH1 0x0 PUSH2 0x2F01 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15E4 DUP4 DUP6 PUSH2 0x2FE7 JUMP JUMPDEST SWAP1 POP PUSH2 0x166A DUP6 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1638 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x164C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1662 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP5 PUSH2 0x2BDC JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xE2554529D99AB7A67DB6B4CEA2B32C7D55AE325F958861E05F304FDDED867E31 DUP7 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x16C4 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16D5 PUSH2 0x1A5F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x171E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x438F DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14AC DUP3 PUSH2 0x2B20 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1786 DUP5 DUP5 DUP5 PUSH2 0x301F JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1796 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x17A7 PUSH2 0x1A5F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x17F0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x438F DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1041 DUP2 PUSH2 0x2AE5 JUMP JUMPDEST CALLER PUSH2 0x1803 DUP2 PUSH2 0x2B20 JUMP JUMPDEST PUSH2 0x1842 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO PUSH2 0x191C JUMPI PUSH1 0x0 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP7 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x18B4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x18CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x18DC DUP7 CALLER DUP5 DUP5 PUSH2 0x3070 JUMP JUMPDEST SWAP1 POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x190E JUMPI PUSH2 0x190B CALLER PUSH2 0x1905 DUP5 DUP8 PUSH2 0x2E9F JUMP JUMPDEST DUP4 PUSH2 0x30FF JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x1919 DUP7 CALLER DUP4 PUSH2 0x3145 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1946 JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x199D JUMPI PUSH2 0x199D DUP4 CALLER CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x19BF JUMPI POP PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xE21 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP7 SWAP1 MSTORE CALLER PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xB2210957 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1A27 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1A3B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1A53 DUP6 DUP6 DUP6 PUSH2 0x32E3 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x97 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1A85 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A96 PUSH2 0x1A5F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1ADF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x438F DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1041 DUP2 PUSH2 0x3481 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1B4F JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1B31 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1BB0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1BC4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1BDA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1BF6 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x14AF JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x10DFA58 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C45 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C59 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1C6F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x1C83 JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x14AF JUMP JUMPDEST PUSH2 0x1786 DUP5 DUP3 PUSH2 0x3594 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x1CE7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP3 PUSH2 0x1CF6 DUP2 PUSH2 0x2B20 JUMP JUMPDEST PUSH2 0x1D35 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1D43 DUP9 DUP8 DUP10 PUSH2 0x32E3 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0x1D86 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x43AF PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1D91 DUP9 DUP8 DUP4 PUSH2 0x35B5 JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x631B5DFB PUSH2 0x1DA8 PUSH2 0x26CD JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E14 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 PUSH2 0x1E2D DUP4 DUP10 PUSH2 0x2E9F SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1E3A DUP3 PUSH2 0x2BF2 JUMP JUMPDEST SWAP1 POP PUSH2 0x1E49 DUP11 DUP3 PUSH2 0x1435 PUSH2 0x2DD7 JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E65 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP14 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE DUP1 DUP3 ADD DUP10 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x271704A58FD2953E49B87D67A0A3CE28A58147DE98A5457F60B4686F6385030 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH2 0x1ECE DUP2 PUSH2 0x2B20 JUMP JUMPDEST PUSH2 0x1F0D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1F15 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1F26 PUSH2 0x1A5F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1F6F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x438F DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP6 AND DUP1 DUP4 MSTORE DUP7 DUP3 AND PUSH1 0x20 DUP1 DUP6 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9E DUP5 MSTORE DUP9 SWAP1 KECCAK256 SWAP7 MLOAD DUP8 SLOAD SWAP3 MLOAD DUP8 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP1 DUP8 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP6 AND OR SWAP1 SWAP5 SSTORE DUP5 MLOAD SWAP3 DUP4 MSTORE SWAP3 DUP3 ADD MSTORE DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 MLOAD PUSH32 0xFB0BA2CF86A2B03BCF387753A2192DA80A006AFA99DD022BB301C78E323BF1B9 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xAA6 PUSH2 0x3676 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x203D JUMPI POP PUSH2 0x203D PUSH2 0x2863 JUMP JUMPDEST DUP1 PUSH2 0x204B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2086 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4340 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x20B1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x20BC DUP6 DUP6 DUP6 PUSH2 0x1044 JUMP JUMPDEST PUSH1 0xA0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 AND SWAP1 PUSH32 0xA5670B49A0EE863080AE28858BB5D9BCC1EB0D2A6F4C9C3A8ACCC43B8F445D25 SWAP1 PUSH1 0x0 SWAP1 LOG2 DUP1 ISZERO PUSH2 0x211B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0xA1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP3 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14AC DUP3 PUSH2 0x2BF2 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x21BB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP2 PUSH2 0x21CA DUP2 PUSH2 0x2B20 JUMP JUMPDEST PUSH2 0x2209 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP4 PUSH2 0x2213 DUP2 PUSH2 0x36D6 JUMP JUMPDEST PUSH2 0x2264 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F657863656564732D6C69717569646974792D63617000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x226E PUSH2 0x26CD JUMP JUMPDEST SWAP1 POP PUSH2 0x227C DUP8 DUP8 DUP8 DUP8 PUSH2 0x2F01 JUMP JUMPDEST PUSH2 0x229B DUP2 ADDRESS DUP9 PUSH2 0x228A PUSH2 0x2DD7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 SWAP1 PUSH2 0x36FA JUMP JUMPDEST PUSH2 0x22A4 DUP7 PUSH2 0x276E JUMP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6CE569498E0F86F147466AC49211CB2A1FFE06195ADB805E383B3F2365109160 DUP10 DUP9 PUSH1 0x40 MLOAD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x2372 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE PUSH1 0x0 PUSH2 0x2381 PUSH2 0x25C2 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x238D PUSH2 0x3676 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 DUP3 GT PUSH2 0x239F JUMPI PUSH1 0x0 PUSH2 0x23A9 JUMP JUMPDEST PUSH2 0x23A9 DUP3 DUP5 PUSH2 0x2E9F JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x9D SLOAD DUP3 GT PUSH2 0x23BD JUMPI PUSH1 0x0 PUSH2 0x23CB JUMP JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x23CB SWAP1 DUP4 SWAP1 PUSH2 0x2E9F JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x247D JUMPI PUSH1 0x0 PUSH2 0x23DE DUP3 PUSH2 0x1B5F JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x2438 JUMPI PUSH1 0x9B SLOAD PUSH2 0x23F3 SWAP1 DUP3 PUSH2 0x3754 JUMP JUMPDEST PUSH1 0x9B SSTORE PUSH2 0x2400 DUP3 DUP3 PUSH2 0x2E9F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 POP PUSH32 0x5F1703CCFA2730D4245350F228079926A37F26A44ECF6978A7EEAFFF0AF11407 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x2445 SWAP1 DUP4 PUSH2 0x3754 JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xCE2B6E507C7CA1A20CE136810F524EEFC19BA4C7E4866EB6CC0CBA76E778D4BE SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH1 0x9D SLOAD SWAP5 POP POP POP POP POP PUSH1 0x1 PUSH1 0x65 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x9B SLOAD DUP2 JUMP JUMPDEST PUSH2 0x249C PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x24AD PUSH2 0x1A5F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x24F6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x438F DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x253B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42AB PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xAA6 PUSH2 0x2DD7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x9B SLOAD SWAP1 POP PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2622 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2604 JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x26C4 JUMPI PUSH2 0x26BA DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2647 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2687 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x269B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x26B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP6 SWAP1 PUSH2 0x3754 JUMP JUMPDEST SWAP4 POP PUSH1 0x1 ADD PUSH2 0x2630 JUMP JUMPDEST POP SWAP2 SWAP3 POP POP POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x26DC DUP4 PUSH2 0x2759 JUMP JUMPDEST PUSH2 0x272D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x273A JUMPI POP PUSH1 0x0 PUSH2 0x2752 JUMP JUMPDEST PUSH2 0x274E PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP6 DUP5 PUSH2 0x2E4D JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND SWAP2 AND EQ ISZERO SWAP1 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH2 0x2797 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH2 0x2787 PUSH2 0x2DD7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x37AE JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x140E25AD PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0xA0712D68 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x27E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x27F9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x280F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO PUSH2 0x1041 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6D706F756E645072697A65506F6F6C2F6D696E742D6661696C6564000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x286E ADDRESS PUSH2 0x38C1 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF77C4791 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x28B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x28CB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x28E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x293E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F746F6B656E2D6374726C722D6D69736D617463680000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x98 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x294C JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 DUP5 AND SWAP2 PUSH32 0x460E712B4A5D801D031ED673DEA209B73AB854F7DDEB86B6C48082E92C3EEE66 SWAP2 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x29B8 JUMPI POP PUSH2 0x29B8 PUSH2 0x2863 JUMP JUMPDEST DUP1 PUSH2 0x29C6 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2A01 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4340 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2A2C JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2A34 PUSH2 0x38C7 JUMP JUMPDEST PUSH2 0x2A3C PUSH2 0x3967 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2A69 JUMPI POP PUSH2 0x2A69 PUSH2 0x2863 JUMP JUMPDEST DUP1 PUSH2 0x2A77 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2AB2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4340 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2ADD JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2A3C PUSH2 0x3A60 JUMP JUMPDEST PUSH1 0x9C DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3FF20538222F568F27FF436C0C49DFD3E48D5B8F86533A3F759DC1C7089775AB SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2B7A JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2B5C JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2BD1 JUMPI DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2BA6 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x2BC9 JUMPI PUSH1 0x1 SWAP4 POP POP POP POP PUSH2 0x14AF JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2B88 JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xE21 DUP5 DUP5 PUSH2 0x2BED DUP8 DUP8 DUP8 DUP8 PUSH2 0x3070 JUMP JUMPDEST PUSH2 0x3145 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2BFD PUSH2 0x2DD7 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2C4E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2C62 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2C78 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x852A12E3 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP9 SWAP1 MSTORE SWAP1 MLOAD SWAP3 SWAP4 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0x852A12E3 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2CCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2CDF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2CF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO PUSH2 0x2D49 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6D706F756E645072697A65506F6F6C2F72656465656D2D6661696C656400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2DCE DUP3 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2D9C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2DB0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2DC6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 PUSH2 0x2E9F JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x6F307DC3 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x6F307DC3 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2E1C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2E30 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2E46 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xB64 SWAP1 DUP5 SWAP1 PUSH2 0x3B06 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2EF6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2F90 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE DUP6 DUP2 AND PUSH1 0x44 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x4D7F3DB0 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2F77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2F8B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5D7B0758 DUP6 DUP6 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1A27 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x2752 SWAP1 DUP4 SWAP1 PUSH2 0x301A SWAP1 DUP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3594 JUMP JUMPDEST PUSH2 0x3BB7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x3055 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3594 JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x3066 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x2752 JUMP JUMPDEST PUSH2 0x2DCE DUP4 DUP3 PUSH2 0x3BDC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP3 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x30B3 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x30F5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x30C0 DUP9 DUP9 DUP9 PUSH2 0x3C43 JUMP JUMPDEST DUP3 SLOAD SWAP1 SWAP2 POP PUSH2 0x30F1 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x30EC SWAP1 DUP10 SWAP1 PUSH2 0x30E6 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP8 PUSH2 0x3754 JUMP JUMPDEST SWAP1 PUSH2 0x3754 JUMP JUMPDEST PUSH2 0x30FF JUMP JUMPDEST SWAP3 POP POP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x312E SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3594 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x313C JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE DUP2 SWAP1 KECCAK256 SLOAD DUP2 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 DUP1 PUSH2 0x318A DUP5 PUSH2 0x3CF4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x31A8 PUSH2 0x31A3 PUSH2 0x3D3C JUMP JUMPDEST PUSH2 0x3D42 JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP3 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 DUP11 AND DUP3 MSTORE SWAP2 DUP5 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP5 DUP7 ADD MLOAD SWAP6 SWAP1 SWAP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH4 0xFFFFFFFF PUSH1 0xC0 SHL NOT AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP5 SWAP1 SWAP3 AND SWAP4 SWAP1 SWAP4 MUL OR PUSH1 0xFF PUSH1 0xE0 SHL NOT AND PUSH1 0x1 PUSH1 0xE0 SHL SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE DUP2 DUP2 LT ISZERO PUSH2 0x328B JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0x2F92D56910619B38BC29FD8E4CA5E56359EDAC7A0C086CDCD305FB603FA37491 PUSH2 0x3275 DUP6 DUP6 PUSH2 0x2E9F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 PUSH2 0xE21 JUMP JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0xE21 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF PUSH2 0x32CC DUP5 DUP7 PUSH2 0x2E9F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3335 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3349 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x335F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x33B1 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F696E737566662D66756E6473 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x33BE DUP7 DUP7 DUP4 PUSH1 0x0 PUSH2 0x2BDC JUMP JUMPDEST PUSH1 0x0 PUSH2 0x33D3 DUP7 PUSH2 0x33CE DUP5 DUP9 PUSH2 0x2E9F JUMP JUMPDEST PUSH2 0x2FE7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP3 GT PUSH2 0x344A JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x3447 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2E9F JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x3456 DUP9 DUP9 PUSH2 0x2FE7 JUMP JUMPDEST SWAP1 POP DUP1 DUP3 GT PUSH2 0x3465 JUMPI DUP2 PUSH2 0x3467 JUMP JUMPDEST DUP1 JUMPDEST SWAP5 POP PUSH2 0x3473 DUP2 DUP7 PUSH2 0x2E9F JUMP JUMPDEST SWAP6 POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x34DC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D6E6F742D7A65726F PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x34F9 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3D86 JUMP JUMPDEST PUSH2 0x354A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D696E76616C696400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x99 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x7F58DC86BC2E435CB77CA0EDB1DF55E25F90CAF2D6BD866971715437D456A212 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x35A1 DUP4 DUP6 PUSH2 0x3DA2 JUMP JUMPDEST SWAP1 POP PUSH2 0x1786 DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x3DFB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x35F7 SWAP1 PUSH2 0x35F2 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2E9F JUMP JUMPDEST PUSH2 0x3CF4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x3AF9E669 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x3AF9E669 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x36C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2E30 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x36E1 PUSH2 0x25C2 JUMP JUMPDEST PUSH1 0x9C SLOAD SWAP1 SWAP2 POP PUSH2 0x36F1 DUP3 DUP6 PUSH2 0x3754 JUMP JUMPDEST GT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x24 DUP4 ADD MSTORE DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x84 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xE21 SWAP1 DUP6 SWAP1 PUSH2 0x3B06 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x2752 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 ISZERO DUP1 PUSH2 0x3834 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH4 0x6EB1769F PUSH1 0xE1 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 DUP6 AND SWAP2 PUSH4 0xDD62ED3E SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3806 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x381A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3830 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO JUMPDEST PUSH2 0x386F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x36 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4446 PUSH1 0x36 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x95EA7B3 PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xB64 SWAP1 DUP5 SWAP1 PUSH2 0x3B06 JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x38E0 JUMPI POP PUSH2 0x38E0 PUSH2 0x2863 JUMP JUMPDEST DUP1 PUSH2 0x38EE JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3929 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4340 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2A3C JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3980 JUMPI POP PUSH2 0x3980 PUSH2 0x2863 JUMP JUMPDEST DUP1 PUSH2 0x398E JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x39C9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4340 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x39F4 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x39FE PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3A79 JUMPI POP PUSH2 0x3A79 PUSH2 0x2863 JUMP JUMPDEST DUP1 PUSH2 0x3A87 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3AC2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4340 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3AED JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x65 SSTORE DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x3B5B DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3E3D SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xB64 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3B7A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xB64 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x441C PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3BC6 DUP5 PUSH1 0x9A SLOAD PUSH2 0x3594 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x3BD4 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x3C32 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x3C3B JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xC0 SHL DUP2 DIV PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x3C91 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x2752 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3CA5 DUP3 PUSH2 0x3C9F PUSH2 0x3D3C JUMP JUMPDEST SWAP1 PUSH2 0x2E9F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x3CDD SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3DA2 JUMP JUMPDEST SWAP1 POP PUSH2 0x3CE9 DUP6 DUP3 PUSH2 0x3594 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x3D38 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42D1 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0xA1 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x20 SHL DUP3 LT PUSH2 0x3D38 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x43F6 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3D91 DUP4 PUSH2 0x3E4C JUMP JUMPDEST DUP1 ISZERO PUSH2 0x2752 JUMPI POP PUSH2 0x2752 DUP4 DUP4 PUSH2 0x3E7F JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3DB1 JUMPI POP PUSH1 0x0 PUSH2 0x2EFB JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x3DBE JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x2752 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x436E PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2752 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x3EA2 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1786 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x3F44 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3E5F DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3E7F JUMP JUMPDEST DUP1 ISZERO PUSH2 0x14AC JUMPI POP PUSH2 0x3E78 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3E7F JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x3E8E DUP6 DUP6 PUSH2 0x4095 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x2DCE JUMPI POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x3F2E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3EF3 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3EDB JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3F20 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x3F3A JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x3F85 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x431A PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3F8E DUP6 PUSH2 0x38C1 JUMP JUMPDEST PUSH2 0x3FDF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x401E JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3FFF JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x4080 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4085 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x3CE9 DUP3 DUP3 DUP7 PUSH2 0x41C9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x24 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP3 DUP5 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND SWAP3 PUSH2 0x7530 SWAP3 DUP8 SWAP3 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x411D JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x40FE JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x417E JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4183 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x41A1 JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x41C2 JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x41B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x41D8 JUMPI POP DUP2 PUSH2 0x2752 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x41E8 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x3EF3 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3EDB JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x4284 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x4284 JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x424F JUMP JUMPDEST POP PUSH2 0x3D38 SWAP3 SWAP2 POP JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x3D38 JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x428C JUMP INVALID 0x4F PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F206164647265737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E2031323820626974735072697A65 POP PUSH16 0x6F6C2F72657365727665526567697374 PUSH19 0x792D6E6F742D7A65726F416464726573733A20 PUSH10 0x6E73756666696369656E PUSH21 0x2062616C616E636520666F722063616C6C496E6974 PUSH10 0x616C697A61626C653A20 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 MSTORE8 PUSH2 0x6665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F774F776E61626C653A20 PUSH4 0x616C6C65 PUSH19 0x206973206E6F7420746865206F776E65725072 PUSH10 0x7A65506F6F6C2F657869 PUSH21 0x2D6665652D657863656564732D757365722D6D6178 PUSH10 0x6D756D5072697A65506F PUSH16 0x6C2F756E6B6E6F776E2D746F6B656E00 STOP STOP STOP STOP STOP STOP STOP STOP MSTORE8 PUSH2 0x6665 NUMBER PUSH2 0x7374 GASPRICE KECCAK256 PUSH23 0x616C756520646F65736E27742066697420696E20333220 PUSH3 0x697473 MSTORE8 PUSH2 0x6665 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x7563636565645361666545524332303A20617070 PUSH19 0x6F76652066726F6D206E6F6E2D7A65726F2074 PUSH16 0x206E6F6E2D7A65726F20616C6C6F7761 PUSH15 0x63655072697A65506F6F6C2F6F6E6C PUSH26 0x2D7072697A65537472617465677900000000A264697066735822 SLT KECCAK256 CALLVALUE 0xAA 0xE2 0xB6 0xAD 0xD5 0xA6 CREATE SWAP10 0xBF 0xD2 PUSH8 0x7F324945E51B2CB ADDMOD CALLVALUE 0x4B RETURNDATASIZE GAS 0xAD PUSH30 0xC87C6B254C64736F6C634300060C00330000000000000000000000000000 ",
              "sourceMap": "128:470:63:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506004361061025e5760003560e01c8063888c2b6f11610146578063b69ef8a8116100c3578063e323f82511610087578063e323f825146109a5578063e6d8a94b146109e1578063edb4e1cf146109e9578063f2fde38b146109f1578063fc0c546a14610a17578063ffa1ad7414610a1f5761025e565b8063b69ef8a814610864578063c58714851461086c578063d18e81b31461092b578063d4a1361d14610933578063db006a75146109885761025e565b80639d63848a1161010a5780639d63848a146107705780639e167519146107c85780639fe32a91146107d0578063a016240b146107ed578063a7b2cc31146108275761025e565b8063888c2b6f146106e35780638da5cb5b146107325780638e71c1f61461073a57806391ca480e1461074257806398bf3eb6146107685761025e565b806352a387ab116101df578063715018a6116101a3578063715018a61461062857806376687d3d1461063057806378b3d3271461063857806379cb85631461065e5780637b99adb1146106905780637cbab1c7146106ad5761025e565b806352a387ab14610566578063630665b41461058c57806369e527da146105945780636a3fd4f9146105b85780636b1b863a146105f25761025e565b80632b0ab144116102265780632b0ab144146104045780632f7627e31461043a57806335403023146104685780633ede50c614610485578063494de9f7146105385761025e565b80630937eb541461026357806313f55e391461027d578063150b7a02146102b557806316960d551461036057806322f8e566146103e7575b600080fd5b61026b610a9c565b60408051918252519081900360200190f35b6102b36004803603606081101561029357600080fd5b506001600160a01b03813581169160208101359091169060400135610aab565b005b610343600480360360808110156102cb57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561030557600080fd5b82018360208201111561031757600080fd5b803590602001918460018302840111600160201b8311171561033857600080fd5b509092509050610b69565b604080516001600160e01b03199092168252519081900360200190f35b6102b36004803603606081101561037657600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b8111156103a957600080fd5b8201836020820111156103bb57600080fd5b803590602001918460208302840111600160201b831117156103dc57600080fd5b509092509050610b7a565b6102b3600480360360208110156103fd57600080fd5b5035610e27565b6102b36004803603606081101561041a57600080fd5b506001600160a01b03813581169160208101359091169060400135610e2c565b6102b36004803603604081101561045057600080fd5b506001600160a01b0381358116916020013516610ee9565b6102b36004803603602081101561047e57600080fd5b5035611038565b6102b36004803603606081101561049b57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156104c557600080fd5b8201836020820111156104d757600080fd5b803590602001918460208302840111600160201b831117156104f857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611044915050565b61026b6004803603604081101561054e57600080fd5b506001600160a01b0381358116916020013516611236565b61026b6004803603602081101561057c57600080fd5b50356001600160a01b031661133d565b61026b61148c565b61059c611492565b604080516001600160a01b039092168252519081900360200190f35b6105de600480360360208110156105ce57600080fd5b50356001600160a01b03166114a1565b604080519115158252519081900360200190f35b6102b36004803603606081101561060857600080fd5b506001600160a01b038135811691602081013591604090910135166114b4565b6102b36116bc565b61026b611768565b6105de6004803603602081101561064e57600080fd5b50356001600160a01b031661176e565b61026b6004803603606081101561067457600080fd5b506001600160a01b038135169060208101359060400135611779565b6102b3600480360360208110156106a657600080fd5b503561178e565b6102b3600480360360608110156106c357600080fd5b506001600160a01b038135811691602081013590911690604001356117f9565b610719600480360360608110156106f957600080fd5b506001600160a01b03813581169160208101359091169060400135611a45565b6040805192835260208301919091528051918290030190f35b61059c611a5f565b61059c611a6e565b6102b36004803603602081101561075857600080fd5b50356001600160a01b0316611a7d565b61059c611ae8565b610778611af7565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156107b457818101518382015260200161079c565b505050509050019250505060405180910390f35b61026b611b59565b61026b600480360360208110156107e657600080fd5b5035611b5f565b61026b6004803603608081101561080357600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611c8d565b6102b36004803603606081101561083d57600080fd5b506001600160a01b03813516906001600160801b0360208201358116916040013516611ec4565b61026b61201a565b6102b36004803603608081101561088257600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156108ac57600080fd5b8201836020820111156108be57600080fd5b803590602001918460208302840111600160201b831117156108df57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602001356001600160a01b0316612024565b61026b612122565b6109596004803603602081101561094957600080fd5b50356001600160a01b0316612128565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b61026b6004803603602081101561099e57600080fd5b5035612158565b6102b3600480360360808110156109bb57600080fd5b506001600160a01b03813581169160208101359160408201358116916060013516612163565b61026b612318565b61026b61248e565b6102b360048036036020811015610a0757600080fd5b50356001600160a01b0316612494565b61059c612597565b610a276125a1565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610a61578181015183820152602001610a49565b50505050905090810190601f168015610a8e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610aa66125c2565b905090565b6099546001600160a01b0316610abf6126cd565b6001600160a01b031614610b08576040805162461bcd60e51b815260206004820152601c602482015260008051602061447c833981519152604482015290519081900360640190fd5b610b138383836126d1565b15610b6457816001600160a01b0316836001600160a01b03167fb0bac59718cd343c80a813518afcf36846cfcfe6d56e2b3cab9bd49f5f9b251c836040518082815260200191505060405180910390a35b505050565b630a85bd0160e11b95945050505050565b6099546001600160a01b0316610b8e6126cd565b6001600160a01b031614610bd7576040805162461bcd60e51b815260206004820152601c602482015260008051602061447c833981519152604482015290519081900360640190fd5b610be083612759565b610c31576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b80610c3b57610e21565b60005b81811015610da857836001600160a01b03166342842e0e3087868686818110610c6357fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610cc057600080fd5b505af1925050508015610cd1575060015b610da0573d808015610cff576040519150601f19603f3d011682016040523d82523d6000602084013e610d04565b606091505b507f17e975018310f88872b58d4d8263adca83cf5c1893496ea2a86923dab15276ad816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d64578181015183820152602001610d4c565b50505050905090810190601f168015610d915780820380516001836020036101000a031916815260200191505b509250505060405180910390a1505b600101610c3e565b50826001600160a01b0316846001600160a01b03167f69c2de32bc4d47f488e72626a6cfdee85089342e52675e7de79c4b417623960c848460405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a35b50505050565b60a155565b6099546001600160a01b0316610e406126cd565b6001600160a01b031614610e89576040805162461bcd60e51b815260206004820152601c602482015260008051602061447c833981519152604482015290519081900360640190fd5b610e948383836126d1565b15610b6457816001600160a01b0316836001600160a01b03167fc65f48aca3b7a99b7443d04b8ffbb073156179bc628dc3f7def5047748973469836040518082815260200191505060405180910390a3505050565b610ef16126cd565b6001600160a01b0316610f02611a5f565b6001600160a01b031614610f4b576040805162461bcd60e51b8152602060048201819052602482015260008051602061438f833981519152604482015290519081900360640190fd5b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f9a57600080fd5b505afa158015610fae573d6000803e3d6000fd5b505050506040513d6020811015610fc457600080fd5b5051111561103457816001600160a01b0316635c19a95c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561101b57600080fd5b505af115801561102f573d6000803e3d6000fd5b505050505b5050565b6110418161276e565b50565b600054610100900460ff168061105d575061105d612863565b8061106b575060005460ff16155b6110a65760405162461bcd60e51b815260040180806020018281038252602e815260200180614340602e913960400191505060405180910390fd5b600054610100900460ff161580156110d1576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0384166111165760405162461bcd60e51b81526004018080602001828103825260228152602001806142f86022913960400191505060405180910390fd5b82518067ffffffffffffffff8111801561112f57600080fd5b50604051908082528060200260200182016040528015611159578160200160208202803683370190505b50805161116e9160989160209091019061422f565b5060005b818110156111a557600085828151811061118857fe5b6020026020010151905061119c8183612874565b50600101611172565b506111ae61299f565b6111b6612a50565b6111c1600019612ae5565b609780546001600160a01b0319166001600160a01b038716908117909155609a849055604080519182526020820185905280517f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce799281900390910190a1508015610e21576000805461ff001916905550505050565b60008161124281612b20565b611281576040805162461bcd60e51b815260206004820152601760248201526000805160206143d6833981519152604482015290519081900360640190fd5b6113068484856001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112d357600080fd5b505afa1580156112e7573d6000803e3d6000fd5b505050506040513d60208110156112fd57600080fd5b50516000612bdc565b50506001600160a01b039081166000908152609f60209081526040808320949093168252929092529020546001600160c01b031690565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561138e57600080fd5b505afa1580156113a2573d6000803e3d6000fd5b505050506040513d60208110156113b857600080fd5b505190506001600160a01b0381163314611412576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f6f6e6c792d7265736572766560501b604482015290519081900360640190fd5b609b80546000918290559061142682612bf2565b90506114458582611435612dd7565b6001600160a01b03169190612e4d565b6040805183815290516001600160a01b038716917f1c71c8e11fd443227c8f8d3dc1a237a3a5e8310b540c7fbcf5169754aedf42c9919081900360200190a2949350505050565b609d5490565b60a0546001600160a01b031681565b60006114ac82612759565b90505b919050565b6099546001600160a01b03166114c86126cd565b6001600160a01b031614611511576040805162461bcd60e51b815260206004820152601c602482015260008051602061447c833981519152604482015290519081900360640190fd5b8061151b81612b20565b61155a576040805162461bcd60e51b815260206004820152601760248201526000805160206143d6833981519152604482015290519081900360640190fd5b8261156457610e21565b609d548311156115bb576040805162461bcd60e51b815260206004820152601d60248201527f5072697a65506f6f6c2f61776172642d657863656564732d617661696c000000604482015290519081900360640190fd5b609d546115c89084612e9f565b609d556115d88484846000612f01565b60006115e48385612fe7565b905061166a8584856001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561163857600080fd5b505afa15801561164c573d6000803e3d6000fd5b505050506040513d602081101561166257600080fd5b505184612bdc565b826001600160a01b0316856001600160a01b03167fe2554529d99ab7a67db6b4cea2b32c7d55ae325f958861e05f304fdded867e31866040518082815260200191505060405180910390a35050505050565b6116c46126cd565b6001600160a01b03166116d5611a5f565b6001600160a01b03161461171e576040805162461bcd60e51b8152602060048201819052602482015260008051602061438f833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b609c5481565b60006114ac82612b20565b600061178684848461301f565b949350505050565b6117966126cd565b6001600160a01b03166117a7611a5f565b6001600160a01b0316146117f0576040805162461bcd60e51b8152602060048201819052602482015260008051602061438f833981519152604482015290519081900360640190fd5b61104181612ae5565b3361180381612b20565b611842576040805162461bcd60e51b815260206004820152601760248201526000805160206143d6833981519152604482015290519081900360640190fd5b6001600160a01b0384161561191c576000336001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156118a057600080fd5b505afa1580156118b4573d6000803e3d6000fd5b505050506040513d60208110156118ca57600080fd5b5051905060006118dc86338484613070565b9050846001600160a01b0316866001600160a01b03161461190e5761190b336119058487612e9f565b836130ff565b90505b611919863383613145565b50505b6001600160a01b038316158015906119465750836001600160a01b0316836001600160a01b031614155b1561199d5761199d8333336001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112d357600080fd5b6001600160a01b038416158015906119bf57506099546001600160a01b031615155b15610e21576099546040805163b221095760e01b81526001600160a01b0387811660048301528681166024830152604482018690523360648301529151919092169163b221095791608480830192600092919082900301818387803b158015611a2757600080fd5b505af1158015611a3b573d6000803e3d6000fd5b5050505050505050565b600080611a538585856132e3565b90969095509350505050565b6033546001600160a01b031690565b6097546001600160a01b031681565b611a856126cd565b6001600160a01b0316611a96611a5f565b6001600160a01b031614611adf576040805162461bcd60e51b8152602060048201819052602482015260008051602061438f833981519152604482015290519081900360640190fd5b61104181613481565b6099546001600160a01b031681565b60606098805480602002602001604051908101604052809291908181526020018280548015611b4f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b31575b5050505050905090565b609a5481565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611bb057600080fd5b505afa158015611bc4573d6000803e3d6000fd5b505050506040513d6020811015611bda57600080fd5b505190506001600160a01b038116611bf65760009150506114af565b6000816001600160a01b031663010dfa58306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611c4557600080fd5b505afa158015611c59573d6000803e3d6000fd5b505050506040513d6020811015611c6f57600080fd5b5051905080611c83576000925050506114af565b6117868482613594565b600060026065541415611ce7576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655582611cf681612b20565b611d35576040805162461bcd60e51b815260206004820152601760248201526000805160206143d6833981519152604482015290519081900360640190fd5b600080611d438887896132e3565b9150915084821115611d865760405162461bcd60e51b81526004018080602001828103825260278152602001806143af6027913960400191505060405180910390fd5b611d918887836135b5565b856001600160a01b031663631b5dfb611da86126cd565b8a8a6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611e0057600080fd5b505af1158015611e14573d6000803e3d6000fd5b505050506000611e2d8389612e9f90919063ffffffff16565b90506000611e3a82612bf2565b9050611e498a82611435612dd7565b876001600160a01b03168a6001600160a01b0316611e656126cd565b604080518d81526020810186905280820189905290516001600160a01b0392909216917f0271704a58fd2953e49b87d67a0a3ce28a58147de98a5457f60b4686f63850309181900360600190a450506001606555509695505050505050565b82611ece81612b20565b611f0d576040805162461bcd60e51b815260206004820152601760248201526000805160206143d6833981519152604482015290519081900360640190fd5b611f156126cd565b6001600160a01b0316611f26611a5f565b6001600160a01b031614611f6f576040805162461bcd60e51b8152602060048201819052602482015260008051602061438f833981519152604482015290519081900360640190fd5b6040805180820182526001600160801b0380851680835286821660208085018281526001600160a01b038b166000818152609e84528890209651875492518716600160801b029087166fffffffffffffffffffffffffffffffff1990931692909217909516179094558451928352928201528083019190915290517ffb0ba2cf86a2b03bcf387753a2192da80a006afa99dd022bb301c78e323bf1b99181900360600190a150505050565b6000610aa6613676565b600054610100900460ff168061203d575061203d612863565b8061204b575060005460ff16155b6120865760405162461bcd60e51b815260040180806020018281038252602e815260200180614340602e913960400191505060405180910390fd5b600054610100900460ff161580156120b1576000805460ff1961ff0019909116610100171660011790555b6120bc858585611044565b60a080546001600160a01b0319166001600160a01b0384811691909117918290556040519116907fa5670b49a0ee863080ae28858bb5d9bcc1eb0d2a6f4c9c3a8accc43b8f445d2590600090a2801561211b576000805461ff00191690555b5050505050565b60a15481565b6001600160a01b03166000908152609e60205260409020546001600160801b0380821692600160801b9092041690565b60006114ac82612bf2565b600260655414156121bb576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002606555816121ca81612b20565b612209576040805162461bcd60e51b815260206004820152601760248201526000805160206143d6833981519152604482015290519081900360640190fd5b83612213816136d6565b612264576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f657863656564732d6c69717569646974792d63617000604482015290519081900360640190fd5b600061226e6126cd565b905061227c87878787612f01565b61229b81308861228a612dd7565b6001600160a01b03169291906136fa565b6122a48661276e565b846001600160a01b0316876001600160a01b0316826001600160a01b03167f6ce569498e0f86f147466ac49211cb2a1ffe06195adb805e383b3f2365109160898860405180838152602001826001600160a01b031681526020019250505060405180910390a4505060016065555050505050565b600060026065541415612372576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655560006123816125c2565b9050600061238d613676565b9050600082821161239f5760006123a9565b6123a98284612e9f565b90506000609d5482116123bd5760006123cb565b609d546123cb908390612e9f565b9050801561247d5760006123de82611b5f565b9050801561243857609b546123f39082613754565b609b556124008282612e9f565b6040805183815290519193507f5f1703ccfa2730d4245350f228079926a37f26a44ecf6978a7eeafff0af11407919081900360200190a15b609d546124459083613754565b609d556040805183815290517fce2b6e507c7ca1a20ce136810f524eefc19ba4c7e4866eb6cc0cba76e778d4be9181900360200190a1505b609d54945050505050600160655590565b609b5481565b61249c6126cd565b6001600160a01b03166124ad611a5f565b6001600160a01b0316146124f6576040805162461bcd60e51b8152602060048201819052602482015260008051602061438f833981519152604482015290519081900360640190fd5b6001600160a01b03811661253b5760405162461bcd60e51b81526004018080602001828103825260268152602001806142ab6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610aa6612dd7565b60405180604001604052806005815260200164332e342e3560d81b81525081565b600080609b5490506060609880548060200260200160405190810160405280929190818152602001828054801561262257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612604575b505083519394506000925050505b818110156126c4576126ba83828151811061264757fe5b60200260200101516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561268757600080fd5b505afa15801561269b573d6000803e3d6000fd5b505050506040513d60208110156126b157600080fd5b50518590613754565b9350600101612630565b50919250505090565b3390565b60006126dc83612759565b61272d576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b8161273a57506000612752565b61274e6001600160a01b0384168584612e4d565b5060015b9392505050565b60a0546001600160a01b039081169116141590565b60a054612797906001600160a01b031682612787612dd7565b6001600160a01b031691906137ae565b60a0546040805163140e25ad60e31b81526004810184905290516001600160a01b039092169163a0712d68916024808201926020929091908290030181600087803b1580156127e557600080fd5b505af11580156127f9573d6000803e3d6000fd5b505050506040513d602081101561280f57600080fd5b505115611041576040805162461bcd60e51b815260206004820152601d60248201527f436f6d706f756e645072697a65506f6f6c2f6d696e742d6661696c6564000000604482015290519081900360640190fd5b600061286e306138c1565b15905090565b306001600160a01b0316826001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b1580156128b757600080fd5b505afa1580156128cb573d6000803e3d6000fd5b505050506040513d60208110156128e157600080fd5b50516001600160a01b03161461293e576040805162461bcd60e51b815260206004820152601e60248201527f5072697a65506f6f6c2f746f6b656e2d6374726c722d6d69736d617463680000604482015290519081900360640190fd5b816098828154811061294c57fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051918416917f460e712b4a5d801d031ed673dea209b73ab854f7ddeb86b6c48082e92c3eee669190a25050565b600054610100900460ff16806129b857506129b8612863565b806129c6575060005460ff16155b612a015760405162461bcd60e51b815260040180806020018281038252602e815260200180614340602e913960400191505060405180910390fd5b600054610100900460ff16158015612a2c576000805460ff1961ff0019909116610100171660011790555b612a346138c7565b612a3c613967565b8015611041576000805461ff001916905550565b600054610100900460ff1680612a695750612a69612863565b80612a77575060005460ff16155b612ab25760405162461bcd60e51b815260040180806020018281038252602e815260200180614340602e913960400191505060405180910390fd5b600054610100900460ff16158015612add576000805460ff1961ff0019909116610100171660011790555b612a3c613a60565b609c8190556040805182815290517f3ff20538222f568f27ff436c0c49dfd3e48d5b8f86533a3f759dc1c7089775ab9181900360200190a150565b600060606098805480602002602001604051908101604052809291908181526020018280548015612b7a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612b5c575b505083519394506000925050505b81811015612bd157846001600160a01b0316838281518110612ba657fe5b60200260200101516001600160a01b03161415612bc957600193505050506114af565b600101612b88565b506000949350505050565b610e218484612bed87878787613070565b613145565b600080612bfd612dd7565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612c4e57600080fd5b505afa158015612c62573d6000803e3d6000fd5b505050506040513d6020811015612c7857600080fd5b505160a0546040805163852a12e360e01b81526004810188905290519293506001600160a01b039091169163852a12e3916024808201926020929091908290030181600087803b158015612ccb57600080fd5b505af1158015612cdf573d6000803e3d6000fd5b505050506040513d6020811015612cf557600080fd5b505115612d49576040805162461bcd60e51b815260206004820152601f60248201527f436f6d706f756e645072697a65506f6f6c2f72656465656d2d6661696c656400604482015290519081900360640190fd5b6000612dce82846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612d9c57600080fd5b505afa158015612db0573d6000803e3d6000fd5b505050506040513d6020811015612dc657600080fd5b505190612e9f565b95945050505050565b60a05460408051636f307dc360e01b815290516000926001600160a01b031691636f307dc3916004808301926020929190829003018186803b158015612e1c57600080fd5b505afa158015612e30573d6000803e3d6000fd5b505050506040513d6020811015612e4657600080fd5b5051905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610b64908490613b06565b600082821115612ef6576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6099546001600160a01b031615612f9057609954604080516304d7f3db60e41b81526001600160a01b038781166004830152602482018790528581166044830152848116606483015291519190921691634d7f3db091608480830192600092919082900301818387803b158015612f7757600080fd5b505af1158015612f8b573d6000803e3d6000fd5b505050505b816001600160a01b0316635d7b075885856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611a2757600080fd5b6001600160a01b0382166000908152609e602052604081205461275290839061301a9082906001600160801b0316613594565b613bb7565b6001600160a01b0383166000908152609e60205260408120548190613055908590600160801b90046001600160801b0316613594565b905080613066576000915050612752565b612dce8382613bdc565b6001600160a01b038381166000908152609f6020908152604080832093881683529290529081208054829190600160e01b900460ff166130b357600091506130f5565b60006130c0888888613c43565b82549091506130f190889088906130ec9089906130e6906001600160c01b031687613754565b90613754565b6130ff565b9250505b5095945050505050565b6001600160a01b0383166000908152609e6020526040812054819061312e9085906001600160801b0316613594565b90508083111561313c578092505b50909392505050565b6001600160a01b038083166000908152609f602090815260408083209387168352929052819020548151606081019092526001600160c01b0316908061318a84613cf4565b6001600160801b031681526020016131a86131a3613d3c565b613d42565b63ffffffff908116825260016020928301526001600160a01b038681166000908152609f84526040808220928a168252918452819020845181549486015195909201516001600160c01b03199094166001600160c01b039092169190911763ffffffff60c01b1916600160c01b94909216939093021760ff60e01b1916600160e01b911515919091021790558181101561328b576001600160a01b038084169085167f2f92d56910619b38bc29fd8e4ca5e56359edac7a0c086cdcd305fb603fa374916132758585612e9f565b60408051918252519081900360200190a3610e21565b80821015610e21576001600160a01b038084169085167ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf6132cc8486612e9f565b60408051918252519081900360200190a350505050565b6000806000846001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561333557600080fd5b505afa158015613349573d6000803e3d6000fd5b505050506040513d602081101561335f57600080fd5b50519050838110156133b1576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f696e737566662d66756e647360501b604482015290519081900360640190fd5b6133be8686836000612bdc565b60006133d3866133ce8488612e9f565b612fe7565b6001600160a01b038088166000908152609f60209081526040808320938c16835292905290812054919250906001600160c01b0316821161344a576001600160a01b038088166000908152609f60209081526040808320938c1683529290522054613447906001600160c01b031683612e9f565b90505b60006134568888612fe7565b90508082116134655781613467565b805b94506134738186612e9f565b955050505050935093915050565b6001600160a01b0381166134dc576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f7072697a6553747261746567792d6e6f742d7a65726f604482015290519081900360640190fd5b6134f96001600160a01b038216600162a1cb1960e01b0319613d86565b61354a576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f7072697a6553747261746567792d696e76616c696400604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0383169081179091556040517f7f58dc86bc2e435cb77ca0edb1df55e25f90caf2d6bd866971715437d456a21290600090a250565b6000806135a18385613da2565b905061178681670de0b6b3a7640000613dfb565b6001600160a01b038083166000908152609f60209081526040808320938716835292905220546135f7906135f2906001600160c01b031683612e9f565b613cf4565b6001600160a01b038084166000818152609f602090815260408083209489168084529482529182902080546001600160c01b0319166001600160801b0396909616959095179094558051858152905191937ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf92918290030190a3505050565b60a05460408051633af9e66960e01b815230600482015290516000926001600160a01b031691633af9e66991602480830192602092919082900301818787803b1580156136c257600080fd5b505af1158015612e30573d6000803e3d6000fd5b6000806136e16125c2565b609c549091506136f18285613754565b11159392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610e21908590613b06565b600082820183811015612752576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b801580613834575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561380657600080fd5b505afa15801561381a573d6000803e3d6000fd5b505050506040513d602081101561383057600080fd5b5051155b61386f5760405162461bcd60e51b81526004018080602001828103825260368152602001806144466036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610b64908490613b06565b3b151590565b600054610100900460ff16806138e057506138e0612863565b806138ee575060005460ff16155b6139295760405162461bcd60e51b815260040180806020018281038252602e815260200180614340602e913960400191505060405180910390fd5b600054610100900460ff16158015612a3c576000805460ff1961ff0019909116610100171660011790558015611041576000805461ff001916905550565b600054610100900460ff16806139805750613980612863565b8061398e575060005460ff16155b6139c95760405162461bcd60e51b815260040180806020018281038252602e815260200180614340602e913960400191505060405180910390fd5b600054610100900460ff161580156139f4576000805460ff1961ff0019909116610100171660011790555b60006139fe6126cd565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015611041576000805461ff001916905550565b600054610100900460ff1680613a795750613a79612863565b80613a87575060005460ff16155b613ac25760405162461bcd60e51b815260040180806020018281038252602e815260200180614340602e913960400191505060405180910390fd5b600054610100900460ff16158015613aed576000805460ff1961ff0019909116610100171660011790555b60016065558015611041576000805461ff001916905550565b6060613b5b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613e3d9092919063ffffffff16565b805190915015610b6457808060200190516020811015613b7a57600080fd5b5051610b645760405162461bcd60e51b815260040180806020018281038252602a81526020018061441c602a913960400191505060405180910390fd5b600080613bc684609a54613594565b905080831115613bd4578092505b509092915050565b6000808211613c32576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381613c3b57fe5b049392505050565b6001600160a01b038281166000908152609f60209081526040808320938716835292905290812054600160c01b810463ffffffff1690600160e01b900460ff16613c91576000915050612752565b6000613ca582613c9f613d3c565b90612e9f565b6001600160a01b0386166000908152609e602052604081205491925090613cdd908390600160801b90046001600160801b0316613da2565b9050613ce98582613594565b979650505050505050565b6000600160801b8210613d385760405162461bcd60e51b81526004018080602001828103825260278152602001806142d16027913960400191505060405180910390fd5b5090565b60a15490565b6000600160201b8210613d385760405162461bcd60e51b81526004018080602001828103825260268152602001806143f66026913960400191505060405180910390fd5b6000613d9183613e4c565b801561275257506127528383613e7f565b600082613db157506000612efb565b82820282848281613dbe57fe5b04146127525760405162461bcd60e51b815260040180806020018281038252602181526020018061436e6021913960400191505060405180910390fd5b600061275283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ea2565b60606117868484600085613f44565b6000613e5f826301ffc9a760e01b613e7f565b80156114ac5750613e78826001600160e01b0319613e7f565b1592915050565b6000806000613e8e8585614095565b91509150818015612dce5750949350505050565b60008183613f2e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ef3578181015183820152602001613edb565b50505050905090810190601f168015613f205780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613f3a57fe5b0495945050505050565b606082471015613f855760405162461bcd60e51b815260040180806020018281038252602681526020018061431a6026913960400191505060405180910390fd5b613f8e856138c1565b613fdf576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061401e5780518252601f199092019160209182019101613fff565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614080576040519150601f19603f3d011682016040523d82523d6000602084013e614085565b606091505b5091509150613ce98282866141c9565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b1781529151815160009384939284926060926001600160a01b038a169261753092879282918083835b6020831061411d5780518252601f1990920191602091820191016140fe565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461417e576040519150601f19603f3d011682016040523d82523d6000602084013e614183565b606091505b50915091506020815110156141a157600080945094505050506141c2565b818180602001905160208110156141b757600080fd5b505190955093505050505b9250929050565b606083156141d8575081612752565b8251156141e85782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315613ef3578181015183820152602001613edb565b828054828255906000526020600020908101928215614284579160200282015b8281111561428457825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061424f565b50613d389291505b80821115613d385780546001600160a01b031916815560010161428c56fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e2031323820626974735072697a65506f6f6c2f7265736572766552656769737472792d6e6f742d7a65726f416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725072697a65506f6f6c2f657869742d6665652d657863656564732d757365722d6d6178696d756d5072697a65506f6f6c2f756e6b6e6f776e2d746f6b656e00000000000000000053616665436173743a2076616c756520646f65736e27742066697420696e20333220626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e63655072697a65506f6f6c2f6f6e6c792d7072697a65537472617465677900000000a264697066735822122034aae2b6add5a6f099bfd26707f324945e51b2cb08344b3d5aad7dc87c6b254c64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x25E JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x888C2B6F GT PUSH2 0x146 JUMPI DUP1 PUSH4 0xB69EF8A8 GT PUSH2 0xC3 JUMPI DUP1 PUSH4 0xE323F825 GT PUSH2 0x87 JUMPI DUP1 PUSH4 0xE323F825 EQ PUSH2 0x9A5 JUMPI DUP1 PUSH4 0xE6D8A94B EQ PUSH2 0x9E1 JUMPI DUP1 PUSH4 0xEDB4E1CF EQ PUSH2 0x9E9 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x9F1 JUMPI DUP1 PUSH4 0xFC0C546A EQ PUSH2 0xA17 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0xA1F JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0xB69EF8A8 EQ PUSH2 0x864 JUMPI DUP1 PUSH4 0xC5871485 EQ PUSH2 0x86C JUMPI DUP1 PUSH4 0xD18E81B3 EQ PUSH2 0x92B JUMPI DUP1 PUSH4 0xD4A1361D EQ PUSH2 0x933 JUMPI DUP1 PUSH4 0xDB006A75 EQ PUSH2 0x988 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x9D63848A GT PUSH2 0x10A JUMPI DUP1 PUSH4 0x9D63848A EQ PUSH2 0x770 JUMPI DUP1 PUSH4 0x9E167519 EQ PUSH2 0x7C8 JUMPI DUP1 PUSH4 0x9FE32A91 EQ PUSH2 0x7D0 JUMPI DUP1 PUSH4 0xA016240B EQ PUSH2 0x7ED JUMPI DUP1 PUSH4 0xA7B2CC31 EQ PUSH2 0x827 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x888C2B6F EQ PUSH2 0x6E3 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x732 JUMPI DUP1 PUSH4 0x8E71C1F6 EQ PUSH2 0x73A JUMPI DUP1 PUSH4 0x91CA480E EQ PUSH2 0x742 JUMPI DUP1 PUSH4 0x98BF3EB6 EQ PUSH2 0x768 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x52A387AB GT PUSH2 0x1DF JUMPI DUP1 PUSH4 0x715018A6 GT PUSH2 0x1A3 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x628 JUMPI DUP1 PUSH4 0x76687D3D EQ PUSH2 0x630 JUMPI DUP1 PUSH4 0x78B3D327 EQ PUSH2 0x638 JUMPI DUP1 PUSH4 0x79CB8563 EQ PUSH2 0x65E JUMPI DUP1 PUSH4 0x7B99ADB1 EQ PUSH2 0x690 JUMPI DUP1 PUSH4 0x7CBAB1C7 EQ PUSH2 0x6AD JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x52A387AB EQ PUSH2 0x566 JUMPI DUP1 PUSH4 0x630665B4 EQ PUSH2 0x58C JUMPI DUP1 PUSH4 0x69E527DA EQ PUSH2 0x594 JUMPI DUP1 PUSH4 0x6A3FD4F9 EQ PUSH2 0x5B8 JUMPI DUP1 PUSH4 0x6B1B863A EQ PUSH2 0x5F2 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x2B0AB144 GT PUSH2 0x226 JUMPI DUP1 PUSH4 0x2B0AB144 EQ PUSH2 0x404 JUMPI DUP1 PUSH4 0x2F7627E3 EQ PUSH2 0x43A JUMPI DUP1 PUSH4 0x35403023 EQ PUSH2 0x468 JUMPI DUP1 PUSH4 0x3EDE50C6 EQ PUSH2 0x485 JUMPI DUP1 PUSH4 0x494DE9F7 EQ PUSH2 0x538 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x937EB54 EQ PUSH2 0x263 JUMPI DUP1 PUSH4 0x13F55E39 EQ PUSH2 0x27D JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x2B5 JUMPI DUP1 PUSH4 0x16960D55 EQ PUSH2 0x360 JUMPI DUP1 PUSH4 0x22F8E566 EQ PUSH2 0x3E7 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26B PUSH2 0xA9C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x293 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xAAB JUMP JUMPDEST STOP JUMPDEST PUSH2 0x343 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x2CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x305 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x317 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x338 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xB69 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x376 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x3A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x3BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x3DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xB7A JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xE27 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x41A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xE2C JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x450 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xEE9 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x47E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1038 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x49B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x4C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x4D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x4F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0x1044 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x54E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x1236 JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x57C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x133D JUMP JUMPDEST PUSH2 0x26B PUSH2 0x148C JUMP JUMPDEST PUSH2 0x59C PUSH2 0x1492 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x5DE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x14A1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x608 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 SWAP1 SWAP2 ADD CALLDATALOAD AND PUSH2 0x14B4 JUMP JUMPDEST PUSH2 0x2B3 PUSH2 0x16BC JUMP JUMPDEST PUSH2 0x26B PUSH2 0x1768 JUMP JUMPDEST PUSH2 0x5DE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x64E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x176E JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x674 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1779 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x178E JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x6C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x17F9 JUMP JUMPDEST PUSH2 0x719 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x6F9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1A45 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB ADD SWAP1 RETURN JUMPDEST PUSH2 0x59C PUSH2 0x1A5F JUMP JUMPDEST PUSH2 0x59C PUSH2 0x1A6E JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x758 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A7D JUMP JUMPDEST PUSH2 0x59C PUSH2 0x1AE8 JUMP JUMPDEST PUSH2 0x778 PUSH2 0x1AF7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x7B4 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x79C JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x26B PUSH2 0x1B59 JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x7E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1B5F JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x803 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x1C8D JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x83D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x40 ADD CALLDATALOAD AND PUSH2 0x1EC4 JUMP JUMPDEST PUSH2 0x26B PUSH2 0x201A JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x882 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x8AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x8BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x8DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2024 JUMP JUMPDEST PUSH2 0x26B PUSH2 0x2122 JUMP JUMPDEST PUSH2 0x959 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x949 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2128 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x99E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x2158 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x9BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x2163 JUMP JUMPDEST PUSH2 0x26B PUSH2 0x2318 JUMP JUMPDEST PUSH2 0x26B PUSH2 0x248E JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xA07 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2494 JUMP JUMPDEST PUSH2 0x59C PUSH2 0x2597 JUMP JUMPDEST PUSH2 0xA27 PUSH2 0x25A1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xA61 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xA49 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xA8E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xAA6 PUSH2 0x25C2 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xABF PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xB08 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x447C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xB13 DUP4 DUP4 DUP4 PUSH2 0x26D1 JUMP JUMPDEST ISZERO PUSH2 0xB64 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB0BAC59718CD343C80A813518AFCF36846CFCFE6D56E2B3CAB9BD49F5F9B251C DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0xA85BD01 PUSH1 0xE1 SHL SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xB8E PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xBD7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x447C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xBE0 DUP4 PUSH2 0x2759 JUMP JUMPDEST PUSH2 0xC31 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0xC3B JUMPI PUSH2 0xE21 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xDA8 JUMPI DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x42842E0E ADDRESS DUP8 DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0xC63 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0xCD1 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xDA0 JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0xCFF JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xD04 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH32 0x17E975018310F88872B58D4D8263ADCA83CF5C1893496EA2A86923DAB15276AD DUP2 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD64 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD4C JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD91 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xC3E JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x69C2DE32BC4D47F488E72626A6CFDEE85089342E52675E7DE79C4B417623960C DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP6 POP SWAP1 SWAP4 POP POP POP POP LOG3 JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0xA1 SSTORE JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE40 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xE89 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x447C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xE94 DUP4 DUP4 DUP4 PUSH2 0x26D1 JUMP JUMPDEST ISZERO PUSH2 0xB64 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC65F48ACA3B7A99B7443D04B8FFBB073156179BC628DC3F7DEF5047748973469 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH2 0xEF1 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF02 PUSH2 0x1A5F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xF4B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x438F DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xFAE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xFC4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD GT ISZERO PUSH2 0x1034 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5C19A95C DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x101B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x102F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x1041 DUP2 PUSH2 0x276E JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x105D JUMPI POP PUSH2 0x105D PUSH2 0x2863 JUMP JUMPDEST DUP1 PUSH2 0x106B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x10A6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4340 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x10D1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x1116 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F8 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 MLOAD DUP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x112F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1159 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP1 MLOAD PUSH2 0x116E SWAP2 PUSH1 0x98 SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x422F JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x11A5 JUMPI PUSH1 0x0 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1188 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0x119C DUP2 DUP4 PUSH2 0x2874 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x1172 JUMP JUMPDEST POP PUSH2 0x11AE PUSH2 0x299F JUMP JUMPDEST PUSH2 0x11B6 PUSH2 0x2A50 JUMP JUMPDEST PUSH2 0x11C1 PUSH1 0x0 NOT PUSH2 0x2AE5 JUMP JUMPDEST PUSH1 0x97 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x9A DUP5 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP6 SWAP1 MSTORE DUP1 MLOAD PUSH32 0x25FF68DD81B34665B5BA7E553EE5511BF6812E12ADB4A7E2C0D9E26B3099CE79 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 POP DUP1 ISZERO PUSH2 0xE21 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x1242 DUP2 PUSH2 0x2B20 JUMP JUMPDEST PUSH2 0x1281 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1306 DUP5 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x12E7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x12FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 PUSH2 0x2BDC JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP4 AND DUP3 MSTORE SWAP3 SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x138E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x13A2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x13B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ PUSH2 0x1412 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F6F6E6C792D72657365727665 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9B DUP1 SLOAD PUSH1 0x0 SWAP2 DUP3 SWAP1 SSTORE SWAP1 PUSH2 0x1426 DUP3 PUSH2 0x2BF2 JUMP JUMPDEST SWAP1 POP PUSH2 0x1445 DUP6 DUP3 PUSH2 0x1435 PUSH2 0x2DD7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x2E4D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP2 PUSH32 0x1C71C8E11FD443227C8F8D3DC1A237A3A5E8310B540C7FBCF5169754AEDF42C9 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x9D SLOAD SWAP1 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14AC DUP3 PUSH2 0x2759 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x14C8 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1511 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x447C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x151B DUP2 PUSH2 0x2B20 JUMP JUMPDEST PUSH2 0x155A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 PUSH2 0x1564 JUMPI PUSH2 0xE21 JUMP JUMPDEST PUSH1 0x9D SLOAD DUP4 GT ISZERO PUSH2 0x15BB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F61776172642D657863656564732D617661696C000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x15C8 SWAP1 DUP5 PUSH2 0x2E9F JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH2 0x15D8 DUP5 DUP5 DUP5 PUSH1 0x0 PUSH2 0x2F01 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15E4 DUP4 DUP6 PUSH2 0x2FE7 JUMP JUMPDEST SWAP1 POP PUSH2 0x166A DUP6 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1638 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x164C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1662 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP5 PUSH2 0x2BDC JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xE2554529D99AB7A67DB6B4CEA2B32C7D55AE325F958861E05F304FDDED867E31 DUP7 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x16C4 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16D5 PUSH2 0x1A5F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x171E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x438F DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14AC DUP3 PUSH2 0x2B20 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1786 DUP5 DUP5 DUP5 PUSH2 0x301F JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1796 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x17A7 PUSH2 0x1A5F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x17F0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x438F DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1041 DUP2 PUSH2 0x2AE5 JUMP JUMPDEST CALLER PUSH2 0x1803 DUP2 PUSH2 0x2B20 JUMP JUMPDEST PUSH2 0x1842 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO PUSH2 0x191C JUMPI PUSH1 0x0 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP7 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x18B4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x18CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x18DC DUP7 CALLER DUP5 DUP5 PUSH2 0x3070 JUMP JUMPDEST SWAP1 POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x190E JUMPI PUSH2 0x190B CALLER PUSH2 0x1905 DUP5 DUP8 PUSH2 0x2E9F JUMP JUMPDEST DUP4 PUSH2 0x30FF JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x1919 DUP7 CALLER DUP4 PUSH2 0x3145 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1946 JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x199D JUMPI PUSH2 0x199D DUP4 CALLER CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x19BF JUMPI POP PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xE21 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP7 SWAP1 MSTORE CALLER PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xB2210957 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1A27 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1A3B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1A53 DUP6 DUP6 DUP6 PUSH2 0x32E3 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x97 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1A85 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A96 PUSH2 0x1A5F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1ADF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x438F DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1041 DUP2 PUSH2 0x3481 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1B4F JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1B31 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1BB0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1BC4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1BDA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1BF6 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x14AF JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x10DFA58 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C45 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C59 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1C6F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x1C83 JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x14AF JUMP JUMPDEST PUSH2 0x1786 DUP5 DUP3 PUSH2 0x3594 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x1CE7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP3 PUSH2 0x1CF6 DUP2 PUSH2 0x2B20 JUMP JUMPDEST PUSH2 0x1D35 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1D43 DUP9 DUP8 DUP10 PUSH2 0x32E3 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0x1D86 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x43AF PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1D91 DUP9 DUP8 DUP4 PUSH2 0x35B5 JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x631B5DFB PUSH2 0x1DA8 PUSH2 0x26CD JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E14 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 PUSH2 0x1E2D DUP4 DUP10 PUSH2 0x2E9F SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1E3A DUP3 PUSH2 0x2BF2 JUMP JUMPDEST SWAP1 POP PUSH2 0x1E49 DUP11 DUP3 PUSH2 0x1435 PUSH2 0x2DD7 JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E65 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP14 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE DUP1 DUP3 ADD DUP10 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x271704A58FD2953E49B87D67A0A3CE28A58147DE98A5457F60B4686F6385030 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH2 0x1ECE DUP2 PUSH2 0x2B20 JUMP JUMPDEST PUSH2 0x1F0D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1F15 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1F26 PUSH2 0x1A5F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1F6F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x438F DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP6 AND DUP1 DUP4 MSTORE DUP7 DUP3 AND PUSH1 0x20 DUP1 DUP6 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9E DUP5 MSTORE DUP9 SWAP1 KECCAK256 SWAP7 MLOAD DUP8 SLOAD SWAP3 MLOAD DUP8 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP1 DUP8 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP6 AND OR SWAP1 SWAP5 SSTORE DUP5 MLOAD SWAP3 DUP4 MSTORE SWAP3 DUP3 ADD MSTORE DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 MLOAD PUSH32 0xFB0BA2CF86A2B03BCF387753A2192DA80A006AFA99DD022BB301C78E323BF1B9 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xAA6 PUSH2 0x3676 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x203D JUMPI POP PUSH2 0x203D PUSH2 0x2863 JUMP JUMPDEST DUP1 PUSH2 0x204B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2086 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4340 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x20B1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x20BC DUP6 DUP6 DUP6 PUSH2 0x1044 JUMP JUMPDEST PUSH1 0xA0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 AND SWAP1 PUSH32 0xA5670B49A0EE863080AE28858BB5D9BCC1EB0D2A6F4C9C3A8ACCC43B8F445D25 SWAP1 PUSH1 0x0 SWAP1 LOG2 DUP1 ISZERO PUSH2 0x211B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0xA1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP3 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14AC DUP3 PUSH2 0x2BF2 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x21BB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP2 PUSH2 0x21CA DUP2 PUSH2 0x2B20 JUMP JUMPDEST PUSH2 0x2209 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP4 PUSH2 0x2213 DUP2 PUSH2 0x36D6 JUMP JUMPDEST PUSH2 0x2264 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F657863656564732D6C69717569646974792D63617000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x226E PUSH2 0x26CD JUMP JUMPDEST SWAP1 POP PUSH2 0x227C DUP8 DUP8 DUP8 DUP8 PUSH2 0x2F01 JUMP JUMPDEST PUSH2 0x229B DUP2 ADDRESS DUP9 PUSH2 0x228A PUSH2 0x2DD7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 SWAP1 PUSH2 0x36FA JUMP JUMPDEST PUSH2 0x22A4 DUP7 PUSH2 0x276E JUMP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6CE569498E0F86F147466AC49211CB2A1FFE06195ADB805E383B3F2365109160 DUP10 DUP9 PUSH1 0x40 MLOAD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x2372 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE PUSH1 0x0 PUSH2 0x2381 PUSH2 0x25C2 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x238D PUSH2 0x3676 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 DUP3 GT PUSH2 0x239F JUMPI PUSH1 0x0 PUSH2 0x23A9 JUMP JUMPDEST PUSH2 0x23A9 DUP3 DUP5 PUSH2 0x2E9F JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x9D SLOAD DUP3 GT PUSH2 0x23BD JUMPI PUSH1 0x0 PUSH2 0x23CB JUMP JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x23CB SWAP1 DUP4 SWAP1 PUSH2 0x2E9F JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x247D JUMPI PUSH1 0x0 PUSH2 0x23DE DUP3 PUSH2 0x1B5F JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x2438 JUMPI PUSH1 0x9B SLOAD PUSH2 0x23F3 SWAP1 DUP3 PUSH2 0x3754 JUMP JUMPDEST PUSH1 0x9B SSTORE PUSH2 0x2400 DUP3 DUP3 PUSH2 0x2E9F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 POP PUSH32 0x5F1703CCFA2730D4245350F228079926A37F26A44ECF6978A7EEAFFF0AF11407 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x2445 SWAP1 DUP4 PUSH2 0x3754 JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xCE2B6E507C7CA1A20CE136810F524EEFC19BA4C7E4866EB6CC0CBA76E778D4BE SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH1 0x9D SLOAD SWAP5 POP POP POP POP POP PUSH1 0x1 PUSH1 0x65 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x9B SLOAD DUP2 JUMP JUMPDEST PUSH2 0x249C PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x24AD PUSH2 0x1A5F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x24F6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x438F DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x253B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42AB PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xAA6 PUSH2 0x2DD7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x9B SLOAD SWAP1 POP PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2622 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2604 JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x26C4 JUMPI PUSH2 0x26BA DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2647 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2687 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x269B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x26B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP6 SWAP1 PUSH2 0x3754 JUMP JUMPDEST SWAP4 POP PUSH1 0x1 ADD PUSH2 0x2630 JUMP JUMPDEST POP SWAP2 SWAP3 POP POP POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x26DC DUP4 PUSH2 0x2759 JUMP JUMPDEST PUSH2 0x272D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x273A JUMPI POP PUSH1 0x0 PUSH2 0x2752 JUMP JUMPDEST PUSH2 0x274E PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP6 DUP5 PUSH2 0x2E4D JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND SWAP2 AND EQ ISZERO SWAP1 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH2 0x2797 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH2 0x2787 PUSH2 0x2DD7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x37AE JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x140E25AD PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0xA0712D68 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x27E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x27F9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x280F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO PUSH2 0x1041 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6D706F756E645072697A65506F6F6C2F6D696E742D6661696C6564000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x286E ADDRESS PUSH2 0x38C1 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF77C4791 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x28B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x28CB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x28E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x293E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F746F6B656E2D6374726C722D6D69736D617463680000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x98 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x294C JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 DUP5 AND SWAP2 PUSH32 0x460E712B4A5D801D031ED673DEA209B73AB854F7DDEB86B6C48082E92C3EEE66 SWAP2 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x29B8 JUMPI POP PUSH2 0x29B8 PUSH2 0x2863 JUMP JUMPDEST DUP1 PUSH2 0x29C6 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2A01 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4340 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2A2C JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2A34 PUSH2 0x38C7 JUMP JUMPDEST PUSH2 0x2A3C PUSH2 0x3967 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2A69 JUMPI POP PUSH2 0x2A69 PUSH2 0x2863 JUMP JUMPDEST DUP1 PUSH2 0x2A77 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2AB2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4340 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2ADD JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2A3C PUSH2 0x3A60 JUMP JUMPDEST PUSH1 0x9C DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3FF20538222F568F27FF436C0C49DFD3E48D5B8F86533A3F759DC1C7089775AB SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2B7A JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2B5C JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2BD1 JUMPI DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2BA6 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x2BC9 JUMPI PUSH1 0x1 SWAP4 POP POP POP POP PUSH2 0x14AF JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2B88 JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xE21 DUP5 DUP5 PUSH2 0x2BED DUP8 DUP8 DUP8 DUP8 PUSH2 0x3070 JUMP JUMPDEST PUSH2 0x3145 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2BFD PUSH2 0x2DD7 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2C4E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2C62 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2C78 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x852A12E3 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP9 SWAP1 MSTORE SWAP1 MLOAD SWAP3 SWAP4 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0x852A12E3 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2CCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2CDF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2CF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO PUSH2 0x2D49 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6D706F756E645072697A65506F6F6C2F72656465656D2D6661696C656400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2DCE DUP3 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2D9C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2DB0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2DC6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 PUSH2 0x2E9F JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x6F307DC3 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x6F307DC3 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2E1C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2E30 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2E46 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xB64 SWAP1 DUP5 SWAP1 PUSH2 0x3B06 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2EF6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2F90 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE DUP6 DUP2 AND PUSH1 0x44 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x4D7F3DB0 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2F77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2F8B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5D7B0758 DUP6 DUP6 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1A27 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x2752 SWAP1 DUP4 SWAP1 PUSH2 0x301A SWAP1 DUP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3594 JUMP JUMPDEST PUSH2 0x3BB7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x3055 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3594 JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x3066 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x2752 JUMP JUMPDEST PUSH2 0x2DCE DUP4 DUP3 PUSH2 0x3BDC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP3 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x30B3 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x30F5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x30C0 DUP9 DUP9 DUP9 PUSH2 0x3C43 JUMP JUMPDEST DUP3 SLOAD SWAP1 SWAP2 POP PUSH2 0x30F1 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x30EC SWAP1 DUP10 SWAP1 PUSH2 0x30E6 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP8 PUSH2 0x3754 JUMP JUMPDEST SWAP1 PUSH2 0x3754 JUMP JUMPDEST PUSH2 0x30FF JUMP JUMPDEST SWAP3 POP POP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x312E SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3594 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x313C JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE DUP2 SWAP1 KECCAK256 SLOAD DUP2 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 DUP1 PUSH2 0x318A DUP5 PUSH2 0x3CF4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x31A8 PUSH2 0x31A3 PUSH2 0x3D3C JUMP JUMPDEST PUSH2 0x3D42 JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP3 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 DUP11 AND DUP3 MSTORE SWAP2 DUP5 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP5 DUP7 ADD MLOAD SWAP6 SWAP1 SWAP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH4 0xFFFFFFFF PUSH1 0xC0 SHL NOT AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP5 SWAP1 SWAP3 AND SWAP4 SWAP1 SWAP4 MUL OR PUSH1 0xFF PUSH1 0xE0 SHL NOT AND PUSH1 0x1 PUSH1 0xE0 SHL SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE DUP2 DUP2 LT ISZERO PUSH2 0x328B JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0x2F92D56910619B38BC29FD8E4CA5E56359EDAC7A0C086CDCD305FB603FA37491 PUSH2 0x3275 DUP6 DUP6 PUSH2 0x2E9F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 PUSH2 0xE21 JUMP JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0xE21 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF PUSH2 0x32CC DUP5 DUP7 PUSH2 0x2E9F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3335 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3349 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x335F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x33B1 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F696E737566662D66756E6473 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x33BE DUP7 DUP7 DUP4 PUSH1 0x0 PUSH2 0x2BDC JUMP JUMPDEST PUSH1 0x0 PUSH2 0x33D3 DUP7 PUSH2 0x33CE DUP5 DUP9 PUSH2 0x2E9F JUMP JUMPDEST PUSH2 0x2FE7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP3 GT PUSH2 0x344A JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x3447 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2E9F JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x3456 DUP9 DUP9 PUSH2 0x2FE7 JUMP JUMPDEST SWAP1 POP DUP1 DUP3 GT PUSH2 0x3465 JUMPI DUP2 PUSH2 0x3467 JUMP JUMPDEST DUP1 JUMPDEST SWAP5 POP PUSH2 0x3473 DUP2 DUP7 PUSH2 0x2E9F JUMP JUMPDEST SWAP6 POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x34DC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D6E6F742D7A65726F PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x34F9 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3D86 JUMP JUMPDEST PUSH2 0x354A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D696E76616C696400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x99 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x7F58DC86BC2E435CB77CA0EDB1DF55E25F90CAF2D6BD866971715437D456A212 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x35A1 DUP4 DUP6 PUSH2 0x3DA2 JUMP JUMPDEST SWAP1 POP PUSH2 0x1786 DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x3DFB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x35F7 SWAP1 PUSH2 0x35F2 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2E9F JUMP JUMPDEST PUSH2 0x3CF4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x3AF9E669 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x3AF9E669 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x36C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2E30 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x36E1 PUSH2 0x25C2 JUMP JUMPDEST PUSH1 0x9C SLOAD SWAP1 SWAP2 POP PUSH2 0x36F1 DUP3 DUP6 PUSH2 0x3754 JUMP JUMPDEST GT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x24 DUP4 ADD MSTORE DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x84 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xE21 SWAP1 DUP6 SWAP1 PUSH2 0x3B06 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x2752 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 ISZERO DUP1 PUSH2 0x3834 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH4 0x6EB1769F PUSH1 0xE1 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 DUP6 AND SWAP2 PUSH4 0xDD62ED3E SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3806 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x381A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3830 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO JUMPDEST PUSH2 0x386F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x36 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4446 PUSH1 0x36 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x95EA7B3 PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xB64 SWAP1 DUP5 SWAP1 PUSH2 0x3B06 JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x38E0 JUMPI POP PUSH2 0x38E0 PUSH2 0x2863 JUMP JUMPDEST DUP1 PUSH2 0x38EE JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3929 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4340 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2A3C JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3980 JUMPI POP PUSH2 0x3980 PUSH2 0x2863 JUMP JUMPDEST DUP1 PUSH2 0x398E JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x39C9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4340 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x39F4 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x39FE PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3A79 JUMPI POP PUSH2 0x3A79 PUSH2 0x2863 JUMP JUMPDEST DUP1 PUSH2 0x3A87 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3AC2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4340 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3AED JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x65 SSTORE DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x3B5B DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3E3D SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xB64 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3B7A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xB64 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x441C PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3BC6 DUP5 PUSH1 0x9A SLOAD PUSH2 0x3594 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x3BD4 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x3C32 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x3C3B JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xC0 SHL DUP2 DIV PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x3C91 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x2752 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3CA5 DUP3 PUSH2 0x3C9F PUSH2 0x3D3C JUMP JUMPDEST SWAP1 PUSH2 0x2E9F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x3CDD SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3DA2 JUMP JUMPDEST SWAP1 POP PUSH2 0x3CE9 DUP6 DUP3 PUSH2 0x3594 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x3D38 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42D1 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0xA1 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x20 SHL DUP3 LT PUSH2 0x3D38 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x43F6 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3D91 DUP4 PUSH2 0x3E4C JUMP JUMPDEST DUP1 ISZERO PUSH2 0x2752 JUMPI POP PUSH2 0x2752 DUP4 DUP4 PUSH2 0x3E7F JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3DB1 JUMPI POP PUSH1 0x0 PUSH2 0x2EFB JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x3DBE JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x2752 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x436E PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2752 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x3EA2 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1786 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x3F44 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3E5F DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3E7F JUMP JUMPDEST DUP1 ISZERO PUSH2 0x14AC JUMPI POP PUSH2 0x3E78 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3E7F JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x3E8E DUP6 DUP6 PUSH2 0x4095 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x2DCE JUMPI POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x3F2E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3EF3 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3EDB JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3F20 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x3F3A JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x3F85 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x431A PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3F8E DUP6 PUSH2 0x38C1 JUMP JUMPDEST PUSH2 0x3FDF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x401E JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3FFF JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x4080 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4085 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x3CE9 DUP3 DUP3 DUP7 PUSH2 0x41C9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x24 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP3 DUP5 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND SWAP3 PUSH2 0x7530 SWAP3 DUP8 SWAP3 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x411D JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x40FE JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x417E JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4183 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x41A1 JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x41C2 JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x41B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x41D8 JUMPI POP DUP2 PUSH2 0x2752 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x41E8 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x3EF3 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3EDB JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x4284 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x4284 JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x424F JUMP JUMPDEST POP PUSH2 0x3D38 SWAP3 SWAP2 POP JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x3D38 JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x428C JUMP INVALID 0x4F PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F206164647265737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E2031323820626974735072697A65 POP PUSH16 0x6F6C2F72657365727665526567697374 PUSH19 0x792D6E6F742D7A65726F416464726573733A20 PUSH10 0x6E73756666696369656E PUSH21 0x2062616C616E636520666F722063616C6C496E6974 PUSH10 0x616C697A61626C653A20 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 MSTORE8 PUSH2 0x6665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F774F776E61626C653A20 PUSH4 0x616C6C65 PUSH19 0x206973206E6F7420746865206F776E65725072 PUSH10 0x7A65506F6F6C2F657869 PUSH21 0x2D6665652D657863656564732D757365722D6D6178 PUSH10 0x6D756D5072697A65506F PUSH16 0x6C2F756E6B6E6F776E2D746F6B656E00 STOP STOP STOP STOP STOP STOP STOP STOP MSTORE8 PUSH2 0x6665 NUMBER PUSH2 0x7374 GASPRICE KECCAK256 PUSH23 0x616C756520646F65736E27742066697420696E20333220 PUSH3 0x697473 MSTORE8 PUSH2 0x6665 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x7563636565645361666545524332303A20617070 PUSH19 0x6F76652066726F6D206E6F6E2D7A65726F2074 PUSH16 0x206E6F6E2D7A65726F20616C6C6F7761 PUSH15 0x63655072697A65506F6F6C2F6F6E6C PUSH26 0x2D7072697A65537472617465677900000000A264697066735822 SLT KECCAK256 CALLVALUE 0xAA 0xE2 0xB6 0xAD 0xD5 0xA6 CREATE SWAP10 0xBF 0xD2 PUSH8 0x7F324945E51B2CB ADDMOD CALLVALUE 0x4B RETURNDATASIZE GAS 0xAD PUSH30 0xC87C6B254C64736F6C634300060C00330000000000000000000000000000 ",
              "sourceMap": "128:470:63:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31480:106:39;;;:::i;:::-;;;;;;;;;;;;;;;;14958:270;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14958:270:39;;;;;;;;;;;;;;;;;:::i;:::-;;32298:200;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32298:200:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32298:200:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32298:200:39;;;;;;;;;;-1:-1:-1;32298:200:39;;-1:-1:-1;32298:200:39;-1:-1:-1;32298:200:39;:::i;:::-;;;;-1:-1:-1;;;;;;32298:200:39;;;;;;;;;;;;;;;17185:617;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17185:617:39;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17185:617:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17185:617:39;;;;;;;;;;-1:-1:-1;17185:617:39;;-1:-1:-1;17185:617:39;-1:-1:-1;17185:617:39;:::i;219:92:63:-;;;;;;;;;;;;;;;;-1:-1:-1;219:92:63;;:::i;15586:263:39:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15586:263:39;;;;;;;;;;;;;;;;;:::i;31811:166::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31811:166:39;;;;;;;;;;:::i;413:75:63:-;;;;;;;;;;;;;;;;-1:-1:-1;413:75:63;;:::i;5948:860:39:-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5948:860:39;;;;;;;;;;;;;-1:-1:-1;5948:860:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5948:860:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5948:860:39;;-1:-1:-1;;5948:860:39;;;-1:-1:-1;5948:860:39;;-1:-1:-1;;5948:860:39:i;25409:303::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25409:303:39;;;;;;;;;;:::i;13277:314::-;;;;;;;;;;;;;;;;-1:-1:-1;13277:314:39;-1:-1:-1;;;;;13277:314:39;;:::i;11940:103::-;;;:::i;899:29:41:-;;;:::i;:::-;;;;-1:-1:-1;;;;;899:29:41;;;;;;;;;;;;;;7465:130:39;;;;;;;;;;;;;;;;-1:-1:-1;7465:130:39;-1:-1:-1;;;;;7465:130:39;;:::i;:::-;;;;;;;;;;;;;;;;;;13917:647;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13917:647:39;;;;;;;;;;;;;;;;;:::i;1967:145:0:-;;;:::i;5382:27:39:-;;;:::i;34141:141::-;;;;;;;;;;;;;;;;-1:-1:-1;34141:141:39;-1:-1:-1;;;;;34141:141:39;;:::i;19907:306::-;;;;;;;;;;;;;;;;-1:-1:-1;19907:306:39;;-1:-1:-1;;;;;19907:306:39;;;;;;;;;;;:::i;29377:118::-;;;;;;;;;;;;;;;;-1:-1:-1;29377:118:39;;:::i;10723:1018::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10723:1018:39;;;;;;;;;;;;;;;;;:::i;18806:302::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18806:302:39;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1335:85:0;;;:::i;4710:40:39:-;;;:::i;30219:137::-;;;;;;;;;;;;;;;;-1:-1:-1;30219:137:39;-1:-1:-1;;;;;30219:137:39;;:::i;4916:43::-;;;:::i;31052:110::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5172:33;;;:::i;18036:430::-;;;;;;;;;;;;;;;;-1:-1:-1;18036:430:39;;:::i;8890:921::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8890:921:39;;;;;;;;;;;;;;;;;;;;:::i;26123:455::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26123:455:39;;;;-1:-1:-1;;;;;26123:455:39;;;;;;;;;;;;:::i;7162:74::-;;;:::i;1304:405:41:-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1304:405:41;;;;;;;;;;;;;-1:-1:-1;1304:405:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1304:405:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1304:405:41;;-1:-1:-1;;1304:405:41;;;-1:-1:-1;;;1304:405:41;;;-1:-1:-1;;;;;1304:405:41;;:::i;188:26:63:-;;;:::i;26965:343:39:-;;;;;;;;;;;;;;;;-1:-1:-1;26965:343:39;-1:-1:-1;;;;;26965:343:39;;:::i;:::-;;;;-1:-1:-1;;;;;26965:343:39;;;;;;;;;;;;;;;;;;;;;;;;492:104:63;;;;;;;;;;;;;;;;-1:-1:-1;492:104:63;;:::i;7917:469:39:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7917:469:39;;;;;;;;;;;;;;;;;;;;;;:::i;12245:1028::-;;;:::i;5277:33::-;;;:::i;2261:240:0:-;;;;;;;;;;;;;;;;-1:-1:-1;2261:240:0;-1:-1:-1;;;;;2261:240:0;;:::i;6912:93:39:-;;;:::i;4615:40::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31480:106;31540:7;31562:19;:17;:19::i;:::-;31555:26;;31480:106;:::o;14958:270::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;15112:39:::1;15125:2;15129:13;15144:6;15112:12;:39::i;:::-;15108:116;;;15166:51;::::0;;;;;;;-1:-1:-1;;;;;15166:51:39;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;15108:116;14958:270:::0;;;:::o;32298:200::-;-1:-1:-1;;;;;32298:200:39;-1:-1:-1;;;;32298:200:39:o;17185:617::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;17354:32:::1;17372:13;17354:17;:32::i;:::-;17346:77;;;::::0;;-1:-1:-1;;;17346:77:39;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;17434:20:::0;17430:47:::1;;17464:7;;17430:47;17488:9;17483:253;17503:19:::0;;::::1;17483:253;;;-1:-1:-1::0;;;;;17541:50:39;::::1;;17600:4;17607:2:::0;17611:8;;17620:1;17611:11;;::::1;;;;;17541:82;::::0;;-1:-1:-1;;;;;;17541:82:39::1;::::0;;;;;;-1:-1:-1;;;;;17541:82:39;;::::1;;::::0;::::1;::::0;;;;::::1;::::0;;;;17611:11:::1;;::::0;;;::::1;;17541:82:::0;;;;-1:-1:-1;17541:82:39;;;;;;;-1:-1:-1;;17541:82:39;;;;;;;-1:-1:-1;17541:82:39;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;;;;;17537:186;;;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17680:34;17708:5;17680:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17640:83;17537:186;17524:3;;17483:253;;;-1:-1:-1::0;17747:50:39::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;-1:-1:-1;;;;;17747:50:39;;::::1;::::0;;;::::1;::::0;::::1;::::0;17788:8;;;;17747:50;;;;;;17788:8;;17747:50;::::1;::::0;17788:8;17747:50;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;17747:50:39::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;17747:50:39;;-1:-1:-1;;;;17747:50:39::1;36121:1;17185:617:::0;;;;:::o;219:92:63:-;280:11;:26;219:92::o;15586:263:39:-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;15737:39:::1;15750:2;15754:13;15769:6;15737:12;:39::i;:::-;15733:112;;;15791:47;::::0;;;;;;;-1:-1:-1;;;;;15791:47:39;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;15586:263:::0;;;:::o;31811:166::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;31898:33:39::1;::::0;;-1:-1:-1;;;31898:33:39;;31925:4:::1;31898:33;::::0;::::1;::::0;;;31934:1:::1;::::0;-1:-1:-1;;;;;31898:18:39;::::1;::::0;::::1;::::0;:33;;;;;::::1;::::0;;;;;;;;;:18;:33;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31898:33:39;:37:::1;31894:79;;;31945:21;::::0;;-1:-1:-1;;;31945:21:39;;-1:-1:-1;;;;;31945:21:39;;::::1;;::::0;::::1;::::0;;;:17;;::::1;::::0;::::1;::::0;:21;;;;;-1:-1:-1;;31945:21:39;;;;;;;;-1:-1:-1;31945:17:39;:21;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31894:79;31811:166:::0;;:::o;413:75:63:-;464:19;472:10;464:7;:19::i;:::-;413:75;:::o;5948:860:39:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;-1:-1:-1;;;;;6146:39:39;::::1;6138:86;;;;-1:-1:-1::0;;;6138:86:39::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6263:24:::0;;;6303:54:::1;::::0;::::1;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;6303:54:39::1;-1:-1:-1::0;6293:64:39;;::::1;::::0;:7:::1;::::0;:64:::1;::::0;;::::1;::::0;::::1;:::i;:::-;;6369:9;6364:178;6388:22;6384:1;:26;6364:178;;;6425:40;6468:17;6486:1;6468:20;;;;;;;;;;;;;;6425:63;;6496:39;6516:15;6533:1;6496:19;:39::i;:::-;-1:-1:-1::0;6412:3:39::1;;6364:178;;;;6547:16;:14;:16::i;:::-;6569:24;:22;:24::i;:::-;6599:29;-1:-1:-1::0;;6599:16:39::1;:29::i;:::-;6635:15;:34:::0;;-1:-1:-1;;;;;;6635:34:39::1;-1:-1:-1::0;;;;;6635:34:39;::::1;::::0;;::::1;::::0;;;6675:18:::1;:40:::0;;;6727:76:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;::::1;1778:1:9;1794:14:::0;1790:66;;;-1:-1:-1;;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;-1:-1:-1;;5948:860:39:o;25409:303::-;25537:7;25511:15;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;;;-1:-1:-1;;;35825:92:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;;;25589:50:::1;::::0;;-1:-1:-1;;;25589:50:39;;-1:-1:-1;;;;;25589:50:39;;::::1;;::::0;::::1;::::0;;;25552:91:::1;::::0;25566:4;;25572:15;;25589:44;;::::1;::::0;::::1;::::0;:50;;;;;::::1;::::0;;;;;;;;;:44;:50;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25589:50:39;25641:1:::1;25552:13;:91::i;:::-;-1:-1:-1::0;;;;;;;25656:37:39;;::::1;;::::0;;;:20:::1;:37;::::0;;;;;;;:43;;;::::1;::::0;;;;;;;;:51;-1:-1:-1;;;;;25656:51:39::1;::::0;25409:303::o;13277:314::-;36438:15;;:24;;;-1:-1:-1;;;36438:24:39;;;;13353:7;;;;-1:-1:-1;;;;;36438:15:39;;;;:22;;:24;;;;;;;;;;;;;;;:15;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36438:24:39;;-1:-1:-1;36497:10:39;-1:-1:-1;;;;;36477:30:39;;;36469:65;;;;;-1:-1:-1;;;36469:65:39;;;;;;;;;;;;-1:-1:-1;;;36469:65:39;;;;;;;;;;;;;;;13386:18:::1;::::0;;13369:14:::1;13410:22:::0;;;;13386:18;13457:15:::1;13386:18:::0;13457:7:::1;:15::i;:::-;13438:34;;13479:44;13509:2;13514:8;13479;:6;:8::i;:::-;-1:-1:-1::0;;;;;13479:21:39::1;::::0;;::::1;:44::i;:::-;13535:29;::::0;;;;;;;-1:-1:-1;;;;;13535:29:39;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;13578:8:::0;13277:314;-1:-1:-1;;;;13277:314:39:o;11940:103::-;12018:20;;11940:103;:::o;899:29:41:-;;;-1:-1:-1;;;;;899:29:41;;:::o;7465:130:39:-;7538:4;7557:33;7575:14;7557:17;:33::i;:::-;7550:40;;7465:130;;;;:::o;13917:647::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;14069:15:::1;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;::::0;;-1:-1:-1;;;35825:92:39;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;::::1;;14098:11:::0;14094:38:::2;;14119:7;;14094:38;14156:20;;14146:6;:30;;14138:72;;;::::0;;-1:-1:-1;;;14138:72:39;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;14239:20;::::0;:32:::2;::::0;14264:6;14239:24:::2;:32::i;:::-;14216:20;:55:::0;14278:46:::2;14284:2:::0;14288:6;14296:15;14321:1:::2;14278:5;:46::i;:::-;14331:19;14353:55;14384:15;14401:6;14353:30;:55::i;:::-;14449:48;::::0;;-1:-1:-1;;;14449:48:39;;-1:-1:-1;;;;;14449:48:39;;::::2;;::::0;::::2;::::0;;;14331:77;;-1:-1:-1;14414:97:39::2;::::0;14428:2;;14432:15;;14449:44;;::::2;::::0;::::2;::::0;:48;;;;;::::2;::::0;;;;;;;;;:44;:48;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;14449:48:39;14499:11;14414:13:::2;:97::i;:::-;14523:36;::::0;;;;;;;-1:-1:-1;;;;;14523:36:39;;::::2;::::0;;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;35923:1;36121::::1;13917:647:::0;;;:::o;1967:145:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;2057:6:::1;::::0;2036:40:::1;::::0;2073:1:::1;::::0;-1:-1:-1;;;;;2057:6:0::1;::::0;2036:40:::1;::::0;2073:1;;2036:40:::1;2086:6;:19:::0;;-1:-1:-1;;;;;;2086:19:0::1;::::0;;1967:145::o;5382:27:39:-;;;;:::o;34141:141::-;34228:4;34247:30;34261:15;34247:13;:30::i;19907:306::-;20067:23;20117:91;20151:16;20175:10;20193:9;20117:26;:91::i;:::-;20100:108;19907:306;-1:-1:-1;;;;19907:306:39:o;29377:118::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;29459:31:39::1;29476:13;29459:16;:31::i;10723:1018::-:0;10832:10;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;;;-1:-1:-1;;;35825:92:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;;;-1:-1:-1;;;;;10854:18:39;::::1;::::0;10850:579:::1;;10910:45;::::0;;-1:-1:-1;;;10910:45:39;;-1:-1:-1;;;;;10910:45:39;::::1;;::::0;::::1;::::0;;;10882:25:::1;::::0;10928:10:::1;::::0;10910:39:::1;::::0;:45;;;;;::::1;::::0;;;;;;;;;10928:10;10910:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;10910:45:39;;-1:-1:-1;11014:24:39::1;11041:63;11065:4:::0;11071:10:::1;10910:45:::0;11014:24;11041:23:::1;:63::i;:::-;11014:90:::0;-1:-1:-1;;;;;;11117:10:39;;::::1;::::0;;::::1;;11113:245;;11271:78;11289:10;11301:29;:17:::0;11323:6;11301:21:::1;:29::i;:::-;11332:16;11271:17;:78::i;:::-;11252:97;;11113:245;11366:56;11387:4;11393:10;11405:16;11366:20;:56::i;:::-;10850:579;;;-1:-1:-1::0;;;;;11438:16:39;::::1;::::0;;::::1;::::0;:30:::1;;-1:-1:-1::0;;;;;;11458:10:39;;::::1;::::0;;::::1;;;11438:30;11434:128;;;11508:43;::::0;;-1:-1:-1;;;11508:43:39;;-1:-1:-1;;;;;11508:43:39;::::1;;::::0;::::1;::::0;;;11478:77:::1;::::0;11492:2;;11496:10:::1;::::0;;;11508:39:::1;::::0;:43;;;;;::::1;::::0;;;;;;;;;11496:10;11508:43;::::1;;::::0;::::1;;;;::::0;::::1;11478:77;-1:-1:-1::0;;;;;11599:18:39;::::1;::::0;;::::1;::::0;:58:::1;;-1:-1:-1::0;11629:13:39::1;::::0;-1:-1:-1;;;;;11629:13:39::1;11621:36:::0;::::1;11599:58;11595:142;;;11667:13;::::0;:63:::1;::::0;;-1:-1:-1;;;11667:63:39;;-1:-1:-1;;;;;11667:63:39;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;;11719:10:::1;11667:63:::0;;;;;;:13;;;::::1;::::0;-1:-1:-1;;11667:63:39;;;;;-1:-1:-1;;11667:63:39;;;;;;;-1:-1:-1;11667:13:39;:63;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;10723:1018:::0;;;;:::o;18806:302::-;18950:15;18973:20;19034:69;19073:4;19079:15;19096:6;19034:38;:69::i;:::-;19008:95;;;;-1:-1:-1;18806:302:39;-1:-1:-1;;;;18806:302:39:o;1335:85:0:-;1407:6;;-1:-1:-1;;;;;1407:6:0;;1335:85::o;4710:40:39:-;;;-1:-1:-1;;;;;4710:40:39;;:::o;30219:137::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;30318:33:39::1;30336:14;30318:17;:33::i;4916:43::-:0;;;-1:-1:-1;;;;;4916:43:39;;:::o;31052:110::-;31102:33;31150:7;31143:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31143:14:39;;;-1:-1:-1;31143:14:39;;;;;;;;;;;;;;;;;;;31052:110;:::o;5172:33::-;;;;:::o;18036:430::-;18161:15;;:24;;;-1:-1:-1;;;18161:24:39;;;;18102:7;;;;-1:-1:-1;;;;;18161:15:39;;;;:22;;:24;;;;;;;;;;;;;;;:15;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18161:24:39;;-1:-1:-1;;;;;;18196:30:39;;18192:59;;18243:1;18236:8;;;;;18192:59;18286:42;;;-1:-1:-1;;;18286:42:39;;18322:4;18286:42;;;;;;18256:27;;-1:-1:-1;;;;;18286:27:39;;;;;:42;;;;;;;;;;;;;;;:27;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18286:42:39;;-1:-1:-1;18338:24:39;18334:53;;18379:1;18372:8;;;;;;18334:53;18399:62;18433:6;18441:19;18399:33;:62::i;8890:921::-;9113:7;1753:1:23;2495:7;;:19;;2487:63;;;;;-1:-1:-1;;;2487:63:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;1753:1;2625:7;:18;9083:15:39;35833:56:::1;9083:15:::0;35833:13:::1;:56::i;:::-;35825:92;;;::::0;;-1:-1:-1;;;35825:92:39;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;::::1;;9131:15:::2;9148:20:::0;9172:69:::2;9211:4;9217:15;9234:6;9172:38;:69::i;:::-;9130:111;;;;9266:14;9255:7;:25;;9247:77;;;;-1:-1:-1::0;;;9247:77:39::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9354:48;9366:4;9372:15;9389:12;9354:11;:48::i;:::-;-1:-1:-1::0;;;;;9433:51:39;::::2;;9485:12;:10;:12::i;:::-;9433:79;::::0;;-1:-1:-1;;;;;;9433:79:39::2;::::0;;;;;;-1:-1:-1;;;;;9433:79:39;;::::2;;::::0;::::2;::::0;;;::::2;::::0;;;;;;;;;;;;;;;;-1:-1:-1;;9433:79:39;;;;;;;-1:-1:-1;9433:79:39;;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;9558:21;9582:19;9593:7;9582:6;:10;;:19;;;;:::i;:::-;9558:43;;9607:16;9626:22;9634:13;9626:7;:22::i;:::-;9607:41;;9655:37;9677:4;9683:8;9655;:6;:8::i;:37::-;-1:-1:-1::0;;;;;9704:81:39;;::::2;::::0;;::::2;9722:12;:10;:12::i;:::-;9704:81;::::0;;;;;::::2;::::0;::::2;::::0;;;;;;;;;;;-1:-1:-1;;;;;9704:81:39;;;::::2;::::0;::::2;::::0;;;;;;;::::2;-1:-1:-1::0;;1710:1:23;2798:7;:22;-1:-1:-1;9799:7:39;8890:921;-1:-1:-1;;;;;;8890:921:39:o;26123:455::-;26295:16;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;;;-1:-1:-1;;;35825:92:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;;;1558:12:0::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;1547:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;1547:23:0::1;;1539:68;;;::::0;;-1:-1:-1;;;1539:68:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;::::1;;26373:114:39::2;::::0;;;;::::2;::::0;;-1:-1:-1;;;;;26373:114:39;;::::2;::::0;;;;;::::2;;::::0;;::::2;::::0;;;-1:-1:-1;;;;;26335:35:39;::::2;-1:-1:-1::0;26335:35:39;;;:17:::2;:35:::0;;;;;:152;;;;;;-1:-1:-1;;26335:152:39;;::::2;::::0;;::::2;;::::0;::::2;::::0;;;::::2;-1:-1:-1::0;;;26335:152:39::2;;::::0;;;26499:74;;;;;;;::::2;::::0;;;;;;;;;;::::2;::::0;;;;;;;;::::2;26123:455:::0;;;;:::o;7162:74::-;7199:7;7221:10;:8;:10::i;1304:405:41:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1523:102:41::1;1551:16;1575:17;1600:19;1523:20;:102::i;:::-;1631:6;:16:::0;;-1:-1:-1;;;;;;1631:16:41::1;-1:-1:-1::0;;;;;1631:16:41;;::::1;::::0;;;::::1;::::0;;;;1659:45:::1;::::0;1696:6;::::1;::::0;1659:45:::1;::::0;-1:-1:-1;;1659:45:41::1;1794:14:9::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1790:66;1304:405:41;;;;;:::o;188:26:63:-;;;;:::o;26965:343:39:-;-1:-1:-1;;;;;27169:34:39;27071:27;27169:34;;;:17;:34;;;;;:54;-1:-1:-1;;;;;27169:54:39;;;;-1:-1:-1;;;27250:53:39;;;;;26965:343::o;492:104:63:-;548:7;570:21;578:12;570:7;:21::i;7917:469:39:-;1753:1:23;2495:7;;:19;;2487:63;;;;;-1:-1:-1;;;2487:63:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;1753:1;2625:7;:18;8090:15:39;35833:56:::1;8090:15:::0;35833:13:::1;:56::i;:::-;35825:92;;;::::0;;-1:-1:-1;;;35825:92:39;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;::::1;;8127:6:::2;36288:25;36305:7;36288:16;:25::i;:::-;36280:69;;;::::0;;-1:-1:-1;;;36280:69:39;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;8143:16:::3;8162:12;:10;:12::i;:::-;8143:31;;8181:44;8187:2;8191:6;8199:15;8216:8;8181:5;:44::i;:::-;8232:58;8258:8;8276:4;8283:6;8232:8;:6;:8::i;:::-;-1:-1:-1::0;;;;;8232:25:39::3;::::0;;:58;:25:::3;:58::i;:::-;8296:15;8304:6;8296:7;:15::i;:::-;8323:58;::::0;;;;;-1:-1:-1;;;;;8323:58:39;;::::3;;::::0;::::3;::::0;;;;;::::3;::::0;;;::::3;::::0;;;::::3;::::0;::::3;::::0;;;;;;;;;::::3;-1:-1:-1::0;;1710:1:23;2798:7;:22;-1:-1:-1;;;;;7917:469:39:o;12245:1028::-;12316:7;1753:1:23;2495:7;;:19;;2487:63;;;;;-1:-1:-1;;;2487:63:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;1753:1;2625:7;:18;12331:24:39::1;12358:19;:17;:19::i;:::-;12331:46;;12495:22;12520:10;:8;:10::i;:::-;12495:35;;12536:21;12578:16;12561:14;:33;12560:78;;12637:1;12560:78;;;12598:36;:14:::0;12617:16;12598:18:::1;:36::i;:::-;12536:102;;12644:31;12695:20;;12679:13;:36;12678:84;;12761:1;12678:84;;;12737:20;::::0;12719:39:::1;::::0;:13;;:17:::1;:39::i;:::-;12644:118:::0;-1:-1:-1;12773:27:39;;12769:466:::1;;12810:18;12831:44;12851:23;12831:19;:44::i;:::-;12810:65:::0;-1:-1:-1;12887:14:39;;12883:214:::1;;12934:18;::::0;:34:::1;::::0;12957:10;12934:22:::1;:34::i;:::-;12913:18;:55:::0;13004:39:::1;:23:::0;13032:10;13004:27:::1;:39::i;:::-;13058:30;::::0;;;;;;;12978:65;;-1:-1:-1;13058:30:39::1;::::0;;;;;::::1;::::0;;::::1;12883:214;13127:20;::::0;:49:::1;::::0;13152:23;13127:24:::1;:49::i;:::-;13104:20;:72:::0;13190:38:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;12769:466;;13248:20;;13241:27;;;;;;1710:1:23::0;2798:7;:22;12245:1028:39;:::o;5277:33::-;;;;:::o;2261:240:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;2349:22:0;::::1;2341:73;;;;-1:-1:-1::0;;;2341:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2450:6;::::0;2429:38:::1;::::0;-1:-1:-1;;;;;2429:38:0;;::::1;::::0;2450:6:::1;::::0;2429:38:::1;::::0;2450:6:::1;::::0;2429:38:::1;2477:6;:17:::0;;-1:-1:-1;;;;;;2477:17:0::1;-1:-1:-1::0;;;;;2477:17:0;;;::::1;::::0;;;::::1;::::0;;2261:240::o;6912:93:39:-;6961:7;6991:8;:6;:8::i;4615:40::-;;;;;;;;;;;;;-1:-1:-1;;;4615:40:39;;;;;:::o;32597:361::-;32649:7;32664:13;32680:18;;32664:34;;32704:40;32747:7;32704:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32704:50:39;;;-1:-1:-1;32704:50:39;;;;;;;;;;;;-1:-1:-1;;32794:13:39;;32704:50;;-1:-1:-1;32771:20:39;;-1:-1:-1;;;32818:117:39;32841:12;32837:1;:16;32818:117;;;32875:53;32903:6;32910:1;32903:9;;;;;;;;;;;;;;-1:-1:-1;;;;;32885:40:39;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32885:42:39;32875:5;;:9;:53::i;:::-;32867:61;-1:-1:-1;32855:3:39;;32818:117;;;-1:-1:-1;32948:5:39;;-1:-1:-1;;;32597:361:39;:::o;828:104:19:-;915:10;828:104;:::o;15853:343:39:-;15968:4;15990:32;16008:13;15990:17;:32::i;:::-;15982:77;;;;;-1:-1:-1;;;15982:77:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16070:11;16066:44;;-1:-1:-1;16098:5:39;16091:12;;16066:44;16116:57;-1:-1:-1;;;;;16116:45:39;;16162:2;16166:6;16116:45;:57::i;:::-;-1:-1:-1;16187:4:39;15853:343;;;;;;:::o;2569:140:41:-;2697:6;;-1:-1:-1;;;;;2671:33:41;;;2697:6;;2671:33;;;2569:140::o;2159:179::-;2245:6;;2216:45;;-1:-1:-1;;;;;2245:6:41;2254;2216:8;:6;:8::i;:::-;-1:-1:-1;;;;;2216:20:41;;;;:45::i;:::-;2275:6;;:19;;;-1:-1:-1;;;2275:19:41;;;;;;;;;;-1:-1:-1;;;;;2275:6:41;;;;:11;;:19;;;;;;;;;;;;;;;-1:-1:-1;2275:6:41;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2275:19:41;:24;2267:66;;;;;-1:-1:-1;;;2267:66:41;;;;;;;;;;;;;;;;;;;;;;;;;;;1952:123:9;2000:4;2024:44;2062:4;2024:29;:44::i;:::-;2023:45;2016:52;;1952:123;:::o;29798:280:39:-;29908:29;;;-1:-1:-1;;;29908:29:39;;;;29941:4;;-1:-1:-1;;;;;29908:27:39;;;;;:29;;;;;;;;;;;;;;;:27;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29908:29:39;-1:-1:-1;;;;;29908:37:39;;29900:80;;;;;-1:-1:-1;;;29900:80:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;30008:16;29991:7;29999:5;29991:14;;;;;;;;;;;;;;;;:33;;-1:-1:-1;;;;;;29991:33:39;-1:-1:-1;;;;;29991:33:39;;;;;;30035:38;;;;;;;;29991:14;30035:38;29798:280;;:::o;935:126:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;992:26:0::1;:24;:26::i;:::-;1028;:24;:26::i;:::-;1794:14:9::0;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;935:126:0:o;1791:106:23:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1856:34:23::1;:32;:34::i;29499:138:39:-:0;29563:12;:28;;;29602:30;;;;;;;;;;;;;;;;;29499:138;:::o;33600:331::-;33688:4;33700:40;33743:7;33700:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33700:50:39;;;-1:-1:-1;33700:50:39;;;;;;;;;;;;-1:-1:-1;;33788:13:39;;33700:50;;-1:-1:-1;33765:20:39;;-1:-1:-1;;;33808:101:39;33831:12;33827:1;:16;33808:101;;;33861:9;;-1:-1:-1;;;;;33861:28:39;;;:6;;33868:1;;33861:9;;;;;;;;;;;;-1:-1:-1;;;;;33861:28:39;;33858:44;;;33898:4;33891:11;;;;;;;33858:44;33845:3;;33808:101;;;-1:-1:-1;33921:5:39;;33600:331;-1:-1:-1;;;;33600:331:39:o;21947:275::-;22071:146;22099:4;22111:15;22134:77;22158:4;22164:15;22181:22;22205:5;22134:23;:77::i;:::-;22071:20;:146::i;2976:348:41:-;3036:7;3051:28;3082:8;:6;:8::i;:::-;3113:35;;;-1:-1:-1;;;3113:35:41;;3142:4;3113:35;;;;;;3051:39;;-1:-1:-1;3096:14:41;;-1:-1:-1;;;;;3113:20:41;;;;;:35;;;;;;;;;;;;;;:20;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3113:35:41;3162:6;;:31;;;-1:-1:-1;;;3162:31:41;;;;;;;;;;3113:35;;-1:-1:-1;;;;;;3162:6:41;;;;-1:-1:-1;;3162:31:41;;;;;3113:35;;3162:31;;;;;;;;-1:-1:-1;3162:6:41;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3162:31:41;:36;3154:80;;;;;-1:-1:-1;;;3154:80:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;3255:35;;;-1:-1:-1;;;3255:35:41;;3284:4;3255:35;;;;;;3240:12;;3255:47;;3295:6;;-1:-1:-1;;;;;3255:20:41;;;;;:35;;;;;;;;;;;;;;;:20;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3255:35:41;;:39;:47::i;:::-;3240:62;2976:348;-1:-1:-1;;;;;2976:348:41:o;3469:125::-;3569:6;;:19;;;-1:-1:-1;;;3569:19:41;;;;3519:17;;-1:-1:-1;;;;;3569:6:41;;-1:-1:-1;;3569:19:41;;;;;;;;;;;;;;:6;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3569:19:41;;-1:-1:-1;3469:125:41;:::o;770:186:12:-;890:58;;;-1:-1:-1;;;;;890:58:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;890:58:12;-1:-1:-1;;;890:58:12;;;863:86;;883:5;;863:19;:86::i;3147:155:8:-;3205:7;3237:1;3232;:6;;3224:49;;;;;-1:-1:-1;;;3224:49:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3290:5:8;;;3147:155;;;;;:::o;16533:295:39:-;16646:13;;-1:-1:-1;;;;;16646:13:39;16638:36;16634:125;;16684:13;;:68;;;-1:-1:-1;;;16684:68:39;;-1:-1:-1;;;;;16684:68:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;;;;;:29;;:68;;;;;-1:-1:-1;;16684:68:39;;;;;;;-1:-1:-1;16684:13:39;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16634:125;16764:59;;;-1:-1:-1;;;16764:59:39;;-1:-1:-1;;;;;16764:59:39;;;;;;;;;;;;;;;:47;;;;;;:59;;;;;-1:-1:-1;;16764:59:39;;;;;;;;-1:-1:-1;16764:47:39;:59;;;;;;;;;;19258:269;-1:-1:-1;;;;;19461:34:39;;19362:7;19461:34;;;:17;:34;;;;;:54;19384:138;;19405:6;;19419:97;;19405:6;;-1:-1:-1;;;;;19461:54:39;19419:33;:97::i;:::-;19384:13;:138::i;20592:520::-;-1:-1:-1;;;;;20953:35:39;;20744:23;20953:35;;;:17;:35;;;;;:54;20744:23;;20907:101;;20941:10;;-1:-1:-1;;;20953:54:39;;-1:-1:-1;;;;;20953:54:39;20907:33;:101::i;:::-;20880:128;-1:-1:-1;21018:21:39;21014:50;;21056:1;21049:8;;;;;21014:50;21076:31;:9;21090:16;21076:13;:31::i;22226:598::-;-1:-1:-1;;;;;22445:37:39;;;22368:7;22445:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;22499:25;;22368:7;;22445:43;-1:-1:-1;;;22499:25:39;;;;22494:303;;22547:1;22534:14;;22494:303;;;22569:14;22586:70;22610:4;22616:15;22633:22;22586:23;:70::i;:::-;22744:21;;22569:87;;-1:-1:-1;22677:113:39;;22695:15;;22712:22;;22736:53;;22783:5;;22736:42;;-1:-1:-1;;;;;22744:21:39;22569:87;22736:34;:42::i;:::-;:46;;:53::i;:::-;22677:17;:113::i;:::-;22664:126;;22494:303;;-1:-1:-1;22809:10:39;22226:598;-1:-1:-1;;;;;22226:598:39:o;23848:410::-;-1:-1:-1;;;;;24086:34:39;;23978:7;24086:34;;;:17;:34;;;;;:54;23978:7;;24015:131;;24056:22;;-1:-1:-1;;;;;24086:54:39;24015:33;:131::i;:::-;23993:153;;24172:11;24156:13;:27;24152:75;;;24209:11;24193:27;;24152:75;-1:-1:-1;24240:13:39;;23848:410;-1:-1:-1;;;23848:410:39:o;22828:604::-;-1:-1:-1;;;;;22953:37:39;;;22932:18;22953:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;:51;23057:129;;;;;;;;-1:-1:-1;;;;;22953:51:39;;23057:129;23088:22;:10;:20;:22::i;:::-;-1:-1:-1;;;;;23057:129:39;;;;;23129:25;:14;:12;:14::i;:::-;:23;:25::i;:::-;23057:129;;;;;;23175:4;23057:129;;;;;-1:-1:-1;;;;;23011:37:39;;;-1:-1:-1;23011:37:39;;;:20;:37;;;;;;:43;;;;;;;;;;;:175;;;;;;;;;;;;;-1:-1:-1;;;;;;23011:175:39;;;-1:-1:-1;;;;;23011:175:39;;;;;;;-1:-1:-1;;;;23011:175:39;-1:-1:-1;;;23011:175:39;;;;;;;;;-1:-1:-1;;;;23011:175:39;-1:-1:-1;;;23011:175:39;;;;;;;;;;23197:23;;;23193:235;;;-1:-1:-1;;;;;23235:63:39;;;;;;;23271:26;:10;23286;23271:14;:26::i;:::-;23235:63;;;;;;;;;;;;;;;23193:235;;;23333:10;23320;:23;23316:112;;;-1:-1:-1;;;;;23358:63:39;;;;;;;23394:26;:10;23409;23394:14;:26::i;:::-;23358:63;;;;;;;;;;;;;;;22828:604;;;;:::o;27741:1468::-;27989:50;;;-1:-1:-1;;;27989:50:39;;-1:-1:-1;;;;;27989:50:39;;;;;;;;;27893:20;;;;;;27989:44;;;;;;:50;;;;;;;;;;;;;;;:44;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27989:50:39;;-1:-1:-1;28053:32:39;;;;28045:67;;;;;-1:-1:-1;;;28045:67:39;;;;;;;;;;;;-1:-1:-1;;;28045:67:39;;;;;;;;;;;;;;;28118:63;28132:4;28138:15;28155:22;28179:1;28118:13;:63::i;:::-;28575:24;28602:83;28633:15;28650:34;:22;28677:6;28650:26;:34::i;:::-;28602:30;:83::i;:::-;-1:-1:-1;;;;;28725:37:39;;;28692:23;28725:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;:51;28575:110;;-1:-1:-1;28692:23:39;-1:-1:-1;;;;;28725:51:39;-1:-1:-1;;28721:192:39;;-1:-1:-1;;;;;28832:37:39;;;;;;;:20;:37;;;;;;;;:43;;;;;;;;;:51;28824:82;;-1:-1:-1;;;;;28832:51:39;28889:16;28824:64;:82::i;:::-;28806:100;;28721:192;28989:20;29012:55;29043:15;29060:6;29012:30;:55::i;:::-;28989:78;;29107:12;29089:15;:30;29088:65;;29138:15;29088:65;;;29123:12;29088:65;29073:80;-1:-1:-1;29174:30:39;:12;29073:80;29174:16;:30::i;:::-;29159:45;;27741:1468;;;;;;;;;;:::o;30497:405::-;-1:-1:-1;;;;;30586:37:39;;30578:82;;;;;-1:-1:-1;;;30578:82:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30674:98;-1:-1:-1;;;;;30674:41:39;;-1:-1:-1;;;;;;30674:41:39;:98::i;:::-;30666:142;;;;;-1:-1:-1;;;30666:142:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;30814:13;:30;;-1:-1:-1;;;;;;30814:30:39;-1:-1:-1;;;;;30814:30:39;;;;;;;;30856:41;;;;-1:-1:-1;;30856:41:39;30497:405;:::o;1967:201:26:-;2051:7;;2087:15;:8;2100:1;2087:12;:15::i;:::-;2070:32;-1:-1:-1;2121:17:26;2070:32;1149:4;2121:10;:17::i;21258:289:39:-;-1:-1:-1;;;;;21411:37:39;;;;;;;:20;:37;;;;;;;;:43;;;;;;;;;:51;21403:84;;:72;;-1:-1:-1;;;;;21411:51:39;21468:6;21403:64;:72::i;:::-;:82;:84::i;:::-;-1:-1:-1;;;;;21349:37:39;;;;;;;:20;:37;;;;;;;;:43;;;;;;;;;;;;;:138;;-1:-1:-1;;;;;;21349:138:39;-1:-1:-1;;;;;21349:138:39;;;;;;;;;;;21499:43;;;;;;;21349:37;;21499:43;;;;;;;;;21258:289;;;:::o;1845:115:41:-;1914:6;;:41;;;-1:-1:-1;;;1914:41:41;;1949:4;1914:41;;;;;;-1:-1:-1;;;;;;;1914:6:41;;-1:-1:-1;;1914:41:41;;;;;;;;;;;;;;-1:-1:-1;1914:6:41;:41;;;;;;;;;;;;;;;;;;;;;;;;;;33203:189:39;33269:4;33281:24;33308:19;:17;:19::i;:::-;33374:12;;33281:46;;-1:-1:-1;33341:29:39;33281:46;33362:7;33341:20;:29::i;:::-;:45;;;33203:189;-1:-1:-1;;;33203:189:39:o;962:214:12:-;1100:68;;;-1:-1:-1;;;;;1100:68:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1100:68:12;-1:-1:-1;;;1100:68:12;;;1073:96;;1093:5;;1073:19;:96::i;2701:175:8:-;2759:7;2790:5;;;2813:6;;;;2805:46;;;;;-1:-1:-1;;;2805:46:8;;;;;;;;;;;;;;;;;;;;;;;;;;;1436:624:12;1812:10;;;1811:62;;-1:-1:-1;1828:39:12;;;-1:-1:-1;;;1828:39:12;;1852:4;1828:39;;;;-1:-1:-1;;;;;1828:39:12;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1828:39:12;:44;1811:62;1803:150;;;;-1:-1:-1;;;1803:150:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1990:62;;;-1:-1:-1;;;;;1990:62:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1990:62:12;-1:-1:-1;;;1990:62:12;;;1963:90;;1983:5;;1963:19;:90::i;737:413:18:-;1097:20;1135:8;;;737:413::o;759:64:19:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1794:14;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;759:64:19:o;1067:192:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1134:17:0::1;1154:12;:10;:12::i;:::-;1176:6;:18:::0;;-1:-1:-1;;;;;;1176:18:0::1;-1:-1:-1::0;;;;;1176:18:0;::::1;::::0;;::::1;::::0;;;1209:43:::1;::::0;1176:18;;-1:-1:-1;1176:18:0;-1:-1:-1;;1209:43:0::1;::::0;-1:-1:-1;;1209:43:0::1;1778:1:9;1794:14:::0;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;1067:192:0:o;1903:104:23:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1710:1:23::1;1978:7;:22:::0;1790:66:9;;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;1903:104:23:o;3088:762:12:-;3544:69;;;;;;;;;;;;;;;;;;3518:23;;3544:69;;-1:-1:-1;;;;;3544:27:12;;;3572:4;;3544:27;:69::i;:::-;3627:17;;3518:95;;-1:-1:-1;3627:21:12;3623:221;;3767:10;3756:30;;;;;;;;;;;;;;;-1:-1:-1;3756:30:12;3748:85;;;;-1:-1:-1;;;3748:85:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10138:275:39;10227:7;10242:14;10259:71;10293:16;10311:18;;10259:33;:71::i;:::-;10242:88;;10350:6;10340:7;:16;10336:53;;;10376:6;10366:16;;10336:53;-1:-1:-1;10401:7:39;;10138:275;-1:-1:-1;;10138:275:39:o;4228:150:8:-;4286:7;4317:1;4313;:5;4305:44;;;;;-1:-1:-1;;;4305:44:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;4370:1;4366;:5;;;;;;;4228:150;-1:-1:-1;;;4228:150:8:o;24612:558:39:-;-1:-1:-1;;;;;24778:37:39;;;24739:7;24778:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;:53;-1:-1:-1;;;24778:53:39;;;;;-1:-1:-1;;;24843:55:39;;;;24838:85;;24915:1;24908:8;;;;;24838:85;24929:17;24949:33;24968:13;24949:14;:12;:14::i;:::-;:18;;:33::i;:::-;-1:-1:-1;;;;;25026:34:39;;24988:21;25026:34;;;:17;:34;;;;;:53;24929;;-1:-1:-1;24988:21:39;25012:68;;24929:53;;-1:-1:-1;;;25026:53:39;;-1:-1:-1;;;;;25026:53:39;25012:13;:68::i;:::-;24988:92;;25093:72;25127:22;25151:13;25093:33;:72::i;:::-;25086:79;24612:558;-1:-1:-1;;;;;;;24612:558:39:o;1097:181:24:-;1154:7;-1:-1:-1;;;1181:14:24;;1173:67;;;;-1:-1:-1;;;1173:67:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1265:5:24;1097:181::o;315:94:63:-;393:11;;315:94;:::o;2028:176:24:-;2084:6;-1:-1:-1;2110:13:24;;2102:65;;;;-1:-1:-1;;;2102:65:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1369:286:5;1456:4;1563:23;1578:7;1563:14;:23::i;:::-;:85;;;;;1602:46;1627:7;1636:11;1602:24;:46::i;2266:459:27:-;2324:7;2565:6;2561:45;;-1:-1:-1;2594:1:27;2587:8;;2561:45;2628:5;;;2632:1;2628;:5;:1;2651:5;;;;;:10;2643:56;;;;-1:-1:-1;;;2643:56:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3187:130;3245:7;3271:39;3275:1;3278;3271:39;;;;;;;;;;;;;;;;;:3;:39::i;3592:193:18:-;3695:12;3726:52;3748:6;3756:4;3762:1;3765:12;3726:21;:52::i;757:394:5:-;821:4;1016:55;1041:7;-1:-1:-1;;;1016:24:5;:55::i;:::-;:128;;;;-1:-1:-1;1088:56:5;1113:7;-1:-1:-1;;;;;;1088:24:5;:56::i;:::-;1087:57;;757:394;-1:-1:-1;;757:394:5:o;4243:395::-;4336:4;4515:12;4529:11;4544:50;4573:7;4582:11;4544:28;:50::i;:::-;4514:80;;;;4613:7;:17;;;;-1:-1:-1;4624:6:5;4605:26;-1:-1:-1;;;;4243:395:5:o;3799:272:27:-;3885:7;3919:12;3912:5;3904:28;;;;-1:-1:-1;;;3904:28:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3942:9;3958:1;3954;:5;;;;;;;3799:272;-1:-1:-1;;;;;3799:272:27:o;4619:523:18:-;4746:12;4803:5;4778:21;:30;;4770:81;;;;-1:-1:-1;;;4770:81:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4869:18;4880:6;4869:10;:18::i;:::-;4861:60;;;;;-1:-1:-1;;;4861:60:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;4992:12;5006:23;5033:6;-1:-1:-1;;;;;5033:11:18;5053:5;5061:4;5033:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5033:33:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4991:75;;;;5083:52;5101:7;5110:10;5122:12;5083:17;:52::i;5155:444:5:-;5331:57;;;-1:-1:-1;;;;;;5331:57:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5331:57:5;-1:-1:-1;;;5331:57:5;;;5436:47;;;;-1:-1:-1;;;;5331:57:5;-1:-1:-1;;5302:26:5;;-1:-1:-1;;;;;5436:18:5;;;5461:5;;5331:57;;5436:47;;;;5331:57;5436:47;;;;;;;;;;-1:-1:-1;;5436:47:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5398:85;;;;5513:2;5497:6;:13;:18;5493:45;;;5525:5;5532;5517:21;;;;;;;;;5493:45;5556:7;5576:6;5565:26;;;;;;;;;;;;;;;-1:-1:-1;5565:26:5;5548:44;;-1:-1:-1;5565:26:5;-1:-1:-1;;;;5155:444:5;;;;;;:::o;6122:725:18:-;6237:12;6265:7;6261:580;;;-1:-1:-1;6295:10:18;6288:17;;6261:580;6406:17;;:21;6402:429;;6664:10;6658:17;6724:15;6711:10;6707:2;6703:19;6696:44;6613:145;6796:20;;-1:-1:-1;;;6796:20:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6796:20:18;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "3523400",
                "executionCost": "3949",
                "totalCost": "3527349"
              },
              "external": {
                "VERSION()": "infinite",
                "accountedBalance()": "infinite",
                "award(address,uint256,address)": "infinite",
                "awardBalance()": "1066",
                "awardExternalERC20(address,address,uint256)": "infinite",
                "awardExternalERC721(address,address,uint256[])": "infinite",
                "balance()": "infinite",
                "balanceOfCredit(address,address)": "infinite",
                "beforeTokenTransfer(address,address,uint256)": "infinite",
                "cToken()": "1127",
                "calculateEarlyExitFee(address,address,uint256)": "infinite",
                "calculateReserveFee(uint256)": "infinite",
                "canAwardExternal(address)": "1256",
                "captureAwardBalance()": "infinite",
                "compLikeDelegate(address,address)": "infinite",
                "creditPlanOf(address)": "1357",
                "currentTime()": "1087",
                "depositTo(address,uint256,address,address)": "infinite",
                "estimateCreditAccrualTime(address,uint256,uint256)": "infinite",
                "initialize(address,address[],uint256)": "infinite",
                "initialize(address,address[],uint256,address)": "infinite",
                "isControlled(address)": "infinite",
                "liquidityCap()": "1065",
                "maxExitFeeMantissa()": "1065",
                "onERC721Received(address,address,uint256,bytes)": "629",
                "owner()": "1105",
                "prizeStrategy()": "1171",
                "redeem(uint256)": "infinite",
                "renounceOwnership()": "infinite",
                "reserveRegistry()": "1127",
                "reserveTotalSupply()": "1086",
                "setCreditPlanOf(address,uint128,uint128)": "infinite",
                "setCurrentTime(uint256)": "20324",
                "setLiquidityCap(uint256)": "infinite",
                "setPrizeStrategy(address)": "infinite",
                "supply(uint256)": "infinite",
                "token()": "infinite",
                "tokens()": "infinite",
                "transferExternalERC20(address,address,uint256)": "infinite",
                "transferOwnership(address)": "infinite",
                "withdrawInstantlyFrom(address,uint256,address,uint256)": "infinite",
                "withdrawReserve(address)": "infinite"
              },
              "internal": {
                "_currentTime()": "815"
              }
            },
            "methodIdentifiers": {
              "VERSION()": "ffa1ad74",
              "accountedBalance()": "0937eb54",
              "award(address,uint256,address)": "6b1b863a",
              "awardBalance()": "630665b4",
              "awardExternalERC20(address,address,uint256)": "2b0ab144",
              "awardExternalERC721(address,address,uint256[])": "16960d55",
              "balance()": "b69ef8a8",
              "balanceOfCredit(address,address)": "494de9f7",
              "beforeTokenTransfer(address,address,uint256)": "7cbab1c7",
              "cToken()": "69e527da",
              "calculateEarlyExitFee(address,address,uint256)": "888c2b6f",
              "calculateReserveFee(uint256)": "9fe32a91",
              "canAwardExternal(address)": "6a3fd4f9",
              "captureAwardBalance()": "e6d8a94b",
              "compLikeDelegate(address,address)": "2f7627e3",
              "creditPlanOf(address)": "d4a1361d",
              "currentTime()": "d18e81b3",
              "depositTo(address,uint256,address,address)": "e323f825",
              "estimateCreditAccrualTime(address,uint256,uint256)": "79cb8563",
              "initialize(address,address[],uint256)": "3ede50c6",
              "initialize(address,address[],uint256,address)": "c5871485",
              "isControlled(address)": "78b3d327",
              "liquidityCap()": "76687d3d",
              "maxExitFeeMantissa()": "9e167519",
              "onERC721Received(address,address,uint256,bytes)": "150b7a02",
              "owner()": "8da5cb5b",
              "prizeStrategy()": "98bf3eb6",
              "redeem(uint256)": "db006a75",
              "renounceOwnership()": "715018a6",
              "reserveRegistry()": "8e71c1f6",
              "reserveTotalSupply()": "edb4e1cf",
              "setCreditPlanOf(address,uint128,uint128)": "a7b2cc31",
              "setCurrentTime(uint256)": "22f8e566",
              "setLiquidityCap(uint256)": "7b99adb1",
              "setPrizeStrategy(address)": "91ca480e",
              "supply(uint256)": "35403023",
              "token()": "fc0c546a",
              "tokens()": "9d63848a",
              "transferExternalERC20(address,address,uint256)": "13f55e39",
              "transferOwnership(address)": "f2fde38b",
              "withdrawInstantlyFrom(address,uint256,address,uint256)": "a016240b",
              "withdrawReserve(address)": "52a387ab"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"AwardCaptured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Awarded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"AwardedExternalERC20\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"AwardedExternalERC721\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"cToken\",\"type\":\"address\"}],\"name\":\"CompoundPrizePoolInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract ControlledTokenInterface\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"ControlledTokenAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CreditBurned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CreditMinted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"creditLimitMantissa\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"creditRateMantissa\",\"type\":\"uint128\"}],\"name\":\"CreditPlanSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ErrorAwardingExternalERC721\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"reserveRegistry\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxExitFeeMantissa\",\"type\":\"uint256\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"redeemed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"exitFee\",\"type\":\"uint256\"}],\"name\":\"InstantWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"liquidityCap\",\"type\":\"uint256\"}],\"name\":\"LiquidityCapSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"prizeStrategy\",\"type\":\"address\"}],\"name\":\"PrizeStrategySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ReserveFeeCaptured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ReserveWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferredExternalERC20\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accountedBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"awardBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"awardExternalERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"awardExternalERC721\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"balance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"balanceOfCredit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"beforeTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cToken\",\"outputs\":[{\"internalType\":\"contract CTokenInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"calculateEarlyExitFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"exitFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"burnedCredit\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"calculateReserveFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_externalToken\",\"type\":\"address\"}],\"name\":\"canAwardExternal\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"captureAwardBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ICompLike\",\"name\":\"compLike\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"compLikeDelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"creditPlanOf\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"creditLimitMantissa\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"creditRateMantissa\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_principal\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_interest\",\"type\":\"uint256\"}],\"name\":\"estimateCreditAccrualTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"durationSeconds\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"_reserveRegistry\",\"type\":\"address\"},{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"_controlledTokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_maxExitFeeMantissa\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"_reserveRegistry\",\"type\":\"address\"},{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"_controlledTokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_maxExitFeeMantissa\",\"type\":\"uint256\"},{\"internalType\":\"contract CTokenInterface\",\"name\":\"_cToken\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ControlledTokenInterface\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"isControlled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"liquidityCap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxExitFeeMantissa\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizeStrategy\",\"outputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"redeemAmount\",\"type\":\"uint256\"}],\"name\":\"redeem\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reserveRegistry\",\"outputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reserveTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"_creditRateMantissa\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"_creditLimitMantissa\",\"type\":\"uint128\"}],\"name\":\"setCreditPlanOf\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_currentTime\",\"type\":\"uint256\"}],\"name\":\"setCurrentTime\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_liquidityCap\",\"type\":\"uint256\"}],\"name\":\"setLiquidityCap\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"_prizeStrategy\",\"type\":\"address\"}],\"name\":\"setPrizeStrategy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"mintAmount\",\"type\":\"uint256\"}],\"name\":\"supply\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokens\",\"outputs\":[{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferExternalERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maximumExitFee\",\"type\":\"uint256\"}],\"name\":\"withdrawInstantlyFrom\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawReserve\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"accountedBalance()\":{\"returns\":{\"_0\":\"The current total of all tokens\"}},\"award(address,uint256,address)\":{\"details\":\"The amount awarded must be less than the awardBalance()\",\"params\":{\"amount\":\"The amount of assets to be awarded\",\"controlledToken\":\"The address of the asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"awardBalance()\":{\"details\":\"captureAwardBalance() should be called first\",\"returns\":{\"_0\":\"The total amount of assets to be awarded for the current prize\"}},\"awardExternalERC20(address,address,uint256)\":{\"details\":\"Used to award any arbitrary tokens held by the Prize Pool\",\"params\":{\"amount\":\"The amount of external assets to be awarded\",\"externalToken\":\"The address of the external asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"awardExternalERC721(address,address,uint256[])\":{\"details\":\"Used to award any arbitrary NFTs held by the Prize Pool\",\"params\":{\"externalToken\":\"The address of the external NFT token being awarded\",\"to\":\"The address of the winner that receives the award\",\"tokenIds\":\"An array of NFT Token IDs to be transferred\"}},\"balance()\":{\"details\":\"Returns the total underlying balance of all assets. This includes both principal and interest.\",\"returns\":{\"_0\":\"The underlying balance of assets\"}},\"balanceOfCredit(address,address)\":{\"params\":{\"user\":\"The user whose credit balance should be returned\"},\"returns\":{\"_0\":\"The balance of the users credit\"}},\"beforeTokenTransfer(address,address,uint256)\":{\"params\":{\"amount\":\"The amount of tokens being trasferred\",\"from\":\"The address the tokens are being transferred from (0 if minting)\",\"to\":\"The address the tokens are being transferred to (0 if burning)\"}},\"calculateEarlyExitFee(address,address,uint256)\":{\"params\":{\"amount\":\"The amount of collateral to be withdrawn\",\"controlledToken\":\"The type of collateral being withdrawn\",\"from\":\"The user who is withdrawing\"},\"returns\":{\"burnedCredit\":\"The user's credit that was burned\",\"exitFee\":\"The exit fee\"}},\"calculateReserveFee(uint256)\":{\"params\":{\"amount\":\"The prize amount\"},\"returns\":{\"_0\":\"The size of the reserve portion of the prize\"}},\"canAwardExternal(address)\":{\"details\":\"Checks with the Prize Pool if a specific token type may be awarded as an external prize\",\"params\":{\"_externalToken\":\"The address of the token to check\"},\"returns\":{\"_0\":\"True if the token may be awarded, false otherwise\"}},\"captureAwardBalance()\":{\"details\":\"This function also captures the reserve fees.\",\"returns\":{\"_0\":\"The total amount of assets to be awarded for the current prize\"}},\"compLikeDelegate(address,address)\":{\"params\":{\"compLike\":\"The COMP-like token held by the prize pool that should be delegated\",\"to\":\"The address to delegate to \"}},\"creditPlanOf(address)\":{\"params\":{\"controlledToken\":\"The controlled token to retrieve the credit rates for\"},\"returns\":{\"creditLimitMantissa\":\"The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\",\"creditRateMantissa\":\"The credit rate. This is the amount of tokens that accrue per second.\"}},\"depositTo(address,uint256,address,address)\":{\"params\":{\"amount\":\"The amount of assets to deposit\",\"controlledToken\":\"The address of the type of token the user is minting\",\"referrer\":\"The referrer of the deposit\",\"to\":\"The address receiving the newly minted tokens\"}},\"estimateCreditAccrualTime(address,uint256,uint256)\":{\"params\":{\"_interest\":\"The amount of interest that must accrue\",\"_principal\":\"The principal amount on which interest is accruing\"},\"returns\":{\"durationSeconds\":\"The duration of time it will take to accrue the given amount of interest, in seconds.\"}},\"initialize(address,address[],uint256)\":{\"params\":{\"_controlledTokens\":\"Array of ControlledTokens that are controlled by this Prize Pool.\",\"_maxExitFeeMantissa\":\"The maximum exit fee size\"}},\"initialize(address,address[],uint256,address)\":{\"params\":{\"_cToken\":\"Address of the Compound cToken interface\",\"_controlledTokens\":\"Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\",\"_maxExitFeeMantissa\":\"The maximum exit fee size, relative to the withdrawal amount\"}},\"isControlled(address)\":{\"details\":\"Checks if a specific token is controlled by the Prize Pool\",\"params\":{\"controlledToken\":\"The address of the token to check\"},\"returns\":{\"_0\":\"True if the token is a controlled token, false otherwise\"}},\"onERC721Received(address,address,uint256,bytes)\":{\"params\":{\"data\":\"Additional data with no specified format, sent in call to `_to`.\",\"from\":\"The current owner of the NFT\",\"operator\":\"The address that acts on behalf of the owner\",\"tokenId\":\"The NFT to transfer\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setCreditPlanOf(address,uint128,uint128)\":{\"params\":{\"_controlledToken\":\"The controlled token for whom to set the credit plan\",\"_creditLimitMantissa\":\"The credit limit to set.  Is a fixed point 18 decimal (like Ether).\",\"_creditRateMantissa\":\"The credit rate to set.  Is a fixed point 18 decimal (like Ether).\"}},\"setLiquidityCap(uint256)\":{\"params\":{\"_liquidityCap\":\"The new liquidity cap for the prize pool\"}},\"setPrizeStrategy(address)\":{\"params\":{\"_prizeStrategy\":\"The new prize strategy\"}},\"token()\":{\"details\":\"Returns the address of the underlying ERC20 asset\",\"returns\":{\"_0\":\"The address of the asset\"}},\"tokens()\":{\"returns\":{\"_0\":\"An array of controlled token addresses\"}},\"transferExternalERC20(address,address,uint256)\":{\"details\":\"Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\",\"params\":{\"amount\":\"The amount of external assets to be awarded\",\"externalToken\":\"The address of the external asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"withdrawInstantlyFrom(address,uint256,address,uint256)\":{\"params\":{\"amount\":\"The amount of tokens to redeem for assets.\",\"controlledToken\":\"The address of the token to redeem (i.e. ticket or sponsorship)\",\"from\":\"The address to redeem tokens from.\",\"maximumExitFee\":\"The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\"},\"returns\":{\"_0\":\"The actual exit fee paid\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"VERSION()\":{\"notice\":\"Semver Version\"},\"accountedBalance()\":{\"notice\":\"The total of all controlled tokens\"},\"award(address,uint256,address)\":{\"notice\":\"Called by the prize strategy to award prizes.\"},\"awardBalance()\":{\"notice\":\"Returns the balance that is available to award.\"},\"awardExternalERC20(address,address,uint256)\":{\"notice\":\"Called by the Prize-Strategy to award external ERC20 prizes\"},\"awardExternalERC721(address,address,uint256[])\":{\"notice\":\"Called by the prize strategy to award external ERC721 prizes\"},\"balanceOfCredit(address,address)\":{\"notice\":\"Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\"},\"beforeTokenTransfer(address,address,uint256)\":{\"notice\":\"Updates the Prize Strategy when tokens are transferred between holders.\"},\"cToken()\":{\"notice\":\"Interface for the Yield-bearing cToken by Compound\"},\"calculateEarlyExitFee(address,address,uint256)\":{\"notice\":\"Calculates the early exit fee for the given amount\"},\"calculateReserveFee(uint256)\":{\"notice\":\"Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\"},\"captureAwardBalance()\":{\"notice\":\"Captures any available interest as award balance.\"},\"compLikeDelegate(address,address)\":{\"notice\":\"Delegate the votes for a Compound COMP-like token held by the prize pool\"},\"creditPlanOf(address)\":{\"notice\":\"Returns the credit rate of a controlled token\"},\"depositTo(address,uint256,address,address)\":{\"notice\":\"Deposit assets into the Prize Pool in exchange for tokens\"},\"estimateCreditAccrualTime(address,uint256,uint256)\":{\"notice\":\"Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\"},\"initialize(address,address[],uint256)\":{\"notice\":\"Initializes the Prize Pool\"},\"initialize(address,address[],uint256,address)\":{\"notice\":\"Initializes the Prize Pool and Yield Service with the required contract connections\"},\"onERC721Received(address,address,uint256,bytes)\":{\"notice\":\"Required for ERC721 safe token transfers from smart contracts.\"},\"setCreditPlanOf(address,uint128,uint128)\":{\"notice\":\"Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\"},\"setLiquidityCap(uint256)\":{\"notice\":\"Allows the Governor to set a cap on the amount of liquidity that he pool can hold\"},\"setPrizeStrategy(address)\":{\"notice\":\"Sets the prize strategy of the prize pool.  Only callable by the owner.\"},\"tokens()\":{\"notice\":\"An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\"},\"transferExternalERC20(address,address,uint256)\":{\"notice\":\"Called by the Prize-Strategy to transfer out external ERC20 tokens\"},\"withdrawInstantlyFrom(address,uint256,address,uint256)\":{\"notice\":\"Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/CompoundPrizePoolHarness.sol\":\"CompoundPrizePoolHarness\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"contracts/external/compound/CTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface CTokenInterface is IERC20Upgradeable {\\n    function decimals() external view returns (uint8);\\n    function totalSupply() external override view returns (uint256);\\n    function underlying() external view returns (address);\\n    function balanceOfUnderlying(address owner) external returns (uint256);\\n    function supplyRatePerBlock() external returns (uint256);\\n    function exchangeRateCurrent() external returns (uint256);\\n    function mint(uint256 mintAmount) external returns (uint256);\\n    function redeem(uint256 amount) external returns (uint256);\\n    function balanceOf(address user) external override view returns (uint256);\\n    function redeemUnderlying(uint256 redeemAmount) external returns (uint256);\\n}\\n\",\"keccak256\":\"0x9608049458bc017f2369e2af2a20bfa2efaff1a5b451a17bd0594a976d5bc88f\",\"license\":\"GPL-3.0\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../external/compound/ICompLike.sol\\\";\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../reserve/ReserveInterface.sol\\\";\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/TokenListenerLibrary.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\nimport \\\"./PrizePoolInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using SafeERC20Upgradeable for IERC721Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    address reserveRegistry,\\n    uint256 maxExitFeeMantissa\\n  );\\n\\n  /// @dev Event emitted when controlled token is added\\n  event ControlledTokenAdded(\\n    ControlledTokenInterface indexed token\\n  );\\n\\n  /// @dev Emitted when reserve is captured.\\n  event ReserveFeeCaptured(\\n    uint256 amount\\n  );\\n\\n  event AwardCaptured(\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when assets are deposited\\n  event Deposited(\\n    address indexed operator,\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount,\\n    address referrer\\n  );\\n\\n  /// @dev Event emitted when interest is awarded to a winner\\n  event Awarded(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are awarded to a winner\\n  event AwardedExternalERC20(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are transferred out\\n  event TransferredExternalERC20(\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC721s are awarded to a winner\\n  event AwardedExternalERC721(\\n    address indexed winner,\\n    address indexed token,\\n    uint256[] tokenIds\\n  );\\n\\n  /// @dev Event emitted when assets are withdrawn instantly\\n  event InstantWithdrawal(\\n    address indexed operator,\\n    address indexed from,\\n    address indexed token,\\n    uint256 amount,\\n    uint256 redeemed,\\n    uint256 exitFee\\n  );\\n\\n  event ReserveWithdrawal(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when the Liquidity Cap is set\\n  event LiquidityCapSet(\\n    uint256 liquidityCap\\n  );\\n\\n  /// @dev Event emitted when the Credit plan is set\\n  event CreditPlanSet(\\n    address token,\\n    uint128 creditLimitMantissa,\\n    uint128 creditRateMantissa\\n  );\\n\\n  /// @dev Event emitted when the Prize Strategy is set\\n  event PrizeStrategySet(\\n    address indexed prizeStrategy\\n  );\\n\\n  /// @dev Emitted when credit is minted\\n  event CreditMinted(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when credit is burned\\n  event CreditBurned(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\\n  event ErrorAwardingExternalERC721(bytes error);\\n\\n\\n  struct CreditPlan {\\n    uint128 creditLimitMantissa;\\n    uint128 creditRateMantissa;\\n  }\\n\\n  struct CreditBalance {\\n    uint192 balance;\\n    uint32 timestamp;\\n    bool initialized;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  /// @dev Reserve to which reserve fees are sent\\n  RegistryInterface public reserveRegistry;\\n\\n  /// @dev An array of all the controlled tokens\\n  ControlledTokenInterface[] internal _tokens;\\n\\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\\n  TokenListenerInterface public prizeStrategy;\\n\\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\\n  /// For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\\n  uint256 public maxExitFeeMantissa;\\n\\n  /// @dev The total funds that have been allocated to the reserve\\n  uint256 public reserveTotalSupply;\\n\\n  /// @dev The total amount of funds that the prize pool can hold.\\n  uint256 public liquidityCap;\\n\\n  /// @dev the The awardable balance\\n  uint256 internal _currentAwardBalance;\\n\\n  /// @dev Stores the credit plan for each token.\\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\\n\\n  /// @dev Stores each users balance of credit per token.\\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\\n\\n  /// @notice Initializes the Prize Pool\\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\\n  /// @param _maxExitFeeMantissa The maximum exit fee size\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_reserveRegistry) != address(0), \\\"PrizePool/reserveRegistry-not-zero\\\");\\n    uint256 controlledTokensLength = _controlledTokens.length;\\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\\n\\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\\n      _addControlledToken(controlledToken, i);\\n    }\\n    __Ownable_init();\\n    __ReentrancyGuard_init();\\n    _setLiquidityCap(uint256(-1));\\n\\n    reserveRegistry = _reserveRegistry;\\n    maxExitFeeMantissa = _maxExitFeeMantissa;\\n\\n    emit Initialized(\\n      address(_reserveRegistry),\\n      maxExitFeeMantissa\\n    );\\n  }\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external override view returns (address) {\\n    return address(_token());\\n  }\\n\\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\\n  /// @return The underlying balance of assets\\n  function balance() external returns (uint256) {\\n    return _balance();\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function canAwardExternal(address _externalToken) external view returns (bool) {\\n    return _canAwardExternal(_externalToken);\\n  }\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    canAddLiquidity(amount)\\n  {\\n    address operator = _msgSender();\\n\\n    _mint(to, amount, controlledToken, referrer);\\n\\n    _token().safeTransferFrom(operator, address(this), amount);\\n    _supply(amount);\\n\\n    emit Deposited(operator, to, controlledToken, amount, referrer);\\n  }\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    returns (uint256)\\n  {\\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n    require(exitFee <= maximumExitFee, \\\"PrizePool/exit-fee-exceeds-user-maximum\\\");\\n\\n    // burn the credit\\n    _burnCredit(from, controlledToken, burnedCredit);\\n\\n    // burn the tickets\\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\\n\\n    // redeem the tickets less the fee\\n    uint256 amountLessFee = amount.sub(exitFee);\\n    uint256 redeemed = _redeem(amountLessFee);\\n\\n    _token().safeTransfer(from, redeemed);\\n\\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\\n\\n    return exitFee;\\n  }\\n\\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\\n  /// @param exitFee The exit fee to check against the limit\\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\\n    if (exitFee > maxFee) {\\n      exitFee = maxFee;\\n    }\\n    return exitFee;\\n  }\\n\\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\\n  /// @param from The address the tokens are being transferred from (0 if minting)\\n  /// @param to The address the tokens are being transferred to (0 if burning)\\n  /// @param amount The amount of tokens being trasferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\\n    if (from != address(0)) {\\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\\n      // first accrue credit for their old balance\\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\\n\\n      if (from != to) {\\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\\n      }\\n\\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\\n    }\\n    if (to != address(0) && to != from) {\\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\\n    }\\n    // if we aren't minting\\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\\n    }\\n  }\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external override view returns (uint256) {\\n    return _currentAwardBalance;\\n  }\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n\\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\\n    uint256 currentBalance = _balance();\\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\\n\\n    if (unaccountedPrizeBalance > 0) {\\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\\n      if (reserveFee > 0) {\\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\\n        emit ReserveFeeCaptured(reserveFee);\\n      }\\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\\n\\n      emit AwardCaptured(unaccountedPrizeBalance);\\n    }\\n\\n    return _currentAwardBalance;\\n  }\\n\\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\\n\\n    uint256 amount = reserveTotalSupply;\\n    reserveTotalSupply = 0;\\n    uint256 redeemed = _redeem(amount);\\n\\n    _token().safeTransfer(address(to), redeemed);\\n\\n    emit ReserveWithdrawal(to, amount);\\n\\n    return redeemed;\\n  }\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external override\\n    onlyPrizeStrategy\\n    onlyControlledToken(controlledToken)\\n  {\\n    if (amount == 0) {\\n      return;\\n    }\\n\\n    require(amount <= _currentAwardBalance, \\\"PrizePool/award-exceeds-avail\\\");\\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\\n\\n    _mint(to, amount, controlledToken, address(0));\\n\\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\\n\\n    emit Awarded(to, controlledToken, amount);\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit TransferredExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit AwardedExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  function _transferOut(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (bool)\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (amount == 0) {\\n      return false;\\n    }\\n\\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\\n\\n    return true;\\n  }\\n\\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\\n  /// @param to The user who is receiving the tokens\\n  /// @param amount The amount of tokens they are receiving\\n  /// @param controlledToken The token that is going to be minted\\n  /// @param referrer The user who referred the minting\\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\\n    if (address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n    ControlledToken(controlledToken).controllerMint(to, amount);\\n  }\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (tokenIds.length == 0) {\\n      return;\\n    }\\n\\n    for (uint256 i = 0; i < tokenIds.length; i++) {\\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\\n\\n      }\\n      catch(bytes memory error){\\n        emit ErrorAwardingExternalERC721(error);\\n      }\\n      \\n    }\\n\\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\\n  }\\n\\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\\n  /// @param amount The prize amount\\n  /// @return The size of the reserve portion of the prize\\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    if (address(reserve) == address(0)) {\\n      return 0;\\n    }\\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\\n    if (reserveRateMantissa == 0) {\\n      return 0;\\n    }\\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\\n  }\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external override\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    )\\n  {\\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n  }\\n\\n  /// @dev Calculates the early exit fee for the given amount\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return Exit fee\\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\\n    return _limitExitFee(\\n      amount,\\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external override\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    durationSeconds =_estimateCreditAccrualTime(\\n      _controlledToken,\\n      _principal,\\n      _interest\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function _estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    internal\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    // interest = credit rate * principal * time\\n    // => time = interest / (credit rate * principal)\\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\\n    if (accruedPerSecond == 0) {\\n      return 0;\\n    }\\n    return _interest.div(accruedPerSecond);\\n  }\\n\\n  /// @notice Burns a users credit.\\n  /// @param user The user whose credit should be burned\\n  /// @param credit The amount of credit to burn\\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\\n\\n    emit CreditBurned(user, controlledToken, credit);\\n  }\\n\\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\\n  /// @param user The user for whom to accrue credit\\n  /// @param controlledToken The controlled token whose balance we are checking\\n  /// @param controlledTokenBalance The balance to use for the user\\n  /// @param extra Additional credit to be added\\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\\n    _updateCreditBalance(\\n      user,\\n      controlledToken,\\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\\n    );\\n  }\\n\\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\\n    uint256 newBalance;\\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\\n    if (!creditBalance.initialized) {\\n      newBalance = 0;\\n    } else {\\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\\n    }\\n    return newBalance;\\n  }\\n\\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\\n\\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\\n      balance: newBalance.toUint128(),\\n      timestamp: _currentTime().toUint32(),\\n      initialized: true\\n    });\\n\\n    if (oldBalance < newBalance) {\\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\\n    } \\n    else if (newBalance < oldBalance) {\\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\\n    }\\n  }\\n\\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\\n  /// @param creditBalance The new credit balance to be checked\\n  /// @return The users new credit balance.  Will not exceed the credit limit.\\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\\n      controlledTokenBalance,\\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\\n    );\\n    if (creditBalance > creditLimit) {\\n      creditBalance = creditLimit;\\n    }\\n\\n    return creditBalance;\\n  }\\n\\n  /// @notice Calculates the accrued interest for a user\\n  /// @param user The user whose credit should be calculated.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\\n  /// @return The credit that has accrued since the last credit update.\\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\\n\\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\\n      return 0;\\n    }\\n\\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\\n  }\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\\n    return _tokenCreditBalances[controlledToken][user].balance;\\n  }\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external override\\n    onlyControlledToken(_controlledToken)\\n    onlyOwner\\n  {\\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\\n      creditLimitMantissa: _creditLimitMantissa,\\n      creditRateMantissa: _creditRateMantissa\\n    });\\n\\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\\n  }\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external override\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    )\\n  {\\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\\n  }\\n\\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The token they are withdrawing\\n  /// @param amount The amount of funds they are withdrawing\\n  /// @return earlyExitFee The additional exit fee that should be charged.\\n  /// @return creditBurned The amount of credit that will be burned\\n  function _calculateEarlyExitFeeLessBurnedCredit(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (\\n      uint256 earlyExitFee,\\n      uint256 creditBurned\\n    )\\n  {\\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\\n    require(controlledTokenBalance >= amount, \\\"PrizePool/insuff-funds\\\");\\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\\n    /*\\n    The credit is used *last*.  Always charge the fees up-front.\\n\\n    How to calculate:\\n\\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\\n\\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\\n    */\\n\\n    // Determine available usable credit based on withdraw amount\\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\\n\\n    uint256 availableCredit;\\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\\n    }\\n\\n    // Determine amount of credit to burn and amount of fees required\\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\\n    earlyExitFee = totalExitFee.sub(creditBurned);\\n  }\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\\n    _setLiquidityCap(_liquidityCap);\\n  }\\n\\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\\n    liquidityCap = _liquidityCap;\\n    emit LiquidityCapSet(_liquidityCap);\\n  }\\n\\n  /// @notice Adds a new controlled token\\n  /// @param _controlledToken The controlled token to add.\\n  /// @param index The index to add the controlledToken\\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\\n    require(_controlledToken.controller() == this, \\\"PrizePool/token-ctrlr-mismatch\\\");\\n    \\n    _tokens[index] = _controlledToken;\\n    emit ControlledTokenAdded(_controlledToken);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\\n    _setPrizeStrategy(_prizeStrategy);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\\n    require(address(_prizeStrategy) != address(0), \\\"PrizePool/prizeStrategy-not-zero\\\");\\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PrizePool/prizeStrategy-invalid\\\");\\n    prizeStrategy = _prizeStrategy;\\n\\n    emit PrizeStrategySet(address(_prizeStrategy));\\n  }\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\\n    return _tokens;\\n  }\\n\\n  /// @dev Gets the current time as represented by the current block\\n  /// @return The timestamp of the current block\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external override view returns (uint256) {\\n    return _tokenTotalSupply();\\n  }\\n\\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\\n  /// @param to The address to delegate to \\n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\\n    if (compLike.balanceOf(address(this)) > 0) {\\n      compLike.delegate(to);\\n    }\\n  }\\n  \\n  /// @notice Required for ERC721 safe token transfers from smart contracts.\\n  /// @param operator The address that acts on behalf of the owner\\n  /// @param from The current owner of the NFT\\n  /// @param tokenId The NFT to transfer\\n  /// @param data Additional data with no specified format, sent in call to `_to`.\\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function _tokenTotalSupply() internal view returns (uint256) {\\n    uint256 total = reserveTotalSupply;\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \\n    uint256 tokensLength = tokens.length;\\n    \\n    for(uint256 i = 0; i < tokensLength; i++){\\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\\n    }\\n\\n    return total;\\n  }\\n\\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\\n  }\\n\\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\\n    uint256 tokensLength = tokens.length;\\n\\n    for(uint256 i = 0; i < tokensLength; i++) {\\n      if(tokens[i] == controlledToken) return true;\\n    }\\n    return false;\\n  }\\n  \\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\\n    return _isControlled(controlledToken);\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function _token() internal virtual view returns (IERC20Upgradeable);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal virtual returns (uint256);\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal virtual;\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\\n\\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  modifier onlyControlledToken(address controlledToken) {\\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \\\"PrizePool/unknown-token\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure caller is the prize-strategy\\n  modifier onlyPrizeStrategy() {\\n    require(_msgSender() == address(prizeStrategy), \\\"PrizePool/only-prizeStrategy\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\\n  modifier canAddLiquidity(uint256 _amount) {\\n    require(_canAddLiquidity(_amount), \\\"PrizePool/exceeds-liquidity-cap\\\");\\n    _;\\n  }\\n\\n  modifier onlyReserve() {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    require(address(reserve) == msg.sender, \\\"PrizePool/only-reserve\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x386ebc1c80ab4424f14125e716dd12641ff933b475bf1082b7b1a6eee4a969c3\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/compound/CompoundPrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../../external/compound/CTokenInterface.sol\\\";\\nimport \\\"../PrizePool.sol\\\";\\n\\n/// @title Prize Pool with Compound's cToken\\n/// @notice Manages depositing and withdrawing assets from the Prize Pool\\ncontract CompoundPrizePool is PrizePool {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n\\n  event CompoundPrizePoolInitialized(address indexed cToken);\\n\\n  /// @notice Interface for the Yield-bearing cToken by Compound\\n  CTokenInterface public cToken;\\n\\n  /// @notice Initializes the Prize Pool and Yield Service with the required contract connections\\n  /// @param _controlledTokens Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\\n  /// @param _maxExitFeeMantissa The maximum exit fee size, relative to the withdrawal amount\\n  /// @param _cToken Address of the Compound cToken interface\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa,\\n    CTokenInterface _cToken\\n  )\\n    public\\n    initializer\\n  {\\n    PrizePool.initialize(\\n      _reserveRegistry,\\n      _controlledTokens,\\n      _maxExitFeeMantissa\\n    );\\n    cToken = _cToken;\\n\\n    emit CompoundPrizePoolInitialized(address(cToken));\\n  }\\n\\n  /// @dev Gets the balance of the underlying assets held by the Yield Service\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal override returns (uint256) {\\n    return cToken.balanceOfUnderlying(address(this));\\n  }\\n\\n  /// @dev Allows a user to supply asset tokens in exchange for yield-bearing tokens\\n  /// to be held in escrow by the Yield Service\\n  /// @param amount The amount of asset tokens to be supplied\\n  function _supply(uint256 amount) internal override {\\n    _token().safeApprove(address(cToken), amount);\\n    require(cToken.mint(amount) == 0, \\\"CompoundPrizePool/mint-failed\\\");\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as a prize enhancement\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal override view returns (bool) {\\n    return _externalToken != address(cToken);\\n  }\\n\\n  /// @dev Allows a user to redeem yield-bearing tokens in exchange for the underlying\\n  /// asset tokens held in escrow by the Yield Service\\n  /// @param amount The amount of underlying tokens to be redeemed\\n  /// @return The actual amount of tokens transferred\\n  function _redeem(uint256 amount) internal override returns (uint256) {\\n    IERC20Upgradeable assetToken = _token();\\n    uint256 before = assetToken.balanceOf(address(this));\\n    require(cToken.redeemUnderlying(amount) == 0, \\\"CompoundPrizePool/redeem-failed\\\");\\n    uint256 diff = assetToken.balanceOf(address(this)).sub(before);\\n    return diff;\\n  }\\n\\n  /// @dev Gets the underlying asset token used by the Yield Service\\n  /// @return A reference to the interface of the underling asset token\\n  function _token() internal override view returns (IERC20Upgradeable) {\\n    return IERC20Upgradeable(cToken.underlying());\\n  }\\n}\\n\",\"keccak256\":\"0x094f4926923fad2a264e41f6eaabc161dc9969a6db6dbf3a170c266d27162ab6\",\"license\":\"GPL-3.0\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/test/CompoundPrizePoolHarness.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"../prize-pool/compound/CompoundPrizePool.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ncontract CompoundPrizePoolHarness is CompoundPrizePool {\\n\\n  uint256 public currentTime;\\n\\n  function setCurrentTime(uint256 _currentTime) external {\\n    currentTime = _currentTime;\\n  }\\n\\n  function _currentTime() internal override view returns (uint256) {\\n    return currentTime;\\n  }\\n\\n  function supply(uint256 mintAmount) external {\\n    _supply(mintAmount);\\n  }\\n\\n  function redeem(uint256 redeemAmount) external returns (uint256) {\\n    return _redeem(redeemAmount);\\n  }\\n}\",\"keccak256\":\"0x96649ae18cf4768d63d5edd6d717254efaeaa08f40c8db2708c92ed1456e8286\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/test/CompoundPrizePoolHarness.sol:CompoundPrizePoolHarness",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/test/CompoundPrizePoolHarness.sol:CompoundPrizePoolHarness",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/test/CompoundPrizePoolHarness.sol:CompoundPrizePoolHarness",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 10,
                "contract": "contracts/test/CompoundPrizePoolHarness.sol:CompoundPrizePoolHarness",
                "label": "_owner",
                "offset": 0,
                "slot": "51",
                "type": "t_address"
              },
              {
                "astId": 129,
                "contract": "contracts/test/CompoundPrizePoolHarness.sol:CompoundPrizePoolHarness",
                "label": "__gap",
                "offset": 0,
                "slot": "52",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 4743,
                "contract": "contracts/test/CompoundPrizePoolHarness.sol:CompoundPrizePoolHarness",
                "label": "_status",
                "offset": 0,
                "slot": "101",
                "type": "t_uint256"
              },
              {
                "astId": 4786,
                "contract": "contracts/test/CompoundPrizePoolHarness.sol:CompoundPrizePoolHarness",
                "label": "__gap",
                "offset": 0,
                "slot": "102",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 6817,
                "contract": "contracts/test/CompoundPrizePoolHarness.sol:CompoundPrizePoolHarness",
                "label": "reserveRegistry",
                "offset": 0,
                "slot": "151",
                "type": "t_contract(RegistryInterface)12458"
              },
              {
                "astId": 6821,
                "contract": "contracts/test/CompoundPrizePoolHarness.sol:CompoundPrizePoolHarness",
                "label": "_tokens",
                "offset": 0,
                "slot": "152",
                "type": "t_array(t_contract(ControlledTokenInterface)15850)dyn_storage"
              },
              {
                "astId": 6824,
                "contract": "contracts/test/CompoundPrizePoolHarness.sol:CompoundPrizePoolHarness",
                "label": "prizeStrategy",
                "offset": 0,
                "slot": "153",
                "type": "t_contract(TokenListenerInterface)16265"
              },
              {
                "astId": 6827,
                "contract": "contracts/test/CompoundPrizePoolHarness.sol:CompoundPrizePoolHarness",
                "label": "maxExitFeeMantissa",
                "offset": 0,
                "slot": "154",
                "type": "t_uint256"
              },
              {
                "astId": 6830,
                "contract": "contracts/test/CompoundPrizePoolHarness.sol:CompoundPrizePoolHarness",
                "label": "reserveTotalSupply",
                "offset": 0,
                "slot": "155",
                "type": "t_uint256"
              },
              {
                "astId": 6833,
                "contract": "contracts/test/CompoundPrizePoolHarness.sol:CompoundPrizePoolHarness",
                "label": "liquidityCap",
                "offset": 0,
                "slot": "156",
                "type": "t_uint256"
              },
              {
                "astId": 6836,
                "contract": "contracts/test/CompoundPrizePoolHarness.sol:CompoundPrizePoolHarness",
                "label": "_currentAwardBalance",
                "offset": 0,
                "slot": "157",
                "type": "t_uint256"
              },
              {
                "astId": 6841,
                "contract": "contracts/test/CompoundPrizePoolHarness.sol:CompoundPrizePoolHarness",
                "label": "_tokenCreditPlans",
                "offset": 0,
                "slot": "158",
                "type": "t_mapping(t_address,t_struct(CreditPlan)6803_storage)"
              },
              {
                "astId": 6848,
                "contract": "contracts/test/CompoundPrizePoolHarness.sol:CompoundPrizePoolHarness",
                "label": "_tokenCreditBalances",
                "offset": 0,
                "slot": "159",
                "type": "t_mapping(t_address,t_mapping(t_address,t_struct(CreditBalance)6810_storage))"
              },
              {
                "astId": 8955,
                "contract": "contracts/test/CompoundPrizePoolHarness.sol:CompoundPrizePoolHarness",
                "label": "cToken",
                "offset": 0,
                "slot": "160",
                "type": "t_contract(CTokenInterface)6511"
              },
              {
                "astId": 12863,
                "contract": "contracts/test/CompoundPrizePoolHarness.sol:CompoundPrizePoolHarness",
                "label": "currentTime",
                "offset": 0,
                "slot": "161",
                "type": "t_uint256"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_contract(ControlledTokenInterface)15850)dyn_storage": {
                "base": "t_contract(ControlledTokenInterface)15850",
                "encoding": "dynamic_array",
                "label": "contract ControlledTokenInterface[]",
                "numberOfBytes": "32"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_contract(CTokenInterface)6511": {
                "encoding": "inplace",
                "label": "contract CTokenInterface",
                "numberOfBytes": "20"
              },
              "t_contract(ControlledTokenInterface)15850": {
                "encoding": "inplace",
                "label": "contract ControlledTokenInterface",
                "numberOfBytes": "20"
              },
              "t_contract(RegistryInterface)12458": {
                "encoding": "inplace",
                "label": "contract RegistryInterface",
                "numberOfBytes": "20"
              },
              "t_contract(TokenListenerInterface)16265": {
                "encoding": "inplace",
                "label": "contract TokenListenerInterface",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_mapping(t_address,t_struct(CreditBalance)6810_storage))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => struct PrizePool.CreditBalance))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_struct(CreditBalance)6810_storage)"
              },
              "t_mapping(t_address,t_struct(CreditBalance)6810_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct PrizePool.CreditBalance)",
                "numberOfBytes": "32",
                "value": "t_struct(CreditBalance)6810_storage"
              },
              "t_mapping(t_address,t_struct(CreditPlan)6803_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct PrizePool.CreditPlan)",
                "numberOfBytes": "32",
                "value": "t_struct(CreditPlan)6803_storage"
              },
              "t_struct(CreditBalance)6810_storage": {
                "encoding": "inplace",
                "label": "struct PrizePool.CreditBalance",
                "members": [
                  {
                    "astId": 6805,
                    "contract": "contracts/test/CompoundPrizePoolHarness.sol:CompoundPrizePoolHarness",
                    "label": "balance",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint192"
                  },
                  {
                    "astId": 6807,
                    "contract": "contracts/test/CompoundPrizePoolHarness.sol:CompoundPrizePoolHarness",
                    "label": "timestamp",
                    "offset": 24,
                    "slot": "0",
                    "type": "t_uint32"
                  },
                  {
                    "astId": 6809,
                    "contract": "contracts/test/CompoundPrizePoolHarness.sol:CompoundPrizePoolHarness",
                    "label": "initialized",
                    "offset": 28,
                    "slot": "0",
                    "type": "t_bool"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_struct(CreditPlan)6803_storage": {
                "encoding": "inplace",
                "label": "struct PrizePool.CreditPlan",
                "members": [
                  {
                    "astId": 6800,
                    "contract": "contracts/test/CompoundPrizePoolHarness.sol:CompoundPrizePoolHarness",
                    "label": "creditLimitMantissa",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint128"
                  },
                  {
                    "astId": 6802,
                    "contract": "contracts/test/CompoundPrizePoolHarness.sol:CompoundPrizePoolHarness",
                    "label": "creditRateMantissa",
                    "offset": 16,
                    "slot": "0",
                    "type": "t_uint128"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_uint128": {
                "encoding": "inplace",
                "label": "uint128",
                "numberOfBytes": "16"
              },
              "t_uint192": {
                "encoding": "inplace",
                "label": "uint192",
                "numberOfBytes": "24"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint32": {
                "encoding": "inplace",
                "label": "uint32",
                "numberOfBytes": "4"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "VERSION()": {
                "notice": "Semver Version"
              },
              "accountedBalance()": {
                "notice": "The total of all controlled tokens"
              },
              "award(address,uint256,address)": {
                "notice": "Called by the prize strategy to award prizes."
              },
              "awardBalance()": {
                "notice": "Returns the balance that is available to award."
              },
              "awardExternalERC20(address,address,uint256)": {
                "notice": "Called by the Prize-Strategy to award external ERC20 prizes"
              },
              "awardExternalERC721(address,address,uint256[])": {
                "notice": "Called by the prize strategy to award external ERC721 prizes"
              },
              "balanceOfCredit(address,address)": {
                "notice": "Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit."
              },
              "beforeTokenTransfer(address,address,uint256)": {
                "notice": "Updates the Prize Strategy when tokens are transferred between holders."
              },
              "cToken()": {
                "notice": "Interface for the Yield-bearing cToken by Compound"
              },
              "calculateEarlyExitFee(address,address,uint256)": {
                "notice": "Calculates the early exit fee for the given amount"
              },
              "calculateReserveFee(uint256)": {
                "notice": "Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero."
              },
              "captureAwardBalance()": {
                "notice": "Captures any available interest as award balance."
              },
              "compLikeDelegate(address,address)": {
                "notice": "Delegate the votes for a Compound COMP-like token held by the prize pool"
              },
              "creditPlanOf(address)": {
                "notice": "Returns the credit rate of a controlled token"
              },
              "depositTo(address,uint256,address,address)": {
                "notice": "Deposit assets into the Prize Pool in exchange for tokens"
              },
              "estimateCreditAccrualTime(address,uint256,uint256)": {
                "notice": "Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit."
              },
              "initialize(address,address[],uint256)": {
                "notice": "Initializes the Prize Pool"
              },
              "initialize(address,address[],uint256,address)": {
                "notice": "Initializes the Prize Pool and Yield Service with the required contract connections"
              },
              "onERC721Received(address,address,uint256,bytes)": {
                "notice": "Required for ERC721 safe token transfers from smart contracts."
              },
              "setCreditPlanOf(address,uint128,uint128)": {
                "notice": "Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether)."
              },
              "setLiquidityCap(uint256)": {
                "notice": "Allows the Governor to set a cap on the amount of liquidity that he pool can hold"
              },
              "setPrizeStrategy(address)": {
                "notice": "Sets the prize strategy of the prize pool.  Only callable by the owner."
              },
              "tokens()": {
                "notice": "An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)"
              },
              "transferExternalERC20(address,address,uint256)": {
                "notice": "Called by the Prize-Strategy to transfer out external ERC20 tokens"
              },
              "withdrawInstantlyFrom(address,uint256,address,uint256)": {
                "notice": "Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit."
              }
            },
            "version": 1
          }
        }
      },
      "contracts/test/CompoundPrizePoolHarnessProxyFactory.sol": {
        "CompoundPrizePoolHarnessProxyFactory": {
          "abi": [
            {
              "inputs": [],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "name": "ProxyCreated",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "create",
              "outputs": [
                {
                  "internalType": "contract CompoundPrizePoolHarness",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_logic",
                  "type": "address"
                },
                {
                  "internalType": "bytes",
                  "name": "_data",
                  "type": "bytes"
                }
              ],
              "name": "deployMinimal",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "instance",
              "outputs": [
                {
                  "internalType": "contract CompoundPrizePoolHarness",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "create()": {
                "returns": {
                  "_0": "A reference to the new proxied Compound Prize Pool"
                }
              }
            },
            "title": "Compound Prize Pool Proxy Factory",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5060405161001d9061005f565b604051809103906000f080158015610039573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b039290921691909117905561006c565b6144f1806103b283390190565b6103378061007b6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063022ec09514610046578063b3eeb5e21461006a578063efc81a8c14610120575b600080fd5b61004e610128565b604080516001600160a01b039092168252519081900360200190f35b61004e6004803603604081101561008057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100ab57600080fd5b8201836020820111156100bd57600080fd5b803590602001918460018302840111640100000000831117156100df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610137945050505050565b61004e6102b3565b6000546001600160a01b031681565b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a18251156102ac576000826001600160a01b0316846040518082805190602001908083835b602083106102035780518252601f1990920191602091820191016101e4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610265576040519150601f19603f3d011682016040523d82523d6000602084013e61026a565b606091505b50509050806102aa5760405162461bcd60e51b81526004018080602001828103825260248152602001806102de6024913960400191505060405180910390fd5b505b5092915050565b6000805460408051602081019091528281526102d8916001600160a01b031690610137565b90509056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a26469706673582212207641cad3a6c2a855e03369145b3325a086b8fb3f317cf56f8230d491a1adc15b64736f6c634300060c0033608060405234801561001057600080fd5b506144d1806100206000396000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c8063888c2b6f11610146578063b69ef8a8116100c3578063e323f82511610087578063e323f825146109a5578063e6d8a94b146109e1578063edb4e1cf146109e9578063f2fde38b146109f1578063fc0c546a14610a17578063ffa1ad7414610a1f5761025e565b8063b69ef8a814610864578063c58714851461086c578063d18e81b31461092b578063d4a1361d14610933578063db006a75146109885761025e565b80639d63848a1161010a5780639d63848a146107705780639e167519146107c85780639fe32a91146107d0578063a016240b146107ed578063a7b2cc31146108275761025e565b8063888c2b6f146106e35780638da5cb5b146107325780638e71c1f61461073a57806391ca480e1461074257806398bf3eb6146107685761025e565b806352a387ab116101df578063715018a6116101a3578063715018a61461062857806376687d3d1461063057806378b3d3271461063857806379cb85631461065e5780637b99adb1146106905780637cbab1c7146106ad5761025e565b806352a387ab14610566578063630665b41461058c57806369e527da146105945780636a3fd4f9146105b85780636b1b863a146105f25761025e565b80632b0ab144116102265780632b0ab144146104045780632f7627e31461043a57806335403023146104685780633ede50c614610485578063494de9f7146105385761025e565b80630937eb541461026357806313f55e391461027d578063150b7a02146102b557806316960d551461036057806322f8e566146103e7575b600080fd5b61026b610a9c565b60408051918252519081900360200190f35b6102b36004803603606081101561029357600080fd5b506001600160a01b03813581169160208101359091169060400135610aab565b005b610343600480360360808110156102cb57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561030557600080fd5b82018360208201111561031757600080fd5b803590602001918460018302840111600160201b8311171561033857600080fd5b509092509050610b69565b604080516001600160e01b03199092168252519081900360200190f35b6102b36004803603606081101561037657600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b8111156103a957600080fd5b8201836020820111156103bb57600080fd5b803590602001918460208302840111600160201b831117156103dc57600080fd5b509092509050610b7a565b6102b3600480360360208110156103fd57600080fd5b5035610e27565b6102b36004803603606081101561041a57600080fd5b506001600160a01b03813581169160208101359091169060400135610e2c565b6102b36004803603604081101561045057600080fd5b506001600160a01b0381358116916020013516610ee9565b6102b36004803603602081101561047e57600080fd5b5035611038565b6102b36004803603606081101561049b57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156104c557600080fd5b8201836020820111156104d757600080fd5b803590602001918460208302840111600160201b831117156104f857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611044915050565b61026b6004803603604081101561054e57600080fd5b506001600160a01b0381358116916020013516611236565b61026b6004803603602081101561057c57600080fd5b50356001600160a01b031661133d565b61026b61148c565b61059c611492565b604080516001600160a01b039092168252519081900360200190f35b6105de600480360360208110156105ce57600080fd5b50356001600160a01b03166114a1565b604080519115158252519081900360200190f35b6102b36004803603606081101561060857600080fd5b506001600160a01b038135811691602081013591604090910135166114b4565b6102b36116bc565b61026b611768565b6105de6004803603602081101561064e57600080fd5b50356001600160a01b031661176e565b61026b6004803603606081101561067457600080fd5b506001600160a01b038135169060208101359060400135611779565b6102b3600480360360208110156106a657600080fd5b503561178e565b6102b3600480360360608110156106c357600080fd5b506001600160a01b038135811691602081013590911690604001356117f9565b610719600480360360608110156106f957600080fd5b506001600160a01b03813581169160208101359091169060400135611a45565b6040805192835260208301919091528051918290030190f35b61059c611a5f565b61059c611a6e565b6102b36004803603602081101561075857600080fd5b50356001600160a01b0316611a7d565b61059c611ae8565b610778611af7565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156107b457818101518382015260200161079c565b505050509050019250505060405180910390f35b61026b611b59565b61026b600480360360208110156107e657600080fd5b5035611b5f565b61026b6004803603608081101561080357600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611c8d565b6102b36004803603606081101561083d57600080fd5b506001600160a01b03813516906001600160801b0360208201358116916040013516611ec4565b61026b61201a565b6102b36004803603608081101561088257600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156108ac57600080fd5b8201836020820111156108be57600080fd5b803590602001918460208302840111600160201b831117156108df57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602001356001600160a01b0316612024565b61026b612122565b6109596004803603602081101561094957600080fd5b50356001600160a01b0316612128565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b61026b6004803603602081101561099e57600080fd5b5035612158565b6102b3600480360360808110156109bb57600080fd5b506001600160a01b03813581169160208101359160408201358116916060013516612163565b61026b612318565b61026b61248e565b6102b360048036036020811015610a0757600080fd5b50356001600160a01b0316612494565b61059c612597565b610a276125a1565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610a61578181015183820152602001610a49565b50505050905090810190601f168015610a8e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610aa66125c2565b905090565b6099546001600160a01b0316610abf6126cd565b6001600160a01b031614610b08576040805162461bcd60e51b815260206004820152601c602482015260008051602061447c833981519152604482015290519081900360640190fd5b610b138383836126d1565b15610b6457816001600160a01b0316836001600160a01b03167fb0bac59718cd343c80a813518afcf36846cfcfe6d56e2b3cab9bd49f5f9b251c836040518082815260200191505060405180910390a35b505050565b630a85bd0160e11b95945050505050565b6099546001600160a01b0316610b8e6126cd565b6001600160a01b031614610bd7576040805162461bcd60e51b815260206004820152601c602482015260008051602061447c833981519152604482015290519081900360640190fd5b610be083612759565b610c31576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b80610c3b57610e21565b60005b81811015610da857836001600160a01b03166342842e0e3087868686818110610c6357fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610cc057600080fd5b505af1925050508015610cd1575060015b610da0573d808015610cff576040519150601f19603f3d011682016040523d82523d6000602084013e610d04565b606091505b507f17e975018310f88872b58d4d8263adca83cf5c1893496ea2a86923dab15276ad816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d64578181015183820152602001610d4c565b50505050905090810190601f168015610d915780820380516001836020036101000a031916815260200191505b509250505060405180910390a1505b600101610c3e565b50826001600160a01b0316846001600160a01b03167f69c2de32bc4d47f488e72626a6cfdee85089342e52675e7de79c4b417623960c848460405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a35b50505050565b60a155565b6099546001600160a01b0316610e406126cd565b6001600160a01b031614610e89576040805162461bcd60e51b815260206004820152601c602482015260008051602061447c833981519152604482015290519081900360640190fd5b610e948383836126d1565b15610b6457816001600160a01b0316836001600160a01b03167fc65f48aca3b7a99b7443d04b8ffbb073156179bc628dc3f7def5047748973469836040518082815260200191505060405180910390a3505050565b610ef16126cd565b6001600160a01b0316610f02611a5f565b6001600160a01b031614610f4b576040805162461bcd60e51b8152602060048201819052602482015260008051602061438f833981519152604482015290519081900360640190fd5b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f9a57600080fd5b505afa158015610fae573d6000803e3d6000fd5b505050506040513d6020811015610fc457600080fd5b5051111561103457816001600160a01b0316635c19a95c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561101b57600080fd5b505af115801561102f573d6000803e3d6000fd5b505050505b5050565b6110418161276e565b50565b600054610100900460ff168061105d575061105d612863565b8061106b575060005460ff16155b6110a65760405162461bcd60e51b815260040180806020018281038252602e815260200180614340602e913960400191505060405180910390fd5b600054610100900460ff161580156110d1576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0384166111165760405162461bcd60e51b81526004018080602001828103825260228152602001806142f86022913960400191505060405180910390fd5b82518067ffffffffffffffff8111801561112f57600080fd5b50604051908082528060200260200182016040528015611159578160200160208202803683370190505b50805161116e9160989160209091019061422f565b5060005b818110156111a557600085828151811061118857fe5b6020026020010151905061119c8183612874565b50600101611172565b506111ae61299f565b6111b6612a50565b6111c1600019612ae5565b609780546001600160a01b0319166001600160a01b038716908117909155609a849055604080519182526020820185905280517f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce799281900390910190a1508015610e21576000805461ff001916905550505050565b60008161124281612b20565b611281576040805162461bcd60e51b815260206004820152601760248201526000805160206143d6833981519152604482015290519081900360640190fd5b6113068484856001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112d357600080fd5b505afa1580156112e7573d6000803e3d6000fd5b505050506040513d60208110156112fd57600080fd5b50516000612bdc565b50506001600160a01b039081166000908152609f60209081526040808320949093168252929092529020546001600160c01b031690565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561138e57600080fd5b505afa1580156113a2573d6000803e3d6000fd5b505050506040513d60208110156113b857600080fd5b505190506001600160a01b0381163314611412576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f6f6e6c792d7265736572766560501b604482015290519081900360640190fd5b609b80546000918290559061142682612bf2565b90506114458582611435612dd7565b6001600160a01b03169190612e4d565b6040805183815290516001600160a01b038716917f1c71c8e11fd443227c8f8d3dc1a237a3a5e8310b540c7fbcf5169754aedf42c9919081900360200190a2949350505050565b609d5490565b60a0546001600160a01b031681565b60006114ac82612759565b90505b919050565b6099546001600160a01b03166114c86126cd565b6001600160a01b031614611511576040805162461bcd60e51b815260206004820152601c602482015260008051602061447c833981519152604482015290519081900360640190fd5b8061151b81612b20565b61155a576040805162461bcd60e51b815260206004820152601760248201526000805160206143d6833981519152604482015290519081900360640190fd5b8261156457610e21565b609d548311156115bb576040805162461bcd60e51b815260206004820152601d60248201527f5072697a65506f6f6c2f61776172642d657863656564732d617661696c000000604482015290519081900360640190fd5b609d546115c89084612e9f565b609d556115d88484846000612f01565b60006115e48385612fe7565b905061166a8584856001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561163857600080fd5b505afa15801561164c573d6000803e3d6000fd5b505050506040513d602081101561166257600080fd5b505184612bdc565b826001600160a01b0316856001600160a01b03167fe2554529d99ab7a67db6b4cea2b32c7d55ae325f958861e05f304fdded867e31866040518082815260200191505060405180910390a35050505050565b6116c46126cd565b6001600160a01b03166116d5611a5f565b6001600160a01b03161461171e576040805162461bcd60e51b8152602060048201819052602482015260008051602061438f833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b609c5481565b60006114ac82612b20565b600061178684848461301f565b949350505050565b6117966126cd565b6001600160a01b03166117a7611a5f565b6001600160a01b0316146117f0576040805162461bcd60e51b8152602060048201819052602482015260008051602061438f833981519152604482015290519081900360640190fd5b61104181612ae5565b3361180381612b20565b611842576040805162461bcd60e51b815260206004820152601760248201526000805160206143d6833981519152604482015290519081900360640190fd5b6001600160a01b0384161561191c576000336001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156118a057600080fd5b505afa1580156118b4573d6000803e3d6000fd5b505050506040513d60208110156118ca57600080fd5b5051905060006118dc86338484613070565b9050846001600160a01b0316866001600160a01b03161461190e5761190b336119058487612e9f565b836130ff565b90505b611919863383613145565b50505b6001600160a01b038316158015906119465750836001600160a01b0316836001600160a01b031614155b1561199d5761199d8333336001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112d357600080fd5b6001600160a01b038416158015906119bf57506099546001600160a01b031615155b15610e21576099546040805163b221095760e01b81526001600160a01b0387811660048301528681166024830152604482018690523360648301529151919092169163b221095791608480830192600092919082900301818387803b158015611a2757600080fd5b505af1158015611a3b573d6000803e3d6000fd5b5050505050505050565b600080611a538585856132e3565b90969095509350505050565b6033546001600160a01b031690565b6097546001600160a01b031681565b611a856126cd565b6001600160a01b0316611a96611a5f565b6001600160a01b031614611adf576040805162461bcd60e51b8152602060048201819052602482015260008051602061438f833981519152604482015290519081900360640190fd5b61104181613481565b6099546001600160a01b031681565b60606098805480602002602001604051908101604052809291908181526020018280548015611b4f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b31575b5050505050905090565b609a5481565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611bb057600080fd5b505afa158015611bc4573d6000803e3d6000fd5b505050506040513d6020811015611bda57600080fd5b505190506001600160a01b038116611bf65760009150506114af565b6000816001600160a01b031663010dfa58306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611c4557600080fd5b505afa158015611c59573d6000803e3d6000fd5b505050506040513d6020811015611c6f57600080fd5b5051905080611c83576000925050506114af565b6117868482613594565b600060026065541415611ce7576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655582611cf681612b20565b611d35576040805162461bcd60e51b815260206004820152601760248201526000805160206143d6833981519152604482015290519081900360640190fd5b600080611d438887896132e3565b9150915084821115611d865760405162461bcd60e51b81526004018080602001828103825260278152602001806143af6027913960400191505060405180910390fd5b611d918887836135b5565b856001600160a01b031663631b5dfb611da86126cd565b8a8a6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611e0057600080fd5b505af1158015611e14573d6000803e3d6000fd5b505050506000611e2d8389612e9f90919063ffffffff16565b90506000611e3a82612bf2565b9050611e498a82611435612dd7565b876001600160a01b03168a6001600160a01b0316611e656126cd565b604080518d81526020810186905280820189905290516001600160a01b0392909216917f0271704a58fd2953e49b87d67a0a3ce28a58147de98a5457f60b4686f63850309181900360600190a450506001606555509695505050505050565b82611ece81612b20565b611f0d576040805162461bcd60e51b815260206004820152601760248201526000805160206143d6833981519152604482015290519081900360640190fd5b611f156126cd565b6001600160a01b0316611f26611a5f565b6001600160a01b031614611f6f576040805162461bcd60e51b8152602060048201819052602482015260008051602061438f833981519152604482015290519081900360640190fd5b6040805180820182526001600160801b0380851680835286821660208085018281526001600160a01b038b166000818152609e84528890209651875492518716600160801b029087166fffffffffffffffffffffffffffffffff1990931692909217909516179094558451928352928201528083019190915290517ffb0ba2cf86a2b03bcf387753a2192da80a006afa99dd022bb301c78e323bf1b99181900360600190a150505050565b6000610aa6613676565b600054610100900460ff168061203d575061203d612863565b8061204b575060005460ff16155b6120865760405162461bcd60e51b815260040180806020018281038252602e815260200180614340602e913960400191505060405180910390fd5b600054610100900460ff161580156120b1576000805460ff1961ff0019909116610100171660011790555b6120bc858585611044565b60a080546001600160a01b0319166001600160a01b0384811691909117918290556040519116907fa5670b49a0ee863080ae28858bb5d9bcc1eb0d2a6f4c9c3a8accc43b8f445d2590600090a2801561211b576000805461ff00191690555b5050505050565b60a15481565b6001600160a01b03166000908152609e60205260409020546001600160801b0380821692600160801b9092041690565b60006114ac82612bf2565b600260655414156121bb576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002606555816121ca81612b20565b612209576040805162461bcd60e51b815260206004820152601760248201526000805160206143d6833981519152604482015290519081900360640190fd5b83612213816136d6565b612264576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f657863656564732d6c69717569646974792d63617000604482015290519081900360640190fd5b600061226e6126cd565b905061227c87878787612f01565b61229b81308861228a612dd7565b6001600160a01b03169291906136fa565b6122a48661276e565b846001600160a01b0316876001600160a01b0316826001600160a01b03167f6ce569498e0f86f147466ac49211cb2a1ffe06195adb805e383b3f2365109160898860405180838152602001826001600160a01b031681526020019250505060405180910390a4505060016065555050505050565b600060026065541415612372576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655560006123816125c2565b9050600061238d613676565b9050600082821161239f5760006123a9565b6123a98284612e9f565b90506000609d5482116123bd5760006123cb565b609d546123cb908390612e9f565b9050801561247d5760006123de82611b5f565b9050801561243857609b546123f39082613754565b609b556124008282612e9f565b6040805183815290519193507f5f1703ccfa2730d4245350f228079926a37f26a44ecf6978a7eeafff0af11407919081900360200190a15b609d546124459083613754565b609d556040805183815290517fce2b6e507c7ca1a20ce136810f524eefc19ba4c7e4866eb6cc0cba76e778d4be9181900360200190a1505b609d54945050505050600160655590565b609b5481565b61249c6126cd565b6001600160a01b03166124ad611a5f565b6001600160a01b0316146124f6576040805162461bcd60e51b8152602060048201819052602482015260008051602061438f833981519152604482015290519081900360640190fd5b6001600160a01b03811661253b5760405162461bcd60e51b81526004018080602001828103825260268152602001806142ab6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610aa6612dd7565b60405180604001604052806005815260200164332e342e3560d81b81525081565b600080609b5490506060609880548060200260200160405190810160405280929190818152602001828054801561262257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612604575b505083519394506000925050505b818110156126c4576126ba83828151811061264757fe5b60200260200101516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561268757600080fd5b505afa15801561269b573d6000803e3d6000fd5b505050506040513d60208110156126b157600080fd5b50518590613754565b9350600101612630565b50919250505090565b3390565b60006126dc83612759565b61272d576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b8161273a57506000612752565b61274e6001600160a01b0384168584612e4d565b5060015b9392505050565b60a0546001600160a01b039081169116141590565b60a054612797906001600160a01b031682612787612dd7565b6001600160a01b031691906137ae565b60a0546040805163140e25ad60e31b81526004810184905290516001600160a01b039092169163a0712d68916024808201926020929091908290030181600087803b1580156127e557600080fd5b505af11580156127f9573d6000803e3d6000fd5b505050506040513d602081101561280f57600080fd5b505115611041576040805162461bcd60e51b815260206004820152601d60248201527f436f6d706f756e645072697a65506f6f6c2f6d696e742d6661696c6564000000604482015290519081900360640190fd5b600061286e306138c1565b15905090565b306001600160a01b0316826001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b1580156128b757600080fd5b505afa1580156128cb573d6000803e3d6000fd5b505050506040513d60208110156128e157600080fd5b50516001600160a01b03161461293e576040805162461bcd60e51b815260206004820152601e60248201527f5072697a65506f6f6c2f746f6b656e2d6374726c722d6d69736d617463680000604482015290519081900360640190fd5b816098828154811061294c57fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051918416917f460e712b4a5d801d031ed673dea209b73ab854f7ddeb86b6c48082e92c3eee669190a25050565b600054610100900460ff16806129b857506129b8612863565b806129c6575060005460ff16155b612a015760405162461bcd60e51b815260040180806020018281038252602e815260200180614340602e913960400191505060405180910390fd5b600054610100900460ff16158015612a2c576000805460ff1961ff0019909116610100171660011790555b612a346138c7565b612a3c613967565b8015611041576000805461ff001916905550565b600054610100900460ff1680612a695750612a69612863565b80612a77575060005460ff16155b612ab25760405162461bcd60e51b815260040180806020018281038252602e815260200180614340602e913960400191505060405180910390fd5b600054610100900460ff16158015612add576000805460ff1961ff0019909116610100171660011790555b612a3c613a60565b609c8190556040805182815290517f3ff20538222f568f27ff436c0c49dfd3e48d5b8f86533a3f759dc1c7089775ab9181900360200190a150565b600060606098805480602002602001604051908101604052809291908181526020018280548015612b7a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612b5c575b505083519394506000925050505b81811015612bd157846001600160a01b0316838281518110612ba657fe5b60200260200101516001600160a01b03161415612bc957600193505050506114af565b600101612b88565b506000949350505050565b610e218484612bed87878787613070565b613145565b600080612bfd612dd7565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612c4e57600080fd5b505afa158015612c62573d6000803e3d6000fd5b505050506040513d6020811015612c7857600080fd5b505160a0546040805163852a12e360e01b81526004810188905290519293506001600160a01b039091169163852a12e3916024808201926020929091908290030181600087803b158015612ccb57600080fd5b505af1158015612cdf573d6000803e3d6000fd5b505050506040513d6020811015612cf557600080fd5b505115612d49576040805162461bcd60e51b815260206004820152601f60248201527f436f6d706f756e645072697a65506f6f6c2f72656465656d2d6661696c656400604482015290519081900360640190fd5b6000612dce82846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612d9c57600080fd5b505afa158015612db0573d6000803e3d6000fd5b505050506040513d6020811015612dc657600080fd5b505190612e9f565b95945050505050565b60a05460408051636f307dc360e01b815290516000926001600160a01b031691636f307dc3916004808301926020929190829003018186803b158015612e1c57600080fd5b505afa158015612e30573d6000803e3d6000fd5b505050506040513d6020811015612e4657600080fd5b5051905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610b64908490613b06565b600082821115612ef6576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6099546001600160a01b031615612f9057609954604080516304d7f3db60e41b81526001600160a01b038781166004830152602482018790528581166044830152848116606483015291519190921691634d7f3db091608480830192600092919082900301818387803b158015612f7757600080fd5b505af1158015612f8b573d6000803e3d6000fd5b505050505b816001600160a01b0316635d7b075885856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611a2757600080fd5b6001600160a01b0382166000908152609e602052604081205461275290839061301a9082906001600160801b0316613594565b613bb7565b6001600160a01b0383166000908152609e60205260408120548190613055908590600160801b90046001600160801b0316613594565b905080613066576000915050612752565b612dce8382613bdc565b6001600160a01b038381166000908152609f6020908152604080832093881683529290529081208054829190600160e01b900460ff166130b357600091506130f5565b60006130c0888888613c43565b82549091506130f190889088906130ec9089906130e6906001600160c01b031687613754565b90613754565b6130ff565b9250505b5095945050505050565b6001600160a01b0383166000908152609e6020526040812054819061312e9085906001600160801b0316613594565b90508083111561313c578092505b50909392505050565b6001600160a01b038083166000908152609f602090815260408083209387168352929052819020548151606081019092526001600160c01b0316908061318a84613cf4565b6001600160801b031681526020016131a86131a3613d3c565b613d42565b63ffffffff908116825260016020928301526001600160a01b038681166000908152609f84526040808220928a168252918452819020845181549486015195909201516001600160c01b03199094166001600160c01b039092169190911763ffffffff60c01b1916600160c01b94909216939093021760ff60e01b1916600160e01b911515919091021790558181101561328b576001600160a01b038084169085167f2f92d56910619b38bc29fd8e4ca5e56359edac7a0c086cdcd305fb603fa374916132758585612e9f565b60408051918252519081900360200190a3610e21565b80821015610e21576001600160a01b038084169085167ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf6132cc8486612e9f565b60408051918252519081900360200190a350505050565b6000806000846001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561333557600080fd5b505afa158015613349573d6000803e3d6000fd5b505050506040513d602081101561335f57600080fd5b50519050838110156133b1576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f696e737566662d66756e647360501b604482015290519081900360640190fd5b6133be8686836000612bdc565b60006133d3866133ce8488612e9f565b612fe7565b6001600160a01b038088166000908152609f60209081526040808320938c16835292905290812054919250906001600160c01b0316821161344a576001600160a01b038088166000908152609f60209081526040808320938c1683529290522054613447906001600160c01b031683612e9f565b90505b60006134568888612fe7565b90508082116134655781613467565b805b94506134738186612e9f565b955050505050935093915050565b6001600160a01b0381166134dc576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f7072697a6553747261746567792d6e6f742d7a65726f604482015290519081900360640190fd5b6134f96001600160a01b038216600162a1cb1960e01b0319613d86565b61354a576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f7072697a6553747261746567792d696e76616c696400604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0383169081179091556040517f7f58dc86bc2e435cb77ca0edb1df55e25f90caf2d6bd866971715437d456a21290600090a250565b6000806135a18385613da2565b905061178681670de0b6b3a7640000613dfb565b6001600160a01b038083166000908152609f60209081526040808320938716835292905220546135f7906135f2906001600160c01b031683612e9f565b613cf4565b6001600160a01b038084166000818152609f602090815260408083209489168084529482529182902080546001600160c01b0319166001600160801b0396909616959095179094558051858152905191937ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf92918290030190a3505050565b60a05460408051633af9e66960e01b815230600482015290516000926001600160a01b031691633af9e66991602480830192602092919082900301818787803b1580156136c257600080fd5b505af1158015612e30573d6000803e3d6000fd5b6000806136e16125c2565b609c549091506136f18285613754565b11159392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610e21908590613b06565b600082820183811015612752576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b801580613834575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561380657600080fd5b505afa15801561381a573d6000803e3d6000fd5b505050506040513d602081101561383057600080fd5b5051155b61386f5760405162461bcd60e51b81526004018080602001828103825260368152602001806144466036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610b64908490613b06565b3b151590565b600054610100900460ff16806138e057506138e0612863565b806138ee575060005460ff16155b6139295760405162461bcd60e51b815260040180806020018281038252602e815260200180614340602e913960400191505060405180910390fd5b600054610100900460ff16158015612a3c576000805460ff1961ff0019909116610100171660011790558015611041576000805461ff001916905550565b600054610100900460ff16806139805750613980612863565b8061398e575060005460ff16155b6139c95760405162461bcd60e51b815260040180806020018281038252602e815260200180614340602e913960400191505060405180910390fd5b600054610100900460ff161580156139f4576000805460ff1961ff0019909116610100171660011790555b60006139fe6126cd565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015611041576000805461ff001916905550565b600054610100900460ff1680613a795750613a79612863565b80613a87575060005460ff16155b613ac25760405162461bcd60e51b815260040180806020018281038252602e815260200180614340602e913960400191505060405180910390fd5b600054610100900460ff16158015613aed576000805460ff1961ff0019909116610100171660011790555b60016065558015611041576000805461ff001916905550565b6060613b5b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613e3d9092919063ffffffff16565b805190915015610b6457808060200190516020811015613b7a57600080fd5b5051610b645760405162461bcd60e51b815260040180806020018281038252602a81526020018061441c602a913960400191505060405180910390fd5b600080613bc684609a54613594565b905080831115613bd4578092505b509092915050565b6000808211613c32576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381613c3b57fe5b049392505050565b6001600160a01b038281166000908152609f60209081526040808320938716835292905290812054600160c01b810463ffffffff1690600160e01b900460ff16613c91576000915050612752565b6000613ca582613c9f613d3c565b90612e9f565b6001600160a01b0386166000908152609e602052604081205491925090613cdd908390600160801b90046001600160801b0316613da2565b9050613ce98582613594565b979650505050505050565b6000600160801b8210613d385760405162461bcd60e51b81526004018080602001828103825260278152602001806142d16027913960400191505060405180910390fd5b5090565b60a15490565b6000600160201b8210613d385760405162461bcd60e51b81526004018080602001828103825260268152602001806143f66026913960400191505060405180910390fd5b6000613d9183613e4c565b801561275257506127528383613e7f565b600082613db157506000612efb565b82820282848281613dbe57fe5b04146127525760405162461bcd60e51b815260040180806020018281038252602181526020018061436e6021913960400191505060405180910390fd5b600061275283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ea2565b60606117868484600085613f44565b6000613e5f826301ffc9a760e01b613e7f565b80156114ac5750613e78826001600160e01b0319613e7f565b1592915050565b6000806000613e8e8585614095565b91509150818015612dce5750949350505050565b60008183613f2e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ef3578181015183820152602001613edb565b50505050905090810190601f168015613f205780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613f3a57fe5b0495945050505050565b606082471015613f855760405162461bcd60e51b815260040180806020018281038252602681526020018061431a6026913960400191505060405180910390fd5b613f8e856138c1565b613fdf576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061401e5780518252601f199092019160209182019101613fff565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614080576040519150601f19603f3d011682016040523d82523d6000602084013e614085565b606091505b5091509150613ce98282866141c9565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b1781529151815160009384939284926060926001600160a01b038a169261753092879282918083835b6020831061411d5780518252601f1990920191602091820191016140fe565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d806000811461417e576040519150601f19603f3d011682016040523d82523d6000602084013e614183565b606091505b50915091506020815110156141a157600080945094505050506141c2565b818180602001905160208110156141b757600080fd5b505190955093505050505b9250929050565b606083156141d8575081612752565b8251156141e85782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315613ef3578181015183820152602001613edb565b828054828255906000526020600020908101928215614284579160200282015b8281111561428457825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061424f565b50613d389291505b80821115613d385780546001600160a01b031916815560010161428c56fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e2031323820626974735072697a65506f6f6c2f7265736572766552656769737472792d6e6f742d7a65726f416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725072697a65506f6f6c2f657869742d6665652d657863656564732d757365722d6d6178696d756d5072697a65506f6f6c2f756e6b6e6f776e2d746f6b656e00000000000000000053616665436173743a2076616c756520646f65736e27742066697420696e20333220626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e63655072697a65506f6f6c2f6f6e6c792d7072697a65537472617465677900000000a264697066735822122034aae2b6add5a6f099bfd26707f324945e51b2cb08344b3d5aad7dc87c6b254c64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x1D SWAP1 PUSH2 0x5F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x39 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x6C JUMP JUMPDEST PUSH2 0x44F1 DUP1 PUSH2 0x3B2 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH2 0x337 DUP1 PUSH2 0x7B PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x22EC095 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x6A JUMPI DUP1 PUSH4 0xEFC81A8C EQ PUSH2 0x120 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x128 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x137 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x4E PUSH2 0x2B3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x265 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x26A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2DE PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE DUP3 DUP2 MSTORE PUSH2 0x2D8 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x137 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 PUSH23 0x41CAD3A6C2A855E03369145B3325A086B8FB3F317CF56F DUP3 ADDRESS 0xD4 SWAP2 LOG1 0xAD 0xC1 JUMPDEST PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x44D1 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x25E JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x888C2B6F GT PUSH2 0x146 JUMPI DUP1 PUSH4 0xB69EF8A8 GT PUSH2 0xC3 JUMPI DUP1 PUSH4 0xE323F825 GT PUSH2 0x87 JUMPI DUP1 PUSH4 0xE323F825 EQ PUSH2 0x9A5 JUMPI DUP1 PUSH4 0xE6D8A94B EQ PUSH2 0x9E1 JUMPI DUP1 PUSH4 0xEDB4E1CF EQ PUSH2 0x9E9 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x9F1 JUMPI DUP1 PUSH4 0xFC0C546A EQ PUSH2 0xA17 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0xA1F JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0xB69EF8A8 EQ PUSH2 0x864 JUMPI DUP1 PUSH4 0xC5871485 EQ PUSH2 0x86C JUMPI DUP1 PUSH4 0xD18E81B3 EQ PUSH2 0x92B JUMPI DUP1 PUSH4 0xD4A1361D EQ PUSH2 0x933 JUMPI DUP1 PUSH4 0xDB006A75 EQ PUSH2 0x988 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x9D63848A GT PUSH2 0x10A JUMPI DUP1 PUSH4 0x9D63848A EQ PUSH2 0x770 JUMPI DUP1 PUSH4 0x9E167519 EQ PUSH2 0x7C8 JUMPI DUP1 PUSH4 0x9FE32A91 EQ PUSH2 0x7D0 JUMPI DUP1 PUSH4 0xA016240B EQ PUSH2 0x7ED JUMPI DUP1 PUSH4 0xA7B2CC31 EQ PUSH2 0x827 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x888C2B6F EQ PUSH2 0x6E3 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x732 JUMPI DUP1 PUSH4 0x8E71C1F6 EQ PUSH2 0x73A JUMPI DUP1 PUSH4 0x91CA480E EQ PUSH2 0x742 JUMPI DUP1 PUSH4 0x98BF3EB6 EQ PUSH2 0x768 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x52A387AB GT PUSH2 0x1DF JUMPI DUP1 PUSH4 0x715018A6 GT PUSH2 0x1A3 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x628 JUMPI DUP1 PUSH4 0x76687D3D EQ PUSH2 0x630 JUMPI DUP1 PUSH4 0x78B3D327 EQ PUSH2 0x638 JUMPI DUP1 PUSH4 0x79CB8563 EQ PUSH2 0x65E JUMPI DUP1 PUSH4 0x7B99ADB1 EQ PUSH2 0x690 JUMPI DUP1 PUSH4 0x7CBAB1C7 EQ PUSH2 0x6AD JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x52A387AB EQ PUSH2 0x566 JUMPI DUP1 PUSH4 0x630665B4 EQ PUSH2 0x58C JUMPI DUP1 PUSH4 0x69E527DA EQ PUSH2 0x594 JUMPI DUP1 PUSH4 0x6A3FD4F9 EQ PUSH2 0x5B8 JUMPI DUP1 PUSH4 0x6B1B863A EQ PUSH2 0x5F2 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x2B0AB144 GT PUSH2 0x226 JUMPI DUP1 PUSH4 0x2B0AB144 EQ PUSH2 0x404 JUMPI DUP1 PUSH4 0x2F7627E3 EQ PUSH2 0x43A JUMPI DUP1 PUSH4 0x35403023 EQ PUSH2 0x468 JUMPI DUP1 PUSH4 0x3EDE50C6 EQ PUSH2 0x485 JUMPI DUP1 PUSH4 0x494DE9F7 EQ PUSH2 0x538 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x937EB54 EQ PUSH2 0x263 JUMPI DUP1 PUSH4 0x13F55E39 EQ PUSH2 0x27D JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x2B5 JUMPI DUP1 PUSH4 0x16960D55 EQ PUSH2 0x360 JUMPI DUP1 PUSH4 0x22F8E566 EQ PUSH2 0x3E7 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26B PUSH2 0xA9C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x293 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xAAB JUMP JUMPDEST STOP JUMPDEST PUSH2 0x343 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x2CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x305 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x317 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x338 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xB69 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x376 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x3A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x3BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x3DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xB7A JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xE27 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x41A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xE2C JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x450 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xEE9 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x47E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1038 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x49B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x4C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x4D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x4F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0x1044 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x54E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x1236 JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x57C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x133D JUMP JUMPDEST PUSH2 0x26B PUSH2 0x148C JUMP JUMPDEST PUSH2 0x59C PUSH2 0x1492 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x5DE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x14A1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x608 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 SWAP1 SWAP2 ADD CALLDATALOAD AND PUSH2 0x14B4 JUMP JUMPDEST PUSH2 0x2B3 PUSH2 0x16BC JUMP JUMPDEST PUSH2 0x26B PUSH2 0x1768 JUMP JUMPDEST PUSH2 0x5DE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x64E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x176E JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x674 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1779 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x178E JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x6C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x17F9 JUMP JUMPDEST PUSH2 0x719 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x6F9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1A45 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB ADD SWAP1 RETURN JUMPDEST PUSH2 0x59C PUSH2 0x1A5F JUMP JUMPDEST PUSH2 0x59C PUSH2 0x1A6E JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x758 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A7D JUMP JUMPDEST PUSH2 0x59C PUSH2 0x1AE8 JUMP JUMPDEST PUSH2 0x778 PUSH2 0x1AF7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x7B4 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x79C JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x26B PUSH2 0x1B59 JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x7E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1B5F JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x803 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x1C8D JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x83D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x40 ADD CALLDATALOAD AND PUSH2 0x1EC4 JUMP JUMPDEST PUSH2 0x26B PUSH2 0x201A JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x882 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x8AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x8BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x8DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2024 JUMP JUMPDEST PUSH2 0x26B PUSH2 0x2122 JUMP JUMPDEST PUSH2 0x959 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x949 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2128 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x99E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x2158 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x9BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x2163 JUMP JUMPDEST PUSH2 0x26B PUSH2 0x2318 JUMP JUMPDEST PUSH2 0x26B PUSH2 0x248E JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xA07 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2494 JUMP JUMPDEST PUSH2 0x59C PUSH2 0x2597 JUMP JUMPDEST PUSH2 0xA27 PUSH2 0x25A1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xA61 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xA49 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xA8E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xAA6 PUSH2 0x25C2 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xABF PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xB08 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x447C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xB13 DUP4 DUP4 DUP4 PUSH2 0x26D1 JUMP JUMPDEST ISZERO PUSH2 0xB64 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB0BAC59718CD343C80A813518AFCF36846CFCFE6D56E2B3CAB9BD49F5F9B251C DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0xA85BD01 PUSH1 0xE1 SHL SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xB8E PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xBD7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x447C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xBE0 DUP4 PUSH2 0x2759 JUMP JUMPDEST PUSH2 0xC31 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0xC3B JUMPI PUSH2 0xE21 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xDA8 JUMPI DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x42842E0E ADDRESS DUP8 DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0xC63 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0xCD1 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xDA0 JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0xCFF JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xD04 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH32 0x17E975018310F88872B58D4D8263ADCA83CF5C1893496EA2A86923DAB15276AD DUP2 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD64 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD4C JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD91 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xC3E JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x69C2DE32BC4D47F488E72626A6CFDEE85089342E52675E7DE79C4B417623960C DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP6 POP SWAP1 SWAP4 POP POP POP POP LOG3 JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0xA1 SSTORE JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE40 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xE89 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x447C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xE94 DUP4 DUP4 DUP4 PUSH2 0x26D1 JUMP JUMPDEST ISZERO PUSH2 0xB64 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC65F48ACA3B7A99B7443D04B8FFBB073156179BC628DC3F7DEF5047748973469 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH2 0xEF1 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF02 PUSH2 0x1A5F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xF4B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x438F DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xFAE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xFC4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD GT ISZERO PUSH2 0x1034 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5C19A95C DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x101B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x102F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x1041 DUP2 PUSH2 0x276E JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x105D JUMPI POP PUSH2 0x105D PUSH2 0x2863 JUMP JUMPDEST DUP1 PUSH2 0x106B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x10A6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4340 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x10D1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x1116 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F8 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 MLOAD DUP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x112F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1159 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP1 MLOAD PUSH2 0x116E SWAP2 PUSH1 0x98 SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x422F JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x11A5 JUMPI PUSH1 0x0 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1188 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0x119C DUP2 DUP4 PUSH2 0x2874 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x1172 JUMP JUMPDEST POP PUSH2 0x11AE PUSH2 0x299F JUMP JUMPDEST PUSH2 0x11B6 PUSH2 0x2A50 JUMP JUMPDEST PUSH2 0x11C1 PUSH1 0x0 NOT PUSH2 0x2AE5 JUMP JUMPDEST PUSH1 0x97 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x9A DUP5 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP6 SWAP1 MSTORE DUP1 MLOAD PUSH32 0x25FF68DD81B34665B5BA7E553EE5511BF6812E12ADB4A7E2C0D9E26B3099CE79 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 POP DUP1 ISZERO PUSH2 0xE21 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x1242 DUP2 PUSH2 0x2B20 JUMP JUMPDEST PUSH2 0x1281 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1306 DUP5 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x12E7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x12FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 PUSH2 0x2BDC JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP4 AND DUP3 MSTORE SWAP3 SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x138E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x13A2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x13B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ PUSH2 0x1412 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F6F6E6C792D72657365727665 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9B DUP1 SLOAD PUSH1 0x0 SWAP2 DUP3 SWAP1 SSTORE SWAP1 PUSH2 0x1426 DUP3 PUSH2 0x2BF2 JUMP JUMPDEST SWAP1 POP PUSH2 0x1445 DUP6 DUP3 PUSH2 0x1435 PUSH2 0x2DD7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x2E4D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP2 PUSH32 0x1C71C8E11FD443227C8F8D3DC1A237A3A5E8310B540C7FBCF5169754AEDF42C9 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x9D SLOAD SWAP1 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14AC DUP3 PUSH2 0x2759 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x14C8 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1511 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x447C DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x151B DUP2 PUSH2 0x2B20 JUMP JUMPDEST PUSH2 0x155A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 PUSH2 0x1564 JUMPI PUSH2 0xE21 JUMP JUMPDEST PUSH1 0x9D SLOAD DUP4 GT ISZERO PUSH2 0x15BB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F61776172642D657863656564732D617661696C000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x15C8 SWAP1 DUP5 PUSH2 0x2E9F JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH2 0x15D8 DUP5 DUP5 DUP5 PUSH1 0x0 PUSH2 0x2F01 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15E4 DUP4 DUP6 PUSH2 0x2FE7 JUMP JUMPDEST SWAP1 POP PUSH2 0x166A DUP6 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1638 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x164C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1662 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP5 PUSH2 0x2BDC JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xE2554529D99AB7A67DB6B4CEA2B32C7D55AE325F958861E05F304FDDED867E31 DUP7 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x16C4 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16D5 PUSH2 0x1A5F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x171E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x438F DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14AC DUP3 PUSH2 0x2B20 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1786 DUP5 DUP5 DUP5 PUSH2 0x301F JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1796 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x17A7 PUSH2 0x1A5F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x17F0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x438F DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1041 DUP2 PUSH2 0x2AE5 JUMP JUMPDEST CALLER PUSH2 0x1803 DUP2 PUSH2 0x2B20 JUMP JUMPDEST PUSH2 0x1842 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO PUSH2 0x191C JUMPI PUSH1 0x0 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP7 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x18B4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x18CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x18DC DUP7 CALLER DUP5 DUP5 PUSH2 0x3070 JUMP JUMPDEST SWAP1 POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x190E JUMPI PUSH2 0x190B CALLER PUSH2 0x1905 DUP5 DUP8 PUSH2 0x2E9F JUMP JUMPDEST DUP4 PUSH2 0x30FF JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x1919 DUP7 CALLER DUP4 PUSH2 0x3145 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1946 JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x199D JUMPI PUSH2 0x199D DUP4 CALLER CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x19BF JUMPI POP PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xE21 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP7 SWAP1 MSTORE CALLER PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xB2210957 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1A27 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1A3B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1A53 DUP6 DUP6 DUP6 PUSH2 0x32E3 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x97 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1A85 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A96 PUSH2 0x1A5F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1ADF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x438F DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1041 DUP2 PUSH2 0x3481 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1B4F JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1B31 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1BB0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1BC4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1BDA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1BF6 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x14AF JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x10DFA58 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C45 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C59 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1C6F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x1C83 JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x14AF JUMP JUMPDEST PUSH2 0x1786 DUP5 DUP3 PUSH2 0x3594 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x1CE7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP3 PUSH2 0x1CF6 DUP2 PUSH2 0x2B20 JUMP JUMPDEST PUSH2 0x1D35 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1D43 DUP9 DUP8 DUP10 PUSH2 0x32E3 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0x1D86 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x43AF PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1D91 DUP9 DUP8 DUP4 PUSH2 0x35B5 JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x631B5DFB PUSH2 0x1DA8 PUSH2 0x26CD JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E14 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 PUSH2 0x1E2D DUP4 DUP10 PUSH2 0x2E9F SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1E3A DUP3 PUSH2 0x2BF2 JUMP JUMPDEST SWAP1 POP PUSH2 0x1E49 DUP11 DUP3 PUSH2 0x1435 PUSH2 0x2DD7 JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E65 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP14 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE DUP1 DUP3 ADD DUP10 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x271704A58FD2953E49B87D67A0A3CE28A58147DE98A5457F60B4686F6385030 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH2 0x1ECE DUP2 PUSH2 0x2B20 JUMP JUMPDEST PUSH2 0x1F0D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1F15 PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1F26 PUSH2 0x1A5F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1F6F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x438F DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP6 AND DUP1 DUP4 MSTORE DUP7 DUP3 AND PUSH1 0x20 DUP1 DUP6 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9E DUP5 MSTORE DUP9 SWAP1 KECCAK256 SWAP7 MLOAD DUP8 SLOAD SWAP3 MLOAD DUP8 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP1 DUP8 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP6 AND OR SWAP1 SWAP5 SSTORE DUP5 MLOAD SWAP3 DUP4 MSTORE SWAP3 DUP3 ADD MSTORE DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 MLOAD PUSH32 0xFB0BA2CF86A2B03BCF387753A2192DA80A006AFA99DD022BB301C78E323BF1B9 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xAA6 PUSH2 0x3676 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x203D JUMPI POP PUSH2 0x203D PUSH2 0x2863 JUMP JUMPDEST DUP1 PUSH2 0x204B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2086 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4340 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x20B1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x20BC DUP6 DUP6 DUP6 PUSH2 0x1044 JUMP JUMPDEST PUSH1 0xA0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 AND SWAP1 PUSH32 0xA5670B49A0EE863080AE28858BB5D9BCC1EB0D2A6F4C9C3A8ACCC43B8F445D25 SWAP1 PUSH1 0x0 SWAP1 LOG2 DUP1 ISZERO PUSH2 0x211B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0xA1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP3 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14AC DUP3 PUSH2 0x2BF2 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x21BB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP2 PUSH2 0x21CA DUP2 PUSH2 0x2B20 JUMP JUMPDEST PUSH2 0x2209 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x43D6 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP4 PUSH2 0x2213 DUP2 PUSH2 0x36D6 JUMP JUMPDEST PUSH2 0x2264 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F657863656564732D6C69717569646974792D63617000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x226E PUSH2 0x26CD JUMP JUMPDEST SWAP1 POP PUSH2 0x227C DUP8 DUP8 DUP8 DUP8 PUSH2 0x2F01 JUMP JUMPDEST PUSH2 0x229B DUP2 ADDRESS DUP9 PUSH2 0x228A PUSH2 0x2DD7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 SWAP1 PUSH2 0x36FA JUMP JUMPDEST PUSH2 0x22A4 DUP7 PUSH2 0x276E JUMP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6CE569498E0F86F147466AC49211CB2A1FFE06195ADB805E383B3F2365109160 DUP10 DUP9 PUSH1 0x40 MLOAD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x2372 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE PUSH1 0x0 PUSH2 0x2381 PUSH2 0x25C2 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x238D PUSH2 0x3676 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 DUP3 GT PUSH2 0x239F JUMPI PUSH1 0x0 PUSH2 0x23A9 JUMP JUMPDEST PUSH2 0x23A9 DUP3 DUP5 PUSH2 0x2E9F JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x9D SLOAD DUP3 GT PUSH2 0x23BD JUMPI PUSH1 0x0 PUSH2 0x23CB JUMP JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x23CB SWAP1 DUP4 SWAP1 PUSH2 0x2E9F JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x247D JUMPI PUSH1 0x0 PUSH2 0x23DE DUP3 PUSH2 0x1B5F JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x2438 JUMPI PUSH1 0x9B SLOAD PUSH2 0x23F3 SWAP1 DUP3 PUSH2 0x3754 JUMP JUMPDEST PUSH1 0x9B SSTORE PUSH2 0x2400 DUP3 DUP3 PUSH2 0x2E9F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 POP PUSH32 0x5F1703CCFA2730D4245350F228079926A37F26A44ECF6978A7EEAFFF0AF11407 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x2445 SWAP1 DUP4 PUSH2 0x3754 JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xCE2B6E507C7CA1A20CE136810F524EEFC19BA4C7E4866EB6CC0CBA76E778D4BE SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH1 0x9D SLOAD SWAP5 POP POP POP POP POP PUSH1 0x1 PUSH1 0x65 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x9B SLOAD DUP2 JUMP JUMPDEST PUSH2 0x249C PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x24AD PUSH2 0x1A5F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x24F6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x438F DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x253B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42AB PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xAA6 PUSH2 0x2DD7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x9B SLOAD SWAP1 POP PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2622 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2604 JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x26C4 JUMPI PUSH2 0x26BA DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2647 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2687 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x269B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x26B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP6 SWAP1 PUSH2 0x3754 JUMP JUMPDEST SWAP4 POP PUSH1 0x1 ADD PUSH2 0x2630 JUMP JUMPDEST POP SWAP2 SWAP3 POP POP POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x26DC DUP4 PUSH2 0x2759 JUMP JUMPDEST PUSH2 0x272D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x273A JUMPI POP PUSH1 0x0 PUSH2 0x2752 JUMP JUMPDEST PUSH2 0x274E PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP6 DUP5 PUSH2 0x2E4D JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND SWAP2 AND EQ ISZERO SWAP1 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH2 0x2797 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH2 0x2787 PUSH2 0x2DD7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x37AE JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x140E25AD PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0xA0712D68 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x27E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x27F9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x280F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO PUSH2 0x1041 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6D706F756E645072697A65506F6F6C2F6D696E742D6661696C6564000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x286E ADDRESS PUSH2 0x38C1 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF77C4791 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x28B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x28CB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x28E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x293E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F746F6B656E2D6374726C722D6D69736D617463680000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x98 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x294C JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 DUP5 AND SWAP2 PUSH32 0x460E712B4A5D801D031ED673DEA209B73AB854F7DDEB86B6C48082E92C3EEE66 SWAP2 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x29B8 JUMPI POP PUSH2 0x29B8 PUSH2 0x2863 JUMP JUMPDEST DUP1 PUSH2 0x29C6 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2A01 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4340 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2A2C JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2A34 PUSH2 0x38C7 JUMP JUMPDEST PUSH2 0x2A3C PUSH2 0x3967 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2A69 JUMPI POP PUSH2 0x2A69 PUSH2 0x2863 JUMP JUMPDEST DUP1 PUSH2 0x2A77 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2AB2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4340 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2ADD JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2A3C PUSH2 0x3A60 JUMP JUMPDEST PUSH1 0x9C DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3FF20538222F568F27FF436C0C49DFD3E48D5B8F86533A3F759DC1C7089775AB SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2B7A JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2B5C JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2BD1 JUMPI DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2BA6 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x2BC9 JUMPI PUSH1 0x1 SWAP4 POP POP POP POP PUSH2 0x14AF JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2B88 JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xE21 DUP5 DUP5 PUSH2 0x2BED DUP8 DUP8 DUP8 DUP8 PUSH2 0x3070 JUMP JUMPDEST PUSH2 0x3145 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2BFD PUSH2 0x2DD7 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2C4E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2C62 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2C78 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x852A12E3 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP9 SWAP1 MSTORE SWAP1 MLOAD SWAP3 SWAP4 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0x852A12E3 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2CCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2CDF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2CF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO PUSH2 0x2D49 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6D706F756E645072697A65506F6F6C2F72656465656D2D6661696C656400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2DCE DUP3 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2D9C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2DB0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2DC6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 PUSH2 0x2E9F JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x6F307DC3 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x6F307DC3 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2E1C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2E30 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2E46 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xB64 SWAP1 DUP5 SWAP1 PUSH2 0x3B06 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2EF6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2F90 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE DUP6 DUP2 AND PUSH1 0x44 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x4D7F3DB0 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2F77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2F8B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5D7B0758 DUP6 DUP6 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1A27 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x2752 SWAP1 DUP4 SWAP1 PUSH2 0x301A SWAP1 DUP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3594 JUMP JUMPDEST PUSH2 0x3BB7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x3055 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3594 JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x3066 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x2752 JUMP JUMPDEST PUSH2 0x2DCE DUP4 DUP3 PUSH2 0x3BDC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP3 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x30B3 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x30F5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x30C0 DUP9 DUP9 DUP9 PUSH2 0x3C43 JUMP JUMPDEST DUP3 SLOAD SWAP1 SWAP2 POP PUSH2 0x30F1 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x30EC SWAP1 DUP10 SWAP1 PUSH2 0x30E6 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP8 PUSH2 0x3754 JUMP JUMPDEST SWAP1 PUSH2 0x3754 JUMP JUMPDEST PUSH2 0x30FF JUMP JUMPDEST SWAP3 POP POP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x312E SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3594 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x313C JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE DUP2 SWAP1 KECCAK256 SLOAD DUP2 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 DUP1 PUSH2 0x318A DUP5 PUSH2 0x3CF4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x31A8 PUSH2 0x31A3 PUSH2 0x3D3C JUMP JUMPDEST PUSH2 0x3D42 JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP3 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 DUP11 AND DUP3 MSTORE SWAP2 DUP5 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP5 DUP7 ADD MLOAD SWAP6 SWAP1 SWAP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH4 0xFFFFFFFF PUSH1 0xC0 SHL NOT AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP5 SWAP1 SWAP3 AND SWAP4 SWAP1 SWAP4 MUL OR PUSH1 0xFF PUSH1 0xE0 SHL NOT AND PUSH1 0x1 PUSH1 0xE0 SHL SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE DUP2 DUP2 LT ISZERO PUSH2 0x328B JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0x2F92D56910619B38BC29FD8E4CA5E56359EDAC7A0C086CDCD305FB603FA37491 PUSH2 0x3275 DUP6 DUP6 PUSH2 0x2E9F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 PUSH2 0xE21 JUMP JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0xE21 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF PUSH2 0x32CC DUP5 DUP7 PUSH2 0x2E9F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3335 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3349 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x335F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x33B1 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F696E737566662D66756E6473 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x33BE DUP7 DUP7 DUP4 PUSH1 0x0 PUSH2 0x2BDC JUMP JUMPDEST PUSH1 0x0 PUSH2 0x33D3 DUP7 PUSH2 0x33CE DUP5 DUP9 PUSH2 0x2E9F JUMP JUMPDEST PUSH2 0x2FE7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP3 GT PUSH2 0x344A JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x3447 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2E9F JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x3456 DUP9 DUP9 PUSH2 0x2FE7 JUMP JUMPDEST SWAP1 POP DUP1 DUP3 GT PUSH2 0x3465 JUMPI DUP2 PUSH2 0x3467 JUMP JUMPDEST DUP1 JUMPDEST SWAP5 POP PUSH2 0x3473 DUP2 DUP7 PUSH2 0x2E9F JUMP JUMPDEST SWAP6 POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x34DC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D6E6F742D7A65726F PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x34F9 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3D86 JUMP JUMPDEST PUSH2 0x354A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D696E76616C696400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x99 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x7F58DC86BC2E435CB77CA0EDB1DF55E25F90CAF2D6BD866971715437D456A212 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x35A1 DUP4 DUP6 PUSH2 0x3DA2 JUMP JUMPDEST SWAP1 POP PUSH2 0x1786 DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x3DFB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x35F7 SWAP1 PUSH2 0x35F2 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2E9F JUMP JUMPDEST PUSH2 0x3CF4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x3AF9E669 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x3AF9E669 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x36C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2E30 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x36E1 PUSH2 0x25C2 JUMP JUMPDEST PUSH1 0x9C SLOAD SWAP1 SWAP2 POP PUSH2 0x36F1 DUP3 DUP6 PUSH2 0x3754 JUMP JUMPDEST GT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x24 DUP4 ADD MSTORE DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x84 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xE21 SWAP1 DUP6 SWAP1 PUSH2 0x3B06 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x2752 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 ISZERO DUP1 PUSH2 0x3834 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH4 0x6EB1769F PUSH1 0xE1 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 DUP6 AND SWAP2 PUSH4 0xDD62ED3E SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3806 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x381A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3830 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO JUMPDEST PUSH2 0x386F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x36 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4446 PUSH1 0x36 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x95EA7B3 PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xB64 SWAP1 DUP5 SWAP1 PUSH2 0x3B06 JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x38E0 JUMPI POP PUSH2 0x38E0 PUSH2 0x2863 JUMP JUMPDEST DUP1 PUSH2 0x38EE JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3929 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4340 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2A3C JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3980 JUMPI POP PUSH2 0x3980 PUSH2 0x2863 JUMP JUMPDEST DUP1 PUSH2 0x398E JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x39C9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4340 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x39F4 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x39FE PUSH2 0x26CD JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3A79 JUMPI POP PUSH2 0x3A79 PUSH2 0x2863 JUMP JUMPDEST DUP1 PUSH2 0x3A87 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3AC2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4340 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3AED JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x65 SSTORE DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x3B5B DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3E3D SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xB64 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3B7A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xB64 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x441C PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3BC6 DUP5 PUSH1 0x9A SLOAD PUSH2 0x3594 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x3BD4 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x3C32 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x3C3B JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xC0 SHL DUP2 DIV PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x3C91 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x2752 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3CA5 DUP3 PUSH2 0x3C9F PUSH2 0x3D3C JUMP JUMPDEST SWAP1 PUSH2 0x2E9F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x3CDD SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3DA2 JUMP JUMPDEST SWAP1 POP PUSH2 0x3CE9 DUP6 DUP3 PUSH2 0x3594 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x3D38 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42D1 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0xA1 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x20 SHL DUP3 LT PUSH2 0x3D38 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x43F6 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3D91 DUP4 PUSH2 0x3E4C JUMP JUMPDEST DUP1 ISZERO PUSH2 0x2752 JUMPI POP PUSH2 0x2752 DUP4 DUP4 PUSH2 0x3E7F JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3DB1 JUMPI POP PUSH1 0x0 PUSH2 0x2EFB JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x3DBE JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x2752 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x436E PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2752 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x3EA2 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1786 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x3F44 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3E5F DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3E7F JUMP JUMPDEST DUP1 ISZERO PUSH2 0x14AC JUMPI POP PUSH2 0x3E78 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3E7F JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x3E8E DUP6 DUP6 PUSH2 0x4095 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x2DCE JUMPI POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x3F2E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3EF3 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3EDB JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3F20 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x3F3A JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x3F85 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x431A PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3F8E DUP6 PUSH2 0x38C1 JUMP JUMPDEST PUSH2 0x3FDF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x401E JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3FFF JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x4080 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4085 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x3CE9 DUP3 DUP3 DUP7 PUSH2 0x41C9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x24 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP3 DUP5 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND SWAP3 PUSH2 0x7530 SWAP3 DUP8 SWAP3 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x411D JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x40FE JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x417E JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4183 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x41A1 JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x41C2 JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x41B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x41D8 JUMPI POP DUP2 PUSH2 0x2752 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x41E8 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x3EF3 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3EDB JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x4284 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x4284 JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x424F JUMP JUMPDEST POP PUSH2 0x3D38 SWAP3 SWAP2 POP JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x3D38 JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x428C JUMP INVALID 0x4F PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F206164647265737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E2031323820626974735072697A65 POP PUSH16 0x6F6C2F72657365727665526567697374 PUSH19 0x792D6E6F742D7A65726F416464726573733A20 PUSH10 0x6E73756666696369656E PUSH21 0x2062616C616E636520666F722063616C6C496E6974 PUSH10 0x616C697A61626C653A20 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 MSTORE8 PUSH2 0x6665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F774F776E61626C653A20 PUSH4 0x616C6C65 PUSH19 0x206973206E6F7420746865206F776E65725072 PUSH10 0x7A65506F6F6C2F657869 PUSH21 0x2D6665652D657863656564732D757365722D6D6178 PUSH10 0x6D756D5072697A65506F PUSH16 0x6C2F756E6B6E6F776E2D746F6B656E00 STOP STOP STOP STOP STOP STOP STOP STOP MSTORE8 PUSH2 0x6665 NUMBER PUSH2 0x7374 GASPRICE KECCAK256 PUSH23 0x616C756520646F65736E27742066697420696E20333220 PUSH3 0x697473 MSTORE8 PUSH2 0x6665 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x7563636565645361666545524332303A20617070 PUSH19 0x6F76652066726F6D206E6F6E2D7A65726F2074 PUSH16 0x206E6F6E2D7A65726F20616C6C6F7761 PUSH15 0x63655072697A65506F6F6C2F6F6E6C PUSH26 0x2D7072697A65537472617465677900000000A264697066735822 SLT KECCAK256 CALLVALUE 0xAA 0xE2 0xB6 0xAD 0xD5 0xA6 CREATE SWAP10 0xBF 0xD2 PUSH8 0x7F324945E51B2CB ADDMOD CALLVALUE 0x4B RETURNDATASIZE GAS 0xAD PUSH30 0xC87C6B254C64736F6C634300060C00330000000000000000000000000000 ",
              "sourceMap": "236:631:64:-:0;;;496:74;;;;;;;;;;535:30;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;524:8:64;:41;;-1:-1:-1;;;;;;524:41:64;-1:-1:-1;;;;;524:41:64;;;;;;;;;;236:631;;;;;;;;;;:::o;:::-;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106100415760003560e01c8063022ec09514610046578063b3eeb5e21461006a578063efc81a8c14610120575b600080fd5b61004e610128565b604080516001600160a01b039092168252519081900360200190f35b61004e6004803603604081101561008057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100ab57600080fd5b8201836020820111156100bd57600080fd5b803590602001918460018302840111640100000000831117156100df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610137945050505050565b61004e6102b3565b6000546001600160a01b031681565b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a18251156102ac576000826001600160a01b0316846040518082805190602001908083835b602083106102035780518252601f1990920191602091820191016101e4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610265576040519150601f19603f3d011682016040523d82523d6000602084013e61026a565b606091505b50509050806102aa5760405162461bcd60e51b81526004018080602001828103825260248152602001806102de6024913960400191505060405180910390fd5b505b5092915050565b6000805460408051602081019091528281526102d8916001600160a01b031690610137565b90509056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a26469706673582212207641cad3a6c2a855e03369145b3325a086b8fb3f317cf56f8230d491a1adc15b64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x22EC095 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x6A JUMPI DUP1 PUSH4 0xEFC81A8C EQ PUSH2 0x120 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x128 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x137 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x4E PUSH2 0x2B3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x265 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x26A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2DE PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE DUP3 DUP2 MSTORE PUSH2 0x2D8 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x137 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 PUSH23 0x41CAD3A6C2A855E03369145B3325A086B8FB3F317CF56F DUP3 ADDRESS 0xD4 SWAP2 LOG1 0xAD 0xC1 JUMPDEST PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "236:631:64:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;369:40;;;:::i;:::-;;;;-1:-1:-1;;;;;369:40:64;;;;;;;;;;;;;;182:778:38;;;;;;;;;;;;;;;;-1:-1:-1;;;;;182:778:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;182:778:38;;-1:-1:-1;182:778:38;;-1:-1:-1;;;;;182:778:38:i;723:142:64:-;;;:::i;369:40::-;;;-1:-1:-1;;;;;369:40:64;;:::o;182:778:38:-;257:13;416:19;446:6;438:15;;416:37;;495:4;489:11;-1:-1:-1;;;514:5:38;507:81;620:11;613:4;606:5;602:16;595:37;-1:-1:-1;;;657:4:38;650:5;646:16;639:92;764:4;757:5;754:1;747:22;786:28;;;-1:-1:-1;;;;;786:28:38;;;;;;738:31;;-1:-1:-1;786:28:38;;-1:-1:-1;786:28:38;;;;;;;824:12;;:16;821:135;;851:12;868:5;-1:-1:-1;;;;;868:10:38;879:5;868:17;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;868:17:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;850:35;;;901:7;893:56;;;;-1:-1:-1;;;893:56:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;821:135;;182:778;;;;;:::o;723:142:64:-;759:24;845:8;;823:36;;;;;;;;;;;;;;-1:-1:-1;;;;;845:8:64;;823:13;:36::i;:::-;791:69;;723:142;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "164600",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "create()": "infinite",
                "deployMinimal(address,bytes)": "infinite",
                "instance()": "1015"
              }
            },
            "methodIdentifiers": {
              "create()": "efc81a8c",
              "deployMinimal(address,bytes)": "b3eeb5e2",
              "instance()": "022ec095"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"name\":\"ProxyCreated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract CompoundPrizePoolHarness\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"deployMinimal\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"instance\",\"outputs\":[{\"internalType\":\"contract CompoundPrizePoolHarness\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"create()\":{\"returns\":{\"_0\":\"A reference to the new proxied Compound Prize Pool\"}}},\"title\":\"Compound Prize Pool Proxy Factory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":\"Initializes the Factory with an instance of the Compound Prize Pool\",\"create()\":{\"notice\":\"Creates a new Compound Prize Pool as a proxy of the template instance\"},\"instance()\":{\"notice\":\"Contract template for deploying proxied Prize Pools\"}},\"notice\":\"Minimal proxy pattern for creating new Compound Prize Pools\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/CompoundPrizePoolHarnessProxyFactory.sol\":\"CompoundPrizePoolHarnessProxyFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"contracts/external/compound/CTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface CTokenInterface is IERC20Upgradeable {\\n    function decimals() external view returns (uint8);\\n    function totalSupply() external override view returns (uint256);\\n    function underlying() external view returns (address);\\n    function balanceOfUnderlying(address owner) external returns (uint256);\\n    function supplyRatePerBlock() external returns (uint256);\\n    function exchangeRateCurrent() external returns (uint256);\\n    function mint(uint256 mintAmount) external returns (uint256);\\n    function redeem(uint256 amount) external returns (uint256);\\n    function balanceOf(address user) external override view returns (uint256);\\n    function redeemUnderlying(uint256 redeemAmount) external returns (uint256);\\n}\\n\",\"keccak256\":\"0x9608049458bc017f2369e2af2a20bfa2efaff1a5b451a17bd0594a976d5bc88f\",\"license\":\"GPL-3.0\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"},\"contracts/external/openzeppelin/ProxyFactory.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\n// solium-disable security/no-inline-assembly\\n// solium-disable security/no-low-level-calls\\ncontract ProxyFactory {\\n\\n  event ProxyCreated(address proxy);\\n\\n  function deployMinimal(address _logic, bytes memory _data) public returns (address proxy) {\\n    // Adapted from https://github.com/optionality/clone-factory/blob/32782f82dfc5a00d103a7e61a17a5dedbd1e8e9d/contracts/CloneFactory.sol\\n    bytes20 targetBytes = bytes20(_logic);\\n    assembly {\\n      let clone := mload(0x40)\\n      mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n      mstore(add(clone, 0x14), targetBytes)\\n      mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n      proxy := create(0, clone, 0x37)\\n    }\\n\\n    emit ProxyCreated(address(proxy));\\n\\n    if(_data.length > 0) {\\n      (bool success,) = proxy.call(_data);\\n      require(success, \\\"ProxyFactory/constructor-call-failed\\\");\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0xf0422303985796fdd8bdf772ac8e34331e2e63006f657989cca010fa4776d735\"},\"contracts/prize-pool/PrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../external/compound/ICompLike.sol\\\";\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../reserve/ReserveInterface.sol\\\";\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/TokenListenerLibrary.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\nimport \\\"./PrizePoolInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using SafeERC20Upgradeable for IERC721Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    address reserveRegistry,\\n    uint256 maxExitFeeMantissa\\n  );\\n\\n  /// @dev Event emitted when controlled token is added\\n  event ControlledTokenAdded(\\n    ControlledTokenInterface indexed token\\n  );\\n\\n  /// @dev Emitted when reserve is captured.\\n  event ReserveFeeCaptured(\\n    uint256 amount\\n  );\\n\\n  event AwardCaptured(\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when assets are deposited\\n  event Deposited(\\n    address indexed operator,\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount,\\n    address referrer\\n  );\\n\\n  /// @dev Event emitted when interest is awarded to a winner\\n  event Awarded(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are awarded to a winner\\n  event AwardedExternalERC20(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are transferred out\\n  event TransferredExternalERC20(\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC721s are awarded to a winner\\n  event AwardedExternalERC721(\\n    address indexed winner,\\n    address indexed token,\\n    uint256[] tokenIds\\n  );\\n\\n  /// @dev Event emitted when assets are withdrawn instantly\\n  event InstantWithdrawal(\\n    address indexed operator,\\n    address indexed from,\\n    address indexed token,\\n    uint256 amount,\\n    uint256 redeemed,\\n    uint256 exitFee\\n  );\\n\\n  event ReserveWithdrawal(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when the Liquidity Cap is set\\n  event LiquidityCapSet(\\n    uint256 liquidityCap\\n  );\\n\\n  /// @dev Event emitted when the Credit plan is set\\n  event CreditPlanSet(\\n    address token,\\n    uint128 creditLimitMantissa,\\n    uint128 creditRateMantissa\\n  );\\n\\n  /// @dev Event emitted when the Prize Strategy is set\\n  event PrizeStrategySet(\\n    address indexed prizeStrategy\\n  );\\n\\n  /// @dev Emitted when credit is minted\\n  event CreditMinted(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when credit is burned\\n  event CreditBurned(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\\n  event ErrorAwardingExternalERC721(bytes error);\\n\\n\\n  struct CreditPlan {\\n    uint128 creditLimitMantissa;\\n    uint128 creditRateMantissa;\\n  }\\n\\n  struct CreditBalance {\\n    uint192 balance;\\n    uint32 timestamp;\\n    bool initialized;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  /// @dev Reserve to which reserve fees are sent\\n  RegistryInterface public reserveRegistry;\\n\\n  /// @dev An array of all the controlled tokens\\n  ControlledTokenInterface[] internal _tokens;\\n\\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\\n  TokenListenerInterface public prizeStrategy;\\n\\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\\n  /// For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\\n  uint256 public maxExitFeeMantissa;\\n\\n  /// @dev The total funds that have been allocated to the reserve\\n  uint256 public reserveTotalSupply;\\n\\n  /// @dev The total amount of funds that the prize pool can hold.\\n  uint256 public liquidityCap;\\n\\n  /// @dev the The awardable balance\\n  uint256 internal _currentAwardBalance;\\n\\n  /// @dev Stores the credit plan for each token.\\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\\n\\n  /// @dev Stores each users balance of credit per token.\\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\\n\\n  /// @notice Initializes the Prize Pool\\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\\n  /// @param _maxExitFeeMantissa The maximum exit fee size\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_reserveRegistry) != address(0), \\\"PrizePool/reserveRegistry-not-zero\\\");\\n    uint256 controlledTokensLength = _controlledTokens.length;\\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\\n\\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\\n      _addControlledToken(controlledToken, i);\\n    }\\n    __Ownable_init();\\n    __ReentrancyGuard_init();\\n    _setLiquidityCap(uint256(-1));\\n\\n    reserveRegistry = _reserveRegistry;\\n    maxExitFeeMantissa = _maxExitFeeMantissa;\\n\\n    emit Initialized(\\n      address(_reserveRegistry),\\n      maxExitFeeMantissa\\n    );\\n  }\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external override view returns (address) {\\n    return address(_token());\\n  }\\n\\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\\n  /// @return The underlying balance of assets\\n  function balance() external returns (uint256) {\\n    return _balance();\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function canAwardExternal(address _externalToken) external view returns (bool) {\\n    return _canAwardExternal(_externalToken);\\n  }\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    canAddLiquidity(amount)\\n  {\\n    address operator = _msgSender();\\n\\n    _mint(to, amount, controlledToken, referrer);\\n\\n    _token().safeTransferFrom(operator, address(this), amount);\\n    _supply(amount);\\n\\n    emit Deposited(operator, to, controlledToken, amount, referrer);\\n  }\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    returns (uint256)\\n  {\\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n    require(exitFee <= maximumExitFee, \\\"PrizePool/exit-fee-exceeds-user-maximum\\\");\\n\\n    // burn the credit\\n    _burnCredit(from, controlledToken, burnedCredit);\\n\\n    // burn the tickets\\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\\n\\n    // redeem the tickets less the fee\\n    uint256 amountLessFee = amount.sub(exitFee);\\n    uint256 redeemed = _redeem(amountLessFee);\\n\\n    _token().safeTransfer(from, redeemed);\\n\\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\\n\\n    return exitFee;\\n  }\\n\\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\\n  /// @param exitFee The exit fee to check against the limit\\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\\n    if (exitFee > maxFee) {\\n      exitFee = maxFee;\\n    }\\n    return exitFee;\\n  }\\n\\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\\n  /// @param from The address the tokens are being transferred from (0 if minting)\\n  /// @param to The address the tokens are being transferred to (0 if burning)\\n  /// @param amount The amount of tokens being trasferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\\n    if (from != address(0)) {\\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\\n      // first accrue credit for their old balance\\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\\n\\n      if (from != to) {\\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\\n      }\\n\\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\\n    }\\n    if (to != address(0) && to != from) {\\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\\n    }\\n    // if we aren't minting\\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\\n    }\\n  }\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external override view returns (uint256) {\\n    return _currentAwardBalance;\\n  }\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n\\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\\n    uint256 currentBalance = _balance();\\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\\n\\n    if (unaccountedPrizeBalance > 0) {\\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\\n      if (reserveFee > 0) {\\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\\n        emit ReserveFeeCaptured(reserveFee);\\n      }\\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\\n\\n      emit AwardCaptured(unaccountedPrizeBalance);\\n    }\\n\\n    return _currentAwardBalance;\\n  }\\n\\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\\n\\n    uint256 amount = reserveTotalSupply;\\n    reserveTotalSupply = 0;\\n    uint256 redeemed = _redeem(amount);\\n\\n    _token().safeTransfer(address(to), redeemed);\\n\\n    emit ReserveWithdrawal(to, amount);\\n\\n    return redeemed;\\n  }\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external override\\n    onlyPrizeStrategy\\n    onlyControlledToken(controlledToken)\\n  {\\n    if (amount == 0) {\\n      return;\\n    }\\n\\n    require(amount <= _currentAwardBalance, \\\"PrizePool/award-exceeds-avail\\\");\\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\\n\\n    _mint(to, amount, controlledToken, address(0));\\n\\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\\n\\n    emit Awarded(to, controlledToken, amount);\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit TransferredExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit AwardedExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  function _transferOut(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (bool)\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (amount == 0) {\\n      return false;\\n    }\\n\\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\\n\\n    return true;\\n  }\\n\\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\\n  /// @param to The user who is receiving the tokens\\n  /// @param amount The amount of tokens they are receiving\\n  /// @param controlledToken The token that is going to be minted\\n  /// @param referrer The user who referred the minting\\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\\n    if (address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n    ControlledToken(controlledToken).controllerMint(to, amount);\\n  }\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (tokenIds.length == 0) {\\n      return;\\n    }\\n\\n    for (uint256 i = 0; i < tokenIds.length; i++) {\\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\\n\\n      }\\n      catch(bytes memory error){\\n        emit ErrorAwardingExternalERC721(error);\\n      }\\n      \\n    }\\n\\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\\n  }\\n\\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\\n  /// @param amount The prize amount\\n  /// @return The size of the reserve portion of the prize\\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    if (address(reserve) == address(0)) {\\n      return 0;\\n    }\\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\\n    if (reserveRateMantissa == 0) {\\n      return 0;\\n    }\\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\\n  }\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external override\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    )\\n  {\\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n  }\\n\\n  /// @dev Calculates the early exit fee for the given amount\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return Exit fee\\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\\n    return _limitExitFee(\\n      amount,\\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external override\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    durationSeconds =_estimateCreditAccrualTime(\\n      _controlledToken,\\n      _principal,\\n      _interest\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function _estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    internal\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    // interest = credit rate * principal * time\\n    // => time = interest / (credit rate * principal)\\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\\n    if (accruedPerSecond == 0) {\\n      return 0;\\n    }\\n    return _interest.div(accruedPerSecond);\\n  }\\n\\n  /// @notice Burns a users credit.\\n  /// @param user The user whose credit should be burned\\n  /// @param credit The amount of credit to burn\\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\\n\\n    emit CreditBurned(user, controlledToken, credit);\\n  }\\n\\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\\n  /// @param user The user for whom to accrue credit\\n  /// @param controlledToken The controlled token whose balance we are checking\\n  /// @param controlledTokenBalance The balance to use for the user\\n  /// @param extra Additional credit to be added\\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\\n    _updateCreditBalance(\\n      user,\\n      controlledToken,\\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\\n    );\\n  }\\n\\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\\n    uint256 newBalance;\\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\\n    if (!creditBalance.initialized) {\\n      newBalance = 0;\\n    } else {\\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\\n    }\\n    return newBalance;\\n  }\\n\\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\\n\\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\\n      balance: newBalance.toUint128(),\\n      timestamp: _currentTime().toUint32(),\\n      initialized: true\\n    });\\n\\n    if (oldBalance < newBalance) {\\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\\n    } \\n    else if (newBalance < oldBalance) {\\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\\n    }\\n  }\\n\\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\\n  /// @param creditBalance The new credit balance to be checked\\n  /// @return The users new credit balance.  Will not exceed the credit limit.\\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\\n      controlledTokenBalance,\\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\\n    );\\n    if (creditBalance > creditLimit) {\\n      creditBalance = creditLimit;\\n    }\\n\\n    return creditBalance;\\n  }\\n\\n  /// @notice Calculates the accrued interest for a user\\n  /// @param user The user whose credit should be calculated.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\\n  /// @return The credit that has accrued since the last credit update.\\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\\n\\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\\n      return 0;\\n    }\\n\\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\\n  }\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\\n    return _tokenCreditBalances[controlledToken][user].balance;\\n  }\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external override\\n    onlyControlledToken(_controlledToken)\\n    onlyOwner\\n  {\\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\\n      creditLimitMantissa: _creditLimitMantissa,\\n      creditRateMantissa: _creditRateMantissa\\n    });\\n\\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\\n  }\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external override\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    )\\n  {\\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\\n  }\\n\\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The token they are withdrawing\\n  /// @param amount The amount of funds they are withdrawing\\n  /// @return earlyExitFee The additional exit fee that should be charged.\\n  /// @return creditBurned The amount of credit that will be burned\\n  function _calculateEarlyExitFeeLessBurnedCredit(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (\\n      uint256 earlyExitFee,\\n      uint256 creditBurned\\n    )\\n  {\\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\\n    require(controlledTokenBalance >= amount, \\\"PrizePool/insuff-funds\\\");\\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\\n    /*\\n    The credit is used *last*.  Always charge the fees up-front.\\n\\n    How to calculate:\\n\\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\\n\\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\\n    */\\n\\n    // Determine available usable credit based on withdraw amount\\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\\n\\n    uint256 availableCredit;\\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\\n    }\\n\\n    // Determine amount of credit to burn and amount of fees required\\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\\n    earlyExitFee = totalExitFee.sub(creditBurned);\\n  }\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\\n    _setLiquidityCap(_liquidityCap);\\n  }\\n\\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\\n    liquidityCap = _liquidityCap;\\n    emit LiquidityCapSet(_liquidityCap);\\n  }\\n\\n  /// @notice Adds a new controlled token\\n  /// @param _controlledToken The controlled token to add.\\n  /// @param index The index to add the controlledToken\\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\\n    require(_controlledToken.controller() == this, \\\"PrizePool/token-ctrlr-mismatch\\\");\\n    \\n    _tokens[index] = _controlledToken;\\n    emit ControlledTokenAdded(_controlledToken);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\\n    _setPrizeStrategy(_prizeStrategy);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\\n    require(address(_prizeStrategy) != address(0), \\\"PrizePool/prizeStrategy-not-zero\\\");\\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PrizePool/prizeStrategy-invalid\\\");\\n    prizeStrategy = _prizeStrategy;\\n\\n    emit PrizeStrategySet(address(_prizeStrategy));\\n  }\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\\n    return _tokens;\\n  }\\n\\n  /// @dev Gets the current time as represented by the current block\\n  /// @return The timestamp of the current block\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external override view returns (uint256) {\\n    return _tokenTotalSupply();\\n  }\\n\\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\\n  /// @param to The address to delegate to \\n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\\n    if (compLike.balanceOf(address(this)) > 0) {\\n      compLike.delegate(to);\\n    }\\n  }\\n  \\n  /// @notice Required for ERC721 safe token transfers from smart contracts.\\n  /// @param operator The address that acts on behalf of the owner\\n  /// @param from The current owner of the NFT\\n  /// @param tokenId The NFT to transfer\\n  /// @param data Additional data with no specified format, sent in call to `_to`.\\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function _tokenTotalSupply() internal view returns (uint256) {\\n    uint256 total = reserveTotalSupply;\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \\n    uint256 tokensLength = tokens.length;\\n    \\n    for(uint256 i = 0; i < tokensLength; i++){\\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\\n    }\\n\\n    return total;\\n  }\\n\\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\\n  }\\n\\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\\n    uint256 tokensLength = tokens.length;\\n\\n    for(uint256 i = 0; i < tokensLength; i++) {\\n      if(tokens[i] == controlledToken) return true;\\n    }\\n    return false;\\n  }\\n  \\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\\n    return _isControlled(controlledToken);\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function _token() internal virtual view returns (IERC20Upgradeable);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal virtual returns (uint256);\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal virtual;\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\\n\\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  modifier onlyControlledToken(address controlledToken) {\\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \\\"PrizePool/unknown-token\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure caller is the prize-strategy\\n  modifier onlyPrizeStrategy() {\\n    require(_msgSender() == address(prizeStrategy), \\\"PrizePool/only-prizeStrategy\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\\n  modifier canAddLiquidity(uint256 _amount) {\\n    require(_canAddLiquidity(_amount), \\\"PrizePool/exceeds-liquidity-cap\\\");\\n    _;\\n  }\\n\\n  modifier onlyReserve() {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    require(address(reserve) == msg.sender, \\\"PrizePool/only-reserve\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x386ebc1c80ab4424f14125e716dd12641ff933b475bf1082b7b1a6eee4a969c3\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/compound/CompoundPrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../../external/compound/CTokenInterface.sol\\\";\\nimport \\\"../PrizePool.sol\\\";\\n\\n/// @title Prize Pool with Compound's cToken\\n/// @notice Manages depositing and withdrawing assets from the Prize Pool\\ncontract CompoundPrizePool is PrizePool {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n\\n  event CompoundPrizePoolInitialized(address indexed cToken);\\n\\n  /// @notice Interface for the Yield-bearing cToken by Compound\\n  CTokenInterface public cToken;\\n\\n  /// @notice Initializes the Prize Pool and Yield Service with the required contract connections\\n  /// @param _controlledTokens Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\\n  /// @param _maxExitFeeMantissa The maximum exit fee size, relative to the withdrawal amount\\n  /// @param _cToken Address of the Compound cToken interface\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa,\\n    CTokenInterface _cToken\\n  )\\n    public\\n    initializer\\n  {\\n    PrizePool.initialize(\\n      _reserveRegistry,\\n      _controlledTokens,\\n      _maxExitFeeMantissa\\n    );\\n    cToken = _cToken;\\n\\n    emit CompoundPrizePoolInitialized(address(cToken));\\n  }\\n\\n  /// @dev Gets the balance of the underlying assets held by the Yield Service\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal override returns (uint256) {\\n    return cToken.balanceOfUnderlying(address(this));\\n  }\\n\\n  /// @dev Allows a user to supply asset tokens in exchange for yield-bearing tokens\\n  /// to be held in escrow by the Yield Service\\n  /// @param amount The amount of asset tokens to be supplied\\n  function _supply(uint256 amount) internal override {\\n    _token().safeApprove(address(cToken), amount);\\n    require(cToken.mint(amount) == 0, \\\"CompoundPrizePool/mint-failed\\\");\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as a prize enhancement\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal override view returns (bool) {\\n    return _externalToken != address(cToken);\\n  }\\n\\n  /// @dev Allows a user to redeem yield-bearing tokens in exchange for the underlying\\n  /// asset tokens held in escrow by the Yield Service\\n  /// @param amount The amount of underlying tokens to be redeemed\\n  /// @return The actual amount of tokens transferred\\n  function _redeem(uint256 amount) internal override returns (uint256) {\\n    IERC20Upgradeable assetToken = _token();\\n    uint256 before = assetToken.balanceOf(address(this));\\n    require(cToken.redeemUnderlying(amount) == 0, \\\"CompoundPrizePool/redeem-failed\\\");\\n    uint256 diff = assetToken.balanceOf(address(this)).sub(before);\\n    return diff;\\n  }\\n\\n  /// @dev Gets the underlying asset token used by the Yield Service\\n  /// @return A reference to the interface of the underling asset token\\n  function _token() internal override view returns (IERC20Upgradeable) {\\n    return IERC20Upgradeable(cToken.underlying());\\n  }\\n}\\n\",\"keccak256\":\"0x094f4926923fad2a264e41f6eaabc161dc9969a6db6dbf3a170c266d27162ab6\",\"license\":\"GPL-3.0\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/test/CompoundPrizePoolHarness.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"../prize-pool/compound/CompoundPrizePool.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ncontract CompoundPrizePoolHarness is CompoundPrizePool {\\n\\n  uint256 public currentTime;\\n\\n  function setCurrentTime(uint256 _currentTime) external {\\n    currentTime = _currentTime;\\n  }\\n\\n  function _currentTime() internal override view returns (uint256) {\\n    return currentTime;\\n  }\\n\\n  function supply(uint256 mintAmount) external {\\n    _supply(mintAmount);\\n  }\\n\\n  function redeem(uint256 redeemAmount) external returns (uint256) {\\n    return _redeem(redeemAmount);\\n  }\\n}\",\"keccak256\":\"0x96649ae18cf4768d63d5edd6d717254efaeaa08f40c8db2708c92ed1456e8286\"},\"contracts/test/CompoundPrizePoolHarnessProxyFactory.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"./CompoundPrizePoolHarness.sol\\\";\\nimport \\\"../external/openzeppelin/ProxyFactory.sol\\\";\\n\\n/// @title Compound Prize Pool Proxy Factory\\n/// @notice Minimal proxy pattern for creating new Compound Prize Pools\\ncontract CompoundPrizePoolHarnessProxyFactory is ProxyFactory {\\n\\n  /// @notice Contract template for deploying proxied Prize Pools\\n  CompoundPrizePoolHarness public instance;\\n\\n  /// @notice Initializes the Factory with an instance of the Compound Prize Pool\\n  constructor () public {\\n    instance = new CompoundPrizePoolHarness();\\n  }\\n\\n  /// @notice Creates a new Compound Prize Pool as a proxy of the template instance\\n  /// @return A reference to the new proxied Compound Prize Pool\\n  function create() external returns (CompoundPrizePoolHarness) {\\n    return CompoundPrizePoolHarness(deployMinimal(address(instance), \\\"\\\"));\\n  }\\n}\\n\",\"keccak256\":\"0x8828f511ab47ed0bb335b5f115d4b2ac7000cfdeab549880fdf475799bd12ae2\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 12915,
                "contract": "contracts/test/CompoundPrizePoolHarnessProxyFactory.sol:CompoundPrizePoolHarnessProxyFactory",
                "label": "instance",
                "offset": 0,
                "slot": "0",
                "type": "t_contract(CompoundPrizePoolHarness)12905"
              }
            ],
            "types": {
              "t_contract(CompoundPrizePoolHarness)12905": {
                "encoding": "inplace",
                "label": "contract CompoundPrizePoolHarness",
                "numberOfBytes": "20"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "constructor": "Initializes the Factory with an instance of the Compound Prize Pool",
              "create()": {
                "notice": "Creates a new Compound Prize Pool as a proxy of the template instance"
              },
              "instance()": {
                "notice": "Contract template for deploying proxied Prize Pools"
              }
            },
            "notice": "Minimal proxy pattern for creating new Compound Prize Pools",
            "version": 1
          }
        }
      },
      "contracts/test/Dai.sol": {
        "Dai": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "chainId_",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Approval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Transfer",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "DOMAIN_SEPARATOR",
              "outputs": [
                {
                  "internalType": "bytes32",
                  "name": "",
                  "type": "bytes32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "PERMIT_TYPEHASH",
              "outputs": [
                {
                  "internalType": "bytes32",
                  "name": "",
                  "type": "bytes32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                }
              ],
              "name": "allowance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "approve",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "decimals",
              "outputs": [
                {
                  "internalType": "uint8",
                  "name": "",
                  "type": "uint8"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "subtractedValue",
                  "type": "uint256"
                }
              ],
              "name": "decreaseAllowance",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "addedValue",
                  "type": "uint256"
                }
              ],
              "name": "increaseAllowance",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "mint",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "name",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "nonces",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "holder",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "nonce",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "expiry",
                  "type": "uint256"
                },
                {
                  "internalType": "bool",
                  "name": "allowed",
                  "type": "bool"
                },
                {
                  "internalType": "uint8",
                  "name": "v",
                  "type": "uint8"
                },
                {
                  "internalType": "bytes32",
                  "name": "r",
                  "type": "bytes32"
                },
                {
                  "internalType": "bytes32",
                  "name": "s",
                  "type": "bytes32"
                }
              ],
              "name": "permit",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "symbol",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transfer",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "sender",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transferFrom",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "allowance(address,address)": {
                "details": "See {IERC20-allowance}."
              },
              "approve(address,uint256)": {
                "details": "See {IERC20-approve}. Requirements: - `spender` cannot be the zero address."
              },
              "balanceOf(address)": {
                "details": "See {IERC20-balanceOf}."
              },
              "constructor": {
                "details": "Sets the values for {name} and {symbol}, initializes {decimals} with a default value of 18. To select a different value for {decimals}, use {_setupDecimals}. All three of these values are immutable: they can only be set once during construction."
              },
              "decimals()": {
                "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is called. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."
              },
              "decreaseAllowance(address,uint256)": {
                "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."
              },
              "increaseAllowance(address,uint256)": {
                "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address."
              },
              "name()": {
                "details": "Returns the name of the token."
              },
              "symbol()": {
                "details": "Returns the symbol of the token, usually a shorter version of the name."
              },
              "totalSupply()": {
                "details": "See {IERC20-totalSupply}."
              },
              "transfer(address,uint256)": {
                "details": "See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`."
              },
              "transferFrom(address,address,uint256)": {
                "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}; Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60806040523480156200001157600080fd5b506040516200112e3803806200112e833981810160405260208110156200003757600080fd5b505160408051808201825260018152603160f81b6020828101919091528251808401909352600e8084526d2230b49029ba30b13632b1b7b4b760911b9390910192835290916200008b9160039190620001a8565b506040805180820190915260038082526244414960e81b6020909201918252620000b891600491620001a8565b506005805460ff19166012179055604051600380547f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f9290819083906002600019600183161561010002019091160480156200014e5780601f106200012b5761010080835404028352918201916200014e565b820191906000526020600020905b81548152906001019060200180831162000139575b505060408051918290038220865160209788012087840196909652828201526060820194909452608081019590955250503060a0808501919091528151808503909101815260c09093019052815191012060075562000244565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001eb57805160ff19168380011785556200021b565b828001600101855582156200021b579182015b828111156200021b578251825591602001919060010190620001fe565b50620002299291506200022d565b5090565b5b808211156200022957600081556001016200022e565b610eda80620002546000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806340c10f191161009757806395d89b411161006657806395d89b4114610340578063a457c2d714610348578063a9059cbb14610374578063dd62ed3e146103a057610100565b806340c10f191461026c57806370a082311461029a5780637ecebe00146102c05780638fcbaf0c146102e657610100565b806330adf81f116100d357806330adf81f14610212578063313ce5671461021a5780633644e51514610238578063395093511461024057610100565b806306fdde0314610105578063095ea7b31461018257806318160ddd146101c257806323b872dd146101dc575b600080fd5b61010d6103ce565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561014757818101518382015260200161012f565b50505050905090810190601f1680156101745780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101ae6004803603604081101561019857600080fd5b506001600160a01b038135169060200135610464565b604080519115158252519081900360200190f35b6101ca61047a565b60408051918252519081900360200190f35b6101ae600480360360608110156101f257600080fd5b506001600160a01b03813581169160208101359091169060400135610480565b6101ca6104e9565b61022261050d565b6040805160ff9092168252519081900360200190f35b6101ca610516565b6101ae6004803603604081101561025657600080fd5b506001600160a01b03813516906020013561051c565b6102986004803603604081101561028257600080fd5b506001600160a01b038135169060200135610552565b005b6101ca600480360360208110156102b057600080fd5b50356001600160a01b0316610560565b6101ca600480360360208110156102d657600080fd5b50356001600160a01b031661057b565b61029860048036036101008110156102fd57600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608081013515159060ff60a0820135169060c08101359060e0013561058d565b61010d610887565b6101ae6004803603604081101561035e57600080fd5b506001600160a01b0381351690602001356108e8565b6101ae6004803603604081101561038a57600080fd5b506001600160a01b038135169060200135610937565b6101ca600480360360408110156103b657600080fd5b506001600160a01b0381358116916020013516610944565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561045a5780601f1061042f5761010080835404028352916020019161045a565b820191906000526020600020905b81548152906001019060200180831161043d57829003601f168201915b5050505050905090565b600061047133848461096f565b50600192915050565b60025490565b600061048d848484610a5b565b6104df84336104da85604051806060016040528060288152602001610e0f602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190610bb6565b61096f565b5060019392505050565b7fea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb81565b60055460ff1690565b60075481565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916104719185906104da9086610c4d565b61055c8282610cae565b5050565b6001600160a01b031660009081526020819052604090205490565b60066020526000908152604090205481565b600754604080517fea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb6020808301919091526001600160a01b03808d16838501819052908c166060840152608083018b905260a083018a905288151560c0808501919091528451808503909101815260e08401855280519083012061190160f01b6101008501526101028401959095526101228084019590955283518084039095018552610142909201909252825192909101919091209061068d576040805162461bcd60e51b815260206004820152601560248201527404461692f696e76616c69642d616464726573732d3605c1b604482015290519081900360640190fd5b60018185858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156106e7573d6000803e3d6000fd5b505050602060405103516001600160a01b0316896001600160a01b03161461074b576040805162461bcd60e51b815260206004820152601260248201527111185a4bda5b9d985b1a590b5c195c9b5a5d60721b604482015290519081900360640190fd5b8515806107585750854211155b61079e576040805162461bcd60e51b815260206004820152601260248201527111185a4bdc195c9b5a5d0b595e1c1a5c995960721b604482015290519081900360640190fd5b6001600160a01b03891660009081526006602052604090208054600181019091558714610806576040805162461bcd60e51b81526020600482015260116024820152704461692f696e76616c69642d6e6f6e636560781b604482015290519081900360640190fd5b600085610814576000610818565b6000195b6001600160a01b03808c166000818152600160209081526040808320948f168084529482529182902085905581518581529151949550929391927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92592918290030190a350505050505050505050565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561045a5780601f1061042f5761010080835404028352916020019161045a565b600061047133846104da85604051806060016040528060258152602001610e80602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190610bb6565b6000610471338484610a5b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166109b45760405162461bcd60e51b8152600401808060200182810382526024815260200180610e5c6024913960400191505060405180910390fd5b6001600160a01b0382166109f95760405162461bcd60e51b8152600401808060200182810382526022815260200180610dc76022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610aa05760405162461bcd60e51b8152600401808060200182810382526025815260200180610e376025913960400191505060405180910390fd5b6001600160a01b038216610ae55760405162461bcd60e51b8152600401808060200182810382526023815260200180610da46023913960400191505060405180910390fd5b610af0838383610d9e565b610b2d81604051806060016040528060268152602001610de9602691396001600160a01b0386166000908152602081905260409020549190610bb6565b6001600160a01b038085166000908152602081905260408082209390935590841681522054610b5c9082610c4d565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115610c455760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610c0a578181015183820152602001610bf2565b50505050905090810190601f168015610c375780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015610ca7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216610d09576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b610d1560008383610d9e565b600254610d229082610c4d565b6002556001600160a01b038216600090815260208190526040902054610d489082610c4d565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220673726fa1d687aac558150ae6fbad2aaf620ecd80f9f8b38d91a099abe89985a64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x112E CODESIZE SUB DUP1 PUSH3 0x112E DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE PUSH1 0x20 DUP2 LT ISZERO PUSH3 0x37 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 DUP2 MSTORE PUSH1 0x31 PUSH1 0xF8 SHL PUSH1 0x20 DUP3 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE PUSH1 0xE DUP1 DUP5 MSTORE PUSH14 0x2230B49029BA30B13632B1B7B4B7 PUSH1 0x91 SHL SWAP4 SWAP1 SWAP2 ADD SWAP3 DUP4 MSTORE SWAP1 SWAP2 PUSH3 0x8B SWAP2 PUSH1 0x3 SWAP2 SWAP1 PUSH3 0x1A8 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP1 DUP3 MSTORE PUSH3 0x444149 PUSH1 0xE8 SHL PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 DUP3 MSTORE PUSH3 0xB8 SWAP2 PUSH1 0x4 SWAP2 PUSH3 0x1A8 JUMP JUMPDEST POP PUSH1 0x5 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x12 OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F SWAP3 SWAP1 DUP2 SWAP1 DUP4 SWAP1 PUSH1 0x2 PUSH1 0x0 NOT PUSH1 0x1 DUP4 AND ISZERO PUSH2 0x100 MUL ADD SWAP1 SWAP2 AND DIV DUP1 ISZERO PUSH3 0x14E JUMPI DUP1 PUSH1 0x1F LT PUSH3 0x12B JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH3 0x14E JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH3 0x139 JUMPI JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB DUP3 KECCAK256 DUP7 MLOAD PUSH1 0x20 SWAP8 DUP9 ADD KECCAK256 DUP8 DUP5 ADD SWAP7 SWAP1 SWAP7 MSTORE DUP3 DUP3 ADD MSTORE PUSH1 0x60 DUP3 ADD SWAP5 SWAP1 SWAP5 MSTORE PUSH1 0x80 DUP2 ADD SWAP6 SWAP1 SWAP6 MSTORE POP POP ADDRESS PUSH1 0xA0 DUP1 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP2 MLOAD DUP1 DUP6 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0xC0 SWAP1 SWAP4 ADD SWAP1 MSTORE DUP2 MLOAD SWAP2 ADD KECCAK256 PUSH1 0x7 SSTORE PUSH3 0x244 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x1EB JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x21B JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x21B JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x21B JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x1FE JUMP JUMPDEST POP PUSH3 0x229 SWAP3 SWAP2 POP PUSH3 0x22D JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x229 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x22E JUMP JUMPDEST PUSH2 0xEDA DUP1 PUSH3 0x254 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x100 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x40C10F19 GT PUSH2 0x97 JUMPI DUP1 PUSH4 0x95D89B41 GT PUSH2 0x66 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x340 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x348 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x374 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x3A0 JUMPI PUSH2 0x100 JUMP JUMPDEST DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x26C JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x29A JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x2C0 JUMPI DUP1 PUSH4 0x8FCBAF0C EQ PUSH2 0x2E6 JUMPI PUSH2 0x100 JUMP JUMPDEST DUP1 PUSH4 0x30ADF81F GT PUSH2 0xD3 JUMPI DUP1 PUSH4 0x30ADF81F EQ PUSH2 0x212 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x21A JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x238 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x240 JUMPI PUSH2 0x100 JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x105 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x182 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x1C2 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1DC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x10D PUSH2 0x3CE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x147 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x12F JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x174 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1AE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x198 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x464 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1CA PUSH2 0x47A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1AE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x1F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x480 JUMP JUMPDEST PUSH2 0x1CA PUSH2 0x4E9 JUMP JUMPDEST PUSH2 0x222 PUSH2 0x50D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1CA PUSH2 0x516 JUMP JUMPDEST PUSH2 0x1AE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x256 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x51C JUMP JUMPDEST PUSH2 0x298 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x282 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x552 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1CA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x560 JUMP JUMPDEST PUSH2 0x1CA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x57B JUMP JUMPDEST PUSH2 0x298 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x100 DUP2 LT ISZERO PUSH2 0x2FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x80 DUP2 ADD CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0xFF PUSH1 0xA0 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0xC0 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0xE0 ADD CALLDATALOAD PUSH2 0x58D JUMP JUMPDEST PUSH2 0x10D PUSH2 0x887 JUMP JUMPDEST PUSH2 0x1AE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x35E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x8E8 JUMP JUMPDEST PUSH2 0x1AE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x38A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x937 JUMP JUMPDEST PUSH2 0x1CA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x944 JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x45A JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x42F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x45A JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x43D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x471 CALLER DUP5 DUP5 PUSH2 0x96F JUMP JUMPDEST POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x48D DUP5 DUP5 DUP5 PUSH2 0xA5B JUMP JUMPDEST PUSH2 0x4DF DUP5 CALLER PUSH2 0x4DA DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE0F PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0xBB6 JUMP JUMPDEST PUSH2 0x96F JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0xEA2AA0A1BE11A07ED86D755C93467F4F82362B452371D1BA94D1715123511ACB DUP2 JUMP JUMPDEST PUSH1 0x5 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD SWAP1 SWAP2 PUSH2 0x471 SWAP2 DUP6 SWAP1 PUSH2 0x4DA SWAP1 DUP7 PUSH2 0xC4D JUMP JUMPDEST PUSH2 0x55C DUP3 DUP3 PUSH2 0xCAE JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x7 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0xEA2AA0A1BE11A07ED86D755C93467F4F82362B452371D1BA94D1715123511ACB PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP14 AND DUP4 DUP6 ADD DUP2 SWAP1 MSTORE SWAP1 DUP13 AND PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD DUP12 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD DUP11 SWAP1 MSTORE DUP9 ISZERO ISZERO PUSH1 0xC0 DUP1 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP5 MLOAD DUP1 DUP6 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0xE0 DUP5 ADD DUP6 MSTORE DUP1 MLOAD SWAP1 DUP4 ADD KECCAK256 PUSH2 0x1901 PUSH1 0xF0 SHL PUSH2 0x100 DUP6 ADD MSTORE PUSH2 0x102 DUP5 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH2 0x122 DUP1 DUP5 ADD SWAP6 SWAP1 SWAP6 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP6 ADD DUP6 MSTORE PUSH2 0x142 SWAP1 SWAP3 ADD SWAP1 SWAP3 MSTORE DUP3 MLOAD SWAP3 SWAP1 SWAP2 ADD SWAP2 SWAP1 SWAP2 KECCAK256 SWAP1 PUSH2 0x68D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH21 0x4461692F696E76616C69642D616464726573732D3 PUSH1 0x5C SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 DUP2 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x6E7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x74B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH18 0x11185A4BDA5B9D985B1A590B5C195C9B5A5D PUSH1 0x72 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP6 ISZERO DUP1 PUSH2 0x758 JUMPI POP DUP6 TIMESTAMP GT ISZERO JUMPDEST PUSH2 0x79E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH18 0x11185A4BDC195C9B5A5D0B595E1C1A5C9959 PUSH1 0x72 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP2 ADD SWAP1 SWAP2 SSTORE DUP8 EQ PUSH2 0x806 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH17 0x4461692F696E76616C69642D6E6F6E6365 PUSH1 0x78 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP6 PUSH2 0x814 JUMPI PUSH1 0x0 PUSH2 0x818 JUMP JUMPDEST PUSH1 0x0 NOT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP13 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP16 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE DUP2 MLOAD DUP6 DUP2 MSTORE SWAP2 MLOAD SWAP5 SWAP6 POP SWAP3 SWAP4 SWAP2 SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x45A JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x42F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x45A JUMP JUMPDEST PUSH1 0x0 PUSH2 0x471 CALLER DUP5 PUSH2 0x4DA DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE80 PUSH1 0x25 SWAP2 CODECOPY CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0xBB6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x471 CALLER DUP5 DUP5 PUSH2 0xA5B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x9B4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xE5C PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x9F9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xDC7 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE DUP2 MLOAD DUP6 DUP2 MSTORE SWAP2 MLOAD PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0xAA0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xE37 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xAE5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xDA4 PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xAF0 DUP4 DUP4 DUP4 PUSH2 0xD9E JUMP JUMPDEST PUSH2 0xB2D DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xDE9 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0xBB6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP5 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0xB5C SWAP1 DUP3 PUSH2 0xC4D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 SWAP3 DUP8 AND SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP5 DUP5 GT ISZERO PUSH2 0xC45 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xC0A JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xBF2 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xC37 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xCA7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xD09 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xD15 PUSH1 0x0 DUP4 DUP4 PUSH2 0xD9E JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH2 0xD22 SWAP1 DUP3 PUSH2 0xC4D JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0xD48 SWAP1 DUP3 PUSH2 0xC4D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP4 MLOAD DUP6 DUP2 MSTORE SWAP4 MLOAD SWAP3 SWAP4 SWAP2 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST POP POP POP JUMP INVALID GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220746F20746865207A65726F2061 PUSH5 0x6472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F766520746F20746865207A65726F20616464 PUSH19 0x65737345524332303A207472616E7366657220 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545524332 ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220616D6F756E7420657863656564 PUSH20 0x20616C6C6F77616E636545524332303A20747261 PUSH15 0x736665722066726F6D20746865207A PUSH6 0x726F20616464 PUSH19 0x65737345524332303A20617070726F76652066 PUSH19 0x6F6D20746865207A65726F2061646472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH5 0x6563726561 PUSH20 0x656420616C6C6F77616E63652062656C6F77207A PUSH6 0x726FA2646970 PUSH7 0x73582212206737 0x26 STATICCALL SAR PUSH9 0x7AAC558150AE6FBAD2 0xAA 0xF6 KECCAK256 0xEC 0xD8 0xF SWAP16 DUP12 CODESIZE 0xD9 BYTE MULMOD SWAP11 0xBE DUP10 SWAP9 GAS PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "259:10749:65:-:0;;;916:429;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;916:429:65;960:27;;;;;;;;;;;-1:-1:-1;;;916:429:65;960:27;;;;;;;994:24;;;;;;;;;;;;-1:-1:-1;;;994:24:65;;;;;;;960:27;;994:24;;:5;;:24;;:::i;:::-;-1:-1:-1;1024:15:65;;;;;;;;;;;;;-1:-1:-1;;;1024:15:65;;;;;;;;;:7;;:15;:::i;:::-;-1:-1:-1;1045:9:65;:14;;-1:-1:-1;;1045:14:65;1057:2;1045:14;;;1227:23;;1243:5;1227:23;;1122:95;;1227:23;;;1243:5;;1227:23;-1:-1:-1;;1045:14:65;1227:23;;;1045:14;1227:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1227:23:65;;;;;;;;;1260:25;;;;;;;1102:232;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1321:4:65;1102:232;;;;;;;;;;;;;;;;;;;;;;;;1085:255;;;;;1066:16;:274;259:10749;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;259:10749:65;;;-1:-1:-1;259:10749:65;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106101005760003560e01c806340c10f191161009757806395d89b411161006657806395d89b4114610340578063a457c2d714610348578063a9059cbb14610374578063dd62ed3e146103a057610100565b806340c10f191461026c57806370a082311461029a5780637ecebe00146102c05780638fcbaf0c146102e657610100565b806330adf81f116100d357806330adf81f14610212578063313ce5671461021a5780633644e51514610238578063395093511461024057610100565b806306fdde0314610105578063095ea7b31461018257806318160ddd146101c257806323b872dd146101dc575b600080fd5b61010d6103ce565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561014757818101518382015260200161012f565b50505050905090810190601f1680156101745780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101ae6004803603604081101561019857600080fd5b506001600160a01b038135169060200135610464565b604080519115158252519081900360200190f35b6101ca61047a565b60408051918252519081900360200190f35b6101ae600480360360608110156101f257600080fd5b506001600160a01b03813581169160208101359091169060400135610480565b6101ca6104e9565b61022261050d565b6040805160ff9092168252519081900360200190f35b6101ca610516565b6101ae6004803603604081101561025657600080fd5b506001600160a01b03813516906020013561051c565b6102986004803603604081101561028257600080fd5b506001600160a01b038135169060200135610552565b005b6101ca600480360360208110156102b057600080fd5b50356001600160a01b0316610560565b6101ca600480360360208110156102d657600080fd5b50356001600160a01b031661057b565b61029860048036036101008110156102fd57600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608081013515159060ff60a0820135169060c08101359060e0013561058d565b61010d610887565b6101ae6004803603604081101561035e57600080fd5b506001600160a01b0381351690602001356108e8565b6101ae6004803603604081101561038a57600080fd5b506001600160a01b038135169060200135610937565b6101ca600480360360408110156103b657600080fd5b506001600160a01b0381358116916020013516610944565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561045a5780601f1061042f5761010080835404028352916020019161045a565b820191906000526020600020905b81548152906001019060200180831161043d57829003601f168201915b5050505050905090565b600061047133848461096f565b50600192915050565b60025490565b600061048d848484610a5b565b6104df84336104da85604051806060016040528060288152602001610e0f602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190610bb6565b61096f565b5060019392505050565b7fea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb81565b60055460ff1690565b60075481565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916104719185906104da9086610c4d565b61055c8282610cae565b5050565b6001600160a01b031660009081526020819052604090205490565b60066020526000908152604090205481565b600754604080517fea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb6020808301919091526001600160a01b03808d16838501819052908c166060840152608083018b905260a083018a905288151560c0808501919091528451808503909101815260e08401855280519083012061190160f01b6101008501526101028401959095526101228084019590955283518084039095018552610142909201909252825192909101919091209061068d576040805162461bcd60e51b815260206004820152601560248201527404461692f696e76616c69642d616464726573732d3605c1b604482015290519081900360640190fd5b60018185858560405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156106e7573d6000803e3d6000fd5b505050602060405103516001600160a01b0316896001600160a01b03161461074b576040805162461bcd60e51b815260206004820152601260248201527111185a4bda5b9d985b1a590b5c195c9b5a5d60721b604482015290519081900360640190fd5b8515806107585750854211155b61079e576040805162461bcd60e51b815260206004820152601260248201527111185a4bdc195c9b5a5d0b595e1c1a5c995960721b604482015290519081900360640190fd5b6001600160a01b03891660009081526006602052604090208054600181019091558714610806576040805162461bcd60e51b81526020600482015260116024820152704461692f696e76616c69642d6e6f6e636560781b604482015290519081900360640190fd5b600085610814576000610818565b6000195b6001600160a01b03808c166000818152600160209081526040808320948f168084529482529182902085905581518581529151949550929391927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92592918290030190a350505050505050505050565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561045a5780601f1061042f5761010080835404028352916020019161045a565b600061047133846104da85604051806060016040528060258152602001610e80602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190610bb6565b6000610471338484610a5b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166109b45760405162461bcd60e51b8152600401808060200182810382526024815260200180610e5c6024913960400191505060405180910390fd5b6001600160a01b0382166109f95760405162461bcd60e51b8152600401808060200182810382526022815260200180610dc76022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610aa05760405162461bcd60e51b8152600401808060200182810382526025815260200180610e376025913960400191505060405180910390fd5b6001600160a01b038216610ae55760405162461bcd60e51b8152600401808060200182810382526023815260200180610da46023913960400191505060405180910390fd5b610af0838383610d9e565b610b2d81604051806060016040528060268152602001610de9602691396001600160a01b0386166000908152602081905260409020549190610bb6565b6001600160a01b038085166000908152602081905260408082209390935590841681522054610b5c9082610c4d565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115610c455760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610c0a578181015183820152602001610bf2565b50505050905090810190601f168015610c375780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015610ca7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216610d09576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b610d1560008383610d9e565b600254610d229082610c4d565b6002556001600160a01b038216600090815260208190526040902054610d489082610c4d565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220673726fa1d687aac558150ae6fbad2aaf620ecd80f9f8b38d91a099abe89985a64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x100 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x40C10F19 GT PUSH2 0x97 JUMPI DUP1 PUSH4 0x95D89B41 GT PUSH2 0x66 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x340 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x348 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x374 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x3A0 JUMPI PUSH2 0x100 JUMP JUMPDEST DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x26C JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x29A JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x2C0 JUMPI DUP1 PUSH4 0x8FCBAF0C EQ PUSH2 0x2E6 JUMPI PUSH2 0x100 JUMP JUMPDEST DUP1 PUSH4 0x30ADF81F GT PUSH2 0xD3 JUMPI DUP1 PUSH4 0x30ADF81F EQ PUSH2 0x212 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x21A JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x238 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x240 JUMPI PUSH2 0x100 JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x105 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x182 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x1C2 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1DC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x10D PUSH2 0x3CE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x147 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x12F JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x174 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1AE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x198 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x464 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1CA PUSH2 0x47A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1AE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x1F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x480 JUMP JUMPDEST PUSH2 0x1CA PUSH2 0x4E9 JUMP JUMPDEST PUSH2 0x222 PUSH2 0x50D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1CA PUSH2 0x516 JUMP JUMPDEST PUSH2 0x1AE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x256 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x51C JUMP JUMPDEST PUSH2 0x298 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x282 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x552 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1CA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x560 JUMP JUMPDEST PUSH2 0x1CA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x57B JUMP JUMPDEST PUSH2 0x298 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x100 DUP2 LT ISZERO PUSH2 0x2FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x80 DUP2 ADD CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0xFF PUSH1 0xA0 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0xC0 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0xE0 ADD CALLDATALOAD PUSH2 0x58D JUMP JUMPDEST PUSH2 0x10D PUSH2 0x887 JUMP JUMPDEST PUSH2 0x1AE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x35E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x8E8 JUMP JUMPDEST PUSH2 0x1AE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x38A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x937 JUMP JUMPDEST PUSH2 0x1CA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x944 JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x45A JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x42F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x45A JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x43D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x471 CALLER DUP5 DUP5 PUSH2 0x96F JUMP JUMPDEST POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x48D DUP5 DUP5 DUP5 PUSH2 0xA5B JUMP JUMPDEST PUSH2 0x4DF DUP5 CALLER PUSH2 0x4DA DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE0F PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0xBB6 JUMP JUMPDEST PUSH2 0x96F JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0xEA2AA0A1BE11A07ED86D755C93467F4F82362B452371D1BA94D1715123511ACB DUP2 JUMP JUMPDEST PUSH1 0x5 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD SWAP1 SWAP2 PUSH2 0x471 SWAP2 DUP6 SWAP1 PUSH2 0x4DA SWAP1 DUP7 PUSH2 0xC4D JUMP JUMPDEST PUSH2 0x55C DUP3 DUP3 PUSH2 0xCAE JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x7 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0xEA2AA0A1BE11A07ED86D755C93467F4F82362B452371D1BA94D1715123511ACB PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP14 AND DUP4 DUP6 ADD DUP2 SWAP1 MSTORE SWAP1 DUP13 AND PUSH1 0x60 DUP5 ADD MSTORE PUSH1 0x80 DUP4 ADD DUP12 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD DUP11 SWAP1 MSTORE DUP9 ISZERO ISZERO PUSH1 0xC0 DUP1 DUP6 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP5 MLOAD DUP1 DUP6 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0xE0 DUP5 ADD DUP6 MSTORE DUP1 MLOAD SWAP1 DUP4 ADD KECCAK256 PUSH2 0x1901 PUSH1 0xF0 SHL PUSH2 0x100 DUP6 ADD MSTORE PUSH2 0x102 DUP5 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH2 0x122 DUP1 DUP5 ADD SWAP6 SWAP1 SWAP6 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP6 ADD DUP6 MSTORE PUSH2 0x142 SWAP1 SWAP3 ADD SWAP1 SWAP3 MSTORE DUP3 MLOAD SWAP3 SWAP1 SWAP2 ADD SWAP2 SWAP1 SWAP2 KECCAK256 SWAP1 PUSH2 0x68D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH21 0x4461692F696E76616C69642D616464726573732D3 PUSH1 0x5C SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 DUP2 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x6E7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x74B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH18 0x11185A4BDA5B9D985B1A590B5C195C9B5A5D PUSH1 0x72 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP6 ISZERO DUP1 PUSH2 0x758 JUMPI POP DUP6 TIMESTAMP GT ISZERO JUMPDEST PUSH2 0x79E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH18 0x11185A4BDC195C9B5A5D0B595E1C1A5C9959 PUSH1 0x72 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP2 ADD SWAP1 SWAP2 SSTORE DUP8 EQ PUSH2 0x806 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH17 0x4461692F696E76616C69642D6E6F6E6365 PUSH1 0x78 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP6 PUSH2 0x814 JUMPI PUSH1 0x0 PUSH2 0x818 JUMP JUMPDEST PUSH1 0x0 NOT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP13 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP16 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE DUP2 MLOAD DUP6 DUP2 MSTORE SWAP2 MLOAD SWAP5 SWAP6 POP SWAP3 SWAP4 SWAP2 SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x45A JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x42F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x45A JUMP JUMPDEST PUSH1 0x0 PUSH2 0x471 CALLER DUP5 PUSH2 0x4DA DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE80 PUSH1 0x25 SWAP2 CODECOPY CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP14 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0xBB6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x471 CALLER DUP5 DUP5 PUSH2 0xA5B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x9B4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xE5C PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x9F9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xDC7 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE DUP2 MLOAD DUP6 DUP2 MSTORE SWAP2 MLOAD PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0xAA0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xE37 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xAE5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xDA4 PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xAF0 DUP4 DUP4 DUP4 PUSH2 0xD9E JUMP JUMPDEST PUSH2 0xB2D DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xDE9 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0xBB6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP5 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0xB5C SWAP1 DUP3 PUSH2 0xC4D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 SWAP3 DUP8 AND SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP5 DUP5 GT ISZERO PUSH2 0xC45 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xC0A JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xBF2 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xC37 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xCA7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xD09 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xD15 PUSH1 0x0 DUP4 DUP4 PUSH2 0xD9E JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH2 0xD22 SWAP1 DUP3 PUSH2 0xC4D JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0xD48 SWAP1 DUP3 PUSH2 0xC4D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP4 MLOAD DUP6 DUP2 MSTORE SWAP4 MLOAD SWAP3 SWAP4 SWAP2 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST POP POP POP JUMP INVALID GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220746F20746865207A65726F2061 PUSH5 0x6472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F766520746F20746865207A65726F20616464 PUSH19 0x65737345524332303A207472616E7366657220 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545524332 ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220616D6F756E7420657863656564 PUSH20 0x20616C6C6F77616E636545524332303A20747261 PUSH15 0x736665722066726F6D20746865207A PUSH6 0x726F20616464 PUSH19 0x65737345524332303A20617070726F76652066 PUSH19 0x6F6D20746865207A65726F2061646472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH5 0x6563726561 PUSH20 0x656420616C6C6F77616E63652062656C6F77207A PUSH6 0x726FA2646970 PUSH7 0x73582212206737 0x26 STATICCALL SAR PUSH9 0x7AAC558150AE6FBAD2 0xAA 0xF6 KECCAK256 0xEC 0xD8 0xF SWAP16 DUP12 CODESIZE 0xD9 BYTE MULMOD SWAP11 0xBE DUP10 SWAP9 GAS PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "259:10749:65:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1404:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3346:158;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3346:158:65;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;2406:94;;;:::i;:::-;;;;;;;;;;;;;;;;3949:305;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3949:305:65;;;;;;;;;;;;;;;;;:::i;9928:108::-;;;:::i;2275:77::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9751:31;;;:::i;4634:205::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4634:205:65;;;;;;;;:::i;10927:79::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10927:79:65;;;;;;;;:::i;:::-;;2552:113;;;;;;;;;;;;;;;;-1:-1:-1;2552:113:65;-1:-1:-1;;;;;2552:113:65;;:::i;9657:60::-;;;;;;;;;;;;;;;;-1:-1:-1;9657:60:65;-1:-1:-1;;;;;9657:60:65;;:::i;10075:848::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10075:848:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1587:81::-;;;:::i;5309:256::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5309:256:65;;;;;;;;:::i;2857:164::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2857:164:65;;;;;;;;:::i;3073:145::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3073:145:65;;;;;;;;;;:::i;1404:77::-;1471:5;1464:12;;;;;;;;-1:-1:-1;;1464:12:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1441:13;;1464:12;;1471:5;;1464:12;;1471:5;1464:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1404:77;:::o;3346:158::-;3429:4;3443:37;3452:10;3464:7;3473:6;3443:8;:37::i;:::-;-1:-1:-1;3495:4:65;3346:158;;;;:::o;2406:94::-;2483:12;;2406:94;:::o;3949:305::-;4055:4;4069:36;4079:6;4087:9;4098:6;4069:9;:36::i;:::-;4113:117;4122:6;4130:10;4142:87;4178:6;4142:87;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4142:19:65;;;;;;:11;:19;;;;;;;;4162:10;4142:31;;;;;;;;;:87;:35;:87::i;:::-;4113:8;:117::i;:::-;-1:-1:-1;4245:4:65;3949:305;;;;;:::o;9928:108::-;9970:66;9928:108;:::o;2275:77::-;2338:9;;;;2275:77;:::o;9751:31::-;;;;:::o;4634:205::-;4745:10;4722:4;4766:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;4766:32:65;;;;;;;;;;4722:4;;4736:79;;4757:7;;4766:48;;4803:10;4766:36;:48::i;10927:79::-;10984:17;10990:2;10994:6;10984:5;:17::i;:::-;10927:79;;:::o;2552:113::-;-1:-1:-1;;;;;2642:18:65;2618:7;2642:18;;;;;;;;;;;;2552:113::o;9657:60::-;;;;;;;;;;;;;:::o;10075:848::-;10315:16;;10362:152;;;9970:66;10362:152;;;;;;;;-1:-1:-1;;;;;10362:152:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10341:183;;;;;;-1:-1:-1;;;10269:263:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10252:286;;;;;;;;;;;10545:54;;;;;-1:-1:-1;;;10545:54:65;;;;;;;;;;;;-1:-1:-1;;;10545:54:65;;;;;;;;;;;;;;;10623:26;10633:6;10641:1;10644;10647;10623:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10613:36:65;:6;-1:-1:-1;;;;;10613:36:65;;10605:67;;;;;-1:-1:-1;;;10605:67:65;;;;;;;;;;;;-1:-1:-1;;;10605:67:65;;;;;;;;;;;;;;;10686:11;;;:28;;;10708:6;10701:3;:13;;10686:28;10678:59;;;;;-1:-1:-1;;;10678:59:65;;;;;;;;;;;;-1:-1:-1;;;10678:59:65;;;;;;;;;;;;;;;-1:-1:-1;;;;;10760:14:65;;;;;;:6;:14;;;;;:16;;;;;;;;10751:25;;10743:55;;;;;-1:-1:-1;;;10743:55:65;;;;;;;;;;;;-1:-1:-1;;;10743:55:65;;;;;;;;;;;;;;;10804:8;10815:7;:22;;10836:1;10815:22;;;-1:-1:-1;;10815:22:65;-1:-1:-1;;;;;10843:19:65;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:34;;;10888:30;;;;;;;10804:33;;-1:-1:-1;10843:28:65;;:19;;10888:30;;;;;;;;;10075:848;;;;;;;;;;:::o;1587:81::-;1656:7;1649:14;;;;;;;;-1:-1:-1;;1649:14:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1626:13;;1649:14;;1656:7;;1649:14;;1656:7;1649:14;;;;;;;;;;;;;;;;;;;;;;;;5309:256;5402:4;5416:125;5425:10;5437:7;5446:94;5483:15;5446:94;;;;;;;;;;;;;;;;;5458:10;5446:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;5446:32:65;;;;;;;;;;;:94;:36;:94::i;2857:164::-;2943:4;2957:40;2967:10;2979:9;2990:6;2957:9;:40::i;3073:145::-;-1:-1:-1;;;;;3186:18:65;;;3162:7;3186:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3073:145::o;8264:330::-;-1:-1:-1;;;;;8363:19:65;;8355:68;;;;-1:-1:-1;;;8355:68:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8439:21:65;;8431:68;;;;-1:-1:-1;;;8431:68:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8508:18:65;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;8557:32;;;;;;;;;;;;;;;;;8264:330;;;:::o;6022:516::-;-1:-1:-1;;;;;6125:20:65;;6117:70;;;;-1:-1:-1;;;6117:70:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6203:23:65;;6195:71;;;;-1:-1:-1;;;6195:71:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6275:47;6296:6;6304:9;6315:6;6275:20;:47::i;:::-;6351:71;6373:6;6351:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6351:17:65;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;6331:17:65;;;:9;:17;;;;;;;;;;;:91;;;;6453:20;;;;;;;:32;;6478:6;6453:24;:32::i;:::-;-1:-1:-1;;;;;6430:20:65;;;:9;:20;;;;;;;;;;;;:55;;;;6498:35;;;;;;;6430:20;;6498:35;;;;;;;;;;;;;6022:516;;;:::o;5443:163:8:-;5529:7;5564:12;5556:6;;;;5548:29;;;;-1:-1:-1;;;5548:29:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5594:5:8;;;5443:163::o;2701:175::-;2759:7;2790:5;;;2813:6;;;;2805:46;;;;;-1:-1:-1;;;2805:46:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;2868:1;2701:175;-1:-1:-1;;;2701:175:8:o;6796:358:65:-;-1:-1:-1;;;;;6877:21:65;;6869:65;;;;;-1:-1:-1;;;6869:65:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;6943:49;6972:1;6976:7;6985:6;6943:20;:49::i;:::-;7016:12;;:24;;7033:6;7016:16;:24::i;:::-;7001:12;:39;-1:-1:-1;;;;;7069:18:65;;:9;:18;;;;;;;;;;;:30;;7092:6;7069:22;:30::i;:::-;-1:-1:-1;;;;;7048:18:65;;:9;:18;;;;;;;;;;;:51;;;;7112:37;;;;;;;7048:18;;:9;;7112:37;;;;;;;;;;6796:358;;:::o;9561:92::-;;;;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "760400",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "DOMAIN_SEPARATOR()": "1065",
                "PERMIT_TYPEHASH()": "221",
                "allowance(address,address)": "1338",
                "approve(address,uint256)": "infinite",
                "balanceOf(address)": "1190",
                "decimals()": "1058",
                "decreaseAllowance(address,uint256)": "infinite",
                "increaseAllowance(address,uint256)": "infinite",
                "mint(address,uint256)": "infinite",
                "name()": "infinite",
                "nonces(address)": "1191",
                "permit(address,address,uint256,uint256,bool,uint8,bytes32,bytes32)": "infinite",
                "symbol()": "infinite",
                "totalSupply()": "1066",
                "transfer(address,uint256)": "infinite",
                "transferFrom(address,address,uint256)": "infinite"
              },
              "internal": {
                "_approve(address,address,uint256)": "infinite",
                "_beforeTokenTransfer(address,address,uint256)": "15",
                "_burn(address,uint256)": "infinite",
                "_mint(address,uint256)": "infinite",
                "_setupDecimals(uint8)": "infinite",
                "_transfer(address,address,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {
              "DOMAIN_SEPARATOR()": "3644e515",
              "PERMIT_TYPEHASH()": "30adf81f",
              "allowance(address,address)": "dd62ed3e",
              "approve(address,uint256)": "095ea7b3",
              "balanceOf(address)": "70a08231",
              "decimals()": "313ce567",
              "decreaseAllowance(address,uint256)": "a457c2d7",
              "increaseAllowance(address,uint256)": "39509351",
              "mint(address,uint256)": "40c10f19",
              "name()": "06fdde03",
              "nonces(address)": "7ecebe00",
              "permit(address,address,uint256,uint256,bool,uint8,bytes32,bytes32)": "8fcbaf0c",
              "symbol()": "95d89b41",
              "totalSupply()": "18160ddd",
              "transfer(address,uint256)": "a9059cbb",
              "transferFrom(address,address,uint256)": "23b872dd"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId_\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PERMIT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"holder\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"constructor\":{\"details\":\"Sets the values for {name} and {symbol}, initializes {decimals} with a default value of 18. To select a different value for {decimals}, use {_setupDecimals}. All three of these values are immutable: they can only be set once during construction.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is called. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}; Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/Dai.sol\":\"Dai\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"contracts/external/maker/DaiInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface DaiInterface is IERC20Upgradeable {\\n    // --- Approve by signature ---\\n  function permit(address holder, address spender, uint256 nonce, uint256 expiry, bool allowed, uint8 v, bytes32 r, bytes32 s) external;\\n  function transferFrom(address src, address dst, uint wad) external override returns (bool);\\n}\\n\",\"keccak256\":\"0x22d935aab5d88376c469f899191d7046d4b62ec3291c6e5970bdc3f0f385df22\",\"license\":\"GPL-3.0\"},\"contracts/test/Dai.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\\\";\\n\\nimport \\\"../external/maker/DaiInterface.sol\\\";\\n\\ncontract Dai is DaiInterface {\\n  using SafeMathUpgradeable for uint256;\\n  using AddressUpgradeable for address;\\n\\n  mapping (address => uint256) private _balances;\\n\\n  mapping (address => mapping (address => uint256)) private _allowances;\\n\\n  uint256 private _totalSupply;\\n\\n  string private _name;\\n  string private _symbol;\\n  uint8 private _decimals;\\n\\n  /**\\n    * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n    * a default value of 18.\\n    *\\n    * To select a different value for {decimals}, use {_setupDecimals}.\\n    *\\n    * All three of these values are immutable: they can only be set once during\\n    * construction.\\n    */\\n  constructor (uint256 chainId_) public {\\n    string memory version = \\\"1\\\";\\n\\n    _name = \\\"Dai Stablecoin\\\";\\n    _symbol = \\\"DAI\\\";\\n    _decimals = 18;\\n\\n    DOMAIN_SEPARATOR = keccak256(\\n      abi.encode(\\n        keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\"),\\n        keccak256(bytes(_name)),\\n        keccak256(bytes(version)),\\n        chainId_,\\n        address(this)\\n      )\\n    );\\n  }\\n\\n  /**\\n    * @dev Returns the name of the token.\\n    */\\n  function name() public view returns (string memory) {\\n      return _name;\\n  }\\n\\n  /**\\n    * @dev Returns the symbol of the token, usually a shorter version of the\\n    * name.\\n    */\\n  function symbol() public view returns (string memory) {\\n      return _symbol;\\n  }\\n\\n  /**\\n    * @dev Returns the number of decimals used to get its user representation.\\n    * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n    * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n    *\\n    * Tokens usually opt for a value of 18, imitating the relationship between\\n    * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n    * called.\\n    *\\n    * NOTE: This information is only used for _display_ purposes: it in\\n    * no way affects any of the arithmetic of the contract, including\\n    * {IERC20-balanceOf} and {IERC20-transfer}.\\n    */\\n  function decimals() public view returns (uint8) {\\n      return _decimals;\\n  }\\n\\n  /**\\n    * @dev See {IERC20-totalSupply}.\\n    */\\n  function totalSupply() public view override returns (uint256) {\\n      return _totalSupply;\\n  }\\n\\n  /**\\n    * @dev See {IERC20-balanceOf}.\\n    */\\n  function balanceOf(address account) public view override returns (uint256) {\\n      return _balances[account];\\n  }\\n\\n  /**\\n    * @dev See {IERC20-transfer}.\\n    *\\n    * Requirements:\\n    *\\n    * - `recipient` cannot be the zero address.\\n    * - the caller must have a balance of at least `amount`.\\n    */\\n  function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n      _transfer(msg.sender, recipient, amount);\\n      return true;\\n  }\\n\\n  /**\\n    * @dev See {IERC20-allowance}.\\n    */\\n  function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n      return _allowances[owner][spender];\\n  }\\n\\n  /**\\n    * @dev See {IERC20-approve}.\\n    *\\n    * Requirements:\\n    *\\n    * - `spender` cannot be the zero address.\\n    */\\n  function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n      _approve(msg.sender, spender, amount);\\n      return true;\\n  }\\n\\n  /**\\n    * @dev See {IERC20-transferFrom}.\\n    *\\n    * Emits an {Approval} event indicating the updated allowance. This is not\\n    * required by the EIP. See the note at the beginning of {ERC20};\\n    *\\n    * Requirements:\\n    * - `sender` and `recipient` cannot be the zero address.\\n    * - `sender` must have a balance of at least `amount`.\\n    * - the caller must have allowance for ``sender``'s tokens of at least\\n    * `amount`.\\n    */\\n  function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n      _transfer(sender, recipient, amount);\\n      _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n      return true;\\n  }\\n\\n  /**\\n    * @dev Atomically increases the allowance granted to `spender` by the caller.\\n    *\\n    * This is an alternative to {approve} that can be used as a mitigation for\\n    * problems described in {IERC20-approve}.\\n    *\\n    * Emits an {Approval} event indicating the updated allowance.\\n    *\\n    * Requirements:\\n    *\\n    * - `spender` cannot be the zero address.\\n    */\\n  function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n      _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));\\n      return true;\\n  }\\n\\n  /**\\n    * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n    *\\n    * This is an alternative to {approve} that can be used as a mitigation for\\n    * problems described in {IERC20-approve}.\\n    *\\n    * Emits an {Approval} event indicating the updated allowance.\\n    *\\n    * Requirements:\\n    *\\n    * - `spender` cannot be the zero address.\\n    * - `spender` must have allowance for the caller of at least\\n    * `subtractedValue`.\\n    */\\n  function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n      _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n      return true;\\n  }\\n\\n  /**\\n    * @dev Moves tokens `amount` from `sender` to `recipient`.\\n    *\\n    * This is internal function is equivalent to {transfer}, and can be used to\\n    * e.g. implement automatic token fees, slashing mechanisms, etc.\\n    *\\n    * Emits a {Transfer} event.\\n    *\\n    * Requirements:\\n    *\\n    * - `sender` cannot be the zero address.\\n    * - `recipient` cannot be the zero address.\\n    * - `sender` must have a balance of at least `amount`.\\n    */\\n  function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n      require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n      require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n      _beforeTokenTransfer(sender, recipient, amount);\\n\\n      _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n      _balances[recipient] = _balances[recipient].add(amount);\\n      emit Transfer(sender, recipient, amount);\\n  }\\n\\n  /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n    * the total supply.\\n    *\\n    * Emits a {Transfer} event with `from` set to the zero address.\\n    *\\n    * Requirements\\n    *\\n    * - `to` cannot be the zero address.\\n    */\\n  function _mint(address account, uint256 amount) internal virtual {\\n      require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n      _beforeTokenTransfer(address(0), account, amount);\\n\\n      _totalSupply = _totalSupply.add(amount);\\n      _balances[account] = _balances[account].add(amount);\\n      emit Transfer(address(0), account, amount);\\n  }\\n\\n  /**\\n    * @dev Destroys `amount` tokens from `account`, reducing the\\n    * total supply.\\n    *\\n    * Emits a {Transfer} event with `to` set to the zero address.\\n    *\\n    * Requirements\\n    *\\n    * - `account` cannot be the zero address.\\n    * - `account` must have at least `amount` tokens.\\n    */\\n  function _burn(address account, uint256 amount) internal virtual {\\n      require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n      _beforeTokenTransfer(account, address(0), amount);\\n\\n      _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n      _totalSupply = _totalSupply.sub(amount);\\n      emit Transfer(account, address(0), amount);\\n  }\\n\\n  /**\\n    * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n    *\\n    * This internal function is equivalent to `approve`, and can be used to\\n    * e.g. set automatic allowances for certain subsystems, etc.\\n    *\\n    * Emits an {Approval} event.\\n    *\\n    * Requirements:\\n    *\\n    * - `owner` cannot be the zero address.\\n    * - `spender` cannot be the zero address.\\n    */\\n  function _approve(address owner, address spender, uint256 amount) internal virtual {\\n      require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n      require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n      _allowances[owner][spender] = amount;\\n      emit Approval(owner, spender, amount);\\n  }\\n\\n  /**\\n    * @dev Sets {decimals} to a value other than the default one of 18.\\n    *\\n    * WARNING: This function should only be called from the constructor. Most\\n    * applications that interact with token contracts will not expect\\n    * {decimals} to ever change, and may work incorrectly if it does.\\n    */\\n  function _setupDecimals(uint8 decimals_) internal {\\n      _decimals = decimals_;\\n  }\\n\\n  /**\\n    * @dev Hook that is called before any transfer of tokens. This includes\\n    * minting and burning.\\n    *\\n    * Calling conditions:\\n    *\\n    * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n    * will be to transferred to `to`.\\n    * - when `from` is zero, `amount` tokens will be minted for `to`.\\n    * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n    * - `from` and `to` are never both zero.\\n    *\\n    * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n    */\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n\\n  mapping (address => uint)                      public nonces;\\n\\n  // --- EIP712 niceties ---\\n  bytes32 public DOMAIN_SEPARATOR;\\n  // bytes32 public constant PERMIT_TYPEHASH = keccak256(\\\"Permit(address holder,address spender,uint256 nonce,uint256 expiry,bool allowed)\\\");\\n  bytes32 public constant PERMIT_TYPEHASH = 0xea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb;\\n\\n  // --- Approve by signature ---\\n  function permit(\\n    address holder, address spender, uint256 nonce, uint256 expiry,\\n    bool allowed, uint8 v, bytes32 r, bytes32 s) external override\\n  {\\n    bytes32 digest = keccak256(\\n      abi.encodePacked(\\n        \\\"\\\\x19\\\\x01\\\",\\n        DOMAIN_SEPARATOR,\\n        keccak256(\\n          abi.encode(\\n            PERMIT_TYPEHASH,\\n            holder,\\n            spender,\\n            nonce,\\n            expiry,\\n            allowed\\n          )\\n        )\\n      )\\n    );\\n\\n    require(holder != address(0), \\\"Dai/invalid-address-0\\\");\\n    require(holder == ecrecover(digest, v, r, s), \\\"Dai/invalid-permit\\\");\\n    require(expiry == 0 || now <= expiry, \\\"Dai/permit-expired\\\");\\n    require(nonce == nonces[holder]++, \\\"Dai/invalid-nonce\\\");\\n    uint wad = allowed ? uint(-1) : 0;\\n    _allowances[holder][spender] = wad;\\n    emit Approval(holder, spender, wad);\\n  }\\n\\n  function mint(address to, uint256 amount) external {\\n    _mint(to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x60ff1f506a537d2febcc5459a7156c884763305dc02270266d1ac6dba0efbbb8\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 12961,
                "contract": "contracts/test/Dai.sol:Dai",
                "label": "_balances",
                "offset": 0,
                "slot": "0",
                "type": "t_mapping(t_address,t_uint256)"
              },
              {
                "astId": 12967,
                "contract": "contracts/test/Dai.sol:Dai",
                "label": "_allowances",
                "offset": 0,
                "slot": "1",
                "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
              },
              {
                "astId": 12969,
                "contract": "contracts/test/Dai.sol:Dai",
                "label": "_totalSupply",
                "offset": 0,
                "slot": "2",
                "type": "t_uint256"
              },
              {
                "astId": 12971,
                "contract": "contracts/test/Dai.sol:Dai",
                "label": "_name",
                "offset": 0,
                "slot": "3",
                "type": "t_string_storage"
              },
              {
                "astId": 12973,
                "contract": "contracts/test/Dai.sol:Dai",
                "label": "_symbol",
                "offset": 0,
                "slot": "4",
                "type": "t_string_storage"
              },
              {
                "astId": 12975,
                "contract": "contracts/test/Dai.sol:Dai",
                "label": "_decimals",
                "offset": 0,
                "slot": "5",
                "type": "t_uint8"
              },
              {
                "astId": 13480,
                "contract": "contracts/test/Dai.sol:Dai",
                "label": "nonces",
                "offset": 0,
                "slot": "6",
                "type": "t_mapping(t_address,t_uint256)"
              },
              {
                "astId": 13482,
                "contract": "contracts/test/Dai.sol:Dai",
                "label": "DOMAIN_SEPARATOR",
                "offset": 0,
                "slot": "7",
                "type": "t_bytes32"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_bytes32": {
                "encoding": "inplace",
                "label": "bytes32",
                "numberOfBytes": "32"
              },
              "t_mapping(t_address,t_mapping(t_address,t_uint256))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => uint256))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_uint256)"
              },
              "t_mapping(t_address,t_uint256)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => uint256)",
                "numberOfBytes": "32",
                "value": "t_uint256"
              },
              "t_string_storage": {
                "encoding": "bytes",
                "label": "string",
                "numberOfBytes": "32"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint8": {
                "encoding": "inplace",
                "label": "uint8",
                "numberOfBytes": "1"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/test/ERC20Mintable.sol": {
        "ERC20Mintable": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "string",
                  "name": "_name",
                  "type": "string"
                },
                {
                  "internalType": "string",
                  "name": "_symbol",
                  "type": "string"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Approval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Transfer",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                }
              ],
              "name": "allowance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "approve",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "burn",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "decimals",
              "outputs": [
                {
                  "internalType": "uint8",
                  "name": "",
                  "type": "uint8"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "subtractedValue",
                  "type": "uint256"
                }
              ],
              "name": "decreaseAllowance",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "addedValue",
                  "type": "uint256"
                }
              ],
              "name": "increaseAllowance",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "masterTransfer",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "mint",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "name",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "symbol",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transfer",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "sender",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transferFrom",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "details": "Extension of {ERC20} that adds a set of accounts with the {MinterRole}, which have permission to mint (create) new tokens as they see fit. At construction, the deployer of the contract is the only minter.",
            "kind": "dev",
            "methods": {
              "allowance(address,address)": {
                "details": "See {IERC20-allowance}."
              },
              "approve(address,uint256)": {
                "details": "See {IERC20-approve}. Requirements: - `spender` cannot be the zero address."
              },
              "balanceOf(address)": {
                "details": "See {IERC20-balanceOf}."
              },
              "decimals()": {
                "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is called. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."
              },
              "decreaseAllowance(address,uint256)": {
                "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."
              },
              "increaseAllowance(address,uint256)": {
                "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address."
              },
              "mint(address,uint256)": {
                "details": "See {ERC20-_mint}. Requirements: - the caller must have the {MinterRole}."
              },
              "name()": {
                "details": "Returns the name of the token."
              },
              "symbol()": {
                "details": "Returns the symbol of the token, usually a shorter version of the name."
              },
              "totalSupply()": {
                "details": "See {IERC20-totalSupply}."
              },
              "transfer(address,uint256)": {
                "details": "See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`."
              },
              "transferFrom(address,address,uint256)": {
                "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60806040523480156200001157600080fd5b506040516200128338038062001283833981810160405260408110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b9083019060208201858111156200006e57600080fd5b82516401000000008111828201881017156200008957600080fd5b82525081516020918201929091019080838360005b83811015620000b85781810151838201526020016200009e565b50505050905090810190601f168015620000e65780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200010a57600080fd5b9083019060208201858111156200012057600080fd5b82516401000000008111828201881017156200013b57600080fd5b82525081516020918201929091019080838360005b838110156200016a57818101518382015260200162000150565b50505050905090810190601f168015620001985780820380516001836020036101000a031916815260200191505b50604052505050620001b18282620001b960201b60201c565b5050620004c9565b600054610100900460ff1680620001d55750620001d56200027b565b80620001e4575060005460ff16155b620002215760405162461bcd60e51b815260040180806020018281038252602e81526020018062001255602e913960400191505060405180910390fd5b600054610100900460ff161580156200024d576000805460ff1961ff0019909116610100171660011790555b6200025762000299565b62000263838362000343565b801562000276576000805461ff00191690555b505050565b600062000293306200042760201b6200066c1760201c565b15905090565b600054610100900460ff1680620002b55750620002b56200027b565b80620002c4575060005460ff16155b620003015760405162461bcd60e51b815260040180806020018281038252602e81526020018062001255602e913960400191505060405180910390fd5b600054610100900460ff161580156200032d576000805460ff1961ff0019909116610100171660011790555b801562000340576000805461ff00191690555b50565b600054610100900460ff16806200035f57506200035f6200027b565b806200036e575060005460ff16155b620003ab5760405162461bcd60e51b815260040180806020018281038252602e81526020018062001255602e913960400191505060405180910390fd5b600054610100900460ff16158015620003d7576000805460ff1961ff0019909116610100171660011790555b8251620003ec9060369060208601906200042d565b508151620004029060379060208501906200042d565b506038805460ff19166012179055801562000276576000805461ff0019169055505050565b3b151590565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200047057805160ff1916838001178555620004a0565b82800160010185558215620004a0579182015b82811115620004a057825182559160200191906001019062000483565b50620004ae929150620004b2565b5090565b5b80821115620004ae5760008155600101620004b3565b610d7c80620004d96000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806340c10f191161008c5780639dc29fac116100665780639dc29fac146102d8578063a457c2d714610304578063a9059cbb14610330578063dd62ed3e1461035c576100ea565b806340c10f191461027e57806370a08231146102aa57806395d89b41146102d0576100ea565b80631c9c7903116100c85780631c9c7903146101c657806323b872dd146101fe578063313ce567146102345780633950935114610252576100ea565b806306fdde03146100ef578063095ea7b31461016c57806318160ddd146101ac575b600080fd5b6100f761038a565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610131578181015183820152602001610119565b50505050905090810190601f16801561015e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101986004803603604081101561018257600080fd5b506001600160a01b038135169060200135610420565b604080519115158252519081900360200190f35b6101b461043d565b60408051918252519081900360200190f35b6101fc600480360360608110156101dc57600080fd5b506001600160a01b03813581169160208101359091169060400135610443565b005b6101986004803603606081101561021457600080fd5b506001600160a01b03813581169160208101359091169060400135610453565b61023c6104da565b6040805160ff9092168252519081900360200190f35b6101986004803603604081101561026857600080fd5b506001600160a01b0381351690602001356104e3565b6101986004803603604081101561029457600080fd5b506001600160a01b038135169060200135610531565b6101b4600480360360208110156102c057600080fd5b50356001600160a01b031661053d565b6100f7610558565b610198600480360360408110156102ee57600080fd5b506001600160a01b0381351690602001356105b9565b6101986004803603604081101561031a57600080fd5b506001600160a01b0381351690602001356105c5565b6101986004803603604081101561034657600080fd5b506001600160a01b03813516906020013561062d565b6101b46004803603604081101561037257600080fd5b506001600160a01b0381358116916020013516610641565b60368054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104165780601f106103eb57610100808354040283529160200191610416565b820191906000526020600020905b8154815290600101906020018083116103f957829003601f168201915b5050505050905090565b600061043461042d610672565b8484610676565b50600192915050565b60355490565b61044e838383610762565b505050565b6000610460848484610762565b6104d08461046c610672565b6104cb85604051806060016040528060288152602001610c90602891396001600160a01b038a166000908152603460205260408120906104aa610672565b6001600160a01b0316815260208101919091526040016000205491906108bf565b610676565b5060019392505050565b60385460ff1690565b60006104346104f0610672565b846104cb8560346000610501610672565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490610956565b600061043483836109b7565b6001600160a01b031660009081526033602052604090205490565b60378054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104165780601f106103eb57610100808354040283529160200191610416565b60006104348383610aa9565b60006104346105d2610672565b846104cb85604051806060016040528060258152602001610d2260259139603460006105fc610672565b6001600160a01b03908116825260208083019390935260409182016000908120918d168152925290205491906108bf565b600061043461063a610672565b8484610762565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b3b151590565b3390565b6001600160a01b0383166106bb5760405162461bcd60e51b8152600401808060200182810382526024815260200180610cfe6024913960400191505060405180910390fd5b6001600160a01b0382166107005760405162461bcd60e51b8152600401808060200182810382526022815260200180610c486022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166107a75760405162461bcd60e51b8152600401808060200182810382526025815260200180610cd96025913960400191505060405180910390fd5b6001600160a01b0382166107ec5760405162461bcd60e51b8152600401808060200182810382526023815260200180610c036023913960400191505060405180910390fd5b6107f783838361044e565b61083481604051806060016040528060268152602001610c6a602691396001600160a01b03861660009081526033602052604090205491906108bf565b6001600160a01b0380851660009081526033602052604080822093909355908416815220546108639082610956565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561094e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156109135781810151838201526020016108fb565b50505050905090810190601f1680156109405780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156109b0576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216610a12576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b610a1e6000838361044e565b603554610a2b9082610956565b6035556001600160a01b038216600090815260336020526040902054610a519082610956565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038216610aee5760405162461bcd60e51b8152600401808060200182810382526021815260200180610cb86021913960400191505060405180910390fd5b610afa8260008361044e565b610b3781604051806060016040528060228152602001610c26602291396001600160a01b03851660009081526033602052604090205491906108bf565b6001600160a01b038316600090815260336020526040902055603554610b5d9082610ba5565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600082821115610bfc576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b5090039056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220bba429e69beb1bc8dd970964cb7c3f0feac9e9caed1b36200ec0d81408b6b54564736f6c634300060c0033496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x1283 CODESIZE SUB DUP1 PUSH3 0x1283 DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE PUSH1 0x40 DUP2 LT ISZERO PUSH3 0x37 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD PUSH1 0x40 MLOAD SWAP4 SWAP3 SWAP2 SWAP1 DUP5 PUSH5 0x100000000 DUP3 GT ISZERO PUSH3 0x58 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 DUP4 ADD SWAP1 PUSH1 0x20 DUP3 ADD DUP6 DUP2 GT ISZERO PUSH3 0x6E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH5 0x100000000 DUP2 GT DUP3 DUP3 ADD DUP9 LT OR ISZERO PUSH3 0x89 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MSTORE POP DUP2 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0xB8 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x9E JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH3 0xE6 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP PUSH1 0x40 MSTORE PUSH1 0x20 ADD DUP1 MLOAD PUSH1 0x40 MLOAD SWAP4 SWAP3 SWAP2 SWAP1 DUP5 PUSH5 0x100000000 DUP3 GT ISZERO PUSH3 0x10A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 DUP4 ADD SWAP1 PUSH1 0x20 DUP3 ADD DUP6 DUP2 GT ISZERO PUSH3 0x120 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH5 0x100000000 DUP2 GT DUP3 DUP3 ADD DUP9 LT OR ISZERO PUSH3 0x13B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MSTORE POP DUP2 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x16A JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x150 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH3 0x198 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP PUSH1 0x40 MSTORE POP POP POP PUSH3 0x1B1 DUP3 DUP3 PUSH3 0x1B9 PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST POP POP PUSH3 0x4C9 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH3 0x1D5 JUMPI POP PUSH3 0x1D5 PUSH3 0x27B JUMP JUMPDEST DUP1 PUSH3 0x1E4 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH3 0x221 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH3 0x1255 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH3 0x24D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH3 0x257 PUSH3 0x299 JUMP JUMPDEST PUSH3 0x263 DUP4 DUP4 PUSH3 0x343 JUMP JUMPDEST DUP1 ISZERO PUSH3 0x276 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x293 ADDRESS PUSH3 0x427 PUSH1 0x20 SHL PUSH3 0x66C OR PUSH1 0x20 SHR JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH3 0x2B5 JUMPI POP PUSH3 0x2B5 PUSH3 0x27B JUMP JUMPDEST DUP1 PUSH3 0x2C4 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH3 0x301 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH3 0x1255 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH3 0x32D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP1 ISZERO PUSH3 0x340 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH3 0x35F JUMPI POP PUSH3 0x35F PUSH3 0x27B JUMP JUMPDEST DUP1 PUSH3 0x36E JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH3 0x3AB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH3 0x1255 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH3 0x3D7 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP3 MLOAD PUSH3 0x3EC SWAP1 PUSH1 0x36 SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH3 0x42D JUMP JUMPDEST POP DUP2 MLOAD PUSH3 0x402 SWAP1 PUSH1 0x37 SWAP1 PUSH1 0x20 DUP6 ADD SWAP1 PUSH3 0x42D JUMP JUMPDEST POP PUSH1 0x38 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x12 OR SWAP1 SSTORE DUP1 ISZERO PUSH3 0x276 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x470 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x4A0 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x4A0 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x4A0 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x483 JUMP JUMPDEST POP PUSH3 0x4AE SWAP3 SWAP2 POP PUSH3 0x4B2 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x4AE JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x4B3 JUMP JUMPDEST PUSH2 0xD7C DUP1 PUSH3 0x4D9 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xEA JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x40C10F19 GT PUSH2 0x8C JUMPI DUP1 PUSH4 0x9DC29FAC GT PUSH2 0x66 JUMPI DUP1 PUSH4 0x9DC29FAC EQ PUSH2 0x2D8 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x304 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x330 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x35C JUMPI PUSH2 0xEA JUMP JUMPDEST DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x27E JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2AA JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x2D0 JUMPI PUSH2 0xEA JUMP JUMPDEST DUP1 PUSH4 0x1C9C7903 GT PUSH2 0xC8 JUMPI DUP1 PUSH4 0x1C9C7903 EQ PUSH2 0x1C6 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1FE JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x234 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x252 JUMPI PUSH2 0xEA JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xEF JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x16C JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x1AC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF7 PUSH2 0x38A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x131 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x119 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x15E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x198 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x182 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x420 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1B4 PUSH2 0x43D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1FC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x1DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x443 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x198 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x214 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x453 JUMP JUMPDEST PUSH2 0x23C PUSH2 0x4DA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x198 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x268 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x4E3 JUMP JUMPDEST PUSH2 0x198 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x294 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x531 JUMP JUMPDEST PUSH2 0x1B4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x53D JUMP JUMPDEST PUSH2 0xF7 PUSH2 0x558 JUMP JUMPDEST PUSH2 0x198 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x2EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x5B9 JUMP JUMPDEST PUSH2 0x198 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x31A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x5C5 JUMP JUMPDEST PUSH2 0x198 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x346 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x62D JUMP JUMPDEST PUSH2 0x1B4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x641 JUMP JUMPDEST PUSH1 0x36 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x416 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x3EB JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x416 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x3F9 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x434 PUSH2 0x42D PUSH2 0x672 JUMP JUMPDEST DUP5 DUP5 PUSH2 0x676 JUMP JUMPDEST POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x35 SLOAD SWAP1 JUMP JUMPDEST PUSH2 0x44E DUP4 DUP4 DUP4 PUSH2 0x762 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x460 DUP5 DUP5 DUP5 PUSH2 0x762 JUMP JUMPDEST PUSH2 0x4D0 DUP5 PUSH2 0x46C PUSH2 0x672 JUMP JUMPDEST PUSH2 0x4CB DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC90 PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP1 PUSH2 0x4AA PUSH2 0x672 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x8BF JUMP JUMPDEST PUSH2 0x676 JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x38 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x434 PUSH2 0x4F0 PUSH2 0x672 JUMP JUMPDEST DUP5 PUSH2 0x4CB DUP6 PUSH1 0x34 PUSH1 0x0 PUSH2 0x501 PUSH2 0x672 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP13 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP1 PUSH2 0x956 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x434 DUP4 DUP4 PUSH2 0x9B7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x37 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x416 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x3EB JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x416 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x434 DUP4 DUP4 PUSH2 0xAA9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x434 PUSH2 0x5D2 PUSH2 0x672 JUMP JUMPDEST DUP5 PUSH2 0x4CB DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xD22 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x34 PUSH1 0x0 PUSH2 0x5FC PUSH2 0x672 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP14 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x8BF JUMP JUMPDEST PUSH1 0x0 PUSH2 0x434 PUSH2 0x63A PUSH2 0x672 JUMP JUMPDEST DUP5 DUP5 PUSH2 0x762 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x6BB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xCFE PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x700 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xC48 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE DUP2 MLOAD DUP6 DUP2 MSTORE SWAP2 MLOAD PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x7A7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xCD9 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x7EC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xC03 PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x7F7 DUP4 DUP4 DUP4 PUSH2 0x44E JUMP JUMPDEST PUSH2 0x834 DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC6A PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x8BF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP5 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x863 SWAP1 DUP3 PUSH2 0x956 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 SWAP3 DUP8 AND SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP5 DUP5 GT ISZERO PUSH2 0x94E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x913 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x8FB JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x940 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x9B0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xA12 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xA1E PUSH1 0x0 DUP4 DUP4 PUSH2 0x44E JUMP JUMPDEST PUSH1 0x35 SLOAD PUSH2 0xA2B SWAP1 DUP3 PUSH2 0x956 JUMP JUMPDEST PUSH1 0x35 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0xA51 SWAP1 DUP3 PUSH2 0x956 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP4 MLOAD DUP6 DUP2 MSTORE SWAP4 MLOAD SWAP3 SWAP4 SWAP2 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xAEE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xCB8 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xAFA DUP3 PUSH1 0x0 DUP4 PUSH2 0x44E JUMP JUMPDEST PUSH2 0xB37 DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC26 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x8BF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x35 SLOAD PUSH2 0xB5D SWAP1 DUP3 PUSH2 0xBA5 JUMP JUMPDEST PUSH1 0x35 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xBFC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP INVALID GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220746F20746865207A65726F2061 PUSH5 0x6472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH3 0x75726E KECCAK256 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545524332 ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F766520746F20746865207A65726F20616464 PUSH19 0x65737345524332303A207472616E7366657220 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545524332 ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220616D6F756E7420657863656564 PUSH20 0x20616C6C6F77616E636545524332303A20627572 PUSH15 0x2066726F6D20746865207A65726F20 PUSH2 0x6464 PUSH19 0x65737345524332303A207472616E7366657220 PUSH7 0x726F6D20746865 KECCAK256 PUSH27 0x65726F206164647265737345524332303A20617070726F76652066 PUSH19 0x6F6D20746865207A65726F2061646472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH5 0x6563726561 PUSH20 0x656420616C6C6F77616E63652062656C6F77207A PUSH6 0x726FA2646970 PUSH7 0x7358221220BBA4 0x29 0xE6 SWAP12 0xEB SHL 0xC8 0xDD SWAP8 MULMOD PUSH5 0xCB7C3F0FEA 0xC9 0xE9 0xCA 0xED SHL CALLDATASIZE KECCAK256 0xE 0xC0 0xD8 EQ ADDMOD 0xB6 0xB5 GASLIMIT PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER 0x49 PUSH15 0x697469616C697A61626C653A20636F PUSH15 0x747261637420697320616C72656164 PUSH26 0x20696E697469616C697A65640000000000000000000000000000 ",
              "sourceMap": "335:683:66:-:0;;;385:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;385:108:66;;;;;;;;;;-1:-1:-1;385:108:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;385:108:66;;;;;;;;;;-1:-1:-1;385:108:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;458:28;471:5;478:7;458:12;;;:28;;:::i;:::-;385:108;;335:683;;2090:178:10;1512:13:9;;;;;;;;:33;;-1:-1:-1;1529:16:9;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;2187:26:10::1;:24;:26::i;:::-;2223:38;2246:5:::0;2253:7;2223:22:::1;:38::i;:::-;1794:14:9::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1790:66;2090:178:10;;;:::o;1952:123:9:-;2000:4;2024:44;2062:4;2024:29;;;;;:44;;:::i;:::-;2023:45;2016:52;;1952:123;:::o;759:64:19:-;1512:13:9;;;;;;;;:33;;-1:-1:-1;1529:16:9;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1794:14;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1790:66;759:64:19;:::o;2274:178:10:-;1512:13:9;;;;;;;;:33;;-1:-1:-1;1529:16:9;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;2381:13:10;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;2404:17:10;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;2431:9:10::1;:14:::0;;-1:-1:-1;;2431:14:10::1;2443:2;2431:14;::::0;;1790:66:9;;;;-1:-1:-1;;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;-1:-1:-1;2274:178:10:o;737:413:18:-;1097:20;1135:8;;;737:413::o;335:683:66:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;335:683:66;;;-1:-1:-1;335:683:66;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106100ea5760003560e01c806340c10f191161008c5780639dc29fac116100665780639dc29fac146102d8578063a457c2d714610304578063a9059cbb14610330578063dd62ed3e1461035c576100ea565b806340c10f191461027e57806370a08231146102aa57806395d89b41146102d0576100ea565b80631c9c7903116100c85780631c9c7903146101c657806323b872dd146101fe578063313ce567146102345780633950935114610252576100ea565b806306fdde03146100ef578063095ea7b31461016c57806318160ddd146101ac575b600080fd5b6100f761038a565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610131578181015183820152602001610119565b50505050905090810190601f16801561015e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101986004803603604081101561018257600080fd5b506001600160a01b038135169060200135610420565b604080519115158252519081900360200190f35b6101b461043d565b60408051918252519081900360200190f35b6101fc600480360360608110156101dc57600080fd5b506001600160a01b03813581169160208101359091169060400135610443565b005b6101986004803603606081101561021457600080fd5b506001600160a01b03813581169160208101359091169060400135610453565b61023c6104da565b6040805160ff9092168252519081900360200190f35b6101986004803603604081101561026857600080fd5b506001600160a01b0381351690602001356104e3565b6101986004803603604081101561029457600080fd5b506001600160a01b038135169060200135610531565b6101b4600480360360208110156102c057600080fd5b50356001600160a01b031661053d565b6100f7610558565b610198600480360360408110156102ee57600080fd5b506001600160a01b0381351690602001356105b9565b6101986004803603604081101561031a57600080fd5b506001600160a01b0381351690602001356105c5565b6101986004803603604081101561034657600080fd5b506001600160a01b03813516906020013561062d565b6101b46004803603604081101561037257600080fd5b506001600160a01b0381358116916020013516610641565b60368054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104165780601f106103eb57610100808354040283529160200191610416565b820191906000526020600020905b8154815290600101906020018083116103f957829003601f168201915b5050505050905090565b600061043461042d610672565b8484610676565b50600192915050565b60355490565b61044e838383610762565b505050565b6000610460848484610762565b6104d08461046c610672565b6104cb85604051806060016040528060288152602001610c90602891396001600160a01b038a166000908152603460205260408120906104aa610672565b6001600160a01b0316815260208101919091526040016000205491906108bf565b610676565b5060019392505050565b60385460ff1690565b60006104346104f0610672565b846104cb8560346000610501610672565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490610956565b600061043483836109b7565b6001600160a01b031660009081526033602052604090205490565b60378054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104165780601f106103eb57610100808354040283529160200191610416565b60006104348383610aa9565b60006104346105d2610672565b846104cb85604051806060016040528060258152602001610d2260259139603460006105fc610672565b6001600160a01b03908116825260208083019390935260409182016000908120918d168152925290205491906108bf565b600061043461063a610672565b8484610762565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b3b151590565b3390565b6001600160a01b0383166106bb5760405162461bcd60e51b8152600401808060200182810382526024815260200180610cfe6024913960400191505060405180910390fd5b6001600160a01b0382166107005760405162461bcd60e51b8152600401808060200182810382526022815260200180610c486022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166107a75760405162461bcd60e51b8152600401808060200182810382526025815260200180610cd96025913960400191505060405180910390fd5b6001600160a01b0382166107ec5760405162461bcd60e51b8152600401808060200182810382526023815260200180610c036023913960400191505060405180910390fd5b6107f783838361044e565b61083481604051806060016040528060268152602001610c6a602691396001600160a01b03861660009081526033602052604090205491906108bf565b6001600160a01b0380851660009081526033602052604080822093909355908416815220546108639082610956565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561094e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156109135781810151838201526020016108fb565b50505050905090810190601f1680156109405780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156109b0576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216610a12576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b610a1e6000838361044e565b603554610a2b9082610956565b6035556001600160a01b038216600090815260336020526040902054610a519082610956565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038216610aee5760405162461bcd60e51b8152600401808060200182810382526021815260200180610cb86021913960400191505060405180910390fd5b610afa8260008361044e565b610b3781604051806060016040528060228152602001610c26602291396001600160a01b03851660009081526033602052604090205491906108bf565b6001600160a01b038316600090815260336020526040902055603554610b5d9082610ba5565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600082821115610bfc576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b5090039056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220bba429e69beb1bc8dd970964cb7c3f0feac9e9caed1b36200ec0d81408b6b54564736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xEA JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x40C10F19 GT PUSH2 0x8C JUMPI DUP1 PUSH4 0x9DC29FAC GT PUSH2 0x66 JUMPI DUP1 PUSH4 0x9DC29FAC EQ PUSH2 0x2D8 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x304 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x330 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x35C JUMPI PUSH2 0xEA JUMP JUMPDEST DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x27E JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2AA JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x2D0 JUMPI PUSH2 0xEA JUMP JUMPDEST DUP1 PUSH4 0x1C9C7903 GT PUSH2 0xC8 JUMPI DUP1 PUSH4 0x1C9C7903 EQ PUSH2 0x1C6 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1FE JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x234 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x252 JUMPI PUSH2 0xEA JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xEF JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x16C JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x1AC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF7 PUSH2 0x38A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x131 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x119 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x15E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x198 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x182 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x420 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1B4 PUSH2 0x43D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1FC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x1DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x443 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x198 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x214 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x453 JUMP JUMPDEST PUSH2 0x23C PUSH2 0x4DA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x198 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x268 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x4E3 JUMP JUMPDEST PUSH2 0x198 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x294 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x531 JUMP JUMPDEST PUSH2 0x1B4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x53D JUMP JUMPDEST PUSH2 0xF7 PUSH2 0x558 JUMP JUMPDEST PUSH2 0x198 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x2EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x5B9 JUMP JUMPDEST PUSH2 0x198 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x31A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x5C5 JUMP JUMPDEST PUSH2 0x198 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x346 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x62D JUMP JUMPDEST PUSH2 0x1B4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x641 JUMP JUMPDEST PUSH1 0x36 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x416 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x3EB JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x416 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x3F9 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x434 PUSH2 0x42D PUSH2 0x672 JUMP JUMPDEST DUP5 DUP5 PUSH2 0x676 JUMP JUMPDEST POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x35 SLOAD SWAP1 JUMP JUMPDEST PUSH2 0x44E DUP4 DUP4 DUP4 PUSH2 0x762 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x460 DUP5 DUP5 DUP5 PUSH2 0x762 JUMP JUMPDEST PUSH2 0x4D0 DUP5 PUSH2 0x46C PUSH2 0x672 JUMP JUMPDEST PUSH2 0x4CB DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC90 PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP1 PUSH2 0x4AA PUSH2 0x672 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x8BF JUMP JUMPDEST PUSH2 0x676 JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x38 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x434 PUSH2 0x4F0 PUSH2 0x672 JUMP JUMPDEST DUP5 PUSH2 0x4CB DUP6 PUSH1 0x34 PUSH1 0x0 PUSH2 0x501 PUSH2 0x672 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP13 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP1 PUSH2 0x956 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x434 DUP4 DUP4 PUSH2 0x9B7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x37 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x416 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x3EB JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x416 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x434 DUP4 DUP4 PUSH2 0xAA9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x434 PUSH2 0x5D2 PUSH2 0x672 JUMP JUMPDEST DUP5 PUSH2 0x4CB DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xD22 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x34 PUSH1 0x0 PUSH2 0x5FC PUSH2 0x672 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP14 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x8BF JUMP JUMPDEST PUSH1 0x0 PUSH2 0x434 PUSH2 0x63A PUSH2 0x672 JUMP JUMPDEST DUP5 DUP5 PUSH2 0x762 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x6BB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xCFE PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x700 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xC48 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE DUP2 MLOAD DUP6 DUP2 MSTORE SWAP2 MLOAD PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x7A7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xCD9 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x7EC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xC03 PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x7F7 DUP4 DUP4 DUP4 PUSH2 0x44E JUMP JUMPDEST PUSH2 0x834 DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC6A PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x8BF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP5 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x863 SWAP1 DUP3 PUSH2 0x956 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 SWAP3 DUP8 AND SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP5 DUP5 GT ISZERO PUSH2 0x94E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x913 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x8FB JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x940 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x9B0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xA12 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xA1E PUSH1 0x0 DUP4 DUP4 PUSH2 0x44E JUMP JUMPDEST PUSH1 0x35 SLOAD PUSH2 0xA2B SWAP1 DUP3 PUSH2 0x956 JUMP JUMPDEST PUSH1 0x35 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0xA51 SWAP1 DUP3 PUSH2 0x956 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP4 MLOAD DUP6 DUP2 MSTORE SWAP4 MLOAD SWAP3 SWAP4 SWAP2 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xAEE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xCB8 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xAFA DUP3 PUSH1 0x0 DUP4 PUSH2 0x44E JUMP JUMPDEST PUSH2 0xB37 DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC26 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x8BF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x35 SLOAD PUSH2 0xB5D SWAP1 DUP3 PUSH2 0xBA5 JUMP JUMPDEST PUSH1 0x35 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xBFC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP INVALID GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220746F20746865207A65726F2061 PUSH5 0x6472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH3 0x75726E KECCAK256 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545524332 ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F766520746F20746865207A65726F20616464 PUSH19 0x65737345524332303A207472616E7366657220 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545524332 ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220616D6F756E7420657863656564 PUSH20 0x20616C6C6F77616E636545524332303A20627572 PUSH15 0x2066726F6D20746865207A65726F20 PUSH2 0x6464 PUSH19 0x65737345524332303A207472616E7366657220 PUSH7 0x726F6D20746865 KECCAK256 PUSH27 0x65726F206164647265737345524332303A20617070726F76652066 PUSH19 0x6F6D20746865207A65726F2061646472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH5 0x6563726561 PUSH20 0x656420616C6C6F77616E63652062656C6F77207A PUSH6 0x726FA2646970 PUSH7 0x7358221220BBA4 0x29 0xE6 SWAP12 0xEB SHL 0xC8 0xDD SWAP8 MULMOD PUSH5 0xCB7C3F0FEA 0xC9 0xE9 0xCA 0xED SHL CALLDATASIZE KECCAK256 0xE 0xC0 0xD8 EQ ADDMOD 0xB6 0xB5 GASLIMIT PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "335:683:66:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2517:89:10;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4593:166;;;;;;;;;;;;;;;;-1:-1:-1;4593:166:10;;-1:-1:-1;;;;;4593:166:10;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;3584:106;;;:::i;:::-;;;;;;;;;;;;;;;;899:117:66;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;899:117:66;;;;;;;;;;;;;;;;;:::i;:::-;;5226:317:10;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5226:317:10;;;;;;;;;;;;;;;;;:::i;3435:89::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5938:215;;;;;;;;;;;;;;;;-1:-1:-1;5938:215:10;;-1:-1:-1;;;;;5938:215:10;;;;;;:::i;629:129:66:-;;;;;;;;;;;;;;;;-1:-1:-1;629:129:66;;-1:-1:-1;;;;;629:129:66;;;;;;:::i;3748:125:10:-;;;;;;;;;;;;;;;;-1:-1:-1;3748:125:10;-1:-1:-1;;;;;3748:125:10;;:::i;2719:93::-;;;:::i;764:129:66:-;;;;;;;;;;;;;;;;-1:-1:-1;764:129:66;;-1:-1:-1;;;;;764:129:66;;;;;;:::i;6640:266:10:-;;;;;;;;;;;;;;;;-1:-1:-1;6640:266:10;;-1:-1:-1;;;;;6640:266:10;;;;;;:::i;4076:172::-;;;;;;;;;;;;;;;;-1:-1:-1;4076:172:10;;-1:-1:-1;;;;;4076:172:10;;;;;;:::i;4306:149::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4306:149:10;;;;;;;;;;:::i;2517:89::-;2594:5;2587:12;;;;;;;;;;;;;-1:-1:-1;;2587:12:10;;;;;;;;;;;;;;;;;;;;;;;;;;2562:13;;2587:12;;2594:5;;2587:12;;;2594:5;2587:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2517:89;:::o;4593:166::-;4676:4;4692:39;4701:12;:10;:12::i;:::-;4715:7;4724:6;4692:8;:39::i;:::-;-1:-1:-1;4748:4:10;4593:166;;;;:::o;3584:106::-;3671:12;;3584:106;:::o;899:117:66:-;982:27;992:4;998:2;1002:6;982:9;:27::i;:::-;899:117;;;:::o;5226:317:10:-;5332:4;5348:36;5358:6;5366:9;5377:6;5348:9;:36::i;:::-;5394:121;5403:6;5411:12;:10;:12::i;:::-;5425:89;5463:6;5425:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5425:19:10;;;;;;:11;:19;;;;;;5445:12;:10;:12::i;:::-;-1:-1:-1;;;;;5425:33:10;;;;;;;;;;;;-1:-1:-1;5425:33:10;;;;:37;:89::i;:::-;5394:8;:121::i;:::-;-1:-1:-1;5532:4:10;5226:317;;;;;:::o;3435:89::-;3508:9;;;;3435:89;:::o;5938:215::-;6026:4;6042:83;6051:12;:10;:12::i;:::-;6065:7;6074:50;6113:10;6074:11;:25;6086:12;:10;:12::i;:::-;-1:-1:-1;;;;;6074:25:10;;;;;;;;;;;;;;;;;-1:-1:-1;6074:25:10;;;:34;;;;;;;;;;;:38;:50::i;629:129:66:-;692:4;708:22;714:7;723:6;708:5;:22::i;3748:125:10:-;-1:-1:-1;;;;;3848:18:10;3822:7;3848:18;;;:9;:18;;;;;;;3748:125::o;2719:93::-;2798:7;2791:14;;;;;;;;;;;;;-1:-1:-1;;2791:14:10;;;;;;;;;;;;;;;;;;;;;;;;;;2766:13;;2791:14;;2798:7;;2791:14;;;2798:7;2791:14;;;;;;;;;;;;;;;;;;;;;;;;764:129:66;827:4;843:22;849:7;858:6;843:5;:22::i;6640:266:10:-;6733:4;6749:129;6758:12;:10;:12::i;:::-;6772:7;6781:96;6820:15;6781:96;;;;;;;;;;;;;;;;;:11;:25;6793:12;:10;:12::i;:::-;-1:-1:-1;;;;;6781:25:10;;;;;;;;;;;;;;;;;-1:-1:-1;6781:25:10;;;:34;;;;;;;;;;;;:38;:96::i;4076:172::-;4162:4;4178:42;4188:12;:10;:12::i;:::-;4202:9;4213:6;4178:9;:42::i;4306:149::-;-1:-1:-1;;;;;4421:18:10;;;4395:7;4421:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4306:149::o;737:413:18:-;1097:20;1135:8;;;737:413::o;828:104:19:-;915:10;828:104;:::o;9704:340:10:-;-1:-1:-1;;;;;9805:19:10;;9797:68;;;;-1:-1:-1;;;9797:68:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9883:21:10;;9875:68;;;;-1:-1:-1;;;9875:68:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9954:18:10;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10005:32;;;;;;;;;;;;;;;;;9704:340;;;:::o;7380:530::-;-1:-1:-1;;;;;7485:20:10;;7477:70;;;;-1:-1:-1;;;7477:70:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7565:23:10;;7557:71;;;;-1:-1:-1;;;7557:71:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7639:47;7660:6;7668:9;7679:6;7639:20;:47::i;:::-;7717:71;7739:6;7717:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7717:17:10;;;;;;:9;:17;;;;;;;;:21;:71::i;:::-;-1:-1:-1;;;;;7697:17:10;;;;;;;:9;:17;;;;;;:91;;;;7821:20;;;;;;;:32;;7846:6;7821:24;:32::i;:::-;-1:-1:-1;;;;;7798:20:10;;;;;;;:9;:20;;;;;;;;;:55;;;;7868:35;;;;;;;7798:20;;7868:35;;;;;;;;;;;;;7380:530;;;:::o;5443:163:8:-;5529:7;5564:12;5556:6;;;;5548:29;;;;-1:-1:-1;;;5548:29:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5594:5:8;;;5443:163::o;2701:175::-;2759:7;2790:5;;;2813:6;;;;2805:46;;;;;-1:-1:-1;;;2805:46:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;2868:1;2701:175;-1:-1:-1;;;2701:175:8:o;8181:370:10:-;-1:-1:-1;;;;;8264:21:10;;8256:65;;;;;-1:-1:-1;;;8256:65:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;8332:49;8361:1;8365:7;8374:6;8332:20;:49::i;:::-;8407:12;;:24;;8424:6;8407:16;:24::i;:::-;8392:12;:39;-1:-1:-1;;;;;8462:18:10;;;;;;:9;:18;;;;;;:30;;8485:6;8462:22;:30::i;:::-;-1:-1:-1;;;;;8441:18:10;;;;;;:9;:18;;;;;;;;:51;;;;8507:37;;;;;;;8441:18;;;;8507:37;;;;;;;;;;8181:370;;:::o;8871:410::-;-1:-1:-1;;;;;8954:21:10;;8946:67;;;;-1:-1:-1;;;8946:67:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9024:49;9045:7;9062:1;9066:6;9024:20;:49::i;:::-;9105:68;9128:6;9105:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9105:18:10;;;;;;:9;:18;;;;;;;;:22;:68::i;:::-;-1:-1:-1;;;;;9084:18:10;;;;;;:9;:18;;;;;:89;9198:12;;:24;;9215:6;9198:16;:24::i;:::-;9183:12;:39;9237:37;;;;;;;;9263:1;;-1:-1:-1;;;;;9237:37:10;;;;;;;;;;;;8871:410;;:::o;3147:155:8:-;3205:7;3237:1;3232;:6;;3224:49;;;;;-1:-1:-1;;;3224:49:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3290:5:8;;;3147:155::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "690400",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "allowance(address,address)": "1338",
                "approve(address,uint256)": "infinite",
                "balanceOf(address)": "1187",
                "burn(address,uint256)": "infinite",
                "decimals()": "1080",
                "decreaseAllowance(address,uint256)": "infinite",
                "increaseAllowance(address,uint256)": "infinite",
                "masterTransfer(address,address,uint256)": "infinite",
                "mint(address,uint256)": "infinite",
                "name()": "infinite",
                "symbol()": "infinite",
                "totalSupply()": "1066",
                "transfer(address,uint256)": "infinite",
                "transferFrom(address,address,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {
              "allowance(address,address)": "dd62ed3e",
              "approve(address,uint256)": "095ea7b3",
              "balanceOf(address)": "70a08231",
              "burn(address,uint256)": "9dc29fac",
              "decimals()": "313ce567",
              "decreaseAllowance(address,uint256)": "a457c2d7",
              "increaseAllowance(address,uint256)": "39509351",
              "masterTransfer(address,address,uint256)": "1c9c7903",
              "mint(address,uint256)": "40c10f19",
              "name()": "06fdde03",
              "symbol()": "95d89b41",
              "totalSupply()": "18160ddd",
              "transfer(address,uint256)": "a9059cbb",
              "transferFrom(address,address,uint256)": "23b872dd"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"masterTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Extension of {ERC20} that adds a set of accounts with the {MinterRole}, which have permission to mint (create) new tokens as they see fit. At construction, the deployer of the contract is the only minter.\",\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is called. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"mint(address,uint256)\":{\"details\":\"See {ERC20-_mint}. Requirements: - the caller must have the {MinterRole}.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/ERC20Mintable.sol\":\"ERC20Mintable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"contracts/test/ERC20Mintable.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\\\";\\n\\n/**\\n * @dev Extension of {ERC20} that adds a set of accounts with the {MinterRole},\\n * which have permission to mint (create) new tokens as they see fit.\\n *\\n * At construction, the deployer of the contract is the only minter.\\n */\\ncontract ERC20Mintable is ERC20Upgradeable {\\n\\n    constructor(string memory _name, string memory _symbol) public {\\n        __ERC20_init(_name, _symbol);\\n    }\\n\\n    /**\\n     * @dev See {ERC20-_mint}.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have the {MinterRole}.\\n     */\\n    function mint(address account, uint256 amount) public returns (bool) {\\n        _mint(account, amount);\\n        return true;\\n    }\\n\\n    function burn(address account, uint256 amount) public returns (bool) {\\n        _burn(account, amount);\\n        return true;\\n    }\\n\\n    function masterTransfer(address from, address to, uint256 amount) public {\\n        _transfer(from, to, amount);\\n    }\\n}\\n\",\"keccak256\":\"0x7734575f2e59cfc85b4c4a39c065f8b2c6ecc97c5d7b6d96c0749b0884eacb6f\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/test/ERC20Mintable.sol:ERC20Mintable",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/test/ERC20Mintable.sol:ERC20Mintable",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/test/ERC20Mintable.sol:ERC20Mintable",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 1372,
                "contract": "contracts/test/ERC20Mintable.sol:ERC20Mintable",
                "label": "_balances",
                "offset": 0,
                "slot": "51",
                "type": "t_mapping(t_address,t_uint256)"
              },
              {
                "astId": 1378,
                "contract": "contracts/test/ERC20Mintable.sol:ERC20Mintable",
                "label": "_allowances",
                "offset": 0,
                "slot": "52",
                "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
              },
              {
                "astId": 1380,
                "contract": "contracts/test/ERC20Mintable.sol:ERC20Mintable",
                "label": "_totalSupply",
                "offset": 0,
                "slot": "53",
                "type": "t_uint256"
              },
              {
                "astId": 1382,
                "contract": "contracts/test/ERC20Mintable.sol:ERC20Mintable",
                "label": "_name",
                "offset": 0,
                "slot": "54",
                "type": "t_string_storage"
              },
              {
                "astId": 1384,
                "contract": "contracts/test/ERC20Mintable.sol:ERC20Mintable",
                "label": "_symbol",
                "offset": 0,
                "slot": "55",
                "type": "t_string_storage"
              },
              {
                "astId": 1386,
                "contract": "contracts/test/ERC20Mintable.sol:ERC20Mintable",
                "label": "_decimals",
                "offset": 0,
                "slot": "56",
                "type": "t_uint8"
              },
              {
                "astId": 1881,
                "contract": "contracts/test/ERC20Mintable.sol:ERC20Mintable",
                "label": "__gap",
                "offset": 0,
                "slot": "57",
                "type": "t_array(t_uint256)44_storage"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_uint256)44_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[44]",
                "numberOfBytes": "1408"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_mapping(t_address,t_mapping(t_address,t_uint256))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => uint256))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_uint256)"
              },
              "t_mapping(t_address,t_uint256)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => uint256)",
                "numberOfBytes": "32",
                "value": "t_uint256"
              },
              "t_string_storage": {
                "encoding": "bytes",
                "label": "string",
                "numberOfBytes": "32"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint8": {
                "encoding": "inplace",
                "label": "uint8",
                "numberOfBytes": "1"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/test/ERC721Mintable.sol": {
        "ERC721Mintable": {
          "abi": [
            {
              "inputs": [],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "approved",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "Approval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                }
              ],
              "name": "ApprovalForAll",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "Transfer",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "approve",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "baseURI",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "burn",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "getApproved",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                }
              ],
              "name": "isApprovedForAll",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "mint",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "name",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "ownerOf",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "safeTransferFrom",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes",
                  "name": "_data",
                  "type": "bytes"
                }
              ],
              "name": "safeTransferFrom",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                }
              ],
              "name": "setApprovalForAll",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes4",
                  "name": "interfaceId",
                  "type": "bytes4"
                }
              ],
              "name": "supportsInterface",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "symbol",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "index",
                  "type": "uint256"
                }
              ],
              "name": "tokenByIndex",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "index",
                  "type": "uint256"
                }
              ],
              "name": "tokenOfOwnerByIndex",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "tokenURI",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "transferFrom",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "details": "Extension of {ERC721} for Minting/Burning",
            "kind": "dev",
            "methods": {
              "approve(address,uint256)": {
                "details": "See {IERC721-approve}."
              },
              "balanceOf(address)": {
                "details": "See {IERC721-balanceOf}."
              },
              "baseURI()": {
                "details": "Returns the base URI set via {_setBaseURI}. This will be automatically added as a prefix in {tokenURI} to each token's URI, or to the token ID if no specific URI is set for that token ID."
              },
              "burn(uint256)": {
                "details": "See {ERC721-_burn}."
              },
              "getApproved(uint256)": {
                "details": "See {IERC721-getApproved}."
              },
              "isApprovedForAll(address,address)": {
                "details": "See {IERC721-isApprovedForAll}."
              },
              "mint(address,uint256)": {
                "details": "See {ERC721-_mint}."
              },
              "name()": {
                "details": "See {IERC721Metadata-name}."
              },
              "ownerOf(uint256)": {
                "details": "See {IERC721-ownerOf}."
              },
              "safeTransferFrom(address,address,uint256)": {
                "details": "See {IERC721-safeTransferFrom}."
              },
              "safeTransferFrom(address,address,uint256,bytes)": {
                "details": "See {IERC721-safeTransferFrom}."
              },
              "setApprovalForAll(address,bool)": {
                "details": "See {IERC721-setApprovalForAll}."
              },
              "supportsInterface(bytes4)": {
                "details": "See {IERC165-supportsInterface}. Time complexity O(1), guaranteed to always use less than 30 000 gas."
              },
              "symbol()": {
                "details": "See {IERC721Metadata-symbol}."
              },
              "tokenByIndex(uint256)": {
                "details": "See {IERC721Enumerable-tokenByIndex}."
              },
              "tokenOfOwnerByIndex(address,uint256)": {
                "details": "See {IERC721Enumerable-tokenOfOwnerByIndex}."
              },
              "tokenURI(uint256)": {
                "details": "See {IERC721Metadata-tokenURI}."
              },
              "totalSupply()": {
                "details": "See {IERC721Enumerable-totalSupply}."
              },
              "transferFrom(address,address,uint256)": {
                "details": "See {IERC721-transferFrom}."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60806040523480156200001157600080fd5b506200005e604051806040016040528060078152602001664552432037323160c81b8152506040518060400160405280600381526020016213919560ea1b8152506200006460201b60201c565b620004bb565b600054610100900460ff16806200008057506200008062000130565b806200008f575060005460ff16155b620000cc5760405162461bcd60e51b815260040180806020018281038252602e8152602001806200220a602e913960400191505060405180910390fd5b600054610100900460ff16158015620000f8576000805460ff1961ff0019909116610100171660011790555b620001026200014e565b6200010c620001f8565b6200011883836200029e565b80156200012b576000805461ff00191690555b505050565b600062000148306200039460201b62000d291760201c565b15905090565b600054610100900460ff16806200016a57506200016a62000130565b8062000179575060005460ff16155b620001b65760405162461bcd60e51b815260040180806020018281038252602e8152602001806200220a602e913960400191505060405180910390fd5b600054610100900460ff16158015620001e2576000805460ff1961ff0019909116610100171660011790555b8015620001f5576000805461ff00191690555b50565b600054610100900460ff16806200021457506200021462000130565b8062000223575060005460ff16155b620002605760405162461bcd60e51b815260040180806020018281038252602e8152602001806200220a602e913960400191505060405180910390fd5b600054610100900460ff161580156200028c576000805460ff1961ff0019909116610100171660011790555b620001e26301ffc9a760e01b6200039a565b600054610100900460ff1680620002ba5750620002ba62000130565b80620002c9575060005460ff16155b620003065760405162461bcd60e51b815260040180806020018281038252602e8152602001806200220a602e913960400191505060405180910390fd5b600054610100900460ff1615801562000332576000805460ff1961ff0019909116610100171660011790555b82516200034790606a9060208601906200041f565b5081516200035d90606b9060208501906200041f565b50620003706380ac58cd60e01b6200039a565b62000382635b5e139f60e01b6200039a565b6200011863780e9d6360e01b6200039a565b3b151590565b6001600160e01b03198082161415620003fa576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152603360205260409020805460ff19166001179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200046257805160ff191683800117855562000492565b8280016001018555821562000492579182015b828111156200049257825182559160200191906001019062000475565b50620004a0929150620004a4565b5090565b5b80821115620004a05760008155600101620004a5565b611d3f80620004cb6000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806342966c68116100ad57806395d89b411161007157806395d89b41146103a8578063a22cb465146103b0578063b88d4fde146103de578063c87b56dd146104a4578063e985e9c5146104c157610121565b806342966c68146103235780634f6ccce7146103405780636352211e1461035d5780636c0360eb1461037a57806370a082311461038257610121565b806318160ddd116100f457806318160ddd1461024557806323b872dd1461025f5780632f745c591461029557806340c10f19146102c157806342842e0e146102ed57610121565b806301ffc9a71461012657806306fdde0314610161578063081812fc146101de578063095ea7b314610217575b600080fd5b61014d6004803603602081101561013c57600080fd5b50356001600160e01b0319166104ef565b604080519115158252519081900360200190f35b610169610512565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101a357818101518382015260200161018b565b50505050905090810190601f1680156101d05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101fb600480360360208110156101f457600080fd5b50356105a8565b604080516001600160a01b039092168252519081900360200190f35b6102436004803603604081101561022d57600080fd5b506001600160a01b03813516906020013561060a565b005b61024d6106e5565b60408051918252519081900360200190f35b6102436004803603606081101561027557600080fd5b506001600160a01b038135811691602081013590911690604001356106f6565b61024d600480360360408110156102ab57600080fd5b506001600160a01b03813516906020013561074d565b610243600480360360408110156102d757600080fd5b506001600160a01b038135169060200135610778565b6102436004803603606081101561030357600080fd5b506001600160a01b03813581169160208101359091169060400135610786565b6102436004803603602081101561033957600080fd5b50356107a1565b61024d6004803603602081101561035657600080fd5b50356107ad565b6101fb6004803603602081101561037357600080fd5b50356107c3565b6101696107eb565b61024d6004803603602081101561039857600080fd5b50356001600160a01b031661084c565b6101696108b4565b610243600480360360408110156103c657600080fd5b506001600160a01b0381351690602001351515610915565b610243600480360360808110156103f457600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561042f57600080fd5b82018360208201111561044157600080fd5b8035906020019184600183028401116401000000008311171561046357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610a1a945050505050565b610169600480360360208110156104ba57600080fd5b5035610a78565b61014d600480360360408110156104d757600080fd5b506001600160a01b0381358116916020013516610cfb565b6001600160e01b0319811660009081526033602052604090205460ff165b919050565b606a8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561059e5780601f106105735761010080835404028352916020019161059e565b820191906000526020600020905b81548152906001019060200180831161058157829003601f168201915b5050505050905090565b60006105b382610d2f565b6105ee5760405162461bcd60e51b815260040180806020018281038252602c815260200180611c34602c913960400191505060405180910390fd5b506000908152606860205260409020546001600160a01b031690565b6000610615826107c3565b9050806001600160a01b0316836001600160a01b031614156106685760405162461bcd60e51b8152600401808060200182810382526021815260200180611cb86021913960400191505060405180910390fd5b806001600160a01b031661067a610d3c565b6001600160a01b0316148061069b575061069b81610696610d3c565b610cfb565b6106d65760405162461bcd60e51b8152600401808060200182810382526038815260200180611b876038913960400191505060405180910390fd5b6106e08383610d40565b505050565b60006106f16066610dae565b905090565b610707610701610d3c565b82610db9565b6107425760405162461bcd60e51b8152600401808060200182810382526031815260200180611cd96031913960400191505060405180910390fd5b6106e0838383610e5d565b6001600160a01b038216600090815260656020526040812061076f9083610fa9565b90505b92915050565b6107828282610fb5565b5050565b6106e083838360405180602001604052806000815250610a1a565b6107aa816110e3565b50565b6000806107bb6066846111b0565b509392505050565b600061077282604051806060016040528060298152602001611be960299139606691906111cc565b606d8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561059e5780601f106105735761010080835404028352916020019161059e565b60006001600160a01b0382166108935760405162461bcd60e51b815260040180806020018281038252602a815260200180611bbf602a913960400191505060405180910390fd5b6001600160a01b038216600090815260656020526040902061077290610dae565b606b8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561059e5780601f106105735761010080835404028352916020019161059e565b61091d610d3c565b6001600160a01b0316826001600160a01b03161415610983576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b8060696000610990610d3c565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556109d4610d3c565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b610a2b610a25610d3c565b83610db9565b610a665760405162461bcd60e51b8152600401808060200182810382526031815260200180611cd96031913960400191505060405180910390fd5b610a72848484846111e3565b50505050565b6060610a8382610d2f565b610abe5760405162461bcd60e51b815260040180806020018281038252602f815260200180611c89602f913960400191505060405180910390fd5b6000828152606c602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610b535780601f10610b2857610100808354040283529160200191610b53565b820191906000526020600020905b815481529060010190602001808311610b3657829003601f168201915b505050505090506060610b646107eb565b9050805160001415610b785750905061050d565b815115610c395780826040516020018083805190602001908083835b60208310610bb35780518252601f199092019160209182019101610b94565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310610bfb5780518252601f199092019160209182019101610bdc565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529250505061050d565b80610c4385611235565b6040516020018083805190602001908083835b60208310610c755780518252601f199092019160209182019101610c56565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310610cbd5780518252601f199092019160209182019101610c9e565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050919050565b6001600160a01b03918216600090815260696020908152604080832093909416825291909152205460ff1690565b3b151590565b6000610772606683611310565b3390565b600081815260686020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610d75826107c3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006107728261131c565b6000610dc482610d2f565b610dff5760405162461bcd60e51b815260040180806020018281038252602c815260200180611b5b602c913960400191505060405180910390fd5b6000610e0a836107c3565b9050806001600160a01b0316846001600160a01b03161480610e455750836001600160a01b0316610e3a846105a8565b6001600160a01b0316145b80610e555750610e558185610cfb565b949350505050565b826001600160a01b0316610e70826107c3565b6001600160a01b031614610eb55760405162461bcd60e51b8152600401808060200182810382526029815260200180611c606029913960400191505060405180910390fd5b6001600160a01b038216610efa5760405162461bcd60e51b8152600401808060200182810382526024815260200180611b376024913960400191505060405180910390fd5b610f058383836106e0565b610f10600082610d40565b6001600160a01b0383166000908152606560205260409020610f329082611320565b506001600160a01b0382166000908152606560205260409020610f55908261132c565b50610f6260668284611338565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061076f838361134e565b6001600160a01b038216611010576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b61101981610d2f565b1561106b576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b611077600083836106e0565b6001600160a01b0382166000908152606560205260409020611099908261132c565b506110a660668284611338565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006110ee826107c3565b90506110fc816000846106e0565b611107600083610d40565b6000828152606c60205260409020546002600019610100600184161502019091160415611145576000828152606c6020526040812061114591611a8a565b6001600160a01b03811660009081526065602052604090206111679083611320565b506111736066836113b2565b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60008080806111bf86866113be565b9097909650945050505050565b60006111d9848484611439565b90505b9392505050565b6111ee848484610e5d565b6111fa84848484611503565b610a725760405162461bcd60e51b8152600401808060200182810382526032815260200180611b056032913960400191505060405180910390fd5b60608161125a57506040805180820190915260018152600360fc1b602082015261050d565b8160005b811561127257600101600a8204915061125e565b60608167ffffffffffffffff8111801561128b57600080fd5b506040519080825280601f01601f1916602001820160405280156112b6576020820181803683370190505b50859350905060001982015b831561130757600a840660300160f81b828280600190039350815181106112e557fe5b60200101906001600160f81b031916908160001a905350600a840493506112c2565b50949350505050565b600061076f838361166b565b5490565b600061076f8383611683565b600061076f8383611749565b60006111d984846001600160a01b038516611793565b815460009082106113905760405162461bcd60e51b8152600401808060200182810382526022815260200180611ae36022913960400191505060405180910390fd5b82600001828154811061139f57fe5b9060005260206000200154905092915050565b600061076f838361182a565b8154600090819083106114025760405162461bcd60e51b8152600401808060200182810382526022815260200180611c126022913960400191505060405180910390fd5b600084600001848154811061141357fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816114d45760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611499578181015183820152602001611481565b50505050905090810190601f1680156114c65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508460000160018203815481106114e757fe5b9060005260206000209060020201600101549150509392505050565b6000611517846001600160a01b0316610d29565b61152357506001610e55565b6060611631630a85bd0160e11b611538610d3c565b88878760405160240180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561159f578181015183820152602001611587565b50505050905090810190601f1680156115cc5780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001611b05603291396001600160a01b03881691906118fe565b9050600081806020019051602081101561164a57600080fd5b50516001600160e01b031916630a85bd0160e11b1492505050949350505050565b60009081526001919091016020526040902054151590565b6000818152600183016020526040812054801561173f57835460001980830191908101906000908790839081106116b657fe5b90600052602060002001549050808760000184815481106116d357fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061170357fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610772565b6000915050610772565b6000611755838361166b565b61178b57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610772565b506000610772565b6000828152600184016020526040812054806117f85750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556111dc565b8285600001600183038154811061180b57fe5b90600052602060002090600202016001018190555060009150506111dc565b6000818152600183016020526040812054801561173f578354600019808301919081019060009087908390811061185d57fe5b906000526020600020906002020190508087600001848154811061187d57fe5b6000918252602080832084546002909302019182556001938401549184019190915583548252898301905260409020908401905586548790806118bc57fe5b60008281526020808220600260001990940193840201828155600190810183905592909355888152898201909252604082209190915594506107729350505050565b60606111d984846000858561191285610d29565b611963576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106119a25780518252601f199092019160209182019101611983565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611a04576040519150601f19603f3d011682016040523d82523d6000602084013e611a09565b606091505b5091509150611a19828286611a24565b979650505050505050565b60608315611a335750816111dc565b825115611a435782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315611499578181015183820152602001611481565b50805460018160011615610100020316600290046000825580601f10611ab057506107aa565b601f0160209004906000526020600020908101906107aa91905b80821115611ade5760008155600101611aca565b509056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64734552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564a26469706673582212207152c3d446e766d317146419dfb1971f31f4c6989c39b90e7fc8cc41f066dc6564736f6c634300060c0033496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0x5E PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x7 DUP2 MSTORE PUSH1 0x20 ADD PUSH7 0x45524320373231 PUSH1 0xC8 SHL DUP2 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH3 0x139195 PUSH1 0xEA SHL DUP2 MSTORE POP PUSH3 0x64 PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST PUSH3 0x4BB JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH3 0x80 JUMPI POP PUSH3 0x80 PUSH3 0x130 JUMP JUMPDEST DUP1 PUSH3 0x8F JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH3 0xCC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH3 0x220A PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH3 0xF8 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH3 0x102 PUSH3 0x14E JUMP JUMPDEST PUSH3 0x10C PUSH3 0x1F8 JUMP JUMPDEST PUSH3 0x118 DUP4 DUP4 PUSH3 0x29E JUMP JUMPDEST DUP1 ISZERO PUSH3 0x12B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x148 ADDRESS PUSH3 0x394 PUSH1 0x20 SHL PUSH3 0xD29 OR PUSH1 0x20 SHR JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH3 0x16A JUMPI POP PUSH3 0x16A PUSH3 0x130 JUMP JUMPDEST DUP1 PUSH3 0x179 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH3 0x1B6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH3 0x220A PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH3 0x1E2 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP1 ISZERO PUSH3 0x1F5 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH3 0x214 JUMPI POP PUSH3 0x214 PUSH3 0x130 JUMP JUMPDEST DUP1 PUSH3 0x223 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH3 0x260 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH3 0x220A PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH3 0x28C JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH3 0x1E2 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH3 0x39A JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH3 0x2BA JUMPI POP PUSH3 0x2BA PUSH3 0x130 JUMP JUMPDEST DUP1 PUSH3 0x2C9 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH3 0x306 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH3 0x220A PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH3 0x332 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP3 MLOAD PUSH3 0x347 SWAP1 PUSH1 0x6A SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH3 0x41F JUMP JUMPDEST POP DUP2 MLOAD PUSH3 0x35D SWAP1 PUSH1 0x6B SWAP1 PUSH1 0x20 DUP6 ADD SWAP1 PUSH3 0x41F JUMP JUMPDEST POP PUSH3 0x370 PUSH4 0x80AC58CD PUSH1 0xE0 SHL PUSH3 0x39A JUMP JUMPDEST PUSH3 0x382 PUSH4 0x5B5E139F PUSH1 0xE0 SHL PUSH3 0x39A JUMP JUMPDEST PUSH3 0x118 PUSH4 0x780E9D63 PUSH1 0xE0 SHL PUSH3 0x39A JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP1 DUP3 AND EQ ISZERO PUSH3 0x3FA JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4552433136353A20696E76616C696420696E7465726661636520696400000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x462 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x492 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x492 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x492 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x475 JUMP JUMPDEST POP PUSH3 0x4A0 SWAP3 SWAP2 POP PUSH3 0x4A4 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x4A0 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x4A5 JUMP JUMPDEST PUSH2 0x1D3F DUP1 PUSH3 0x4CB PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x121 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x42966C68 GT PUSH2 0xAD JUMPI DUP1 PUSH4 0x95D89B41 GT PUSH2 0x71 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x3A8 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x3B0 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x3DE JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0x4A4 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x4C1 JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x42966C68 EQ PUSH2 0x323 JUMPI DUP1 PUSH4 0x4F6CCCE7 EQ PUSH2 0x340 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x35D JUMPI DUP1 PUSH4 0x6C0360EB EQ PUSH2 0x37A JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x382 JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x18160DDD GT PUSH2 0xF4 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x245 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x25F JUMPI DUP1 PUSH4 0x2F745C59 EQ PUSH2 0x295 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x2C1 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x2ED JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x126 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x161 JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x1DE JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x217 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x14D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x13C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH2 0x4EF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x169 PUSH2 0x512 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1A3 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x18B JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1D0 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1FB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x5A8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x22D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x60A JUMP JUMPDEST STOP JUMPDEST PUSH2 0x24D PUSH2 0x6E5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x275 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x6F6 JUMP JUMPDEST PUSH2 0x24D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x2AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x74D JUMP JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x2D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x778 JUMP JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x303 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x786 JUMP JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x339 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x7A1 JUMP JUMPDEST PUSH2 0x24D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x356 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x7AD JUMP JUMPDEST PUSH2 0x1FB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x373 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x7C3 JUMP JUMPDEST PUSH2 0x169 PUSH2 0x7EB JUMP JUMPDEST PUSH2 0x24D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x398 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x84C JUMP JUMPDEST PUSH2 0x169 PUSH2 0x8B4 JUMP JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD ISZERO ISZERO PUSH2 0x915 JUMP JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x3F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x42F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x441 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x463 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0xA1A SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x169 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xA78 JUMP JUMPDEST PUSH2 0x14D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x4D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xCFB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x59E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x573 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x59E JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x581 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5B3 DUP3 PUSH2 0xD2F JUMP JUMPDEST PUSH2 0x5EE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1C34 PUSH1 0x2C SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x68 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x615 DUP3 PUSH2 0x7C3 JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x668 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1CB8 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x67A PUSH2 0xD3C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0x69B JUMPI POP PUSH2 0x69B DUP2 PUSH2 0x696 PUSH2 0xD3C JUMP JUMPDEST PUSH2 0xCFB JUMP JUMPDEST PUSH2 0x6D6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x38 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1B87 PUSH1 0x38 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x6E0 DUP4 DUP4 PUSH2 0xD40 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6F1 PUSH1 0x66 PUSH2 0xDAE JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x707 PUSH2 0x701 PUSH2 0xD3C JUMP JUMPDEST DUP3 PUSH2 0xDB9 JUMP JUMPDEST PUSH2 0x742 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x31 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1CD9 PUSH1 0x31 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x6E0 DUP4 DUP4 DUP4 PUSH2 0xE5D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x76F SWAP1 DUP4 PUSH2 0xFA9 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x782 DUP3 DUP3 PUSH2 0xFB5 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x6E0 DUP4 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP PUSH2 0xA1A JUMP JUMPDEST PUSH2 0x7AA DUP2 PUSH2 0x10E3 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x7BB PUSH1 0x66 DUP5 PUSH2 0x11B0 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x772 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1BE9 PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x66 SWAP2 SWAP1 PUSH2 0x11CC JUMP JUMPDEST PUSH1 0x6D DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x59E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x573 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x59E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x893 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1BBF PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x772 SWAP1 PUSH2 0xDAE JUMP JUMPDEST PUSH1 0x6B DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x59E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x573 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x59E JUMP JUMPDEST PUSH2 0x91D PUSH2 0xD3C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x983 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4552433732313A20617070726F766520746F2063616C6C657200000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x69 PUSH1 0x0 PUSH2 0x990 PUSH2 0xD3C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP8 AND DUP1 DUP3 MSTORE SWAP2 SWAP1 SWAP4 MSTORE SWAP2 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP3 ISZERO ISZERO SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE PUSH2 0x9D4 PUSH2 0xD3C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH2 0xA2B PUSH2 0xA25 PUSH2 0xD3C JUMP JUMPDEST DUP4 PUSH2 0xDB9 JUMP JUMPDEST PUSH2 0xA66 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x31 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1CD9 PUSH1 0x31 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xA72 DUP5 DUP5 DUP5 DUP5 PUSH2 0x11E3 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0xA83 DUP3 PUSH2 0xD2F JUMP JUMPDEST PUSH2 0xABE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2F DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1C89 PUSH1 0x2F SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x6C PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD DUP4 MLOAD PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP7 AND ISZERO MUL ADD SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 DIV SWAP2 DUP3 ADD DUP5 SWAP1 DIV DUP5 MUL DUP2 ADD DUP5 ADD SWAP1 SWAP5 MSTORE DUP1 DUP5 MSTORE PUSH1 0x60 SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xB53 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xB28 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xB53 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xB36 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH1 0x60 PUSH2 0xB64 PUSH2 0x7EB JUMP JUMPDEST SWAP1 POP DUP1 MLOAD PUSH1 0x0 EQ ISZERO PUSH2 0xB78 JUMPI POP SWAP1 POP PUSH2 0x50D JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0xC39 JUMPI DUP1 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xBB3 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xB94 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE DUP6 MLOAD SWAP2 SWAP1 SWAP4 ADD SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xBFB JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xBDC JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP3 POP POP POP PUSH2 0x50D JUMP JUMPDEST DUP1 PUSH2 0xC43 DUP6 PUSH2 0x1235 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xC75 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xC56 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE DUP6 MLOAD SWAP2 SWAP1 SWAP4 ADD SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xCBD JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xC9E JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP3 POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x772 PUSH1 0x66 DUP4 PUSH2 0x1310 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x68 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 SWAP1 PUSH2 0xD75 DUP3 PUSH2 0x7C3 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x772 DUP3 PUSH2 0x131C JUMP JUMPDEST PUSH1 0x0 PUSH2 0xDC4 DUP3 PUSH2 0xD2F JUMP JUMPDEST PUSH2 0xDFF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1B5B PUSH1 0x2C SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xE0A DUP4 PUSH2 0x7C3 JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0xE45 JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE3A DUP5 PUSH2 0x5A8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0xE55 JUMPI POP PUSH2 0xE55 DUP2 DUP6 PUSH2 0xCFB JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE70 DUP3 PUSH2 0x7C3 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xEB5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1C60 PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xEFA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1B37 PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xF05 DUP4 DUP4 DUP4 PUSH2 0x6E0 JUMP JUMPDEST PUSH2 0xF10 PUSH1 0x0 DUP3 PUSH2 0xD40 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0xF32 SWAP1 DUP3 PUSH2 0x1320 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0xF55 SWAP1 DUP3 PUSH2 0x132C JUMP JUMPDEST POP PUSH2 0xF62 PUSH1 0x66 DUP3 DUP5 PUSH2 0x1338 JUMP JUMPDEST POP DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x76F DUP4 DUP4 PUSH2 0x134E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x1010 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4552433732313A206D696E7420746F20746865207A65726F2061646472657373 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1019 DUP2 PUSH2 0xD2F JUMP JUMPDEST ISZERO PUSH2 0x106B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4552433732313A20746F6B656E20616C7265616479206D696E74656400000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1077 PUSH1 0x0 DUP4 DUP4 PUSH2 0x6E0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x1099 SWAP1 DUP3 PUSH2 0x132C JUMP JUMPDEST POP PUSH2 0x10A6 PUSH1 0x66 DUP3 DUP5 PUSH2 0x1338 JUMP JUMPDEST POP PUSH1 0x40 MLOAD DUP2 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH1 0x0 SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP1 DUP3 SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10EE DUP3 PUSH2 0x7C3 JUMP JUMPDEST SWAP1 POP PUSH2 0x10FC DUP2 PUSH1 0x0 DUP5 PUSH2 0x6E0 JUMP JUMPDEST PUSH2 0x1107 PUSH1 0x0 DUP4 PUSH2 0xD40 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x6C PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV ISZERO PUSH2 0x1145 JUMPI PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x6C PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x1145 SWAP2 PUSH2 0x1A8A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x1167 SWAP1 DUP4 PUSH2 0x1320 JUMP JUMPDEST POP PUSH2 0x1173 PUSH1 0x66 DUP4 PUSH2 0x13B2 JUMP JUMPDEST POP PUSH1 0x40 MLOAD DUP3 SWAP1 PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP1 DUP4 SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH2 0x11BF DUP7 DUP7 PUSH2 0x13BE JUMP JUMPDEST SWAP1 SWAP8 SWAP1 SWAP7 POP SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11D9 DUP5 DUP5 DUP5 PUSH2 0x1439 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x11EE DUP5 DUP5 DUP5 PUSH2 0xE5D JUMP JUMPDEST PUSH2 0x11FA DUP5 DUP5 DUP5 DUP5 PUSH2 0x1503 JUMP JUMPDEST PUSH2 0xA72 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x32 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1B05 PUSH1 0x32 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x60 DUP2 PUSH2 0x125A JUMPI POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1 DUP2 MSTORE PUSH1 0x3 PUSH1 0xFC SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x50D JUMP JUMPDEST DUP2 PUSH1 0x0 JUMPDEST DUP2 ISZERO PUSH2 0x1272 JUMPI PUSH1 0x1 ADD PUSH1 0xA DUP3 DIV SWAP2 POP PUSH2 0x125E JUMP JUMPDEST PUSH1 0x60 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x128B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x12B6 JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP6 SWAP4 POP SWAP1 POP PUSH1 0x0 NOT DUP3 ADD JUMPDEST DUP4 ISZERO PUSH2 0x1307 JUMPI PUSH1 0xA DUP5 MOD PUSH1 0x30 ADD PUSH1 0xF8 SHL DUP3 DUP3 DUP1 PUSH1 0x1 SWAP1 SUB SWAP4 POP DUP2 MLOAD DUP2 LT PUSH2 0x12E5 JUMPI INVALID JUMPDEST PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xF8 SHL SUB NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0xA DUP5 DIV SWAP4 POP PUSH2 0x12C2 JUMP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x76F DUP4 DUP4 PUSH2 0x166B JUMP JUMPDEST SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x76F DUP4 DUP4 PUSH2 0x1683 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x76F DUP4 DUP4 PUSH2 0x1749 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11D9 DUP5 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x1793 JUMP JUMPDEST DUP2 SLOAD PUSH1 0x0 SWAP1 DUP3 LT PUSH2 0x1390 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1AE3 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 PUSH1 0x0 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x139F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x76F DUP4 DUP4 PUSH2 0x182A JUMP JUMPDEST DUP2 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP4 LT PUSH2 0x1402 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1C12 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP5 PUSH1 0x0 ADD DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x1413 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD SWAP1 POP DUP1 PUSH1 0x0 ADD SLOAD DUP2 PUSH1 0x1 ADD SLOAD SWAP3 POP SWAP3 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP3 DUP2 PUSH2 0x14D4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1499 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1481 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x14C6 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP5 PUSH1 0x0 ADD PUSH1 0x1 DUP3 SUB DUP2 SLOAD DUP2 LT PUSH2 0x14E7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD PUSH1 0x1 ADD SLOAD SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1517 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xD29 JUMP JUMPDEST PUSH2 0x1523 JUMPI POP PUSH1 0x1 PUSH2 0xE55 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1631 PUSH4 0xA85BD01 PUSH1 0xE1 SHL PUSH2 0x1538 PUSH2 0xD3C JUMP JUMPDEST DUP9 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x24 ADD DUP1 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x159F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1587 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x15CC JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x32 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1B05 PUSH1 0x32 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND SWAP2 SWAP1 PUSH2 0x18FE JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x164A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH4 0xA85BD01 PUSH1 0xE1 SHL EQ SWAP3 POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 DUP4 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP1 ISZERO PUSH2 0x173F JUMPI DUP4 SLOAD PUSH1 0x0 NOT DUP1 DUP4 ADD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x0 SWAP1 DUP8 SWAP1 DUP4 SWAP1 DUP2 LT PUSH2 0x16B6 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP DUP1 DUP8 PUSH1 0x0 ADD DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x16D3 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SWAP3 SWAP1 SWAP3 SSTORE DUP3 DUP2 MSTORE PUSH1 0x1 DUP10 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP5 ADD SWAP1 SSTORE DUP7 SLOAD DUP8 SWAP1 DUP1 PUSH2 0x1703 JUMPI INVALID JUMPDEST PUSH1 0x1 SWAP1 SUB DUP2 DUP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SSTORE SWAP1 SSTORE DUP7 PUSH1 0x1 ADD PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SSTORE PUSH1 0x1 SWAP5 POP POP POP POP POP PUSH2 0x772 JUMP JUMPDEST PUSH1 0x0 SWAP2 POP POP PUSH2 0x772 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1755 DUP4 DUP4 PUSH2 0x166B JUMP JUMPDEST PUSH2 0x178B JUMPI POP DUP2 SLOAD PUSH1 0x1 DUP2 DUP2 ADD DUP5 SSTORE PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 KECCAK256 SWAP1 SWAP4 ADD DUP5 SWAP1 SSTORE DUP5 SLOAD DUP5 DUP3 MSTORE DUP3 DUP7 ADD SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE PUSH2 0x772 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x772 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP1 PUSH2 0x17F8 JUMPI POP POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE DUP4 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP5 DUP2 MSTORE DUP7 SLOAD PUSH1 0x1 DUP2 DUP2 ADD DUP10 SSTORE PUSH1 0x0 DUP10 DUP2 MSTORE DUP5 DUP2 KECCAK256 SWAP6 MLOAD PUSH1 0x2 SWAP1 SWAP4 MUL SWAP1 SWAP6 ADD SWAP2 DUP3 SSTORE SWAP2 MLOAD SWAP1 DUP3 ADD SSTORE DUP7 SLOAD DUP7 DUP5 MSTORE DUP2 DUP9 ADD SWAP1 SWAP3 MSTORE SWAP3 SWAP1 SWAP2 KECCAK256 SSTORE PUSH2 0x11DC JUMP JUMPDEST DUP3 DUP6 PUSH1 0x0 ADD PUSH1 0x1 DUP4 SUB DUP2 SLOAD DUP2 LT PUSH2 0x180B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD PUSH1 0x1 ADD DUP2 SWAP1 SSTORE POP PUSH1 0x0 SWAP2 POP POP PUSH2 0x11DC JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 DUP4 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP1 ISZERO PUSH2 0x173F JUMPI DUP4 SLOAD PUSH1 0x0 NOT DUP1 DUP4 ADD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x0 SWAP1 DUP8 SWAP1 DUP4 SWAP1 DUP2 LT PUSH2 0x185D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD SWAP1 POP DUP1 DUP8 PUSH1 0x0 ADD DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x187D JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 DUP5 SLOAD PUSH1 0x2 SWAP1 SWAP4 MUL ADD SWAP2 DUP3 SSTORE PUSH1 0x1 SWAP4 DUP5 ADD SLOAD SWAP2 DUP5 ADD SWAP2 SWAP1 SWAP2 SSTORE DUP4 SLOAD DUP3 MSTORE DUP10 DUP4 ADD SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP5 ADD SWAP1 SSTORE DUP7 SLOAD DUP8 SWAP1 DUP1 PUSH2 0x18BC JUMPI INVALID JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 KECCAK256 PUSH1 0x2 PUSH1 0x0 NOT SWAP1 SWAP5 ADD SWAP4 DUP5 MUL ADD DUP3 DUP2 SSTORE PUSH1 0x1 SWAP1 DUP2 ADD DUP4 SWAP1 SSTORE SWAP3 SWAP1 SWAP4 SSTORE DUP9 DUP2 MSTORE DUP10 DUP3 ADD SWAP1 SWAP3 MSTORE PUSH1 0x40 DUP3 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE SWAP5 POP PUSH2 0x772 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x11D9 DUP5 DUP5 PUSH1 0x0 DUP6 DUP6 PUSH2 0x1912 DUP6 PUSH2 0xD29 JUMP JUMPDEST PUSH2 0x1963 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x19A2 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1983 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1A04 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1A09 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x1A19 DUP3 DUP3 DUP7 PUSH2 0x1A24 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1A33 JUMPI POP DUP2 PUSH2 0x11DC JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x1A43 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x1499 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1481 JUMP JUMPDEST POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV PUSH1 0x0 DUP3 SSTORE DUP1 PUSH1 0x1F LT PUSH2 0x1AB0 JUMPI POP PUSH2 0x7AA JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0x7AA SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1ADE JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1ACA JUMP JUMPDEST POP SWAP1 JUMP INVALID GASLIMIT PUSH15 0x756D657261626C655365743A20696E PUSH5 0x6578206F75 PUSH21 0x206F6620626F756E64734552433732313A20747261 PUSH15 0x7366657220746F206E6F6E20455243 CALLDATACOPY ORIGIN BALANCE MSTORE PUSH6 0x636569766572 KECCAK256 PUSH10 0x6D706C656D656E746572 GASLIMIT MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH21 0x72616E7366657220746F20746865207A65726F2061 PUSH5 0x6472657373 GASLIMIT MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH16 0x70657261746F7220717565727920666F PUSH19 0x206E6F6E6578697374656E7420746F6B656E45 MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F76652063616C6C6572206973206E6F74206F PUSH24 0x6E6572206E6F7220617070726F76656420666F7220616C6C GASLIMIT MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH3 0x616C61 PUSH15 0x636520717565727920666F72207468 PUSH6 0x207A65726F20 PUSH2 0x6464 PUSH19 0x6573734552433732313A206F776E6572207175 PUSH6 0x727920666F72 KECCAK256 PUSH15 0x6F6E6578697374656E7420746F6B65 PUSH15 0x456E756D657261626C654D61703A20 PUSH10 0x6E646578206F7574206F PUSH7 0x20626F756E6473 GASLIMIT MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F76656420717565727920666F72206E6F6E65 PUSH25 0x697374656E7420746F6B656E4552433732313A207472616E73 PUSH7 0x6572206F662074 PUSH16 0x6B656E2074686174206973206E6F7420 PUSH16 0x776E4552433732314D65746164617461 GASPRICE KECCAK256 SSTORE MSTORE 0x49 KECCAK256 PUSH18 0x7565727920666F72206E6F6E657869737465 PUSH15 0x7420746F6B656E4552433732313A20 PUSH2 0x7070 PUSH19 0x6F76616C20746F2063757272656E74206F776E PUSH6 0x724552433732 BALANCE GASPRICE KECCAK256 PUSH21 0x72616E736665722063616C6C6572206973206E6F74 KECCAK256 PUSH16 0x776E6572206E6F7220617070726F7665 PUSH5 0xA264697066 PUSH20 0x582212207152C3D446E766D317146419DFB1971F BALANCE DELEGATECALL 0xC6 SWAP9 SWAP13 CODECOPY 0xB9 0xE PUSH32 0xC8CC41F066DC6564736F6C634300060C0033496E697469616C697A61626C653A KECCAK256 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 ",
              "sourceMap": "165:386:67:-:0;;;217:70;;;;;;;;;;249:31;;;;;;;;;;;;;;-1:-1:-1;;;249:31:67;;;;;;;;;;;;;;;;-1:-1:-1;;;249:31:67;;;:13;;;:31;;:::i;:::-;165:386;;3918:215:13;1512:13:9;;;;;;;;:33;;-1:-1:-1;1529:16:9;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;4016:26:13::1;:24;:26::i;:::-;4052:25;:23;:25::i;:::-;4087:39;4111:5:::0;4118:7;4087:23:::1;:39::i;:::-;1794:14:9::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1790:66;3918:215:13;;;:::o;1952:123:9:-;2000:4;2024:44;2062:4;2024:29;;;;;:44;;:::i;:::-;2023:45;2016:52;;1952:123;:::o;759:64:19:-;1512:13:9;;;;;;;;:33;;-1:-1:-1;1529:16:9;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1794:14;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1790:66;759:64:19;:::o;777:249:6:-;1512:13:9;;;;;;;;:33;;-1:-1:-1;1529:16:9;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;979:40:6::1;-1:-1:-1::0;;;979:18:6::1;:40::i;4139:403:13:-:0;1512:13:9;;;;;;;;:33;;-1:-1:-1;1529:16:9;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;4247:13:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;4270:17:13;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;4375:40:13::1;-1:-1:-1::0;;;4375:18:13::1;:40::i;:::-;4425:49;-1:-1:-1::0;;;4425:18:13::1;:49::i;:::-;4484:51;-1:-1:-1::0;;;4484:18:13::1;:51::i;737:413:18:-:0;1097:20;1135:8;;;737:413::o;1718:198:6:-;-1:-1:-1;;;;;;1801:25:6;;;;;1793:66;;;;;-1:-1:-1;;;1793:66:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1869:33:6;;;;;:20;:33;;;;;:40;;-1:-1:-1;;1869:40:6;1905:4;1869:40;;;1718:198::o;165:386:67:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;165:386:67;;;-1:-1:-1;165:386:67;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106101215760003560e01c806342966c68116100ad57806395d89b411161007157806395d89b41146103a8578063a22cb465146103b0578063b88d4fde146103de578063c87b56dd146104a4578063e985e9c5146104c157610121565b806342966c68146103235780634f6ccce7146103405780636352211e1461035d5780636c0360eb1461037a57806370a082311461038257610121565b806318160ddd116100f457806318160ddd1461024557806323b872dd1461025f5780632f745c591461029557806340c10f19146102c157806342842e0e146102ed57610121565b806301ffc9a71461012657806306fdde0314610161578063081812fc146101de578063095ea7b314610217575b600080fd5b61014d6004803603602081101561013c57600080fd5b50356001600160e01b0319166104ef565b604080519115158252519081900360200190f35b610169610512565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101a357818101518382015260200161018b565b50505050905090810190601f1680156101d05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101fb600480360360208110156101f457600080fd5b50356105a8565b604080516001600160a01b039092168252519081900360200190f35b6102436004803603604081101561022d57600080fd5b506001600160a01b03813516906020013561060a565b005b61024d6106e5565b60408051918252519081900360200190f35b6102436004803603606081101561027557600080fd5b506001600160a01b038135811691602081013590911690604001356106f6565b61024d600480360360408110156102ab57600080fd5b506001600160a01b03813516906020013561074d565b610243600480360360408110156102d757600080fd5b506001600160a01b038135169060200135610778565b6102436004803603606081101561030357600080fd5b506001600160a01b03813581169160208101359091169060400135610786565b6102436004803603602081101561033957600080fd5b50356107a1565b61024d6004803603602081101561035657600080fd5b50356107ad565b6101fb6004803603602081101561037357600080fd5b50356107c3565b6101696107eb565b61024d6004803603602081101561039857600080fd5b50356001600160a01b031661084c565b6101696108b4565b610243600480360360408110156103c657600080fd5b506001600160a01b0381351690602001351515610915565b610243600480360360808110156103f457600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561042f57600080fd5b82018360208201111561044157600080fd5b8035906020019184600183028401116401000000008311171561046357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610a1a945050505050565b610169600480360360208110156104ba57600080fd5b5035610a78565b61014d600480360360408110156104d757600080fd5b506001600160a01b0381358116916020013516610cfb565b6001600160e01b0319811660009081526033602052604090205460ff165b919050565b606a8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561059e5780601f106105735761010080835404028352916020019161059e565b820191906000526020600020905b81548152906001019060200180831161058157829003601f168201915b5050505050905090565b60006105b382610d2f565b6105ee5760405162461bcd60e51b815260040180806020018281038252602c815260200180611c34602c913960400191505060405180910390fd5b506000908152606860205260409020546001600160a01b031690565b6000610615826107c3565b9050806001600160a01b0316836001600160a01b031614156106685760405162461bcd60e51b8152600401808060200182810382526021815260200180611cb86021913960400191505060405180910390fd5b806001600160a01b031661067a610d3c565b6001600160a01b0316148061069b575061069b81610696610d3c565b610cfb565b6106d65760405162461bcd60e51b8152600401808060200182810382526038815260200180611b876038913960400191505060405180910390fd5b6106e08383610d40565b505050565b60006106f16066610dae565b905090565b610707610701610d3c565b82610db9565b6107425760405162461bcd60e51b8152600401808060200182810382526031815260200180611cd96031913960400191505060405180910390fd5b6106e0838383610e5d565b6001600160a01b038216600090815260656020526040812061076f9083610fa9565b90505b92915050565b6107828282610fb5565b5050565b6106e083838360405180602001604052806000815250610a1a565b6107aa816110e3565b50565b6000806107bb6066846111b0565b509392505050565b600061077282604051806060016040528060298152602001611be960299139606691906111cc565b606d8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561059e5780601f106105735761010080835404028352916020019161059e565b60006001600160a01b0382166108935760405162461bcd60e51b815260040180806020018281038252602a815260200180611bbf602a913960400191505060405180910390fd5b6001600160a01b038216600090815260656020526040902061077290610dae565b606b8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561059e5780601f106105735761010080835404028352916020019161059e565b61091d610d3c565b6001600160a01b0316826001600160a01b03161415610983576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b8060696000610990610d3c565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556109d4610d3c565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b610a2b610a25610d3c565b83610db9565b610a665760405162461bcd60e51b8152600401808060200182810382526031815260200180611cd96031913960400191505060405180910390fd5b610a72848484846111e3565b50505050565b6060610a8382610d2f565b610abe5760405162461bcd60e51b815260040180806020018281038252602f815260200180611c89602f913960400191505060405180910390fd5b6000828152606c602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610b535780601f10610b2857610100808354040283529160200191610b53565b820191906000526020600020905b815481529060010190602001808311610b3657829003601f168201915b505050505090506060610b646107eb565b9050805160001415610b785750905061050d565b815115610c395780826040516020018083805190602001908083835b60208310610bb35780518252601f199092019160209182019101610b94565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310610bfb5780518252601f199092019160209182019101610bdc565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529250505061050d565b80610c4385611235565b6040516020018083805190602001908083835b60208310610c755780518252601f199092019160209182019101610c56565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310610cbd5780518252601f199092019160209182019101610c9e565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050919050565b6001600160a01b03918216600090815260696020908152604080832093909416825291909152205460ff1690565b3b151590565b6000610772606683611310565b3390565b600081815260686020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610d75826107c3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006107728261131c565b6000610dc482610d2f565b610dff5760405162461bcd60e51b815260040180806020018281038252602c815260200180611b5b602c913960400191505060405180910390fd5b6000610e0a836107c3565b9050806001600160a01b0316846001600160a01b03161480610e455750836001600160a01b0316610e3a846105a8565b6001600160a01b0316145b80610e555750610e558185610cfb565b949350505050565b826001600160a01b0316610e70826107c3565b6001600160a01b031614610eb55760405162461bcd60e51b8152600401808060200182810382526029815260200180611c606029913960400191505060405180910390fd5b6001600160a01b038216610efa5760405162461bcd60e51b8152600401808060200182810382526024815260200180611b376024913960400191505060405180910390fd5b610f058383836106e0565b610f10600082610d40565b6001600160a01b0383166000908152606560205260409020610f329082611320565b506001600160a01b0382166000908152606560205260409020610f55908261132c565b50610f6260668284611338565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061076f838361134e565b6001600160a01b038216611010576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b61101981610d2f565b1561106b576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b611077600083836106e0565b6001600160a01b0382166000908152606560205260409020611099908261132c565b506110a660668284611338565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006110ee826107c3565b90506110fc816000846106e0565b611107600083610d40565b6000828152606c60205260409020546002600019610100600184161502019091160415611145576000828152606c6020526040812061114591611a8a565b6001600160a01b03811660009081526065602052604090206111679083611320565b506111736066836113b2565b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60008080806111bf86866113be565b9097909650945050505050565b60006111d9848484611439565b90505b9392505050565b6111ee848484610e5d565b6111fa84848484611503565b610a725760405162461bcd60e51b8152600401808060200182810382526032815260200180611b056032913960400191505060405180910390fd5b60608161125a57506040805180820190915260018152600360fc1b602082015261050d565b8160005b811561127257600101600a8204915061125e565b60608167ffffffffffffffff8111801561128b57600080fd5b506040519080825280601f01601f1916602001820160405280156112b6576020820181803683370190505b50859350905060001982015b831561130757600a840660300160f81b828280600190039350815181106112e557fe5b60200101906001600160f81b031916908160001a905350600a840493506112c2565b50949350505050565b600061076f838361166b565b5490565b600061076f8383611683565b600061076f8383611749565b60006111d984846001600160a01b038516611793565b815460009082106113905760405162461bcd60e51b8152600401808060200182810382526022815260200180611ae36022913960400191505060405180910390fd5b82600001828154811061139f57fe5b9060005260206000200154905092915050565b600061076f838361182a565b8154600090819083106114025760405162461bcd60e51b8152600401808060200182810382526022815260200180611c126022913960400191505060405180910390fd5b600084600001848154811061141357fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816114d45760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611499578181015183820152602001611481565b50505050905090810190601f1680156114c65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508460000160018203815481106114e757fe5b9060005260206000209060020201600101549150509392505050565b6000611517846001600160a01b0316610d29565b61152357506001610e55565b6060611631630a85bd0160e11b611538610d3c565b88878760405160240180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561159f578181015183820152602001611587565b50505050905090810190601f1680156115cc5780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001611b05603291396001600160a01b03881691906118fe565b9050600081806020019051602081101561164a57600080fd5b50516001600160e01b031916630a85bd0160e11b1492505050949350505050565b60009081526001919091016020526040902054151590565b6000818152600183016020526040812054801561173f57835460001980830191908101906000908790839081106116b657fe5b90600052602060002001549050808760000184815481106116d357fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061170357fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610772565b6000915050610772565b6000611755838361166b565b61178b57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610772565b506000610772565b6000828152600184016020526040812054806117f85750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556111dc565b8285600001600183038154811061180b57fe5b90600052602060002090600202016001018190555060009150506111dc565b6000818152600183016020526040812054801561173f578354600019808301919081019060009087908390811061185d57fe5b906000526020600020906002020190508087600001848154811061187d57fe5b6000918252602080832084546002909302019182556001938401549184019190915583548252898301905260409020908401905586548790806118bc57fe5b60008281526020808220600260001990940193840201828155600190810183905592909355888152898201909252604082209190915594506107729350505050565b60606111d984846000858561191285610d29565b611963576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106119a25780518252601f199092019160209182019101611983565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611a04576040519150601f19603f3d011682016040523d82523d6000602084013e611a09565b606091505b5091509150611a19828286611a24565b979650505050505050565b60608315611a335750816111dc565b825115611a435782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315611499578181015183820152602001611481565b50805460018160011615610100020316600290046000825580601f10611ab057506107aa565b601f0160209004906000526020600020908101906107aa91905b80821115611ade5760008155600101611aca565b509056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64734552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564a26469706673582212207152c3d446e766d317146419dfb1971f31f4c6989c39b90e7fc8cc41f066dc6564736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x121 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x42966C68 GT PUSH2 0xAD JUMPI DUP1 PUSH4 0x95D89B41 GT PUSH2 0x71 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x3A8 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x3B0 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x3DE JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0x4A4 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x4C1 JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x42966C68 EQ PUSH2 0x323 JUMPI DUP1 PUSH4 0x4F6CCCE7 EQ PUSH2 0x340 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x35D JUMPI DUP1 PUSH4 0x6C0360EB EQ PUSH2 0x37A JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x382 JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x18160DDD GT PUSH2 0xF4 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x245 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x25F JUMPI DUP1 PUSH4 0x2F745C59 EQ PUSH2 0x295 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x2C1 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x2ED JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x126 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x161 JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x1DE JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x217 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x14D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x13C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH2 0x4EF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x169 PUSH2 0x512 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1A3 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x18B JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1D0 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1FB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x5A8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x22D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x60A JUMP JUMPDEST STOP JUMPDEST PUSH2 0x24D PUSH2 0x6E5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x275 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x6F6 JUMP JUMPDEST PUSH2 0x24D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x2AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x74D JUMP JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x2D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x778 JUMP JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x303 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x786 JUMP JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x339 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x7A1 JUMP JUMPDEST PUSH2 0x24D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x356 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x7AD JUMP JUMPDEST PUSH2 0x1FB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x373 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x7C3 JUMP JUMPDEST PUSH2 0x169 PUSH2 0x7EB JUMP JUMPDEST PUSH2 0x24D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x398 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x84C JUMP JUMPDEST PUSH2 0x169 PUSH2 0x8B4 JUMP JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD ISZERO ISZERO PUSH2 0x915 JUMP JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x3F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x42F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x441 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x463 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0xA1A SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x169 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xA78 JUMP JUMPDEST PUSH2 0x14D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x4D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xCFB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x59E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x573 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x59E JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x581 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5B3 DUP3 PUSH2 0xD2F JUMP JUMPDEST PUSH2 0x5EE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1C34 PUSH1 0x2C SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x68 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x615 DUP3 PUSH2 0x7C3 JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x668 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1CB8 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x67A PUSH2 0xD3C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0x69B JUMPI POP PUSH2 0x69B DUP2 PUSH2 0x696 PUSH2 0xD3C JUMP JUMPDEST PUSH2 0xCFB JUMP JUMPDEST PUSH2 0x6D6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x38 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1B87 PUSH1 0x38 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x6E0 DUP4 DUP4 PUSH2 0xD40 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6F1 PUSH1 0x66 PUSH2 0xDAE JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x707 PUSH2 0x701 PUSH2 0xD3C JUMP JUMPDEST DUP3 PUSH2 0xDB9 JUMP JUMPDEST PUSH2 0x742 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x31 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1CD9 PUSH1 0x31 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x6E0 DUP4 DUP4 DUP4 PUSH2 0xE5D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x76F SWAP1 DUP4 PUSH2 0xFA9 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x782 DUP3 DUP3 PUSH2 0xFB5 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x6E0 DUP4 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP PUSH2 0xA1A JUMP JUMPDEST PUSH2 0x7AA DUP2 PUSH2 0x10E3 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x7BB PUSH1 0x66 DUP5 PUSH2 0x11B0 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x772 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1BE9 PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x66 SWAP2 SWAP1 PUSH2 0x11CC JUMP JUMPDEST PUSH1 0x6D DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x59E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x573 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x59E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x893 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1BBF PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x772 SWAP1 PUSH2 0xDAE JUMP JUMPDEST PUSH1 0x6B DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x59E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x573 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x59E JUMP JUMPDEST PUSH2 0x91D PUSH2 0xD3C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x983 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4552433732313A20617070726F766520746F2063616C6C657200000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x69 PUSH1 0x0 PUSH2 0x990 PUSH2 0xD3C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP8 AND DUP1 DUP3 MSTORE SWAP2 SWAP1 SWAP4 MSTORE SWAP2 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP3 ISZERO ISZERO SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE PUSH2 0x9D4 PUSH2 0xD3C JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH2 0xA2B PUSH2 0xA25 PUSH2 0xD3C JUMP JUMPDEST DUP4 PUSH2 0xDB9 JUMP JUMPDEST PUSH2 0xA66 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x31 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1CD9 PUSH1 0x31 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xA72 DUP5 DUP5 DUP5 DUP5 PUSH2 0x11E3 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0xA83 DUP3 PUSH2 0xD2F JUMP JUMPDEST PUSH2 0xABE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2F DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1C89 PUSH1 0x2F SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x6C PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD DUP4 MLOAD PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP7 AND ISZERO MUL ADD SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 DIV SWAP2 DUP3 ADD DUP5 SWAP1 DIV DUP5 MUL DUP2 ADD DUP5 ADD SWAP1 SWAP5 MSTORE DUP1 DUP5 MSTORE PUSH1 0x60 SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xB53 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xB28 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xB53 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xB36 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH1 0x60 PUSH2 0xB64 PUSH2 0x7EB JUMP JUMPDEST SWAP1 POP DUP1 MLOAD PUSH1 0x0 EQ ISZERO PUSH2 0xB78 JUMPI POP SWAP1 POP PUSH2 0x50D JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0xC39 JUMPI DUP1 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xBB3 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xB94 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE DUP6 MLOAD SWAP2 SWAP1 SWAP4 ADD SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xBFB JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xBDC JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP3 POP POP POP PUSH2 0x50D JUMP JUMPDEST DUP1 PUSH2 0xC43 DUP6 PUSH2 0x1235 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xC75 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xC56 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE DUP6 MLOAD SWAP2 SWAP1 SWAP4 ADD SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xCBD JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xC9E JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP3 POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x772 PUSH1 0x66 DUP4 PUSH2 0x1310 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x68 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 SWAP1 PUSH2 0xD75 DUP3 PUSH2 0x7C3 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x772 DUP3 PUSH2 0x131C JUMP JUMPDEST PUSH1 0x0 PUSH2 0xDC4 DUP3 PUSH2 0xD2F JUMP JUMPDEST PUSH2 0xDFF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1B5B PUSH1 0x2C SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xE0A DUP4 PUSH2 0x7C3 JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0xE45 JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE3A DUP5 PUSH2 0x5A8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0xE55 JUMPI POP PUSH2 0xE55 DUP2 DUP6 PUSH2 0xCFB JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE70 DUP3 PUSH2 0x7C3 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xEB5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1C60 PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xEFA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1B37 PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xF05 DUP4 DUP4 DUP4 PUSH2 0x6E0 JUMP JUMPDEST PUSH2 0xF10 PUSH1 0x0 DUP3 PUSH2 0xD40 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0xF32 SWAP1 DUP3 PUSH2 0x1320 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0xF55 SWAP1 DUP3 PUSH2 0x132C JUMP JUMPDEST POP PUSH2 0xF62 PUSH1 0x66 DUP3 DUP5 PUSH2 0x1338 JUMP JUMPDEST POP DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x76F DUP4 DUP4 PUSH2 0x134E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x1010 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4552433732313A206D696E7420746F20746865207A65726F2061646472657373 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1019 DUP2 PUSH2 0xD2F JUMP JUMPDEST ISZERO PUSH2 0x106B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4552433732313A20746F6B656E20616C7265616479206D696E74656400000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1077 PUSH1 0x0 DUP4 DUP4 PUSH2 0x6E0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x1099 SWAP1 DUP3 PUSH2 0x132C JUMP JUMPDEST POP PUSH2 0x10A6 PUSH1 0x66 DUP3 DUP5 PUSH2 0x1338 JUMP JUMPDEST POP PUSH1 0x40 MLOAD DUP2 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH1 0x0 SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP1 DUP3 SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10EE DUP3 PUSH2 0x7C3 JUMP JUMPDEST SWAP1 POP PUSH2 0x10FC DUP2 PUSH1 0x0 DUP5 PUSH2 0x6E0 JUMP JUMPDEST PUSH2 0x1107 PUSH1 0x0 DUP4 PUSH2 0xD40 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x6C PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV ISZERO PUSH2 0x1145 JUMPI PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x6C PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x1145 SWAP2 PUSH2 0x1A8A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x1167 SWAP1 DUP4 PUSH2 0x1320 JUMP JUMPDEST POP PUSH2 0x1173 PUSH1 0x66 DUP4 PUSH2 0x13B2 JUMP JUMPDEST POP PUSH1 0x40 MLOAD DUP3 SWAP1 PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP1 DUP4 SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH2 0x11BF DUP7 DUP7 PUSH2 0x13BE JUMP JUMPDEST SWAP1 SWAP8 SWAP1 SWAP7 POP SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11D9 DUP5 DUP5 DUP5 PUSH2 0x1439 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x11EE DUP5 DUP5 DUP5 PUSH2 0xE5D JUMP JUMPDEST PUSH2 0x11FA DUP5 DUP5 DUP5 DUP5 PUSH2 0x1503 JUMP JUMPDEST PUSH2 0xA72 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x32 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1B05 PUSH1 0x32 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x60 DUP2 PUSH2 0x125A JUMPI POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1 DUP2 MSTORE PUSH1 0x3 PUSH1 0xFC SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x50D JUMP JUMPDEST DUP2 PUSH1 0x0 JUMPDEST DUP2 ISZERO PUSH2 0x1272 JUMPI PUSH1 0x1 ADD PUSH1 0xA DUP3 DIV SWAP2 POP PUSH2 0x125E JUMP JUMPDEST PUSH1 0x60 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x128B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x12B6 JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP6 SWAP4 POP SWAP1 POP PUSH1 0x0 NOT DUP3 ADD JUMPDEST DUP4 ISZERO PUSH2 0x1307 JUMPI PUSH1 0xA DUP5 MOD PUSH1 0x30 ADD PUSH1 0xF8 SHL DUP3 DUP3 DUP1 PUSH1 0x1 SWAP1 SUB SWAP4 POP DUP2 MLOAD DUP2 LT PUSH2 0x12E5 JUMPI INVALID JUMPDEST PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xF8 SHL SUB NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0xA DUP5 DIV SWAP4 POP PUSH2 0x12C2 JUMP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x76F DUP4 DUP4 PUSH2 0x166B JUMP JUMPDEST SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x76F DUP4 DUP4 PUSH2 0x1683 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x76F DUP4 DUP4 PUSH2 0x1749 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11D9 DUP5 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x1793 JUMP JUMPDEST DUP2 SLOAD PUSH1 0x0 SWAP1 DUP3 LT PUSH2 0x1390 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1AE3 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 PUSH1 0x0 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x139F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x76F DUP4 DUP4 PUSH2 0x182A JUMP JUMPDEST DUP2 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP4 LT PUSH2 0x1402 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1C12 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP5 PUSH1 0x0 ADD DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x1413 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD SWAP1 POP DUP1 PUSH1 0x0 ADD SLOAD DUP2 PUSH1 0x1 ADD SLOAD SWAP3 POP SWAP3 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP3 DUP2 PUSH2 0x14D4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1499 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1481 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x14C6 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP5 PUSH1 0x0 ADD PUSH1 0x1 DUP3 SUB DUP2 SLOAD DUP2 LT PUSH2 0x14E7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD PUSH1 0x1 ADD SLOAD SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1517 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xD29 JUMP JUMPDEST PUSH2 0x1523 JUMPI POP PUSH1 0x1 PUSH2 0xE55 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1631 PUSH4 0xA85BD01 PUSH1 0xE1 SHL PUSH2 0x1538 PUSH2 0xD3C JUMP JUMPDEST DUP9 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x24 ADD DUP1 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x159F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1587 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x15CC JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x32 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1B05 PUSH1 0x32 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND SWAP2 SWAP1 PUSH2 0x18FE JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x164A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH4 0xA85BD01 PUSH1 0xE1 SHL EQ SWAP3 POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 DUP4 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP1 ISZERO PUSH2 0x173F JUMPI DUP4 SLOAD PUSH1 0x0 NOT DUP1 DUP4 ADD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x0 SWAP1 DUP8 SWAP1 DUP4 SWAP1 DUP2 LT PUSH2 0x16B6 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP DUP1 DUP8 PUSH1 0x0 ADD DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x16D3 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SWAP3 SWAP1 SWAP3 SSTORE DUP3 DUP2 MSTORE PUSH1 0x1 DUP10 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP5 ADD SWAP1 SSTORE DUP7 SLOAD DUP8 SWAP1 DUP1 PUSH2 0x1703 JUMPI INVALID JUMPDEST PUSH1 0x1 SWAP1 SUB DUP2 DUP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SSTORE SWAP1 SSTORE DUP7 PUSH1 0x1 ADD PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SSTORE PUSH1 0x1 SWAP5 POP POP POP POP POP PUSH2 0x772 JUMP JUMPDEST PUSH1 0x0 SWAP2 POP POP PUSH2 0x772 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1755 DUP4 DUP4 PUSH2 0x166B JUMP JUMPDEST PUSH2 0x178B JUMPI POP DUP2 SLOAD PUSH1 0x1 DUP2 DUP2 ADD DUP5 SSTORE PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 KECCAK256 SWAP1 SWAP4 ADD DUP5 SWAP1 SSTORE DUP5 SLOAD DUP5 DUP3 MSTORE DUP3 DUP7 ADD SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE PUSH2 0x772 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x772 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP1 PUSH2 0x17F8 JUMPI POP POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE DUP4 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP5 DUP2 MSTORE DUP7 SLOAD PUSH1 0x1 DUP2 DUP2 ADD DUP10 SSTORE PUSH1 0x0 DUP10 DUP2 MSTORE DUP5 DUP2 KECCAK256 SWAP6 MLOAD PUSH1 0x2 SWAP1 SWAP4 MUL SWAP1 SWAP6 ADD SWAP2 DUP3 SSTORE SWAP2 MLOAD SWAP1 DUP3 ADD SSTORE DUP7 SLOAD DUP7 DUP5 MSTORE DUP2 DUP9 ADD SWAP1 SWAP3 MSTORE SWAP3 SWAP1 SWAP2 KECCAK256 SSTORE PUSH2 0x11DC JUMP JUMPDEST DUP3 DUP6 PUSH1 0x0 ADD PUSH1 0x1 DUP4 SUB DUP2 SLOAD DUP2 LT PUSH2 0x180B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD PUSH1 0x1 ADD DUP2 SWAP1 SSTORE POP PUSH1 0x0 SWAP2 POP POP PUSH2 0x11DC JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 DUP4 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP1 ISZERO PUSH2 0x173F JUMPI DUP4 SLOAD PUSH1 0x0 NOT DUP1 DUP4 ADD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x0 SWAP1 DUP8 SWAP1 DUP4 SWAP1 DUP2 LT PUSH2 0x185D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD SWAP1 POP DUP1 DUP8 PUSH1 0x0 ADD DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x187D JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 DUP5 SLOAD PUSH1 0x2 SWAP1 SWAP4 MUL ADD SWAP2 DUP3 SSTORE PUSH1 0x1 SWAP4 DUP5 ADD SLOAD SWAP2 DUP5 ADD SWAP2 SWAP1 SWAP2 SSTORE DUP4 SLOAD DUP3 MSTORE DUP10 DUP4 ADD SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP5 ADD SWAP1 SSTORE DUP7 SLOAD DUP8 SWAP1 DUP1 PUSH2 0x18BC JUMPI INVALID JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 KECCAK256 PUSH1 0x2 PUSH1 0x0 NOT SWAP1 SWAP5 ADD SWAP4 DUP5 MUL ADD DUP3 DUP2 SSTORE PUSH1 0x1 SWAP1 DUP2 ADD DUP4 SWAP1 SSTORE SWAP3 SWAP1 SWAP4 SSTORE DUP9 DUP2 MSTORE DUP10 DUP3 ADD SWAP1 SWAP3 MSTORE PUSH1 0x40 DUP3 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE SWAP5 POP PUSH2 0x772 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x11D9 DUP5 DUP5 PUSH1 0x0 DUP6 DUP6 PUSH2 0x1912 DUP6 PUSH2 0xD29 JUMP JUMPDEST PUSH2 0x1963 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x19A2 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1983 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1A04 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1A09 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x1A19 DUP3 DUP3 DUP7 PUSH2 0x1A24 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1A33 JUMPI POP DUP2 PUSH2 0x11DC JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x1A43 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x1499 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1481 JUMP JUMPDEST POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV PUSH1 0x0 DUP3 SSTORE DUP1 PUSH1 0x1F LT PUSH2 0x1AB0 JUMPI POP PUSH2 0x7AA JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0x7AA SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1ADE JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1ACA JUMP JUMPDEST POP SWAP1 JUMP INVALID GASLIMIT PUSH15 0x756D657261626C655365743A20696E PUSH5 0x6578206F75 PUSH21 0x206F6620626F756E64734552433732313A20747261 PUSH15 0x7366657220746F206E6F6E20455243 CALLDATACOPY ORIGIN BALANCE MSTORE PUSH6 0x636569766572 KECCAK256 PUSH10 0x6D706C656D656E746572 GASLIMIT MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH21 0x72616E7366657220746F20746865207A65726F2061 PUSH5 0x6472657373 GASLIMIT MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH16 0x70657261746F7220717565727920666F PUSH19 0x206E6F6E6578697374656E7420746F6B656E45 MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F76652063616C6C6572206973206E6F74206F PUSH24 0x6E6572206E6F7220617070726F76656420666F7220616C6C GASLIMIT MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH3 0x616C61 PUSH15 0x636520717565727920666F72207468 PUSH6 0x207A65726F20 PUSH2 0x6464 PUSH19 0x6573734552433732313A206F776E6572207175 PUSH6 0x727920666F72 KECCAK256 PUSH15 0x6F6E6578697374656E7420746F6B65 PUSH15 0x456E756D657261626C654D61703A20 PUSH10 0x6E646578206F7574206F PUSH7 0x20626F756E6473 GASLIMIT MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F76656420717565727920666F72206E6F6E65 PUSH25 0x697374656E7420746F6B656E4552433732313A207472616E73 PUSH7 0x6572206F662074 PUSH16 0x6B656E2074686174206973206E6F7420 PUSH16 0x776E4552433732314D65746164617461 GASPRICE KECCAK256 SSTORE MSTORE 0x49 KECCAK256 PUSH18 0x7565727920666F72206E6F6E657869737465 PUSH15 0x7420746F6B656E4552433732313A20 PUSH2 0x7070 PUSH19 0x6F76616C20746F2063757272656E74206F776E PUSH6 0x724552433732 BALANCE GASPRICE KECCAK256 PUSH21 0x72616E736665722063616C6C6572206973206E6F74 KECCAK256 PUSH16 0x776E6572206E6F7220617070726F7665 PUSH5 0xA264697066 PUSH20 0x582212207152C3D446E766D317146419DFB1971F BALANCE DELEGATECALL 0xC6 SWAP9 SWAP13 CODECOPY 0xB9 0xE PUSH32 0xC8CC41F066DC6564736F6C634300060C00330000000000000000000000000000 ",
              "sourceMap": "165:386:67:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1176:148:6;;;;;;;;;;;;;;;;-1:-1:-1;1176:148:6;-1:-1:-1;;;;;;1176:148:6;;:::i;:::-;;;;;;;;;;;;;;;;;;5113:98:13;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7840:217;;;;;;;;;;;;;;;;-1:-1:-1;7840:217:13;;:::i;:::-;;;;-1:-1:-1;;;;;7840:217:13;;;;;;;;;;;;;;7362:417;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7362:417:13;;;;;;;;:::i;:::-;;6856:208;;;:::i;:::-;;;;;;;;;;;;;;;;8704:300;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8704:300:13;;;;;;;;;;;;;;;;;:::i;6625:160::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;6625:160:13;;;;;;;;:::i;341:85:67:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;341:85:67;;;;;;;;:::i;9070:149:13:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;9070:149:13;;;;;;;;;;;;;;;;;:::i;480:69:67:-;;;;;;;;;;;;;;;;-1:-1:-1;480:69:67;;:::i;7136:169:13:-;;;;;;;;;;;;;;;;-1:-1:-1;7136:169:13;;:::i;4876:175::-;;;;;;;;;;;;;;;;-1:-1:-1;4876:175:13;;:::i;6451:95::-;;;:::i;4601:218::-;;;;;;;;;;;;;;;;-1:-1:-1;4601:218:13;-1:-1:-1;;;;;4601:218:13;;:::i;5275:102::-;;;:::i;8124:290::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8124:290:13;;;;;;;;;;:::i;9285:282::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9285:282:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9285:282:13;;-1:-1:-1;9285:282:13;;-1:-1:-1;;;;;9285:282:13:i;5443:776::-;;;;;;;;;;;;;;;;-1:-1:-1;5443:776:13;;:::i;8480:162::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8480:162:13;;;;;;;;;;:::i;1176:148:6:-;-1:-1:-1;;;;;;1284:33:6;;1261:4;1284:33;;;:20;:33;;;;;;;;1176:148;;;;:::o;5113:98:13:-;5199:5;5192:12;;;;;;;;-1:-1:-1;;5192:12:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5167:13;;5192:12;;5199:5;;5192:12;;5199:5;5192:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5113:98;:::o;7840:217::-;7916:7;7943:16;7951:7;7943;:16::i;:::-;7935:73;;;;-1:-1:-1;;;7935:73:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8026:24:13;;;;:15;:24;;;;;;-1:-1:-1;;;;;8026:24:13;;7840:217::o;7362:417::-;7442:13;7458:34;7484:7;7458:25;:34::i;:::-;7442:50;;7516:5;-1:-1:-1;;;;;7510:11:13;:2;-1:-1:-1;;;;;7510:11:13;;;7502:57;;;;-1:-1:-1;;;7502:57:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7594:5;-1:-1:-1;;;;;7578:21:13;:12;:10;:12::i;:::-;-1:-1:-1;;;;;7578:21:13;;:80;;;;7603:55;7638:5;7645:12;:10;:12::i;:::-;7603:34;:55::i;:::-;7570:170;;;;-1:-1:-1;;;7570:170:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7751:21;7760:2;7764:7;7751:8;:21::i;:::-;7362:417;;;:::o;6856:208::-;6917:7;7036:21;:12;:19;:21::i;:::-;7029:28;;6856:208;:::o;8704:300::-;8863:41;8882:12;:10;:12::i;:::-;8896:7;8863:18;:41::i;:::-;8855:103;;;;-1:-1:-1;;;8855:103:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8969:28;8979:4;8985:2;8989:7;8969:9;:28::i;6625:160::-;-1:-1:-1;;;;;6748:20:13;;6722:7;6748:20;;;:13;:20;;;;;:30;;6772:5;6748:23;:30::i;:::-;6741:37;;6625:160;;;;;:::o;341:85:67:-;401:18;407:2;411:7;401:5;:18::i;:::-;341:85;;:::o;9070:149:13:-;9173:39;9190:4;9196:2;9200:7;9173:39;;;;;;;;;;;;:16;:39::i;480:69:67:-;528:14;534:7;528:5;:14::i;:::-;480:69;:::o;7136:169:13:-;7211:7;;7252:22;:12;7268:5;7252:15;:22::i;:::-;-1:-1:-1;7230:44:13;7136:169;-1:-1:-1;;;7136:169:13:o;4876:175::-;4948:7;4974:70;4991:7;4974:70;;;;;;;;;;;;;;;;;:12;;:70;:16;:70::i;6451:95::-;6531:8;6524:15;;;;;;;;-1:-1:-1;;6524:15:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6499:13;;6524:15;;6531:8;;6524:15;;6531:8;6524:15;;;;;;;;;;;;;;;;;;;;;;;;4601:218;4673:7;-1:-1:-1;;;;;4700:19:13;;4692:74;;;;-1:-1:-1;;;4692:74:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4783:20:13;;;;;;:13;:20;;;;;:29;;:27;:29::i;5275:102::-;5363:7;5356:14;;;;;;;;-1:-1:-1;;5356:14:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5331:13;;5356:14;;5363:7;;5356:14;;5363:7;5356:14;;;;;;;;;;;;;;;;;;;;;;;;8124:290;8238:12;:10;:12::i;:::-;-1:-1:-1;;;;;8226:24:13;:8;-1:-1:-1;;;;;8226:24:13;;;8218:62;;;;;-1:-1:-1;;;8218:62:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;8336:8;8291:18;:32;8310:12;:10;:12::i;:::-;-1:-1:-1;;;;;8291:32:13;;;;;;;;;;;;;;;;;-1:-1:-1;8291:32:13;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;8291:53:13;;;;;;;;;;;8374:12;:10;:12::i;:::-;-1:-1:-1;;;;;8359:48:13;;8398:8;8359:48;;;;;;;;;;;;;;;;;;;;8124:290;;:::o;9285:282::-;9416:41;9435:12;:10;:12::i;:::-;9449:7;9416:18;:41::i;:::-;9408:103;;;;-1:-1:-1;;;9408:103:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9521:39;9535:4;9541:2;9545:7;9554:5;9521:13;:39::i;:::-;9285:282;;;;:::o;5443:776::-;5516:13;5549:16;5557:7;5549;:16::i;:::-;5541:76;;;;-1:-1:-1;;;5541:76:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5654:19;;;;:10;:19;;;;;;;;;5628:45;;;;;;-1:-1:-1;;5628:45:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;;:45;;;5654:19;5628:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5683:18;5704:9;:7;:9::i;:::-;5683:30;;5792:4;5786:18;5808:1;5786:23;5782:70;;;-1:-1:-1;5832:9:13;-1:-1:-1;5825:16:13;;5782:70;5954:23;;:27;5950:106;;6028:4;6034:9;6011:33;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6011:33:13;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6011:33:13;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6011:33:13;;;;;;;;;;;;;-1:-1:-1;;6011:33:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5997:48;;;;;;5950:106;6186:4;6192:18;:7;:16;:18::i;:::-;6169:42;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6169:42:13;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6169:42:13;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6169:42:13;;;;;;;;;;;;;-1:-1:-1;;6169:42:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6155:57;;;;5443:776;;;:::o;8480:162::-;-1:-1:-1;;;;;8600:25:13;;;8577:4;8600:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;8480:162::o;737:413:18:-;1097:20;1135:8;;;737:413::o;11001:125:13:-;11066:4;11089:30;:12;11111:7;11089:21;:30::i;828:104:19:-;915:10;828:104;:::o;16792:191:13:-;16857:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;16857:29:13;-1:-1:-1;;;;;16857:29:13;;;;;;;;:24;;16910:34;16857:24;16910:25;:34::i;:::-;-1:-1:-1;;;;;16901:57:13;;;;;;;;;;;16792:191;;:::o;7831:121:21:-;7900:7;7926:19;7934:3;7926:7;:19::i;11284:373:13:-;11377:4;11401:16;11409:7;11401;:16::i;:::-;11393:73;;;;-1:-1:-1;;;11393:73:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11476:13;11492:34;11518:7;11492:25;:34::i;:::-;11476:50;;11555:5;-1:-1:-1;;;;;11544:16:13;:7;-1:-1:-1;;;;;11544:16:13;;:51;;;;11588:7;-1:-1:-1;;;;;11564:31:13;:20;11576:7;11564:11;:20::i;:::-;-1:-1:-1;;;;;11564:31:13;;11544:51;:105;;;;11599:50;11634:5;11641:7;11599:34;:50::i;:::-;11536:114;11284:373;-1:-1:-1;;;;11284:373:13:o;14358:595::-;14493:4;-1:-1:-1;;;;;14455:42:13;:34;14481:7;14455:25;:34::i;:::-;-1:-1:-1;;;;;14455:42:13;;14447:96;;;;-1:-1:-1;;;14447:96:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14579:16:13;;14571:65;;;;-1:-1:-1;;;14571:65:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14647:39;14668:4;14674:2;14678:7;14647:20;:39::i;:::-;14748:29;14765:1;14769:7;14748:8;:29::i;:::-;-1:-1:-1;;;;;14788:19:13;;;;;;:13;:19;;;;;:35;;14815:7;14788:26;:35::i;:::-;-1:-1:-1;;;;;;14833:17:13;;;;;;:13;:17;;;;;:30;;14855:7;14833:21;:30::i;:::-;-1:-1:-1;14874:29:13;:12;14891:7;14900:2;14874:16;:29::i;:::-;;14938:7;14934:2;-1:-1:-1;;;;;14919:27:13;14928:4;-1:-1:-1;;;;;14919:27:13;;;;;;;;;;;14358:595;;;:::o;9261:135:22:-;9332:7;9366:22;9370:3;9382:5;9366:3;:22::i;12886:393:13:-;-1:-1:-1;;;;;12965:16:13;;12957:61;;;;;-1:-1:-1;;;12957:61:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13037:16;13045:7;13037;:16::i;:::-;13036:17;13028:58;;;;;-1:-1:-1;;;13028:58:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;13097:45;13126:1;13130:2;13134:7;13097:20;:45::i;:::-;-1:-1:-1;;;;;13153:17:13;;;;;;:13;:17;;;;;:30;;13175:7;13153:21;:30::i;:::-;-1:-1:-1;13194:29:13;:12;13211:7;13220:2;13194:16;:29::i;:::-;-1:-1:-1;13239:33:13;;13264:7;;-1:-1:-1;;;;;13239:33:13;;;13256:1;;13239:33;;13256:1;;13239:33;12886:393;;:::o;13496:538::-;13555:13;13571:34;13597:7;13571:25;:34::i;:::-;13555:50;;13634:48;13655:5;13670:1;13674:7;13634:20;:48::i;:::-;13720:29;13737:1;13741:7;13720:8;:29::i;:::-;13805:19;;;;:10;:19;;;;;13799:33;;-1:-1:-1;;13799:33:13;;;;;;;;;;;:38;13795:95;;13860:19;;;;:10;:19;;;;;13853:26;;;:::i;:::-;-1:-1:-1;;;;;13900:20:13;;;;;;:13;:20;;;;;:36;;13928:7;13900:27;:36::i;:::-;-1:-1:-1;13947:28:13;:12;13967:7;13947:19;:28::i;:::-;-1:-1:-1;13991:36:13;;14019:7;;14015:1;;-1:-1:-1;;;;;13991:36:13;;;;;14015:1;;13991:36;13496:538;;:::o;8280:233:21:-;8360:7;;;;8419:22;8423:3;8435:5;8419:3;:22::i;:::-;8388:53;;;;-1:-1:-1;8280:233:21;-1:-1:-1;;;;;8280:233:21:o;9533:211::-;9640:7;9690:44;9695:3;9715;9721:12;9690:4;:44::i;:::-;9682:53;-1:-1:-1;9533:211:21;;;;;;:::o;10429:269:13:-;10542:28;10552:4;10558:2;10562:7;10542:9;:28::i;:::-;10588:48;10611:4;10617:2;10621:7;10630:5;10588:22;:48::i;:::-;10580:111;;;;-1:-1:-1;;;10580:111:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;221:725:25;277:13;494:10;490:51;;-1:-1:-1;520:10:25;;;;;;;;;;;;-1:-1:-1;;;520:10:25;;;;;;490:51;565:5;550:12;604:75;611:9;;604:75;;636:8;;666:2;658:10;;;;604:75;;;688:19;720:6;710:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;710:17:25;-1:-1:-1;780:5:25;;-1:-1:-1;688:39:25;-1:-1:-1;;;753:10:25;;795:114;802:9;;795:114;;870:2;863:4;:9;858:2;:14;845:29;;827:6;834:7;;;;;;;827:15;;;;;;;;;;;:47;-1:-1:-1;;;;;827:47:25;;;;;;;;-1:-1:-1;896:2:25;888:10;;;;795:114;;;-1:-1:-1;932:6:25;221:725;-1:-1:-1;;;;221:725:25:o;7599:149:21:-;7683:4;7706:35;7716:3;7736;7706:9;:35::i;4502:108::-;4584:19;;4502:108::o;8376:135:22:-;8446:4;8469:35;8477:3;8497:5;8469:7;:35::i;8079:129::-;8146:4;8169:32;8174:3;8194:5;8169:4;:32::i;7038:183:21:-;7127:4;7150:64;7155:3;7175;-1:-1:-1;;;;;7189:23:21;;7150:4;:64::i;4463:201:22:-;4557:18;;4530:7;;4557:26;-1:-1:-1;4549:73:22;;;;-1:-1:-1;;;4549:73:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4639:3;:11;;4651:5;4639:18;;;;;;;;;;;;;;;;4632:25;;4463:201;;;;:::o;7380:140:21:-;7457:4;7480:33;7488:3;7508;7480:7;:33::i;4953:274::-;5056:19;;5020:7;;;;5056:27;-1:-1:-1;5048:74:21;;;;-1:-1:-1;;;5048:74:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5133:22;5158:3;:12;;5171:5;5158:19;;;;;;;;;;;;;;;;;;5133:44;;5195:5;:10;;;5207:5;:12;;;5187:33;;;;;4953:274;;;;;:::o;6414:315::-;6508:7;6546:17;;;:12;;;:17;;;;;;6596:12;6581:13;6573:36;;;;-1:-1:-1;;;6573:36:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6662:3;:12;;6686:1;6675:8;:12;6662:26;;;;;;;;;;;;;;;;;;:33;;;6655:40;;;6414:315;;;;;:::o;16186:600:13:-;16306:4;16331:15;:2;-1:-1:-1;;;;;16331:13:13;;:15::i;:::-;16326:58;;-1:-1:-1;16369:4:13;16362:11;;16326:58;16393:23;16419:257;-1:-1:-1;;;16541:12:13;:10;:12::i;:::-;16567:4;16585:7;16606:5;16435:186;;;;;;-1:-1:-1;;;;;16435:186:13;;;;;;-1:-1:-1;;;;;16435:186:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16435:186:13;;;;;;;-1:-1:-1;;;;;16435:186:13;;;;;;;;;;;16419:257;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16419:15:13;;;:257;:15;:257::i;:::-;16393:283;;16686:13;16713:10;16702:32;;;;;;;;;;;;;;;-1:-1:-1;16702:32:13;-1:-1:-1;;;;;;16752:26:13;-1:-1:-1;;;16752:26:13;;-1:-1:-1;;;16186:600:13;;;;;;:::o;4289:123:21:-;4360:4;4383:17;;;:12;;;;;:17;;;;;;:22;;;4289:123::o;2223:1512:22:-;2289:4;2426:19;;;:12;;;:19;;;;;;2460:15;;2456:1273;;2889:18;;-1:-1:-1;;2841:14:22;;;;2889:22;;;;2817:21;;2889:3;;:22;;3171;;;;;;;;;;;;;;3151:42;;3314:9;3285:3;:11;;3297:13;3285:26;;;;;;;;;;;;;;;;;;;:38;;;;3389:23;;;3431:1;3389:12;;;:23;;;;;;3415:17;;;3389:43;;3538:17;;3389:3;;3538:17;;;;;;;;;;;;;;;;;;;;;;3630:3;:12;;:19;3643:5;3630:19;;;;;;;;;;;3623:26;;;3671:4;3664:11;;;;;;;;2456:1273;3713:5;3706:12;;;;;1651:404;1714:4;1735:21;1745:3;1750:5;1735:9;:21::i;:::-;1730:319;;-1:-1:-1;1772:23:22;;;;;;;;:11;:23;;;;;;;;;;;;;1952:18;;1930:19;;;:12;;;:19;;;;;;:40;;;;1984:11;;1730:319;-1:-1:-1;2033:5:22;2026:12;;1847:678:21;1923:4;2056:17;;;:12;;;:17;;;;;;2088:13;2084:435;;-1:-1:-1;;2172:38:21;;;;;;;;;;;;;;;;;;2154:57;;;;;;;;:12;:57;;;;;;;;;;;;;;;;;;;;;;;;2366:19;;2346:17;;;:12;;;:17;;;;;;;:39;2399:11;;2084:435;2477:5;2441:3;:12;;2465:1;2454:8;:12;2441:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;2503:5;2496:12;;;;;2693:1517;2757:4;2890:17;;;:12;;;:17;;;;;;2922:13;;2918:1286;;3348:19;;-1:-1:-1;;3302:12:21;;;;3348:23;;;;3278:21;;3348:3;;:23;;3640;;;;;;;;;;;;;;;;3611:52;;3785:9;3755:3;:12;;3768:13;3755:27;;;;;;;;;;;;;;;;:39;;:27;;;;;:39;;;;;;;;;;;;;;;3873:14;;3860:28;;:12;;;:28;;;;;3891:17;;;3860:48;;4014:18;;3860:3;;4014:18;;;;;;;;;;;;;;-1:-1:-1;;4014:18:21;;;;;;;;;;;;;;;;;;;;;4107:17;;;:12;;;:17;;;;;;4100:24;;;;4014:18;-1:-1:-1;4139:11:21;;-1:-1:-1;;;;4139:11:21;3592:193:18;3695:12;3726:52;3748:6;3756:4;3762:1;3765:12;3695;4869:18;4880:6;4869:10;:18::i;:::-;4861:60;;;;;-1:-1:-1;;;4861:60:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;4992:12;5006:23;5033:6;-1:-1:-1;;;;;5033:11:18;5053:5;5061:4;5033:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5033:33:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4991:75;;;;5083:52;5101:7;5110:10;5122:12;5083:17;:52::i;:::-;5076:59;4619:523;-1:-1:-1;;;;;;;4619:523:18:o;6122:725::-;6237:12;6265:7;6261:580;;;-1:-1:-1;6295:10:18;6288:17;;6261:580;6406:17;;:21;6402:429;;6664:10;6658:17;6724:15;6711:10;6707:2;6703:19;6696:44;6613:145;6796:20;;-1:-1:-1;;;6796:20:18;;;;;;;;;;;;;;;;;6803:12;;6796:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "1497400",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "approve(address,uint256)": "infinite",
                "balanceOf(address)": "infinite",
                "baseURI()": "infinite",
                "burn(uint256)": "infinite",
                "getApproved(uint256)": "infinite",
                "isApprovedForAll(address,address)": "1372",
                "mint(address,uint256)": "infinite",
                "name()": "infinite",
                "ownerOf(uint256)": "infinite",
                "safeTransferFrom(address,address,uint256)": "infinite",
                "safeTransferFrom(address,address,uint256,bytes)": "infinite",
                "setApprovalForAll(address,bool)": "infinite",
                "supportsInterface(bytes4)": "1193",
                "symbol()": "infinite",
                "tokenByIndex(uint256)": "infinite",
                "tokenOfOwnerByIndex(address,uint256)": "infinite",
                "tokenURI(uint256)": "infinite",
                "totalSupply()": "1096",
                "transferFrom(address,address,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {
              "approve(address,uint256)": "095ea7b3",
              "balanceOf(address)": "70a08231",
              "baseURI()": "6c0360eb",
              "burn(uint256)": "42966c68",
              "getApproved(uint256)": "081812fc",
              "isApprovedForAll(address,address)": "e985e9c5",
              "mint(address,uint256)": "40c10f19",
              "name()": "06fdde03",
              "ownerOf(uint256)": "6352211e",
              "safeTransferFrom(address,address,uint256)": "42842e0e",
              "safeTransferFrom(address,address,uint256,bytes)": "b88d4fde",
              "setApprovalForAll(address,bool)": "a22cb465",
              "supportsInterface(bytes4)": "01ffc9a7",
              "symbol()": "95d89b41",
              "tokenByIndex(uint256)": "4f6ccce7",
              "tokenOfOwnerByIndex(address,uint256)": "2f745c59",
              "tokenURI(uint256)": "c87b56dd",
              "totalSupply()": "18160ddd",
              "transferFrom(address,address,uint256)": "23b872dd"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenOfOwnerByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Extension of {ERC721} for Minting/Burning\",\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"baseURI()\":{\"details\":\"Returns the base URI set via {_setBaseURI}. This will be automatically added as a prefix in {tokenURI} to each token's URI, or to the token ID if no specific URI is set for that token ID.\"},\"burn(uint256)\":{\"details\":\"See {ERC721-_burn}.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"mint(address,uint256)\":{\"details\":\"See {ERC721-_mint}.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}. Time complexity O(1), guaranteed to always use less than 30 000 gas.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenByIndex(uint256)\":{\"details\":\"See {IERC721Enumerable-tokenByIndex}.\"},\"tokenOfOwnerByIndex(address,uint256)\":{\"details\":\"See {IERC721Enumerable-tokenOfOwnerByIndex}.\"},\"tokenURI(uint256)\":{\"details\":\"See {IERC721Metadata-tokenURI}.\"},\"totalSupply()\":{\"details\":\"See {IERC721Enumerable-totalSupply}.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/ERC721Mintable.sol\":\"ERC721Mintable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/introspection/ERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC165Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts may inherit from this and call {_registerInterface} to declare\\n * their support of an interface.\\n */\\nabstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Mapping of interface ids to whether or not it's supported.\\n     */\\n    mapping(bytes4 => bool) private _supportedInterfaces;\\n\\n    function __ERC165_init() internal initializer {\\n        __ERC165_init_unchained();\\n    }\\n\\n    function __ERC165_init_unchained() internal initializer {\\n        // Derived contracts need only register support for their own interfaces,\\n        // we register support for ERC165 itself here\\n        _registerInterface(_INTERFACE_ID_ERC165);\\n    }\\n\\n    /**\\n     * @dev See {IERC165-supportsInterface}.\\n     *\\n     * Time complexity O(1), guaranteed to always use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n        return _supportedInterfaces[interfaceId];\\n    }\\n\\n    /**\\n     * @dev Registers the contract as an implementer of the interface defined by\\n     * `interfaceId`. Support of the actual ERC165 interface is automatic and\\n     * registering its interface id is not required.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * Requirements:\\n     *\\n     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).\\n     */\\n    function _registerInterface(bytes4 interfaceId) internal virtual {\\n        require(interfaceId != 0xffffffff, \\\"ERC165: invalid interface id\\\");\\n        _supportedInterfaces[interfaceId] = true;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xc6dbbc2f50a7c104377798a37b2acd1a41c1242544b0bb7a9a7c863f0520eb50\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC721Upgradeable.sol\\\";\\nimport \\\"./IERC721MetadataUpgradeable.sol\\\";\\nimport \\\"./IERC721EnumerableUpgradeable.sol\\\";\\nimport \\\"./IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"../../introspection/ERC165Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/EnumerableSetUpgradeable.sol\\\";\\nimport \\\"../../utils/EnumerableMapUpgradeable.sol\\\";\\nimport \\\"../../utils/StringsUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @title ERC721 Non-Fungible Token Standard basic implementation\\n * @dev see https://eips.ethereum.org/EIPS/eip-721\\n */\\ncontract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable, IERC721EnumerableUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n    using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet;\\n    using EnumerableMapUpgradeable for EnumerableMapUpgradeable.UintToAddressMap;\\n    using StringsUpgradeable for uint256;\\n\\n    // Equals to `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))`\\n    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`\\n    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;\\n\\n    // Mapping from holder address to their (enumerable) set of owned tokens\\n    mapping (address => EnumerableSetUpgradeable.UintSet) private _holderTokens;\\n\\n    // Enumerable mapping from token ids to their owners\\n    EnumerableMapUpgradeable.UintToAddressMap private _tokenOwners;\\n\\n    // Mapping from token ID to approved address\\n    mapping (uint256 => address) private _tokenApprovals;\\n\\n    // Mapping from owner to operator approvals\\n    mapping (address => mapping (address => bool)) private _operatorApprovals;\\n\\n    // Token name\\n    string private _name;\\n\\n    // Token symbol\\n    string private _symbol;\\n\\n    // Optional mapping for token URIs\\n    mapping (uint256 => string) private _tokenURIs;\\n\\n    // Base URI\\n    string private _baseURI;\\n\\n    /*\\n     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231\\n     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e\\n     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3\\n     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc\\n     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465\\n     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5\\n     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd\\n     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e\\n     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde\\n     *\\n     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^\\n     *        0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;\\n\\n    /*\\n     *     bytes4(keccak256('name()')) == 0x06fdde03\\n     *     bytes4(keccak256('symbol()')) == 0x95d89b41\\n     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd\\n     *\\n     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;\\n\\n    /*\\n     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd\\n     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59\\n     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7\\n     *\\n     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;\\n\\n    /**\\n     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\\n     */\\n    function __ERC721_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC165_init_unchained();\\n        __ERC721_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC721_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n\\n        // register the supported interfaces to conform to ERC721 via ERC165\\n        _registerInterface(_INTERFACE_ID_ERC721);\\n        _registerInterface(_INTERFACE_ID_ERC721_METADATA);\\n        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);\\n    }\\n\\n    /**\\n     * @dev See {IERC721-balanceOf}.\\n     */\\n    function balanceOf(address owner) public view virtual override returns (uint256) {\\n        require(owner != address(0), \\\"ERC721: balance query for the zero address\\\");\\n        return _holderTokens[owner].length();\\n    }\\n\\n    /**\\n     * @dev See {IERC721-ownerOf}.\\n     */\\n    function ownerOf(uint256 tokenId) public view virtual override returns (address) {\\n        return _tokenOwners.get(tokenId, \\\"ERC721: owner query for nonexistent token\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC721Metadata-name}.\\n     */\\n    function name() public view virtual override returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev See {IERC721Metadata-symbol}.\\n     */\\n    function symbol() public view virtual override returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev See {IERC721Metadata-tokenURI}.\\n     */\\n    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\\n        require(_exists(tokenId), \\\"ERC721Metadata: URI query for nonexistent token\\\");\\n\\n        string memory _tokenURI = _tokenURIs[tokenId];\\n        string memory base = baseURI();\\n\\n        // If there is no base URI, return the token URI.\\n        if (bytes(base).length == 0) {\\n            return _tokenURI;\\n        }\\n        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).\\n        if (bytes(_tokenURI).length > 0) {\\n            return string(abi.encodePacked(base, _tokenURI));\\n        }\\n        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.\\n        return string(abi.encodePacked(base, tokenId.toString()));\\n    }\\n\\n    /**\\n    * @dev Returns the base URI set via {_setBaseURI}. This will be\\n    * automatically added as a prefix in {tokenURI} to each token's URI, or\\n    * to the token ID if no specific URI is set for that token ID.\\n    */\\n    function baseURI() public view virtual returns (string memory) {\\n        return _baseURI;\\n    }\\n\\n    /**\\n     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.\\n     */\\n    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {\\n        return _holderTokens[owner].at(index);\\n    }\\n\\n    /**\\n     * @dev See {IERC721Enumerable-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds\\n        return _tokenOwners.length();\\n    }\\n\\n    /**\\n     * @dev See {IERC721Enumerable-tokenByIndex}.\\n     */\\n    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {\\n        (uint256 tokenId, ) = _tokenOwners.at(index);\\n        return tokenId;\\n    }\\n\\n    /**\\n     * @dev See {IERC721-approve}.\\n     */\\n    function approve(address to, uint256 tokenId) public virtual override {\\n        address owner = ERC721Upgradeable.ownerOf(tokenId);\\n        require(to != owner, \\\"ERC721: approval to current owner\\\");\\n\\n        require(_msgSender() == owner || ERC721Upgradeable.isApprovedForAll(owner, _msgSender()),\\n            \\\"ERC721: approve caller is not owner nor approved for all\\\"\\n        );\\n\\n        _approve(to, tokenId);\\n    }\\n\\n    /**\\n     * @dev See {IERC721-getApproved}.\\n     */\\n    function getApproved(uint256 tokenId) public view virtual override returns (address) {\\n        require(_exists(tokenId), \\\"ERC721: approved query for nonexistent token\\\");\\n\\n        return _tokenApprovals[tokenId];\\n    }\\n\\n    /**\\n     * @dev See {IERC721-setApprovalForAll}.\\n     */\\n    function setApprovalForAll(address operator, bool approved) public virtual override {\\n        require(operator != _msgSender(), \\\"ERC721: approve to caller\\\");\\n\\n        _operatorApprovals[_msgSender()][operator] = approved;\\n        emit ApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /**\\n     * @dev See {IERC721-isApprovedForAll}.\\n     */\\n    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\\n        return _operatorApprovals[owner][operator];\\n    }\\n\\n    /**\\n     * @dev See {IERC721-transferFrom}.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) public virtual override {\\n        //solhint-disable-next-line max-line-length\\n        require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: transfer caller is not owner nor approved\\\");\\n\\n        _transfer(from, to, tokenId);\\n    }\\n\\n    /**\\n     * @dev See {IERC721-safeTransferFrom}.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {\\n        safeTransferFrom(from, to, tokenId, \\\"\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC721-safeTransferFrom}.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {\\n        require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: transfer caller is not owner nor approved\\\");\\n        _safeTransfer(from, to, tokenId, _data);\\n    }\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * `_data` is additional data, it has no specified format and it is sent in call to `to`.\\n     *\\n     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\\n     * implement alternative mechanisms to perform token transfer, such as signature-based.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {\\n        _transfer(from, to, tokenId);\\n        require(_checkOnERC721Received(from, to, tokenId, _data), \\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n    }\\n\\n    /**\\n     * @dev Returns whether `tokenId` exists.\\n     *\\n     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\\n     *\\n     * Tokens start existing when they are minted (`_mint`),\\n     * and stop existing when they are burned (`_burn`).\\n     */\\n    function _exists(uint256 tokenId) internal view virtual returns (bool) {\\n        return _tokenOwners.contains(tokenId);\\n    }\\n\\n    /**\\n     * @dev Returns whether `spender` is allowed to manage `tokenId`.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\\n        require(_exists(tokenId), \\\"ERC721: operator query for nonexistent token\\\");\\n        address owner = ERC721Upgradeable.ownerOf(tokenId);\\n        return (spender == owner || getApproved(tokenId) == spender || ERC721Upgradeable.isApprovedForAll(owner, spender));\\n    }\\n\\n    /**\\n     * @dev Safely mints `tokenId` and transfers it to `to`.\\n     *\\n     * Requirements:\\n     d*\\n     * - `tokenId` must not exist.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function _safeMint(address to, uint256 tokenId) internal virtual {\\n        _safeMint(to, tokenId, \\\"\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\\n     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\\n     */\\n    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {\\n        _mint(to, tokenId);\\n        require(_checkOnERC721Received(address(0), to, tokenId, _data), \\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n    }\\n\\n    /**\\n     * @dev Mints `tokenId` and transfers it to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must not exist.\\n     * - `to` cannot be the zero address.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function _mint(address to, uint256 tokenId) internal virtual {\\n        require(to != address(0), \\\"ERC721: mint to the zero address\\\");\\n        require(!_exists(tokenId), \\\"ERC721: token already minted\\\");\\n\\n        _beforeTokenTransfer(address(0), to, tokenId);\\n\\n        _holderTokens[to].add(tokenId);\\n\\n        _tokenOwners.set(tokenId, to);\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /**\\n     * @dev Destroys `tokenId`.\\n     * The approval is cleared when the token is burned.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function _burn(uint256 tokenId) internal virtual {\\n        address owner = ERC721Upgradeable.ownerOf(tokenId); // internal owner\\n\\n        _beforeTokenTransfer(owner, address(0), tokenId);\\n\\n        // Clear approvals\\n        _approve(address(0), tokenId);\\n\\n        // Clear metadata (if any)\\n        if (bytes(_tokenURIs[tokenId]).length != 0) {\\n            delete _tokenURIs[tokenId];\\n        }\\n\\n        _holderTokens[owner].remove(tokenId);\\n\\n        _tokenOwners.remove(tokenId);\\n\\n        emit Transfer(owner, address(0), tokenId);\\n    }\\n\\n    /**\\n     * @dev Transfers `tokenId` from `from` to `to`.\\n     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function _transfer(address from, address to, uint256 tokenId) internal virtual {\\n        require(ERC721Upgradeable.ownerOf(tokenId) == from, \\\"ERC721: transfer of token that is not own\\\"); // internal owner\\n        require(to != address(0), \\\"ERC721: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(from, to, tokenId);\\n\\n        // Clear approvals from the previous owner\\n        _approve(address(0), tokenId);\\n\\n        _holderTokens[from].remove(tokenId);\\n        _holderTokens[to].add(tokenId);\\n\\n        _tokenOwners.set(tokenId, to);\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /**\\n     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {\\n        require(_exists(tokenId), \\\"ERC721Metadata: URI set of nonexistent token\\\");\\n        _tokenURIs[tokenId] = _tokenURI;\\n    }\\n\\n    /**\\n     * @dev Internal function to set the base URI for all token IDs. It is\\n     * automatically added as a prefix to the value returned in {tokenURI},\\n     * or to the token ID if {tokenURI} is empty.\\n     */\\n    function _setBaseURI(string memory baseURI_) internal virtual {\\n        _baseURI = baseURI_;\\n    }\\n\\n    /**\\n     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\\n     * The call is not executed if the target address is not a contract.\\n     *\\n     * @param from address representing the previous owner of the given token ID\\n     * @param to target address that will receive the tokens\\n     * @param tokenId uint256 ID of the token to be transferred\\n     * @param _data bytes optional data to send along with the call\\n     * @return bool whether the call correctly returned the expected magic value\\n     */\\n    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)\\n        private returns (bool)\\n    {\\n        if (!to.isContract()) {\\n            return true;\\n        }\\n        bytes memory returndata = to.functionCall(abi.encodeWithSelector(\\n            IERC721ReceiverUpgradeable(to).onERC721Received.selector,\\n            _msgSender(),\\n            from,\\n            tokenId,\\n            _data\\n        ), \\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n        bytes4 retval = abi.decode(returndata, (bytes4));\\n        return (retval == _ERC721_RECEIVED);\\n    }\\n\\n    function _approve(address to, uint256 tokenId) private {\\n        _tokenApprovals[tokenId] = to;\\n        emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId); // internal owner\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any token transfer. This includes minting\\n     * and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be\\n     * transferred to `to`.\\n     * - When `from` is zero, `tokenId` will be minted for `to`.\\n     * - When `to` is zero, ``from``'s `tokenId` will be burned.\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }\\n    uint256[41] private __gap;\\n}\\n\",\"keccak256\":\"0xcb44c1beb756a22dee4756a0d4d0ad21c2e811dcd39de9190797d0bda4433459\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721EnumerableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"./IERC721Upgradeable.sol\\\";\\n\\n/**\\n * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\n */\\ninterface IERC721EnumerableUpgradeable is IERC721Upgradeable {\\n\\n    /**\\n     * @dev Returns the total amount of tokens stored by the contract.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.\\n     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.\\n     */\\n    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);\\n\\n    /**\\n     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.\\n     * Use along with {totalSupply} to enumerate all tokens.\\n     */\\n    function tokenByIndex(uint256 index) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x529f3ab127aace61d7d47f3df7a6a2c42dc79bbb3a0ca459d6a861f33698aee6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721MetadataUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"./IERC721Upgradeable.sol\\\";\\n\\n/**\\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\n */\\ninterface IERC721MetadataUpgradeable is IERC721Upgradeable {\\n\\n    /**\\n     * @dev Returns the token collection name.\\n     */\\n    function name() external view returns (string memory);\\n\\n    /**\\n     * @dev Returns the token collection symbol.\\n     */\\n    function symbol() external view returns (string memory);\\n\\n    /**\\n     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\\n     */\\n    function tokenURI(uint256 tokenId) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0xa981b1f67f60771c18d39e21bad0a2f0f952e2c3faa90b45b982060fc14ee2bd\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/EnumerableMapUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Library for managing an enumerable variant of Solidity's\\n * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]\\n * type.\\n *\\n * Maps have the following properties:\\n *\\n * - Entries are added, removed, and checked for existence in constant time\\n * (O(1)).\\n * - Entries are enumerated in O(n). No guarantees are made on the ordering.\\n *\\n * ```\\n * contract Example {\\n *     // Add the library methods\\n *     using EnumerableMap for EnumerableMap.UintToAddressMap;\\n *\\n *     // Declare a set state variable\\n *     EnumerableMap.UintToAddressMap private myMap;\\n * }\\n * ```\\n *\\n * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are\\n * supported.\\n */\\nlibrary EnumerableMapUpgradeable {\\n    // To implement this library for multiple types with as little code\\n    // repetition as possible, we write it in terms of a generic Map type with\\n    // bytes32 keys and values.\\n    // The Map implementation uses private functions, and user-facing\\n    // implementations (such as Uint256ToAddressMap) are just wrappers around\\n    // the underlying Map.\\n    // This means that we can only create new EnumerableMaps for types that fit\\n    // in bytes32.\\n\\n    struct MapEntry {\\n        bytes32 _key;\\n        bytes32 _value;\\n    }\\n\\n    struct Map {\\n        // Storage of map keys and values\\n        MapEntry[] _entries;\\n\\n        // Position of the entry defined by a key in the `entries` array, plus 1\\n        // because index 0 means a key is not in the map.\\n        mapping (bytes32 => uint256) _indexes;\\n    }\\n\\n    /**\\n     * @dev Adds a key-value pair to a map, or updates the value for an existing\\n     * key. O(1).\\n     *\\n     * Returns true if the key was added to the map, that is if it was not\\n     * already present.\\n     */\\n    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {\\n        // We read and store the key's index to prevent multiple reads from the same storage slot\\n        uint256 keyIndex = map._indexes[key];\\n\\n        if (keyIndex == 0) { // Equivalent to !contains(map, key)\\n            map._entries.push(MapEntry({ _key: key, _value: value }));\\n            // The entry is stored at length-1, but we add 1 to all indexes\\n            // and use 0 as a sentinel value\\n            map._indexes[key] = map._entries.length;\\n            return true;\\n        } else {\\n            map._entries[keyIndex - 1]._value = value;\\n            return false;\\n        }\\n    }\\n\\n    /**\\n     * @dev Removes a key-value pair from a map. O(1).\\n     *\\n     * Returns true if the key was removed from the map, that is if it was present.\\n     */\\n    function _remove(Map storage map, bytes32 key) private returns (bool) {\\n        // We read and store the key's index to prevent multiple reads from the same storage slot\\n        uint256 keyIndex = map._indexes[key];\\n\\n        if (keyIndex != 0) { // Equivalent to contains(map, key)\\n            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one\\n            // in the array, and then remove the last entry (sometimes called as 'swap and pop').\\n            // This modifies the order of the array, as noted in {at}.\\n\\n            uint256 toDeleteIndex = keyIndex - 1;\\n            uint256 lastIndex = map._entries.length - 1;\\n\\n            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs\\n            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.\\n\\n            MapEntry storage lastEntry = map._entries[lastIndex];\\n\\n            // Move the last entry to the index where the entry to delete is\\n            map._entries[toDeleteIndex] = lastEntry;\\n            // Update the index for the moved entry\\n            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based\\n\\n            // Delete the slot where the moved entry was stored\\n            map._entries.pop();\\n\\n            // Delete the index for the deleted slot\\n            delete map._indexes[key];\\n\\n            return true;\\n        } else {\\n            return false;\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns true if the key is in the map. O(1).\\n     */\\n    function _contains(Map storage map, bytes32 key) private view returns (bool) {\\n        return map._indexes[key] != 0;\\n    }\\n\\n    /**\\n     * @dev Returns the number of key-value pairs in the map. O(1).\\n     */\\n    function _length(Map storage map) private view returns (uint256) {\\n        return map._entries.length;\\n    }\\n\\n   /**\\n    * @dev Returns the key-value pair stored at position `index` in the map. O(1).\\n    *\\n    * Note that there are no guarantees on the ordering of entries inside the\\n    * array, and it may change when more entries are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {\\n        require(map._entries.length > index, \\\"EnumerableMap: index out of bounds\\\");\\n\\n        MapEntry storage entry = map._entries[index];\\n        return (entry._key, entry._value);\\n    }\\n\\n    /**\\n     * @dev Tries to returns the value associated with `key`.  O(1).\\n     * Does not revert if `key` is not in the map.\\n     */\\n    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {\\n        uint256 keyIndex = map._indexes[key];\\n        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)\\n        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based\\n    }\\n\\n    /**\\n     * @dev Returns the value associated with `key`.  O(1).\\n     *\\n     * Requirements:\\n     *\\n     * - `key` must be in the map.\\n     */\\n    function _get(Map storage map, bytes32 key) private view returns (bytes32) {\\n        uint256 keyIndex = map._indexes[key];\\n        require(keyIndex != 0, \\\"EnumerableMap: nonexistent key\\\"); // Equivalent to contains(map, key)\\n        return map._entries[keyIndex - 1]._value; // All indexes are 1-based\\n    }\\n\\n    /**\\n     * @dev Same as {_get}, with a custom error message when `key` is not in the map.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {_tryGet}.\\n     */\\n    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {\\n        uint256 keyIndex = map._indexes[key];\\n        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)\\n        return map._entries[keyIndex - 1]._value; // All indexes are 1-based\\n    }\\n\\n    // UintToAddressMap\\n\\n    struct UintToAddressMap {\\n        Map _inner;\\n    }\\n\\n    /**\\n     * @dev Adds a key-value pair to a map, or updates the value for an existing\\n     * key. O(1).\\n     *\\n     * Returns true if the key was added to the map, that is if it was not\\n     * already present.\\n     */\\n    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {\\n        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the key was removed from the map, that is if it was present.\\n     */\\n    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {\\n        return _remove(map._inner, bytes32(key));\\n    }\\n\\n    /**\\n     * @dev Returns true if the key is in the map. O(1).\\n     */\\n    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {\\n        return _contains(map._inner, bytes32(key));\\n    }\\n\\n    /**\\n     * @dev Returns the number of elements in the map. O(1).\\n     */\\n    function length(UintToAddressMap storage map) internal view returns (uint256) {\\n        return _length(map._inner);\\n    }\\n\\n   /**\\n    * @dev Returns the element stored at position `index` in the set. O(1).\\n    * Note that there are no guarantees on the ordering of values inside the\\n    * array, and it may change when more values are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {\\n        (bytes32 key, bytes32 value) = _at(map._inner, index);\\n        return (uint256(key), address(uint160(uint256(value))));\\n    }\\n\\n    /**\\n     * @dev Tries to returns the value associated with `key`.  O(1).\\n     * Does not revert if `key` is not in the map.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {\\n        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));\\n        return (success, address(uint160(uint256(value))));\\n    }\\n\\n    /**\\n     * @dev Returns the value associated with `key`.  O(1).\\n     *\\n     * Requirements:\\n     *\\n     * - `key` must be in the map.\\n     */\\n    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {\\n        return address(uint160(uint256(_get(map._inner, bytes32(key)))));\\n    }\\n\\n    /**\\n     * @dev Same as {get}, with a custom error message when `key` is not in the map.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryGet}.\\n     */\\n    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {\\n        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));\\n    }\\n}\\n\",\"keccak256\":\"0x6a8e34d051fc71ce49a8a47d050c5b7e77909008c6be7d6780ee9ed87d2d3797\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/EnumerableSetUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Library for managing\\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\\n * types.\\n *\\n * Sets have the following properties:\\n *\\n * - Elements are added, removed, and checked for existence in constant time\\n * (O(1)).\\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\\n *\\n * ```\\n * contract Example {\\n *     // Add the library methods\\n *     using EnumerableSet for EnumerableSet.AddressSet;\\n *\\n *     // Declare a set state variable\\n *     EnumerableSet.AddressSet private mySet;\\n * }\\n * ```\\n *\\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\\n * and `uint256` (`UintSet`) are supported.\\n */\\nlibrary EnumerableSetUpgradeable {\\n    // To implement this library for multiple types with as little code\\n    // repetition as possible, we write it in terms of a generic Set type with\\n    // bytes32 values.\\n    // The Set implementation uses private functions, and user-facing\\n    // implementations (such as AddressSet) are just wrappers around the\\n    // underlying Set.\\n    // This means that we can only create new EnumerableSets for types that fit\\n    // in bytes32.\\n\\n    struct Set {\\n        // Storage of set values\\n        bytes32[] _values;\\n\\n        // Position of the value in the `values` array, plus 1 because index 0\\n        // means a value is not in the set.\\n        mapping (bytes32 => uint256) _indexes;\\n    }\\n\\n    /**\\n     * @dev Add a value to a set. O(1).\\n     *\\n     * Returns true if the value was added to the set, that is if it was not\\n     * already present.\\n     */\\n    function _add(Set storage set, bytes32 value) private returns (bool) {\\n        if (!_contains(set, value)) {\\n            set._values.push(value);\\n            // The value is stored at length-1, but we add 1 to all indexes\\n            // and use 0 as a sentinel value\\n            set._indexes[value] = set._values.length;\\n            return true;\\n        } else {\\n            return false;\\n        }\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the value was removed from the set, that is if it was\\n     * present.\\n     */\\n    function _remove(Set storage set, bytes32 value) private returns (bool) {\\n        // We read and store the value's index to prevent multiple reads from the same storage slot\\n        uint256 valueIndex = set._indexes[value];\\n\\n        if (valueIndex != 0) { // Equivalent to contains(set, value)\\n            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\\n            // the array, and then remove the last element (sometimes called as 'swap and pop').\\n            // This modifies the order of the array, as noted in {at}.\\n\\n            uint256 toDeleteIndex = valueIndex - 1;\\n            uint256 lastIndex = set._values.length - 1;\\n\\n            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs\\n            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.\\n\\n            bytes32 lastvalue = set._values[lastIndex];\\n\\n            // Move the last value to the index where the value to delete is\\n            set._values[toDeleteIndex] = lastvalue;\\n            // Update the index for the moved value\\n            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based\\n\\n            // Delete the slot where the moved value was stored\\n            set._values.pop();\\n\\n            // Delete the index for the deleted slot\\n            delete set._indexes[value];\\n\\n            return true;\\n        } else {\\n            return false;\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns true if the value is in the set. O(1).\\n     */\\n    function _contains(Set storage set, bytes32 value) private view returns (bool) {\\n        return set._indexes[value] != 0;\\n    }\\n\\n    /**\\n     * @dev Returns the number of values on the set. O(1).\\n     */\\n    function _length(Set storage set) private view returns (uint256) {\\n        return set._values.length;\\n    }\\n\\n   /**\\n    * @dev Returns the value stored at position `index` in the set. O(1).\\n    *\\n    * Note that there are no guarantees on the ordering of values inside the\\n    * array, and it may change when more values are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function _at(Set storage set, uint256 index) private view returns (bytes32) {\\n        require(set._values.length > index, \\\"EnumerableSet: index out of bounds\\\");\\n        return set._values[index];\\n    }\\n\\n    // Bytes32Set\\n\\n    struct Bytes32Set {\\n        Set _inner;\\n    }\\n\\n    /**\\n     * @dev Add a value to a set. O(1).\\n     *\\n     * Returns true if the value was added to the set, that is if it was not\\n     * already present.\\n     */\\n    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n        return _add(set._inner, value);\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the value was removed from the set, that is if it was\\n     * present.\\n     */\\n    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n        return _remove(set._inner, value);\\n    }\\n\\n    /**\\n     * @dev Returns true if the value is in the set. O(1).\\n     */\\n    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\\n        return _contains(set._inner, value);\\n    }\\n\\n    /**\\n     * @dev Returns the number of values in the set. O(1).\\n     */\\n    function length(Bytes32Set storage set) internal view returns (uint256) {\\n        return _length(set._inner);\\n    }\\n\\n   /**\\n    * @dev Returns the value stored at position `index` in the set. O(1).\\n    *\\n    * Note that there are no guarantees on the ordering of values inside the\\n    * array, and it may change when more values are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\\n        return _at(set._inner, index);\\n    }\\n\\n    // AddressSet\\n\\n    struct AddressSet {\\n        Set _inner;\\n    }\\n\\n    /**\\n     * @dev Add a value to a set. O(1).\\n     *\\n     * Returns true if the value was added to the set, that is if it was not\\n     * already present.\\n     */\\n    function add(AddressSet storage set, address value) internal returns (bool) {\\n        return _add(set._inner, bytes32(uint256(uint160(value))));\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the value was removed from the set, that is if it was\\n     * present.\\n     */\\n    function remove(AddressSet storage set, address value) internal returns (bool) {\\n        return _remove(set._inner, bytes32(uint256(uint160(value))));\\n    }\\n\\n    /**\\n     * @dev Returns true if the value is in the set. O(1).\\n     */\\n    function contains(AddressSet storage set, address value) internal view returns (bool) {\\n        return _contains(set._inner, bytes32(uint256(uint160(value))));\\n    }\\n\\n    /**\\n     * @dev Returns the number of values in the set. O(1).\\n     */\\n    function length(AddressSet storage set) internal view returns (uint256) {\\n        return _length(set._inner);\\n    }\\n\\n   /**\\n    * @dev Returns the value stored at position `index` in the set. O(1).\\n    *\\n    * Note that there are no guarantees on the ordering of values inside the\\n    * array, and it may change when more values are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function at(AddressSet storage set, uint256 index) internal view returns (address) {\\n        return address(uint160(uint256(_at(set._inner, index))));\\n    }\\n\\n\\n    // UintSet\\n\\n    struct UintSet {\\n        Set _inner;\\n    }\\n\\n    /**\\n     * @dev Add a value to a set. O(1).\\n     *\\n     * Returns true if the value was added to the set, that is if it was not\\n     * already present.\\n     */\\n    function add(UintSet storage set, uint256 value) internal returns (bool) {\\n        return _add(set._inner, bytes32(value));\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the value was removed from the set, that is if it was\\n     * present.\\n     */\\n    function remove(UintSet storage set, uint256 value) internal returns (bool) {\\n        return _remove(set._inner, bytes32(value));\\n    }\\n\\n    /**\\n     * @dev Returns true if the value is in the set. O(1).\\n     */\\n    function contains(UintSet storage set, uint256 value) internal view returns (bool) {\\n        return _contains(set._inner, bytes32(value));\\n    }\\n\\n    /**\\n     * @dev Returns the number of values on the set. O(1).\\n     */\\n    function length(UintSet storage set) internal view returns (uint256) {\\n        return _length(set._inner);\\n    }\\n\\n   /**\\n    * @dev Returns the value stored at position `index` in the set. O(1).\\n    *\\n    * Note that there are no guarantees on the ordering of values inside the\\n    * array, and it may change when more values are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function at(UintSet storage set, uint256 index) internal view returns (uint256) {\\n        return uint256(_at(set._inner, index));\\n    }\\n}\\n\",\"keccak256\":\"0x20714cf126a1a984613579156d3cbc726db8025d8400e1db1d2bb714edaba335\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary StringsUpgradeable {\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` representation.\\n     */\\n    function toString(uint256 value) internal pure returns (string memory) {\\n        // Inspired by OraclizeAPI's implementation - MIT licence\\n        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol\\n\\n        if (value == 0) {\\n            return \\\"0\\\";\\n        }\\n        uint256 temp = value;\\n        uint256 digits;\\n        while (temp != 0) {\\n            digits++;\\n            temp /= 10;\\n        }\\n        bytes memory buffer = new bytes(digits);\\n        uint256 index = digits - 1;\\n        temp = value;\\n        while (temp != 0) {\\n            buffer[index--] = bytes1(uint8(48 + temp % 10));\\n            temp /= 10;\\n        }\\n        return string(buffer);\\n    }\\n}\\n\",\"keccak256\":\"0x8d1ac29b8a8ed3cfebe5d8774b465441ae8931aaca549f84408e0b29a1191964\",\"license\":\"MIT\"},\"contracts/test/ERC721Mintable.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\\\";\\n\\n/**\\n * @dev Extension of {ERC721} for Minting/Burning\\n */\\ncontract ERC721Mintable is ERC721Upgradeable {\\n\\n    constructor () public {\\n        __ERC721_init(\\\"ERC 721\\\", \\\"NFT\\\");\\n    }\\n\\n    /**\\n     * @dev See {ERC721-_mint}.\\n     */\\n    function mint(address to, uint256 tokenId) public {\\n        _mint(to, tokenId);\\n    }\\n\\n    /**\\n     * @dev See {ERC721-_burn}.\\n     */\\n    function burn(uint256 tokenId) public {\\n        _burn(tokenId);\\n    }\\n}\\n\",\"keccak256\":\"0xd80b72e1d8c4d81c05e8a470dfe6524b1c52626cf27fb0b999824f24738f5a27\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/test/ERC721Mintable.sol:ERC721Mintable",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/test/ERC721Mintable.sol:ERC721Mintable",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/test/ERC721Mintable.sol:ERC721Mintable",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 861,
                "contract": "contracts/test/ERC721Mintable.sol:ERC721Mintable",
                "label": "_supportedInterfaces",
                "offset": 0,
                "slot": "51",
                "type": "t_mapping(t_bytes4,t_bool)"
              },
              {
                "astId": 918,
                "contract": "contracts/test/ERC721Mintable.sol:ERC721Mintable",
                "label": "__gap",
                "offset": 0,
                "slot": "52",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 2222,
                "contract": "contracts/test/ERC721Mintable.sol:ERC721Mintable",
                "label": "_holderTokens",
                "offset": 0,
                "slot": "101",
                "type": "t_mapping(t_address,t_struct(UintSet)4634_storage)"
              },
              {
                "astId": 2224,
                "contract": "contracts/test/ERC721Mintable.sol:ERC721Mintable",
                "label": "_tokenOwners",
                "offset": 0,
                "slot": "102",
                "type": "t_struct(UintToAddressMap)4011_storage"
              },
              {
                "astId": 2228,
                "contract": "contracts/test/ERC721Mintable.sol:ERC721Mintable",
                "label": "_tokenApprovals",
                "offset": 0,
                "slot": "104",
                "type": "t_mapping(t_uint256,t_address)"
              },
              {
                "astId": 2234,
                "contract": "contracts/test/ERC721Mintable.sol:ERC721Mintable",
                "label": "_operatorApprovals",
                "offset": 0,
                "slot": "105",
                "type": "t_mapping(t_address,t_mapping(t_address,t_bool))"
              },
              {
                "astId": 2236,
                "contract": "contracts/test/ERC721Mintable.sol:ERC721Mintable",
                "label": "_name",
                "offset": 0,
                "slot": "106",
                "type": "t_string_storage"
              },
              {
                "astId": 2238,
                "contract": "contracts/test/ERC721Mintable.sol:ERC721Mintable",
                "label": "_symbol",
                "offset": 0,
                "slot": "107",
                "type": "t_string_storage"
              },
              {
                "astId": 2242,
                "contract": "contracts/test/ERC721Mintable.sol:ERC721Mintable",
                "label": "_tokenURIs",
                "offset": 0,
                "slot": "108",
                "type": "t_mapping(t_uint256,t_string_storage)"
              },
              {
                "astId": 2244,
                "contract": "contracts/test/ERC721Mintable.sol:ERC721Mintable",
                "label": "_baseURI",
                "offset": 0,
                "slot": "109",
                "type": "t_string_storage"
              },
              {
                "astId": 3145,
                "contract": "contracts/test/ERC721Mintable.sol:ERC721Mintable",
                "label": "__gap",
                "offset": 0,
                "slot": "110",
                "type": "t_array(t_uint256)41_storage"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_bytes32)dyn_storage": {
                "base": "t_bytes32",
                "encoding": "dynamic_array",
                "label": "bytes32[]",
                "numberOfBytes": "32"
              },
              "t_array(t_struct(MapEntry)3685_storage)dyn_storage": {
                "base": "t_struct(MapEntry)3685_storage",
                "encoding": "dynamic_array",
                "label": "struct EnumerableMapUpgradeable.MapEntry[]",
                "numberOfBytes": "32"
              },
              "t_array(t_uint256)41_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[41]",
                "numberOfBytes": "1312"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_bytes32": {
                "encoding": "inplace",
                "label": "bytes32",
                "numberOfBytes": "32"
              },
              "t_bytes4": {
                "encoding": "inplace",
                "label": "bytes4",
                "numberOfBytes": "4"
              },
              "t_mapping(t_address,t_bool)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => bool)",
                "numberOfBytes": "32",
                "value": "t_bool"
              },
              "t_mapping(t_address,t_mapping(t_address,t_bool))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => bool))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_bool)"
              },
              "t_mapping(t_address,t_struct(UintSet)4634_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct EnumerableSetUpgradeable.UintSet)",
                "numberOfBytes": "32",
                "value": "t_struct(UintSet)4634_storage"
              },
              "t_mapping(t_bytes32,t_uint256)": {
                "encoding": "mapping",
                "key": "t_bytes32",
                "label": "mapping(bytes32 => uint256)",
                "numberOfBytes": "32",
                "value": "t_uint256"
              },
              "t_mapping(t_bytes4,t_bool)": {
                "encoding": "mapping",
                "key": "t_bytes4",
                "label": "mapping(bytes4 => bool)",
                "numberOfBytes": "32",
                "value": "t_bool"
              },
              "t_mapping(t_uint256,t_address)": {
                "encoding": "mapping",
                "key": "t_uint256",
                "label": "mapping(uint256 => address)",
                "numberOfBytes": "32",
                "value": "t_address"
              },
              "t_mapping(t_uint256,t_string_storage)": {
                "encoding": "mapping",
                "key": "t_uint256",
                "label": "mapping(uint256 => string)",
                "numberOfBytes": "32",
                "value": "t_string_storage"
              },
              "t_string_storage": {
                "encoding": "bytes",
                "label": "string",
                "numberOfBytes": "32"
              },
              "t_struct(Map)3693_storage": {
                "encoding": "inplace",
                "label": "struct EnumerableMapUpgradeable.Map",
                "members": [
                  {
                    "astId": 3688,
                    "contract": "contracts/test/ERC721Mintable.sol:ERC721Mintable",
                    "label": "_entries",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_array(t_struct(MapEntry)3685_storage)dyn_storage"
                  },
                  {
                    "astId": 3692,
                    "contract": "contracts/test/ERC721Mintable.sol:ERC721Mintable",
                    "label": "_indexes",
                    "offset": 0,
                    "slot": "1",
                    "type": "t_mapping(t_bytes32,t_uint256)"
                  }
                ],
                "numberOfBytes": "64"
              },
              "t_struct(MapEntry)3685_storage": {
                "encoding": "inplace",
                "label": "struct EnumerableMapUpgradeable.MapEntry",
                "members": [
                  {
                    "astId": 3682,
                    "contract": "contracts/test/ERC721Mintable.sol:ERC721Mintable",
                    "label": "_key",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_bytes32"
                  },
                  {
                    "astId": 3684,
                    "contract": "contracts/test/ERC721Mintable.sol:ERC721Mintable",
                    "label": "_value",
                    "offset": 0,
                    "slot": "1",
                    "type": "t_bytes32"
                  }
                ],
                "numberOfBytes": "64"
              },
              "t_struct(Set)4248_storage": {
                "encoding": "inplace",
                "label": "struct EnumerableSetUpgradeable.Set",
                "members": [
                  {
                    "astId": 4243,
                    "contract": "contracts/test/ERC721Mintable.sol:ERC721Mintable",
                    "label": "_values",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_array(t_bytes32)dyn_storage"
                  },
                  {
                    "astId": 4247,
                    "contract": "contracts/test/ERC721Mintable.sol:ERC721Mintable",
                    "label": "_indexes",
                    "offset": 0,
                    "slot": "1",
                    "type": "t_mapping(t_bytes32,t_uint256)"
                  }
                ],
                "numberOfBytes": "64"
              },
              "t_struct(UintSet)4634_storage": {
                "encoding": "inplace",
                "label": "struct EnumerableSetUpgradeable.UintSet",
                "members": [
                  {
                    "astId": 4633,
                    "contract": "contracts/test/ERC721Mintable.sol:ERC721Mintable",
                    "label": "_inner",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_struct(Set)4248_storage"
                  }
                ],
                "numberOfBytes": "64"
              },
              "t_struct(UintToAddressMap)4011_storage": {
                "encoding": "inplace",
                "label": "struct EnumerableMapUpgradeable.UintToAddressMap",
                "members": [
                  {
                    "astId": 4010,
                    "contract": "contracts/test/ERC721Mintable.sol:ERC721Mintable",
                    "label": "_inner",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_struct(Map)3693_storage"
                  }
                ],
                "numberOfBytes": "64"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/test/EchidnaTokenFaucet.sol": {
        "EchidnaTokenFaucet": {
          "abi": [
            {
              "inputs": [],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "inputs": [],
              "name": "asset",
              "outputs": [
                {
                  "internalType": "contract ERC20Mintable",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "burn",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "claim",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "dripAssets",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "echidna_total_dripped_eq_claimed_plus_balance",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "echidna_total_unclaimed_lte_balance",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "faucet",
              "outputs": [
                {
                  "internalType": "contract TokenFaucet",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "measure",
              "outputs": [
                {
                  "internalType": "contract ERC20Mintable",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "mint",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transfer",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "echidna_total_dripped_eq_claimed_plus_balance()": {
                "details": "Invariant: the balance of the faucet plus claimed tokens should always equal the total tokens dripped into the faucet"
              },
              "echidna_total_unclaimed_lte_balance()": {
                "details": "Invariant: total unclaimed tokens should never exceed the balance held by the faucet"
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5060405161001d906101de565b6040808252600b818301526a20b9b9b2ba102a37b5b2b760a91b6060830152608060208301819052600590830152641054d4d15560da1b60a0830152519081900360c001906000f080158015610077573d6000803e3d6000fd5b50600180546001600160a01b0319166001600160a01b03929092169190911790556040516100a4906101de565b6040808252600d818301526c26b2b0b9bab932902a37b5b2b760991b6060830152608060208301819052600490830152634d45415360e01b60a0830152519081900360c001906000f0801580156100ff573d6000803e3d6000fd5b50600280546001600160a01b0319166001600160a01b039290921691909117905560405161012c906101eb565b604051809103906000f080158015610148573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b0392831617808255600154600254604080516305e52ecf60e21b815292861660048401529085166024830152670de0b6b3a76400006044830152519190931692631794bb3c92606480830193919282900301818387803b1580156101c157600080fd5b505af11580156101d5573d6000803e3d6000fd5b505050506101f8565b61128380610afb83390190565b61188680611d7e83390190565b6108f4806102076000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063a0712d6811610066578063a0712d6814610127578063a9059cbb14610144578063b107aea114610170578063de5f72fd14610178578063efa9a1ad146101805761009e565b80632879d7c7146100a357806338d52e0f146100c257806342966c68146100e65780634e71d92d146101035780636cd8b16d1461010b575b600080fd5b6100c0600480360360208110156100b957600080fd5b5035610188565b005b6100ca61025f565b604080516001600160a01b039092168252519081900360200190f35b6100c0600480360360208110156100fc57600080fd5b503561026e565b6100c06103fa565b61011361048c565b604080519115158252519081900360200190f35b6100c06004803603602081101561013d57600080fd5b5035610594565b6100c06004803603604081101561015a57600080fd5b506001600160a01b038135169060200135610691565b610113610812565b6100ca6108a0565b6100ca6108af565b60007da7c5ac471b4784230fcf80dc33721d53cddd6e04c059210385c67dfe32a082116101b557816101bc565b620186a082045b600380548201908190559091508111156101d257fe5b60015460008054604080516340c10f1960e01b81526001600160a01b03928316600482015260248101869052905191909316926340c10f199260448083019360209390929083900390910190829087803b15801561022f57600080fd5b505af1158015610243573d6000803e3d6000fd5b505050506040513d602081101561025957600080fd5b50505050565b6001546001600160a01b031681565b600254604080516370a0823160e01b815233600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156102b957600080fd5b505afa1580156102cd573d6000803e3d6000fd5b505050506040513d60208110156102e357600080fd5b5051905060008183116102f657826102f8565b815b600080546002546040805163b221095760e01b815233600482015260248101859052604481018690526001600160a01b039283166064820152905194955091169263b22109579260848084019391929182900301818387803b15801561035d57600080fd5b505af1158015610371573d6000803e3d6000fd5b505060025460408051632770a7eb60e21b81523360048201526024810186905290516001600160a01b039092169350639dc29fac92506044808201926020929091908290030181600087803b1580156103c957600080fd5b505af11580156103dd573d6000803e3d6000fd5b505050506040513d60208110156103f357600080fd5b5050505050565b6000805460408051630f41a04d60e11b815233600482015290516001600160a01b0390921691631e83409a9160248082019260209290919082900301818787803b15801561044757600080fd5b505af115801561045b573d6000803e3d6000fd5b505050506040513d602081101561047157600080fd5b50516004805482019081905590915081111561048957fe5b50565b60015460008054604080516370a0823160e01b81526001600160a01b0392831660048201529051929391909116916370a0823191602480820192602092909190829003018186803b1580156104e057600080fd5b505afa1580156104f4573d6000803e3d6000fd5b505050506040513d602081101561050a57600080fd5b50516000546040805163192de29760e31b815290516001600160a01b039092169163c96f14b891600480820192602092909190829003018186803b15801561055157600080fd5b505afa158015610565573d6000803e3d6000fd5b505050506040513d602081101561057b57600080fd5b50516dffffffffffffffffffffffffffff161115905090565b60008054600254604080516304d7f3db60e41b8152336004820152602481018690526001600160a01b0392831660448201526064810185905290519190921692634d7f3db0926084808201939182900301818387803b1580156105f657600080fd5b505af115801561060a573d6000803e3d6000fd5b5050600254604080516340c10f1960e01b81523360048201526024810186905290516001600160a01b0390921693506340c10f1992506044808201926020929091908290030181600087803b15801561066257600080fd5b505af1158015610676573d6000803e3d6000fd5b505050506040513d602081101561068c57600080fd5b505050565b600254604080516370a0823160e01b815233600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156106dc57600080fd5b505afa1580156106f0573d6000803e3d6000fd5b505050506040513d602081101561070657600080fd5b505190506000818311610719578261071b565b815b600080546002546040805163b221095760e01b81523360048201526001600160a01b038a81166024830152604482018790529283166064820152905194955091169263b22109579260848084019391929182900301818387803b15801561078157600080fd5b505af1158015610795573d6000803e3d6000fd5b505060025460408051631c9c790360e01b81523360048201526001600160a01b038981166024830152604482018790529151919092169350631c9c79039250606480830192600092919082900301818387803b1580156107f457600080fd5b505af1158015610808573d6000803e3d6000fd5b5050505050505050565b60015460008054604080516370a0823160e01b81526001600160a01b0392831660048201529051929391909116916370a0823191602480820192602092909190829003018186803b15801561086657600080fd5b505afa15801561087a573d6000803e3d6000fd5b505050506040513d602081101561089057600080fd5b5051600454600354910114905090565b6000546001600160a01b031681565b6002546001600160a01b03168156fea264697066735822122077127690c6553e47db55e4f2b81dd3f504325f68608c7b4b5fe86b9c787bd81664736f6c634300060c003360806040523480156200001157600080fd5b506040516200128338038062001283833981810160405260408110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b9083019060208201858111156200006e57600080fd5b82516401000000008111828201881017156200008957600080fd5b82525081516020918201929091019080838360005b83811015620000b85781810151838201526020016200009e565b50505050905090810190601f168015620000e65780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200010a57600080fd5b9083019060208201858111156200012057600080fd5b82516401000000008111828201881017156200013b57600080fd5b82525081516020918201929091019080838360005b838110156200016a57818101518382015260200162000150565b50505050905090810190601f168015620001985780820380516001836020036101000a031916815260200191505b50604052505050620001b18282620001b960201b60201c565b5050620004c9565b600054610100900460ff1680620001d55750620001d56200027b565b80620001e4575060005460ff16155b620002215760405162461bcd60e51b815260040180806020018281038252602e81526020018062001255602e913960400191505060405180910390fd5b600054610100900460ff161580156200024d576000805460ff1961ff0019909116610100171660011790555b6200025762000299565b62000263838362000343565b801562000276576000805461ff00191690555b505050565b600062000293306200042760201b6200066c1760201c565b15905090565b600054610100900460ff1680620002b55750620002b56200027b565b80620002c4575060005460ff16155b620003015760405162461bcd60e51b815260040180806020018281038252602e81526020018062001255602e913960400191505060405180910390fd5b600054610100900460ff161580156200032d576000805460ff1961ff0019909116610100171660011790555b801562000340576000805461ff00191690555b50565b600054610100900460ff16806200035f57506200035f6200027b565b806200036e575060005460ff16155b620003ab5760405162461bcd60e51b815260040180806020018281038252602e81526020018062001255602e913960400191505060405180910390fd5b600054610100900460ff16158015620003d7576000805460ff1961ff0019909116610100171660011790555b8251620003ec9060369060208601906200042d565b508151620004029060379060208501906200042d565b506038805460ff19166012179055801562000276576000805461ff0019169055505050565b3b151590565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200047057805160ff1916838001178555620004a0565b82800160010185558215620004a0579182015b82811115620004a057825182559160200191906001019062000483565b50620004ae929150620004b2565b5090565b5b80821115620004ae5760008155600101620004b3565b610d7c80620004d96000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806340c10f191161008c5780639dc29fac116100665780639dc29fac146102d8578063a457c2d714610304578063a9059cbb14610330578063dd62ed3e1461035c576100ea565b806340c10f191461027e57806370a08231146102aa57806395d89b41146102d0576100ea565b80631c9c7903116100c85780631c9c7903146101c657806323b872dd146101fe578063313ce567146102345780633950935114610252576100ea565b806306fdde03146100ef578063095ea7b31461016c57806318160ddd146101ac575b600080fd5b6100f761038a565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610131578181015183820152602001610119565b50505050905090810190601f16801561015e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101986004803603604081101561018257600080fd5b506001600160a01b038135169060200135610420565b604080519115158252519081900360200190f35b6101b461043d565b60408051918252519081900360200190f35b6101fc600480360360608110156101dc57600080fd5b506001600160a01b03813581169160208101359091169060400135610443565b005b6101986004803603606081101561021457600080fd5b506001600160a01b03813581169160208101359091169060400135610453565b61023c6104da565b6040805160ff9092168252519081900360200190f35b6101986004803603604081101561026857600080fd5b506001600160a01b0381351690602001356104e3565b6101986004803603604081101561029457600080fd5b506001600160a01b038135169060200135610531565b6101b4600480360360208110156102c057600080fd5b50356001600160a01b031661053d565b6100f7610558565b610198600480360360408110156102ee57600080fd5b506001600160a01b0381351690602001356105b9565b6101986004803603604081101561031a57600080fd5b506001600160a01b0381351690602001356105c5565b6101986004803603604081101561034657600080fd5b506001600160a01b03813516906020013561062d565b6101b46004803603604081101561037257600080fd5b506001600160a01b0381358116916020013516610641565b60368054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104165780601f106103eb57610100808354040283529160200191610416565b820191906000526020600020905b8154815290600101906020018083116103f957829003601f168201915b5050505050905090565b600061043461042d610672565b8484610676565b50600192915050565b60355490565b61044e838383610762565b505050565b6000610460848484610762565b6104d08461046c610672565b6104cb85604051806060016040528060288152602001610c90602891396001600160a01b038a166000908152603460205260408120906104aa610672565b6001600160a01b0316815260208101919091526040016000205491906108bf565b610676565b5060019392505050565b60385460ff1690565b60006104346104f0610672565b846104cb8560346000610501610672565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490610956565b600061043483836109b7565b6001600160a01b031660009081526033602052604090205490565b60378054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104165780601f106103eb57610100808354040283529160200191610416565b60006104348383610aa9565b60006104346105d2610672565b846104cb85604051806060016040528060258152602001610d2260259139603460006105fc610672565b6001600160a01b03908116825260208083019390935260409182016000908120918d168152925290205491906108bf565b600061043461063a610672565b8484610762565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b3b151590565b3390565b6001600160a01b0383166106bb5760405162461bcd60e51b8152600401808060200182810382526024815260200180610cfe6024913960400191505060405180910390fd5b6001600160a01b0382166107005760405162461bcd60e51b8152600401808060200182810382526022815260200180610c486022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166107a75760405162461bcd60e51b8152600401808060200182810382526025815260200180610cd96025913960400191505060405180910390fd5b6001600160a01b0382166107ec5760405162461bcd60e51b8152600401808060200182810382526023815260200180610c036023913960400191505060405180910390fd5b6107f783838361044e565b61083481604051806060016040528060268152602001610c6a602691396001600160a01b03861660009081526033602052604090205491906108bf565b6001600160a01b0380851660009081526033602052604080822093909355908416815220546108639082610956565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561094e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156109135781810151838201526020016108fb565b50505050905090810190601f1680156109405780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156109b0576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216610a12576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b610a1e6000838361044e565b603554610a2b9082610956565b6035556001600160a01b038216600090815260336020526040902054610a519082610956565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038216610aee5760405162461bcd60e51b8152600401808060200182810382526021815260200180610cb86021913960400191505060405180910390fd5b610afa8260008361044e565b610b3781604051806060016040528060228152602001610c26602291396001600160a01b03851660009081526033602052604090205491906108bf565b6001600160a01b038316600090815260336020526040902055603554610b5d9082610ba5565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600082821115610bfc576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b5090039056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220bba429e69beb1bc8dd970964cb7c3f0feac9e9caed1b36200ec0d81408b6b54564736f6c634300060c0033496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564608060405234801561001057600080fd5b50611866806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c80638da5cb5b116100ad578063ca5baafc11610071578063ca5baafc1461034f578063d9772a251461036c578063e318613e1461038d578063efa9a1ad14610395578063f2fde38b1461039d57610121565b80638da5cb5b146102c25780639f678cca146102ca578063b2210957146102d2578063b6b55f251461030e578063c96f14b81461032b57610121565b80631e83409a116100f45780631e83409a14610208578063205c28781461022e57806338d52e0f1461025a5780634d7f3db01461027e578063715018a6146102ba57610121565b806301ffc9a7146101265780630ecc535f146101615780631794bb3c146101b6578063187f3334146101ee575b600080fd5b61014d6004803603602081101561013c57600080fd5b50356001600160e01b0319166103c3565b604080519115158252519081900360200190f35b6101876004803603602081101561017757600080fd5b50356001600160a01b03166103ff565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b6101ec600480360360608110156101cc57600080fd5b506001600160a01b03813581169160208101359091169060400135610425565b005b6101f6610583565b60408051918252519081900360200190f35b6101f66004803603602081101561021e57600080fd5b50356001600160a01b0316610589565b6101ec6004803603604081101561024457600080fd5b506001600160a01b0381351690602001356106f1565b610262610915565b604080516001600160a01b039092168252519081900360200190f35b6101ec6004803603608081101561029457600080fd5b506001600160a01b03813581169160208101359160408201358116916060013516610924565b6101ec610953565b6102626109ff565b6101f6610a0f565b6101ec600480360360808110156102e857600080fd5b506001600160a01b03813581169160208101358216916040820135916060013516610cab565b6101ec6004803603602081101561032457600080fd5b5035610ce7565b610333610daf565b604080516001600160701b039092168252519081900360200190f35b6101ec6004803603602081101561036557600080fd5b5035610dc5565b610374610ec0565b6040805163ffffffff9092168252519081900360200190f35b610333610ed3565b610262610ee2565b6101ec600480360360208110156103b357600080fd5b50356001600160a01b0316610ef1565b60006001600160e01b031982166301ffc9a760e01b14806103f757506001600160e01b03198216600162a1cb1960e01b0319145b90505b919050565b6069602052600090815260409020546001600160801b0380821691600160801b90041682565b600054610100900460ff168061043e575061043e610ff4565b8061044c575060005460ff16155b6104875760405162461bcd60e51b815260040180806020018281038252602e815260200180611773602e913960400191505060405180910390fd5b600054610100900460ff161580156104b2576000805460ff1961ff0019909116610100171660011790555b6104ba611005565b6104c26110b7565b6068805463ffffffff92909216600160e01b026001600160e01b03909216919091179055606580546001600160a01b038087166001600160a01b031992831617909255606680549286169290911691909117905561051f82610dc5565b60665460655460675460408051918252516001600160a01b039384169392909216917f10f27652c1015195ca7e6bc9b4c724cbf18e91c42117d92124703a3f49bb240f9181900360200190a3801561057d576000805461ff00191690555b50505050565b60675481565b6000610593610a0f565b5061059d826110c7565b506001600160a01b038216600090815260696020526040902080546001600160801b03808216909255606854600160801b909104909116906105f8906105f390600160701b90046001600160701b03168361126c565b6112ce565b606880546001600160701b0392909216600160701b026dffffffffffffffffffffffffffff60701b199092169190911790556065546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561068057600080fd5b505af1158015610694573d6000803e3d6000fd5b505050506040513d60208110156106aa57600080fd5b50506040805182815290516001600160a01b038516917fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a919081900360200190a292915050565b6106f9611316565b6001600160a01b031661070a6109ff565b6001600160a01b031614610753576040805162461bcd60e51b815260206004820181905260248201526000805160206117c2833981519152604482015290519081900360640190fd5b61075b610a0f565b50606554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156107a757600080fd5b505afa1580156107bb573d6000803e3d6000fd5b505050506040513d60208110156107d157600080fd5b50516068549091506000906107f7908390600160701b90046001600160701b031661126c565b90508083111561084e576040805162461bcd60e51b815260206004820152601e60248201527f546f6b656e4661756365742f696e73756666696369656e742d66756e64730000604482015290519081900360640190fd5b6065546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018790529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156108a457600080fd5b505af11580156108b8573d6000803e3d6000fd5b505050506040513d60208110156108ce57600080fd5b50506040805184815290516001600160a01b038616917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a250505050565b6065546001600160a01b031681565b6066546001600160a01b038381169116141561057d57610942610a0f565b5061094c846110c7565b5050505050565b61095b611316565b6001600160a01b031661096c6109ff565b6001600160a01b0316146109b5576040805162461bcd60e51b815260206004820181905260248201526000805160206117c2833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6033546001600160a01b03165b90565b600080610a1a6110b7565b60685463ffffffff9182169250600160e01b900416811415610a40576000915050610a0c565b606554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610a8b57600080fd5b505afa158015610a9f573d6000803e3d6000fd5b505050506040513d6020811015610ab557600080fd5b5051606854909150600090610adb908390600160701b90046001600160701b031661126c565b606854909150600090610b0090859063ffffffff600160e01b90910481169061126c16565b606854606654604080516318160ddd60e01b815290519394506001600160701b039092169260009283926001600160a01b0316916318160ddd91600480820192602092909190829003018186803b158015610b5a57600080fd5b505afa158015610b6e573d6000803e3d6000fd5b505050506040513d6020811015610b8457600080fd5b505190508015801590610b975750600085115b15610c0957606754610baa90859061131a565b915084821115610bb8578491505b6000610bc4838361137a565b9050610bd084826113a3565b6040805185815290519195507f7de59a92c9386255180c28ede4b61edb9b7b2ac96855ac634151489cef21bad6919081900360200190a1505b610c12836112ce565b606880546dffffffffffffffffffffffffffff19166001600160701b039283161790819055610c4d916105f391600160701b900416846113a3565b6068600e6101000a8154816001600160701b0302191690836001600160701b03160217905550610c7c876113fd565b6068805463ffffffff92909216600160e01b026001600160e01b03909216919091179055509550505050505090565b6066546001600160a01b038281169116148015610cd057506001600160a01b03841615155b1561057d57610cdd610a0f565b50610942836110c7565b610cef610a0f565b50606554604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015610d4a57600080fd5b505af1158015610d5e573d6000803e3d6000fd5b505050506040513d6020811015610d7457600080fd5b505060408051828152905133917f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4919081900360200190a250565b606854600160701b90046001600160701b031681565b610dcd611316565b6001600160a01b0316610dde6109ff565b6001600160a01b031614610e27576040805162461bcd60e51b815260206004820181905260248201526000805160206117c2833981519152604482015290519081900360640190fd5b60008111610e7c576040805162461bcd60e51b815260206004820152601c60248201527f546f6b656e4661756365742f64726970526174652d67742d7a65726f00000000604482015290519081900360640190fd5b610e84610a0f565b5060678190556040805182815290517f3d38e7cd2e029035006f9977a727c8724cd41dffb6d2a40d9f66bd4c26836a329181900360200190a150565b606854600160e01b900463ffffffff1681565b6068546001600160701b031681565b6066546001600160a01b031681565b610ef9611316565b6001600160a01b0316610f0a6109ff565b6001600160a01b031614610f53576040805162461bcd60e51b815260206004820181905260248201526000805160206117c2833981519152604482015290519081900360640190fd5b6001600160a01b038116610f985760405162461bcd60e51b81526004018080602001828103825260268152602001806117266026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610fff30611442565b15905090565b600054610100900460ff168061101e575061101e610ff4565b8061102c575060005460ff16155b6110675760405162461bcd60e51b815260040180806020018281038252602e815260200180611773602e913960400191505060405180910390fd5b600054610100900460ff16158015611092576000805460ff1961ff0019909116610100171660011790555b61109a611448565b6110a26114e8565b80156110b4576000805461ff00191690555b50565b60006110c2426113fd565b905090565b6001600160a01b038116600090815260696020526040812080546068546001600160701b03166001600160801b0390911614156111085760009150506103fa565b805460685460009161112c916001600160701b0316906001600160801b031661126c565b606654604080516370a0823160e01b81526001600160a01b038881166004830152915193945060009391909216916370a08231916024808301926020929190829003018186803b15801561117f57600080fd5b505afa158015611193573d6000803e3d6000fd5b505050506040513d60208110156111a957600080fd5b5051905060006111c16111bc83856115e1565b611602565b604080518082019091526068546001600160701b031681528554919250906020820190611206906111bc90600160801b90046001600160801b039081169086166113a3565b6001600160801b039081169091526001600160a01b03881660009081526069602090815260409091208351815494909201518316600160801b029183166fffffffffffffffffffffffffffffffff19909416939093179091161790559350505050919050565b6000828211156112c3576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6000600160701b82106113125760405162461bcd60e51b81526004018080602001828103825260298152602001806117e26029913960400191505060405180910390fd5b5090565b3390565b600082611329575060006112c8565b8282028284828161133657fe5b04146113735760405162461bcd60e51b81526004018080602001828103825260218152602001806117a16021913960400191505060405180910390fd5b9392505050565b60008061138f84670de0b6b3a764000061131a565b905061139b8184611646565b949350505050565b600082820183811015611373576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600064010000000082106113125760405162461bcd60e51b815260040180806020018281038252602681526020018061180b6026913960400191505060405180910390fd5b3b151590565b600054610100900460ff16806114615750611461610ff4565b8061146f575060005460ff16155b6114aa5760405162461bcd60e51b815260040180806020018281038252602e815260200180611773602e913960400191505060405180910390fd5b600054610100900460ff161580156110a2576000805460ff1961ff00199091166101001716600117905580156110b4576000805461ff001916905550565b600054610100900460ff16806115015750611501610ff4565b8061150f575060005460ff16155b61154a5760405162461bcd60e51b815260040180806020018281038252602e815260200180611773602e913960400191505060405180910390fd5b600054610100900460ff16158015611575576000805460ff1961ff0019909116610100171660011790555b600061157f611316565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156110b4576000805461ff001916905550565b6000806115ee838561131a565b905061139b81670de0b6b3a7640000611646565b6000600160801b82106113125760405162461bcd60e51b815260040180806020018281038252602781526020018061174c6027913960400191505060405180910390fd5b600061137383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506000818361170f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156116d45781810151838201526020016116bc565b50505050905090810190601f1680156117015780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161171b57fe5b049594505050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e203132382062697473496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657253616665436173743a2076616c756520646f65736e27742066697420696e20616e2075696e7431313253616665436173743a2076616c756520646f65736e27742066697420696e2033322062697473a2646970667358221220ca90e018c76dda1f3b271af212deb27b3e80278ba6dc894d44af423d3761577064736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x1D SWAP1 PUSH2 0x1DE JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE PUSH1 0xB DUP2 DUP4 ADD MSTORE PUSH11 0x20B9B9B2BA102A37B5B2B7 PUSH1 0xA9 SHL PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x20 DUP4 ADD DUP2 SWAP1 MSTORE PUSH1 0x5 SWAP1 DUP4 ADD MSTORE PUSH5 0x1054D4D155 PUSH1 0xDA SHL PUSH1 0xA0 DUP4 ADD MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0xC0 ADD SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x77 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH2 0xA4 SWAP1 PUSH2 0x1DE JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE PUSH1 0xD DUP2 DUP4 ADD MSTORE PUSH13 0x26B2B0B9BAB932902A37B5B2B7 PUSH1 0x99 SHL PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x80 PUSH1 0x20 DUP4 ADD DUP2 SWAP1 MSTORE PUSH1 0x4 SWAP1 DUP4 ADD MSTORE PUSH4 0x4D454153 PUSH1 0xE0 SHL PUSH1 0xA0 DUP4 ADD MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0xC0 ADD SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0xFF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH2 0x12C SWAP1 PUSH2 0x1EB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x148 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND OR DUP1 DUP3 SSTORE PUSH1 0x1 SLOAD PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x5E52ECF PUSH1 0xE2 SHL DUP2 MSTORE SWAP3 DUP7 AND PUSH1 0x4 DUP5 ADD MSTORE SWAP1 DUP6 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH8 0xDE0B6B3A7640000 PUSH1 0x44 DUP4 ADD MSTORE MLOAD SWAP2 SWAP1 SWAP4 AND SWAP3 PUSH4 0x1794BB3C SWAP3 PUSH1 0x64 DUP1 DUP4 ADD SWAP4 SWAP2 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x1F8 JUMP JUMPDEST PUSH2 0x1283 DUP1 PUSH2 0xAFB DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH2 0x1886 DUP1 PUSH2 0x1D7E DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH2 0x8F4 DUP1 PUSH2 0x207 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x9E JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA0712D68 GT PUSH2 0x66 JUMPI DUP1 PUSH4 0xA0712D68 EQ PUSH2 0x127 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x144 JUMPI DUP1 PUSH4 0xB107AEA1 EQ PUSH2 0x170 JUMPI DUP1 PUSH4 0xDE5F72FD EQ PUSH2 0x178 JUMPI DUP1 PUSH4 0xEFA9A1AD EQ PUSH2 0x180 JUMPI PUSH2 0x9E JUMP JUMPDEST DUP1 PUSH4 0x2879D7C7 EQ PUSH2 0xA3 JUMPI DUP1 PUSH4 0x38D52E0F EQ PUSH2 0xC2 JUMPI DUP1 PUSH4 0x42966C68 EQ PUSH2 0xE6 JUMPI DUP1 PUSH4 0x4E71D92D EQ PUSH2 0x103 JUMPI DUP1 PUSH4 0x6CD8B16D EQ PUSH2 0x10B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC0 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xB9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x188 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xCA PUSH2 0x25F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0xC0 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xFC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x26E JUMP JUMPDEST PUSH2 0xC0 PUSH2 0x3FA JUMP JUMPDEST PUSH2 0x113 PUSH2 0x48C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0xC0 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x13D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x594 JUMP JUMPDEST PUSH2 0xC0 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x15A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x691 JUMP JUMPDEST PUSH2 0x113 PUSH2 0x812 JUMP JUMPDEST PUSH2 0xCA PUSH2 0x8A0 JUMP JUMPDEST PUSH2 0xCA PUSH2 0x8AF JUMP JUMPDEST PUSH1 0x0 PUSH30 0xA7C5AC471B4784230FCF80DC33721D53CDDD6E04C059210385C67DFE32A0 DUP3 GT PUSH2 0x1B5 JUMPI DUP2 PUSH2 0x1BC JUMP JUMPDEST PUSH3 0x186A0 DUP3 DIV JUMPDEST PUSH1 0x3 DUP1 SLOAD DUP3 ADD SWAP1 DUP2 SWAP1 SSTORE SWAP1 SWAP2 POP DUP2 GT ISZERO PUSH2 0x1D2 JUMPI INVALID JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x40C10F19 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE SWAP1 MLOAD SWAP2 SWAP1 SWAP4 AND SWAP3 PUSH4 0x40C10F19 SWAP3 PUSH1 0x44 DUP1 DUP4 ADD SWAP4 PUSH1 0x20 SWAP4 SWAP1 SWAP3 SWAP1 DUP4 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 DUP3 SWAP1 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x22F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x243 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x259 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2CD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 DUP2 DUP4 GT PUSH2 0x2F6 JUMPI DUP3 PUSH2 0x2F8 JUMP JUMPDEST DUP2 JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP5 SWAP6 POP SWAP2 AND SWAP3 PUSH4 0xB2210957 SWAP3 PUSH1 0x84 DUP1 DUP5 ADD SWAP4 SWAP2 SWAP3 SWAP2 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x35D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x371 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x2770A7EB PUSH1 0xE2 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP4 POP PUSH4 0x9DC29FAC SWAP3 POP PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3DD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xF41A04D PUSH1 0xE1 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x1E83409A SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x447 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x45B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x471 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x4 DUP1 SLOAD DUP3 ADD SWAP1 DUP2 SWAP1 SSTORE SWAP1 SWAP2 POP DUP2 GT ISZERO PUSH2 0x489 JUMPI INVALID JUMPDEST POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD SWAP3 SWAP4 SWAP2 SWAP1 SWAP2 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x4F4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x50A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x192DE297 PUSH1 0xE3 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0xC96F14B8 SWAP2 PUSH1 0x4 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x551 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x565 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x57B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GT ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 PUSH4 0x4D7F3DB0 SWAP3 PUSH1 0x84 DUP1 DUP3 ADD SWAP4 SWAP2 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x60A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x40C10F19 PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP4 POP PUSH4 0x40C10F19 SWAP3 POP PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x662 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x676 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x68C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x6F0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x706 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 DUP2 DUP4 GT PUSH2 0x719 JUMPI DUP3 PUSH2 0x71B JUMP JUMPDEST DUP2 JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP8 SWAP1 MSTORE SWAP3 DUP4 AND PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP5 SWAP6 POP SWAP2 AND SWAP3 PUSH4 0xB2210957 SWAP3 PUSH1 0x84 DUP1 DUP5 ADD SWAP4 SWAP2 SWAP3 SWAP2 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x781 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x795 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x1C9C7903 PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP8 SWAP1 MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP4 POP PUSH4 0x1C9C7903 SWAP3 POP PUSH1 0x64 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x7F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x808 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD SWAP3 SWAP4 SWAP2 SWAP1 SWAP2 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x866 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x87A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x890 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x4 SLOAD PUSH1 0x3 SLOAD SWAP2 ADD EQ SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH24 0x127690C6553E47DB55E4F2B81DD3F504325F68608C7B4B5F 0xE8 PUSH12 0x9C787BD81664736F6C634300 MOD 0xC STOP CALLER PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x1283 CODESIZE SUB DUP1 PUSH3 0x1283 DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE PUSH1 0x40 DUP2 LT ISZERO PUSH3 0x37 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD PUSH1 0x40 MLOAD SWAP4 SWAP3 SWAP2 SWAP1 DUP5 PUSH5 0x100000000 DUP3 GT ISZERO PUSH3 0x58 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 DUP4 ADD SWAP1 PUSH1 0x20 DUP3 ADD DUP6 DUP2 GT ISZERO PUSH3 0x6E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH5 0x100000000 DUP2 GT DUP3 DUP3 ADD DUP9 LT OR ISZERO PUSH3 0x89 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MSTORE POP DUP2 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0xB8 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x9E JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH3 0xE6 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP PUSH1 0x40 MSTORE PUSH1 0x20 ADD DUP1 MLOAD PUSH1 0x40 MLOAD SWAP4 SWAP3 SWAP2 SWAP1 DUP5 PUSH5 0x100000000 DUP3 GT ISZERO PUSH3 0x10A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 DUP4 ADD SWAP1 PUSH1 0x20 DUP3 ADD DUP6 DUP2 GT ISZERO PUSH3 0x120 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD PUSH5 0x100000000 DUP2 GT DUP3 DUP3 ADD DUP9 LT OR ISZERO PUSH3 0x13B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MSTORE POP DUP2 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x16A JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x150 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH3 0x198 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP PUSH1 0x40 MSTORE POP POP POP PUSH3 0x1B1 DUP3 DUP3 PUSH3 0x1B9 PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST POP POP PUSH3 0x4C9 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH3 0x1D5 JUMPI POP PUSH3 0x1D5 PUSH3 0x27B JUMP JUMPDEST DUP1 PUSH3 0x1E4 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH3 0x221 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH3 0x1255 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH3 0x24D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH3 0x257 PUSH3 0x299 JUMP JUMPDEST PUSH3 0x263 DUP4 DUP4 PUSH3 0x343 JUMP JUMPDEST DUP1 ISZERO PUSH3 0x276 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x293 ADDRESS PUSH3 0x427 PUSH1 0x20 SHL PUSH3 0x66C OR PUSH1 0x20 SHR JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH3 0x2B5 JUMPI POP PUSH3 0x2B5 PUSH3 0x27B JUMP JUMPDEST DUP1 PUSH3 0x2C4 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH3 0x301 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH3 0x1255 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH3 0x32D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP1 ISZERO PUSH3 0x340 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH3 0x35F JUMPI POP PUSH3 0x35F PUSH3 0x27B JUMP JUMPDEST DUP1 PUSH3 0x36E JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH3 0x3AB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH3 0x1255 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH3 0x3D7 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP3 MLOAD PUSH3 0x3EC SWAP1 PUSH1 0x36 SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH3 0x42D JUMP JUMPDEST POP DUP2 MLOAD PUSH3 0x402 SWAP1 PUSH1 0x37 SWAP1 PUSH1 0x20 DUP6 ADD SWAP1 PUSH3 0x42D JUMP JUMPDEST POP PUSH1 0x38 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x12 OR SWAP1 SSTORE DUP1 ISZERO PUSH3 0x276 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x470 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x4A0 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x4A0 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x4A0 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x483 JUMP JUMPDEST POP PUSH3 0x4AE SWAP3 SWAP2 POP PUSH3 0x4B2 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x4AE JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x4B3 JUMP JUMPDEST PUSH2 0xD7C DUP1 PUSH3 0x4D9 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xEA JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x40C10F19 GT PUSH2 0x8C JUMPI DUP1 PUSH4 0x9DC29FAC GT PUSH2 0x66 JUMPI DUP1 PUSH4 0x9DC29FAC EQ PUSH2 0x2D8 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x304 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x330 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x35C JUMPI PUSH2 0xEA JUMP JUMPDEST DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x27E JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2AA JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x2D0 JUMPI PUSH2 0xEA JUMP JUMPDEST DUP1 PUSH4 0x1C9C7903 GT PUSH2 0xC8 JUMPI DUP1 PUSH4 0x1C9C7903 EQ PUSH2 0x1C6 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1FE JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x234 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x252 JUMPI PUSH2 0xEA JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xEF JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x16C JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x1AC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF7 PUSH2 0x38A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x131 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x119 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x15E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x198 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x182 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x420 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1B4 PUSH2 0x43D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1FC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x1DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x443 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x198 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x214 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x453 JUMP JUMPDEST PUSH2 0x23C PUSH2 0x4DA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x198 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x268 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x4E3 JUMP JUMPDEST PUSH2 0x198 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x294 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x531 JUMP JUMPDEST PUSH2 0x1B4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x53D JUMP JUMPDEST PUSH2 0xF7 PUSH2 0x558 JUMP JUMPDEST PUSH2 0x198 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x2EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x5B9 JUMP JUMPDEST PUSH2 0x198 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x31A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x5C5 JUMP JUMPDEST PUSH2 0x198 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x346 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x62D JUMP JUMPDEST PUSH2 0x1B4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x641 JUMP JUMPDEST PUSH1 0x36 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x416 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x3EB JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x416 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x3F9 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x434 PUSH2 0x42D PUSH2 0x672 JUMP JUMPDEST DUP5 DUP5 PUSH2 0x676 JUMP JUMPDEST POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x35 SLOAD SWAP1 JUMP JUMPDEST PUSH2 0x44E DUP4 DUP4 DUP4 PUSH2 0x762 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x460 DUP5 DUP5 DUP5 PUSH2 0x762 JUMP JUMPDEST PUSH2 0x4D0 DUP5 PUSH2 0x46C PUSH2 0x672 JUMP JUMPDEST PUSH2 0x4CB DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC90 PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP1 PUSH2 0x4AA PUSH2 0x672 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x8BF JUMP JUMPDEST PUSH2 0x676 JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x38 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x434 PUSH2 0x4F0 PUSH2 0x672 JUMP JUMPDEST DUP5 PUSH2 0x4CB DUP6 PUSH1 0x34 PUSH1 0x0 PUSH2 0x501 PUSH2 0x672 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP13 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP1 PUSH2 0x956 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x434 DUP4 DUP4 PUSH2 0x9B7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x37 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x416 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x3EB JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x416 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x434 DUP4 DUP4 PUSH2 0xAA9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x434 PUSH2 0x5D2 PUSH2 0x672 JUMP JUMPDEST DUP5 PUSH2 0x4CB DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xD22 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x34 PUSH1 0x0 PUSH2 0x5FC PUSH2 0x672 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP14 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x8BF JUMP JUMPDEST PUSH1 0x0 PUSH2 0x434 PUSH2 0x63A PUSH2 0x672 JUMP JUMPDEST DUP5 DUP5 PUSH2 0x762 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x6BB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xCFE PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x700 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xC48 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE DUP2 MLOAD DUP6 DUP2 MSTORE SWAP2 MLOAD PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x7A7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xCD9 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x7EC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xC03 PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x7F7 DUP4 DUP4 DUP4 PUSH2 0x44E JUMP JUMPDEST PUSH2 0x834 DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC6A PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x8BF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP5 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x863 SWAP1 DUP3 PUSH2 0x956 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 SWAP3 DUP8 AND SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP5 DUP5 GT ISZERO PUSH2 0x94E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x913 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x8FB JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x940 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x9B0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xA12 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xA1E PUSH1 0x0 DUP4 DUP4 PUSH2 0x44E JUMP JUMPDEST PUSH1 0x35 SLOAD PUSH2 0xA2B SWAP1 DUP3 PUSH2 0x956 JUMP JUMPDEST PUSH1 0x35 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0xA51 SWAP1 DUP3 PUSH2 0x956 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP4 MLOAD DUP6 DUP2 MSTORE SWAP4 MLOAD SWAP3 SWAP4 SWAP2 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xAEE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xCB8 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xAFA DUP3 PUSH1 0x0 DUP4 PUSH2 0x44E JUMP JUMPDEST PUSH2 0xB37 DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xC26 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x8BF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x35 SLOAD PUSH2 0xB5D SWAP1 DUP3 PUSH2 0xBA5 JUMP JUMPDEST PUSH1 0x35 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xBFC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP INVALID GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220746F20746865207A65726F2061 PUSH5 0x6472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH3 0x75726E KECCAK256 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545524332 ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F766520746F20746865207A65726F20616464 PUSH19 0x65737345524332303A207472616E7366657220 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545524332 ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220616D6F756E7420657863656564 PUSH20 0x20616C6C6F77616E636545524332303A20627572 PUSH15 0x2066726F6D20746865207A65726F20 PUSH2 0x6464 PUSH19 0x65737345524332303A207472616E7366657220 PUSH7 0x726F6D20746865 KECCAK256 PUSH27 0x65726F206164647265737345524332303A20617070726F76652066 PUSH19 0x6F6D20746865207A65726F2061646472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH5 0x6563726561 PUSH20 0x656420616C6C6F77616E63652062656C6F77207A PUSH6 0x726FA2646970 PUSH7 0x7358221220BBA4 0x29 0xE6 SWAP12 0xEB SHL 0xC8 0xDD SWAP8 MULMOD PUSH5 0xCB7C3F0FEA 0xC9 0xE9 0xCA 0xED SHL CALLDATASIZE KECCAK256 0xE 0xC0 0xD8 EQ ADDMOD 0xB6 0xB5 GASLIMIT PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER 0x49 PUSH15 0x697469616C697A61626C653A20636F PUSH15 0x747261637420697320616C72656164 PUSH26 0x20696E697469616C697A65646080604052348015610010576000 DUP1 REVERT JUMPDEST POP PUSH2 0x1866 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x121 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0xAD JUMPI DUP1 PUSH4 0xCA5BAAFC GT PUSH2 0x71 JUMPI DUP1 PUSH4 0xCA5BAAFC EQ PUSH2 0x34F JUMPI DUP1 PUSH4 0xD9772A25 EQ PUSH2 0x36C JUMPI DUP1 PUSH4 0xE318613E EQ PUSH2 0x38D JUMPI DUP1 PUSH4 0xEFA9A1AD EQ PUSH2 0x395 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x39D JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x2C2 JUMPI DUP1 PUSH4 0x9F678CCA EQ PUSH2 0x2CA JUMPI DUP1 PUSH4 0xB2210957 EQ PUSH2 0x2D2 JUMPI DUP1 PUSH4 0xB6B55F25 EQ PUSH2 0x30E JUMPI DUP1 PUSH4 0xC96F14B8 EQ PUSH2 0x32B JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x1E83409A GT PUSH2 0xF4 JUMPI DUP1 PUSH4 0x1E83409A EQ PUSH2 0x208 JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x22E JUMPI DUP1 PUSH4 0x38D52E0F EQ PUSH2 0x25A JUMPI DUP1 PUSH4 0x4D7F3DB0 EQ PUSH2 0x27E JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x2BA JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x126 JUMPI DUP1 PUSH4 0xECC535F EQ PUSH2 0x161 JUMPI DUP1 PUSH4 0x1794BB3C EQ PUSH2 0x1B6 JUMPI DUP1 PUSH4 0x187F3334 EQ PUSH2 0x1EE JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x14D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x13C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH2 0x3C3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x187 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x177 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3FF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x1CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x425 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1F6 PUSH2 0x583 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1F6 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x21E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x589 JUMP JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x244 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x6F1 JUMP JUMPDEST PUSH2 0x262 PUSH2 0x915 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x294 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x924 JUMP JUMPDEST PUSH2 0x1EC PUSH2 0x953 JUMP JUMPDEST PUSH2 0x262 PUSH2 0x9FF JUMP JUMPDEST PUSH2 0x1F6 PUSH2 0xA0F JUMP JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x2E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0xCAB JUMP JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x324 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xCE7 JUMP JUMPDEST PUSH2 0x333 PUSH2 0xDAF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x365 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xDC5 JUMP JUMPDEST PUSH2 0x374 PUSH2 0xEC0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0xFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x333 PUSH2 0xED3 JUMP JUMPDEST PUSH2 0x262 PUSH2 0xEE2 JUMP JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xEF1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL EQ DUP1 PUSH2 0x3F7 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT EQ JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x69 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV AND DUP3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x43E JUMPI POP PUSH2 0x43E PUSH2 0xFF4 JUMP JUMPDEST DUP1 PUSH2 0x44C JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x487 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1773 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x4B2 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x4BA PUSH2 0x1005 JUMP JUMPDEST PUSH2 0x4C2 PUSH2 0x10B7 JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH4 0xFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xE0 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x65 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SWAP3 SSTORE PUSH1 0x66 DUP1 SLOAD SWAP3 DUP7 AND SWAP3 SWAP1 SWAP2 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x51F DUP3 PUSH2 0xDC5 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x65 SLOAD PUSH1 0x67 SLOAD PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND SWAP4 SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x10F27652C1015195CA7E6BC9B4C724CBF18E91C42117D92124703A3F49BB240F SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 DUP1 ISZERO PUSH2 0x57D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x67 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x593 PUSH2 0xA0F JUMP JUMPDEST POP PUSH2 0x59D DUP3 PUSH2 0x10C7 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP1 SWAP3 SSTORE PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV SWAP1 SWAP2 AND SWAP1 PUSH2 0x5F8 SWAP1 PUSH2 0x5F3 SWAP1 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP4 PUSH2 0x126C JUMP JUMPDEST PUSH2 0x12CE JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP3 SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x70 SHL MUL PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x70 SHL NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP6 SWAP1 MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xA9059CBB SWAP2 PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x680 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x694 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP2 PUSH32 0xD8138F8A3F377C5259CA548E70E4C2DE94F129F5A11036A15B69513CBA2B426A SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x6F9 PUSH2 0x1316 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x70A PUSH2 0x9FF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x753 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x17C2 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x75B PUSH2 0xA0F JUMP JUMPDEST POP PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x7A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x7BB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x7D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x68 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0x7F7 SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND PUSH2 0x126C JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x84E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6B656E4661756365742F696E73756666696369656E742D66756E64730000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xA9059CBB SWAP2 PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x8A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8B8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x8CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND SWAP2 PUSH32 0x7084F5476618D8E60B11EF0D7D3F06914655ADB8793E28FF7F018D4C76D505D5 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 POP POP POP POP JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x57D JUMPI PUSH2 0x942 PUSH2 0xA0F JUMP JUMPDEST POP PUSH2 0x94C DUP5 PUSH2 0x10C7 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x95B PUSH2 0x1316 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x96C PUSH2 0x9FF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x9B5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x17C2 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xA1A PUSH2 0x10B7 JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH4 0xFFFFFFFF SWAP2 DUP3 AND SWAP3 POP PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV AND DUP2 EQ ISZERO PUSH2 0xA40 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0xA0C JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xA9F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xAB5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x68 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0xADB SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND PUSH2 0x126C JUMP JUMPDEST PUSH1 0x68 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0xB00 SWAP1 DUP6 SWAP1 PUSH4 0xFFFFFFFF PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 SWAP2 DIV DUP2 AND SWAP1 PUSH2 0x126C AND JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x18160DDD PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD SWAP4 SWAP5 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP1 SWAP3 AND SWAP3 PUSH1 0x0 SWAP3 DUP4 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x18160DDD SWAP2 PUSH1 0x4 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB5A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xB6E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xB84 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 ISZERO DUP1 ISZERO SWAP1 PUSH2 0xB97 JUMPI POP PUSH1 0x0 DUP6 GT JUMPDEST ISZERO PUSH2 0xC09 JUMPI PUSH1 0x67 SLOAD PUSH2 0xBAA SWAP1 DUP6 SWAP1 PUSH2 0x131A JUMP JUMPDEST SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0xBB8 JUMPI DUP5 SWAP2 POP JUMPDEST PUSH1 0x0 PUSH2 0xBC4 DUP4 DUP4 PUSH2 0x137A JUMP JUMPDEST SWAP1 POP PUSH2 0xBD0 DUP5 DUP3 PUSH2 0x13A3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP6 POP PUSH32 0x7DE59A92C9386255180C28EDE4B61EDB9B7B2AC96855AC634151489CEF21BAD6 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH2 0xC12 DUP4 PUSH2 0x12CE JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP3 DUP4 AND OR SWAP1 DUP2 SWAP1 SSTORE PUSH2 0xC4D SWAP2 PUSH2 0x5F3 SWAP2 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV AND DUP5 PUSH2 0x13A3 JUMP JUMPDEST PUSH1 0x68 PUSH1 0xE PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND MUL OR SWAP1 SSTORE POP PUSH2 0xC7C DUP8 PUSH2 0x13FD JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH4 0xFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xE0 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP SWAP6 POP POP POP POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND SWAP2 AND EQ DUP1 ISZERO PUSH2 0xCD0 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x57D JUMPI PUSH2 0xCDD PUSH2 0xA0F JUMP JUMPDEST POP PUSH2 0x942 DUP4 PUSH2 0x10C7 JUMP JUMPDEST PUSH2 0xCEF PUSH2 0xA0F JUMP JUMPDEST POP PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x23B872DD SWAP2 PUSH1 0x64 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD5E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xD74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD CALLER SWAP2 PUSH32 0x2DA466A7B24304F47E87FA2E1E5A81B9831CE54FEC19055CE277CA2F39BA42C4 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0xDCD PUSH2 0x1316 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xDDE PUSH2 0x9FF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xE27 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x17C2 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 GT PUSH2 0xE7C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6B656E4661756365742F64726970526174652D67742D7A65726F00000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xE84 PUSH2 0xA0F JUMP JUMPDEST POP PUSH1 0x67 DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3D38E7CD2E029035006F9977A727C8724CD41DFFB6D2A40D9F66BD4C26836A32 SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0xEF9 PUSH2 0x1316 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF0A PUSH2 0x9FF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xF53 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x17C2 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0xF98 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1726 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFFF ADDRESS PUSH2 0x1442 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x101E JUMPI POP PUSH2 0x101E PUSH2 0xFF4 JUMP JUMPDEST DUP1 PUSH2 0x102C JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1067 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1773 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1092 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x109A PUSH2 0x1448 JUMP JUMPDEST PUSH2 0x10A2 PUSH2 0x14E8 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x10B4 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10C2 TIMESTAMP PUSH2 0x13FD JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 SWAP2 AND EQ ISZERO PUSH2 0x1108 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x3FA JUMP JUMPDEST DUP1 SLOAD PUSH1 0x68 SLOAD PUSH1 0x0 SWAP2 PUSH2 0x112C SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x126C JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP2 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP4 SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x117F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1193 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x11A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x11C1 PUSH2 0x11BC DUP4 DUP6 PUSH2 0x15E1 JUMP JUMPDEST PUSH2 0x1602 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP2 MSTORE DUP6 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x20 DUP3 ADD SWAP1 PUSH2 0x1206 SWAP1 PUSH2 0x11BC SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND SWAP1 DUP7 AND PUSH2 0x13A3 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP4 MLOAD DUP2 SLOAD SWAP5 SWAP1 SWAP3 ADD MLOAD DUP4 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP2 DUP4 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP2 AND OR SWAP1 SSTORE SWAP4 POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x12C3 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x70 SHL DUP3 LT PUSH2 0x1312 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x17E2 PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1329 JUMPI POP PUSH1 0x0 PUSH2 0x12C8 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x1336 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x1373 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x17A1 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x138F DUP5 PUSH8 0xDE0B6B3A7640000 PUSH2 0x131A JUMP JUMPDEST SWAP1 POP PUSH2 0x139B DUP2 DUP5 PUSH2 0x1646 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1373 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH5 0x100000000 DUP3 LT PUSH2 0x1312 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x180B PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1461 JUMPI POP PUSH2 0x1461 PUSH2 0xFF4 JUMP JUMPDEST DUP1 PUSH2 0x146F JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x14AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1773 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x10A2 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x10B4 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1501 JUMPI POP PUSH2 0x1501 PUSH2 0xFF4 JUMP JUMPDEST DUP1 PUSH2 0x150F JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x154A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1773 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1575 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x157F PUSH2 0x1316 JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x10B4 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x15EE DUP4 DUP6 PUSH2 0x131A JUMP JUMPDEST SWAP1 POP PUSH2 0x139B DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x1646 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x1312 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x174C PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1373 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH1 0x0 DUP2 DUP4 PUSH2 0x170F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x16D4 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x16BC JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1701 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x171B JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP INVALID 0x4F PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F206164647265737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E203132382062697473496E697469 PUSH2 0x6C69 PUSH27 0x61626C653A20636F6E747261637420697320616C72656164792069 PUSH15 0x697469616C697A6564536166654D61 PUSH21 0x683A206D756C7469706C69636174696F6E206F7665 PUSH19 0x666C6F774F776E61626C653A2063616C6C6572 KECCAK256 PUSH10 0x73206E6F742074686520 PUSH16 0x776E657253616665436173743A207661 PUSH13 0x756520646F65736E2774206669 PUSH21 0x20696E20616E2075696E7431313253616665436173 PUSH21 0x3A2076616C756520646F65736E2774206669742069 PUSH15 0x2033322062697473A2646970667358 0x22 SLT KECCAK256 0xCA SWAP1 0xE0 XOR 0xC7 PUSH14 0xDA1F3B271AF212DEB27B3E80278B 0xA6 0xDC DUP10 0x4D DIFFICULTY 0xAF TIMESTAMP RETURNDATASIZE CALLDATACOPY PUSH2 0x5770 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "135:2198:68:-:0;;;321:219;;;;;;;;;;356:41;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;356:41:68;;;;;;;;;;;;;;;;-1:-1:-1;;;356:41:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;348:5:68;:49;;-1:-1:-1;;;;;;348:49:68;-1:-1:-1;;;;;348:49:68;;;;;;;;;;413:42;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;413:42:68;;;;;;;;;;;;;;;;-1:-1:-1;;;413:42:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;403:7:68;:52;;-1:-1:-1;;;;;;403:52:68;-1:-1:-1;;;;;403:52:68;;;;;;;;;;470:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;461:6:68;:26;;-1:-1:-1;;;;;;461:26:68;-1:-1:-1;;;;;461:26:68;;;;;;;-1:-1:-1;511:5:68;518:7;;493:42;;;-1:-1:-1;;;493:42:68;;511:5;;;493:42;;;;518:7;;;493:42;;;;527:7;493:42;;;;;:6;;;;;:17;;:42;;;;;461:6;;493:42;;;;;461:6;493;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;135:2198;;;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506004361061009e5760003560e01c8063a0712d6811610066578063a0712d6814610127578063a9059cbb14610144578063b107aea114610170578063de5f72fd14610178578063efa9a1ad146101805761009e565b80632879d7c7146100a357806338d52e0f146100c257806342966c68146100e65780634e71d92d146101035780636cd8b16d1461010b575b600080fd5b6100c0600480360360208110156100b957600080fd5b5035610188565b005b6100ca61025f565b604080516001600160a01b039092168252519081900360200190f35b6100c0600480360360208110156100fc57600080fd5b503561026e565b6100c06103fa565b61011361048c565b604080519115158252519081900360200190f35b6100c06004803603602081101561013d57600080fd5b5035610594565b6100c06004803603604081101561015a57600080fd5b506001600160a01b038135169060200135610691565b610113610812565b6100ca6108a0565b6100ca6108af565b60007da7c5ac471b4784230fcf80dc33721d53cddd6e04c059210385c67dfe32a082116101b557816101bc565b620186a082045b600380548201908190559091508111156101d257fe5b60015460008054604080516340c10f1960e01b81526001600160a01b03928316600482015260248101869052905191909316926340c10f199260448083019360209390929083900390910190829087803b15801561022f57600080fd5b505af1158015610243573d6000803e3d6000fd5b505050506040513d602081101561025957600080fd5b50505050565b6001546001600160a01b031681565b600254604080516370a0823160e01b815233600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156102b957600080fd5b505afa1580156102cd573d6000803e3d6000fd5b505050506040513d60208110156102e357600080fd5b5051905060008183116102f657826102f8565b815b600080546002546040805163b221095760e01b815233600482015260248101859052604481018690526001600160a01b039283166064820152905194955091169263b22109579260848084019391929182900301818387803b15801561035d57600080fd5b505af1158015610371573d6000803e3d6000fd5b505060025460408051632770a7eb60e21b81523360048201526024810186905290516001600160a01b039092169350639dc29fac92506044808201926020929091908290030181600087803b1580156103c957600080fd5b505af11580156103dd573d6000803e3d6000fd5b505050506040513d60208110156103f357600080fd5b5050505050565b6000805460408051630f41a04d60e11b815233600482015290516001600160a01b0390921691631e83409a9160248082019260209290919082900301818787803b15801561044757600080fd5b505af115801561045b573d6000803e3d6000fd5b505050506040513d602081101561047157600080fd5b50516004805482019081905590915081111561048957fe5b50565b60015460008054604080516370a0823160e01b81526001600160a01b0392831660048201529051929391909116916370a0823191602480820192602092909190829003018186803b1580156104e057600080fd5b505afa1580156104f4573d6000803e3d6000fd5b505050506040513d602081101561050a57600080fd5b50516000546040805163192de29760e31b815290516001600160a01b039092169163c96f14b891600480820192602092909190829003018186803b15801561055157600080fd5b505afa158015610565573d6000803e3d6000fd5b505050506040513d602081101561057b57600080fd5b50516dffffffffffffffffffffffffffff161115905090565b60008054600254604080516304d7f3db60e41b8152336004820152602481018690526001600160a01b0392831660448201526064810185905290519190921692634d7f3db0926084808201939182900301818387803b1580156105f657600080fd5b505af115801561060a573d6000803e3d6000fd5b5050600254604080516340c10f1960e01b81523360048201526024810186905290516001600160a01b0390921693506340c10f1992506044808201926020929091908290030181600087803b15801561066257600080fd5b505af1158015610676573d6000803e3d6000fd5b505050506040513d602081101561068c57600080fd5b505050565b600254604080516370a0823160e01b815233600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156106dc57600080fd5b505afa1580156106f0573d6000803e3d6000fd5b505050506040513d602081101561070657600080fd5b505190506000818311610719578261071b565b815b600080546002546040805163b221095760e01b81523360048201526001600160a01b038a81166024830152604482018790529283166064820152905194955091169263b22109579260848084019391929182900301818387803b15801561078157600080fd5b505af1158015610795573d6000803e3d6000fd5b505060025460408051631c9c790360e01b81523360048201526001600160a01b038981166024830152604482018790529151919092169350631c9c79039250606480830192600092919082900301818387803b1580156107f457600080fd5b505af1158015610808573d6000803e3d6000fd5b5050505050505050565b60015460008054604080516370a0823160e01b81526001600160a01b0392831660048201529051929391909116916370a0823191602480820192602092909190829003018186803b15801561086657600080fd5b505afa15801561087a573d6000803e3d6000fd5b505050506040513d602081101561089057600080fd5b5051600454600354910114905090565b6000546001600160a01b031681565b6002546001600160a01b03168156fea264697066735822122077127690c6553e47db55e4f2b81dd3f504325f68608c7b4b5fe86b9c787bd81664736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x9E JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA0712D68 GT PUSH2 0x66 JUMPI DUP1 PUSH4 0xA0712D68 EQ PUSH2 0x127 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x144 JUMPI DUP1 PUSH4 0xB107AEA1 EQ PUSH2 0x170 JUMPI DUP1 PUSH4 0xDE5F72FD EQ PUSH2 0x178 JUMPI DUP1 PUSH4 0xEFA9A1AD EQ PUSH2 0x180 JUMPI PUSH2 0x9E JUMP JUMPDEST DUP1 PUSH4 0x2879D7C7 EQ PUSH2 0xA3 JUMPI DUP1 PUSH4 0x38D52E0F EQ PUSH2 0xC2 JUMPI DUP1 PUSH4 0x42966C68 EQ PUSH2 0xE6 JUMPI DUP1 PUSH4 0x4E71D92D EQ PUSH2 0x103 JUMPI DUP1 PUSH4 0x6CD8B16D EQ PUSH2 0x10B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC0 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xB9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x188 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xCA PUSH2 0x25F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0xC0 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xFC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x26E JUMP JUMPDEST PUSH2 0xC0 PUSH2 0x3FA JUMP JUMPDEST PUSH2 0x113 PUSH2 0x48C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0xC0 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x13D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x594 JUMP JUMPDEST PUSH2 0xC0 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x15A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x691 JUMP JUMPDEST PUSH2 0x113 PUSH2 0x812 JUMP JUMPDEST PUSH2 0xCA PUSH2 0x8A0 JUMP JUMPDEST PUSH2 0xCA PUSH2 0x8AF JUMP JUMPDEST PUSH1 0x0 PUSH30 0xA7C5AC471B4784230FCF80DC33721D53CDDD6E04C059210385C67DFE32A0 DUP3 GT PUSH2 0x1B5 JUMPI DUP2 PUSH2 0x1BC JUMP JUMPDEST PUSH3 0x186A0 DUP3 DIV JUMPDEST PUSH1 0x3 DUP1 SLOAD DUP3 ADD SWAP1 DUP2 SWAP1 SSTORE SWAP1 SWAP2 POP DUP2 GT ISZERO PUSH2 0x1D2 JUMPI INVALID JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x40C10F19 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE SWAP1 MLOAD SWAP2 SWAP1 SWAP4 AND SWAP3 PUSH4 0x40C10F19 SWAP3 PUSH1 0x44 DUP1 DUP4 ADD SWAP4 PUSH1 0x20 SWAP4 SWAP1 SWAP3 SWAP1 DUP4 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 DUP3 SWAP1 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x22F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x243 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x259 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2CD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 DUP2 DUP4 GT PUSH2 0x2F6 JUMPI DUP3 PUSH2 0x2F8 JUMP JUMPDEST DUP2 JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x44 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP5 SWAP6 POP SWAP2 AND SWAP3 PUSH4 0xB2210957 SWAP3 PUSH1 0x84 DUP1 DUP5 ADD SWAP4 SWAP2 SWAP3 SWAP2 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x35D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x371 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x2770A7EB PUSH1 0xE2 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP4 POP PUSH4 0x9DC29FAC SWAP3 POP PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3DD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xF41A04D PUSH1 0xE1 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x1E83409A SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x447 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x45B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x471 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x4 DUP1 SLOAD DUP3 ADD SWAP1 DUP2 SWAP1 SSTORE SWAP1 SWAP2 POP DUP2 GT ISZERO PUSH2 0x489 JUMPI INVALID JUMPDEST POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD SWAP3 SWAP4 SWAP2 SWAP1 SWAP2 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x4F4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x50A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x192DE297 PUSH1 0xE3 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0xC96F14B8 SWAP2 PUSH1 0x4 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x551 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x565 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x57B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND GT ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 PUSH4 0x4D7F3DB0 SWAP3 PUSH1 0x84 DUP1 DUP3 ADD SWAP4 SWAP2 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x60A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x40C10F19 PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP4 POP PUSH4 0x40C10F19 SWAP3 POP PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x662 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x676 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x68C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x6F0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x706 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 DUP2 DUP4 GT PUSH2 0x719 JUMPI DUP3 PUSH2 0x71B JUMP JUMPDEST DUP2 JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP8 SWAP1 MSTORE SWAP3 DUP4 AND PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP5 SWAP6 POP SWAP2 AND SWAP3 PUSH4 0xB2210957 SWAP3 PUSH1 0x84 DUP1 DUP5 ADD SWAP4 SWAP2 SWAP3 SWAP2 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x781 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x795 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x2 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x1C9C7903 PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP8 SWAP1 MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP4 POP PUSH4 0x1C9C7903 SWAP3 POP PUSH1 0x64 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x7F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x808 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD SWAP3 SWAP4 SWAP2 SWAP1 SWAP2 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x866 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x87A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x890 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x4 SLOAD PUSH1 0x3 SLOAD SWAP2 ADD EQ SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH24 0x127690C6553E47DB55E4F2B81DD3F504325F68608C7B4B5F 0xE8 PUSH12 0x9C787BD81664736F6C634300 MOD 0xC STOP CALLER ",
              "sourceMap": "135:2198:68:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;544:276;;;;;;;;;;;;;;;;-1:-1:-1;544:276:68;;:::i;:::-;;197:26;;;:::i;:::-;;;;-1:-1:-1;;;;;197:26:68;;;;;;;;;;;;;;1307:293;;;;;;;;;;;;;;;;-1:-1:-1;1307:293:68;;:::i;1604:157::-;;;:::i;1861:154::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;824:160;;;;;;;;;;;;;;;;-1:-1:-1;824:160:68;;:::i;988:315::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;988:315:68;;;;;;;;:::i;2148:182::-;;;:::i;168:25::-;;;:::i;227:28::-;;;:::i;544:276::-;595:20;627:26;618:35;;:62;;674:6;618:62;;;665:6;656;:15;618:62;686:18;:34;;;;;;;;595:85;;-1:-1:-1;733:34:68;-1:-1:-1;733:34:68;726:42;;;;774:5;;;793:6;;774:41;;;-1:-1:-1;;;774:41:68;;-1:-1:-1;;;;;793:6:68;;;774:41;;;;;;;;;;;;:5;;;;;:10;;:41;;;;;;;;;;;;;;;;;;;:5;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;544:276:68:o;197:26::-;;;-1:-1:-1;;;;;197:26:68;;:::o;1307:293::-;1370:7;;:29;;;-1:-1:-1;;;1370:29:68;;1388:10;1370:29;;;;;;1352:15;;-1:-1:-1;;;;;1370:7:68;;:17;;:29;;;;;;;;;;;;;;:7;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1370:29:68;;-1:-1:-1;1405:20:68;1428:16;;;:35;;1457:6;1428:35;;;1447:7;1428:35;1469:6;;;1542:7;;1469:82;;;-1:-1:-1;;;1469:82:68;;1496:10;1469:82;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1542:7:68;;;1469:82;;;;;;1405:58;;-1:-1:-1;1469:6:68;;;:26;;:82;;;;;:6;;:82;;;;;;:6;;:82;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1557:7:68;;:38;;;-1:-1:-1;;;1557:38:68;;1570:10;1557:38;;;;;;;;;;;;-1:-1:-1;;;;;1557:7:68;;;;-1:-1:-1;1557:12:68;;-1:-1:-1;1557:38:68;;;;;;;;;;;;;;;:7;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1307:293:68:o;1604:157::-;1636:15;1654:6;;:24;;;-1:-1:-1;;;1654:24:68;;1667:10;1654:24;;;;;;-1:-1:-1;;;;;1654:6:68;;;;:12;;:24;;;;;;;;;;;;;;;1636:15;1654:6;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1654:24:68;1684:18;:29;;;;;;;;1654:24;;-1:-1:-1;1726:29:68;-1:-1:-1;1726:29:68;1719:37;;;;1604:157;:::o;1861:154::-;1978:5;;1932:4;2002:6;;1978:32;;;-1:-1:-1;;;1978:32:68;;-1:-1:-1;;;;;2002:6:68;;;1978:32;;;;;;1932:4;;1978:5;;;;;:15;;:32;;;;;;;;;;;;;;;:5;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1978:32:68;1951:6;;:23;;;-1:-1:-1;;;1951:23:68;;;;-1:-1:-1;;;;;1951:6:68;;;;:21;;:23;;;;;1978:32;;1951:23;;;;;;;;:6;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1951:23:68;:59;;;;;-1:-1:-1;1861:154:68;:::o;824:160::-;869:6;;;920:7;;869:72;;;-1:-1:-1;;;869:72:68;;892:10;869:72;;;;;;;;;;-1:-1:-1;;;;;920:7:68;;;869:72;;;;;;;;;;;;:6;;;;;:22;;:72;;;;;;;;;;;:6;;:72;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;947:7:68;;:32;;;-1:-1:-1;;;947:32:68;;960:10;947:32;;;;;;;;;;;;-1:-1:-1;;;;;947:7:68;;;;-1:-1:-1;947:12:68;;-1:-1:-1;947:32:68;;;;;;;;;;;;;;;:7;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;824:160:68:o;988:315::-;1067:7;;:29;;;-1:-1:-1;;;1067:29:68;;1085:10;1067:29;;;;;;1049:15;;-1:-1:-1;;;;;1067:7:68;;:17;;:29;;;;;;;;;;;;;;:7;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1067:29:68;;-1:-1:-1;1102:20:68;1125:16;;;:35;;1154:6;1125:35;;;1144:7;1125:35;1166:6;;;1231:7;;1166:74;;;-1:-1:-1;;;1166:74:68;;1193:10;1166:74;;;;-1:-1:-1;;;;;1166:74:68;;;;;;;;;;;;;1231:7;;;1166:74;;;;;;1102:58;;-1:-1:-1;1166:6:68;;;:26;;:74;;;;;:6;;:74;;;;;;:6;;:74;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1246:7:68;;:52;;;-1:-1:-1;;;1246:52:68;;1269:10;1246:52;;;;-1:-1:-1;;;;;1246:52:68;;;;;;;;;;;;;;;:7;;;;;-1:-1:-1;1246:22:68;;-1:-1:-1;1246:52:68;;;;;:7;;:52;;;;;;;:7;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;988:315;;;;:::o;2148:182::-;2292:5;;2229:4;2316:6;;2292:32;;;-1:-1:-1;;;2292:32:68;;-1:-1:-1;;;;;2316:6:68;;;2292:32;;;;;;2229:4;;2292:5;;;;;:15;;:32;;;;;;;;;;;;;;;:5;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2292:32:68;2271:18;;2248;;2271:53;;2248:77;;-1:-1:-1;2148:182:68;:::o;168:25::-;;;-1:-1:-1;;;;;168:25:68;;:::o;227:28::-;;;-1:-1:-1;;;;;227:28:68;;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "458400",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "asset()": "1060",
                "burn(uint256)": "infinite",
                "claim()": "infinite",
                "dripAssets(uint256)": "infinite",
                "echidna_total_dripped_eq_claimed_plus_balance()": "infinite",
                "echidna_total_unclaimed_lte_balance()": "infinite",
                "faucet()": "1103",
                "measure()": "1125",
                "mint(uint256)": "infinite",
                "transfer(address,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {
              "asset()": "38d52e0f",
              "burn(uint256)": "42966c68",
              "claim()": "4e71d92d",
              "dripAssets(uint256)": "2879d7c7",
              "echidna_total_dripped_eq_claimed_plus_balance()": "b107aea1",
              "echidna_total_unclaimed_lte_balance()": "6cd8b16d",
              "faucet()": "de5f72fd",
              "measure()": "efa9a1ad",
              "mint(uint256)": "a0712d68",
              "transfer(address,uint256)": "a9059cbb"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"asset\",\"outputs\":[{\"internalType\":\"contract ERC20Mintable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"dripAssets\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"echidna_total_dripped_eq_claimed_plus_balance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"echidna_total_unclaimed_lte_balance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"faucet\",\"outputs\":[{\"internalType\":\"contract TokenFaucet\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"measure\",\"outputs\":[{\"internalType\":\"contract ERC20Mintable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"echidna_total_dripped_eq_claimed_plus_balance()\":{\"details\":\"Invariant: the balance of the faucet plus claimed tokens should always equal the total tokens dripped into the faucet\"},\"echidna_total_unclaimed_lte_balance()\":{\"details\":\"Invariant: total unclaimed tokens should never exceed the balance held by the faucet\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/EchidnaTokenFaucet.sol\":\"EchidnaTokenFaucet\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"contracts/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary Constants {\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC721 = 0x80ac58cd;\\n}\",\"keccak256\":\"0x5dc8f8bda4e9668a9ffae6a941774f849adcb368cc2275fd8a91e6ada8fad7fb\",\"license\":\"GPL-3.0\"},\"contracts/test/ERC20Mintable.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\\\";\\n\\n/**\\n * @dev Extension of {ERC20} that adds a set of accounts with the {MinterRole},\\n * which have permission to mint (create) new tokens as they see fit.\\n *\\n * At construction, the deployer of the contract is the only minter.\\n */\\ncontract ERC20Mintable is ERC20Upgradeable {\\n\\n    constructor(string memory _name, string memory _symbol) public {\\n        __ERC20_init(_name, _symbol);\\n    }\\n\\n    /**\\n     * @dev See {ERC20-_mint}.\\n     *\\n     * Requirements:\\n     *\\n     * - the caller must have the {MinterRole}.\\n     */\\n    function mint(address account, uint256 amount) public returns (bool) {\\n        _mint(account, amount);\\n        return true;\\n    }\\n\\n    function burn(address account, uint256 amount) public returns (bool) {\\n        _burn(account, amount);\\n        return true;\\n    }\\n\\n    function masterTransfer(address from, address to, uint256 amount) public {\\n        _transfer(from, to, amount);\\n    }\\n}\\n\",\"keccak256\":\"0x7734575f2e59cfc85b4c4a39c065f8b2c6ecc97c5d7b6d96c0749b0884eacb6f\"},\"contracts/test/EchidnaTokenFaucet.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token-faucet/TokenFaucet.sol\\\";\\nimport \\\"./ERC20Mintable.sol\\\";\\n\\ncontract EchidnaTokenFaucet {\\n\\n  TokenFaucet public faucet;\\n  ERC20Mintable public asset;\\n  ERC20Mintable public measure;\\n\\n  uint256 totalAssetsDripped;\\n  uint256 totalAssetsClaimed;\\n\\n  constructor() public {\\n    asset = new ERC20Mintable(\\\"Asset Token\\\", \\\"ASSET\\\");\\n    measure = new ERC20Mintable(\\\"Measure Token\\\", \\\"MEAS\\\");\\n    faucet = new TokenFaucet();\\n    faucet.initialize(asset, measure, 1 ether);\\n  }\\n\\n  function dripAssets(uint256 amount) external {\\n    uint256 actualAmount = amount > type(uint256).max / 100000 ? amount / 100000 : amount;\\n    totalAssetsDripped += actualAmount;\\n    assert(totalAssetsDripped >= actualAmount);\\n    asset.mint(address(faucet), actualAmount);\\n  }\\n\\n  function mint(uint256 amount) external {\\n    faucet.beforeTokenMint(msg.sender, amount, address(measure), address(0));\\n    measure.mint(msg.sender, amount);\\n  }\\n\\n  function transfer(address to, uint256 amount) external {\\n    uint256 balance = measure.balanceOf(msg.sender);\\n    uint256 actualAmount = amount > balance ? balance : amount;\\n    faucet.beforeTokenTransfer(msg.sender, to, actualAmount, address(measure));\\n    measure.masterTransfer(msg.sender, to, actualAmount);\\n  }\\n\\n  function burn(uint256 amount) external {\\n    uint256 balance = measure.balanceOf(msg.sender);\\n    uint256 actualAmount = amount > balance ? balance : amount;\\n    faucet.beforeTokenTransfer(msg.sender, address(0), actualAmount, address(measure));\\n    measure.burn(msg.sender, actualAmount);\\n  }\\n\\n  function claim() external {\\n    uint256 claimed = faucet.claim(msg.sender);\\n    totalAssetsClaimed += claimed;\\n    assert(totalAssetsClaimed >= claimed);\\n  }\\n\\n  /// @dev Invariant: total unclaimed tokens should never exceed the balance held by the faucet\\n  function echidna_total_unclaimed_lte_balance () external view returns (bool) {\\n    return faucet.totalUnclaimed() <= asset.balanceOf(address(faucet));\\n  }\\n\\n  /// @dev Invariant: the balance of the faucet plus claimed tokens should always equal the total tokens dripped into the faucet\\n  function echidna_total_dripped_eq_claimed_plus_balance () external view returns (bool) {\\n    return totalAssetsDripped == (totalAssetsClaimed + asset.balanceOf(address(faucet)));\\n  }\\n\\n}\",\"keccak256\":\"0x57cea94ae4be42ed8b6c1d3cabd03f0fa29d8793f84b76fde522219393ca193c\",\"license\":\"GPL-3.0\"},\"contracts/token-faucet/TokenFaucet.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\n\\nimport \\\"../utils/ExtendedSafeCast.sol\\\";\\nimport \\\"../token/TokenListener.sol\\\";\\n\\n/// @title Disburses a token at a fixed rate per second to holders of another token.\\n/// @notice The tokens are dripped at a \\\"drip rate per second\\\".  This is the number of tokens that\\n/// are dripped each second.  A user's share of the dripped tokens is based on how many 'measure' tokens they hold.\\n/* solium-disable security/no-block-members */\\ncontract TokenFaucet is OwnableUpgradeable, TokenListener {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using ExtendedSafeCast for uint256;\\n\\n  event Initialized(\\n    IERC20Upgradeable indexed asset,\\n    IERC20Upgradeable indexed measure,\\n    uint256 dripRatePerSecond\\n  );\\n\\n  event Dripped(\\n    uint256 newTokens\\n  );\\n\\n  event Deposited(\\n    address indexed user,\\n    uint256 amount\\n  );\\n\\n  event Withdrawn(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  event Claimed(\\n    address indexed user,\\n    uint256 newTokens\\n  );\\n\\n  event DripRateChanged(\\n    uint256 dripRatePerSecond\\n  );\\n\\n  struct UserState {\\n    uint128 lastExchangeRateMantissa;\\n    uint128 balance;\\n  }\\n\\n  /// @notice The token that is being disbursed\\n  IERC20Upgradeable public asset;\\n\\n  /// @notice The token that is user to measure a user's portion of disbursed tokens\\n  IERC20Upgradeable public measure;\\n\\n  /// @notice The total number of tokens that are disbursed each second\\n  uint256 public dripRatePerSecond;\\n\\n  /// @notice The cumulative exchange rate of measure token supply : dripped tokens\\n  uint112 public exchangeRateMantissa;\\n\\n  /// @notice The total amount of tokens that have been dripped but not claimed\\n  uint112 public totalUnclaimed;\\n\\n  /// @notice The timestamp at which the tokens were last dripped\\n  uint32 public lastDripTimestamp;\\n\\n  /// @notice The data structure that tracks when a user last received tokens\\n  mapping(address => UserState) public userStates;\\n\\n  /// @notice Initializes a new Comptroller V2\\n  /// @param _asset The asset to disburse to users\\n  /// @param _measure The token to use to measure a users portion\\n  /// @param _dripRatePerSecond The amount of the asset to drip each second\\n  function initialize (\\n    IERC20Upgradeable _asset,\\n    IERC20Upgradeable _measure,\\n    uint256 _dripRatePerSecond\\n  ) public initializer {\\n    __Ownable_init();\\n    lastDripTimestamp = _currentTime();\\n    asset = _asset;\\n    measure = _measure;\\n    setDripRatePerSecond(_dripRatePerSecond);\\n\\n    emit Initialized(\\n      asset,\\n      measure,\\n      dripRatePerSecond\\n    );\\n  }\\n\\n  /// @notice Safely deposits asset tokens into the faucet.  Must be pre-approved\\n  /// This should be used instead of transferring directly because the drip function must\\n  /// be called before receiving new assets.\\n  /// @param amount The amount of asset tokens to add (must be approved already)\\n  function deposit(uint256 amount) external {\\n    drip();\\n    asset.transferFrom(msg.sender, address(this), amount);\\n\\n    emit Deposited(msg.sender, amount);\\n  }\\n\\n  /// @notice Allows the owner to withdraw tokens that have not been dripped yet.\\n  /// @param to The address to withdraw to\\n  /// @param amount The amount to withdraw\\n  function withdrawTo(address to, uint256 amount) external onlyOwner {\\n    drip();\\n    uint256 assetTotalSupply = asset.balanceOf(address(this));\\n    uint256 availableTotalSupply = assetTotalSupply.sub(totalUnclaimed);\\n    require(amount <= availableTotalSupply, \\\"TokenFaucet/insufficient-funds\\\");\\n    asset.transfer(to, amount);\\n\\n    emit Withdrawn(to, amount);\\n  }\\n\\n  /// @notice Transfers all unclaimed tokens to the user\\n  /// @param user The user to claim tokens for\\n  /// @return The amount of tokens that were claimed.\\n  function claim(address user) external returns (uint256) {\\n    drip();\\n    _captureNewTokensForUser(user);\\n    uint256 balance = userStates[user].balance;\\n    userStates[user].balance = 0;\\n    totalUnclaimed = uint256(totalUnclaimed).sub(balance).toUint112();\\n    asset.transfer(user, balance);\\n\\n    emit Claimed(user, balance);\\n\\n    return balance;\\n  }\\n\\n  /// @notice Drips new tokens.\\n  /// @dev Should be called immediately before any measure token mints/transfers/burns\\n  /// @return The number of new tokens dripped.\\n  function drip() public returns (uint256) {\\n    uint256 currentTimestamp = _currentTime();\\n\\n    // this should only run once per block.\\n    if (lastDripTimestamp == uint32(currentTimestamp)) {\\n      return 0;\\n    }\\n\\n    uint256 assetTotalSupply = asset.balanceOf(address(this));\\n    uint256 availableTotalSupply = assetTotalSupply.sub(totalUnclaimed);\\n    uint256 newSeconds = currentTimestamp.sub(lastDripTimestamp);\\n    uint256 nextExchangeRateMantissa = exchangeRateMantissa;\\n    uint256 newTokens;\\n    uint256 measureTotalSupply = measure.totalSupply();\\n\\n    if (measureTotalSupply > 0 && availableTotalSupply > 0) {\\n      newTokens = newSeconds.mul(dripRatePerSecond);\\n      if (newTokens > availableTotalSupply) {\\n        newTokens = availableTotalSupply;\\n      }\\n      uint256 indexDeltaMantissa = FixedPoint.calculateMantissa(newTokens, measureTotalSupply);\\n      nextExchangeRateMantissa = nextExchangeRateMantissa.add(indexDeltaMantissa);\\n\\n      emit Dripped(\\n        newTokens\\n      );\\n    }\\n\\n    exchangeRateMantissa = nextExchangeRateMantissa.toUint112();\\n    totalUnclaimed = uint256(totalUnclaimed).add(newTokens).toUint112();\\n    lastDripTimestamp = currentTimestamp.toUint32();\\n\\n    return newTokens;\\n  }\\n\\n  /// @notice Allows the owner to set the drip rate per second.  This is the number of tokens that are dripped each second.\\n  /// @param _dripRatePerSecond The new drip rate in tokens per second\\n  function setDripRatePerSecond(uint256 _dripRatePerSecond) public onlyOwner {\\n    require(_dripRatePerSecond > 0, \\\"TokenFaucet/dripRate-gt-zero\\\");\\n\\n    // ensure we're all caught up\\n    drip();\\n\\n    dripRatePerSecond = _dripRatePerSecond;\\n\\n    emit DripRateChanged(dripRatePerSecond);\\n  }\\n\\n  /// @notice Captures new tokens for a user\\n  /// @dev This must be called before changes to the user's balance (i.e. before mint, transfer or burns)\\n  /// @param user The user to capture tokens for\\n  /// @return The number of new tokens\\n  function _captureNewTokensForUser(\\n    address user\\n  ) private returns (uint128) {\\n    UserState storage userState = userStates[user];\\n    if (exchangeRateMantissa == userState.lastExchangeRateMantissa) {\\n      // ignore if exchange rate is same\\n      return 0;\\n    }\\n    uint256 deltaExchangeRateMantissa = uint256(exchangeRateMantissa).sub(userState.lastExchangeRateMantissa);\\n    uint256 userMeasureBalance = measure.balanceOf(user);\\n    uint128 newTokens = FixedPoint.multiplyUintByMantissa(userMeasureBalance, deltaExchangeRateMantissa).toUint128();\\n\\n    userStates[user] = UserState({\\n      lastExchangeRateMantissa: exchangeRateMantissa,\\n      balance: uint256(userState.balance).add(newTokens).toUint128()\\n    });\\n\\n    return newTokens;\\n  }\\n\\n  /// @notice Should be called before a user mints new \\\"measure\\\" tokens.\\n  /// @param to The user who is minting the tokens\\n  /// @param token The token they are minting\\n  function beforeTokenMint(\\n    address to,\\n    uint256,\\n    address token,\\n    address\\n  )\\n    external\\n    override\\n  {\\n    if (token == address(measure)) {\\n      drip();\\n      _captureNewTokensForUser(to);\\n    }\\n  }\\n\\n  /// @notice Should be called before \\\"measure\\\" tokens are transferred or burned\\n  /// @param from The user who is sending the tokens\\n  /// @param to The user who is receiving the tokens\\n  /// @param token The token token they are burning\\n  function beforeTokenTransfer(\\n    address from,\\n    address to,\\n    uint256,\\n    address token\\n  )\\n    external\\n    override\\n  {\\n    // must be measure and not be minting\\n    if (token == address(measure) && from != address(0)) {\\n      drip();\\n      _captureNewTokensForUser(to);\\n      _captureNewTokensForUser(from);\\n    }\\n  }\\n\\n  /// @notice returns the current time.  Allows for override in testing.\\n  /// @return The current time (block.timestamp)\\n  function _currentTime() internal virtual view returns (uint32) {\\n    return block.timestamp.toUint32();\\n  }\\n\\n}\\n\",\"keccak256\":\"0x5ebdc4cebd97cf8ca5f0ad6829ce6a98a37fa40fa6e9058446e4acdb43ffcb45\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListener.sol\":{\"content\":\"pragma solidity ^0.6.4;\\n\\nimport \\\"./TokenListenerInterface.sol\\\";\\nimport \\\"./TokenListenerLibrary.sol\\\";\\nimport \\\"../Constants.sol\\\";\\n\\nabstract contract TokenListener is TokenListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER\\n    );\\n  }\\n}\\n\",\"keccak256\":\"0xb0e98d10b004602e1d4f4369a70e6382002dc0c0c5713698eb6a92943aef2265\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/ExtendedSafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary ExtendedSafeCast {\\n\\n  /**\\n    * @dev Converts an unsigned uint256 into a unsigned uint112.\\n    *\\n    * Requirements:\\n    *\\n    * - input must be less than or equal to maxUint112.\\n    */\\n  function toUint112(uint256 value) internal pure returns (uint112) {\\n    require(value < 2**112, \\\"SafeCast: value doesn't fit in an uint112\\\");\\n    return uint112(value);\\n  }\\n\\n  /**\\n    * @dev Converts an unsigned uint256 into a unsigned uint96.\\n    *\\n    * Requirements:\\n    *\\n    * - input must be less than or equal to maxUint96.\\n    */\\n  function toUint96(uint256 value) internal pure returns (uint96) {\\n    require(value < 2**96, \\\"SafeCast: value doesn't fit in an uint96\\\");\\n    return uint96(value);\\n  }\\n\\n}\",\"keccak256\":\"0x6c8940ba9b1789d362c550be1da5c667ad990e2ff22423ca2d11402e545d3057\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 13727,
                "contract": "contracts/test/EchidnaTokenFaucet.sol:EchidnaTokenFaucet",
                "label": "faucet",
                "offset": 0,
                "slot": "0",
                "type": "t_contract(TokenFaucet)15492"
              },
              {
                "astId": 13729,
                "contract": "contracts/test/EchidnaTokenFaucet.sol:EchidnaTokenFaucet",
                "label": "asset",
                "offset": 0,
                "slot": "1",
                "type": "t_contract(ERC20Mintable)13680"
              },
              {
                "astId": 13731,
                "contract": "contracts/test/EchidnaTokenFaucet.sol:EchidnaTokenFaucet",
                "label": "measure",
                "offset": 0,
                "slot": "2",
                "type": "t_contract(ERC20Mintable)13680"
              },
              {
                "astId": 13733,
                "contract": "contracts/test/EchidnaTokenFaucet.sol:EchidnaTokenFaucet",
                "label": "totalAssetsDripped",
                "offset": 0,
                "slot": "3",
                "type": "t_uint256"
              },
              {
                "astId": 13735,
                "contract": "contracts/test/EchidnaTokenFaucet.sol:EchidnaTokenFaucet",
                "label": "totalAssetsClaimed",
                "offset": 0,
                "slot": "4",
                "type": "t_uint256"
              }
            ],
            "types": {
              "t_contract(ERC20Mintable)13680": {
                "encoding": "inplace",
                "label": "contract ERC20Mintable",
                "numberOfBytes": "20"
              },
              "t_contract(TokenFaucet)15492": {
                "encoding": "inplace",
                "label": "contract TokenFaucet",
                "numberOfBytes": "20"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/test/ExtendedSafeCastExposed.sol": {
        "ExtendedSafeCastExposed": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "toUint112",
              "outputs": [
                {
                  "internalType": "uint112",
                  "name": "",
                  "type": "uint112"
                }
              ],
              "stateMutability": "pure",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "toUint96",
              "outputs": [
                {
                  "internalType": "uint96",
                  "name": "",
                  "type": "uint96"
                }
              ],
              "stateMutability": "pure",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506101e8806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80631cf887fc1461003b57806341d2aa6414610079575b600080fd5b6100586004803603602081101561005157600080fd5b50356100b9565b604080516bffffffffffffffffffffffff9092168252519081900360200190f35b6100966004803603602081101561008f57600080fd5b50356100ca565b604080516dffffffffffffffffffffffffffff9092168252519081900360200190f35b60006100c4826100d5565b92915050565b60006100c48261011d565b6000600160601b82106101195760405162461bcd60e51b81526004018080602001828103825260288152602001806101626028913960400191505060405180910390fd5b5090565b6000600160701b82106101195760405162461bcd60e51b815260040180806020018281038252602981526020018061018a6029913960400191505060405180910390fdfe53616665436173743a2076616c756520646f65736e27742066697420696e20616e2075696e74393653616665436173743a2076616c756520646f65736e27742066697420696e20616e2075696e74313132a264697066735822122026556dc2a51d6e2ed5b3c77d7e80b0b80a3ec8dcae73e4c5dbccacb3d46a38ea64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E8 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x36 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1CF887FC EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0x41D2AA64 EQ PUSH2 0x79 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x58 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x51 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xB9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x96 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x8F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xCA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xC4 DUP3 PUSH2 0xD5 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC4 DUP3 PUSH2 0x11D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x60 SHL DUP3 LT PUSH2 0x119 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x162 PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x70 SHL DUP3 LT PUSH2 0x119 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x18A PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT INVALID MSTORE8 PUSH2 0x6665 NUMBER PUSH2 0x7374 GASPRICE KECCAK256 PUSH23 0x616C756520646F65736E27742066697420696E20616E20 PUSH22 0x696E74393653616665436173743A2076616C75652064 PUSH16 0x65736E27742066697420696E20616E20 PUSH22 0x696E74313132A264697066735822122026556DC2A51D PUSH15 0x2ED5B3C77D7E80B0B80A3EC8DCAE73 0xE4 0xC5 0xDB 0xCC 0xAC 0xB3 0xD4 PUSH11 0x38EA64736F6C634300060C STOP CALLER ",
              "sourceMap": "66:273:69:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106100365760003560e01c80631cf887fc1461003b57806341d2aa6414610079575b600080fd5b6100586004803603602081101561005157600080fd5b50356100b9565b604080516bffffffffffffffffffffffff9092168252519081900360200190f35b6100966004803603602081101561008f57600080fd5b50356100ca565b604080516dffffffffffffffffffffffffffff9092168252519081900360200190f35b60006100c4826100d5565b92915050565b60006100c48261011d565b6000600160601b82106101195760405162461bcd60e51b81526004018080602001828103825260288152602001806101626028913960400191505060405180910390fd5b5090565b6000600160701b82106101195760405162461bcd60e51b815260040180806020018281038252602981526020018061018a6029913960400191505060405180910390fdfe53616665436173743a2076616c756520646f65736e27742066697420696e20616e2075696e74393653616665436173743a2076616c756520646f65736e27742066697420696e20616e2075696e74313132a264697066735822122026556dc2a51d6e2ed5b3c77d7e80b0b80a3ec8dcae73e4c5dbccacb3d46a38ea64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x36 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1CF887FC EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0x41D2AA64 EQ PUSH2 0x79 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x58 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x51 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xB9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x96 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x8F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xCA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xC4 DUP3 PUSH2 0xD5 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC4 DUP3 PUSH2 0x11D JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x60 SHL DUP3 LT PUSH2 0x119 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x162 PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x70 SHL DUP3 LT PUSH2 0x119 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x18A PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT INVALID MSTORE8 PUSH2 0x6665 NUMBER PUSH2 0x7374 GASPRICE KECCAK256 PUSH23 0x616C756520646F65736E27742066697420696E20616E20 PUSH22 0x696E74393653616665436173743A2076616C75652064 PUSH16 0x65736E27742066697420696E20616E20 PUSH22 0x696E74313132A264697066735822122026556DC2A51D PUSH15 0x2ED5B3C77D7E80B0B80A3EC8DCAE73 0xE4 0xC5 0xDB 0xCC 0xAC 0xB3 0xD4 PUSH11 0x38EA64736F6C634300060C STOP CALLER ",
              "sourceMap": "66:273:69:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;223:114;;;;;;;;;;;;;;;;-1:-1:-1;223:114:69;;:::i;:::-;;;;;;;;;;;;;;;;;;;103:117;;;;;;;;;;;;;;;;-1:-1:-1;103:117:69;;:::i;:::-;;;;;;;;;;;;;;;;;;;223:114;279:6;300:32;326:5;300:25;:32::i;:::-;293:39;223:114;-1:-1:-1;;223:114:69:o;103:117::-;160:7;182:33;209:5;182:26;:33::i;598:167:98:-;654:6;-1:-1:-1;;;676:5:98;:13;668:66;;;;-1:-1:-1;;;668:66:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;754:5:98;598:167::o;258:172::-;315:7;-1:-1:-1;;;338:5:98;:14;330:68;;;;-1:-1:-1;;;330:68:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "97600",
                "executionCost": "147",
                "totalCost": "97747"
              },
              "external": {
                "toUint112(uint256)": "infinite",
                "toUint96(uint256)": "infinite"
              }
            },
            "methodIdentifiers": {
              "toUint112(uint256)": "41d2aa64",
              "toUint96(uint256)": "1cf887fc"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"toUint112\",\"outputs\":[{\"internalType\":\"uint112\",\"name\":\"\",\"type\":\"uint112\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"toUint96\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/ExtendedSafeCastExposed.sol\":\"ExtendedSafeCastExposed\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/test/ExtendedSafeCastExposed.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"../utils/ExtendedSafeCast.sol\\\";\\n\\ncontract ExtendedSafeCastExposed {\\n  function toUint112(uint256 value) external pure returns (uint112) {\\n    return ExtendedSafeCast.toUint112(value);\\n  }\\n  function toUint96(uint256 value) external pure returns (uint96) {\\n    return ExtendedSafeCast.toUint96(value);\\n  }\\n}\",\"keccak256\":\"0x25fa3c9ae5b59ef3cf69c571a3a35c92dc531abf94543681ec46c8ce7592353e\"},\"contracts/utils/ExtendedSafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary ExtendedSafeCast {\\n\\n  /**\\n    * @dev Converts an unsigned uint256 into a unsigned uint112.\\n    *\\n    * Requirements:\\n    *\\n    * - input must be less than or equal to maxUint112.\\n    */\\n  function toUint112(uint256 value) internal pure returns (uint112) {\\n    require(value < 2**112, \\\"SafeCast: value doesn't fit in an uint112\\\");\\n    return uint112(value);\\n  }\\n\\n  /**\\n    * @dev Converts an unsigned uint256 into a unsigned uint96.\\n    *\\n    * Requirements:\\n    *\\n    * - input must be less than or equal to maxUint96.\\n    */\\n  function toUint96(uint256 value) internal pure returns (uint96) {\\n    require(value < 2**96, \\\"SafeCast: value doesn't fit in an uint96\\\");\\n    return uint96(value);\\n  }\\n\\n}\",\"keccak256\":\"0x6c8940ba9b1789d362c550be1da5c667ad990e2ff22423ca2d11402e545d3057\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/test/MappedSinglyLinkedListExposed.sol": {
        "MappedSinglyLinkedListExposed": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newAddress",
                  "type": "address"
                }
              ],
              "name": "addAddress",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address[]",
                  "name": "addresses",
                  "type": "address[]"
                }
              ],
              "name": "addAddresses",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "addressArray",
              "outputs": [
                {
                  "internalType": "address[]",
                  "name": "",
                  "type": "address[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "clearAll",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "addr",
                  "type": "address"
                }
              ],
              "name": "contains",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "initialize",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "prevAddress",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "addr",
                  "type": "address"
                }
              ],
              "name": "removeAddress",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50610750806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80635dbe47e81161005b5780635dbe47e8146101725780638129fc1c146101ac578063b6fac15a146101b4578063ebb689a1146101e25761007d565b80633628731c1461008257806338eada1c146100f45780633ce3a2d81461011a575b600080fd5b6100f26004803603602081101561009857600080fd5b8101906020810181356401000000008111156100b357600080fd5b8201836020820111156100c557600080fd5b803590602001918460208302840111640100000000831117156100e757600080fd5b5090925090506101ea565b005b6100f26004803603602081101561010a57600080fd5b50356001600160a01b031661022b565b610122610239565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561015e578181015183820152602001610146565b505050509050019250505060405180910390f35b6101986004803603602081101561018857600080fd5b50356001600160a01b031661024a565b604080519115158252519081900360200190f35b6100f261025c565b6100f2600480360360408110156101ca57600080fd5b506001600160a01b0381358116916020013516610268565b6100f2610274565b61022782828080602002602001604051908101604052809392919081815260200183836020028082843760009201829052509392505061027e9050565b5050565b6102366000826102b4565b50565b606061024560006103c8565b905090565b600061025681836104a8565b92915050565b61026660006104fa565b565b61022760008383610562565b610266600061067e565b60005b81518110156102af576102a78383838151811061029a57fe5b60200260200101516102b4565b600101610281565b505050565b6001600160a01b0381166001148015906102d657506001600160a01b03811615155b610319576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b6001600160a01b0381811660009081526001840160205260409020541615610378576040805162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481859191959609a1b604482015290519081900360640190fd5b60016000818152838201602052604080822080546001600160a01b039586168085529284208054969091166001600160a01b03199687161790559183905281549093169092179091558154019055565b606080826000015467ffffffffffffffff811180156103e657600080fd5b50604051908082528060200260200182016040528015610410578160200160208202803683370190505b50600160008181529085016020526040812054919250906001600160a01b03165b6001600160a01b0381161580159061045357506001600160a01b038116600114155b1561049f578083838151811061046557fe5b6001600160a01b03928316602091820292909201810191909152918116600090815260018088019093526040902054929091019116610431565b50909392505050565b60006001600160a01b0382166001148015906104cc57506001600160a01b03821615155b80156104f357506001600160a01b0382811660009081526001850160205260409020541615155b9392505050565b80541561053d576040805162461bcd60e51b815260206004820152600c60248201526b105b1c9958591e481a5b9a5d60a21b604482015290519081900360640190fd5b60016000818152918101602052604090912080546001600160a01b0319169091179055565b6001600160a01b03811660011480159061058457506001600160a01b03811615155b6105c7576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b6001600160a01b038281166000908152600185016020526040902054811690821614610630576040805162461bcd60e51b8152602060048201526013602482015272496e76616c696420707265764164647265737360681b604482015290519081900360640190fd5b6001600160a01b039081166000818152600185016020526040808220805495851683529082208054959094166001600160a01b03199586161790935552805490911690558054600019019055565b6001600081815290820160205260409020546001600160a01b03165b6001600160a01b038116158015906106bc57506001600160a01b038116600114155b156106f2576001600160a01b039081166000908152600183016020526040902080546001600160a01b031981169091551661069a565b50600160008181528282016020526040812080546001600160a01b031916909217909155905556fea26469706673582212205d3b06a806df677c11133d8cf3d3e1b5c9ac61d9b10fb3906b3434df5810f1aa64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x750 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x7D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x5DBE47E8 GT PUSH2 0x5B JUMPI DUP1 PUSH4 0x5DBE47E8 EQ PUSH2 0x172 JUMPI DUP1 PUSH4 0x8129FC1C EQ PUSH2 0x1AC JUMPI DUP1 PUSH4 0xB6FAC15A EQ PUSH2 0x1B4 JUMPI DUP1 PUSH4 0xEBB689A1 EQ PUSH2 0x1E2 JUMPI PUSH2 0x7D JUMP JUMPDEST DUP1 PUSH4 0x3628731C EQ PUSH2 0x82 JUMPI DUP1 PUSH4 0x38EADA1C EQ PUSH2 0xF4 JUMPI DUP1 PUSH4 0x3CE3A2D8 EQ PUSH2 0x11A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF2 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x98 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xB3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xE7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x1EA JUMP JUMPDEST STOP JUMPDEST PUSH2 0xF2 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x10A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x22B JUMP JUMPDEST PUSH2 0x122 PUSH2 0x239 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x15E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x146 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x198 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x188 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x24A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0xF2 PUSH2 0x25C JUMP JUMPDEST PUSH2 0xF2 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x268 JUMP JUMPDEST PUSH2 0xF2 PUSH2 0x274 JUMP JUMPDEST PUSH2 0x227 DUP3 DUP3 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD DUP3 SWAP1 MSTORE POP SWAP4 SWAP3 POP POP PUSH2 0x27E SWAP1 POP JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x236 PUSH1 0x0 DUP3 PUSH2 0x2B4 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x245 PUSH1 0x0 PUSH2 0x3C8 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x256 DUP2 DUP4 PUSH2 0x4A8 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x266 PUSH1 0x0 PUSH2 0x4FA JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x227 PUSH1 0x0 DUP4 DUP4 PUSH2 0x562 JUMP JUMPDEST PUSH2 0x266 PUSH1 0x0 PUSH2 0x67E JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x2AF JUMPI PUSH2 0x2A7 DUP4 DUP4 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x29A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x2B4 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x281 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x2D6 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO ISZERO JUMPDEST PUSH2 0x319 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xF PUSH1 0x24 DUP3 ADD MSTORE PUSH15 0x496E76616C69642061646472657373 PUSH1 0x88 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x378 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xD PUSH1 0x24 DUP3 ADD MSTORE PUSH13 0x105B1C9958591E481859191959 PUSH1 0x9A SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE DUP4 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP6 DUP7 AND DUP1 DUP6 MSTORE SWAP3 DUP5 KECCAK256 DUP1 SLOAD SWAP7 SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP7 DUP8 AND OR SWAP1 SSTORE SWAP2 DUP4 SWAP1 MSTORE DUP2 SLOAD SWAP1 SWAP4 AND SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 PUSH1 0x0 ADD SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x3E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x410 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x453 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST ISZERO PUSH2 0x49F JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x465 JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x20 SWAP2 DUP3 MUL SWAP3 SWAP1 SWAP3 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP1 DUP9 ADD SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP3 SWAP1 SWAP2 ADD SWAP2 AND PUSH2 0x431 JUMP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x4CC JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x4F3 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO ISZERO JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 SLOAD ISZERO PUSH2 0x53D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xC PUSH1 0x24 DUP3 ADD MSTORE PUSH12 0x105B1C9958591E481A5B9A5D PUSH1 0xA2 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP2 DUP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x584 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO ISZERO JUMPDEST PUSH2 0x5C7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xF PUSH1 0x24 DUP3 ADD MSTORE PUSH15 0x496E76616C69642061646472657373 PUSH1 0x88 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 AND SWAP1 DUP3 AND EQ PUSH2 0x630 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH19 0x496E76616C6964207072657641646472657373 PUSH1 0x68 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD SWAP6 DUP6 AND DUP4 MSTORE SWAP1 DUP3 KECCAK256 DUP1 SLOAD SWAP6 SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP6 DUP7 AND OR SWAP1 SWAP4 SSTORE MSTORE DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP1 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x6BC JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST ISZERO PUSH2 0x6F2 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP4 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP2 AND SWAP1 SWAP2 SSTORE AND PUSH2 0x69A JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE DUP3 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE SWAP1 SSTORE JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x5D EXTCODESIZE MOD 0xA8 MOD 0xDF PUSH8 0x7C11133D8CF3D3E1 0xB5 0xC9 0xAC PUSH2 0xD9B1 0xF 0xB3 SWAP1 PUSH12 0x3434DF5810F1AA64736F6C63 NUMBER STOP MOD 0xC STOP CALLER ",
              "sourceMap": "72:794:70:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506004361061007d5760003560e01c80635dbe47e81161005b5780635dbe47e8146101725780638129fc1c146101ac578063b6fac15a146101b4578063ebb689a1146101e25761007d565b80633628731c1461008257806338eada1c146100f45780633ce3a2d81461011a575b600080fd5b6100f26004803603602081101561009857600080fd5b8101906020810181356401000000008111156100b357600080fd5b8201836020820111156100c557600080fd5b803590602001918460208302840111640100000000831117156100e757600080fd5b5090925090506101ea565b005b6100f26004803603602081101561010a57600080fd5b50356001600160a01b031661022b565b610122610239565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561015e578181015183820152602001610146565b505050509050019250505060405180910390f35b6101986004803603602081101561018857600080fd5b50356001600160a01b031661024a565b604080519115158252519081900360200190f35b6100f261025c565b6100f2600480360360408110156101ca57600080fd5b506001600160a01b0381358116916020013516610268565b6100f2610274565b61022782828080602002602001604051908101604052809392919081815260200183836020028082843760009201829052509392505061027e9050565b5050565b6102366000826102b4565b50565b606061024560006103c8565b905090565b600061025681836104a8565b92915050565b61026660006104fa565b565b61022760008383610562565b610266600061067e565b60005b81518110156102af576102a78383838151811061029a57fe5b60200260200101516102b4565b600101610281565b505050565b6001600160a01b0381166001148015906102d657506001600160a01b03811615155b610319576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b6001600160a01b0381811660009081526001840160205260409020541615610378576040805162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481859191959609a1b604482015290519081900360640190fd5b60016000818152838201602052604080822080546001600160a01b039586168085529284208054969091166001600160a01b03199687161790559183905281549093169092179091558154019055565b606080826000015467ffffffffffffffff811180156103e657600080fd5b50604051908082528060200260200182016040528015610410578160200160208202803683370190505b50600160008181529085016020526040812054919250906001600160a01b03165b6001600160a01b0381161580159061045357506001600160a01b038116600114155b1561049f578083838151811061046557fe5b6001600160a01b03928316602091820292909201810191909152918116600090815260018088019093526040902054929091019116610431565b50909392505050565b60006001600160a01b0382166001148015906104cc57506001600160a01b03821615155b80156104f357506001600160a01b0382811660009081526001850160205260409020541615155b9392505050565b80541561053d576040805162461bcd60e51b815260206004820152600c60248201526b105b1c9958591e481a5b9a5d60a21b604482015290519081900360640190fd5b60016000818152918101602052604090912080546001600160a01b0319169091179055565b6001600160a01b03811660011480159061058457506001600160a01b03811615155b6105c7576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b6001600160a01b038281166000908152600185016020526040902054811690821614610630576040805162461bcd60e51b8152602060048201526013602482015272496e76616c696420707265764164647265737360681b604482015290519081900360640190fd5b6001600160a01b039081166000818152600185016020526040808220805495851683529082208054959094166001600160a01b03199586161790935552805490911690558054600019019055565b6001600081815290820160205260409020546001600160a01b03165b6001600160a01b038116158015906106bc57506001600160a01b038116600114155b156106f2576001600160a01b039081166000908152600183016020526040902080546001600160a01b031981169091551661069a565b50600160008181528282016020526040812080546001600160a01b031916909217909155905556fea26469706673582212205d3b06a806df677c11133d8cf3d3e1b5c9ac61d9b10fb3906b3434df5810f1aa64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x7D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x5DBE47E8 GT PUSH2 0x5B JUMPI DUP1 PUSH4 0x5DBE47E8 EQ PUSH2 0x172 JUMPI DUP1 PUSH4 0x8129FC1C EQ PUSH2 0x1AC JUMPI DUP1 PUSH4 0xB6FAC15A EQ PUSH2 0x1B4 JUMPI DUP1 PUSH4 0xEBB689A1 EQ PUSH2 0x1E2 JUMPI PUSH2 0x7D JUMP JUMPDEST DUP1 PUSH4 0x3628731C EQ PUSH2 0x82 JUMPI DUP1 PUSH4 0x38EADA1C EQ PUSH2 0xF4 JUMPI DUP1 PUSH4 0x3CE3A2D8 EQ PUSH2 0x11A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF2 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x98 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xB3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xE7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x1EA JUMP JUMPDEST STOP JUMPDEST PUSH2 0xF2 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x10A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x22B JUMP JUMPDEST PUSH2 0x122 PUSH2 0x239 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x15E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x146 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x198 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x188 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x24A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0xF2 PUSH2 0x25C JUMP JUMPDEST PUSH2 0xF2 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x268 JUMP JUMPDEST PUSH2 0xF2 PUSH2 0x274 JUMP JUMPDEST PUSH2 0x227 DUP3 DUP3 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD DUP3 SWAP1 MSTORE POP SWAP4 SWAP3 POP POP PUSH2 0x27E SWAP1 POP JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x236 PUSH1 0x0 DUP3 PUSH2 0x2B4 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x245 PUSH1 0x0 PUSH2 0x3C8 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x256 DUP2 DUP4 PUSH2 0x4A8 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x266 PUSH1 0x0 PUSH2 0x4FA JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x227 PUSH1 0x0 DUP4 DUP4 PUSH2 0x562 JUMP JUMPDEST PUSH2 0x266 PUSH1 0x0 PUSH2 0x67E JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x2AF JUMPI PUSH2 0x2A7 DUP4 DUP4 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x29A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x2B4 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x281 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x2D6 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO ISZERO JUMPDEST PUSH2 0x319 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xF PUSH1 0x24 DUP3 ADD MSTORE PUSH15 0x496E76616C69642061646472657373 PUSH1 0x88 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x378 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xD PUSH1 0x24 DUP3 ADD MSTORE PUSH13 0x105B1C9958591E481859191959 PUSH1 0x9A SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE DUP4 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP6 DUP7 AND DUP1 DUP6 MSTORE SWAP3 DUP5 KECCAK256 DUP1 SLOAD SWAP7 SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP7 DUP8 AND OR SWAP1 SSTORE SWAP2 DUP4 SWAP1 MSTORE DUP2 SLOAD SWAP1 SWAP4 AND SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 PUSH1 0x0 ADD SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x3E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x410 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x453 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST ISZERO PUSH2 0x49F JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x465 JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x20 SWAP2 DUP3 MUL SWAP3 SWAP1 SWAP3 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP1 DUP9 ADD SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP3 SWAP1 SWAP2 ADD SWAP2 AND PUSH2 0x431 JUMP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x4CC JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x4F3 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO ISZERO JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 SLOAD ISZERO PUSH2 0x53D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xC PUSH1 0x24 DUP3 ADD MSTORE PUSH12 0x105B1C9958591E481A5B9A5D PUSH1 0xA2 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP2 DUP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x584 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO ISZERO JUMPDEST PUSH2 0x5C7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xF PUSH1 0x24 DUP3 ADD MSTORE PUSH15 0x496E76616C69642061646472657373 PUSH1 0x88 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 AND SWAP1 DUP3 AND EQ PUSH2 0x630 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH19 0x496E76616C6964207072657641646472657373 PUSH1 0x68 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD SWAP6 DUP6 AND DUP4 MSTORE SWAP1 DUP3 KECCAK256 DUP1 SLOAD SWAP6 SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP6 DUP7 AND OR SWAP1 SWAP4 SSTORE MSTORE DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP1 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x6BC JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST ISZERO PUSH2 0x6F2 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP4 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP2 AND SWAP1 SWAP2 SSTORE AND PUSH2 0x69A JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE DUP3 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE SWAP1 SSTORE JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x5D EXTCODESIZE MOD 0xA8 MOD 0xDF PUSH8 0x7C11133D8CF3D3E1 0xB5 0xC9 0xAC PUSH2 0xD9B1 0xF 0xB3 SWAP1 PUSH12 0x3434DF5810F1AA64736F6C63 NUMBER STOP MOD 0xC STOP CALLER ",
              "sourceMap": "72:794:70:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;392:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;392:100:70;;-1:-1:-1;392:100:70;-1:-1:-1;392:100:70;:::i;:::-;;496:87;;;;;;;;;;;;;;;;-1:-1:-1;496:87:70;-1:-1:-1;;;;;496:87:70;;:::i;286:102::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;706:98;;;;;;;;;;;;;;;;-1:-1:-1;706:98:70;-1:-1:-1;;;;;706:98:70;;:::i;:::-;;;;;;;;;;;;;;;;;;223:59;;;:::i;587:115::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;587:115:70;;;;;;;;;;:::i;808:55::-;;;:::i;392:100::-;459:28;477:9;;459:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;459:28:70;;-1:-1:-1;;459:17:70;:28;-1:-1:-1;459:28:70:i;:::-;392:100;;:::o;496:87::-;551:27;:4;567:10;551:15;:27::i;:::-;496:87;:::o;286:102::-;333:16;364:19;:4;:17;:19::i;:::-;357:26;;286:102;:::o;706:98::-;761:4;780:19;761:4;794;780:13;:19::i;:::-;773:26;706:98;-1:-1:-1;;706:98:70:o;223:59::-;260:17;:4;:15;:17::i;:::-;223:59::o;587:115::-;660:37;:4;679:11;692:4;660:18;:37::i;808:55::-;843:15;:4;:13;:15::i;1213:183:99:-;1305:9;1300:92;1324:9;:16;1320:1;:20;1300:92;;;1355:30;1366:4;1372:9;1382:1;1372:12;;;;;;;;;;;;;;1355:10;:30::i;:::-;1342:3;;1300:92;;;;1213:183;;:::o;1597:371::-;-1:-1:-1;;;;;1682:22:99;;451:3;1682:22;;;;:50;;-1:-1:-1;;;;;;1708:24:99;;;;1682:50;1674:78;;;;;-1:-1:-1;;;1674:78:99;;;;;;;;;;;;-1:-1:-1;;;1674:78:99;;;;;;;;;;;;;;;-1:-1:-1;;;;;1766:27:99;;;1805:1;1766:27;;;:15;;;:27;;;;;;;:41;1758:67;;;;;-1:-1:-1;;;1758:67:99;;;;;;;;;;;;-1:-1:-1;;;1758:67:99;;;;;;;;;;;;;;;1861:15;:25;;;;:15;;;:25;;;;;;;;-1:-1:-1;;;;;1831:27:99;;;;;;;;;:55;;1861:25;;;;-1:-1:-1;;;;;;1831:55:99;;;;;;1892:25;;;;:38;;;;;;;;;;;1949:10;;:14;1936:27;;1597:371::o;3321:426::-;3388:16;3412:22;3451:4;:10;;;3437:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3437:25:99;-1:-1:-1;3512:15:99;3468:13;3512:25;;;:15;;;:25;;;;;;3412:50;;-1:-1:-1;3468:13:99;-1:-1:-1;;;;;3512:25:99;3543:182;-1:-1:-1;;;;;3550:28:99;;;;;;:58;;-1:-1:-1;;;;;;3582:26:99;;451:3;3582:26;;3550:58;3543:182;;;3633:14;3618:5;3624;3618:12;;;;;;;;-1:-1:-1;;;;;3618:29:99;;;:12;;;;;;;;;;:29;;;;3672:31;;;;;;;:15;;;;:31;;;;;;;3711:7;;;;;3672:31;3543:182;;;-1:-1:-1;3737:5:99;;3321:426;-1:-1:-1;;;3321:426:99:o;2879:178::-;2956:4;-1:-1:-1;;;;;2975:16:99;;451:3;2975:16;;;;:38;;-1:-1:-1;;;;;;2995:18:99;;;;2975:38;:77;;;;-1:-1:-1;;;;;;3017:21:99;;;3050:1;3017:21;;;:15;;;:21;;;;;;;:35;;2975:77;2968:84;2879:178;-1:-1:-1;;;2879:178:99:o;726:144::-;791:10;;:15;783:40;;;;;-1:-1:-1;;;783:40:99;;;;;;;;;;;;-1:-1:-1;;;783:40:99;;;;;;;;;;;;;;;451:3;829:25;;;;:15;;;:25;;;;;;:36;;-1:-1:-1;;;;;;829:36:99;;;;;;726:144::o;2266:365::-;-1:-1:-1;;;;;2369:16:99;;451:3;2369:16;;;;:38;;-1:-1:-1;;;;;;2389:18:99;;;;2369:38;2361:66;;;;;-1:-1:-1;;;2361:66:99;;;;;;;;;;;;-1:-1:-1;;;2361:66:99;;;;;;;;;;;;;;;-1:-1:-1;;;;;2441:28:99;;;;;;;:15;;;:28;;;;;;;;:36;;;;2433:68;;;;;-1:-1:-1;;;2433:68:99;;;;;;;;;;;;-1:-1:-1;;;2433:68:99;;;;;;;;;;;;;;;-1:-1:-1;;;;;2538:21:99;;;;;;;:15;;;:21;;;;;;;;2507:28;;;;;;;;:52;;2538:21;;;;-1:-1:-1;;;;;;2507:52:99;;;;;;;2572:21;2565:28;;;;;;;2612:10;;-1:-1:-1;;2612:14:99;2599:27;;2266:365::o;3872:394::-;3952:15;3927:22;3952:25;;;:15;;;:25;;;;;;-1:-1:-1;;;;;3952:25:99;3983:217;-1:-1:-1;;;;;3990:28:99;;;;;;:58;;-1:-1:-1;;;;;;4022:26:99;;451:3;4022:26;;3990:58;3983:217;;;-1:-1:-1;;;;;4080:31:99;;;4058:19;4080:31;;;:15;;;:31;;;;;;;-1:-1:-1;;;;;;4119:38:99;;;;;4080:31;3983:217;;;-1:-1:-1;451:3:99;4205:25;;;;:15;;;:25;;;;;:36;;-1:-1:-1;;;;;;4205:36:99;;;;;;;4247:14;;3872:394::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "374400",
                "executionCost": "411",
                "totalCost": "374811"
              },
              "external": {
                "addAddress(address)": "64732",
                "addAddresses(address[])": "infinite",
                "addressArray()": "infinite",
                "clearAll()": "infinite",
                "contains(address)": "1325",
                "initialize()": "21930",
                "removeAddress(address,address)": "64782"
              }
            },
            "methodIdentifiers": {
              "addAddress(address)": "38eada1c",
              "addAddresses(address[])": "3628731c",
              "addressArray()": "3ce3a2d8",
              "clearAll()": "ebb689a1",
              "contains(address)": "5dbe47e8",
              "initialize()": "8129fc1c",
              "removeAddress(address,address)": "b6fac15a"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAddress\",\"type\":\"address\"}],\"name\":\"addAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"name\":\"addAddresses\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"addressArray\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clearAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"contains\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"prevAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"removeAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/MappedSinglyLinkedListExposed.sol\":\"MappedSinglyLinkedListExposed\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/test/MappedSinglyLinkedListExposed.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\n\\ncontract MappedSinglyLinkedListExposed {\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n\\n  MappedSinglyLinkedList.Mapping list;\\n\\n  function initialize() external {\\n    list.initialize();\\n  }\\n\\n  function addressArray() external view returns (address[] memory) {\\n    return list.addressArray();\\n  }\\n\\n  function addAddresses(address[] calldata addresses) external {\\n    list.addAddresses(addresses);\\n  }\\n\\n  function addAddress(address newAddress) external {\\n    list.addAddress(newAddress);\\n  }\\n\\n  function removeAddress(address prevAddress, address addr) external {\\n    list.removeAddress(prevAddress, addr);\\n  }\\n\\n  function contains(address addr) external view returns (bool) {\\n    return list.contains(addr);\\n  }\\n\\n  function clearAll() external {\\n    list.clearAll();\\n  }\\n\\n}\",\"keccak256\":\"0x9462bf9888e5f5e225fc342117556b3fc251374a131a6a595b773a027ab549c2\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 14036,
                "contract": "contracts/test/MappedSinglyLinkedListExposed.sol:MappedSinglyLinkedListExposed",
                "label": "list",
                "offset": 0,
                "slot": "0",
                "type": "t_struct(Mapping)16337_storage"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_address)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => address)",
                "numberOfBytes": "32",
                "value": "t_address"
              },
              "t_struct(Mapping)16337_storage": {
                "encoding": "inplace",
                "label": "struct MappedSinglyLinkedList.Mapping",
                "members": [
                  {
                    "astId": 16332,
                    "contract": "contracts/test/MappedSinglyLinkedListExposed.sol:MappedSinglyLinkedListExposed",
                    "label": "count",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint256"
                  },
                  {
                    "astId": 16336,
                    "contract": "contracts/test/MappedSinglyLinkedListExposed.sol:MappedSinglyLinkedListExposed",
                    "label": "addressMap",
                    "offset": 0,
                    "slot": "1",
                    "type": "t_mapping(t_address,t_address)"
                  }
                ],
                "numberOfBytes": "64"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/test/MultipleWinnersHarness.sol": {
        "MultipleWinnersHarness": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract BeforeAwardListenerInterface",
                  "name": "beforeAwardListener",
                  "type": "address"
                }
              ],
              "name": "BeforeAwardListenerSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "bool",
                  "name": "carry",
                  "type": "bool"
                }
              ],
              "name": "BlocklistCarrySet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "count",
                  "type": "uint256"
                }
              ],
              "name": "BlocklistRetryCountSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "bool",
                  "name": "isBlocked",
                  "type": "bool"
                }
              ],
              "name": "BlocklistSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20Upgradeable",
                  "name": "externalErc20",
                  "type": "address"
                }
              ],
              "name": "ExternalErc20AwardAdded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20Upgradeable",
                  "name": "externalErc20Award",
                  "type": "address"
                }
              ],
              "name": "ExternalErc20AwardRemoved",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC721Upgradeable",
                  "name": "externalErc721",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256[]",
                  "name": "tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "ExternalErc721AwardAdded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC721Upgradeable",
                  "name": "externalErc721Award",
                  "type": "address"
                }
              ],
              "name": "ExternalErc721AwardRemoved",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "prizePeriodStart",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "prizePeriodSeconds",
                  "type": "uint256"
                },
                {
                  "indexed": true,
                  "internalType": "contract PrizePool",
                  "name": "prizePool",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "contract TicketInterface",
                  "name": "ticket",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "contract IERC20Upgradeable",
                  "name": "sponsorship",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "contract RNGInterface",
                  "name": "rng",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "contract IERC20Upgradeable[]",
                  "name": "externalErc20Awards",
                  "type": "address[]"
                }
              ],
              "name": "Initialized",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [],
              "name": "NoWinners",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "numberOfWinners",
                  "type": "uint256"
                }
              ],
              "name": "NumberOfWinnersSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract PeriodicPrizeStrategyListenerInterface",
                  "name": "periodicPrizeStrategyListener",
                  "type": "address"
                }
              ],
              "name": "PeriodicPrizeStrategyListenerSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "prizePeriodSeconds",
                  "type": "uint256"
                }
              ],
              "name": "PrizePeriodSecondsUpdated",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "prizePool",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint32",
                  "name": "rngRequestId",
                  "type": "uint32"
                },
                {
                  "indexed": false,
                  "internalType": "uint32",
                  "name": "rngLockBlock",
                  "type": "uint32"
                }
              ],
              "name": "PrizePoolAwardCancelled",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "prizePool",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint32",
                  "name": "rngRequestId",
                  "type": "uint32"
                },
                {
                  "indexed": false,
                  "internalType": "uint32",
                  "name": "rngLockBlock",
                  "type": "uint32"
                }
              ],
              "name": "PrizePoolAwardStarted",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "randomNumber",
                  "type": "uint256"
                }
              ],
              "name": "PrizePoolAwarded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint256",
                  "name": "prizePeriodStartedAt",
                  "type": "uint256"
                }
              ],
              "name": "PrizePoolOpened",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "uint256",
                  "name": "target",
                  "type": "uint256"
                }
              ],
              "name": "PrizeSplitRemoved",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "target",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint16",
                  "name": "percentage",
                  "type": "uint16"
                },
                {
                  "indexed": false,
                  "internalType": "uint8",
                  "name": "token",
                  "type": "uint8"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "index",
                  "type": "uint256"
                }
              ],
              "name": "PrizeSplitSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "numberOfWinners",
                  "type": "uint256"
                }
              ],
              "name": "RetryMaxLimitReached",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [],
              "name": "RngRequestFailed",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint32",
                  "name": "rngRequestTimeout",
                  "type": "uint32"
                }
              ],
              "name": "RngRequestTimeoutSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract RNGInterface",
                  "name": "rngService",
                  "type": "address"
                }
              ],
              "name": "RngServiceUpdated",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "bool",
                  "name": "splitExternalErc20Awards",
                  "type": "bool"
                }
              ],
              "name": "SplitExternalErc20AwardsSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract TokenListenerInterface",
                  "name": "tokenListener",
                  "type": "address"
                }
              ],
              "name": "TokenListenerUpdated",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "VERSION",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_externalErc20",
                  "type": "address"
                }
              ],
              "name": "addExternalErc20Award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20Upgradeable[]",
                  "name": "_externalErc20s",
                  "type": "address[]"
                }
              ],
              "name": "addExternalErc20Awards",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC721Upgradeable",
                  "name": "_externalErc721",
                  "type": "address"
                },
                {
                  "internalType": "uint256[]",
                  "name": "_tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "addExternalErc721Award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "beforeAwardListener",
              "outputs": [
                {
                  "internalType": "contract BeforeAwardListenerInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "referrer",
                  "type": "address"
                }
              ],
              "name": "beforeTokenMint",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "beforeTokenTransfer",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "blocklistRetryCount",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "currentTime",
                  "type": "uint256"
                }
              ],
              "name": "calculateNextPrizePeriodStartTime",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "canCompleteAward",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "canStartAward",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "cancelAward",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "carryOverBlocklist",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "completeAward",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "currentPrize",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "currentTime",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "randomNumber",
                  "type": "uint256"
                }
              ],
              "name": "distribute",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "secondsPerBlockMantissa",
                  "type": "uint256"
                }
              ],
              "name": "estimateRemainingBlocksToPrize",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "getExternalErc20Awards",
              "outputs": [
                {
                  "internalType": "address[]",
                  "name": "",
                  "type": "address[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC721Upgradeable",
                  "name": "_externalErc721",
                  "type": "address"
                }
              ],
              "name": "getExternalErc721AwardTokenIds",
              "outputs": [
                {
                  "internalType": "uint256[]",
                  "name": "",
                  "type": "uint256[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "getExternalErc721Awards",
              "outputs": [
                {
                  "internalType": "address[]",
                  "name": "",
                  "type": "address[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "getLastRngLockBlock",
              "outputs": [
                {
                  "internalType": "uint32",
                  "name": "",
                  "type": "uint32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "getLastRngRequestId",
              "outputs": [
                {
                  "internalType": "uint32",
                  "name": "",
                  "type": "uint32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_prizePeriodStart",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "_prizePeriodSeconds",
                  "type": "uint256"
                },
                {
                  "internalType": "contract PrizePool",
                  "name": "_prizePool",
                  "type": "address"
                },
                {
                  "internalType": "contract TicketInterface",
                  "name": "_ticket",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_sponsorship",
                  "type": "address"
                },
                {
                  "internalType": "contract RNGInterface",
                  "name": "_rng",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20Upgradeable[]",
                  "name": "externalErc20Awards",
                  "type": "address[]"
                }
              ],
              "name": "initialize",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_prizePeriodStart",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "_prizePeriodSeconds",
                  "type": "uint256"
                },
                {
                  "internalType": "contract PrizePool",
                  "name": "_prizePool",
                  "type": "address"
                },
                {
                  "internalType": "contract TicketInterface",
                  "name": "_ticket",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_sponsorship",
                  "type": "address"
                },
                {
                  "internalType": "contract RNGInterface",
                  "name": "_rng",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_numberOfWinners",
                  "type": "uint256"
                }
              ],
              "name": "initializeMultipleWinners",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "isBlocklisted",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "isPrizePeriodOver",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "isRngCompleted",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "isRngRequested",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "isRngTimedOut",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "numberOfWinners",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "periodicPrizeStrategyListener",
              "outputs": [
                {
                  "internalType": "contract PeriodicPrizeStrategyListenerInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizePeriodEndAt",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizePeriodRemainingSeconds",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizePeriodSeconds",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizePeriodStartedAt",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizePool",
              "outputs": [
                {
                  "internalType": "contract PrizePool",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "prizeSplitIndex",
                  "type": "uint256"
                }
              ],
              "name": "prizeSplit",
              "outputs": [
                {
                  "components": [
                    {
                      "internalType": "address",
                      "name": "target",
                      "type": "address"
                    },
                    {
                      "internalType": "uint16",
                      "name": "percentage",
                      "type": "uint16"
                    },
                    {
                      "internalType": "uint8",
                      "name": "token",
                      "type": "uint8"
                    }
                  ],
                  "internalType": "struct PrizeSplit.PrizeSplitConfig",
                  "name": "",
                  "type": "tuple"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizeSplits",
              "outputs": [
                {
                  "components": [
                    {
                      "internalType": "address",
                      "name": "target",
                      "type": "address"
                    },
                    {
                      "internalType": "uint16",
                      "name": "percentage",
                      "type": "uint16"
                    },
                    {
                      "internalType": "uint8",
                      "name": "token",
                      "type": "uint8"
                    }
                  ],
                  "internalType": "struct PrizeSplit.PrizeSplitConfig[]",
                  "name": "",
                  "type": "tuple[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_externalErc20",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_prevExternalErc20",
                  "type": "address"
                }
              ],
              "name": "removeExternalErc20Award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC721Upgradeable",
                  "name": "_externalErc721",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC721Upgradeable",
                  "name": "_prevExternalErc721",
                  "type": "address"
                }
              ],
              "name": "removeExternalErc721Award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "renounceOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "rng",
              "outputs": [
                {
                  "internalType": "contract RNGInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "rngRequestTimeout",
              "outputs": [
                {
                  "internalType": "uint32",
                  "name": "",
                  "type": "uint32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract BeforeAwardListenerInterface",
                  "name": "_beforeAwardListener",
                  "type": "address"
                }
              ],
              "name": "setBeforeAwardListener",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_count",
                  "type": "uint256"
                }
              ],
              "name": "setBlocklistRetryCount",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_user",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "_isBlocked",
                  "type": "bool"
                }
              ],
              "name": "setBlocklisted",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bool",
                  "name": "_carry",
                  "type": "bool"
                }
              ],
              "name": "setCarryBlocklist",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_currentTime",
                  "type": "uint256"
                }
              ],
              "name": "setCurrentTime",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "count",
                  "type": "uint256"
                }
              ],
              "name": "setNumberOfWinners",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract PeriodicPrizeStrategyListenerInterface",
                  "name": "_periodicPrizeStrategyListener",
                  "type": "address"
                }
              ],
              "name": "setPeriodicPrizeStrategyListener",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_prizePeriodSeconds",
                  "type": "uint256"
                }
              ],
              "name": "setPrizePeriodSeconds",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "components": [
                    {
                      "internalType": "address",
                      "name": "target",
                      "type": "address"
                    },
                    {
                      "internalType": "uint16",
                      "name": "percentage",
                      "type": "uint16"
                    },
                    {
                      "internalType": "uint8",
                      "name": "token",
                      "type": "uint8"
                    }
                  ],
                  "internalType": "struct PrizeSplit.PrizeSplitConfig",
                  "name": "prizeStrategySplit",
                  "type": "tuple"
                },
                {
                  "internalType": "uint8",
                  "name": "prizeSplitIndex",
                  "type": "uint8"
                }
              ],
              "name": "setPrizeSplit",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "components": [
                    {
                      "internalType": "address",
                      "name": "target",
                      "type": "address"
                    },
                    {
                      "internalType": "uint16",
                      "name": "percentage",
                      "type": "uint16"
                    },
                    {
                      "internalType": "uint8",
                      "name": "token",
                      "type": "uint8"
                    }
                  ],
                  "internalType": "struct PrizeSplit.PrizeSplitConfig[]",
                  "name": "newPrizeSplits",
                  "type": "tuple[]"
                }
              ],
              "name": "setPrizeSplits",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint32",
                  "name": "_rngRequestTimeout",
                  "type": "uint32"
                }
              ],
              "name": "setRngRequestTimeout",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract RNGInterface",
                  "name": "rngService",
                  "type": "address"
                }
              ],
              "name": "setRngService",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bool",
                  "name": "_splitExternalErc20Awards",
                  "type": "bool"
                }
              ],
              "name": "setSplitExternalErc20Awards",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "_tokenListener",
                  "type": "address"
                }
              ],
              "name": "setTokenListener",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "splitExternalErc20Awards",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "sponsorship",
              "outputs": [
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "startAward",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes4",
                  "name": "interfaceId",
                  "type": "bytes4"
                }
              ],
              "name": "supportsInterface",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "ticket",
              "outputs": [
                {
                  "internalType": "contract TicketInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "tokenListener",
              "outputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "addExternalErc20Award(address)": {
                "details": "Only the Prize-Strategy owner/creator can assign external tokens, and they must be approved by the Prize-Pool",
                "params": {
                  "_externalErc20": "The address of an ERC20 token to be awarded"
                }
              },
              "addExternalErc721Award(address,uint256[])": {
                "details": "Only the Prize-Strategy owner/creator can assign external tokens, and they must be approved by the Prize-Pool NOTE: The NFT must already be owned by the Prize-Pool",
                "params": {
                  "_externalErc721": "The address of an ERC721 token to be awarded",
                  "_tokenIds": "An array of token IDs of the ERC721 to be awarded"
                }
              },
              "beforeTokenMint(address,uint256,address,address)": {
                "params": {
                  "controlledToken": "The type of collateral that is being minted"
                }
              },
              "beforeTokenTransfer(address,address,uint256,address)": {
                "details": "Note that this is only for *transfers*, not mints or burns",
                "params": {
                  "controlledToken": "The type of collateral that is being sent"
                }
              },
              "calculateNextPrizePeriodStartTime(uint256)": {
                "params": {
                  "currentTime": "The timestamp to use as the current time"
                },
                "returns": {
                  "_0": "The timestamp at which the next prize period would start"
                }
              },
              "canCompleteAward()": {
                "returns": {
                  "_0": "True if an award can be completed, false otherwise."
                }
              },
              "canStartAward()": {
                "returns": {
                  "_0": "True if an award can be started, false otherwise."
                }
              },
              "currentPrize()": {
                "returns": {
                  "_0": "The current prize size"
                }
              },
              "estimateRemainingBlocksToPrize(uint256)": {
                "params": {
                  "secondsPerBlockMantissa": "The number of seconds per block to use for the calculation.  Should be a fixed point 18 number like Ether."
                },
                "returns": {
                  "_0": "The estimated number of blocks remaining until the prize can be awarded."
                }
              },
              "getExternalErc20Awards()": {
                "returns": {
                  "_0": "An array of External ERC20 token addresses"
                }
              },
              "getExternalErc721AwardTokenIds(address)": {
                "returns": {
                  "_0": "An array of External ERC721 token addresses"
                }
              },
              "getExternalErc721Awards()": {
                "returns": {
                  "_0": "An array of External ERC721 token addresses"
                }
              },
              "getLastRngLockBlock()": {
                "returns": {
                  "_0": "The block number that the RNG request is locked to"
                }
              },
              "getLastRngRequestId()": {
                "returns": {
                  "_0": "The current Request ID"
                }
              },
              "initialize(uint256,uint256,address,address,address,address,address[])": {
                "params": {
                  "_prizePeriodSeconds": "The duration of the prize period in seconds",
                  "_prizePeriodStart": "The starting timestamp of the prize period.",
                  "_prizePool": "The prize pool to award",
                  "_rng": "The RNG service to use",
                  "_sponsorship": "The sponsorship token",
                  "_ticket": "The ticket to use to draw winners"
                }
              },
              "isPrizePeriodOver()": {
                "returns": {
                  "_0": "True if the prize period is over, false otherwise"
                }
              },
              "isRngCompleted()": {
                "returns": {
                  "_0": "True if a random number request has completed, false otherwise."
                }
              },
              "isRngRequested()": {
                "returns": {
                  "_0": "True if a random number has been requested, false otherwise."
                }
              },
              "numberOfWinners()": {
                "details": "Read maximum number of winners per award distribution period from internal __numberOfWinners variable.",
                "returns": {
                  "_0": "__numberOfWinners The total number of winners per prize award."
                }
              },
              "owner()": {
                "details": "Returns the address of the current owner."
              },
              "prizePeriodEndAt()": {
                "returns": {
                  "_0": "The timestamp at which the prize period ends."
                }
              },
              "prizePeriodRemainingSeconds()": {
                "returns": {
                  "_0": "The number of seconds remaining until the prize can be awarded."
                }
              },
              "prizeSplit(uint256)": {
                "details": "Read PrizeSplitConfig struct from _prizeSplits array.",
                "params": {
                  "prizeSplitIndex": "Index position of PrizeSplitConfig"
                },
                "returns": {
                  "_0": "PrizeSplitConfig Single prize split config"
                }
              },
              "prizeSplits()": {
                "details": "Read all PrizeSplitConfig structs stored in _prizeSplits.",
                "returns": {
                  "_0": "_prizeSplits Array of PrizeSplitConfig structs"
                }
              },
              "removeExternalErc20Award(address,address)": {
                "details": "Only the Prize-Strategy owner/creator can remove external tokens",
                "params": {
                  "_externalErc20": "The address of an ERC20 token to be removed",
                  "_prevExternalErc20": "The address of the previous ERC20 token in the `externalErc20s` list. If the ERC20 is the first address, then the previous address is the SENTINEL address: 0x0000000000000000000000000000000000000001"
                }
              },
              "removeExternalErc721Award(address,address)": {
                "details": "Only the Prize-Strategy owner/creator can remove external tokens",
                "params": {
                  "_externalErc721": "The address of an ERC721 token to be removed",
                  "_prevExternalErc721": "The address of the previous ERC721 token in the list. If no previous, then pass the SENTINEL address: 0x0000000000000000000000000000000000000001"
                }
              },
              "renounceOwnership()": {
                "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
              },
              "setBeforeAwardListener(address)": {
                "details": "The listener must implement ERC165 and the BeforeAwardListenerInterface",
                "params": {
                  "_beforeAwardListener": "The address of the listener contract"
                }
              },
              "setBlocklistRetryCount(uint256)": {
                "details": "Limits winner selection (ticket.draw) retries to avoid to gas limit reached errors. Increases the probability of not reaching the maximum number of winners if to low.",
                "params": {
                  "_count": "Number of retry attempts"
                }
              },
              "setBlocklisted(address,bool)": {
                "details": "Block/unblock a user from winning award in prize distribution by updating the isBlocklisted mapping.",
                "params": {
                  "_isBlocked": "Blocked Status (true or false) of user",
                  "_user": "Address of blocked user"
                }
              },
              "setCarryBlocklist(bool)": {
                "details": "Toggles if the main prize (prizePool.captureAwardBalance) and secondary prizes (LootBox) should be kept for the next draw or evenly distrubted if maximum number of winners is not selected. ",
                "params": {
                  "_carry": "Award carry over status (true or false)"
                }
              },
              "setNumberOfWinners(uint256)": {
                "details": "Sets maximum number of winners per award distribution period.",
                "params": {
                  "count": "Number of winners."
                }
              },
              "setPeriodicPrizeStrategyListener(address)": {
                "params": {
                  "_periodicPrizeStrategyListener": "The address of the listener contract"
                }
              },
              "setPrizePeriodSeconds(uint256)": {
                "params": {
                  "_prizePeriodSeconds": "The new prize period in seconds.  Must be greater than zero."
                }
              },
              "setPrizeSplit((address,uint16,uint8),uint8)": {
                "details": "Updates a prize split config by passing a new PrizeSplitConfig struct and current index position. Limited to contract owner.",
                "params": {
                  "prizeSplitIndex": "Index position of PrizeSplitConfig to update",
                  "prizeStrategySplit": "PrizeSplitConfig config struct"
                }
              },
              "setPrizeSplits((address,uint16,uint8)[])": {
                "details": "Set and remove prize split configs by passing a new PrizeSplitConfig structs array. Will remove existing PrizeSplitConfig(s) if passed array length is less than existing _prizeSplits length.",
                "params": {
                  "newPrizeSplits": "Array of PrizeSplitConfig structs"
                }
              },
              "setRngRequestTimeout(uint32)": {
                "params": {
                  "_rngRequestTimeout": "The RNG request timeout in seconds."
                }
              },
              "setRngService(address)": {
                "params": {
                  "rngService": "The address of the new RNG service interface"
                }
              },
              "setSplitExternalErc20Awards(bool)": {
                "details": "Toggle external ERC20 awards for all prize winners. If unset will distribute external ERC20 awards to main winner.",
                "params": {
                  "_splitExternalErc20Awards": "Toggle splitting external ERC20 awards."
                }
              },
              "setTokenListener(address)": {
                "params": {
                  "_tokenListener": "A contract that implements the token listener interface."
                }
              },
              "startAward()": {
                "details": "The RNG-Request-Fee is expected to be held within this contract before calling this function"
              },
              "supportsInterface(bytes4)": {
                "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."
              },
              "transferOwnership(address)": {
                "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
              }
            },
            "title": "Creates a minimal proxy to the MultipleWinners prize strategy.  Very cheap to deploy.",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50615bcf80620000216000396000f3fe608060405234801561001057600080fd5b50600436106103e65760003560e01c80637f2be9fc1161020a578063b024468211610125578063d18e81b3116100b8578063eefc8ad111610087578063eefc8ad114610762578063f2fde38b14610782578063f97700e214610795578063fbf0953e146107a8578063ffa1ad74146107bb576103e6565b8063d18e81b314610742578063d5ad6bf61461074a578063d605787b14610752578063dfb2f13b1461075a576103e6565b8063c2f19ee8116100f4578063c2f19ee81461070c578063c42b42a014610714578063c48ddbcb1461071c578063c68532701461072f576103e6565b8063b0244682146106cb578063b2210957146106de578063b9ee1e05146106f1578063c25a9c32146106f9576103e6565b80638e204c431161019d57806395e5f9ee1161016c57806395e5f9ee146106a05780639dafafb0146106a8578063a4e075ca146106b0578063acca5b95146106c3576103e6565b80638e204c431461065257806391c05b0b1461066557806394144c6b146106785780639417783f14610680576103e6565b80638aa3ec6f116101d95780638aa3ec6f1461061a5780638acfaca91461062d5780638d5f10c4146106355780638da5cb5b1461064a576103e6565b80637f2be9fc146105d95780637f4296d7146105ec578063876f5c7e146105ff578063884a444814610607576103e6565b80634e5d08e0116103055780636be51c4f116102985780636f46f221116102675780636f46f221146105b1578063715018a6146105b9578063719ce73e146105c157806372f33ea9146105c9578063738bbea8146105d1576103e6565b80636be51c4f146105865780636bea53441461058e5780636cc25db7146105965780636dfb03861461059e576103e6565b806362c77a61116102d457806362c77a61146105505780636696822114610558578063671137c41461056b5780636a74f1071461057e576103e6565b80634e5d08e01461050f578063500db70d1461052257806352a301091461052a578063605e25ac1461053d576103e6565b80632c8fe73d1161037d57806347bed9981161034c57806347bed998146104d95780634aba4f6b146104ec5780634c169f4f146104f45780634d7f3db0146104fc576103e6565b80632c8fe73d1461049657806330fcdf411461049e57806338a9b4b6146104b157806342d09209146104c4576103e6565b8063111070e4116103b9578063111070e414610451578063152d308c1461045957806322f8e5661461046c5780632a7ad60914610481576103e6565b806301b48e34146103eb57806301ffc9a7146104145780630d847fc4146104345780630faf125f14610449575b600080fd5b6103fe6103f936600461490a565b6107d0565b60405161040b9190614b3c565b60405180910390f35b610427610422366004614813565b6107e9565b60405161040b9190614d91565b61043c61081f565b60405161040b9190614b45565b6103fe61082e565b610427610834565b6104276104673660046145e1565b610843565b61047f61047a36600461490a565b6108fa565b005b6104896108ff565b60405161040b9190615ae0565b6103fe61090b565b61047f6104ac366004614557565b61091a565b61047f6104bf3660046147db565b6109f2565b6104cc610a88565b60405161040b9190614c90565b6103fe6104e736600461490a565b610a94565b610427610a9f565b61047f610b28565b61047f61050a366004614646565b610bf2565b61047f61051d366004614557565b610cca565b61043c610d67565b61042761053836600461490a565b610d76565b61047f61054b366004614557565b610e04565b6104cc610ee5565b61047f61056636600461472b565b610ef1565b61047f61057936600461483b565b610fc3565b610427611023565b61043c61103c565b61048961104b565b61043c61105f565b61047f6105ac36600461490a565b61106e565b6104276110be565b61047f6110c7565b61043c611150565b6103fe61115f565b610427611165565b61047f6105e7366004614a33565b6111b8565b61047f6105fa366004614557565b61125c565b610427611312565b61047f61061536600461490a565b611331565b61047f610628366004614557565b611381565b6103fe611459565b61063d61145f565b60405161040b9190614cdd565b61043c6114e4565b610427610660366004614557565b6114f3565b61047f61067336600461490a565b611508565b6103fe611511565b61069361068e366004614557565b611517565b60405161040b9190614d59565b610427611583565b61042761158d565b6104276106be3660046147db565b611596565b61048961161d565b61047f6106d936600461483b565b611629565b61047f6106ec36600461458f565b6116b4565b61047f611785565b61047f61070736600461476b565b6119cd565b61043c611d5c565b6103fe611d6b565b61047f61072a366004614868565b611de8565b61047f61073d366004614aad565b611fdd565b6103fe61202d565b6103fe612033565b61043c61203d565b61047f61204c565b61077561077036600461490a565b6122ce565b60405161040b9190615a0a565b61047f610790366004614557565b612333565b61047f6107a336600461493a565b6123f4565b61047f6107b63660046148d6565b612655565b6107c36127f4565b60405161040b9190614db1565b60006107e36107dd612815565b83612852565b92915050565b60006001600160e01b031982166301ffc9a760e01b14806107e35750506001600160e01b031916600162a1cb1960e01b03191490565b6073546001600160a01b031681565b607a5481565b606a5463ffffffff1615155b90565b600061084d61287b565b6001600160a01b031661085e6114e4565b6001600160a01b03161461088d5760405162461bcd60e51b8152600401610884906154ec565b60405180910390fd5b61089561287f565b6001600160a01b03831660008181526078602052604090819020805460ff1916851515179055517fd1ac9a365c0e3bfad562e0a809a5ded3842a2b489f839b3327e4e34ee0128f28906108e9908590614d91565b60405180910390a250600192915050565b607b55565b606a5463ffffffff1690565b60006109156128d4565b905090565b61092261287b565b6001600160a01b03166109336114e4565b6001600160a01b0316146109595760405162461bcd60e51b8152600401610884906154ec565b61096161287f565b6001600160a01b038116158061098c575061098c6001600160a01b03821663266fce1f60e11b6128ed565b6109a85760405162461bcd60e51b81526004016108849061559a565b607380546001600160a01b0319166001600160a01b0383169081179091556040517fc4feff61630891ea2cb42a54fbe3ff2e65422f2ed17323ac6b65f4521112e87e90600090a250565b6109fa61287b565b6001600160a01b0316610a0b6114e4565b6001600160a01b031614610a315760405162461bcd60e51b8152600401610884906154ec565b610a3961287f565b6077805460ff191682151517908190556040517f6959d02e8fb6264d1d39bf37f1e725001f342714933cf38f8627a2442efc43fd91610a7d9160ff90911690614d91565b60405180910390a150565b60606109156070612910565b60006107e3826129f0565b606954606a54604051630e866e6f60e21b81526000926001600160a01b031691633a19b9bc91610ad89163ffffffff1690600401615ae0565b60206040518083038186803b158015610af057600080fd5b505afa158015610b04573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091591906147f7565b610b30611165565b610b4c5760405162461bcd60e51b8152600401610884906158ea565b606a80546bffffffffffffffffffffffff19811690915560405163ffffffff80831692640100000000900416907fee6702c46c5618e6fc7e625c71f4c85df9c91d456cb16a3aea71ab83b1fee00590600090a160665460405163ffffffff8416916001600160a01b03169033907fd50026ee0824513af20cdf5e72d1fbfbe8fd646ee0576378e080326f1a695e5890610be6908690615ae0565b60405180910390a45050565b6066546001600160a01b0316610c0661287b565b6001600160a01b031614610c2c5760405162461bcd60e51b8152600401610884906150c4565b6067546001600160a01b0383811691161415610c4a57610c4a61287f565b6065546001600160a01b031615610cc4576065546040516304d7f3db60e41b81526001600160a01b0390911690634d7f3db090610c91908790879087908790600401614c65565b600060405180830381600087803b158015610cab57600080fd5b505af1158015610cbf573d6000803e3d6000fd5b505050505b50505050565b610cd26114e4565b6001600160a01b0316610ce361287b565b6001600160a01b03161480610d1257506074546001600160a01b0316610d0761287b565b6001600160a01b0316145b80610d3757506073546001600160a01b0316610d2c61287b565b6001600160a01b0316145b610d535760405162461bcd60e51b815260040161088490614f5b565b610d5b61287f565b610d6481612a37565b50565b6068546001600160a01b031681565b6000610d8061287b565b6001600160a01b0316610d916114e4565b6001600160a01b031614610db75760405162461bcd60e51b8152600401610884906154ec565b610dbf61287f565b607a8290556040517f63e4e34f49d12428c03e04e61340c7167e36eb0ff6f0b1970c7544026179403990610df4908490614b3c565b60405180910390a1506001919050565b610e0c61287b565b6001600160a01b0316610e1d6114e4565b6001600160a01b031614610e435760405162461bcd60e51b8152600401610884906154ec565b610e4b61287f565b6001600160a01b0381161580610e795750610e796001600160a01b038216600162a1cb1960e01b03196128ed565b610e955760405162461bcd60e51b815260040161088490614e28565b606580546001600160a01b0319166001600160a01b0383811691909117918290556040519116907f9fc437aa70ad4ee5f33f6772bf338eed41e21b95435820817ab8b4df161ce4dd90600090a250565b6060610915606e612910565b610ef96114e4565b6001600160a01b0316610f0a61287b565b6001600160a01b03161480610f3957506074546001600160a01b0316610f2e61287b565b6001600160a01b0316145b80610f5e57506073546001600160a01b0316610f5361287b565b6001600160a01b0316145b610f7a5760405162461bcd60e51b815260040161088490614f5b565b610f8261287f565b60005b81811015610fbe57610fb6838383818110610f9c57fe5b9050602002016020810190610fb19190614557565b612a37565b600101610f85565b505050565b610fcb61287b565b6001600160a01b0316610fdc6114e4565b6001600160a01b0316146110025760405162461bcd60e51b8152600401610884906154ec565b61100a61287f565b61101660708284612beb565b61101f82612cb5565b5050565b600061102d610834565b80156109155750610915610a9f565b6065546001600160a01b031681565b606a54640100000000900463ffffffff1690565b6067546001600160a01b031681565b61107661287b565b6001600160a01b03166110876114e4565b6001600160a01b0316146110ad5760405162461bcd60e51b8152600401610884906154ec565b6110b561287f565b610d6481612d0d565b60795460ff1681565b6110cf61287b565b6001600160a01b03166110e06114e4565b6001600160a01b0316146111065760405162461bcd60e51b8152600401610884906154ec565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6066546001600160a01b031681565b606d5481565b606a54600090600160401b900463ffffffff1661118457506000610840565b606a54606b546111a89163ffffffff91821691600160401b909104811690612d6216565b6111b0612d87565b119050610840565b600054610100900460ff16806111d157506111d1612d8d565b806111df575060005460ff16155b6111fb5760405162461bcd60e51b815260040161088490615360565b600054610100900460ff16158015611226576000805460ff1961ff0019909116610100171660011790555b6060611237898989898989876123f4565b61124083612d0d565b508015610cbf576000805461ff00191690555050505050505050565b61126461287b565b6001600160a01b03166112756114e4565b6001600160a01b03161461129b5760405162461bcd60e51b8152600401610884906154ec565b6112a361287f565b6112ab610834565b156112c85760405162461bcd60e51b8152600401610884906158a7565b606980546001600160a01b0319166001600160a01b0383169081179091556040517ff935763cc7c57ee8ed6318ed71e756cca0731294c9f46ff5b386f36d6ff1417a90600090a250565b600061131c612d98565b8015610915575061132b610834565b15905090565b61133961287b565b6001600160a01b031661134a6114e4565b6001600160a01b0316146113705760405162461bcd60e51b8152600401610884906154ec565b61137861287f565b610d6481612db1565b61138961287b565b6001600160a01b031661139a6114e4565b6001600160a01b0316146113c05760405162461bcd60e51b8152600401610884906154ec565b6113c861287f565b6001600160a01b03811615806113f357506113f36001600160a01b038216632ba8396360e11b6128ed565b61140f5760405162461bcd60e51b8152600401610884906157b8565b607480546001600160a01b0319166001600160a01b0383169081179091556040517fda05d50a3a1ec0ffab059f1d457ae59f68ccfb3ffbb4dad283c516f9103d584b90600090a250565b60765490565b60606075805480602002602001604051908101604052809291908181526020016000905b828210156114db57600084815260209081902060408051606081018252918501546001600160a01b0381168352600160a01b810461ffff1683850152600160b01b900460ff1690820152825260019092019101611483565b50505050905090565b6033546001600160a01b031690565b60786020526000908152604090205460ff1681565b610d6481612e06565b606c5481565b6001600160a01b03811660009081526072602090815260409182902080548351818402810184019094528084526060939283018282801561157757602002820191906000526020600020905b815481526020019060010190808311611563575b50505050509050919050565b6000610915612d98565b60775460ff1681565b60006115a061287b565b6001600160a01b03166115b16114e4565b6001600160a01b0316146115d75760405162461bcd60e51b8152600401610884906154ec565b6115df61287f565b6079805460ff19168315151790556040517f2b4b6ffe286f7ce4ccc6b136bb14987b0a00092174d88938a0c667a104a4a73190610df4908490614d91565b606b5463ffffffff1681565b61163161287b565b6001600160a01b03166116426114e4565b6001600160a01b0316146116685760405162461bcd60e51b8152600401610884906154ec565b61167061287f565b61167c606e8284612beb565b6040516001600160a01b038316907f58982464497acdab11ad29d39907e076b0d3b8daf1d9b734174c7c3a2a0e8c7490600090a25050565b6066546001600160a01b03166116c861287b565b6001600160a01b0316146116ee5760405162461bcd60e51b8152600401610884906150c4565b826001600160a01b0316846001600160a01b031614156117205760405162461bcd60e51b815260040161088490615109565b6067546001600160a01b038281169116141561173e5761173e61287f565b6065546001600160a01b031615610cc45760655460405163b221095760e01b81526001600160a01b039091169063b221095790610c91908790879087908790600401614bfe565b61178d612d98565b6117a95760405162461bcd60e51b815260040161088490614eca565b6117b1610834565b156117ce5760405162461bcd60e51b815260040161088490615429565b60695460408051630d37b53760e01b8152815160009384936001600160a01b0390911692630d37b5379260048083019392829003018186803b15801561181357600080fd5b505afa158015611827573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184b9190614619565b90925090506001600160a01b038216158015906118685750600081115b1561188757606954611887906001600160a01b03848116911683613393565b6069546040805163433c53d960e11b8152815160009384936001600160a01b0390911692638678a7b2926004808301939282900301818787803b1580156118cd57600080fd5b505af11580156118e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119059190614ac9565b606a805463ffffffff8084166401000000000267ffffffff000000001991861663ffffffff199093169290921716179055909250905061194b611946612d87565b61348d565b606a80546bffffffff00000000000000001916600160401b63ffffffff93841602179055606654908316906001600160a01b031661198761287b565b6001600160a01b03167f4d31e658dcf617bb3a3c8cf7c6dddb33f7030ac588e271631ecdb5d76c2e91ef846040516119bf9190615ae0565b60405180910390a450505050565b6119d561287b565b6001600160a01b03166119e66114e4565b6001600160a01b031614611a0c5760405162461bcd60e51b8152600401610884906154ec565b8060005b81811015611cb157611a2061445a565b848483818110611a2c57fe5b905060600201803603810190611a4291906148bb565b90506001816040015160ff161115611a6c5760405162461bcd60e51b815260040161088490615028565b80516001600160a01b0316611a935760405162461bcd60e51b8152600401610884906152d4565b6075548210611b2f576075805460018101825560009190915281517f9a8d93986a7b9e6294572ea6736696119c195c1a9f5eae642d3c5fcd44e49dea90910180546020840151604085015160ff16600160b01b0260ff60b01b1961ffff909216600160a01b0261ffff60a01b196001600160a01b039096166001600160a01b031990941693909317949094169190911716919091179055611c56565b611b3761445a565b60758381548110611b4457fe5b60009182526020918290206040805160608101825292909101546001600160a01b03808216808552600160a01b830461ffff1695850195909552600160b01b90910460ff1691830191909152845191935016141580611bb35750806020015161ffff16826020015161ffff1614155b80611bcc5750806040015160ff16826040015160ff1614155b15611c4d578160758481548110611bdf57fe5b6000918252602091829020835191018054928401516040909401516001600160a01b03199093166001600160a01b039092169190911761ffff60a01b1916600160a01b61ffff909416939093029290921760ff60b01b1916600160b01b60ff90921691909102179055611c54565b5050611ca9565b505b80600001516001600160a01b03167fc1bf93444a0055a24a7d0154b75fedf78edfe355c06a2ce8e47f9f39087205598260200151836040015185604051611c9f93929190615a18565b60405180910390a2505b600101611a10565b505b607554811015611d2e57607554600090611cce9060016134b7565b90506075805480611cdb57fe5b600082815260208120820160001990810180546001600160b81b031916905590910190915560405182917f99fa473fdf53414bcd014cf6e7509fc58c68f7b86174767faa6ad5100cd5bae591a250611cb3565b6000611d386134df565b90506103e8811115610cc45760405162461bcd60e51b815260040161088490615547565b6074546001600160a01b031681565b606654604080516318c1996d60e21b815290516000926001600160a01b03169163630665b4916004808301926020929190829003018186803b158015611db057600080fd5b505afa158015611dc4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109159190614922565b611df06114e4565b6001600160a01b0316611e0161287b565b6001600160a01b03161480611e3057506074546001600160a01b0316611e2561287b565b6001600160a01b0316145b80611e5557506073546001600160a01b0316611e4a61287b565b6001600160a01b0316145b611e715760405162461bcd60e51b815260040161088490614f5b565b611e7961287f565b606654604051636a3fd4f960e01b81526001600160a01b0390911690636a3fd4f990611ea9908690600401614b45565b60206040518083038186803b158015611ec157600080fd5b505afa158015611ed5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef991906147f7565b611f155760405162461bcd60e51b8152600401610884906155eb565b611f2f6001600160a01b0384166380ac58cd60e01b6128ed565b611f4b5760405162461bcd60e51b815260040161088490614de4565b611f56607084613571565b611f6557611f656070846135c2565b60005b81811015611f9457611f8c84848484818110611f8057fe5b9050602002013561368a565b600101611f68565b50826001600160a01b03167f51541dc4b4c08a16085809cccdc4cc77d8000b60fbb00142e57f236d842986758383604051611fd0929190614d1f565b60405180910390a2505050565b611fe561287b565b6001600160a01b0316611ff66114e4565b6001600160a01b03161461201c5760405162461bcd60e51b8152600401610884906154ec565b61202461287f565b610d64816137db565b607b5481565b6000610915612815565b6069546001600160a01b031681565b612054610834565b6120705760405162461bcd60e51b81526004016108849061597c565b612078610a9f565b6120945760405162461bcd60e51b81526004016108849061528e565b606954606a546040516313a54bf360e31b81526000926001600160a01b031691639d2a5f98916120cd9163ffffffff1690600401615ae0565b602060405180830381600087803b1580156120e757600080fd5b505af11580156120fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061211f9190614922565b606a80546bffffffffffffffffffffffff191690556073549091506001600160a01b0316156121af57607354606d5460405163266fce1f60e11b81526001600160a01b0390921691634cdf9c3e9161217c91859190600401615a56565b600060405180830381600087803b15801561219657600080fd5b505af11580156121aa573d6000803e3d6000fd5b505050505b6121b881612e06565b6074546001600160a01b03161561223057607454606d54604051632ba8396360e11b81526001600160a01b039092169163575072c6916121fd91859190600401615a56565b600060405180830381600087803b15801561221757600080fd5b505af115801561222b573d6000803e3d6000fd5b505050505b61224061223b612d87565b6129f0565b606d5561224b61287b565b6001600160a01b03167f9c4163ece98173eab9a496c4db8bf3e2c8edcc5d2854377880597ccb858b7a9d826040516122839190614b3c565b60405180910390a2606d5461229661287b565b6001600160a01b03167fc61852c20f0b03b31d782f3022f2bf20322ac17ce66c5349fb6e24740cdd645660405160405180910390a350565b6122d661445a565b607582815481106122e357fe5b60009182526020918290206040805160608101825292909101546001600160a01b0381168352600160a01b810461ffff1693830193909352600160b01b90920460ff169181019190915292915050565b61233b61287b565b6001600160a01b031661234c6114e4565b6001600160a01b0316146123725760405162461bcd60e51b8152600401610884906154ec565b6001600160a01b0381166123985760405162461bcd60e51b815260040161088490614f15565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff168061240d575061240d612d8d565b8061241b575060005460ff16155b6124375760405162461bcd60e51b815260040161088490615360565b600054610100900460ff16158015612462576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0386166124885760405162461bcd60e51b815260040161088490615186565b6001600160a01b0385166124ae5760405162461bcd60e51b815260040161088490615729565b6001600160a01b0384166124d45760405162461bcd60e51b815260040161088490614fde565b6001600160a01b0383166124fa5760405162461bcd60e51b815260040161088490615215565b606680546001600160a01b038089166001600160a01b0319928316179092556067805488841690831617905560698054868416908316179055606880549287169290911691909117905561254d87612db1565b61255561384c565b61255f606e6138de565b60005b825181101561258f5761258783828151811061257a57fe5b6020026020010151612a37565b600101612562565b50606c879055606d8890556125a460706138de565b6125af6107086137db565b856001600160a01b03167ff9632d212436344a25150ff0c161dabf412aade556621c2dea146ca63ff643f58989888888886040516125f296959493929190615a64565b60405180910390a2606d5461260561287b565b6001600160a01b03167fc61852c20f0b03b31d782f3022f2bf20322ac17ce66c5349fb6e24740cdd645660405160405180910390a38015610cbf576000805461ff00191690555050505050505050565b61265d61287b565b6001600160a01b031661266e6114e4565b6001600160a01b0316146126945760405162461bcd60e51b8152600401610884906154ec565b60755460ff8216106126b85760405162461bcd60e51b8152600401610884906153ae565b6001826040015160ff1611156126e05760405162461bcd60e51b815260040161088490615028565b81516001600160a01b03166127075760405162461bcd60e51b8152600401610884906152d4565b8160758260ff168154811061271857fe5b600091825260208083208451920180549185015160409095015160ff16600160b01b0260ff60b01b1961ffff909616600160a01b0261ffff60a01b196001600160a01b039095166001600160a01b031990941693909317939093169190911793909316179091556127876134df565b90506103e88111156127ab5760405162461bcd60e51b815260040161088490615547565b82600001516001600160a01b03167fc1bf93444a0055a24a7d0154b75fedf78edfe355c06a2ce8e47f9f39087205598460200151856040015185604051611fd093929190615a37565b60405180604001604052806005815260200164332e342e3560d81b81525081565b6000806128206128d4565b9050600061282c612d87565b90508181111561284157600092505050610840565b61284b82826134b7565b9250505090565b600080612867670de0b6b3a764000085613922565b9050612873818461395c565b949350505050565b3390565b600061288961399e565b606a54909150640100000000900463ffffffff1615806128b85750606a54640100000000900463ffffffff1681105b610d645760405162461bcd60e51b8152600401610884906158a7565b6000610915606c54606d54612d6290919063ffffffff16565b60006128f8836139a2565b8015612909575061290983836139d5565b9392505050565b606080826000015467ffffffffffffffff8111801561292e57600080fd5b50604051908082528060200260200182016040528015612958578160200160208202803683370190505b50600160008181529085016020526040812054919250906001600160a01b03165b6001600160a01b0381161580159061299b57506001600160a01b038116600114155b156129e757808383815181106129ad57fe5b6001600160a01b03928316602091820292909201810191909152918116600090815260018088019093526040902054929091019116612979565b50909392505050565b600080612a14606c54612a0e606d54866134b790919063ffffffff16565b906139fb565b9050612909612a2e606c548361392290919063ffffffff16565b606d5490612d62565b612a49816001600160a01b0316613a2d565b612a655760405162461bcd60e51b8152600401610884906153f4565b606654604051636a3fd4f960e01b81526001600160a01b0390911690636a3fd4f990612a95908490600401614b45565b60206040518083038186803b158015612aad57600080fd5b505afa158015612ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae591906147f7565b612b015760405162461bcd60e51b8152600401610884906155eb565b60408051600481526024810182526020810180516001600160e01b03166318160ddd60e01b17905290516000916060916001600160a01b03851691612b4591614b20565b600060405180830381855afa9150503d8060008114612b80576040519150601f19603f3d011682016040523d82523d6000602084013e612b85565b606091505b509150915081612ba75760405162461bcd60e51b81526004016108849061531d565b612bb2606e846135c2565b6040516001600160a01b038416907fbcd6d991f3416e288bf59a2997b423772937b62c7ea7dd1a54af7771de1f741890600090a2505050565b6001600160a01b038116600114801590612c0d57506001600160a01b03811615155b612c295760405162461bcd60e51b815260040161088490614e74565b6001600160a01b038281166000908152600185016020526040902054811690821614612c675760405162461bcd60e51b815260040161088490614e9d565b6001600160a01b039081166000818152600185016020526040808220805495851683529082208054959094166001600160a01b03199586161790935552805490911690558054600019019055565b6001600160a01b0381166000908152607260205260408120612cd69161447a565b6040516001600160a01b038216907fcd64d9dacd230c5ccf1278ea5332b0621aa28c950fb0e61c8fbc9e2011c88a3490600090a250565b60008111612d2d5760405162461bcd60e51b815260040161088490615474565b60768190556040517fc44c7222e8df09744ced394101df47e78dedb642d3065267bb388901de9df6d490610a7d908390614b3c565b6000828201838110156129095760405162461bcd60e51b815260040161088490614fa7565b607b5490565b600061132b30613a2d565b6000612da26128d4565b612daa612d87565b1015905090565b60008111612dd15760405162461bcd60e51b815260040161088490615070565b606c8190556040517f0d379c1a7282461e725a9dc2d74e65246c77e98ae93835e26c2f1654c48ee4ec90610a7d908390614b3c565b6066546040805163e6d8a94b60e01b815290516000926001600160a01b03169163e6d8a94b91600480830192602092919082900301818787803b158015612e4c57600080fd5b505af1158015612e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e849190614922565b9050612e8f81613a33565b9050606760009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612edf57600080fd5b505afa158015612ef3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f179190614922565b612f4a576040517f3728feb3fc1ef1bf4a24036afbe7d34b59c551bf0d2ab5564e87ec1734fa80dd90600090a150610d64565b60795460765460ff9091169060608167ffffffffffffffff81118015612f6f57600080fd5b50604051908082528060200260200182016040528015612f99578160200160208202803683370190505b50607a54909150859060009081905b8583101561314457606754604051633b30414760e01b81526000916001600160a01b031690633b30414790612fe1908890600401614b3c565b60206040518083038186803b158015612ff957600080fd5b505afa15801561300d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130319190614573565b6001600160a01b03811660009081526078602052604090205490915060ff1661308c578086858060010196508151811061306757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050613105565b818360010193508310613105577fb5f728fcb182000eb8e953c15f6795f07b6cda75b35ef0b65645b53aac636945846040516130c89190614b3c565b60405180910390a1836130ff576040517f3728feb3fc1ef1bf4a24036afbe7d34b59c551bf0d2ab5564e87ec1734fa80dd90600090a15b50613144565b60008461020902866101f301016040516020016131229190614b3c565b60408051601f1981840301815291905280516020909101209550612fa8915050565b6131618560008151811061315457fe5b6020026020010151613ae0565b6000876131775761317289856139fb565b613181565b61318189886139fb565b905080156131bb5760005b848110156131b9576131b18782815181106131a357fe5b602002602001015183613c50565b60010161318c565b505b60775460ff161561336a5760006131d2606e613cbd565b90505b6001600160a01b0381161580159061320857506131f2606e613cda565b6001600160a01b0316816001600160a01b031614155b15613364576066546040516370a0823160e01b81526000916001600160a01b03808516926370a0823192613240921690600401614b45565b60206040518083038186803b15801561325857600080fd5b505afa15801561326c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132909190614922565b905060008a6132a8576132a382886139fb565b6132b2565b6132b2828b6139fb565b905080156133505760005b8781101561334e576066548a516001600160a01b0390911690632b0ab144908c90849081106132e857fe5b602002602001015186856040518463ffffffff1660e01b815260040161331093929190614bda565b600060405180830381600087803b15801561332a57600080fd5b505af115801561333e573d6000803e3d6000fd5b5050600190920191506132bd9050565b505b61335b606e84613ce0565b925050506131d5565b50613387565b6133878660008151811061337a57fe5b6020026020010151613d03565b50505050505050505050565b80158061341b5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906133c99030908690600401614b59565b60206040518083038186803b1580156133e157600080fd5b505afa1580156133f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134199190614922565b155b6134375760405162461bcd60e51b81526004016108849061580b565b610fbe8363095ea7b360e01b8484604051602401613456929190614c29565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613e4f565b600064010000000082106134b35760405162461bcd60e51b81526004016108849061565d565b5090565b6000828211156134d95760405162461bcd60e51b81526004016108849061514f565b50900390565b6075546000908190815b818160ff161015613569576134fc61445a565b60758260ff168154811061350c57fe5b60009182526020918290206040805160608101825292909101546001600160a01b0381168352600160a01b810461ffff16938301849052600160b01b900460ff1690820152915061355e908590612d62565b9350506001016134e9565b509091505090565b60006001600160a01b03821660011480159061359557506001600160a01b03821615155b80156129095750506001600160a01b03908116600090815260019290920160205260409091205416151590565b6001600160a01b0381166001148015906135e457506001600160a01b03811615155b6136005760405162461bcd60e51b815260040161088490614e74565b6001600160a01b038181166000908152600184016020526040902054161561363a5760405162461bcd60e51b815260040161088490615636565b60016000818152838201602052604080822080546001600160a01b039586168085529284208054969091166001600160a01b03199687161790559183905281549093169092179091558154019055565b6066546040516331a9108f60e11b81526001600160a01b0391821691841690636352211e906136bd908590600401614b3c565b60206040518083038186803b1580156136d557600080fd5b505afa1580156136e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061370d9190614573565b6001600160a01b0316146137335760405162461bcd60e51b8152600401610884906159c3565b60005b6001600160a01b0383166000908152607260205260409020548110156137ae576001600160a01b038316600090815260726020526040902080548391908390811061377d57fe5b906000526020600020015414156137a65760405162461bcd60e51b815260040161088490615861565b600101613736565b506001600160a01b0390911660009081526072602090815260408220805460018101825590835291200155565b603c8163ffffffff16116138015760405162461bcd60e51b815260040161088490615930565b606b805463ffffffff191663ffffffff83811691909117918290556040517f4f27f6f220ffad585e728389bc2f0f6b74eeebeb43f95f53752a647cb6e7e68792610a7d921690615ae0565b600054610100900460ff16806138655750613865612d8d565b80613873575060005460ff16155b61388f5760405162461bcd60e51b815260040161088490615360565b600054610100900460ff161580156138ba576000805460ff1961ff0019909116610100171660011790555b6138c2613ede565b6138ca613f5f565b8015610d64576000805461ff001916905550565b8054156138fd5760405162461bcd60e51b815260040161088490615521565b60016000818152918101602052604090912080546001600160a01b0319169091179055565b600082613931575060006107e3565b8282028284828161393e57fe5b04146129095760405162461bcd60e51b8152600401610884906154ab565b600061290983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614039565b4390565b60006139b5826301ffc9a760e01b6139d5565b80156107e357506139ce826001600160e01b03196139d5565b1592915050565b60008060006139e48585614070565b915091508180156139f25750805b95945050505050565b6000808211613a1c5760405162461bcd60e51b815260040161088490615257565b818381613a2557fe5b049392505050565b3b151590565b6075546000908290825b81811015613ad757613a4d61445a565b60758281548110613a5a57fe5b600091825260208083206040805160608101825293909101546001600160a01b0381168452600160a01b810461ffff16928401839052600160b01b900460ff1690830152909250613aac908690614165565b9050613ac18260000151828460400151614179565b613acb87826134b7565b96505050600101613a3d565b50929392505050565b6000613aec6070613cbd565b90505b6001600160a01b03811615801590613b225750613b0c6070613cda565b6001600160a01b0316816001600160a01b031614155b15613c46576066546040516370a0823160e01b81526000916001600160a01b03808516926370a0823192613b5a921690600401614b45565b60206040518083038186803b158015613b7257600080fd5b505afa158015613b86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613baa9190614922565b90508015613c33576066546001600160a01b038381166000908152607260205260409081902090516316960d5560e01b815291909216916316960d5591613bf8918791879190600401614b73565b600060405180830381600087803b158015613c1257600080fd5b505af1158015613c26573d6000803e3d6000fd5b50505050613c3382612cb5565b613c3e607083613ce0565b915050613aef565b61101f6070614184565b60665460675460405163358dc31d60e11b81526001600160a01b0392831692636b1b863a92613c8792879287921690600401614c42565b600060405180830381600087803b158015613ca157600080fd5b505af1158015613cb5573d6000803e3d6000fd5b505050505050565b60016000818152910160205260409020546001600160a01b031690565b50600190565b6001600160a01b0380821660009081526001840160205260409020541692915050565b6000613d0f606e613cbd565b90505b6001600160a01b03811615801590613d455750613d2f606e613cda565b6001600160a01b0316816001600160a01b031614155b1561101f576066546040516370a0823160e01b81526000916001600160a01b03808516926370a0823192613d7d921690600401614b45565b60206040518083038186803b158015613d9557600080fd5b505afa158015613da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dcd9190614922565b90508015613e3c57606654604051630ac2ac5160e21b81526001600160a01b0390911690632b0ab14490613e0990869086908690600401614bda565b600060405180830381600087803b158015613e2357600080fd5b505af1158015613e37573d6000803e3d6000fd5b505050505b613e47606e83613ce0565b915050613d12565b6060613ea4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166142209092919063ffffffff16565b805190915015610fbe5780806020019051810190613ec291906147f7565b610fbe5760405162461bcd60e51b81526004016108849061576e565b600054610100900460ff1680613ef75750613ef7612d8d565b80613f05575060005460ff16155b613f215760405162461bcd60e51b815260040161088490615360565b600054610100900460ff161580156138ca576000805460ff1961ff0019909116610100171660011790558015610d64576000805461ff001916905550565b600054610100900460ff1680613f785750613f78612d8d565b80613f86575060005460ff16155b613fa25760405162461bcd60e51b815260040161088490615360565b600054610100900460ff16158015613fcd576000805460ff1961ff0019909116610100171660011790555b6000613fd761287b565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610d64576000805461ff001916905550565b6000818361405a5760405162461bcd60e51b81526004016108849190614db1565b50600083858161406657fe5b0495945050505050565b60008060606301ffc9a760e01b8460405160240161408e9190614d9c565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060866001600160a01b0316617530846040516140e29190614b20565b6000604051808303818686fa925050503d806000811461411e576040519150601f19603f3d011682016040523d82523d6000602084013e614123565b606091505b5091509150602081511015614141576000809450945050505061415e565b818180602001905181019061415691906147f7565b945094505050505b9250929050565b600061290961ffff831684026103e86139fb565b610fbe83838361422f565b6001600081815290820160205260409020546001600160a01b03165b6001600160a01b038116158015906141c257506001600160a01b038116600114155b156141f8576001600160a01b039081166000908152600183016020526040902080546001600160a01b03198116909155166141a0565b50600160008181528282016020526040812080546001600160a01b0319169092179091559055565b60606128738484600085614360565b60665460408051634eb1c24560e11b815290516060926001600160a01b031691639d63848a916004808301926000929190829003018186803b15801561427457600080fd5b505afa158015614288573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526142b0919081019061468d565b905080518260ff1611156142d65760405162461bcd60e51b8152600401610884906156da565b6000818360ff16815181106142e757fe5b602090810291909101015160665460405163358dc31d60e11b81529192506001600160a01b031690636b1b863a9061432790889088908690600401614c42565b600060405180830381600087803b15801561434157600080fd5b505af1158015614355573d6000803e3d6000fd5b505050505050505050565b6060824710156143825760405162461bcd60e51b8152600401610884906151cf565b61438b85613a2d565b6143a75760405162461bcd60e51b8152600401610884906156a3565b60006060866001600160a01b031685876040516143c49190614b20565b60006040518083038185875af1925050503d8060008114614401576040519150601f19603f3d011682016040523d82523d6000602084013e614406565b606091505b5091509150614416828286614421565b979650505050505050565b60608315614430575081612909565b8251156144405782518084602001fd5b8160405162461bcd60e51b81526004016108849190614db1565b604080516060810182526000808252602082018190529181019190915290565b5080546000825590600052602060002090810190610d6491905b808211156134b35760008155600101614494565b60008083601f8401126144b9578081fd5b50813567ffffffffffffffff8111156144d0578182fd5b602083019150836020808302850101111561415e57600080fd5b6000606082840312156144fb578081fd5b6145056060615af1565b9050813561451281615b64565b8152602082013561ffff8116811461452957600080fd5b602082015261453b8360408401614546565b604082015292915050565b803560ff811681146107e357600080fd5b600060208284031215614568578081fd5b813561290981615b64565b600060208284031215614584578081fd5b815161290981615b64565b600080600080608085870312156145a4578283fd5b84356145af81615b64565b935060208501356145bf81615b64565b92506040850135915060608501356145d681615b64565b939692955090935050565b600080604083850312156145f3578081fd5b82356145fe81615b64565b9150602083013561460e81615b79565b809150509250929050565b6000806040838503121561462b578182fd5b825161463681615b64565b6020939093015192949293505050565b6000806000806080858703121561465b578182fd5b843561466681615b64565b935060208501359250604085013561467d81615b64565b915060608501356145d681615b64565b6000602080838503121561469f578182fd5b825167ffffffffffffffff8111156146b5578283fd5b8301601f810185136146c5578283fd5b80516146d86146d382615b18565b615af1565b81815283810190838501858402850186018910156146f4578687fd5b8694505b8385101561471f57805161470b81615b64565b8352600194909401939185019185016146f8565b50979650505050505050565b6000806020838503121561473d578182fd5b823567ffffffffffffffff811115614753578283fd5b61475f858286016144a8565b90969095509350505050565b6000806020838503121561477d578182fd5b823567ffffffffffffffff80821115614794578384fd5b818501915085601f8301126147a7578384fd5b8135818111156147b5578485fd5b8660206060830285010111156147c9578485fd5b60209290920196919550909350505050565b6000602082840312156147ec578081fd5b813561290981615b79565b600060208284031215614808578081fd5b815161290981615b79565b600060208284031215614824578081fd5b81356001600160e01b031981168114612909578182fd5b6000806040838503121561484d578182fd5b823561485881615b64565b9150602083013561460e81615b64565b60008060006040848603121561487c578081fd5b833561488781615b64565b9250602084013567ffffffffffffffff8111156148a2578182fd5b6148ae868287016144a8565b9497909650939450505050565b6000606082840312156148cc578081fd5b61290983836144ea565b600080608083850312156148e8578182fd5b6148f284846144ea565b91506149018460608501614546565b90509250929050565b60006020828403121561491b578081fd5b5035919050565b600060208284031215614933578081fd5b5051919050565b600080600080600080600060e0888a031215614954578485fd5b873596506020808901359650604089013561496e81615b64565b9550606089013561497e81615b64565b9450608089013561498e81615b64565b935060a089013561499e81615b64565b925060c089013567ffffffffffffffff8111156149b9578283fd5b8901601f81018b136149c9578283fd5b80356149d76146d382615b18565b81815283810190838501858402850186018f10156149f3578687fd5b8694505b83851015614a1e578035614a0a81615b64565b8352600194909401939185019185016149f7565b50809550505050505092959891949750929550565b600080600080600080600060e0888a031215614a4d578081fd5b87359650602088013595506040880135614a6681615b64565b94506060880135614a7681615b64565b93506080880135614a8681615b64565b925060a0880135614a9681615b64565b8092505060c0880135905092959891949750929550565b600060208284031215614abe578081fd5b813561290981615b87565b60008060408385031215614adb578182fd5b8251614ae681615b87565b602084015190925061460e81615b87565b80516001600160a01b0316825260208082015161ffff169083015260409081015160ff16910152565b60008251614b32818460208701615b38565b9190910192915050565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03848116825283166020808301919091526060604083018190528354908301819052600084815282812090929091608085019190845b81811015614bcc57845484526001948501949383019301614bb0565b509198975050505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03948516815292841660208401526040830191909152909116606082015260800190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6001600160a01b03948516815260208101939093529083166040830152909116606082015260800190565b6020808252825182820181905260009190848201906040850190845b81811015614cd15783516001600160a01b031683529284019291840191600101614cac565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614cd157614d0c838551614af7565b9284019260609290920191600101614cf9565b6020808252810182905260006001600160fb1b03831115614d3e578081fd5b60208302808560408501379190910160400190815292915050565b6020808252825182820181905260009190848201906040850190845b81811015614cd157835183529284019291840191600101614d75565b901515815260200190565b6001600160e01b031991909116815260200190565b6000602082528251806020840152614dd0816040850160208701615b38565b601f01601f19169190910160400192915050565b60208082526024908201527f506572696f6469635072697a6553747261746567792f6572633732312d696e76604082015263185b1a5960e21b606082015260800190565b6020808252602c908201527f506572696f6469635072697a6553747261746567792f746f6b656e2d6c69737460408201526b195b995c8b5a5b9d985b1a5960a21b606082015260800190565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b602080825260139082015272496e76616c696420707265764164647265737360681b604082015260600190565b6020808252602b908201527f506572696f6469635072697a6553747261746567792f7072697a652d7065726960408201526a37b216b737ba16b7bb32b960a91b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252602c908201527f506572696f6469635072697a6553747261746567792f6f6e6c792d6f776e657260408201526b16b7b916b634b9ba32b732b960a11b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252602a908201527f506572696f6469635072697a6553747261746567792f73706f6e736f72736869604082015269702d6e6f742d7a65726f60b01b606082015260800190565b60208082526028908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c60408201526734ba16ba37b5b2b760c11b606082015260800190565b60208082526034908201527f506572696f6469635072697a6553747261746567792f7072697a652d706572696040820152736f642d677265617465722d7468616e2d7a65726f60601b606082015260800190565b60208082526025908201527f506572696f6469635072697a6553747261746567792f6f6e6c792d7072697a656040820152640b5c1bdbdb60da1b606082015260800190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f7472616e736665722d746040820152653796b9b2b63360d11b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526029908201527f506572696f6469635072697a6553747261746567792f7072697a652d706f6f6c6040820152682d6e6f742d7a65726f60b81b606082015260800190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526022908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d7a65604082015261726f60f01b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d636f6040820152656d706c65746560d01b606082015260800190565b60208082526029908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c6040820152681a5d0b5d185c99d95d60ba1b606082015260800190565b60208082526023908201527f506572696f6469635072697a6553747261746567792f65726332302d696e76616040820152621b1a5960ea1b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526026908201527f4d756c7469706c6557696e6e6572732f6e6f6e6578697374656e742d7072697a604082015265195cdc1b1a5d60d21b606082015260800190565b6020808252818101527f506572696f6469635072697a6553747261746567792f65726332302d6e756c6c604082015260600190565b6020808252602b908201527f506572696f6469635072697a6553747261746567792f726e672d616c7265616460408201526a1e4b5c995c5d595cdd195960aa1b606082015260800190565b6020808252601f908201527f4d756c7469706c6557696e6e6572732f77696e6e6572732d6774652d6f6e6500604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600c908201526b105b1c9958591e481a5b9a5d60a21b604082015260600190565b60208082526033908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c6040820152721a5d0b5c195c98d95b9d1859d94b5d1bdd185b606a1b606082015260800190565b60208082526031908201527f506572696f6469635072697a6553747261746567792f6265666f72654177617260408201527019131a5cdd195b995c8b5a5b9d985b1a59607a1b606082015260800190565b6020808252602b908201527f506572696f6469635072697a6553747261746567792f63616e6e6f742d61776160408201526a1c990b595e1d195c9b985b60aa1b606082015260800190565b6020808252600d908201526c105b1c9958591e481859191959609a1b604082015260600190565b60208082526026908201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360408201526532206269747360d01b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602f908201527f506572696f6469635072697a6553747261746567792f61776172642d696e766160408201526e0d8d2c85ae8ded6cadc5ad2dcc8caf608b1b606082015260800190565b60208082526025908201527f506572696f6469635072697a6553747261746567792f7469636b65742d6e6f746040820152642d7a65726f60d81b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526033908201527f506572696f6469635072697a6553747261746567792f7072697a6553747261746040820152721959de531a5cdd195b995c8b5a5b9d985b1a59606a1b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f6572633732312d6475706040820152656c696361746560d01b606082015260800190565b60208082526023908201527f506572696f6469635072697a6553747261746567792f726e672d696e2d666c6960408201526219da1d60ea1b606082015260800190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d74696040820152651b59591bdd5d60d21b606082015260800190565b6020808252602c908201527f506572696f6469635072697a6553747261746567792f726e672d74696d656f7560408201526b742d67742d36302d7365637360a01b606082015260800190565b60208082526027908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d72656040820152661c5d595cdd195960ca1b606082015260800190565b60208082526027908201527f506572696f6469635072697a6553747261746567792f756e617661696c61626c6040820152663296ba37b5b2b760c91b606082015260800190565b606081016107e38284614af7565b61ffff93909316835260ff919091166020830152604082015260600190565b61ffff93909316835260ff918216602084015216604082015260600190565b918252602082015260400190565b86815260208082018790526001600160a01b0386811660408401528581166060840152848116608084015260c060a08401819052845190840181905260009285810192909160e0860190855b81811015615ace578551841683529484019491840191600101615ab0565b50909c9b505050505050505050505050565b63ffffffff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615b1057600080fd5b604052919050565b600067ffffffffffffffff821115615b2e578081fd5b5060209081020190565b60005b83811015615b53578181015183820152602001615b3b565b83811115610cc45750506000910152565b6001600160a01b0381168114610d6457600080fd5b8015158114610d6457600080fd5b63ffffffff81168114610d6457600080fdfea26469706673582212200b04a034fdc9b603434ff2e14bbf9df827851a7ec270ad4d35335f3752edeb5f64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5BCF DUP1 PUSH3 0x21 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x3E6 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7F2BE9FC GT PUSH2 0x20A JUMPI DUP1 PUSH4 0xB0244682 GT PUSH2 0x125 JUMPI DUP1 PUSH4 0xD18E81B3 GT PUSH2 0xB8 JUMPI DUP1 PUSH4 0xEEFC8AD1 GT PUSH2 0x87 JUMPI DUP1 PUSH4 0xEEFC8AD1 EQ PUSH2 0x762 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x782 JUMPI DUP1 PUSH4 0xF97700E2 EQ PUSH2 0x795 JUMPI DUP1 PUSH4 0xFBF0953E EQ PUSH2 0x7A8 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x7BB JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0xD18E81B3 EQ PUSH2 0x742 JUMPI DUP1 PUSH4 0xD5AD6BF6 EQ PUSH2 0x74A JUMPI DUP1 PUSH4 0xD605787B EQ PUSH2 0x752 JUMPI DUP1 PUSH4 0xDFB2F13B EQ PUSH2 0x75A JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0xC2F19EE8 GT PUSH2 0xF4 JUMPI DUP1 PUSH4 0xC2F19EE8 EQ PUSH2 0x70C JUMPI DUP1 PUSH4 0xC42B42A0 EQ PUSH2 0x714 JUMPI DUP1 PUSH4 0xC48DDBCB EQ PUSH2 0x71C JUMPI DUP1 PUSH4 0xC6853270 EQ PUSH2 0x72F JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0xB0244682 EQ PUSH2 0x6CB JUMPI DUP1 PUSH4 0xB2210957 EQ PUSH2 0x6DE JUMPI DUP1 PUSH4 0xB9EE1E05 EQ PUSH2 0x6F1 JUMPI DUP1 PUSH4 0xC25A9C32 EQ PUSH2 0x6F9 JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x8E204C43 GT PUSH2 0x19D JUMPI DUP1 PUSH4 0x95E5F9EE GT PUSH2 0x16C JUMPI DUP1 PUSH4 0x95E5F9EE EQ PUSH2 0x6A0 JUMPI DUP1 PUSH4 0x9DAFAFB0 EQ PUSH2 0x6A8 JUMPI DUP1 PUSH4 0xA4E075CA EQ PUSH2 0x6B0 JUMPI DUP1 PUSH4 0xACCA5B95 EQ PUSH2 0x6C3 JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x8E204C43 EQ PUSH2 0x652 JUMPI DUP1 PUSH4 0x91C05B0B EQ PUSH2 0x665 JUMPI DUP1 PUSH4 0x94144C6B EQ PUSH2 0x678 JUMPI DUP1 PUSH4 0x9417783F EQ PUSH2 0x680 JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x8AA3EC6F GT PUSH2 0x1D9 JUMPI DUP1 PUSH4 0x8AA3EC6F EQ PUSH2 0x61A JUMPI DUP1 PUSH4 0x8ACFACA9 EQ PUSH2 0x62D JUMPI DUP1 PUSH4 0x8D5F10C4 EQ PUSH2 0x635 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x64A JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x7F2BE9FC EQ PUSH2 0x5D9 JUMPI DUP1 PUSH4 0x7F4296D7 EQ PUSH2 0x5EC JUMPI DUP1 PUSH4 0x876F5C7E EQ PUSH2 0x5FF JUMPI DUP1 PUSH4 0x884A4448 EQ PUSH2 0x607 JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x4E5D08E0 GT PUSH2 0x305 JUMPI DUP1 PUSH4 0x6BE51C4F GT PUSH2 0x298 JUMPI DUP1 PUSH4 0x6F46F221 GT PUSH2 0x267 JUMPI DUP1 PUSH4 0x6F46F221 EQ PUSH2 0x5B1 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x5B9 JUMPI DUP1 PUSH4 0x719CE73E EQ PUSH2 0x5C1 JUMPI DUP1 PUSH4 0x72F33EA9 EQ PUSH2 0x5C9 JUMPI DUP1 PUSH4 0x738BBEA8 EQ PUSH2 0x5D1 JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x6BE51C4F EQ PUSH2 0x586 JUMPI DUP1 PUSH4 0x6BEA5344 EQ PUSH2 0x58E JUMPI DUP1 PUSH4 0x6CC25DB7 EQ PUSH2 0x596 JUMPI DUP1 PUSH4 0x6DFB0386 EQ PUSH2 0x59E JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x62C77A61 GT PUSH2 0x2D4 JUMPI DUP1 PUSH4 0x62C77A61 EQ PUSH2 0x550 JUMPI DUP1 PUSH4 0x66968221 EQ PUSH2 0x558 JUMPI DUP1 PUSH4 0x671137C4 EQ PUSH2 0x56B JUMPI DUP1 PUSH4 0x6A74F107 EQ PUSH2 0x57E JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x4E5D08E0 EQ PUSH2 0x50F JUMPI DUP1 PUSH4 0x500DB70D EQ PUSH2 0x522 JUMPI DUP1 PUSH4 0x52A30109 EQ PUSH2 0x52A JUMPI DUP1 PUSH4 0x605E25AC EQ PUSH2 0x53D JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x2C8FE73D GT PUSH2 0x37D JUMPI DUP1 PUSH4 0x47BED998 GT PUSH2 0x34C JUMPI DUP1 PUSH4 0x47BED998 EQ PUSH2 0x4D9 JUMPI DUP1 PUSH4 0x4ABA4F6B EQ PUSH2 0x4EC JUMPI DUP1 PUSH4 0x4C169F4F EQ PUSH2 0x4F4 JUMPI DUP1 PUSH4 0x4D7F3DB0 EQ PUSH2 0x4FC JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x2C8FE73D EQ PUSH2 0x496 JUMPI DUP1 PUSH4 0x30FCDF41 EQ PUSH2 0x49E JUMPI DUP1 PUSH4 0x38A9B4B6 EQ PUSH2 0x4B1 JUMPI DUP1 PUSH4 0x42D09209 EQ PUSH2 0x4C4 JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x111070E4 GT PUSH2 0x3B9 JUMPI DUP1 PUSH4 0x111070E4 EQ PUSH2 0x451 JUMPI DUP1 PUSH4 0x152D308C EQ PUSH2 0x459 JUMPI DUP1 PUSH4 0x22F8E566 EQ PUSH2 0x46C JUMPI DUP1 PUSH4 0x2A7AD609 EQ PUSH2 0x481 JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x1B48E34 EQ PUSH2 0x3EB JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x414 JUMPI DUP1 PUSH4 0xD847FC4 EQ PUSH2 0x434 JUMPI DUP1 PUSH4 0xFAF125F EQ PUSH2 0x449 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3FE PUSH2 0x3F9 CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0x7D0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x427 PUSH2 0x422 CALLDATASIZE PUSH1 0x4 PUSH2 0x4813 JUMP JUMPDEST PUSH2 0x7E9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x4D91 JUMP JUMPDEST PUSH2 0x43C PUSH2 0x81F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x4B45 JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x82E JUMP JUMPDEST PUSH2 0x427 PUSH2 0x834 JUMP JUMPDEST PUSH2 0x427 PUSH2 0x467 CALLDATASIZE PUSH1 0x4 PUSH2 0x45E1 JUMP JUMPDEST PUSH2 0x843 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x47A CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0x8FA JUMP JUMPDEST STOP JUMPDEST PUSH2 0x489 PUSH2 0x8FF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x5AE0 JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x90B JUMP JUMPDEST PUSH2 0x47F PUSH2 0x4AC CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0x91A JUMP JUMPDEST PUSH2 0x47F PUSH2 0x4BF CALLDATASIZE PUSH1 0x4 PUSH2 0x47DB JUMP JUMPDEST PUSH2 0x9F2 JUMP JUMPDEST PUSH2 0x4CC PUSH2 0xA88 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x4C90 JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x4E7 CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0xA94 JUMP JUMPDEST PUSH2 0x427 PUSH2 0xA9F JUMP JUMPDEST PUSH2 0x47F PUSH2 0xB28 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x50A CALLDATASIZE PUSH1 0x4 PUSH2 0x4646 JUMP JUMPDEST PUSH2 0xBF2 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x51D CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0xCCA JUMP JUMPDEST PUSH2 0x43C PUSH2 0xD67 JUMP JUMPDEST PUSH2 0x427 PUSH2 0x538 CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0xD76 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x54B CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0xE04 JUMP JUMPDEST PUSH2 0x4CC PUSH2 0xEE5 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x566 CALLDATASIZE PUSH1 0x4 PUSH2 0x472B JUMP JUMPDEST PUSH2 0xEF1 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x579 CALLDATASIZE PUSH1 0x4 PUSH2 0x483B JUMP JUMPDEST PUSH2 0xFC3 JUMP JUMPDEST PUSH2 0x427 PUSH2 0x1023 JUMP JUMPDEST PUSH2 0x43C PUSH2 0x103C JUMP JUMPDEST PUSH2 0x489 PUSH2 0x104B JUMP JUMPDEST PUSH2 0x43C PUSH2 0x105F JUMP JUMPDEST PUSH2 0x47F PUSH2 0x5AC CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0x106E JUMP JUMPDEST PUSH2 0x427 PUSH2 0x10BE JUMP JUMPDEST PUSH2 0x47F PUSH2 0x10C7 JUMP JUMPDEST PUSH2 0x43C PUSH2 0x1150 JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x115F JUMP JUMPDEST PUSH2 0x427 PUSH2 0x1165 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x5E7 CALLDATASIZE PUSH1 0x4 PUSH2 0x4A33 JUMP JUMPDEST PUSH2 0x11B8 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x5FA CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0x125C JUMP JUMPDEST PUSH2 0x427 PUSH2 0x1312 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x615 CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0x1331 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x628 CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0x1381 JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x1459 JUMP JUMPDEST PUSH2 0x63D PUSH2 0x145F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x4CDD JUMP JUMPDEST PUSH2 0x43C PUSH2 0x14E4 JUMP JUMPDEST PUSH2 0x427 PUSH2 0x660 CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0x14F3 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x673 CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0x1508 JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x1511 JUMP JUMPDEST PUSH2 0x693 PUSH2 0x68E CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0x1517 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x4D59 JUMP JUMPDEST PUSH2 0x427 PUSH2 0x1583 JUMP JUMPDEST PUSH2 0x427 PUSH2 0x158D JUMP JUMPDEST PUSH2 0x427 PUSH2 0x6BE CALLDATASIZE PUSH1 0x4 PUSH2 0x47DB JUMP JUMPDEST PUSH2 0x1596 JUMP JUMPDEST PUSH2 0x489 PUSH2 0x161D JUMP JUMPDEST PUSH2 0x47F PUSH2 0x6D9 CALLDATASIZE PUSH1 0x4 PUSH2 0x483B JUMP JUMPDEST PUSH2 0x1629 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x6EC CALLDATASIZE PUSH1 0x4 PUSH2 0x458F JUMP JUMPDEST PUSH2 0x16B4 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x1785 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x707 CALLDATASIZE PUSH1 0x4 PUSH2 0x476B JUMP JUMPDEST PUSH2 0x19CD JUMP JUMPDEST PUSH2 0x43C PUSH2 0x1D5C JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x1D6B JUMP JUMPDEST PUSH2 0x47F PUSH2 0x72A CALLDATASIZE PUSH1 0x4 PUSH2 0x4868 JUMP JUMPDEST PUSH2 0x1DE8 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x73D CALLDATASIZE PUSH1 0x4 PUSH2 0x4AAD JUMP JUMPDEST PUSH2 0x1FDD JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x202D JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x2033 JUMP JUMPDEST PUSH2 0x43C PUSH2 0x203D JUMP JUMPDEST PUSH2 0x47F PUSH2 0x204C JUMP JUMPDEST PUSH2 0x775 PUSH2 0x770 CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0x22CE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x5A0A JUMP JUMPDEST PUSH2 0x47F PUSH2 0x790 CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0x2333 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x7A3 CALLDATASIZE PUSH1 0x4 PUSH2 0x493A JUMP JUMPDEST PUSH2 0x23F4 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x7B6 CALLDATASIZE PUSH1 0x4 PUSH2 0x48D6 JUMP JUMPDEST PUSH2 0x2655 JUMP JUMPDEST PUSH2 0x7C3 PUSH2 0x27F4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x4DB1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7E3 PUSH2 0x7DD PUSH2 0x2815 JUMP JUMPDEST DUP4 PUSH2 0x2852 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL EQ DUP1 PUSH2 0x7E3 JUMPI POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT EQ SWAP1 JUMP JUMPDEST PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x7A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH4 0xFFFFFFFF AND ISZERO ISZERO JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x84D PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x85E PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x88D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x895 PUSH2 0x287F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x78 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP6 ISZERO ISZERO OR SWAP1 SSTORE MLOAD PUSH32 0xD1AC9A365C0E3BFAD562E0A809A5DED3842A2B489F839B3327E4E34EE0128F28 SWAP1 PUSH2 0x8E9 SWAP1 DUP6 SWAP1 PUSH2 0x4D91 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x7B SSTORE JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x915 PUSH2 0x28D4 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x922 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x933 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x959 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x961 PUSH2 0x287F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0x98C JUMPI POP PUSH2 0x98C PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH4 0x266FCE1F PUSH1 0xE1 SHL PUSH2 0x28ED JUMP JUMPDEST PUSH2 0x9A8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x559A JUMP JUMPDEST PUSH1 0x73 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xC4FEFF61630891EA2CB42A54FBE3FF2E65422F2ED17323AC6B65F4521112E87E SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH2 0x9FA PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xA0B PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xA31 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0xA39 PUSH2 0x287F JUMP JUMPDEST PUSH1 0x77 DUP1 SLOAD PUSH1 0xFF NOT AND DUP3 ISZERO ISZERO OR SWAP1 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x6959D02E8FB6264D1D39BF37F1E725001F342714933CF38F8627A2442EFC43FD SWAP2 PUSH2 0xA7D SWAP2 PUSH1 0xFF SWAP1 SWAP2 AND SWAP1 PUSH2 0x4D91 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x915 PUSH1 0x70 PUSH2 0x2910 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7E3 DUP3 PUSH2 0x29F0 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x6A SLOAD PUSH1 0x40 MLOAD PUSH4 0xE866E6F PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x3A19B9BC SWAP2 PUSH2 0xAD8 SWAP2 PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x4 ADD PUSH2 0x5AE0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xAF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xB04 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x915 SWAP2 SWAP1 PUSH2 0x47F7 JUMP JUMPDEST PUSH2 0xB30 PUSH2 0x1165 JUMP JUMPDEST PUSH2 0xB4C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x58EA JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF NOT DUP2 AND SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH4 0xFFFFFFFF DUP1 DUP4 AND SWAP3 PUSH5 0x100000000 SWAP1 DIV AND SWAP1 PUSH32 0xEE6702C46C5618E6FC7E625C71F4C85DF9C91D456CB16A3AEA71AB83B1FEE005 SWAP1 PUSH1 0x0 SWAP1 LOG1 PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0xFFFFFFFF DUP5 AND SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 CALLER SWAP1 PUSH32 0xD50026EE0824513AF20CDF5E72D1FBFBE8FD646EE0576378E080326F1A695E58 SWAP1 PUSH2 0xBE6 SWAP1 DUP7 SWAP1 PUSH2 0x5AE0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xC06 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xC2C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x50C4 JUMP JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0xC4A JUMPI PUSH2 0xC4A PUSH2 0x287F JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0xCC4 JUMPI PUSH1 0x65 SLOAD PUSH1 0x40 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x4D7F3DB0 SWAP1 PUSH2 0xC91 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x4C65 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xCBF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0xCD2 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xCE3 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0xD12 JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xD07 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0xD37 JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xD2C PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0xD53 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4F5B JUMP JUMPDEST PUSH2 0xD5B PUSH2 0x287F JUMP JUMPDEST PUSH2 0xD64 DUP2 PUSH2 0x2A37 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xD80 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xD91 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xDB7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0xDBF PUSH2 0x287F JUMP JUMPDEST PUSH1 0x7A DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x63E4E34F49D12428C03E04E61340C7167E36EB0FF6F0B1970C75440261794039 SWAP1 PUSH2 0xDF4 SWAP1 DUP5 SWAP1 PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP PUSH1 0x1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xE0C PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE1D PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xE43 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0xE4B PUSH2 0x287F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0xE79 JUMPI POP PUSH2 0xE79 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x28ED JUMP JUMPDEST PUSH2 0xE95 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4E28 JUMP JUMPDEST PUSH1 0x65 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 AND SWAP1 PUSH32 0x9FC437AA70AD4EE5F33F6772BF338EED41E21B95435820817AB8B4DF161CE4DD SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x915 PUSH1 0x6E PUSH2 0x2910 JUMP JUMPDEST PUSH2 0xEF9 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF0A PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0xF39 JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF2E PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0xF5E JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF53 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0xF7A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4F5B JUMP JUMPDEST PUSH2 0xF82 PUSH2 0x287F JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xFBE JUMPI PUSH2 0xFB6 DUP4 DUP4 DUP4 DUP2 DUP2 LT PUSH2 0xF9C JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0xFB1 SWAP2 SWAP1 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0x2A37 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xF85 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xFCB PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xFDC PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1002 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x100A PUSH2 0x287F JUMP JUMPDEST PUSH2 0x1016 PUSH1 0x70 DUP3 DUP5 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0x101F DUP3 PUSH2 0x2CB5 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x102D PUSH2 0x834 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x915 JUMPI POP PUSH2 0x915 PUSH2 0xA9F JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH5 0x100000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1076 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1087 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x10AD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x10B5 PUSH2 0x287F JUMP JUMPDEST PUSH2 0xD64 DUP2 PUSH2 0x2D0D JUMP JUMPDEST PUSH1 0x79 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x10CF PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x10E0 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1106 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x6D SLOAD DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND PUSH2 0x1184 JUMPI POP PUSH1 0x0 PUSH2 0x840 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH1 0x6B SLOAD PUSH2 0x11A8 SWAP2 PUSH4 0xFFFFFFFF SWAP2 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 SWAP2 DIV DUP2 AND SWAP1 PUSH2 0x2D62 AND JUMP JUMPDEST PUSH2 0x11B0 PUSH2 0x2D87 JUMP JUMPDEST GT SWAP1 POP PUSH2 0x840 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x11D1 JUMPI POP PUSH2 0x11D1 PUSH2 0x2D8D JUMP JUMPDEST DUP1 PUSH2 0x11DF JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x11FB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5360 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1226 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x60 PUSH2 0x1237 DUP10 DUP10 DUP10 DUP10 DUP10 DUP10 DUP8 PUSH2 0x23F4 JUMP JUMPDEST PUSH2 0x1240 DUP4 PUSH2 0x2D0D JUMP JUMPDEST POP DUP1 ISZERO PUSH2 0xCBF JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1264 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1275 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x129B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x12A3 PUSH2 0x287F JUMP JUMPDEST PUSH2 0x12AB PUSH2 0x834 JUMP JUMPDEST ISZERO PUSH2 0x12C8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x58A7 JUMP JUMPDEST PUSH1 0x69 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xF935763CC7C57EE8ED6318ED71E756CCA0731294C9F46FF5B386F36D6FF1417A SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x131C PUSH2 0x2D98 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x915 JUMPI POP PUSH2 0x132B PUSH2 0x834 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x1339 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x134A PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1370 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x1378 PUSH2 0x287F JUMP JUMPDEST PUSH2 0xD64 DUP2 PUSH2 0x2DB1 JUMP JUMPDEST PUSH2 0x1389 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x139A PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x13C0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x13C8 PUSH2 0x287F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0x13F3 JUMPI POP PUSH2 0x13F3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH4 0x2BA83963 PUSH1 0xE1 SHL PUSH2 0x28ED JUMP JUMPDEST PUSH2 0x140F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x57B8 JUMP JUMPDEST PUSH1 0x74 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xDA05D50A3A1EC0FFAB059F1D457AE59F68CCFB3FFBB4DAD283C516F9103D584B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x76 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x75 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0x14DB JUMPI PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 SWAP1 DUP2 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP2 DUP6 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND DUP4 DUP6 ADD MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP3 ADD MSTORE DUP3 MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 ADD PUSH2 0x1483 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x78 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0xD64 DUP2 PUSH2 0x2E06 JUMP JUMPDEST PUSH1 0x6C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD DUP4 MLOAD DUP2 DUP5 MUL DUP2 ADD DUP5 ADD SWAP1 SWAP5 MSTORE DUP1 DUP5 MSTORE PUSH1 0x60 SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1577 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x1563 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x915 PUSH2 0x2D98 JUMP JUMPDEST PUSH1 0x77 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15A0 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x15B1 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x15D7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x15DF PUSH2 0x287F JUMP JUMPDEST PUSH1 0x79 DUP1 SLOAD PUSH1 0xFF NOT AND DUP4 ISZERO ISZERO OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x2B4B6FFE286F7CE4CCC6B136BB14987B0A00092174D88938A0C667A104A4A731 SWAP1 PUSH2 0xDF4 SWAP1 DUP5 SWAP1 PUSH2 0x4D91 JUMP JUMPDEST PUSH1 0x6B SLOAD PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x1631 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1642 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1668 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x1670 PUSH2 0x287F JUMP JUMPDEST PUSH2 0x167C PUSH1 0x6E DUP3 DUP5 PUSH2 0x2BEB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 PUSH32 0x58982464497ACDAB11AD29D39907E076B0D3B8DAF1D9B734174C7C3A2A0E8C74 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16C8 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x16EE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x50C4 JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x1720 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5109 JUMP JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x173E JUMPI PUSH2 0x173E PUSH2 0x287F JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0xCC4 JUMPI PUSH1 0x65 SLOAD PUSH1 0x40 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xB2210957 SWAP1 PUSH2 0xC91 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x4BFE JUMP JUMPDEST PUSH2 0x178D PUSH2 0x2D98 JUMP JUMPDEST PUSH2 0x17A9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4ECA JUMP JUMPDEST PUSH2 0x17B1 PUSH2 0x834 JUMP JUMPDEST ISZERO PUSH2 0x17CE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5429 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xD37B537 PUSH1 0xE0 SHL DUP2 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP3 PUSH4 0xD37B537 SWAP3 PUSH1 0x4 DUP1 DUP4 ADD SWAP4 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1813 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1827 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x184B SWAP2 SWAP1 PUSH2 0x4619 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1868 JUMPI POP PUSH1 0x0 DUP2 GT JUMPDEST ISZERO PUSH2 0x1887 JUMPI PUSH1 0x69 SLOAD PUSH2 0x1887 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND SWAP2 AND DUP4 PUSH2 0x3393 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x433C53D9 PUSH1 0xE1 SHL DUP2 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP3 PUSH4 0x8678A7B2 SWAP3 PUSH1 0x4 DUP1 DUP4 ADD SWAP4 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x18E1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1905 SWAP2 SWAP1 PUSH2 0x4AC9 JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH4 0xFFFFFFFF DUP1 DUP5 AND PUSH5 0x100000000 MUL PUSH8 0xFFFFFFFF00000000 NOT SWAP2 DUP7 AND PUSH4 0xFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR AND OR SWAP1 SSTORE SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x194B PUSH2 0x1946 PUSH2 0x2D87 JUMP JUMPDEST PUSH2 0x348D JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFF0000000000000000 NOT AND PUSH1 0x1 PUSH1 0x40 SHL PUSH4 0xFFFFFFFF SWAP4 DUP5 AND MUL OR SWAP1 SSTORE PUSH1 0x66 SLOAD SWAP1 DUP4 AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1987 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x4D31E658DCF617BB3A3C8CF7C6DDDB33F7030AC588E271631ECDB5D76C2E91EF DUP5 PUSH1 0x40 MLOAD PUSH2 0x19BF SWAP2 SWAP1 PUSH2 0x5AE0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP JUMP JUMPDEST PUSH2 0x19D5 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x19E6 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1A0C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1CB1 JUMPI PUSH2 0x1A20 PUSH2 0x445A JUMP JUMPDEST DUP5 DUP5 DUP4 DUP2 DUP2 LT PUSH2 0x1A2C JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x60 MUL ADD DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x1A42 SWAP2 SWAP1 PUSH2 0x48BB JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP2 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND GT ISZERO PUSH2 0x1A6C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5028 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A93 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x52D4 JUMP JUMPDEST PUSH1 0x75 SLOAD DUP3 LT PUSH2 0x1B2F JUMPI PUSH1 0x75 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE PUSH1 0x0 SWAP2 SWAP1 SWAP2 MSTORE DUP2 MLOAD PUSH32 0x9A8D93986A7B9E6294572EA6736696119C195C1A9F5EAE642D3C5FCD44E49DEA SWAP1 SWAP2 ADD DUP1 SLOAD PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x40 DUP6 ADD MLOAD PUSH1 0xFF AND PUSH1 0x1 PUSH1 0xB0 SHL MUL PUSH1 0xFF PUSH1 0xB0 SHL NOT PUSH2 0xFFFF SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xA0 SHL MUL PUSH2 0xFFFF PUSH1 0xA0 SHL NOT PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP7 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP5 SWAP1 SWAP5 AND SWAP2 SWAP1 SWAP2 OR AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x1C56 JUMP JUMPDEST PUSH2 0x1B37 PUSH2 0x445A JUMP JUMPDEST PUSH1 0x75 DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x1B44 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND DUP1 DUP6 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP4 DIV PUSH2 0xFFFF AND SWAP6 DUP6 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 SWAP2 DIV PUSH1 0xFF AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP5 MLOAD SWAP2 SWAP4 POP AND EQ ISZERO DUP1 PUSH2 0x1BB3 JUMPI POP DUP1 PUSH1 0x20 ADD MLOAD PUSH2 0xFFFF AND DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0xFFFF AND EQ ISZERO JUMPDEST DUP1 PUSH2 0x1BCC JUMPI POP DUP1 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND DUP3 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x1C4D JUMPI DUP2 PUSH1 0x75 DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x1BDF JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 DUP4 MLOAD SWAP2 ADD DUP1 SLOAD SWAP3 DUP5 ADD MLOAD PUSH1 0x40 SWAP1 SWAP5 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP4 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH2 0xFFFF PUSH1 0xA0 SHL NOT AND PUSH1 0x1 PUSH1 0xA0 SHL PUSH2 0xFFFF SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 MUL SWAP3 SWAP1 SWAP3 OR PUSH1 0xFF PUSH1 0xB0 SHL NOT AND PUSH1 0x1 PUSH1 0xB0 SHL PUSH1 0xFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE PUSH2 0x1C54 JUMP JUMPDEST POP POP PUSH2 0x1CA9 JUMP JUMPDEST POP JUMPDEST DUP1 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC1BF93444A0055A24A7D0154B75FEDF78EDFE355C06A2CE8E47F9F3908720559 DUP3 PUSH1 0x20 ADD MLOAD DUP4 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 MLOAD PUSH2 0x1C9F SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5A18 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x1A10 JUMP JUMPDEST POP JUMPDEST PUSH1 0x75 SLOAD DUP2 LT ISZERO PUSH2 0x1D2E JUMPI PUSH1 0x75 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x1CCE SWAP1 PUSH1 0x1 PUSH2 0x34B7 JUMP JUMPDEST SWAP1 POP PUSH1 0x75 DUP1 SLOAD DUP1 PUSH2 0x1CDB JUMPI INVALID JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 DUP3 ADD PUSH1 0x0 NOT SWAP1 DUP2 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xB8 SHL SUB NOT AND SWAP1 SSTORE SWAP1 SWAP2 ADD SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD DUP3 SWAP2 PUSH32 0x99FA473FDF53414BCD014CF6E7509FC58C68F7B86174767FAA6AD5100CD5BAE5 SWAP2 LOG2 POP PUSH2 0x1CB3 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1D38 PUSH2 0x34DF JUMP JUMPDEST SWAP1 POP PUSH2 0x3E8 DUP2 GT ISZERO PUSH2 0xCC4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5547 JUMP JUMPDEST PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x18C1996D PUSH1 0xE2 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x630665B4 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1DB0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1DC4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x915 SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST PUSH2 0x1DF0 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E01 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0x1E30 JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E25 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0x1E55 JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E4A PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0x1E71 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4F5B JUMP JUMPDEST PUSH2 0x1E79 PUSH2 0x287F JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x6A3FD4F9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x6A3FD4F9 SWAP1 PUSH2 0x1EA9 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B45 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1EC1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1ED5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1EF9 SWAP2 SWAP1 PUSH2 0x47F7 JUMP JUMPDEST PUSH2 0x1F15 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x55EB JUMP JUMPDEST PUSH2 0x1F2F PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH4 0x80AC58CD PUSH1 0xE0 SHL PUSH2 0x28ED JUMP JUMPDEST PUSH2 0x1F4B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4DE4 JUMP JUMPDEST PUSH2 0x1F56 PUSH1 0x70 DUP5 PUSH2 0x3571 JUMP JUMPDEST PUSH2 0x1F65 JUMPI PUSH2 0x1F65 PUSH1 0x70 DUP5 PUSH2 0x35C2 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1F94 JUMPI PUSH2 0x1F8C DUP5 DUP5 DUP5 DUP5 DUP2 DUP2 LT PUSH2 0x1F80 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH2 0x368A JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x1F68 JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x51541DC4B4C08A16085809CCCDC4CC77D8000B60FBB00142E57F236D84298675 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH2 0x1FD0 SWAP3 SWAP2 SWAP1 PUSH2 0x4D1F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP JUMP JUMPDEST PUSH2 0x1FE5 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1FF6 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x201C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x2024 PUSH2 0x287F JUMP JUMPDEST PUSH2 0xD64 DUP2 PUSH2 0x37DB JUMP JUMPDEST PUSH1 0x7B SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x915 PUSH2 0x2815 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x2054 PUSH2 0x834 JUMP JUMPDEST PUSH2 0x2070 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x597C JUMP JUMPDEST PUSH2 0x2078 PUSH2 0xA9F JUMP JUMPDEST PUSH2 0x2094 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x528E JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x6A SLOAD PUSH1 0x40 MLOAD PUSH4 0x13A54BF3 PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x9D2A5F98 SWAP2 PUSH2 0x20CD SWAP2 PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x4 ADD PUSH2 0x5AE0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x20E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x20FB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x211F SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE PUSH1 0x73 SLOAD SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x21AF JUMPI PUSH1 0x73 SLOAD PUSH1 0x6D SLOAD PUSH1 0x40 MLOAD PUSH4 0x266FCE1F PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x4CDF9C3E SWAP2 PUSH2 0x217C SWAP2 DUP6 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x5A56 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2196 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x21AA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x21B8 DUP2 PUSH2 0x2E06 JUMP JUMPDEST PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2230 JUMPI PUSH1 0x74 SLOAD PUSH1 0x6D SLOAD PUSH1 0x40 MLOAD PUSH4 0x2BA83963 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x575072C6 SWAP2 PUSH2 0x21FD SWAP2 DUP6 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x5A56 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2217 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x222B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x2240 PUSH2 0x223B PUSH2 0x2D87 JUMP JUMPDEST PUSH2 0x29F0 JUMP JUMPDEST PUSH1 0x6D SSTORE PUSH2 0x224B PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x9C4163ECE98173EAB9A496C4DB8BF3E2C8EDCC5D2854377880597CCB858B7A9D DUP3 PUSH1 0x40 MLOAD PUSH2 0x2283 SWAP2 SWAP1 PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x6D SLOAD PUSH2 0x2296 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC61852C20F0B03B31D782F3022F2BF20322AC17CE66C5349FB6E24740CDD6456 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP JUMP JUMPDEST PUSH2 0x22D6 PUSH2 0x445A JUMP JUMPDEST PUSH1 0x75 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x22E3 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP4 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 SWAP3 DIV PUSH1 0xFF AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x233B PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x234C PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2372 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x2398 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4F15 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x240D JUMPI POP PUSH2 0x240D PUSH2 0x2D8D JUMP JUMPDEST DUP1 PUSH2 0x241B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2437 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5360 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2462 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH2 0x2488 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5186 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x24AE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5729 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x24D4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4FDE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x24FA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5215 JUMP JUMPDEST PUSH1 0x66 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP10 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SWAP3 SSTORE PUSH1 0x67 DUP1 SLOAD DUP9 DUP5 AND SWAP1 DUP4 AND OR SWAP1 SSTORE PUSH1 0x69 DUP1 SLOAD DUP7 DUP5 AND SWAP1 DUP4 AND OR SWAP1 SSTORE PUSH1 0x68 DUP1 SLOAD SWAP3 DUP8 AND SWAP3 SWAP1 SWAP2 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x254D DUP8 PUSH2 0x2DB1 JUMP JUMPDEST PUSH2 0x2555 PUSH2 0x384C JUMP JUMPDEST PUSH2 0x255F PUSH1 0x6E PUSH2 0x38DE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 MLOAD DUP2 LT ISZERO PUSH2 0x258F JUMPI PUSH2 0x2587 DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x257A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x2A37 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2562 JUMP JUMPDEST POP PUSH1 0x6C DUP8 SWAP1 SSTORE PUSH1 0x6D DUP9 SWAP1 SSTORE PUSH2 0x25A4 PUSH1 0x70 PUSH2 0x38DE JUMP JUMPDEST PUSH2 0x25AF PUSH2 0x708 PUSH2 0x37DB JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xF9632D212436344A25150FF0C161DABF412AADE556621C2DEA146CA63FF643F5 DUP10 DUP10 DUP9 DUP9 DUP9 DUP9 PUSH1 0x40 MLOAD PUSH2 0x25F2 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5A64 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x6D SLOAD PUSH2 0x2605 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC61852C20F0B03B31D782F3022F2BF20322AC17CE66C5349FB6E24740CDD6456 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 DUP1 ISZERO PUSH2 0xCBF JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x265D PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x266E PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2694 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH1 0x75 SLOAD PUSH1 0xFF DUP3 AND LT PUSH2 0x26B8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x53AE JUMP JUMPDEST PUSH1 0x1 DUP3 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND GT ISZERO PUSH2 0x26E0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5028 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2707 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x52D4 JUMP JUMPDEST DUP2 PUSH1 0x75 DUP3 PUSH1 0xFF AND DUP2 SLOAD DUP2 LT PUSH2 0x2718 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 DUP5 MLOAD SWAP3 ADD DUP1 SLOAD SWAP2 DUP6 ADD MLOAD PUSH1 0x40 SWAP1 SWAP6 ADD MLOAD PUSH1 0xFF AND PUSH1 0x1 PUSH1 0xB0 SHL MUL PUSH1 0xFF PUSH1 0xB0 SHL NOT PUSH2 0xFFFF SWAP1 SWAP7 AND PUSH1 0x1 PUSH1 0xA0 SHL MUL PUSH2 0xFFFF PUSH1 0xA0 SHL NOT PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP4 SWAP1 SWAP4 AND SWAP2 SWAP1 SWAP2 OR SWAP4 SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE PUSH2 0x2787 PUSH2 0x34DF JUMP JUMPDEST SWAP1 POP PUSH2 0x3E8 DUP2 GT ISZERO PUSH2 0x27AB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5547 JUMP JUMPDEST DUP3 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC1BF93444A0055A24A7D0154B75FEDF78EDFE355C06A2CE8E47F9F3908720559 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 MLOAD PUSH2 0x1FD0 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5A37 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2820 PUSH2 0x28D4 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x282C PUSH2 0x2D87 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 GT ISZERO PUSH2 0x2841 JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x840 JUMP JUMPDEST PUSH2 0x284B DUP3 DUP3 PUSH2 0x34B7 JUMP JUMPDEST SWAP3 POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2867 PUSH8 0xDE0B6B3A7640000 DUP6 PUSH2 0x3922 JUMP JUMPDEST SWAP1 POP PUSH2 0x2873 DUP2 DUP5 PUSH2 0x395C JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2889 PUSH2 0x399E JUMP JUMPDEST PUSH1 0x6A SLOAD SWAP1 SWAP2 POP PUSH5 0x100000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND ISZERO DUP1 PUSH2 0x28B8 JUMPI POP PUSH1 0x6A SLOAD PUSH5 0x100000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP2 LT JUMPDEST PUSH2 0xD64 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x58A7 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x915 PUSH1 0x6C SLOAD PUSH1 0x6D SLOAD PUSH2 0x2D62 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28F8 DUP4 PUSH2 0x39A2 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x2909 JUMPI POP PUSH2 0x2909 DUP4 DUP4 PUSH2 0x39D5 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 PUSH1 0x0 ADD SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x292E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x2958 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x299B JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST ISZERO PUSH2 0x29E7 JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x29AD JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x20 SWAP2 DUP3 MUL SWAP3 SWAP1 SWAP3 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP1 DUP9 ADD SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP3 SWAP1 SWAP2 ADD SWAP2 AND PUSH2 0x2979 JUMP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2A14 PUSH1 0x6C SLOAD PUSH2 0x2A0E PUSH1 0x6D SLOAD DUP7 PUSH2 0x34B7 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 PUSH2 0x39FB JUMP JUMPDEST SWAP1 POP PUSH2 0x2909 PUSH2 0x2A2E PUSH1 0x6C SLOAD DUP4 PUSH2 0x3922 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x6D SLOAD SWAP1 PUSH2 0x2D62 JUMP JUMPDEST PUSH2 0x2A49 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3A2D JUMP JUMPDEST PUSH2 0x2A65 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x53F4 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x6A3FD4F9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x6A3FD4F9 SWAP1 PUSH2 0x2A95 SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B45 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2AAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2AC1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2AE5 SWAP2 SWAP1 PUSH2 0x47F7 JUMP JUMPDEST PUSH2 0x2B01 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x55EB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x4 DUP2 MSTORE PUSH1 0x24 DUP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0xE0 SHL OR SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x60 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP2 PUSH2 0x2B45 SWAP2 PUSH2 0x4B20 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x2B80 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x2B85 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x2BA7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x531D JUMP JUMPDEST PUSH2 0x2BB2 PUSH1 0x6E DUP5 PUSH2 0x35C2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH32 0xBCD6D991F3416E288BF59A2997B423772937B62C7EA7DD1A54AF7771DE1F7418 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x2C0D JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO ISZERO JUMPDEST PUSH2 0x2C29 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4E74 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 AND SWAP1 DUP3 AND EQ PUSH2 0x2C67 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4E9D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD SWAP6 DUP6 AND DUP4 MSTORE SWAP1 DUP3 KECCAK256 DUP1 SLOAD SWAP6 SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP6 DUP7 AND OR SWAP1 SWAP4 SSTORE MSTORE DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x2CD6 SWAP2 PUSH2 0x447A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH32 0xCD64D9DACD230C5CCF1278EA5332B0621AA28C950FB0E61C8FBC9E2011C88A34 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP2 GT PUSH2 0x2D2D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5474 JUMP JUMPDEST PUSH1 0x76 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0xC44C7222E8DF09744CED394101DF47E78DEDB642D3065267BB388901DE9DF6D4 SWAP1 PUSH2 0xA7D SWAP1 DUP4 SWAP1 PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x2909 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4FA7 JUMP JUMPDEST PUSH1 0x7B SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x132B ADDRESS PUSH2 0x3A2D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2DA2 PUSH2 0x28D4 JUMP JUMPDEST PUSH2 0x2DAA PUSH2 0x2D87 JUMP JUMPDEST LT ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 GT PUSH2 0x2DD1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5070 JUMP JUMPDEST PUSH1 0x6C DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0xD379C1A7282461E725A9DC2D74E65246C77E98AE93835E26C2F1654C48EE4EC SWAP1 PUSH2 0xA7D SWAP1 DUP4 SWAP1 PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xE6D8A94B PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xE6D8A94B SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2E4C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2E60 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2E84 SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST SWAP1 POP PUSH2 0x2E8F DUP2 PUSH2 0x3A33 JUMP JUMPDEST SWAP1 POP PUSH1 0x67 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2EDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2EF3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2F17 SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST PUSH2 0x2F4A JUMPI PUSH1 0x40 MLOAD PUSH32 0x3728FEB3FC1EF1BF4A24036AFBE7D34B59C551BF0D2AB5564E87EC1734FA80DD SWAP1 PUSH1 0x0 SWAP1 LOG1 POP PUSH2 0xD64 JUMP JUMPDEST PUSH1 0x79 SLOAD PUSH1 0x76 SLOAD PUSH1 0xFF SWAP1 SWAP2 AND SWAP1 PUSH1 0x60 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x2F6F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x2F99 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x7A SLOAD SWAP1 SWAP2 POP DUP6 SWAP1 PUSH1 0x0 SWAP1 DUP2 SWAP1 JUMPDEST DUP6 DUP4 LT ISZERO PUSH2 0x3144 JUMPI PUSH1 0x67 SLOAD PUSH1 0x40 MLOAD PUSH4 0x3B304147 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x3B304147 SWAP1 PUSH2 0x2FE1 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2FF9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x300D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3031 SWAP2 SWAP1 PUSH2 0x4573 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x78 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND PUSH2 0x308C JUMPI DUP1 DUP7 DUP6 DUP1 PUSH1 0x1 ADD SWAP7 POP DUP2 MLOAD DUP2 LT PUSH2 0x3067 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP PUSH2 0x3105 JUMP JUMPDEST DUP2 DUP4 PUSH1 0x1 ADD SWAP4 POP DUP4 LT PUSH2 0x3105 JUMPI PUSH32 0xB5F728FCB182000EB8E953C15F6795F07B6CDA75B35EF0B65645B53AAC636945 DUP5 PUSH1 0x40 MLOAD PUSH2 0x30C8 SWAP2 SWAP1 PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP4 PUSH2 0x30FF JUMPI PUSH1 0x40 MLOAD PUSH32 0x3728FEB3FC1EF1BF4A24036AFBE7D34B59C551BF0D2AB5564E87EC1734FA80DD SWAP1 PUSH1 0x0 SWAP1 LOG1 JUMPDEST POP PUSH2 0x3144 JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH2 0x209 MUL DUP7 PUSH2 0x1F3 ADD ADD PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x3122 SWAP2 SWAP1 PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SWAP6 POP PUSH2 0x2FA8 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x3161 DUP6 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x3154 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x3AE0 JUMP JUMPDEST PUSH1 0x0 DUP8 PUSH2 0x3177 JUMPI PUSH2 0x3172 DUP10 DUP6 PUSH2 0x39FB JUMP JUMPDEST PUSH2 0x3181 JUMP JUMPDEST PUSH2 0x3181 DUP10 DUP9 PUSH2 0x39FB JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x31BB JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x31B9 JUMPI PUSH2 0x31B1 DUP8 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x31A3 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP4 PUSH2 0x3C50 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x318C JUMP JUMPDEST POP JUMPDEST PUSH1 0x77 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x336A JUMPI PUSH1 0x0 PUSH2 0x31D2 PUSH1 0x6E PUSH2 0x3CBD JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x3208 JUMPI POP PUSH2 0x31F2 PUSH1 0x6E PUSH2 0x3CDA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x3364 JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP3 PUSH4 0x70A08231 SWAP3 PUSH2 0x3240 SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4B45 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3258 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x326C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3290 SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP11 PUSH2 0x32A8 JUMPI PUSH2 0x32A3 DUP3 DUP9 PUSH2 0x39FB JUMP JUMPDEST PUSH2 0x32B2 JUMP JUMPDEST PUSH2 0x32B2 DUP3 DUP12 PUSH2 0x39FB JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x3350 JUMPI PUSH1 0x0 JUMPDEST DUP8 DUP2 LT ISZERO PUSH2 0x334E JUMPI PUSH1 0x66 SLOAD DUP11 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x2B0AB144 SWAP1 DUP13 SWAP1 DUP5 SWAP1 DUP2 LT PUSH2 0x32E8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP7 DUP6 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3310 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4BDA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x332A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x333E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0x32BD SWAP1 POP JUMP JUMPDEST POP JUMPDEST PUSH2 0x335B PUSH1 0x6E DUP5 PUSH2 0x3CE0 JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x31D5 JUMP JUMPDEST POP PUSH2 0x3387 JUMP JUMPDEST PUSH2 0x3387 DUP7 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x337A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x3D03 JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 ISZERO DUP1 PUSH2 0x341B JUMPI POP PUSH1 0x40 MLOAD PUSH4 0x6EB1769F PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH4 0xDD62ED3E SWAP1 PUSH2 0x33C9 SWAP1 ADDRESS SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B59 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x33E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x33F5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3419 SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST ISZERO JUMPDEST PUSH2 0x3437 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x580B JUMP JUMPDEST PUSH2 0xFBE DUP4 PUSH4 0x95EA7B3 PUSH1 0xE0 SHL DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x3456 SWAP3 SWAP2 SWAP1 PUSH2 0x4C29 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE PUSH2 0x3E4F JUMP JUMPDEST PUSH1 0x0 PUSH5 0x100000000 DUP3 LT PUSH2 0x34B3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x565D JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x34D9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x514F JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x75 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP2 JUMPDEST DUP2 DUP2 PUSH1 0xFF AND LT ISZERO PUSH2 0x3569 JUMPI PUSH2 0x34FC PUSH2 0x445A JUMP JUMPDEST PUSH1 0x75 DUP3 PUSH1 0xFF AND DUP2 SLOAD DUP2 LT PUSH2 0x350C JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP3 ADD MSTORE SWAP2 POP PUSH2 0x355E SWAP1 DUP6 SWAP1 PUSH2 0x2D62 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x1 ADD PUSH2 0x34E9 JUMP JUMPDEST POP SWAP1 SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x3595 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x2909 JUMPI POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD AND ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x35E4 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO ISZERO JUMPDEST PUSH2 0x3600 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4E74 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x363A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5636 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE DUP4 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP6 DUP7 AND DUP1 DUP6 MSTORE SWAP3 DUP5 KECCAK256 DUP1 SLOAD SWAP7 SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP7 DUP8 AND OR SWAP1 SSTORE SWAP2 DUP4 SWAP1 MSTORE DUP2 SLOAD SWAP1 SWAP4 AND SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x31A9108F PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND SWAP2 DUP5 AND SWAP1 PUSH4 0x6352211E SWAP1 PUSH2 0x36BD SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x36D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x36E9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x370D SWAP2 SWAP1 PUSH2 0x4573 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x3733 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x59C3 JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 LT ISZERO PUSH2 0x37AE JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP4 SWAP2 SWAP1 DUP4 SWAP1 DUP2 LT PUSH2 0x377D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD EQ ISZERO PUSH2 0x37A6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5861 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x3736 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE SWAP1 DUP4 MSTORE SWAP2 KECCAK256 ADD SSTORE JUMP JUMPDEST PUSH1 0x3C DUP2 PUSH4 0xFFFFFFFF AND GT PUSH2 0x3801 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5930 JUMP JUMPDEST PUSH1 0x6B DUP1 SLOAD PUSH4 0xFFFFFFFF NOT AND PUSH4 0xFFFFFFFF DUP4 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x4F27F6F220FFAD585E728389BC2F0F6B74EEEBEB43F95F53752A647CB6E7E687 SWAP3 PUSH2 0xA7D SWAP3 AND SWAP1 PUSH2 0x5AE0 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3865 JUMPI POP PUSH2 0x3865 PUSH2 0x2D8D JUMP JUMPDEST DUP1 PUSH2 0x3873 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x388F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5360 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x38BA JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x38C2 PUSH2 0x3EDE JUMP JUMPDEST PUSH2 0x38CA PUSH2 0x3F5F JUMP JUMPDEST DUP1 ISZERO PUSH2 0xD64 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST DUP1 SLOAD ISZERO PUSH2 0x38FD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5521 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP2 DUP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3931 JUMPI POP PUSH1 0x0 PUSH2 0x7E3 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x393E JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x2909 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54AB JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2909 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x4039 JUMP JUMPDEST NUMBER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x39B5 DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x39D5 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x7E3 JUMPI POP PUSH2 0x39CE DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x39D5 JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x39E4 DUP6 DUP6 PUSH2 0x4070 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x39F2 JUMPI POP DUP1 JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x3A1C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5257 JUMP JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x3A25 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x75 SLOAD PUSH1 0x0 SWAP1 DUP3 SWAP1 DUP3 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x3AD7 JUMPI PUSH2 0x3A4D PUSH2 0x445A JUMP JUMPDEST PUSH1 0x75 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x3A5A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP4 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP5 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP3 DUP5 ADD DUP4 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP4 ADD MSTORE SWAP1 SWAP3 POP PUSH2 0x3AAC SWAP1 DUP7 SWAP1 PUSH2 0x4165 JUMP JUMPDEST SWAP1 POP PUSH2 0x3AC1 DUP3 PUSH1 0x0 ADD MLOAD DUP3 DUP5 PUSH1 0x40 ADD MLOAD PUSH2 0x4179 JUMP JUMPDEST PUSH2 0x3ACB DUP8 DUP3 PUSH2 0x34B7 JUMP JUMPDEST SWAP7 POP POP POP PUSH1 0x1 ADD PUSH2 0x3A3D JUMP JUMPDEST POP SWAP3 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3AEC PUSH1 0x70 PUSH2 0x3CBD JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x3B22 JUMPI POP PUSH2 0x3B0C PUSH1 0x70 PUSH2 0x3CDA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x3C46 JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP3 PUSH4 0x70A08231 SWAP3 PUSH2 0x3B5A SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4B45 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3B72 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3B86 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3BAA SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x3C33 JUMPI PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SWAP1 MLOAD PUSH4 0x16960D55 PUSH1 0xE0 SHL DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x16960D55 SWAP2 PUSH2 0x3BF8 SWAP2 DUP8 SWAP2 DUP8 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B73 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3C12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3C26 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x3C33 DUP3 PUSH2 0x2CB5 JUMP JUMPDEST PUSH2 0x3C3E PUSH1 0x70 DUP4 PUSH2 0x3CE0 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3AEF JUMP JUMPDEST PUSH2 0x101F PUSH1 0x70 PUSH2 0x4184 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x67 SLOAD PUSH1 0x40 MLOAD PUSH4 0x358DC31D PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 PUSH4 0x6B1B863A SWAP3 PUSH2 0x3C87 SWAP3 DUP8 SWAP3 DUP8 SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4C42 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3CA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3CB5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3D0F PUSH1 0x6E PUSH2 0x3CBD JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x3D45 JUMPI POP PUSH2 0x3D2F PUSH1 0x6E PUSH2 0x3CDA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x101F JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP3 PUSH4 0x70A08231 SWAP3 PUSH2 0x3D7D SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4B45 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3D95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3DA9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3DCD SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x3E3C JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0xAC2AC51 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x2B0AB144 SWAP1 PUSH2 0x3E09 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4BDA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3E23 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3E37 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x3E47 PUSH1 0x6E DUP4 PUSH2 0x3CE0 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3D12 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x3EA4 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x4220 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xFBE JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x3EC2 SWAP2 SWAP1 PUSH2 0x47F7 JUMP JUMPDEST PUSH2 0xFBE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x576E JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3EF7 JUMPI POP PUSH2 0x3EF7 PUSH2 0x2D8D JUMP JUMPDEST DUP1 PUSH2 0x3F05 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3F21 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5360 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x38CA JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xD64 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3F78 JUMPI POP PUSH2 0x3F78 PUSH2 0x2D8D JUMP JUMPDEST DUP1 PUSH2 0x3F86 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3FA2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5360 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3FCD JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x3FD7 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0xD64 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x405A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP2 SWAP1 PUSH2 0x4DB1 JUMP JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x4066 JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x408E SWAP2 SWAP1 PUSH2 0x4D9C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x7530 DUP5 PUSH1 0x40 MLOAD PUSH2 0x40E2 SWAP2 SWAP1 PUSH2 0x4B20 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x411E JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4123 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x4141 JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x415E JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x4156 SWAP2 SWAP1 PUSH2 0x47F7 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2909 PUSH2 0xFFFF DUP4 AND DUP5 MUL PUSH2 0x3E8 PUSH2 0x39FB JUMP JUMPDEST PUSH2 0xFBE DUP4 DUP4 DUP4 PUSH2 0x422F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP1 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x41C2 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST ISZERO PUSH2 0x41F8 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP4 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP2 AND SWAP1 SWAP2 SSTORE AND PUSH2 0x41A0 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE DUP3 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x60 PUSH2 0x2873 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x4360 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4EB1C245 PUSH1 0xE1 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x9D63848A SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4274 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x4288 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x42B0 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x468D JUMP JUMPDEST SWAP1 POP DUP1 MLOAD DUP3 PUSH1 0xFF AND GT ISZERO PUSH2 0x42D6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x56DA JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH1 0xFF AND DUP2 MLOAD DUP2 LT PUSH2 0x42E7 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x358DC31D PUSH1 0xE1 SHL DUP2 MSTORE SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x6B1B863A SWAP1 PUSH2 0x4327 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4C42 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4341 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x4355 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x4382 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x51CF JUMP JUMPDEST PUSH2 0x438B DUP6 PUSH2 0x3A2D JUMP JUMPDEST PUSH2 0x43A7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x56A3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD PUSH2 0x43C4 SWAP2 SWAP1 PUSH2 0x4B20 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x4401 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4406 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x4416 DUP3 DUP3 DUP7 PUSH2 0x4421 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x4430 JUMPI POP DUP2 PUSH2 0x2909 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x4440 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST DUP2 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP2 SWAP1 PUSH2 0x4DB1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST POP DUP1 SLOAD PUSH1 0x0 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0xD64 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x34B3 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x4494 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x44B9 JUMPI DUP1 DUP2 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x44D0 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x415E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x44FB JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x4505 PUSH1 0x60 PUSH2 0x5AF1 JUMP JUMPDEST SWAP1 POP DUP2 CALLDATALOAD PUSH2 0x4512 DUP2 PUSH2 0x5B64 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH2 0xFFFF DUP2 AND DUP2 EQ PUSH2 0x4529 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x453B DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x4546 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x7E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4568 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2909 DUP2 PUSH2 0x5B64 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4584 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x2909 DUP2 PUSH2 0x5B64 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x45A4 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x45AF DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x45BF DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x45D6 DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x45F3 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x45FE DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x460E DUP2 PUSH2 0x5B79 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x462B JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x4636 DUP2 PUSH2 0x5B64 JUMP JUMPDEST PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD MLOAD SWAP3 SWAP5 SWAP3 SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x465B JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x4666 DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x467D DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x45D6 DUP2 PUSH2 0x5B64 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x469F JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x46B5 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x46C5 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 MLOAD PUSH2 0x46D8 PUSH2 0x46D3 DUP3 PUSH2 0x5B18 JUMP JUMPDEST PUSH2 0x5AF1 JUMP JUMPDEST DUP2 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP4 DUP6 ADD DUP6 DUP5 MUL DUP6 ADD DUP7 ADD DUP10 LT ISZERO PUSH2 0x46F4 JUMPI DUP7 DUP8 REVERT JUMPDEST DUP7 SWAP5 POP JUMPDEST DUP4 DUP6 LT ISZERO PUSH2 0x471F JUMPI DUP1 MLOAD PUSH2 0x470B DUP2 PUSH2 0x5B64 JUMP JUMPDEST DUP4 MSTORE PUSH1 0x1 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP2 DUP6 ADD SWAP2 DUP6 ADD PUSH2 0x46F8 JUMP JUMPDEST POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x473D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4753 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x475F DUP6 DUP3 DUP7 ADD PUSH2 0x44A8 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x477D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4794 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x47A7 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x47B5 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 PUSH1 0x60 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x47C9 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x47EC JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2909 DUP2 PUSH2 0x5B79 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4808 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x2909 DUP2 PUSH2 0x5B79 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4824 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND DUP2 EQ PUSH2 0x2909 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x484D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x4858 DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x460E DUP2 PUSH2 0x5B64 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x487C JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x4887 DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x48A2 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x48AE DUP7 DUP3 DUP8 ADD PUSH2 0x44A8 JUMP JUMPDEST SWAP5 SWAP8 SWAP1 SWAP7 POP SWAP4 SWAP5 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x48CC JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x2909 DUP4 DUP4 PUSH2 0x44EA JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x80 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x48E8 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x48F2 DUP5 DUP5 PUSH2 0x44EA JUMP JUMPDEST SWAP2 POP PUSH2 0x4901 DUP5 PUSH1 0x60 DUP6 ADD PUSH2 0x4546 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x491B JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4933 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x4954 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP8 CALLDATALOAD SWAP7 POP PUSH1 0x20 DUP1 DUP10 ADD CALLDATALOAD SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x496E DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD PUSH2 0x497E DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH2 0x498E DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP4 POP PUSH1 0xA0 DUP10 ADD CALLDATALOAD PUSH2 0x499E DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP3 POP PUSH1 0xC0 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x49B9 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP10 ADD PUSH1 0x1F DUP2 ADD DUP12 SGT PUSH2 0x49C9 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x49D7 PUSH2 0x46D3 DUP3 PUSH2 0x5B18 JUMP JUMPDEST DUP2 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP4 DUP6 ADD DUP6 DUP5 MUL DUP6 ADD DUP7 ADD DUP16 LT ISZERO PUSH2 0x49F3 JUMPI DUP7 DUP8 REVERT JUMPDEST DUP7 SWAP5 POP JUMPDEST DUP4 DUP6 LT ISZERO PUSH2 0x4A1E JUMPI DUP1 CALLDATALOAD PUSH2 0x4A0A DUP2 PUSH2 0x5B64 JUMP JUMPDEST DUP4 MSTORE PUSH1 0x1 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP2 DUP6 ADD SWAP2 DUP6 ADD PUSH2 0x49F7 JUMP JUMPDEST POP DUP1 SWAP6 POP POP POP POP POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x4A4D JUMPI DUP1 DUP2 REVERT JUMPDEST DUP8 CALLDATALOAD SWAP7 POP PUSH1 0x20 DUP9 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH2 0x4A66 DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP5 POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH2 0x4A76 DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP4 POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH2 0x4A86 DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP3 POP PUSH1 0xA0 DUP9 ADD CALLDATALOAD PUSH2 0x4A96 DUP2 PUSH2 0x5B64 JUMP JUMPDEST DUP1 SWAP3 POP POP PUSH1 0xC0 DUP9 ADD CALLDATALOAD SWAP1 POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4ABE JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2909 DUP2 PUSH2 0x5B87 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4ADB JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x4AE6 DUP2 PUSH2 0x5B87 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH2 0x460E DUP2 PUSH2 0x5B87 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH2 0xFFFF AND SWAP1 DUP4 ADD MSTORE PUSH1 0x40 SWAP1 DUP2 ADD MLOAD PUSH1 0xFF AND SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x4B32 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x5B38 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND DUP3 MSTORE DUP4 AND PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 PUSH1 0x40 DUP4 ADD DUP2 SWAP1 MSTORE DUP4 SLOAD SWAP1 DUP4 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 DUP5 DUP2 MSTORE DUP3 DUP2 KECCAK256 SWAP1 SWAP3 SWAP1 SWAP2 PUSH1 0x80 DUP6 ADD SWAP2 SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4BCC JUMPI DUP5 SLOAD DUP5 MSTORE PUSH1 0x1 SWAP5 DUP6 ADD SWAP5 SWAP4 DUP4 ADD SWAP4 ADD PUSH2 0x4BB0 JUMP JUMPDEST POP SWAP2 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND DUP2 MSTORE SWAP3 DUP5 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 SWAP2 AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE SWAP1 DUP4 AND PUSH1 0x40 DUP4 ADD MSTORE SWAP1 SWAP2 AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4CD1 JUMPI DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x4CAC JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4CD1 JUMPI PUSH2 0x4D0C DUP4 DUP6 MLOAD PUSH2 0x4AF7 JUMP JUMPDEST SWAP3 DUP5 ADD SWAP3 PUSH1 0x60 SWAP3 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x4CF9 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xFB SHL SUB DUP4 GT ISZERO PUSH2 0x4D3E JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH1 0x20 DUP4 MUL DUP1 DUP6 PUSH1 0x40 DUP6 ADD CALLDATACOPY SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP1 DUP2 MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4CD1 JUMPI DUP4 MLOAD DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x4D75 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x4DD0 DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x5B38 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x24 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6572633732312D696E76 PUSH1 0x40 DUP3 ADD MSTORE PUSH4 0x185B1A59 PUSH1 0xE2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2C SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F746F6B656E2D6C697374 PUSH1 0x40 DUP3 ADD MSTORE PUSH12 0x195B995C8B5A5B9D985B1A59 PUSH1 0xA2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xF SWAP1 DUP3 ADD MSTORE PUSH15 0x496E76616C69642061646472657373 PUSH1 0x88 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x13 SWAP1 DUP3 ADD MSTORE PUSH19 0x496E76616C6964207072657641646472657373 PUSH1 0x68 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2B SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A652D70657269 PUSH1 0x40 DUP3 ADD MSTORE PUSH11 0x37B216B737BA16B7BB32B9 PUSH1 0xA9 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x646472657373 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2C SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6F6E6C792D6F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH12 0x16B7B916B634B9BA32B732B9 PUSH1 0xA1 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2A SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F73706F6E736F72736869 PUSH1 0x40 DUP3 ADD MSTORE PUSH10 0x702D6E6F742D7A65726F PUSH1 0xB0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x28 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH8 0x34BA16BA37B5B2B7 PUSH1 0xC1 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x34 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A652D70657269 PUSH1 0x40 DUP3 ADD MSTORE PUSH20 0x6F642D677265617465722D7468616E2D7A65726F PUSH1 0x60 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6F6E6C792D7072697A65 PUSH1 0x40 DUP3 ADD MSTORE PUSH5 0xB5C1BDBDB PUSH1 0xDA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7472616E736665722D74 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x3796B9B2B633 PUSH1 0xD1 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1E SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x29 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A652D706F6F6C PUSH1 0x40 DUP3 ADD MSTORE PUSH9 0x2D6E6F742D7A65726F PUSH1 0xB8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x416464726573733A20696E73756666696369656E742062616C616E636520666F PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x1C8818D85B1B PUSH1 0xD2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x22 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D7A65 PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x726F PUSH1 0xF0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1A SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D636F PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x6D706C657465 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x29 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH9 0x1A5D0B5D185C99D95D PUSH1 0xBA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x23 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F65726332302D696E7661 PUSH1 0x40 DUP3 ADD MSTORE PUSH3 0x1B1A59 PUSH1 0xEA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2E SWAP1 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x40 DUP3 ADD MSTORE PUSH14 0x191E481A5B9A5D1A585B1A5E9959 PUSH1 0x92 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F6E6F6E6578697374656E742D7072697A PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x195CDC1B1A5D PUSH1 0xD2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F65726332302D6E756C6C PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2B SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D616C72656164 PUSH1 0x40 DUP3 ADD MSTORE PUSH11 0x1E4B5C995C5D595CDD1959 PUSH1 0xAA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1F SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F77696E6E6572732D6774652D6F6E6500 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x21 SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206D756C7469706C69636174696F6E206F766572666C6F PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x77 PUSH1 0xF8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xC SWAP1 DUP3 ADD MSTORE PUSH12 0x105B1C9958591E481A5B9A5D PUSH1 0xA2 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x33 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH19 0x1A5D0B5C195C98D95B9D1859D94B5D1BDD185B PUSH1 0x6A SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x31 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6265666F726541776172 PUSH1 0x40 DUP3 ADD MSTORE PUSH17 0x19131A5CDD195B995C8B5A5B9D985B1A59 PUSH1 0x7A SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2B SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F63616E6E6F742D617761 PUSH1 0x40 DUP3 ADD MSTORE PUSH11 0x1C990B595E1D195C9B985B PUSH1 0xAA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xD SWAP1 DUP3 ADD MSTORE PUSH13 0x105B1C9958591E481859191959 PUSH1 0x9A SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x53616665436173743A2076616C756520646F65736E27742066697420696E2033 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x322062697473 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2F SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F61776172642D696E7661 PUSH1 0x40 DUP3 ADD MSTORE PUSH15 0xD8D2C85AE8DED6CADC5AD2DCC8CAF PUSH1 0x8B SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7469636B65742D6E6F74 PUSH1 0x40 DUP3 ADD MSTORE PUSH5 0x2D7A65726F PUSH1 0xD8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2A SWAP1 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A204552433230206F7065726174696F6E20646964206E PUSH1 0x40 DUP3 ADD MSTORE PUSH10 0x1BDD081CDD58D8D95959 PUSH1 0xB2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x33 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A655374726174 PUSH1 0x40 DUP3 ADD MSTORE PUSH19 0x1959DE531A5CDD195B995C8B5A5B9D985B1A59 PUSH1 0x6A SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x36 SWAP1 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A20617070726F76652066726F6D206E6F6E2D7A65726F PUSH1 0x40 DUP3 ADD MSTORE PUSH22 0x20746F206E6F6E2D7A65726F20616C6C6F77616E6365 PUSH1 0x50 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6572633732312D647570 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x6C6963617465 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x23 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D696E2D666C69 PUSH1 0x40 DUP3 ADD MSTORE PUSH3 0x19DA1D PUSH1 0xEA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D7469 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x1B59591BDD5D PUSH1 0xD2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2C SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D74696D656F75 PUSH1 0x40 DUP3 ADD MSTORE PUSH12 0x742D67742D36302D73656373 PUSH1 0xA0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x27 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D7265 PUSH1 0x40 DUP3 ADD MSTORE PUSH7 0x1C5D595CDD1959 PUSH1 0xCA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x27 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F756E617661696C61626C PUSH1 0x40 DUP3 ADD MSTORE PUSH7 0x3296BA37B5B2B7 PUSH1 0xC9 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x7E3 DUP3 DUP5 PUSH2 0x4AF7 JUMP JUMPDEST PUSH2 0xFFFF SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0xFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH2 0xFFFF SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0xFF SWAP2 DUP3 AND PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP7 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP8 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x40 DUP5 ADD MSTORE DUP6 DUP2 AND PUSH1 0x60 DUP5 ADD MSTORE DUP5 DUP2 AND PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0xC0 PUSH1 0xA0 DUP5 ADD DUP2 SWAP1 MSTORE DUP5 MLOAD SWAP1 DUP5 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP3 DUP6 DUP2 ADD SWAP3 SWAP1 SWAP2 PUSH1 0xE0 DUP7 ADD SWAP1 DUP6 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x5ACE JUMPI DUP6 MLOAD DUP5 AND DUP4 MSTORE SWAP5 DUP5 ADD SWAP5 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x5AB0 JUMP JUMPDEST POP SWAP1 SWAP13 SWAP12 POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5B10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x5B2E JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5B53 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x5B3B JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xCC4 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xD64 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xD64 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xD64 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SIGNEXTEND DIV LOG0 CALLVALUE REVERT 0xC9 0xB6 SUB NUMBER 0x4F CALLCODE 0xE1 0x4B 0xBF SWAP14 0xF8 0x27 DUP6 BYTE PUSH31 0xC270AD4D35335F3752EDEB5F64736F6C634300060C00330000000000000000 ",
              "sourceMap": "259:371:71:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106103e65760003560e01c80637f2be9fc1161020a578063b024468211610125578063d18e81b3116100b8578063eefc8ad111610087578063eefc8ad114610762578063f2fde38b14610782578063f97700e214610795578063fbf0953e146107a8578063ffa1ad74146107bb576103e6565b8063d18e81b314610742578063d5ad6bf61461074a578063d605787b14610752578063dfb2f13b1461075a576103e6565b8063c2f19ee8116100f4578063c2f19ee81461070c578063c42b42a014610714578063c48ddbcb1461071c578063c68532701461072f576103e6565b8063b0244682146106cb578063b2210957146106de578063b9ee1e05146106f1578063c25a9c32146106f9576103e6565b80638e204c431161019d57806395e5f9ee1161016c57806395e5f9ee146106a05780639dafafb0146106a8578063a4e075ca146106b0578063acca5b95146106c3576103e6565b80638e204c431461065257806391c05b0b1461066557806394144c6b146106785780639417783f14610680576103e6565b80638aa3ec6f116101d95780638aa3ec6f1461061a5780638acfaca91461062d5780638d5f10c4146106355780638da5cb5b1461064a576103e6565b80637f2be9fc146105d95780637f4296d7146105ec578063876f5c7e146105ff578063884a444814610607576103e6565b80634e5d08e0116103055780636be51c4f116102985780636f46f221116102675780636f46f221146105b1578063715018a6146105b9578063719ce73e146105c157806372f33ea9146105c9578063738bbea8146105d1576103e6565b80636be51c4f146105865780636bea53441461058e5780636cc25db7146105965780636dfb03861461059e576103e6565b806362c77a61116102d457806362c77a61146105505780636696822114610558578063671137c41461056b5780636a74f1071461057e576103e6565b80634e5d08e01461050f578063500db70d1461052257806352a301091461052a578063605e25ac1461053d576103e6565b80632c8fe73d1161037d57806347bed9981161034c57806347bed998146104d95780634aba4f6b146104ec5780634c169f4f146104f45780634d7f3db0146104fc576103e6565b80632c8fe73d1461049657806330fcdf411461049e57806338a9b4b6146104b157806342d09209146104c4576103e6565b8063111070e4116103b9578063111070e414610451578063152d308c1461045957806322f8e5661461046c5780632a7ad60914610481576103e6565b806301b48e34146103eb57806301ffc9a7146104145780630d847fc4146104345780630faf125f14610449575b600080fd5b6103fe6103f936600461490a565b6107d0565b60405161040b9190614b3c565b60405180910390f35b610427610422366004614813565b6107e9565b60405161040b9190614d91565b61043c61081f565b60405161040b9190614b45565b6103fe61082e565b610427610834565b6104276104673660046145e1565b610843565b61047f61047a36600461490a565b6108fa565b005b6104896108ff565b60405161040b9190615ae0565b6103fe61090b565b61047f6104ac366004614557565b61091a565b61047f6104bf3660046147db565b6109f2565b6104cc610a88565b60405161040b9190614c90565b6103fe6104e736600461490a565b610a94565b610427610a9f565b61047f610b28565b61047f61050a366004614646565b610bf2565b61047f61051d366004614557565b610cca565b61043c610d67565b61042761053836600461490a565b610d76565b61047f61054b366004614557565b610e04565b6104cc610ee5565b61047f61056636600461472b565b610ef1565b61047f61057936600461483b565b610fc3565b610427611023565b61043c61103c565b61048961104b565b61043c61105f565b61047f6105ac36600461490a565b61106e565b6104276110be565b61047f6110c7565b61043c611150565b6103fe61115f565b610427611165565b61047f6105e7366004614a33565b6111b8565b61047f6105fa366004614557565b61125c565b610427611312565b61047f61061536600461490a565b611331565b61047f610628366004614557565b611381565b6103fe611459565b61063d61145f565b60405161040b9190614cdd565b61043c6114e4565b610427610660366004614557565b6114f3565b61047f61067336600461490a565b611508565b6103fe611511565b61069361068e366004614557565b611517565b60405161040b9190614d59565b610427611583565b61042761158d565b6104276106be3660046147db565b611596565b61048961161d565b61047f6106d936600461483b565b611629565b61047f6106ec36600461458f565b6116b4565b61047f611785565b61047f61070736600461476b565b6119cd565b61043c611d5c565b6103fe611d6b565b61047f61072a366004614868565b611de8565b61047f61073d366004614aad565b611fdd565b6103fe61202d565b6103fe612033565b61043c61203d565b61047f61204c565b61077561077036600461490a565b6122ce565b60405161040b9190615a0a565b61047f610790366004614557565b612333565b61047f6107a336600461493a565b6123f4565b61047f6107b63660046148d6565b612655565b6107c36127f4565b60405161040b9190614db1565b60006107e36107dd612815565b83612852565b92915050565b60006001600160e01b031982166301ffc9a760e01b14806107e35750506001600160e01b031916600162a1cb1960e01b03191490565b6073546001600160a01b031681565b607a5481565b606a5463ffffffff1615155b90565b600061084d61287b565b6001600160a01b031661085e6114e4565b6001600160a01b03161461088d5760405162461bcd60e51b8152600401610884906154ec565b60405180910390fd5b61089561287f565b6001600160a01b03831660008181526078602052604090819020805460ff1916851515179055517fd1ac9a365c0e3bfad562e0a809a5ded3842a2b489f839b3327e4e34ee0128f28906108e9908590614d91565b60405180910390a250600192915050565b607b55565b606a5463ffffffff1690565b60006109156128d4565b905090565b61092261287b565b6001600160a01b03166109336114e4565b6001600160a01b0316146109595760405162461bcd60e51b8152600401610884906154ec565b61096161287f565b6001600160a01b038116158061098c575061098c6001600160a01b03821663266fce1f60e11b6128ed565b6109a85760405162461bcd60e51b81526004016108849061559a565b607380546001600160a01b0319166001600160a01b0383169081179091556040517fc4feff61630891ea2cb42a54fbe3ff2e65422f2ed17323ac6b65f4521112e87e90600090a250565b6109fa61287b565b6001600160a01b0316610a0b6114e4565b6001600160a01b031614610a315760405162461bcd60e51b8152600401610884906154ec565b610a3961287f565b6077805460ff191682151517908190556040517f6959d02e8fb6264d1d39bf37f1e725001f342714933cf38f8627a2442efc43fd91610a7d9160ff90911690614d91565b60405180910390a150565b60606109156070612910565b60006107e3826129f0565b606954606a54604051630e866e6f60e21b81526000926001600160a01b031691633a19b9bc91610ad89163ffffffff1690600401615ae0565b60206040518083038186803b158015610af057600080fd5b505afa158015610b04573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091591906147f7565b610b30611165565b610b4c5760405162461bcd60e51b8152600401610884906158ea565b606a80546bffffffffffffffffffffffff19811690915560405163ffffffff80831692640100000000900416907fee6702c46c5618e6fc7e625c71f4c85df9c91d456cb16a3aea71ab83b1fee00590600090a160665460405163ffffffff8416916001600160a01b03169033907fd50026ee0824513af20cdf5e72d1fbfbe8fd646ee0576378e080326f1a695e5890610be6908690615ae0565b60405180910390a45050565b6066546001600160a01b0316610c0661287b565b6001600160a01b031614610c2c5760405162461bcd60e51b8152600401610884906150c4565b6067546001600160a01b0383811691161415610c4a57610c4a61287f565b6065546001600160a01b031615610cc4576065546040516304d7f3db60e41b81526001600160a01b0390911690634d7f3db090610c91908790879087908790600401614c65565b600060405180830381600087803b158015610cab57600080fd5b505af1158015610cbf573d6000803e3d6000fd5b505050505b50505050565b610cd26114e4565b6001600160a01b0316610ce361287b565b6001600160a01b03161480610d1257506074546001600160a01b0316610d0761287b565b6001600160a01b0316145b80610d3757506073546001600160a01b0316610d2c61287b565b6001600160a01b0316145b610d535760405162461bcd60e51b815260040161088490614f5b565b610d5b61287f565b610d6481612a37565b50565b6068546001600160a01b031681565b6000610d8061287b565b6001600160a01b0316610d916114e4565b6001600160a01b031614610db75760405162461bcd60e51b8152600401610884906154ec565b610dbf61287f565b607a8290556040517f63e4e34f49d12428c03e04e61340c7167e36eb0ff6f0b1970c7544026179403990610df4908490614b3c565b60405180910390a1506001919050565b610e0c61287b565b6001600160a01b0316610e1d6114e4565b6001600160a01b031614610e435760405162461bcd60e51b8152600401610884906154ec565b610e4b61287f565b6001600160a01b0381161580610e795750610e796001600160a01b038216600162a1cb1960e01b03196128ed565b610e955760405162461bcd60e51b815260040161088490614e28565b606580546001600160a01b0319166001600160a01b0383811691909117918290556040519116907f9fc437aa70ad4ee5f33f6772bf338eed41e21b95435820817ab8b4df161ce4dd90600090a250565b6060610915606e612910565b610ef96114e4565b6001600160a01b0316610f0a61287b565b6001600160a01b03161480610f3957506074546001600160a01b0316610f2e61287b565b6001600160a01b0316145b80610f5e57506073546001600160a01b0316610f5361287b565b6001600160a01b0316145b610f7a5760405162461bcd60e51b815260040161088490614f5b565b610f8261287f565b60005b81811015610fbe57610fb6838383818110610f9c57fe5b9050602002016020810190610fb19190614557565b612a37565b600101610f85565b505050565b610fcb61287b565b6001600160a01b0316610fdc6114e4565b6001600160a01b0316146110025760405162461bcd60e51b8152600401610884906154ec565b61100a61287f565b61101660708284612beb565b61101f82612cb5565b5050565b600061102d610834565b80156109155750610915610a9f565b6065546001600160a01b031681565b606a54640100000000900463ffffffff1690565b6067546001600160a01b031681565b61107661287b565b6001600160a01b03166110876114e4565b6001600160a01b0316146110ad5760405162461bcd60e51b8152600401610884906154ec565b6110b561287f565b610d6481612d0d565b60795460ff1681565b6110cf61287b565b6001600160a01b03166110e06114e4565b6001600160a01b0316146111065760405162461bcd60e51b8152600401610884906154ec565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6066546001600160a01b031681565b606d5481565b606a54600090600160401b900463ffffffff1661118457506000610840565b606a54606b546111a89163ffffffff91821691600160401b909104811690612d6216565b6111b0612d87565b119050610840565b600054610100900460ff16806111d157506111d1612d8d565b806111df575060005460ff16155b6111fb5760405162461bcd60e51b815260040161088490615360565b600054610100900460ff16158015611226576000805460ff1961ff0019909116610100171660011790555b6060611237898989898989876123f4565b61124083612d0d565b508015610cbf576000805461ff00191690555050505050505050565b61126461287b565b6001600160a01b03166112756114e4565b6001600160a01b03161461129b5760405162461bcd60e51b8152600401610884906154ec565b6112a361287f565b6112ab610834565b156112c85760405162461bcd60e51b8152600401610884906158a7565b606980546001600160a01b0319166001600160a01b0383169081179091556040517ff935763cc7c57ee8ed6318ed71e756cca0731294c9f46ff5b386f36d6ff1417a90600090a250565b600061131c612d98565b8015610915575061132b610834565b15905090565b61133961287b565b6001600160a01b031661134a6114e4565b6001600160a01b0316146113705760405162461bcd60e51b8152600401610884906154ec565b61137861287f565b610d6481612db1565b61138961287b565b6001600160a01b031661139a6114e4565b6001600160a01b0316146113c05760405162461bcd60e51b8152600401610884906154ec565b6113c861287f565b6001600160a01b03811615806113f357506113f36001600160a01b038216632ba8396360e11b6128ed565b61140f5760405162461bcd60e51b8152600401610884906157b8565b607480546001600160a01b0319166001600160a01b0383169081179091556040517fda05d50a3a1ec0ffab059f1d457ae59f68ccfb3ffbb4dad283c516f9103d584b90600090a250565b60765490565b60606075805480602002602001604051908101604052809291908181526020016000905b828210156114db57600084815260209081902060408051606081018252918501546001600160a01b0381168352600160a01b810461ffff1683850152600160b01b900460ff1690820152825260019092019101611483565b50505050905090565b6033546001600160a01b031690565b60786020526000908152604090205460ff1681565b610d6481612e06565b606c5481565b6001600160a01b03811660009081526072602090815260409182902080548351818402810184019094528084526060939283018282801561157757602002820191906000526020600020905b815481526020019060010190808311611563575b50505050509050919050565b6000610915612d98565b60775460ff1681565b60006115a061287b565b6001600160a01b03166115b16114e4565b6001600160a01b0316146115d75760405162461bcd60e51b8152600401610884906154ec565b6115df61287f565b6079805460ff19168315151790556040517f2b4b6ffe286f7ce4ccc6b136bb14987b0a00092174d88938a0c667a104a4a73190610df4908490614d91565b606b5463ffffffff1681565b61163161287b565b6001600160a01b03166116426114e4565b6001600160a01b0316146116685760405162461bcd60e51b8152600401610884906154ec565b61167061287f565b61167c606e8284612beb565b6040516001600160a01b038316907f58982464497acdab11ad29d39907e076b0d3b8daf1d9b734174c7c3a2a0e8c7490600090a25050565b6066546001600160a01b03166116c861287b565b6001600160a01b0316146116ee5760405162461bcd60e51b8152600401610884906150c4565b826001600160a01b0316846001600160a01b031614156117205760405162461bcd60e51b815260040161088490615109565b6067546001600160a01b038281169116141561173e5761173e61287f565b6065546001600160a01b031615610cc45760655460405163b221095760e01b81526001600160a01b039091169063b221095790610c91908790879087908790600401614bfe565b61178d612d98565b6117a95760405162461bcd60e51b815260040161088490614eca565b6117b1610834565b156117ce5760405162461bcd60e51b815260040161088490615429565b60695460408051630d37b53760e01b8152815160009384936001600160a01b0390911692630d37b5379260048083019392829003018186803b15801561181357600080fd5b505afa158015611827573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184b9190614619565b90925090506001600160a01b038216158015906118685750600081115b1561188757606954611887906001600160a01b03848116911683613393565b6069546040805163433c53d960e11b8152815160009384936001600160a01b0390911692638678a7b2926004808301939282900301818787803b1580156118cd57600080fd5b505af11580156118e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119059190614ac9565b606a805463ffffffff8084166401000000000267ffffffff000000001991861663ffffffff199093169290921716179055909250905061194b611946612d87565b61348d565b606a80546bffffffff00000000000000001916600160401b63ffffffff93841602179055606654908316906001600160a01b031661198761287b565b6001600160a01b03167f4d31e658dcf617bb3a3c8cf7c6dddb33f7030ac588e271631ecdb5d76c2e91ef846040516119bf9190615ae0565b60405180910390a450505050565b6119d561287b565b6001600160a01b03166119e66114e4565b6001600160a01b031614611a0c5760405162461bcd60e51b8152600401610884906154ec565b8060005b81811015611cb157611a2061445a565b848483818110611a2c57fe5b905060600201803603810190611a4291906148bb565b90506001816040015160ff161115611a6c5760405162461bcd60e51b815260040161088490615028565b80516001600160a01b0316611a935760405162461bcd60e51b8152600401610884906152d4565b6075548210611b2f576075805460018101825560009190915281517f9a8d93986a7b9e6294572ea6736696119c195c1a9f5eae642d3c5fcd44e49dea90910180546020840151604085015160ff16600160b01b0260ff60b01b1961ffff909216600160a01b0261ffff60a01b196001600160a01b039096166001600160a01b031990941693909317949094169190911716919091179055611c56565b611b3761445a565b60758381548110611b4457fe5b60009182526020918290206040805160608101825292909101546001600160a01b03808216808552600160a01b830461ffff1695850195909552600160b01b90910460ff1691830191909152845191935016141580611bb35750806020015161ffff16826020015161ffff1614155b80611bcc5750806040015160ff16826040015160ff1614155b15611c4d578160758481548110611bdf57fe5b6000918252602091829020835191018054928401516040909401516001600160a01b03199093166001600160a01b039092169190911761ffff60a01b1916600160a01b61ffff909416939093029290921760ff60b01b1916600160b01b60ff90921691909102179055611c54565b5050611ca9565b505b80600001516001600160a01b03167fc1bf93444a0055a24a7d0154b75fedf78edfe355c06a2ce8e47f9f39087205598260200151836040015185604051611c9f93929190615a18565b60405180910390a2505b600101611a10565b505b607554811015611d2e57607554600090611cce9060016134b7565b90506075805480611cdb57fe5b600082815260208120820160001990810180546001600160b81b031916905590910190915560405182917f99fa473fdf53414bcd014cf6e7509fc58c68f7b86174767faa6ad5100cd5bae591a250611cb3565b6000611d386134df565b90506103e8811115610cc45760405162461bcd60e51b815260040161088490615547565b6074546001600160a01b031681565b606654604080516318c1996d60e21b815290516000926001600160a01b03169163630665b4916004808301926020929190829003018186803b158015611db057600080fd5b505afa158015611dc4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109159190614922565b611df06114e4565b6001600160a01b0316611e0161287b565b6001600160a01b03161480611e3057506074546001600160a01b0316611e2561287b565b6001600160a01b0316145b80611e5557506073546001600160a01b0316611e4a61287b565b6001600160a01b0316145b611e715760405162461bcd60e51b815260040161088490614f5b565b611e7961287f565b606654604051636a3fd4f960e01b81526001600160a01b0390911690636a3fd4f990611ea9908690600401614b45565b60206040518083038186803b158015611ec157600080fd5b505afa158015611ed5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef991906147f7565b611f155760405162461bcd60e51b8152600401610884906155eb565b611f2f6001600160a01b0384166380ac58cd60e01b6128ed565b611f4b5760405162461bcd60e51b815260040161088490614de4565b611f56607084613571565b611f6557611f656070846135c2565b60005b81811015611f9457611f8c84848484818110611f8057fe5b9050602002013561368a565b600101611f68565b50826001600160a01b03167f51541dc4b4c08a16085809cccdc4cc77d8000b60fbb00142e57f236d842986758383604051611fd0929190614d1f565b60405180910390a2505050565b611fe561287b565b6001600160a01b0316611ff66114e4565b6001600160a01b03161461201c5760405162461bcd60e51b8152600401610884906154ec565b61202461287f565b610d64816137db565b607b5481565b6000610915612815565b6069546001600160a01b031681565b612054610834565b6120705760405162461bcd60e51b81526004016108849061597c565b612078610a9f565b6120945760405162461bcd60e51b81526004016108849061528e565b606954606a546040516313a54bf360e31b81526000926001600160a01b031691639d2a5f98916120cd9163ffffffff1690600401615ae0565b602060405180830381600087803b1580156120e757600080fd5b505af11580156120fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061211f9190614922565b606a80546bffffffffffffffffffffffff191690556073549091506001600160a01b0316156121af57607354606d5460405163266fce1f60e11b81526001600160a01b0390921691634cdf9c3e9161217c91859190600401615a56565b600060405180830381600087803b15801561219657600080fd5b505af11580156121aa573d6000803e3d6000fd5b505050505b6121b881612e06565b6074546001600160a01b03161561223057607454606d54604051632ba8396360e11b81526001600160a01b039092169163575072c6916121fd91859190600401615a56565b600060405180830381600087803b15801561221757600080fd5b505af115801561222b573d6000803e3d6000fd5b505050505b61224061223b612d87565b6129f0565b606d5561224b61287b565b6001600160a01b03167f9c4163ece98173eab9a496c4db8bf3e2c8edcc5d2854377880597ccb858b7a9d826040516122839190614b3c565b60405180910390a2606d5461229661287b565b6001600160a01b03167fc61852c20f0b03b31d782f3022f2bf20322ac17ce66c5349fb6e24740cdd645660405160405180910390a350565b6122d661445a565b607582815481106122e357fe5b60009182526020918290206040805160608101825292909101546001600160a01b0381168352600160a01b810461ffff1693830193909352600160b01b90920460ff169181019190915292915050565b61233b61287b565b6001600160a01b031661234c6114e4565b6001600160a01b0316146123725760405162461bcd60e51b8152600401610884906154ec565b6001600160a01b0381166123985760405162461bcd60e51b815260040161088490614f15565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff168061240d575061240d612d8d565b8061241b575060005460ff16155b6124375760405162461bcd60e51b815260040161088490615360565b600054610100900460ff16158015612462576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0386166124885760405162461bcd60e51b815260040161088490615186565b6001600160a01b0385166124ae5760405162461bcd60e51b815260040161088490615729565b6001600160a01b0384166124d45760405162461bcd60e51b815260040161088490614fde565b6001600160a01b0383166124fa5760405162461bcd60e51b815260040161088490615215565b606680546001600160a01b038089166001600160a01b0319928316179092556067805488841690831617905560698054868416908316179055606880549287169290911691909117905561254d87612db1565b61255561384c565b61255f606e6138de565b60005b825181101561258f5761258783828151811061257a57fe5b6020026020010151612a37565b600101612562565b50606c879055606d8890556125a460706138de565b6125af6107086137db565b856001600160a01b03167ff9632d212436344a25150ff0c161dabf412aade556621c2dea146ca63ff643f58989888888886040516125f296959493929190615a64565b60405180910390a2606d5461260561287b565b6001600160a01b03167fc61852c20f0b03b31d782f3022f2bf20322ac17ce66c5349fb6e24740cdd645660405160405180910390a38015610cbf576000805461ff00191690555050505050505050565b61265d61287b565b6001600160a01b031661266e6114e4565b6001600160a01b0316146126945760405162461bcd60e51b8152600401610884906154ec565b60755460ff8216106126b85760405162461bcd60e51b8152600401610884906153ae565b6001826040015160ff1611156126e05760405162461bcd60e51b815260040161088490615028565b81516001600160a01b03166127075760405162461bcd60e51b8152600401610884906152d4565b8160758260ff168154811061271857fe5b600091825260208083208451920180549185015160409095015160ff16600160b01b0260ff60b01b1961ffff909616600160a01b0261ffff60a01b196001600160a01b039095166001600160a01b031990941693909317939093169190911793909316179091556127876134df565b90506103e88111156127ab5760405162461bcd60e51b815260040161088490615547565b82600001516001600160a01b03167fc1bf93444a0055a24a7d0154b75fedf78edfe355c06a2ce8e47f9f39087205598460200151856040015185604051611fd093929190615a37565b60405180604001604052806005815260200164332e342e3560d81b81525081565b6000806128206128d4565b9050600061282c612d87565b90508181111561284157600092505050610840565b61284b82826134b7565b9250505090565b600080612867670de0b6b3a764000085613922565b9050612873818461395c565b949350505050565b3390565b600061288961399e565b606a54909150640100000000900463ffffffff1615806128b85750606a54640100000000900463ffffffff1681105b610d645760405162461bcd60e51b8152600401610884906158a7565b6000610915606c54606d54612d6290919063ffffffff16565b60006128f8836139a2565b8015612909575061290983836139d5565b9392505050565b606080826000015467ffffffffffffffff8111801561292e57600080fd5b50604051908082528060200260200182016040528015612958578160200160208202803683370190505b50600160008181529085016020526040812054919250906001600160a01b03165b6001600160a01b0381161580159061299b57506001600160a01b038116600114155b156129e757808383815181106129ad57fe5b6001600160a01b03928316602091820292909201810191909152918116600090815260018088019093526040902054929091019116612979565b50909392505050565b600080612a14606c54612a0e606d54866134b790919063ffffffff16565b906139fb565b9050612909612a2e606c548361392290919063ffffffff16565b606d5490612d62565b612a49816001600160a01b0316613a2d565b612a655760405162461bcd60e51b8152600401610884906153f4565b606654604051636a3fd4f960e01b81526001600160a01b0390911690636a3fd4f990612a95908490600401614b45565b60206040518083038186803b158015612aad57600080fd5b505afa158015612ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae591906147f7565b612b015760405162461bcd60e51b8152600401610884906155eb565b60408051600481526024810182526020810180516001600160e01b03166318160ddd60e01b17905290516000916060916001600160a01b03851691612b4591614b20565b600060405180830381855afa9150503d8060008114612b80576040519150601f19603f3d011682016040523d82523d6000602084013e612b85565b606091505b509150915081612ba75760405162461bcd60e51b81526004016108849061531d565b612bb2606e846135c2565b6040516001600160a01b038416907fbcd6d991f3416e288bf59a2997b423772937b62c7ea7dd1a54af7771de1f741890600090a2505050565b6001600160a01b038116600114801590612c0d57506001600160a01b03811615155b612c295760405162461bcd60e51b815260040161088490614e74565b6001600160a01b038281166000908152600185016020526040902054811690821614612c675760405162461bcd60e51b815260040161088490614e9d565b6001600160a01b039081166000818152600185016020526040808220805495851683529082208054959094166001600160a01b03199586161790935552805490911690558054600019019055565b6001600160a01b0381166000908152607260205260408120612cd69161447a565b6040516001600160a01b038216907fcd64d9dacd230c5ccf1278ea5332b0621aa28c950fb0e61c8fbc9e2011c88a3490600090a250565b60008111612d2d5760405162461bcd60e51b815260040161088490615474565b60768190556040517fc44c7222e8df09744ced394101df47e78dedb642d3065267bb388901de9df6d490610a7d908390614b3c565b6000828201838110156129095760405162461bcd60e51b815260040161088490614fa7565b607b5490565b600061132b30613a2d565b6000612da26128d4565b612daa612d87565b1015905090565b60008111612dd15760405162461bcd60e51b815260040161088490615070565b606c8190556040517f0d379c1a7282461e725a9dc2d74e65246c77e98ae93835e26c2f1654c48ee4ec90610a7d908390614b3c565b6066546040805163e6d8a94b60e01b815290516000926001600160a01b03169163e6d8a94b91600480830192602092919082900301818787803b158015612e4c57600080fd5b505af1158015612e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e849190614922565b9050612e8f81613a33565b9050606760009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612edf57600080fd5b505afa158015612ef3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f179190614922565b612f4a576040517f3728feb3fc1ef1bf4a24036afbe7d34b59c551bf0d2ab5564e87ec1734fa80dd90600090a150610d64565b60795460765460ff9091169060608167ffffffffffffffff81118015612f6f57600080fd5b50604051908082528060200260200182016040528015612f99578160200160208202803683370190505b50607a54909150859060009081905b8583101561314457606754604051633b30414760e01b81526000916001600160a01b031690633b30414790612fe1908890600401614b3c565b60206040518083038186803b158015612ff957600080fd5b505afa15801561300d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130319190614573565b6001600160a01b03811660009081526078602052604090205490915060ff1661308c578086858060010196508151811061306757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050613105565b818360010193508310613105577fb5f728fcb182000eb8e953c15f6795f07b6cda75b35ef0b65645b53aac636945846040516130c89190614b3c565b60405180910390a1836130ff576040517f3728feb3fc1ef1bf4a24036afbe7d34b59c551bf0d2ab5564e87ec1734fa80dd90600090a15b50613144565b60008461020902866101f301016040516020016131229190614b3c565b60408051601f1981840301815291905280516020909101209550612fa8915050565b6131618560008151811061315457fe5b6020026020010151613ae0565b6000876131775761317289856139fb565b613181565b61318189886139fb565b905080156131bb5760005b848110156131b9576131b18782815181106131a357fe5b602002602001015183613c50565b60010161318c565b505b60775460ff161561336a5760006131d2606e613cbd565b90505b6001600160a01b0381161580159061320857506131f2606e613cda565b6001600160a01b0316816001600160a01b031614155b15613364576066546040516370a0823160e01b81526000916001600160a01b03808516926370a0823192613240921690600401614b45565b60206040518083038186803b15801561325857600080fd5b505afa15801561326c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132909190614922565b905060008a6132a8576132a382886139fb565b6132b2565b6132b2828b6139fb565b905080156133505760005b8781101561334e576066548a516001600160a01b0390911690632b0ab144908c90849081106132e857fe5b602002602001015186856040518463ffffffff1660e01b815260040161331093929190614bda565b600060405180830381600087803b15801561332a57600080fd5b505af115801561333e573d6000803e3d6000fd5b5050600190920191506132bd9050565b505b61335b606e84613ce0565b925050506131d5565b50613387565b6133878660008151811061337a57fe5b6020026020010151613d03565b50505050505050505050565b80158061341b5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906133c99030908690600401614b59565b60206040518083038186803b1580156133e157600080fd5b505afa1580156133f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134199190614922565b155b6134375760405162461bcd60e51b81526004016108849061580b565b610fbe8363095ea7b360e01b8484604051602401613456929190614c29565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613e4f565b600064010000000082106134b35760405162461bcd60e51b81526004016108849061565d565b5090565b6000828211156134d95760405162461bcd60e51b81526004016108849061514f565b50900390565b6075546000908190815b818160ff161015613569576134fc61445a565b60758260ff168154811061350c57fe5b60009182526020918290206040805160608101825292909101546001600160a01b0381168352600160a01b810461ffff16938301849052600160b01b900460ff1690820152915061355e908590612d62565b9350506001016134e9565b509091505090565b60006001600160a01b03821660011480159061359557506001600160a01b03821615155b80156129095750506001600160a01b03908116600090815260019290920160205260409091205416151590565b6001600160a01b0381166001148015906135e457506001600160a01b03811615155b6136005760405162461bcd60e51b815260040161088490614e74565b6001600160a01b038181166000908152600184016020526040902054161561363a5760405162461bcd60e51b815260040161088490615636565b60016000818152838201602052604080822080546001600160a01b039586168085529284208054969091166001600160a01b03199687161790559183905281549093169092179091558154019055565b6066546040516331a9108f60e11b81526001600160a01b0391821691841690636352211e906136bd908590600401614b3c565b60206040518083038186803b1580156136d557600080fd5b505afa1580156136e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061370d9190614573565b6001600160a01b0316146137335760405162461bcd60e51b8152600401610884906159c3565b60005b6001600160a01b0383166000908152607260205260409020548110156137ae576001600160a01b038316600090815260726020526040902080548391908390811061377d57fe5b906000526020600020015414156137a65760405162461bcd60e51b815260040161088490615861565b600101613736565b506001600160a01b0390911660009081526072602090815260408220805460018101825590835291200155565b603c8163ffffffff16116138015760405162461bcd60e51b815260040161088490615930565b606b805463ffffffff191663ffffffff83811691909117918290556040517f4f27f6f220ffad585e728389bc2f0f6b74eeebeb43f95f53752a647cb6e7e68792610a7d921690615ae0565b600054610100900460ff16806138655750613865612d8d565b80613873575060005460ff16155b61388f5760405162461bcd60e51b815260040161088490615360565b600054610100900460ff161580156138ba576000805460ff1961ff0019909116610100171660011790555b6138c2613ede565b6138ca613f5f565b8015610d64576000805461ff001916905550565b8054156138fd5760405162461bcd60e51b815260040161088490615521565b60016000818152918101602052604090912080546001600160a01b0319169091179055565b600082613931575060006107e3565b8282028284828161393e57fe5b04146129095760405162461bcd60e51b8152600401610884906154ab565b600061290983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614039565b4390565b60006139b5826301ffc9a760e01b6139d5565b80156107e357506139ce826001600160e01b03196139d5565b1592915050565b60008060006139e48585614070565b915091508180156139f25750805b95945050505050565b6000808211613a1c5760405162461bcd60e51b815260040161088490615257565b818381613a2557fe5b049392505050565b3b151590565b6075546000908290825b81811015613ad757613a4d61445a565b60758281548110613a5a57fe5b600091825260208083206040805160608101825293909101546001600160a01b0381168452600160a01b810461ffff16928401839052600160b01b900460ff1690830152909250613aac908690614165565b9050613ac18260000151828460400151614179565b613acb87826134b7565b96505050600101613a3d565b50929392505050565b6000613aec6070613cbd565b90505b6001600160a01b03811615801590613b225750613b0c6070613cda565b6001600160a01b0316816001600160a01b031614155b15613c46576066546040516370a0823160e01b81526000916001600160a01b03808516926370a0823192613b5a921690600401614b45565b60206040518083038186803b158015613b7257600080fd5b505afa158015613b86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613baa9190614922565b90508015613c33576066546001600160a01b038381166000908152607260205260409081902090516316960d5560e01b815291909216916316960d5591613bf8918791879190600401614b73565b600060405180830381600087803b158015613c1257600080fd5b505af1158015613c26573d6000803e3d6000fd5b50505050613c3382612cb5565b613c3e607083613ce0565b915050613aef565b61101f6070614184565b60665460675460405163358dc31d60e11b81526001600160a01b0392831692636b1b863a92613c8792879287921690600401614c42565b600060405180830381600087803b158015613ca157600080fd5b505af1158015613cb5573d6000803e3d6000fd5b505050505050565b60016000818152910160205260409020546001600160a01b031690565b50600190565b6001600160a01b0380821660009081526001840160205260409020541692915050565b6000613d0f606e613cbd565b90505b6001600160a01b03811615801590613d455750613d2f606e613cda565b6001600160a01b0316816001600160a01b031614155b1561101f576066546040516370a0823160e01b81526000916001600160a01b03808516926370a0823192613d7d921690600401614b45565b60206040518083038186803b158015613d9557600080fd5b505afa158015613da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dcd9190614922565b90508015613e3c57606654604051630ac2ac5160e21b81526001600160a01b0390911690632b0ab14490613e0990869086908690600401614bda565b600060405180830381600087803b158015613e2357600080fd5b505af1158015613e37573d6000803e3d6000fd5b505050505b613e47606e83613ce0565b915050613d12565b6060613ea4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166142209092919063ffffffff16565b805190915015610fbe5780806020019051810190613ec291906147f7565b610fbe5760405162461bcd60e51b81526004016108849061576e565b600054610100900460ff1680613ef75750613ef7612d8d565b80613f05575060005460ff16155b613f215760405162461bcd60e51b815260040161088490615360565b600054610100900460ff161580156138ca576000805460ff1961ff0019909116610100171660011790558015610d64576000805461ff001916905550565b600054610100900460ff1680613f785750613f78612d8d565b80613f86575060005460ff16155b613fa25760405162461bcd60e51b815260040161088490615360565b600054610100900460ff16158015613fcd576000805460ff1961ff0019909116610100171660011790555b6000613fd761287b565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610d64576000805461ff001916905550565b6000818361405a5760405162461bcd60e51b81526004016108849190614db1565b50600083858161406657fe5b0495945050505050565b60008060606301ffc9a760e01b8460405160240161408e9190614d9c565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060866001600160a01b0316617530846040516140e29190614b20565b6000604051808303818686fa925050503d806000811461411e576040519150601f19603f3d011682016040523d82523d6000602084013e614123565b606091505b5091509150602081511015614141576000809450945050505061415e565b818180602001905181019061415691906147f7565b945094505050505b9250929050565b600061290961ffff831684026103e86139fb565b610fbe83838361422f565b6001600081815290820160205260409020546001600160a01b03165b6001600160a01b038116158015906141c257506001600160a01b038116600114155b156141f8576001600160a01b039081166000908152600183016020526040902080546001600160a01b03198116909155166141a0565b50600160008181528282016020526040812080546001600160a01b0319169092179091559055565b60606128738484600085614360565b60665460408051634eb1c24560e11b815290516060926001600160a01b031691639d63848a916004808301926000929190829003018186803b15801561427457600080fd5b505afa158015614288573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526142b0919081019061468d565b905080518260ff1611156142d65760405162461bcd60e51b8152600401610884906156da565b6000818360ff16815181106142e757fe5b602090810291909101015160665460405163358dc31d60e11b81529192506001600160a01b031690636b1b863a9061432790889088908690600401614c42565b600060405180830381600087803b15801561434157600080fd5b505af1158015614355573d6000803e3d6000fd5b505050505050505050565b6060824710156143825760405162461bcd60e51b8152600401610884906151cf565b61438b85613a2d565b6143a75760405162461bcd60e51b8152600401610884906156a3565b60006060866001600160a01b031685876040516143c49190614b20565b60006040518083038185875af1925050503d8060008114614401576040519150601f19603f3d011682016040523d82523d6000602084013e614406565b606091505b5091509150614416828286614421565b979650505050505050565b60608315614430575081612909565b8251156144405782518084602001fd5b8160405162461bcd60e51b81526004016108849190614db1565b604080516060810182526000808252602082018190529181019190915290565b5080546000825590600052602060002090810190610d6491905b808211156134b35760008155600101614494565b60008083601f8401126144b9578081fd5b50813567ffffffffffffffff8111156144d0578182fd5b602083019150836020808302850101111561415e57600080fd5b6000606082840312156144fb578081fd5b6145056060615af1565b9050813561451281615b64565b8152602082013561ffff8116811461452957600080fd5b602082015261453b8360408401614546565b604082015292915050565b803560ff811681146107e357600080fd5b600060208284031215614568578081fd5b813561290981615b64565b600060208284031215614584578081fd5b815161290981615b64565b600080600080608085870312156145a4578283fd5b84356145af81615b64565b935060208501356145bf81615b64565b92506040850135915060608501356145d681615b64565b939692955090935050565b600080604083850312156145f3578081fd5b82356145fe81615b64565b9150602083013561460e81615b79565b809150509250929050565b6000806040838503121561462b578182fd5b825161463681615b64565b6020939093015192949293505050565b6000806000806080858703121561465b578182fd5b843561466681615b64565b935060208501359250604085013561467d81615b64565b915060608501356145d681615b64565b6000602080838503121561469f578182fd5b825167ffffffffffffffff8111156146b5578283fd5b8301601f810185136146c5578283fd5b80516146d86146d382615b18565b615af1565b81815283810190838501858402850186018910156146f4578687fd5b8694505b8385101561471f57805161470b81615b64565b8352600194909401939185019185016146f8565b50979650505050505050565b6000806020838503121561473d578182fd5b823567ffffffffffffffff811115614753578283fd5b61475f858286016144a8565b90969095509350505050565b6000806020838503121561477d578182fd5b823567ffffffffffffffff80821115614794578384fd5b818501915085601f8301126147a7578384fd5b8135818111156147b5578485fd5b8660206060830285010111156147c9578485fd5b60209290920196919550909350505050565b6000602082840312156147ec578081fd5b813561290981615b79565b600060208284031215614808578081fd5b815161290981615b79565b600060208284031215614824578081fd5b81356001600160e01b031981168114612909578182fd5b6000806040838503121561484d578182fd5b823561485881615b64565b9150602083013561460e81615b64565b60008060006040848603121561487c578081fd5b833561488781615b64565b9250602084013567ffffffffffffffff8111156148a2578182fd5b6148ae868287016144a8565b9497909650939450505050565b6000606082840312156148cc578081fd5b61290983836144ea565b600080608083850312156148e8578182fd5b6148f284846144ea565b91506149018460608501614546565b90509250929050565b60006020828403121561491b578081fd5b5035919050565b600060208284031215614933578081fd5b5051919050565b600080600080600080600060e0888a031215614954578485fd5b873596506020808901359650604089013561496e81615b64565b9550606089013561497e81615b64565b9450608089013561498e81615b64565b935060a089013561499e81615b64565b925060c089013567ffffffffffffffff8111156149b9578283fd5b8901601f81018b136149c9578283fd5b80356149d76146d382615b18565b81815283810190838501858402850186018f10156149f3578687fd5b8694505b83851015614a1e578035614a0a81615b64565b8352600194909401939185019185016149f7565b50809550505050505092959891949750929550565b600080600080600080600060e0888a031215614a4d578081fd5b87359650602088013595506040880135614a6681615b64565b94506060880135614a7681615b64565b93506080880135614a8681615b64565b925060a0880135614a9681615b64565b8092505060c0880135905092959891949750929550565b600060208284031215614abe578081fd5b813561290981615b87565b60008060408385031215614adb578182fd5b8251614ae681615b87565b602084015190925061460e81615b87565b80516001600160a01b0316825260208082015161ffff169083015260409081015160ff16910152565b60008251614b32818460208701615b38565b9190910192915050565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03848116825283166020808301919091526060604083018190528354908301819052600084815282812090929091608085019190845b81811015614bcc57845484526001948501949383019301614bb0565b509198975050505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03948516815292841660208401526040830191909152909116606082015260800190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6001600160a01b03948516815260208101939093529083166040830152909116606082015260800190565b6020808252825182820181905260009190848201906040850190845b81811015614cd15783516001600160a01b031683529284019291840191600101614cac565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614cd157614d0c838551614af7565b9284019260609290920191600101614cf9565b6020808252810182905260006001600160fb1b03831115614d3e578081fd5b60208302808560408501379190910160400190815292915050565b6020808252825182820181905260009190848201906040850190845b81811015614cd157835183529284019291840191600101614d75565b901515815260200190565b6001600160e01b031991909116815260200190565b6000602082528251806020840152614dd0816040850160208701615b38565b601f01601f19169190910160400192915050565b60208082526024908201527f506572696f6469635072697a6553747261746567792f6572633732312d696e76604082015263185b1a5960e21b606082015260800190565b6020808252602c908201527f506572696f6469635072697a6553747261746567792f746f6b656e2d6c69737460408201526b195b995c8b5a5b9d985b1a5960a21b606082015260800190565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b602080825260139082015272496e76616c696420707265764164647265737360681b604082015260600190565b6020808252602b908201527f506572696f6469635072697a6553747261746567792f7072697a652d7065726960408201526a37b216b737ba16b7bb32b960a91b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252602c908201527f506572696f6469635072697a6553747261746567792f6f6e6c792d6f776e657260408201526b16b7b916b634b9ba32b732b960a11b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252602a908201527f506572696f6469635072697a6553747261746567792f73706f6e736f72736869604082015269702d6e6f742d7a65726f60b01b606082015260800190565b60208082526028908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c60408201526734ba16ba37b5b2b760c11b606082015260800190565b60208082526034908201527f506572696f6469635072697a6553747261746567792f7072697a652d706572696040820152736f642d677265617465722d7468616e2d7a65726f60601b606082015260800190565b60208082526025908201527f506572696f6469635072697a6553747261746567792f6f6e6c792d7072697a656040820152640b5c1bdbdb60da1b606082015260800190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f7472616e736665722d746040820152653796b9b2b63360d11b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526029908201527f506572696f6469635072697a6553747261746567792f7072697a652d706f6f6c6040820152682d6e6f742d7a65726f60b81b606082015260800190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526022908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d7a65604082015261726f60f01b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d636f6040820152656d706c65746560d01b606082015260800190565b60208082526029908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c6040820152681a5d0b5d185c99d95d60ba1b606082015260800190565b60208082526023908201527f506572696f6469635072697a6553747261746567792f65726332302d696e76616040820152621b1a5960ea1b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526026908201527f4d756c7469706c6557696e6e6572732f6e6f6e6578697374656e742d7072697a604082015265195cdc1b1a5d60d21b606082015260800190565b6020808252818101527f506572696f6469635072697a6553747261746567792f65726332302d6e756c6c604082015260600190565b6020808252602b908201527f506572696f6469635072697a6553747261746567792f726e672d616c7265616460408201526a1e4b5c995c5d595cdd195960aa1b606082015260800190565b6020808252601f908201527f4d756c7469706c6557696e6e6572732f77696e6e6572732d6774652d6f6e6500604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600c908201526b105b1c9958591e481a5b9a5d60a21b604082015260600190565b60208082526033908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c6040820152721a5d0b5c195c98d95b9d1859d94b5d1bdd185b606a1b606082015260800190565b60208082526031908201527f506572696f6469635072697a6553747261746567792f6265666f72654177617260408201527019131a5cdd195b995c8b5a5b9d985b1a59607a1b606082015260800190565b6020808252602b908201527f506572696f6469635072697a6553747261746567792f63616e6e6f742d61776160408201526a1c990b595e1d195c9b985b60aa1b606082015260800190565b6020808252600d908201526c105b1c9958591e481859191959609a1b604082015260600190565b60208082526026908201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360408201526532206269747360d01b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602f908201527f506572696f6469635072697a6553747261746567792f61776172642d696e766160408201526e0d8d2c85ae8ded6cadc5ad2dcc8caf608b1b606082015260800190565b60208082526025908201527f506572696f6469635072697a6553747261746567792f7469636b65742d6e6f746040820152642d7a65726f60d81b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526033908201527f506572696f6469635072697a6553747261746567792f7072697a6553747261746040820152721959de531a5cdd195b995c8b5a5b9d985b1a59606a1b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f6572633732312d6475706040820152656c696361746560d01b606082015260800190565b60208082526023908201527f506572696f6469635072697a6553747261746567792f726e672d696e2d666c6960408201526219da1d60ea1b606082015260800190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d74696040820152651b59591bdd5d60d21b606082015260800190565b6020808252602c908201527f506572696f6469635072697a6553747261746567792f726e672d74696d656f7560408201526b742d67742d36302d7365637360a01b606082015260800190565b60208082526027908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d72656040820152661c5d595cdd195960ca1b606082015260800190565b60208082526027908201527f506572696f6469635072697a6553747261746567792f756e617661696c61626c6040820152663296ba37b5b2b760c91b606082015260800190565b606081016107e38284614af7565b61ffff93909316835260ff919091166020830152604082015260600190565b61ffff93909316835260ff918216602084015216604082015260600190565b918252602082015260400190565b86815260208082018790526001600160a01b0386811660408401528581166060840152848116608084015260c060a08401819052845190840181905260009285810192909160e0860190855b81811015615ace578551841683529484019491840191600101615ab0565b50909c9b505050505050505050505050565b63ffffffff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615b1057600080fd5b604052919050565b600067ffffffffffffffff821115615b2e578081fd5b5060209081020190565b60005b83811015615b53578181015183820152602001615b3b565b83811115610cc45750506000910152565b6001600160a01b0381168114610d6457600080fd5b8015158114610d6457600080fd5b63ffffffff81168114610d6457600080fdfea26469706673582212200b04a034fdc9b603434ff2e14bbf9df827851a7ec270ad4d35335f3752edeb5f64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x3E6 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7F2BE9FC GT PUSH2 0x20A JUMPI DUP1 PUSH4 0xB0244682 GT PUSH2 0x125 JUMPI DUP1 PUSH4 0xD18E81B3 GT PUSH2 0xB8 JUMPI DUP1 PUSH4 0xEEFC8AD1 GT PUSH2 0x87 JUMPI DUP1 PUSH4 0xEEFC8AD1 EQ PUSH2 0x762 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x782 JUMPI DUP1 PUSH4 0xF97700E2 EQ PUSH2 0x795 JUMPI DUP1 PUSH4 0xFBF0953E EQ PUSH2 0x7A8 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x7BB JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0xD18E81B3 EQ PUSH2 0x742 JUMPI DUP1 PUSH4 0xD5AD6BF6 EQ PUSH2 0x74A JUMPI DUP1 PUSH4 0xD605787B EQ PUSH2 0x752 JUMPI DUP1 PUSH4 0xDFB2F13B EQ PUSH2 0x75A JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0xC2F19EE8 GT PUSH2 0xF4 JUMPI DUP1 PUSH4 0xC2F19EE8 EQ PUSH2 0x70C JUMPI DUP1 PUSH4 0xC42B42A0 EQ PUSH2 0x714 JUMPI DUP1 PUSH4 0xC48DDBCB EQ PUSH2 0x71C JUMPI DUP1 PUSH4 0xC6853270 EQ PUSH2 0x72F JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0xB0244682 EQ PUSH2 0x6CB JUMPI DUP1 PUSH4 0xB2210957 EQ PUSH2 0x6DE JUMPI DUP1 PUSH4 0xB9EE1E05 EQ PUSH2 0x6F1 JUMPI DUP1 PUSH4 0xC25A9C32 EQ PUSH2 0x6F9 JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x8E204C43 GT PUSH2 0x19D JUMPI DUP1 PUSH4 0x95E5F9EE GT PUSH2 0x16C JUMPI DUP1 PUSH4 0x95E5F9EE EQ PUSH2 0x6A0 JUMPI DUP1 PUSH4 0x9DAFAFB0 EQ PUSH2 0x6A8 JUMPI DUP1 PUSH4 0xA4E075CA EQ PUSH2 0x6B0 JUMPI DUP1 PUSH4 0xACCA5B95 EQ PUSH2 0x6C3 JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x8E204C43 EQ PUSH2 0x652 JUMPI DUP1 PUSH4 0x91C05B0B EQ PUSH2 0x665 JUMPI DUP1 PUSH4 0x94144C6B EQ PUSH2 0x678 JUMPI DUP1 PUSH4 0x9417783F EQ PUSH2 0x680 JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x8AA3EC6F GT PUSH2 0x1D9 JUMPI DUP1 PUSH4 0x8AA3EC6F EQ PUSH2 0x61A JUMPI DUP1 PUSH4 0x8ACFACA9 EQ PUSH2 0x62D JUMPI DUP1 PUSH4 0x8D5F10C4 EQ PUSH2 0x635 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x64A JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x7F2BE9FC EQ PUSH2 0x5D9 JUMPI DUP1 PUSH4 0x7F4296D7 EQ PUSH2 0x5EC JUMPI DUP1 PUSH4 0x876F5C7E EQ PUSH2 0x5FF JUMPI DUP1 PUSH4 0x884A4448 EQ PUSH2 0x607 JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x4E5D08E0 GT PUSH2 0x305 JUMPI DUP1 PUSH4 0x6BE51C4F GT PUSH2 0x298 JUMPI DUP1 PUSH4 0x6F46F221 GT PUSH2 0x267 JUMPI DUP1 PUSH4 0x6F46F221 EQ PUSH2 0x5B1 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x5B9 JUMPI DUP1 PUSH4 0x719CE73E EQ PUSH2 0x5C1 JUMPI DUP1 PUSH4 0x72F33EA9 EQ PUSH2 0x5C9 JUMPI DUP1 PUSH4 0x738BBEA8 EQ PUSH2 0x5D1 JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x6BE51C4F EQ PUSH2 0x586 JUMPI DUP1 PUSH4 0x6BEA5344 EQ PUSH2 0x58E JUMPI DUP1 PUSH4 0x6CC25DB7 EQ PUSH2 0x596 JUMPI DUP1 PUSH4 0x6DFB0386 EQ PUSH2 0x59E JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x62C77A61 GT PUSH2 0x2D4 JUMPI DUP1 PUSH4 0x62C77A61 EQ PUSH2 0x550 JUMPI DUP1 PUSH4 0x66968221 EQ PUSH2 0x558 JUMPI DUP1 PUSH4 0x671137C4 EQ PUSH2 0x56B JUMPI DUP1 PUSH4 0x6A74F107 EQ PUSH2 0x57E JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x4E5D08E0 EQ PUSH2 0x50F JUMPI DUP1 PUSH4 0x500DB70D EQ PUSH2 0x522 JUMPI DUP1 PUSH4 0x52A30109 EQ PUSH2 0x52A JUMPI DUP1 PUSH4 0x605E25AC EQ PUSH2 0x53D JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x2C8FE73D GT PUSH2 0x37D JUMPI DUP1 PUSH4 0x47BED998 GT PUSH2 0x34C JUMPI DUP1 PUSH4 0x47BED998 EQ PUSH2 0x4D9 JUMPI DUP1 PUSH4 0x4ABA4F6B EQ PUSH2 0x4EC JUMPI DUP1 PUSH4 0x4C169F4F EQ PUSH2 0x4F4 JUMPI DUP1 PUSH4 0x4D7F3DB0 EQ PUSH2 0x4FC JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x2C8FE73D EQ PUSH2 0x496 JUMPI DUP1 PUSH4 0x30FCDF41 EQ PUSH2 0x49E JUMPI DUP1 PUSH4 0x38A9B4B6 EQ PUSH2 0x4B1 JUMPI DUP1 PUSH4 0x42D09209 EQ PUSH2 0x4C4 JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x111070E4 GT PUSH2 0x3B9 JUMPI DUP1 PUSH4 0x111070E4 EQ PUSH2 0x451 JUMPI DUP1 PUSH4 0x152D308C EQ PUSH2 0x459 JUMPI DUP1 PUSH4 0x22F8E566 EQ PUSH2 0x46C JUMPI DUP1 PUSH4 0x2A7AD609 EQ PUSH2 0x481 JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x1B48E34 EQ PUSH2 0x3EB JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x414 JUMPI DUP1 PUSH4 0xD847FC4 EQ PUSH2 0x434 JUMPI DUP1 PUSH4 0xFAF125F EQ PUSH2 0x449 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3FE PUSH2 0x3F9 CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0x7D0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x427 PUSH2 0x422 CALLDATASIZE PUSH1 0x4 PUSH2 0x4813 JUMP JUMPDEST PUSH2 0x7E9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x4D91 JUMP JUMPDEST PUSH2 0x43C PUSH2 0x81F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x4B45 JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x82E JUMP JUMPDEST PUSH2 0x427 PUSH2 0x834 JUMP JUMPDEST PUSH2 0x427 PUSH2 0x467 CALLDATASIZE PUSH1 0x4 PUSH2 0x45E1 JUMP JUMPDEST PUSH2 0x843 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x47A CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0x8FA JUMP JUMPDEST STOP JUMPDEST PUSH2 0x489 PUSH2 0x8FF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x5AE0 JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x90B JUMP JUMPDEST PUSH2 0x47F PUSH2 0x4AC CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0x91A JUMP JUMPDEST PUSH2 0x47F PUSH2 0x4BF CALLDATASIZE PUSH1 0x4 PUSH2 0x47DB JUMP JUMPDEST PUSH2 0x9F2 JUMP JUMPDEST PUSH2 0x4CC PUSH2 0xA88 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x4C90 JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x4E7 CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0xA94 JUMP JUMPDEST PUSH2 0x427 PUSH2 0xA9F JUMP JUMPDEST PUSH2 0x47F PUSH2 0xB28 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x50A CALLDATASIZE PUSH1 0x4 PUSH2 0x4646 JUMP JUMPDEST PUSH2 0xBF2 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x51D CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0xCCA JUMP JUMPDEST PUSH2 0x43C PUSH2 0xD67 JUMP JUMPDEST PUSH2 0x427 PUSH2 0x538 CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0xD76 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x54B CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0xE04 JUMP JUMPDEST PUSH2 0x4CC PUSH2 0xEE5 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x566 CALLDATASIZE PUSH1 0x4 PUSH2 0x472B JUMP JUMPDEST PUSH2 0xEF1 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x579 CALLDATASIZE PUSH1 0x4 PUSH2 0x483B JUMP JUMPDEST PUSH2 0xFC3 JUMP JUMPDEST PUSH2 0x427 PUSH2 0x1023 JUMP JUMPDEST PUSH2 0x43C PUSH2 0x103C JUMP JUMPDEST PUSH2 0x489 PUSH2 0x104B JUMP JUMPDEST PUSH2 0x43C PUSH2 0x105F JUMP JUMPDEST PUSH2 0x47F PUSH2 0x5AC CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0x106E JUMP JUMPDEST PUSH2 0x427 PUSH2 0x10BE JUMP JUMPDEST PUSH2 0x47F PUSH2 0x10C7 JUMP JUMPDEST PUSH2 0x43C PUSH2 0x1150 JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x115F JUMP JUMPDEST PUSH2 0x427 PUSH2 0x1165 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x5E7 CALLDATASIZE PUSH1 0x4 PUSH2 0x4A33 JUMP JUMPDEST PUSH2 0x11B8 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x5FA CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0x125C JUMP JUMPDEST PUSH2 0x427 PUSH2 0x1312 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x615 CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0x1331 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x628 CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0x1381 JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x1459 JUMP JUMPDEST PUSH2 0x63D PUSH2 0x145F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x4CDD JUMP JUMPDEST PUSH2 0x43C PUSH2 0x14E4 JUMP JUMPDEST PUSH2 0x427 PUSH2 0x660 CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0x14F3 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x673 CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0x1508 JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x1511 JUMP JUMPDEST PUSH2 0x693 PUSH2 0x68E CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0x1517 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x4D59 JUMP JUMPDEST PUSH2 0x427 PUSH2 0x1583 JUMP JUMPDEST PUSH2 0x427 PUSH2 0x158D JUMP JUMPDEST PUSH2 0x427 PUSH2 0x6BE CALLDATASIZE PUSH1 0x4 PUSH2 0x47DB JUMP JUMPDEST PUSH2 0x1596 JUMP JUMPDEST PUSH2 0x489 PUSH2 0x161D JUMP JUMPDEST PUSH2 0x47F PUSH2 0x6D9 CALLDATASIZE PUSH1 0x4 PUSH2 0x483B JUMP JUMPDEST PUSH2 0x1629 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x6EC CALLDATASIZE PUSH1 0x4 PUSH2 0x458F JUMP JUMPDEST PUSH2 0x16B4 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x1785 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x707 CALLDATASIZE PUSH1 0x4 PUSH2 0x476B JUMP JUMPDEST PUSH2 0x19CD JUMP JUMPDEST PUSH2 0x43C PUSH2 0x1D5C JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x1D6B JUMP JUMPDEST PUSH2 0x47F PUSH2 0x72A CALLDATASIZE PUSH1 0x4 PUSH2 0x4868 JUMP JUMPDEST PUSH2 0x1DE8 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x73D CALLDATASIZE PUSH1 0x4 PUSH2 0x4AAD JUMP JUMPDEST PUSH2 0x1FDD JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x202D JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x2033 JUMP JUMPDEST PUSH2 0x43C PUSH2 0x203D JUMP JUMPDEST PUSH2 0x47F PUSH2 0x204C JUMP JUMPDEST PUSH2 0x775 PUSH2 0x770 CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0x22CE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x5A0A JUMP JUMPDEST PUSH2 0x47F PUSH2 0x790 CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0x2333 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x7A3 CALLDATASIZE PUSH1 0x4 PUSH2 0x493A JUMP JUMPDEST PUSH2 0x23F4 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x7B6 CALLDATASIZE PUSH1 0x4 PUSH2 0x48D6 JUMP JUMPDEST PUSH2 0x2655 JUMP JUMPDEST PUSH2 0x7C3 PUSH2 0x27F4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x4DB1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7E3 PUSH2 0x7DD PUSH2 0x2815 JUMP JUMPDEST DUP4 PUSH2 0x2852 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL EQ DUP1 PUSH2 0x7E3 JUMPI POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT EQ SWAP1 JUMP JUMPDEST PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x7A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH4 0xFFFFFFFF AND ISZERO ISZERO JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x84D PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x85E PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x88D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x895 PUSH2 0x287F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x78 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP6 ISZERO ISZERO OR SWAP1 SSTORE MLOAD PUSH32 0xD1AC9A365C0E3BFAD562E0A809A5DED3842A2B489F839B3327E4E34EE0128F28 SWAP1 PUSH2 0x8E9 SWAP1 DUP6 SWAP1 PUSH2 0x4D91 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x7B SSTORE JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x915 PUSH2 0x28D4 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x922 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x933 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x959 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x961 PUSH2 0x287F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0x98C JUMPI POP PUSH2 0x98C PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH4 0x266FCE1F PUSH1 0xE1 SHL PUSH2 0x28ED JUMP JUMPDEST PUSH2 0x9A8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x559A JUMP JUMPDEST PUSH1 0x73 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xC4FEFF61630891EA2CB42A54FBE3FF2E65422F2ED17323AC6B65F4521112E87E SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH2 0x9FA PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xA0B PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xA31 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0xA39 PUSH2 0x287F JUMP JUMPDEST PUSH1 0x77 DUP1 SLOAD PUSH1 0xFF NOT AND DUP3 ISZERO ISZERO OR SWAP1 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x6959D02E8FB6264D1D39BF37F1E725001F342714933CF38F8627A2442EFC43FD SWAP2 PUSH2 0xA7D SWAP2 PUSH1 0xFF SWAP1 SWAP2 AND SWAP1 PUSH2 0x4D91 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x915 PUSH1 0x70 PUSH2 0x2910 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7E3 DUP3 PUSH2 0x29F0 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x6A SLOAD PUSH1 0x40 MLOAD PUSH4 0xE866E6F PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x3A19B9BC SWAP2 PUSH2 0xAD8 SWAP2 PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x4 ADD PUSH2 0x5AE0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xAF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xB04 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x915 SWAP2 SWAP1 PUSH2 0x47F7 JUMP JUMPDEST PUSH2 0xB30 PUSH2 0x1165 JUMP JUMPDEST PUSH2 0xB4C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x58EA JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF NOT DUP2 AND SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH4 0xFFFFFFFF DUP1 DUP4 AND SWAP3 PUSH5 0x100000000 SWAP1 DIV AND SWAP1 PUSH32 0xEE6702C46C5618E6FC7E625C71F4C85DF9C91D456CB16A3AEA71AB83B1FEE005 SWAP1 PUSH1 0x0 SWAP1 LOG1 PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0xFFFFFFFF DUP5 AND SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 CALLER SWAP1 PUSH32 0xD50026EE0824513AF20CDF5E72D1FBFBE8FD646EE0576378E080326F1A695E58 SWAP1 PUSH2 0xBE6 SWAP1 DUP7 SWAP1 PUSH2 0x5AE0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xC06 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xC2C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x50C4 JUMP JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0xC4A JUMPI PUSH2 0xC4A PUSH2 0x287F JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0xCC4 JUMPI PUSH1 0x65 SLOAD PUSH1 0x40 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x4D7F3DB0 SWAP1 PUSH2 0xC91 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x4C65 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xCBF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0xCD2 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xCE3 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0xD12 JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xD07 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0xD37 JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xD2C PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0xD53 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4F5B JUMP JUMPDEST PUSH2 0xD5B PUSH2 0x287F JUMP JUMPDEST PUSH2 0xD64 DUP2 PUSH2 0x2A37 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xD80 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xD91 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xDB7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0xDBF PUSH2 0x287F JUMP JUMPDEST PUSH1 0x7A DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x63E4E34F49D12428C03E04E61340C7167E36EB0FF6F0B1970C75440261794039 SWAP1 PUSH2 0xDF4 SWAP1 DUP5 SWAP1 PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP PUSH1 0x1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xE0C PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE1D PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xE43 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0xE4B PUSH2 0x287F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0xE79 JUMPI POP PUSH2 0xE79 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x28ED JUMP JUMPDEST PUSH2 0xE95 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4E28 JUMP JUMPDEST PUSH1 0x65 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 AND SWAP1 PUSH32 0x9FC437AA70AD4EE5F33F6772BF338EED41E21B95435820817AB8B4DF161CE4DD SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x915 PUSH1 0x6E PUSH2 0x2910 JUMP JUMPDEST PUSH2 0xEF9 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF0A PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0xF39 JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF2E PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0xF5E JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF53 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0xF7A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4F5B JUMP JUMPDEST PUSH2 0xF82 PUSH2 0x287F JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xFBE JUMPI PUSH2 0xFB6 DUP4 DUP4 DUP4 DUP2 DUP2 LT PUSH2 0xF9C JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0xFB1 SWAP2 SWAP1 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0x2A37 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xF85 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xFCB PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xFDC PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1002 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x100A PUSH2 0x287F JUMP JUMPDEST PUSH2 0x1016 PUSH1 0x70 DUP3 DUP5 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0x101F DUP3 PUSH2 0x2CB5 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x102D PUSH2 0x834 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x915 JUMPI POP PUSH2 0x915 PUSH2 0xA9F JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH5 0x100000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1076 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1087 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x10AD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x10B5 PUSH2 0x287F JUMP JUMPDEST PUSH2 0xD64 DUP2 PUSH2 0x2D0D JUMP JUMPDEST PUSH1 0x79 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x10CF PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x10E0 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1106 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x6D SLOAD DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND PUSH2 0x1184 JUMPI POP PUSH1 0x0 PUSH2 0x840 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH1 0x6B SLOAD PUSH2 0x11A8 SWAP2 PUSH4 0xFFFFFFFF SWAP2 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 SWAP2 DIV DUP2 AND SWAP1 PUSH2 0x2D62 AND JUMP JUMPDEST PUSH2 0x11B0 PUSH2 0x2D87 JUMP JUMPDEST GT SWAP1 POP PUSH2 0x840 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x11D1 JUMPI POP PUSH2 0x11D1 PUSH2 0x2D8D JUMP JUMPDEST DUP1 PUSH2 0x11DF JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x11FB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5360 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1226 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x60 PUSH2 0x1237 DUP10 DUP10 DUP10 DUP10 DUP10 DUP10 DUP8 PUSH2 0x23F4 JUMP JUMPDEST PUSH2 0x1240 DUP4 PUSH2 0x2D0D JUMP JUMPDEST POP DUP1 ISZERO PUSH2 0xCBF JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1264 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1275 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x129B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x12A3 PUSH2 0x287F JUMP JUMPDEST PUSH2 0x12AB PUSH2 0x834 JUMP JUMPDEST ISZERO PUSH2 0x12C8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x58A7 JUMP JUMPDEST PUSH1 0x69 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xF935763CC7C57EE8ED6318ED71E756CCA0731294C9F46FF5B386F36D6FF1417A SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x131C PUSH2 0x2D98 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x915 JUMPI POP PUSH2 0x132B PUSH2 0x834 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x1339 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x134A PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1370 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x1378 PUSH2 0x287F JUMP JUMPDEST PUSH2 0xD64 DUP2 PUSH2 0x2DB1 JUMP JUMPDEST PUSH2 0x1389 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x139A PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x13C0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x13C8 PUSH2 0x287F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0x13F3 JUMPI POP PUSH2 0x13F3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH4 0x2BA83963 PUSH1 0xE1 SHL PUSH2 0x28ED JUMP JUMPDEST PUSH2 0x140F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x57B8 JUMP JUMPDEST PUSH1 0x74 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xDA05D50A3A1EC0FFAB059F1D457AE59F68CCFB3FFBB4DAD283C516F9103D584B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x76 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x75 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0x14DB JUMPI PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 SWAP1 DUP2 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP2 DUP6 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND DUP4 DUP6 ADD MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP3 ADD MSTORE DUP3 MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 ADD PUSH2 0x1483 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x78 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0xD64 DUP2 PUSH2 0x2E06 JUMP JUMPDEST PUSH1 0x6C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD DUP4 MLOAD DUP2 DUP5 MUL DUP2 ADD DUP5 ADD SWAP1 SWAP5 MSTORE DUP1 DUP5 MSTORE PUSH1 0x60 SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1577 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x1563 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x915 PUSH2 0x2D98 JUMP JUMPDEST PUSH1 0x77 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15A0 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x15B1 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x15D7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x15DF PUSH2 0x287F JUMP JUMPDEST PUSH1 0x79 DUP1 SLOAD PUSH1 0xFF NOT AND DUP4 ISZERO ISZERO OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x2B4B6FFE286F7CE4CCC6B136BB14987B0A00092174D88938A0C667A104A4A731 SWAP1 PUSH2 0xDF4 SWAP1 DUP5 SWAP1 PUSH2 0x4D91 JUMP JUMPDEST PUSH1 0x6B SLOAD PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x1631 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1642 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1668 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x1670 PUSH2 0x287F JUMP JUMPDEST PUSH2 0x167C PUSH1 0x6E DUP3 DUP5 PUSH2 0x2BEB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 PUSH32 0x58982464497ACDAB11AD29D39907E076B0D3B8DAF1D9B734174C7C3A2A0E8C74 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16C8 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x16EE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x50C4 JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x1720 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5109 JUMP JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x173E JUMPI PUSH2 0x173E PUSH2 0x287F JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0xCC4 JUMPI PUSH1 0x65 SLOAD PUSH1 0x40 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xB2210957 SWAP1 PUSH2 0xC91 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x4BFE JUMP JUMPDEST PUSH2 0x178D PUSH2 0x2D98 JUMP JUMPDEST PUSH2 0x17A9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4ECA JUMP JUMPDEST PUSH2 0x17B1 PUSH2 0x834 JUMP JUMPDEST ISZERO PUSH2 0x17CE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5429 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xD37B537 PUSH1 0xE0 SHL DUP2 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP3 PUSH4 0xD37B537 SWAP3 PUSH1 0x4 DUP1 DUP4 ADD SWAP4 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1813 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1827 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x184B SWAP2 SWAP1 PUSH2 0x4619 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1868 JUMPI POP PUSH1 0x0 DUP2 GT JUMPDEST ISZERO PUSH2 0x1887 JUMPI PUSH1 0x69 SLOAD PUSH2 0x1887 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND SWAP2 AND DUP4 PUSH2 0x3393 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x433C53D9 PUSH1 0xE1 SHL DUP2 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP3 PUSH4 0x8678A7B2 SWAP3 PUSH1 0x4 DUP1 DUP4 ADD SWAP4 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x18E1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1905 SWAP2 SWAP1 PUSH2 0x4AC9 JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH4 0xFFFFFFFF DUP1 DUP5 AND PUSH5 0x100000000 MUL PUSH8 0xFFFFFFFF00000000 NOT SWAP2 DUP7 AND PUSH4 0xFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR AND OR SWAP1 SSTORE SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x194B PUSH2 0x1946 PUSH2 0x2D87 JUMP JUMPDEST PUSH2 0x348D JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFF0000000000000000 NOT AND PUSH1 0x1 PUSH1 0x40 SHL PUSH4 0xFFFFFFFF SWAP4 DUP5 AND MUL OR SWAP1 SSTORE PUSH1 0x66 SLOAD SWAP1 DUP4 AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1987 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x4D31E658DCF617BB3A3C8CF7C6DDDB33F7030AC588E271631ECDB5D76C2E91EF DUP5 PUSH1 0x40 MLOAD PUSH2 0x19BF SWAP2 SWAP1 PUSH2 0x5AE0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP JUMP JUMPDEST PUSH2 0x19D5 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x19E6 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1A0C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1CB1 JUMPI PUSH2 0x1A20 PUSH2 0x445A JUMP JUMPDEST DUP5 DUP5 DUP4 DUP2 DUP2 LT PUSH2 0x1A2C JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x60 MUL ADD DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x1A42 SWAP2 SWAP1 PUSH2 0x48BB JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP2 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND GT ISZERO PUSH2 0x1A6C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5028 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A93 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x52D4 JUMP JUMPDEST PUSH1 0x75 SLOAD DUP3 LT PUSH2 0x1B2F JUMPI PUSH1 0x75 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE PUSH1 0x0 SWAP2 SWAP1 SWAP2 MSTORE DUP2 MLOAD PUSH32 0x9A8D93986A7B9E6294572EA6736696119C195C1A9F5EAE642D3C5FCD44E49DEA SWAP1 SWAP2 ADD DUP1 SLOAD PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x40 DUP6 ADD MLOAD PUSH1 0xFF AND PUSH1 0x1 PUSH1 0xB0 SHL MUL PUSH1 0xFF PUSH1 0xB0 SHL NOT PUSH2 0xFFFF SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xA0 SHL MUL PUSH2 0xFFFF PUSH1 0xA0 SHL NOT PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP7 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP5 SWAP1 SWAP5 AND SWAP2 SWAP1 SWAP2 OR AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x1C56 JUMP JUMPDEST PUSH2 0x1B37 PUSH2 0x445A JUMP JUMPDEST PUSH1 0x75 DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x1B44 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND DUP1 DUP6 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP4 DIV PUSH2 0xFFFF AND SWAP6 DUP6 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 SWAP2 DIV PUSH1 0xFF AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP5 MLOAD SWAP2 SWAP4 POP AND EQ ISZERO DUP1 PUSH2 0x1BB3 JUMPI POP DUP1 PUSH1 0x20 ADD MLOAD PUSH2 0xFFFF AND DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0xFFFF AND EQ ISZERO JUMPDEST DUP1 PUSH2 0x1BCC JUMPI POP DUP1 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND DUP3 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x1C4D JUMPI DUP2 PUSH1 0x75 DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x1BDF JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 DUP4 MLOAD SWAP2 ADD DUP1 SLOAD SWAP3 DUP5 ADD MLOAD PUSH1 0x40 SWAP1 SWAP5 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP4 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH2 0xFFFF PUSH1 0xA0 SHL NOT AND PUSH1 0x1 PUSH1 0xA0 SHL PUSH2 0xFFFF SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 MUL SWAP3 SWAP1 SWAP3 OR PUSH1 0xFF PUSH1 0xB0 SHL NOT AND PUSH1 0x1 PUSH1 0xB0 SHL PUSH1 0xFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE PUSH2 0x1C54 JUMP JUMPDEST POP POP PUSH2 0x1CA9 JUMP JUMPDEST POP JUMPDEST DUP1 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC1BF93444A0055A24A7D0154B75FEDF78EDFE355C06A2CE8E47F9F3908720559 DUP3 PUSH1 0x20 ADD MLOAD DUP4 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 MLOAD PUSH2 0x1C9F SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5A18 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x1A10 JUMP JUMPDEST POP JUMPDEST PUSH1 0x75 SLOAD DUP2 LT ISZERO PUSH2 0x1D2E JUMPI PUSH1 0x75 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x1CCE SWAP1 PUSH1 0x1 PUSH2 0x34B7 JUMP JUMPDEST SWAP1 POP PUSH1 0x75 DUP1 SLOAD DUP1 PUSH2 0x1CDB JUMPI INVALID JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 DUP3 ADD PUSH1 0x0 NOT SWAP1 DUP2 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xB8 SHL SUB NOT AND SWAP1 SSTORE SWAP1 SWAP2 ADD SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD DUP3 SWAP2 PUSH32 0x99FA473FDF53414BCD014CF6E7509FC58C68F7B86174767FAA6AD5100CD5BAE5 SWAP2 LOG2 POP PUSH2 0x1CB3 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1D38 PUSH2 0x34DF JUMP JUMPDEST SWAP1 POP PUSH2 0x3E8 DUP2 GT ISZERO PUSH2 0xCC4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5547 JUMP JUMPDEST PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x18C1996D PUSH1 0xE2 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x630665B4 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1DB0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1DC4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x915 SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST PUSH2 0x1DF0 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E01 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0x1E30 JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E25 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0x1E55 JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E4A PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0x1E71 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4F5B JUMP JUMPDEST PUSH2 0x1E79 PUSH2 0x287F JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x6A3FD4F9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x6A3FD4F9 SWAP1 PUSH2 0x1EA9 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B45 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1EC1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1ED5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1EF9 SWAP2 SWAP1 PUSH2 0x47F7 JUMP JUMPDEST PUSH2 0x1F15 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x55EB JUMP JUMPDEST PUSH2 0x1F2F PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH4 0x80AC58CD PUSH1 0xE0 SHL PUSH2 0x28ED JUMP JUMPDEST PUSH2 0x1F4B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4DE4 JUMP JUMPDEST PUSH2 0x1F56 PUSH1 0x70 DUP5 PUSH2 0x3571 JUMP JUMPDEST PUSH2 0x1F65 JUMPI PUSH2 0x1F65 PUSH1 0x70 DUP5 PUSH2 0x35C2 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1F94 JUMPI PUSH2 0x1F8C DUP5 DUP5 DUP5 DUP5 DUP2 DUP2 LT PUSH2 0x1F80 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH2 0x368A JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x1F68 JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x51541DC4B4C08A16085809CCCDC4CC77D8000B60FBB00142E57F236D84298675 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH2 0x1FD0 SWAP3 SWAP2 SWAP1 PUSH2 0x4D1F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP JUMP JUMPDEST PUSH2 0x1FE5 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1FF6 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x201C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x2024 PUSH2 0x287F JUMP JUMPDEST PUSH2 0xD64 DUP2 PUSH2 0x37DB JUMP JUMPDEST PUSH1 0x7B SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x915 PUSH2 0x2815 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x2054 PUSH2 0x834 JUMP JUMPDEST PUSH2 0x2070 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x597C JUMP JUMPDEST PUSH2 0x2078 PUSH2 0xA9F JUMP JUMPDEST PUSH2 0x2094 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x528E JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x6A SLOAD PUSH1 0x40 MLOAD PUSH4 0x13A54BF3 PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x9D2A5F98 SWAP2 PUSH2 0x20CD SWAP2 PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x4 ADD PUSH2 0x5AE0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x20E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x20FB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x211F SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE PUSH1 0x73 SLOAD SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x21AF JUMPI PUSH1 0x73 SLOAD PUSH1 0x6D SLOAD PUSH1 0x40 MLOAD PUSH4 0x266FCE1F PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x4CDF9C3E SWAP2 PUSH2 0x217C SWAP2 DUP6 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x5A56 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2196 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x21AA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x21B8 DUP2 PUSH2 0x2E06 JUMP JUMPDEST PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2230 JUMPI PUSH1 0x74 SLOAD PUSH1 0x6D SLOAD PUSH1 0x40 MLOAD PUSH4 0x2BA83963 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x575072C6 SWAP2 PUSH2 0x21FD SWAP2 DUP6 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x5A56 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2217 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x222B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x2240 PUSH2 0x223B PUSH2 0x2D87 JUMP JUMPDEST PUSH2 0x29F0 JUMP JUMPDEST PUSH1 0x6D SSTORE PUSH2 0x224B PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x9C4163ECE98173EAB9A496C4DB8BF3E2C8EDCC5D2854377880597CCB858B7A9D DUP3 PUSH1 0x40 MLOAD PUSH2 0x2283 SWAP2 SWAP1 PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x6D SLOAD PUSH2 0x2296 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC61852C20F0B03B31D782F3022F2BF20322AC17CE66C5349FB6E24740CDD6456 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP JUMP JUMPDEST PUSH2 0x22D6 PUSH2 0x445A JUMP JUMPDEST PUSH1 0x75 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x22E3 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP4 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 SWAP3 DIV PUSH1 0xFF AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x233B PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x234C PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2372 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x2398 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4F15 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x240D JUMPI POP PUSH2 0x240D PUSH2 0x2D8D JUMP JUMPDEST DUP1 PUSH2 0x241B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2437 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5360 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2462 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH2 0x2488 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5186 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x24AE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5729 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x24D4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4FDE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x24FA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5215 JUMP JUMPDEST PUSH1 0x66 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP10 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SWAP3 SSTORE PUSH1 0x67 DUP1 SLOAD DUP9 DUP5 AND SWAP1 DUP4 AND OR SWAP1 SSTORE PUSH1 0x69 DUP1 SLOAD DUP7 DUP5 AND SWAP1 DUP4 AND OR SWAP1 SSTORE PUSH1 0x68 DUP1 SLOAD SWAP3 DUP8 AND SWAP3 SWAP1 SWAP2 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x254D DUP8 PUSH2 0x2DB1 JUMP JUMPDEST PUSH2 0x2555 PUSH2 0x384C JUMP JUMPDEST PUSH2 0x255F PUSH1 0x6E PUSH2 0x38DE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 MLOAD DUP2 LT ISZERO PUSH2 0x258F JUMPI PUSH2 0x2587 DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x257A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x2A37 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2562 JUMP JUMPDEST POP PUSH1 0x6C DUP8 SWAP1 SSTORE PUSH1 0x6D DUP9 SWAP1 SSTORE PUSH2 0x25A4 PUSH1 0x70 PUSH2 0x38DE JUMP JUMPDEST PUSH2 0x25AF PUSH2 0x708 PUSH2 0x37DB JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xF9632D212436344A25150FF0C161DABF412AADE556621C2DEA146CA63FF643F5 DUP10 DUP10 DUP9 DUP9 DUP9 DUP9 PUSH1 0x40 MLOAD PUSH2 0x25F2 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5A64 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x6D SLOAD PUSH2 0x2605 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC61852C20F0B03B31D782F3022F2BF20322AC17CE66C5349FB6E24740CDD6456 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 DUP1 ISZERO PUSH2 0xCBF JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x265D PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x266E PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2694 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH1 0x75 SLOAD PUSH1 0xFF DUP3 AND LT PUSH2 0x26B8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x53AE JUMP JUMPDEST PUSH1 0x1 DUP3 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND GT ISZERO PUSH2 0x26E0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5028 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2707 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x52D4 JUMP JUMPDEST DUP2 PUSH1 0x75 DUP3 PUSH1 0xFF AND DUP2 SLOAD DUP2 LT PUSH2 0x2718 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 DUP5 MLOAD SWAP3 ADD DUP1 SLOAD SWAP2 DUP6 ADD MLOAD PUSH1 0x40 SWAP1 SWAP6 ADD MLOAD PUSH1 0xFF AND PUSH1 0x1 PUSH1 0xB0 SHL MUL PUSH1 0xFF PUSH1 0xB0 SHL NOT PUSH2 0xFFFF SWAP1 SWAP7 AND PUSH1 0x1 PUSH1 0xA0 SHL MUL PUSH2 0xFFFF PUSH1 0xA0 SHL NOT PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP4 SWAP1 SWAP4 AND SWAP2 SWAP1 SWAP2 OR SWAP4 SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE PUSH2 0x2787 PUSH2 0x34DF JUMP JUMPDEST SWAP1 POP PUSH2 0x3E8 DUP2 GT ISZERO PUSH2 0x27AB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5547 JUMP JUMPDEST DUP3 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC1BF93444A0055A24A7D0154B75FEDF78EDFE355C06A2CE8E47F9F3908720559 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 MLOAD PUSH2 0x1FD0 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5A37 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2820 PUSH2 0x28D4 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x282C PUSH2 0x2D87 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 GT ISZERO PUSH2 0x2841 JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x840 JUMP JUMPDEST PUSH2 0x284B DUP3 DUP3 PUSH2 0x34B7 JUMP JUMPDEST SWAP3 POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2867 PUSH8 0xDE0B6B3A7640000 DUP6 PUSH2 0x3922 JUMP JUMPDEST SWAP1 POP PUSH2 0x2873 DUP2 DUP5 PUSH2 0x395C JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2889 PUSH2 0x399E JUMP JUMPDEST PUSH1 0x6A SLOAD SWAP1 SWAP2 POP PUSH5 0x100000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND ISZERO DUP1 PUSH2 0x28B8 JUMPI POP PUSH1 0x6A SLOAD PUSH5 0x100000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP2 LT JUMPDEST PUSH2 0xD64 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x58A7 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x915 PUSH1 0x6C SLOAD PUSH1 0x6D SLOAD PUSH2 0x2D62 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28F8 DUP4 PUSH2 0x39A2 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x2909 JUMPI POP PUSH2 0x2909 DUP4 DUP4 PUSH2 0x39D5 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 PUSH1 0x0 ADD SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x292E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x2958 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x299B JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST ISZERO PUSH2 0x29E7 JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x29AD JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x20 SWAP2 DUP3 MUL SWAP3 SWAP1 SWAP3 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP1 DUP9 ADD SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP3 SWAP1 SWAP2 ADD SWAP2 AND PUSH2 0x2979 JUMP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2A14 PUSH1 0x6C SLOAD PUSH2 0x2A0E PUSH1 0x6D SLOAD DUP7 PUSH2 0x34B7 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 PUSH2 0x39FB JUMP JUMPDEST SWAP1 POP PUSH2 0x2909 PUSH2 0x2A2E PUSH1 0x6C SLOAD DUP4 PUSH2 0x3922 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x6D SLOAD SWAP1 PUSH2 0x2D62 JUMP JUMPDEST PUSH2 0x2A49 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3A2D JUMP JUMPDEST PUSH2 0x2A65 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x53F4 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x6A3FD4F9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x6A3FD4F9 SWAP1 PUSH2 0x2A95 SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B45 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2AAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2AC1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2AE5 SWAP2 SWAP1 PUSH2 0x47F7 JUMP JUMPDEST PUSH2 0x2B01 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x55EB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x4 DUP2 MSTORE PUSH1 0x24 DUP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0xE0 SHL OR SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x60 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP2 PUSH2 0x2B45 SWAP2 PUSH2 0x4B20 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x2B80 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x2B85 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x2BA7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x531D JUMP JUMPDEST PUSH2 0x2BB2 PUSH1 0x6E DUP5 PUSH2 0x35C2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH32 0xBCD6D991F3416E288BF59A2997B423772937B62C7EA7DD1A54AF7771DE1F7418 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x2C0D JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO ISZERO JUMPDEST PUSH2 0x2C29 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4E74 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 AND SWAP1 DUP3 AND EQ PUSH2 0x2C67 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4E9D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD SWAP6 DUP6 AND DUP4 MSTORE SWAP1 DUP3 KECCAK256 DUP1 SLOAD SWAP6 SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP6 DUP7 AND OR SWAP1 SWAP4 SSTORE MSTORE DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x2CD6 SWAP2 PUSH2 0x447A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH32 0xCD64D9DACD230C5CCF1278EA5332B0621AA28C950FB0E61C8FBC9E2011C88A34 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP2 GT PUSH2 0x2D2D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5474 JUMP JUMPDEST PUSH1 0x76 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0xC44C7222E8DF09744CED394101DF47E78DEDB642D3065267BB388901DE9DF6D4 SWAP1 PUSH2 0xA7D SWAP1 DUP4 SWAP1 PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x2909 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4FA7 JUMP JUMPDEST PUSH1 0x7B SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x132B ADDRESS PUSH2 0x3A2D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2DA2 PUSH2 0x28D4 JUMP JUMPDEST PUSH2 0x2DAA PUSH2 0x2D87 JUMP JUMPDEST LT ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 GT PUSH2 0x2DD1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5070 JUMP JUMPDEST PUSH1 0x6C DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0xD379C1A7282461E725A9DC2D74E65246C77E98AE93835E26C2F1654C48EE4EC SWAP1 PUSH2 0xA7D SWAP1 DUP4 SWAP1 PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xE6D8A94B PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xE6D8A94B SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2E4C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2E60 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2E84 SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST SWAP1 POP PUSH2 0x2E8F DUP2 PUSH2 0x3A33 JUMP JUMPDEST SWAP1 POP PUSH1 0x67 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2EDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2EF3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2F17 SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST PUSH2 0x2F4A JUMPI PUSH1 0x40 MLOAD PUSH32 0x3728FEB3FC1EF1BF4A24036AFBE7D34B59C551BF0D2AB5564E87EC1734FA80DD SWAP1 PUSH1 0x0 SWAP1 LOG1 POP PUSH2 0xD64 JUMP JUMPDEST PUSH1 0x79 SLOAD PUSH1 0x76 SLOAD PUSH1 0xFF SWAP1 SWAP2 AND SWAP1 PUSH1 0x60 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x2F6F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x2F99 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x7A SLOAD SWAP1 SWAP2 POP DUP6 SWAP1 PUSH1 0x0 SWAP1 DUP2 SWAP1 JUMPDEST DUP6 DUP4 LT ISZERO PUSH2 0x3144 JUMPI PUSH1 0x67 SLOAD PUSH1 0x40 MLOAD PUSH4 0x3B304147 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x3B304147 SWAP1 PUSH2 0x2FE1 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2FF9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x300D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3031 SWAP2 SWAP1 PUSH2 0x4573 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x78 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND PUSH2 0x308C JUMPI DUP1 DUP7 DUP6 DUP1 PUSH1 0x1 ADD SWAP7 POP DUP2 MLOAD DUP2 LT PUSH2 0x3067 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP PUSH2 0x3105 JUMP JUMPDEST DUP2 DUP4 PUSH1 0x1 ADD SWAP4 POP DUP4 LT PUSH2 0x3105 JUMPI PUSH32 0xB5F728FCB182000EB8E953C15F6795F07B6CDA75B35EF0B65645B53AAC636945 DUP5 PUSH1 0x40 MLOAD PUSH2 0x30C8 SWAP2 SWAP1 PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP4 PUSH2 0x30FF JUMPI PUSH1 0x40 MLOAD PUSH32 0x3728FEB3FC1EF1BF4A24036AFBE7D34B59C551BF0D2AB5564E87EC1734FA80DD SWAP1 PUSH1 0x0 SWAP1 LOG1 JUMPDEST POP PUSH2 0x3144 JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH2 0x209 MUL DUP7 PUSH2 0x1F3 ADD ADD PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x3122 SWAP2 SWAP1 PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SWAP6 POP PUSH2 0x2FA8 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x3161 DUP6 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x3154 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x3AE0 JUMP JUMPDEST PUSH1 0x0 DUP8 PUSH2 0x3177 JUMPI PUSH2 0x3172 DUP10 DUP6 PUSH2 0x39FB JUMP JUMPDEST PUSH2 0x3181 JUMP JUMPDEST PUSH2 0x3181 DUP10 DUP9 PUSH2 0x39FB JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x31BB JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x31B9 JUMPI PUSH2 0x31B1 DUP8 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x31A3 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP4 PUSH2 0x3C50 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x318C JUMP JUMPDEST POP JUMPDEST PUSH1 0x77 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x336A JUMPI PUSH1 0x0 PUSH2 0x31D2 PUSH1 0x6E PUSH2 0x3CBD JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x3208 JUMPI POP PUSH2 0x31F2 PUSH1 0x6E PUSH2 0x3CDA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x3364 JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP3 PUSH4 0x70A08231 SWAP3 PUSH2 0x3240 SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4B45 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3258 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x326C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3290 SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP11 PUSH2 0x32A8 JUMPI PUSH2 0x32A3 DUP3 DUP9 PUSH2 0x39FB JUMP JUMPDEST PUSH2 0x32B2 JUMP JUMPDEST PUSH2 0x32B2 DUP3 DUP12 PUSH2 0x39FB JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x3350 JUMPI PUSH1 0x0 JUMPDEST DUP8 DUP2 LT ISZERO PUSH2 0x334E JUMPI PUSH1 0x66 SLOAD DUP11 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x2B0AB144 SWAP1 DUP13 SWAP1 DUP5 SWAP1 DUP2 LT PUSH2 0x32E8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP7 DUP6 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3310 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4BDA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x332A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x333E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0x32BD SWAP1 POP JUMP JUMPDEST POP JUMPDEST PUSH2 0x335B PUSH1 0x6E DUP5 PUSH2 0x3CE0 JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x31D5 JUMP JUMPDEST POP PUSH2 0x3387 JUMP JUMPDEST PUSH2 0x3387 DUP7 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x337A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x3D03 JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 ISZERO DUP1 PUSH2 0x341B JUMPI POP PUSH1 0x40 MLOAD PUSH4 0x6EB1769F PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH4 0xDD62ED3E SWAP1 PUSH2 0x33C9 SWAP1 ADDRESS SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B59 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x33E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x33F5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3419 SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST ISZERO JUMPDEST PUSH2 0x3437 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x580B JUMP JUMPDEST PUSH2 0xFBE DUP4 PUSH4 0x95EA7B3 PUSH1 0xE0 SHL DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x3456 SWAP3 SWAP2 SWAP1 PUSH2 0x4C29 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE PUSH2 0x3E4F JUMP JUMPDEST PUSH1 0x0 PUSH5 0x100000000 DUP3 LT PUSH2 0x34B3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x565D JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x34D9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x514F JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x75 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP2 JUMPDEST DUP2 DUP2 PUSH1 0xFF AND LT ISZERO PUSH2 0x3569 JUMPI PUSH2 0x34FC PUSH2 0x445A JUMP JUMPDEST PUSH1 0x75 DUP3 PUSH1 0xFF AND DUP2 SLOAD DUP2 LT PUSH2 0x350C JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP3 ADD MSTORE SWAP2 POP PUSH2 0x355E SWAP1 DUP6 SWAP1 PUSH2 0x2D62 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x1 ADD PUSH2 0x34E9 JUMP JUMPDEST POP SWAP1 SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x3595 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x2909 JUMPI POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD AND ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x35E4 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO ISZERO JUMPDEST PUSH2 0x3600 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4E74 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x363A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5636 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE DUP4 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP6 DUP7 AND DUP1 DUP6 MSTORE SWAP3 DUP5 KECCAK256 DUP1 SLOAD SWAP7 SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP7 DUP8 AND OR SWAP1 SSTORE SWAP2 DUP4 SWAP1 MSTORE DUP2 SLOAD SWAP1 SWAP4 AND SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x31A9108F PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND SWAP2 DUP5 AND SWAP1 PUSH4 0x6352211E SWAP1 PUSH2 0x36BD SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x36D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x36E9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x370D SWAP2 SWAP1 PUSH2 0x4573 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x3733 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x59C3 JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 LT ISZERO PUSH2 0x37AE JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP4 SWAP2 SWAP1 DUP4 SWAP1 DUP2 LT PUSH2 0x377D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD EQ ISZERO PUSH2 0x37A6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5861 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x3736 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE SWAP1 DUP4 MSTORE SWAP2 KECCAK256 ADD SSTORE JUMP JUMPDEST PUSH1 0x3C DUP2 PUSH4 0xFFFFFFFF AND GT PUSH2 0x3801 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5930 JUMP JUMPDEST PUSH1 0x6B DUP1 SLOAD PUSH4 0xFFFFFFFF NOT AND PUSH4 0xFFFFFFFF DUP4 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x4F27F6F220FFAD585E728389BC2F0F6B74EEEBEB43F95F53752A647CB6E7E687 SWAP3 PUSH2 0xA7D SWAP3 AND SWAP1 PUSH2 0x5AE0 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3865 JUMPI POP PUSH2 0x3865 PUSH2 0x2D8D JUMP JUMPDEST DUP1 PUSH2 0x3873 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x388F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5360 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x38BA JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x38C2 PUSH2 0x3EDE JUMP JUMPDEST PUSH2 0x38CA PUSH2 0x3F5F JUMP JUMPDEST DUP1 ISZERO PUSH2 0xD64 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST DUP1 SLOAD ISZERO PUSH2 0x38FD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5521 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP2 DUP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3931 JUMPI POP PUSH1 0x0 PUSH2 0x7E3 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x393E JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x2909 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54AB JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2909 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x4039 JUMP JUMPDEST NUMBER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x39B5 DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x39D5 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x7E3 JUMPI POP PUSH2 0x39CE DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x39D5 JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x39E4 DUP6 DUP6 PUSH2 0x4070 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x39F2 JUMPI POP DUP1 JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x3A1C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5257 JUMP JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x3A25 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x75 SLOAD PUSH1 0x0 SWAP1 DUP3 SWAP1 DUP3 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x3AD7 JUMPI PUSH2 0x3A4D PUSH2 0x445A JUMP JUMPDEST PUSH1 0x75 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x3A5A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP4 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP5 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP3 DUP5 ADD DUP4 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP4 ADD MSTORE SWAP1 SWAP3 POP PUSH2 0x3AAC SWAP1 DUP7 SWAP1 PUSH2 0x4165 JUMP JUMPDEST SWAP1 POP PUSH2 0x3AC1 DUP3 PUSH1 0x0 ADD MLOAD DUP3 DUP5 PUSH1 0x40 ADD MLOAD PUSH2 0x4179 JUMP JUMPDEST PUSH2 0x3ACB DUP8 DUP3 PUSH2 0x34B7 JUMP JUMPDEST SWAP7 POP POP POP PUSH1 0x1 ADD PUSH2 0x3A3D JUMP JUMPDEST POP SWAP3 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3AEC PUSH1 0x70 PUSH2 0x3CBD JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x3B22 JUMPI POP PUSH2 0x3B0C PUSH1 0x70 PUSH2 0x3CDA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x3C46 JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP3 PUSH4 0x70A08231 SWAP3 PUSH2 0x3B5A SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4B45 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3B72 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3B86 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3BAA SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x3C33 JUMPI PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SWAP1 MLOAD PUSH4 0x16960D55 PUSH1 0xE0 SHL DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x16960D55 SWAP2 PUSH2 0x3BF8 SWAP2 DUP8 SWAP2 DUP8 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B73 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3C12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3C26 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x3C33 DUP3 PUSH2 0x2CB5 JUMP JUMPDEST PUSH2 0x3C3E PUSH1 0x70 DUP4 PUSH2 0x3CE0 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3AEF JUMP JUMPDEST PUSH2 0x101F PUSH1 0x70 PUSH2 0x4184 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x67 SLOAD PUSH1 0x40 MLOAD PUSH4 0x358DC31D PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 PUSH4 0x6B1B863A SWAP3 PUSH2 0x3C87 SWAP3 DUP8 SWAP3 DUP8 SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4C42 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3CA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3CB5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3D0F PUSH1 0x6E PUSH2 0x3CBD JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x3D45 JUMPI POP PUSH2 0x3D2F PUSH1 0x6E PUSH2 0x3CDA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x101F JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP3 PUSH4 0x70A08231 SWAP3 PUSH2 0x3D7D SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4B45 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3D95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3DA9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3DCD SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x3E3C JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0xAC2AC51 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x2B0AB144 SWAP1 PUSH2 0x3E09 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4BDA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3E23 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3E37 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x3E47 PUSH1 0x6E DUP4 PUSH2 0x3CE0 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3D12 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x3EA4 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x4220 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xFBE JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x3EC2 SWAP2 SWAP1 PUSH2 0x47F7 JUMP JUMPDEST PUSH2 0xFBE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x576E JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3EF7 JUMPI POP PUSH2 0x3EF7 PUSH2 0x2D8D JUMP JUMPDEST DUP1 PUSH2 0x3F05 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3F21 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5360 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x38CA JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xD64 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3F78 JUMPI POP PUSH2 0x3F78 PUSH2 0x2D8D JUMP JUMPDEST DUP1 PUSH2 0x3F86 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3FA2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5360 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3FCD JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x3FD7 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0xD64 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x405A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP2 SWAP1 PUSH2 0x4DB1 JUMP JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x4066 JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x408E SWAP2 SWAP1 PUSH2 0x4D9C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x7530 DUP5 PUSH1 0x40 MLOAD PUSH2 0x40E2 SWAP2 SWAP1 PUSH2 0x4B20 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x411E JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4123 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x4141 JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x415E JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x4156 SWAP2 SWAP1 PUSH2 0x47F7 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2909 PUSH2 0xFFFF DUP4 AND DUP5 MUL PUSH2 0x3E8 PUSH2 0x39FB JUMP JUMPDEST PUSH2 0xFBE DUP4 DUP4 DUP4 PUSH2 0x422F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP1 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x41C2 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST ISZERO PUSH2 0x41F8 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP4 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP2 AND SWAP1 SWAP2 SSTORE AND PUSH2 0x41A0 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE DUP3 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x60 PUSH2 0x2873 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x4360 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4EB1C245 PUSH1 0xE1 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x9D63848A SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4274 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x4288 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x42B0 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x468D JUMP JUMPDEST SWAP1 POP DUP1 MLOAD DUP3 PUSH1 0xFF AND GT ISZERO PUSH2 0x42D6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x56DA JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH1 0xFF AND DUP2 MLOAD DUP2 LT PUSH2 0x42E7 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x358DC31D PUSH1 0xE1 SHL DUP2 MSTORE SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x6B1B863A SWAP1 PUSH2 0x4327 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4C42 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4341 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x4355 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x4382 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x51CF JUMP JUMPDEST PUSH2 0x438B DUP6 PUSH2 0x3A2D JUMP JUMPDEST PUSH2 0x43A7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x56A3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD PUSH2 0x43C4 SWAP2 SWAP1 PUSH2 0x4B20 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x4401 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4406 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x4416 DUP3 DUP3 DUP7 PUSH2 0x4421 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x4430 JUMPI POP DUP2 PUSH2 0x2909 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x4440 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST DUP2 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP2 SWAP1 PUSH2 0x4DB1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST POP DUP1 SLOAD PUSH1 0x0 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0xD64 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x34B3 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x4494 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x44B9 JUMPI DUP1 DUP2 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x44D0 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x415E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x44FB JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x4505 PUSH1 0x60 PUSH2 0x5AF1 JUMP JUMPDEST SWAP1 POP DUP2 CALLDATALOAD PUSH2 0x4512 DUP2 PUSH2 0x5B64 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH2 0xFFFF DUP2 AND DUP2 EQ PUSH2 0x4529 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x453B DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x4546 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x7E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4568 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2909 DUP2 PUSH2 0x5B64 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4584 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x2909 DUP2 PUSH2 0x5B64 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x45A4 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x45AF DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x45BF DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x45D6 DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x45F3 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x45FE DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x460E DUP2 PUSH2 0x5B79 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x462B JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x4636 DUP2 PUSH2 0x5B64 JUMP JUMPDEST PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD MLOAD SWAP3 SWAP5 SWAP3 SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x465B JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x4666 DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x467D DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x45D6 DUP2 PUSH2 0x5B64 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x469F JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x46B5 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x46C5 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 MLOAD PUSH2 0x46D8 PUSH2 0x46D3 DUP3 PUSH2 0x5B18 JUMP JUMPDEST PUSH2 0x5AF1 JUMP JUMPDEST DUP2 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP4 DUP6 ADD DUP6 DUP5 MUL DUP6 ADD DUP7 ADD DUP10 LT ISZERO PUSH2 0x46F4 JUMPI DUP7 DUP8 REVERT JUMPDEST DUP7 SWAP5 POP JUMPDEST DUP4 DUP6 LT ISZERO PUSH2 0x471F JUMPI DUP1 MLOAD PUSH2 0x470B DUP2 PUSH2 0x5B64 JUMP JUMPDEST DUP4 MSTORE PUSH1 0x1 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP2 DUP6 ADD SWAP2 DUP6 ADD PUSH2 0x46F8 JUMP JUMPDEST POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x473D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4753 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x475F DUP6 DUP3 DUP7 ADD PUSH2 0x44A8 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x477D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4794 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x47A7 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x47B5 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 PUSH1 0x60 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x47C9 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x47EC JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2909 DUP2 PUSH2 0x5B79 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4808 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x2909 DUP2 PUSH2 0x5B79 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4824 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND DUP2 EQ PUSH2 0x2909 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x484D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x4858 DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x460E DUP2 PUSH2 0x5B64 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x487C JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x4887 DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x48A2 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x48AE DUP7 DUP3 DUP8 ADD PUSH2 0x44A8 JUMP JUMPDEST SWAP5 SWAP8 SWAP1 SWAP7 POP SWAP4 SWAP5 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x48CC JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x2909 DUP4 DUP4 PUSH2 0x44EA JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x80 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x48E8 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x48F2 DUP5 DUP5 PUSH2 0x44EA JUMP JUMPDEST SWAP2 POP PUSH2 0x4901 DUP5 PUSH1 0x60 DUP6 ADD PUSH2 0x4546 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x491B JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4933 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x4954 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP8 CALLDATALOAD SWAP7 POP PUSH1 0x20 DUP1 DUP10 ADD CALLDATALOAD SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x496E DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD PUSH2 0x497E DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH2 0x498E DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP4 POP PUSH1 0xA0 DUP10 ADD CALLDATALOAD PUSH2 0x499E DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP3 POP PUSH1 0xC0 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x49B9 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP10 ADD PUSH1 0x1F DUP2 ADD DUP12 SGT PUSH2 0x49C9 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x49D7 PUSH2 0x46D3 DUP3 PUSH2 0x5B18 JUMP JUMPDEST DUP2 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP4 DUP6 ADD DUP6 DUP5 MUL DUP6 ADD DUP7 ADD DUP16 LT ISZERO PUSH2 0x49F3 JUMPI DUP7 DUP8 REVERT JUMPDEST DUP7 SWAP5 POP JUMPDEST DUP4 DUP6 LT ISZERO PUSH2 0x4A1E JUMPI DUP1 CALLDATALOAD PUSH2 0x4A0A DUP2 PUSH2 0x5B64 JUMP JUMPDEST DUP4 MSTORE PUSH1 0x1 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP2 DUP6 ADD SWAP2 DUP6 ADD PUSH2 0x49F7 JUMP JUMPDEST POP DUP1 SWAP6 POP POP POP POP POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x4A4D JUMPI DUP1 DUP2 REVERT JUMPDEST DUP8 CALLDATALOAD SWAP7 POP PUSH1 0x20 DUP9 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH2 0x4A66 DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP5 POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH2 0x4A76 DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP4 POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH2 0x4A86 DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP3 POP PUSH1 0xA0 DUP9 ADD CALLDATALOAD PUSH2 0x4A96 DUP2 PUSH2 0x5B64 JUMP JUMPDEST DUP1 SWAP3 POP POP PUSH1 0xC0 DUP9 ADD CALLDATALOAD SWAP1 POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4ABE JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2909 DUP2 PUSH2 0x5B87 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4ADB JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x4AE6 DUP2 PUSH2 0x5B87 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH2 0x460E DUP2 PUSH2 0x5B87 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH2 0xFFFF AND SWAP1 DUP4 ADD MSTORE PUSH1 0x40 SWAP1 DUP2 ADD MLOAD PUSH1 0xFF AND SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x4B32 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x5B38 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND DUP3 MSTORE DUP4 AND PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 PUSH1 0x40 DUP4 ADD DUP2 SWAP1 MSTORE DUP4 SLOAD SWAP1 DUP4 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 DUP5 DUP2 MSTORE DUP3 DUP2 KECCAK256 SWAP1 SWAP3 SWAP1 SWAP2 PUSH1 0x80 DUP6 ADD SWAP2 SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4BCC JUMPI DUP5 SLOAD DUP5 MSTORE PUSH1 0x1 SWAP5 DUP6 ADD SWAP5 SWAP4 DUP4 ADD SWAP4 ADD PUSH2 0x4BB0 JUMP JUMPDEST POP SWAP2 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND DUP2 MSTORE SWAP3 DUP5 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 SWAP2 AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE SWAP1 DUP4 AND PUSH1 0x40 DUP4 ADD MSTORE SWAP1 SWAP2 AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4CD1 JUMPI DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x4CAC JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4CD1 JUMPI PUSH2 0x4D0C DUP4 DUP6 MLOAD PUSH2 0x4AF7 JUMP JUMPDEST SWAP3 DUP5 ADD SWAP3 PUSH1 0x60 SWAP3 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x4CF9 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xFB SHL SUB DUP4 GT ISZERO PUSH2 0x4D3E JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH1 0x20 DUP4 MUL DUP1 DUP6 PUSH1 0x40 DUP6 ADD CALLDATACOPY SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP1 DUP2 MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4CD1 JUMPI DUP4 MLOAD DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x4D75 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x4DD0 DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x5B38 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x24 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6572633732312D696E76 PUSH1 0x40 DUP3 ADD MSTORE PUSH4 0x185B1A59 PUSH1 0xE2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2C SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F746F6B656E2D6C697374 PUSH1 0x40 DUP3 ADD MSTORE PUSH12 0x195B995C8B5A5B9D985B1A59 PUSH1 0xA2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xF SWAP1 DUP3 ADD MSTORE PUSH15 0x496E76616C69642061646472657373 PUSH1 0x88 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x13 SWAP1 DUP3 ADD MSTORE PUSH19 0x496E76616C6964207072657641646472657373 PUSH1 0x68 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2B SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A652D70657269 PUSH1 0x40 DUP3 ADD MSTORE PUSH11 0x37B216B737BA16B7BB32B9 PUSH1 0xA9 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x646472657373 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2C SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6F6E6C792D6F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH12 0x16B7B916B634B9BA32B732B9 PUSH1 0xA1 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2A SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F73706F6E736F72736869 PUSH1 0x40 DUP3 ADD MSTORE PUSH10 0x702D6E6F742D7A65726F PUSH1 0xB0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x28 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH8 0x34BA16BA37B5B2B7 PUSH1 0xC1 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x34 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A652D70657269 PUSH1 0x40 DUP3 ADD MSTORE PUSH20 0x6F642D677265617465722D7468616E2D7A65726F PUSH1 0x60 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6F6E6C792D7072697A65 PUSH1 0x40 DUP3 ADD MSTORE PUSH5 0xB5C1BDBDB PUSH1 0xDA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7472616E736665722D74 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x3796B9B2B633 PUSH1 0xD1 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1E SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x29 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A652D706F6F6C PUSH1 0x40 DUP3 ADD MSTORE PUSH9 0x2D6E6F742D7A65726F PUSH1 0xB8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x416464726573733A20696E73756666696369656E742062616C616E636520666F PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x1C8818D85B1B PUSH1 0xD2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x22 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D7A65 PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x726F PUSH1 0xF0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1A SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D636F PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x6D706C657465 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x29 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH9 0x1A5D0B5D185C99D95D PUSH1 0xBA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x23 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F65726332302D696E7661 PUSH1 0x40 DUP3 ADD MSTORE PUSH3 0x1B1A59 PUSH1 0xEA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2E SWAP1 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x40 DUP3 ADD MSTORE PUSH14 0x191E481A5B9A5D1A585B1A5E9959 PUSH1 0x92 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F6E6F6E6578697374656E742D7072697A PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x195CDC1B1A5D PUSH1 0xD2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F65726332302D6E756C6C PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2B SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D616C72656164 PUSH1 0x40 DUP3 ADD MSTORE PUSH11 0x1E4B5C995C5D595CDD1959 PUSH1 0xAA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1F SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F77696E6E6572732D6774652D6F6E6500 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x21 SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206D756C7469706C69636174696F6E206F766572666C6F PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x77 PUSH1 0xF8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xC SWAP1 DUP3 ADD MSTORE PUSH12 0x105B1C9958591E481A5B9A5D PUSH1 0xA2 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x33 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH19 0x1A5D0B5C195C98D95B9D1859D94B5D1BDD185B PUSH1 0x6A SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x31 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6265666F726541776172 PUSH1 0x40 DUP3 ADD MSTORE PUSH17 0x19131A5CDD195B995C8B5A5B9D985B1A59 PUSH1 0x7A SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2B SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F63616E6E6F742D617761 PUSH1 0x40 DUP3 ADD MSTORE PUSH11 0x1C990B595E1D195C9B985B PUSH1 0xAA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xD SWAP1 DUP3 ADD MSTORE PUSH13 0x105B1C9958591E481859191959 PUSH1 0x9A SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x53616665436173743A2076616C756520646F65736E27742066697420696E2033 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x322062697473 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2F SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F61776172642D696E7661 PUSH1 0x40 DUP3 ADD MSTORE PUSH15 0xD8D2C85AE8DED6CADC5AD2DCC8CAF PUSH1 0x8B SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7469636B65742D6E6F74 PUSH1 0x40 DUP3 ADD MSTORE PUSH5 0x2D7A65726F PUSH1 0xD8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2A SWAP1 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A204552433230206F7065726174696F6E20646964206E PUSH1 0x40 DUP3 ADD MSTORE PUSH10 0x1BDD081CDD58D8D95959 PUSH1 0xB2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x33 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A655374726174 PUSH1 0x40 DUP3 ADD MSTORE PUSH19 0x1959DE531A5CDD195B995C8B5A5B9D985B1A59 PUSH1 0x6A SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x36 SWAP1 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A20617070726F76652066726F6D206E6F6E2D7A65726F PUSH1 0x40 DUP3 ADD MSTORE PUSH22 0x20746F206E6F6E2D7A65726F20616C6C6F77616E6365 PUSH1 0x50 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6572633732312D647570 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x6C6963617465 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x23 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D696E2D666C69 PUSH1 0x40 DUP3 ADD MSTORE PUSH3 0x19DA1D PUSH1 0xEA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D7469 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x1B59591BDD5D PUSH1 0xD2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2C SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D74696D656F75 PUSH1 0x40 DUP3 ADD MSTORE PUSH12 0x742D67742D36302D73656373 PUSH1 0xA0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x27 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D7265 PUSH1 0x40 DUP3 ADD MSTORE PUSH7 0x1C5D595CDD1959 PUSH1 0xCA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x27 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F756E617661696C61626C PUSH1 0x40 DUP3 ADD MSTORE PUSH7 0x3296BA37B5B2B7 PUSH1 0xC9 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x7E3 DUP3 DUP5 PUSH2 0x4AF7 JUMP JUMPDEST PUSH2 0xFFFF SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0xFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH2 0xFFFF SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0xFF SWAP2 DUP3 AND PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP7 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP8 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x40 DUP5 ADD MSTORE DUP6 DUP2 AND PUSH1 0x60 DUP5 ADD MSTORE DUP5 DUP2 AND PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0xC0 PUSH1 0xA0 DUP5 ADD DUP2 SWAP1 MSTORE DUP5 MLOAD SWAP1 DUP5 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP3 DUP6 DUP2 ADD SWAP3 SWAP1 SWAP2 PUSH1 0xE0 DUP7 ADD SWAP1 DUP6 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x5ACE JUMPI DUP6 MLOAD DUP5 AND DUP4 MSTORE SWAP5 DUP5 ADD SWAP5 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x5AB0 JUMP JUMPDEST POP SWAP1 SWAP13 SWAP12 POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5B10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x5B2E JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5B53 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x5B3B JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xCC4 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xD64 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xD64 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xD64 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SIGNEXTEND DIV LOG0 CALLVALUE REVERT 0xC9 0xB6 SUB NUMBER 0x4F CALLCODE 0xE1 0x4B 0xBF SWAP14 0xF8 0x27 DUP6 BYTE PUSH31 0xC270AD4D35335F3752EDEB5F64736F6C634300060C00330000000000000000 ",
              "sourceMap": "259:371:71:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7667:227:50;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;191:249:95;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4550:55:50:-;;;:::i;:::-;;;;;;;:::i;835:34:55:-;;;:::i;18960:89:50:-;;;:::i;3846:221:55:-;;;;;;:::i;:::-;;:::i;346:92:71:-;;;;;;:::i;:::-;;:::i;:::-;;19655:93:50;;;:::i;:::-;;;;;;;:::i;12004:158::-;;;:::i;16435:488::-;;;;;;:::i;:::-;;:::i;5490:242:55:-;;;;;;:::i;:::-;;:::i;24282:124:50:-;;;:::i;:::-;;;;;;;:::i;18167:161::-;;;;;;:::i;:::-;;:::i;19202:107::-;;;:::i;14908:330::-;;;:::i;13261:385::-;;;;;;:::i;:::-;;:::i;22329:169::-;;;;;;:::i;:::-;;:::i;3759:36::-;;;:::i;4995:207:55:-;;;;;;:::i;:::-;;:::i;6934:401:50:-;;;;;;:::i;:::-;;:::i;21913:122::-;;;:::i;23082:253::-;;;;;;:::i;:::-;;:::i;26849:333::-;;;;;;:::i;:::-;;:::i;18705:111::-;;;:::i;3623:43::-;;;:::i;19465:100::-;;;:::i;3726:29::-;;;:::i;5904:125:55:-;;;;;;:::i;:::-;;:::i;709:30::-;;;:::i;1967:145:0:-;;;:::i;3696:26:50:-;;;:::i;4127:35::-;;;:::i;27625:221::-;;;:::i;2979:559:55:-;;;;;;:::i;:::-;;:::i;19896:232:50:-;;;;;;:::i;:::-;;:::i;18458:113::-;;;:::i;21170:159::-;;;;;;:::i;:::-;;:::i;17087:601::-;;;;;;:::i;:::-;;:::i;6614:94:55:-;;;:::i;2617:103:54:-;;;:::i;:::-;;;;;;;:::i;1335:85:0:-;;;:::i;551:45:55:-;;;;;;:::i;:::-;;:::i;540:87:71:-;;;;;;:::i;:::-;;:::i;4090:33:50:-;;;:::i;24574:174::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;8699:96::-;;;:::i;403:36:55:-;;;:::i;4469:193::-;;;;;;:::i;:::-;;:::i;4036:31:50:-;;;:::i;23818:296::-;;;;;;:::i;:::-;;:::i;12695:420::-;;;;;;:::i;:::-;;:::i;14279:539::-;;;:::i;3456:1572:54:-;;;;;;:::i;:::-;;:::i;4677:75:50:-;;;:::i;6692:96::-;;;:::i;25173:727::-;;;;;;:::i;:::-;;:::i;20373:154::-;;;;;;:::i;:::-;;:::i;315:26:71:-;;;:::i;8062:119:50:-;;;:::i;3799:23::-;;;:::i;15374:792::-;;;:::i;2984:140:54:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2261:240:0:-;;;;;;:::i;:::-;;:::i;5142:1380:50:-;;;;;;:::i;:::-;;:::i;5375:862:54:-;;;;;;:::i;:::-;;:::i;3561:40:50:-;;;:::i;:::-;;;;;;;:::i;7667:227::-;7761:7;7783:106;7822:30;:28;:30::i;:::-;7860:23;7783:31;:106::i;:::-;7776:113;7667:227;-1:-1:-1;;7667:227:50:o;191:249:95:-;270:4;-1:-1:-1;;;;;;;;;297:51:95;;;;:132;;-1:-1:-1;;;;;;;;359:70:95;-1:-1:-1;;;;;;359:70:95;;191:249::o;4550:55:50:-;;;-1:-1:-1;;;;;4550:55:50;;:::o;835:34:55:-;;;;:::o;18960:89:50:-;19026:10;:13;;;:18;;18960:89;;:::o;3846:221:55:-;3956:4;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;;;;;;;;;28168:28:50::1;:26;:28::i;:::-;-1:-1:-1::0;;;;;3968:20:55;::::2;;::::0;;;:13:::2;:20;::::0;;;;;;:33;;-1:-1:-1;;3968:33:55::2;::::0;::::2;;;::::0;;4013:31;::::2;::::0;::::2;::::0;3968:33;;4013:31:::2;:::i;:::-;;;;;;;;-1:-1:-1::0;4058:4:55::2;3846:221:::0;;;;:::o;346:92:71:-;407:11;:26;346:92::o;19655:93:50:-;19730:10;:13;;;19655:93;:::o;12004:158::-;12055:7;12138:19;:17;:19::i;:::-;12131:26;;12004:158;:::o;16435:488::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;-1:-1:-1::0;;;;;16584:43:50;::::2;::::0;;:164:::2;;-1:-1:-1::0;16631:117:50::2;-1:-1:-1::0;;;;;16631:47:50;::::2;-1:-1:-1::0;;;16631:47:50::2;:117::i;:::-;16569:244;;;::::0;-1:-1:-1;;;16569:244:50;;::::2;::::0;::::2;;;:::i;:::-;16820:19;:42:::0;;-1:-1:-1;;;;;;16820:42:50::2;-1:-1:-1::0;;;;;16820:42:50;::::2;::::0;;::::2;::::0;;;16874:44:::2;::::0;::::2;::::0;-1:-1:-1;;16874:44:50::2;16435:488:::0;:::o;5490:242:55:-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;5610:24:55::2;:52:::0;;-1:-1:-1;;5610:52:55::2;::::0;::::2;;;::::0;;;;5674:53:::2;::::0;::::2;::::0;::::2;::::0;5610:52:::2;5702:24:::0;;::::2;::::0;5674:53:::2;:::i;:::-;;;;;;;;5490:242:::0;:::o;24282:124:50:-;24340:16;24371:30;:15;:28;:30::i;18167:161::-;18254:7;18276:47;18311:11;18276:34;:47::i;19202:107::-;19268:3;;19290:10;:13;19268:36;;-1:-1:-1;;;19268:36:50;;19249:4;;-1:-1:-1;;;;;19268:3:50;;:21;;:36;;19290:13;;;19268:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14908:330::-;14952:15;:13;:15::i;:::-;14944:66;;;;-1:-1:-1;;;14944:66:50;;;;;;;:::i;:::-;15035:10;:13;;-1:-1:-1;;15099:17:50;;;;;15127:18;;15035:13;;;;;15073:20;;;;;15127:18;;-1:-1:-1;;15127:18:50;15200:9;;15156:77;;;;;;-1:-1:-1;;;;;15200:9:50;;15180:10;;15156:77;;;;15223:9;;15156:77;:::i;:::-;;;;;;;;14908:330;;:::o;13261:385::-;28682:9;;-1:-1:-1;;;;;28682:9:50;28658:12;:10;:12::i;:::-;-1:-1:-1;;;;;28658:34:50;;28650:84;;;;-1:-1:-1;;;28650:84:50;;;;;;;:::i;:::-;13460:6:::1;::::0;-1:-1:-1;;;;;13433:34:50;;::::1;13460:6:::0;::::1;13433:34;13429:83;;;13477:28;:26;:28::i;:::-;13529:13;::::0;-1:-1:-1;;;;;13529:13:50::1;13521:36:::0;13517:125:::1;;13567:13;::::0;:68:::1;::::0;-1:-1:-1;;;13567:68:50;;-1:-1:-1;;;;;13567:13:50;;::::1;::::0;:29:::1;::::0;:68:::1;::::0;13597:2;;13601:6;;13609:15;;13626:8;;13567:68:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;13517:125;13261:385:::0;;;;:::o;22329:169::-;27911:7;:5;:7::i;:::-;-1:-1:-1;;;;;27895:23:50;:12;:10;:12::i;:::-;-1:-1:-1;;;;;27895:23:50;;;:93;;-1:-1:-1;27958:29:50;;-1:-1:-1;;;;;27958:29:50;27934:12;:10;:12::i;:::-;-1:-1:-1;;;;;27934:54:50;;27895:93;:153;;;-1:-1:-1;28028:19:50;;-1:-1:-1;;;;;28028:19:50;28004:12;:10;:12::i;:::-;-1:-1:-1;;;;;28004:44:50;;27895:153;27887:222;;;;-1:-1:-1;;;27887:222:50;;;;;;;:::i;:::-;28168:28:::1;:26;:28::i;:::-;22455:38:::2;22478:14;22455:22;:38::i;:::-;22329:169:::0;:::o;3759:36::-;;;-1:-1:-1;;;;;3759:36:50;;:::o;4995:207:55:-;5097:4;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;5109:19:55::2;:28:::0;;;5149:30:::2;::::0;::::2;::::0;::::2;::::0;5131:6;;5149:30:::2;:::i;:::-;;;;;;;;-1:-1:-1::0;5193:4:55::2;4995:207:::0;;;:::o;6934:401:50:-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;-1:-1:-1::0;;;;;7058:37:50;::::2;::::0;;:139:::2;;-1:-1:-1::0;7099:98:50::2;-1:-1:-1::0;;;;;7099:41:50;::::2;-1:-1:-1::0;;;;;;7099:41:50::2;:98::i;:::-;7050:196;;;::::0;-1:-1:-1;;;7050:196:50;;::::2;::::0;::::2;;;:::i;:::-;7253:13;:30:::0;;-1:-1:-1;;;;;;7253:30:50::2;-1:-1:-1::0;;;;;7253:30:50;;::::2;::::0;;;::::2;::::0;;;;7295:35:::2;::::0;7316:13;::::2;::::0;7295:35:::2;::::0;-1:-1:-1;;7295:35:50::2;6934:401:::0;:::o;21913:122::-;21970:16;22001:29;:14;:27;:29::i;23082:253::-;27911:7;:5;:7::i;:::-;-1:-1:-1;;;;;27895:23:50;:12;:10;:12::i;:::-;-1:-1:-1;;;;;27895:23:50;;;:93;;-1:-1:-1;27958:29:50;;-1:-1:-1;;;;;27958:29:50;27934:12;:10;:12::i;:::-;-1:-1:-1;;;;;27934:54:50;;27895:93;:153;;;-1:-1:-1;28028:19:50;;-1:-1:-1;;;;;28028:19:50;28004:12;:10;:12::i;:::-;-1:-1:-1;;;;;28004:44:50;;27895:153;27887:222;;;;-1:-1:-1;;;27887:222:50;;;;;;;:::i;:::-;28168:28:::1;:26;:28::i;:::-;23226:9:::2;23221:110;23241:26:::0;;::::2;23221:110;;;23282:42;23305:15;;23321:1;23305:18;;;;;;;;;;;;;;;;;;;;:::i;:::-;23282:22;:42::i;:::-;23269:3;;23221:110;;;;23082:253:::0;;:::o;26849:333::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;27037:85:::2;:15;27075:19:::0;27105:15;27037:29:::2;:85::i;:::-;27128:49;27161:15;27128:32;:49::i;:::-;26849:333:::0;;:::o;18705:111::-;18756:4;18775:16;:14;:16::i;:::-;:36;;;;;18795:16;:14;:16::i;3623:43::-;;;-1:-1:-1;;;;;3623:43:50;;:::o;19465:100::-;19540:10;:20;;;;;;;19465:100::o;3726:29::-;;;-1:-1:-1;;;;;3726:29:50;;:::o;5904:125:55:-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;5998:26:55::2;6018:5;5998:19;:26::i;709:30::-:0;;;;;;:::o;1967:145:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;2057:6:::1;::::0;2036:40:::1;::::0;2073:1:::1;::::0;-1:-1:-1;;;;;2057:6:0::1;::::0;2036:40:::1;::::0;2073:1;;2036:40:::1;2086:6;:19:::0;;-1:-1:-1;;;;;;2086:19:0::1;::::0;;1967:145::o;3696:26:50:-;;;-1:-1:-1;;;;;3696:26:50;;:::o;4127:35::-;;;;:::o;27625:221::-;27687:10;:22;27671:4;;-1:-1:-1;;;27687:22:50;;;;27683:159;;-1:-1:-1;27731:5:50;27724:12;;27683:159;27812:10;:22;27789:17;;27781:54;;27812:22;27789:17;;;;-1:-1:-1;;;27812:22:50;;;;;;27781:30;:54;:::i;:::-;27764:14;:12;:14::i;:::-;:71;27757:78;;;;2979:559:55;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;:::i;:::-;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;3252:47:55::1;3306:183;3346:17;3371:19;3398:10;3416:7;3431:12;3451:4;3463:20;3306:32;:183::i;:::-;3496:37;3516:16;3496:19;:37::i;:::-;1778:1:9;1794:14:::0;1790:66;;;-1:-1:-1;;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;-1:-1:-1;;;;;;2979:559:55:o;19896:232:50:-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;20004:16:::2;:14;:16::i;:::-;20003:17;19995:65;;;::::0;-1:-1:-1;;;19995:65:50;;::::2;::::0;::::2;;;:::i;:::-;20067:3;:16:::0;;-1:-1:-1;;;;;;20067:16:50::2;-1:-1:-1::0;;;;;20067:16:50;::::2;::::0;;::::2;::::0;;;20094:29:::2;::::0;::::2;::::0;-1:-1:-1;;20094:29:50::2;19896:232:::0;:::o;18458:113::-;18506:4;18525:20;:18;:20::i;:::-;:41;;;;;18550:16;:14;:16::i;:::-;18549:17;18518:48;;18458:113;:::o;21170:159::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;21281:43:::2;21304:19;21281:22;:43::i;17087:601::-:0;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;-1:-1:-1::0;;;;;17266:53:50;::::2;::::0;;:205:::2;;-1:-1:-1::0;17323:148:50::2;-1:-1:-1::0;;;;;17323:57:50;::::2;-1:-1:-1::0;;;17323:57:50::2;:148::i;:::-;17251:287;;;::::0;-1:-1:-1;;;17251:287:50;;::::2;::::0;::::2;;;:::i;:::-;17545:29;:62:::0;;-1:-1:-1;;;;;;17545:62:50::2;-1:-1:-1::0;;;;;17545:62:50;::::2;::::0;;::::2;::::0;;;17619:64:::2;::::0;::::2;::::0;-1:-1:-1;;17619:64:50::2;17087:601:::0;:::o;6614:94:55:-;6686:17;;6614:94;:::o;2617:103:54:-;2663:25;2703:12;2696:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2696:19:54;;;;-1:-1:-1;;;2696:19:54;;;;;;;;-1:-1:-1;;;2696:19:54;;;;;;;;;;-1:-1:-1;2696:19:54;;;;;;;;;;;;;;2617:103;:::o;1335:85:0:-;1407:6;;-1:-1:-1;;;;;1407:6:0;;1335:85::o;551:45:55:-;;;;;;;;;;;;;;;:::o;540:87:71:-;597:25;609:12;597:11;:25::i;4090:33:50:-;;;;:::o;24574:174::-;-1:-1:-1;;;;;24704:39:50;;;;;;:22;:39;;;;;;;;;24697:46;;;;;;;;;;;;;;;;;24673:16;;24697:46;;;24704:39;24697:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24574:174;;;:::o;8699:96::-;8751:4;8770:20;:18;:20::i;403:36:55:-;;;;;;:::o;4469:193::-;4563:4;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;4575:18:55::2;:27:::0;;-1:-1:-1;;4575:27:55::2;::::0;::::2;;;::::0;;4614:25:::2;::::0;::::2;::::0;::::2;::::0;4575:27;;4614:25:::2;:::i;4036:31:50:-:0;;;;;;:::o;23818:296::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;23975:82:::2;:14;24012:18:::0;24041:14;23975:28:::2;:82::i;:::-;24068:41;::::0;-1:-1:-1;;;;;24068:41:50;::::2;::::0;::::2;::::0;;;::::2;23818:296:::0;;:::o;12695:420::-;28682:9;;-1:-1:-1;;;;;28682:9:50;28658:12;:10;:12::i;:::-;-1:-1:-1;;;;;28658:34:50;;28650:84;;;;-1:-1:-1;;;28650:84:50;;;;;;;:::i;:::-;-1:-1:-1;;;;;12837:10:50;;::::1;::::0;;::::1;;;12829:61;;;::::0;-1:-1:-1;;;12829:61:50;;::::1;::::0;::::1;;;:::i;:::-;12928:6;::::0;-1:-1:-1;;;;;12901:34:50;;::::1;12928:6:::0;::::1;12901:34;12897:83;;;12945:28;:26;:28::i;:::-;12998:13;::::0;-1:-1:-1;;;;;12998:13:50::1;12990:36:::0;12986:125:::1;;13036:13;::::0;:68:::1;::::0;-1:-1:-1;;;13036:68:50;;-1:-1:-1;;;;;13036:13:50;;::::1;::::0;-1:-1:-1;;13036:68:50::1;::::0;13070:4;;13076:2;;13080:6;;13088:15;;13036:68:::1;;;:::i;14279:539::-:0;28258:20;:18;:20::i;:::-;28250:76;;;;-1:-1:-1;;;28250:76:50;;;;;;;:::i;:::-;28341:16;:14;:16::i;:::-;28340:17;28332:73;;;;-1:-1:-1;;;28332:73:50;;;;;;;:::i;:::-;14378:3:::1;::::0;:19:::1;::::0;;-1:-1:-1;;;14378:19:50;;;;14338:16:::1;::::0;;;-1:-1:-1;;;;;14378:3:50;;::::1;::::0;-1:-1:-1;;14378:19:50::1;::::0;;::::1;::::0;;;;;;;:3;:19;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14337:60:::0;;-1:-1:-1;14337:60:50;-1:-1:-1;;;;;;14407:22:50;::::1;::::0;;::::1;::::0;:40:::1;;;14446:1;14433:10;:14;14407:40;14403:126;;;14505:3;::::0;14457:65:::1;::::0;-1:-1:-1;;;;;14457:39:50;;::::1;::::0;14505:3:::1;14511:10:::0;14457:39:::1;:65::i;:::-;14574:3;::::0;:25:::1;::::0;;-1:-1:-1;;;14574:25:50;;;;14536:16:::1;::::0;;;-1:-1:-1;;;;;14574:3:50;;::::1;::::0;:23:::1;::::0;:25:::1;::::0;;::::1;::::0;;;;;;;14536:16;14574:3;:25;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14605:10;:25:::0;;::::1;14636:32:::0;;::::1;::::0;::::1;-1:-1:-1::0;;14605:25:50;;::::1;-1:-1:-1::0;;14605:25:50;;::::1;::::0;;;::::1;14636:32;;::::0;;14605:25;;-1:-1:-1;14636:32:50;-1:-1:-1;14699:25:50::1;:14;:12;:14::i;:::-;:23;:25::i;:::-;14674:10;:50:::0;;-1:-1:-1;;14674:50:50::1;-1:-1:-1::0;;;14674:50:50::1;::::0;;::::1;;;::::0;;14780:9:::1;::::0;14736:77;;::::1;::::0;-1:-1:-1;;;;;14780:9:50::1;14758:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;14736:77:50::1;;14803:9;14736:77;;;;;;:::i;:::-;;;;;;;;28411:1;;;;14279:539::o:0;3456:1572:54:-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;3580:14:54;3549:28:::1;3706:822;3738:20;3730:5;:28;3706:822;;;3777:29;;:::i;:::-;3809:14;;3824:5;3809:21;;;;;;;;;;;;3777:53;;;;;;;;;;:::i;:::-;;;3861:1;3846:5;:11;;;:16;;;;3838:69;;;::::0;-1:-1:-1;;;3838:69:54;;::::1;::::0;::::1;;;:::i;:::-;3923:12:::0;;-1:-1:-1;;;;;3923:26:54::1;3915:80;;;::::0;-1:-1:-1;;;3915:80:54;;::::1;::::0;::::1;;;:::i;:::-;4014:12;:19:::0;:28;-1:-1:-1;4010:381:54::1;;4054:12;:24:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;4054:24:54;;;;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;;-1:-1:-1::0;;;4054:24:54::1;-1:-1:-1::0;;;;4054:24:54::1;::::0;;::::1;-1:-1:-1::0;;;4054:24:54::1;-1:-1:-1::0;;;;;;;;;4054:24:54;;::::1;-1:-1:-1::0;;;;;;4054:24:54;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;;4010:381:::1;;;4103:36;;:::i;:::-;4142:12;4155:5;4142:19;;;;;;;;;::::0;;;::::1;::::0;;;;4103:58:::1;::::0;;::::1;::::0;::::1;::::0;;4142:19;;;::::1;4103:58:::0;-1:-1:-1;;;;;4103:58:54;;::::1;::::0;;;-1:-1:-1;;;4103:58:54;::::1;;;::::0;;::::1;::::0;;;;-1:-1:-1;;;4103:58:54;;::::1;;;::::0;;;;;;;4175:12;;4103:58;;-1:-1:-1;4175:35:54::1;;;::::0;:82:::1;;;4234:12;:23;;;4214:43;;:5;:16;;;:43;;;;4175:82;:119;;;;4276:12;:18;;;4261:33;;:5;:11;;;:33;;;;4175:119;4171:212;;;4330:5;4308:12;4321:5;4308:19;;;;;;;;;::::0;;;::::1;::::0;;;;:27;;:19;::::1;:27:::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;;;4308:27:54;;::::1;-1:-1:-1::0;;;;;4308:27:54;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;4308:27:54::1;-1:-1:-1::0;;;;4308:27:54;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;4308:27:54::1;-1:-1:-1::0;;;;4308:27:54;;::::1;::::0;;;::::1;;::::0;;4171:212:::1;;;4364:8;;;;4171:212;4010:381;;4470:12:::0;;4484:16:::1;::::0;::::1;::::0;4502:11:::1;::::0;;::::1;::::0;4456:65;;-1:-1:-1;;;;;4456:65:54;;::::1;::::0;::::1;::::0;::::1;::::0;4484:16;;4515:5;;4456:65:::1;:::i;:::-;;;;;;;;3706:822;;3760:7;;3706:822;;;;4647:173;4654:12;:19:::0;:42;-1:-1:-1;4647:173:54::1;;;4723:12;:19:::0;4706:14:::1;::::0;4723:26:::1;::::0;4747:1:::1;4723:23;:26::i;:::-;4706:43;;4757:12;:18;;;;;;;;::::0;;;::::1;::::0;;-1:-1:-1;;4757:18:54;;;;;;;-1:-1:-1;;;;;;4757:18:54;;;;;;;;;4788:25:::1;::::0;4806:6;;4788:25:::1;::::0;::::1;4647:173;;;;4870:23;4896:34;:32;:34::i;:::-;4870:60;;4963:4;4944:15;:23;;4936:87;;;::::0;-1:-1:-1;;;4936:87:54;;::::1;::::0;::::1;;;:::i;4677:75:50:-:0;;;-1:-1:-1;;;;;4677:75:50;;:::o;6692:96::-;6759:9;;:24;;;-1:-1:-1;;;6759:24:50;;;;6737:7;;-1:-1:-1;;;;;6759:9:50;;:22;;:24;;;;;;;;;;;;;;:9;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25173:727::-;27911:7;:5;:7::i;:::-;-1:-1:-1;;;;;27895:23:50;:12;:10;:12::i;:::-;-1:-1:-1;;;;;27895:23:50;;;:93;;-1:-1:-1;27958:29:50;;-1:-1:-1;;;;;27958:29:50;27934:12;:10;:12::i;:::-;-1:-1:-1;;;;;27934:54:50;;27895:93;:153;;;-1:-1:-1;28028:19:50;;-1:-1:-1;;;;;28028:19:50;28004:12;:10;:12::i;:::-;-1:-1:-1;;;;;28004:44:50;;27895:153;27887:222;;;;-1:-1:-1;;;27887:222:50;;;;;;;:::i;:::-;28168:28:::1;:26;:28::i;:::-;25340:9:::2;::::0;:52:::2;::::0;-1:-1:-1;;;25340:52:50;;-1:-1:-1;;;;;25340:9:50;;::::2;::::0;-1:-1:-1;;25340:52:50::2;::::0;25375:15;;25340:52:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25332:108;;;::::0;-1:-1:-1;;;25332:108:50;;::::2;::::0;::::2;;;:::i;:::-;25454:80;-1:-1:-1::0;;;;;25454:42:50;::::2;-1:-1:-1::0;;;25454:42:50::2;:80::i;:::-;25446:129;;;::::0;-1:-1:-1;;;25446:129:50;;::::2;::::0;::::2;;;:::i;:::-;25591:50;:15;25624::::0;25591:24:::2;:50::i;:::-;25586:124;;25651:52;:15;25686::::0;25651:26:::2;:52::i;:::-;25721:9;25716:116;25736:20:::0;;::::2;25716:116;;;25771:54;25795:15;25812:9;;25822:1;25812:12;;;;;;;;;;;;;25771:23;:54::i;:::-;25758:3;;25716:116;;;-1:-1:-1::0;25843:52:50::2;::::0;-1:-1:-1;;;;;25843:52:50;::::2;::::0;::::2;::::0;::::2;::::0;25885:9;;;;25843:52:::2;:::i;:::-;;;;;;;;25173:727:::0;;;:::o;20373:154::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;28168:28:50::1;:26;:28::i;:::-;20481:41:::2;20503:18;20481:21;:41::i;315:26:71:-:0;;;;:::o;8062:119:50:-;8124:7;8146:30;:28;:30::i;3799:23::-;;;-1:-1:-1;;;;;3799:23:50;;:::o;15374:792::-;28470:16;:14;:16::i;:::-;28462:68;;;;-1:-1:-1;;;28462:68:50;;;;;;;:::i;:::-;28544:16;:14;:16::i;:::-;28536:67;;;;-1:-1:-1;;;28536:67:50;;;;;;;:::i;:::-;15461:3:::1;::::0;15478:10:::1;:13:::0;15461:31:::1;::::0;-1:-1:-1;;;15461:31:50;;15438:20:::1;::::0;-1:-1:-1;;;;;15461:3:50::1;::::0;:16:::1;::::0;:31:::1;::::0;15478:13:::1;;::::0;15461:31:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15505:10;15498:17:::0;;-1:-1:-1;;15498:17:50;;;15534:19:::1;::::0;15438:54;;-1:-1:-1;;;;;;15534:19:50::1;15526:42:::0;15522:141:::1;;15578:19;::::0;15635:20:::1;::::0;15578:78:::1;::::0;-1:-1:-1;;;15578:78:50;;-1:-1:-1;;;;;15578:19:50;;::::1;::::0;:42:::1;::::0;:78:::1;::::0;15621:12;;15635:20;15578:78:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;15522:141;15668:25;15680:12;15668:11;:25::i;:::-;15711:29;::::0;-1:-1:-1;;;;;15711:29:50::1;15703:52:::0;15699:160:::1;;15765:29;::::0;15831:20:::1;::::0;15765:87:::1;::::0;-1:-1:-1;;;15765:87:50;;-1:-1:-1;;;;;15765:29:50;;::::1;::::0;:51:::1;::::0;:87:::1;::::0;15817:12;;15831:20;15765:87:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;15699:160;15993:50;16028:14;:12;:14::i;:::-;15993:34;:50::i;:::-;15970:20;:73:::0;16072:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;16055:44:50::1;;16086:12;16055:44;;;;;;:::i;:::-;;;;;;;;16140:20;;16126:12;:10;:12::i;:::-;16110:51;::::0;-1:-1:-1;;;;;16110:51:50;;;::::1;::::0;::::1;::::0;;;::::1;28609:1;15374:792::o:0;2984:140:54:-;3052:23;;:::i;:::-;3090:12;3103:15;3090:29;;;;;;;;;;;;;;;;;3083:36;;;;;;;;3090:29;;;;3083:36;-1:-1:-1;;;;;3083:36:54;;;;-1:-1:-1;;;3083:36:54;;;;;;;;;;;-1:-1:-1;;;3083:36:54;;;;;;;;;;;;;;-1:-1:-1;;2984:140:54:o;2261:240:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2349:22:0;::::1;2341:73;;;::::0;-1:-1:-1;;;2341:73:0;;::::1;::::0;::::1;;;:::i;:::-;2450:6;::::0;2429:38:::1;::::0;-1:-1:-1;;;;;2429:38:0;;::::1;::::0;2450:6:::1;::::0;2429:38:::1;::::0;2450:6:::1;::::0;2429:38:::1;2477:6;:17:::0;;-1:-1:-1;;;;;;2477:17:0::1;-1:-1:-1::0;;;;;2477:17:0;;;::::1;::::0;;;::::1;::::0;;2261:240::o;5142:1380:50:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;:::i;:::-;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;-1:-1:-1;;;;;5430:33:50;::::1;5422:87;;;::::0;-1:-1:-1;;;5422:87:50;;::::1;::::0;::::1;;;:::i;:::-;-1:-1:-1::0;;;;;5523:30:50;::::1;5515:80;;;::::0;-1:-1:-1;;;5515:80:50;;::::1;::::0;::::1;;;:::i;:::-;-1:-1:-1::0;;;;;5609:35:50;::::1;5601:90;;;::::0;-1:-1:-1;;;5601:90:50;;::::1;::::0;::::1;;;:::i;:::-;-1:-1:-1::0;;;;;5705:27:50;::::1;5697:74;;;::::0;-1:-1:-1;;;5697:74:50;;::::1;::::0;::::1;;;:::i;:::-;5777:9;:22:::0;;-1:-1:-1;;;;;;5777:22:50;;::::1;-1:-1:-1::0;;;;;5777:22:50;;::::1;::::0;;;::::1;::::0;;;5805:6:::1;:16:::0;;;::::1;::::0;;::::1;;::::0;;5827:3:::1;:10:::0;;;::::1;::::0;;::::1;;::::0;;5843:11:::1;:26:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;5875:43:::1;5898:19:::0;5875:22:::1;:43::i;:::-;5925:16;:14;:16::i;:::-;5948:27;:14;:25;:27::i;:::-;5986:9;5981:118;6005:19;:26;6001:1;:30;5981:118;;;6046:46;6069:19;6089:1;6069:22;;;;;;;;;;;;;;6046;:46::i;:::-;6033:3;;5981:118;;;-1:-1:-1::0;6105:18:50::1;:40:::0;;;6151:20:::1;:40:::0;;;6198:28:::1;:15;:26;:28::i;:::-;6255:27;6277:4;6255:21;:27::i;:::-;6294:161;::::0;-1:-1:-1;;;;;6294:161:50;::::1;::::0;::::1;::::0;::::1;::::0;6313:17;;6338:19;;6383:7;;6398:12;;6418:4;;6430:19;;6294:161:::1;:::i;:::-;;;;;;;;6496:20;;6482:12;:10;:12::i;:::-;6466:51;::::0;-1:-1:-1;;;;;6466:51:50;;;::::1;::::0;::::1;::::0;;;::::1;1794:14:9::0;1790:66;;;-1:-1:-1;;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;-1:-1:-1;;;;;;5142:1380:50:o;5375:862:54:-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;5516:12:54::1;:19:::0;5498:37:::1;::::0;::::1;;5490:88;;;::::0;-1:-1:-1;;;5490:88:54;;::::1;::::0;::::1;;;:::i;:::-;5620:1;5592:18;:24;;;:29;;;;5584:82;;;::::0;-1:-1:-1;;;5584:82:54;;::::1;::::0;::::1;;;:::i;:::-;5680:25:::0;;-1:-1:-1;;;;;5680:39:54::1;5672:93;;;::::0;-1:-1:-1;;;5672:93:54;;::::1;::::0;::::1;;;:::i;:::-;5845:18;5813:12;5826:15;5813:29;;;;;;;;;;;::::0;;;::::1;::::0;;;:50;;:29;::::1;:50:::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;;5813:50:54::1;-1:-1:-1::0;;;;5813:50:54::1;::::0;;::::1;-1:-1:-1::0;;;5813:50:54::1;-1:-1:-1::0;;;;;;;;;5813:50:54;;::::1;-1:-1:-1::0;;;;;;5813:50:54;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;;::::0;;;5940:34:::1;:32;:34::i;:::-;5914:60;;6007:4;5988:15;:23;;5980:87;;;::::0;-1:-1:-1;;;5980:87:54;;::::1;::::0;::::1;;;:::i;:::-;6132:25:::0;;6159:29:::1;::::0;::::1;::::0;6190:24:::1;::::0;;::::1;::::0;6118:114;;-1:-1:-1;;;;;6118:114:54;;::::1;::::0;::::1;::::0;::::1;::::0;6159:29;;6216:15;;6118:114:::1;:::i;3561:40:50:-:0;;;;;;;;;;;;;-1:-1:-1;;;3561:40:50;;;;;:::o;8349:227::-;8412:7;8427:13;8443:19;:17;:19::i;:::-;8427:35;;8468:12;8483:14;:12;:14::i;:::-;8468:29;;8514:5;8507:4;:12;8503:41;;;8536:1;8529:8;;;;;;8503:41;8556:15;:5;8566:4;8556:9;:15::i;:::-;8549:22;;;;8349:227;:::o;2461:213:26:-;2550:7;;2586:19;1149:4;2596:8;2586:9;:19::i;:::-;2569:36;-1:-1:-1;2624:20:26;2569:36;2635:8;2624:10;:20::i;:::-;2615:29;2461:213;-1:-1:-1;;;;2461:213:26:o;828:104:19:-;915:10;828:104;:::o;27402:219:50:-;27460:20;27483:15;:13;:15::i;:::-;27512:10;:20;27460:38;;-1:-1:-1;27512:20:50;;;;;:25;;:64;;-1:-1:-1;27556:10:50;:20;;;;;;27541:35;;27512:64;27504:112;;;;-1:-1:-1;;;27504:112:50;;;;;;;:::i;12293:184::-;12345:7;12428:44;12453:18;;12428:20;;:24;;:44;;;;:::i;1369:286:5:-;1456:4;1563:23;1578:7;1563:14;:23::i;:::-;:85;;;;;1602:46;1627:7;1636:11;1602:24;:46::i;:::-;1556:92;1369:286;-1:-1:-1;;;1369:286:5:o;3321:426:99:-;3388:16;3412:22;3451:4;:10;;;3437:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3437:25:99;-1:-1:-1;3512:15:99;3468:13;3512:25;;;:15;;;:25;;;;;;3412:50;;-1:-1:-1;3468:13:99;-1:-1:-1;;;;;3512:25:99;3543:182;-1:-1:-1;;;;;3550:28:99;;;;;;:58;;-1:-1:-1;;;;;;3582:26:99;;-1:-1:-1;3582:26:99;;3550:58;3543:182;;;3633:14;3618:5;3624;3618:12;;;;;;;;-1:-1:-1;;;;;3618:29:99;;;:12;;;;;;;;;;:29;;;;3672:31;;;;;;;-1:-1:-1;3672:15:99;;;:31;;;;;;;3711:7;;;;;3672:31;3543:182;;;-1:-1:-1;3737:5:99;;3321:426;-1:-1:-1;;;3321:426:99:o;17692:271:50:-;17780:7;17795:22;17820:61;17862:18;;17820:37;17836:20;;17820:11;:15;;:37;;;;:::i;:::-;:41;;:61::i;:::-;17795:86;;17894:64;17919:38;17938:18;;17919:14;:18;;:38;;;;:::i;:::-;17894:20;;;:24;:64::i;22502:576::-;22591:36;-1:-1:-1;;;;;22591:34:50;;;:36::i;:::-;22583:81;;;;-1:-1:-1;;;22583:81:50;;;;;;;:::i;:::-;22678:9;;:51;;-1:-1:-1;;;22678:51:50;;-1:-1:-1;;;;;22678:9:50;;;;-1:-1:-1;;22678:51:50;;22713:14;;22678:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22670:107;;;;-1:-1:-1;;;22670:107:50;;;;;;;:::i;:::-;22863:40;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22863:40:50;-1:-1:-1;;;22863:40:50;;;22828:76;;-1:-1:-1;;22800:24:50;;-1:-1:-1;;;;;22828:34:50;;;:76;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22783:121;;;;22918:9;22910:57;;;;-1:-1:-1;;;22910:57:50;;;;;;;:::i;:::-;22973:50;:14;23007;22973:25;:50::i;:::-;23034:39;;-1:-1:-1;;;;;23034:39:50;;;;;;;;22502:576;;;:::o;2266:365:99:-;-1:-1:-1;;;;;2369:16:99;;-1:-1:-1;2369:16:99;;;;:38;;-1:-1:-1;;;;;;2389:18:99;;;;2369:38;2361:66;;;;-1:-1:-1;;;2361:66:99;;;;;;;:::i;:::-;-1:-1:-1;;;;;2441:28:99;;;;;;;-1:-1:-1;2441:15:99;;:28;;;;;;:36;;;:28;;:36;2433:68;;;;-1:-1:-1;;;2433:68:99;;;;;;;:::i;:::-;-1:-1:-1;;;;;2538:21:99;;;;;;;-1:-1:-1;2538:15:99;;:21;;;;;;;;2507:28;;;;;;;;:52;;2538:21;;;;-1:-1:-1;;;;;;2507:52:99;;;;;;;2572:21;2565:28;;;;;;;2612:10;;-1:-1:-1;;2612:14:99;2599:27;;2266:365::o;27186:212:50:-;-1:-1:-1;;;;;27300:39:50;;;;;;:22;:39;;;;;27293:46;;;:::i;:::-;27350:43;;-1:-1:-1;;;;;27350:43:50;;;;;;;;27186:212;:::o;6153:185:55:-;6228:1;6220:5;:9;6212:53;;;;-1:-1:-1;;;6212:53:55;;;;;;;:::i;:::-;6272:17;:25;;;6308;;;;;;6292:5;;6308:25;:::i;2701:175:8:-;2759:7;2790:5;;;2813:6;;;;2805:46;;;;-1:-1:-1;;;2805:46:8;;;;;;;:::i;442:94:71:-;520:11;;442:94;:::o;1952:123:9:-;2000:4;2024:44;2062:4;2024:29;:44::i;8918:114:50:-;8971:4;9008:19;:17;:19::i;:::-;8990:14;:12;:14::i;:::-;:37;;8983:44;;8918:114;:::o;21475:272::-;21581:1;21559:19;:23;21551:88;;;;-1:-1:-1;;;21551:88:50;;;;;;;:::i;:::-;21645:18;:40;;;21697:45;;;;;;21666:19;;21697:45;:::i;7498:2386:55:-;7581:9;;:31;;;-1:-1:-1;;;7581:31:55;;;;7565:13;;-1:-1:-1;;;;;7581:9:55;;-1:-1:-1;;7581:31:55;;;;;;;;;;;;;;7565:13;7581:9;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7565:47;;7701:29;7724:5;7701:22;:29::i;:::-;7767:6;;7741:48;;;-1:-1:-1;;;7741:48:55;;;;7693:37;;-1:-1:-1;;;;;;7767:6:55;;;;7741:46;;:48;;;;;;;;;;;;;;;7767:6;7741:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7737:104;;7809:11;;;;;;;7828:7;;;7737:104;7880:18;;7984:17;;7880:18;;;;;8007:24;7984:17;8034:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8034:30:55;-1:-1:-1;8185:19:55;;8007:57;;-1:-1:-1;8091:12:55;;8070:18;;;;8210:617;8231:15;8217:11;:29;8210:617;;;8273:6;;:23;;-1:-1:-1;;;8273:23:55;;8256:14;;-1:-1:-1;;;;;8273:6:55;;-1:-1:-1;;8273:23:55;;8285:10;;8273:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;8310:21:55;;;;;;:13;:21;;;;;;;;-1:-1:-1;8310:21:55;;8305:255;;8368:6;8343:7;8351:13;;;;;;8343:22;;;;;;;;-1:-1:-1;;;;;8343:31:55;;;:22;;;;;;;;;;;:31;8305:255;;;8406:11;8393:9;;;;;;:24;8389:171;;8434:33;8455:11;8434:33;;;;;;:::i;:::-;;;;;;;;8480:16;8477:60;;8515:11;;;;;;;8477:60;8546:5;;;8389:171;8688:22;8759:11;8771:3;8759:15;8740:10;8753:3;8740:16;:34;8723:52;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;8723:52:55;;;;;;8713:63;;8723:52;8713:63;;;;;-1:-1:-1;8210:617:55;;-1:-1:-1;;8210:617:55;;8884:33;8906:7;8914:1;8906:10;;;;;;;;;;;;;;8884:21;:33::i;:::-;8973:18;8994:25;:79;;9051:22;:5;9061:11;9051:9;:22::i;:::-;8994:79;;;9022:26;:5;9032:15;9022:9;:26::i;:::-;8973:100;-1:-1:-1;9083:14:55;;9079:129;;9112:6;9107:95;9128:11;9124:1;:15;9107:95;;;9156:37;9170:7;9178:1;9170:10;;;;;;;;;;;;;;9182;9156:13;:37::i;:::-;9141:3;;9107:95;;;;9079:129;9218:24;;;;9214:666;;;9252:20;9275:22;:14;:20;:22::i;:::-;9252:45;;9305:516;-1:-1:-1;;;;;9312:26:55;;;;;;:66;;;9358:20;:14;:18;:20::i;:::-;-1:-1:-1;;;;;9342:36:55;;;;;;;9312:66;9305:516;;;9458:9;;9408:61;;-1:-1:-1;;;9408:61:55;;9390:15;;-1:-1:-1;;;;;9408:41:55;;;;-1:-1:-1;;9408:61:55;;9458:9;;9408:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9390:79;;9479:13;9495:25;:83;;9554:24;:7;9566:11;9554;:24::i;:::-;9495:83;;;9523:28;:7;9535:15;9523:11;:28::i;:::-;9479:99;-1:-1:-1;9592:9:55;;9588:167;;9620:9;9615:130;9639:11;9635:1;:15;9615:130;;;9671:9;;9700:10;;-1:-1:-1;;;;;9671:9:55;;;;:28;;9700:10;;9708:1;;9700:10;;;;;;;;;;;;9712:12;9726:5;9671:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9652:3:55;;;;;-1:-1:-1;9615:130:55;;-1:-1:-1;9615:130:55;;;9588:167;9779:33;:14;9799:12;9779:19;:33::i;:::-;9764:48;;9305:516;;;;;9214:666;;;;9841:32;9862:7;9870:1;9862:10;;;;;;;;;;;;;;9841:20;:32::i;:::-;7498:2386;;;;;;;;;;:::o;1436:624:12:-;1812:10;;;1811:62;;-1:-1:-1;1828:39:12;;-1:-1:-1;;;1828:39:12;;-1:-1:-1;;;;;1828:15:12;;;;;:39;;1852:4;;1859:7;;1828:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;1811:62;1803:150;;;;-1:-1:-1;;;1803:150:12;;;;;;;:::i;:::-;1963:90;1983:5;2013:22;;;2037:7;2046:5;1990:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1990:62:12;;;;;;;;;;;;;;-1:-1:-1;;;;;1990:62:12;-1:-1:-1;;;;;;1990:62:12;;;;;;;;;;;1963:19;:90::i;2028:176:24:-;2084:6;2118:5;2110;:13;2102:65;;;;-1:-1:-1;;;2102:65:24;;;;;;;:::i;:::-;-1:-1:-1;2191:5:24;2028:176::o;3147:155:8:-;3205:7;3237:1;3232;:6;;3224:49;;;;-1:-1:-1;;;3224:49:8;;;;;;;:::i;:::-;-1:-1:-1;3290:5:8;;;3147:155::o;6973:403:54:-;7117:12;:19;7040:7;;;;;7142:197;7172:17;7164:5;:25;;;7142:197;;;7208:29;;:::i;:::-;7240:12;7253:5;7240:19;;;;;;;;;;;;;;;;;;;7208:51;;;;;;;;7240:19;;;;7208:51;-1:-1:-1;;;;;7208:51:54;;;;-1:-1:-1;;;7208:51:54;;;;;;;;;;-1:-1:-1;;;7208:51:54;;;;;;;;;-1:-1:-1;7290:42:54;;:20;;:24;:42::i;:::-;7267:65;-1:-1:-1;;7191:7:54;;7142:197;;;-1:-1:-1;7351:20:54;;-1:-1:-1;;6973:403:54;:::o;2879:178:99:-;2956:4;-1:-1:-1;;;;;2975:16:99;;-1:-1:-1;2975:16:99;;;;:38;;-1:-1:-1;;;;;;2995:18:99;;;;2975:38;:77;;;;-1:-1:-1;;;;;;;3017:21:99;;;3050:1;3017:21;;;-1:-1:-1;3017:15:99;;;;:21;;;;;;;;:35;;;2879:178::o;1597:371::-;-1:-1:-1;;;;;1682:22:99;;-1:-1:-1;1682:22:99;;;;:50;;-1:-1:-1;;;;;;1708:24:99;;;;1682:50;1674:78;;;;-1:-1:-1;;;1674:78:99;;;;;;;:::i;:::-;-1:-1:-1;;;;;1766:27:99;;;1805:1;1766:27;;;-1:-1:-1;1766:15:99;;:27;;;;;;;:41;1758:67;;;;-1:-1:-1;;;1758:67:99;;;;;;;:::i;:::-;1861:15;:25;;;;:15;;;:25;;;;;;;;-1:-1:-1;;;;;1831:27:99;;;;;;;;;:55;;1861:25;;;;-1:-1:-1;;;;;;1831:55:99;;;;;;1892:25;;;;:38;;;;;;;;;;;1949:10;;:14;1936:27;;1597:371::o;25904:517:50:-;26079:9;;26014:53;;-1:-1:-1;;;26014:53:50;;-1:-1:-1;;;;;26079:9:50;;;;26014:43;;;;;:53;;26058:8;;26014:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;26014:75:50;;26006:127;;;;-1:-1:-1;;;26006:127:50;;;;;;;:::i;:::-;26144:9;26139:218;-1:-1:-1;;;;;26163:39:50;;;;;;:22;:39;;;;;:46;26159:50;;26139:218;;;-1:-1:-1;;;;;26228:39:50;;;;;;:22;:39;;;;;:42;;26274:8;;26228:39;26268:1;;26228:42;;;;;;;;;;;;;;:54;26224:127;;;26294:48;;-1:-1:-1;;;26294:48:50;;;;;;;:::i;26224:127::-;26211:3;;26139:218;;;-1:-1:-1;;;;;;26362:39:50;;;;;;;;:22;:39;;;;;;;:54;;-1:-1:-1;26362:54:50;;;;;;;;;;;25904:517::o;20753:252::-;20855:2;20834:18;:23;;;20826:80;;;;-1:-1:-1;;;20826:80:50;;;;;;;:::i;:::-;20912:17;:38;;-1:-1:-1;;20912:38:50;;;;;;;;;;;;;20961:39;;;;;;20982:17;;20961:39;:::i;935:126:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;:::i;:::-;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;992:26:0::1;:24;:26::i;:::-;1028;:24;:26::i;:::-;1794:14:9::0;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;935:126:0:o;726:144:99:-;791:10;;:15;783:40;;;;-1:-1:-1;;;783:40:99;;;;;;;:::i;:::-;451:3;829:25;;;;:15;;;:25;;;;;;:36;;-1:-1:-1;;;;;;829:36:99;;;;;;726:144::o;2266:459:27:-;2324:7;2565:6;2561:45;;-1:-1:-1;2594:1:27;2587:8;;2561:45;2628:5;;;2632:1;2628;:5;:1;2651:5;;;;;:10;2643:56;;;;-1:-1:-1;;;2643:56:27;;;;;;;:::i;3187:130::-;3245:7;3271:39;3275:1;3278;3271:39;;;;;;;;;;;;;;;;;:3;:39::i;13967:95:50:-;14045:12;13967:95;:::o;757:394:5:-;821:4;1016:55;1041:7;-1:-1:-1;;;1016:24:5;:55::i;:::-;:128;;;;-1:-1:-1;1088:56:5;1113:7;-1:-1:-1;;;;;;1088:24:5;:56::i;:::-;1087:57;;757:394;-1:-1:-1;;757:394:5:o;4243:395::-;4336:4;4515:12;4529:11;4544:50;4573:7;4582:11;4544:28;:50::i;:::-;4514:80;;;;4613:7;:17;;;;;4624:6;4613:17;4605:26;4243:395;-1:-1:-1;;;;;4243:395:5:o;4228:150:8:-;4286:7;4317:1;4313;:5;4305:44;;;;-1:-1:-1;;;4305:44:8;;;;;;;:::i;:::-;4370:1;4366;:5;;;;;;;4228:150;-1:-1:-1;;;4228:150:8:o;737:413:18:-;1097:20;1135:8;;;737:413::o;7641:745:54:-;7877:12;:19;7706:7;;7838:5;;7706:7;7902:461;7934:17;7926:5;:25;7902:461;;;7970:29;;:::i;:::-;8002:12;8015:5;8002:19;;;;;;;;;;;;;;;;7970:51;;;;;;;;8002:19;;;;7970:51;-1:-1:-1;;;;;7970:51:54;;;;-1:-1:-1;;;7970:51:54;;;;;;;;;;-1:-1:-1;;;7970:51:54;;;;;;;;;;-1:-1:-1;8052:50:54;;8073:10;;8052:20;:50::i;:::-;8029:73;;8163:63;8186:5;:12;;;8200;8214:5;:11;;;8163:22;:63::i;:::-;8333:23;:5;8343:12;8333:9;:23::i;:::-;8325:31;-1:-1:-1;;;7953:7:54;;7902:461;;;-1:-1:-1;8376:5:54;;7641:745;-1:-1:-1;;;7641:745:54:o;11267:606:50:-;11329:20;11352:23;:15;:21;:23::i;:::-;11329:46;;11381:456;-1:-1:-1;;;;;11388:26:50;;;;;;:67;;;11434:21;:15;:19;:21::i;:::-;-1:-1:-1;;;;;11418:37:50;;;;;;;11388:67;11381:456;;;11534:9;;11483:62;;-1:-1:-1;;;11483:62:50;;11465:15;;-1:-1:-1;;;;;11483:42:50;;;;-1:-1:-1;;11483:62:50;;11534:9;;11483:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11465:80;-1:-1:-1;11557:11:50;;11553:221;;11580:9;;-1:-1:-1;;;;;11632:56:50;;;11580:9;11632:56;;;:22;:56;;;;;;;11580:109;;-1:-1:-1;;;11580:109:50;;:9;;;;;-1:-1:-1;;11580:109:50;;11610:6;;11632:56;;;11580:109;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11699:66;11751:12;11699:32;:66::i;:::-;11796:34;:15;11817:12;11796:20;:34::i;:::-;11781:49;;11381:456;;;;11842:26;:15;:24;:26::i;9178:119::-;9246:9;;9284:6;;9246:46;;-1:-1:-1;;;9246:46:50;;-1:-1:-1;;;;;9246:9:50;;;;:15;;:46;;9262:4;;9268:6;;9284;;9246:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9178:119;;:::o;874:112:99:-;956:15;934:7;956:25;;;:15;;:25;;;;;;-1:-1:-1;;;;;956:25:99;;874:112::o;1121:88::-;-1:-1:-1;451:3:99;;1121:88::o;990:127::-;-1:-1:-1;;;;;1088:24:99;;;1066:7;1088:24;;;-1:-1:-1;1088:15:99;;;;:24;;;;;;;;;990:127::o;10574:443:50:-;10635:20;10658:22;:14;:20;:22::i;:::-;10635:45;;10686:327;-1:-1:-1;;;;;10693:26:50;;;;;;:66;;;10739:20;:14;:18;:20::i;:::-;-1:-1:-1;;;;;10723:36:50;;;;;;;10693:66;10686:327;;;10837:9;;10787:61;;-1:-1:-1;;;10787:61:50;;10769:15;;-1:-1:-1;;;;;10787:41:50;;;;-1:-1:-1;;10787:61:50;;10837:9;;10787:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10769:79;-1:-1:-1;10860:11:50;;10856:95;;10883:9;;:59;;-1:-1:-1;;;10883:59:50;;-1:-1:-1;;;;;10883:9:50;;;;:28;;:59;;10912:6;;10920:12;;10934:7;;10883:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10856:95;10973:33;:14;10993:12;10973:19;:33::i;:::-;10958:48;;10686:327;;;3088:762:12;3544:69;;;;;;;;;;;;;;;;;;3518:23;;3544:69;;-1:-1:-1;;;;;3544:27:12;;;3572:4;;3544:27;:69::i;:::-;3627:17;;3518:95;;-1:-1:-1;3627:21:12;3623:221;;3767:10;3756:30;;;;;;;;;;;;:::i;:::-;3748:85;;;;-1:-1:-1;;;3748:85:12;;;;;;;:::i;759:64:19:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;:::i;:::-;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1794:14;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;759:64:19:o;1067:192:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;:::i;:::-;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1134:17:0::1;1154:12;:10;:12::i;:::-;1176:6;:18:::0;;-1:-1:-1;;;;;;1176:18:0::1;-1:-1:-1::0;;;;;1176:18:0;::::1;::::0;;::::1;::::0;;;1209:43:::1;::::0;1176:18;;-1:-1:-1;1176:18:0;-1:-1:-1;;1209:43:0::1;::::0;-1:-1:-1;;1209:43:0::1;1778:1:9;1794:14:::0;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;1067:192:0:o;3799:272:27:-;3885:7;3919:12;3912:5;3904:28;;;;-1:-1:-1;;;3904:28:27;;;;;;;;:::i;:::-;;3942:9;3958:1;3954;:5;;;;;;;3799:272;-1:-1:-1;;;;;3799:272:27:o;5155:444:5:-;5276:4;5282;5302:26;652:10;5354:20;;5376:11;5331:57;;;;;;;;:::i;:::-;;;;-1:-1:-1;;5331:57:5;;;;;;;;;;;;;;-1:-1:-1;;;;;5331:57:5;-1:-1:-1;;;;;;5331:57:5;;;;;;;;;;5436:47;;5331:57;;-1:-1:-1;;;5413:19:5;;-1:-1:-1;;;;;5436:18:5;;;5461:5;;5436:47;;5331:57;;5436:47;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5398:85;;;;5513:2;5497:6;:13;:18;5493:45;;;5525:5;5532;5517:21;;;;;;;;;5493:45;5556:7;5576:6;5565:26;;;;;;;;;;;;:::i;:::-;5548:44;;;;;;;5155:444;;;;;;:::o;6568:146:54:-;6656:7;6678:31;6679:19;;;;;6704:4;6678:25;:31::i;7077:150:55:-;7183:39;7195:6;7203;7211:10;7183:11;:39::i;3872:394:99:-;3952:15;3927:22;3952:25;;;:15;;;:25;;;;;;-1:-1:-1;;;;;3952:25:99;3983:217;-1:-1:-1;;;;;3990:28:99;;;;;;:58;;-1:-1:-1;;;;;;4022:26:99;;-1:-1:-1;4022:26:99;;3990:58;3983:217;;;-1:-1:-1;;;;;4080:31:99;;;4058:19;4080:31;;;-1:-1:-1;4080:15:99;;:31;;;;;;;-1:-1:-1;;;;;;4119:38:99;;;;;4080:31;3983:217;;;-1:-1:-1;451:3:99;4205:25;;;;:15;;;:25;;;;;:36;;-1:-1:-1;;;;;;4205:36:99;;;;;;;4247:14;;3872:394::o;3592:193:18:-;3695:12;3726:52;3748:6;3756:4;3762:1;3765:12;3726:21;:52::i;9639:386:50:-;9777:9;;:18;;;-1:-1:-1;;;9777:18:50;;;;9723:51;;-1:-1:-1;;;;;9777:9:50;;:16;;:18;;;;;:9;;:18;;;;;;;:9;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9777:18:50;;;;;;;;;;;;:::i;:::-;9723:72;;9823:17;:24;9809:10;:38;;;;9801:98;;;;-1:-1:-1;;;9801:98:50;;;;;;;:::i;:::-;9905:31;9939:17;9957:10;9939:29;;;;;;;;;;;;;;;;;;;;9974:9;;:46;;-1:-1:-1;;;9974:46:50;;9939:29;;-1:-1:-1;;;;;;9974:9:50;;:15;;:46;;9990:4;;9996:6;;9939:29;;9974:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9639:386;;;;;:::o;4619:523:18:-;4746:12;4803:5;4778:21;:30;;4770:81;;;;-1:-1:-1;;;4770:81:18;;;;;;;:::i;:::-;4869:18;4880:6;4869:10;:18::i;:::-;4861:60;;;;-1:-1:-1;;;4861:60:18;;;;;;;:::i;:::-;4992:12;5006:23;5033:6;-1:-1:-1;;;;;5033:11:18;5053:5;5061:4;5033:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4991:75;;;;5083:52;5101:7;5110:10;5122:12;5083:17;:52::i;:::-;5076:59;4619:523;-1:-1:-1;;;;;;;4619:523:18:o;6122:725::-;6237:12;6265:7;6261:580;;;-1:-1:-1;6295:10:18;6288:17;;6261:580;6406:17;;:21;6402:429;;6664:10;6658:17;6724:15;6711:10;6707:2;6703:19;6696:44;6613:145;6796:20;;-1:-1:-1;;;6796:20:18;;;;6803:12;;6796:20;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1196:378;;;1352:3;1345:4;1337:6;1333:17;1329:27;1319:2;;-1:-1;;1360:12;1319:2;-1:-1;1390:20;;1430:18;1419:30;;1416:2;;;-1:-1;;1452:12;1416:2;1496:4;1488:6;1484:17;1472:29;;1547:3;1496:4;;1531:6;1527:17;1488:6;1513:32;;1510:41;1507:2;;;1564:1;;1554:12;5447:627;;5571:4;5559:9;5554:3;5550:19;5546:30;5543:2;;;-1:-1;;5579:12;5543:2;5607:20;5571:4;5607:20;:::i;:::-;5598:29;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5686:75;;5828:2;5881:22;;6147:20;84721:6;84710:18;;90677:34;;90667:2;;-1:-1;;90715:12;90667:2;5828;5843:16;;5836:74;6005:47;6048:3;5972:2;6024:22;;6005:47;:::i;:::-;5972:2;5991:5;5987:16;5980:73;5537:537;;;;:::o;6768:126::-;6833:20;;85113:4;85102:16;;91044:33;;91034:2;;91091:1;;91081:12;6901:241;;7005:2;6993:9;6984:7;6980:23;6976:32;6973:2;;;-1:-1;;7011:12;6973:2;85:6;72:20;97:33;124:5;97:33;:::i;7149:263::-;;7264:2;7252:9;7243:7;7239:23;7235:32;7232:2;;;-1:-1;;7270:12;7232:2;226:6;220:13;238:33;265:5;238:33;:::i;7419:617::-;;;;;7574:3;7562:9;7553:7;7549:23;7545:33;7542:2;;;-1:-1;;7581:12;7542:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;7633:63;-1:-1;7733:2;7772:22;;72:20;97:33;72:20;97:33;:::i;:::-;7741:63;-1:-1;7841:2;7880:22;;6283:20;;-1:-1;7949:2;7988:22;;72:20;97:33;72:20;97:33;:::i;:::-;7536:500;;;;-1:-1;7536:500;;-1:-1;;7536:500::o;8043:360::-;;;8161:2;8149:9;8140:7;8136:23;8132:32;8129:2;;;-1:-1;;8167:12;8129:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;8219:63;-1:-1;8319:2;8355:22;;3296:20;3321:30;3296:20;3321:30;:::i;:::-;8327:60;;;;8123:280;;;;;:::o;8410:399::-;;;8542:2;8530:9;8521:7;8517:23;8513:32;8510:2;;;-1:-1;;8548:12;8510:2;226:6;220:13;238:33;265:5;238:33;:::i;:::-;8711:2;8761:22;;;;6431:13;8600:74;;6431:13;;-1:-1;;;8504:305::o;8816:617::-;;;;;8971:3;8959:9;8950:7;8946:23;8942:33;8939:2;;;-1:-1;;8978:12;8939:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;9030:63;-1:-1;9130:2;9169:22;;6283:20;;-1:-1;9238:2;9277:22;;72:20;97:33;72:20;97:33;:::i;:::-;9246:63;-1:-1;9346:2;9385:22;;72:20;97:33;72:20;97:33;:::i;9440:460::-;;9614:2;;9602:9;9593:7;9589:23;9585:32;9582:2;;;-1:-1;;9620:12;9582:2;9671:17;9665:24;9709:18;9701:6;9698:30;9695:2;;;-1:-1;;9731:12;9695:2;9852:22;;482:4;470:17;;466:27;-1:-1;456:2;;-1:-1;;497:12;456:2;537:6;531:13;559:114;574:98;665:6;574:98;:::i;:::-;559:114;:::i;:::-;701:21;;;758:14;;;;733:17;;;847;;;838:27;;;;835:36;-1:-1;832:2;;;-1:-1;;874:12;832:2;-1:-1;900:10;;894:251;919:6;916:1;913:13;894:251;;;3962:6;3956:13;3974:67;4035:5;3974:67;:::i;:::-;987:95;;941:1;934:9;;;;;1096:14;;;;1124;;894:251;;;-1:-1;9751:133;9576:324;-1:-1;;;;;;;9576:324::o;9907:449::-;;;10072:2;10060:9;10051:7;10047:23;10043:32;10040:2;;;-1:-1;;10078:12;10040:2;10136:17;10123:31;10174:18;10166:6;10163:30;10160:2;;;-1:-1;;10196:12;10160:2;10234:106;10332:7;10323:6;10312:9;10308:22;10234:106;:::i;:::-;10216:124;;;;-1:-1;10034:322;-1:-1;;;;10034:322::o;10363:471::-;;;10539:2;10527:9;10518:7;10514:23;10510:32;10507:2;;;-1:-1;;10545:12;10507:2;10603:17;10590:31;10641:18;;10633:6;10630:30;10627:2;;;-1:-1;;10663:12;10627:2;10801:6;10790:9;10786:22;;;2624:3;2617:4;2609:6;2605:17;2601:27;2591:2;;-1:-1;;2632:12;2591:2;2675:6;2662:20;10641:18;2694:6;2691:30;2688:2;;;-1:-1;;2724:12;2688:2;2819:3;10539:2;2811:4;2803:6;2799:17;2760:6;2785:32;;2782:41;2779:2;;;-1:-1;;2826:12;2779:2;10539;2756:17;;;;;10683:135;;-1:-1;10501:333;;-1:-1;;;;10501:333::o;10841:235::-;;10942:2;10930:9;10921:7;10917:23;10913:32;10910:2;;;-1:-1;;10948:12;10910:2;3309:6;3296:20;3321:30;3345:5;3321:30;:::i;11083:257::-;;11195:2;11183:9;11174:7;11170:23;11166:32;11163:2;;;-1:-1;;11201:12;11163:2;3444:6;3438:13;3456:30;3480:5;3456:30;:::i;11347:239::-;;11450:2;11438:9;11429:7;11425:23;11421:32;11418:2;;;-1:-1;;11456:12;11418:2;3564:20;;-1:-1;;;;;;83409:78;;88903:34;;88893:2;;-1:-1;;88941:12;12215:470;;;12388:2;12376:9;12367:7;12363:23;12359:32;12356:2;;;-1:-1;;12394:12;12356:2;4159:6;4146:20;4171:59;4224:5;4171:59;:::i;:::-;12446:89;-1:-1;12572:2;12637:22;;4146:20;4171:59;4146:20;4171:59;:::i;12994:576::-;;;;13177:2;13165:9;13156:7;13152:23;13148:32;13145:2;;;-1:-1;;13183:12;13145:2;4349:6;4336:20;4361:60;4415:5;4361:60;:::i;:::-;13235:90;-1:-1;13390:2;13375:18;;13362:32;13414:18;13403:30;;13400:2;;;-1:-1;;13436:12;13400:2;13474:80;13546:7;13537:6;13526:9;13522:22;13474:80;:::i;:::-;13139:431;;13456:98;;-1:-1;13456:98;;-1:-1;;;;13139:431::o;15004:311::-;;15143:2;15131:9;15122:7;15118:23;15114:32;15111:2;;;-1:-1;;15149:12;15111:2;15211:88;15291:7;15267:22;15211:88;:::i;15322:433::-;;;15476:3;15464:9;15455:7;15451:23;15447:33;15444:2;;;-1:-1;;15483:12;15444:2;15545:88;15625:7;15601:22;15545:88;:::i;:::-;15535:98;;15688:51;15731:7;15670:2;15711:9;15707:22;15688:51;:::i;:::-;15678:61;;15438:317;;;;;:::o;15762:241::-;;15866:2;15854:9;15845:7;15841:23;15837:32;15834:2;;;-1:-1;;15872:12;15834:2;-1:-1;6283:20;;15828:175;-1:-1;15828:175::o;16010:263::-;;16125:2;16113:9;16104:7;16100:23;16096:32;16093:2;;;-1:-1;;16131:12;16093:2;-1:-1;6431:13;;16087:186;-1:-1;16087:186::o;16280:1363::-;;;;;;;;16627:3;16615:9;16606:7;16602:23;16598:33;16595:2;;;-1:-1;;16634:12;16595:2;6296:6;6283:20;16686:63;;16786:2;;16829:9;16825:22;6283:20;16794:63;;16894:2;16955:9;16951:22;4751:20;4776:51;4821:5;4776:51;:::i;:::-;16902:81;-1:-1;17020:2;17084:22;;5110:20;5135:58;5110:20;5135:58;:::i;:::-;17028:88;-1:-1;17153:3;17219:22;;4146:20;4171:59;4146:20;4171:59;:::i;:::-;17162:89;-1:-1;17288:3;17349:22;;4927:20;4952:54;4927:20;4952:54;:::i;:::-;17297:84;-1:-1;17446:3;17431:19;;17418:33;17471:18;17460:30;;17457:2;;;-1:-1;;17493:12;17457:2;17595:22;;1755:4;1743:17;;1739:27;-1:-1;1729:2;;-1:-1;;1770:12;1729:2;1817:6;1804:20;1839:106;1854:90;1937:6;1854:90;:::i;1839:106::-;1973:21;;;2030:14;;;;2005:17;;;2119;;;2110:27;;;;2107:36;-1:-1;2104:2;;;-1:-1;;2146:12;2104:2;-1:-1;2172:10;;2166:232;2191:6;2188:1;2185:13;2166:232;;;4159:6;4146:20;4171:59;4224:5;4171:59;:::i;:::-;2259:76;;2213:1;2206:9;;;;;2349:14;;;;2377;;2166:232;;;2170:14;17513:114;;;;;;;;16589:1054;;;;;;;;;;:::o;17650:1175::-;;;;;;;;17946:3;17934:9;17925:7;17921:23;17917:33;17914:2;;;-1:-1;;17953:12;17914:2;6296:6;6283:20;18005:63;;18105:2;18148:9;18144:22;6283:20;18113:63;;18213:2;18274:9;18270:22;4751:20;4776:51;4821:5;4776:51;:::i;:::-;18221:81;-1:-1;18339:2;18403:22;;5110:20;5135:58;5110:20;5135:58;:::i;:::-;18347:88;-1:-1;18472:3;18538:22;;4146:20;4171:59;4146:20;4171:59;:::i;:::-;18481:89;-1:-1;18607:3;18668:22;;4927:20;4952:54;4927:20;4952:54;:::i;:::-;18616:84;;;;18737:3;18781:9;18777:22;6283:20;18746:63;;17908:917;;;;;;;;;;:::o;18832:239::-;;18935:2;18923:9;18914:7;18910:23;18906:32;18903:2;;;-1:-1;;18941:12;18903:2;6573:6;6560:20;6585:32;6611:5;6585:32;:::i;19078:395::-;;;19208:2;19196:9;19187:7;19183:23;19179:32;19176:2;;;-1:-1;;19214:12;19176:2;6712:6;6706:13;6724:32;6750:5;6724:32;:::i;:::-;19376:2;19425:22;;6706:13;19266:73;;-1:-1;6724:32;6706:13;6724:32;:::i;45048:643::-;45269:23;;-1:-1;;;;;84802:54;20461:37;;45446:4;45435:16;;;45429:23;84721:6;84710:18;45504:14;;;46496:36;45599:4;45588:16;;;45582:23;85113:4;85102:16;45655:14;;47353:35;45174:517::o;47514:271::-;;25671:5;80573:12;25782:52;25827:6;25822:3;25815:4;25808:5;25804:16;25782:52;:::i;:::-;25846:16;;;;;47648:137;-1:-1;;47648:137::o;47792:253::-;46722:37;;;48017:2;48008:12;;47908:137::o;48052:222::-;-1:-1;;;;;84802:54;;;;20461:37;;48179:2;48164:18;;48150:124::o;48281:333::-;-1:-1;;;;;84802:54;;;20461:37;;84802:54;;48600:2;48585:18;;20461:37;48436:2;48421:18;;48407:207::o;48621:586::-;-1:-1;;;;;84802:54;;;20461:37;;84802:54;;49015:2;49000:18;;;20461:37;;;;48851:2;49052;49037:18;;49030:48;;;81213:12;;48836:18;;;82264:19;;;-1:-1;80400:14;;;80429:18;;;-1:-1;;80429:18;;82304:14;;;;49015:2;-1:-1;24965:288;24990:6;24987:1;24984:13;24965:288;;;88364:11;;46722:37;;25012:1;82119:14;;;;20372;;;;25005:9;24965:288;;;-1:-1;49084:113;;48822:385;-1:-1;;;;;;;;48822:385::o;49214:444::-;-1:-1;;;;;84802:54;;;20461:37;;84802:54;;;;49561:2;49546:18;;20461:37;49644:2;49629:18;;46722:37;;;;49397:2;49382:18;;49368:290::o;49665:556::-;-1:-1;;;;;84802:54;;;20461:37;;84802:54;;;50041:2;50026:18;;20461:37;50124:2;50109:18;;46722:37;;;;84802:54;;;50207:2;50192:18;;20461:37;49876:3;49861:19;;49847:374::o;50228:333::-;-1:-1;;;;;84802:54;;;;20461:37;;50547:2;50532:18;;46722:37;50383:2;50368:18;;50354:207::o;50568:444::-;-1:-1;;;;;84802:54;;;20461:37;;50915:2;50900:18;;46722:37;;;;84802:54;;;50998:2;50983:18;;20461:37;50751:2;50736:18;;50722:290::o;51019:556::-;-1:-1;;;;;84802:54;;;20461:37;;51395:2;51380:18;;46722:37;;;;84802:54;;;51478:2;51463:18;;20461:37;84802:54;;;51561:2;51546:18;;20461:37;51230:3;51215:19;;51201:374::o;51582:370::-;51759:2;51773:47;;;80573:12;;51744:18;;;82264:19;;;51582:370;;51759:2;79712:14;;;;82304;;;;51582:370;21069:260;21094:6;21091:1;21088:13;21069:260;;;21155:13;;-1:-1;;;;;84802:54;20461:37;;81601:14;;;;19634;;;;-1:-1;21109:9;21069:260;;;-1:-1;51826:116;;51730:222;-1:-1;;;;;;51730:222::o;51959:510::-;52206:2;52220:47;;;80573:12;;52191:18;;;82264:19;;;51959:510;;52206:2;79712:14;;;;82304;;;;51959:510;22905:365;22930:6;22927:1;22924:13;22905:365;;;20054:116;20166:3;22997:6;22991:13;20054:116;:::i;:::-;81601:14;;;;20199:4;20190:14;;;;;22952:1;22945:9;22905:365;;52476:390;52663:2;52677:47;;;52648:18;;82264:19;;;-1:-1;;;;;;23579:78;;23576:2;;;-1:-1;;23660:12;23576:2;52663;23695:6;23691:17;87645:6;87640:3;82304:14;52652:9;82304:14;87622:30;87683:16;;;;82304:14;87683:16;87676:27;;;87683:16;52634:232;-1:-1;;52634:232::o;52873:370::-;53050:2;53064:47;;;80573:12;;53035:18;;;82264:19;;;52873:370;;53050:2;79712:14;;;;82304;;;;52873:370;24245:260;24270:6;24267:1;24264:13;24245:260;;;24331:13;;46722:37;;81601:14;;;;20372;;;;24292:1;24285:9;24245:260;;53250:210;83322:13;;83315:21;25348:34;;53371:2;53356:18;;53342:118::o;53467:218::-;-1:-1;;;;;;83409:78;;;;25463:36;;53592:2;53577:18;;53563:122::o;55709:310::-;;55856:2;55877:17;55870:47;27539:5;80573:12;82276:6;55856:2;55845:9;55841:18;82264:19;27633:52;27678:6;82304:14;55845:9;82304:14;55856:2;27659:5;27655:16;27633:52;:::i;:::-;88472:7;88456:14;-1:-1;;88452:28;27697:39;;;;82304:14;27697:39;;55827:192;-1:-1;;55827:192::o;56026:416::-;56226:2;56240:47;;;27973:2;56211:18;;;82264:19;28009:34;82304:14;;;27989:55;-1:-1;;;28064:12;;;28057:28;28104:12;;;56197:245::o;56449:416::-;56649:2;56663:47;;;28355:2;56634:18;;;82264:19;28391:34;82304:14;;;28371:55;-1:-1;;;28446:12;;;28439:36;28494:12;;;56620:245::o;56872:416::-;57072:2;57086:47;;;28745:2;57057:18;;;82264:19;-1:-1;;;82304:14;;;28761:38;28818:12;;;57043:245::o;57295:416::-;57495:2;57509:47;;;29069:2;57480:18;;;82264:19;-1:-1;;;82304:14;;;29085:42;29146:12;;;57466:245::o;57718:416::-;57918:2;57932:47;;;29397:2;57903:18;;;82264:19;29433:34;82304:14;;;29413:55;-1:-1;;;29488:12;;;29481:35;29535:12;;;57889:245::o;58141:416::-;58341:2;58355:47;;;29786:2;58326:18;;;82264:19;29822:34;82304:14;;;29802:55;-1:-1;;;29877:12;;;29870:30;29919:12;;;58312:245::o;58564:416::-;58764:2;58778:47;;;30170:2;58749:18;;;82264:19;30206:34;82304:14;;;30186:55;-1:-1;;;30261:12;;;30254:36;30309:12;;;58735:245::o;58987:416::-;59187:2;59201:47;;;30560:2;59172:18;;;82264:19;30596:29;82304:14;;;30576:50;30645:12;;;59158:245::o;59410:416::-;59610:2;59624:47;;;30896:2;59595:18;;;82264:19;30932:34;82304:14;;;30912:55;-1:-1;;;30987:12;;;30980:34;31033:12;;;59581:245::o;59833:416::-;60033:2;60047:47;;;31284:2;60018:18;;;82264:19;31320:34;82304:14;;;31300:55;-1:-1;;;31375:12;;;31368:32;31419:12;;;60004:245::o;60256:416::-;60456:2;60470:47;;;31670:2;60441:18;;;82264:19;31706:34;82304:14;;;31686:55;-1:-1;;;;31761:12;;31754:44;31817:12;;;60427:245::o;60679:416::-;60879:2;60893:47;;;32068:2;60864:18;;;82264:19;32104:34;82304:14;;;32084:55;-1:-1;;;32159:12;;;32152:29;32200:12;;;60850:245::o;61102:416::-;61302:2;61316:47;;;32451:2;61287:18;;;82264:19;32487:34;82304:14;;;32467:55;-1:-1;;;32542:12;;;32535:30;32584:12;;;61273:245::o;61525:416::-;61725:2;61739:47;;;32835:2;61710:18;;;82264:19;32871:32;82304:14;;;32851:53;32923:12;;;61696:245::o;61948:416::-;62148:2;62162:47;;;33174:2;62133:18;;;82264:19;33210:34;82304:14;;;33190:55;-1:-1;;;33265:12;;;33258:33;33310:12;;;62119:245::o;62371:416::-;62571:2;62585:47;;;33561:2;62556:18;;;82264:19;33597:34;82304:14;;;33577:55;-1:-1;;;33652:12;;;33645:30;33694:12;;;62542:245::o;62794:416::-;62994:2;63008:47;;;33945:2;62979:18;;;82264:19;33981:34;82304:14;;;33961:55;-1:-1;;;34036:12;;;34029:26;34074:12;;;62965:245::o;63217:416::-;63417:2;63431:47;;;34325:2;63402:18;;;82264:19;34361:28;82304:14;;;34341:49;34409:12;;;63388:245::o;63640:416::-;63840:2;63854:47;;;34660:2;63825:18;;;82264:19;34696:34;82304:14;;;34676:55;-1:-1;;;34751:12;;;34744:30;34793:12;;;63811:245::o;64063:416::-;64263:2;64277:47;;;35044:2;64248:18;;;82264:19;35080:34;82304:14;;;35060:55;-1:-1;;;35135:12;;;35128:33;35180:12;;;64234:245::o;64486:416::-;64686:2;64700:47;;;35431:2;64671:18;;;82264:19;35467:34;82304:14;;;35447:55;-1:-1;;;35522:12;;;35515:27;35561:12;;;64657:245::o;64909:416::-;65109:2;65123:47;;;35812:2;65094:18;;;82264:19;35848:34;82304:14;;;35828:55;-1:-1;;;35903:12;;;35896:38;35953:12;;;65080:245::o;65332:416::-;65532:2;65546:47;;;36204:2;65517:18;;;82264:19;36240:34;82304:14;;;36220:55;-1:-1;;;36295:12;;;36288:30;36337:12;;;65503:245::o;65755:416::-;65955:2;65969:47;;;65940:18;;;82264:19;36624:34;82304:14;;;36604:55;36678:12;;;65926:245::o;66178:416::-;66378:2;66392:47;;;36929:2;66363:18;;;82264:19;36965:34;82304:14;;;36945:55;-1:-1;;;37020:12;;;37013:35;37067:12;;;66349:245::o;66601:416::-;66801:2;66815:47;;;37318:2;66786:18;;;82264:19;37354:33;82304:14;;;37334:54;37407:12;;;66772:245::o;67024:416::-;67224:2;67238:47;;;37658:2;67209:18;;;82264:19;37694:34;82304:14;;;37674:55;-1:-1;;;37749:12;;;37742:25;37786:12;;;67195:245::o;67447:416::-;67647:2;67661:47;;;67632:18;;;82264:19;38073:34;82304:14;;;38053:55;38127:12;;;67618:245::o;67870:416::-;68070:2;68084:47;;;38378:2;68055:18;;;82264:19;-1:-1;;;82304:14;;;38394:35;38448:12;;;68041:245::o;68293:416::-;68493:2;68507:47;;;38699:2;68478:18;;;82264:19;38735:34;82304:14;;;38715:55;-1:-1;;;38790:12;;;38783:43;38845:12;;;68464:245::o;68716:416::-;68916:2;68930:47;;;39096:2;68901:18;;;82264:19;39132:34;82304:14;;;39112:55;-1:-1;;;39187:12;;;39180:41;39240:12;;;68887:245::o;69139:416::-;69339:2;69353:47;;;39491:2;69324:18;;;82264:19;39527:34;82304:14;;;39507:55;-1:-1;;;39582:12;;;39575:35;39629:12;;;69310:245::o;69562:416::-;69762:2;69776:47;;;39880:2;69747:18;;;82264:19;-1:-1;;;82304:14;;;39896:36;39951:12;;;69733:245::o;69985:416::-;70185:2;70199:47;;;40202:2;70170:18;;;82264:19;40238:34;82304:14;;;40218:55;-1:-1;;;40293:12;;;40286:30;40335:12;;;70156:245::o;70408:416::-;70608:2;70622:47;;;40586:2;70593:18;;;82264:19;40622:31;82304:14;;;40602:52;40673:12;;;70579:245::o;70831:416::-;71031:2;71045:47;;;40924:2;71016:18;;;82264:19;40960:34;82304:14;;;40940:55;-1:-1;;;41015:12;;;41008:39;41066:12;;;71002:245::o;71254:416::-;71454:2;71468:47;;;41317:2;71439:18;;;82264:19;41353:34;82304:14;;;41333:55;-1:-1;;;41408:12;;;41401:29;41449:12;;;71425:245::o;71677:416::-;71877:2;71891:47;;;41700:2;71862:18;;;82264:19;41736:34;82304:14;;;41716:55;-1:-1;;;41791:12;;;41784:34;41837:12;;;71848:245::o;72100:416::-;72300:2;72314:47;;;42088:2;72285:18;;;82264:19;42124:34;82304:14;;;42104:55;-1:-1;;;42179:12;;;42172:43;42234:12;;;72271:245::o;72523:416::-;72723:2;72737:47;;;42485:2;72708:18;;;82264:19;42521:34;82304:14;;;42501:55;-1:-1;;;42576:12;;;42569:46;42634:12;;;72694:245::o;72946:416::-;73146:2;73160:47;;;42885:2;73131:18;;;82264:19;42921:34;82304:14;;;42901:55;-1:-1;;;42976:12;;;42969:30;43018:12;;;73117:245::o;73369:416::-;73569:2;73583:47;;;43269:2;73554:18;;;82264:19;43305:34;82304:14;;;43285:55;-1:-1;;;43360:12;;;43353:27;43399:12;;;73540:245::o;73792:416::-;73992:2;74006:47;;;43650:2;73977:18;;;82264:19;43686:34;82304:14;;;43666:55;-1:-1;;;43741:12;;;43734:30;43783:12;;;73963:245::o;74215:416::-;74415:2;74429:47;;;44034:2;74400:18;;;82264:19;44070:34;82304:14;;;44050:55;-1:-1;;;44125:12;;;44118:36;44173:12;;;74386:245::o;74638:416::-;74838:2;74852:47;;;44424:2;74823:18;;;82264:19;44460:34;82304:14;;;44440:55;-1:-1;;;44515:12;;;44508:31;44558:12;;;74809:245::o;75061:416::-;75261:2;75275:47;;;44809:2;75246:18;;;82264:19;44845:34;82304:14;;;44825:55;-1:-1;;;44900:12;;;44893:31;44943:12;;;75232:245::o;75484:362::-;75681:2;75666:18;;75695:141;75670:9;75809:6;75695:141;:::i;75853:432::-;84721:6;84710:18;;;;46496:36;;85113:4;85102:16;;;;76188:2;76173:18;;47353:35;76271:2;76256:18;;46722:37;76030:2;76015:18;;76001:284::o;76292:428::-;84721:6;84710:18;;;;46496:36;;85113:4;85102:16;;;76625:2;76610:18;;47353:35;85102:16;76706:2;76691:18;;47236:48;76467:2;76452:18;;76438:282::o;76956:333::-;46722:37;;;77275:2;77260:18;;46722:37;77111:2;77096:18;;77082:207::o;77296:1124::-;46722:37;;;77876:2;77861:18;;;46722:37;;;-1:-1;;;;;84802:54;;;77984:2;77969:18;;25982:87;84802:54;;;78093:2;78078:18;;25982:87;84802:54;;;78197:3;78182:19;;25982:87;77711:3;-1:-1;78220:19;;78213:49;;;80573:12;;77696:19;;;82264;;;-1:-1;;79712:14;;;;77876:2;;82304:14;;;;-1:-1;21895:312;21920:6;21917:1;21914:13;21895:312;;;21981:13;;84802:54;;20461:37;;81601:14;;;;19868;;;;21942:1;21935:9;21895:312;;;-1:-1;78268:142;;77682:738;-1:-1;;;;;;;;;;;;77682:738::o;78427:218::-;85019:10;85008:22;;;;47119:36;;78552:2;78537:18;;78523:122::o;78652:256::-;78714:2;78708:9;78740:17;;;78815:18;78800:34;;78836:22;;;78797:62;78794:2;;;78872:1;;78862:12;78794:2;78714;78881:22;78692:216;;-1:-1;78692:216::o;78915:338::-;;79108:18;79100:6;79097:30;79094:2;;;-1:-1;;79130:12;79094:2;-1:-1;79175:4;79163:17;;;79228:15;;79031:222::o;87718:268::-;87783:1;87790:101;87804:6;87801:1;87798:13;87790:101;;;87871:11;;;87865:18;87852:11;;;87845:39;87826:2;87819:10;87790:101;;;87906:6;87903:1;87900:13;87897:2;;;-1:-1;;87783:1;87953:16;;87946:27;87767:219::o;88603:117::-;-1:-1;;;;;84802:54;;88662:35;;88652:2;;88711:1;;88701:12;88727:111;88808:5;83322:13;83315:21;88786:5;88783:32;88773:2;;88829:1;;88819:12;90865:115;85019:10;90950:5;85008:22;90926:5;90923:34;90913:2;;90971:1;;90961:12"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "4700600",
                "executionCost": "5516",
                "totalCost": "4706116"
              },
              "external": {
                "VERSION()": "infinite",
                "addExternalErc20Award(address)": "infinite",
                "addExternalErc20Awards(address[])": "infinite",
                "addExternalErc721Award(address,uint256[])": "infinite",
                "beforeAwardListener()": "1184",
                "beforeTokenMint(address,uint256,address,address)": "infinite",
                "beforeTokenTransfer(address,address,uint256,address)": "infinite",
                "blocklistRetryCount()": "1164",
                "calculateNextPrizePeriodStartTime(uint256)": "infinite",
                "canCompleteAward()": "infinite",
                "canStartAward()": "infinite",
                "cancelAward()": "infinite",
                "carryOverBlocklist()": "1107",
                "completeAward()": "infinite",
                "currentPrize()": "infinite",
                "currentTime()": "1095",
                "distribute(uint256)": "infinite",
                "estimateRemainingBlocksToPrize(uint256)": "infinite",
                "getExternalErc20Awards()": "infinite",
                "getExternalErc721AwardTokenIds(address)": "infinite",
                "getExternalErc721Awards()": "infinite",
                "getLastRngLockBlock()": "1147",
                "getLastRngRequestId()": "1181",
                "initialize(uint256,uint256,address,address,address,address,address[])": "infinite",
                "initializeMultipleWinners(uint256,uint256,address,address,address,address,uint256)": "infinite",
                "isBlocklisted(address)": "1326",
                "isPrizePeriodOver()": "infinite",
                "isRngCompleted()": "infinite",
                "isRngRequested()": "1116",
                "isRngTimedOut()": "infinite",
                "numberOfWinners()": "1118",
                "owner()": "1204",
                "periodicPrizeStrategyListener()": "1137",
                "prizePeriodEndAt()": "infinite",
                "prizePeriodRemainingSeconds()": "infinite",
                "prizePeriodSeconds()": "1140",
                "prizePeriodStartedAt()": "1161",
                "prizePool()": "1181",
                "prizeSplit(uint256)": "2468",
                "prizeSplits()": "infinite",
                "removeExternalErc20Award(address,address)": "infinite",
                "removeExternalErc721Award(address,address)": "infinite",
                "renounceOwnership()": "24341",
                "rng()": "1181",
                "rngRequestTimeout()": "1179",
                "setBeforeAwardListener(address)": "infinite",
                "setBlocklistRetryCount(uint256)": "24208",
                "setBlocklisted(address,bool)": "infinite",
                "setCarryBlocklist(bool)": "infinite",
                "setCurrentTime(uint256)": "20337",
                "setNumberOfWinners(uint256)": "infinite",
                "setPeriodicPrizeStrategyListener(address)": "infinite",
                "setPrizePeriodSeconds(uint256)": "infinite",
                "setPrizeSplit((address,uint16,uint8),uint8)": "infinite",
                "setPrizeSplits((address,uint16,uint8)[])": "infinite",
                "setRngRequestTimeout(uint32)": "infinite",
                "setRngService(address)": "infinite",
                "setSplitExternalErc20Awards(bool)": "infinite",
                "setTokenListener(address)": "infinite",
                "splitExternalErc20Awards()": "1129",
                "sponsorship()": "1161",
                "startAward()": "infinite",
                "supportsInterface(bytes4)": "550",
                "ticket()": "1182",
                "tokenListener()": "1138",
                "transferOwnership(address)": "24572"
              },
              "internal": {
                "_currentTime()": "815"
              }
            },
            "methodIdentifiers": {
              "VERSION()": "ffa1ad74",
              "addExternalErc20Award(address)": "4e5d08e0",
              "addExternalErc20Awards(address[])": "66968221",
              "addExternalErc721Award(address,uint256[])": "c48ddbcb",
              "beforeAwardListener()": "0d847fc4",
              "beforeTokenMint(address,uint256,address,address)": "4d7f3db0",
              "beforeTokenTransfer(address,address,uint256,address)": "b2210957",
              "blocklistRetryCount()": "0faf125f",
              "calculateNextPrizePeriodStartTime(uint256)": "47bed998",
              "canCompleteAward()": "6a74f107",
              "canStartAward()": "876f5c7e",
              "cancelAward()": "4c169f4f",
              "carryOverBlocklist()": "6f46f221",
              "completeAward()": "dfb2f13b",
              "currentPrize()": "c42b42a0",
              "currentTime()": "d18e81b3",
              "distribute(uint256)": "91c05b0b",
              "estimateRemainingBlocksToPrize(uint256)": "01b48e34",
              "getExternalErc20Awards()": "62c77a61",
              "getExternalErc721AwardTokenIds(address)": "9417783f",
              "getExternalErc721Awards()": "42d09209",
              "getLastRngLockBlock()": "6bea5344",
              "getLastRngRequestId()": "2a7ad609",
              "initialize(uint256,uint256,address,address,address,address,address[])": "f97700e2",
              "initializeMultipleWinners(uint256,uint256,address,address,address,address,uint256)": "7f2be9fc",
              "isBlocklisted(address)": "8e204c43",
              "isPrizePeriodOver()": "95e5f9ee",
              "isRngCompleted()": "4aba4f6b",
              "isRngRequested()": "111070e4",
              "isRngTimedOut()": "738bbea8",
              "numberOfWinners()": "8acfaca9",
              "owner()": "8da5cb5b",
              "periodicPrizeStrategyListener()": "c2f19ee8",
              "prizePeriodEndAt()": "2c8fe73d",
              "prizePeriodRemainingSeconds()": "d5ad6bf6",
              "prizePeriodSeconds()": "94144c6b",
              "prizePeriodStartedAt()": "72f33ea9",
              "prizePool()": "719ce73e",
              "prizeSplit(uint256)": "eefc8ad1",
              "prizeSplits()": "8d5f10c4",
              "removeExternalErc20Award(address,address)": "b0244682",
              "removeExternalErc721Award(address,address)": "671137c4",
              "renounceOwnership()": "715018a6",
              "rng()": "d605787b",
              "rngRequestTimeout()": "acca5b95",
              "setBeforeAwardListener(address)": "30fcdf41",
              "setBlocklistRetryCount(uint256)": "52a30109",
              "setBlocklisted(address,bool)": "152d308c",
              "setCarryBlocklist(bool)": "a4e075ca",
              "setCurrentTime(uint256)": "22f8e566",
              "setNumberOfWinners(uint256)": "6dfb0386",
              "setPeriodicPrizeStrategyListener(address)": "8aa3ec6f",
              "setPrizePeriodSeconds(uint256)": "884a4448",
              "setPrizeSplit((address,uint16,uint8),uint8)": "fbf0953e",
              "setPrizeSplits((address,uint16,uint8)[])": "c25a9c32",
              "setRngRequestTimeout(uint32)": "c6853270",
              "setRngService(address)": "7f4296d7",
              "setSplitExternalErc20Awards(bool)": "38a9b4b6",
              "setTokenListener(address)": "605e25ac",
              "splitExternalErc20Awards()": "9dafafb0",
              "sponsorship()": "500db70d",
              "startAward()": "b9ee1e05",
              "supportsInterface(bytes4)": "01ffc9a7",
              "ticket()": "6cc25db7",
              "tokenListener()": "6be51c4f",
              "transferOwnership(address)": "f2fde38b"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract BeforeAwardListenerInterface\",\"name\":\"beforeAwardListener\",\"type\":\"address\"}],\"name\":\"BeforeAwardListenerSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"carry\",\"type\":\"bool\"}],\"name\":\"BlocklistCarrySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"name\":\"BlocklistRetryCountSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isBlocked\",\"type\":\"bool\"}],\"name\":\"BlocklistSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"externalErc20\",\"type\":\"address\"}],\"name\":\"ExternalErc20AwardAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"externalErc20Award\",\"type\":\"address\"}],\"name\":\"ExternalErc20AwardRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"externalErc721\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"ExternalErc721AwardAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"externalErc721Award\",\"type\":\"address\"}],\"name\":\"ExternalErc721AwardRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"prizePeriodStart\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"prizePeriodSeconds\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"contract PrizePool\",\"name\":\"prizePool\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract TicketInterface\",\"name\":\"ticket\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"sponsorship\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract RNGInterface\",\"name\":\"rng\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract IERC20Upgradeable[]\",\"name\":\"externalErc20Awards\",\"type\":\"address[]\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"NoWinners\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"numberOfWinners\",\"type\":\"uint256\"}],\"name\":\"NumberOfWinnersSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract PeriodicPrizeStrategyListenerInterface\",\"name\":\"periodicPrizeStrategyListener\",\"type\":\"address\"}],\"name\":\"PeriodicPrizeStrategyListenerSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"prizePeriodSeconds\",\"type\":\"uint256\"}],\"name\":\"PrizePeriodSecondsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"prizePool\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"rngRequestId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"rngLockBlock\",\"type\":\"uint32\"}],\"name\":\"PrizePoolAwardCancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"prizePool\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"rngRequestId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"rngLockBlock\",\"type\":\"uint32\"}],\"name\":\"PrizePoolAwardStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"randomNumber\",\"type\":\"uint256\"}],\"name\":\"PrizePoolAwarded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"prizePeriodStartedAt\",\"type\":\"uint256\"}],\"name\":\"PrizePoolOpened\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"target\",\"type\":\"uint256\"}],\"name\":\"PrizeSplitRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"PrizeSplitSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"numberOfWinners\",\"type\":\"uint256\"}],\"name\":\"RetryMaxLimitReached\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"RngRequestFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"rngRequestTimeout\",\"type\":\"uint32\"}],\"name\":\"RngRequestTimeoutSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract RNGInterface\",\"name\":\"rngService\",\"type\":\"address\"}],\"name\":\"RngServiceUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"splitExternalErc20Awards\",\"type\":\"bool\"}],\"name\":\"SplitExternalErc20AwardsSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract TokenListenerInterface\",\"name\":\"tokenListener\",\"type\":\"address\"}],\"name\":\"TokenListenerUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_externalErc20\",\"type\":\"address\"}],\"name\":\"addExternalErc20Award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20Upgradeable[]\",\"name\":\"_externalErc20s\",\"type\":\"address[]\"}],\"name\":\"addExternalErc20Awards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"_externalErc721\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"_tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"addExternalErc721Award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"beforeAwardListener\",\"outputs\":[{\"internalType\":\"contract BeforeAwardListenerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"}],\"name\":\"beforeTokenMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"beforeTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"blocklistRetryCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTime\",\"type\":\"uint256\"}],\"name\":\"calculateNextPrizePeriodStartTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"canCompleteAward\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"canStartAward\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancelAward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"carryOverBlocklist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"completeAward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentPrize\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"randomNumber\",\"type\":\"uint256\"}],\"name\":\"distribute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"secondsPerBlockMantissa\",\"type\":\"uint256\"}],\"name\":\"estimateRemainingBlocksToPrize\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExternalErc20Awards\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"_externalErc721\",\"type\":\"address\"}],\"name\":\"getExternalErc721AwardTokenIds\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExternalErc721Awards\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastRngLockBlock\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastRngRequestId\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_prizePeriodStart\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_prizePeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"contract PrizePool\",\"name\":\"_prizePool\",\"type\":\"address\"},{\"internalType\":\"contract TicketInterface\",\"name\":\"_ticket\",\"type\":\"address\"},{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_sponsorship\",\"type\":\"address\"},{\"internalType\":\"contract RNGInterface\",\"name\":\"_rng\",\"type\":\"address\"},{\"internalType\":\"contract IERC20Upgradeable[]\",\"name\":\"externalErc20Awards\",\"type\":\"address[]\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_prizePeriodStart\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_prizePeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"contract PrizePool\",\"name\":\"_prizePool\",\"type\":\"address\"},{\"internalType\":\"contract TicketInterface\",\"name\":\"_ticket\",\"type\":\"address\"},{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_sponsorship\",\"type\":\"address\"},{\"internalType\":\"contract RNGInterface\",\"name\":\"_rng\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_numberOfWinners\",\"type\":\"uint256\"}],\"name\":\"initializeMultipleWinners\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isBlocklisted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPrizePeriodOver\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isRngCompleted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isRngRequested\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isRngTimedOut\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"numberOfWinners\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"periodicPrizeStrategyListener\",\"outputs\":[{\"internalType\":\"contract PeriodicPrizeStrategyListenerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizePeriodEndAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizePeriodRemainingSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizePeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizePeriodStartedAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizePool\",\"outputs\":[{\"internalType\":\"contract PrizePool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"prizeSplitIndex\",\"type\":\"uint256\"}],\"name\":\"prizeSplit\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"}],\"internalType\":\"struct PrizeSplit.PrizeSplitConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizeSplits\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"}],\"internalType\":\"struct PrizeSplit.PrizeSplitConfig[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_externalErc20\",\"type\":\"address\"},{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_prevExternalErc20\",\"type\":\"address\"}],\"name\":\"removeExternalErc20Award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"_externalErc721\",\"type\":\"address\"},{\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"_prevExternalErc721\",\"type\":\"address\"}],\"name\":\"removeExternalErc721Award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rng\",\"outputs\":[{\"internalType\":\"contract RNGInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rngRequestTimeout\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract BeforeAwardListenerInterface\",\"name\":\"_beforeAwardListener\",\"type\":\"address\"}],\"name\":\"setBeforeAwardListener\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"setBlocklistRetryCount\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_isBlocked\",\"type\":\"bool\"}],\"name\":\"setBlocklisted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_carry\",\"type\":\"bool\"}],\"name\":\"setCarryBlocklist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_currentTime\",\"type\":\"uint256\"}],\"name\":\"setCurrentTime\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"name\":\"setNumberOfWinners\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract PeriodicPrizeStrategyListenerInterface\",\"name\":\"_periodicPrizeStrategyListener\",\"type\":\"address\"}],\"name\":\"setPeriodicPrizeStrategyListener\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_prizePeriodSeconds\",\"type\":\"uint256\"}],\"name\":\"setPrizePeriodSeconds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"}],\"internalType\":\"struct PrizeSplit.PrizeSplitConfig\",\"name\":\"prizeStrategySplit\",\"type\":\"tuple\"},{\"internalType\":\"uint8\",\"name\":\"prizeSplitIndex\",\"type\":\"uint8\"}],\"name\":\"setPrizeSplit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"}],\"internalType\":\"struct PrizeSplit.PrizeSplitConfig[]\",\"name\":\"newPrizeSplits\",\"type\":\"tuple[]\"}],\"name\":\"setPrizeSplits\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_rngRequestTimeout\",\"type\":\"uint32\"}],\"name\":\"setRngRequestTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract RNGInterface\",\"name\":\"rngService\",\"type\":\"address\"}],\"name\":\"setRngService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_splitExternalErc20Awards\",\"type\":\"bool\"}],\"name\":\"setSplitExternalErc20Awards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"_tokenListener\",\"type\":\"address\"}],\"name\":\"setTokenListener\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"splitExternalErc20Awards\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sponsorship\",\"outputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startAward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ticket\",\"outputs\":[{\"internalType\":\"contract TicketInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenListener\",\"outputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addExternalErc20Award(address)\":{\"details\":\"Only the Prize-Strategy owner/creator can assign external tokens, and they must be approved by the Prize-Pool\",\"params\":{\"_externalErc20\":\"The address of an ERC20 token to be awarded\"}},\"addExternalErc721Award(address,uint256[])\":{\"details\":\"Only the Prize-Strategy owner/creator can assign external tokens, and they must be approved by the Prize-Pool NOTE: The NFT must already be owned by the Prize-Pool\",\"params\":{\"_externalErc721\":\"The address of an ERC721 token to be awarded\",\"_tokenIds\":\"An array of token IDs of the ERC721 to be awarded\"}},\"beforeTokenMint(address,uint256,address,address)\":{\"params\":{\"controlledToken\":\"The type of collateral that is being minted\"}},\"beforeTokenTransfer(address,address,uint256,address)\":{\"details\":\"Note that this is only for *transfers*, not mints or burns\",\"params\":{\"controlledToken\":\"The type of collateral that is being sent\"}},\"calculateNextPrizePeriodStartTime(uint256)\":{\"params\":{\"currentTime\":\"The timestamp to use as the current time\"},\"returns\":{\"_0\":\"The timestamp at which the next prize period would start\"}},\"canCompleteAward()\":{\"returns\":{\"_0\":\"True if an award can be completed, false otherwise.\"}},\"canStartAward()\":{\"returns\":{\"_0\":\"True if an award can be started, false otherwise.\"}},\"currentPrize()\":{\"returns\":{\"_0\":\"The current prize size\"}},\"estimateRemainingBlocksToPrize(uint256)\":{\"params\":{\"secondsPerBlockMantissa\":\"The number of seconds per block to use for the calculation.  Should be a fixed point 18 number like Ether.\"},\"returns\":{\"_0\":\"The estimated number of blocks remaining until the prize can be awarded.\"}},\"getExternalErc20Awards()\":{\"returns\":{\"_0\":\"An array of External ERC20 token addresses\"}},\"getExternalErc721AwardTokenIds(address)\":{\"returns\":{\"_0\":\"An array of External ERC721 token addresses\"}},\"getExternalErc721Awards()\":{\"returns\":{\"_0\":\"An array of External ERC721 token addresses\"}},\"getLastRngLockBlock()\":{\"returns\":{\"_0\":\"The block number that the RNG request is locked to\"}},\"getLastRngRequestId()\":{\"returns\":{\"_0\":\"The current Request ID\"}},\"initialize(uint256,uint256,address,address,address,address,address[])\":{\"params\":{\"_prizePeriodSeconds\":\"The duration of the prize period in seconds\",\"_prizePeriodStart\":\"The starting timestamp of the prize period.\",\"_prizePool\":\"The prize pool to award\",\"_rng\":\"The RNG service to use\",\"_sponsorship\":\"The sponsorship token\",\"_ticket\":\"The ticket to use to draw winners\"}},\"isPrizePeriodOver()\":{\"returns\":{\"_0\":\"True if the prize period is over, false otherwise\"}},\"isRngCompleted()\":{\"returns\":{\"_0\":\"True if a random number request has completed, false otherwise.\"}},\"isRngRequested()\":{\"returns\":{\"_0\":\"True if a random number has been requested, false otherwise.\"}},\"numberOfWinners()\":{\"details\":\"Read maximum number of winners per award distribution period from internal __numberOfWinners variable.\",\"returns\":{\"_0\":\"__numberOfWinners The total number of winners per prize award.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"prizePeriodEndAt()\":{\"returns\":{\"_0\":\"The timestamp at which the prize period ends.\"}},\"prizePeriodRemainingSeconds()\":{\"returns\":{\"_0\":\"The number of seconds remaining until the prize can be awarded.\"}},\"prizeSplit(uint256)\":{\"details\":\"Read PrizeSplitConfig struct from _prizeSplits array.\",\"params\":{\"prizeSplitIndex\":\"Index position of PrizeSplitConfig\"},\"returns\":{\"_0\":\"PrizeSplitConfig Single prize split config\"}},\"prizeSplits()\":{\"details\":\"Read all PrizeSplitConfig structs stored in _prizeSplits.\",\"returns\":{\"_0\":\"_prizeSplits Array of PrizeSplitConfig structs\"}},\"removeExternalErc20Award(address,address)\":{\"details\":\"Only the Prize-Strategy owner/creator can remove external tokens\",\"params\":{\"_externalErc20\":\"The address of an ERC20 token to be removed\",\"_prevExternalErc20\":\"The address of the previous ERC20 token in the `externalErc20s` list. If the ERC20 is the first address, then the previous address is the SENTINEL address: 0x0000000000000000000000000000000000000001\"}},\"removeExternalErc721Award(address,address)\":{\"details\":\"Only the Prize-Strategy owner/creator can remove external tokens\",\"params\":{\"_externalErc721\":\"The address of an ERC721 token to be removed\",\"_prevExternalErc721\":\"The address of the previous ERC721 token in the list. If no previous, then pass the SENTINEL address: 0x0000000000000000000000000000000000000001\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setBeforeAwardListener(address)\":{\"details\":\"The listener must implement ERC165 and the BeforeAwardListenerInterface\",\"params\":{\"_beforeAwardListener\":\"The address of the listener contract\"}},\"setBlocklistRetryCount(uint256)\":{\"details\":\"Limits winner selection (ticket.draw) retries to avoid to gas limit reached errors. Increases the probability of not reaching the maximum number of winners if to low.\",\"params\":{\"_count\":\"Number of retry attempts\"}},\"setBlocklisted(address,bool)\":{\"details\":\"Block/unblock a user from winning award in prize distribution by updating the isBlocklisted mapping.\",\"params\":{\"_isBlocked\":\"Blocked Status (true or false) of user\",\"_user\":\"Address of blocked user\"}},\"setCarryBlocklist(bool)\":{\"details\":\"Toggles if the main prize (prizePool.captureAwardBalance) and secondary prizes (LootBox) should be kept for the next draw or evenly distrubted if maximum number of winners is not selected. \",\"params\":{\"_carry\":\"Award carry over status (true or false)\"}},\"setNumberOfWinners(uint256)\":{\"details\":\"Sets maximum number of winners per award distribution period.\",\"params\":{\"count\":\"Number of winners.\"}},\"setPeriodicPrizeStrategyListener(address)\":{\"params\":{\"_periodicPrizeStrategyListener\":\"The address of the listener contract\"}},\"setPrizePeriodSeconds(uint256)\":{\"params\":{\"_prizePeriodSeconds\":\"The new prize period in seconds.  Must be greater than zero.\"}},\"setPrizeSplit((address,uint16,uint8),uint8)\":{\"details\":\"Updates a prize split config by passing a new PrizeSplitConfig struct and current index position. Limited to contract owner.\",\"params\":{\"prizeSplitIndex\":\"Index position of PrizeSplitConfig to update\",\"prizeStrategySplit\":\"PrizeSplitConfig config struct\"}},\"setPrizeSplits((address,uint16,uint8)[])\":{\"details\":\"Set and remove prize split configs by passing a new PrizeSplitConfig structs array. Will remove existing PrizeSplitConfig(s) if passed array length is less than existing _prizeSplits length.\",\"params\":{\"newPrizeSplits\":\"Array of PrizeSplitConfig structs\"}},\"setRngRequestTimeout(uint32)\":{\"params\":{\"_rngRequestTimeout\":\"The RNG request timeout in seconds.\"}},\"setRngService(address)\":{\"params\":{\"rngService\":\"The address of the new RNG service interface\"}},\"setSplitExternalErc20Awards(bool)\":{\"details\":\"Toggle external ERC20 awards for all prize winners. If unset will distribute external ERC20 awards to main winner.\",\"params\":{\"_splitExternalErc20Awards\":\"Toggle splitting external ERC20 awards.\"}},\"setTokenListener(address)\":{\"params\":{\"_tokenListener\":\"A contract that implements the token listener interface.\"}},\"startAward()\":{\"details\":\"The RNG-Request-Fee is expected to be held within this contract before calling this function\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"Creates a minimal proxy to the MultipleWinners prize strategy.  Very cheap to deploy.\",\"version\":1},\"userdoc\":{\"events\":{\"BlocklistCarrySet(bool)\":{\"notice\":\"Emitted when carryOverBlocklist is toggled.\"},\"BlocklistRetryCountSet(uint256)\":{\"notice\":\"Emitted when a new draw retry limit is set.\"},\"BlocklistSet(address,bool)\":{\"notice\":\"Emitted when a user is blocked/unblocked from receiving a prize award.\"},\"NoWinners()\":{\"notice\":\"Emitted when no winner can be selected during the prize distribution. \"},\"NumberOfWinnersSet(uint256)\":{\"notice\":\"Emitted when numberOfWinners is set.\"},\"PrizeSplitRemoved(uint256)\":{\"notice\":\"Emitted when a PrizeSplitConfig config is removed.\"},\"PrizeSplitSet(address,uint16,uint8,uint256)\":{\"notice\":\"Emitted when a PrizeSplitConfig config is added or updated.\"},\"RetryMaxLimitReached(uint256)\":{\"notice\":\"Emitted when the winner selection retry limit is reached during award distribution.\"},\"SplitExternalErc20AwardsSet(bool)\":{\"notice\":\"Emitted when splitExternalErc20Awards is toggled.\"}},\"kind\":\"user\",\"methods\":{\"VERSION()\":{\"notice\":\"Semver Version\"},\"addExternalErc20Award(address)\":{\"notice\":\"Adds an external ERC20 token type as an additional prize that can be awarded\"},\"addExternalErc721Award(address,uint256[])\":{\"notice\":\"Adds an external ERC721 token as an additional prize that can be awarded\"},\"beforeAwardListener()\":{\"notice\":\"A listener that is called before the prize is awarded\"},\"beforeTokenMint(address,uint256,address,address)\":{\"notice\":\"Called by the PrizePool when minting controlled tokens\"},\"beforeTokenTransfer(address,address,uint256,address)\":{\"notice\":\"Called by the PrizePool for transfers of controlled tokens\"},\"calculateNextPrizePeriodStartTime(uint256)\":{\"notice\":\"Calculates when the next prize period will start\"},\"canCompleteAward()\":{\"notice\":\"Returns whether an award process can be completed\"},\"canStartAward()\":{\"notice\":\"Returns whether an award process can be started\"},\"cancelAward()\":{\"notice\":\"Can be called by anyone to unlock the tickets if the RNG has timed out.\"},\"completeAward()\":{\"notice\":\"Completes the award process and awards the winners.  The random number must have been requested and is now available.\"},\"currentPrize()\":{\"notice\":\"Calculates and returns the currently accrued prize\"},\"estimateRemainingBlocksToPrize(uint256)\":{\"notice\":\"Estimates the remaining blocks until the prize given a number of seconds per block\"},\"getExternalErc20Awards()\":{\"notice\":\"Gets the current list of External ERC20 tokens that will be awarded with the current prize\"},\"getExternalErc721AwardTokenIds(address)\":{\"notice\":\"Gets the current list of External ERC721 tokens that will be awarded with the current prize\"},\"getExternalErc721Awards()\":{\"notice\":\"Gets the current list of External ERC721 tokens that will be awarded with the current prize\"},\"getLastRngLockBlock()\":{\"notice\":\"Returns the block number that the current RNG request has been locked to\"},\"getLastRngRequestId()\":{\"notice\":\"Returns the current RNG Request ID\"},\"initialize(uint256,uint256,address,address,address,address,address[])\":{\"notice\":\"Initializes a new strategy\"},\"isPrizePeriodOver()\":{\"notice\":\"Returns whether the prize period is over\"},\"isRngCompleted()\":{\"notice\":\"Returns whether the random number request has completed.\"},\"isRngRequested()\":{\"notice\":\"Returns whether a random number has been requested\"},\"numberOfWinners()\":{\"notice\":\"Maximum number of winners per award distribution period\"},\"periodicPrizeStrategyListener()\":{\"notice\":\"A listener that is called after the prize is awarded\"},\"prizePeriodEndAt()\":{\"notice\":\"Returns the timestamp at which the prize period ends\"},\"prizePeriodRemainingSeconds()\":{\"notice\":\"Returns the number of seconds remaining until the prize can be awarded.\"},\"prizeSplit(uint256)\":{\"notice\":\"Read prize split config from active PrizeSplits.\"},\"prizeSplits()\":{\"notice\":\"Read all prize splits configs.\"},\"removeExternalErc20Award(address,address)\":{\"notice\":\"Removes an external ERC20 token type as an additional prize that can be awarded\"},\"removeExternalErc721Award(address,address)\":{\"notice\":\"Removes an external ERC721 token as an additional prize that can be awarded\"},\"rngRequestTimeout()\":{\"notice\":\"RNG Request Timeout.  In fact, this is really a \\\"complete award\\\" timeout. If the rng completes the award can still be cancelled.\"},\"setBeforeAwardListener(address)\":{\"notice\":\"Allows the owner to set a listener that is triggered immediately before the award is distributed\"},\"setBlocklistRetryCount(uint256)\":{\"notice\":\"Sets the number of attempts for winner selection if a blocked address is chosen.\"},\"setBlocklisted(address,bool)\":{\"notice\":\"Block/unblock a user from winning during prize distribution.\"},\"setCarryBlocklist(bool)\":{\"notice\":\"Toggle if an unawarded prize amount should be kept for the next draw or evenly distrubted to selected winners. \"},\"setNumberOfWinners(uint256)\":{\"notice\":\"Sets maximum number of winners.\"},\"setPeriodicPrizeStrategyListener(address)\":{\"notice\":\"Allows the owner to set a listener for prize strategy callbacks.\"},\"setPrizePeriodSeconds(uint256)\":{\"notice\":\"Allows the owner to set the prize period in seconds.\"},\"setPrizeSplit((address,uint16,uint8),uint8)\":{\"notice\":\"Updates a previously set prize split config.\"},\"setPrizeSplits((address,uint16,uint8)[])\":{\"notice\":\"Set and remove prize split(s) configs.\"},\"setRngRequestTimeout(uint32)\":{\"notice\":\"Allows the owner to set the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\"},\"setRngService(address)\":{\"notice\":\"Sets the RNG service that the Prize Strategy is connected to\"},\"setSplitExternalErc20Awards(bool)\":{\"notice\":\"Toggle external ERC20 awards for all prize winners.\"},\"setTokenListener(address)\":{\"notice\":\"Allows the owner to set the token listener\"},\"startAward()\":{\"notice\":\"Starts the award process by starting random number request.  The prize period must have ended.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/MultipleWinnersHarness.sol\":\"MultipleWinnersHarness\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.6.0;\\n\\n/// @title Random Number Generator Interface\\n/// @notice Provides an interface for requesting random numbers from 3rd-party RNG services (Chainlink VRF, Starkware VDF, etc..)\\ninterface RNGInterface {\\n\\n  /// @notice Emitted when a new request for a random number has been submitted\\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\\n  /// @param sender The indexed address of the sender of the request\\n  event RandomNumberRequested(uint32 indexed requestId, address indexed sender);\\n\\n  /// @notice Emitted when an existing request for a random number has been completed\\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\\n  /// @param randomNumber The random number produced by the 3rd-party service\\n  event RandomNumberCompleted(uint32 indexed requestId, uint256 randomNumber);\\n\\n  /// @notice Gets the last request id used by the RNG service\\n  /// @return requestId The last request id used in the last request\\n  function getLastRequestId() external view returns (uint32 requestId);\\n\\n  /// @notice Gets the Fee for making a Request against an RNG service\\n  /// @return feeToken The address of the token that is used to pay fees\\n  /// @return requestFee The fee required to be paid to make a request\\n  function getRequestFee() external view returns (address feeToken, uint256 requestFee);\\n\\n  /// @notice Sends a request for a random number to the 3rd-party service\\n  /// @dev Some services will complete the request immediately, others may have a time-delay\\n  /// @dev Some services require payment in the form of a token, such as $LINK for Chainlink VRF\\n  /// @return requestId The ID of the request used to get the results of the RNG service\\n  /// @return lockBlock The block number at which the RNG service will start generating time-delayed randomness.  The calling contract\\n  /// should \\\"lock\\\" all activity until the result is available via the `requestId`\\n  function requestRandomNumber() external returns (uint32 requestId, uint32 lockBlock);\\n\\n  /// @notice Checks if the request for randomness from the 3rd-party service has completed\\n  /// @dev For time-delayed requests, this function is used to check/confirm completion\\n  /// @param requestId The ID of the request used to get the results of the RNG service\\n  /// @return isCompleted True if the request has completed and a random number is available, false otherwise\\n  function isRequestComplete(uint32 requestId) external view returns (bool isCompleted);\\n\\n  /// @notice Gets the random number produced by the 3rd-party service\\n  /// @param requestId The ID of the request used to get the results of the RNG service\\n  /// @return randomNum The random number\\n  function randomNumber(uint32 requestId) external returns (uint256 randomNum);\\n}\\n\",\"keccak256\":\"0xf917c68439d7476cd226f475e8fce940e0cf1d32cb0ff12e8537072a07f2b1da\",\"license\":\"GPL-3.0\"},\"contracts/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary Constants {\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC721 = 0x80ac58cd;\\n}\",\"keccak256\":\"0x5dc8f8bda4e9668a9ffae6a941774f849adcb368cc2275fd8a91e6ada8fad7fb\",\"license\":\"GPL-3.0\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../external/compound/ICompLike.sol\\\";\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../reserve/ReserveInterface.sol\\\";\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/TokenListenerLibrary.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\nimport \\\"./PrizePoolInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using SafeERC20Upgradeable for IERC721Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    address reserveRegistry,\\n    uint256 maxExitFeeMantissa\\n  );\\n\\n  /// @dev Event emitted when controlled token is added\\n  event ControlledTokenAdded(\\n    ControlledTokenInterface indexed token\\n  );\\n\\n  /// @dev Emitted when reserve is captured.\\n  event ReserveFeeCaptured(\\n    uint256 amount\\n  );\\n\\n  event AwardCaptured(\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when assets are deposited\\n  event Deposited(\\n    address indexed operator,\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount,\\n    address referrer\\n  );\\n\\n  /// @dev Event emitted when interest is awarded to a winner\\n  event Awarded(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are awarded to a winner\\n  event AwardedExternalERC20(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are transferred out\\n  event TransferredExternalERC20(\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC721s are awarded to a winner\\n  event AwardedExternalERC721(\\n    address indexed winner,\\n    address indexed token,\\n    uint256[] tokenIds\\n  );\\n\\n  /// @dev Event emitted when assets are withdrawn instantly\\n  event InstantWithdrawal(\\n    address indexed operator,\\n    address indexed from,\\n    address indexed token,\\n    uint256 amount,\\n    uint256 redeemed,\\n    uint256 exitFee\\n  );\\n\\n  event ReserveWithdrawal(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when the Liquidity Cap is set\\n  event LiquidityCapSet(\\n    uint256 liquidityCap\\n  );\\n\\n  /// @dev Event emitted when the Credit plan is set\\n  event CreditPlanSet(\\n    address token,\\n    uint128 creditLimitMantissa,\\n    uint128 creditRateMantissa\\n  );\\n\\n  /// @dev Event emitted when the Prize Strategy is set\\n  event PrizeStrategySet(\\n    address indexed prizeStrategy\\n  );\\n\\n  /// @dev Emitted when credit is minted\\n  event CreditMinted(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when credit is burned\\n  event CreditBurned(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\\n  event ErrorAwardingExternalERC721(bytes error);\\n\\n\\n  struct CreditPlan {\\n    uint128 creditLimitMantissa;\\n    uint128 creditRateMantissa;\\n  }\\n\\n  struct CreditBalance {\\n    uint192 balance;\\n    uint32 timestamp;\\n    bool initialized;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  /// @dev Reserve to which reserve fees are sent\\n  RegistryInterface public reserveRegistry;\\n\\n  /// @dev An array of all the controlled tokens\\n  ControlledTokenInterface[] internal _tokens;\\n\\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\\n  TokenListenerInterface public prizeStrategy;\\n\\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\\n  /// For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\\n  uint256 public maxExitFeeMantissa;\\n\\n  /// @dev The total funds that have been allocated to the reserve\\n  uint256 public reserveTotalSupply;\\n\\n  /// @dev The total amount of funds that the prize pool can hold.\\n  uint256 public liquidityCap;\\n\\n  /// @dev the The awardable balance\\n  uint256 internal _currentAwardBalance;\\n\\n  /// @dev Stores the credit plan for each token.\\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\\n\\n  /// @dev Stores each users balance of credit per token.\\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\\n\\n  /// @notice Initializes the Prize Pool\\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\\n  /// @param _maxExitFeeMantissa The maximum exit fee size\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_reserveRegistry) != address(0), \\\"PrizePool/reserveRegistry-not-zero\\\");\\n    uint256 controlledTokensLength = _controlledTokens.length;\\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\\n\\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\\n      _addControlledToken(controlledToken, i);\\n    }\\n    __Ownable_init();\\n    __ReentrancyGuard_init();\\n    _setLiquidityCap(uint256(-1));\\n\\n    reserveRegistry = _reserveRegistry;\\n    maxExitFeeMantissa = _maxExitFeeMantissa;\\n\\n    emit Initialized(\\n      address(_reserveRegistry),\\n      maxExitFeeMantissa\\n    );\\n  }\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external override view returns (address) {\\n    return address(_token());\\n  }\\n\\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\\n  /// @return The underlying balance of assets\\n  function balance() external returns (uint256) {\\n    return _balance();\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function canAwardExternal(address _externalToken) external view returns (bool) {\\n    return _canAwardExternal(_externalToken);\\n  }\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    canAddLiquidity(amount)\\n  {\\n    address operator = _msgSender();\\n\\n    _mint(to, amount, controlledToken, referrer);\\n\\n    _token().safeTransferFrom(operator, address(this), amount);\\n    _supply(amount);\\n\\n    emit Deposited(operator, to, controlledToken, amount, referrer);\\n  }\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    returns (uint256)\\n  {\\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n    require(exitFee <= maximumExitFee, \\\"PrizePool/exit-fee-exceeds-user-maximum\\\");\\n\\n    // burn the credit\\n    _burnCredit(from, controlledToken, burnedCredit);\\n\\n    // burn the tickets\\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\\n\\n    // redeem the tickets less the fee\\n    uint256 amountLessFee = amount.sub(exitFee);\\n    uint256 redeemed = _redeem(amountLessFee);\\n\\n    _token().safeTransfer(from, redeemed);\\n\\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\\n\\n    return exitFee;\\n  }\\n\\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\\n  /// @param exitFee The exit fee to check against the limit\\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\\n    if (exitFee > maxFee) {\\n      exitFee = maxFee;\\n    }\\n    return exitFee;\\n  }\\n\\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\\n  /// @param from The address the tokens are being transferred from (0 if minting)\\n  /// @param to The address the tokens are being transferred to (0 if burning)\\n  /// @param amount The amount of tokens being trasferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\\n    if (from != address(0)) {\\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\\n      // first accrue credit for their old balance\\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\\n\\n      if (from != to) {\\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\\n      }\\n\\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\\n    }\\n    if (to != address(0) && to != from) {\\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\\n    }\\n    // if we aren't minting\\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\\n    }\\n  }\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external override view returns (uint256) {\\n    return _currentAwardBalance;\\n  }\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n\\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\\n    uint256 currentBalance = _balance();\\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\\n\\n    if (unaccountedPrizeBalance > 0) {\\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\\n      if (reserveFee > 0) {\\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\\n        emit ReserveFeeCaptured(reserveFee);\\n      }\\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\\n\\n      emit AwardCaptured(unaccountedPrizeBalance);\\n    }\\n\\n    return _currentAwardBalance;\\n  }\\n\\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\\n\\n    uint256 amount = reserveTotalSupply;\\n    reserveTotalSupply = 0;\\n    uint256 redeemed = _redeem(amount);\\n\\n    _token().safeTransfer(address(to), redeemed);\\n\\n    emit ReserveWithdrawal(to, amount);\\n\\n    return redeemed;\\n  }\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external override\\n    onlyPrizeStrategy\\n    onlyControlledToken(controlledToken)\\n  {\\n    if (amount == 0) {\\n      return;\\n    }\\n\\n    require(amount <= _currentAwardBalance, \\\"PrizePool/award-exceeds-avail\\\");\\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\\n\\n    _mint(to, amount, controlledToken, address(0));\\n\\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\\n\\n    emit Awarded(to, controlledToken, amount);\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit TransferredExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit AwardedExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  function _transferOut(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (bool)\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (amount == 0) {\\n      return false;\\n    }\\n\\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\\n\\n    return true;\\n  }\\n\\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\\n  /// @param to The user who is receiving the tokens\\n  /// @param amount The amount of tokens they are receiving\\n  /// @param controlledToken The token that is going to be minted\\n  /// @param referrer The user who referred the minting\\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\\n    if (address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n    ControlledToken(controlledToken).controllerMint(to, amount);\\n  }\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (tokenIds.length == 0) {\\n      return;\\n    }\\n\\n    for (uint256 i = 0; i < tokenIds.length; i++) {\\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\\n\\n      }\\n      catch(bytes memory error){\\n        emit ErrorAwardingExternalERC721(error);\\n      }\\n      \\n    }\\n\\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\\n  }\\n\\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\\n  /// @param amount The prize amount\\n  /// @return The size of the reserve portion of the prize\\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    if (address(reserve) == address(0)) {\\n      return 0;\\n    }\\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\\n    if (reserveRateMantissa == 0) {\\n      return 0;\\n    }\\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\\n  }\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external override\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    )\\n  {\\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n  }\\n\\n  /// @dev Calculates the early exit fee for the given amount\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return Exit fee\\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\\n    return _limitExitFee(\\n      amount,\\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external override\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    durationSeconds =_estimateCreditAccrualTime(\\n      _controlledToken,\\n      _principal,\\n      _interest\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function _estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    internal\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    // interest = credit rate * principal * time\\n    // => time = interest / (credit rate * principal)\\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\\n    if (accruedPerSecond == 0) {\\n      return 0;\\n    }\\n    return _interest.div(accruedPerSecond);\\n  }\\n\\n  /// @notice Burns a users credit.\\n  /// @param user The user whose credit should be burned\\n  /// @param credit The amount of credit to burn\\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\\n\\n    emit CreditBurned(user, controlledToken, credit);\\n  }\\n\\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\\n  /// @param user The user for whom to accrue credit\\n  /// @param controlledToken The controlled token whose balance we are checking\\n  /// @param controlledTokenBalance The balance to use for the user\\n  /// @param extra Additional credit to be added\\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\\n    _updateCreditBalance(\\n      user,\\n      controlledToken,\\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\\n    );\\n  }\\n\\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\\n    uint256 newBalance;\\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\\n    if (!creditBalance.initialized) {\\n      newBalance = 0;\\n    } else {\\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\\n    }\\n    return newBalance;\\n  }\\n\\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\\n\\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\\n      balance: newBalance.toUint128(),\\n      timestamp: _currentTime().toUint32(),\\n      initialized: true\\n    });\\n\\n    if (oldBalance < newBalance) {\\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\\n    } \\n    else if (newBalance < oldBalance) {\\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\\n    }\\n  }\\n\\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\\n  /// @param creditBalance The new credit balance to be checked\\n  /// @return The users new credit balance.  Will not exceed the credit limit.\\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\\n      controlledTokenBalance,\\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\\n    );\\n    if (creditBalance > creditLimit) {\\n      creditBalance = creditLimit;\\n    }\\n\\n    return creditBalance;\\n  }\\n\\n  /// @notice Calculates the accrued interest for a user\\n  /// @param user The user whose credit should be calculated.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\\n  /// @return The credit that has accrued since the last credit update.\\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\\n\\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\\n      return 0;\\n    }\\n\\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\\n  }\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\\n    return _tokenCreditBalances[controlledToken][user].balance;\\n  }\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external override\\n    onlyControlledToken(_controlledToken)\\n    onlyOwner\\n  {\\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\\n      creditLimitMantissa: _creditLimitMantissa,\\n      creditRateMantissa: _creditRateMantissa\\n    });\\n\\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\\n  }\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external override\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    )\\n  {\\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\\n  }\\n\\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The token they are withdrawing\\n  /// @param amount The amount of funds they are withdrawing\\n  /// @return earlyExitFee The additional exit fee that should be charged.\\n  /// @return creditBurned The amount of credit that will be burned\\n  function _calculateEarlyExitFeeLessBurnedCredit(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (\\n      uint256 earlyExitFee,\\n      uint256 creditBurned\\n    )\\n  {\\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\\n    require(controlledTokenBalance >= amount, \\\"PrizePool/insuff-funds\\\");\\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\\n    /*\\n    The credit is used *last*.  Always charge the fees up-front.\\n\\n    How to calculate:\\n\\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\\n\\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\\n    */\\n\\n    // Determine available usable credit based on withdraw amount\\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\\n\\n    uint256 availableCredit;\\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\\n    }\\n\\n    // Determine amount of credit to burn and amount of fees required\\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\\n    earlyExitFee = totalExitFee.sub(creditBurned);\\n  }\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\\n    _setLiquidityCap(_liquidityCap);\\n  }\\n\\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\\n    liquidityCap = _liquidityCap;\\n    emit LiquidityCapSet(_liquidityCap);\\n  }\\n\\n  /// @notice Adds a new controlled token\\n  /// @param _controlledToken The controlled token to add.\\n  /// @param index The index to add the controlledToken\\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\\n    require(_controlledToken.controller() == this, \\\"PrizePool/token-ctrlr-mismatch\\\");\\n    \\n    _tokens[index] = _controlledToken;\\n    emit ControlledTokenAdded(_controlledToken);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\\n    _setPrizeStrategy(_prizeStrategy);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\\n    require(address(_prizeStrategy) != address(0), \\\"PrizePool/prizeStrategy-not-zero\\\");\\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PrizePool/prizeStrategy-invalid\\\");\\n    prizeStrategy = _prizeStrategy;\\n\\n    emit PrizeStrategySet(address(_prizeStrategy));\\n  }\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\\n    return _tokens;\\n  }\\n\\n  /// @dev Gets the current time as represented by the current block\\n  /// @return The timestamp of the current block\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external override view returns (uint256) {\\n    return _tokenTotalSupply();\\n  }\\n\\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\\n  /// @param to The address to delegate to \\n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\\n    if (compLike.balanceOf(address(this)) > 0) {\\n      compLike.delegate(to);\\n    }\\n  }\\n  \\n  /// @notice Required for ERC721 safe token transfers from smart contracts.\\n  /// @param operator The address that acts on behalf of the owner\\n  /// @param from The current owner of the NFT\\n  /// @param tokenId The NFT to transfer\\n  /// @param data Additional data with no specified format, sent in call to `_to`.\\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function _tokenTotalSupply() internal view returns (uint256) {\\n    uint256 total = reserveTotalSupply;\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \\n    uint256 tokensLength = tokens.length;\\n    \\n    for(uint256 i = 0; i < tokensLength; i++){\\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\\n    }\\n\\n    return total;\\n  }\\n\\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\\n  }\\n\\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\\n    uint256 tokensLength = tokens.length;\\n\\n    for(uint256 i = 0; i < tokensLength; i++) {\\n      if(tokens[i] == controlledToken) return true;\\n    }\\n    return false;\\n  }\\n  \\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\\n    return _isControlled(controlledToken);\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function _token() internal virtual view returns (IERC20Upgradeable);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal virtual returns (uint256);\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal virtual;\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\\n\\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  modifier onlyControlledToken(address controlledToken) {\\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \\\"PrizePool/unknown-token\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure caller is the prize-strategy\\n  modifier onlyPrizeStrategy() {\\n    require(_msgSender() == address(prizeStrategy), \\\"PrizePool/only-prizeStrategy\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\\n  modifier canAddLiquidity(uint256 _amount) {\\n    require(_canAddLiquidity(_amount), \\\"PrizePool/exceeds-liquidity-cap\\\");\\n    _;\\n  }\\n\\n  modifier onlyReserve() {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    require(address(reserve) == msg.sender, \\\"PrizePool/only-reserve\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x386ebc1c80ab4424f14125e716dd12641ff933b475bf1082b7b1a6eee4a969c3\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListener.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./BeforeAwardListenerInterface.sol\\\";\\nimport \\\"../Constants.sol\\\";\\nimport \\\"./BeforeAwardListenerLibrary.sol\\\";\\n\\nabstract contract BeforeAwardListener is BeforeAwardListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == BeforeAwardListenerLibrary.ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER\\n    );\\n  }\\n}\",\"keccak256\":\"0x5da2a7332421d6136d793ef55410c2da63a7fb719e8522697f78ac4c50391505\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @notice The interface for the Periodic Prize Strategy before award listener.  This listener will be called immediately before the award is distributed.\\ninterface BeforeAwardListenerInterface is IERC165Upgradeable {\\n  /// @notice Called immediately before the award is distributed\\n  function beforePrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x96145efe8fc65aff97d11ffaf0905d53baf4b87c4a575a84d691804468f12083\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary BeforeAwardListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforePrizePoolAwarded(uint256,uint256)')) == 0x4cdf9c3e\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER = 0x4cdf9c3e;\\n}\",\"keccak256\":\"0xeac08a7b8e2e7d508a0af89c05c31c36e2b060674d05dfa9a5016cf2d12cf500\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategy.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\\\";\\nimport \\\"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../token/TokenListener.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TicketInterface.sol\\\";\\nimport \\\"../prize-pool/PrizePool.sol\\\";\\nimport \\\"../Constants.sol\\\";\\nimport \\\"./PeriodicPrizeStrategyListenerInterface.sol\\\";\\nimport \\\"./PeriodicPrizeStrategyListenerLibrary.sol\\\";\\nimport \\\"./BeforeAwardListener.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\nabstract contract PeriodicPrizeStrategy is Initializable,\\n                                           OwnableUpgradeable,\\n                                           TokenListener {\\n\\n  using SafeMathUpgradeable for uint256;\\n  using SafeMathUpgradeable for uint16;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using AddressUpgradeable for address;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  uint256 internal constant ETHEREUM_BLOCK_TIME_ESTIMATE_MANTISSA = 13.4 ether;\\n\\n  event PrizePoolOpened(\\n    address indexed operator,\\n    uint256 indexed prizePeriodStartedAt\\n  );\\n\\n  event RngRequestFailed();\\n\\n  event PrizePoolAwardStarted(\\n    address indexed operator,\\n    address indexed prizePool,\\n    uint32 indexed rngRequestId,\\n    uint32 rngLockBlock\\n  );\\n\\n  event PrizePoolAwardCancelled(\\n    address indexed operator,\\n    address indexed prizePool,\\n    uint32 indexed rngRequestId,\\n    uint32 rngLockBlock\\n  );\\n\\n  event PrizePoolAwarded(\\n    address indexed operator,\\n    uint256 randomNumber\\n  );\\n\\n  event RngServiceUpdated(\\n    RNGInterface indexed rngService\\n  );\\n\\n  event TokenListenerUpdated(\\n    TokenListenerInterface indexed tokenListener\\n  );\\n\\n  event RngRequestTimeoutSet(\\n    uint32 rngRequestTimeout\\n  );\\n\\n  event PrizePeriodSecondsUpdated(\\n    uint256 prizePeriodSeconds\\n  );\\n\\n  event BeforeAwardListenerSet(\\n    BeforeAwardListenerInterface indexed beforeAwardListener\\n  );\\n\\n  event PeriodicPrizeStrategyListenerSet(\\n    PeriodicPrizeStrategyListenerInterface indexed periodicPrizeStrategyListener\\n  );\\n\\n  event ExternalErc721AwardAdded(\\n    IERC721Upgradeable indexed externalErc721,\\n    uint256[] tokenIds\\n  );\\n\\n  event ExternalErc20AwardAdded(\\n    IERC20Upgradeable indexed externalErc20\\n  );\\n\\n  event ExternalErc721AwardRemoved(\\n    IERC721Upgradeable indexed externalErc721Award\\n  );\\n\\n  event ExternalErc20AwardRemoved(\\n    IERC20Upgradeable indexed externalErc20Award\\n  );\\n\\n  event Initialized(\\n    uint256 prizePeriodStart,\\n    uint256 prizePeriodSeconds,\\n    PrizePool indexed prizePool,\\n    TicketInterface ticket,\\n    IERC20Upgradeable sponsorship,\\n    RNGInterface rng,\\n    IERC20Upgradeable[] externalErc20Awards\\n  );\\n\\n  struct RngRequest {\\n    uint32 id;\\n    uint32 lockBlock;\\n    uint32 requestedAt;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  // Comptroller\\n  TokenListenerInterface public tokenListener;\\n\\n  // Contract Interfaces\\n  PrizePool public prizePool;\\n  TicketInterface public ticket;\\n  IERC20Upgradeable public sponsorship;\\n  RNGInterface public rng;\\n\\n  // Current RNG Request\\n  RngRequest internal rngRequest;\\n\\n  /// @notice RNG Request Timeout.  In fact, this is really a \\\"complete award\\\" timeout.\\n  /// If the rng completes the award can still be cancelled.\\n  uint32 public rngRequestTimeout;\\n\\n  // Prize period\\n  uint256 public prizePeriodSeconds;\\n  uint256 public prizePeriodStartedAt;\\n\\n  // External tokens awarded as part of prize\\n  MappedSinglyLinkedList.Mapping internal externalErc20s;\\n  MappedSinglyLinkedList.Mapping internal externalErc721s;\\n\\n  // External NFT token IDs to be awarded\\n  //   NFT Address => TokenIds\\n  mapping (IERC721Upgradeable => uint256[]) internal externalErc721TokenIds;\\n\\n  /// @notice A listener that is called before the prize is awarded\\n  BeforeAwardListenerInterface public beforeAwardListener;\\n\\n  /// @notice A listener that is called after the prize is awarded\\n  PeriodicPrizeStrategyListenerInterface public periodicPrizeStrategyListener;\\n\\n  /// @notice Initializes a new strategy\\n  /// @param _prizePeriodStart The starting timestamp of the prize period.\\n  /// @param _prizePeriodSeconds The duration of the prize period in seconds\\n  /// @param _prizePool The prize pool to award\\n  /// @param _ticket The ticket to use to draw winners\\n  /// @param _sponsorship The sponsorship token\\n  /// @param _rng The RNG service to use\\n  function initialize (\\n    uint256 _prizePeriodStart,\\n    uint256 _prizePeriodSeconds,\\n    PrizePool _prizePool,\\n    TicketInterface _ticket,\\n    IERC20Upgradeable _sponsorship,\\n    RNGInterface _rng,\\n    IERC20Upgradeable[] memory externalErc20Awards\\n  ) public initializer {\\n    require(address(_prizePool) != address(0), \\\"PeriodicPrizeStrategy/prize-pool-not-zero\\\");\\n    require(address(_ticket) != address(0), \\\"PeriodicPrizeStrategy/ticket-not-zero\\\");\\n    require(address(_sponsorship) != address(0), \\\"PeriodicPrizeStrategy/sponsorship-not-zero\\\");\\n    require(address(_rng) != address(0), \\\"PeriodicPrizeStrategy/rng-not-zero\\\");\\n    prizePool = _prizePool;\\n    ticket = _ticket;\\n    rng = _rng;\\n    sponsorship = _sponsorship;\\n    _setPrizePeriodSeconds(_prizePeriodSeconds);\\n\\n    __Ownable_init();\\n\\n    externalErc20s.initialize();\\n    for (uint256 i = 0; i < externalErc20Awards.length; i++) {\\n      _addExternalErc20Award(externalErc20Awards[i]);\\n    }\\n\\n    prizePeriodSeconds = _prizePeriodSeconds;\\n    prizePeriodStartedAt = _prizePeriodStart;\\n\\n    externalErc721s.initialize();\\n\\n    // 30 min timeout\\n    _setRngRequestTimeout(1800);\\n\\n    emit Initialized(\\n      _prizePeriodStart,\\n      _prizePeriodSeconds,\\n      _prizePool,\\n      _ticket,\\n      _sponsorship,\\n      _rng,\\n      externalErc20Awards\\n    );\\n    emit PrizePoolOpened(_msgSender(), prizePeriodStartedAt);\\n  }\\n\\n  function _distribute(uint256 randomNumber) internal virtual;\\n\\n  /// @notice Calculates and returns the currently accrued prize\\n  /// @return The current prize size\\n  function currentPrize() public view returns (uint256) {\\n    return prizePool.awardBalance();\\n  }\\n\\n  /// @notice Allows the owner to set the token listener\\n  /// @param _tokenListener A contract that implements the token listener interface.\\n  function setTokenListener(TokenListenerInterface _tokenListener) external onlyOwner requireAwardNotInProgress {\\n    require(address(0) == address(_tokenListener) || address(_tokenListener).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PeriodicPrizeStrategy/token-listener-invalid\\\");\\n\\n    tokenListener = _tokenListener;\\n\\n    emit TokenListenerUpdated(tokenListener);\\n  }\\n\\n  /// @notice Estimates the remaining blocks until the prize given a number of seconds per block\\n  /// @param secondsPerBlockMantissa The number of seconds per block to use for the calculation.  Should be a fixed point 18 number like Ether.\\n  /// @return The estimated number of blocks remaining until the prize can be awarded.\\n  function estimateRemainingBlocksToPrize(uint256 secondsPerBlockMantissa) public view returns (uint256) {\\n    return FixedPoint.divideUintByMantissa(\\n      _prizePeriodRemainingSeconds(),\\n      secondsPerBlockMantissa\\n    );\\n  }\\n\\n  /// @notice Returns the number of seconds remaining until the prize can be awarded.\\n  /// @return The number of seconds remaining until the prize can be awarded.\\n  function prizePeriodRemainingSeconds() external view returns (uint256) {\\n    return _prizePeriodRemainingSeconds();\\n  }\\n\\n  /// @notice Returns the number of seconds remaining until the prize can be awarded.\\n  /// @return The number of seconds remaining until the prize can be awarded.\\n  function _prizePeriodRemainingSeconds() internal view returns (uint256) {\\n    uint256 endAt = _prizePeriodEndAt();\\n    uint256 time = _currentTime();\\n    if (time > endAt) {\\n      return 0;\\n    }\\n    return endAt.sub(time);\\n  }\\n\\n  /// @notice Returns whether the prize period is over\\n  /// @return True if the prize period is over, false otherwise\\n  function isPrizePeriodOver() external view returns (bool) {\\n    return _isPrizePeriodOver();\\n  }\\n\\n  /// @notice Returns whether the prize period is over\\n  /// @return True if the prize period is over, false otherwise\\n  function _isPrizePeriodOver() internal view returns (bool) {\\n    return _currentTime() >= _prizePeriodEndAt();\\n  }\\n\\n  /// @notice Awards collateral as tickets to a user\\n  /// @param user Recipient of minted tokens\\n  /// @param amount Amount of minted tokens\\n  function _awardTickets(address user, uint256 amount) internal {\\n    prizePool.award(user, amount, address(ticket));\\n  }\\n  \\n  /// @notice Mints ticket or sponsorship tokens for user.\\n  /// @dev Mints ticket or sponsorship tokens by looking up the address in the prizePool.tokens mapping. \\n  /// @param user Recipient of minted tokens\\n  /// @param amount Amount of minted tokens\\n  /// @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\\n  function _awardToken(address user, uint256 amount, uint8 tokenIndex) internal {\\n    ControlledTokenInterface[] memory _controlledTokens = prizePool.tokens();\\n    require(tokenIndex <= _controlledTokens.length, \\\"PeriodicPrizeStrategy/award-invalid-token-index\\\");\\n    ControlledTokenInterface _token = _controlledTokens[tokenIndex];\\n    prizePool.award(user, amount, address(_token));\\n  }\\n\\n  /// @notice Awards all external tokens with non-zero balances to the given user.  The external tokens must be held by the PrizePool contract.\\n  /// @param winner The user to transfer the tokens to\\n  function _awardAllExternalTokens(address winner) internal {\\n    _awardExternalErc20s(winner);\\n    _awardExternalErc721s(winner);\\n  }\\n\\n  /// @notice Awards all external ERC20 tokens with non-zero balances to the given user.\\n  /// The external tokens must be held by the PrizePool contract.\\n  /// @param winner The user to transfer the tokens to\\n  function _awardExternalErc20s(address winner) internal {\\n    address currentToken = externalErc20s.start();\\n    while (currentToken != address(0) && currentToken != externalErc20s.end()) {\\n      uint256 balance = IERC20Upgradeable(currentToken).balanceOf(address(prizePool));\\n      if (balance > 0) {\\n        prizePool.awardExternalERC20(winner, currentToken, balance);\\n      }\\n      currentToken = externalErc20s.next(currentToken);\\n    }\\n  }\\n\\n  /// @notice Awards all external ERC721 tokens to the given user.\\n  /// The external tokens must be held by the PrizePool contract.\\n  /// @dev The list of ERC721s is reset after every award\\n  /// @param winner The user to transfer the tokens to\\n  function _awardExternalErc721s(address winner) internal {\\n    address currentToken = externalErc721s.start();\\n    while (currentToken != address(0) && currentToken != externalErc721s.end()) {\\n      uint256 balance = IERC721Upgradeable(currentToken).balanceOf(address(prizePool));\\n      if (balance > 0) {\\n        prizePool.awardExternalERC721(winner, currentToken, externalErc721TokenIds[IERC721Upgradeable(currentToken)]);\\n        _removeExternalErc721AwardTokens(IERC721Upgradeable(currentToken));\\n      }\\n      currentToken = externalErc721s.next(currentToken);\\n    }\\n    externalErc721s.clearAll();\\n  }\\n\\n  /// @notice Returns the timestamp at which the prize period ends\\n  /// @return The timestamp at which the prize period ends.\\n  function prizePeriodEndAt() external view returns (uint256) {\\n    // current prize started at is non-inclusive, so add one\\n    return _prizePeriodEndAt();\\n  }\\n\\n  /// @notice Returns the timestamp at which the prize period ends\\n  /// @return The timestamp at which the prize period ends.\\n  function _prizePeriodEndAt() internal view returns (uint256) {\\n    // current prize started at is non-inclusive, so add one\\n    return prizePeriodStartedAt.add(prizePeriodSeconds);\\n  }\\n\\n  /// @notice Called by the PrizePool for transfers of controlled tokens\\n  /// @dev Note that this is only for *transfers*, not mints or burns\\n  /// @param controlledToken The type of collateral that is being sent\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external override onlyPrizePool {\\n    require(from != to, \\\"PeriodicPrizeStrategy/transfer-to-self\\\");\\n\\n    if (controlledToken == address(ticket)) {\\n      _requireAwardNotInProgress();\\n    }\\n\\n    if (address(tokenListener) != address(0)) {\\n      tokenListener.beforeTokenTransfer(from, to, amount, controlledToken);\\n    }\\n  }\\n\\n  /// @notice Called by the PrizePool when minting controlled tokens\\n  /// @param controlledToken The type of collateral that is being minted\\n  function beforeTokenMint(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external\\n    override\\n    onlyPrizePool\\n  {\\n    if (controlledToken == address(ticket)) {\\n      _requireAwardNotInProgress();\\n    }\\n    if (address(tokenListener) != address(0)) {\\n      tokenListener.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n  }\\n\\n  /// @notice returns the current time.  Used for testing.\\n  /// @return The current time (block.timestamp)\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice returns the current time.  Used for testing.\\n  /// @return The current time (block.timestamp)\\n  function _currentBlock() internal virtual view returns (uint256) {\\n    return block.number;\\n  }\\n\\n  /// @notice Starts the award process by starting random number request.  The prize period must have ended.\\n  /// @dev The RNG-Request-Fee is expected to be held within this contract before calling this function\\n  function startAward() external requireCanStartAward {\\n    (address feeToken, uint256 requestFee) = rng.getRequestFee();\\n    if (feeToken != address(0) && requestFee > 0) {\\n      IERC20Upgradeable(feeToken).safeApprove(address(rng), requestFee);\\n    }\\n\\n    (uint32 requestId, uint32 lockBlock) = rng.requestRandomNumber();\\n    rngRequest.id = requestId;\\n    rngRequest.lockBlock = lockBlock;\\n    rngRequest.requestedAt = _currentTime().toUint32();\\n\\n    emit PrizePoolAwardStarted(_msgSender(), address(prizePool), requestId, lockBlock);\\n  }\\n\\n  /// @notice Can be called by anyone to unlock the tickets if the RNG has timed out.\\n  function cancelAward() public {\\n    require(isRngTimedOut(), \\\"PeriodicPrizeStrategy/rng-not-timedout\\\");\\n    uint32 requestId = rngRequest.id;\\n    uint32 lockBlock = rngRequest.lockBlock;\\n    delete rngRequest;\\n    emit RngRequestFailed();\\n    emit PrizePoolAwardCancelled(msg.sender, address(prizePool), requestId, lockBlock);\\n  }\\n\\n  /// @notice Completes the award process and awards the winners.  The random number must have been requested and is now available.\\n  function completeAward() external requireCanCompleteAward {\\n    uint256 randomNumber = rng.randomNumber(rngRequest.id);\\n    delete rngRequest;\\n\\n    if (address(beforeAwardListener) != address(0)) {\\n      beforeAwardListener.beforePrizePoolAwarded(randomNumber, prizePeriodStartedAt);\\n    }\\n    _distribute(randomNumber);\\n    if (address(periodicPrizeStrategyListener) != address(0)) {\\n      periodicPrizeStrategyListener.afterPrizePoolAwarded(randomNumber, prizePeriodStartedAt);\\n    }\\n\\n    // to avoid clock drift, we should calculate the start time based on the previous period start time.\\n    prizePeriodStartedAt = _calculateNextPrizePeriodStartTime(_currentTime());\\n\\n    emit PrizePoolAwarded(_msgSender(), randomNumber);\\n    emit PrizePoolOpened(_msgSender(), prizePeriodStartedAt);\\n  }\\n\\n  /// @notice Allows the owner to set a listener that is triggered immediately before the award is distributed\\n  /// @dev The listener must implement ERC165 and the BeforeAwardListenerInterface\\n  /// @param _beforeAwardListener The address of the listener contract\\n  function setBeforeAwardListener(BeforeAwardListenerInterface _beforeAwardListener) external onlyOwner requireAwardNotInProgress {\\n    require(\\n      address(0) == address(_beforeAwardListener) || address(_beforeAwardListener).supportsInterface(BeforeAwardListenerLibrary.ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER),\\n      \\\"PeriodicPrizeStrategy/beforeAwardListener-invalid\\\"\\n    );\\n\\n    beforeAwardListener = _beforeAwardListener;\\n\\n    emit BeforeAwardListenerSet(_beforeAwardListener);\\n  }\\n\\n  /// @notice Allows the owner to set a listener for prize strategy callbacks.\\n  /// @param _periodicPrizeStrategyListener The address of the listener contract\\n  function setPeriodicPrizeStrategyListener(PeriodicPrizeStrategyListenerInterface _periodicPrizeStrategyListener) external onlyOwner requireAwardNotInProgress {\\n    require(\\n      address(0) == address(_periodicPrizeStrategyListener) || address(_periodicPrizeStrategyListener).supportsInterface(PeriodicPrizeStrategyListenerLibrary.ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER),\\n      \\\"PeriodicPrizeStrategy/prizeStrategyListener-invalid\\\"\\n    );\\n\\n    periodicPrizeStrategyListener = _periodicPrizeStrategyListener;\\n\\n    emit PeriodicPrizeStrategyListenerSet(_periodicPrizeStrategyListener);\\n  }\\n\\n  function _calculateNextPrizePeriodStartTime(uint256 currentTime) internal view returns (uint256) {\\n    uint256 elapsedPeriods = currentTime.sub(prizePeriodStartedAt).div(prizePeriodSeconds);\\n    return prizePeriodStartedAt.add(elapsedPeriods.mul(prizePeriodSeconds));\\n  }\\n\\n  /// @notice Calculates when the next prize period will start\\n  /// @param currentTime The timestamp to use as the current time\\n  /// @return The timestamp at which the next prize period would start\\n  function calculateNextPrizePeriodStartTime(uint256 currentTime) external view returns (uint256) {\\n    return _calculateNextPrizePeriodStartTime(currentTime);\\n  }\\n\\n  /// @notice Returns whether an award process can be started\\n  /// @return True if an award can be started, false otherwise.\\n  function canStartAward() external view returns (bool) {\\n    return _isPrizePeriodOver() && !isRngRequested();\\n  }\\n\\n  /// @notice Returns whether an award process can be completed\\n  /// @return True if an award can be completed, false otherwise.\\n  function canCompleteAward() external view returns (bool) {\\n    return isRngRequested() && isRngCompleted();\\n  }\\n\\n  /// @notice Returns whether a random number has been requested\\n  /// @return True if a random number has been requested, false otherwise.\\n  function isRngRequested() public view returns (bool) {\\n    return rngRequest.id != 0;\\n  }\\n\\n  /// @notice Returns whether the random number request has completed.\\n  /// @return True if a random number request has completed, false otherwise.\\n  function isRngCompleted() public view returns (bool) {\\n    return rng.isRequestComplete(rngRequest.id);\\n  }\\n\\n  /// @notice Returns the block number that the current RNG request has been locked to\\n  /// @return The block number that the RNG request is locked to\\n  function getLastRngLockBlock() external view returns (uint32) {\\n    return rngRequest.lockBlock;\\n  }\\n\\n  /// @notice Returns the current RNG Request ID\\n  /// @return The current Request ID\\n  function getLastRngRequestId() external view returns (uint32) {\\n    return rngRequest.id;\\n  }\\n\\n  /// @notice Sets the RNG service that the Prize Strategy is connected to\\n  /// @param rngService The address of the new RNG service interface\\n  function setRngService(RNGInterface rngService) external onlyOwner requireAwardNotInProgress {\\n    require(!isRngRequested(), \\\"PeriodicPrizeStrategy/rng-in-flight\\\");\\n\\n    rng = rngService;\\n    emit RngServiceUpdated(rngService);\\n  }\\n\\n  /// @notice Allows the owner to set the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\\n  /// @param _rngRequestTimeout The RNG request timeout in seconds.\\n  function setRngRequestTimeout(uint32 _rngRequestTimeout) external onlyOwner requireAwardNotInProgress {\\n    _setRngRequestTimeout(_rngRequestTimeout);\\n  }\\n\\n  /// @notice Sets the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\\n  /// @param _rngRequestTimeout The RNG request timeout in seconds.\\n  function _setRngRequestTimeout(uint32 _rngRequestTimeout) internal {\\n    require(_rngRequestTimeout > 60, \\\"PeriodicPrizeStrategy/rng-timeout-gt-60-secs\\\");\\n    rngRequestTimeout = _rngRequestTimeout;\\n    emit RngRequestTimeoutSet(rngRequestTimeout);\\n  }\\n\\n  /// @notice Allows the owner to set the prize period in seconds.\\n  /// @param _prizePeriodSeconds The new prize period in seconds.  Must be greater than zero.\\n  function setPrizePeriodSeconds(uint256 _prizePeriodSeconds) external onlyOwner requireAwardNotInProgress {\\n    _setPrizePeriodSeconds(_prizePeriodSeconds);\\n  }\\n\\n  /// @notice Sets the prize period in seconds.\\n  /// @param _prizePeriodSeconds The new prize period in seconds.  Must be greater than zero.\\n  function _setPrizePeriodSeconds(uint256 _prizePeriodSeconds) internal {\\n    require(_prizePeriodSeconds > 0, \\\"PeriodicPrizeStrategy/prize-period-greater-than-zero\\\");\\n    prizePeriodSeconds = _prizePeriodSeconds;\\n\\n    emit PrizePeriodSecondsUpdated(prizePeriodSeconds);\\n  }\\n\\n  /// @notice Gets the current list of External ERC20 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC20 token addresses\\n  function getExternalErc20Awards() external view returns (address[] memory) {\\n    return externalErc20s.addressArray();\\n  }\\n\\n  /// @notice Adds an external ERC20 token type as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can assign external tokens,\\n  /// and they must be approved by the Prize-Pool\\n  /// @param _externalErc20 The address of an ERC20 token to be awarded\\n  function addExternalErc20Award(IERC20Upgradeable _externalErc20) external onlyOwnerOrListener requireAwardNotInProgress {\\n    _addExternalErc20Award(_externalErc20);\\n  }\\n\\n  function _addExternalErc20Award(IERC20Upgradeable _externalErc20) internal {\\n    require(address(_externalErc20).isContract(), \\\"PeriodicPrizeStrategy/erc20-null\\\");\\n    require(prizePool.canAwardExternal(address(_externalErc20)), \\\"PeriodicPrizeStrategy/cannot-award-external\\\");\\n    (bool succeeded, bytes memory returnValue) = address(_externalErc20).staticcall(abi.encodeWithSignature(\\\"totalSupply()\\\"));\\n    require(succeeded, \\\"PeriodicPrizeStrategy/erc20-invalid\\\");\\n    externalErc20s.addAddress(address(_externalErc20));\\n    emit ExternalErc20AwardAdded(_externalErc20);\\n  }\\n\\n  function addExternalErc20Awards(IERC20Upgradeable[] calldata _externalErc20s) external onlyOwnerOrListener requireAwardNotInProgress {\\n    for (uint256 i = 0; i < _externalErc20s.length; i++) {\\n      _addExternalErc20Award(_externalErc20s[i]);\\n    }\\n  }\\n\\n  /// @notice Removes an external ERC20 token type as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can remove external tokens\\n  /// @param _externalErc20 The address of an ERC20 token to be removed\\n  /// @param _prevExternalErc20 The address of the previous ERC20 token in the `externalErc20s` list.\\n  /// If the ERC20 is the first address, then the previous address is the SENTINEL address: 0x0000000000000000000000000000000000000001\\n  function removeExternalErc20Award(IERC20Upgradeable _externalErc20, IERC20Upgradeable _prevExternalErc20) external onlyOwner requireAwardNotInProgress {\\n    externalErc20s.removeAddress(address(_prevExternalErc20), address(_externalErc20));\\n    emit ExternalErc20AwardRemoved(_externalErc20);\\n  }\\n\\n  /// @notice Gets the current list of External ERC721 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC721 token addresses\\n  function getExternalErc721Awards() external view returns (address[] memory) {\\n    return externalErc721s.addressArray();\\n  }\\n\\n  /// @notice Gets the current list of External ERC721 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC721 token addresses\\n  function getExternalErc721AwardTokenIds(IERC721Upgradeable _externalErc721) external view returns (uint256[] memory) {\\n    return externalErc721TokenIds[_externalErc721];\\n  }\\n\\n  /// @notice Adds an external ERC721 token as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can assign external tokens,\\n  /// and they must be approved by the Prize-Pool\\n  /// NOTE: The NFT must already be owned by the Prize-Pool\\n  /// @param _externalErc721 The address of an ERC721 token to be awarded\\n  /// @param _tokenIds An array of token IDs of the ERC721 to be awarded\\n  function addExternalErc721Award(IERC721Upgradeable _externalErc721, uint256[] calldata _tokenIds) external onlyOwnerOrListener requireAwardNotInProgress {\\n    require(prizePool.canAwardExternal(address(_externalErc721)), \\\"PeriodicPrizeStrategy/cannot-award-external\\\");\\n    require(address(_externalErc721).supportsInterface(Constants.ERC165_INTERFACE_ID_ERC721), \\\"PeriodicPrizeStrategy/erc721-invalid\\\");\\n    \\n    if (!externalErc721s.contains(address(_externalErc721))) {\\n      externalErc721s.addAddress(address(_externalErc721));\\n    }\\n\\n    for (uint256 i = 0; i < _tokenIds.length; i++) {\\n      _addExternalErc721Award(_externalErc721, _tokenIds[i]);\\n    }\\n\\n    emit ExternalErc721AwardAdded(_externalErc721, _tokenIds);\\n  }\\n\\n  function _addExternalErc721Award(IERC721Upgradeable _externalErc721, uint256 _tokenId) internal {\\n    require(IERC721Upgradeable(_externalErc721).ownerOf(_tokenId) == address(prizePool), \\\"PeriodicPrizeStrategy/unavailable-token\\\");\\n    for (uint256 i = 0; i < externalErc721TokenIds[_externalErc721].length; i++) {\\n      if (externalErc721TokenIds[_externalErc721][i] == _tokenId) {\\n        revert(\\\"PeriodicPrizeStrategy/erc721-duplicate\\\");\\n      }\\n    }\\n    externalErc721TokenIds[_externalErc721].push(_tokenId);\\n  }\\n\\n  /// @notice Removes an external ERC721 token as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can remove external tokens\\n  /// @param _externalErc721 The address of an ERC721 token to be removed\\n  /// @param _prevExternalErc721 The address of the previous ERC721 token in the list.\\n  /// If no previous, then pass the SENTINEL address: 0x0000000000000000000000000000000000000001\\n  function removeExternalErc721Award(\\n    IERC721Upgradeable _externalErc721,\\n    IERC721Upgradeable _prevExternalErc721\\n  )\\n    external\\n    onlyOwner\\n    requireAwardNotInProgress\\n  {\\n    externalErc721s.removeAddress(address(_prevExternalErc721), address(_externalErc721));\\n    _removeExternalErc721AwardTokens(_externalErc721);\\n  }\\n\\n  function _removeExternalErc721AwardTokens(\\n    IERC721Upgradeable _externalErc721\\n  )\\n    internal\\n  {\\n    delete externalErc721TokenIds[_externalErc721];\\n    emit ExternalErc721AwardRemoved(_externalErc721);\\n  }\\n\\n  function _requireAwardNotInProgress() internal view {\\n    uint256 currentBlock = _currentBlock();\\n    require(rngRequest.lockBlock == 0 || currentBlock < rngRequest.lockBlock, \\\"PeriodicPrizeStrategy/rng-in-flight\\\");\\n  }\\n\\n  function isRngTimedOut() public view returns (bool) {\\n    if (rngRequest.requestedAt == 0) {\\n      return false;\\n    } else {\\n      return _currentTime() > uint256(rngRequestTimeout).add(rngRequest.requestedAt);\\n    }\\n  }\\n\\n  modifier onlyOwnerOrListener() {\\n    require(_msgSender() == owner() ||\\n            _msgSender() == address(periodicPrizeStrategyListener) ||\\n            _msgSender() == address(beforeAwardListener),\\n            \\\"PeriodicPrizeStrategy/only-owner-or-listener\\\");\\n    _;\\n  }\\n\\n  modifier requireAwardNotInProgress() {\\n    _requireAwardNotInProgress();\\n    _;\\n  }\\n\\n  modifier requireCanStartAward() {\\n    require(_isPrizePeriodOver(), \\\"PeriodicPrizeStrategy/prize-period-not-over\\\");\\n    require(!isRngRequested(), \\\"PeriodicPrizeStrategy/rng-already-requested\\\");\\n    _;\\n  }\\n\\n  modifier requireCanCompleteAward() {\\n    require(isRngRequested(), \\\"PeriodicPrizeStrategy/rng-not-requested\\\");\\n    require(isRngCompleted(), \\\"PeriodicPrizeStrategy/rng-not-complete\\\");\\n    _;\\n  }\\n\\n  modifier onlyPrizePool() {\\n    require(_msgSender() == address(prizePool), \\\"PeriodicPrizeStrategy/only-prize-pool\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0xd7bf198ab616ed4b3e9c29d20477887d5a1e000e137e447da20bcec73b7cf997\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ninterface PeriodicPrizeStrategyListenerInterface is IERC165Upgradeable {\\n  function afterPrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x229624266562f60200b4e40ebc95a35a8aad799c0ff95a42df243af98a44d198\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary PeriodicPrizeStrategyListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('afterPrizePoolAwarded(uint256,uint256)')) == 0x575072c6\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER = 0x575072c6;\\n}\\n\",\"keccak256\":\"0xed291b9a33e265535032557f0a5430a150701c9eb58b0138c120eb02bc13b514\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PrizeSplit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\n\\n/**\\n  * @title Abstract prize split contract for adding unique award distribution to static addresses. \\n  * @author Kames Geraghty (PoolTogether Inc)\\n*/\\nabstract contract PrizeSplit is OwnableUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  \\n  PrizeSplitConfig[] internal _prizeSplits;\\n\\n  /**\\n    * @notice The prize split configuration struct.\\n    * @dev The prize split configuration struct used to award prize splits during distribution.\\n    * @param target Address of recipient receiving the prize split distribution\\n    * @param percentage Percentage of prize split using a 0-1000 range for single decimal precision i.e. 125 = 12.5%\\n    * @param token Position of controlled token in prizePool.tokens (i.e. ticket or sponsorship)\\n  */\\n  struct PrizeSplitConfig {\\n      address target;\\n      uint16 percentage;\\n      uint8 token;\\n  }\\n\\n  /**\\n    * @notice Emitted when a PrizeSplitConfig config is added or updated.\\n    * @dev Emitted when aPrizeSplitConfig config is added or updated in setPrizeSplits or setPrizeSplit.\\n    * @param target Address of prize split recipient\\n    * @param percentage Percentage of prize split. Must be between 0 and 1000 for single decimal precision\\n    * @param token Index (0 or 1) of token in the prizePool.tokens mapping\\n    * @param index Index of prize split in the prizeSplts array\\n  */\\n  event PrizeSplitSet(address indexed target, uint16 percentage, uint8 token, uint256 index);\\n\\n  /**\\n    * @notice Emitted when a PrizeSplitConfig config is removed.\\n    * @dev Emitted when a PrizeSplitConfig config is removed from the _prizeSplits array.\\n    * @param target Index of a previously active prize split config\\n  */\\n  event PrizeSplitRemoved(uint256 indexed target);\\n\\n  /**\\n    * @notice Mints ticket or sponsorship tokens to prize split recipient.\\n    * @dev Mints ticket or sponsorship tokens to prize split recipient via the linked PrizePool contract.\\n    * @param target Recipient of minted tokens\\n    * @param amount Amount of minted tokens\\n    * @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\\n  */\\n  function _awardPrizeSplitAmount(address target, uint256 amount, uint8 tokenIndex) virtual internal;\\n\\n  /**\\n    * @notice Read all prize splits configs.\\n    * @dev Read all PrizeSplitConfig structs stored in _prizeSplits.\\n    * @return _prizeSplits Array of PrizeSplitConfig structs\\n  */\\n  function prizeSplits() external view returns (PrizeSplitConfig[] memory) {\\n    return _prizeSplits;\\n  }\\n\\n  /**\\n    * @notice Read prize split config from active PrizeSplits.\\n    * @dev Read PrizeSplitConfig struct from _prizeSplits array.\\n    * @param prizeSplitIndex Index position of PrizeSplitConfig\\n    * @return PrizeSplitConfig Single prize split config\\n  */\\n  function prizeSplit(uint256 prizeSplitIndex) external view returns (PrizeSplitConfig memory) {\\n    return _prizeSplits[prizeSplitIndex];\\n  }\\n\\n  /**\\n    * @notice Set and remove prize split(s) configs.\\n    * @dev Set and remove prize split configs by passing a new PrizeSplitConfig structs array. Will remove existing PrizeSplitConfig(s) if passed array length is less than existing _prizeSplits length.\\n    * @param newPrizeSplits Array of PrizeSplitConfig structs\\n  */\\n  function setPrizeSplits(PrizeSplitConfig[] calldata newPrizeSplits) external onlyOwner {\\n    uint256 newPrizeSplitsLength = newPrizeSplits.length;\\n\\n    // Add and/or update prize split configs using newPrizeSplits PrizeSplitConfig structs array.\\n    for (uint256 index = 0; index < newPrizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = newPrizeSplits[index];\\n      require(split.token <= 1, \\\"MultipleWinners/invalid-prizesplit-token\\\");\\n      require(split.target != address(0), \\\"MultipleWinners/invalid-prizesplit-target\\\");\\n      \\n      if (_prizeSplits.length <= index) {\\n        _prizeSplits.push(split);\\n      } else {\\n        PrizeSplitConfig memory currentSplit = _prizeSplits[index];\\n        if (split.target != currentSplit.target || split.percentage != currentSplit.percentage || split.token != currentSplit.token) {\\n          _prizeSplits[index] = split;\\n        } else {\\n          continue;\\n        }\\n      }\\n\\n      // Emit the added/updated prize split config.\\n      emit PrizeSplitSet(split.target, split.percentage, split.token, index);\\n    }\\n\\n    // Remove old prize splits configs. Match storage _prizesSplits.length with the passed newPrizeSplits.length\\n    while (_prizeSplits.length > newPrizeSplitsLength) {\\n      uint256 _index = _prizeSplits.length.sub(1);\\n      _prizeSplits.pop();\\n      emit PrizeSplitRemoved(_index);\\n    }\\n\\n    // Total prize split do not exceed 100%\\n    uint256 totalPercentage = _totalPrizeSplitPercentageAmount();\\n    require(totalPercentage <= 1000, \\\"MultipleWinners/invalid-prizesplit-percentage-total\\\");\\n  }\\n\\n  /**\\n    * @notice Updates a previously set prize split config.\\n    * @dev Updates a prize split config by passing a new PrizeSplitConfig struct and current index position. Limited to contract owner.\\n    * @param prizeStrategySplit PrizeSplitConfig config struct\\n    * @param prizeSplitIndex Index position of PrizeSplitConfig to update\\n  */\\n  function setPrizeSplit(PrizeSplitConfig memory prizeStrategySplit, uint8 prizeSplitIndex) external onlyOwner {\\n    require(prizeSplitIndex < _prizeSplits.length, \\\"MultipleWinners/nonexistent-prizesplit\\\");\\n    require(prizeStrategySplit.token <= 1, \\\"MultipleWinners/invalid-prizesplit-token\\\");\\n    require(prizeStrategySplit.target != address(0), \\\"MultipleWinners/invalid-prizesplit-target\\\");\\n    \\n    // Update the prize split config\\n    _prizeSplits[prizeSplitIndex] = prizeStrategySplit;\\n\\n    // Total prize split do not exceed 100%\\n    uint256 totalPercentage = _totalPrizeSplitPercentageAmount();\\n    require(totalPercentage <= 1000, \\\"MultipleWinners/invalid-prizesplit-percentage-total\\\");\\n\\n    // Emit updated prize split config\\n    emit PrizeSplitSet(prizeStrategySplit.target, prizeStrategySplit.percentage, prizeStrategySplit.token, prizeSplitIndex);\\n  }\\n\\n  /**\\n  * @notice Calculate single prize split distribution amount.\\n  * @dev Calculate single prize split distribution amount using the total prize amount and prize split percentage.\\n  * @param amount Total prize award distribution amount\\n  * @param percentage Percentage with single decimal precision using 0-1000 ranges\\n  */\\n  function _getPrizeSplitAmount(uint256 amount, uint16 percentage) internal pure returns (uint256) {\\n    return (amount * percentage).div(1000);\\n  }\\n\\n  /**\\n  * @notice Calculates total prize split percentage amount.\\n  * @dev Calculates total PrizeSplitConfig percentage(s) amount. Used to check the total does not exceed 100% of award distribution.\\n  * @return Total prize split(s) percentage amount\\n  */\\n  function _totalPrizeSplitPercentageAmount() internal view returns (uint256) {\\n    uint256 _tempTotalPercentage;\\n    uint256 prizeSplitsLength = _prizeSplits.length;\\n    for (uint8 index = 0; index < prizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = _prizeSplits[index];\\n      _tempTotalPercentage = _tempTotalPercentage.add(split.percentage);\\n    }\\n    return _tempTotalPercentage;\\n  }\\n\\n  /**\\n  * @notice Distributes prize split(s).\\n  * @dev Distributes prize split(s) by awarding ticket or sponsorship tokens.\\n  * @param prize Starting prize award amount\\n  * @return Total prize award distribution amount exlcuding the awarded prize split(s)\\n  */\\n  function _distributePrizeSplits(uint256 prize) internal returns (uint256) {\\n    // Store temporary total prize amount for multiple calculations using initial prize amount.\\n    uint256 _prizeTemp = prize;\\n    uint256 prizeSplitsLength = _prizeSplits.length;\\n    for (uint256 index = 0; index < prizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = _prizeSplits[index];\\n      uint256 _splitAmount = _getPrizeSplitAmount(_prizeTemp, split.percentage);\\n\\n      // Award the prize split distribution amount.\\n      _awardPrizeSplitAmount(split.target, _splitAmount, split.token);\\n\\n      // Update the remaining prize amount after distributing the prize split percentage.\\n      prize = prize.sub(_splitAmount);\\n    }\\n\\n    return prize;\\n  }\\n\\n}\",\"keccak256\":\"0xc736c25922cf9065c73a06108d4d05c18af9a9e393c5280ba5d4cdb1863f3dbd\",\"license\":\"MIT\"},\"contracts/prize-strategy/multiple-winners/MultipleWinners.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"../PrizeSplit.sol\\\";\\nimport \\\"../PeriodicPrizeStrategy.sol\\\";\\n\\ncontract MultipleWinners is PeriodicPrizeStrategy, PrizeSplit {\\n\\n  // Maximum number number of winners per award distribution period\\n  uint256 internal __numberOfWinners;\\n  \\n  // Toggle for distributing external ERC 20 awards to all winners\\n  bool public splitExternalErc20Awards;\\n\\n  // Mapping of addresses isBlocked status. Can prevent an address from selected during award distribution\\n  mapping(address => bool) public isBlocklisted;\\n\\n  // Carry over the awarded prize for the next drawing when selected winners is less than __numberOfWinners\\n  bool public carryOverBlocklist;\\n\\n  // Limit ticket.draw() retry attempts when a blocked address is selected in _distribute.\\n  uint256 public blocklistRetryCount;\\n\\n  /**\\n    * @notice Emitted when splitExternalErc20Awards is toggled.\\n    * @dev Emitted when splitExternalErc20Awards is toggled between awarding external ERC20 to main or all winners.\\n  */\\n  event SplitExternalErc20AwardsSet(bool splitExternalErc20Awards);\\n\\n  /**\\n    * @notice Emitted when numberOfWinners is set.\\n    * @dev Emitted when numberOfWinners is set, which limits the maximum number of potentially selected winners.\\n    * @param numberOfWinners Maximum potentially selected winners\\n  */\\n  event NumberOfWinnersSet(uint256 numberOfWinners);\\n\\n  /**\\n    * @notice Emitted when carryOverBlocklist is toggled.\\n    * @dev Emitted when carryOverBlocklist is toggled for distribution of the primary and secondary prizes.\\n    * @param carry Awarded prize carry over status\\n  */\\n  event BlocklistCarrySet(bool carry);\\n\\n  /**\\n    * @notice Emitted when a user is blocked/unblocked from receiving a prize award.\\n    * @dev Emitted when a contract owner blocks/unblocks user from award selection in _distribute.\\n    * @param user Address of user to block or unblock\\n    * @param isBlocked User blocked status\\n  */\\n  event BlocklistSet(address indexed user, bool isBlocked);\\n\\n  /**\\n    * @notice Emitted when a new draw retry limit is set.\\n    * @dev Emitted when a new draw retry limit is set. Retry limit is set to limit gas spendings if a blocked user continues to be drawn.\\n    * @param count Number of winner selection retry attempts \\n  */\\n  event BlocklistRetryCountSet(uint256 count);\\n\\n  /**\\n    * @notice Emitted when the winner selection retry limit is reached during award distribution.\\n    * @dev Emitted when the maximum number of users has not been selected after the blocklistRetryCount is reached.\\n    * @param numberOfWinners Total number of winners selected before the blocklistRetryCount is reached.\\n  */\\n  event RetryMaxLimitReached(uint256 numberOfWinners);\\n\\n  /**\\n    * @notice Emitted when no winner can be selected during the prize distribution. \\n    * @dev Emitted when no winner can be selected in _distribute due to ticket.totalSupply() equaling zero.\\n  */\\n  event NoWinners();\\n\\n  function initializeMultipleWinners (\\n    uint256 _prizePeriodStart,\\n    uint256 _prizePeriodSeconds,\\n    PrizePool _prizePool,\\n    TicketInterface _ticket,\\n    IERC20Upgradeable _sponsorship,\\n    RNGInterface _rng,\\n    uint256 _numberOfWinners\\n  ) public initializer {\\n    IERC20Upgradeable[] memory _externalErc20Awards;\\n\\n    PeriodicPrizeStrategy.initialize(\\n      _prizePeriodStart,\\n      _prizePeriodSeconds,\\n      _prizePool,\\n      _ticket,\\n      _sponsorship,\\n      _rng,\\n      _externalErc20Awards\\n    );\\n\\n    _setNumberOfWinners(_numberOfWinners);\\n  }\\n\\n  /**\\n    * @notice Block/unblock a user from winning during prize distribution.\\n    * @dev Block/unblock a user from winning award in prize distribution by updating the isBlocklisted mapping.\\n    * @param _user Address of blocked user\\n    * @param _isBlocked Blocked Status (true or false) of user\\n  */\\n  function setBlocklisted(address _user, bool _isBlocked) external onlyOwner requireAwardNotInProgress returns (bool) {\\n    isBlocklisted[_user] = _isBlocked;\\n\\n    emit BlocklistSet(_user, _isBlocked);\\n\\n    return true;\\n  }\\n\\n  /**\\n    * @notice Toggle if an unawarded prize amount should be kept for the next draw or evenly distrubted to selected winners. \\n    * @dev Toggles if the main prize (prizePool.captureAwardBalance) and secondary prizes (LootBox) should be kept for the next draw or evenly distrubted if maximum number of winners is not selected. \\n    * @param _carry Award carry over status (true or false)\\n  */\\n  function setCarryBlocklist(bool _carry) external onlyOwner requireAwardNotInProgress returns (bool) {\\n    carryOverBlocklist = _carry;\\n\\n    emit BlocklistCarrySet(_carry);\\n\\n    return true;\\n  }\\n\\n  /**\\n    * @notice Sets the number of attempts for winner selection if a blocked address is chosen.\\n    * @dev Limits winner selection (ticket.draw) retries to avoid to gas limit reached errors. Increases the probability of not reaching the maximum number of winners if to low.\\n    * @param _count Number of retry attempts\\n  */\\n  function setBlocklistRetryCount(uint256 _count) external onlyOwner requireAwardNotInProgress returns (bool) {\\n    blocklistRetryCount = _count;\\n\\n    emit BlocklistRetryCountSet(_count);\\n\\n    return true;\\n  }\\n  \\n  /**\\n    * @notice Toggle external ERC20 awards for all prize winners.\\n    * @dev Toggle external ERC20 awards for all prize winners. If unset will distribute external ERC20 awards to main winner.\\n    * @param _splitExternalErc20Awards Toggle splitting external ERC20 awards.\\n  */\\n  function setSplitExternalErc20Awards(bool _splitExternalErc20Awards) external onlyOwner requireAwardNotInProgress {\\n    splitExternalErc20Awards = _splitExternalErc20Awards;\\n\\n    emit SplitExternalErc20AwardsSet(splitExternalErc20Awards);\\n  }\\n\\n  /**\\n    * @notice Sets maximum number of winners.\\n    * @dev Sets maximum number of winners per award distribution period.\\n    * @param count Number of winners.\\n  */\\n  function setNumberOfWinners(uint256 count) external onlyOwner requireAwardNotInProgress {\\n    _setNumberOfWinners(count);\\n  }\\n\\n   /**\\n    * @dev Set the maximum number of winners. Must be greater than 0.\\n    * @param count Number of winners.\\n  */\\n  function _setNumberOfWinners(uint256 count) internal {\\n    require(count > 0, \\\"MultipleWinners/winners-gte-one\\\");\\n\\n    __numberOfWinners = count;\\n    emit NumberOfWinnersSet(count);\\n  }\\n\\n  /**\\n    * @notice Maximum number of winners per award distribution period\\n    * @dev Read maximum number of winners per award distribution period from internal __numberOfWinners variable.\\n    * @return __numberOfWinners The total number of winners per prize award.\\n  */\\n  function numberOfWinners() external view returns (uint256) {\\n    return __numberOfWinners;\\n  }\\n\\n  /**\\n    * @notice Award ticket or sponsorship tokens to prize split recipient.\\n    * @dev Award ticket or sponsorship tokens to prize split recipient via the linked PrizePool contract.\\n    * @param target Recipient of minted tokens\\n    * @param amount Amount of minted tokens\\n    * @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\\n  */\\n  function _awardPrizeSplitAmount(address target, uint256 amount, uint8 tokenIndex) override internal {\\n    _awardToken(target, amount, tokenIndex);\\n  }\\n\\n  /**\\n    * @notice Distributes captured award balance to winners\\n    * @dev Distributes the captured award balance to the main winner and secondary winners if __numberOfWinners greater than 1.\\n    * @param randomNumber Random number seed used to select winners\\n  */\\n  function _distribute(uint256 randomNumber) internal override {\\n    uint256 prize = prizePool.captureAwardBalance();\\n    \\n    // distributes prize to prize splits and returns remaining award.\\n    prize = _distributePrizeSplits(prize);\\n\\n    if (IERC20Upgradeable(address(ticket)).totalSupply() == 0) {\\n      emit NoWinners();\\n      return;\\n    }\\n\\n    bool _carryOverBlocklistPrizes = carryOverBlocklist;\\n\\n    // main winner is simply the first that is drawn\\n    uint256 numberOfWinners = __numberOfWinners;\\n    address[] memory winners = new address[](numberOfWinners);\\n    uint256 nextRandom = randomNumber;\\n    uint256 winnerCount = 0;\\n    uint256 retries = 0;\\n    uint256 _retryCount = blocklistRetryCount;\\n    while (winnerCount < numberOfWinners) {\\n      address winner = ticket.draw(nextRandom);\\n\\n      if (!isBlocklisted[winner]) {\\n        winners[winnerCount++] = winner;\\n      } else if (++retries >= _retryCount) {\\n        emit RetryMaxLimitReached(winnerCount);\\n        if(winnerCount == 0) {\\n          emit NoWinners();\\n        }\\n        break;\\n      }\\n\\n      // add some arbitrary numbers to the previous random number to ensure no matches with the UniformRandomNumber lib\\n      bytes32 nextRandomHash = keccak256(abi.encodePacked(nextRandom + 499 + winnerCount*521));\\n      nextRandom = uint256(nextRandomHash);\\n    }\\n\\n    // main winner gets all external ERC721 tokens\\n    _awardExternalErc721s(winners[0]);\\n\\n    // yield prize is split up among all winners\\n    uint256 prizeShare = _carryOverBlocklistPrizes ? prize.div(numberOfWinners) : prize.div(winnerCount);\\n    if (prizeShare > 0) {\\n      for (uint i = 0; i < winnerCount; i++) {\\n        _awardTickets(winners[i], prizeShare);\\n      }\\n    }\\n\\n    if (splitExternalErc20Awards) {\\n      address currentToken = externalErc20s.start();\\n      while (currentToken != address(0) && currentToken != externalErc20s.end()) {\\n        uint256 balance = IERC20Upgradeable(currentToken).balanceOf(address(prizePool));\\n        uint256 split = _carryOverBlocklistPrizes ? balance.div(numberOfWinners) : balance.div(winnerCount);\\n        if (split > 0) {\\n          for (uint256 i = 0; i < winnerCount; i++) {\\n            prizePool.awardExternalERC20(winners[i], currentToken, split);\\n          }\\n        }\\n        currentToken = externalErc20s.next(currentToken);\\n      }\\n    } else {\\n      _awardExternalErc20s(winners[0]);\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0x26fbb59d9251cd6d66a423abaea29d5ea182e539365767ebfed726fe6248a29a\",\"license\":\"MIT\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/test/MultipleWinnersHarness.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"../prize-strategy/multiple-winners/MultipleWinners.sol\\\";\\n\\n/// @title Creates a minimal proxy to the MultipleWinners prize strategy.  Very cheap to deploy.\\ncontract MultipleWinnersHarness is MultipleWinners {\\n\\n  uint256 public currentTime;\\n\\n  function setCurrentTime(uint256 _currentTime) external {\\n    currentTime = _currentTime;\\n  }\\n\\n  function _currentTime() internal override view returns (uint256) {\\n    return currentTime;\\n  }\\n\\n  function distribute(uint256 randomNumber) external {\\n    _distribute(randomNumber);\\n  }\\n\\n}\",\"keccak256\":\"0xdb761d30ee50c16944f5370ab55c84975baef1d60687c18d6a5933ef072ef5ad\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TicketInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface TicketInterface {\\n  /// @notice Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\\n  /// @param randomNumber The random number to use to select a user.\\n  /// @return The winner\\n  function draw(uint256 randomNumber) external view returns (address);\\n}\",\"keccak256\":\"0x5201a9a22748781592abd2003801289224d4899292195b7de937cd5748be87dd\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListener.sol\":{\"content\":\"pragma solidity ^0.6.4;\\n\\nimport \\\"./TokenListenerInterface.sol\\\";\\nimport \\\"./TokenListenerLibrary.sol\\\";\\nimport \\\"../Constants.sol\\\";\\n\\nabstract contract TokenListener is TokenListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER\\n    );\\n  }\\n}\\n\",\"keccak256\":\"0xb0e98d10b004602e1d4f4369a70e6382002dc0c0c5713698eb6a92943aef2265\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 10,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "_owner",
                "offset": 0,
                "slot": "51",
                "type": "t_address"
              },
              {
                "astId": 129,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "__gap",
                "offset": 0,
                "slot": "52",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 9738,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "tokenListener",
                "offset": 0,
                "slot": "101",
                "type": "t_contract(TokenListenerInterface)16265"
              },
              {
                "astId": 9740,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "prizePool",
                "offset": 0,
                "slot": "102",
                "type": "t_contract(PrizePool)8751"
              },
              {
                "astId": 9742,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "ticket",
                "offset": 0,
                "slot": "103",
                "type": "t_contract(TicketInterface)16152"
              },
              {
                "astId": 9744,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "sponsorship",
                "offset": 0,
                "slot": "104",
                "type": "t_contract(IERC20Upgradeable)1960"
              },
              {
                "astId": 9746,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "rng",
                "offset": 0,
                "slot": "105",
                "type": "t_contract(RNGInterface)5531"
              },
              {
                "astId": 9748,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "rngRequest",
                "offset": 0,
                "slot": "106",
                "type": "t_struct(RngRequest)9732_storage"
              },
              {
                "astId": 9751,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "rngRequestTimeout",
                "offset": 0,
                "slot": "107",
                "type": "t_uint32"
              },
              {
                "astId": 9753,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "prizePeriodSeconds",
                "offset": 0,
                "slot": "108",
                "type": "t_uint256"
              },
              {
                "astId": 9755,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "prizePeriodStartedAt",
                "offset": 0,
                "slot": "109",
                "type": "t_uint256"
              },
              {
                "astId": 9757,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "externalErc20s",
                "offset": 0,
                "slot": "110",
                "type": "t_struct(Mapping)16337_storage"
              },
              {
                "astId": 9759,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "externalErc721s",
                "offset": 0,
                "slot": "112",
                "type": "t_struct(Mapping)16337_storage"
              },
              {
                "astId": 9764,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "externalErc721TokenIds",
                "offset": 0,
                "slot": "114",
                "type": "t_mapping(t_contract(IERC721Upgradeable)3338,t_array(t_uint256)dyn_storage)"
              },
              {
                "astId": 9767,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "beforeAwardListener",
                "offset": 0,
                "slot": "115",
                "type": "t_contract(BeforeAwardListenerInterface)9575"
              },
              {
                "astId": 9770,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "periodicPrizeStrategyListener",
                "offset": 0,
                "slot": "116",
                "type": "t_contract(PeriodicPrizeStrategyListenerInterface)11432"
              },
              {
                "astId": 11452,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "_prizeSplits",
                "offset": 0,
                "slot": "117",
                "type": "t_array(t_struct(PrizeSplitConfig)11459_storage)dyn_storage"
              },
              {
                "astId": 11852,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "__numberOfWinners",
                "offset": 0,
                "slot": "118",
                "type": "t_uint256"
              },
              {
                "astId": 11854,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "splitExternalErc20Awards",
                "offset": 0,
                "slot": "119",
                "type": "t_bool"
              },
              {
                "astId": 11858,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "isBlocklisted",
                "offset": 0,
                "slot": "120",
                "type": "t_mapping(t_address,t_bool)"
              },
              {
                "astId": 11860,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "carryOverBlocklist",
                "offset": 0,
                "slot": "121",
                "type": "t_bool"
              },
              {
                "astId": 11862,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "blocklistRetryCount",
                "offset": 0,
                "slot": "122",
                "type": "t_uint256"
              },
              {
                "astId": 14128,
                "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                "label": "currentTime",
                "offset": 0,
                "slot": "123",
                "type": "t_uint256"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_struct(PrizeSplitConfig)11459_storage)dyn_storage": {
                "base": "t_struct(PrizeSplitConfig)11459_storage",
                "encoding": "dynamic_array",
                "label": "struct PrizeSplit.PrizeSplitConfig[]",
                "numberOfBytes": "32"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_array(t_uint256)dyn_storage": {
                "base": "t_uint256",
                "encoding": "dynamic_array",
                "label": "uint256[]",
                "numberOfBytes": "32"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_contract(BeforeAwardListenerInterface)9575": {
                "encoding": "inplace",
                "label": "contract BeforeAwardListenerInterface",
                "numberOfBytes": "20"
              },
              "t_contract(IERC20Upgradeable)1960": {
                "encoding": "inplace",
                "label": "contract IERC20Upgradeable",
                "numberOfBytes": "20"
              },
              "t_contract(IERC721Upgradeable)3338": {
                "encoding": "inplace",
                "label": "contract IERC721Upgradeable",
                "numberOfBytes": "20"
              },
              "t_contract(PeriodicPrizeStrategyListenerInterface)11432": {
                "encoding": "inplace",
                "label": "contract PeriodicPrizeStrategyListenerInterface",
                "numberOfBytes": "20"
              },
              "t_contract(PrizePool)8751": {
                "encoding": "inplace",
                "label": "contract PrizePool",
                "numberOfBytes": "20"
              },
              "t_contract(RNGInterface)5531": {
                "encoding": "inplace",
                "label": "contract RNGInterface",
                "numberOfBytes": "20"
              },
              "t_contract(TicketInterface)16152": {
                "encoding": "inplace",
                "label": "contract TicketInterface",
                "numberOfBytes": "20"
              },
              "t_contract(TokenListenerInterface)16265": {
                "encoding": "inplace",
                "label": "contract TokenListenerInterface",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_address)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => address)",
                "numberOfBytes": "32",
                "value": "t_address"
              },
              "t_mapping(t_address,t_bool)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => bool)",
                "numberOfBytes": "32",
                "value": "t_bool"
              },
              "t_mapping(t_contract(IERC721Upgradeable)3338,t_array(t_uint256)dyn_storage)": {
                "encoding": "mapping",
                "key": "t_contract(IERC721Upgradeable)3338",
                "label": "mapping(contract IERC721Upgradeable => uint256[])",
                "numberOfBytes": "32",
                "value": "t_array(t_uint256)dyn_storage"
              },
              "t_struct(Mapping)16337_storage": {
                "encoding": "inplace",
                "label": "struct MappedSinglyLinkedList.Mapping",
                "members": [
                  {
                    "astId": 16332,
                    "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                    "label": "count",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint256"
                  },
                  {
                    "astId": 16336,
                    "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                    "label": "addressMap",
                    "offset": 0,
                    "slot": "1",
                    "type": "t_mapping(t_address,t_address)"
                  }
                ],
                "numberOfBytes": "64"
              },
              "t_struct(PrizeSplitConfig)11459_storage": {
                "encoding": "inplace",
                "label": "struct PrizeSplit.PrizeSplitConfig",
                "members": [
                  {
                    "astId": 11454,
                    "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                    "label": "target",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_address"
                  },
                  {
                    "astId": 11456,
                    "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                    "label": "percentage",
                    "offset": 20,
                    "slot": "0",
                    "type": "t_uint16"
                  },
                  {
                    "astId": 11458,
                    "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                    "label": "token",
                    "offset": 22,
                    "slot": "0",
                    "type": "t_uint8"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_struct(RngRequest)9732_storage": {
                "encoding": "inplace",
                "label": "struct PeriodicPrizeStrategy.RngRequest",
                "members": [
                  {
                    "astId": 9727,
                    "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                    "label": "id",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint32"
                  },
                  {
                    "astId": 9729,
                    "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                    "label": "lockBlock",
                    "offset": 4,
                    "slot": "0",
                    "type": "t_uint32"
                  },
                  {
                    "astId": 9731,
                    "contract": "contracts/test/MultipleWinnersHarness.sol:MultipleWinnersHarness",
                    "label": "requestedAt",
                    "offset": 8,
                    "slot": "0",
                    "type": "t_uint32"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_uint16": {
                "encoding": "inplace",
                "label": "uint16",
                "numberOfBytes": "2"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint32": {
                "encoding": "inplace",
                "label": "uint32",
                "numberOfBytes": "4"
              },
              "t_uint8": {
                "encoding": "inplace",
                "label": "uint8",
                "numberOfBytes": "1"
              }
            }
          },
          "userdoc": {
            "events": {
              "BlocklistCarrySet(bool)": {
                "notice": "Emitted when carryOverBlocklist is toggled."
              },
              "BlocklistRetryCountSet(uint256)": {
                "notice": "Emitted when a new draw retry limit is set."
              },
              "BlocklistSet(address,bool)": {
                "notice": "Emitted when a user is blocked/unblocked from receiving a prize award."
              },
              "NoWinners()": {
                "notice": "Emitted when no winner can be selected during the prize distribution. "
              },
              "NumberOfWinnersSet(uint256)": {
                "notice": "Emitted when numberOfWinners is set."
              },
              "PrizeSplitRemoved(uint256)": {
                "notice": "Emitted when a PrizeSplitConfig config is removed."
              },
              "PrizeSplitSet(address,uint16,uint8,uint256)": {
                "notice": "Emitted when a PrizeSplitConfig config is added or updated."
              },
              "RetryMaxLimitReached(uint256)": {
                "notice": "Emitted when the winner selection retry limit is reached during award distribution."
              },
              "SplitExternalErc20AwardsSet(bool)": {
                "notice": "Emitted when splitExternalErc20Awards is toggled."
              }
            },
            "kind": "user",
            "methods": {
              "VERSION()": {
                "notice": "Semver Version"
              },
              "addExternalErc20Award(address)": {
                "notice": "Adds an external ERC20 token type as an additional prize that can be awarded"
              },
              "addExternalErc721Award(address,uint256[])": {
                "notice": "Adds an external ERC721 token as an additional prize that can be awarded"
              },
              "beforeAwardListener()": {
                "notice": "A listener that is called before the prize is awarded"
              },
              "beforeTokenMint(address,uint256,address,address)": {
                "notice": "Called by the PrizePool when minting controlled tokens"
              },
              "beforeTokenTransfer(address,address,uint256,address)": {
                "notice": "Called by the PrizePool for transfers of controlled tokens"
              },
              "calculateNextPrizePeriodStartTime(uint256)": {
                "notice": "Calculates when the next prize period will start"
              },
              "canCompleteAward()": {
                "notice": "Returns whether an award process can be completed"
              },
              "canStartAward()": {
                "notice": "Returns whether an award process can be started"
              },
              "cancelAward()": {
                "notice": "Can be called by anyone to unlock the tickets if the RNG has timed out."
              },
              "completeAward()": {
                "notice": "Completes the award process and awards the winners.  The random number must have been requested and is now available."
              },
              "currentPrize()": {
                "notice": "Calculates and returns the currently accrued prize"
              },
              "estimateRemainingBlocksToPrize(uint256)": {
                "notice": "Estimates the remaining blocks until the prize given a number of seconds per block"
              },
              "getExternalErc20Awards()": {
                "notice": "Gets the current list of External ERC20 tokens that will be awarded with the current prize"
              },
              "getExternalErc721AwardTokenIds(address)": {
                "notice": "Gets the current list of External ERC721 tokens that will be awarded with the current prize"
              },
              "getExternalErc721Awards()": {
                "notice": "Gets the current list of External ERC721 tokens that will be awarded with the current prize"
              },
              "getLastRngLockBlock()": {
                "notice": "Returns the block number that the current RNG request has been locked to"
              },
              "getLastRngRequestId()": {
                "notice": "Returns the current RNG Request ID"
              },
              "initialize(uint256,uint256,address,address,address,address,address[])": {
                "notice": "Initializes a new strategy"
              },
              "isPrizePeriodOver()": {
                "notice": "Returns whether the prize period is over"
              },
              "isRngCompleted()": {
                "notice": "Returns whether the random number request has completed."
              },
              "isRngRequested()": {
                "notice": "Returns whether a random number has been requested"
              },
              "numberOfWinners()": {
                "notice": "Maximum number of winners per award distribution period"
              },
              "periodicPrizeStrategyListener()": {
                "notice": "A listener that is called after the prize is awarded"
              },
              "prizePeriodEndAt()": {
                "notice": "Returns the timestamp at which the prize period ends"
              },
              "prizePeriodRemainingSeconds()": {
                "notice": "Returns the number of seconds remaining until the prize can be awarded."
              },
              "prizeSplit(uint256)": {
                "notice": "Read prize split config from active PrizeSplits."
              },
              "prizeSplits()": {
                "notice": "Read all prize splits configs."
              },
              "removeExternalErc20Award(address,address)": {
                "notice": "Removes an external ERC20 token type as an additional prize that can be awarded"
              },
              "removeExternalErc721Award(address,address)": {
                "notice": "Removes an external ERC721 token as an additional prize that can be awarded"
              },
              "rngRequestTimeout()": {
                "notice": "RNG Request Timeout.  In fact, this is really a \"complete award\" timeout. If the rng completes the award can still be cancelled."
              },
              "setBeforeAwardListener(address)": {
                "notice": "Allows the owner to set a listener that is triggered immediately before the award is distributed"
              },
              "setBlocklistRetryCount(uint256)": {
                "notice": "Sets the number of attempts for winner selection if a blocked address is chosen."
              },
              "setBlocklisted(address,bool)": {
                "notice": "Block/unblock a user from winning during prize distribution."
              },
              "setCarryBlocklist(bool)": {
                "notice": "Toggle if an unawarded prize amount should be kept for the next draw or evenly distrubted to selected winners. "
              },
              "setNumberOfWinners(uint256)": {
                "notice": "Sets maximum number of winners."
              },
              "setPeriodicPrizeStrategyListener(address)": {
                "notice": "Allows the owner to set a listener for prize strategy callbacks."
              },
              "setPrizePeriodSeconds(uint256)": {
                "notice": "Allows the owner to set the prize period in seconds."
              },
              "setPrizeSplit((address,uint16,uint8),uint8)": {
                "notice": "Updates a previously set prize split config."
              },
              "setPrizeSplits((address,uint16,uint8)[])": {
                "notice": "Set and remove prize split(s) configs."
              },
              "setRngRequestTimeout(uint32)": {
                "notice": "Allows the owner to set the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked."
              },
              "setRngService(address)": {
                "notice": "Sets the RNG service that the Prize Strategy is connected to"
              },
              "setSplitExternalErc20Awards(bool)": {
                "notice": "Toggle external ERC20 awards for all prize winners."
              },
              "setTokenListener(address)": {
                "notice": "Allows the owner to set the token listener"
              },
              "startAward()": {
                "notice": "Starts the award process by starting random number request.  The prize period must have ended."
              }
            },
            "version": 1
          }
        }
      },
      "contracts/test/MultipleWinnersHarnessProxyFactory.sol": {
        "MultipleWinnersHarnessProxyFactory": {
          "abi": [
            {
              "inputs": [],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "name": "ProxyCreated",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "create",
              "outputs": [
                {
                  "internalType": "contract MultipleWinnersHarness",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_logic",
                  "type": "address"
                },
                {
                  "internalType": "bytes",
                  "name": "_data",
                  "type": "bytes"
                }
              ],
              "name": "deployMinimal",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "instance",
              "outputs": [
                {
                  "internalType": "contract MultipleWinnersHarness",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "title": "Creates a minimal proxy to the MultipleWinners prize strategy.  Very cheap to deploy.",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5060405161001d9061005f565b604051809103906000f080158015610039573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b039290921691909117905561006c565b615bf0806103b283390190565b6103378061007b6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063022ec09514610046578063b3eeb5e21461006a578063efc81a8c14610120575b600080fd5b61004e610128565b604080516001600160a01b039092168252519081900360200190f35b61004e6004803603604081101561008057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100ab57600080fd5b8201836020820111156100bd57600080fd5b803590602001918460018302840111640100000000831117156100df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610137945050505050565b61004e6102b3565b6000546001600160a01b031681565b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a18251156102ac576000826001600160a01b0316846040518082805190602001908083835b602083106102035780518252601f1990920191602091820191016101e4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610265576040519150601f19603f3d011682016040523d82523d6000602084013e61026a565b606091505b50509050806102aa5760405162461bcd60e51b81526004018080602001828103825260248152602001806102de6024913960400191505060405180910390fd5b505b5092915050565b6000805460408051602081019091528281526102d8916001600160a01b031690610137565b90509056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a2646970667358221220dd1da506cf2649c1f2b83598c6d20b4da70f053f0b8b81590c2c31bfb971577564736f6c634300060c0033608060405234801561001057600080fd5b50615bcf80620000216000396000f3fe608060405234801561001057600080fd5b50600436106103e65760003560e01c80637f2be9fc1161020a578063b024468211610125578063d18e81b3116100b8578063eefc8ad111610087578063eefc8ad114610762578063f2fde38b14610782578063f97700e214610795578063fbf0953e146107a8578063ffa1ad74146107bb576103e6565b8063d18e81b314610742578063d5ad6bf61461074a578063d605787b14610752578063dfb2f13b1461075a576103e6565b8063c2f19ee8116100f4578063c2f19ee81461070c578063c42b42a014610714578063c48ddbcb1461071c578063c68532701461072f576103e6565b8063b0244682146106cb578063b2210957146106de578063b9ee1e05146106f1578063c25a9c32146106f9576103e6565b80638e204c431161019d57806395e5f9ee1161016c57806395e5f9ee146106a05780639dafafb0146106a8578063a4e075ca146106b0578063acca5b95146106c3576103e6565b80638e204c431461065257806391c05b0b1461066557806394144c6b146106785780639417783f14610680576103e6565b80638aa3ec6f116101d95780638aa3ec6f1461061a5780638acfaca91461062d5780638d5f10c4146106355780638da5cb5b1461064a576103e6565b80637f2be9fc146105d95780637f4296d7146105ec578063876f5c7e146105ff578063884a444814610607576103e6565b80634e5d08e0116103055780636be51c4f116102985780636f46f221116102675780636f46f221146105b1578063715018a6146105b9578063719ce73e146105c157806372f33ea9146105c9578063738bbea8146105d1576103e6565b80636be51c4f146105865780636bea53441461058e5780636cc25db7146105965780636dfb03861461059e576103e6565b806362c77a61116102d457806362c77a61146105505780636696822114610558578063671137c41461056b5780636a74f1071461057e576103e6565b80634e5d08e01461050f578063500db70d1461052257806352a301091461052a578063605e25ac1461053d576103e6565b80632c8fe73d1161037d57806347bed9981161034c57806347bed998146104d95780634aba4f6b146104ec5780634c169f4f146104f45780634d7f3db0146104fc576103e6565b80632c8fe73d1461049657806330fcdf411461049e57806338a9b4b6146104b157806342d09209146104c4576103e6565b8063111070e4116103b9578063111070e414610451578063152d308c1461045957806322f8e5661461046c5780632a7ad60914610481576103e6565b806301b48e34146103eb57806301ffc9a7146104145780630d847fc4146104345780630faf125f14610449575b600080fd5b6103fe6103f936600461490a565b6107d0565b60405161040b9190614b3c565b60405180910390f35b610427610422366004614813565b6107e9565b60405161040b9190614d91565b61043c61081f565b60405161040b9190614b45565b6103fe61082e565b610427610834565b6104276104673660046145e1565b610843565b61047f61047a36600461490a565b6108fa565b005b6104896108ff565b60405161040b9190615ae0565b6103fe61090b565b61047f6104ac366004614557565b61091a565b61047f6104bf3660046147db565b6109f2565b6104cc610a88565b60405161040b9190614c90565b6103fe6104e736600461490a565b610a94565b610427610a9f565b61047f610b28565b61047f61050a366004614646565b610bf2565b61047f61051d366004614557565b610cca565b61043c610d67565b61042761053836600461490a565b610d76565b61047f61054b366004614557565b610e04565b6104cc610ee5565b61047f61056636600461472b565b610ef1565b61047f61057936600461483b565b610fc3565b610427611023565b61043c61103c565b61048961104b565b61043c61105f565b61047f6105ac36600461490a565b61106e565b6104276110be565b61047f6110c7565b61043c611150565b6103fe61115f565b610427611165565b61047f6105e7366004614a33565b6111b8565b61047f6105fa366004614557565b61125c565b610427611312565b61047f61061536600461490a565b611331565b61047f610628366004614557565b611381565b6103fe611459565b61063d61145f565b60405161040b9190614cdd565b61043c6114e4565b610427610660366004614557565b6114f3565b61047f61067336600461490a565b611508565b6103fe611511565b61069361068e366004614557565b611517565b60405161040b9190614d59565b610427611583565b61042761158d565b6104276106be3660046147db565b611596565b61048961161d565b61047f6106d936600461483b565b611629565b61047f6106ec36600461458f565b6116b4565b61047f611785565b61047f61070736600461476b565b6119cd565b61043c611d5c565b6103fe611d6b565b61047f61072a366004614868565b611de8565b61047f61073d366004614aad565b611fdd565b6103fe61202d565b6103fe612033565b61043c61203d565b61047f61204c565b61077561077036600461490a565b6122ce565b60405161040b9190615a0a565b61047f610790366004614557565b612333565b61047f6107a336600461493a565b6123f4565b61047f6107b63660046148d6565b612655565b6107c36127f4565b60405161040b9190614db1565b60006107e36107dd612815565b83612852565b92915050565b60006001600160e01b031982166301ffc9a760e01b14806107e35750506001600160e01b031916600162a1cb1960e01b03191490565b6073546001600160a01b031681565b607a5481565b606a5463ffffffff1615155b90565b600061084d61287b565b6001600160a01b031661085e6114e4565b6001600160a01b03161461088d5760405162461bcd60e51b8152600401610884906154ec565b60405180910390fd5b61089561287f565b6001600160a01b03831660008181526078602052604090819020805460ff1916851515179055517fd1ac9a365c0e3bfad562e0a809a5ded3842a2b489f839b3327e4e34ee0128f28906108e9908590614d91565b60405180910390a250600192915050565b607b55565b606a5463ffffffff1690565b60006109156128d4565b905090565b61092261287b565b6001600160a01b03166109336114e4565b6001600160a01b0316146109595760405162461bcd60e51b8152600401610884906154ec565b61096161287f565b6001600160a01b038116158061098c575061098c6001600160a01b03821663266fce1f60e11b6128ed565b6109a85760405162461bcd60e51b81526004016108849061559a565b607380546001600160a01b0319166001600160a01b0383169081179091556040517fc4feff61630891ea2cb42a54fbe3ff2e65422f2ed17323ac6b65f4521112e87e90600090a250565b6109fa61287b565b6001600160a01b0316610a0b6114e4565b6001600160a01b031614610a315760405162461bcd60e51b8152600401610884906154ec565b610a3961287f565b6077805460ff191682151517908190556040517f6959d02e8fb6264d1d39bf37f1e725001f342714933cf38f8627a2442efc43fd91610a7d9160ff90911690614d91565b60405180910390a150565b60606109156070612910565b60006107e3826129f0565b606954606a54604051630e866e6f60e21b81526000926001600160a01b031691633a19b9bc91610ad89163ffffffff1690600401615ae0565b60206040518083038186803b158015610af057600080fd5b505afa158015610b04573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091591906147f7565b610b30611165565b610b4c5760405162461bcd60e51b8152600401610884906158ea565b606a80546bffffffffffffffffffffffff19811690915560405163ffffffff80831692640100000000900416907fee6702c46c5618e6fc7e625c71f4c85df9c91d456cb16a3aea71ab83b1fee00590600090a160665460405163ffffffff8416916001600160a01b03169033907fd50026ee0824513af20cdf5e72d1fbfbe8fd646ee0576378e080326f1a695e5890610be6908690615ae0565b60405180910390a45050565b6066546001600160a01b0316610c0661287b565b6001600160a01b031614610c2c5760405162461bcd60e51b8152600401610884906150c4565b6067546001600160a01b0383811691161415610c4a57610c4a61287f565b6065546001600160a01b031615610cc4576065546040516304d7f3db60e41b81526001600160a01b0390911690634d7f3db090610c91908790879087908790600401614c65565b600060405180830381600087803b158015610cab57600080fd5b505af1158015610cbf573d6000803e3d6000fd5b505050505b50505050565b610cd26114e4565b6001600160a01b0316610ce361287b565b6001600160a01b03161480610d1257506074546001600160a01b0316610d0761287b565b6001600160a01b0316145b80610d3757506073546001600160a01b0316610d2c61287b565b6001600160a01b0316145b610d535760405162461bcd60e51b815260040161088490614f5b565b610d5b61287f565b610d6481612a37565b50565b6068546001600160a01b031681565b6000610d8061287b565b6001600160a01b0316610d916114e4565b6001600160a01b031614610db75760405162461bcd60e51b8152600401610884906154ec565b610dbf61287f565b607a8290556040517f63e4e34f49d12428c03e04e61340c7167e36eb0ff6f0b1970c7544026179403990610df4908490614b3c565b60405180910390a1506001919050565b610e0c61287b565b6001600160a01b0316610e1d6114e4565b6001600160a01b031614610e435760405162461bcd60e51b8152600401610884906154ec565b610e4b61287f565b6001600160a01b0381161580610e795750610e796001600160a01b038216600162a1cb1960e01b03196128ed565b610e955760405162461bcd60e51b815260040161088490614e28565b606580546001600160a01b0319166001600160a01b0383811691909117918290556040519116907f9fc437aa70ad4ee5f33f6772bf338eed41e21b95435820817ab8b4df161ce4dd90600090a250565b6060610915606e612910565b610ef96114e4565b6001600160a01b0316610f0a61287b565b6001600160a01b03161480610f3957506074546001600160a01b0316610f2e61287b565b6001600160a01b0316145b80610f5e57506073546001600160a01b0316610f5361287b565b6001600160a01b0316145b610f7a5760405162461bcd60e51b815260040161088490614f5b565b610f8261287f565b60005b81811015610fbe57610fb6838383818110610f9c57fe5b9050602002016020810190610fb19190614557565b612a37565b600101610f85565b505050565b610fcb61287b565b6001600160a01b0316610fdc6114e4565b6001600160a01b0316146110025760405162461bcd60e51b8152600401610884906154ec565b61100a61287f565b61101660708284612beb565b61101f82612cb5565b5050565b600061102d610834565b80156109155750610915610a9f565b6065546001600160a01b031681565b606a54640100000000900463ffffffff1690565b6067546001600160a01b031681565b61107661287b565b6001600160a01b03166110876114e4565b6001600160a01b0316146110ad5760405162461bcd60e51b8152600401610884906154ec565b6110b561287f565b610d6481612d0d565b60795460ff1681565b6110cf61287b565b6001600160a01b03166110e06114e4565b6001600160a01b0316146111065760405162461bcd60e51b8152600401610884906154ec565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6066546001600160a01b031681565b606d5481565b606a54600090600160401b900463ffffffff1661118457506000610840565b606a54606b546111a89163ffffffff91821691600160401b909104811690612d6216565b6111b0612d87565b119050610840565b600054610100900460ff16806111d157506111d1612d8d565b806111df575060005460ff16155b6111fb5760405162461bcd60e51b815260040161088490615360565b600054610100900460ff16158015611226576000805460ff1961ff0019909116610100171660011790555b6060611237898989898989876123f4565b61124083612d0d565b508015610cbf576000805461ff00191690555050505050505050565b61126461287b565b6001600160a01b03166112756114e4565b6001600160a01b03161461129b5760405162461bcd60e51b8152600401610884906154ec565b6112a361287f565b6112ab610834565b156112c85760405162461bcd60e51b8152600401610884906158a7565b606980546001600160a01b0319166001600160a01b0383169081179091556040517ff935763cc7c57ee8ed6318ed71e756cca0731294c9f46ff5b386f36d6ff1417a90600090a250565b600061131c612d98565b8015610915575061132b610834565b15905090565b61133961287b565b6001600160a01b031661134a6114e4565b6001600160a01b0316146113705760405162461bcd60e51b8152600401610884906154ec565b61137861287f565b610d6481612db1565b61138961287b565b6001600160a01b031661139a6114e4565b6001600160a01b0316146113c05760405162461bcd60e51b8152600401610884906154ec565b6113c861287f565b6001600160a01b03811615806113f357506113f36001600160a01b038216632ba8396360e11b6128ed565b61140f5760405162461bcd60e51b8152600401610884906157b8565b607480546001600160a01b0319166001600160a01b0383169081179091556040517fda05d50a3a1ec0ffab059f1d457ae59f68ccfb3ffbb4dad283c516f9103d584b90600090a250565b60765490565b60606075805480602002602001604051908101604052809291908181526020016000905b828210156114db57600084815260209081902060408051606081018252918501546001600160a01b0381168352600160a01b810461ffff1683850152600160b01b900460ff1690820152825260019092019101611483565b50505050905090565b6033546001600160a01b031690565b60786020526000908152604090205460ff1681565b610d6481612e06565b606c5481565b6001600160a01b03811660009081526072602090815260409182902080548351818402810184019094528084526060939283018282801561157757602002820191906000526020600020905b815481526020019060010190808311611563575b50505050509050919050565b6000610915612d98565b60775460ff1681565b60006115a061287b565b6001600160a01b03166115b16114e4565b6001600160a01b0316146115d75760405162461bcd60e51b8152600401610884906154ec565b6115df61287f565b6079805460ff19168315151790556040517f2b4b6ffe286f7ce4ccc6b136bb14987b0a00092174d88938a0c667a104a4a73190610df4908490614d91565b606b5463ffffffff1681565b61163161287b565b6001600160a01b03166116426114e4565b6001600160a01b0316146116685760405162461bcd60e51b8152600401610884906154ec565b61167061287f565b61167c606e8284612beb565b6040516001600160a01b038316907f58982464497acdab11ad29d39907e076b0d3b8daf1d9b734174c7c3a2a0e8c7490600090a25050565b6066546001600160a01b03166116c861287b565b6001600160a01b0316146116ee5760405162461bcd60e51b8152600401610884906150c4565b826001600160a01b0316846001600160a01b031614156117205760405162461bcd60e51b815260040161088490615109565b6067546001600160a01b038281169116141561173e5761173e61287f565b6065546001600160a01b031615610cc45760655460405163b221095760e01b81526001600160a01b039091169063b221095790610c91908790879087908790600401614bfe565b61178d612d98565b6117a95760405162461bcd60e51b815260040161088490614eca565b6117b1610834565b156117ce5760405162461bcd60e51b815260040161088490615429565b60695460408051630d37b53760e01b8152815160009384936001600160a01b0390911692630d37b5379260048083019392829003018186803b15801561181357600080fd5b505afa158015611827573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184b9190614619565b90925090506001600160a01b038216158015906118685750600081115b1561188757606954611887906001600160a01b03848116911683613393565b6069546040805163433c53d960e11b8152815160009384936001600160a01b0390911692638678a7b2926004808301939282900301818787803b1580156118cd57600080fd5b505af11580156118e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119059190614ac9565b606a805463ffffffff8084166401000000000267ffffffff000000001991861663ffffffff199093169290921716179055909250905061194b611946612d87565b61348d565b606a80546bffffffff00000000000000001916600160401b63ffffffff93841602179055606654908316906001600160a01b031661198761287b565b6001600160a01b03167f4d31e658dcf617bb3a3c8cf7c6dddb33f7030ac588e271631ecdb5d76c2e91ef846040516119bf9190615ae0565b60405180910390a450505050565b6119d561287b565b6001600160a01b03166119e66114e4565b6001600160a01b031614611a0c5760405162461bcd60e51b8152600401610884906154ec565b8060005b81811015611cb157611a2061445a565b848483818110611a2c57fe5b905060600201803603810190611a4291906148bb565b90506001816040015160ff161115611a6c5760405162461bcd60e51b815260040161088490615028565b80516001600160a01b0316611a935760405162461bcd60e51b8152600401610884906152d4565b6075548210611b2f576075805460018101825560009190915281517f9a8d93986a7b9e6294572ea6736696119c195c1a9f5eae642d3c5fcd44e49dea90910180546020840151604085015160ff16600160b01b0260ff60b01b1961ffff909216600160a01b0261ffff60a01b196001600160a01b039096166001600160a01b031990941693909317949094169190911716919091179055611c56565b611b3761445a565b60758381548110611b4457fe5b60009182526020918290206040805160608101825292909101546001600160a01b03808216808552600160a01b830461ffff1695850195909552600160b01b90910460ff1691830191909152845191935016141580611bb35750806020015161ffff16826020015161ffff1614155b80611bcc5750806040015160ff16826040015160ff1614155b15611c4d578160758481548110611bdf57fe5b6000918252602091829020835191018054928401516040909401516001600160a01b03199093166001600160a01b039092169190911761ffff60a01b1916600160a01b61ffff909416939093029290921760ff60b01b1916600160b01b60ff90921691909102179055611c54565b5050611ca9565b505b80600001516001600160a01b03167fc1bf93444a0055a24a7d0154b75fedf78edfe355c06a2ce8e47f9f39087205598260200151836040015185604051611c9f93929190615a18565b60405180910390a2505b600101611a10565b505b607554811015611d2e57607554600090611cce9060016134b7565b90506075805480611cdb57fe5b600082815260208120820160001990810180546001600160b81b031916905590910190915560405182917f99fa473fdf53414bcd014cf6e7509fc58c68f7b86174767faa6ad5100cd5bae591a250611cb3565b6000611d386134df565b90506103e8811115610cc45760405162461bcd60e51b815260040161088490615547565b6074546001600160a01b031681565b606654604080516318c1996d60e21b815290516000926001600160a01b03169163630665b4916004808301926020929190829003018186803b158015611db057600080fd5b505afa158015611dc4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109159190614922565b611df06114e4565b6001600160a01b0316611e0161287b565b6001600160a01b03161480611e3057506074546001600160a01b0316611e2561287b565b6001600160a01b0316145b80611e5557506073546001600160a01b0316611e4a61287b565b6001600160a01b0316145b611e715760405162461bcd60e51b815260040161088490614f5b565b611e7961287f565b606654604051636a3fd4f960e01b81526001600160a01b0390911690636a3fd4f990611ea9908690600401614b45565b60206040518083038186803b158015611ec157600080fd5b505afa158015611ed5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef991906147f7565b611f155760405162461bcd60e51b8152600401610884906155eb565b611f2f6001600160a01b0384166380ac58cd60e01b6128ed565b611f4b5760405162461bcd60e51b815260040161088490614de4565b611f56607084613571565b611f6557611f656070846135c2565b60005b81811015611f9457611f8c84848484818110611f8057fe5b9050602002013561368a565b600101611f68565b50826001600160a01b03167f51541dc4b4c08a16085809cccdc4cc77d8000b60fbb00142e57f236d842986758383604051611fd0929190614d1f565b60405180910390a2505050565b611fe561287b565b6001600160a01b0316611ff66114e4565b6001600160a01b03161461201c5760405162461bcd60e51b8152600401610884906154ec565b61202461287f565b610d64816137db565b607b5481565b6000610915612815565b6069546001600160a01b031681565b612054610834565b6120705760405162461bcd60e51b81526004016108849061597c565b612078610a9f565b6120945760405162461bcd60e51b81526004016108849061528e565b606954606a546040516313a54bf360e31b81526000926001600160a01b031691639d2a5f98916120cd9163ffffffff1690600401615ae0565b602060405180830381600087803b1580156120e757600080fd5b505af11580156120fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061211f9190614922565b606a80546bffffffffffffffffffffffff191690556073549091506001600160a01b0316156121af57607354606d5460405163266fce1f60e11b81526001600160a01b0390921691634cdf9c3e9161217c91859190600401615a56565b600060405180830381600087803b15801561219657600080fd5b505af11580156121aa573d6000803e3d6000fd5b505050505b6121b881612e06565b6074546001600160a01b03161561223057607454606d54604051632ba8396360e11b81526001600160a01b039092169163575072c6916121fd91859190600401615a56565b600060405180830381600087803b15801561221757600080fd5b505af115801561222b573d6000803e3d6000fd5b505050505b61224061223b612d87565b6129f0565b606d5561224b61287b565b6001600160a01b03167f9c4163ece98173eab9a496c4db8bf3e2c8edcc5d2854377880597ccb858b7a9d826040516122839190614b3c565b60405180910390a2606d5461229661287b565b6001600160a01b03167fc61852c20f0b03b31d782f3022f2bf20322ac17ce66c5349fb6e24740cdd645660405160405180910390a350565b6122d661445a565b607582815481106122e357fe5b60009182526020918290206040805160608101825292909101546001600160a01b0381168352600160a01b810461ffff1693830193909352600160b01b90920460ff169181019190915292915050565b61233b61287b565b6001600160a01b031661234c6114e4565b6001600160a01b0316146123725760405162461bcd60e51b8152600401610884906154ec565b6001600160a01b0381166123985760405162461bcd60e51b815260040161088490614f15565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff168061240d575061240d612d8d565b8061241b575060005460ff16155b6124375760405162461bcd60e51b815260040161088490615360565b600054610100900460ff16158015612462576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0386166124885760405162461bcd60e51b815260040161088490615186565b6001600160a01b0385166124ae5760405162461bcd60e51b815260040161088490615729565b6001600160a01b0384166124d45760405162461bcd60e51b815260040161088490614fde565b6001600160a01b0383166124fa5760405162461bcd60e51b815260040161088490615215565b606680546001600160a01b038089166001600160a01b0319928316179092556067805488841690831617905560698054868416908316179055606880549287169290911691909117905561254d87612db1565b61255561384c565b61255f606e6138de565b60005b825181101561258f5761258783828151811061257a57fe5b6020026020010151612a37565b600101612562565b50606c879055606d8890556125a460706138de565b6125af6107086137db565b856001600160a01b03167ff9632d212436344a25150ff0c161dabf412aade556621c2dea146ca63ff643f58989888888886040516125f296959493929190615a64565b60405180910390a2606d5461260561287b565b6001600160a01b03167fc61852c20f0b03b31d782f3022f2bf20322ac17ce66c5349fb6e24740cdd645660405160405180910390a38015610cbf576000805461ff00191690555050505050505050565b61265d61287b565b6001600160a01b031661266e6114e4565b6001600160a01b0316146126945760405162461bcd60e51b8152600401610884906154ec565b60755460ff8216106126b85760405162461bcd60e51b8152600401610884906153ae565b6001826040015160ff1611156126e05760405162461bcd60e51b815260040161088490615028565b81516001600160a01b03166127075760405162461bcd60e51b8152600401610884906152d4565b8160758260ff168154811061271857fe5b600091825260208083208451920180549185015160409095015160ff16600160b01b0260ff60b01b1961ffff909616600160a01b0261ffff60a01b196001600160a01b039095166001600160a01b031990941693909317939093169190911793909316179091556127876134df565b90506103e88111156127ab5760405162461bcd60e51b815260040161088490615547565b82600001516001600160a01b03167fc1bf93444a0055a24a7d0154b75fedf78edfe355c06a2ce8e47f9f39087205598460200151856040015185604051611fd093929190615a37565b60405180604001604052806005815260200164332e342e3560d81b81525081565b6000806128206128d4565b9050600061282c612d87565b90508181111561284157600092505050610840565b61284b82826134b7565b9250505090565b600080612867670de0b6b3a764000085613922565b9050612873818461395c565b949350505050565b3390565b600061288961399e565b606a54909150640100000000900463ffffffff1615806128b85750606a54640100000000900463ffffffff1681105b610d645760405162461bcd60e51b8152600401610884906158a7565b6000610915606c54606d54612d6290919063ffffffff16565b60006128f8836139a2565b8015612909575061290983836139d5565b9392505050565b606080826000015467ffffffffffffffff8111801561292e57600080fd5b50604051908082528060200260200182016040528015612958578160200160208202803683370190505b50600160008181529085016020526040812054919250906001600160a01b03165b6001600160a01b0381161580159061299b57506001600160a01b038116600114155b156129e757808383815181106129ad57fe5b6001600160a01b03928316602091820292909201810191909152918116600090815260018088019093526040902054929091019116612979565b50909392505050565b600080612a14606c54612a0e606d54866134b790919063ffffffff16565b906139fb565b9050612909612a2e606c548361392290919063ffffffff16565b606d5490612d62565b612a49816001600160a01b0316613a2d565b612a655760405162461bcd60e51b8152600401610884906153f4565b606654604051636a3fd4f960e01b81526001600160a01b0390911690636a3fd4f990612a95908490600401614b45565b60206040518083038186803b158015612aad57600080fd5b505afa158015612ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae591906147f7565b612b015760405162461bcd60e51b8152600401610884906155eb565b60408051600481526024810182526020810180516001600160e01b03166318160ddd60e01b17905290516000916060916001600160a01b03851691612b4591614b20565b600060405180830381855afa9150503d8060008114612b80576040519150601f19603f3d011682016040523d82523d6000602084013e612b85565b606091505b509150915081612ba75760405162461bcd60e51b81526004016108849061531d565b612bb2606e846135c2565b6040516001600160a01b038416907fbcd6d991f3416e288bf59a2997b423772937b62c7ea7dd1a54af7771de1f741890600090a2505050565b6001600160a01b038116600114801590612c0d57506001600160a01b03811615155b612c295760405162461bcd60e51b815260040161088490614e74565b6001600160a01b038281166000908152600185016020526040902054811690821614612c675760405162461bcd60e51b815260040161088490614e9d565b6001600160a01b039081166000818152600185016020526040808220805495851683529082208054959094166001600160a01b03199586161790935552805490911690558054600019019055565b6001600160a01b0381166000908152607260205260408120612cd69161447a565b6040516001600160a01b038216907fcd64d9dacd230c5ccf1278ea5332b0621aa28c950fb0e61c8fbc9e2011c88a3490600090a250565b60008111612d2d5760405162461bcd60e51b815260040161088490615474565b60768190556040517fc44c7222e8df09744ced394101df47e78dedb642d3065267bb388901de9df6d490610a7d908390614b3c565b6000828201838110156129095760405162461bcd60e51b815260040161088490614fa7565b607b5490565b600061132b30613a2d565b6000612da26128d4565b612daa612d87565b1015905090565b60008111612dd15760405162461bcd60e51b815260040161088490615070565b606c8190556040517f0d379c1a7282461e725a9dc2d74e65246c77e98ae93835e26c2f1654c48ee4ec90610a7d908390614b3c565b6066546040805163e6d8a94b60e01b815290516000926001600160a01b03169163e6d8a94b91600480830192602092919082900301818787803b158015612e4c57600080fd5b505af1158015612e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e849190614922565b9050612e8f81613a33565b9050606760009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612edf57600080fd5b505afa158015612ef3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f179190614922565b612f4a576040517f3728feb3fc1ef1bf4a24036afbe7d34b59c551bf0d2ab5564e87ec1734fa80dd90600090a150610d64565b60795460765460ff9091169060608167ffffffffffffffff81118015612f6f57600080fd5b50604051908082528060200260200182016040528015612f99578160200160208202803683370190505b50607a54909150859060009081905b8583101561314457606754604051633b30414760e01b81526000916001600160a01b031690633b30414790612fe1908890600401614b3c565b60206040518083038186803b158015612ff957600080fd5b505afa15801561300d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130319190614573565b6001600160a01b03811660009081526078602052604090205490915060ff1661308c578086858060010196508151811061306757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050613105565b818360010193508310613105577fb5f728fcb182000eb8e953c15f6795f07b6cda75b35ef0b65645b53aac636945846040516130c89190614b3c565b60405180910390a1836130ff576040517f3728feb3fc1ef1bf4a24036afbe7d34b59c551bf0d2ab5564e87ec1734fa80dd90600090a15b50613144565b60008461020902866101f301016040516020016131229190614b3c565b60408051601f1981840301815291905280516020909101209550612fa8915050565b6131618560008151811061315457fe5b6020026020010151613ae0565b6000876131775761317289856139fb565b613181565b61318189886139fb565b905080156131bb5760005b848110156131b9576131b18782815181106131a357fe5b602002602001015183613c50565b60010161318c565b505b60775460ff161561336a5760006131d2606e613cbd565b90505b6001600160a01b0381161580159061320857506131f2606e613cda565b6001600160a01b0316816001600160a01b031614155b15613364576066546040516370a0823160e01b81526000916001600160a01b03808516926370a0823192613240921690600401614b45565b60206040518083038186803b15801561325857600080fd5b505afa15801561326c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132909190614922565b905060008a6132a8576132a382886139fb565b6132b2565b6132b2828b6139fb565b905080156133505760005b8781101561334e576066548a516001600160a01b0390911690632b0ab144908c90849081106132e857fe5b602002602001015186856040518463ffffffff1660e01b815260040161331093929190614bda565b600060405180830381600087803b15801561332a57600080fd5b505af115801561333e573d6000803e3d6000fd5b5050600190920191506132bd9050565b505b61335b606e84613ce0565b925050506131d5565b50613387565b6133878660008151811061337a57fe5b6020026020010151613d03565b50505050505050505050565b80158061341b5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906133c99030908690600401614b59565b60206040518083038186803b1580156133e157600080fd5b505afa1580156133f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134199190614922565b155b6134375760405162461bcd60e51b81526004016108849061580b565b610fbe8363095ea7b360e01b8484604051602401613456929190614c29565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613e4f565b600064010000000082106134b35760405162461bcd60e51b81526004016108849061565d565b5090565b6000828211156134d95760405162461bcd60e51b81526004016108849061514f565b50900390565b6075546000908190815b818160ff161015613569576134fc61445a565b60758260ff168154811061350c57fe5b60009182526020918290206040805160608101825292909101546001600160a01b0381168352600160a01b810461ffff16938301849052600160b01b900460ff1690820152915061355e908590612d62565b9350506001016134e9565b509091505090565b60006001600160a01b03821660011480159061359557506001600160a01b03821615155b80156129095750506001600160a01b03908116600090815260019290920160205260409091205416151590565b6001600160a01b0381166001148015906135e457506001600160a01b03811615155b6136005760405162461bcd60e51b815260040161088490614e74565b6001600160a01b038181166000908152600184016020526040902054161561363a5760405162461bcd60e51b815260040161088490615636565b60016000818152838201602052604080822080546001600160a01b039586168085529284208054969091166001600160a01b03199687161790559183905281549093169092179091558154019055565b6066546040516331a9108f60e11b81526001600160a01b0391821691841690636352211e906136bd908590600401614b3c565b60206040518083038186803b1580156136d557600080fd5b505afa1580156136e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061370d9190614573565b6001600160a01b0316146137335760405162461bcd60e51b8152600401610884906159c3565b60005b6001600160a01b0383166000908152607260205260409020548110156137ae576001600160a01b038316600090815260726020526040902080548391908390811061377d57fe5b906000526020600020015414156137a65760405162461bcd60e51b815260040161088490615861565b600101613736565b506001600160a01b0390911660009081526072602090815260408220805460018101825590835291200155565b603c8163ffffffff16116138015760405162461bcd60e51b815260040161088490615930565b606b805463ffffffff191663ffffffff83811691909117918290556040517f4f27f6f220ffad585e728389bc2f0f6b74eeebeb43f95f53752a647cb6e7e68792610a7d921690615ae0565b600054610100900460ff16806138655750613865612d8d565b80613873575060005460ff16155b61388f5760405162461bcd60e51b815260040161088490615360565b600054610100900460ff161580156138ba576000805460ff1961ff0019909116610100171660011790555b6138c2613ede565b6138ca613f5f565b8015610d64576000805461ff001916905550565b8054156138fd5760405162461bcd60e51b815260040161088490615521565b60016000818152918101602052604090912080546001600160a01b0319169091179055565b600082613931575060006107e3565b8282028284828161393e57fe5b04146129095760405162461bcd60e51b8152600401610884906154ab565b600061290983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614039565b4390565b60006139b5826301ffc9a760e01b6139d5565b80156107e357506139ce826001600160e01b03196139d5565b1592915050565b60008060006139e48585614070565b915091508180156139f25750805b95945050505050565b6000808211613a1c5760405162461bcd60e51b815260040161088490615257565b818381613a2557fe5b049392505050565b3b151590565b6075546000908290825b81811015613ad757613a4d61445a565b60758281548110613a5a57fe5b600091825260208083206040805160608101825293909101546001600160a01b0381168452600160a01b810461ffff16928401839052600160b01b900460ff1690830152909250613aac908690614165565b9050613ac18260000151828460400151614179565b613acb87826134b7565b96505050600101613a3d565b50929392505050565b6000613aec6070613cbd565b90505b6001600160a01b03811615801590613b225750613b0c6070613cda565b6001600160a01b0316816001600160a01b031614155b15613c46576066546040516370a0823160e01b81526000916001600160a01b03808516926370a0823192613b5a921690600401614b45565b60206040518083038186803b158015613b7257600080fd5b505afa158015613b86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613baa9190614922565b90508015613c33576066546001600160a01b038381166000908152607260205260409081902090516316960d5560e01b815291909216916316960d5591613bf8918791879190600401614b73565b600060405180830381600087803b158015613c1257600080fd5b505af1158015613c26573d6000803e3d6000fd5b50505050613c3382612cb5565b613c3e607083613ce0565b915050613aef565b61101f6070614184565b60665460675460405163358dc31d60e11b81526001600160a01b0392831692636b1b863a92613c8792879287921690600401614c42565b600060405180830381600087803b158015613ca157600080fd5b505af1158015613cb5573d6000803e3d6000fd5b505050505050565b60016000818152910160205260409020546001600160a01b031690565b50600190565b6001600160a01b0380821660009081526001840160205260409020541692915050565b6000613d0f606e613cbd565b90505b6001600160a01b03811615801590613d455750613d2f606e613cda565b6001600160a01b0316816001600160a01b031614155b1561101f576066546040516370a0823160e01b81526000916001600160a01b03808516926370a0823192613d7d921690600401614b45565b60206040518083038186803b158015613d9557600080fd5b505afa158015613da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dcd9190614922565b90508015613e3c57606654604051630ac2ac5160e21b81526001600160a01b0390911690632b0ab14490613e0990869086908690600401614bda565b600060405180830381600087803b158015613e2357600080fd5b505af1158015613e37573d6000803e3d6000fd5b505050505b613e47606e83613ce0565b915050613d12565b6060613ea4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166142209092919063ffffffff16565b805190915015610fbe5780806020019051810190613ec291906147f7565b610fbe5760405162461bcd60e51b81526004016108849061576e565b600054610100900460ff1680613ef75750613ef7612d8d565b80613f05575060005460ff16155b613f215760405162461bcd60e51b815260040161088490615360565b600054610100900460ff161580156138ca576000805460ff1961ff0019909116610100171660011790558015610d64576000805461ff001916905550565b600054610100900460ff1680613f785750613f78612d8d565b80613f86575060005460ff16155b613fa25760405162461bcd60e51b815260040161088490615360565b600054610100900460ff16158015613fcd576000805460ff1961ff0019909116610100171660011790555b6000613fd761287b565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610d64576000805461ff001916905550565b6000818361405a5760405162461bcd60e51b81526004016108849190614db1565b50600083858161406657fe5b0495945050505050565b60008060606301ffc9a760e01b8460405160240161408e9190614d9c565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050905060006060866001600160a01b0316617530846040516140e29190614b20565b6000604051808303818686fa925050503d806000811461411e576040519150601f19603f3d011682016040523d82523d6000602084013e614123565b606091505b5091509150602081511015614141576000809450945050505061415e565b818180602001905181019061415691906147f7565b945094505050505b9250929050565b600061290961ffff831684026103e86139fb565b610fbe83838361422f565b6001600081815290820160205260409020546001600160a01b03165b6001600160a01b038116158015906141c257506001600160a01b038116600114155b156141f8576001600160a01b039081166000908152600183016020526040902080546001600160a01b03198116909155166141a0565b50600160008181528282016020526040812080546001600160a01b0319169092179091559055565b60606128738484600085614360565b60665460408051634eb1c24560e11b815290516060926001600160a01b031691639d63848a916004808301926000929190829003018186803b15801561427457600080fd5b505afa158015614288573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526142b0919081019061468d565b905080518260ff1611156142d65760405162461bcd60e51b8152600401610884906156da565b6000818360ff16815181106142e757fe5b602090810291909101015160665460405163358dc31d60e11b81529192506001600160a01b031690636b1b863a9061432790889088908690600401614c42565b600060405180830381600087803b15801561434157600080fd5b505af1158015614355573d6000803e3d6000fd5b505050505050505050565b6060824710156143825760405162461bcd60e51b8152600401610884906151cf565b61438b85613a2d565b6143a75760405162461bcd60e51b8152600401610884906156a3565b60006060866001600160a01b031685876040516143c49190614b20565b60006040518083038185875af1925050503d8060008114614401576040519150601f19603f3d011682016040523d82523d6000602084013e614406565b606091505b5091509150614416828286614421565b979650505050505050565b60608315614430575081612909565b8251156144405782518084602001fd5b8160405162461bcd60e51b81526004016108849190614db1565b604080516060810182526000808252602082018190529181019190915290565b5080546000825590600052602060002090810190610d6491905b808211156134b35760008155600101614494565b60008083601f8401126144b9578081fd5b50813567ffffffffffffffff8111156144d0578182fd5b602083019150836020808302850101111561415e57600080fd5b6000606082840312156144fb578081fd5b6145056060615af1565b9050813561451281615b64565b8152602082013561ffff8116811461452957600080fd5b602082015261453b8360408401614546565b604082015292915050565b803560ff811681146107e357600080fd5b600060208284031215614568578081fd5b813561290981615b64565b600060208284031215614584578081fd5b815161290981615b64565b600080600080608085870312156145a4578283fd5b84356145af81615b64565b935060208501356145bf81615b64565b92506040850135915060608501356145d681615b64565b939692955090935050565b600080604083850312156145f3578081fd5b82356145fe81615b64565b9150602083013561460e81615b79565b809150509250929050565b6000806040838503121561462b578182fd5b825161463681615b64565b6020939093015192949293505050565b6000806000806080858703121561465b578182fd5b843561466681615b64565b935060208501359250604085013561467d81615b64565b915060608501356145d681615b64565b6000602080838503121561469f578182fd5b825167ffffffffffffffff8111156146b5578283fd5b8301601f810185136146c5578283fd5b80516146d86146d382615b18565b615af1565b81815283810190838501858402850186018910156146f4578687fd5b8694505b8385101561471f57805161470b81615b64565b8352600194909401939185019185016146f8565b50979650505050505050565b6000806020838503121561473d578182fd5b823567ffffffffffffffff811115614753578283fd5b61475f858286016144a8565b90969095509350505050565b6000806020838503121561477d578182fd5b823567ffffffffffffffff80821115614794578384fd5b818501915085601f8301126147a7578384fd5b8135818111156147b5578485fd5b8660206060830285010111156147c9578485fd5b60209290920196919550909350505050565b6000602082840312156147ec578081fd5b813561290981615b79565b600060208284031215614808578081fd5b815161290981615b79565b600060208284031215614824578081fd5b81356001600160e01b031981168114612909578182fd5b6000806040838503121561484d578182fd5b823561485881615b64565b9150602083013561460e81615b64565b60008060006040848603121561487c578081fd5b833561488781615b64565b9250602084013567ffffffffffffffff8111156148a2578182fd5b6148ae868287016144a8565b9497909650939450505050565b6000606082840312156148cc578081fd5b61290983836144ea565b600080608083850312156148e8578182fd5b6148f284846144ea565b91506149018460608501614546565b90509250929050565b60006020828403121561491b578081fd5b5035919050565b600060208284031215614933578081fd5b5051919050565b600080600080600080600060e0888a031215614954578485fd5b873596506020808901359650604089013561496e81615b64565b9550606089013561497e81615b64565b9450608089013561498e81615b64565b935060a089013561499e81615b64565b925060c089013567ffffffffffffffff8111156149b9578283fd5b8901601f81018b136149c9578283fd5b80356149d76146d382615b18565b81815283810190838501858402850186018f10156149f3578687fd5b8694505b83851015614a1e578035614a0a81615b64565b8352600194909401939185019185016149f7565b50809550505050505092959891949750929550565b600080600080600080600060e0888a031215614a4d578081fd5b87359650602088013595506040880135614a6681615b64565b94506060880135614a7681615b64565b93506080880135614a8681615b64565b925060a0880135614a9681615b64565b8092505060c0880135905092959891949750929550565b600060208284031215614abe578081fd5b813561290981615b87565b60008060408385031215614adb578182fd5b8251614ae681615b87565b602084015190925061460e81615b87565b80516001600160a01b0316825260208082015161ffff169083015260409081015160ff16910152565b60008251614b32818460208701615b38565b9190910192915050565b90815260200190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03848116825283166020808301919091526060604083018190528354908301819052600084815282812090929091608085019190845b81811015614bcc57845484526001948501949383019301614bb0565b509198975050505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03948516815292841660208401526040830191909152909116606082015260800190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6001600160a01b03948516815260208101939093529083166040830152909116606082015260800190565b6020808252825182820181905260009190848201906040850190845b81811015614cd15783516001600160a01b031683529284019291840191600101614cac565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614cd157614d0c838551614af7565b9284019260609290920191600101614cf9565b6020808252810182905260006001600160fb1b03831115614d3e578081fd5b60208302808560408501379190910160400190815292915050565b6020808252825182820181905260009190848201906040850190845b81811015614cd157835183529284019291840191600101614d75565b901515815260200190565b6001600160e01b031991909116815260200190565b6000602082528251806020840152614dd0816040850160208701615b38565b601f01601f19169190910160400192915050565b60208082526024908201527f506572696f6469635072697a6553747261746567792f6572633732312d696e76604082015263185b1a5960e21b606082015260800190565b6020808252602c908201527f506572696f6469635072697a6553747261746567792f746f6b656e2d6c69737460408201526b195b995c8b5a5b9d985b1a5960a21b606082015260800190565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b602080825260139082015272496e76616c696420707265764164647265737360681b604082015260600190565b6020808252602b908201527f506572696f6469635072697a6553747261746567792f7072697a652d7065726960408201526a37b216b737ba16b7bb32b960a91b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252602c908201527f506572696f6469635072697a6553747261746567792f6f6e6c792d6f776e657260408201526b16b7b916b634b9ba32b732b960a11b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252602a908201527f506572696f6469635072697a6553747261746567792f73706f6e736f72736869604082015269702d6e6f742d7a65726f60b01b606082015260800190565b60208082526028908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c60408201526734ba16ba37b5b2b760c11b606082015260800190565b60208082526034908201527f506572696f6469635072697a6553747261746567792f7072697a652d706572696040820152736f642d677265617465722d7468616e2d7a65726f60601b606082015260800190565b60208082526025908201527f506572696f6469635072697a6553747261746567792f6f6e6c792d7072697a656040820152640b5c1bdbdb60da1b606082015260800190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f7472616e736665722d746040820152653796b9b2b63360d11b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526029908201527f506572696f6469635072697a6553747261746567792f7072697a652d706f6f6c6040820152682d6e6f742d7a65726f60b81b606082015260800190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526022908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d7a65604082015261726f60f01b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d636f6040820152656d706c65746560d01b606082015260800190565b60208082526029908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c6040820152681a5d0b5d185c99d95d60ba1b606082015260800190565b60208082526023908201527f506572696f6469635072697a6553747261746567792f65726332302d696e76616040820152621b1a5960ea1b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526026908201527f4d756c7469706c6557696e6e6572732f6e6f6e6578697374656e742d7072697a604082015265195cdc1b1a5d60d21b606082015260800190565b6020808252818101527f506572696f6469635072697a6553747261746567792f65726332302d6e756c6c604082015260600190565b6020808252602b908201527f506572696f6469635072697a6553747261746567792f726e672d616c7265616460408201526a1e4b5c995c5d595cdd195960aa1b606082015260800190565b6020808252601f908201527f4d756c7469706c6557696e6e6572732f77696e6e6572732d6774652d6f6e6500604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600c908201526b105b1c9958591e481a5b9a5d60a21b604082015260600190565b60208082526033908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c6040820152721a5d0b5c195c98d95b9d1859d94b5d1bdd185b606a1b606082015260800190565b60208082526031908201527f506572696f6469635072697a6553747261746567792f6265666f72654177617260408201527019131a5cdd195b995c8b5a5b9d985b1a59607a1b606082015260800190565b6020808252602b908201527f506572696f6469635072697a6553747261746567792f63616e6e6f742d61776160408201526a1c990b595e1d195c9b985b60aa1b606082015260800190565b6020808252600d908201526c105b1c9958591e481859191959609a1b604082015260600190565b60208082526026908201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360408201526532206269747360d01b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602f908201527f506572696f6469635072697a6553747261746567792f61776172642d696e766160408201526e0d8d2c85ae8ded6cadc5ad2dcc8caf608b1b606082015260800190565b60208082526025908201527f506572696f6469635072697a6553747261746567792f7469636b65742d6e6f746040820152642d7a65726f60d81b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526033908201527f506572696f6469635072697a6553747261746567792f7072697a6553747261746040820152721959de531a5cdd195b995c8b5a5b9d985b1a59606a1b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f6572633732312d6475706040820152656c696361746560d01b606082015260800190565b60208082526023908201527f506572696f6469635072697a6553747261746567792f726e672d696e2d666c6960408201526219da1d60ea1b606082015260800190565b60208082526026908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d74696040820152651b59591bdd5d60d21b606082015260800190565b6020808252602c908201527f506572696f6469635072697a6553747261746567792f726e672d74696d656f7560408201526b742d67742d36302d7365637360a01b606082015260800190565b60208082526027908201527f506572696f6469635072697a6553747261746567792f726e672d6e6f742d72656040820152661c5d595cdd195960ca1b606082015260800190565b60208082526027908201527f506572696f6469635072697a6553747261746567792f756e617661696c61626c6040820152663296ba37b5b2b760c91b606082015260800190565b606081016107e38284614af7565b61ffff93909316835260ff919091166020830152604082015260600190565b61ffff93909316835260ff918216602084015216604082015260600190565b918252602082015260400190565b86815260208082018790526001600160a01b0386811660408401528581166060840152848116608084015260c060a08401819052845190840181905260009285810192909160e0860190855b81811015615ace578551841683529484019491840191600101615ab0565b50909c9b505050505050505050505050565b63ffffffff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615b1057600080fd5b604052919050565b600067ffffffffffffffff821115615b2e578081fd5b5060209081020190565b60005b83811015615b53578181015183820152602001615b3b565b83811115610cc45750506000910152565b6001600160a01b0381168114610d6457600080fd5b8015158114610d6457600080fd5b63ffffffff81168114610d6457600080fdfea26469706673582212200b04a034fdc9b603434ff2e14bbf9df827851a7ec270ad4d35335f3752edeb5f64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x1D SWAP1 PUSH2 0x5F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x39 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x6C JUMP JUMPDEST PUSH2 0x5BF0 DUP1 PUSH2 0x3B2 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH2 0x337 DUP1 PUSH2 0x7B PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x22EC095 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x6A JUMPI DUP1 PUSH4 0xEFC81A8C EQ PUSH2 0x120 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x128 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x137 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x4E PUSH2 0x2B3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x265 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x26A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2DE PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE DUP3 DUP2 MSTORE PUSH2 0x2D8 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x137 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 0xDD SAR 0xA5 MOD 0xCF 0x26 0x49 0xC1 CALLCODE 0xB8 CALLDATALOAD SWAP9 0xC6 0xD2 SIGNEXTEND 0x4D 0xA7 0xF SDIV EXTCODEHASH SIGNEXTEND DUP12 DUP2 MSIZE 0xC 0x2C BALANCE 0xBF 0xB9 PUSH18 0x577564736F6C634300060C00336080604052 CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5BCF DUP1 PUSH3 0x21 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x3E6 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7F2BE9FC GT PUSH2 0x20A JUMPI DUP1 PUSH4 0xB0244682 GT PUSH2 0x125 JUMPI DUP1 PUSH4 0xD18E81B3 GT PUSH2 0xB8 JUMPI DUP1 PUSH4 0xEEFC8AD1 GT PUSH2 0x87 JUMPI DUP1 PUSH4 0xEEFC8AD1 EQ PUSH2 0x762 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x782 JUMPI DUP1 PUSH4 0xF97700E2 EQ PUSH2 0x795 JUMPI DUP1 PUSH4 0xFBF0953E EQ PUSH2 0x7A8 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x7BB JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0xD18E81B3 EQ PUSH2 0x742 JUMPI DUP1 PUSH4 0xD5AD6BF6 EQ PUSH2 0x74A JUMPI DUP1 PUSH4 0xD605787B EQ PUSH2 0x752 JUMPI DUP1 PUSH4 0xDFB2F13B EQ PUSH2 0x75A JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0xC2F19EE8 GT PUSH2 0xF4 JUMPI DUP1 PUSH4 0xC2F19EE8 EQ PUSH2 0x70C JUMPI DUP1 PUSH4 0xC42B42A0 EQ PUSH2 0x714 JUMPI DUP1 PUSH4 0xC48DDBCB EQ PUSH2 0x71C JUMPI DUP1 PUSH4 0xC6853270 EQ PUSH2 0x72F JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0xB0244682 EQ PUSH2 0x6CB JUMPI DUP1 PUSH4 0xB2210957 EQ PUSH2 0x6DE JUMPI DUP1 PUSH4 0xB9EE1E05 EQ PUSH2 0x6F1 JUMPI DUP1 PUSH4 0xC25A9C32 EQ PUSH2 0x6F9 JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x8E204C43 GT PUSH2 0x19D JUMPI DUP1 PUSH4 0x95E5F9EE GT PUSH2 0x16C JUMPI DUP1 PUSH4 0x95E5F9EE EQ PUSH2 0x6A0 JUMPI DUP1 PUSH4 0x9DAFAFB0 EQ PUSH2 0x6A8 JUMPI DUP1 PUSH4 0xA4E075CA EQ PUSH2 0x6B0 JUMPI DUP1 PUSH4 0xACCA5B95 EQ PUSH2 0x6C3 JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x8E204C43 EQ PUSH2 0x652 JUMPI DUP1 PUSH4 0x91C05B0B EQ PUSH2 0x665 JUMPI DUP1 PUSH4 0x94144C6B EQ PUSH2 0x678 JUMPI DUP1 PUSH4 0x9417783F EQ PUSH2 0x680 JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x8AA3EC6F GT PUSH2 0x1D9 JUMPI DUP1 PUSH4 0x8AA3EC6F EQ PUSH2 0x61A JUMPI DUP1 PUSH4 0x8ACFACA9 EQ PUSH2 0x62D JUMPI DUP1 PUSH4 0x8D5F10C4 EQ PUSH2 0x635 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x64A JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x7F2BE9FC EQ PUSH2 0x5D9 JUMPI DUP1 PUSH4 0x7F4296D7 EQ PUSH2 0x5EC JUMPI DUP1 PUSH4 0x876F5C7E EQ PUSH2 0x5FF JUMPI DUP1 PUSH4 0x884A4448 EQ PUSH2 0x607 JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x4E5D08E0 GT PUSH2 0x305 JUMPI DUP1 PUSH4 0x6BE51C4F GT PUSH2 0x298 JUMPI DUP1 PUSH4 0x6F46F221 GT PUSH2 0x267 JUMPI DUP1 PUSH4 0x6F46F221 EQ PUSH2 0x5B1 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x5B9 JUMPI DUP1 PUSH4 0x719CE73E EQ PUSH2 0x5C1 JUMPI DUP1 PUSH4 0x72F33EA9 EQ PUSH2 0x5C9 JUMPI DUP1 PUSH4 0x738BBEA8 EQ PUSH2 0x5D1 JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x6BE51C4F EQ PUSH2 0x586 JUMPI DUP1 PUSH4 0x6BEA5344 EQ PUSH2 0x58E JUMPI DUP1 PUSH4 0x6CC25DB7 EQ PUSH2 0x596 JUMPI DUP1 PUSH4 0x6DFB0386 EQ PUSH2 0x59E JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x62C77A61 GT PUSH2 0x2D4 JUMPI DUP1 PUSH4 0x62C77A61 EQ PUSH2 0x550 JUMPI DUP1 PUSH4 0x66968221 EQ PUSH2 0x558 JUMPI DUP1 PUSH4 0x671137C4 EQ PUSH2 0x56B JUMPI DUP1 PUSH4 0x6A74F107 EQ PUSH2 0x57E JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x4E5D08E0 EQ PUSH2 0x50F JUMPI DUP1 PUSH4 0x500DB70D EQ PUSH2 0x522 JUMPI DUP1 PUSH4 0x52A30109 EQ PUSH2 0x52A JUMPI DUP1 PUSH4 0x605E25AC EQ PUSH2 0x53D JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x2C8FE73D GT PUSH2 0x37D JUMPI DUP1 PUSH4 0x47BED998 GT PUSH2 0x34C JUMPI DUP1 PUSH4 0x47BED998 EQ PUSH2 0x4D9 JUMPI DUP1 PUSH4 0x4ABA4F6B EQ PUSH2 0x4EC JUMPI DUP1 PUSH4 0x4C169F4F EQ PUSH2 0x4F4 JUMPI DUP1 PUSH4 0x4D7F3DB0 EQ PUSH2 0x4FC JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x2C8FE73D EQ PUSH2 0x496 JUMPI DUP1 PUSH4 0x30FCDF41 EQ PUSH2 0x49E JUMPI DUP1 PUSH4 0x38A9B4B6 EQ PUSH2 0x4B1 JUMPI DUP1 PUSH4 0x42D09209 EQ PUSH2 0x4C4 JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x111070E4 GT PUSH2 0x3B9 JUMPI DUP1 PUSH4 0x111070E4 EQ PUSH2 0x451 JUMPI DUP1 PUSH4 0x152D308C EQ PUSH2 0x459 JUMPI DUP1 PUSH4 0x22F8E566 EQ PUSH2 0x46C JUMPI DUP1 PUSH4 0x2A7AD609 EQ PUSH2 0x481 JUMPI PUSH2 0x3E6 JUMP JUMPDEST DUP1 PUSH4 0x1B48E34 EQ PUSH2 0x3EB JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x414 JUMPI DUP1 PUSH4 0xD847FC4 EQ PUSH2 0x434 JUMPI DUP1 PUSH4 0xFAF125F EQ PUSH2 0x449 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3FE PUSH2 0x3F9 CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0x7D0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x427 PUSH2 0x422 CALLDATASIZE PUSH1 0x4 PUSH2 0x4813 JUMP JUMPDEST PUSH2 0x7E9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x4D91 JUMP JUMPDEST PUSH2 0x43C PUSH2 0x81F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x4B45 JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x82E JUMP JUMPDEST PUSH2 0x427 PUSH2 0x834 JUMP JUMPDEST PUSH2 0x427 PUSH2 0x467 CALLDATASIZE PUSH1 0x4 PUSH2 0x45E1 JUMP JUMPDEST PUSH2 0x843 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x47A CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0x8FA JUMP JUMPDEST STOP JUMPDEST PUSH2 0x489 PUSH2 0x8FF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x5AE0 JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x90B JUMP JUMPDEST PUSH2 0x47F PUSH2 0x4AC CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0x91A JUMP JUMPDEST PUSH2 0x47F PUSH2 0x4BF CALLDATASIZE PUSH1 0x4 PUSH2 0x47DB JUMP JUMPDEST PUSH2 0x9F2 JUMP JUMPDEST PUSH2 0x4CC PUSH2 0xA88 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x4C90 JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x4E7 CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0xA94 JUMP JUMPDEST PUSH2 0x427 PUSH2 0xA9F JUMP JUMPDEST PUSH2 0x47F PUSH2 0xB28 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x50A CALLDATASIZE PUSH1 0x4 PUSH2 0x4646 JUMP JUMPDEST PUSH2 0xBF2 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x51D CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0xCCA JUMP JUMPDEST PUSH2 0x43C PUSH2 0xD67 JUMP JUMPDEST PUSH2 0x427 PUSH2 0x538 CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0xD76 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x54B CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0xE04 JUMP JUMPDEST PUSH2 0x4CC PUSH2 0xEE5 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x566 CALLDATASIZE PUSH1 0x4 PUSH2 0x472B JUMP JUMPDEST PUSH2 0xEF1 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x579 CALLDATASIZE PUSH1 0x4 PUSH2 0x483B JUMP JUMPDEST PUSH2 0xFC3 JUMP JUMPDEST PUSH2 0x427 PUSH2 0x1023 JUMP JUMPDEST PUSH2 0x43C PUSH2 0x103C JUMP JUMPDEST PUSH2 0x489 PUSH2 0x104B JUMP JUMPDEST PUSH2 0x43C PUSH2 0x105F JUMP JUMPDEST PUSH2 0x47F PUSH2 0x5AC CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0x106E JUMP JUMPDEST PUSH2 0x427 PUSH2 0x10BE JUMP JUMPDEST PUSH2 0x47F PUSH2 0x10C7 JUMP JUMPDEST PUSH2 0x43C PUSH2 0x1150 JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x115F JUMP JUMPDEST PUSH2 0x427 PUSH2 0x1165 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x5E7 CALLDATASIZE PUSH1 0x4 PUSH2 0x4A33 JUMP JUMPDEST PUSH2 0x11B8 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x5FA CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0x125C JUMP JUMPDEST PUSH2 0x427 PUSH2 0x1312 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x615 CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0x1331 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x628 CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0x1381 JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x1459 JUMP JUMPDEST PUSH2 0x63D PUSH2 0x145F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x4CDD JUMP JUMPDEST PUSH2 0x43C PUSH2 0x14E4 JUMP JUMPDEST PUSH2 0x427 PUSH2 0x660 CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0x14F3 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x673 CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0x1508 JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x1511 JUMP JUMPDEST PUSH2 0x693 PUSH2 0x68E CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0x1517 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x4D59 JUMP JUMPDEST PUSH2 0x427 PUSH2 0x1583 JUMP JUMPDEST PUSH2 0x427 PUSH2 0x158D JUMP JUMPDEST PUSH2 0x427 PUSH2 0x6BE CALLDATASIZE PUSH1 0x4 PUSH2 0x47DB JUMP JUMPDEST PUSH2 0x1596 JUMP JUMPDEST PUSH2 0x489 PUSH2 0x161D JUMP JUMPDEST PUSH2 0x47F PUSH2 0x6D9 CALLDATASIZE PUSH1 0x4 PUSH2 0x483B JUMP JUMPDEST PUSH2 0x1629 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x6EC CALLDATASIZE PUSH1 0x4 PUSH2 0x458F JUMP JUMPDEST PUSH2 0x16B4 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x1785 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x707 CALLDATASIZE PUSH1 0x4 PUSH2 0x476B JUMP JUMPDEST PUSH2 0x19CD JUMP JUMPDEST PUSH2 0x43C PUSH2 0x1D5C JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x1D6B JUMP JUMPDEST PUSH2 0x47F PUSH2 0x72A CALLDATASIZE PUSH1 0x4 PUSH2 0x4868 JUMP JUMPDEST PUSH2 0x1DE8 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x73D CALLDATASIZE PUSH1 0x4 PUSH2 0x4AAD JUMP JUMPDEST PUSH2 0x1FDD JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x202D JUMP JUMPDEST PUSH2 0x3FE PUSH2 0x2033 JUMP JUMPDEST PUSH2 0x43C PUSH2 0x203D JUMP JUMPDEST PUSH2 0x47F PUSH2 0x204C JUMP JUMPDEST PUSH2 0x775 PUSH2 0x770 CALLDATASIZE PUSH1 0x4 PUSH2 0x490A JUMP JUMPDEST PUSH2 0x22CE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x5A0A JUMP JUMPDEST PUSH2 0x47F PUSH2 0x790 CALLDATASIZE PUSH1 0x4 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0x2333 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x7A3 CALLDATASIZE PUSH1 0x4 PUSH2 0x493A JUMP JUMPDEST PUSH2 0x23F4 JUMP JUMPDEST PUSH2 0x47F PUSH2 0x7B6 CALLDATASIZE PUSH1 0x4 PUSH2 0x48D6 JUMP JUMPDEST PUSH2 0x2655 JUMP JUMPDEST PUSH2 0x7C3 PUSH2 0x27F4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x40B SWAP2 SWAP1 PUSH2 0x4DB1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7E3 PUSH2 0x7DD PUSH2 0x2815 JUMP JUMPDEST DUP4 PUSH2 0x2852 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL EQ DUP1 PUSH2 0x7E3 JUMPI POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT EQ SWAP1 JUMP JUMPDEST PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x7A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH4 0xFFFFFFFF AND ISZERO ISZERO JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x84D PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x85E PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x88D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x895 PUSH2 0x287F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x78 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND DUP6 ISZERO ISZERO OR SWAP1 SSTORE MLOAD PUSH32 0xD1AC9A365C0E3BFAD562E0A809A5DED3842A2B489F839B3327E4E34EE0128F28 SWAP1 PUSH2 0x8E9 SWAP1 DUP6 SWAP1 PUSH2 0x4D91 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x7B SSTORE JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x915 PUSH2 0x28D4 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x922 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x933 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x959 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x961 PUSH2 0x287F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0x98C JUMPI POP PUSH2 0x98C PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH4 0x266FCE1F PUSH1 0xE1 SHL PUSH2 0x28ED JUMP JUMPDEST PUSH2 0x9A8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x559A JUMP JUMPDEST PUSH1 0x73 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xC4FEFF61630891EA2CB42A54FBE3FF2E65422F2ED17323AC6B65F4521112E87E SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH2 0x9FA PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xA0B PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xA31 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0xA39 PUSH2 0x287F JUMP JUMPDEST PUSH1 0x77 DUP1 SLOAD PUSH1 0xFF NOT AND DUP3 ISZERO ISZERO OR SWAP1 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x6959D02E8FB6264D1D39BF37F1E725001F342714933CF38F8627A2442EFC43FD SWAP2 PUSH2 0xA7D SWAP2 PUSH1 0xFF SWAP1 SWAP2 AND SWAP1 PUSH2 0x4D91 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x915 PUSH1 0x70 PUSH2 0x2910 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7E3 DUP3 PUSH2 0x29F0 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x6A SLOAD PUSH1 0x40 MLOAD PUSH4 0xE866E6F PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x3A19B9BC SWAP2 PUSH2 0xAD8 SWAP2 PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x4 ADD PUSH2 0x5AE0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xAF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xB04 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x915 SWAP2 SWAP1 PUSH2 0x47F7 JUMP JUMPDEST PUSH2 0xB30 PUSH2 0x1165 JUMP JUMPDEST PUSH2 0xB4C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x58EA JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF NOT DUP2 AND SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH4 0xFFFFFFFF DUP1 DUP4 AND SWAP3 PUSH5 0x100000000 SWAP1 DIV AND SWAP1 PUSH32 0xEE6702C46C5618E6FC7E625C71F4C85DF9C91D456CB16A3AEA71AB83B1FEE005 SWAP1 PUSH1 0x0 SWAP1 LOG1 PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0xFFFFFFFF DUP5 AND SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 CALLER SWAP1 PUSH32 0xD50026EE0824513AF20CDF5E72D1FBFBE8FD646EE0576378E080326F1A695E58 SWAP1 PUSH2 0xBE6 SWAP1 DUP7 SWAP1 PUSH2 0x5AE0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xC06 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xC2C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x50C4 JUMP JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0xC4A JUMPI PUSH2 0xC4A PUSH2 0x287F JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0xCC4 JUMPI PUSH1 0x65 SLOAD PUSH1 0x40 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x4D7F3DB0 SWAP1 PUSH2 0xC91 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x4C65 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xCBF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0xCD2 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xCE3 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0xD12 JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xD07 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0xD37 JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xD2C PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0xD53 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4F5B JUMP JUMPDEST PUSH2 0xD5B PUSH2 0x287F JUMP JUMPDEST PUSH2 0xD64 DUP2 PUSH2 0x2A37 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xD80 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xD91 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xDB7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0xDBF PUSH2 0x287F JUMP JUMPDEST PUSH1 0x7A DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x63E4E34F49D12428C03E04E61340C7167E36EB0FF6F0B1970C75440261794039 SWAP1 PUSH2 0xDF4 SWAP1 DUP5 SWAP1 PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP PUSH1 0x1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xE0C PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE1D PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xE43 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0xE4B PUSH2 0x287F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0xE79 JUMPI POP PUSH2 0xE79 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x28ED JUMP JUMPDEST PUSH2 0xE95 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4E28 JUMP JUMPDEST PUSH1 0x65 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 AND SWAP1 PUSH32 0x9FC437AA70AD4EE5F33F6772BF338EED41E21B95435820817AB8B4DF161CE4DD SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x915 PUSH1 0x6E PUSH2 0x2910 JUMP JUMPDEST PUSH2 0xEF9 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF0A PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0xF39 JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF2E PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0xF5E JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF53 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0xF7A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4F5B JUMP JUMPDEST PUSH2 0xF82 PUSH2 0x287F JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xFBE JUMPI PUSH2 0xFB6 DUP4 DUP4 DUP4 DUP2 DUP2 LT PUSH2 0xF9C JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0xFB1 SWAP2 SWAP1 PUSH2 0x4557 JUMP JUMPDEST PUSH2 0x2A37 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xF85 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xFCB PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xFDC PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1002 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x100A PUSH2 0x287F JUMP JUMPDEST PUSH2 0x1016 PUSH1 0x70 DUP3 DUP5 PUSH2 0x2BEB JUMP JUMPDEST PUSH2 0x101F DUP3 PUSH2 0x2CB5 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x102D PUSH2 0x834 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x915 JUMPI POP PUSH2 0x915 PUSH2 0xA9F JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH5 0x100000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1076 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1087 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x10AD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x10B5 PUSH2 0x287F JUMP JUMPDEST PUSH2 0xD64 DUP2 PUSH2 0x2D0D JUMP JUMPDEST PUSH1 0x79 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x10CF PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x10E0 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1106 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x6D SLOAD DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND PUSH2 0x1184 JUMPI POP PUSH1 0x0 PUSH2 0x840 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH1 0x6B SLOAD PUSH2 0x11A8 SWAP2 PUSH4 0xFFFFFFFF SWAP2 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 SWAP2 DIV DUP2 AND SWAP1 PUSH2 0x2D62 AND JUMP JUMPDEST PUSH2 0x11B0 PUSH2 0x2D87 JUMP JUMPDEST GT SWAP1 POP PUSH2 0x840 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x11D1 JUMPI POP PUSH2 0x11D1 PUSH2 0x2D8D JUMP JUMPDEST DUP1 PUSH2 0x11DF JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x11FB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5360 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1226 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x60 PUSH2 0x1237 DUP10 DUP10 DUP10 DUP10 DUP10 DUP10 DUP8 PUSH2 0x23F4 JUMP JUMPDEST PUSH2 0x1240 DUP4 PUSH2 0x2D0D JUMP JUMPDEST POP DUP1 ISZERO PUSH2 0xCBF JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1264 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1275 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x129B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x12A3 PUSH2 0x287F JUMP JUMPDEST PUSH2 0x12AB PUSH2 0x834 JUMP JUMPDEST ISZERO PUSH2 0x12C8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x58A7 JUMP JUMPDEST PUSH1 0x69 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xF935763CC7C57EE8ED6318ED71E756CCA0731294C9F46FF5B386F36D6FF1417A SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x131C PUSH2 0x2D98 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x915 JUMPI POP PUSH2 0x132B PUSH2 0x834 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x1339 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x134A PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1370 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x1378 PUSH2 0x287F JUMP JUMPDEST PUSH2 0xD64 DUP2 PUSH2 0x2DB1 JUMP JUMPDEST PUSH2 0x1389 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x139A PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x13C0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x13C8 PUSH2 0x287F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0x13F3 JUMPI POP PUSH2 0x13F3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH4 0x2BA83963 PUSH1 0xE1 SHL PUSH2 0x28ED JUMP JUMPDEST PUSH2 0x140F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x57B8 JUMP JUMPDEST PUSH1 0x74 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xDA05D50A3A1EC0FFAB059F1D457AE59F68CCFB3FFBB4DAD283C516F9103D584B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x76 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x75 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0x14DB JUMPI PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 SWAP1 DUP2 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP2 DUP6 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND DUP4 DUP6 ADD MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP3 ADD MSTORE DUP3 MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 ADD PUSH2 0x1483 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x78 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0xD64 DUP2 PUSH2 0x2E06 JUMP JUMPDEST PUSH1 0x6C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD DUP4 MLOAD DUP2 DUP5 MUL DUP2 ADD DUP5 ADD SWAP1 SWAP5 MSTORE DUP1 DUP5 MSTORE PUSH1 0x60 SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1577 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x1563 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x915 PUSH2 0x2D98 JUMP JUMPDEST PUSH1 0x77 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15A0 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x15B1 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x15D7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x15DF PUSH2 0x287F JUMP JUMPDEST PUSH1 0x79 DUP1 SLOAD PUSH1 0xFF NOT AND DUP4 ISZERO ISZERO OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x2B4B6FFE286F7CE4CCC6B136BB14987B0A00092174D88938A0C667A104A4A731 SWAP1 PUSH2 0xDF4 SWAP1 DUP5 SWAP1 PUSH2 0x4D91 JUMP JUMPDEST PUSH1 0x6B SLOAD PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x1631 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1642 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1668 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x1670 PUSH2 0x287F JUMP JUMPDEST PUSH2 0x167C PUSH1 0x6E DUP3 DUP5 PUSH2 0x2BEB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 PUSH32 0x58982464497ACDAB11AD29D39907E076B0D3B8DAF1D9B734174C7C3A2A0E8C74 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16C8 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x16EE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x50C4 JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x1720 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5109 JUMP JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x173E JUMPI PUSH2 0x173E PUSH2 0x287F JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0xCC4 JUMPI PUSH1 0x65 SLOAD PUSH1 0x40 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xB2210957 SWAP1 PUSH2 0xC91 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x4BFE JUMP JUMPDEST PUSH2 0x178D PUSH2 0x2D98 JUMP JUMPDEST PUSH2 0x17A9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4ECA JUMP JUMPDEST PUSH2 0x17B1 PUSH2 0x834 JUMP JUMPDEST ISZERO PUSH2 0x17CE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5429 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xD37B537 PUSH1 0xE0 SHL DUP2 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP3 PUSH4 0xD37B537 SWAP3 PUSH1 0x4 DUP1 DUP4 ADD SWAP4 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1813 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1827 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x184B SWAP2 SWAP1 PUSH2 0x4619 JUMP JUMPDEST SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1868 JUMPI POP PUSH1 0x0 DUP2 GT JUMPDEST ISZERO PUSH2 0x1887 JUMPI PUSH1 0x69 SLOAD PUSH2 0x1887 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND SWAP2 AND DUP4 PUSH2 0x3393 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x433C53D9 PUSH1 0xE1 SHL DUP2 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP3 PUSH4 0x8678A7B2 SWAP3 PUSH1 0x4 DUP1 DUP4 ADD SWAP4 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x18E1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1905 SWAP2 SWAP1 PUSH2 0x4AC9 JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH4 0xFFFFFFFF DUP1 DUP5 AND PUSH5 0x100000000 MUL PUSH8 0xFFFFFFFF00000000 NOT SWAP2 DUP7 AND PUSH4 0xFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR AND OR SWAP1 SSTORE SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x194B PUSH2 0x1946 PUSH2 0x2D87 JUMP JUMPDEST PUSH2 0x348D JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFF0000000000000000 NOT AND PUSH1 0x1 PUSH1 0x40 SHL PUSH4 0xFFFFFFFF SWAP4 DUP5 AND MUL OR SWAP1 SSTORE PUSH1 0x66 SLOAD SWAP1 DUP4 AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1987 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x4D31E658DCF617BB3A3C8CF7C6DDDB33F7030AC588E271631ECDB5D76C2E91EF DUP5 PUSH1 0x40 MLOAD PUSH2 0x19BF SWAP2 SWAP1 PUSH2 0x5AE0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP JUMP JUMPDEST PUSH2 0x19D5 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x19E6 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1A0C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1CB1 JUMPI PUSH2 0x1A20 PUSH2 0x445A JUMP JUMPDEST DUP5 DUP5 DUP4 DUP2 DUP2 LT PUSH2 0x1A2C JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x60 MUL ADD DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x1A42 SWAP2 SWAP1 PUSH2 0x48BB JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP2 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND GT ISZERO PUSH2 0x1A6C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5028 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A93 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x52D4 JUMP JUMPDEST PUSH1 0x75 SLOAD DUP3 LT PUSH2 0x1B2F JUMPI PUSH1 0x75 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE PUSH1 0x0 SWAP2 SWAP1 SWAP2 MSTORE DUP2 MLOAD PUSH32 0x9A8D93986A7B9E6294572EA6736696119C195C1A9F5EAE642D3C5FCD44E49DEA SWAP1 SWAP2 ADD DUP1 SLOAD PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x40 DUP6 ADD MLOAD PUSH1 0xFF AND PUSH1 0x1 PUSH1 0xB0 SHL MUL PUSH1 0xFF PUSH1 0xB0 SHL NOT PUSH2 0xFFFF SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xA0 SHL MUL PUSH2 0xFFFF PUSH1 0xA0 SHL NOT PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP7 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP5 SWAP1 SWAP5 AND SWAP2 SWAP1 SWAP2 OR AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x1C56 JUMP JUMPDEST PUSH2 0x1B37 PUSH2 0x445A JUMP JUMPDEST PUSH1 0x75 DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x1B44 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND DUP1 DUP6 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP4 DIV PUSH2 0xFFFF AND SWAP6 DUP6 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 SWAP2 DIV PUSH1 0xFF AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP5 MLOAD SWAP2 SWAP4 POP AND EQ ISZERO DUP1 PUSH2 0x1BB3 JUMPI POP DUP1 PUSH1 0x20 ADD MLOAD PUSH2 0xFFFF AND DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0xFFFF AND EQ ISZERO JUMPDEST DUP1 PUSH2 0x1BCC JUMPI POP DUP1 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND DUP3 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x1C4D JUMPI DUP2 PUSH1 0x75 DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x1BDF JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 DUP4 MLOAD SWAP2 ADD DUP1 SLOAD SWAP3 DUP5 ADD MLOAD PUSH1 0x40 SWAP1 SWAP5 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP4 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH2 0xFFFF PUSH1 0xA0 SHL NOT AND PUSH1 0x1 PUSH1 0xA0 SHL PUSH2 0xFFFF SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 MUL SWAP3 SWAP1 SWAP3 OR PUSH1 0xFF PUSH1 0xB0 SHL NOT AND PUSH1 0x1 PUSH1 0xB0 SHL PUSH1 0xFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE PUSH2 0x1C54 JUMP JUMPDEST POP POP PUSH2 0x1CA9 JUMP JUMPDEST POP JUMPDEST DUP1 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC1BF93444A0055A24A7D0154B75FEDF78EDFE355C06A2CE8E47F9F3908720559 DUP3 PUSH1 0x20 ADD MLOAD DUP4 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 MLOAD PUSH2 0x1C9F SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5A18 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x1A10 JUMP JUMPDEST POP JUMPDEST PUSH1 0x75 SLOAD DUP2 LT ISZERO PUSH2 0x1D2E JUMPI PUSH1 0x75 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x1CCE SWAP1 PUSH1 0x1 PUSH2 0x34B7 JUMP JUMPDEST SWAP1 POP PUSH1 0x75 DUP1 SLOAD DUP1 PUSH2 0x1CDB JUMPI INVALID JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 DUP3 ADD PUSH1 0x0 NOT SWAP1 DUP2 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xB8 SHL SUB NOT AND SWAP1 SSTORE SWAP1 SWAP2 ADD SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD DUP3 SWAP2 PUSH32 0x99FA473FDF53414BCD014CF6E7509FC58C68F7B86174767FAA6AD5100CD5BAE5 SWAP2 LOG2 POP PUSH2 0x1CB3 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1D38 PUSH2 0x34DF JUMP JUMPDEST SWAP1 POP PUSH2 0x3E8 DUP2 GT ISZERO PUSH2 0xCC4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5547 JUMP JUMPDEST PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x18C1996D PUSH1 0xE2 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x630665B4 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1DB0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1DC4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x915 SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST PUSH2 0x1DF0 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E01 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0x1E30 JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E25 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0x1E55 JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E4A PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0x1E71 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4F5B JUMP JUMPDEST PUSH2 0x1E79 PUSH2 0x287F JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x6A3FD4F9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x6A3FD4F9 SWAP1 PUSH2 0x1EA9 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B45 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1EC1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1ED5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1EF9 SWAP2 SWAP1 PUSH2 0x47F7 JUMP JUMPDEST PUSH2 0x1F15 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x55EB JUMP JUMPDEST PUSH2 0x1F2F PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH4 0x80AC58CD PUSH1 0xE0 SHL PUSH2 0x28ED JUMP JUMPDEST PUSH2 0x1F4B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4DE4 JUMP JUMPDEST PUSH2 0x1F56 PUSH1 0x70 DUP5 PUSH2 0x3571 JUMP JUMPDEST PUSH2 0x1F65 JUMPI PUSH2 0x1F65 PUSH1 0x70 DUP5 PUSH2 0x35C2 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1F94 JUMPI PUSH2 0x1F8C DUP5 DUP5 DUP5 DUP5 DUP2 DUP2 LT PUSH2 0x1F80 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH2 0x368A JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x1F68 JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x51541DC4B4C08A16085809CCCDC4CC77D8000B60FBB00142E57F236D84298675 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH2 0x1FD0 SWAP3 SWAP2 SWAP1 PUSH2 0x4D1F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP JUMP JUMPDEST PUSH2 0x1FE5 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1FF6 PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x201C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH2 0x2024 PUSH2 0x287F JUMP JUMPDEST PUSH2 0xD64 DUP2 PUSH2 0x37DB JUMP JUMPDEST PUSH1 0x7B SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x915 PUSH2 0x2815 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x2054 PUSH2 0x834 JUMP JUMPDEST PUSH2 0x2070 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x597C JUMP JUMPDEST PUSH2 0x2078 PUSH2 0xA9F JUMP JUMPDEST PUSH2 0x2094 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x528E JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x6A SLOAD PUSH1 0x40 MLOAD PUSH4 0x13A54BF3 PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x9D2A5F98 SWAP2 PUSH2 0x20CD SWAP2 PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x4 ADD PUSH2 0x5AE0 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x20E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x20FB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x211F SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE PUSH1 0x73 SLOAD SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x21AF JUMPI PUSH1 0x73 SLOAD PUSH1 0x6D SLOAD PUSH1 0x40 MLOAD PUSH4 0x266FCE1F PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x4CDF9C3E SWAP2 PUSH2 0x217C SWAP2 DUP6 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x5A56 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2196 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x21AA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x21B8 DUP2 PUSH2 0x2E06 JUMP JUMPDEST PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2230 JUMPI PUSH1 0x74 SLOAD PUSH1 0x6D SLOAD PUSH1 0x40 MLOAD PUSH4 0x2BA83963 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x575072C6 SWAP2 PUSH2 0x21FD SWAP2 DUP6 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x5A56 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2217 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x222B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x2240 PUSH2 0x223B PUSH2 0x2D87 JUMP JUMPDEST PUSH2 0x29F0 JUMP JUMPDEST PUSH1 0x6D SSTORE PUSH2 0x224B PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x9C4163ECE98173EAB9A496C4DB8BF3E2C8EDCC5D2854377880597CCB858B7A9D DUP3 PUSH1 0x40 MLOAD PUSH2 0x2283 SWAP2 SWAP1 PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x6D SLOAD PUSH2 0x2296 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC61852C20F0B03B31D782F3022F2BF20322AC17CE66C5349FB6E24740CDD6456 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP JUMP JUMPDEST PUSH2 0x22D6 PUSH2 0x445A JUMP JUMPDEST PUSH1 0x75 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x22E3 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP4 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 SWAP3 DIV PUSH1 0xFF AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x233B PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x234C PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2372 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x2398 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4F15 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x240D JUMPI POP PUSH2 0x240D PUSH2 0x2D8D JUMP JUMPDEST DUP1 PUSH2 0x241B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2437 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5360 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2462 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH2 0x2488 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5186 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x24AE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5729 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x24D4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4FDE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x24FA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5215 JUMP JUMPDEST PUSH1 0x66 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP10 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SWAP3 SSTORE PUSH1 0x67 DUP1 SLOAD DUP9 DUP5 AND SWAP1 DUP4 AND OR SWAP1 SSTORE PUSH1 0x69 DUP1 SLOAD DUP7 DUP5 AND SWAP1 DUP4 AND OR SWAP1 SSTORE PUSH1 0x68 DUP1 SLOAD SWAP3 DUP8 AND SWAP3 SWAP1 SWAP2 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x254D DUP8 PUSH2 0x2DB1 JUMP JUMPDEST PUSH2 0x2555 PUSH2 0x384C JUMP JUMPDEST PUSH2 0x255F PUSH1 0x6E PUSH2 0x38DE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 MLOAD DUP2 LT ISZERO PUSH2 0x258F JUMPI PUSH2 0x2587 DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x257A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x2A37 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2562 JUMP JUMPDEST POP PUSH1 0x6C DUP8 SWAP1 SSTORE PUSH1 0x6D DUP9 SWAP1 SSTORE PUSH2 0x25A4 PUSH1 0x70 PUSH2 0x38DE JUMP JUMPDEST PUSH2 0x25AF PUSH2 0x708 PUSH2 0x37DB JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xF9632D212436344A25150FF0C161DABF412AADE556621C2DEA146CA63FF643F5 DUP10 DUP10 DUP9 DUP9 DUP9 DUP9 PUSH1 0x40 MLOAD PUSH2 0x25F2 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5A64 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x6D SLOAD PUSH2 0x2605 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC61852C20F0B03B31D782F3022F2BF20322AC17CE66C5349FB6E24740CDD6456 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 DUP1 ISZERO PUSH2 0xCBF JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x265D PUSH2 0x287B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x266E PUSH2 0x14E4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2694 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54EC JUMP JUMPDEST PUSH1 0x75 SLOAD PUSH1 0xFF DUP3 AND LT PUSH2 0x26B8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x53AE JUMP JUMPDEST PUSH1 0x1 DUP3 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND GT ISZERO PUSH2 0x26E0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5028 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2707 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x52D4 JUMP JUMPDEST DUP2 PUSH1 0x75 DUP3 PUSH1 0xFF AND DUP2 SLOAD DUP2 LT PUSH2 0x2718 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 DUP5 MLOAD SWAP3 ADD DUP1 SLOAD SWAP2 DUP6 ADD MLOAD PUSH1 0x40 SWAP1 SWAP6 ADD MLOAD PUSH1 0xFF AND PUSH1 0x1 PUSH1 0xB0 SHL MUL PUSH1 0xFF PUSH1 0xB0 SHL NOT PUSH2 0xFFFF SWAP1 SWAP7 AND PUSH1 0x1 PUSH1 0xA0 SHL MUL PUSH2 0xFFFF PUSH1 0xA0 SHL NOT PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP4 SWAP1 SWAP4 AND SWAP2 SWAP1 SWAP2 OR SWAP4 SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE PUSH2 0x2787 PUSH2 0x34DF JUMP JUMPDEST SWAP1 POP PUSH2 0x3E8 DUP2 GT ISZERO PUSH2 0x27AB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5547 JUMP JUMPDEST DUP3 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC1BF93444A0055A24A7D0154B75FEDF78EDFE355C06A2CE8E47F9F3908720559 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 MLOAD PUSH2 0x1FD0 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x5A37 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2820 PUSH2 0x28D4 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x282C PUSH2 0x2D87 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 GT ISZERO PUSH2 0x2841 JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x840 JUMP JUMPDEST PUSH2 0x284B DUP3 DUP3 PUSH2 0x34B7 JUMP JUMPDEST SWAP3 POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2867 PUSH8 0xDE0B6B3A7640000 DUP6 PUSH2 0x3922 JUMP JUMPDEST SWAP1 POP PUSH2 0x2873 DUP2 DUP5 PUSH2 0x395C JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2889 PUSH2 0x399E JUMP JUMPDEST PUSH1 0x6A SLOAD SWAP1 SWAP2 POP PUSH5 0x100000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND ISZERO DUP1 PUSH2 0x28B8 JUMPI POP PUSH1 0x6A SLOAD PUSH5 0x100000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP2 LT JUMPDEST PUSH2 0xD64 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x58A7 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x915 PUSH1 0x6C SLOAD PUSH1 0x6D SLOAD PUSH2 0x2D62 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28F8 DUP4 PUSH2 0x39A2 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x2909 JUMPI POP PUSH2 0x2909 DUP4 DUP4 PUSH2 0x39D5 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 PUSH1 0x0 ADD SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x292E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x2958 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x299B JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST ISZERO PUSH2 0x29E7 JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x29AD JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x20 SWAP2 DUP3 MUL SWAP3 SWAP1 SWAP3 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP1 DUP9 ADD SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP3 SWAP1 SWAP2 ADD SWAP2 AND PUSH2 0x2979 JUMP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2A14 PUSH1 0x6C SLOAD PUSH2 0x2A0E PUSH1 0x6D SLOAD DUP7 PUSH2 0x34B7 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 PUSH2 0x39FB JUMP JUMPDEST SWAP1 POP PUSH2 0x2909 PUSH2 0x2A2E PUSH1 0x6C SLOAD DUP4 PUSH2 0x3922 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x6D SLOAD SWAP1 PUSH2 0x2D62 JUMP JUMPDEST PUSH2 0x2A49 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3A2D JUMP JUMPDEST PUSH2 0x2A65 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x53F4 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x6A3FD4F9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x6A3FD4F9 SWAP1 PUSH2 0x2A95 SWAP1 DUP5 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B45 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2AAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2AC1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2AE5 SWAP2 SWAP1 PUSH2 0x47F7 JUMP JUMPDEST PUSH2 0x2B01 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x55EB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x4 DUP2 MSTORE PUSH1 0x24 DUP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0xE0 SHL OR SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x60 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP2 PUSH2 0x2B45 SWAP2 PUSH2 0x4B20 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x2B80 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x2B85 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x2BA7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x531D JUMP JUMPDEST PUSH2 0x2BB2 PUSH1 0x6E DUP5 PUSH2 0x35C2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH32 0xBCD6D991F3416E288BF59A2997B423772937B62C7EA7DD1A54AF7771DE1F7418 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x2C0D JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO ISZERO JUMPDEST PUSH2 0x2C29 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4E74 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 AND SWAP1 DUP3 AND EQ PUSH2 0x2C67 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4E9D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD SWAP6 DUP6 AND DUP4 MSTORE SWAP1 DUP3 KECCAK256 DUP1 SLOAD SWAP6 SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP6 DUP7 AND OR SWAP1 SWAP4 SSTORE MSTORE DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x2CD6 SWAP2 PUSH2 0x447A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH32 0xCD64D9DACD230C5CCF1278EA5332B0621AA28C950FB0E61C8FBC9E2011C88A34 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP2 GT PUSH2 0x2D2D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5474 JUMP JUMPDEST PUSH1 0x76 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0xC44C7222E8DF09744CED394101DF47E78DEDB642D3065267BB388901DE9DF6D4 SWAP1 PUSH2 0xA7D SWAP1 DUP4 SWAP1 PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x2909 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4FA7 JUMP JUMPDEST PUSH1 0x7B SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x132B ADDRESS PUSH2 0x3A2D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2DA2 PUSH2 0x28D4 JUMP JUMPDEST PUSH2 0x2DAA PUSH2 0x2D87 JUMP JUMPDEST LT ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 GT PUSH2 0x2DD1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5070 JUMP JUMPDEST PUSH1 0x6C DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0xD379C1A7282461E725A9DC2D74E65246C77E98AE93835E26C2F1654C48EE4EC SWAP1 PUSH2 0xA7D SWAP1 DUP4 SWAP1 PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xE6D8A94B PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xE6D8A94B SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2E4C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2E60 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2E84 SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST SWAP1 POP PUSH2 0x2E8F DUP2 PUSH2 0x3A33 JUMP JUMPDEST SWAP1 POP PUSH1 0x67 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2EDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2EF3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x2F17 SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST PUSH2 0x2F4A JUMPI PUSH1 0x40 MLOAD PUSH32 0x3728FEB3FC1EF1BF4A24036AFBE7D34B59C551BF0D2AB5564E87EC1734FA80DD SWAP1 PUSH1 0x0 SWAP1 LOG1 POP PUSH2 0xD64 JUMP JUMPDEST PUSH1 0x79 SLOAD PUSH1 0x76 SLOAD PUSH1 0xFF SWAP1 SWAP2 AND SWAP1 PUSH1 0x60 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x2F6F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x2F99 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x7A SLOAD SWAP1 SWAP2 POP DUP6 SWAP1 PUSH1 0x0 SWAP1 DUP2 SWAP1 JUMPDEST DUP6 DUP4 LT ISZERO PUSH2 0x3144 JUMPI PUSH1 0x67 SLOAD PUSH1 0x40 MLOAD PUSH4 0x3B304147 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x3B304147 SWAP1 PUSH2 0x2FE1 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2FF9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x300D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3031 SWAP2 SWAP1 PUSH2 0x4573 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x78 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND PUSH2 0x308C JUMPI DUP1 DUP7 DUP6 DUP1 PUSH1 0x1 ADD SWAP7 POP DUP2 MLOAD DUP2 LT PUSH2 0x3067 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE POP POP PUSH2 0x3105 JUMP JUMPDEST DUP2 DUP4 PUSH1 0x1 ADD SWAP4 POP DUP4 LT PUSH2 0x3105 JUMPI PUSH32 0xB5F728FCB182000EB8E953C15F6795F07B6CDA75B35EF0B65645B53AAC636945 DUP5 PUSH1 0x40 MLOAD PUSH2 0x30C8 SWAP2 SWAP1 PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP4 PUSH2 0x30FF JUMPI PUSH1 0x40 MLOAD PUSH32 0x3728FEB3FC1EF1BF4A24036AFBE7D34B59C551BF0D2AB5564E87EC1734FA80DD SWAP1 PUSH1 0x0 SWAP1 LOG1 JUMPDEST POP PUSH2 0x3144 JUMP JUMPDEST PUSH1 0x0 DUP5 PUSH2 0x209 MUL DUP7 PUSH2 0x1F3 ADD ADD PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x3122 SWAP2 SWAP1 PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SWAP6 POP PUSH2 0x2FA8 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x3161 DUP6 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x3154 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x3AE0 JUMP JUMPDEST PUSH1 0x0 DUP8 PUSH2 0x3177 JUMPI PUSH2 0x3172 DUP10 DUP6 PUSH2 0x39FB JUMP JUMPDEST PUSH2 0x3181 JUMP JUMPDEST PUSH2 0x3181 DUP10 DUP9 PUSH2 0x39FB JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x31BB JUMPI PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x31B9 JUMPI PUSH2 0x31B1 DUP8 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x31A3 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP4 PUSH2 0x3C50 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x318C JUMP JUMPDEST POP JUMPDEST PUSH1 0x77 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x336A JUMPI PUSH1 0x0 PUSH2 0x31D2 PUSH1 0x6E PUSH2 0x3CBD JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x3208 JUMPI POP PUSH2 0x31F2 PUSH1 0x6E PUSH2 0x3CDA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x3364 JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP3 PUSH4 0x70A08231 SWAP3 PUSH2 0x3240 SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4B45 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3258 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x326C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3290 SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP11 PUSH2 0x32A8 JUMPI PUSH2 0x32A3 DUP3 DUP9 PUSH2 0x39FB JUMP JUMPDEST PUSH2 0x32B2 JUMP JUMPDEST PUSH2 0x32B2 DUP3 DUP12 PUSH2 0x39FB JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x3350 JUMPI PUSH1 0x0 JUMPDEST DUP8 DUP2 LT ISZERO PUSH2 0x334E JUMPI PUSH1 0x66 SLOAD DUP11 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x2B0AB144 SWAP1 DUP13 SWAP1 DUP5 SWAP1 DUP2 LT PUSH2 0x32E8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD DUP7 DUP6 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3310 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4BDA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x332A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x333E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 POP PUSH2 0x32BD SWAP1 POP JUMP JUMPDEST POP JUMPDEST PUSH2 0x335B PUSH1 0x6E DUP5 PUSH2 0x3CE0 JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x31D5 JUMP JUMPDEST POP PUSH2 0x3387 JUMP JUMPDEST PUSH2 0x3387 DUP7 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x337A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x3D03 JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST DUP1 ISZERO DUP1 PUSH2 0x341B JUMPI POP PUSH1 0x40 MLOAD PUSH4 0x6EB1769F PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH4 0xDD62ED3E SWAP1 PUSH2 0x33C9 SWAP1 ADDRESS SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B59 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x33E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x33F5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3419 SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST ISZERO JUMPDEST PUSH2 0x3437 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x580B JUMP JUMPDEST PUSH2 0xFBE DUP4 PUSH4 0x95EA7B3 PUSH1 0xE0 SHL DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x3456 SWAP3 SWAP2 SWAP1 PUSH2 0x4C29 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE PUSH2 0x3E4F JUMP JUMPDEST PUSH1 0x0 PUSH5 0x100000000 DUP3 LT PUSH2 0x34B3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x565D JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x34D9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x514F JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x75 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP2 JUMPDEST DUP2 DUP2 PUSH1 0xFF AND LT ISZERO PUSH2 0x3569 JUMPI PUSH2 0x34FC PUSH2 0x445A JUMP JUMPDEST PUSH1 0x75 DUP3 PUSH1 0xFF AND DUP2 SLOAD DUP2 LT PUSH2 0x350C JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP3 ADD MSTORE SWAP2 POP PUSH2 0x355E SWAP1 DUP6 SWAP1 PUSH2 0x2D62 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x1 ADD PUSH2 0x34E9 JUMP JUMPDEST POP SWAP1 SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x3595 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x2909 JUMPI POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD AND ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x35E4 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO ISZERO JUMPDEST PUSH2 0x3600 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x4E74 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x363A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5636 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE DUP4 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP6 DUP7 AND DUP1 DUP6 MSTORE SWAP3 DUP5 KECCAK256 DUP1 SLOAD SWAP7 SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP7 DUP8 AND OR SWAP1 SSTORE SWAP2 DUP4 SWAP1 MSTORE DUP2 SLOAD SWAP1 SWAP4 AND SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x31A9108F PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND SWAP2 DUP5 AND SWAP1 PUSH4 0x6352211E SWAP1 PUSH2 0x36BD SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B3C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x36D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x36E9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x370D SWAP2 SWAP1 PUSH2 0x4573 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x3733 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x59C3 JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 LT ISZERO PUSH2 0x37AE JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP4 SWAP2 SWAP1 DUP4 SWAP1 DUP2 LT PUSH2 0x377D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD EQ ISZERO PUSH2 0x37A6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5861 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x3736 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE SWAP1 DUP4 MSTORE SWAP2 KECCAK256 ADD SSTORE JUMP JUMPDEST PUSH1 0x3C DUP2 PUSH4 0xFFFFFFFF AND GT PUSH2 0x3801 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5930 JUMP JUMPDEST PUSH1 0x6B DUP1 SLOAD PUSH4 0xFFFFFFFF NOT AND PUSH4 0xFFFFFFFF DUP4 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x4F27F6F220FFAD585E728389BC2F0F6B74EEEBEB43F95F53752A647CB6E7E687 SWAP3 PUSH2 0xA7D SWAP3 AND SWAP1 PUSH2 0x5AE0 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3865 JUMPI POP PUSH2 0x3865 PUSH2 0x2D8D JUMP JUMPDEST DUP1 PUSH2 0x3873 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x388F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5360 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x38BA JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x38C2 PUSH2 0x3EDE JUMP JUMPDEST PUSH2 0x38CA PUSH2 0x3F5F JUMP JUMPDEST DUP1 ISZERO PUSH2 0xD64 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST DUP1 SLOAD ISZERO PUSH2 0x38FD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5521 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP2 DUP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3931 JUMPI POP PUSH1 0x0 PUSH2 0x7E3 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x393E JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x2909 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x54AB JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2909 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x4039 JUMP JUMPDEST NUMBER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x39B5 DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x39D5 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x7E3 JUMPI POP PUSH2 0x39CE DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x39D5 JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x39E4 DUP6 DUP6 PUSH2 0x4070 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x39F2 JUMPI POP DUP1 JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x3A1C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5257 JUMP JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x3A25 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x75 SLOAD PUSH1 0x0 SWAP1 DUP3 SWAP1 DUP3 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x3AD7 JUMPI PUSH2 0x3A4D PUSH2 0x445A JUMP JUMPDEST PUSH1 0x75 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x3A5A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP4 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP5 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP3 DUP5 ADD DUP4 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP4 ADD MSTORE SWAP1 SWAP3 POP PUSH2 0x3AAC SWAP1 DUP7 SWAP1 PUSH2 0x4165 JUMP JUMPDEST SWAP1 POP PUSH2 0x3AC1 DUP3 PUSH1 0x0 ADD MLOAD DUP3 DUP5 PUSH1 0x40 ADD MLOAD PUSH2 0x4179 JUMP JUMPDEST PUSH2 0x3ACB DUP8 DUP3 PUSH2 0x34B7 JUMP JUMPDEST SWAP7 POP POP POP PUSH1 0x1 ADD PUSH2 0x3A3D JUMP JUMPDEST POP SWAP3 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3AEC PUSH1 0x70 PUSH2 0x3CBD JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x3B22 JUMPI POP PUSH2 0x3B0C PUSH1 0x70 PUSH2 0x3CDA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x3C46 JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP3 PUSH4 0x70A08231 SWAP3 PUSH2 0x3B5A SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4B45 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3B72 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3B86 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3BAA SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x3C33 JUMPI PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SWAP1 MLOAD PUSH4 0x16960D55 PUSH1 0xE0 SHL DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x16960D55 SWAP2 PUSH2 0x3BF8 SWAP2 DUP8 SWAP2 DUP8 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x4B73 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3C12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3C26 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x3C33 DUP3 PUSH2 0x2CB5 JUMP JUMPDEST PUSH2 0x3C3E PUSH1 0x70 DUP4 PUSH2 0x3CE0 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3AEF JUMP JUMPDEST PUSH2 0x101F PUSH1 0x70 PUSH2 0x4184 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x67 SLOAD PUSH1 0x40 MLOAD PUSH4 0x358DC31D PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 PUSH4 0x6B1B863A SWAP3 PUSH2 0x3C87 SWAP3 DUP8 SWAP3 DUP8 SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4C42 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3CA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3CB5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3D0F PUSH1 0x6E PUSH2 0x3CBD JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x3D45 JUMPI POP PUSH2 0x3D2F PUSH1 0x6E PUSH2 0x3CDA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x101F JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP3 PUSH4 0x70A08231 SWAP3 PUSH2 0x3D7D SWAP3 AND SWAP1 PUSH1 0x4 ADD PUSH2 0x4B45 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3D95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3DA9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x3DCD SWAP2 SWAP1 PUSH2 0x4922 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x3E3C JUMPI PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0xAC2AC51 PUSH1 0xE2 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x2B0AB144 SWAP1 PUSH2 0x3E09 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4BDA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3E23 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3E37 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x3E47 PUSH1 0x6E DUP4 PUSH2 0x3CE0 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x3D12 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x3EA4 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x4220 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xFBE JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x3EC2 SWAP2 SWAP1 PUSH2 0x47F7 JUMP JUMPDEST PUSH2 0xFBE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x576E JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3EF7 JUMPI POP PUSH2 0x3EF7 PUSH2 0x2D8D JUMP JUMPDEST DUP1 PUSH2 0x3F05 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3F21 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5360 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x38CA JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xD64 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3F78 JUMPI POP PUSH2 0x3F78 PUSH2 0x2D8D JUMP JUMPDEST DUP1 PUSH2 0x3F86 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3FA2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x5360 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3FCD JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x3FD7 PUSH2 0x287B JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0xD64 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x405A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP2 SWAP1 PUSH2 0x4DB1 JUMP JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x4066 JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL DUP5 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x408E SWAP2 SWAP1 PUSH2 0x4D9C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x7530 DUP5 PUSH1 0x40 MLOAD PUSH2 0x40E2 SWAP2 SWAP1 PUSH2 0x4B20 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x411E JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4123 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x4141 JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x415E JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x4156 SWAP2 SWAP1 PUSH2 0x47F7 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2909 PUSH2 0xFFFF DUP4 AND DUP5 MUL PUSH2 0x3E8 PUSH2 0x39FB JUMP JUMPDEST PUSH2 0xFBE DUP4 DUP4 DUP4 PUSH2 0x422F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP1 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x41C2 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST ISZERO PUSH2 0x41F8 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP4 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP2 AND SWAP1 SWAP2 SSTORE AND PUSH2 0x41A0 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE DUP3 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x60 PUSH2 0x2873 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x4360 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4EB1C245 PUSH1 0xE1 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x9D63848A SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4274 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x4288 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY PUSH1 0x1F RETURNDATASIZE SWAP1 DUP2 ADD PUSH1 0x1F NOT AND DUP3 ADD PUSH1 0x40 MSTORE PUSH2 0x42B0 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x468D JUMP JUMPDEST SWAP1 POP DUP1 MLOAD DUP3 PUSH1 0xFF AND GT ISZERO PUSH2 0x42D6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x56DA JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH1 0xFF AND DUP2 MLOAD DUP2 LT PUSH2 0x42E7 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x358DC31D PUSH1 0xE1 SHL DUP2 MSTORE SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x6B1B863A SWAP1 PUSH2 0x4327 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x4C42 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4341 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x4355 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x4382 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x51CF JUMP JUMPDEST PUSH2 0x438B DUP6 PUSH2 0x3A2D JUMP JUMPDEST PUSH2 0x43A7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP1 PUSH2 0x56A3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD PUSH2 0x43C4 SWAP2 SWAP1 PUSH2 0x4B20 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x4401 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4406 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x4416 DUP3 DUP3 DUP7 PUSH2 0x4421 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x4430 JUMPI POP DUP2 PUSH2 0x2909 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x4440 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST DUP2 PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x884 SWAP2 SWAP1 PUSH2 0x4DB1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST POP DUP1 SLOAD PUSH1 0x0 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0xD64 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x34B3 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x4494 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x44B9 JUMPI DUP1 DUP2 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x44D0 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x415E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x44FB JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x4505 PUSH1 0x60 PUSH2 0x5AF1 JUMP JUMPDEST SWAP1 POP DUP2 CALLDATALOAD PUSH2 0x4512 DUP2 PUSH2 0x5B64 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH2 0xFFFF DUP2 AND DUP2 EQ PUSH2 0x4529 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x453B DUP4 PUSH1 0x40 DUP5 ADD PUSH2 0x4546 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x7E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4568 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2909 DUP2 PUSH2 0x5B64 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4584 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x2909 DUP2 PUSH2 0x5B64 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x45A4 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x45AF DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x45BF DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x45D6 DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x45F3 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x45FE DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x460E DUP2 PUSH2 0x5B79 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x462B JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x4636 DUP2 PUSH2 0x5B64 JUMP JUMPDEST PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD MLOAD SWAP3 SWAP5 SWAP3 SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x465B JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x4666 DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x467D DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x45D6 DUP2 PUSH2 0x5B64 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x469F JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x46B5 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD PUSH1 0x1F DUP2 ADD DUP6 SGT PUSH2 0x46C5 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 MLOAD PUSH2 0x46D8 PUSH2 0x46D3 DUP3 PUSH2 0x5B18 JUMP JUMPDEST PUSH2 0x5AF1 JUMP JUMPDEST DUP2 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP4 DUP6 ADD DUP6 DUP5 MUL DUP6 ADD DUP7 ADD DUP10 LT ISZERO PUSH2 0x46F4 JUMPI DUP7 DUP8 REVERT JUMPDEST DUP7 SWAP5 POP JUMPDEST DUP4 DUP6 LT ISZERO PUSH2 0x471F JUMPI DUP1 MLOAD PUSH2 0x470B DUP2 PUSH2 0x5B64 JUMP JUMPDEST DUP4 MSTORE PUSH1 0x1 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP2 DUP6 ADD SWAP2 DUP6 ADD PUSH2 0x46F8 JUMP JUMPDEST POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x473D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4753 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x475F DUP6 DUP3 DUP7 ADD PUSH2 0x44A8 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x477D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x4794 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x47A7 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x47B5 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 PUSH1 0x60 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x47C9 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x47EC JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2909 DUP2 PUSH2 0x5B79 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4808 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x2909 DUP2 PUSH2 0x5B79 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4824 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND DUP2 EQ PUSH2 0x2909 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x484D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x4858 DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x460E DUP2 PUSH2 0x5B64 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x487C JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x4887 DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x48A2 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x48AE DUP7 DUP3 DUP8 ADD PUSH2 0x44A8 JUMP JUMPDEST SWAP5 SWAP8 SWAP1 SWAP7 POP SWAP4 SWAP5 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x48CC JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x2909 DUP4 DUP4 PUSH2 0x44EA JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x80 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x48E8 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x48F2 DUP5 DUP5 PUSH2 0x44EA JUMP JUMPDEST SWAP2 POP PUSH2 0x4901 DUP5 PUSH1 0x60 DUP6 ADD PUSH2 0x4546 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x491B JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4933 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x4954 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP8 CALLDATALOAD SWAP7 POP PUSH1 0x20 DUP1 DUP10 ADD CALLDATALOAD SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x496E DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD PUSH2 0x497E DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD PUSH2 0x498E DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP4 POP PUSH1 0xA0 DUP10 ADD CALLDATALOAD PUSH2 0x499E DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP3 POP PUSH1 0xC0 DUP10 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x49B9 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP10 ADD PUSH1 0x1F DUP2 ADD DUP12 SGT PUSH2 0x49C9 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP1 CALLDATALOAD PUSH2 0x49D7 PUSH2 0x46D3 DUP3 PUSH2 0x5B18 JUMP JUMPDEST DUP2 DUP2 MSTORE DUP4 DUP2 ADD SWAP1 DUP4 DUP6 ADD DUP6 DUP5 MUL DUP6 ADD DUP7 ADD DUP16 LT ISZERO PUSH2 0x49F3 JUMPI DUP7 DUP8 REVERT JUMPDEST DUP7 SWAP5 POP JUMPDEST DUP4 DUP6 LT ISZERO PUSH2 0x4A1E JUMPI DUP1 CALLDATALOAD PUSH2 0x4A0A DUP2 PUSH2 0x5B64 JUMP JUMPDEST DUP4 MSTORE PUSH1 0x1 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP2 DUP6 ADD SWAP2 DUP6 ADD PUSH2 0x49F7 JUMP JUMPDEST POP DUP1 SWAP6 POP POP POP POP POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x4A4D JUMPI DUP1 DUP2 REVERT JUMPDEST DUP8 CALLDATALOAD SWAP7 POP PUSH1 0x20 DUP9 ADD CALLDATALOAD SWAP6 POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH2 0x4A66 DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP5 POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH2 0x4A76 DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP4 POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH2 0x4A86 DUP2 PUSH2 0x5B64 JUMP JUMPDEST SWAP3 POP PUSH1 0xA0 DUP9 ADD CALLDATALOAD PUSH2 0x4A96 DUP2 PUSH2 0x5B64 JUMP JUMPDEST DUP1 SWAP3 POP POP PUSH1 0xC0 DUP9 ADD CALLDATALOAD SWAP1 POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4ABE JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2909 DUP2 PUSH2 0x5B87 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4ADB JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 MLOAD PUSH2 0x4AE6 DUP2 PUSH2 0x5B87 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD SWAP1 SWAP3 POP PUSH2 0x460E DUP2 PUSH2 0x5B87 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH2 0xFFFF AND SWAP1 DUP4 ADD MSTORE PUSH1 0x40 SWAP1 DUP2 ADD MLOAD PUSH1 0xFF AND SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x4B32 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x5B38 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND DUP3 MSTORE DUP4 AND PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 PUSH1 0x40 DUP4 ADD DUP2 SWAP1 MSTORE DUP4 SLOAD SWAP1 DUP4 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 DUP5 DUP2 MSTORE DUP3 DUP2 KECCAK256 SWAP1 SWAP3 SWAP1 SWAP2 PUSH1 0x80 DUP6 ADD SWAP2 SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4BCC JUMPI DUP5 SLOAD DUP5 MSTORE PUSH1 0x1 SWAP5 DUP6 ADD SWAP5 SWAP4 DUP4 ADD SWAP4 ADD PUSH2 0x4BB0 JUMP JUMPDEST POP SWAP2 SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND DUP2 MSTORE SWAP3 DUP5 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 SWAP2 AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP5 DUP6 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE SWAP1 DUP4 AND PUSH1 0x40 DUP4 ADD MSTORE SWAP1 SWAP2 AND PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4CD1 JUMPI DUP4 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x4CAC JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4CD1 JUMPI PUSH2 0x4D0C DUP4 DUP6 MLOAD PUSH2 0x4AF7 JUMP JUMPDEST SWAP3 DUP5 ADD SWAP3 PUSH1 0x60 SWAP3 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x4CF9 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xFB SHL SUB DUP4 GT ISZERO PUSH2 0x4D3E JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH1 0x20 DUP4 MUL DUP1 DUP6 PUSH1 0x40 DUP6 ADD CALLDATACOPY SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP1 DUP2 MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x4CD1 JUMPI DUP4 MLOAD DUP4 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x4D75 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD DUP1 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x4DD0 DUP2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP8 ADD PUSH2 0x5B38 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP2 SWAP1 SWAP2 ADD PUSH1 0x40 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x24 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6572633732312D696E76 PUSH1 0x40 DUP3 ADD MSTORE PUSH4 0x185B1A59 PUSH1 0xE2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2C SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F746F6B656E2D6C697374 PUSH1 0x40 DUP3 ADD MSTORE PUSH12 0x195B995C8B5A5B9D985B1A59 PUSH1 0xA2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xF SWAP1 DUP3 ADD MSTORE PUSH15 0x496E76616C69642061646472657373 PUSH1 0x88 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x13 SWAP1 DUP3 ADD MSTORE PUSH19 0x496E76616C6964207072657641646472657373 PUSH1 0x68 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2B SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A652D70657269 PUSH1 0x40 DUP3 ADD MSTORE PUSH11 0x37B216B737BA16B7BB32B9 PUSH1 0xA9 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x646472657373 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2C SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6F6E6C792D6F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH12 0x16B7B916B634B9BA32B732B9 PUSH1 0xA1 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2A SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F73706F6E736F72736869 PUSH1 0x40 DUP3 ADD MSTORE PUSH10 0x702D6E6F742D7A65726F PUSH1 0xB0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x28 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH8 0x34BA16BA37B5B2B7 PUSH1 0xC1 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x34 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A652D70657269 PUSH1 0x40 DUP3 ADD MSTORE PUSH20 0x6F642D677265617465722D7468616E2D7A65726F PUSH1 0x60 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6F6E6C792D7072697A65 PUSH1 0x40 DUP3 ADD MSTORE PUSH5 0xB5C1BDBDB PUSH1 0xDA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7472616E736665722D74 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x3796B9B2B633 PUSH1 0xD1 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1E SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x29 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A652D706F6F6C PUSH1 0x40 DUP3 ADD MSTORE PUSH9 0x2D6E6F742D7A65726F PUSH1 0xB8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x416464726573733A20696E73756666696369656E742062616C616E636520666F PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x1C8818D85B1B PUSH1 0xD2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x22 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D7A65 PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x726F PUSH1 0xF0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1A SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D636F PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x6D706C657465 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x29 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH9 0x1A5D0B5D185C99D95D PUSH1 0xBA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x23 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F65726332302D696E7661 PUSH1 0x40 DUP3 ADD MSTORE PUSH3 0x1B1A59 PUSH1 0xEA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2E SWAP1 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x40 DUP3 ADD MSTORE PUSH14 0x191E481A5B9A5D1A585B1A5E9959 PUSH1 0x92 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F6E6F6E6578697374656E742D7072697A PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x195CDC1B1A5D PUSH1 0xD2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F65726332302D6E756C6C PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2B SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D616C72656164 PUSH1 0x40 DUP3 ADD MSTORE PUSH11 0x1E4B5C995C5D595CDD1959 PUSH1 0xAA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1F SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F77696E6E6572732D6774652D6F6E6500 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x21 SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206D756C7469706C69636174696F6E206F766572666C6F PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x77 PUSH1 0xF8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xC SWAP1 DUP3 ADD MSTORE PUSH12 0x105B1C9958591E481A5B9A5D PUSH1 0xA2 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x33 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH19 0x1A5D0B5C195C98D95B9D1859D94B5D1BDD185B PUSH1 0x6A SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x31 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6265666F726541776172 PUSH1 0x40 DUP3 ADD MSTORE PUSH17 0x19131A5CDD195B995C8B5A5B9D985B1A59 PUSH1 0x7A SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2B SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F63616E6E6F742D617761 PUSH1 0x40 DUP3 ADD MSTORE PUSH11 0x1C990B595E1D195C9B985B PUSH1 0xAA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xD SWAP1 DUP3 ADD MSTORE PUSH13 0x105B1C9958591E481859191959 PUSH1 0x9A SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x53616665436173743A2076616C756520646F65736E27742066697420696E2033 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x322062697473 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2F SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F61776172642D696E7661 PUSH1 0x40 DUP3 ADD MSTORE PUSH15 0xD8D2C85AE8DED6CADC5AD2DCC8CAF PUSH1 0x8B SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7469636B65742D6E6F74 PUSH1 0x40 DUP3 ADD MSTORE PUSH5 0x2D7A65726F PUSH1 0xD8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2A SWAP1 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A204552433230206F7065726174696F6E20646964206E PUSH1 0x40 DUP3 ADD MSTORE PUSH10 0x1BDD081CDD58D8D95959 PUSH1 0xB2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x33 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F7072697A655374726174 PUSH1 0x40 DUP3 ADD MSTORE PUSH19 0x1959DE531A5CDD195B995C8B5A5B9D985B1A59 PUSH1 0x6A SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x36 SWAP1 DUP3 ADD MSTORE PUSH32 0x5361666545524332303A20617070726F76652066726F6D206E6F6E2D7A65726F PUSH1 0x40 DUP3 ADD MSTORE PUSH22 0x20746F206E6F6E2D7A65726F20616C6C6F77616E6365 PUSH1 0x50 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F6572633732312D647570 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x6C6963617465 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x23 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D696E2D666C69 PUSH1 0x40 DUP3 ADD MSTORE PUSH3 0x19DA1D PUSH1 0xEA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D7469 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x1B59591BDD5D PUSH1 0xD2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2C SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D74696D656F75 PUSH1 0x40 DUP3 ADD MSTORE PUSH12 0x742D67742D36302D73656373 PUSH1 0xA0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x27 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F726E672D6E6F742D7265 PUSH1 0x40 DUP3 ADD MSTORE PUSH7 0x1C5D595CDD1959 PUSH1 0xCA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x27 SWAP1 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F756E617661696C61626C PUSH1 0x40 DUP3 ADD MSTORE PUSH7 0x3296BA37B5B2B7 PUSH1 0xC9 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x7E3 DUP3 DUP5 PUSH2 0x4AF7 JUMP JUMPDEST PUSH2 0xFFFF SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0xFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH2 0xFFFF SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0xFF SWAP2 DUP3 AND PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP7 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP8 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x40 DUP5 ADD MSTORE DUP6 DUP2 AND PUSH1 0x60 DUP5 ADD MSTORE DUP5 DUP2 AND PUSH1 0x80 DUP5 ADD MSTORE PUSH1 0xC0 PUSH1 0xA0 DUP5 ADD DUP2 SWAP1 MSTORE DUP5 MLOAD SWAP1 DUP5 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP3 DUP6 DUP2 ADD SWAP3 SWAP1 SWAP2 PUSH1 0xE0 DUP7 ADD SWAP1 DUP6 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x5ACE JUMPI DUP6 MLOAD DUP5 AND DUP4 MSTORE SWAP5 DUP5 ADD SWAP5 SWAP2 DUP5 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0x5AB0 JUMP JUMPDEST POP SWAP1 SWAP13 SWAP12 POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5B10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x5B2E JUMPI DUP1 DUP2 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5B53 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x5B3B JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xCC4 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xD64 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0xD64 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0xD64 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SIGNEXTEND DIV LOG0 CALLVALUE REVERT 0xC9 0xB6 SUB NUMBER 0x4F CALLCODE 0xE1 0x4B 0xBF SWAP14 0xF8 0x27 DUP6 BYTE PUSH31 0xC270AD4D35335F3752EDEB5F64736F6C634300060C00330000000000000000 ",
              "sourceMap": "251:325:72:-:0;;;359:72;;;;;;;;;;398:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;387:8:72;:39;;-1:-1:-1;;;;;;387:39:72;-1:-1:-1;;;;;387:39:72;;;;;;;;;;251:325;;;;;;;;;;:::o;:::-;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106100415760003560e01c8063022ec09514610046578063b3eeb5e21461006a578063efc81a8c14610120575b600080fd5b61004e610128565b604080516001600160a01b039092168252519081900360200190f35b61004e6004803603604081101561008057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100ab57600080fd5b8201836020820111156100bd57600080fd5b803590602001918460018302840111640100000000831117156100df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610137945050505050565b61004e6102b3565b6000546001600160a01b031681565b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a18251156102ac576000826001600160a01b0316846040518082805190602001908083835b602083106102035780518252601f1990920191602091820191016101e4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610265576040519150601f19603f3d011682016040523d82523d6000602084013e61026a565b606091505b50509050806102aa5760405162461bcd60e51b81526004018080602001828103825260248152602001806102de6024913960400191505060405180910390fd5b505b5092915050565b6000805460408051602081019091528281526102d8916001600160a01b031690610137565b90509056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a2646970667358221220dd1da506cf2649c1f2b83598c6d20b4da70f053f0b8b81590c2c31bfb971577564736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x22EC095 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x6A JUMPI DUP1 PUSH4 0xEFC81A8C EQ PUSH2 0x120 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x128 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x137 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x4E PUSH2 0x2B3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x265 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x26A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2DE PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE DUP3 DUP2 MSTORE PUSH2 0x2D8 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x137 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 0xDD SAR 0xA5 MOD 0xCF 0x26 0x49 0xC1 CALLCODE 0xB8 CALLDATALOAD SWAP9 0xC6 0xD2 SIGNEXTEND 0x4D 0xA7 0xF SDIV EXTCODEHASH SIGNEXTEND DUP12 DUP2 MSIZE 0xC 0x2C BALANCE 0xBF 0xB9 PUSH18 0x577564736F6C634300060C00330000000000 ",
              "sourceMap": "251:325:72:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;316:38;;;:::i;:::-;;;;-1:-1:-1;;;;;316:38:72;;;;;;;;;;;;;;182:778:38;;;;;;;;;;;;;;;;-1:-1:-1;;;;;182:778:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;182:778:38;;-1:-1:-1;182:778:38;;-1:-1:-1;;;;;182:778:38:i;435:138:72:-;;;:::i;316:38::-;;;-1:-1:-1;;;;;316:38:72;;:::o;182:778:38:-;257:13;416:19;446:6;438:15;;416:37;;495:4;489:11;-1:-1:-1;;;514:5:38;507:81;620:11;613:4;606:5;602:16;595:37;-1:-1:-1;;;657:4:38;650:5;646:16;639:92;764:4;757:5;754:1;747:22;786:28;;;-1:-1:-1;;;;;786:28:38;;;;;;738:31;;-1:-1:-1;786:28:38;;-1:-1:-1;786:28:38;;;;;;;824:12;;:16;821:135;;851:12;868:5;-1:-1:-1;;;;;868:10:38;879:5;868:17;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;868:17:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;850:35;;;901:7;893:56;;;;-1:-1:-1;;;893:56:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;821:135;;182:778;;;;;:::o;435:138:72:-;471:22;553:8;;531:36;;;;;;;;;;;;;;-1:-1:-1;;;;;553:8:72;;531:13;:36::i;:::-;501:67;;435:138;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "164600",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "create()": "infinite",
                "deployMinimal(address,bytes)": "infinite",
                "instance()": "1015"
              }
            },
            "methodIdentifiers": {
              "create()": "efc81a8c",
              "deployMinimal(address,bytes)": "b3eeb5e2",
              "instance()": "022ec095"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"name\":\"ProxyCreated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract MultipleWinnersHarness\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"deployMinimal\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"instance\",\"outputs\":[{\"internalType\":\"contract MultipleWinnersHarness\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"title\":\"Creates a minimal proxy to the MultipleWinners prize strategy.  Very cheap to deploy.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/MultipleWinnersHarnessProxyFactory.sol\":\"MultipleWinnersHarnessProxyFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.6.0;\\n\\n/// @title Random Number Generator Interface\\n/// @notice Provides an interface for requesting random numbers from 3rd-party RNG services (Chainlink VRF, Starkware VDF, etc..)\\ninterface RNGInterface {\\n\\n  /// @notice Emitted when a new request for a random number has been submitted\\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\\n  /// @param sender The indexed address of the sender of the request\\n  event RandomNumberRequested(uint32 indexed requestId, address indexed sender);\\n\\n  /// @notice Emitted when an existing request for a random number has been completed\\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\\n  /// @param randomNumber The random number produced by the 3rd-party service\\n  event RandomNumberCompleted(uint32 indexed requestId, uint256 randomNumber);\\n\\n  /// @notice Gets the last request id used by the RNG service\\n  /// @return requestId The last request id used in the last request\\n  function getLastRequestId() external view returns (uint32 requestId);\\n\\n  /// @notice Gets the Fee for making a Request against an RNG service\\n  /// @return feeToken The address of the token that is used to pay fees\\n  /// @return requestFee The fee required to be paid to make a request\\n  function getRequestFee() external view returns (address feeToken, uint256 requestFee);\\n\\n  /// @notice Sends a request for a random number to the 3rd-party service\\n  /// @dev Some services will complete the request immediately, others may have a time-delay\\n  /// @dev Some services require payment in the form of a token, such as $LINK for Chainlink VRF\\n  /// @return requestId The ID of the request used to get the results of the RNG service\\n  /// @return lockBlock The block number at which the RNG service will start generating time-delayed randomness.  The calling contract\\n  /// should \\\"lock\\\" all activity until the result is available via the `requestId`\\n  function requestRandomNumber() external returns (uint32 requestId, uint32 lockBlock);\\n\\n  /// @notice Checks if the request for randomness from the 3rd-party service has completed\\n  /// @dev For time-delayed requests, this function is used to check/confirm completion\\n  /// @param requestId The ID of the request used to get the results of the RNG service\\n  /// @return isCompleted True if the request has completed and a random number is available, false otherwise\\n  function isRequestComplete(uint32 requestId) external view returns (bool isCompleted);\\n\\n  /// @notice Gets the random number produced by the 3rd-party service\\n  /// @param requestId The ID of the request used to get the results of the RNG service\\n  /// @return randomNum The random number\\n  function randomNumber(uint32 requestId) external returns (uint256 randomNum);\\n}\\n\",\"keccak256\":\"0xf917c68439d7476cd226f475e8fce940e0cf1d32cb0ff12e8537072a07f2b1da\",\"license\":\"GPL-3.0\"},\"contracts/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary Constants {\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC721 = 0x80ac58cd;\\n}\",\"keccak256\":\"0x5dc8f8bda4e9668a9ffae6a941774f849adcb368cc2275fd8a91e6ada8fad7fb\",\"license\":\"GPL-3.0\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"},\"contracts/external/openzeppelin/ProxyFactory.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\n// solium-disable security/no-inline-assembly\\n// solium-disable security/no-low-level-calls\\ncontract ProxyFactory {\\n\\n  event ProxyCreated(address proxy);\\n\\n  function deployMinimal(address _logic, bytes memory _data) public returns (address proxy) {\\n    // Adapted from https://github.com/optionality/clone-factory/blob/32782f82dfc5a00d103a7e61a17a5dedbd1e8e9d/contracts/CloneFactory.sol\\n    bytes20 targetBytes = bytes20(_logic);\\n    assembly {\\n      let clone := mload(0x40)\\n      mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n      mstore(add(clone, 0x14), targetBytes)\\n      mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n      proxy := create(0, clone, 0x37)\\n    }\\n\\n    emit ProxyCreated(address(proxy));\\n\\n    if(_data.length > 0) {\\n      (bool success,) = proxy.call(_data);\\n      require(success, \\\"ProxyFactory/constructor-call-failed\\\");\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0xf0422303985796fdd8bdf772ac8e34331e2e63006f657989cca010fa4776d735\"},\"contracts/prize-pool/PrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../external/compound/ICompLike.sol\\\";\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../reserve/ReserveInterface.sol\\\";\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/TokenListenerLibrary.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\nimport \\\"./PrizePoolInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using SafeERC20Upgradeable for IERC721Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    address reserveRegistry,\\n    uint256 maxExitFeeMantissa\\n  );\\n\\n  /// @dev Event emitted when controlled token is added\\n  event ControlledTokenAdded(\\n    ControlledTokenInterface indexed token\\n  );\\n\\n  /// @dev Emitted when reserve is captured.\\n  event ReserveFeeCaptured(\\n    uint256 amount\\n  );\\n\\n  event AwardCaptured(\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when assets are deposited\\n  event Deposited(\\n    address indexed operator,\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount,\\n    address referrer\\n  );\\n\\n  /// @dev Event emitted when interest is awarded to a winner\\n  event Awarded(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are awarded to a winner\\n  event AwardedExternalERC20(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are transferred out\\n  event TransferredExternalERC20(\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC721s are awarded to a winner\\n  event AwardedExternalERC721(\\n    address indexed winner,\\n    address indexed token,\\n    uint256[] tokenIds\\n  );\\n\\n  /// @dev Event emitted when assets are withdrawn instantly\\n  event InstantWithdrawal(\\n    address indexed operator,\\n    address indexed from,\\n    address indexed token,\\n    uint256 amount,\\n    uint256 redeemed,\\n    uint256 exitFee\\n  );\\n\\n  event ReserveWithdrawal(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when the Liquidity Cap is set\\n  event LiquidityCapSet(\\n    uint256 liquidityCap\\n  );\\n\\n  /// @dev Event emitted when the Credit plan is set\\n  event CreditPlanSet(\\n    address token,\\n    uint128 creditLimitMantissa,\\n    uint128 creditRateMantissa\\n  );\\n\\n  /// @dev Event emitted when the Prize Strategy is set\\n  event PrizeStrategySet(\\n    address indexed prizeStrategy\\n  );\\n\\n  /// @dev Emitted when credit is minted\\n  event CreditMinted(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when credit is burned\\n  event CreditBurned(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\\n  event ErrorAwardingExternalERC721(bytes error);\\n\\n\\n  struct CreditPlan {\\n    uint128 creditLimitMantissa;\\n    uint128 creditRateMantissa;\\n  }\\n\\n  struct CreditBalance {\\n    uint192 balance;\\n    uint32 timestamp;\\n    bool initialized;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  /// @dev Reserve to which reserve fees are sent\\n  RegistryInterface public reserveRegistry;\\n\\n  /// @dev An array of all the controlled tokens\\n  ControlledTokenInterface[] internal _tokens;\\n\\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\\n  TokenListenerInterface public prizeStrategy;\\n\\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\\n  /// For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\\n  uint256 public maxExitFeeMantissa;\\n\\n  /// @dev The total funds that have been allocated to the reserve\\n  uint256 public reserveTotalSupply;\\n\\n  /// @dev The total amount of funds that the prize pool can hold.\\n  uint256 public liquidityCap;\\n\\n  /// @dev the The awardable balance\\n  uint256 internal _currentAwardBalance;\\n\\n  /// @dev Stores the credit plan for each token.\\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\\n\\n  /// @dev Stores each users balance of credit per token.\\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\\n\\n  /// @notice Initializes the Prize Pool\\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\\n  /// @param _maxExitFeeMantissa The maximum exit fee size\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_reserveRegistry) != address(0), \\\"PrizePool/reserveRegistry-not-zero\\\");\\n    uint256 controlledTokensLength = _controlledTokens.length;\\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\\n\\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\\n      _addControlledToken(controlledToken, i);\\n    }\\n    __Ownable_init();\\n    __ReentrancyGuard_init();\\n    _setLiquidityCap(uint256(-1));\\n\\n    reserveRegistry = _reserveRegistry;\\n    maxExitFeeMantissa = _maxExitFeeMantissa;\\n\\n    emit Initialized(\\n      address(_reserveRegistry),\\n      maxExitFeeMantissa\\n    );\\n  }\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external override view returns (address) {\\n    return address(_token());\\n  }\\n\\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\\n  /// @return The underlying balance of assets\\n  function balance() external returns (uint256) {\\n    return _balance();\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function canAwardExternal(address _externalToken) external view returns (bool) {\\n    return _canAwardExternal(_externalToken);\\n  }\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    canAddLiquidity(amount)\\n  {\\n    address operator = _msgSender();\\n\\n    _mint(to, amount, controlledToken, referrer);\\n\\n    _token().safeTransferFrom(operator, address(this), amount);\\n    _supply(amount);\\n\\n    emit Deposited(operator, to, controlledToken, amount, referrer);\\n  }\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    returns (uint256)\\n  {\\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n    require(exitFee <= maximumExitFee, \\\"PrizePool/exit-fee-exceeds-user-maximum\\\");\\n\\n    // burn the credit\\n    _burnCredit(from, controlledToken, burnedCredit);\\n\\n    // burn the tickets\\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\\n\\n    // redeem the tickets less the fee\\n    uint256 amountLessFee = amount.sub(exitFee);\\n    uint256 redeemed = _redeem(amountLessFee);\\n\\n    _token().safeTransfer(from, redeemed);\\n\\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\\n\\n    return exitFee;\\n  }\\n\\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\\n  /// @param exitFee The exit fee to check against the limit\\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\\n    if (exitFee > maxFee) {\\n      exitFee = maxFee;\\n    }\\n    return exitFee;\\n  }\\n\\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\\n  /// @param from The address the tokens are being transferred from (0 if minting)\\n  /// @param to The address the tokens are being transferred to (0 if burning)\\n  /// @param amount The amount of tokens being trasferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\\n    if (from != address(0)) {\\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\\n      // first accrue credit for their old balance\\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\\n\\n      if (from != to) {\\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\\n      }\\n\\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\\n    }\\n    if (to != address(0) && to != from) {\\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\\n    }\\n    // if we aren't minting\\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\\n    }\\n  }\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external override view returns (uint256) {\\n    return _currentAwardBalance;\\n  }\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n\\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\\n    uint256 currentBalance = _balance();\\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\\n\\n    if (unaccountedPrizeBalance > 0) {\\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\\n      if (reserveFee > 0) {\\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\\n        emit ReserveFeeCaptured(reserveFee);\\n      }\\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\\n\\n      emit AwardCaptured(unaccountedPrizeBalance);\\n    }\\n\\n    return _currentAwardBalance;\\n  }\\n\\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\\n\\n    uint256 amount = reserveTotalSupply;\\n    reserveTotalSupply = 0;\\n    uint256 redeemed = _redeem(amount);\\n\\n    _token().safeTransfer(address(to), redeemed);\\n\\n    emit ReserveWithdrawal(to, amount);\\n\\n    return redeemed;\\n  }\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external override\\n    onlyPrizeStrategy\\n    onlyControlledToken(controlledToken)\\n  {\\n    if (amount == 0) {\\n      return;\\n    }\\n\\n    require(amount <= _currentAwardBalance, \\\"PrizePool/award-exceeds-avail\\\");\\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\\n\\n    _mint(to, amount, controlledToken, address(0));\\n\\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\\n\\n    emit Awarded(to, controlledToken, amount);\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit TransferredExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit AwardedExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  function _transferOut(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (bool)\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (amount == 0) {\\n      return false;\\n    }\\n\\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\\n\\n    return true;\\n  }\\n\\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\\n  /// @param to The user who is receiving the tokens\\n  /// @param amount The amount of tokens they are receiving\\n  /// @param controlledToken The token that is going to be minted\\n  /// @param referrer The user who referred the minting\\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\\n    if (address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n    ControlledToken(controlledToken).controllerMint(to, amount);\\n  }\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (tokenIds.length == 0) {\\n      return;\\n    }\\n\\n    for (uint256 i = 0; i < tokenIds.length; i++) {\\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\\n\\n      }\\n      catch(bytes memory error){\\n        emit ErrorAwardingExternalERC721(error);\\n      }\\n      \\n    }\\n\\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\\n  }\\n\\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\\n  /// @param amount The prize amount\\n  /// @return The size of the reserve portion of the prize\\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    if (address(reserve) == address(0)) {\\n      return 0;\\n    }\\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\\n    if (reserveRateMantissa == 0) {\\n      return 0;\\n    }\\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\\n  }\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external override\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    )\\n  {\\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n  }\\n\\n  /// @dev Calculates the early exit fee for the given amount\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return Exit fee\\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\\n    return _limitExitFee(\\n      amount,\\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external override\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    durationSeconds =_estimateCreditAccrualTime(\\n      _controlledToken,\\n      _principal,\\n      _interest\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function _estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    internal\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    // interest = credit rate * principal * time\\n    // => time = interest / (credit rate * principal)\\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\\n    if (accruedPerSecond == 0) {\\n      return 0;\\n    }\\n    return _interest.div(accruedPerSecond);\\n  }\\n\\n  /// @notice Burns a users credit.\\n  /// @param user The user whose credit should be burned\\n  /// @param credit The amount of credit to burn\\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\\n\\n    emit CreditBurned(user, controlledToken, credit);\\n  }\\n\\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\\n  /// @param user The user for whom to accrue credit\\n  /// @param controlledToken The controlled token whose balance we are checking\\n  /// @param controlledTokenBalance The balance to use for the user\\n  /// @param extra Additional credit to be added\\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\\n    _updateCreditBalance(\\n      user,\\n      controlledToken,\\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\\n    );\\n  }\\n\\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\\n    uint256 newBalance;\\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\\n    if (!creditBalance.initialized) {\\n      newBalance = 0;\\n    } else {\\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\\n    }\\n    return newBalance;\\n  }\\n\\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\\n\\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\\n      balance: newBalance.toUint128(),\\n      timestamp: _currentTime().toUint32(),\\n      initialized: true\\n    });\\n\\n    if (oldBalance < newBalance) {\\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\\n    } \\n    else if (newBalance < oldBalance) {\\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\\n    }\\n  }\\n\\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\\n  /// @param creditBalance The new credit balance to be checked\\n  /// @return The users new credit balance.  Will not exceed the credit limit.\\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\\n      controlledTokenBalance,\\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\\n    );\\n    if (creditBalance > creditLimit) {\\n      creditBalance = creditLimit;\\n    }\\n\\n    return creditBalance;\\n  }\\n\\n  /// @notice Calculates the accrued interest for a user\\n  /// @param user The user whose credit should be calculated.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\\n  /// @return The credit that has accrued since the last credit update.\\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\\n\\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\\n      return 0;\\n    }\\n\\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\\n  }\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\\n    return _tokenCreditBalances[controlledToken][user].balance;\\n  }\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external override\\n    onlyControlledToken(_controlledToken)\\n    onlyOwner\\n  {\\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\\n      creditLimitMantissa: _creditLimitMantissa,\\n      creditRateMantissa: _creditRateMantissa\\n    });\\n\\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\\n  }\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external override\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    )\\n  {\\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\\n  }\\n\\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The token they are withdrawing\\n  /// @param amount The amount of funds they are withdrawing\\n  /// @return earlyExitFee The additional exit fee that should be charged.\\n  /// @return creditBurned The amount of credit that will be burned\\n  function _calculateEarlyExitFeeLessBurnedCredit(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (\\n      uint256 earlyExitFee,\\n      uint256 creditBurned\\n    )\\n  {\\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\\n    require(controlledTokenBalance >= amount, \\\"PrizePool/insuff-funds\\\");\\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\\n    /*\\n    The credit is used *last*.  Always charge the fees up-front.\\n\\n    How to calculate:\\n\\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\\n\\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\\n    */\\n\\n    // Determine available usable credit based on withdraw amount\\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\\n\\n    uint256 availableCredit;\\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\\n    }\\n\\n    // Determine amount of credit to burn and amount of fees required\\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\\n    earlyExitFee = totalExitFee.sub(creditBurned);\\n  }\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\\n    _setLiquidityCap(_liquidityCap);\\n  }\\n\\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\\n    liquidityCap = _liquidityCap;\\n    emit LiquidityCapSet(_liquidityCap);\\n  }\\n\\n  /// @notice Adds a new controlled token\\n  /// @param _controlledToken The controlled token to add.\\n  /// @param index The index to add the controlledToken\\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\\n    require(_controlledToken.controller() == this, \\\"PrizePool/token-ctrlr-mismatch\\\");\\n    \\n    _tokens[index] = _controlledToken;\\n    emit ControlledTokenAdded(_controlledToken);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\\n    _setPrizeStrategy(_prizeStrategy);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\\n    require(address(_prizeStrategy) != address(0), \\\"PrizePool/prizeStrategy-not-zero\\\");\\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PrizePool/prizeStrategy-invalid\\\");\\n    prizeStrategy = _prizeStrategy;\\n\\n    emit PrizeStrategySet(address(_prizeStrategy));\\n  }\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\\n    return _tokens;\\n  }\\n\\n  /// @dev Gets the current time as represented by the current block\\n  /// @return The timestamp of the current block\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external override view returns (uint256) {\\n    return _tokenTotalSupply();\\n  }\\n\\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\\n  /// @param to The address to delegate to \\n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\\n    if (compLike.balanceOf(address(this)) > 0) {\\n      compLike.delegate(to);\\n    }\\n  }\\n  \\n  /// @notice Required for ERC721 safe token transfers from smart contracts.\\n  /// @param operator The address that acts on behalf of the owner\\n  /// @param from The current owner of the NFT\\n  /// @param tokenId The NFT to transfer\\n  /// @param data Additional data with no specified format, sent in call to `_to`.\\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function _tokenTotalSupply() internal view returns (uint256) {\\n    uint256 total = reserveTotalSupply;\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \\n    uint256 tokensLength = tokens.length;\\n    \\n    for(uint256 i = 0; i < tokensLength; i++){\\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\\n    }\\n\\n    return total;\\n  }\\n\\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\\n  }\\n\\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\\n    uint256 tokensLength = tokens.length;\\n\\n    for(uint256 i = 0; i < tokensLength; i++) {\\n      if(tokens[i] == controlledToken) return true;\\n    }\\n    return false;\\n  }\\n  \\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\\n    return _isControlled(controlledToken);\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function _token() internal virtual view returns (IERC20Upgradeable);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal virtual returns (uint256);\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal virtual;\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\\n\\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  modifier onlyControlledToken(address controlledToken) {\\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \\\"PrizePool/unknown-token\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure caller is the prize-strategy\\n  modifier onlyPrizeStrategy() {\\n    require(_msgSender() == address(prizeStrategy), \\\"PrizePool/only-prizeStrategy\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\\n  modifier canAddLiquidity(uint256 _amount) {\\n    require(_canAddLiquidity(_amount), \\\"PrizePool/exceeds-liquidity-cap\\\");\\n    _;\\n  }\\n\\n  modifier onlyReserve() {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    require(address(reserve) == msg.sender, \\\"PrizePool/only-reserve\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x386ebc1c80ab4424f14125e716dd12641ff933b475bf1082b7b1a6eee4a969c3\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListener.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./BeforeAwardListenerInterface.sol\\\";\\nimport \\\"../Constants.sol\\\";\\nimport \\\"./BeforeAwardListenerLibrary.sol\\\";\\n\\nabstract contract BeforeAwardListener is BeforeAwardListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == BeforeAwardListenerLibrary.ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER\\n    );\\n  }\\n}\",\"keccak256\":\"0x5da2a7332421d6136d793ef55410c2da63a7fb719e8522697f78ac4c50391505\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @notice The interface for the Periodic Prize Strategy before award listener.  This listener will be called immediately before the award is distributed.\\ninterface BeforeAwardListenerInterface is IERC165Upgradeable {\\n  /// @notice Called immediately before the award is distributed\\n  function beforePrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x96145efe8fc65aff97d11ffaf0905d53baf4b87c4a575a84d691804468f12083\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary BeforeAwardListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforePrizePoolAwarded(uint256,uint256)')) == 0x4cdf9c3e\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER = 0x4cdf9c3e;\\n}\",\"keccak256\":\"0xeac08a7b8e2e7d508a0af89c05c31c36e2b060674d05dfa9a5016cf2d12cf500\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategy.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\\\";\\nimport \\\"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../token/TokenListener.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TicketInterface.sol\\\";\\nimport \\\"../prize-pool/PrizePool.sol\\\";\\nimport \\\"../Constants.sol\\\";\\nimport \\\"./PeriodicPrizeStrategyListenerInterface.sol\\\";\\nimport \\\"./PeriodicPrizeStrategyListenerLibrary.sol\\\";\\nimport \\\"./BeforeAwardListener.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\nabstract contract PeriodicPrizeStrategy is Initializable,\\n                                           OwnableUpgradeable,\\n                                           TokenListener {\\n\\n  using SafeMathUpgradeable for uint256;\\n  using SafeMathUpgradeable for uint16;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using AddressUpgradeable for address;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  uint256 internal constant ETHEREUM_BLOCK_TIME_ESTIMATE_MANTISSA = 13.4 ether;\\n\\n  event PrizePoolOpened(\\n    address indexed operator,\\n    uint256 indexed prizePeriodStartedAt\\n  );\\n\\n  event RngRequestFailed();\\n\\n  event PrizePoolAwardStarted(\\n    address indexed operator,\\n    address indexed prizePool,\\n    uint32 indexed rngRequestId,\\n    uint32 rngLockBlock\\n  );\\n\\n  event PrizePoolAwardCancelled(\\n    address indexed operator,\\n    address indexed prizePool,\\n    uint32 indexed rngRequestId,\\n    uint32 rngLockBlock\\n  );\\n\\n  event PrizePoolAwarded(\\n    address indexed operator,\\n    uint256 randomNumber\\n  );\\n\\n  event RngServiceUpdated(\\n    RNGInterface indexed rngService\\n  );\\n\\n  event TokenListenerUpdated(\\n    TokenListenerInterface indexed tokenListener\\n  );\\n\\n  event RngRequestTimeoutSet(\\n    uint32 rngRequestTimeout\\n  );\\n\\n  event PrizePeriodSecondsUpdated(\\n    uint256 prizePeriodSeconds\\n  );\\n\\n  event BeforeAwardListenerSet(\\n    BeforeAwardListenerInterface indexed beforeAwardListener\\n  );\\n\\n  event PeriodicPrizeStrategyListenerSet(\\n    PeriodicPrizeStrategyListenerInterface indexed periodicPrizeStrategyListener\\n  );\\n\\n  event ExternalErc721AwardAdded(\\n    IERC721Upgradeable indexed externalErc721,\\n    uint256[] tokenIds\\n  );\\n\\n  event ExternalErc20AwardAdded(\\n    IERC20Upgradeable indexed externalErc20\\n  );\\n\\n  event ExternalErc721AwardRemoved(\\n    IERC721Upgradeable indexed externalErc721Award\\n  );\\n\\n  event ExternalErc20AwardRemoved(\\n    IERC20Upgradeable indexed externalErc20Award\\n  );\\n\\n  event Initialized(\\n    uint256 prizePeriodStart,\\n    uint256 prizePeriodSeconds,\\n    PrizePool indexed prizePool,\\n    TicketInterface ticket,\\n    IERC20Upgradeable sponsorship,\\n    RNGInterface rng,\\n    IERC20Upgradeable[] externalErc20Awards\\n  );\\n\\n  struct RngRequest {\\n    uint32 id;\\n    uint32 lockBlock;\\n    uint32 requestedAt;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  // Comptroller\\n  TokenListenerInterface public tokenListener;\\n\\n  // Contract Interfaces\\n  PrizePool public prizePool;\\n  TicketInterface public ticket;\\n  IERC20Upgradeable public sponsorship;\\n  RNGInterface public rng;\\n\\n  // Current RNG Request\\n  RngRequest internal rngRequest;\\n\\n  /// @notice RNG Request Timeout.  In fact, this is really a \\\"complete award\\\" timeout.\\n  /// If the rng completes the award can still be cancelled.\\n  uint32 public rngRequestTimeout;\\n\\n  // Prize period\\n  uint256 public prizePeriodSeconds;\\n  uint256 public prizePeriodStartedAt;\\n\\n  // External tokens awarded as part of prize\\n  MappedSinglyLinkedList.Mapping internal externalErc20s;\\n  MappedSinglyLinkedList.Mapping internal externalErc721s;\\n\\n  // External NFT token IDs to be awarded\\n  //   NFT Address => TokenIds\\n  mapping (IERC721Upgradeable => uint256[]) internal externalErc721TokenIds;\\n\\n  /// @notice A listener that is called before the prize is awarded\\n  BeforeAwardListenerInterface public beforeAwardListener;\\n\\n  /// @notice A listener that is called after the prize is awarded\\n  PeriodicPrizeStrategyListenerInterface public periodicPrizeStrategyListener;\\n\\n  /// @notice Initializes a new strategy\\n  /// @param _prizePeriodStart The starting timestamp of the prize period.\\n  /// @param _prizePeriodSeconds The duration of the prize period in seconds\\n  /// @param _prizePool The prize pool to award\\n  /// @param _ticket The ticket to use to draw winners\\n  /// @param _sponsorship The sponsorship token\\n  /// @param _rng The RNG service to use\\n  function initialize (\\n    uint256 _prizePeriodStart,\\n    uint256 _prizePeriodSeconds,\\n    PrizePool _prizePool,\\n    TicketInterface _ticket,\\n    IERC20Upgradeable _sponsorship,\\n    RNGInterface _rng,\\n    IERC20Upgradeable[] memory externalErc20Awards\\n  ) public initializer {\\n    require(address(_prizePool) != address(0), \\\"PeriodicPrizeStrategy/prize-pool-not-zero\\\");\\n    require(address(_ticket) != address(0), \\\"PeriodicPrizeStrategy/ticket-not-zero\\\");\\n    require(address(_sponsorship) != address(0), \\\"PeriodicPrizeStrategy/sponsorship-not-zero\\\");\\n    require(address(_rng) != address(0), \\\"PeriodicPrizeStrategy/rng-not-zero\\\");\\n    prizePool = _prizePool;\\n    ticket = _ticket;\\n    rng = _rng;\\n    sponsorship = _sponsorship;\\n    _setPrizePeriodSeconds(_prizePeriodSeconds);\\n\\n    __Ownable_init();\\n\\n    externalErc20s.initialize();\\n    for (uint256 i = 0; i < externalErc20Awards.length; i++) {\\n      _addExternalErc20Award(externalErc20Awards[i]);\\n    }\\n\\n    prizePeriodSeconds = _prizePeriodSeconds;\\n    prizePeriodStartedAt = _prizePeriodStart;\\n\\n    externalErc721s.initialize();\\n\\n    // 30 min timeout\\n    _setRngRequestTimeout(1800);\\n\\n    emit Initialized(\\n      _prizePeriodStart,\\n      _prizePeriodSeconds,\\n      _prizePool,\\n      _ticket,\\n      _sponsorship,\\n      _rng,\\n      externalErc20Awards\\n    );\\n    emit PrizePoolOpened(_msgSender(), prizePeriodStartedAt);\\n  }\\n\\n  function _distribute(uint256 randomNumber) internal virtual;\\n\\n  /// @notice Calculates and returns the currently accrued prize\\n  /// @return The current prize size\\n  function currentPrize() public view returns (uint256) {\\n    return prizePool.awardBalance();\\n  }\\n\\n  /// @notice Allows the owner to set the token listener\\n  /// @param _tokenListener A contract that implements the token listener interface.\\n  function setTokenListener(TokenListenerInterface _tokenListener) external onlyOwner requireAwardNotInProgress {\\n    require(address(0) == address(_tokenListener) || address(_tokenListener).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PeriodicPrizeStrategy/token-listener-invalid\\\");\\n\\n    tokenListener = _tokenListener;\\n\\n    emit TokenListenerUpdated(tokenListener);\\n  }\\n\\n  /// @notice Estimates the remaining blocks until the prize given a number of seconds per block\\n  /// @param secondsPerBlockMantissa The number of seconds per block to use for the calculation.  Should be a fixed point 18 number like Ether.\\n  /// @return The estimated number of blocks remaining until the prize can be awarded.\\n  function estimateRemainingBlocksToPrize(uint256 secondsPerBlockMantissa) public view returns (uint256) {\\n    return FixedPoint.divideUintByMantissa(\\n      _prizePeriodRemainingSeconds(),\\n      secondsPerBlockMantissa\\n    );\\n  }\\n\\n  /// @notice Returns the number of seconds remaining until the prize can be awarded.\\n  /// @return The number of seconds remaining until the prize can be awarded.\\n  function prizePeriodRemainingSeconds() external view returns (uint256) {\\n    return _prizePeriodRemainingSeconds();\\n  }\\n\\n  /// @notice Returns the number of seconds remaining until the prize can be awarded.\\n  /// @return The number of seconds remaining until the prize can be awarded.\\n  function _prizePeriodRemainingSeconds() internal view returns (uint256) {\\n    uint256 endAt = _prizePeriodEndAt();\\n    uint256 time = _currentTime();\\n    if (time > endAt) {\\n      return 0;\\n    }\\n    return endAt.sub(time);\\n  }\\n\\n  /// @notice Returns whether the prize period is over\\n  /// @return True if the prize period is over, false otherwise\\n  function isPrizePeriodOver() external view returns (bool) {\\n    return _isPrizePeriodOver();\\n  }\\n\\n  /// @notice Returns whether the prize period is over\\n  /// @return True if the prize period is over, false otherwise\\n  function _isPrizePeriodOver() internal view returns (bool) {\\n    return _currentTime() >= _prizePeriodEndAt();\\n  }\\n\\n  /// @notice Awards collateral as tickets to a user\\n  /// @param user Recipient of minted tokens\\n  /// @param amount Amount of minted tokens\\n  function _awardTickets(address user, uint256 amount) internal {\\n    prizePool.award(user, amount, address(ticket));\\n  }\\n  \\n  /// @notice Mints ticket or sponsorship tokens for user.\\n  /// @dev Mints ticket or sponsorship tokens by looking up the address in the prizePool.tokens mapping. \\n  /// @param user Recipient of minted tokens\\n  /// @param amount Amount of minted tokens\\n  /// @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\\n  function _awardToken(address user, uint256 amount, uint8 tokenIndex) internal {\\n    ControlledTokenInterface[] memory _controlledTokens = prizePool.tokens();\\n    require(tokenIndex <= _controlledTokens.length, \\\"PeriodicPrizeStrategy/award-invalid-token-index\\\");\\n    ControlledTokenInterface _token = _controlledTokens[tokenIndex];\\n    prizePool.award(user, amount, address(_token));\\n  }\\n\\n  /// @notice Awards all external tokens with non-zero balances to the given user.  The external tokens must be held by the PrizePool contract.\\n  /// @param winner The user to transfer the tokens to\\n  function _awardAllExternalTokens(address winner) internal {\\n    _awardExternalErc20s(winner);\\n    _awardExternalErc721s(winner);\\n  }\\n\\n  /// @notice Awards all external ERC20 tokens with non-zero balances to the given user.\\n  /// The external tokens must be held by the PrizePool contract.\\n  /// @param winner The user to transfer the tokens to\\n  function _awardExternalErc20s(address winner) internal {\\n    address currentToken = externalErc20s.start();\\n    while (currentToken != address(0) && currentToken != externalErc20s.end()) {\\n      uint256 balance = IERC20Upgradeable(currentToken).balanceOf(address(prizePool));\\n      if (balance > 0) {\\n        prizePool.awardExternalERC20(winner, currentToken, balance);\\n      }\\n      currentToken = externalErc20s.next(currentToken);\\n    }\\n  }\\n\\n  /// @notice Awards all external ERC721 tokens to the given user.\\n  /// The external tokens must be held by the PrizePool contract.\\n  /// @dev The list of ERC721s is reset after every award\\n  /// @param winner The user to transfer the tokens to\\n  function _awardExternalErc721s(address winner) internal {\\n    address currentToken = externalErc721s.start();\\n    while (currentToken != address(0) && currentToken != externalErc721s.end()) {\\n      uint256 balance = IERC721Upgradeable(currentToken).balanceOf(address(prizePool));\\n      if (balance > 0) {\\n        prizePool.awardExternalERC721(winner, currentToken, externalErc721TokenIds[IERC721Upgradeable(currentToken)]);\\n        _removeExternalErc721AwardTokens(IERC721Upgradeable(currentToken));\\n      }\\n      currentToken = externalErc721s.next(currentToken);\\n    }\\n    externalErc721s.clearAll();\\n  }\\n\\n  /// @notice Returns the timestamp at which the prize period ends\\n  /// @return The timestamp at which the prize period ends.\\n  function prizePeriodEndAt() external view returns (uint256) {\\n    // current prize started at is non-inclusive, so add one\\n    return _prizePeriodEndAt();\\n  }\\n\\n  /// @notice Returns the timestamp at which the prize period ends\\n  /// @return The timestamp at which the prize period ends.\\n  function _prizePeriodEndAt() internal view returns (uint256) {\\n    // current prize started at is non-inclusive, so add one\\n    return prizePeriodStartedAt.add(prizePeriodSeconds);\\n  }\\n\\n  /// @notice Called by the PrizePool for transfers of controlled tokens\\n  /// @dev Note that this is only for *transfers*, not mints or burns\\n  /// @param controlledToken The type of collateral that is being sent\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external override onlyPrizePool {\\n    require(from != to, \\\"PeriodicPrizeStrategy/transfer-to-self\\\");\\n\\n    if (controlledToken == address(ticket)) {\\n      _requireAwardNotInProgress();\\n    }\\n\\n    if (address(tokenListener) != address(0)) {\\n      tokenListener.beforeTokenTransfer(from, to, amount, controlledToken);\\n    }\\n  }\\n\\n  /// @notice Called by the PrizePool when minting controlled tokens\\n  /// @param controlledToken The type of collateral that is being minted\\n  function beforeTokenMint(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external\\n    override\\n    onlyPrizePool\\n  {\\n    if (controlledToken == address(ticket)) {\\n      _requireAwardNotInProgress();\\n    }\\n    if (address(tokenListener) != address(0)) {\\n      tokenListener.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n  }\\n\\n  /// @notice returns the current time.  Used for testing.\\n  /// @return The current time (block.timestamp)\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice returns the current time.  Used for testing.\\n  /// @return The current time (block.timestamp)\\n  function _currentBlock() internal virtual view returns (uint256) {\\n    return block.number;\\n  }\\n\\n  /// @notice Starts the award process by starting random number request.  The prize period must have ended.\\n  /// @dev The RNG-Request-Fee is expected to be held within this contract before calling this function\\n  function startAward() external requireCanStartAward {\\n    (address feeToken, uint256 requestFee) = rng.getRequestFee();\\n    if (feeToken != address(0) && requestFee > 0) {\\n      IERC20Upgradeable(feeToken).safeApprove(address(rng), requestFee);\\n    }\\n\\n    (uint32 requestId, uint32 lockBlock) = rng.requestRandomNumber();\\n    rngRequest.id = requestId;\\n    rngRequest.lockBlock = lockBlock;\\n    rngRequest.requestedAt = _currentTime().toUint32();\\n\\n    emit PrizePoolAwardStarted(_msgSender(), address(prizePool), requestId, lockBlock);\\n  }\\n\\n  /// @notice Can be called by anyone to unlock the tickets if the RNG has timed out.\\n  function cancelAward() public {\\n    require(isRngTimedOut(), \\\"PeriodicPrizeStrategy/rng-not-timedout\\\");\\n    uint32 requestId = rngRequest.id;\\n    uint32 lockBlock = rngRequest.lockBlock;\\n    delete rngRequest;\\n    emit RngRequestFailed();\\n    emit PrizePoolAwardCancelled(msg.sender, address(prizePool), requestId, lockBlock);\\n  }\\n\\n  /// @notice Completes the award process and awards the winners.  The random number must have been requested and is now available.\\n  function completeAward() external requireCanCompleteAward {\\n    uint256 randomNumber = rng.randomNumber(rngRequest.id);\\n    delete rngRequest;\\n\\n    if (address(beforeAwardListener) != address(0)) {\\n      beforeAwardListener.beforePrizePoolAwarded(randomNumber, prizePeriodStartedAt);\\n    }\\n    _distribute(randomNumber);\\n    if (address(periodicPrizeStrategyListener) != address(0)) {\\n      periodicPrizeStrategyListener.afterPrizePoolAwarded(randomNumber, prizePeriodStartedAt);\\n    }\\n\\n    // to avoid clock drift, we should calculate the start time based on the previous period start time.\\n    prizePeriodStartedAt = _calculateNextPrizePeriodStartTime(_currentTime());\\n\\n    emit PrizePoolAwarded(_msgSender(), randomNumber);\\n    emit PrizePoolOpened(_msgSender(), prizePeriodStartedAt);\\n  }\\n\\n  /// @notice Allows the owner to set a listener that is triggered immediately before the award is distributed\\n  /// @dev The listener must implement ERC165 and the BeforeAwardListenerInterface\\n  /// @param _beforeAwardListener The address of the listener contract\\n  function setBeforeAwardListener(BeforeAwardListenerInterface _beforeAwardListener) external onlyOwner requireAwardNotInProgress {\\n    require(\\n      address(0) == address(_beforeAwardListener) || address(_beforeAwardListener).supportsInterface(BeforeAwardListenerLibrary.ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER),\\n      \\\"PeriodicPrizeStrategy/beforeAwardListener-invalid\\\"\\n    );\\n\\n    beforeAwardListener = _beforeAwardListener;\\n\\n    emit BeforeAwardListenerSet(_beforeAwardListener);\\n  }\\n\\n  /// @notice Allows the owner to set a listener for prize strategy callbacks.\\n  /// @param _periodicPrizeStrategyListener The address of the listener contract\\n  function setPeriodicPrizeStrategyListener(PeriodicPrizeStrategyListenerInterface _periodicPrizeStrategyListener) external onlyOwner requireAwardNotInProgress {\\n    require(\\n      address(0) == address(_periodicPrizeStrategyListener) || address(_periodicPrizeStrategyListener).supportsInterface(PeriodicPrizeStrategyListenerLibrary.ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER),\\n      \\\"PeriodicPrizeStrategy/prizeStrategyListener-invalid\\\"\\n    );\\n\\n    periodicPrizeStrategyListener = _periodicPrizeStrategyListener;\\n\\n    emit PeriodicPrizeStrategyListenerSet(_periodicPrizeStrategyListener);\\n  }\\n\\n  function _calculateNextPrizePeriodStartTime(uint256 currentTime) internal view returns (uint256) {\\n    uint256 elapsedPeriods = currentTime.sub(prizePeriodStartedAt).div(prizePeriodSeconds);\\n    return prizePeriodStartedAt.add(elapsedPeriods.mul(prizePeriodSeconds));\\n  }\\n\\n  /// @notice Calculates when the next prize period will start\\n  /// @param currentTime The timestamp to use as the current time\\n  /// @return The timestamp at which the next prize period would start\\n  function calculateNextPrizePeriodStartTime(uint256 currentTime) external view returns (uint256) {\\n    return _calculateNextPrizePeriodStartTime(currentTime);\\n  }\\n\\n  /// @notice Returns whether an award process can be started\\n  /// @return True if an award can be started, false otherwise.\\n  function canStartAward() external view returns (bool) {\\n    return _isPrizePeriodOver() && !isRngRequested();\\n  }\\n\\n  /// @notice Returns whether an award process can be completed\\n  /// @return True if an award can be completed, false otherwise.\\n  function canCompleteAward() external view returns (bool) {\\n    return isRngRequested() && isRngCompleted();\\n  }\\n\\n  /// @notice Returns whether a random number has been requested\\n  /// @return True if a random number has been requested, false otherwise.\\n  function isRngRequested() public view returns (bool) {\\n    return rngRequest.id != 0;\\n  }\\n\\n  /// @notice Returns whether the random number request has completed.\\n  /// @return True if a random number request has completed, false otherwise.\\n  function isRngCompleted() public view returns (bool) {\\n    return rng.isRequestComplete(rngRequest.id);\\n  }\\n\\n  /// @notice Returns the block number that the current RNG request has been locked to\\n  /// @return The block number that the RNG request is locked to\\n  function getLastRngLockBlock() external view returns (uint32) {\\n    return rngRequest.lockBlock;\\n  }\\n\\n  /// @notice Returns the current RNG Request ID\\n  /// @return The current Request ID\\n  function getLastRngRequestId() external view returns (uint32) {\\n    return rngRequest.id;\\n  }\\n\\n  /// @notice Sets the RNG service that the Prize Strategy is connected to\\n  /// @param rngService The address of the new RNG service interface\\n  function setRngService(RNGInterface rngService) external onlyOwner requireAwardNotInProgress {\\n    require(!isRngRequested(), \\\"PeriodicPrizeStrategy/rng-in-flight\\\");\\n\\n    rng = rngService;\\n    emit RngServiceUpdated(rngService);\\n  }\\n\\n  /// @notice Allows the owner to set the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\\n  /// @param _rngRequestTimeout The RNG request timeout in seconds.\\n  function setRngRequestTimeout(uint32 _rngRequestTimeout) external onlyOwner requireAwardNotInProgress {\\n    _setRngRequestTimeout(_rngRequestTimeout);\\n  }\\n\\n  /// @notice Sets the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\\n  /// @param _rngRequestTimeout The RNG request timeout in seconds.\\n  function _setRngRequestTimeout(uint32 _rngRequestTimeout) internal {\\n    require(_rngRequestTimeout > 60, \\\"PeriodicPrizeStrategy/rng-timeout-gt-60-secs\\\");\\n    rngRequestTimeout = _rngRequestTimeout;\\n    emit RngRequestTimeoutSet(rngRequestTimeout);\\n  }\\n\\n  /// @notice Allows the owner to set the prize period in seconds.\\n  /// @param _prizePeriodSeconds The new prize period in seconds.  Must be greater than zero.\\n  function setPrizePeriodSeconds(uint256 _prizePeriodSeconds) external onlyOwner requireAwardNotInProgress {\\n    _setPrizePeriodSeconds(_prizePeriodSeconds);\\n  }\\n\\n  /// @notice Sets the prize period in seconds.\\n  /// @param _prizePeriodSeconds The new prize period in seconds.  Must be greater than zero.\\n  function _setPrizePeriodSeconds(uint256 _prizePeriodSeconds) internal {\\n    require(_prizePeriodSeconds > 0, \\\"PeriodicPrizeStrategy/prize-period-greater-than-zero\\\");\\n    prizePeriodSeconds = _prizePeriodSeconds;\\n\\n    emit PrizePeriodSecondsUpdated(prizePeriodSeconds);\\n  }\\n\\n  /// @notice Gets the current list of External ERC20 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC20 token addresses\\n  function getExternalErc20Awards() external view returns (address[] memory) {\\n    return externalErc20s.addressArray();\\n  }\\n\\n  /// @notice Adds an external ERC20 token type as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can assign external tokens,\\n  /// and they must be approved by the Prize-Pool\\n  /// @param _externalErc20 The address of an ERC20 token to be awarded\\n  function addExternalErc20Award(IERC20Upgradeable _externalErc20) external onlyOwnerOrListener requireAwardNotInProgress {\\n    _addExternalErc20Award(_externalErc20);\\n  }\\n\\n  function _addExternalErc20Award(IERC20Upgradeable _externalErc20) internal {\\n    require(address(_externalErc20).isContract(), \\\"PeriodicPrizeStrategy/erc20-null\\\");\\n    require(prizePool.canAwardExternal(address(_externalErc20)), \\\"PeriodicPrizeStrategy/cannot-award-external\\\");\\n    (bool succeeded, bytes memory returnValue) = address(_externalErc20).staticcall(abi.encodeWithSignature(\\\"totalSupply()\\\"));\\n    require(succeeded, \\\"PeriodicPrizeStrategy/erc20-invalid\\\");\\n    externalErc20s.addAddress(address(_externalErc20));\\n    emit ExternalErc20AwardAdded(_externalErc20);\\n  }\\n\\n  function addExternalErc20Awards(IERC20Upgradeable[] calldata _externalErc20s) external onlyOwnerOrListener requireAwardNotInProgress {\\n    for (uint256 i = 0; i < _externalErc20s.length; i++) {\\n      _addExternalErc20Award(_externalErc20s[i]);\\n    }\\n  }\\n\\n  /// @notice Removes an external ERC20 token type as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can remove external tokens\\n  /// @param _externalErc20 The address of an ERC20 token to be removed\\n  /// @param _prevExternalErc20 The address of the previous ERC20 token in the `externalErc20s` list.\\n  /// If the ERC20 is the first address, then the previous address is the SENTINEL address: 0x0000000000000000000000000000000000000001\\n  function removeExternalErc20Award(IERC20Upgradeable _externalErc20, IERC20Upgradeable _prevExternalErc20) external onlyOwner requireAwardNotInProgress {\\n    externalErc20s.removeAddress(address(_prevExternalErc20), address(_externalErc20));\\n    emit ExternalErc20AwardRemoved(_externalErc20);\\n  }\\n\\n  /// @notice Gets the current list of External ERC721 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC721 token addresses\\n  function getExternalErc721Awards() external view returns (address[] memory) {\\n    return externalErc721s.addressArray();\\n  }\\n\\n  /// @notice Gets the current list of External ERC721 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC721 token addresses\\n  function getExternalErc721AwardTokenIds(IERC721Upgradeable _externalErc721) external view returns (uint256[] memory) {\\n    return externalErc721TokenIds[_externalErc721];\\n  }\\n\\n  /// @notice Adds an external ERC721 token as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can assign external tokens,\\n  /// and they must be approved by the Prize-Pool\\n  /// NOTE: The NFT must already be owned by the Prize-Pool\\n  /// @param _externalErc721 The address of an ERC721 token to be awarded\\n  /// @param _tokenIds An array of token IDs of the ERC721 to be awarded\\n  function addExternalErc721Award(IERC721Upgradeable _externalErc721, uint256[] calldata _tokenIds) external onlyOwnerOrListener requireAwardNotInProgress {\\n    require(prizePool.canAwardExternal(address(_externalErc721)), \\\"PeriodicPrizeStrategy/cannot-award-external\\\");\\n    require(address(_externalErc721).supportsInterface(Constants.ERC165_INTERFACE_ID_ERC721), \\\"PeriodicPrizeStrategy/erc721-invalid\\\");\\n    \\n    if (!externalErc721s.contains(address(_externalErc721))) {\\n      externalErc721s.addAddress(address(_externalErc721));\\n    }\\n\\n    for (uint256 i = 0; i < _tokenIds.length; i++) {\\n      _addExternalErc721Award(_externalErc721, _tokenIds[i]);\\n    }\\n\\n    emit ExternalErc721AwardAdded(_externalErc721, _tokenIds);\\n  }\\n\\n  function _addExternalErc721Award(IERC721Upgradeable _externalErc721, uint256 _tokenId) internal {\\n    require(IERC721Upgradeable(_externalErc721).ownerOf(_tokenId) == address(prizePool), \\\"PeriodicPrizeStrategy/unavailable-token\\\");\\n    for (uint256 i = 0; i < externalErc721TokenIds[_externalErc721].length; i++) {\\n      if (externalErc721TokenIds[_externalErc721][i] == _tokenId) {\\n        revert(\\\"PeriodicPrizeStrategy/erc721-duplicate\\\");\\n      }\\n    }\\n    externalErc721TokenIds[_externalErc721].push(_tokenId);\\n  }\\n\\n  /// @notice Removes an external ERC721 token as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can remove external tokens\\n  /// @param _externalErc721 The address of an ERC721 token to be removed\\n  /// @param _prevExternalErc721 The address of the previous ERC721 token in the list.\\n  /// If no previous, then pass the SENTINEL address: 0x0000000000000000000000000000000000000001\\n  function removeExternalErc721Award(\\n    IERC721Upgradeable _externalErc721,\\n    IERC721Upgradeable _prevExternalErc721\\n  )\\n    external\\n    onlyOwner\\n    requireAwardNotInProgress\\n  {\\n    externalErc721s.removeAddress(address(_prevExternalErc721), address(_externalErc721));\\n    _removeExternalErc721AwardTokens(_externalErc721);\\n  }\\n\\n  function _removeExternalErc721AwardTokens(\\n    IERC721Upgradeable _externalErc721\\n  )\\n    internal\\n  {\\n    delete externalErc721TokenIds[_externalErc721];\\n    emit ExternalErc721AwardRemoved(_externalErc721);\\n  }\\n\\n  function _requireAwardNotInProgress() internal view {\\n    uint256 currentBlock = _currentBlock();\\n    require(rngRequest.lockBlock == 0 || currentBlock < rngRequest.lockBlock, \\\"PeriodicPrizeStrategy/rng-in-flight\\\");\\n  }\\n\\n  function isRngTimedOut() public view returns (bool) {\\n    if (rngRequest.requestedAt == 0) {\\n      return false;\\n    } else {\\n      return _currentTime() > uint256(rngRequestTimeout).add(rngRequest.requestedAt);\\n    }\\n  }\\n\\n  modifier onlyOwnerOrListener() {\\n    require(_msgSender() == owner() ||\\n            _msgSender() == address(periodicPrizeStrategyListener) ||\\n            _msgSender() == address(beforeAwardListener),\\n            \\\"PeriodicPrizeStrategy/only-owner-or-listener\\\");\\n    _;\\n  }\\n\\n  modifier requireAwardNotInProgress() {\\n    _requireAwardNotInProgress();\\n    _;\\n  }\\n\\n  modifier requireCanStartAward() {\\n    require(_isPrizePeriodOver(), \\\"PeriodicPrizeStrategy/prize-period-not-over\\\");\\n    require(!isRngRequested(), \\\"PeriodicPrizeStrategy/rng-already-requested\\\");\\n    _;\\n  }\\n\\n  modifier requireCanCompleteAward() {\\n    require(isRngRequested(), \\\"PeriodicPrizeStrategy/rng-not-requested\\\");\\n    require(isRngCompleted(), \\\"PeriodicPrizeStrategy/rng-not-complete\\\");\\n    _;\\n  }\\n\\n  modifier onlyPrizePool() {\\n    require(_msgSender() == address(prizePool), \\\"PeriodicPrizeStrategy/only-prize-pool\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0xd7bf198ab616ed4b3e9c29d20477887d5a1e000e137e447da20bcec73b7cf997\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ninterface PeriodicPrizeStrategyListenerInterface is IERC165Upgradeable {\\n  function afterPrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x229624266562f60200b4e40ebc95a35a8aad799c0ff95a42df243af98a44d198\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary PeriodicPrizeStrategyListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('afterPrizePoolAwarded(uint256,uint256)')) == 0x575072c6\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER = 0x575072c6;\\n}\\n\",\"keccak256\":\"0xed291b9a33e265535032557f0a5430a150701c9eb58b0138c120eb02bc13b514\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PrizeSplit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\n\\n/**\\n  * @title Abstract prize split contract for adding unique award distribution to static addresses. \\n  * @author Kames Geraghty (PoolTogether Inc)\\n*/\\nabstract contract PrizeSplit is OwnableUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  \\n  PrizeSplitConfig[] internal _prizeSplits;\\n\\n  /**\\n    * @notice The prize split configuration struct.\\n    * @dev The prize split configuration struct used to award prize splits during distribution.\\n    * @param target Address of recipient receiving the prize split distribution\\n    * @param percentage Percentage of prize split using a 0-1000 range for single decimal precision i.e. 125 = 12.5%\\n    * @param token Position of controlled token in prizePool.tokens (i.e. ticket or sponsorship)\\n  */\\n  struct PrizeSplitConfig {\\n      address target;\\n      uint16 percentage;\\n      uint8 token;\\n  }\\n\\n  /**\\n    * @notice Emitted when a PrizeSplitConfig config is added or updated.\\n    * @dev Emitted when aPrizeSplitConfig config is added or updated in setPrizeSplits or setPrizeSplit.\\n    * @param target Address of prize split recipient\\n    * @param percentage Percentage of prize split. Must be between 0 and 1000 for single decimal precision\\n    * @param token Index (0 or 1) of token in the prizePool.tokens mapping\\n    * @param index Index of prize split in the prizeSplts array\\n  */\\n  event PrizeSplitSet(address indexed target, uint16 percentage, uint8 token, uint256 index);\\n\\n  /**\\n    * @notice Emitted when a PrizeSplitConfig config is removed.\\n    * @dev Emitted when a PrizeSplitConfig config is removed from the _prizeSplits array.\\n    * @param target Index of a previously active prize split config\\n  */\\n  event PrizeSplitRemoved(uint256 indexed target);\\n\\n  /**\\n    * @notice Mints ticket or sponsorship tokens to prize split recipient.\\n    * @dev Mints ticket or sponsorship tokens to prize split recipient via the linked PrizePool contract.\\n    * @param target Recipient of minted tokens\\n    * @param amount Amount of minted tokens\\n    * @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\\n  */\\n  function _awardPrizeSplitAmount(address target, uint256 amount, uint8 tokenIndex) virtual internal;\\n\\n  /**\\n    * @notice Read all prize splits configs.\\n    * @dev Read all PrizeSplitConfig structs stored in _prizeSplits.\\n    * @return _prizeSplits Array of PrizeSplitConfig structs\\n  */\\n  function prizeSplits() external view returns (PrizeSplitConfig[] memory) {\\n    return _prizeSplits;\\n  }\\n\\n  /**\\n    * @notice Read prize split config from active PrizeSplits.\\n    * @dev Read PrizeSplitConfig struct from _prizeSplits array.\\n    * @param prizeSplitIndex Index position of PrizeSplitConfig\\n    * @return PrizeSplitConfig Single prize split config\\n  */\\n  function prizeSplit(uint256 prizeSplitIndex) external view returns (PrizeSplitConfig memory) {\\n    return _prizeSplits[prizeSplitIndex];\\n  }\\n\\n  /**\\n    * @notice Set and remove prize split(s) configs.\\n    * @dev Set and remove prize split configs by passing a new PrizeSplitConfig structs array. Will remove existing PrizeSplitConfig(s) if passed array length is less than existing _prizeSplits length.\\n    * @param newPrizeSplits Array of PrizeSplitConfig structs\\n  */\\n  function setPrizeSplits(PrizeSplitConfig[] calldata newPrizeSplits) external onlyOwner {\\n    uint256 newPrizeSplitsLength = newPrizeSplits.length;\\n\\n    // Add and/or update prize split configs using newPrizeSplits PrizeSplitConfig structs array.\\n    for (uint256 index = 0; index < newPrizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = newPrizeSplits[index];\\n      require(split.token <= 1, \\\"MultipleWinners/invalid-prizesplit-token\\\");\\n      require(split.target != address(0), \\\"MultipleWinners/invalid-prizesplit-target\\\");\\n      \\n      if (_prizeSplits.length <= index) {\\n        _prizeSplits.push(split);\\n      } else {\\n        PrizeSplitConfig memory currentSplit = _prizeSplits[index];\\n        if (split.target != currentSplit.target || split.percentage != currentSplit.percentage || split.token != currentSplit.token) {\\n          _prizeSplits[index] = split;\\n        } else {\\n          continue;\\n        }\\n      }\\n\\n      // Emit the added/updated prize split config.\\n      emit PrizeSplitSet(split.target, split.percentage, split.token, index);\\n    }\\n\\n    // Remove old prize splits configs. Match storage _prizesSplits.length with the passed newPrizeSplits.length\\n    while (_prizeSplits.length > newPrizeSplitsLength) {\\n      uint256 _index = _prizeSplits.length.sub(1);\\n      _prizeSplits.pop();\\n      emit PrizeSplitRemoved(_index);\\n    }\\n\\n    // Total prize split do not exceed 100%\\n    uint256 totalPercentage = _totalPrizeSplitPercentageAmount();\\n    require(totalPercentage <= 1000, \\\"MultipleWinners/invalid-prizesplit-percentage-total\\\");\\n  }\\n\\n  /**\\n    * @notice Updates a previously set prize split config.\\n    * @dev Updates a prize split config by passing a new PrizeSplitConfig struct and current index position. Limited to contract owner.\\n    * @param prizeStrategySplit PrizeSplitConfig config struct\\n    * @param prizeSplitIndex Index position of PrizeSplitConfig to update\\n  */\\n  function setPrizeSplit(PrizeSplitConfig memory prizeStrategySplit, uint8 prizeSplitIndex) external onlyOwner {\\n    require(prizeSplitIndex < _prizeSplits.length, \\\"MultipleWinners/nonexistent-prizesplit\\\");\\n    require(prizeStrategySplit.token <= 1, \\\"MultipleWinners/invalid-prizesplit-token\\\");\\n    require(prizeStrategySplit.target != address(0), \\\"MultipleWinners/invalid-prizesplit-target\\\");\\n    \\n    // Update the prize split config\\n    _prizeSplits[prizeSplitIndex] = prizeStrategySplit;\\n\\n    // Total prize split do not exceed 100%\\n    uint256 totalPercentage = _totalPrizeSplitPercentageAmount();\\n    require(totalPercentage <= 1000, \\\"MultipleWinners/invalid-prizesplit-percentage-total\\\");\\n\\n    // Emit updated prize split config\\n    emit PrizeSplitSet(prizeStrategySplit.target, prizeStrategySplit.percentage, prizeStrategySplit.token, prizeSplitIndex);\\n  }\\n\\n  /**\\n  * @notice Calculate single prize split distribution amount.\\n  * @dev Calculate single prize split distribution amount using the total prize amount and prize split percentage.\\n  * @param amount Total prize award distribution amount\\n  * @param percentage Percentage with single decimal precision using 0-1000 ranges\\n  */\\n  function _getPrizeSplitAmount(uint256 amount, uint16 percentage) internal pure returns (uint256) {\\n    return (amount * percentage).div(1000);\\n  }\\n\\n  /**\\n  * @notice Calculates total prize split percentage amount.\\n  * @dev Calculates total PrizeSplitConfig percentage(s) amount. Used to check the total does not exceed 100% of award distribution.\\n  * @return Total prize split(s) percentage amount\\n  */\\n  function _totalPrizeSplitPercentageAmount() internal view returns (uint256) {\\n    uint256 _tempTotalPercentage;\\n    uint256 prizeSplitsLength = _prizeSplits.length;\\n    for (uint8 index = 0; index < prizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = _prizeSplits[index];\\n      _tempTotalPercentage = _tempTotalPercentage.add(split.percentage);\\n    }\\n    return _tempTotalPercentage;\\n  }\\n\\n  /**\\n  * @notice Distributes prize split(s).\\n  * @dev Distributes prize split(s) by awarding ticket or sponsorship tokens.\\n  * @param prize Starting prize award amount\\n  * @return Total prize award distribution amount exlcuding the awarded prize split(s)\\n  */\\n  function _distributePrizeSplits(uint256 prize) internal returns (uint256) {\\n    // Store temporary total prize amount for multiple calculations using initial prize amount.\\n    uint256 _prizeTemp = prize;\\n    uint256 prizeSplitsLength = _prizeSplits.length;\\n    for (uint256 index = 0; index < prizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = _prizeSplits[index];\\n      uint256 _splitAmount = _getPrizeSplitAmount(_prizeTemp, split.percentage);\\n\\n      // Award the prize split distribution amount.\\n      _awardPrizeSplitAmount(split.target, _splitAmount, split.token);\\n\\n      // Update the remaining prize amount after distributing the prize split percentage.\\n      prize = prize.sub(_splitAmount);\\n    }\\n\\n    return prize;\\n  }\\n\\n}\",\"keccak256\":\"0xc736c25922cf9065c73a06108d4d05c18af9a9e393c5280ba5d4cdb1863f3dbd\",\"license\":\"MIT\"},\"contracts/prize-strategy/multiple-winners/MultipleWinners.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"../PrizeSplit.sol\\\";\\nimport \\\"../PeriodicPrizeStrategy.sol\\\";\\n\\ncontract MultipleWinners is PeriodicPrizeStrategy, PrizeSplit {\\n\\n  // Maximum number number of winners per award distribution period\\n  uint256 internal __numberOfWinners;\\n  \\n  // Toggle for distributing external ERC 20 awards to all winners\\n  bool public splitExternalErc20Awards;\\n\\n  // Mapping of addresses isBlocked status. Can prevent an address from selected during award distribution\\n  mapping(address => bool) public isBlocklisted;\\n\\n  // Carry over the awarded prize for the next drawing when selected winners is less than __numberOfWinners\\n  bool public carryOverBlocklist;\\n\\n  // Limit ticket.draw() retry attempts when a blocked address is selected in _distribute.\\n  uint256 public blocklistRetryCount;\\n\\n  /**\\n    * @notice Emitted when splitExternalErc20Awards is toggled.\\n    * @dev Emitted when splitExternalErc20Awards is toggled between awarding external ERC20 to main or all winners.\\n  */\\n  event SplitExternalErc20AwardsSet(bool splitExternalErc20Awards);\\n\\n  /**\\n    * @notice Emitted when numberOfWinners is set.\\n    * @dev Emitted when numberOfWinners is set, which limits the maximum number of potentially selected winners.\\n    * @param numberOfWinners Maximum potentially selected winners\\n  */\\n  event NumberOfWinnersSet(uint256 numberOfWinners);\\n\\n  /**\\n    * @notice Emitted when carryOverBlocklist is toggled.\\n    * @dev Emitted when carryOverBlocklist is toggled for distribution of the primary and secondary prizes.\\n    * @param carry Awarded prize carry over status\\n  */\\n  event BlocklistCarrySet(bool carry);\\n\\n  /**\\n    * @notice Emitted when a user is blocked/unblocked from receiving a prize award.\\n    * @dev Emitted when a contract owner blocks/unblocks user from award selection in _distribute.\\n    * @param user Address of user to block or unblock\\n    * @param isBlocked User blocked status\\n  */\\n  event BlocklistSet(address indexed user, bool isBlocked);\\n\\n  /**\\n    * @notice Emitted when a new draw retry limit is set.\\n    * @dev Emitted when a new draw retry limit is set. Retry limit is set to limit gas spendings if a blocked user continues to be drawn.\\n    * @param count Number of winner selection retry attempts \\n  */\\n  event BlocklistRetryCountSet(uint256 count);\\n\\n  /**\\n    * @notice Emitted when the winner selection retry limit is reached during award distribution.\\n    * @dev Emitted when the maximum number of users has not been selected after the blocklistRetryCount is reached.\\n    * @param numberOfWinners Total number of winners selected before the blocklistRetryCount is reached.\\n  */\\n  event RetryMaxLimitReached(uint256 numberOfWinners);\\n\\n  /**\\n    * @notice Emitted when no winner can be selected during the prize distribution. \\n    * @dev Emitted when no winner can be selected in _distribute due to ticket.totalSupply() equaling zero.\\n  */\\n  event NoWinners();\\n\\n  function initializeMultipleWinners (\\n    uint256 _prizePeriodStart,\\n    uint256 _prizePeriodSeconds,\\n    PrizePool _prizePool,\\n    TicketInterface _ticket,\\n    IERC20Upgradeable _sponsorship,\\n    RNGInterface _rng,\\n    uint256 _numberOfWinners\\n  ) public initializer {\\n    IERC20Upgradeable[] memory _externalErc20Awards;\\n\\n    PeriodicPrizeStrategy.initialize(\\n      _prizePeriodStart,\\n      _prizePeriodSeconds,\\n      _prizePool,\\n      _ticket,\\n      _sponsorship,\\n      _rng,\\n      _externalErc20Awards\\n    );\\n\\n    _setNumberOfWinners(_numberOfWinners);\\n  }\\n\\n  /**\\n    * @notice Block/unblock a user from winning during prize distribution.\\n    * @dev Block/unblock a user from winning award in prize distribution by updating the isBlocklisted mapping.\\n    * @param _user Address of blocked user\\n    * @param _isBlocked Blocked Status (true or false) of user\\n  */\\n  function setBlocklisted(address _user, bool _isBlocked) external onlyOwner requireAwardNotInProgress returns (bool) {\\n    isBlocklisted[_user] = _isBlocked;\\n\\n    emit BlocklistSet(_user, _isBlocked);\\n\\n    return true;\\n  }\\n\\n  /**\\n    * @notice Toggle if an unawarded prize amount should be kept for the next draw or evenly distrubted to selected winners. \\n    * @dev Toggles if the main prize (prizePool.captureAwardBalance) and secondary prizes (LootBox) should be kept for the next draw or evenly distrubted if maximum number of winners is not selected. \\n    * @param _carry Award carry over status (true or false)\\n  */\\n  function setCarryBlocklist(bool _carry) external onlyOwner requireAwardNotInProgress returns (bool) {\\n    carryOverBlocklist = _carry;\\n\\n    emit BlocklistCarrySet(_carry);\\n\\n    return true;\\n  }\\n\\n  /**\\n    * @notice Sets the number of attempts for winner selection if a blocked address is chosen.\\n    * @dev Limits winner selection (ticket.draw) retries to avoid to gas limit reached errors. Increases the probability of not reaching the maximum number of winners if to low.\\n    * @param _count Number of retry attempts\\n  */\\n  function setBlocklistRetryCount(uint256 _count) external onlyOwner requireAwardNotInProgress returns (bool) {\\n    blocklistRetryCount = _count;\\n\\n    emit BlocklistRetryCountSet(_count);\\n\\n    return true;\\n  }\\n  \\n  /**\\n    * @notice Toggle external ERC20 awards for all prize winners.\\n    * @dev Toggle external ERC20 awards for all prize winners. If unset will distribute external ERC20 awards to main winner.\\n    * @param _splitExternalErc20Awards Toggle splitting external ERC20 awards.\\n  */\\n  function setSplitExternalErc20Awards(bool _splitExternalErc20Awards) external onlyOwner requireAwardNotInProgress {\\n    splitExternalErc20Awards = _splitExternalErc20Awards;\\n\\n    emit SplitExternalErc20AwardsSet(splitExternalErc20Awards);\\n  }\\n\\n  /**\\n    * @notice Sets maximum number of winners.\\n    * @dev Sets maximum number of winners per award distribution period.\\n    * @param count Number of winners.\\n  */\\n  function setNumberOfWinners(uint256 count) external onlyOwner requireAwardNotInProgress {\\n    _setNumberOfWinners(count);\\n  }\\n\\n   /**\\n    * @dev Set the maximum number of winners. Must be greater than 0.\\n    * @param count Number of winners.\\n  */\\n  function _setNumberOfWinners(uint256 count) internal {\\n    require(count > 0, \\\"MultipleWinners/winners-gte-one\\\");\\n\\n    __numberOfWinners = count;\\n    emit NumberOfWinnersSet(count);\\n  }\\n\\n  /**\\n    * @notice Maximum number of winners per award distribution period\\n    * @dev Read maximum number of winners per award distribution period from internal __numberOfWinners variable.\\n    * @return __numberOfWinners The total number of winners per prize award.\\n  */\\n  function numberOfWinners() external view returns (uint256) {\\n    return __numberOfWinners;\\n  }\\n\\n  /**\\n    * @notice Award ticket or sponsorship tokens to prize split recipient.\\n    * @dev Award ticket or sponsorship tokens to prize split recipient via the linked PrizePool contract.\\n    * @param target Recipient of minted tokens\\n    * @param amount Amount of minted tokens\\n    * @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\\n  */\\n  function _awardPrizeSplitAmount(address target, uint256 amount, uint8 tokenIndex) override internal {\\n    _awardToken(target, amount, tokenIndex);\\n  }\\n\\n  /**\\n    * @notice Distributes captured award balance to winners\\n    * @dev Distributes the captured award balance to the main winner and secondary winners if __numberOfWinners greater than 1.\\n    * @param randomNumber Random number seed used to select winners\\n  */\\n  function _distribute(uint256 randomNumber) internal override {\\n    uint256 prize = prizePool.captureAwardBalance();\\n    \\n    // distributes prize to prize splits and returns remaining award.\\n    prize = _distributePrizeSplits(prize);\\n\\n    if (IERC20Upgradeable(address(ticket)).totalSupply() == 0) {\\n      emit NoWinners();\\n      return;\\n    }\\n\\n    bool _carryOverBlocklistPrizes = carryOverBlocklist;\\n\\n    // main winner is simply the first that is drawn\\n    uint256 numberOfWinners = __numberOfWinners;\\n    address[] memory winners = new address[](numberOfWinners);\\n    uint256 nextRandom = randomNumber;\\n    uint256 winnerCount = 0;\\n    uint256 retries = 0;\\n    uint256 _retryCount = blocklistRetryCount;\\n    while (winnerCount < numberOfWinners) {\\n      address winner = ticket.draw(nextRandom);\\n\\n      if (!isBlocklisted[winner]) {\\n        winners[winnerCount++] = winner;\\n      } else if (++retries >= _retryCount) {\\n        emit RetryMaxLimitReached(winnerCount);\\n        if(winnerCount == 0) {\\n          emit NoWinners();\\n        }\\n        break;\\n      }\\n\\n      // add some arbitrary numbers to the previous random number to ensure no matches with the UniformRandomNumber lib\\n      bytes32 nextRandomHash = keccak256(abi.encodePacked(nextRandom + 499 + winnerCount*521));\\n      nextRandom = uint256(nextRandomHash);\\n    }\\n\\n    // main winner gets all external ERC721 tokens\\n    _awardExternalErc721s(winners[0]);\\n\\n    // yield prize is split up among all winners\\n    uint256 prizeShare = _carryOverBlocklistPrizes ? prize.div(numberOfWinners) : prize.div(winnerCount);\\n    if (prizeShare > 0) {\\n      for (uint i = 0; i < winnerCount; i++) {\\n        _awardTickets(winners[i], prizeShare);\\n      }\\n    }\\n\\n    if (splitExternalErc20Awards) {\\n      address currentToken = externalErc20s.start();\\n      while (currentToken != address(0) && currentToken != externalErc20s.end()) {\\n        uint256 balance = IERC20Upgradeable(currentToken).balanceOf(address(prizePool));\\n        uint256 split = _carryOverBlocklistPrizes ? balance.div(numberOfWinners) : balance.div(winnerCount);\\n        if (split > 0) {\\n          for (uint256 i = 0; i < winnerCount; i++) {\\n            prizePool.awardExternalERC20(winners[i], currentToken, split);\\n          }\\n        }\\n        currentToken = externalErc20s.next(currentToken);\\n      }\\n    } else {\\n      _awardExternalErc20s(winners[0]);\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0x26fbb59d9251cd6d66a423abaea29d5ea182e539365767ebfed726fe6248a29a\",\"license\":\"MIT\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/test/MultipleWinnersHarness.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"../prize-strategy/multiple-winners/MultipleWinners.sol\\\";\\n\\n/// @title Creates a minimal proxy to the MultipleWinners prize strategy.  Very cheap to deploy.\\ncontract MultipleWinnersHarness is MultipleWinners {\\n\\n  uint256 public currentTime;\\n\\n  function setCurrentTime(uint256 _currentTime) external {\\n    currentTime = _currentTime;\\n  }\\n\\n  function _currentTime() internal override view returns (uint256) {\\n    return currentTime;\\n  }\\n\\n  function distribute(uint256 randomNumber) external {\\n    _distribute(randomNumber);\\n  }\\n\\n}\",\"keccak256\":\"0xdb761d30ee50c16944f5370ab55c84975baef1d60687c18d6a5933ef072ef5ad\",\"license\":\"GPL-3.0\"},\"contracts/test/MultipleWinnersHarnessProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./MultipleWinnersHarness.sol\\\";\\nimport \\\"../external/openzeppelin/ProxyFactory.sol\\\";\\n\\n/// @title Creates a minimal proxy to the MultipleWinners prize strategy.  Very cheap to deploy.\\ncontract MultipleWinnersHarnessProxyFactory is ProxyFactory {\\n\\n  MultipleWinnersHarness public instance;\\n\\n  constructor () public {\\n    instance = new MultipleWinnersHarness();\\n  }\\n\\n  function create() external returns (MultipleWinnersHarness) {\\n    return MultipleWinnersHarness(deployMinimal(address(instance), \\\"\\\"));\\n  }\\n\\n}\",\"keccak256\":\"0xd84ff3f297043927c4d69d6619d8ff58c783cf33a0418f40f84b0aa1c95adc10\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TicketInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface TicketInterface {\\n  /// @notice Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\\n  /// @param randomNumber The random number to use to select a user.\\n  /// @return The winner\\n  function draw(uint256 randomNumber) external view returns (address);\\n}\",\"keccak256\":\"0x5201a9a22748781592abd2003801289224d4899292195b7de937cd5748be87dd\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListener.sol\":{\"content\":\"pragma solidity ^0.6.4;\\n\\nimport \\\"./TokenListenerInterface.sol\\\";\\nimport \\\"./TokenListenerLibrary.sol\\\";\\nimport \\\"../Constants.sol\\\";\\n\\nabstract contract TokenListener is TokenListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER\\n    );\\n  }\\n}\\n\",\"keccak256\":\"0xb0e98d10b004602e1d4f4369a70e6382002dc0c0c5713698eb6a92943aef2265\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 14167,
                "contract": "contracts/test/MultipleWinnersHarnessProxyFactory.sol:MultipleWinnersHarnessProxyFactory",
                "label": "instance",
                "offset": 0,
                "slot": "0",
                "type": "t_contract(MultipleWinnersHarness)14158"
              }
            ],
            "types": {
              "t_contract(MultipleWinnersHarness)14158": {
                "encoding": "inplace",
                "label": "contract MultipleWinnersHarness",
                "numberOfBytes": "20"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/test/NFT.sol": {
        "NFT": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "approved",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "Approval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                }
              ],
              "name": "ApprovalForAll",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "Transfer",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "approve",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "baseURI",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "getApproved",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "string",
                  "name": "name_",
                  "type": "string"
                },
                {
                  "internalType": "string",
                  "name": "symbol_",
                  "type": "string"
                }
              ],
              "name": "initialize",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                }
              ],
              "name": "isApprovedForAll",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "name",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "ownerOf",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "safeTransferFrom",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes",
                  "name": "_data",
                  "type": "bytes"
                }
              ],
              "name": "safeTransferFrom",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "approved",
                  "type": "bool"
                }
              ],
              "name": "setApprovalForAll",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "simulateSafeTransferFrom",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes4",
                  "name": "interfaceId",
                  "type": "bytes4"
                }
              ],
              "name": "supportsInterface",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "symbol",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "index",
                  "type": "uint256"
                }
              ],
              "name": "tokenByIndex",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "index",
                  "type": "uint256"
                }
              ],
              "name": "tokenOfOwnerByIndex",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "tokenURI",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                }
              ],
              "name": "transferFrom",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "approve(address,uint256)": {
                "details": "See {IERC721-approve}."
              },
              "balanceOf(address)": {
                "details": "See {IERC721-balanceOf}."
              },
              "baseURI()": {
                "details": "Returns the base URI set via {_setBaseURI}. This will be automatically added as a prefix in {tokenURI} to each token's URI, or to the token ID if no specific URI is set for that token ID."
              },
              "getApproved(uint256)": {
                "details": "See {IERC721-getApproved}."
              },
              "isApprovedForAll(address,address)": {
                "details": "See {IERC721-isApprovedForAll}."
              },
              "name()": {
                "details": "See {IERC721Metadata-name}."
              },
              "ownerOf(uint256)": {
                "details": "See {IERC721-ownerOf}."
              },
              "safeTransferFrom(address,address,uint256)": {
                "details": "See {IERC721-safeTransferFrom}."
              },
              "safeTransferFrom(address,address,uint256,bytes)": {
                "details": "See {IERC721-safeTransferFrom}."
              },
              "setApprovalForAll(address,bool)": {
                "details": "See {IERC721-setApprovalForAll}."
              },
              "supportsInterface(bytes4)": {
                "details": "See {IERC165-supportsInterface}. Time complexity O(1), guaranteed to always use less than 30 000 gas."
              },
              "symbol()": {
                "details": "See {IERC721Metadata-symbol}."
              },
              "tokenByIndex(uint256)": {
                "details": "See {IERC721Enumerable-tokenByIndex}."
              },
              "tokenOfOwnerByIndex(address,uint256)": {
                "details": "See {IERC721Enumerable-tokenOfOwnerByIndex}."
              },
              "tokenURI(uint256)": {
                "details": "See {IERC721Metadata-tokenURI}."
              },
              "totalSupply()": {
                "details": "See {IERC721Enumerable-totalSupply}."
              },
              "transferFrom(address,address,uint256)": {
                "details": "See {IERC721-transferFrom}."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5061218e806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c80634f6ccce7116100ad578063a22cb46511610071578063a22cb46514610494578063b88d4fde146104c2578063c87b56dd14610588578063cb322d46146105a5578063e985e9c5146105db57610121565b80634f6ccce7146104245780636352211e146104415780636c0360eb1461045e57806370a082311461046657806395d89b411461048c57610121565b806318160ddd116100f457806318160ddd1461024557806323b872dd1461025f5780632f745c591461029557806342842e0e146102c15780634cd88b76146102f757610121565b806301ffc9a71461012657806306fdde0314610161578063081812fc146101de578063095ea7b314610217575b600080fd5b61014d6004803603602081101561013c57600080fd5b50356001600160e01b031916610609565b604080519115158252519081900360200190f35b61016961062c565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101a357818101518382015260200161018b565b50505050905090810190601f1680156101d05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101fb600480360360208110156101f457600080fd5b50356106c2565b604080516001600160a01b039092168252519081900360200190f35b6102436004803603604081101561022d57600080fd5b506001600160a01b038135169060200135610724565b005b61024d6107ff565b60408051918252519081900360200190f35b6102436004803603606081101561027557600080fd5b506001600160a01b03813581169160208101359091169060400135610810565b61024d600480360360408110156102ab57600080fd5b506001600160a01b038135169060200135610867565b610243600480360360608110156102d757600080fd5b506001600160a01b03813581169160208101359091169060400135610892565b6102436004803603604081101561030d57600080fd5b81019060208101813564010000000081111561032857600080fd5b82018360208201111561033a57600080fd5b8035906020019184600183028401116401000000008311171561035c57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156103af57600080fd5b8201836020820111156103c157600080fd5b803590602001918460018302840111640100000000831117156103e357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506108ad945050505050565b61024d6004803603602081101561043a57600080fd5b5035610965565b6101fb6004803603602081101561045757600080fd5b503561097b565b6101696109a3565b61024d6004803603602081101561047c57600080fd5b50356001600160a01b0316610a04565b610169610a6c565b610243600480360360408110156104aa57600080fd5b506001600160a01b0381351690602001351515610acd565b610243600480360360808110156104d857600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561051357600080fd5b82018360208201111561052557600080fd5b8035906020019184600183028401116401000000008311171561054757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610bd2945050505050565b6101696004803603602081101561059e57600080fd5b5035610c30565b610243600480360360608110156105bb57600080fd5b506001600160a01b03813581169160208101359091169060400135610eb3565b61014d600480360360408110156105f157600080fd5b506001600160a01b0381358116916020013516610ebe565b6001600160e01b0319811660009081526033602052604090205460ff165b919050565b606a8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106b85780601f1061068d576101008083540402835291602001916106b8565b820191906000526020600020905b81548152906001019060200180831161069b57829003601f168201915b5050505050905090565b60006106cd82610eec565b6107085760405162461bcd60e51b815260040180806020018281038252602c815260200180612083602c913960400191505060405180910390fd5b506000908152606860205260409020546001600160a01b031690565b600061072f8261097b565b9050806001600160a01b0316836001600160a01b031614156107825760405162461bcd60e51b81526004018080602001828103825260218152602001806121076021913960400191505060405180910390fd5b806001600160a01b0316610794610ef9565b6001600160a01b031614806107b557506107b5816107b0610ef9565b610ebe565b6107f05760405162461bcd60e51b8152600401808060200182810382526038815260200180611fa86038913960400191505060405180910390fd5b6107fa8383610efd565b505050565b600061080b6066610f6b565b905090565b61082161081b610ef9565b82610f76565b61085c5760405162461bcd60e51b81526004018080602001828103825260318152602001806121286031913960400191505060405180910390fd5b6107fa83838361101a565b6001600160a01b03821660009081526065602052604081206108899083611166565b90505b92915050565b6107fa83838360405180602001604052806000815250610bd2565b600054610100900460ff16806108c657506108c6611172565b806108d4575060005460ff16155b61090f5760405162461bcd60e51b815260040180806020018281038252602e815260200180612033602e913960400191505060405180910390fd5b600054610100900460ff1615801561093a576000805460ff1961ff0019909116610100171660011790555b6109448383611183565b61094f33600061122a565b80156107fa576000805461ff0019169055505050565b600080610973606684611248565b509392505050565b600061088c8260405180606001604052806029815260200161200a6029913960669190611264565b606d8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106b85780601f1061068d576101008083540402835291602001916106b8565b60006001600160a01b038216610a4b5760405162461bcd60e51b815260040180806020018281038252602a815260200180611fe0602a913960400191505060405180910390fd5b6001600160a01b038216600090815260656020526040902061088c90610f6b565b606b8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106b85780601f1061068d576101008083540402835291602001916106b8565b610ad5610ef9565b6001600160a01b0316826001600160a01b03161415610b3b576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b8060696000610b48610ef9565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610b8c610ef9565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b610be3610bdd610ef9565b83610f76565b610c1e5760405162461bcd60e51b81526004018080602001828103825260318152602001806121286031913960400191505060405180910390fd5b610c2a8484848461127b565b50505050565b6060610c3b82610eec565b610c765760405162461bcd60e51b815260040180806020018281038252602f8152602001806120d8602f913960400191505060405180910390fd5b6000828152606c602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610d0b5780601f10610ce057610100808354040283529160200191610d0b565b820191906000526020600020905b815481529060010190602001808311610cee57829003601f168201915b505050505090506060610d1c6109a3565b9050805160001415610d3057509050610627565b815115610df15780826040516020018083805190602001908083835b60208310610d6b5780518252601f199092019160209182019101610d4c565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310610db35780518252601f199092019160209182019101610d94565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050610627565b80610dfb856112cd565b6040516020018083805190602001908083835b60208310610e2d5780518252601f199092019160209182019101610e0e565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310610e755780518252601f199092019160209182019101610e56565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050919050565b6107fa838383610892565b6001600160a01b03918216600090815260696020908152604080832093909416825291909152205460ff1690565b600061088c6066836113a8565b3390565b600081815260686020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610f328261097b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061088c826113b4565b6000610f8182610eec565b610fbc5760405162461bcd60e51b815260040180806020018281038252602c815260200180611f7c602c913960400191505060405180910390fd5b6000610fc78361097b565b9050806001600160a01b0316846001600160a01b031614806110025750836001600160a01b0316610ff7846106c2565b6001600160a01b0316145b8061101257506110128185610ebe565b949350505050565b826001600160a01b031661102d8261097b565b6001600160a01b0316146110725760405162461bcd60e51b81526004018080602001828103825260298152602001806120af6029913960400191505060405180910390fd5b6001600160a01b0382166110b75760405162461bcd60e51b8152600401808060200182810382526024815260200180611f586024913960400191505060405180910390fd5b6110c28383836107fa565b6110cd600082610efd565b6001600160a01b03831660009081526065602052604090206110ef90826113b8565b506001600160a01b038216600090815260656020526040902061111290826113c4565b5061111f606682846113d0565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061088983836113e6565b600061117d3061144a565b15905090565b600054610100900460ff168061119c575061119c611172565b806111aa575060005460ff16155b6111e55760405162461bcd60e51b815260040180806020018281038252602e815260200180612033602e913960400191505060405180910390fd5b600054610100900460ff16158015611210576000805460ff1961ff0019909116610100171660011790555b611218611450565b6112206114f2565b61094f838361158f565b611244828260405180602001604052806000815250611674565b5050565b600080808061125786866116c6565b9097909650945050505050565b6000611271848484611741565b90505b9392505050565b61128684848461101a565b6112928484848461180b565b610c2a5760405162461bcd60e51b8152600401808060200182810382526032815260200180611f266032913960400191505060405180910390fd5b6060816112f257506040805180820190915260018152600360fc1b6020820152610627565b8160005b811561130a57600101600a820491506112f6565b60608167ffffffffffffffff8111801561132357600080fd5b506040519080825280601f01601f19166020018201604052801561134e576020820181803683370190505b50859350905060001982015b831561139f57600a840660300160f81b8282806001900393508151811061137d57fe5b60200101906001600160f81b031916908160001a905350600a8404935061135a565b50949350505050565b60006108898383611973565b5490565b6000610889838361198b565b60006108898383611a51565b600061127184846001600160a01b038516611a9b565b815460009082106114285760405162461bcd60e51b8152600401808060200182810382526022815260200180611f046022913960400191505060405180910390fd5b82600001828154811061143757fe5b9060005260206000200154905092915050565b3b151590565b600054610100900460ff16806114695750611469611172565b80611477575060005460ff16155b6114b25760405162461bcd60e51b815260040180806020018281038252602e815260200180612033602e913960400191505060405180910390fd5b600054610100900460ff161580156114dd576000805460ff1961ff0019909116610100171660011790555b80156114ef576000805461ff00191690555b50565b600054610100900460ff168061150b575061150b611172565b80611519575060005460ff16155b6115545760405162461bcd60e51b815260040180806020018281038252602e815260200180612033602e913960400191505060405180910390fd5b600054610100900460ff1615801561157f576000805460ff1961ff0019909116610100171660011790555b6114dd6301ffc9a760e01b611b32565b600054610100900460ff16806115a857506115a8611172565b806115b6575060005460ff16155b6115f15760405162461bcd60e51b815260040180806020018281038252602e815260200180612033602e913960400191505060405180910390fd5b600054610100900460ff1615801561161c576000805460ff1961ff0019909116610100171660011790555b825161162f90606a906020860190611e70565b50815161164390606b906020850190611e70565b506116546380ac58cd60e01b611b32565b611664635b5e139f60e01b611b32565b61094f63780e9d6360e01b611b32565b61167e8383611bb6565b61168b600084848461180b565b6107fa5760405162461bcd60e51b8152600401808060200182810382526032815260200180611f266032913960400191505060405180910390fd5b81546000908190831061170a5760405162461bcd60e51b81526004018080602001828103825260228152602001806120616022913960400191505060405180910390fd5b600084600001848154811061171b57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816117dc5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156117a1578181015183820152602001611789565b50505050905090810190601f1680156117ce5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508460000160018203815481106117ef57fe5b9060005260206000209060020201600101549150509392505050565b600061181f846001600160a01b031661144a565b61182b57506001611012565b6060611939630a85bd0160e11b611840610ef9565b88878760405160240180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156118a757818101518382015260200161188f565b50505050905090810190601f1680156118d45780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001611f26603291396001600160a01b0388169190611ce4565b9050600081806020019051602081101561195257600080fd5b50516001600160e01b031916630a85bd0160e11b1492505050949350505050565b60009081526001919091016020526040902054151590565b60008181526001830160205260408120548015611a4757835460001980830191908101906000908790839081106119be57fe5b90600052602060002001549050808760000184815481106119db57fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080611a0b57fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061088c565b600091505061088c565b6000611a5d8383611973565b611a935750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561088c565b50600061088c565b600082815260018401602052604081205480611b00575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055611274565b82856000016001830381548110611b1357fe5b9060005260206000209060020201600101819055506000915050611274565b6001600160e01b03198082161415611b91576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152603360205260409020805460ff19166001179055565b6001600160a01b038216611c11576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b611c1a81610eec565b15611c6c576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b611c78600083836107fa565b6001600160a01b0382166000908152606560205260409020611c9a90826113c4565b50611ca7606682846113d0565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060611271848460008585611cf88561144a565b611d49576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310611d885780518252601f199092019160209182019101611d69565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611dea576040519150601f19603f3d011682016040523d82523d6000602084013e611def565b606091505b5091509150611dff828286611e0a565b979650505050505050565b60608315611e19575081611274565b825115611e295782518084602001fd5b60405162461bcd60e51b81526020600482018181528451602484015284518593919283926044019190850190808383600083156117a1578181015183820152602001611789565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611eb157805160ff1916838001178555611ede565b82800160010185558215611ede579182015b82811115611ede578251825591602001919060010190611ec3565b50611eea929150611eee565b5090565b5b80821115611eea5760008155600101611eef56fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64734552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564a264697066735822122098f5e8b6a1fee9dd81707d4156d17a8ac81f472722e7f32208537b8708b683a064736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x218E DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x121 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x4F6CCCE7 GT PUSH2 0xAD JUMPI DUP1 PUSH4 0xA22CB465 GT PUSH2 0x71 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x494 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x4C2 JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0x588 JUMPI DUP1 PUSH4 0xCB322D46 EQ PUSH2 0x5A5 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x5DB JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x4F6CCCE7 EQ PUSH2 0x424 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x441 JUMPI DUP1 PUSH4 0x6C0360EB EQ PUSH2 0x45E JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x466 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x48C JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x18160DDD GT PUSH2 0xF4 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x245 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x25F JUMPI DUP1 PUSH4 0x2F745C59 EQ PUSH2 0x295 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x2C1 JUMPI DUP1 PUSH4 0x4CD88B76 EQ PUSH2 0x2F7 JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x126 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x161 JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x1DE JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x217 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x14D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x13C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH2 0x609 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x169 PUSH2 0x62C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1A3 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x18B JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1D0 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1FB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x6C2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x22D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x724 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x24D PUSH2 0x7FF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x275 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x810 JUMP JUMPDEST PUSH2 0x24D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x2AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x867 JUMP JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x2D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x892 JUMP JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x30D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x328 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x33A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x35C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 SWAP5 SWAP4 PUSH1 0x20 DUP2 ADD SWAP4 POP CALLDATALOAD SWAP2 POP POP PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x3AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x3C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x3E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x8AD SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x24D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x43A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x965 JUMP JUMPDEST PUSH2 0x1FB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x457 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x97B JUMP JUMPDEST PUSH2 0x169 PUSH2 0x9A3 JUMP JUMPDEST PUSH2 0x24D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x47C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xA04 JUMP JUMPDEST PUSH2 0x169 PUSH2 0xA6C JUMP JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x4AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD ISZERO ISZERO PUSH2 0xACD JUMP JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x4D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x513 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x525 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x547 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0xBD2 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x169 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x59E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xC30 JUMP JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x5BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xEB3 JUMP JUMPDEST PUSH2 0x14D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x5F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xEBE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x6B8 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x68D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x6B8 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x69B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6CD DUP3 PUSH2 0xEEC JUMP JUMPDEST PUSH2 0x708 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2083 PUSH1 0x2C SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x68 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x72F DUP3 PUSH2 0x97B JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x782 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2107 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x794 PUSH2 0xEF9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0x7B5 JUMPI POP PUSH2 0x7B5 DUP2 PUSH2 0x7B0 PUSH2 0xEF9 JUMP JUMPDEST PUSH2 0xEBE JUMP JUMPDEST PUSH2 0x7F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x38 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1FA8 PUSH1 0x38 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x7FA DUP4 DUP4 PUSH2 0xEFD JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x80B PUSH1 0x66 PUSH2 0xF6B JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x821 PUSH2 0x81B PUSH2 0xEF9 JUMP JUMPDEST DUP3 PUSH2 0xF76 JUMP JUMPDEST PUSH2 0x85C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x31 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2128 PUSH1 0x31 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x7FA DUP4 DUP4 DUP4 PUSH2 0x101A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x889 SWAP1 DUP4 PUSH2 0x1166 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x7FA DUP4 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP PUSH2 0xBD2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x8C6 JUMPI POP PUSH2 0x8C6 PUSH2 0x1172 JUMP JUMPDEST DUP1 PUSH2 0x8D4 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x90F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2033 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x93A JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x944 DUP4 DUP4 PUSH2 0x1183 JUMP JUMPDEST PUSH2 0x94F CALLER PUSH1 0x0 PUSH2 0x122A JUMP JUMPDEST DUP1 ISZERO PUSH2 0x7FA JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x973 PUSH1 0x66 DUP5 PUSH2 0x1248 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x88C DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x200A PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x66 SWAP2 SWAP1 PUSH2 0x1264 JUMP JUMPDEST PUSH1 0x6D DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x6B8 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x68D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x6B8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xA4B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1FE0 PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x88C SWAP1 PUSH2 0xF6B JUMP JUMPDEST PUSH1 0x6B DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x6B8 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x68D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x6B8 JUMP JUMPDEST PUSH2 0xAD5 PUSH2 0xEF9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0xB3B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4552433732313A20617070726F766520746F2063616C6C657200000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x69 PUSH1 0x0 PUSH2 0xB48 PUSH2 0xEF9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP8 AND DUP1 DUP3 MSTORE SWAP2 SWAP1 SWAP4 MSTORE SWAP2 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP3 ISZERO ISZERO SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE PUSH2 0xB8C PUSH2 0xEF9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH2 0xBE3 PUSH2 0xBDD PUSH2 0xEF9 JUMP JUMPDEST DUP4 PUSH2 0xF76 JUMP JUMPDEST PUSH2 0xC1E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x31 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2128 PUSH1 0x31 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xC2A DUP5 DUP5 DUP5 DUP5 PUSH2 0x127B JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0xC3B DUP3 PUSH2 0xEEC JUMP JUMPDEST PUSH2 0xC76 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2F DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x20D8 PUSH1 0x2F SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x6C PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD DUP4 MLOAD PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP7 AND ISZERO MUL ADD SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 DIV SWAP2 DUP3 ADD DUP5 SWAP1 DIV DUP5 MUL DUP2 ADD DUP5 ADD SWAP1 SWAP5 MSTORE DUP1 DUP5 MSTORE PUSH1 0x60 SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xD0B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xCE0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xD0B JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xCEE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH1 0x60 PUSH2 0xD1C PUSH2 0x9A3 JUMP JUMPDEST SWAP1 POP DUP1 MLOAD PUSH1 0x0 EQ ISZERO PUSH2 0xD30 JUMPI POP SWAP1 POP PUSH2 0x627 JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0xDF1 JUMPI DUP1 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xD6B JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xD4C JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE DUP6 MLOAD SWAP2 SWAP1 SWAP4 ADD SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xDB3 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xD94 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP3 POP POP POP PUSH2 0x627 JUMP JUMPDEST DUP1 PUSH2 0xDFB DUP6 PUSH2 0x12CD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xE2D JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xE0E JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE DUP6 MLOAD SWAP2 SWAP1 SWAP4 ADD SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xE75 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xE56 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP3 POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x7FA DUP4 DUP4 DUP4 PUSH2 0x892 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x88C PUSH1 0x66 DUP4 PUSH2 0x13A8 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x68 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 SWAP1 PUSH2 0xF32 DUP3 PUSH2 0x97B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x88C DUP3 PUSH2 0x13B4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF81 DUP3 PUSH2 0xEEC JUMP JUMPDEST PUSH2 0xFBC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1F7C PUSH1 0x2C SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xFC7 DUP4 PUSH2 0x97B JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0x1002 JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xFF7 DUP5 PUSH2 0x6C2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0x1012 JUMPI POP PUSH2 0x1012 DUP2 DUP6 PUSH2 0xEBE JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x102D DUP3 PUSH2 0x97B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1072 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x20AF PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x10B7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1F58 PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x10C2 DUP4 DUP4 DUP4 PUSH2 0x7FA JUMP JUMPDEST PUSH2 0x10CD PUSH1 0x0 DUP3 PUSH2 0xEFD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x10EF SWAP1 DUP3 PUSH2 0x13B8 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x1112 SWAP1 DUP3 PUSH2 0x13C4 JUMP JUMPDEST POP PUSH2 0x111F PUSH1 0x66 DUP3 DUP5 PUSH2 0x13D0 JUMP JUMPDEST POP DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x889 DUP4 DUP4 PUSH2 0x13E6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x117D ADDRESS PUSH2 0x144A JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x119C JUMPI POP PUSH2 0x119C PUSH2 0x1172 JUMP JUMPDEST DUP1 PUSH2 0x11AA JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x11E5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2033 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1210 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x1218 PUSH2 0x1450 JUMP JUMPDEST PUSH2 0x1220 PUSH2 0x14F2 JUMP JUMPDEST PUSH2 0x94F DUP4 DUP4 PUSH2 0x158F JUMP JUMPDEST PUSH2 0x1244 DUP3 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP PUSH2 0x1674 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH2 0x1257 DUP7 DUP7 PUSH2 0x16C6 JUMP JUMPDEST SWAP1 SWAP8 SWAP1 SWAP7 POP SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1271 DUP5 DUP5 DUP5 PUSH2 0x1741 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1286 DUP5 DUP5 DUP5 PUSH2 0x101A JUMP JUMPDEST PUSH2 0x1292 DUP5 DUP5 DUP5 DUP5 PUSH2 0x180B JUMP JUMPDEST PUSH2 0xC2A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x32 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1F26 PUSH1 0x32 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x60 DUP2 PUSH2 0x12F2 JUMPI POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1 DUP2 MSTORE PUSH1 0x3 PUSH1 0xFC SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x627 JUMP JUMPDEST DUP2 PUSH1 0x0 JUMPDEST DUP2 ISZERO PUSH2 0x130A JUMPI PUSH1 0x1 ADD PUSH1 0xA DUP3 DIV SWAP2 POP PUSH2 0x12F6 JUMP JUMPDEST PUSH1 0x60 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x1323 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x134E JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP6 SWAP4 POP SWAP1 POP PUSH1 0x0 NOT DUP3 ADD JUMPDEST DUP4 ISZERO PUSH2 0x139F JUMPI PUSH1 0xA DUP5 MOD PUSH1 0x30 ADD PUSH1 0xF8 SHL DUP3 DUP3 DUP1 PUSH1 0x1 SWAP1 SUB SWAP4 POP DUP2 MLOAD DUP2 LT PUSH2 0x137D JUMPI INVALID JUMPDEST PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xF8 SHL SUB NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0xA DUP5 DIV SWAP4 POP PUSH2 0x135A JUMP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x889 DUP4 DUP4 PUSH2 0x1973 JUMP JUMPDEST SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x889 DUP4 DUP4 PUSH2 0x198B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x889 DUP4 DUP4 PUSH2 0x1A51 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1271 DUP5 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x1A9B JUMP JUMPDEST DUP2 SLOAD PUSH1 0x0 SWAP1 DUP3 LT PUSH2 0x1428 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1F04 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 PUSH1 0x0 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x1437 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1469 JUMPI POP PUSH2 0x1469 PUSH2 0x1172 JUMP JUMPDEST DUP1 PUSH2 0x1477 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x14B2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2033 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x14DD JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP1 ISZERO PUSH2 0x14EF JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x150B JUMPI POP PUSH2 0x150B PUSH2 0x1172 JUMP JUMPDEST DUP1 PUSH2 0x1519 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1554 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2033 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x157F JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x14DD PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x1B32 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x15A8 JUMPI POP PUSH2 0x15A8 PUSH2 0x1172 JUMP JUMPDEST DUP1 PUSH2 0x15B6 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x15F1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2033 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x161C JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP3 MLOAD PUSH2 0x162F SWAP1 PUSH1 0x6A SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x1E70 JUMP JUMPDEST POP DUP2 MLOAD PUSH2 0x1643 SWAP1 PUSH1 0x6B SWAP1 PUSH1 0x20 DUP6 ADD SWAP1 PUSH2 0x1E70 JUMP JUMPDEST POP PUSH2 0x1654 PUSH4 0x80AC58CD PUSH1 0xE0 SHL PUSH2 0x1B32 JUMP JUMPDEST PUSH2 0x1664 PUSH4 0x5B5E139F PUSH1 0xE0 SHL PUSH2 0x1B32 JUMP JUMPDEST PUSH2 0x94F PUSH4 0x780E9D63 PUSH1 0xE0 SHL PUSH2 0x1B32 JUMP JUMPDEST PUSH2 0x167E DUP4 DUP4 PUSH2 0x1BB6 JUMP JUMPDEST PUSH2 0x168B PUSH1 0x0 DUP5 DUP5 DUP5 PUSH2 0x180B JUMP JUMPDEST PUSH2 0x7FA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x32 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1F26 PUSH1 0x32 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP4 LT PUSH2 0x170A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2061 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP5 PUSH1 0x0 ADD DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x171B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD SWAP1 POP DUP1 PUSH1 0x0 ADD SLOAD DUP2 PUSH1 0x1 ADD SLOAD SWAP3 POP SWAP3 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP3 DUP2 PUSH2 0x17DC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x17A1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1789 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x17CE JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP5 PUSH1 0x0 ADD PUSH1 0x1 DUP3 SUB DUP2 SLOAD DUP2 LT PUSH2 0x17EF JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD PUSH1 0x1 ADD SLOAD SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x181F DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x144A JUMP JUMPDEST PUSH2 0x182B JUMPI POP PUSH1 0x1 PUSH2 0x1012 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1939 PUSH4 0xA85BD01 PUSH1 0xE1 SHL PUSH2 0x1840 PUSH2 0xEF9 JUMP JUMPDEST DUP9 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x24 ADD DUP1 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x18A7 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x188F JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x18D4 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x32 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1F26 PUSH1 0x32 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND SWAP2 SWAP1 PUSH2 0x1CE4 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1952 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH4 0xA85BD01 PUSH1 0xE1 SHL EQ SWAP3 POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 DUP4 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP1 ISZERO PUSH2 0x1A47 JUMPI DUP4 SLOAD PUSH1 0x0 NOT DUP1 DUP4 ADD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x0 SWAP1 DUP8 SWAP1 DUP4 SWAP1 DUP2 LT PUSH2 0x19BE JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP DUP1 DUP8 PUSH1 0x0 ADD DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x19DB JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SWAP3 SWAP1 SWAP3 SSTORE DUP3 DUP2 MSTORE PUSH1 0x1 DUP10 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP5 ADD SWAP1 SSTORE DUP7 SLOAD DUP8 SWAP1 DUP1 PUSH2 0x1A0B JUMPI INVALID JUMPDEST PUSH1 0x1 SWAP1 SUB DUP2 DUP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SSTORE SWAP1 SSTORE DUP7 PUSH1 0x1 ADD PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SSTORE PUSH1 0x1 SWAP5 POP POP POP POP POP PUSH2 0x88C JUMP JUMPDEST PUSH1 0x0 SWAP2 POP POP PUSH2 0x88C JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1A5D DUP4 DUP4 PUSH2 0x1973 JUMP JUMPDEST PUSH2 0x1A93 JUMPI POP DUP2 SLOAD PUSH1 0x1 DUP2 DUP2 ADD DUP5 SSTORE PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 KECCAK256 SWAP1 SWAP4 ADD DUP5 SWAP1 SSTORE DUP5 SLOAD DUP5 DUP3 MSTORE DUP3 DUP7 ADD SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE PUSH2 0x88C JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x88C JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP1 PUSH2 0x1B00 JUMPI POP POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE DUP4 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP5 DUP2 MSTORE DUP7 SLOAD PUSH1 0x1 DUP2 DUP2 ADD DUP10 SSTORE PUSH1 0x0 DUP10 DUP2 MSTORE DUP5 DUP2 KECCAK256 SWAP6 MLOAD PUSH1 0x2 SWAP1 SWAP4 MUL SWAP1 SWAP6 ADD SWAP2 DUP3 SSTORE SWAP2 MLOAD SWAP1 DUP3 ADD SSTORE DUP7 SLOAD DUP7 DUP5 MSTORE DUP2 DUP9 ADD SWAP1 SWAP3 MSTORE SWAP3 SWAP1 SWAP2 KECCAK256 SSTORE PUSH2 0x1274 JUMP JUMPDEST DUP3 DUP6 PUSH1 0x0 ADD PUSH1 0x1 DUP4 SUB DUP2 SLOAD DUP2 LT PUSH2 0x1B13 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD PUSH1 0x1 ADD DUP2 SWAP1 SSTORE POP PUSH1 0x0 SWAP2 POP POP PUSH2 0x1274 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP1 DUP3 AND EQ ISZERO PUSH2 0x1B91 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4552433136353A20696E76616C696420696E7465726661636520696400000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x1C11 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4552433732313A206D696E7420746F20746865207A65726F2061646472657373 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1C1A DUP2 PUSH2 0xEEC JUMP JUMPDEST ISZERO PUSH2 0x1C6C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4552433732313A20746F6B656E20616C7265616479206D696E74656400000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1C78 PUSH1 0x0 DUP4 DUP4 PUSH2 0x7FA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x1C9A SWAP1 DUP3 PUSH2 0x13C4 JUMP JUMPDEST POP PUSH2 0x1CA7 PUSH1 0x66 DUP3 DUP5 PUSH2 0x13D0 JUMP JUMPDEST POP PUSH1 0x40 MLOAD DUP2 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH1 0x0 SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP1 DUP3 SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1271 DUP5 DUP5 PUSH1 0x0 DUP6 DUP6 PUSH2 0x1CF8 DUP6 PUSH2 0x144A JUMP JUMPDEST PUSH2 0x1D49 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1D88 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1D69 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1DEA JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1DEF JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x1DFF DUP3 DUP3 DUP7 PUSH2 0x1E0A JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1E19 JUMPI POP DUP2 PUSH2 0x1274 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x1E29 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x17A1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1789 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x1EB1 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x1EDE JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x1EDE JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1EDE JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x1EC3 JUMP JUMPDEST POP PUSH2 0x1EEA SWAP3 SWAP2 POP PUSH2 0x1EEE JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1EEA JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1EEF JUMP INVALID GASLIMIT PUSH15 0x756D657261626C655365743A20696E PUSH5 0x6578206F75 PUSH21 0x206F6620626F756E64734552433732313A20747261 PUSH15 0x7366657220746F206E6F6E20455243 CALLDATACOPY ORIGIN BALANCE MSTORE PUSH6 0x636569766572 KECCAK256 PUSH10 0x6D706C656D656E746572 GASLIMIT MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH21 0x72616E7366657220746F20746865207A65726F2061 PUSH5 0x6472657373 GASLIMIT MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH16 0x70657261746F7220717565727920666F PUSH19 0x206E6F6E6578697374656E7420746F6B656E45 MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F76652063616C6C6572206973206E6F74206F PUSH24 0x6E6572206E6F7220617070726F76656420666F7220616C6C GASLIMIT MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH3 0x616C61 PUSH15 0x636520717565727920666F72207468 PUSH6 0x207A65726F20 PUSH2 0x6464 PUSH19 0x6573734552433732313A206F776E6572207175 PUSH6 0x727920666F72 KECCAK256 PUSH15 0x6F6E6578697374656E7420746F6B65 PUSH15 0x496E697469616C697A61626C653A20 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 GASLIMIT PUSH15 0x756D657261626C654D61703A20696E PUSH5 0x6578206F75 PUSH21 0x206F6620626F756E64734552433732313A20617070 PUSH19 0x6F76656420717565727920666F72206E6F6E65 PUSH25 0x697374656E7420746F6B656E4552433732313A207472616E73 PUSH7 0x6572206F662074 PUSH16 0x6B656E2074686174206973206E6F7420 PUSH16 0x776E4552433732314D65746164617461 GASPRICE KECCAK256 SSTORE MSTORE 0x49 KECCAK256 PUSH18 0x7565727920666F72206E6F6E657869737465 PUSH15 0x7420746F6B656E4552433732313A20 PUSH2 0x7070 PUSH19 0x6F76616C20746F2063757272656E74206F776E PUSH6 0x724552433732 BALANCE GASPRICE KECCAK256 PUSH21 0x72616E736665722063616C6C6572206973206E6F74 KECCAK256 PUSH16 0x776E6572206E6F7220617070726F7665 PUSH5 0xA264697066 PUSH20 0x5822122098F5E8B6A1FEE9DD81707D4156D17A8A 0xC8 0x1F SELFBALANCE 0x27 0x22 0xE7 RETURN 0x22 ADDMOD MSTORE8 PUSH28 0x8708B683A064736F6C634300060C0033000000000000000000000000 ",
              "sourceMap": "106:356:73:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106101215760003560e01c80634f6ccce7116100ad578063a22cb46511610071578063a22cb46514610494578063b88d4fde146104c2578063c87b56dd14610588578063cb322d46146105a5578063e985e9c5146105db57610121565b80634f6ccce7146104245780636352211e146104415780636c0360eb1461045e57806370a082311461046657806395d89b411461048c57610121565b806318160ddd116100f457806318160ddd1461024557806323b872dd1461025f5780632f745c591461029557806342842e0e146102c15780634cd88b76146102f757610121565b806301ffc9a71461012657806306fdde0314610161578063081812fc146101de578063095ea7b314610217575b600080fd5b61014d6004803603602081101561013c57600080fd5b50356001600160e01b031916610609565b604080519115158252519081900360200190f35b61016961062c565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101a357818101518382015260200161018b565b50505050905090810190601f1680156101d05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101fb600480360360208110156101f457600080fd5b50356106c2565b604080516001600160a01b039092168252519081900360200190f35b6102436004803603604081101561022d57600080fd5b506001600160a01b038135169060200135610724565b005b61024d6107ff565b60408051918252519081900360200190f35b6102436004803603606081101561027557600080fd5b506001600160a01b03813581169160208101359091169060400135610810565b61024d600480360360408110156102ab57600080fd5b506001600160a01b038135169060200135610867565b610243600480360360608110156102d757600080fd5b506001600160a01b03813581169160208101359091169060400135610892565b6102436004803603604081101561030d57600080fd5b81019060208101813564010000000081111561032857600080fd5b82018360208201111561033a57600080fd5b8035906020019184600183028401116401000000008311171561035c57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156103af57600080fd5b8201836020820111156103c157600080fd5b803590602001918460018302840111640100000000831117156103e357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506108ad945050505050565b61024d6004803603602081101561043a57600080fd5b5035610965565b6101fb6004803603602081101561045757600080fd5b503561097b565b6101696109a3565b61024d6004803603602081101561047c57600080fd5b50356001600160a01b0316610a04565b610169610a6c565b610243600480360360408110156104aa57600080fd5b506001600160a01b0381351690602001351515610acd565b610243600480360360808110156104d857600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561051357600080fd5b82018360208201111561052557600080fd5b8035906020019184600183028401116401000000008311171561054757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610bd2945050505050565b6101696004803603602081101561059e57600080fd5b5035610c30565b610243600480360360608110156105bb57600080fd5b506001600160a01b03813581169160208101359091169060400135610eb3565b61014d600480360360408110156105f157600080fd5b506001600160a01b0381358116916020013516610ebe565b6001600160e01b0319811660009081526033602052604090205460ff165b919050565b606a8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106b85780601f1061068d576101008083540402835291602001916106b8565b820191906000526020600020905b81548152906001019060200180831161069b57829003601f168201915b5050505050905090565b60006106cd82610eec565b6107085760405162461bcd60e51b815260040180806020018281038252602c815260200180612083602c913960400191505060405180910390fd5b506000908152606860205260409020546001600160a01b031690565b600061072f8261097b565b9050806001600160a01b0316836001600160a01b031614156107825760405162461bcd60e51b81526004018080602001828103825260218152602001806121076021913960400191505060405180910390fd5b806001600160a01b0316610794610ef9565b6001600160a01b031614806107b557506107b5816107b0610ef9565b610ebe565b6107f05760405162461bcd60e51b8152600401808060200182810382526038815260200180611fa86038913960400191505060405180910390fd5b6107fa8383610efd565b505050565b600061080b6066610f6b565b905090565b61082161081b610ef9565b82610f76565b61085c5760405162461bcd60e51b81526004018080602001828103825260318152602001806121286031913960400191505060405180910390fd5b6107fa83838361101a565b6001600160a01b03821660009081526065602052604081206108899083611166565b90505b92915050565b6107fa83838360405180602001604052806000815250610bd2565b600054610100900460ff16806108c657506108c6611172565b806108d4575060005460ff16155b61090f5760405162461bcd60e51b815260040180806020018281038252602e815260200180612033602e913960400191505060405180910390fd5b600054610100900460ff1615801561093a576000805460ff1961ff0019909116610100171660011790555b6109448383611183565b61094f33600061122a565b80156107fa576000805461ff0019169055505050565b600080610973606684611248565b509392505050565b600061088c8260405180606001604052806029815260200161200a6029913960669190611264565b606d8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106b85780601f1061068d576101008083540402835291602001916106b8565b60006001600160a01b038216610a4b5760405162461bcd60e51b815260040180806020018281038252602a815260200180611fe0602a913960400191505060405180910390fd5b6001600160a01b038216600090815260656020526040902061088c90610f6b565b606b8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106b85780601f1061068d576101008083540402835291602001916106b8565b610ad5610ef9565b6001600160a01b0316826001600160a01b03161415610b3b576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b8060696000610b48610ef9565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610b8c610ef9565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b610be3610bdd610ef9565b83610f76565b610c1e5760405162461bcd60e51b81526004018080602001828103825260318152602001806121286031913960400191505060405180910390fd5b610c2a8484848461127b565b50505050565b6060610c3b82610eec565b610c765760405162461bcd60e51b815260040180806020018281038252602f8152602001806120d8602f913960400191505060405180910390fd5b6000828152606c602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610d0b5780601f10610ce057610100808354040283529160200191610d0b565b820191906000526020600020905b815481529060010190602001808311610cee57829003601f168201915b505050505090506060610d1c6109a3565b9050805160001415610d3057509050610627565b815115610df15780826040516020018083805190602001908083835b60208310610d6b5780518252601f199092019160209182019101610d4c565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310610db35780518252601f199092019160209182019101610d94565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050610627565b80610dfb856112cd565b6040516020018083805190602001908083835b60208310610e2d5780518252601f199092019160209182019101610e0e565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b60208310610e755780518252601f199092019160209182019101610e56565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050919050565b6107fa838383610892565b6001600160a01b03918216600090815260696020908152604080832093909416825291909152205460ff1690565b600061088c6066836113a8565b3390565b600081815260686020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610f328261097b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061088c826113b4565b6000610f8182610eec565b610fbc5760405162461bcd60e51b815260040180806020018281038252602c815260200180611f7c602c913960400191505060405180910390fd5b6000610fc78361097b565b9050806001600160a01b0316846001600160a01b031614806110025750836001600160a01b0316610ff7846106c2565b6001600160a01b0316145b8061101257506110128185610ebe565b949350505050565b826001600160a01b031661102d8261097b565b6001600160a01b0316146110725760405162461bcd60e51b81526004018080602001828103825260298152602001806120af6029913960400191505060405180910390fd5b6001600160a01b0382166110b75760405162461bcd60e51b8152600401808060200182810382526024815260200180611f586024913960400191505060405180910390fd5b6110c28383836107fa565b6110cd600082610efd565b6001600160a01b03831660009081526065602052604090206110ef90826113b8565b506001600160a01b038216600090815260656020526040902061111290826113c4565b5061111f606682846113d0565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061088983836113e6565b600061117d3061144a565b15905090565b600054610100900460ff168061119c575061119c611172565b806111aa575060005460ff16155b6111e55760405162461bcd60e51b815260040180806020018281038252602e815260200180612033602e913960400191505060405180910390fd5b600054610100900460ff16158015611210576000805460ff1961ff0019909116610100171660011790555b611218611450565b6112206114f2565b61094f838361158f565b611244828260405180602001604052806000815250611674565b5050565b600080808061125786866116c6565b9097909650945050505050565b6000611271848484611741565b90505b9392505050565b61128684848461101a565b6112928484848461180b565b610c2a5760405162461bcd60e51b8152600401808060200182810382526032815260200180611f266032913960400191505060405180910390fd5b6060816112f257506040805180820190915260018152600360fc1b6020820152610627565b8160005b811561130a57600101600a820491506112f6565b60608167ffffffffffffffff8111801561132357600080fd5b506040519080825280601f01601f19166020018201604052801561134e576020820181803683370190505b50859350905060001982015b831561139f57600a840660300160f81b8282806001900393508151811061137d57fe5b60200101906001600160f81b031916908160001a905350600a8404935061135a565b50949350505050565b60006108898383611973565b5490565b6000610889838361198b565b60006108898383611a51565b600061127184846001600160a01b038516611a9b565b815460009082106114285760405162461bcd60e51b8152600401808060200182810382526022815260200180611f046022913960400191505060405180910390fd5b82600001828154811061143757fe5b9060005260206000200154905092915050565b3b151590565b600054610100900460ff16806114695750611469611172565b80611477575060005460ff16155b6114b25760405162461bcd60e51b815260040180806020018281038252602e815260200180612033602e913960400191505060405180910390fd5b600054610100900460ff161580156114dd576000805460ff1961ff0019909116610100171660011790555b80156114ef576000805461ff00191690555b50565b600054610100900460ff168061150b575061150b611172565b80611519575060005460ff16155b6115545760405162461bcd60e51b815260040180806020018281038252602e815260200180612033602e913960400191505060405180910390fd5b600054610100900460ff1615801561157f576000805460ff1961ff0019909116610100171660011790555b6114dd6301ffc9a760e01b611b32565b600054610100900460ff16806115a857506115a8611172565b806115b6575060005460ff16155b6115f15760405162461bcd60e51b815260040180806020018281038252602e815260200180612033602e913960400191505060405180910390fd5b600054610100900460ff1615801561161c576000805460ff1961ff0019909116610100171660011790555b825161162f90606a906020860190611e70565b50815161164390606b906020850190611e70565b506116546380ac58cd60e01b611b32565b611664635b5e139f60e01b611b32565b61094f63780e9d6360e01b611b32565b61167e8383611bb6565b61168b600084848461180b565b6107fa5760405162461bcd60e51b8152600401808060200182810382526032815260200180611f266032913960400191505060405180910390fd5b81546000908190831061170a5760405162461bcd60e51b81526004018080602001828103825260228152602001806120616022913960400191505060405180910390fd5b600084600001848154811061171b57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816117dc5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156117a1578181015183820152602001611789565b50505050905090810190601f1680156117ce5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508460000160018203815481106117ef57fe5b9060005260206000209060020201600101549150509392505050565b600061181f846001600160a01b031661144a565b61182b57506001611012565b6060611939630a85bd0160e11b611840610ef9565b88878760405160240180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156118a757818101518382015260200161188f565b50505050905090810190601f1680156118d45780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001611f26603291396001600160a01b0388169190611ce4565b9050600081806020019051602081101561195257600080fd5b50516001600160e01b031916630a85bd0160e11b1492505050949350505050565b60009081526001919091016020526040902054151590565b60008181526001830160205260408120548015611a4757835460001980830191908101906000908790839081106119be57fe5b90600052602060002001549050808760000184815481106119db57fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080611a0b57fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061088c565b600091505061088c565b6000611a5d8383611973565b611a935750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561088c565b50600061088c565b600082815260018401602052604081205480611b00575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055611274565b82856000016001830381548110611b1357fe5b9060005260206000209060020201600101819055506000915050611274565b6001600160e01b03198082161415611b91576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152603360205260409020805460ff19166001179055565b6001600160a01b038216611c11576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b611c1a81610eec565b15611c6c576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b611c78600083836107fa565b6001600160a01b0382166000908152606560205260409020611c9a90826113c4565b50611ca7606682846113d0565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060611271848460008585611cf88561144a565b611d49576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310611d885780518252601f199092019160209182019101611d69565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611dea576040519150601f19603f3d011682016040523d82523d6000602084013e611def565b606091505b5091509150611dff828286611e0a565b979650505050505050565b60608315611e19575081611274565b825115611e295782518084602001fd5b60405162461bcd60e51b81526020600482018181528451602484015284518593919283926044019190850190808383600083156117a1578181015183820152602001611789565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611eb157805160ff1916838001178555611ede565b82800160010185558215611ede579182015b82811115611ede578251825591602001919060010190611ec3565b50611eea929150611eee565b5090565b5b80821115611eea5760008155600101611eef56fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64734552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564a264697066735822122098f5e8b6a1fee9dd81707d4156d17a8ac81f472722e7f32208537b8708b683a064736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x121 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x4F6CCCE7 GT PUSH2 0xAD JUMPI DUP1 PUSH4 0xA22CB465 GT PUSH2 0x71 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x494 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x4C2 JUMPI DUP1 PUSH4 0xC87B56DD EQ PUSH2 0x588 JUMPI DUP1 PUSH4 0xCB322D46 EQ PUSH2 0x5A5 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x5DB JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x4F6CCCE7 EQ PUSH2 0x424 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x441 JUMPI DUP1 PUSH4 0x6C0360EB EQ PUSH2 0x45E JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x466 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x48C JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x18160DDD GT PUSH2 0xF4 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x245 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x25F JUMPI DUP1 PUSH4 0x2F745C59 EQ PUSH2 0x295 JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x2C1 JUMPI DUP1 PUSH4 0x4CD88B76 EQ PUSH2 0x2F7 JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x126 JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x161 JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x1DE JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x217 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x14D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x13C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH2 0x609 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x169 PUSH2 0x62C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1A3 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x18B JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1D0 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1FB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x6C2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x22D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x724 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x24D PUSH2 0x7FF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x275 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x810 JUMP JUMPDEST PUSH2 0x24D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x2AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x867 JUMP JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x2D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x892 JUMP JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x30D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x328 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x33A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x35C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 SWAP5 SWAP4 PUSH1 0x20 DUP2 ADD SWAP4 POP CALLDATALOAD SWAP2 POP POP PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x3AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x3C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x3E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x8AD SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x24D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x43A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x965 JUMP JUMPDEST PUSH2 0x1FB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x457 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x97B JUMP JUMPDEST PUSH2 0x169 PUSH2 0x9A3 JUMP JUMPDEST PUSH2 0x24D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x47C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xA04 JUMP JUMPDEST PUSH2 0x169 PUSH2 0xA6C JUMP JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x4AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD ISZERO ISZERO PUSH2 0xACD JUMP JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x4D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x513 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x525 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x547 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0xBD2 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x169 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x59E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xC30 JUMP JUMPDEST PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x5BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xEB3 JUMP JUMPDEST PUSH2 0x14D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x5F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xEBE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x6B8 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x68D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x6B8 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x69B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6CD DUP3 PUSH2 0xEEC JUMP JUMPDEST PUSH2 0x708 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2083 PUSH1 0x2C SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x68 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x72F DUP3 PUSH2 0x97B JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x782 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2107 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x794 PUSH2 0xEF9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0x7B5 JUMPI POP PUSH2 0x7B5 DUP2 PUSH2 0x7B0 PUSH2 0xEF9 JUMP JUMPDEST PUSH2 0xEBE JUMP JUMPDEST PUSH2 0x7F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x38 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1FA8 PUSH1 0x38 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x7FA DUP4 DUP4 PUSH2 0xEFD JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x80B PUSH1 0x66 PUSH2 0xF6B JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x821 PUSH2 0x81B PUSH2 0xEF9 JUMP JUMPDEST DUP3 PUSH2 0xF76 JUMP JUMPDEST PUSH2 0x85C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x31 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2128 PUSH1 0x31 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x7FA DUP4 DUP4 DUP4 PUSH2 0x101A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x889 SWAP1 DUP4 PUSH2 0x1166 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x7FA DUP4 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP PUSH2 0xBD2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x8C6 JUMPI POP PUSH2 0x8C6 PUSH2 0x1172 JUMP JUMPDEST DUP1 PUSH2 0x8D4 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x90F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2033 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x93A JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x944 DUP4 DUP4 PUSH2 0x1183 JUMP JUMPDEST PUSH2 0x94F CALLER PUSH1 0x0 PUSH2 0x122A JUMP JUMPDEST DUP1 ISZERO PUSH2 0x7FA JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x973 PUSH1 0x66 DUP5 PUSH2 0x1248 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x88C DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x200A PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x66 SWAP2 SWAP1 PUSH2 0x1264 JUMP JUMPDEST PUSH1 0x6D DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x6B8 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x68D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x6B8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xA4B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1FE0 PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x88C SWAP1 PUSH2 0xF6B JUMP JUMPDEST PUSH1 0x6B DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x6B8 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x68D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x6B8 JUMP JUMPDEST PUSH2 0xAD5 PUSH2 0xEF9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0xB3B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4552433732313A20617070726F766520746F2063616C6C657200000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x69 PUSH1 0x0 PUSH2 0xB48 PUSH2 0xEF9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP8 AND DUP1 DUP3 MSTORE SWAP2 SWAP1 SWAP4 MSTORE SWAP2 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP3 ISZERO ISZERO SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE PUSH2 0xB8C PUSH2 0xEF9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH2 0xBE3 PUSH2 0xBDD PUSH2 0xEF9 JUMP JUMPDEST DUP4 PUSH2 0xF76 JUMP JUMPDEST PUSH2 0xC1E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x31 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2128 PUSH1 0x31 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xC2A DUP5 DUP5 DUP5 DUP5 PUSH2 0x127B JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0xC3B DUP3 PUSH2 0xEEC JUMP JUMPDEST PUSH2 0xC76 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2F DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x20D8 PUSH1 0x2F SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x6C PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD DUP4 MLOAD PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP7 AND ISZERO MUL ADD SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 DIV SWAP2 DUP3 ADD DUP5 SWAP1 DIV DUP5 MUL DUP2 ADD DUP5 ADD SWAP1 SWAP5 MSTORE DUP1 DUP5 MSTORE PUSH1 0x60 SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xD0B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xCE0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xD0B JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xCEE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH1 0x60 PUSH2 0xD1C PUSH2 0x9A3 JUMP JUMPDEST SWAP1 POP DUP1 MLOAD PUSH1 0x0 EQ ISZERO PUSH2 0xD30 JUMPI POP SWAP1 POP PUSH2 0x627 JUMP JUMPDEST DUP2 MLOAD ISZERO PUSH2 0xDF1 JUMPI DUP1 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xD6B JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xD4C JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE DUP6 MLOAD SWAP2 SWAP1 SWAP4 ADD SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xDB3 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xD94 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP3 POP POP POP PUSH2 0x627 JUMP JUMPDEST DUP1 PUSH2 0xDFB DUP6 PUSH2 0x12CD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xE2D JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xE0E JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE DUP6 MLOAD SWAP2 SWAP1 SWAP4 ADD SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xE75 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xE56 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP3 POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x7FA DUP4 DUP4 DUP4 PUSH2 0x892 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x88C PUSH1 0x66 DUP4 PUSH2 0x13A8 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x68 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 SWAP1 PUSH2 0xF32 DUP3 PUSH2 0x97B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x88C DUP3 PUSH2 0x13B4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF81 DUP3 PUSH2 0xEEC JUMP JUMPDEST PUSH2 0xFBC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1F7C PUSH1 0x2C SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0xFC7 DUP4 PUSH2 0x97B JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0x1002 JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xFF7 DUP5 PUSH2 0x6C2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0x1012 JUMPI POP PUSH2 0x1012 DUP2 DUP6 PUSH2 0xEBE JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x102D DUP3 PUSH2 0x97B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1072 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x20AF PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x10B7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1F58 PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x10C2 DUP4 DUP4 DUP4 PUSH2 0x7FA JUMP JUMPDEST PUSH2 0x10CD PUSH1 0x0 DUP3 PUSH2 0xEFD JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x10EF SWAP1 DUP3 PUSH2 0x13B8 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x1112 SWAP1 DUP3 PUSH2 0x13C4 JUMP JUMPDEST POP PUSH2 0x111F PUSH1 0x66 DUP3 DUP5 PUSH2 0x13D0 JUMP JUMPDEST POP DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x889 DUP4 DUP4 PUSH2 0x13E6 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x117D ADDRESS PUSH2 0x144A JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x119C JUMPI POP PUSH2 0x119C PUSH2 0x1172 JUMP JUMPDEST DUP1 PUSH2 0x11AA JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x11E5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2033 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1210 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x1218 PUSH2 0x1450 JUMP JUMPDEST PUSH2 0x1220 PUSH2 0x14F2 JUMP JUMPDEST PUSH2 0x94F DUP4 DUP4 PUSH2 0x158F JUMP JUMPDEST PUSH2 0x1244 DUP3 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x20 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP PUSH2 0x1674 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH2 0x1257 DUP7 DUP7 PUSH2 0x16C6 JUMP JUMPDEST SWAP1 SWAP8 SWAP1 SWAP7 POP SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1271 DUP5 DUP5 DUP5 PUSH2 0x1741 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1286 DUP5 DUP5 DUP5 PUSH2 0x101A JUMP JUMPDEST PUSH2 0x1292 DUP5 DUP5 DUP5 DUP5 PUSH2 0x180B JUMP JUMPDEST PUSH2 0xC2A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x32 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1F26 PUSH1 0x32 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x60 DUP2 PUSH2 0x12F2 JUMPI POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1 DUP2 MSTORE PUSH1 0x3 PUSH1 0xFC SHL PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x627 JUMP JUMPDEST DUP2 PUSH1 0x0 JUMPDEST DUP2 ISZERO PUSH2 0x130A JUMPI PUSH1 0x1 ADD PUSH1 0xA DUP3 DIV SWAP2 POP PUSH2 0x12F6 JUMP JUMPDEST PUSH1 0x60 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x1323 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x134E JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP6 SWAP4 POP SWAP1 POP PUSH1 0x0 NOT DUP3 ADD JUMPDEST DUP4 ISZERO PUSH2 0x139F JUMPI PUSH1 0xA DUP5 MOD PUSH1 0x30 ADD PUSH1 0xF8 SHL DUP3 DUP3 DUP1 PUSH1 0x1 SWAP1 SUB SWAP4 POP DUP2 MLOAD DUP2 LT PUSH2 0x137D JUMPI INVALID JUMPDEST PUSH1 0x20 ADD ADD SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xF8 SHL SUB NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0xA DUP5 DIV SWAP4 POP PUSH2 0x135A JUMP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x889 DUP4 DUP4 PUSH2 0x1973 JUMP JUMPDEST SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x889 DUP4 DUP4 PUSH2 0x198B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x889 DUP4 DUP4 PUSH2 0x1A51 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1271 DUP5 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x1A9B JUMP JUMPDEST DUP2 SLOAD PUSH1 0x0 SWAP1 DUP3 LT PUSH2 0x1428 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1F04 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 PUSH1 0x0 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x1437 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1469 JUMPI POP PUSH2 0x1469 PUSH2 0x1172 JUMP JUMPDEST DUP1 PUSH2 0x1477 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x14B2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2033 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x14DD JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP1 ISZERO PUSH2 0x14EF JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x150B JUMPI POP PUSH2 0x150B PUSH2 0x1172 JUMP JUMPDEST DUP1 PUSH2 0x1519 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1554 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2033 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x157F JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x14DD PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x1B32 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x15A8 JUMPI POP PUSH2 0x15A8 PUSH2 0x1172 JUMP JUMPDEST DUP1 PUSH2 0x15B6 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x15F1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2033 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x161C JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP3 MLOAD PUSH2 0x162F SWAP1 PUSH1 0x6A SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x1E70 JUMP JUMPDEST POP DUP2 MLOAD PUSH2 0x1643 SWAP1 PUSH1 0x6B SWAP1 PUSH1 0x20 DUP6 ADD SWAP1 PUSH2 0x1E70 JUMP JUMPDEST POP PUSH2 0x1654 PUSH4 0x80AC58CD PUSH1 0xE0 SHL PUSH2 0x1B32 JUMP JUMPDEST PUSH2 0x1664 PUSH4 0x5B5E139F PUSH1 0xE0 SHL PUSH2 0x1B32 JUMP JUMPDEST PUSH2 0x94F PUSH4 0x780E9D63 PUSH1 0xE0 SHL PUSH2 0x1B32 JUMP JUMPDEST PUSH2 0x167E DUP4 DUP4 PUSH2 0x1BB6 JUMP JUMPDEST PUSH2 0x168B PUSH1 0x0 DUP5 DUP5 DUP5 PUSH2 0x180B JUMP JUMPDEST PUSH2 0x7FA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x32 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1F26 PUSH1 0x32 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP4 LT PUSH2 0x170A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2061 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP5 PUSH1 0x0 ADD DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x171B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD SWAP1 POP DUP1 PUSH1 0x0 ADD SLOAD DUP2 PUSH1 0x1 ADD SLOAD SWAP3 POP SWAP3 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP3 DUP2 PUSH2 0x17DC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x17A1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1789 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x17CE JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP5 PUSH1 0x0 ADD PUSH1 0x1 DUP3 SUB DUP2 SLOAD DUP2 LT PUSH2 0x17EF JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD PUSH1 0x1 ADD SLOAD SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x181F DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x144A JUMP JUMPDEST PUSH2 0x182B JUMPI POP PUSH1 0x1 PUSH2 0x1012 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1939 PUSH4 0xA85BD01 PUSH1 0xE1 SHL PUSH2 0x1840 PUSH2 0xEF9 JUMP JUMPDEST DUP9 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x24 ADD DUP1 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x18A7 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x188F JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x18D4 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x32 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1F26 PUSH1 0x32 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND SWAP2 SWAP1 PUSH2 0x1CE4 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1952 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH4 0xA85BD01 PUSH1 0xE1 SHL EQ SWAP3 POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 DUP4 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP1 ISZERO PUSH2 0x1A47 JUMPI DUP4 SLOAD PUSH1 0x0 NOT DUP1 DUP4 ADD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x0 SWAP1 DUP8 SWAP1 DUP4 SWAP1 DUP2 LT PUSH2 0x19BE JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP DUP1 DUP8 PUSH1 0x0 ADD DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x19DB JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SWAP3 SWAP1 SWAP3 SSTORE DUP3 DUP2 MSTORE PUSH1 0x1 DUP10 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP1 DUP5 ADD SWAP1 SSTORE DUP7 SLOAD DUP8 SWAP1 DUP1 PUSH2 0x1A0B JUMPI INVALID JUMPDEST PUSH1 0x1 SWAP1 SUB DUP2 DUP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SSTORE SWAP1 SSTORE DUP7 PUSH1 0x1 ADD PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SSTORE PUSH1 0x1 SWAP5 POP POP POP POP POP PUSH2 0x88C JUMP JUMPDEST PUSH1 0x0 SWAP2 POP POP PUSH2 0x88C JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1A5D DUP4 DUP4 PUSH2 0x1973 JUMP JUMPDEST PUSH2 0x1A93 JUMPI POP DUP2 SLOAD PUSH1 0x1 DUP2 DUP2 ADD DUP5 SSTORE PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 KECCAK256 SWAP1 SWAP4 ADD DUP5 SWAP1 SSTORE DUP5 SLOAD DUP5 DUP3 MSTORE DUP3 DUP7 ADD SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE PUSH2 0x88C JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x88C JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP1 PUSH2 0x1B00 JUMPI POP POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE DUP4 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 ADD DUP5 DUP2 MSTORE DUP7 SLOAD PUSH1 0x1 DUP2 DUP2 ADD DUP10 SSTORE PUSH1 0x0 DUP10 DUP2 MSTORE DUP5 DUP2 KECCAK256 SWAP6 MLOAD PUSH1 0x2 SWAP1 SWAP4 MUL SWAP1 SWAP6 ADD SWAP2 DUP3 SSTORE SWAP2 MLOAD SWAP1 DUP3 ADD SSTORE DUP7 SLOAD DUP7 DUP5 MSTORE DUP2 DUP9 ADD SWAP1 SWAP3 MSTORE SWAP3 SWAP1 SWAP2 KECCAK256 SSTORE PUSH2 0x1274 JUMP JUMPDEST DUP3 DUP6 PUSH1 0x0 ADD PUSH1 0x1 DUP4 SUB DUP2 SLOAD DUP2 LT PUSH2 0x1B13 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD PUSH1 0x1 ADD DUP2 SWAP1 SSTORE POP PUSH1 0x0 SWAP2 POP POP PUSH2 0x1274 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP1 DUP3 AND EQ ISZERO PUSH2 0x1B91 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4552433136353A20696E76616C696420696E7465726661636520696400000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x1C11 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4552433732313A206D696E7420746F20746865207A65726F2061646472657373 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1C1A DUP2 PUSH2 0xEEC JUMP JUMPDEST ISZERO PUSH2 0x1C6C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4552433732313A20746F6B656E20616C7265616479206D696E74656400000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1C78 PUSH1 0x0 DUP4 DUP4 PUSH2 0x7FA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x65 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x1C9A SWAP1 DUP3 PUSH2 0x13C4 JUMP JUMPDEST POP PUSH2 0x1CA7 PUSH1 0x66 DUP3 DUP5 PUSH2 0x13D0 JUMP JUMPDEST POP PUSH1 0x40 MLOAD DUP2 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH1 0x0 SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP1 DUP3 SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1271 DUP5 DUP5 PUSH1 0x0 DUP6 DUP6 PUSH2 0x1CF8 DUP6 PUSH2 0x144A JUMP JUMPDEST PUSH2 0x1D49 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1D88 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1D69 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x1DEA JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1DEF JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x1DFF DUP3 DUP3 DUP7 PUSH2 0x1E0A JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x1E19 JUMPI POP DUP2 PUSH2 0x1274 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x1E29 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x17A1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1789 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x1EB1 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x1EDE JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x1EDE JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1EDE JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x1EC3 JUMP JUMPDEST POP PUSH2 0x1EEA SWAP3 SWAP2 POP PUSH2 0x1EEE JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1EEA JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1EEF JUMP INVALID GASLIMIT PUSH15 0x756D657261626C655365743A20696E PUSH5 0x6578206F75 PUSH21 0x206F6620626F756E64734552433732313A20747261 PUSH15 0x7366657220746F206E6F6E20455243 CALLDATACOPY ORIGIN BALANCE MSTORE PUSH6 0x636569766572 KECCAK256 PUSH10 0x6D706C656D656E746572 GASLIMIT MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH21 0x72616E7366657220746F20746865207A65726F2061 PUSH5 0x6472657373 GASLIMIT MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH16 0x70657261746F7220717565727920666F PUSH19 0x206E6F6E6578697374656E7420746F6B656E45 MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F76652063616C6C6572206973206E6F74206F PUSH24 0x6E6572206E6F7220617070726F76656420666F7220616C6C GASLIMIT MSTORE NUMBER CALLDATACOPY ORIGIN BALANCE GASPRICE KECCAK256 PUSH3 0x616C61 PUSH15 0x636520717565727920666F72207468 PUSH6 0x207A65726F20 PUSH2 0x6464 PUSH19 0x6573734552433732313A206F776E6572207175 PUSH6 0x727920666F72 KECCAK256 PUSH15 0x6F6E6578697374656E7420746F6B65 PUSH15 0x496E697469616C697A61626C653A20 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 GASLIMIT PUSH15 0x756D657261626C654D61703A20696E PUSH5 0x6578206F75 PUSH21 0x206F6620626F756E64734552433732313A20617070 PUSH19 0x6F76656420717565727920666F72206E6F6E65 PUSH25 0x697374656E7420746F6B656E4552433732313A207472616E73 PUSH7 0x6572206F662074 PUSH16 0x6B656E2074686174206973206E6F7420 PUSH16 0x776E4552433732314D65746164617461 GASPRICE KECCAK256 SSTORE MSTORE 0x49 KECCAK256 PUSH18 0x7565727920666F72206E6F6E657869737465 PUSH15 0x7420746F6B656E4552433732313A20 PUSH2 0x7070 PUSH19 0x6F76616C20746F2063757272656E74206F776E PUSH6 0x724552433732 BALANCE GASPRICE KECCAK256 PUSH21 0x72616E736665722063616C6C6572206973206E6F74 KECCAK256 PUSH16 0x776E6572206E6F7220617070726F7665 PUSH5 0xA264697066 PUSH20 0x5822122098F5E8B6A1FEE9DD81707D4156D17A8A 0xC8 0x1F SELFBALANCE 0x27 0x22 0xE7 RETURN 0x22 ADDMOD MSTORE8 PUSH28 0x8708B683A064736F6C634300060C0033000000000000000000000000 ",
              "sourceMap": "106:356:73:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1176:148:6;;;;;;;;;;;;;;;;-1:-1:-1;1176:148:6;-1:-1:-1;;;;;;1176:148:6;;:::i;:::-;;;;;;;;;;;;;;;;;;5113:98:13;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7840:217;;;;;;;;;;;;;;;;-1:-1:-1;7840:217:13;;:::i;:::-;;;;-1:-1:-1;;;;;7840:217:13;;;;;;;;;;;;;;7362:417;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7362:417:13;;;;;;;;:::i;:::-;;6856:208;;;:::i;:::-;;;;;;;;;;;;;;;;8704:300;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8704:300:13;;;;;;;;;;;;;;;;;:::i;6625:160::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;6625:160:13;;;;;;;;:::i;9070:149::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;9070:149:13;;;;;;;;;;;;;;;;;:::i;144:164:73:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;144:164:73;;;;;;;;-1:-1:-1;144:164:73;;-1:-1:-1;;144:164:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;144:164:73;;-1:-1:-1;144:164:73;;-1:-1:-1;;;;;144:164:73:i;7136:169:13:-;;;;;;;;;;;;;;;;-1:-1:-1;7136:169:13;;:::i;4876:175::-;;;;;;;;;;;;;;;;-1:-1:-1;4876:175:13;;:::i;6451:95::-;;;:::i;4601:218::-;;;;;;;;;;;;;;;;-1:-1:-1;4601:218:13;-1:-1:-1;;;;;4601:218:13;;:::i;5275:102::-;;;:::i;8124:290::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8124:290:13;;;;;;;;;;:::i;9285:282::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9285:282:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9285:282:13;;-1:-1:-1;9285:282:13;;-1:-1:-1;;;;;9285:282:13:i;5443:776::-;;;;;;;;;;;;;;;;-1:-1:-1;5443:776:13;;:::i;312:148:73:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;312:148:73;;;;;;;;;;;;;;;;;:::i;8480:162:13:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8480:162:13;;;;;;;;;;:::i;1176:148:6:-;-1:-1:-1;;;;;;1284:33:6;;1261:4;1284:33;;;:20;:33;;;;;;;;1176:148;;;;:::o;5113:98:13:-;5199:5;5192:12;;;;;;;;-1:-1:-1;;5192:12:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5167:13;;5192:12;;5199:5;;5192:12;;5199:5;5192:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5113:98;:::o;7840:217::-;7916:7;7943:16;7951:7;7943;:16::i;:::-;7935:73;;;;-1:-1:-1;;;7935:73:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8026:24:13;;;;:15;:24;;;;;;-1:-1:-1;;;;;8026:24:13;;7840:217::o;7362:417::-;7442:13;7458:34;7484:7;7458:25;:34::i;:::-;7442:50;;7516:5;-1:-1:-1;;;;;7510:11:13;:2;-1:-1:-1;;;;;7510:11:13;;;7502:57;;;;-1:-1:-1;;;7502:57:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7594:5;-1:-1:-1;;;;;7578:21:13;:12;:10;:12::i;:::-;-1:-1:-1;;;;;7578:21:13;;:80;;;;7603:55;7638:5;7645:12;:10;:12::i;:::-;7603:34;:55::i;:::-;7570:170;;;;-1:-1:-1;;;7570:170:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7751:21;7760:2;7764:7;7751:8;:21::i;:::-;7362:417;;;:::o;6856:208::-;6917:7;7036:21;:12;:19;:21::i;:::-;7029:28;;6856:208;:::o;8704:300::-;8863:41;8882:12;:10;:12::i;:::-;8896:7;8863:18;:41::i;:::-;8855:103;;;;-1:-1:-1;;;8855:103:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8969:28;8979:4;8985:2;8989:7;8969:9;:28::i;6625:160::-;-1:-1:-1;;;;;6748:20:13;;6722:7;6748:20;;;:13;:20;;;;;:30;;6772:5;6748:23;:30::i;:::-;6741:37;;6625:160;;;;;:::o;9070:149::-;9173:39;9190:4;9196:2;9200:7;9173:39;;;;;;;;;;;;:16;:39::i;144:164:73:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;244:29:73::1;258:5;265:7;244:13;:29::i;:::-;279:24;289:10;301:1;279:9;:24::i;:::-;1794:14:9::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;144:164:73;;;:::o;7136:169:13:-;7211:7;;7252:22;:12;7268:5;7252:15;:22::i;:::-;-1:-1:-1;7230:44:13;7136:169;-1:-1:-1;;;7136:169:13:o;4876:175::-;4948:7;4974:70;4991:7;4974:70;;;;;;;;;;;;;;;;;:12;;:70;:16;:70::i;6451:95::-;6531:8;6524:15;;;;;;;;-1:-1:-1;;6524:15:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6499:13;;6524:15;;6531:8;;6524:15;;6531:8;6524:15;;;;;;;;;;;;;;;;;;;;;;;;4601:218;4673:7;-1:-1:-1;;;;;4700:19:13;;4692:74;;;;-1:-1:-1;;;4692:74:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4783:20:13;;;;;;:13;:20;;;;;:29;;:27;:29::i;5275:102::-;5363:7;5356:14;;;;;;;;-1:-1:-1;;5356:14:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5331:13;;5356:14;;5363:7;;5356:14;;5363:7;5356:14;;;;;;;;;;;;;;;;;;;;;;;;8124:290;8238:12;:10;:12::i;:::-;-1:-1:-1;;;;;8226:24:13;:8;-1:-1:-1;;;;;8226:24:13;;;8218:62;;;;;-1:-1:-1;;;8218:62:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;8336:8;8291:18;:32;8310:12;:10;:12::i;:::-;-1:-1:-1;;;;;8291:32:13;;;;;;;;;;;;;;;;;-1:-1:-1;8291:32:13;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;8291:53:13;;;;;;;;;;;8374:12;:10;:12::i;:::-;-1:-1:-1;;;;;8359:48:13;;8398:8;8359:48;;;;;;;;;;;;;;;;;;;;8124:290;;:::o;9285:282::-;9416:41;9435:12;:10;:12::i;:::-;9449:7;9416:18;:41::i;:::-;9408:103;;;;-1:-1:-1;;;9408:103:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9521:39;9535:4;9541:2;9545:7;9554:5;9521:13;:39::i;:::-;9285:282;;;;:::o;5443:776::-;5516:13;5549:16;5557:7;5549;:16::i;:::-;5541:76;;;;-1:-1:-1;;;5541:76:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5654:19;;;;:10;:19;;;;;;;;;5628:45;;;;;;-1:-1:-1;;5628:45:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;;:45;;;5654:19;5628:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5683:18;5704:9;:7;:9::i;:::-;5683:30;;5792:4;5786:18;5808:1;5786:23;5782:70;;;-1:-1:-1;5832:9:13;-1:-1:-1;5825:16:13;;5782:70;5954:23;;:27;5950:106;;6028:4;6034:9;6011:33;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6011:33:13;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6011:33:13;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6011:33:13;;;;;;;;;;;;;-1:-1:-1;;6011:33:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5997:48;;;;;;5950:106;6186:4;6192:18;:7;:16;:18::i;:::-;6169:42;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6169:42:13;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6169:42:13;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6169:42:13;;;;;;;;;;;;;-1:-1:-1;;6169:42:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6155:57;;;;5443:776;;;:::o;312:148:73:-;402:53;437:4;443:2;447:7;402:34;:53::i;8480:162:13:-;-1:-1:-1;;;;;8600:25:13;;;8577:4;8600:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;8480:162::o;11001:125::-;11066:4;11089:30;:12;11111:7;11089:21;:30::i;828:104:19:-;915:10;828:104;:::o;16792:191:13:-;16857:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;16857:29:13;-1:-1:-1;;;;;16857:29:13;;;;;;;;:24;;16910:34;16857:24;16910:25;:34::i;:::-;-1:-1:-1;;;;;16901:57:13;;;;;;;;;;;16792:191;;:::o;7831:121:21:-;7900:7;7926:19;7934:3;7926:7;:19::i;11284:373:13:-;11377:4;11401:16;11409:7;11401;:16::i;:::-;11393:73;;;;-1:-1:-1;;;11393:73:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11476:13;11492:34;11518:7;11492:25;:34::i;:::-;11476:50;;11555:5;-1:-1:-1;;;;;11544:16:13;:7;-1:-1:-1;;;;;11544:16:13;;:51;;;;11588:7;-1:-1:-1;;;;;11564:31:13;:20;11576:7;11564:11;:20::i;:::-;-1:-1:-1;;;;;11564:31:13;;11544:51;:105;;;;11599:50;11634:5;11641:7;11599:34;:50::i;:::-;11536:114;11284:373;-1:-1:-1;;;;11284:373:13:o;14358:595::-;14493:4;-1:-1:-1;;;;;14455:42:13;:34;14481:7;14455:25;:34::i;:::-;-1:-1:-1;;;;;14455:42:13;;14447:96;;;;-1:-1:-1;;;14447:96:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14579:16:13;;14571:65;;;;-1:-1:-1;;;14571:65:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14647:39;14668:4;14674:2;14678:7;14647:20;:39::i;:::-;14748:29;14765:1;14769:7;14748:8;:29::i;:::-;-1:-1:-1;;;;;14788:19:13;;;;;;:13;:19;;;;;:35;;14815:7;14788:26;:35::i;:::-;-1:-1:-1;;;;;;14833:17:13;;;;;;:13;:17;;;;;:30;;14855:7;14833:21;:30::i;:::-;-1:-1:-1;14874:29:13;:12;14891:7;14900:2;14874:16;:29::i;:::-;;14938:7;14934:2;-1:-1:-1;;;;;14919:27:13;14928:4;-1:-1:-1;;;;;14919:27:13;;;;;;;;;;;14358:595;;;:::o;9261:135:22:-;9332:7;9366:22;9370:3;9382:5;9366:3;:22::i;1952:123:9:-;2000:4;2024:44;2062:4;2024:29;:44::i;:::-;2023:45;2016:52;;1952:123;:::o;3918:215:13:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;4016:26:13::1;:24;:26::i;:::-;4052:25;:23;:25::i;:::-;4087:39;4111:5;4118:7;4087:23;:39::i;11988:108::-:0;12063:26;12073:2;12077:7;12063:26;;;;;;;;;;;;:9;:26::i;:::-;11988:108;;:::o;8280:233:21:-;8360:7;;;;8419:22;8423:3;8435:5;8419:3;:22::i;:::-;8388:53;;;;-1:-1:-1;8280:233:21;-1:-1:-1;;;;;8280:233:21:o;9533:211::-;9640:7;9690:44;9695:3;9715;9721:12;9690:4;:44::i;:::-;9682:53;-1:-1:-1;9533:211:21;;;;;;:::o;10429:269:13:-;10542:28;10552:4;10558:2;10562:7;10542:9;:28::i;:::-;10588:48;10611:4;10617:2;10621:7;10630:5;10588:22;:48::i;:::-;10580:111;;;;-1:-1:-1;;;10580:111:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;221:725:25;277:13;494:10;490:51;;-1:-1:-1;520:10:25;;;;;;;;;;;;-1:-1:-1;;;520:10:25;;;;;;490:51;565:5;550:12;604:75;611:9;;604:75;;636:8;;666:2;658:10;;;;604:75;;;688:19;720:6;710:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;710:17:25;-1:-1:-1;780:5:25;;-1:-1:-1;688:39:25;-1:-1:-1;;;753:10:25;;795:114;802:9;;795:114;;870:2;863:4;:9;858:2;:14;845:29;;827:6;834:7;;;;;;;827:15;;;;;;;;;;;:47;-1:-1:-1;;;;;827:47:25;;;;;;;;-1:-1:-1;896:2:25;888:10;;;;795:114;;;-1:-1:-1;932:6:25;221:725;-1:-1:-1;;;;221:725:25:o;7599:149:21:-;7683:4;7706:35;7716:3;7736;7706:9;:35::i;4502:108::-;4584:19;;4502:108::o;8376:135:22:-;8446:4;8469:35;8477:3;8497:5;8469:7;:35::i;8079:129::-;8146:4;8169:32;8174:3;8194:5;8169:4;:32::i;7038:183:21:-;7127:4;7150:64;7155:3;7175;-1:-1:-1;;;;;7189:23:21;;7150:4;:64::i;4463:201:22:-;4557:18;;4530:7;;4557:26;-1:-1:-1;4549:73:22;;;;-1:-1:-1;;;4549:73:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4639:3;:11;;4651:5;4639:18;;;;;;;;;;;;;;;;4632:25;;4463:201;;;;:::o;737:413:18:-;1097:20;1135:8;;;737:413::o;759:64:19:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1794:14;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1790:66;759:64:19;:::o;777:249:6:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;979:40:6::1;-1:-1:-1::0;;;979:18:6::1;:40::i;4139:403:13:-:0;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;4247:13:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;4270:17:13;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;4375:40:13::1;-1:-1:-1::0;;;4375:18:13::1;:40::i;:::-;4425:49;-1:-1:-1::0;;;4425:18:13::1;:49::i;:::-;4484:51;-1:-1:-1::0;;;4484:18:13::1;:51::i;12317:247::-:0;12412:18;12418:2;12422:7;12412:5;:18::i;:::-;12448:54;12479:1;12483:2;12487:7;12496:5;12448:22;:54::i;:::-;12440:117;;;;-1:-1:-1;;;12440:117:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4953:274:21;5056:19;;5020:7;;;;5056:27;-1:-1:-1;5048:74:21;;;;-1:-1:-1;;;5048:74:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5133:22;5158:3;:12;;5171:5;5158:19;;;;;;;;;;;;;;;;;;5133:44;;5195:5;:10;;;5207:5;:12;;;5187:33;;;;;4953:274;;;;;:::o;6414:315::-;6508:7;6546:17;;;:12;;;:17;;;;;;6596:12;6581:13;6573:36;;;;-1:-1:-1;;;6573:36:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6662:3;:12;;6686:1;6675:8;:12;6662:26;;;;;;;;;;;;;;;;;;:33;;;6655:40;;;6414:315;;;;;:::o;16186:600:13:-;16306:4;16331:15;:2;-1:-1:-1;;;;;16331:13:13;;:15::i;:::-;16326:58;;-1:-1:-1;16369:4:13;16362:11;;16326:58;16393:23;16419:257;-1:-1:-1;;;16541:12:13;:10;:12::i;:::-;16567:4;16585:7;16606:5;16435:186;;;;;;-1:-1:-1;;;;;16435:186:13;;;;;;-1:-1:-1;;;;;16435:186:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16435:186:13;;;;;;;-1:-1:-1;;;;;16435:186:13;;;;;;;;;;;16419:257;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16419:15:13;;;:257;:15;:257::i;:::-;16393:283;;16686:13;16713:10;16702:32;;;;;;;;;;;;;;;-1:-1:-1;16702:32:13;-1:-1:-1;;;;;;16752:26:13;-1:-1:-1;;;16752:26:13;;-1:-1:-1;;;16186:600:13;;;;;;:::o;4289:123:21:-;4360:4;4383:17;;;:12;;;;;:17;;;;;;:22;;;4289:123::o;2223:1512:22:-;2289:4;2426:19;;;:12;;;:19;;;;;;2460:15;;2456:1273;;2889:18;;-1:-1:-1;;2841:14:22;;;;2889:22;;;;2817:21;;2889:3;;:22;;3171;;;;;;;;;;;;;;3151:42;;3314:9;3285:3;:11;;3297:13;3285:26;;;;;;;;;;;;;;;;;;;:38;;;;3389:23;;;3431:1;3389:12;;;:23;;;;;;3415:17;;;3389:43;;3538:17;;3389:3;;3538:17;;;;;;;;;;;;;;;;;;;;;;3630:3;:12;;:19;3643:5;3630:19;;;;;;;;;;;3623:26;;;3671:4;3664:11;;;;;;;;2456:1273;3713:5;3706:12;;;;;1651:404;1714:4;1735:21;1745:3;1750:5;1735:9;:21::i;:::-;1730:319;;-1:-1:-1;1772:23:22;;;;;;;;:11;:23;;;;;;;;;;;;;1952:18;;1930:19;;;:12;;;:19;;;;;;:40;;;;1984:11;;1730:319;-1:-1:-1;2033:5:22;2026:12;;1847:678:21;1923:4;2056:17;;;:12;;;:17;;;;;;2088:13;2084:435;;-1:-1:-1;;2172:38:21;;;;;;;;;;;;;;;;;;2154:57;;;;;;;;:12;:57;;;;;;;;;;;;;;;;;;;;;;;;2366:19;;2346:17;;;:12;;;:17;;;;;;;:39;2399:11;;2084:435;2477:5;2441:3;:12;;2465:1;2454:8;:12;2441:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;2503:5;2496:12;;;;;1718:198:6;-1:-1:-1;;;;;;1801:25:6;;;;;1793:66;;;;;-1:-1:-1;;;1793:66:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1869:33:6;;;;;:20;:33;;;;;:40;;-1:-1:-1;;1869:40:6;1905:4;1869:40;;;1718:198::o;12886:393:13:-;-1:-1:-1;;;;;12965:16:13;;12957:61;;;;;-1:-1:-1;;;12957:61:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13037:16;13045:7;13037;:16::i;:::-;13036:17;13028:58;;;;;-1:-1:-1;;;13028:58:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;13097:45;13126:1;13130:2;13134:7;13097:20;:45::i;:::-;-1:-1:-1;;;;;13153:17:13;;;;;;:13;:17;;;;;:30;;13175:7;13153:21;:30::i;:::-;-1:-1:-1;13194:29:13;:12;13211:7;13220:2;13194:16;:29::i;:::-;-1:-1:-1;13239:33:13;;13264:7;;-1:-1:-1;;;;;13239:33:13;;;13256:1;;13239:33;;13256:1;;13239:33;12886:393;;:::o;3592:193:18:-;3695:12;3726:52;3748:6;3756:4;3762:1;3765:12;3695;4869:18;4880:6;4869:10;:18::i;:::-;4861:60;;;;;-1:-1:-1;;;4861:60:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;4992:12;5006:23;5033:6;-1:-1:-1;;;;;5033:11:18;5053:5;5061:4;5033:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5033:33:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4991:75;;;;5083:52;5101:7;5110:10;5122:12;5083:17;:52::i;:::-;5076:59;4619:523;-1:-1:-1;;;;;;;4619:523:18:o;6122:725::-;6237:12;6265:7;6261:580;;;-1:-1:-1;6295:10:18;6288:17;;6261:580;6406:17;;:21;6402:429;;6664:10;6658:17;6724:15;6711:10;6707:2;6703:19;6696:44;6613:145;6796:20;;-1:-1:-1;;;6796:20:18;;;;;;;;;;;;;;;;;6803:12;;6796:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "1718000",
                "executionCost": "1806",
                "totalCost": "1719806"
              },
              "external": {
                "approve(address,uint256)": "infinite",
                "balanceOf(address)": "infinite",
                "baseURI()": "infinite",
                "getApproved(uint256)": "infinite",
                "initialize(string,string)": "infinite",
                "isApprovedForAll(address,address)": "1372",
                "name()": "infinite",
                "ownerOf(uint256)": "infinite",
                "safeTransferFrom(address,address,uint256)": "infinite",
                "safeTransferFrom(address,address,uint256,bytes)": "infinite",
                "setApprovalForAll(address,bool)": "infinite",
                "simulateSafeTransferFrom(address,address,uint256)": "infinite",
                "supportsInterface(bytes4)": "1193",
                "symbol()": "infinite",
                "tokenByIndex(uint256)": "infinite",
                "tokenOfOwnerByIndex(address,uint256)": "infinite",
                "tokenURI(uint256)": "infinite",
                "totalSupply()": "1096",
                "transferFrom(address,address,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {
              "approve(address,uint256)": "095ea7b3",
              "balanceOf(address)": "70a08231",
              "baseURI()": "6c0360eb",
              "getApproved(uint256)": "081812fc",
              "initialize(string,string)": "4cd88b76",
              "isApprovedForAll(address,address)": "e985e9c5",
              "name()": "06fdde03",
              "ownerOf(uint256)": "6352211e",
              "safeTransferFrom(address,address,uint256)": "42842e0e",
              "safeTransferFrom(address,address,uint256,bytes)": "b88d4fde",
              "setApprovalForAll(address,bool)": "a22cb465",
              "simulateSafeTransferFrom(address,address,uint256)": "cb322d46",
              "supportsInterface(bytes4)": "01ffc9a7",
              "symbol()": "95d89b41",
              "tokenByIndex(uint256)": "4f6ccce7",
              "tokenOfOwnerByIndex(address,uint256)": "2f745c59",
              "tokenURI(uint256)": "c87b56dd",
              "totalSupply()": "18160ddd",
              "transferFrom(address,address,uint256)": "23b872dd"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"simulateSafeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenOfOwnerByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"baseURI()\":{\"details\":\"Returns the base URI set via {_setBaseURI}. This will be automatically added as a prefix in {tokenURI} to each token's URI, or to the token ID if no specific URI is set for that token ID.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}. Time complexity O(1), guaranteed to always use less than 30 000 gas.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenByIndex(uint256)\":{\"details\":\"See {IERC721Enumerable-tokenByIndex}.\"},\"tokenOfOwnerByIndex(address,uint256)\":{\"details\":\"See {IERC721Enumerable-tokenOfOwnerByIndex}.\"},\"tokenURI(uint256)\":{\"details\":\"See {IERC721Metadata-tokenURI}.\"},\"totalSupply()\":{\"details\":\"See {IERC721Enumerable-totalSupply}.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/NFT.sol\":\"NFT\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/introspection/ERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC165Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts may inherit from this and call {_registerInterface} to declare\\n * their support of an interface.\\n */\\nabstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Mapping of interface ids to whether or not it's supported.\\n     */\\n    mapping(bytes4 => bool) private _supportedInterfaces;\\n\\n    function __ERC165_init() internal initializer {\\n        __ERC165_init_unchained();\\n    }\\n\\n    function __ERC165_init_unchained() internal initializer {\\n        // Derived contracts need only register support for their own interfaces,\\n        // we register support for ERC165 itself here\\n        _registerInterface(_INTERFACE_ID_ERC165);\\n    }\\n\\n    /**\\n     * @dev See {IERC165-supportsInterface}.\\n     *\\n     * Time complexity O(1), guaranteed to always use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n        return _supportedInterfaces[interfaceId];\\n    }\\n\\n    /**\\n     * @dev Registers the contract as an implementer of the interface defined by\\n     * `interfaceId`. Support of the actual ERC165 interface is automatic and\\n     * registering its interface id is not required.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * Requirements:\\n     *\\n     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).\\n     */\\n    function _registerInterface(bytes4 interfaceId) internal virtual {\\n        require(interfaceId != 0xffffffff, \\\"ERC165: invalid interface id\\\");\\n        _supportedInterfaces[interfaceId] = true;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xc6dbbc2f50a7c104377798a37b2acd1a41c1242544b0bb7a9a7c863f0520eb50\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC721Upgradeable.sol\\\";\\nimport \\\"./IERC721MetadataUpgradeable.sol\\\";\\nimport \\\"./IERC721EnumerableUpgradeable.sol\\\";\\nimport \\\"./IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"../../introspection/ERC165Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/EnumerableSetUpgradeable.sol\\\";\\nimport \\\"../../utils/EnumerableMapUpgradeable.sol\\\";\\nimport \\\"../../utils/StringsUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @title ERC721 Non-Fungible Token Standard basic implementation\\n * @dev see https://eips.ethereum.org/EIPS/eip-721\\n */\\ncontract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable, IERC721EnumerableUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n    using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet;\\n    using EnumerableMapUpgradeable for EnumerableMapUpgradeable.UintToAddressMap;\\n    using StringsUpgradeable for uint256;\\n\\n    // Equals to `bytes4(keccak256(\\\"onERC721Received(address,address,uint256,bytes)\\\"))`\\n    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`\\n    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;\\n\\n    // Mapping from holder address to their (enumerable) set of owned tokens\\n    mapping (address => EnumerableSetUpgradeable.UintSet) private _holderTokens;\\n\\n    // Enumerable mapping from token ids to their owners\\n    EnumerableMapUpgradeable.UintToAddressMap private _tokenOwners;\\n\\n    // Mapping from token ID to approved address\\n    mapping (uint256 => address) private _tokenApprovals;\\n\\n    // Mapping from owner to operator approvals\\n    mapping (address => mapping (address => bool)) private _operatorApprovals;\\n\\n    // Token name\\n    string private _name;\\n\\n    // Token symbol\\n    string private _symbol;\\n\\n    // Optional mapping for token URIs\\n    mapping (uint256 => string) private _tokenURIs;\\n\\n    // Base URI\\n    string private _baseURI;\\n\\n    /*\\n     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231\\n     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e\\n     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3\\n     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc\\n     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465\\n     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5\\n     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd\\n     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e\\n     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde\\n     *\\n     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^\\n     *        0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;\\n\\n    /*\\n     *     bytes4(keccak256('name()')) == 0x06fdde03\\n     *     bytes4(keccak256('symbol()')) == 0x95d89b41\\n     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd\\n     *\\n     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;\\n\\n    /*\\n     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd\\n     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59\\n     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7\\n     *\\n     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;\\n\\n    /**\\n     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\\n     */\\n    function __ERC721_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC165_init_unchained();\\n        __ERC721_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC721_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n\\n        // register the supported interfaces to conform to ERC721 via ERC165\\n        _registerInterface(_INTERFACE_ID_ERC721);\\n        _registerInterface(_INTERFACE_ID_ERC721_METADATA);\\n        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);\\n    }\\n\\n    /**\\n     * @dev See {IERC721-balanceOf}.\\n     */\\n    function balanceOf(address owner) public view virtual override returns (uint256) {\\n        require(owner != address(0), \\\"ERC721: balance query for the zero address\\\");\\n        return _holderTokens[owner].length();\\n    }\\n\\n    /**\\n     * @dev See {IERC721-ownerOf}.\\n     */\\n    function ownerOf(uint256 tokenId) public view virtual override returns (address) {\\n        return _tokenOwners.get(tokenId, \\\"ERC721: owner query for nonexistent token\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC721Metadata-name}.\\n     */\\n    function name() public view virtual override returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev See {IERC721Metadata-symbol}.\\n     */\\n    function symbol() public view virtual override returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev See {IERC721Metadata-tokenURI}.\\n     */\\n    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\\n        require(_exists(tokenId), \\\"ERC721Metadata: URI query for nonexistent token\\\");\\n\\n        string memory _tokenURI = _tokenURIs[tokenId];\\n        string memory base = baseURI();\\n\\n        // If there is no base URI, return the token URI.\\n        if (bytes(base).length == 0) {\\n            return _tokenURI;\\n        }\\n        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).\\n        if (bytes(_tokenURI).length > 0) {\\n            return string(abi.encodePacked(base, _tokenURI));\\n        }\\n        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.\\n        return string(abi.encodePacked(base, tokenId.toString()));\\n    }\\n\\n    /**\\n    * @dev Returns the base URI set via {_setBaseURI}. This will be\\n    * automatically added as a prefix in {tokenURI} to each token's URI, or\\n    * to the token ID if no specific URI is set for that token ID.\\n    */\\n    function baseURI() public view virtual returns (string memory) {\\n        return _baseURI;\\n    }\\n\\n    /**\\n     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.\\n     */\\n    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {\\n        return _holderTokens[owner].at(index);\\n    }\\n\\n    /**\\n     * @dev See {IERC721Enumerable-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds\\n        return _tokenOwners.length();\\n    }\\n\\n    /**\\n     * @dev See {IERC721Enumerable-tokenByIndex}.\\n     */\\n    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {\\n        (uint256 tokenId, ) = _tokenOwners.at(index);\\n        return tokenId;\\n    }\\n\\n    /**\\n     * @dev See {IERC721-approve}.\\n     */\\n    function approve(address to, uint256 tokenId) public virtual override {\\n        address owner = ERC721Upgradeable.ownerOf(tokenId);\\n        require(to != owner, \\\"ERC721: approval to current owner\\\");\\n\\n        require(_msgSender() == owner || ERC721Upgradeable.isApprovedForAll(owner, _msgSender()),\\n            \\\"ERC721: approve caller is not owner nor approved for all\\\"\\n        );\\n\\n        _approve(to, tokenId);\\n    }\\n\\n    /**\\n     * @dev See {IERC721-getApproved}.\\n     */\\n    function getApproved(uint256 tokenId) public view virtual override returns (address) {\\n        require(_exists(tokenId), \\\"ERC721: approved query for nonexistent token\\\");\\n\\n        return _tokenApprovals[tokenId];\\n    }\\n\\n    /**\\n     * @dev See {IERC721-setApprovalForAll}.\\n     */\\n    function setApprovalForAll(address operator, bool approved) public virtual override {\\n        require(operator != _msgSender(), \\\"ERC721: approve to caller\\\");\\n\\n        _operatorApprovals[_msgSender()][operator] = approved;\\n        emit ApprovalForAll(_msgSender(), operator, approved);\\n    }\\n\\n    /**\\n     * @dev See {IERC721-isApprovedForAll}.\\n     */\\n    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\\n        return _operatorApprovals[owner][operator];\\n    }\\n\\n    /**\\n     * @dev See {IERC721-transferFrom}.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) public virtual override {\\n        //solhint-disable-next-line max-line-length\\n        require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: transfer caller is not owner nor approved\\\");\\n\\n        _transfer(from, to, tokenId);\\n    }\\n\\n    /**\\n     * @dev See {IERC721-safeTransferFrom}.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {\\n        safeTransferFrom(from, to, tokenId, \\\"\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC721-safeTransferFrom}.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {\\n        require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: transfer caller is not owner nor approved\\\");\\n        _safeTransfer(from, to, tokenId, _data);\\n    }\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * `_data` is additional data, it has no specified format and it is sent in call to `to`.\\n     *\\n     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\\n     * implement alternative mechanisms to perform token transfer, such as signature-based.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {\\n        _transfer(from, to, tokenId);\\n        require(_checkOnERC721Received(from, to, tokenId, _data), \\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n    }\\n\\n    /**\\n     * @dev Returns whether `tokenId` exists.\\n     *\\n     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\\n     *\\n     * Tokens start existing when they are minted (`_mint`),\\n     * and stop existing when they are burned (`_burn`).\\n     */\\n    function _exists(uint256 tokenId) internal view virtual returns (bool) {\\n        return _tokenOwners.contains(tokenId);\\n    }\\n\\n    /**\\n     * @dev Returns whether `spender` is allowed to manage `tokenId`.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\\n        require(_exists(tokenId), \\\"ERC721: operator query for nonexistent token\\\");\\n        address owner = ERC721Upgradeable.ownerOf(tokenId);\\n        return (spender == owner || getApproved(tokenId) == spender || ERC721Upgradeable.isApprovedForAll(owner, spender));\\n    }\\n\\n    /**\\n     * @dev Safely mints `tokenId` and transfers it to `to`.\\n     *\\n     * Requirements:\\n     d*\\n     * - `tokenId` must not exist.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function _safeMint(address to, uint256 tokenId) internal virtual {\\n        _safeMint(to, tokenId, \\\"\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\\n     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\\n     */\\n    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {\\n        _mint(to, tokenId);\\n        require(_checkOnERC721Received(address(0), to, tokenId, _data), \\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n    }\\n\\n    /**\\n     * @dev Mints `tokenId` and transfers it to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must not exist.\\n     * - `to` cannot be the zero address.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function _mint(address to, uint256 tokenId) internal virtual {\\n        require(to != address(0), \\\"ERC721: mint to the zero address\\\");\\n        require(!_exists(tokenId), \\\"ERC721: token already minted\\\");\\n\\n        _beforeTokenTransfer(address(0), to, tokenId);\\n\\n        _holderTokens[to].add(tokenId);\\n\\n        _tokenOwners.set(tokenId, to);\\n\\n        emit Transfer(address(0), to, tokenId);\\n    }\\n\\n    /**\\n     * @dev Destroys `tokenId`.\\n     * The approval is cleared when the token is burned.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function _burn(uint256 tokenId) internal virtual {\\n        address owner = ERC721Upgradeable.ownerOf(tokenId); // internal owner\\n\\n        _beforeTokenTransfer(owner, address(0), tokenId);\\n\\n        // Clear approvals\\n        _approve(address(0), tokenId);\\n\\n        // Clear metadata (if any)\\n        if (bytes(_tokenURIs[tokenId]).length != 0) {\\n            delete _tokenURIs[tokenId];\\n        }\\n\\n        _holderTokens[owner].remove(tokenId);\\n\\n        _tokenOwners.remove(tokenId);\\n\\n        emit Transfer(owner, address(0), tokenId);\\n    }\\n\\n    /**\\n     * @dev Transfers `tokenId` from `from` to `to`.\\n     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function _transfer(address from, address to, uint256 tokenId) internal virtual {\\n        require(ERC721Upgradeable.ownerOf(tokenId) == from, \\\"ERC721: transfer of token that is not own\\\"); // internal owner\\n        require(to != address(0), \\\"ERC721: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(from, to, tokenId);\\n\\n        // Clear approvals from the previous owner\\n        _approve(address(0), tokenId);\\n\\n        _holderTokens[from].remove(tokenId);\\n        _holderTokens[to].add(tokenId);\\n\\n        _tokenOwners.set(tokenId, to);\\n\\n        emit Transfer(from, to, tokenId);\\n    }\\n\\n    /**\\n     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {\\n        require(_exists(tokenId), \\\"ERC721Metadata: URI set of nonexistent token\\\");\\n        _tokenURIs[tokenId] = _tokenURI;\\n    }\\n\\n    /**\\n     * @dev Internal function to set the base URI for all token IDs. It is\\n     * automatically added as a prefix to the value returned in {tokenURI},\\n     * or to the token ID if {tokenURI} is empty.\\n     */\\n    function _setBaseURI(string memory baseURI_) internal virtual {\\n        _baseURI = baseURI_;\\n    }\\n\\n    /**\\n     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\\n     * The call is not executed if the target address is not a contract.\\n     *\\n     * @param from address representing the previous owner of the given token ID\\n     * @param to target address that will receive the tokens\\n     * @param tokenId uint256 ID of the token to be transferred\\n     * @param _data bytes optional data to send along with the call\\n     * @return bool whether the call correctly returned the expected magic value\\n     */\\n    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)\\n        private returns (bool)\\n    {\\n        if (!to.isContract()) {\\n            return true;\\n        }\\n        bytes memory returndata = to.functionCall(abi.encodeWithSelector(\\n            IERC721ReceiverUpgradeable(to).onERC721Received.selector,\\n            _msgSender(),\\n            from,\\n            tokenId,\\n            _data\\n        ), \\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n        bytes4 retval = abi.decode(returndata, (bytes4));\\n        return (retval == _ERC721_RECEIVED);\\n    }\\n\\n    function _approve(address to, uint256 tokenId) private {\\n        _tokenApprovals[tokenId] = to;\\n        emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId); // internal owner\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any token transfer. This includes minting\\n     * and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be\\n     * transferred to `to`.\\n     * - When `from` is zero, `tokenId` will be minted for `to`.\\n     * - When `to` is zero, ``from``'s `tokenId` will be burned.\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }\\n    uint256[41] private __gap;\\n}\\n\",\"keccak256\":\"0xcb44c1beb756a22dee4756a0d4d0ad21c2e811dcd39de9190797d0bda4433459\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721EnumerableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"./IERC721Upgradeable.sol\\\";\\n\\n/**\\n * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\n */\\ninterface IERC721EnumerableUpgradeable is IERC721Upgradeable {\\n\\n    /**\\n     * @dev Returns the total amount of tokens stored by the contract.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.\\n     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.\\n     */\\n    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);\\n\\n    /**\\n     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.\\n     * Use along with {totalSupply} to enumerate all tokens.\\n     */\\n    function tokenByIndex(uint256 index) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x529f3ab127aace61d7d47f3df7a6a2c42dc79bbb3a0ca459d6a861f33698aee6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721MetadataUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"./IERC721Upgradeable.sol\\\";\\n\\n/**\\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\n */\\ninterface IERC721MetadataUpgradeable is IERC721Upgradeable {\\n\\n    /**\\n     * @dev Returns the token collection name.\\n     */\\n    function name() external view returns (string memory);\\n\\n    /**\\n     * @dev Returns the token collection symbol.\\n     */\\n    function symbol() external view returns (string memory);\\n\\n    /**\\n     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\\n     */\\n    function tokenURI(uint256 tokenId) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0xa981b1f67f60771c18d39e21bad0a2f0f952e2c3faa90b45b982060fc14ee2bd\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/EnumerableMapUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Library for managing an enumerable variant of Solidity's\\n * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]\\n * type.\\n *\\n * Maps have the following properties:\\n *\\n * - Entries are added, removed, and checked for existence in constant time\\n * (O(1)).\\n * - Entries are enumerated in O(n). No guarantees are made on the ordering.\\n *\\n * ```\\n * contract Example {\\n *     // Add the library methods\\n *     using EnumerableMap for EnumerableMap.UintToAddressMap;\\n *\\n *     // Declare a set state variable\\n *     EnumerableMap.UintToAddressMap private myMap;\\n * }\\n * ```\\n *\\n * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are\\n * supported.\\n */\\nlibrary EnumerableMapUpgradeable {\\n    // To implement this library for multiple types with as little code\\n    // repetition as possible, we write it in terms of a generic Map type with\\n    // bytes32 keys and values.\\n    // The Map implementation uses private functions, and user-facing\\n    // implementations (such as Uint256ToAddressMap) are just wrappers around\\n    // the underlying Map.\\n    // This means that we can only create new EnumerableMaps for types that fit\\n    // in bytes32.\\n\\n    struct MapEntry {\\n        bytes32 _key;\\n        bytes32 _value;\\n    }\\n\\n    struct Map {\\n        // Storage of map keys and values\\n        MapEntry[] _entries;\\n\\n        // Position of the entry defined by a key in the `entries` array, plus 1\\n        // because index 0 means a key is not in the map.\\n        mapping (bytes32 => uint256) _indexes;\\n    }\\n\\n    /**\\n     * @dev Adds a key-value pair to a map, or updates the value for an existing\\n     * key. O(1).\\n     *\\n     * Returns true if the key was added to the map, that is if it was not\\n     * already present.\\n     */\\n    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {\\n        // We read and store the key's index to prevent multiple reads from the same storage slot\\n        uint256 keyIndex = map._indexes[key];\\n\\n        if (keyIndex == 0) { // Equivalent to !contains(map, key)\\n            map._entries.push(MapEntry({ _key: key, _value: value }));\\n            // The entry is stored at length-1, but we add 1 to all indexes\\n            // and use 0 as a sentinel value\\n            map._indexes[key] = map._entries.length;\\n            return true;\\n        } else {\\n            map._entries[keyIndex - 1]._value = value;\\n            return false;\\n        }\\n    }\\n\\n    /**\\n     * @dev Removes a key-value pair from a map. O(1).\\n     *\\n     * Returns true if the key was removed from the map, that is if it was present.\\n     */\\n    function _remove(Map storage map, bytes32 key) private returns (bool) {\\n        // We read and store the key's index to prevent multiple reads from the same storage slot\\n        uint256 keyIndex = map._indexes[key];\\n\\n        if (keyIndex != 0) { // Equivalent to contains(map, key)\\n            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one\\n            // in the array, and then remove the last entry (sometimes called as 'swap and pop').\\n            // This modifies the order of the array, as noted in {at}.\\n\\n            uint256 toDeleteIndex = keyIndex - 1;\\n            uint256 lastIndex = map._entries.length - 1;\\n\\n            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs\\n            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.\\n\\n            MapEntry storage lastEntry = map._entries[lastIndex];\\n\\n            // Move the last entry to the index where the entry to delete is\\n            map._entries[toDeleteIndex] = lastEntry;\\n            // Update the index for the moved entry\\n            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based\\n\\n            // Delete the slot where the moved entry was stored\\n            map._entries.pop();\\n\\n            // Delete the index for the deleted slot\\n            delete map._indexes[key];\\n\\n            return true;\\n        } else {\\n            return false;\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns true if the key is in the map. O(1).\\n     */\\n    function _contains(Map storage map, bytes32 key) private view returns (bool) {\\n        return map._indexes[key] != 0;\\n    }\\n\\n    /**\\n     * @dev Returns the number of key-value pairs in the map. O(1).\\n     */\\n    function _length(Map storage map) private view returns (uint256) {\\n        return map._entries.length;\\n    }\\n\\n   /**\\n    * @dev Returns the key-value pair stored at position `index` in the map. O(1).\\n    *\\n    * Note that there are no guarantees on the ordering of entries inside the\\n    * array, and it may change when more entries are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {\\n        require(map._entries.length > index, \\\"EnumerableMap: index out of bounds\\\");\\n\\n        MapEntry storage entry = map._entries[index];\\n        return (entry._key, entry._value);\\n    }\\n\\n    /**\\n     * @dev Tries to returns the value associated with `key`.  O(1).\\n     * Does not revert if `key` is not in the map.\\n     */\\n    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {\\n        uint256 keyIndex = map._indexes[key];\\n        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)\\n        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based\\n    }\\n\\n    /**\\n     * @dev Returns the value associated with `key`.  O(1).\\n     *\\n     * Requirements:\\n     *\\n     * - `key` must be in the map.\\n     */\\n    function _get(Map storage map, bytes32 key) private view returns (bytes32) {\\n        uint256 keyIndex = map._indexes[key];\\n        require(keyIndex != 0, \\\"EnumerableMap: nonexistent key\\\"); // Equivalent to contains(map, key)\\n        return map._entries[keyIndex - 1]._value; // All indexes are 1-based\\n    }\\n\\n    /**\\n     * @dev Same as {_get}, with a custom error message when `key` is not in the map.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {_tryGet}.\\n     */\\n    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {\\n        uint256 keyIndex = map._indexes[key];\\n        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)\\n        return map._entries[keyIndex - 1]._value; // All indexes are 1-based\\n    }\\n\\n    // UintToAddressMap\\n\\n    struct UintToAddressMap {\\n        Map _inner;\\n    }\\n\\n    /**\\n     * @dev Adds a key-value pair to a map, or updates the value for an existing\\n     * key. O(1).\\n     *\\n     * Returns true if the key was added to the map, that is if it was not\\n     * already present.\\n     */\\n    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {\\n        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the key was removed from the map, that is if it was present.\\n     */\\n    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {\\n        return _remove(map._inner, bytes32(key));\\n    }\\n\\n    /**\\n     * @dev Returns true if the key is in the map. O(1).\\n     */\\n    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {\\n        return _contains(map._inner, bytes32(key));\\n    }\\n\\n    /**\\n     * @dev Returns the number of elements in the map. O(1).\\n     */\\n    function length(UintToAddressMap storage map) internal view returns (uint256) {\\n        return _length(map._inner);\\n    }\\n\\n   /**\\n    * @dev Returns the element stored at position `index` in the set. O(1).\\n    * Note that there are no guarantees on the ordering of values inside the\\n    * array, and it may change when more values are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {\\n        (bytes32 key, bytes32 value) = _at(map._inner, index);\\n        return (uint256(key), address(uint160(uint256(value))));\\n    }\\n\\n    /**\\n     * @dev Tries to returns the value associated with `key`.  O(1).\\n     * Does not revert if `key` is not in the map.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {\\n        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));\\n        return (success, address(uint160(uint256(value))));\\n    }\\n\\n    /**\\n     * @dev Returns the value associated with `key`.  O(1).\\n     *\\n     * Requirements:\\n     *\\n     * - `key` must be in the map.\\n     */\\n    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {\\n        return address(uint160(uint256(_get(map._inner, bytes32(key)))));\\n    }\\n\\n    /**\\n     * @dev Same as {get}, with a custom error message when `key` is not in the map.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryGet}.\\n     */\\n    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {\\n        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));\\n    }\\n}\\n\",\"keccak256\":\"0x6a8e34d051fc71ce49a8a47d050c5b7e77909008c6be7d6780ee9ed87d2d3797\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/EnumerableSetUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Library for managing\\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\\n * types.\\n *\\n * Sets have the following properties:\\n *\\n * - Elements are added, removed, and checked for existence in constant time\\n * (O(1)).\\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\\n *\\n * ```\\n * contract Example {\\n *     // Add the library methods\\n *     using EnumerableSet for EnumerableSet.AddressSet;\\n *\\n *     // Declare a set state variable\\n *     EnumerableSet.AddressSet private mySet;\\n * }\\n * ```\\n *\\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\\n * and `uint256` (`UintSet`) are supported.\\n */\\nlibrary EnumerableSetUpgradeable {\\n    // To implement this library for multiple types with as little code\\n    // repetition as possible, we write it in terms of a generic Set type with\\n    // bytes32 values.\\n    // The Set implementation uses private functions, and user-facing\\n    // implementations (such as AddressSet) are just wrappers around the\\n    // underlying Set.\\n    // This means that we can only create new EnumerableSets for types that fit\\n    // in bytes32.\\n\\n    struct Set {\\n        // Storage of set values\\n        bytes32[] _values;\\n\\n        // Position of the value in the `values` array, plus 1 because index 0\\n        // means a value is not in the set.\\n        mapping (bytes32 => uint256) _indexes;\\n    }\\n\\n    /**\\n     * @dev Add a value to a set. O(1).\\n     *\\n     * Returns true if the value was added to the set, that is if it was not\\n     * already present.\\n     */\\n    function _add(Set storage set, bytes32 value) private returns (bool) {\\n        if (!_contains(set, value)) {\\n            set._values.push(value);\\n            // The value is stored at length-1, but we add 1 to all indexes\\n            // and use 0 as a sentinel value\\n            set._indexes[value] = set._values.length;\\n            return true;\\n        } else {\\n            return false;\\n        }\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the value was removed from the set, that is if it was\\n     * present.\\n     */\\n    function _remove(Set storage set, bytes32 value) private returns (bool) {\\n        // We read and store the value's index to prevent multiple reads from the same storage slot\\n        uint256 valueIndex = set._indexes[value];\\n\\n        if (valueIndex != 0) { // Equivalent to contains(set, value)\\n            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\\n            // the array, and then remove the last element (sometimes called as 'swap and pop').\\n            // This modifies the order of the array, as noted in {at}.\\n\\n            uint256 toDeleteIndex = valueIndex - 1;\\n            uint256 lastIndex = set._values.length - 1;\\n\\n            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs\\n            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.\\n\\n            bytes32 lastvalue = set._values[lastIndex];\\n\\n            // Move the last value to the index where the value to delete is\\n            set._values[toDeleteIndex] = lastvalue;\\n            // Update the index for the moved value\\n            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based\\n\\n            // Delete the slot where the moved value was stored\\n            set._values.pop();\\n\\n            // Delete the index for the deleted slot\\n            delete set._indexes[value];\\n\\n            return true;\\n        } else {\\n            return false;\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns true if the value is in the set. O(1).\\n     */\\n    function _contains(Set storage set, bytes32 value) private view returns (bool) {\\n        return set._indexes[value] != 0;\\n    }\\n\\n    /**\\n     * @dev Returns the number of values on the set. O(1).\\n     */\\n    function _length(Set storage set) private view returns (uint256) {\\n        return set._values.length;\\n    }\\n\\n   /**\\n    * @dev Returns the value stored at position `index` in the set. O(1).\\n    *\\n    * Note that there are no guarantees on the ordering of values inside the\\n    * array, and it may change when more values are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function _at(Set storage set, uint256 index) private view returns (bytes32) {\\n        require(set._values.length > index, \\\"EnumerableSet: index out of bounds\\\");\\n        return set._values[index];\\n    }\\n\\n    // Bytes32Set\\n\\n    struct Bytes32Set {\\n        Set _inner;\\n    }\\n\\n    /**\\n     * @dev Add a value to a set. O(1).\\n     *\\n     * Returns true if the value was added to the set, that is if it was not\\n     * already present.\\n     */\\n    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n        return _add(set._inner, value);\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the value was removed from the set, that is if it was\\n     * present.\\n     */\\n    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n        return _remove(set._inner, value);\\n    }\\n\\n    /**\\n     * @dev Returns true if the value is in the set. O(1).\\n     */\\n    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\\n        return _contains(set._inner, value);\\n    }\\n\\n    /**\\n     * @dev Returns the number of values in the set. O(1).\\n     */\\n    function length(Bytes32Set storage set) internal view returns (uint256) {\\n        return _length(set._inner);\\n    }\\n\\n   /**\\n    * @dev Returns the value stored at position `index` in the set. O(1).\\n    *\\n    * Note that there are no guarantees on the ordering of values inside the\\n    * array, and it may change when more values are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\\n        return _at(set._inner, index);\\n    }\\n\\n    // AddressSet\\n\\n    struct AddressSet {\\n        Set _inner;\\n    }\\n\\n    /**\\n     * @dev Add a value to a set. O(1).\\n     *\\n     * Returns true if the value was added to the set, that is if it was not\\n     * already present.\\n     */\\n    function add(AddressSet storage set, address value) internal returns (bool) {\\n        return _add(set._inner, bytes32(uint256(uint160(value))));\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the value was removed from the set, that is if it was\\n     * present.\\n     */\\n    function remove(AddressSet storage set, address value) internal returns (bool) {\\n        return _remove(set._inner, bytes32(uint256(uint160(value))));\\n    }\\n\\n    /**\\n     * @dev Returns true if the value is in the set. O(1).\\n     */\\n    function contains(AddressSet storage set, address value) internal view returns (bool) {\\n        return _contains(set._inner, bytes32(uint256(uint160(value))));\\n    }\\n\\n    /**\\n     * @dev Returns the number of values in the set. O(1).\\n     */\\n    function length(AddressSet storage set) internal view returns (uint256) {\\n        return _length(set._inner);\\n    }\\n\\n   /**\\n    * @dev Returns the value stored at position `index` in the set. O(1).\\n    *\\n    * Note that there are no guarantees on the ordering of values inside the\\n    * array, and it may change when more values are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function at(AddressSet storage set, uint256 index) internal view returns (address) {\\n        return address(uint160(uint256(_at(set._inner, index))));\\n    }\\n\\n\\n    // UintSet\\n\\n    struct UintSet {\\n        Set _inner;\\n    }\\n\\n    /**\\n     * @dev Add a value to a set. O(1).\\n     *\\n     * Returns true if the value was added to the set, that is if it was not\\n     * already present.\\n     */\\n    function add(UintSet storage set, uint256 value) internal returns (bool) {\\n        return _add(set._inner, bytes32(value));\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the value was removed from the set, that is if it was\\n     * present.\\n     */\\n    function remove(UintSet storage set, uint256 value) internal returns (bool) {\\n        return _remove(set._inner, bytes32(value));\\n    }\\n\\n    /**\\n     * @dev Returns true if the value is in the set. O(1).\\n     */\\n    function contains(UintSet storage set, uint256 value) internal view returns (bool) {\\n        return _contains(set._inner, bytes32(value));\\n    }\\n\\n    /**\\n     * @dev Returns the number of values on the set. O(1).\\n     */\\n    function length(UintSet storage set) internal view returns (uint256) {\\n        return _length(set._inner);\\n    }\\n\\n   /**\\n    * @dev Returns the value stored at position `index` in the set. O(1).\\n    *\\n    * Note that there are no guarantees on the ordering of values inside the\\n    * array, and it may change when more values are added or removed.\\n    *\\n    * Requirements:\\n    *\\n    * - `index` must be strictly less than {length}.\\n    */\\n    function at(UintSet storage set, uint256 index) internal view returns (uint256) {\\n        return uint256(_at(set._inner, index));\\n    }\\n}\\n\",\"keccak256\":\"0x20714cf126a1a984613579156d3cbc726db8025d8400e1db1d2bb714edaba335\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary StringsUpgradeable {\\n    /**\\n     * @dev Converts a `uint256` to its ASCII `string` representation.\\n     */\\n    function toString(uint256 value) internal pure returns (string memory) {\\n        // Inspired by OraclizeAPI's implementation - MIT licence\\n        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol\\n\\n        if (value == 0) {\\n            return \\\"0\\\";\\n        }\\n        uint256 temp = value;\\n        uint256 digits;\\n        while (temp != 0) {\\n            digits++;\\n            temp /= 10;\\n        }\\n        bytes memory buffer = new bytes(digits);\\n        uint256 index = digits - 1;\\n        temp = value;\\n        while (temp != 0) {\\n            buffer[index--] = bytes1(uint8(48 + temp % 10));\\n            temp /= 10;\\n        }\\n        return string(buffer);\\n    }\\n}\\n\",\"keccak256\":\"0x8d1ac29b8a8ed3cfebe5d8774b465441ae8931aaca549f84408e0b29a1191964\",\"license\":\"MIT\"},\"contracts/test/NFT.sol\":{\"content\":\"pragma solidity 0.6.12;\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\\\";\\n\\ncontract NFT is ERC721Upgradeable {\\n  function initialize (\\n    string memory name_, string memory symbol_\\n  ) external initializer {\\n    __ERC721_init(name_, symbol_);\\n    _safeMint(msg.sender, 0);\\n  }\\n\\n  function simulateSafeTransferFrom(address from, address to, uint256 tokenId) public {\\n    ERC721Upgradeable.safeTransferFrom(from, to, tokenId);\\n  }\\n}\",\"keccak256\":\"0xa4ebd364250c55601a1a0bc2a04da04913d78b4492a312c6fc0b5c133125488d\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/test/NFT.sol:NFT",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/test/NFT.sol:NFT",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/test/NFT.sol:NFT",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 861,
                "contract": "contracts/test/NFT.sol:NFT",
                "label": "_supportedInterfaces",
                "offset": 0,
                "slot": "51",
                "type": "t_mapping(t_bytes4,t_bool)"
              },
              {
                "astId": 918,
                "contract": "contracts/test/NFT.sol:NFT",
                "label": "__gap",
                "offset": 0,
                "slot": "52",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 2222,
                "contract": "contracts/test/NFT.sol:NFT",
                "label": "_holderTokens",
                "offset": 0,
                "slot": "101",
                "type": "t_mapping(t_address,t_struct(UintSet)4634_storage)"
              },
              {
                "astId": 2224,
                "contract": "contracts/test/NFT.sol:NFT",
                "label": "_tokenOwners",
                "offset": 0,
                "slot": "102",
                "type": "t_struct(UintToAddressMap)4011_storage"
              },
              {
                "astId": 2228,
                "contract": "contracts/test/NFT.sol:NFT",
                "label": "_tokenApprovals",
                "offset": 0,
                "slot": "104",
                "type": "t_mapping(t_uint256,t_address)"
              },
              {
                "astId": 2234,
                "contract": "contracts/test/NFT.sol:NFT",
                "label": "_operatorApprovals",
                "offset": 0,
                "slot": "105",
                "type": "t_mapping(t_address,t_mapping(t_address,t_bool))"
              },
              {
                "astId": 2236,
                "contract": "contracts/test/NFT.sol:NFT",
                "label": "_name",
                "offset": 0,
                "slot": "106",
                "type": "t_string_storage"
              },
              {
                "astId": 2238,
                "contract": "contracts/test/NFT.sol:NFT",
                "label": "_symbol",
                "offset": 0,
                "slot": "107",
                "type": "t_string_storage"
              },
              {
                "astId": 2242,
                "contract": "contracts/test/NFT.sol:NFT",
                "label": "_tokenURIs",
                "offset": 0,
                "slot": "108",
                "type": "t_mapping(t_uint256,t_string_storage)"
              },
              {
                "astId": 2244,
                "contract": "contracts/test/NFT.sol:NFT",
                "label": "_baseURI",
                "offset": 0,
                "slot": "109",
                "type": "t_string_storage"
              },
              {
                "astId": 3145,
                "contract": "contracts/test/NFT.sol:NFT",
                "label": "__gap",
                "offset": 0,
                "slot": "110",
                "type": "t_array(t_uint256)41_storage"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_bytes32)dyn_storage": {
                "base": "t_bytes32",
                "encoding": "dynamic_array",
                "label": "bytes32[]",
                "numberOfBytes": "32"
              },
              "t_array(t_struct(MapEntry)3685_storage)dyn_storage": {
                "base": "t_struct(MapEntry)3685_storage",
                "encoding": "dynamic_array",
                "label": "struct EnumerableMapUpgradeable.MapEntry[]",
                "numberOfBytes": "32"
              },
              "t_array(t_uint256)41_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[41]",
                "numberOfBytes": "1312"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_bytes32": {
                "encoding": "inplace",
                "label": "bytes32",
                "numberOfBytes": "32"
              },
              "t_bytes4": {
                "encoding": "inplace",
                "label": "bytes4",
                "numberOfBytes": "4"
              },
              "t_mapping(t_address,t_bool)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => bool)",
                "numberOfBytes": "32",
                "value": "t_bool"
              },
              "t_mapping(t_address,t_mapping(t_address,t_bool))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => bool))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_bool)"
              },
              "t_mapping(t_address,t_struct(UintSet)4634_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct EnumerableSetUpgradeable.UintSet)",
                "numberOfBytes": "32",
                "value": "t_struct(UintSet)4634_storage"
              },
              "t_mapping(t_bytes32,t_uint256)": {
                "encoding": "mapping",
                "key": "t_bytes32",
                "label": "mapping(bytes32 => uint256)",
                "numberOfBytes": "32",
                "value": "t_uint256"
              },
              "t_mapping(t_bytes4,t_bool)": {
                "encoding": "mapping",
                "key": "t_bytes4",
                "label": "mapping(bytes4 => bool)",
                "numberOfBytes": "32",
                "value": "t_bool"
              },
              "t_mapping(t_uint256,t_address)": {
                "encoding": "mapping",
                "key": "t_uint256",
                "label": "mapping(uint256 => address)",
                "numberOfBytes": "32",
                "value": "t_address"
              },
              "t_mapping(t_uint256,t_string_storage)": {
                "encoding": "mapping",
                "key": "t_uint256",
                "label": "mapping(uint256 => string)",
                "numberOfBytes": "32",
                "value": "t_string_storage"
              },
              "t_string_storage": {
                "encoding": "bytes",
                "label": "string",
                "numberOfBytes": "32"
              },
              "t_struct(Map)3693_storage": {
                "encoding": "inplace",
                "label": "struct EnumerableMapUpgradeable.Map",
                "members": [
                  {
                    "astId": 3688,
                    "contract": "contracts/test/NFT.sol:NFT",
                    "label": "_entries",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_array(t_struct(MapEntry)3685_storage)dyn_storage"
                  },
                  {
                    "astId": 3692,
                    "contract": "contracts/test/NFT.sol:NFT",
                    "label": "_indexes",
                    "offset": 0,
                    "slot": "1",
                    "type": "t_mapping(t_bytes32,t_uint256)"
                  }
                ],
                "numberOfBytes": "64"
              },
              "t_struct(MapEntry)3685_storage": {
                "encoding": "inplace",
                "label": "struct EnumerableMapUpgradeable.MapEntry",
                "members": [
                  {
                    "astId": 3682,
                    "contract": "contracts/test/NFT.sol:NFT",
                    "label": "_key",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_bytes32"
                  },
                  {
                    "astId": 3684,
                    "contract": "contracts/test/NFT.sol:NFT",
                    "label": "_value",
                    "offset": 0,
                    "slot": "1",
                    "type": "t_bytes32"
                  }
                ],
                "numberOfBytes": "64"
              },
              "t_struct(Set)4248_storage": {
                "encoding": "inplace",
                "label": "struct EnumerableSetUpgradeable.Set",
                "members": [
                  {
                    "astId": 4243,
                    "contract": "contracts/test/NFT.sol:NFT",
                    "label": "_values",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_array(t_bytes32)dyn_storage"
                  },
                  {
                    "astId": 4247,
                    "contract": "contracts/test/NFT.sol:NFT",
                    "label": "_indexes",
                    "offset": 0,
                    "slot": "1",
                    "type": "t_mapping(t_bytes32,t_uint256)"
                  }
                ],
                "numberOfBytes": "64"
              },
              "t_struct(UintSet)4634_storage": {
                "encoding": "inplace",
                "label": "struct EnumerableSetUpgradeable.UintSet",
                "members": [
                  {
                    "astId": 4633,
                    "contract": "contracts/test/NFT.sol:NFT",
                    "label": "_inner",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_struct(Set)4248_storage"
                  }
                ],
                "numberOfBytes": "64"
              },
              "t_struct(UintToAddressMap)4011_storage": {
                "encoding": "inplace",
                "label": "struct EnumerableMapUpgradeable.UintToAddressMap",
                "members": [
                  {
                    "astId": 4010,
                    "contract": "contracts/test/NFT.sol:NFT",
                    "label": "_inner",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_struct(Map)3693_storage"
                  }
                ],
                "numberOfBytes": "64"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/test/PeriodicPrizeStrategyDistributorInterface.sol": {
        "PeriodicPrizeStrategyDistributorInterface": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "randomNumber",
                  "type": "uint256"
                }
              ],
              "name": "distribute",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "distribute(uint256)": "91c05b0b"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"randomNumber\",\"type\":\"uint256\"}],\"name\":\"distribute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/PeriodicPrizeStrategyDistributorInterface.sol\":\"PeriodicPrizeStrategyDistributorInterface\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.6.0;\\n\\n/// @title Random Number Generator Interface\\n/// @notice Provides an interface for requesting random numbers from 3rd-party RNG services (Chainlink VRF, Starkware VDF, etc..)\\ninterface RNGInterface {\\n\\n  /// @notice Emitted when a new request for a random number has been submitted\\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\\n  /// @param sender The indexed address of the sender of the request\\n  event RandomNumberRequested(uint32 indexed requestId, address indexed sender);\\n\\n  /// @notice Emitted when an existing request for a random number has been completed\\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\\n  /// @param randomNumber The random number produced by the 3rd-party service\\n  event RandomNumberCompleted(uint32 indexed requestId, uint256 randomNumber);\\n\\n  /// @notice Gets the last request id used by the RNG service\\n  /// @return requestId The last request id used in the last request\\n  function getLastRequestId() external view returns (uint32 requestId);\\n\\n  /// @notice Gets the Fee for making a Request against an RNG service\\n  /// @return feeToken The address of the token that is used to pay fees\\n  /// @return requestFee The fee required to be paid to make a request\\n  function getRequestFee() external view returns (address feeToken, uint256 requestFee);\\n\\n  /// @notice Sends a request for a random number to the 3rd-party service\\n  /// @dev Some services will complete the request immediately, others may have a time-delay\\n  /// @dev Some services require payment in the form of a token, such as $LINK for Chainlink VRF\\n  /// @return requestId The ID of the request used to get the results of the RNG service\\n  /// @return lockBlock The block number at which the RNG service will start generating time-delayed randomness.  The calling contract\\n  /// should \\\"lock\\\" all activity until the result is available via the `requestId`\\n  function requestRandomNumber() external returns (uint32 requestId, uint32 lockBlock);\\n\\n  /// @notice Checks if the request for randomness from the 3rd-party service has completed\\n  /// @dev For time-delayed requests, this function is used to check/confirm completion\\n  /// @param requestId The ID of the request used to get the results of the RNG service\\n  /// @return isCompleted True if the request has completed and a random number is available, false otherwise\\n  function isRequestComplete(uint32 requestId) external view returns (bool isCompleted);\\n\\n  /// @notice Gets the random number produced by the 3rd-party service\\n  /// @param requestId The ID of the request used to get the results of the RNG service\\n  /// @return randomNum The random number\\n  function randomNumber(uint32 requestId) external returns (uint256 randomNum);\\n}\\n\",\"keccak256\":\"0xf917c68439d7476cd226f475e8fce940e0cf1d32cb0ff12e8537072a07f2b1da\",\"license\":\"GPL-3.0\"},\"contracts/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary Constants {\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC721 = 0x80ac58cd;\\n}\",\"keccak256\":\"0x5dc8f8bda4e9668a9ffae6a941774f849adcb368cc2275fd8a91e6ada8fad7fb\",\"license\":\"GPL-3.0\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../external/compound/ICompLike.sol\\\";\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../reserve/ReserveInterface.sol\\\";\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/TokenListenerLibrary.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\nimport \\\"./PrizePoolInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using SafeERC20Upgradeable for IERC721Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    address reserveRegistry,\\n    uint256 maxExitFeeMantissa\\n  );\\n\\n  /// @dev Event emitted when controlled token is added\\n  event ControlledTokenAdded(\\n    ControlledTokenInterface indexed token\\n  );\\n\\n  /// @dev Emitted when reserve is captured.\\n  event ReserveFeeCaptured(\\n    uint256 amount\\n  );\\n\\n  event AwardCaptured(\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when assets are deposited\\n  event Deposited(\\n    address indexed operator,\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount,\\n    address referrer\\n  );\\n\\n  /// @dev Event emitted when interest is awarded to a winner\\n  event Awarded(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are awarded to a winner\\n  event AwardedExternalERC20(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are transferred out\\n  event TransferredExternalERC20(\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC721s are awarded to a winner\\n  event AwardedExternalERC721(\\n    address indexed winner,\\n    address indexed token,\\n    uint256[] tokenIds\\n  );\\n\\n  /// @dev Event emitted when assets are withdrawn instantly\\n  event InstantWithdrawal(\\n    address indexed operator,\\n    address indexed from,\\n    address indexed token,\\n    uint256 amount,\\n    uint256 redeemed,\\n    uint256 exitFee\\n  );\\n\\n  event ReserveWithdrawal(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when the Liquidity Cap is set\\n  event LiquidityCapSet(\\n    uint256 liquidityCap\\n  );\\n\\n  /// @dev Event emitted when the Credit plan is set\\n  event CreditPlanSet(\\n    address token,\\n    uint128 creditLimitMantissa,\\n    uint128 creditRateMantissa\\n  );\\n\\n  /// @dev Event emitted when the Prize Strategy is set\\n  event PrizeStrategySet(\\n    address indexed prizeStrategy\\n  );\\n\\n  /// @dev Emitted when credit is minted\\n  event CreditMinted(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when credit is burned\\n  event CreditBurned(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\\n  event ErrorAwardingExternalERC721(bytes error);\\n\\n\\n  struct CreditPlan {\\n    uint128 creditLimitMantissa;\\n    uint128 creditRateMantissa;\\n  }\\n\\n  struct CreditBalance {\\n    uint192 balance;\\n    uint32 timestamp;\\n    bool initialized;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  /// @dev Reserve to which reserve fees are sent\\n  RegistryInterface public reserveRegistry;\\n\\n  /// @dev An array of all the controlled tokens\\n  ControlledTokenInterface[] internal _tokens;\\n\\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\\n  TokenListenerInterface public prizeStrategy;\\n\\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\\n  /// For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\\n  uint256 public maxExitFeeMantissa;\\n\\n  /// @dev The total funds that have been allocated to the reserve\\n  uint256 public reserveTotalSupply;\\n\\n  /// @dev The total amount of funds that the prize pool can hold.\\n  uint256 public liquidityCap;\\n\\n  /// @dev the The awardable balance\\n  uint256 internal _currentAwardBalance;\\n\\n  /// @dev Stores the credit plan for each token.\\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\\n\\n  /// @dev Stores each users balance of credit per token.\\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\\n\\n  /// @notice Initializes the Prize Pool\\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\\n  /// @param _maxExitFeeMantissa The maximum exit fee size\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_reserveRegistry) != address(0), \\\"PrizePool/reserveRegistry-not-zero\\\");\\n    uint256 controlledTokensLength = _controlledTokens.length;\\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\\n\\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\\n      _addControlledToken(controlledToken, i);\\n    }\\n    __Ownable_init();\\n    __ReentrancyGuard_init();\\n    _setLiquidityCap(uint256(-1));\\n\\n    reserveRegistry = _reserveRegistry;\\n    maxExitFeeMantissa = _maxExitFeeMantissa;\\n\\n    emit Initialized(\\n      address(_reserveRegistry),\\n      maxExitFeeMantissa\\n    );\\n  }\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external override view returns (address) {\\n    return address(_token());\\n  }\\n\\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\\n  /// @return The underlying balance of assets\\n  function balance() external returns (uint256) {\\n    return _balance();\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function canAwardExternal(address _externalToken) external view returns (bool) {\\n    return _canAwardExternal(_externalToken);\\n  }\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    canAddLiquidity(amount)\\n  {\\n    address operator = _msgSender();\\n\\n    _mint(to, amount, controlledToken, referrer);\\n\\n    _token().safeTransferFrom(operator, address(this), amount);\\n    _supply(amount);\\n\\n    emit Deposited(operator, to, controlledToken, amount, referrer);\\n  }\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    returns (uint256)\\n  {\\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n    require(exitFee <= maximumExitFee, \\\"PrizePool/exit-fee-exceeds-user-maximum\\\");\\n\\n    // burn the credit\\n    _burnCredit(from, controlledToken, burnedCredit);\\n\\n    // burn the tickets\\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\\n\\n    // redeem the tickets less the fee\\n    uint256 amountLessFee = amount.sub(exitFee);\\n    uint256 redeemed = _redeem(amountLessFee);\\n\\n    _token().safeTransfer(from, redeemed);\\n\\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\\n\\n    return exitFee;\\n  }\\n\\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\\n  /// @param exitFee The exit fee to check against the limit\\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\\n    if (exitFee > maxFee) {\\n      exitFee = maxFee;\\n    }\\n    return exitFee;\\n  }\\n\\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\\n  /// @param from The address the tokens are being transferred from (0 if minting)\\n  /// @param to The address the tokens are being transferred to (0 if burning)\\n  /// @param amount The amount of tokens being trasferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\\n    if (from != address(0)) {\\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\\n      // first accrue credit for their old balance\\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\\n\\n      if (from != to) {\\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\\n      }\\n\\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\\n    }\\n    if (to != address(0) && to != from) {\\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\\n    }\\n    // if we aren't minting\\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\\n    }\\n  }\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external override view returns (uint256) {\\n    return _currentAwardBalance;\\n  }\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n\\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\\n    uint256 currentBalance = _balance();\\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\\n\\n    if (unaccountedPrizeBalance > 0) {\\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\\n      if (reserveFee > 0) {\\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\\n        emit ReserveFeeCaptured(reserveFee);\\n      }\\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\\n\\n      emit AwardCaptured(unaccountedPrizeBalance);\\n    }\\n\\n    return _currentAwardBalance;\\n  }\\n\\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\\n\\n    uint256 amount = reserveTotalSupply;\\n    reserveTotalSupply = 0;\\n    uint256 redeemed = _redeem(amount);\\n\\n    _token().safeTransfer(address(to), redeemed);\\n\\n    emit ReserveWithdrawal(to, amount);\\n\\n    return redeemed;\\n  }\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external override\\n    onlyPrizeStrategy\\n    onlyControlledToken(controlledToken)\\n  {\\n    if (amount == 0) {\\n      return;\\n    }\\n\\n    require(amount <= _currentAwardBalance, \\\"PrizePool/award-exceeds-avail\\\");\\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\\n\\n    _mint(to, amount, controlledToken, address(0));\\n\\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\\n\\n    emit Awarded(to, controlledToken, amount);\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit TransferredExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit AwardedExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  function _transferOut(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (bool)\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (amount == 0) {\\n      return false;\\n    }\\n\\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\\n\\n    return true;\\n  }\\n\\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\\n  /// @param to The user who is receiving the tokens\\n  /// @param amount The amount of tokens they are receiving\\n  /// @param controlledToken The token that is going to be minted\\n  /// @param referrer The user who referred the minting\\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\\n    if (address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n    ControlledToken(controlledToken).controllerMint(to, amount);\\n  }\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (tokenIds.length == 0) {\\n      return;\\n    }\\n\\n    for (uint256 i = 0; i < tokenIds.length; i++) {\\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\\n\\n      }\\n      catch(bytes memory error){\\n        emit ErrorAwardingExternalERC721(error);\\n      }\\n      \\n    }\\n\\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\\n  }\\n\\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\\n  /// @param amount The prize amount\\n  /// @return The size of the reserve portion of the prize\\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    if (address(reserve) == address(0)) {\\n      return 0;\\n    }\\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\\n    if (reserveRateMantissa == 0) {\\n      return 0;\\n    }\\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\\n  }\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external override\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    )\\n  {\\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n  }\\n\\n  /// @dev Calculates the early exit fee for the given amount\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return Exit fee\\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\\n    return _limitExitFee(\\n      amount,\\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external override\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    durationSeconds =_estimateCreditAccrualTime(\\n      _controlledToken,\\n      _principal,\\n      _interest\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function _estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    internal\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    // interest = credit rate * principal * time\\n    // => time = interest / (credit rate * principal)\\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\\n    if (accruedPerSecond == 0) {\\n      return 0;\\n    }\\n    return _interest.div(accruedPerSecond);\\n  }\\n\\n  /// @notice Burns a users credit.\\n  /// @param user The user whose credit should be burned\\n  /// @param credit The amount of credit to burn\\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\\n\\n    emit CreditBurned(user, controlledToken, credit);\\n  }\\n\\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\\n  /// @param user The user for whom to accrue credit\\n  /// @param controlledToken The controlled token whose balance we are checking\\n  /// @param controlledTokenBalance The balance to use for the user\\n  /// @param extra Additional credit to be added\\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\\n    _updateCreditBalance(\\n      user,\\n      controlledToken,\\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\\n    );\\n  }\\n\\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\\n    uint256 newBalance;\\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\\n    if (!creditBalance.initialized) {\\n      newBalance = 0;\\n    } else {\\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\\n    }\\n    return newBalance;\\n  }\\n\\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\\n\\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\\n      balance: newBalance.toUint128(),\\n      timestamp: _currentTime().toUint32(),\\n      initialized: true\\n    });\\n\\n    if (oldBalance < newBalance) {\\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\\n    } \\n    else if (newBalance < oldBalance) {\\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\\n    }\\n  }\\n\\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\\n  /// @param creditBalance The new credit balance to be checked\\n  /// @return The users new credit balance.  Will not exceed the credit limit.\\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\\n      controlledTokenBalance,\\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\\n    );\\n    if (creditBalance > creditLimit) {\\n      creditBalance = creditLimit;\\n    }\\n\\n    return creditBalance;\\n  }\\n\\n  /// @notice Calculates the accrued interest for a user\\n  /// @param user The user whose credit should be calculated.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\\n  /// @return The credit that has accrued since the last credit update.\\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\\n\\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\\n      return 0;\\n    }\\n\\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\\n  }\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\\n    return _tokenCreditBalances[controlledToken][user].balance;\\n  }\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external override\\n    onlyControlledToken(_controlledToken)\\n    onlyOwner\\n  {\\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\\n      creditLimitMantissa: _creditLimitMantissa,\\n      creditRateMantissa: _creditRateMantissa\\n    });\\n\\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\\n  }\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external override\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    )\\n  {\\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\\n  }\\n\\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The token they are withdrawing\\n  /// @param amount The amount of funds they are withdrawing\\n  /// @return earlyExitFee The additional exit fee that should be charged.\\n  /// @return creditBurned The amount of credit that will be burned\\n  function _calculateEarlyExitFeeLessBurnedCredit(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (\\n      uint256 earlyExitFee,\\n      uint256 creditBurned\\n    )\\n  {\\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\\n    require(controlledTokenBalance >= amount, \\\"PrizePool/insuff-funds\\\");\\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\\n    /*\\n    The credit is used *last*.  Always charge the fees up-front.\\n\\n    How to calculate:\\n\\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\\n\\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\\n    */\\n\\n    // Determine available usable credit based on withdraw amount\\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\\n\\n    uint256 availableCredit;\\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\\n    }\\n\\n    // Determine amount of credit to burn and amount of fees required\\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\\n    earlyExitFee = totalExitFee.sub(creditBurned);\\n  }\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\\n    _setLiquidityCap(_liquidityCap);\\n  }\\n\\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\\n    liquidityCap = _liquidityCap;\\n    emit LiquidityCapSet(_liquidityCap);\\n  }\\n\\n  /// @notice Adds a new controlled token\\n  /// @param _controlledToken The controlled token to add.\\n  /// @param index The index to add the controlledToken\\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\\n    require(_controlledToken.controller() == this, \\\"PrizePool/token-ctrlr-mismatch\\\");\\n    \\n    _tokens[index] = _controlledToken;\\n    emit ControlledTokenAdded(_controlledToken);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\\n    _setPrizeStrategy(_prizeStrategy);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\\n    require(address(_prizeStrategy) != address(0), \\\"PrizePool/prizeStrategy-not-zero\\\");\\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PrizePool/prizeStrategy-invalid\\\");\\n    prizeStrategy = _prizeStrategy;\\n\\n    emit PrizeStrategySet(address(_prizeStrategy));\\n  }\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\\n    return _tokens;\\n  }\\n\\n  /// @dev Gets the current time as represented by the current block\\n  /// @return The timestamp of the current block\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external override view returns (uint256) {\\n    return _tokenTotalSupply();\\n  }\\n\\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\\n  /// @param to The address to delegate to \\n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\\n    if (compLike.balanceOf(address(this)) > 0) {\\n      compLike.delegate(to);\\n    }\\n  }\\n  \\n  /// @notice Required for ERC721 safe token transfers from smart contracts.\\n  /// @param operator The address that acts on behalf of the owner\\n  /// @param from The current owner of the NFT\\n  /// @param tokenId The NFT to transfer\\n  /// @param data Additional data with no specified format, sent in call to `_to`.\\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function _tokenTotalSupply() internal view returns (uint256) {\\n    uint256 total = reserveTotalSupply;\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \\n    uint256 tokensLength = tokens.length;\\n    \\n    for(uint256 i = 0; i < tokensLength; i++){\\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\\n    }\\n\\n    return total;\\n  }\\n\\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\\n  }\\n\\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\\n    uint256 tokensLength = tokens.length;\\n\\n    for(uint256 i = 0; i < tokensLength; i++) {\\n      if(tokens[i] == controlledToken) return true;\\n    }\\n    return false;\\n  }\\n  \\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\\n    return _isControlled(controlledToken);\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function _token() internal virtual view returns (IERC20Upgradeable);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal virtual returns (uint256);\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal virtual;\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\\n\\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  modifier onlyControlledToken(address controlledToken) {\\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \\\"PrizePool/unknown-token\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure caller is the prize-strategy\\n  modifier onlyPrizeStrategy() {\\n    require(_msgSender() == address(prizeStrategy), \\\"PrizePool/only-prizeStrategy\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\\n  modifier canAddLiquidity(uint256 _amount) {\\n    require(_canAddLiquidity(_amount), \\\"PrizePool/exceeds-liquidity-cap\\\");\\n    _;\\n  }\\n\\n  modifier onlyReserve() {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    require(address(reserve) == msg.sender, \\\"PrizePool/only-reserve\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x386ebc1c80ab4424f14125e716dd12641ff933b475bf1082b7b1a6eee4a969c3\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListener.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./BeforeAwardListenerInterface.sol\\\";\\nimport \\\"../Constants.sol\\\";\\nimport \\\"./BeforeAwardListenerLibrary.sol\\\";\\n\\nabstract contract BeforeAwardListener is BeforeAwardListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == BeforeAwardListenerLibrary.ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER\\n    );\\n  }\\n}\",\"keccak256\":\"0x5da2a7332421d6136d793ef55410c2da63a7fb719e8522697f78ac4c50391505\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @notice The interface for the Periodic Prize Strategy before award listener.  This listener will be called immediately before the award is distributed.\\ninterface BeforeAwardListenerInterface is IERC165Upgradeable {\\n  /// @notice Called immediately before the award is distributed\\n  function beforePrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x96145efe8fc65aff97d11ffaf0905d53baf4b87c4a575a84d691804468f12083\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary BeforeAwardListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforePrizePoolAwarded(uint256,uint256)')) == 0x4cdf9c3e\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER = 0x4cdf9c3e;\\n}\",\"keccak256\":\"0xeac08a7b8e2e7d508a0af89c05c31c36e2b060674d05dfa9a5016cf2d12cf500\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategy.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\\\";\\nimport \\\"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../token/TokenListener.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TicketInterface.sol\\\";\\nimport \\\"../prize-pool/PrizePool.sol\\\";\\nimport \\\"../Constants.sol\\\";\\nimport \\\"./PeriodicPrizeStrategyListenerInterface.sol\\\";\\nimport \\\"./PeriodicPrizeStrategyListenerLibrary.sol\\\";\\nimport \\\"./BeforeAwardListener.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\nabstract contract PeriodicPrizeStrategy is Initializable,\\n                                           OwnableUpgradeable,\\n                                           TokenListener {\\n\\n  using SafeMathUpgradeable for uint256;\\n  using SafeMathUpgradeable for uint16;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using AddressUpgradeable for address;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  uint256 internal constant ETHEREUM_BLOCK_TIME_ESTIMATE_MANTISSA = 13.4 ether;\\n\\n  event PrizePoolOpened(\\n    address indexed operator,\\n    uint256 indexed prizePeriodStartedAt\\n  );\\n\\n  event RngRequestFailed();\\n\\n  event PrizePoolAwardStarted(\\n    address indexed operator,\\n    address indexed prizePool,\\n    uint32 indexed rngRequestId,\\n    uint32 rngLockBlock\\n  );\\n\\n  event PrizePoolAwardCancelled(\\n    address indexed operator,\\n    address indexed prizePool,\\n    uint32 indexed rngRequestId,\\n    uint32 rngLockBlock\\n  );\\n\\n  event PrizePoolAwarded(\\n    address indexed operator,\\n    uint256 randomNumber\\n  );\\n\\n  event RngServiceUpdated(\\n    RNGInterface indexed rngService\\n  );\\n\\n  event TokenListenerUpdated(\\n    TokenListenerInterface indexed tokenListener\\n  );\\n\\n  event RngRequestTimeoutSet(\\n    uint32 rngRequestTimeout\\n  );\\n\\n  event PrizePeriodSecondsUpdated(\\n    uint256 prizePeriodSeconds\\n  );\\n\\n  event BeforeAwardListenerSet(\\n    BeforeAwardListenerInterface indexed beforeAwardListener\\n  );\\n\\n  event PeriodicPrizeStrategyListenerSet(\\n    PeriodicPrizeStrategyListenerInterface indexed periodicPrizeStrategyListener\\n  );\\n\\n  event ExternalErc721AwardAdded(\\n    IERC721Upgradeable indexed externalErc721,\\n    uint256[] tokenIds\\n  );\\n\\n  event ExternalErc20AwardAdded(\\n    IERC20Upgradeable indexed externalErc20\\n  );\\n\\n  event ExternalErc721AwardRemoved(\\n    IERC721Upgradeable indexed externalErc721Award\\n  );\\n\\n  event ExternalErc20AwardRemoved(\\n    IERC20Upgradeable indexed externalErc20Award\\n  );\\n\\n  event Initialized(\\n    uint256 prizePeriodStart,\\n    uint256 prizePeriodSeconds,\\n    PrizePool indexed prizePool,\\n    TicketInterface ticket,\\n    IERC20Upgradeable sponsorship,\\n    RNGInterface rng,\\n    IERC20Upgradeable[] externalErc20Awards\\n  );\\n\\n  struct RngRequest {\\n    uint32 id;\\n    uint32 lockBlock;\\n    uint32 requestedAt;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  // Comptroller\\n  TokenListenerInterface public tokenListener;\\n\\n  // Contract Interfaces\\n  PrizePool public prizePool;\\n  TicketInterface public ticket;\\n  IERC20Upgradeable public sponsorship;\\n  RNGInterface public rng;\\n\\n  // Current RNG Request\\n  RngRequest internal rngRequest;\\n\\n  /// @notice RNG Request Timeout.  In fact, this is really a \\\"complete award\\\" timeout.\\n  /// If the rng completes the award can still be cancelled.\\n  uint32 public rngRequestTimeout;\\n\\n  // Prize period\\n  uint256 public prizePeriodSeconds;\\n  uint256 public prizePeriodStartedAt;\\n\\n  // External tokens awarded as part of prize\\n  MappedSinglyLinkedList.Mapping internal externalErc20s;\\n  MappedSinglyLinkedList.Mapping internal externalErc721s;\\n\\n  // External NFT token IDs to be awarded\\n  //   NFT Address => TokenIds\\n  mapping (IERC721Upgradeable => uint256[]) internal externalErc721TokenIds;\\n\\n  /// @notice A listener that is called before the prize is awarded\\n  BeforeAwardListenerInterface public beforeAwardListener;\\n\\n  /// @notice A listener that is called after the prize is awarded\\n  PeriodicPrizeStrategyListenerInterface public periodicPrizeStrategyListener;\\n\\n  /// @notice Initializes a new strategy\\n  /// @param _prizePeriodStart The starting timestamp of the prize period.\\n  /// @param _prizePeriodSeconds The duration of the prize period in seconds\\n  /// @param _prizePool The prize pool to award\\n  /// @param _ticket The ticket to use to draw winners\\n  /// @param _sponsorship The sponsorship token\\n  /// @param _rng The RNG service to use\\n  function initialize (\\n    uint256 _prizePeriodStart,\\n    uint256 _prizePeriodSeconds,\\n    PrizePool _prizePool,\\n    TicketInterface _ticket,\\n    IERC20Upgradeable _sponsorship,\\n    RNGInterface _rng,\\n    IERC20Upgradeable[] memory externalErc20Awards\\n  ) public initializer {\\n    require(address(_prizePool) != address(0), \\\"PeriodicPrizeStrategy/prize-pool-not-zero\\\");\\n    require(address(_ticket) != address(0), \\\"PeriodicPrizeStrategy/ticket-not-zero\\\");\\n    require(address(_sponsorship) != address(0), \\\"PeriodicPrizeStrategy/sponsorship-not-zero\\\");\\n    require(address(_rng) != address(0), \\\"PeriodicPrizeStrategy/rng-not-zero\\\");\\n    prizePool = _prizePool;\\n    ticket = _ticket;\\n    rng = _rng;\\n    sponsorship = _sponsorship;\\n    _setPrizePeriodSeconds(_prizePeriodSeconds);\\n\\n    __Ownable_init();\\n\\n    externalErc20s.initialize();\\n    for (uint256 i = 0; i < externalErc20Awards.length; i++) {\\n      _addExternalErc20Award(externalErc20Awards[i]);\\n    }\\n\\n    prizePeriodSeconds = _prizePeriodSeconds;\\n    prizePeriodStartedAt = _prizePeriodStart;\\n\\n    externalErc721s.initialize();\\n\\n    // 30 min timeout\\n    _setRngRequestTimeout(1800);\\n\\n    emit Initialized(\\n      _prizePeriodStart,\\n      _prizePeriodSeconds,\\n      _prizePool,\\n      _ticket,\\n      _sponsorship,\\n      _rng,\\n      externalErc20Awards\\n    );\\n    emit PrizePoolOpened(_msgSender(), prizePeriodStartedAt);\\n  }\\n\\n  function _distribute(uint256 randomNumber) internal virtual;\\n\\n  /// @notice Calculates and returns the currently accrued prize\\n  /// @return The current prize size\\n  function currentPrize() public view returns (uint256) {\\n    return prizePool.awardBalance();\\n  }\\n\\n  /// @notice Allows the owner to set the token listener\\n  /// @param _tokenListener A contract that implements the token listener interface.\\n  function setTokenListener(TokenListenerInterface _tokenListener) external onlyOwner requireAwardNotInProgress {\\n    require(address(0) == address(_tokenListener) || address(_tokenListener).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PeriodicPrizeStrategy/token-listener-invalid\\\");\\n\\n    tokenListener = _tokenListener;\\n\\n    emit TokenListenerUpdated(tokenListener);\\n  }\\n\\n  /// @notice Estimates the remaining blocks until the prize given a number of seconds per block\\n  /// @param secondsPerBlockMantissa The number of seconds per block to use for the calculation.  Should be a fixed point 18 number like Ether.\\n  /// @return The estimated number of blocks remaining until the prize can be awarded.\\n  function estimateRemainingBlocksToPrize(uint256 secondsPerBlockMantissa) public view returns (uint256) {\\n    return FixedPoint.divideUintByMantissa(\\n      _prizePeriodRemainingSeconds(),\\n      secondsPerBlockMantissa\\n    );\\n  }\\n\\n  /// @notice Returns the number of seconds remaining until the prize can be awarded.\\n  /// @return The number of seconds remaining until the prize can be awarded.\\n  function prizePeriodRemainingSeconds() external view returns (uint256) {\\n    return _prizePeriodRemainingSeconds();\\n  }\\n\\n  /// @notice Returns the number of seconds remaining until the prize can be awarded.\\n  /// @return The number of seconds remaining until the prize can be awarded.\\n  function _prizePeriodRemainingSeconds() internal view returns (uint256) {\\n    uint256 endAt = _prizePeriodEndAt();\\n    uint256 time = _currentTime();\\n    if (time > endAt) {\\n      return 0;\\n    }\\n    return endAt.sub(time);\\n  }\\n\\n  /// @notice Returns whether the prize period is over\\n  /// @return True if the prize period is over, false otherwise\\n  function isPrizePeriodOver() external view returns (bool) {\\n    return _isPrizePeriodOver();\\n  }\\n\\n  /// @notice Returns whether the prize period is over\\n  /// @return True if the prize period is over, false otherwise\\n  function _isPrizePeriodOver() internal view returns (bool) {\\n    return _currentTime() >= _prizePeriodEndAt();\\n  }\\n\\n  /// @notice Awards collateral as tickets to a user\\n  /// @param user Recipient of minted tokens\\n  /// @param amount Amount of minted tokens\\n  function _awardTickets(address user, uint256 amount) internal {\\n    prizePool.award(user, amount, address(ticket));\\n  }\\n  \\n  /// @notice Mints ticket or sponsorship tokens for user.\\n  /// @dev Mints ticket or sponsorship tokens by looking up the address in the prizePool.tokens mapping. \\n  /// @param user Recipient of minted tokens\\n  /// @param amount Amount of minted tokens\\n  /// @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\\n  function _awardToken(address user, uint256 amount, uint8 tokenIndex) internal {\\n    ControlledTokenInterface[] memory _controlledTokens = prizePool.tokens();\\n    require(tokenIndex <= _controlledTokens.length, \\\"PeriodicPrizeStrategy/award-invalid-token-index\\\");\\n    ControlledTokenInterface _token = _controlledTokens[tokenIndex];\\n    prizePool.award(user, amount, address(_token));\\n  }\\n\\n  /// @notice Awards all external tokens with non-zero balances to the given user.  The external tokens must be held by the PrizePool contract.\\n  /// @param winner The user to transfer the tokens to\\n  function _awardAllExternalTokens(address winner) internal {\\n    _awardExternalErc20s(winner);\\n    _awardExternalErc721s(winner);\\n  }\\n\\n  /// @notice Awards all external ERC20 tokens with non-zero balances to the given user.\\n  /// The external tokens must be held by the PrizePool contract.\\n  /// @param winner The user to transfer the tokens to\\n  function _awardExternalErc20s(address winner) internal {\\n    address currentToken = externalErc20s.start();\\n    while (currentToken != address(0) && currentToken != externalErc20s.end()) {\\n      uint256 balance = IERC20Upgradeable(currentToken).balanceOf(address(prizePool));\\n      if (balance > 0) {\\n        prizePool.awardExternalERC20(winner, currentToken, balance);\\n      }\\n      currentToken = externalErc20s.next(currentToken);\\n    }\\n  }\\n\\n  /// @notice Awards all external ERC721 tokens to the given user.\\n  /// The external tokens must be held by the PrizePool contract.\\n  /// @dev The list of ERC721s is reset after every award\\n  /// @param winner The user to transfer the tokens to\\n  function _awardExternalErc721s(address winner) internal {\\n    address currentToken = externalErc721s.start();\\n    while (currentToken != address(0) && currentToken != externalErc721s.end()) {\\n      uint256 balance = IERC721Upgradeable(currentToken).balanceOf(address(prizePool));\\n      if (balance > 0) {\\n        prizePool.awardExternalERC721(winner, currentToken, externalErc721TokenIds[IERC721Upgradeable(currentToken)]);\\n        _removeExternalErc721AwardTokens(IERC721Upgradeable(currentToken));\\n      }\\n      currentToken = externalErc721s.next(currentToken);\\n    }\\n    externalErc721s.clearAll();\\n  }\\n\\n  /// @notice Returns the timestamp at which the prize period ends\\n  /// @return The timestamp at which the prize period ends.\\n  function prizePeriodEndAt() external view returns (uint256) {\\n    // current prize started at is non-inclusive, so add one\\n    return _prizePeriodEndAt();\\n  }\\n\\n  /// @notice Returns the timestamp at which the prize period ends\\n  /// @return The timestamp at which the prize period ends.\\n  function _prizePeriodEndAt() internal view returns (uint256) {\\n    // current prize started at is non-inclusive, so add one\\n    return prizePeriodStartedAt.add(prizePeriodSeconds);\\n  }\\n\\n  /// @notice Called by the PrizePool for transfers of controlled tokens\\n  /// @dev Note that this is only for *transfers*, not mints or burns\\n  /// @param controlledToken The type of collateral that is being sent\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external override onlyPrizePool {\\n    require(from != to, \\\"PeriodicPrizeStrategy/transfer-to-self\\\");\\n\\n    if (controlledToken == address(ticket)) {\\n      _requireAwardNotInProgress();\\n    }\\n\\n    if (address(tokenListener) != address(0)) {\\n      tokenListener.beforeTokenTransfer(from, to, amount, controlledToken);\\n    }\\n  }\\n\\n  /// @notice Called by the PrizePool when minting controlled tokens\\n  /// @param controlledToken The type of collateral that is being minted\\n  function beforeTokenMint(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external\\n    override\\n    onlyPrizePool\\n  {\\n    if (controlledToken == address(ticket)) {\\n      _requireAwardNotInProgress();\\n    }\\n    if (address(tokenListener) != address(0)) {\\n      tokenListener.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n  }\\n\\n  /// @notice returns the current time.  Used for testing.\\n  /// @return The current time (block.timestamp)\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice returns the current time.  Used for testing.\\n  /// @return The current time (block.timestamp)\\n  function _currentBlock() internal virtual view returns (uint256) {\\n    return block.number;\\n  }\\n\\n  /// @notice Starts the award process by starting random number request.  The prize period must have ended.\\n  /// @dev The RNG-Request-Fee is expected to be held within this contract before calling this function\\n  function startAward() external requireCanStartAward {\\n    (address feeToken, uint256 requestFee) = rng.getRequestFee();\\n    if (feeToken != address(0) && requestFee > 0) {\\n      IERC20Upgradeable(feeToken).safeApprove(address(rng), requestFee);\\n    }\\n\\n    (uint32 requestId, uint32 lockBlock) = rng.requestRandomNumber();\\n    rngRequest.id = requestId;\\n    rngRequest.lockBlock = lockBlock;\\n    rngRequest.requestedAt = _currentTime().toUint32();\\n\\n    emit PrizePoolAwardStarted(_msgSender(), address(prizePool), requestId, lockBlock);\\n  }\\n\\n  /// @notice Can be called by anyone to unlock the tickets if the RNG has timed out.\\n  function cancelAward() public {\\n    require(isRngTimedOut(), \\\"PeriodicPrizeStrategy/rng-not-timedout\\\");\\n    uint32 requestId = rngRequest.id;\\n    uint32 lockBlock = rngRequest.lockBlock;\\n    delete rngRequest;\\n    emit RngRequestFailed();\\n    emit PrizePoolAwardCancelled(msg.sender, address(prizePool), requestId, lockBlock);\\n  }\\n\\n  /// @notice Completes the award process and awards the winners.  The random number must have been requested and is now available.\\n  function completeAward() external requireCanCompleteAward {\\n    uint256 randomNumber = rng.randomNumber(rngRequest.id);\\n    delete rngRequest;\\n\\n    if (address(beforeAwardListener) != address(0)) {\\n      beforeAwardListener.beforePrizePoolAwarded(randomNumber, prizePeriodStartedAt);\\n    }\\n    _distribute(randomNumber);\\n    if (address(periodicPrizeStrategyListener) != address(0)) {\\n      periodicPrizeStrategyListener.afterPrizePoolAwarded(randomNumber, prizePeriodStartedAt);\\n    }\\n\\n    // to avoid clock drift, we should calculate the start time based on the previous period start time.\\n    prizePeriodStartedAt = _calculateNextPrizePeriodStartTime(_currentTime());\\n\\n    emit PrizePoolAwarded(_msgSender(), randomNumber);\\n    emit PrizePoolOpened(_msgSender(), prizePeriodStartedAt);\\n  }\\n\\n  /// @notice Allows the owner to set a listener that is triggered immediately before the award is distributed\\n  /// @dev The listener must implement ERC165 and the BeforeAwardListenerInterface\\n  /// @param _beforeAwardListener The address of the listener contract\\n  function setBeforeAwardListener(BeforeAwardListenerInterface _beforeAwardListener) external onlyOwner requireAwardNotInProgress {\\n    require(\\n      address(0) == address(_beforeAwardListener) || address(_beforeAwardListener).supportsInterface(BeforeAwardListenerLibrary.ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER),\\n      \\\"PeriodicPrizeStrategy/beforeAwardListener-invalid\\\"\\n    );\\n\\n    beforeAwardListener = _beforeAwardListener;\\n\\n    emit BeforeAwardListenerSet(_beforeAwardListener);\\n  }\\n\\n  /// @notice Allows the owner to set a listener for prize strategy callbacks.\\n  /// @param _periodicPrizeStrategyListener The address of the listener contract\\n  function setPeriodicPrizeStrategyListener(PeriodicPrizeStrategyListenerInterface _periodicPrizeStrategyListener) external onlyOwner requireAwardNotInProgress {\\n    require(\\n      address(0) == address(_periodicPrizeStrategyListener) || address(_periodicPrizeStrategyListener).supportsInterface(PeriodicPrizeStrategyListenerLibrary.ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER),\\n      \\\"PeriodicPrizeStrategy/prizeStrategyListener-invalid\\\"\\n    );\\n\\n    periodicPrizeStrategyListener = _periodicPrizeStrategyListener;\\n\\n    emit PeriodicPrizeStrategyListenerSet(_periodicPrizeStrategyListener);\\n  }\\n\\n  function _calculateNextPrizePeriodStartTime(uint256 currentTime) internal view returns (uint256) {\\n    uint256 elapsedPeriods = currentTime.sub(prizePeriodStartedAt).div(prizePeriodSeconds);\\n    return prizePeriodStartedAt.add(elapsedPeriods.mul(prizePeriodSeconds));\\n  }\\n\\n  /// @notice Calculates when the next prize period will start\\n  /// @param currentTime The timestamp to use as the current time\\n  /// @return The timestamp at which the next prize period would start\\n  function calculateNextPrizePeriodStartTime(uint256 currentTime) external view returns (uint256) {\\n    return _calculateNextPrizePeriodStartTime(currentTime);\\n  }\\n\\n  /// @notice Returns whether an award process can be started\\n  /// @return True if an award can be started, false otherwise.\\n  function canStartAward() external view returns (bool) {\\n    return _isPrizePeriodOver() && !isRngRequested();\\n  }\\n\\n  /// @notice Returns whether an award process can be completed\\n  /// @return True if an award can be completed, false otherwise.\\n  function canCompleteAward() external view returns (bool) {\\n    return isRngRequested() && isRngCompleted();\\n  }\\n\\n  /// @notice Returns whether a random number has been requested\\n  /// @return True if a random number has been requested, false otherwise.\\n  function isRngRequested() public view returns (bool) {\\n    return rngRequest.id != 0;\\n  }\\n\\n  /// @notice Returns whether the random number request has completed.\\n  /// @return True if a random number request has completed, false otherwise.\\n  function isRngCompleted() public view returns (bool) {\\n    return rng.isRequestComplete(rngRequest.id);\\n  }\\n\\n  /// @notice Returns the block number that the current RNG request has been locked to\\n  /// @return The block number that the RNG request is locked to\\n  function getLastRngLockBlock() external view returns (uint32) {\\n    return rngRequest.lockBlock;\\n  }\\n\\n  /// @notice Returns the current RNG Request ID\\n  /// @return The current Request ID\\n  function getLastRngRequestId() external view returns (uint32) {\\n    return rngRequest.id;\\n  }\\n\\n  /// @notice Sets the RNG service that the Prize Strategy is connected to\\n  /// @param rngService The address of the new RNG service interface\\n  function setRngService(RNGInterface rngService) external onlyOwner requireAwardNotInProgress {\\n    require(!isRngRequested(), \\\"PeriodicPrizeStrategy/rng-in-flight\\\");\\n\\n    rng = rngService;\\n    emit RngServiceUpdated(rngService);\\n  }\\n\\n  /// @notice Allows the owner to set the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\\n  /// @param _rngRequestTimeout The RNG request timeout in seconds.\\n  function setRngRequestTimeout(uint32 _rngRequestTimeout) external onlyOwner requireAwardNotInProgress {\\n    _setRngRequestTimeout(_rngRequestTimeout);\\n  }\\n\\n  /// @notice Sets the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\\n  /// @param _rngRequestTimeout The RNG request timeout in seconds.\\n  function _setRngRequestTimeout(uint32 _rngRequestTimeout) internal {\\n    require(_rngRequestTimeout > 60, \\\"PeriodicPrizeStrategy/rng-timeout-gt-60-secs\\\");\\n    rngRequestTimeout = _rngRequestTimeout;\\n    emit RngRequestTimeoutSet(rngRequestTimeout);\\n  }\\n\\n  /// @notice Allows the owner to set the prize period in seconds.\\n  /// @param _prizePeriodSeconds The new prize period in seconds.  Must be greater than zero.\\n  function setPrizePeriodSeconds(uint256 _prizePeriodSeconds) external onlyOwner requireAwardNotInProgress {\\n    _setPrizePeriodSeconds(_prizePeriodSeconds);\\n  }\\n\\n  /// @notice Sets the prize period in seconds.\\n  /// @param _prizePeriodSeconds The new prize period in seconds.  Must be greater than zero.\\n  function _setPrizePeriodSeconds(uint256 _prizePeriodSeconds) internal {\\n    require(_prizePeriodSeconds > 0, \\\"PeriodicPrizeStrategy/prize-period-greater-than-zero\\\");\\n    prizePeriodSeconds = _prizePeriodSeconds;\\n\\n    emit PrizePeriodSecondsUpdated(prizePeriodSeconds);\\n  }\\n\\n  /// @notice Gets the current list of External ERC20 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC20 token addresses\\n  function getExternalErc20Awards() external view returns (address[] memory) {\\n    return externalErc20s.addressArray();\\n  }\\n\\n  /// @notice Adds an external ERC20 token type as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can assign external tokens,\\n  /// and they must be approved by the Prize-Pool\\n  /// @param _externalErc20 The address of an ERC20 token to be awarded\\n  function addExternalErc20Award(IERC20Upgradeable _externalErc20) external onlyOwnerOrListener requireAwardNotInProgress {\\n    _addExternalErc20Award(_externalErc20);\\n  }\\n\\n  function _addExternalErc20Award(IERC20Upgradeable _externalErc20) internal {\\n    require(address(_externalErc20).isContract(), \\\"PeriodicPrizeStrategy/erc20-null\\\");\\n    require(prizePool.canAwardExternal(address(_externalErc20)), \\\"PeriodicPrizeStrategy/cannot-award-external\\\");\\n    (bool succeeded, bytes memory returnValue) = address(_externalErc20).staticcall(abi.encodeWithSignature(\\\"totalSupply()\\\"));\\n    require(succeeded, \\\"PeriodicPrizeStrategy/erc20-invalid\\\");\\n    externalErc20s.addAddress(address(_externalErc20));\\n    emit ExternalErc20AwardAdded(_externalErc20);\\n  }\\n\\n  function addExternalErc20Awards(IERC20Upgradeable[] calldata _externalErc20s) external onlyOwnerOrListener requireAwardNotInProgress {\\n    for (uint256 i = 0; i < _externalErc20s.length; i++) {\\n      _addExternalErc20Award(_externalErc20s[i]);\\n    }\\n  }\\n\\n  /// @notice Removes an external ERC20 token type as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can remove external tokens\\n  /// @param _externalErc20 The address of an ERC20 token to be removed\\n  /// @param _prevExternalErc20 The address of the previous ERC20 token in the `externalErc20s` list.\\n  /// If the ERC20 is the first address, then the previous address is the SENTINEL address: 0x0000000000000000000000000000000000000001\\n  function removeExternalErc20Award(IERC20Upgradeable _externalErc20, IERC20Upgradeable _prevExternalErc20) external onlyOwner requireAwardNotInProgress {\\n    externalErc20s.removeAddress(address(_prevExternalErc20), address(_externalErc20));\\n    emit ExternalErc20AwardRemoved(_externalErc20);\\n  }\\n\\n  /// @notice Gets the current list of External ERC721 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC721 token addresses\\n  function getExternalErc721Awards() external view returns (address[] memory) {\\n    return externalErc721s.addressArray();\\n  }\\n\\n  /// @notice Gets the current list of External ERC721 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC721 token addresses\\n  function getExternalErc721AwardTokenIds(IERC721Upgradeable _externalErc721) external view returns (uint256[] memory) {\\n    return externalErc721TokenIds[_externalErc721];\\n  }\\n\\n  /// @notice Adds an external ERC721 token as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can assign external tokens,\\n  /// and they must be approved by the Prize-Pool\\n  /// NOTE: The NFT must already be owned by the Prize-Pool\\n  /// @param _externalErc721 The address of an ERC721 token to be awarded\\n  /// @param _tokenIds An array of token IDs of the ERC721 to be awarded\\n  function addExternalErc721Award(IERC721Upgradeable _externalErc721, uint256[] calldata _tokenIds) external onlyOwnerOrListener requireAwardNotInProgress {\\n    require(prizePool.canAwardExternal(address(_externalErc721)), \\\"PeriodicPrizeStrategy/cannot-award-external\\\");\\n    require(address(_externalErc721).supportsInterface(Constants.ERC165_INTERFACE_ID_ERC721), \\\"PeriodicPrizeStrategy/erc721-invalid\\\");\\n    \\n    if (!externalErc721s.contains(address(_externalErc721))) {\\n      externalErc721s.addAddress(address(_externalErc721));\\n    }\\n\\n    for (uint256 i = 0; i < _tokenIds.length; i++) {\\n      _addExternalErc721Award(_externalErc721, _tokenIds[i]);\\n    }\\n\\n    emit ExternalErc721AwardAdded(_externalErc721, _tokenIds);\\n  }\\n\\n  function _addExternalErc721Award(IERC721Upgradeable _externalErc721, uint256 _tokenId) internal {\\n    require(IERC721Upgradeable(_externalErc721).ownerOf(_tokenId) == address(prizePool), \\\"PeriodicPrizeStrategy/unavailable-token\\\");\\n    for (uint256 i = 0; i < externalErc721TokenIds[_externalErc721].length; i++) {\\n      if (externalErc721TokenIds[_externalErc721][i] == _tokenId) {\\n        revert(\\\"PeriodicPrizeStrategy/erc721-duplicate\\\");\\n      }\\n    }\\n    externalErc721TokenIds[_externalErc721].push(_tokenId);\\n  }\\n\\n  /// @notice Removes an external ERC721 token as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can remove external tokens\\n  /// @param _externalErc721 The address of an ERC721 token to be removed\\n  /// @param _prevExternalErc721 The address of the previous ERC721 token in the list.\\n  /// If no previous, then pass the SENTINEL address: 0x0000000000000000000000000000000000000001\\n  function removeExternalErc721Award(\\n    IERC721Upgradeable _externalErc721,\\n    IERC721Upgradeable _prevExternalErc721\\n  )\\n    external\\n    onlyOwner\\n    requireAwardNotInProgress\\n  {\\n    externalErc721s.removeAddress(address(_prevExternalErc721), address(_externalErc721));\\n    _removeExternalErc721AwardTokens(_externalErc721);\\n  }\\n\\n  function _removeExternalErc721AwardTokens(\\n    IERC721Upgradeable _externalErc721\\n  )\\n    internal\\n  {\\n    delete externalErc721TokenIds[_externalErc721];\\n    emit ExternalErc721AwardRemoved(_externalErc721);\\n  }\\n\\n  function _requireAwardNotInProgress() internal view {\\n    uint256 currentBlock = _currentBlock();\\n    require(rngRequest.lockBlock == 0 || currentBlock < rngRequest.lockBlock, \\\"PeriodicPrizeStrategy/rng-in-flight\\\");\\n  }\\n\\n  function isRngTimedOut() public view returns (bool) {\\n    if (rngRequest.requestedAt == 0) {\\n      return false;\\n    } else {\\n      return _currentTime() > uint256(rngRequestTimeout).add(rngRequest.requestedAt);\\n    }\\n  }\\n\\n  modifier onlyOwnerOrListener() {\\n    require(_msgSender() == owner() ||\\n            _msgSender() == address(periodicPrizeStrategyListener) ||\\n            _msgSender() == address(beforeAwardListener),\\n            \\\"PeriodicPrizeStrategy/only-owner-or-listener\\\");\\n    _;\\n  }\\n\\n  modifier requireAwardNotInProgress() {\\n    _requireAwardNotInProgress();\\n    _;\\n  }\\n\\n  modifier requireCanStartAward() {\\n    require(_isPrizePeriodOver(), \\\"PeriodicPrizeStrategy/prize-period-not-over\\\");\\n    require(!isRngRequested(), \\\"PeriodicPrizeStrategy/rng-already-requested\\\");\\n    _;\\n  }\\n\\n  modifier requireCanCompleteAward() {\\n    require(isRngRequested(), \\\"PeriodicPrizeStrategy/rng-not-requested\\\");\\n    require(isRngCompleted(), \\\"PeriodicPrizeStrategy/rng-not-complete\\\");\\n    _;\\n  }\\n\\n  modifier onlyPrizePool() {\\n    require(_msgSender() == address(prizePool), \\\"PeriodicPrizeStrategy/only-prize-pool\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0xd7bf198ab616ed4b3e9c29d20477887d5a1e000e137e447da20bcec73b7cf997\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ninterface PeriodicPrizeStrategyListenerInterface is IERC165Upgradeable {\\n  function afterPrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x229624266562f60200b4e40ebc95a35a8aad799c0ff95a42df243af98a44d198\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary PeriodicPrizeStrategyListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('afterPrizePoolAwarded(uint256,uint256)')) == 0x575072c6\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER = 0x575072c6;\\n}\\n\",\"keccak256\":\"0xed291b9a33e265535032557f0a5430a150701c9eb58b0138c120eb02bc13b514\",\"license\":\"GPL-3.0\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/test/PeriodicPrizeStrategyDistributorInterface.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"../prize-strategy/PeriodicPrizeStrategy.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ninterface PeriodicPrizeStrategyDistributorInterface {\\n  function distribute(uint256 randomNumber) external;\\n}\",\"keccak256\":\"0x86c3cb2540c5ac4900350cd9062f8141ec36cb158e4cbd77548e069d3703da5e\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TicketInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface TicketInterface {\\n  /// @notice Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\\n  /// @param randomNumber The random number to use to select a user.\\n  /// @return The winner\\n  function draw(uint256 randomNumber) external view returns (address);\\n}\",\"keccak256\":\"0x5201a9a22748781592abd2003801289224d4899292195b7de937cd5748be87dd\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListener.sol\":{\"content\":\"pragma solidity ^0.6.4;\\n\\nimport \\\"./TokenListenerInterface.sol\\\";\\nimport \\\"./TokenListenerLibrary.sol\\\";\\nimport \\\"../Constants.sol\\\";\\n\\nabstract contract TokenListener is TokenListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER\\n    );\\n  }\\n}\\n\",\"keccak256\":\"0xb0e98d10b004602e1d4f4369a70e6382002dc0c0c5713698eb6a92943aef2265\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/test/PeriodicPrizeStrategyHarness.sol": {
        "PeriodicPrizeStrategyHarness": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract BeforeAwardListenerInterface",
                  "name": "beforeAwardListener",
                  "type": "address"
                }
              ],
              "name": "BeforeAwardListenerSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20Upgradeable",
                  "name": "externalErc20",
                  "type": "address"
                }
              ],
              "name": "ExternalErc20AwardAdded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20Upgradeable",
                  "name": "externalErc20Award",
                  "type": "address"
                }
              ],
              "name": "ExternalErc20AwardRemoved",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC721Upgradeable",
                  "name": "externalErc721",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256[]",
                  "name": "tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "ExternalErc721AwardAdded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC721Upgradeable",
                  "name": "externalErc721Award",
                  "type": "address"
                }
              ],
              "name": "ExternalErc721AwardRemoved",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "prizePeriodStart",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "prizePeriodSeconds",
                  "type": "uint256"
                },
                {
                  "indexed": true,
                  "internalType": "contract PrizePool",
                  "name": "prizePool",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "contract TicketInterface",
                  "name": "ticket",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "contract IERC20Upgradeable",
                  "name": "sponsorship",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "contract RNGInterface",
                  "name": "rng",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "contract IERC20Upgradeable[]",
                  "name": "externalErc20Awards",
                  "type": "address[]"
                }
              ],
              "name": "Initialized",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract PeriodicPrizeStrategyListenerInterface",
                  "name": "periodicPrizeStrategyListener",
                  "type": "address"
                }
              ],
              "name": "PeriodicPrizeStrategyListenerSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "prizePeriodSeconds",
                  "type": "uint256"
                }
              ],
              "name": "PrizePeriodSecondsUpdated",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "prizePool",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint32",
                  "name": "rngRequestId",
                  "type": "uint32"
                },
                {
                  "indexed": false,
                  "internalType": "uint32",
                  "name": "rngLockBlock",
                  "type": "uint32"
                }
              ],
              "name": "PrizePoolAwardCancelled",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "prizePool",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint32",
                  "name": "rngRequestId",
                  "type": "uint32"
                },
                {
                  "indexed": false,
                  "internalType": "uint32",
                  "name": "rngLockBlock",
                  "type": "uint32"
                }
              ],
              "name": "PrizePoolAwardStarted",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "randomNumber",
                  "type": "uint256"
                }
              ],
              "name": "PrizePoolAwarded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "uint256",
                  "name": "prizePeriodStartedAt",
                  "type": "uint256"
                }
              ],
              "name": "PrizePoolOpened",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [],
              "name": "RngRequestFailed",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint32",
                  "name": "rngRequestTimeout",
                  "type": "uint32"
                }
              ],
              "name": "RngRequestTimeoutSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract RNGInterface",
                  "name": "rngService",
                  "type": "address"
                }
              ],
              "name": "RngServiceUpdated",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract TokenListenerInterface",
                  "name": "tokenListener",
                  "type": "address"
                }
              ],
              "name": "TokenListenerUpdated",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "VERSION",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_externalErc20",
                  "type": "address"
                }
              ],
              "name": "addExternalErc20Award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20Upgradeable[]",
                  "name": "_externalErc20s",
                  "type": "address[]"
                }
              ],
              "name": "addExternalErc20Awards",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC721Upgradeable",
                  "name": "_externalErc721",
                  "type": "address"
                },
                {
                  "internalType": "uint256[]",
                  "name": "_tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "addExternalErc721Award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "beforeAwardListener",
              "outputs": [
                {
                  "internalType": "contract BeforeAwardListenerInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "referrer",
                  "type": "address"
                }
              ],
              "name": "beforeTokenMint",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "beforeTokenTransfer",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "currentTime",
                  "type": "uint256"
                }
              ],
              "name": "calculateNextPrizePeriodStartTime",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "canCompleteAward",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "canStartAward",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "cancelAward",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "completeAward",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "currentPrize",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "secondsPerBlockMantissa",
                  "type": "uint256"
                }
              ],
              "name": "estimateRemainingBlocksToPrize",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract BeforeAwardListenerInterface",
                  "name": "listener",
                  "type": "address"
                }
              ],
              "name": "forceBeforeAwardListener",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "getExternalErc20Awards",
              "outputs": [
                {
                  "internalType": "address[]",
                  "name": "",
                  "type": "address[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC721Upgradeable",
                  "name": "_externalErc721",
                  "type": "address"
                }
              ],
              "name": "getExternalErc721AwardTokenIds",
              "outputs": [
                {
                  "internalType": "uint256[]",
                  "name": "",
                  "type": "uint256[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "getExternalErc721Awards",
              "outputs": [
                {
                  "internalType": "address[]",
                  "name": "",
                  "type": "address[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "getLastRngLockBlock",
              "outputs": [
                {
                  "internalType": "uint32",
                  "name": "",
                  "type": "uint32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "getLastRngRequestId",
              "outputs": [
                {
                  "internalType": "uint32",
                  "name": "",
                  "type": "uint32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_prizePeriodStart",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "_prizePeriodSeconds",
                  "type": "uint256"
                },
                {
                  "internalType": "contract PrizePool",
                  "name": "_prizePool",
                  "type": "address"
                },
                {
                  "internalType": "contract TicketInterface",
                  "name": "_ticket",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_sponsorship",
                  "type": "address"
                },
                {
                  "internalType": "contract RNGInterface",
                  "name": "_rng",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20Upgradeable[]",
                  "name": "externalErc20Awards",
                  "type": "address[]"
                }
              ],
              "name": "initialize",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "isPrizePeriodOver",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "isRngCompleted",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "isRngRequested",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "isRngTimedOut",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "periodicPrizeStrategyListener",
              "outputs": [
                {
                  "internalType": "contract PeriodicPrizeStrategyListenerInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizePeriodEndAt",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizePeriodRemainingSeconds",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizePeriodSeconds",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizePeriodStartedAt",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizePool",
              "outputs": [
                {
                  "internalType": "contract PrizePool",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_externalErc20",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_prevExternalErc20",
                  "type": "address"
                }
              ],
              "name": "removeExternalErc20Award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC721Upgradeable",
                  "name": "_externalErc721",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC721Upgradeable",
                  "name": "_prevExternalErc721",
                  "type": "address"
                }
              ],
              "name": "removeExternalErc721Award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "renounceOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "rng",
              "outputs": [
                {
                  "internalType": "contract RNGInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "rngRequestTimeout",
              "outputs": [
                {
                  "internalType": "uint32",
                  "name": "",
                  "type": "uint32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract BeforeAwardListenerInterface",
                  "name": "_beforeAwardListener",
                  "type": "address"
                }
              ],
              "name": "setBeforeAwardListener",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_time",
                  "type": "uint256"
                }
              ],
              "name": "setCurrentTime",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract PeriodicPrizeStrategyDistributorInterface",
                  "name": "_distributor",
                  "type": "address"
                }
              ],
              "name": "setDistributor",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract PeriodicPrizeStrategyListenerInterface",
                  "name": "_periodicPrizeStrategyListener",
                  "type": "address"
                }
              ],
              "name": "setPeriodicPrizeStrategyListener",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_prizePeriodSeconds",
                  "type": "uint256"
                }
              ],
              "name": "setPrizePeriodSeconds",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint32",
                  "name": "requestId",
                  "type": "uint32"
                },
                {
                  "internalType": "uint32",
                  "name": "lockBlock",
                  "type": "uint32"
                }
              ],
              "name": "setRngRequest",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint32",
                  "name": "_rngRequestTimeout",
                  "type": "uint32"
                }
              ],
              "name": "setRngRequestTimeout",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract RNGInterface",
                  "name": "rngService",
                  "type": "address"
                }
              ],
              "name": "setRngService",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "_tokenListener",
                  "type": "address"
                }
              ],
              "name": "setTokenListener",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "sponsorship",
              "outputs": [
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "startAward",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes4",
                  "name": "interfaceId",
                  "type": "bytes4"
                }
              ],
              "name": "supportsInterface",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "ticket",
              "outputs": [
                {
                  "internalType": "contract TicketInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "tokenListener",
              "outputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "addExternalErc20Award(address)": {
                "details": "Only the Prize-Strategy owner/creator can assign external tokens, and they must be approved by the Prize-Pool",
                "params": {
                  "_externalErc20": "The address of an ERC20 token to be awarded"
                }
              },
              "addExternalErc721Award(address,uint256[])": {
                "details": "Only the Prize-Strategy owner/creator can assign external tokens, and they must be approved by the Prize-Pool NOTE: The NFT must already be owned by the Prize-Pool",
                "params": {
                  "_externalErc721": "The address of an ERC721 token to be awarded",
                  "_tokenIds": "An array of token IDs of the ERC721 to be awarded"
                }
              },
              "beforeTokenMint(address,uint256,address,address)": {
                "params": {
                  "controlledToken": "The type of collateral that is being minted"
                }
              },
              "beforeTokenTransfer(address,address,uint256,address)": {
                "details": "Note that this is only for *transfers*, not mints or burns",
                "params": {
                  "controlledToken": "The type of collateral that is being sent"
                }
              },
              "calculateNextPrizePeriodStartTime(uint256)": {
                "params": {
                  "currentTime": "The timestamp to use as the current time"
                },
                "returns": {
                  "_0": "The timestamp at which the next prize period would start"
                }
              },
              "canCompleteAward()": {
                "returns": {
                  "_0": "True if an award can be completed, false otherwise."
                }
              },
              "canStartAward()": {
                "returns": {
                  "_0": "True if an award can be started, false otherwise."
                }
              },
              "currentPrize()": {
                "returns": {
                  "_0": "The current prize size"
                }
              },
              "estimateRemainingBlocksToPrize(uint256)": {
                "params": {
                  "secondsPerBlockMantissa": "The number of seconds per block to use for the calculation.  Should be a fixed point 18 number like Ether."
                },
                "returns": {
                  "_0": "The estimated number of blocks remaining until the prize can be awarded."
                }
              },
              "getExternalErc20Awards()": {
                "returns": {
                  "_0": "An array of External ERC20 token addresses"
                }
              },
              "getExternalErc721AwardTokenIds(address)": {
                "returns": {
                  "_0": "An array of External ERC721 token addresses"
                }
              },
              "getExternalErc721Awards()": {
                "returns": {
                  "_0": "An array of External ERC721 token addresses"
                }
              },
              "getLastRngLockBlock()": {
                "returns": {
                  "_0": "The block number that the RNG request is locked to"
                }
              },
              "getLastRngRequestId()": {
                "returns": {
                  "_0": "The current Request ID"
                }
              },
              "initialize(uint256,uint256,address,address,address,address,address[])": {
                "params": {
                  "_prizePeriodSeconds": "The duration of the prize period in seconds",
                  "_prizePeriodStart": "The starting timestamp of the prize period.",
                  "_prizePool": "The prize pool to award",
                  "_rng": "The RNG service to use",
                  "_sponsorship": "The sponsorship token",
                  "_ticket": "The ticket to use to draw winners"
                }
              },
              "isPrizePeriodOver()": {
                "returns": {
                  "_0": "True if the prize period is over, false otherwise"
                }
              },
              "isRngCompleted()": {
                "returns": {
                  "_0": "True if a random number request has completed, false otherwise."
                }
              },
              "isRngRequested()": {
                "returns": {
                  "_0": "True if a random number has been requested, false otherwise."
                }
              },
              "owner()": {
                "details": "Returns the address of the current owner."
              },
              "prizePeriodEndAt()": {
                "returns": {
                  "_0": "The timestamp at which the prize period ends."
                }
              },
              "prizePeriodRemainingSeconds()": {
                "returns": {
                  "_0": "The number of seconds remaining until the prize can be awarded."
                }
              },
              "removeExternalErc20Award(address,address)": {
                "details": "Only the Prize-Strategy owner/creator can remove external tokens",
                "params": {
                  "_externalErc20": "The address of an ERC20 token to be removed",
                  "_prevExternalErc20": "The address of the previous ERC20 token in the `externalErc20s` list. If the ERC20 is the first address, then the previous address is the SENTINEL address: 0x0000000000000000000000000000000000000001"
                }
              },
              "removeExternalErc721Award(address,address)": {
                "details": "Only the Prize-Strategy owner/creator can remove external tokens",
                "params": {
                  "_externalErc721": "The address of an ERC721 token to be removed",
                  "_prevExternalErc721": "The address of the previous ERC721 token in the list. If no previous, then pass the SENTINEL address: 0x0000000000000000000000000000000000000001"
                }
              },
              "renounceOwnership()": {
                "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
              },
              "setBeforeAwardListener(address)": {
                "details": "The listener must implement ERC165 and the BeforeAwardListenerInterface",
                "params": {
                  "_beforeAwardListener": "The address of the listener contract"
                }
              },
              "setPeriodicPrizeStrategyListener(address)": {
                "params": {
                  "_periodicPrizeStrategyListener": "The address of the listener contract"
                }
              },
              "setPrizePeriodSeconds(uint256)": {
                "params": {
                  "_prizePeriodSeconds": "The new prize period in seconds.  Must be greater than zero."
                }
              },
              "setRngRequestTimeout(uint32)": {
                "params": {
                  "_rngRequestTimeout": "The RNG request timeout in seconds."
                }
              },
              "setRngService(address)": {
                "params": {
                  "rngService": "The address of the new RNG service interface"
                }
              },
              "setTokenListener(address)": {
                "params": {
                  "_tokenListener": "A contract that implements the token listener interface."
                }
              },
              "startAward()": {
                "details": "The RNG-Request-Fee is expected to be held within this contract before calling this function"
              },
              "supportsInterface(bytes4)": {
                "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."
              },
              "transferOwnership(address)": {
                "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50613fd0806100206000396000f3fe608060405234801561001057600080fd5b506004361061030c5760003560e01c806372f33ea91161019d578063b2210957116100e9578063d5ad6bf6116100a2578063f210a9f31161007c578063f210a9f314610851578063f2fde38b14610877578063f97700e21461089d578063ffa1ad74146109725761030c565b8063d5ad6bf614610839578063d605787b14610841578063dfb2f13b146108495761030c565b8063b221095714610744578063b9ee1e0514610780578063c2f19ee814610788578063c42b42a014610790578063c48ddbcb14610798578063c6853270146108165761030c565b80638aa3ec6f116101565780639417783f116101305780639417783f146106e057806395e5f9ee14610706578063acca5b951461070e578063b0244682146107165761030c565b80638aa3ec6f146106aa5780638da5cb5b146106d057806394144c6b146106d85761030c565b806372f33ea914610629578063738bbea81461063157806375619ab5146106395780637f4296d71461065f578063876f5c7e14610685578063884a44481461068d5761030c565b80634e5d08e01161025c578063671137c4116102155780636bea5344116101ef5780636bea5344146106095780636cc25db714610611578063715018a614610619578063719ce73e146106215761030c565b8063671137c4146105cb5780636a74f107146105f95780636be51c4f146106015761030c565b80634e5d08e0146104d6578063500db70d146104fc578063605e25ac1461050457806362c77a611461052a578063642d43db14610532578063669682211461055d5761030c565b80632c8fe73d116102c957806347bed998116102a357806347bed9981461046d5780634aba4f6b1461048a5780634c169f4f146104925780634d7f3db01461049a5761030c565b80632c8fe73d146103e757806330fcdf41146103ef57806342d09209146104155761030c565b806301b48e341461031157806301ffc9a7146103405780630d847fc41461037b578063111070e41461039f57806322f8e566146103a75780632a7ad609146103c6575b600080fd5b61032e6004803603602081101561032757600080fd5b50356109ef565b60408051918252519081900360200190f35b6103676004803603602081101561035657600080fd5b50356001600160e01b031916610a08565b604080519115158252519081900360200190f35b610383610a3e565b604080516001600160a01b039092168252519081900360200190f35b610367610a4d565b6103c4600480360360208110156103bd57600080fd5b5035610a5c565b005b6103ce610a61565b6040805163ffffffff9092168252519081900360200190f35b61032e610a6d565b6103c46004803603602081101561040557600080fd5b50356001600160a01b0316610a7c565b61041d610b96565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610459578181015183820152602001610441565b505050509050019250505060405180910390f35b61032e6004803603602081101561048357600080fd5b5035610ba2565b610367610bad565b6103c4610c32565b6103c4600480360360808110156104b057600080fd5b506001600160a01b03813581169160208101359160408201358116916060013516610d19565b6103c4600480360360208110156104ec57600080fd5b50356001600160a01b0316610e25565b610383610ee1565b6103c46004803603602081101561051a57600080fd5b50356001600160a01b0316610ef0565b61041d611013565b6103c46004803603604081101561054857600080fd5b5063ffffffff8135811691602001351661101f565b6103c46004803603602081101561057357600080fd5b810190602081018135600160201b81111561058d57600080fd5b82018360208201111561059f57600080fd5b803590602001918460208302840111600160201b831117156105c057600080fd5b509092509050611052565b6103c4600480360360408110156105e157600080fd5b506001600160a01b038135811691602001351661113e565b6103676111c1565b6103836111da565b6103ce6111e9565b6103836111fc565b6103c461120b565b6103836112b7565b61032e6112c6565b6103676112cc565b6103c46004803603602081101561064f57600080fd5b50356001600160a01b031661131f565b6103c46004803603602081101561067557600080fd5b50356001600160a01b0316611341565b610367611439565b6103c4600480360360208110156106a357600080fd5b5035611458565b6103c4600480360360208110156106c057600080fd5b50356001600160a01b03166114cb565b6103836115e5565b61032e6115f4565b61041d600480360360208110156106f657600080fd5b50356001600160a01b03166115fa565b610367611666565b6103ce611670565b6103c46004803603604081101561072c57600080fd5b506001600160a01b038135811691602001351661167c565b6103c46004803603608081101561075a57600080fd5b506001600160a01b0381358116916020810135821691604082013591606001351661172a565b6103c4611868565b610383611ae9565b61032e611af8565b6103c4600480360360408110156107ae57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156107d857600080fd5b8201836020820111156107ea57600080fd5b803590602001918460208302840111600160201b8311171561080b57600080fd5b509092509050611b3d565b6103c46004803603602081101561082c57600080fd5b503563ffffffff16611db2565b61032e611e25565b610383611e2f565b6103c4611e3e565b6103c46004803603602081101561086757600080fd5b50356001600160a01b0316612106565b6103c46004803603602081101561088d57600080fd5b50356001600160a01b0316612128565b6103c4600480360360e08110156108b357600080fd5b8135916020810135916001600160a01b0360408301358116926060810135821692608082013583169260a083013516919081019060e0810160c0820135600160201b81111561090157600080fd5b82018360208201111561091357600080fd5b803590602001918460208302840111600160201b8311171561093457600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061222b945050505050565b61097a61259e565b6040805160208082528351818301528351919283929083019185019080838360005b838110156109b457818101518382015260200161099c565b50505050905090810190601f1680156109e15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610a026109fc6125bf565b836125fc565b92915050565b60006001600160e01b031982166301ffc9a760e01b1480610a025750506001600160e01b031916600162a1cb1960e01b03191490565b6073546001600160a01b031681565b606a5463ffffffff1615155b90565b607655565b606a5463ffffffff1690565b6000610a77612625565b905090565b610a8461263e565b6001600160a01b0316610a956115e5565b6001600160a01b031614610ade576040805162461bcd60e51b81526020600482018190526024820152600080516020613d58833981519152604482015290519081900360640190fd5b610ae6612642565b6001600160a01b0381161580610b115750610b116001600160a01b03821663266fce1f60e11b6126b4565b610b4c5760405162461bcd60e51b8152600401808060200182810382526031815260200180613d786031913960400191505060405180910390fd5b607380546001600160a01b0319166001600160a01b0383169081179091556040517fc4feff61630891ea2cb42a54fbe3ff2e65422f2ed17323ac6b65f4521112e87e90600090a250565b6060610a7760706126d7565b6000610a02826127b7565b606954606a5460408051630e866e6f60e21b815263ffffffff9092166004830152516000926001600160a01b031691633a19b9bc916024808301926020929190829003018186803b158015610c0157600080fd5b505afa158015610c15573d6000803e3d6000fd5b505050506040513d6020811015610c2b57600080fd5b5051905090565b610c3a6112cc565b610c755760405162461bcd60e51b8152600401808060200182810382526026815260200180613efb6026913960400191505060405180910390fd5b606a80546bffffffffffffffffffffffff19811690915560405163ffffffff80831692600160201b900416907fee6702c46c5618e6fc7e625c71f4c85df9c91d456cb16a3aea71ab83b1fee00590600090a16066546040805163ffffffff84811682529151918516926001600160a01b03169133917fd50026ee0824513af20cdf5e72d1fbfbe8fd646ee0576378e080326f1a695e58919081900360200190a45050565b6066546001600160a01b0316610d2d61263e565b6001600160a01b031614610d725760405162461bcd60e51b8152600401808060200182810382526025815260200180613bff6025913960400191505060405180910390fd5b6067546001600160a01b0383811691161415610d9057610d90612642565b6065546001600160a01b031615610e1f57606554604080516304d7f3db60e41b81526001600160a01b038781166004830152602482018790528581166044830152848116606483015291519190921691634d7f3db091608480830192600092919082900301818387803b158015610e0657600080fd5b505af1158015610e1a573d6000803e3d6000fd5b505050505b50505050565b610e2d6115e5565b6001600160a01b0316610e3e61263e565b6001600160a01b03161480610e6d57506074546001600160a01b0316610e6261263e565b6001600160a01b0316145b80610e9257506073546001600160a01b0316610e8761263e565b6001600160a01b0316145b610ecd5760405162461bcd60e51b815260040180806020018281038252602c815260200180613b75602c913960400191505060405180910390fd5b610ed5612642565b610ede816127fe565b50565b6068546001600160a01b031681565b610ef861263e565b6001600160a01b0316610f096115e5565b6001600160a01b031614610f52576040805162461bcd60e51b81526020600482018190526024820152600080516020613d58833981519152604482015290519081900360640190fd5b610f5a612642565b6001600160a01b0381161580610f885750610f886001600160a01b038216600162a1cb1960e01b03196126b4565b610fc35760405162461bcd60e51b815260040180806020018281038252602c815260200180613af8602c913960400191505060405180910390fd5b606580546001600160a01b0319166001600160a01b0383811691909117918290556040519116907f9fc437aa70ad4ee5f33f6772bf338eed41e21b95435820817ab8b4df161ce4dd90600090a250565b6060610a77606e6126d7565b606a805463ffffffff928316600160201b0267ffffffff00000000199490931663ffffffff199091161792909216179055565b61105a6115e5565b6001600160a01b031661106b61263e565b6001600160a01b0316148061109a57506074546001600160a01b031661108f61263e565b6001600160a01b0316145b806110bf57506073546001600160a01b03166110b461263e565b6001600160a01b0316145b6110fa5760405162461bcd60e51b815260040180806020018281038252602c815260200180613b75602c913960400191505060405180910390fd5b611102612642565b60005b818110156111395761113183838381811061111c57fe5b905060200201356001600160a01b03166127fe565b600101611105565b505050565b61114661263e565b6001600160a01b03166111576115e5565b6001600160a01b0316146111a0576040805162461bcd60e51b81526020600482018190526024820152600080516020613d58833981519152604482015290519081900360640190fd5b6111a8612642565b6111b460708284612a65565b6111bd82612b81565b5050565b60006111cb610a4d565b8015610a775750610a77610bad565b6065546001600160a01b031681565b606a54600160201b900463ffffffff1690565b6067546001600160a01b031681565b61121361263e565b6001600160a01b03166112246115e5565b6001600160a01b03161461126d576040805162461bcd60e51b81526020600482018190526024820152600080516020613d58833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6066546001600160a01b031681565b606d5481565b606a54600090600160401b900463ffffffff166112eb57506000610a59565b606a54606b5461130f9163ffffffff91821691600160401b909104811690612bd916565b611317612c33565b119050610a59565b607580546001600160a01b0319166001600160a01b0392909216919091179055565b61134961263e565b6001600160a01b031661135a6115e5565b6001600160a01b0316146113a3576040805162461bcd60e51b81526020600482018190526024820152600080516020613d58833981519152604482015290519081900360640190fd5b6113ab612642565b6113b3610a4d565b156113ef5760405162461bcd60e51b8152600401808060200182810382526023815260200180613ed86023913960400191505060405180910390fd5b606980546001600160a01b0319166001600160a01b0383169081179091556040517ff935763cc7c57ee8ed6318ed71e756cca0731294c9f46ff5b386f36d6ff1417a90600090a250565b6000611443612c39565b8015610a775750611452610a4d565b15905090565b61146061263e565b6001600160a01b03166114716115e5565b6001600160a01b0316146114ba576040805162461bcd60e51b81526020600482018190526024820152600080516020613d58833981519152604482015290519081900360640190fd5b6114c2612642565b610ede81612c52565b6114d361263e565b6001600160a01b03166114e46115e5565b6001600160a01b03161461152d576040805162461bcd60e51b81526020600482018190526024820152600080516020613d58833981519152604482015290519081900360640190fd5b611535612642565b6001600160a01b038116158061156057506115606001600160a01b038216632ba8396360e11b6126b4565b61159b5760405162461bcd60e51b8152600401808060200182810382526033815260200180613e496033913960400191505060405180910390fd5b607480546001600160a01b0319166001600160a01b0383169081179091556040517fda05d50a3a1ec0ffab059f1d457ae59f68ccfb3ffbb4dad283c516f9103d584b90600090a250565b6033546001600160a01b031690565b606c5481565b6001600160a01b03811660009081526072602090815260409182902080548351818402810184019094528084526060939283018282801561165a57602002820191906000526020600020905b815481526020019060010190808311611646575b50505050509050919050565b6000610a77612c39565b606b5463ffffffff1681565b61168461263e565b6001600160a01b03166116956115e5565b6001600160a01b0316146116de576040805162461bcd60e51b81526020600482018190526024820152600080516020613d58833981519152604482015290519081900360640190fd5b6116e6612642565b6116f2606e8284612a65565b6040516001600160a01b038316907f58982464497acdab11ad29d39907e076b0d3b8daf1d9b734174c7c3a2a0e8c7490600090a25050565b6066546001600160a01b031661173e61263e565b6001600160a01b0316146117835760405162461bcd60e51b8152600401808060200182810382526025815260200180613bff6025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031614156117d45760405162461bcd60e51b8152600401808060200182810382526026815260200180613c246026913960400191505060405180910390fd5b6067546001600160a01b03828116911614156117f2576117f2612642565b6065546001600160a01b031615610e1f576065546040805163b221095760e01b81526001600160a01b03878116600483015286811660248301526044820186905284811660648301529151919092169163b221095791608480830192600092919082900301818387803b158015610e0657600080fd5b611870612c39565b6118ab5760405162461bcd60e51b815260040180806020018281038252602b815260200180613b24602b913960400191505060405180910390fd5b6118b3610a4d565b156118ef5760405162461bcd60e51b815260040180806020018281038252602b815260200180613d0c602b913960400191505060405180910390fd5b60695460408051630d37b53760e01b8152815160009384936001600160a01b0390911692630d37b5379260048083019392829003018186803b15801561193457600080fd5b505afa158015611948573d6000803e3d6000fd5b505050506040513d604081101561195e57600080fd5b50805160209091015190925090506001600160a01b038216158015906119845750600081115b156119a3576069546119a3906001600160a01b03848116911683612ccc565b6069546040805163433c53d960e11b8152815160009384936001600160a01b0390911692638678a7b2926004808301939282900301818787803b1580156119e957600080fd5b505af11580156119fd573d6000803e3d6000fd5b505050506040513d6040811015611a1357600080fd5b508051602090910151606a805463ffffffff808416600160201b0267ffffffff000000001991861663ffffffff1990931692909217161790559092509050611a61611a5c612c33565b612ddf565b606a80546bffffffff00000000000000001916600160401b63ffffffff93841602179055606654908316906001600160a01b0316611a9d61263e565b6001600160a01b03167f4d31e658dcf617bb3a3c8cf7c6dddb33f7030ac588e271631ecdb5d76c2e91ef84604051808263ffffffff16815260200191505060405180910390a450505050565b6074546001600160a01b031681565b606654604080516318c1996d60e21b815290516000926001600160a01b03169163630665b4916004808301926020929190829003018186803b158015610c0157600080fd5b611b456115e5565b6001600160a01b0316611b5661263e565b6001600160a01b03161480611b8557506074546001600160a01b0316611b7a61263e565b6001600160a01b0316145b80611baa57506073546001600160a01b0316611b9f61263e565b6001600160a01b0316145b611be55760405162461bcd60e51b815260040180806020018281038252602c815260200180613b75602c913960400191505060405180910390fd5b611bed612642565b60665460408051636a3fd4f960e01b81526001600160a01b03868116600483015291519190921691636a3fd4f9916024808301926020929190829003018186803b158015611c3a57600080fd5b505afa158015611c4e573d6000803e3d6000fd5b505050506040513d6020811015611c6457600080fd5b5051611ca15760405162461bcd60e51b815260040180806020018281038252602b815260200180613da9602b913960400191505060405180910390fd5b611cbb6001600160a01b0384166380ac58cd60e01b6126b4565b611cf65760405162461bcd60e51b8152600401808060200182810382526024815260200180613ad46024913960400191505060405180910390fd5b611d01607084612e27565b611d1057611d10607084612e78565b60005b81811015611d3f57611d3784848484818110611d2b57fe5b90506020020135612f8c565b600101611d13565b50826001600160a01b03167f51541dc4b4c08a16085809cccdc4cc77d8000b60fbb00142e57f236d84298675838360405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a2505050565b611dba61263e565b6001600160a01b0316611dcb6115e5565b6001600160a01b031614611e14576040805162461bcd60e51b81526020600482018190526024820152600080516020613d58833981519152604482015290519081900360640190fd5b611e1c612642565b610ede81613112565b6000610a776125bf565b6069546001600160a01b031681565b611e46610a4d565b611e815760405162461bcd60e51b8152600401808060200182810382526027815260200180613f4d6027913960400191505060405180910390fd5b611e89610bad565b611ec45760405162461bcd60e51b8152600401808060200182810382526026815260200180613c956026913960400191505060405180910390fd5b606954606a54604080516313a54bf360e31b815263ffffffff9092166004830152516000926001600160a01b031691639d2a5f9891602480830192602092919082900301818787803b158015611f1957600080fd5b505af1158015611f2d573d6000803e3d6000fd5b505050506040513d6020811015611f4357600080fd5b5051606a80546bffffffffffffffffffffffff191690556073549091506001600160a01b031615611fde57607354606d546040805163266fce1f60e11b8152600481018590526024810192909252516001600160a01b0390921691634cdf9c3e9160448082019260009290919082900301818387803b158015611fc557600080fd5b505af1158015611fd9573d6000803e3d6000fd5b505050505b611fe7816131ab565b6074546001600160a01b03161561206857607454606d5460408051632ba8396360e11b8152600481018590526024810192909252516001600160a01b039092169163575072c69160448082019260009290919082900301818387803b15801561204f57600080fd5b505af1158015612063573d6000803e3d6000fd5b505050505b612078612073612c33565b6127b7565b606d5561208361263e565b6001600160a01b03167f9c4163ece98173eab9a496c4db8bf3e2c8edcc5d2854377880597ccb858b7a9d826040518082815260200191505060405180910390a2606d546120ce61263e565b6001600160a01b03167fc61852c20f0b03b31d782f3022f2bf20322ac17ce66c5349fb6e24740cdd645660405160405180910390a350565b607380546001600160a01b0319166001600160a01b0392909216919091179055565b61213061263e565b6001600160a01b03166121416115e5565b6001600160a01b03161461218a576040805162461bcd60e51b81526020600482018190526024820152600080516020613d58833981519152604482015290519081900360640190fd5b6001600160a01b0381166121cf5760405162461bcd60e51b8152600401808060200182810382526026815260200180613b4f6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff16806122445750612244613213565b80612252575060005460ff16155b61228d5760405162461bcd60e51b815260040180806020018281038252602e815260200180613cde602e913960400191505060405180910390fd5b600054610100900460ff161580156122b8576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0386166122fd5760405162461bcd60e51b8152600401808060200182810382526029815260200180613c4a6029913960400191505060405180910390fd5b6001600160a01b0385166123425760405162461bcd60e51b8152600401808060200182810382526025815260200180613dfa6025913960400191505060405180910390fd5b6001600160a01b0384166123875760405162461bcd60e51b815260040180806020018281038252602a815260200180613ba1602a913960400191505060405180910390fd5b6001600160a01b0383166123cc5760405162461bcd60e51b8152600401808060200182810382526022815260200180613c736022913960400191505060405180910390fd5b606680546001600160a01b038089166001600160a01b0319928316179092556067805488841690831617905560698054868416908316179055606880549287169290911691909117905561241f87612c52565b61242761321e565b612431606e6132cf565b60005b82518110156124615761245983828151811061244c57fe5b60200260200101516127fe565b600101612434565b50606c879055606d88905561247660706132cf565b612481610708613112565b856001600160a01b03167ff9632d212436344a25150ff0c161dabf412aade556621c2dea146ca63ff643f589898888888860405180878152602001868152602001856001600160a01b03168152602001846001600160a01b03168152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561252b578181015183820152602001612513565b5050505090500197505050505050505060405180910390a2606d5461254e61263e565b6001600160a01b03167fc61852c20f0b03b31d782f3022f2bf20322ac17ce66c5349fb6e24740cdd645660405160405180910390a38015610e1a576000805461ff00191690555050505050505050565b60405180604001604052806005815260200164332e342e3560d81b81525081565b6000806125ca612625565b905060006125d6612c33565b9050818111156125eb57600092505050610a59565b6125f58282613337565b9250505090565b600080612611670de0b6b3a764000085613394565b905061261d81846133ed565b949350505050565b6000610a77606c54606d54612bd990919063ffffffff16565b3390565b600061264c61342f565b606a54909150600160201b900463ffffffff1615806126795750606a54600160201b900463ffffffff1681105b610ede5760405162461bcd60e51b8152600401808060200182810382526023815260200180613ed86023913960400191505060405180910390fd5b60006126bf83613433565b80156126d057506126d08383613466565b9392505050565b606080826000015467ffffffffffffffff811180156126f557600080fd5b5060405190808252806020026020018201604052801561271f578160200160208202803683370190505b50600160008181529085016020526040812054919250906001600160a01b03165b6001600160a01b0381161580159061276257506001600160a01b038116600114155b156127ae578083838151811061277457fe5b6001600160a01b03928316602091820292909201810191909152918116600090815260018088019093526040902054929091019116612740565b50909392505050565b6000806127db606c546127d5606d548661333790919063ffffffff16565b9061348c565b90506126d06127f5606c548361339490919063ffffffff16565b606d5490612bd9565b612810816001600160a01b03166134f3565b612861576040805162461bcd60e51b815260206004820181905260248201527f506572696f6469635072697a6553747261746567792f65726332302d6e756c6c604482015290519081900360640190fd5b60665460408051636a3fd4f960e01b81526001600160a01b03848116600483015291519190921691636a3fd4f9916024808301926020929190829003018186803b1580156128ae57600080fd5b505afa1580156128c2573d6000803e3d6000fd5b505050506040513d60208110156128d857600080fd5b50516129155760405162461bcd60e51b815260040180806020018281038252602b815260200180613da9602b913960400191505060405180910390fd5b60408051600481526024810182526020810180516001600160e01b03166318160ddd60e01b178152915181516000936060936001600160a01b038716939092909182918083835b6020831061297b5780518252601f19909201916020918201910161295c565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d80600081146129db576040519150601f19603f3d011682016040523d82523d6000602084013e6129e0565b606091505b509150915081612a215760405162461bcd60e51b8152600401808060200182810382526023815260200180613cbb6023913960400191505060405180910390fd5b612a2c606e84612e78565b6040516001600160a01b038416907fbcd6d991f3416e288bf59a2997b423772937b62c7ea7dd1a54af7771de1f741890600090a2505050565b6001600160a01b038116600114801590612a8757506001600160a01b03811615155b612aca576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b6001600160a01b038281166000908152600185016020526040902054811690821614612b33576040805162461bcd60e51b8152602060048201526013602482015272496e76616c696420707265764164647265737360681b604482015290519081900360640190fd5b6001600160a01b039081166000818152600185016020526040808220805495851683529082208054959094166001600160a01b03199586161790935552805490911690558054600019019055565b6001600160a01b0381166000908152607260205260408120612ba291613aa5565b6040516001600160a01b038216907fcd64d9dacd230c5ccf1278ea5332b0621aa28c950fb0e61c8fbc9e2011c88a3490600090a250565b6000828201838110156126d0576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60765490565b6000612c43612625565b612c4b612c33565b1015905090565b60008111612c915760405162461bcd60e51b8152600401808060200182810382526034815260200180613bcb6034913960400191505060405180910390fd5b606c8190556040805182815290517f0d379c1a7282461e725a9dc2d74e65246c77e98ae93835e26c2f1654c48ee4ec9181900360200190a150565b801580612d52575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612d2457600080fd5b505afa158015612d38573d6000803e3d6000fd5b505050506040513d6020811015612d4e57600080fd5b5051155b612d8d5760405162461bcd60e51b8152600401808060200182810382526036815260200180613e7c6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526111399084906134f9565b6000600160201b8210612e235760405162461bcd60e51b8152600401808060200182810382526026815260200180613dd46026913960400191505060405180910390fd5b5090565b60006001600160a01b038216600114801590612e4b57506001600160a01b03821615155b80156126d05750506001600160a01b03908116600090815260019290920160205260409091205416151590565b6001600160a01b038116600114801590612e9a57506001600160a01b03811615155b612edd576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b6001600160a01b0381811660009081526001840160205260409020541615612f3c576040805162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481859191959609a1b604482015290519081900360640190fd5b60016000818152838201602052604080822080546001600160a01b039586168085529284208054969091166001600160a01b03199687161790559183905281549093169092179091558154019055565b606654604080516331a9108f60e11b81526004810184905290516001600160a01b0392831692851691636352211e916024808301926020929190829003018186803b158015612fda57600080fd5b505afa158015612fee573d6000803e3d6000fd5b505050506040513d602081101561300457600080fd5b50516001600160a01b03161461304b5760405162461bcd60e51b8152600401808060200182810382526027815260200180613f746027913960400191505060405180910390fd5b60005b6001600160a01b0383166000908152607260205260409020548110156130e5576001600160a01b038316600090815260726020526040902080548391908390811061309557fe5b906000526020600020015414156130dd5760405162461bcd60e51b8152600401808060200182810382526026815260200180613eb26026913960400191505060405180910390fd5b60010161304e565b506001600160a01b0390911660009081526072602090815260408220805460018101825590835291200155565b603c8163ffffffff16116131575760405162461bcd60e51b815260040180806020018281038252602c815260200180613f21602c913960400191505060405180910390fd5b606b805463ffffffff191663ffffffff838116919091179182905560408051929091168252517f4f27f6f220ffad585e728389bc2f0f6b74eeebeb43f95f53752a647cb6e7e687916020908290030190a150565b607554604080516391c05b0b60e01b81526004810184905290516001600160a01b03909216916391c05b0b9160248082019260009290919082900301818387803b1580156131f857600080fd5b505af115801561320c573d6000803e3d6000fd5b5050505050565b6000611452306134f3565b600054610100900460ff16806132375750613237613213565b80613245575060005460ff16155b6132805760405162461bcd60e51b815260040180806020018281038252602e815260200180613cde602e913960400191505060405180910390fd5b600054610100900460ff161580156132ab576000805460ff1961ff0019909116610100171660011790555b6132b36135aa565b6132bb61364a565b8015610ede576000805461ff001916905550565b805415613312576040805162461bcd60e51b815260206004820152600c60248201526b105b1c9958591e481a5b9a5d60a21b604482015290519081900360640190fd5b60016000818152918101602052604090912080546001600160a01b0319169091179055565b60008282111561338e576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000826133a357506000610a02565b828202828482816133b057fe5b04146126d05760405162461bcd60e51b8152600401808060200182810382526021815260200180613d376021913960400191505060405180910390fd5b60006126d083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613743565b4390565b6000613446826301ffc9a760e01b613466565b8015610a02575061345f826001600160e01b0319613466565b1592915050565b600080600061347585856137e5565b915091508180156134835750805b95945050505050565b60008082116134e2576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816134eb57fe5b049392505050565b3b151590565b606061354e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139199092919063ffffffff16565b8051909150156111395780806020019051602081101561356d57600080fd5b50516111395760405162461bcd60e51b815260040180806020018281038252602a815260200180613e1f602a913960400191505060405180910390fd5b600054610100900460ff16806135c357506135c3613213565b806135d1575060005460ff16155b61360c5760405162461bcd60e51b815260040180806020018281038252602e815260200180613cde602e913960400191505060405180910390fd5b600054610100900460ff161580156132bb576000805460ff1961ff0019909116610100171660011790558015610ede576000805461ff001916905550565b600054610100900460ff16806136635750613663613213565b80613671575060005460ff16155b6136ac5760405162461bcd60e51b815260040180806020018281038252602e815260200180613cde602e913960400191505060405180910390fd5b600054610100900460ff161580156136d7576000805460ff1961ff0019909116610100171660011790555b60006136e161263e565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610ede576000805461ff001916905550565b600081836137cf5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561379457818101518382015260200161377c565b50505050905090810190601f1680156137c15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816137db57fe5b0495945050505050565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b1781529151815160009384939284926060926001600160a01b038a169261753092879282918083835b6020831061386d5780518252601f19909201916020918201910161384e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146138ce576040519150601f19603f3d011682016040523d82523d6000602084013e6138d3565b606091505b50915091506020815110156138f15760008094509450505050613912565b8181806020019051602081101561390757600080fd5b505190955093505050505b9250929050565b606061261d84846000858561392d856134f3565b61397e576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106139bd5780518252601f19909201916020918201910161399e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613a1f576040519150601f19603f3d011682016040523d82523d6000602084013e613a24565b606091505b5091509150613a34828286613a3f565b979650505050505050565b60608315613a4e5750816126d0565b825115613a5e5782518084602001fd5b60405162461bcd60e51b815260206004820181815284516024840152845185939192839260440191908501908083836000831561379457818101518382015260200161377c565b5080546000825590600052602060002090810190610ede91905b80821115612e235760008155600101613abf56fe506572696f6469635072697a6553747261746567792f6572633732312d696e76616c6964506572696f6469635072697a6553747261746567792f746f6b656e2d6c697374656e65722d696e76616c6964506572696f6469635072697a6553747261746567792f7072697a652d706572696f642d6e6f742d6f7665724f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373506572696f6469635072697a6553747261746567792f6f6e6c792d6f776e65722d6f722d6c697374656e6572506572696f6469635072697a6553747261746567792f73706f6e736f72736869702d6e6f742d7a65726f506572696f6469635072697a6553747261746567792f7072697a652d706572696f642d677265617465722d7468616e2d7a65726f506572696f6469635072697a6553747261746567792f6f6e6c792d7072697a652d706f6f6c506572696f6469635072697a6553747261746567792f7472616e736665722d746f2d73656c66506572696f6469635072697a6553747261746567792f7072697a652d706f6f6c2d6e6f742d7a65726f506572696f6469635072697a6553747261746567792f726e672d6e6f742d7a65726f506572696f6469635072697a6553747261746567792f726e672d6e6f742d636f6d706c657465506572696f6469635072697a6553747261746567792f65726332302d696e76616c6964496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564506572696f6469635072697a6553747261746567792f726e672d616c72656164792d726571756573746564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572506572696f6469635072697a6553747261746567792f6265666f726541776172644c697374656e65722d696e76616c6964506572696f6469635072697a6553747261746567792f63616e6e6f742d61776172642d65787465726e616c53616665436173743a2076616c756520646f65736e27742066697420696e2033322062697473506572696f6469635072697a6553747261746567792f7469636b65742d6e6f742d7a65726f5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564506572696f6469635072697a6553747261746567792f7072697a6553747261746567794c697374656e65722d696e76616c69645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365506572696f6469635072697a6553747261746567792f6572633732312d6475706c6963617465506572696f6469635072697a6553747261746567792f726e672d696e2d666c69676874506572696f6469635072697a6553747261746567792f726e672d6e6f742d74696d65646f7574506572696f6469635072697a6553747261746567792f726e672d74696d656f75742d67742d36302d73656373506572696f6469635072697a6553747261746567792f726e672d6e6f742d726571756573746564506572696f6469635072697a6553747261746567792f756e617661696c61626c652d746f6b656ea26469706673582212205a2d40bc6c9cca45d3c3872fc80f7d222580af405b855a2f9df10813e173ffdf64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3FD0 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x30C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x72F33EA9 GT PUSH2 0x19D JUMPI DUP1 PUSH4 0xB2210957 GT PUSH2 0xE9 JUMPI DUP1 PUSH4 0xD5AD6BF6 GT PUSH2 0xA2 JUMPI DUP1 PUSH4 0xF210A9F3 GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xF210A9F3 EQ PUSH2 0x851 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x877 JUMPI DUP1 PUSH4 0xF97700E2 EQ PUSH2 0x89D JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x972 JUMPI PUSH2 0x30C JUMP JUMPDEST DUP1 PUSH4 0xD5AD6BF6 EQ PUSH2 0x839 JUMPI DUP1 PUSH4 0xD605787B EQ PUSH2 0x841 JUMPI DUP1 PUSH4 0xDFB2F13B EQ PUSH2 0x849 JUMPI PUSH2 0x30C JUMP JUMPDEST DUP1 PUSH4 0xB2210957 EQ PUSH2 0x744 JUMPI DUP1 PUSH4 0xB9EE1E05 EQ PUSH2 0x780 JUMPI DUP1 PUSH4 0xC2F19EE8 EQ PUSH2 0x788 JUMPI DUP1 PUSH4 0xC42B42A0 EQ PUSH2 0x790 JUMPI DUP1 PUSH4 0xC48DDBCB EQ PUSH2 0x798 JUMPI DUP1 PUSH4 0xC6853270 EQ PUSH2 0x816 JUMPI PUSH2 0x30C JUMP JUMPDEST DUP1 PUSH4 0x8AA3EC6F GT PUSH2 0x156 JUMPI DUP1 PUSH4 0x9417783F GT PUSH2 0x130 JUMPI DUP1 PUSH4 0x9417783F EQ PUSH2 0x6E0 JUMPI DUP1 PUSH4 0x95E5F9EE EQ PUSH2 0x706 JUMPI DUP1 PUSH4 0xACCA5B95 EQ PUSH2 0x70E JUMPI DUP1 PUSH4 0xB0244682 EQ PUSH2 0x716 JUMPI PUSH2 0x30C JUMP JUMPDEST DUP1 PUSH4 0x8AA3EC6F EQ PUSH2 0x6AA JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x6D0 JUMPI DUP1 PUSH4 0x94144C6B EQ PUSH2 0x6D8 JUMPI PUSH2 0x30C JUMP JUMPDEST DUP1 PUSH4 0x72F33EA9 EQ PUSH2 0x629 JUMPI DUP1 PUSH4 0x738BBEA8 EQ PUSH2 0x631 JUMPI DUP1 PUSH4 0x75619AB5 EQ PUSH2 0x639 JUMPI DUP1 PUSH4 0x7F4296D7 EQ PUSH2 0x65F JUMPI DUP1 PUSH4 0x876F5C7E EQ PUSH2 0x685 JUMPI DUP1 PUSH4 0x884A4448 EQ PUSH2 0x68D JUMPI PUSH2 0x30C JUMP JUMPDEST DUP1 PUSH4 0x4E5D08E0 GT PUSH2 0x25C JUMPI DUP1 PUSH4 0x671137C4 GT PUSH2 0x215 JUMPI DUP1 PUSH4 0x6BEA5344 GT PUSH2 0x1EF JUMPI DUP1 PUSH4 0x6BEA5344 EQ PUSH2 0x609 JUMPI DUP1 PUSH4 0x6CC25DB7 EQ PUSH2 0x611 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x619 JUMPI DUP1 PUSH4 0x719CE73E EQ PUSH2 0x621 JUMPI PUSH2 0x30C JUMP JUMPDEST DUP1 PUSH4 0x671137C4 EQ PUSH2 0x5CB JUMPI DUP1 PUSH4 0x6A74F107 EQ PUSH2 0x5F9 JUMPI DUP1 PUSH4 0x6BE51C4F EQ PUSH2 0x601 JUMPI PUSH2 0x30C JUMP JUMPDEST DUP1 PUSH4 0x4E5D08E0 EQ PUSH2 0x4D6 JUMPI DUP1 PUSH4 0x500DB70D EQ PUSH2 0x4FC JUMPI DUP1 PUSH4 0x605E25AC EQ PUSH2 0x504 JUMPI DUP1 PUSH4 0x62C77A61 EQ PUSH2 0x52A JUMPI DUP1 PUSH4 0x642D43DB EQ PUSH2 0x532 JUMPI DUP1 PUSH4 0x66968221 EQ PUSH2 0x55D JUMPI PUSH2 0x30C JUMP JUMPDEST DUP1 PUSH4 0x2C8FE73D GT PUSH2 0x2C9 JUMPI DUP1 PUSH4 0x47BED998 GT PUSH2 0x2A3 JUMPI DUP1 PUSH4 0x47BED998 EQ PUSH2 0x46D JUMPI DUP1 PUSH4 0x4ABA4F6B EQ PUSH2 0x48A JUMPI DUP1 PUSH4 0x4C169F4F EQ PUSH2 0x492 JUMPI DUP1 PUSH4 0x4D7F3DB0 EQ PUSH2 0x49A JUMPI PUSH2 0x30C JUMP JUMPDEST DUP1 PUSH4 0x2C8FE73D EQ PUSH2 0x3E7 JUMPI DUP1 PUSH4 0x30FCDF41 EQ PUSH2 0x3EF JUMPI DUP1 PUSH4 0x42D09209 EQ PUSH2 0x415 JUMPI PUSH2 0x30C JUMP JUMPDEST DUP1 PUSH4 0x1B48E34 EQ PUSH2 0x311 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x340 JUMPI DUP1 PUSH4 0xD847FC4 EQ PUSH2 0x37B JUMPI DUP1 PUSH4 0x111070E4 EQ PUSH2 0x39F JUMPI DUP1 PUSH4 0x22F8E566 EQ PUSH2 0x3A7 JUMPI DUP1 PUSH4 0x2A7AD609 EQ PUSH2 0x3C6 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x32E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x327 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x9EF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x367 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x356 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH2 0xA08 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x383 PUSH2 0xA3E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x367 PUSH2 0xA4D JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3BD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xA5C JUMP JUMPDEST STOP JUMPDEST PUSH2 0x3CE PUSH2 0xA61 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0xFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x32E PUSH2 0xA6D JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x405 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xA7C JUMP JUMPDEST PUSH2 0x41D PUSH2 0xB96 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x459 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x441 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x32E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x483 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xBA2 JUMP JUMPDEST PUSH2 0x367 PUSH2 0xBAD JUMP JUMPDEST PUSH2 0x3C4 PUSH2 0xC32 JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x4B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0xD19 JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE25 JUMP JUMPDEST PUSH2 0x383 PUSH2 0xEE1 JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x51A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xEF0 JUMP JUMPDEST PUSH2 0x41D PUSH2 0x1013 JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x548 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH4 0xFFFFFFFF DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x101F JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x573 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x58D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x59F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x5C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x1052 JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x5E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x113E JUMP JUMPDEST PUSH2 0x367 PUSH2 0x11C1 JUMP JUMPDEST PUSH2 0x383 PUSH2 0x11DA JUMP JUMPDEST PUSH2 0x3CE PUSH2 0x11E9 JUMP JUMPDEST PUSH2 0x383 PUSH2 0x11FC JUMP JUMPDEST PUSH2 0x3C4 PUSH2 0x120B JUMP JUMPDEST PUSH2 0x383 PUSH2 0x12B7 JUMP JUMPDEST PUSH2 0x32E PUSH2 0x12C6 JUMP JUMPDEST PUSH2 0x367 PUSH2 0x12CC JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x64F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x131F JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x675 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1341 JUMP JUMPDEST PUSH2 0x367 PUSH2 0x1439 JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1458 JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x14CB JUMP JUMPDEST PUSH2 0x383 PUSH2 0x15E5 JUMP JUMPDEST PUSH2 0x32E PUSH2 0x15F4 JUMP JUMPDEST PUSH2 0x41D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x15FA JUMP JUMPDEST PUSH2 0x367 PUSH2 0x1666 JUMP JUMPDEST PUSH2 0x3CE PUSH2 0x1670 JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x72C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x167C JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x75A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x172A JUMP JUMPDEST PUSH2 0x3C4 PUSH2 0x1868 JUMP JUMPDEST PUSH2 0x383 PUSH2 0x1AE9 JUMP JUMPDEST PUSH2 0x32E PUSH2 0x1AF8 JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x7AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x7D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x7EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x80B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x1B3D JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x82C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH4 0xFFFFFFFF AND PUSH2 0x1DB2 JUMP JUMPDEST PUSH2 0x32E PUSH2 0x1E25 JUMP JUMPDEST PUSH2 0x383 PUSH2 0x1E2F JUMP JUMPDEST PUSH2 0x3C4 PUSH2 0x1E3E JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x867 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2106 JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x88D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2128 JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0xE0 DUP2 LT ISZERO PUSH2 0x8B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH1 0x40 DUP4 ADD CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x60 DUP2 ADD CALLDATALOAD DUP3 AND SWAP3 PUSH1 0x80 DUP3 ADD CALLDATALOAD DUP4 AND SWAP3 PUSH1 0xA0 DUP4 ADD CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0xE0 DUP2 ADD PUSH1 0xC0 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x901 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x913 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x934 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x222B SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x97A PUSH2 0x259E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x9B4 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x99C JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x9E1 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xA02 PUSH2 0x9FC PUSH2 0x25BF JUMP JUMPDEST DUP4 PUSH2 0x25FC JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL EQ DUP1 PUSH2 0xA02 JUMPI POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT EQ SWAP1 JUMP JUMPDEST PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH4 0xFFFFFFFF AND ISZERO ISZERO JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x76 SSTORE JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA77 PUSH2 0x2625 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0xA84 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xA95 PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xADE JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3D58 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xAE6 PUSH2 0x2642 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0xB11 JUMPI POP PUSH2 0xB11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH4 0x266FCE1F PUSH1 0xE1 SHL PUSH2 0x26B4 JUMP JUMPDEST PUSH2 0xB4C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x31 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3D78 PUSH1 0x31 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x73 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xC4FEFF61630891EA2CB42A54FBE3FF2E65422F2ED17323AC6B65F4521112E87E SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0xA77 PUSH1 0x70 PUSH2 0x26D7 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA02 DUP3 PUSH2 0x27B7 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x6A SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xE866E6F PUSH1 0xE2 SHL DUP2 MSTORE PUSH4 0xFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x3A19B9BC SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC01 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xC15 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xC2B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0xC3A PUSH2 0x12CC JUMP JUMPDEST PUSH2 0xC75 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3EFB PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF NOT DUP2 AND SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH4 0xFFFFFFFF DUP1 DUP4 AND SWAP3 PUSH1 0x1 PUSH1 0x20 SHL SWAP1 DIV AND SWAP1 PUSH32 0xEE6702C46C5618E6FC7E625C71F4C85DF9C91D456CB16A3AEA71AB83B1FEE005 SWAP1 PUSH1 0x0 SWAP1 LOG1 PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xFFFFFFFF DUP5 DUP2 AND DUP3 MSTORE SWAP2 MLOAD SWAP2 DUP6 AND SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 CALLER SWAP2 PUSH32 0xD50026EE0824513AF20CDF5E72D1FBFBE8FD646EE0576378E080326F1A695E58 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xD2D PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xD72 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3BFF PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0xD90 JUMPI PUSH2 0xD90 PUSH2 0x2642 JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0xE1F JUMPI PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE DUP6 DUP2 AND PUSH1 0x44 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x4D7F3DB0 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE06 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xE1A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0xE2D PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE3E PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0xE6D JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE62 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0xE92 JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE87 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0xECD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3B75 PUSH1 0x2C SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xED5 PUSH2 0x2642 JUMP JUMPDEST PUSH2 0xEDE DUP2 PUSH2 0x27FE JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0xEF8 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF09 PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xF52 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3D58 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xF5A PUSH2 0x2642 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0xF88 JUMPI POP PUSH2 0xF88 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x26B4 JUMP JUMPDEST PUSH2 0xFC3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3AF8 PUSH1 0x2C SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x65 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 AND SWAP1 PUSH32 0x9FC437AA70AD4EE5F33F6772BF338EED41E21B95435820817AB8B4DF161CE4DD SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0xA77 PUSH1 0x6E PUSH2 0x26D7 JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH4 0xFFFFFFFF SWAP3 DUP4 AND PUSH1 0x1 PUSH1 0x20 SHL MUL PUSH8 0xFFFFFFFF00000000 NOT SWAP5 SWAP1 SWAP4 AND PUSH4 0xFFFFFFFF NOT SWAP1 SWAP2 AND OR SWAP3 SWAP1 SWAP3 AND OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x105A PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x106B PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0x109A JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x108F PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0x10BF JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x10B4 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0x10FA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3B75 PUSH1 0x2C SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1102 PUSH2 0x2642 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1139 JUMPI PUSH2 0x1131 DUP4 DUP4 DUP4 DUP2 DUP2 LT PUSH2 0x111C JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x27FE JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x1105 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x1146 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1157 PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x11A0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3D58 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x11A8 PUSH2 0x2642 JUMP JUMPDEST PUSH2 0x11B4 PUSH1 0x70 DUP3 DUP5 PUSH2 0x2A65 JUMP JUMPDEST PUSH2 0x11BD DUP3 PUSH2 0x2B81 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11CB PUSH2 0xA4D JUMP JUMPDEST DUP1 ISZERO PUSH2 0xA77 JUMPI POP PUSH2 0xA77 PUSH2 0xBAD JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH1 0x1 PUSH1 0x20 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1213 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1224 PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x126D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3D58 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x6D SLOAD DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND PUSH2 0x12EB JUMPI POP PUSH1 0x0 PUSH2 0xA59 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH1 0x6B SLOAD PUSH2 0x130F SWAP2 PUSH4 0xFFFFFFFF SWAP2 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 SWAP2 DIV DUP2 AND SWAP1 PUSH2 0x2BD9 AND JUMP JUMPDEST PUSH2 0x1317 PUSH2 0x2C33 JUMP JUMPDEST GT SWAP1 POP PUSH2 0xA59 JUMP JUMPDEST PUSH1 0x75 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x1349 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x135A PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x13A3 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3D58 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x13AB PUSH2 0x2642 JUMP JUMPDEST PUSH2 0x13B3 PUSH2 0xA4D JUMP JUMPDEST ISZERO PUSH2 0x13EF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3ED8 PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x69 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xF935763CC7C57EE8ED6318ED71E756CCA0731294C9F46FF5B386F36D6FF1417A SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1443 PUSH2 0x2C39 JUMP JUMPDEST DUP1 ISZERO PUSH2 0xA77 JUMPI POP PUSH2 0x1452 PUSH2 0xA4D JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x1460 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1471 PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x14BA JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3D58 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x14C2 PUSH2 0x2642 JUMP JUMPDEST PUSH2 0xEDE DUP2 PUSH2 0x2C52 JUMP JUMPDEST PUSH2 0x14D3 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x14E4 PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x152D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3D58 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1535 PUSH2 0x2642 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0x1560 JUMPI POP PUSH2 0x1560 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH4 0x2BA83963 PUSH1 0xE1 SHL PUSH2 0x26B4 JUMP JUMPDEST PUSH2 0x159B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x33 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E49 PUSH1 0x33 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x74 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xDA05D50A3A1EC0FFAB059F1D457AE59F68CCFB3FFBB4DAD283C516F9103D584B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x6C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD DUP4 MLOAD DUP2 DUP5 MUL DUP2 ADD DUP5 ADD SWAP1 SWAP5 MSTORE DUP1 DUP5 MSTORE PUSH1 0x60 SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x165A JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x1646 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA77 PUSH2 0x2C39 JUMP JUMPDEST PUSH1 0x6B SLOAD PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x1684 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1695 PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x16DE JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3D58 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x16E6 PUSH2 0x2642 JUMP JUMPDEST PUSH2 0x16F2 PUSH1 0x6E DUP3 DUP5 PUSH2 0x2A65 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 PUSH32 0x58982464497ACDAB11AD29D39907E076B0D3B8DAF1D9B734174C7C3A2A0E8C74 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x173E PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1783 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3BFF PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x17D4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3C24 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x17F2 JUMPI PUSH2 0x17F2 PUSH2 0x2642 JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0xE1F JUMPI PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP7 SWAP1 MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xB2210957 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE06 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1870 PUSH2 0x2C39 JUMP JUMPDEST PUSH2 0x18AB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3B24 PUSH1 0x2B SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x18B3 PUSH2 0xA4D JUMP JUMPDEST ISZERO PUSH2 0x18EF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3D0C PUSH1 0x2B SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xD37B537 PUSH1 0xE0 SHL DUP2 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP3 PUSH4 0xD37B537 SWAP3 PUSH1 0x4 DUP1 DUP4 ADD SWAP4 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1934 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1948 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x195E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MLOAD SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1984 JUMPI POP PUSH1 0x0 DUP2 GT JUMPDEST ISZERO PUSH2 0x19A3 JUMPI PUSH1 0x69 SLOAD PUSH2 0x19A3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND SWAP2 AND DUP4 PUSH2 0x2CCC JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x433C53D9 PUSH1 0xE1 SHL DUP2 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP3 PUSH4 0x8678A7B2 SWAP3 PUSH1 0x4 DUP1 DUP4 ADD SWAP4 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x19E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x19FD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1A13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MLOAD PUSH1 0x6A DUP1 SLOAD PUSH4 0xFFFFFFFF DUP1 DUP5 AND PUSH1 0x1 PUSH1 0x20 SHL MUL PUSH8 0xFFFFFFFF00000000 NOT SWAP2 DUP7 AND PUSH4 0xFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR AND OR SWAP1 SSTORE SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x1A61 PUSH2 0x1A5C PUSH2 0x2C33 JUMP JUMPDEST PUSH2 0x2DDF JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFF0000000000000000 NOT AND PUSH1 0x1 PUSH1 0x40 SHL PUSH4 0xFFFFFFFF SWAP4 DUP5 AND MUL OR SWAP1 SSTORE PUSH1 0x66 SLOAD SWAP1 DUP4 AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A9D PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x4D31E658DCF617BB3A3C8CF7C6DDDB33F7030AC588E271631ECDB5D76C2E91EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP JUMP JUMPDEST PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x18C1996D PUSH1 0xE2 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x630665B4 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC01 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B45 PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1B56 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0x1B85 JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1B7A PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0x1BAA JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1B9F PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0x1BE5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3B75 PUSH1 0x2C SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1BED PUSH2 0x2642 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x6A3FD4F9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x6A3FD4F9 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C3A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C4E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1C64 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0x1CA1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3DA9 PUSH1 0x2B SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1CBB PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH4 0x80AC58CD PUSH1 0xE0 SHL PUSH2 0x26B4 JUMP JUMPDEST PUSH2 0x1CF6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3AD4 PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1D01 PUSH1 0x70 DUP5 PUSH2 0x2E27 JUMP JUMPDEST PUSH2 0x1D10 JUMPI PUSH2 0x1D10 PUSH1 0x70 DUP5 PUSH2 0x2E78 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1D3F JUMPI PUSH2 0x1D37 DUP5 DUP5 DUP5 DUP5 DUP2 DUP2 LT PUSH2 0x1D2B JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH2 0x2F8C JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x1D13 JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x51541DC4B4C08A16085809CCCDC4CC77D8000B60FBB00142E57F236D84298675 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP6 POP SWAP1 SWAP4 POP POP POP POP LOG2 POP POP POP JUMP JUMPDEST PUSH2 0x1DBA PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1DCB PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1E14 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3D58 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1E1C PUSH2 0x2642 JUMP JUMPDEST PUSH2 0xEDE DUP2 PUSH2 0x3112 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA77 PUSH2 0x25BF JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1E46 PUSH2 0xA4D JUMP JUMPDEST PUSH2 0x1E81 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F4D PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1E89 PUSH2 0xBAD JUMP JUMPDEST PUSH2 0x1EC4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3C95 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x6A SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x13A54BF3 PUSH1 0xE3 SHL DUP2 MSTORE PUSH4 0xFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x9D2A5F98 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1F19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1F2D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1F43 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE PUSH1 0x73 SLOAD SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x1FDE JUMPI PUSH1 0x73 SLOAD PUSH1 0x6D SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x266FCE1F PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x4CDF9C3E SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1FC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1FD9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x1FE7 DUP2 PUSH2 0x31AB JUMP JUMPDEST PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2068 JUMPI PUSH1 0x74 SLOAD PUSH1 0x6D SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x2BA83963 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x575072C6 SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x204F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2063 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x2078 PUSH2 0x2073 PUSH2 0x2C33 JUMP JUMPDEST PUSH2 0x27B7 JUMP JUMPDEST PUSH1 0x6D SSTORE PUSH2 0x2083 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x9C4163ECE98173EAB9A496C4DB8BF3E2C8EDCC5D2854377880597CCB858B7A9D DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x6D SLOAD PUSH2 0x20CE PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC61852C20F0B03B31D782F3022F2BF20322AC17CE66C5349FB6E24740CDD6456 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP JUMP JUMPDEST PUSH1 0x73 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x2130 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2141 PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x218A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3D58 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x21CF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3B4F PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2244 JUMPI POP PUSH2 0x2244 PUSH2 0x3213 JUMP JUMPDEST DUP1 PUSH2 0x2252 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x228D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3CDE PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x22B8 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH2 0x22FD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3C4A PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x2342 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3DFA PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x2387 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3BA1 PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x23CC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3C73 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x66 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP10 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SWAP3 SSTORE PUSH1 0x67 DUP1 SLOAD DUP9 DUP5 AND SWAP1 DUP4 AND OR SWAP1 SSTORE PUSH1 0x69 DUP1 SLOAD DUP7 DUP5 AND SWAP1 DUP4 AND OR SWAP1 SSTORE PUSH1 0x68 DUP1 SLOAD SWAP3 DUP8 AND SWAP3 SWAP1 SWAP2 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x241F DUP8 PUSH2 0x2C52 JUMP JUMPDEST PUSH2 0x2427 PUSH2 0x321E JUMP JUMPDEST PUSH2 0x2431 PUSH1 0x6E PUSH2 0x32CF JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 MLOAD DUP2 LT ISZERO PUSH2 0x2461 JUMPI PUSH2 0x2459 DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x244C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x27FE JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2434 JUMP JUMPDEST POP PUSH1 0x6C DUP8 SWAP1 SSTORE PUSH1 0x6D DUP9 SWAP1 SSTORE PUSH2 0x2476 PUSH1 0x70 PUSH2 0x32CF JUMP JUMPDEST PUSH2 0x2481 PUSH2 0x708 PUSH2 0x3112 JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xF9632D212436344A25150FF0C161DABF412AADE556621C2DEA146CA63FF643F5 DUP10 DUP10 DUP9 DUP9 DUP9 DUP9 PUSH1 0x40 MLOAD DUP1 DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x252B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2513 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP8 POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x6D SLOAD PUSH2 0x254E PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC61852C20F0B03B31D782F3022F2BF20322AC17CE66C5349FB6E24740CDD6456 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 DUP1 ISZERO PUSH2 0xE1A JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x25CA PUSH2 0x2625 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x25D6 PUSH2 0x2C33 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 GT ISZERO PUSH2 0x25EB JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0xA59 JUMP JUMPDEST PUSH2 0x25F5 DUP3 DUP3 PUSH2 0x3337 JUMP JUMPDEST SWAP3 POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2611 PUSH8 0xDE0B6B3A7640000 DUP6 PUSH2 0x3394 JUMP JUMPDEST SWAP1 POP PUSH2 0x261D DUP2 DUP5 PUSH2 0x33ED JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA77 PUSH1 0x6C SLOAD PUSH1 0x6D SLOAD PUSH2 0x2BD9 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x264C PUSH2 0x342F JUMP JUMPDEST PUSH1 0x6A SLOAD SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x20 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND ISZERO DUP1 PUSH2 0x2679 JUMPI POP PUSH1 0x6A SLOAD PUSH1 0x1 PUSH1 0x20 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP2 LT JUMPDEST PUSH2 0xEDE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3ED8 PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x26BF DUP4 PUSH2 0x3433 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x26D0 JUMPI POP PUSH2 0x26D0 DUP4 DUP4 PUSH2 0x3466 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 PUSH1 0x0 ADD SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x26F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x271F JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x2762 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST ISZERO PUSH2 0x27AE JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x2774 JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x20 SWAP2 DUP3 MUL SWAP3 SWAP1 SWAP3 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP1 DUP9 ADD SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP3 SWAP1 SWAP2 ADD SWAP2 AND PUSH2 0x2740 JUMP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x27DB PUSH1 0x6C SLOAD PUSH2 0x27D5 PUSH1 0x6D SLOAD DUP7 PUSH2 0x3337 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 PUSH2 0x348C JUMP JUMPDEST SWAP1 POP PUSH2 0x26D0 PUSH2 0x27F5 PUSH1 0x6C SLOAD DUP4 PUSH2 0x3394 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x6D SLOAD SWAP1 PUSH2 0x2BD9 JUMP JUMPDEST PUSH2 0x2810 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x34F3 JUMP JUMPDEST PUSH2 0x2861 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F65726332302D6E756C6C PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x6A3FD4F9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x6A3FD4F9 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x28AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x28C2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x28D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0x2915 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3DA9 PUSH1 0x2B SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x4 DUP2 MSTORE PUSH1 0x24 DUP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 PUSH1 0x60 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x297B JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x295C JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x29DB JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x29E0 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x2A21 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3CBB PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x2A2C PUSH1 0x6E DUP5 PUSH2 0x2E78 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH32 0xBCD6D991F3416E288BF59A2997B423772937B62C7EA7DD1A54AF7771DE1F7418 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x2A87 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO ISZERO JUMPDEST PUSH2 0x2ACA JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xF PUSH1 0x24 DUP3 ADD MSTORE PUSH15 0x496E76616C69642061646472657373 PUSH1 0x88 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 AND SWAP1 DUP3 AND EQ PUSH2 0x2B33 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH19 0x496E76616C6964207072657641646472657373 PUSH1 0x68 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD SWAP6 DUP6 AND DUP4 MSTORE SWAP1 DUP3 KECCAK256 DUP1 SLOAD SWAP6 SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP6 DUP7 AND OR SWAP1 SWAP4 SSTORE MSTORE DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x2BA2 SWAP2 PUSH2 0x3AA5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH32 0xCD64D9DACD230C5CCF1278EA5332B0621AA28C950FB0E61C8FBC9E2011C88A34 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x26D0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x76 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2C43 PUSH2 0x2625 JUMP JUMPDEST PUSH2 0x2C4B PUSH2 0x2C33 JUMP JUMPDEST LT ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 GT PUSH2 0x2C91 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x34 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3BCB PUSH1 0x34 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x6C DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xD379C1A7282461E725A9DC2D74E65246C77E98AE93835E26C2F1654C48EE4EC SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST DUP1 ISZERO DUP1 PUSH2 0x2D52 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH4 0x6EB1769F PUSH1 0xE1 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 DUP6 AND SWAP2 PUSH4 0xDD62ED3E SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2D24 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2D38 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2D4E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO JUMPDEST PUSH2 0x2D8D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x36 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E7C PUSH1 0x36 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x95EA7B3 PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0x1139 SWAP1 DUP5 SWAP1 PUSH2 0x34F9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x20 SHL DUP3 LT PUSH2 0x2E23 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3DD4 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x2E4B JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x26D0 JUMPI POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD AND ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x2E9A JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO ISZERO JUMPDEST PUSH2 0x2EDD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xF PUSH1 0x24 DUP3 ADD MSTORE PUSH15 0x496E76616C69642061646472657373 PUSH1 0x88 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x2F3C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xD PUSH1 0x24 DUP3 ADD MSTORE PUSH13 0x105B1C9958591E481859191959 PUSH1 0x9A SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE DUP4 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP6 DUP7 AND DUP1 DUP6 MSTORE SWAP3 DUP5 KECCAK256 DUP1 SLOAD SWAP7 SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP7 DUP8 AND OR SWAP1 SSTORE SWAP2 DUP4 SWAP1 MSTORE DUP2 SLOAD SWAP1 SWAP4 AND SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x31A9108F PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 DUP6 AND SWAP2 PUSH4 0x6352211E SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2FDA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2FEE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3004 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x304B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F74 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 LT ISZERO PUSH2 0x30E5 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP4 SWAP2 SWAP1 DUP4 SWAP1 DUP2 LT PUSH2 0x3095 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD EQ ISZERO PUSH2 0x30DD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3EB2 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 ADD PUSH2 0x304E JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE SWAP1 DUP4 MSTORE SWAP2 KECCAK256 ADD SSTORE JUMP JUMPDEST PUSH1 0x3C DUP2 PUSH4 0xFFFFFFFF AND GT PUSH2 0x3157 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F21 PUSH1 0x2C SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x6B DUP1 SLOAD PUSH4 0xFFFFFFFF NOT AND PUSH4 0xFFFFFFFF DUP4 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP2 AND DUP3 MSTORE MLOAD PUSH32 0x4F27F6F220FFAD585E728389BC2F0F6B74EEEBEB43F95F53752A647CB6E7E687 SWAP2 PUSH1 0x20 SWAP1 DUP3 SWAP1 SUB ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x75 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x91C05B0B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x91C05B0B SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x31F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x320C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1452 ADDRESS PUSH2 0x34F3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3237 JUMPI POP PUSH2 0x3237 PUSH2 0x3213 JUMP JUMPDEST DUP1 PUSH2 0x3245 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3280 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3CDE PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x32AB JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x32B3 PUSH2 0x35AA JUMP JUMPDEST PUSH2 0x32BB PUSH2 0x364A JUMP JUMPDEST DUP1 ISZERO PUSH2 0xEDE JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST DUP1 SLOAD ISZERO PUSH2 0x3312 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xC PUSH1 0x24 DUP3 ADD MSTORE PUSH12 0x105B1C9958591E481A5B9A5D PUSH1 0xA2 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP2 DUP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x338E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x33A3 JUMPI POP PUSH1 0x0 PUSH2 0xA02 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x33B0 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x26D0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3D37 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x26D0 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x3743 JUMP JUMPDEST NUMBER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3446 DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3466 JUMP JUMPDEST DUP1 ISZERO PUSH2 0xA02 JUMPI POP PUSH2 0x345F DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3466 JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x3475 DUP6 DUP6 PUSH2 0x37E5 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x3483 JUMPI POP DUP1 JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x34E2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x34EB JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x354E DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3919 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x1139 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x356D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0x1139 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E1F PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x35C3 JUMPI POP PUSH2 0x35C3 PUSH2 0x3213 JUMP JUMPDEST DUP1 PUSH2 0x35D1 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x360C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3CDE PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x32BB JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xEDE JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3663 JUMPI POP PUSH2 0x3663 PUSH2 0x3213 JUMP JUMPDEST DUP1 PUSH2 0x3671 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x36AC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3CDE PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x36D7 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x36E1 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0xEDE JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x37CF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3794 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x377C JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x37C1 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x37DB JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x24 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP3 DUP5 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND SWAP3 PUSH2 0x7530 SWAP3 DUP8 SWAP3 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x386D JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x384E JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x38CE JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x38D3 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x38F1 JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x3912 JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3907 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x261D DUP5 DUP5 PUSH1 0x0 DUP6 DUP6 PUSH2 0x392D DUP6 PUSH2 0x34F3 JUMP JUMPDEST PUSH2 0x397E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x39BD JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x399E JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3A1F JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3A24 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x3A34 DUP3 DUP3 DUP7 PUSH2 0x3A3F JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x3A4E JUMPI POP DUP2 PUSH2 0x26D0 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x3A5E JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x3794 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x377C JUMP JUMPDEST POP DUP1 SLOAD PUSH1 0x0 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0xEDE SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x2E23 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x3ABF JUMP INVALID POP PUSH6 0x72696F646963 POP PUSH19 0x697A6553747261746567792F6572633732312D PUSH10 0x6E76616C696450657269 PUSH16 0x6469635072697A655374726174656779 0x2F PUSH21 0x6F6B656E2D6C697374656E65722D696E76616C6964 POP PUSH6 0x72696F646963 POP PUSH19 0x697A6553747261746567792F7072697A652D70 PUSH6 0x72696F642D6E PUSH16 0x742D6F7665724F776E61626C653A206E PUSH6 0x77206F776E65 PUSH19 0x20697320746865207A65726F20616464726573 PUSH20 0x506572696F6469635072697A6553747261746567 PUSH26 0x2F6F6E6C792D6F776E65722D6F722D6C697374656E6572506572 PUSH10 0x6F6469635072697A6553 PUSH21 0x7261746567792F73706F6E736F72736869702D6E6F PUSH21 0x2D7A65726F506572696F6469635072697A65537472 PUSH2 0x7465 PUSH8 0x792F7072697A652D PUSH17 0x6572696F642D677265617465722D746861 PUSH15 0x2D7A65726F506572696F6469635072 PUSH10 0x7A655374726174656779 0x2F PUSH16 0x6E6C792D7072697A652D706F6F6C5065 PUSH19 0x696F6469635072697A6553747261746567792F PUSH21 0x72616E736665722D746F2D73656C66506572696F64 PUSH10 0x635072697A6553747261 PUSH21 0x6567792F7072697A652D706F6F6C2D6E6F742D7A65 PUSH19 0x6F506572696F6469635072697A655374726174 PUSH6 0x67792F726E67 0x2D PUSH15 0x6F742D7A65726F506572696F646963 POP PUSH19 0x697A6553747261746567792F726E672D6E6F74 0x2D PUSH4 0x6F6D706C PUSH6 0x746550657269 PUSH16 0x6469635072697A655374726174656779 0x2F PUSH6 0x726332302D69 PUSH15 0x76616C6964496E697469616C697A61 PUSH3 0x6C653A KECCAK256 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 POP PUSH6 0x72696F646963 POP PUSH19 0x697A6553747261746567792F726E672D616C72 PUSH6 0x6164792D7265 PUSH18 0x756573746564536166654D6174683A206D75 PUSH13 0x7469706C69636174696F6E206F PUSH23 0x6572666C6F774F776E61626C653A2063616C6C65722069 PUSH20 0x206E6F7420746865206F776E6572506572696F64 PUSH10 0x635072697A6553747261 PUSH21 0x6567792F6265666F726541776172644C697374656E PUSH6 0x722D696E7661 PUSH13 0x6964506572696F646963507269 PUSH27 0x6553747261746567792F63616E6E6F742D61776172642D65787465 PUSH19 0x6E616C53616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E2033322062697473506572696F64 PUSH10 0x635072697A6553747261 PUSH21 0x6567792F7469636B65742D6E6F742D7A65726F5361 PUSH7 0x6545524332303A KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x756363656564506572696F6469635072697A6553 PUSH21 0x7261746567792F7072697A6553747261746567794C PUSH10 0x7374656E65722D696E76 PUSH2 0x6C69 PUSH5 0x5361666545 MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F76652066726F6D206E6F6E2D7A65726F2074 PUSH16 0x206E6F6E2D7A65726F20616C6C6F7761 PUSH15 0x6365506572696F6469635072697A65 MSTORE8 PUSH21 0x7261746567792F6572633732312D6475706C696361 PUSH21 0x65506572696F6469635072697A6553747261746567 PUSH26 0x2F726E672D696E2D666C69676874506572696F6469635072697A PUSH6 0x537472617465 PUSH8 0x792F726E672D6E6F PUSH21 0x2D74696D65646F7574506572696F6469635072697A PUSH6 0x537472617465 PUSH8 0x792F726E672D7469 PUSH14 0x656F75742D67742D36302D736563 PUSH20 0x506572696F6469635072697A6553747261746567 PUSH26 0x2F726E672D6E6F742D726571756573746564506572696F646963 POP PUSH19 0x697A6553747261746567792F756E617661696C PUSH2 0x626C PUSH6 0x2D746F6B656E LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 GAS 0x2D BLOCKHASH 0xBC PUSH13 0x9CCA45D3C3872FC80F7D222580 0xAF BLOCKHASH JUMPDEST DUP6 GAS 0x2F SWAP14 CALL ADDMOD SGT 0xE1 PUSH20 0xFFDF64736F6C634300060C003300000000000000 ",
              "sourceMap": "185:830:75:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506004361061030c5760003560e01c806372f33ea91161019d578063b2210957116100e9578063d5ad6bf6116100a2578063f210a9f31161007c578063f210a9f314610851578063f2fde38b14610877578063f97700e21461089d578063ffa1ad74146109725761030c565b8063d5ad6bf614610839578063d605787b14610841578063dfb2f13b146108495761030c565b8063b221095714610744578063b9ee1e0514610780578063c2f19ee814610788578063c42b42a014610790578063c48ddbcb14610798578063c6853270146108165761030c565b80638aa3ec6f116101565780639417783f116101305780639417783f146106e057806395e5f9ee14610706578063acca5b951461070e578063b0244682146107165761030c565b80638aa3ec6f146106aa5780638da5cb5b146106d057806394144c6b146106d85761030c565b806372f33ea914610629578063738bbea81461063157806375619ab5146106395780637f4296d71461065f578063876f5c7e14610685578063884a44481461068d5761030c565b80634e5d08e01161025c578063671137c4116102155780636bea5344116101ef5780636bea5344146106095780636cc25db714610611578063715018a614610619578063719ce73e146106215761030c565b8063671137c4146105cb5780636a74f107146105f95780636be51c4f146106015761030c565b80634e5d08e0146104d6578063500db70d146104fc578063605e25ac1461050457806362c77a611461052a578063642d43db14610532578063669682211461055d5761030c565b80632c8fe73d116102c957806347bed998116102a357806347bed9981461046d5780634aba4f6b1461048a5780634c169f4f146104925780634d7f3db01461049a5761030c565b80632c8fe73d146103e757806330fcdf41146103ef57806342d09209146104155761030c565b806301b48e341461031157806301ffc9a7146103405780630d847fc41461037b578063111070e41461039f57806322f8e566146103a75780632a7ad609146103c6575b600080fd5b61032e6004803603602081101561032757600080fd5b50356109ef565b60408051918252519081900360200190f35b6103676004803603602081101561035657600080fd5b50356001600160e01b031916610a08565b604080519115158252519081900360200190f35b610383610a3e565b604080516001600160a01b039092168252519081900360200190f35b610367610a4d565b6103c4600480360360208110156103bd57600080fd5b5035610a5c565b005b6103ce610a61565b6040805163ffffffff9092168252519081900360200190f35b61032e610a6d565b6103c46004803603602081101561040557600080fd5b50356001600160a01b0316610a7c565b61041d610b96565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610459578181015183820152602001610441565b505050509050019250505060405180910390f35b61032e6004803603602081101561048357600080fd5b5035610ba2565b610367610bad565b6103c4610c32565b6103c4600480360360808110156104b057600080fd5b506001600160a01b03813581169160208101359160408201358116916060013516610d19565b6103c4600480360360208110156104ec57600080fd5b50356001600160a01b0316610e25565b610383610ee1565b6103c46004803603602081101561051a57600080fd5b50356001600160a01b0316610ef0565b61041d611013565b6103c46004803603604081101561054857600080fd5b5063ffffffff8135811691602001351661101f565b6103c46004803603602081101561057357600080fd5b810190602081018135600160201b81111561058d57600080fd5b82018360208201111561059f57600080fd5b803590602001918460208302840111600160201b831117156105c057600080fd5b509092509050611052565b6103c4600480360360408110156105e157600080fd5b506001600160a01b038135811691602001351661113e565b6103676111c1565b6103836111da565b6103ce6111e9565b6103836111fc565b6103c461120b565b6103836112b7565b61032e6112c6565b6103676112cc565b6103c46004803603602081101561064f57600080fd5b50356001600160a01b031661131f565b6103c46004803603602081101561067557600080fd5b50356001600160a01b0316611341565b610367611439565b6103c4600480360360208110156106a357600080fd5b5035611458565b6103c4600480360360208110156106c057600080fd5b50356001600160a01b03166114cb565b6103836115e5565b61032e6115f4565b61041d600480360360208110156106f657600080fd5b50356001600160a01b03166115fa565b610367611666565b6103ce611670565b6103c46004803603604081101561072c57600080fd5b506001600160a01b038135811691602001351661167c565b6103c46004803603608081101561075a57600080fd5b506001600160a01b0381358116916020810135821691604082013591606001351661172a565b6103c4611868565b610383611ae9565b61032e611af8565b6103c4600480360360408110156107ae57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156107d857600080fd5b8201836020820111156107ea57600080fd5b803590602001918460208302840111600160201b8311171561080b57600080fd5b509092509050611b3d565b6103c46004803603602081101561082c57600080fd5b503563ffffffff16611db2565b61032e611e25565b610383611e2f565b6103c4611e3e565b6103c46004803603602081101561086757600080fd5b50356001600160a01b0316612106565b6103c46004803603602081101561088d57600080fd5b50356001600160a01b0316612128565b6103c4600480360360e08110156108b357600080fd5b8135916020810135916001600160a01b0360408301358116926060810135821692608082013583169260a083013516919081019060e0810160c0820135600160201b81111561090157600080fd5b82018360208201111561091357600080fd5b803590602001918460208302840111600160201b8311171561093457600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061222b945050505050565b61097a61259e565b6040805160208082528351818301528351919283929083019185019080838360005b838110156109b457818101518382015260200161099c565b50505050905090810190601f1680156109e15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610a026109fc6125bf565b836125fc565b92915050565b60006001600160e01b031982166301ffc9a760e01b1480610a025750506001600160e01b031916600162a1cb1960e01b03191490565b6073546001600160a01b031681565b606a5463ffffffff1615155b90565b607655565b606a5463ffffffff1690565b6000610a77612625565b905090565b610a8461263e565b6001600160a01b0316610a956115e5565b6001600160a01b031614610ade576040805162461bcd60e51b81526020600482018190526024820152600080516020613d58833981519152604482015290519081900360640190fd5b610ae6612642565b6001600160a01b0381161580610b115750610b116001600160a01b03821663266fce1f60e11b6126b4565b610b4c5760405162461bcd60e51b8152600401808060200182810382526031815260200180613d786031913960400191505060405180910390fd5b607380546001600160a01b0319166001600160a01b0383169081179091556040517fc4feff61630891ea2cb42a54fbe3ff2e65422f2ed17323ac6b65f4521112e87e90600090a250565b6060610a7760706126d7565b6000610a02826127b7565b606954606a5460408051630e866e6f60e21b815263ffffffff9092166004830152516000926001600160a01b031691633a19b9bc916024808301926020929190829003018186803b158015610c0157600080fd5b505afa158015610c15573d6000803e3d6000fd5b505050506040513d6020811015610c2b57600080fd5b5051905090565b610c3a6112cc565b610c755760405162461bcd60e51b8152600401808060200182810382526026815260200180613efb6026913960400191505060405180910390fd5b606a80546bffffffffffffffffffffffff19811690915560405163ffffffff80831692600160201b900416907fee6702c46c5618e6fc7e625c71f4c85df9c91d456cb16a3aea71ab83b1fee00590600090a16066546040805163ffffffff84811682529151918516926001600160a01b03169133917fd50026ee0824513af20cdf5e72d1fbfbe8fd646ee0576378e080326f1a695e58919081900360200190a45050565b6066546001600160a01b0316610d2d61263e565b6001600160a01b031614610d725760405162461bcd60e51b8152600401808060200182810382526025815260200180613bff6025913960400191505060405180910390fd5b6067546001600160a01b0383811691161415610d9057610d90612642565b6065546001600160a01b031615610e1f57606554604080516304d7f3db60e41b81526001600160a01b038781166004830152602482018790528581166044830152848116606483015291519190921691634d7f3db091608480830192600092919082900301818387803b158015610e0657600080fd5b505af1158015610e1a573d6000803e3d6000fd5b505050505b50505050565b610e2d6115e5565b6001600160a01b0316610e3e61263e565b6001600160a01b03161480610e6d57506074546001600160a01b0316610e6261263e565b6001600160a01b0316145b80610e9257506073546001600160a01b0316610e8761263e565b6001600160a01b0316145b610ecd5760405162461bcd60e51b815260040180806020018281038252602c815260200180613b75602c913960400191505060405180910390fd5b610ed5612642565b610ede816127fe565b50565b6068546001600160a01b031681565b610ef861263e565b6001600160a01b0316610f096115e5565b6001600160a01b031614610f52576040805162461bcd60e51b81526020600482018190526024820152600080516020613d58833981519152604482015290519081900360640190fd5b610f5a612642565b6001600160a01b0381161580610f885750610f886001600160a01b038216600162a1cb1960e01b03196126b4565b610fc35760405162461bcd60e51b815260040180806020018281038252602c815260200180613af8602c913960400191505060405180910390fd5b606580546001600160a01b0319166001600160a01b0383811691909117918290556040519116907f9fc437aa70ad4ee5f33f6772bf338eed41e21b95435820817ab8b4df161ce4dd90600090a250565b6060610a77606e6126d7565b606a805463ffffffff928316600160201b0267ffffffff00000000199490931663ffffffff199091161792909216179055565b61105a6115e5565b6001600160a01b031661106b61263e565b6001600160a01b0316148061109a57506074546001600160a01b031661108f61263e565b6001600160a01b0316145b806110bf57506073546001600160a01b03166110b461263e565b6001600160a01b0316145b6110fa5760405162461bcd60e51b815260040180806020018281038252602c815260200180613b75602c913960400191505060405180910390fd5b611102612642565b60005b818110156111395761113183838381811061111c57fe5b905060200201356001600160a01b03166127fe565b600101611105565b505050565b61114661263e565b6001600160a01b03166111576115e5565b6001600160a01b0316146111a0576040805162461bcd60e51b81526020600482018190526024820152600080516020613d58833981519152604482015290519081900360640190fd5b6111a8612642565b6111b460708284612a65565b6111bd82612b81565b5050565b60006111cb610a4d565b8015610a775750610a77610bad565b6065546001600160a01b031681565b606a54600160201b900463ffffffff1690565b6067546001600160a01b031681565b61121361263e565b6001600160a01b03166112246115e5565b6001600160a01b03161461126d576040805162461bcd60e51b81526020600482018190526024820152600080516020613d58833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6066546001600160a01b031681565b606d5481565b606a54600090600160401b900463ffffffff166112eb57506000610a59565b606a54606b5461130f9163ffffffff91821691600160401b909104811690612bd916565b611317612c33565b119050610a59565b607580546001600160a01b0319166001600160a01b0392909216919091179055565b61134961263e565b6001600160a01b031661135a6115e5565b6001600160a01b0316146113a3576040805162461bcd60e51b81526020600482018190526024820152600080516020613d58833981519152604482015290519081900360640190fd5b6113ab612642565b6113b3610a4d565b156113ef5760405162461bcd60e51b8152600401808060200182810382526023815260200180613ed86023913960400191505060405180910390fd5b606980546001600160a01b0319166001600160a01b0383169081179091556040517ff935763cc7c57ee8ed6318ed71e756cca0731294c9f46ff5b386f36d6ff1417a90600090a250565b6000611443612c39565b8015610a775750611452610a4d565b15905090565b61146061263e565b6001600160a01b03166114716115e5565b6001600160a01b0316146114ba576040805162461bcd60e51b81526020600482018190526024820152600080516020613d58833981519152604482015290519081900360640190fd5b6114c2612642565b610ede81612c52565b6114d361263e565b6001600160a01b03166114e46115e5565b6001600160a01b03161461152d576040805162461bcd60e51b81526020600482018190526024820152600080516020613d58833981519152604482015290519081900360640190fd5b611535612642565b6001600160a01b038116158061156057506115606001600160a01b038216632ba8396360e11b6126b4565b61159b5760405162461bcd60e51b8152600401808060200182810382526033815260200180613e496033913960400191505060405180910390fd5b607480546001600160a01b0319166001600160a01b0383169081179091556040517fda05d50a3a1ec0ffab059f1d457ae59f68ccfb3ffbb4dad283c516f9103d584b90600090a250565b6033546001600160a01b031690565b606c5481565b6001600160a01b03811660009081526072602090815260409182902080548351818402810184019094528084526060939283018282801561165a57602002820191906000526020600020905b815481526020019060010190808311611646575b50505050509050919050565b6000610a77612c39565b606b5463ffffffff1681565b61168461263e565b6001600160a01b03166116956115e5565b6001600160a01b0316146116de576040805162461bcd60e51b81526020600482018190526024820152600080516020613d58833981519152604482015290519081900360640190fd5b6116e6612642565b6116f2606e8284612a65565b6040516001600160a01b038316907f58982464497acdab11ad29d39907e076b0d3b8daf1d9b734174c7c3a2a0e8c7490600090a25050565b6066546001600160a01b031661173e61263e565b6001600160a01b0316146117835760405162461bcd60e51b8152600401808060200182810382526025815260200180613bff6025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031614156117d45760405162461bcd60e51b8152600401808060200182810382526026815260200180613c246026913960400191505060405180910390fd5b6067546001600160a01b03828116911614156117f2576117f2612642565b6065546001600160a01b031615610e1f576065546040805163b221095760e01b81526001600160a01b03878116600483015286811660248301526044820186905284811660648301529151919092169163b221095791608480830192600092919082900301818387803b158015610e0657600080fd5b611870612c39565b6118ab5760405162461bcd60e51b815260040180806020018281038252602b815260200180613b24602b913960400191505060405180910390fd5b6118b3610a4d565b156118ef5760405162461bcd60e51b815260040180806020018281038252602b815260200180613d0c602b913960400191505060405180910390fd5b60695460408051630d37b53760e01b8152815160009384936001600160a01b0390911692630d37b5379260048083019392829003018186803b15801561193457600080fd5b505afa158015611948573d6000803e3d6000fd5b505050506040513d604081101561195e57600080fd5b50805160209091015190925090506001600160a01b038216158015906119845750600081115b156119a3576069546119a3906001600160a01b03848116911683612ccc565b6069546040805163433c53d960e11b8152815160009384936001600160a01b0390911692638678a7b2926004808301939282900301818787803b1580156119e957600080fd5b505af11580156119fd573d6000803e3d6000fd5b505050506040513d6040811015611a1357600080fd5b508051602090910151606a805463ffffffff808416600160201b0267ffffffff000000001991861663ffffffff1990931692909217161790559092509050611a61611a5c612c33565b612ddf565b606a80546bffffffff00000000000000001916600160401b63ffffffff93841602179055606654908316906001600160a01b0316611a9d61263e565b6001600160a01b03167f4d31e658dcf617bb3a3c8cf7c6dddb33f7030ac588e271631ecdb5d76c2e91ef84604051808263ffffffff16815260200191505060405180910390a450505050565b6074546001600160a01b031681565b606654604080516318c1996d60e21b815290516000926001600160a01b03169163630665b4916004808301926020929190829003018186803b158015610c0157600080fd5b611b456115e5565b6001600160a01b0316611b5661263e565b6001600160a01b03161480611b8557506074546001600160a01b0316611b7a61263e565b6001600160a01b0316145b80611baa57506073546001600160a01b0316611b9f61263e565b6001600160a01b0316145b611be55760405162461bcd60e51b815260040180806020018281038252602c815260200180613b75602c913960400191505060405180910390fd5b611bed612642565b60665460408051636a3fd4f960e01b81526001600160a01b03868116600483015291519190921691636a3fd4f9916024808301926020929190829003018186803b158015611c3a57600080fd5b505afa158015611c4e573d6000803e3d6000fd5b505050506040513d6020811015611c6457600080fd5b5051611ca15760405162461bcd60e51b815260040180806020018281038252602b815260200180613da9602b913960400191505060405180910390fd5b611cbb6001600160a01b0384166380ac58cd60e01b6126b4565b611cf65760405162461bcd60e51b8152600401808060200182810382526024815260200180613ad46024913960400191505060405180910390fd5b611d01607084612e27565b611d1057611d10607084612e78565b60005b81811015611d3f57611d3784848484818110611d2b57fe5b90506020020135612f8c565b600101611d13565b50826001600160a01b03167f51541dc4b4c08a16085809cccdc4cc77d8000b60fbb00142e57f236d84298675838360405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a2505050565b611dba61263e565b6001600160a01b0316611dcb6115e5565b6001600160a01b031614611e14576040805162461bcd60e51b81526020600482018190526024820152600080516020613d58833981519152604482015290519081900360640190fd5b611e1c612642565b610ede81613112565b6000610a776125bf565b6069546001600160a01b031681565b611e46610a4d565b611e815760405162461bcd60e51b8152600401808060200182810382526027815260200180613f4d6027913960400191505060405180910390fd5b611e89610bad565b611ec45760405162461bcd60e51b8152600401808060200182810382526026815260200180613c956026913960400191505060405180910390fd5b606954606a54604080516313a54bf360e31b815263ffffffff9092166004830152516000926001600160a01b031691639d2a5f9891602480830192602092919082900301818787803b158015611f1957600080fd5b505af1158015611f2d573d6000803e3d6000fd5b505050506040513d6020811015611f4357600080fd5b5051606a80546bffffffffffffffffffffffff191690556073549091506001600160a01b031615611fde57607354606d546040805163266fce1f60e11b8152600481018590526024810192909252516001600160a01b0390921691634cdf9c3e9160448082019260009290919082900301818387803b158015611fc557600080fd5b505af1158015611fd9573d6000803e3d6000fd5b505050505b611fe7816131ab565b6074546001600160a01b03161561206857607454606d5460408051632ba8396360e11b8152600481018590526024810192909252516001600160a01b039092169163575072c69160448082019260009290919082900301818387803b15801561204f57600080fd5b505af1158015612063573d6000803e3d6000fd5b505050505b612078612073612c33565b6127b7565b606d5561208361263e565b6001600160a01b03167f9c4163ece98173eab9a496c4db8bf3e2c8edcc5d2854377880597ccb858b7a9d826040518082815260200191505060405180910390a2606d546120ce61263e565b6001600160a01b03167fc61852c20f0b03b31d782f3022f2bf20322ac17ce66c5349fb6e24740cdd645660405160405180910390a350565b607380546001600160a01b0319166001600160a01b0392909216919091179055565b61213061263e565b6001600160a01b03166121416115e5565b6001600160a01b03161461218a576040805162461bcd60e51b81526020600482018190526024820152600080516020613d58833981519152604482015290519081900360640190fd5b6001600160a01b0381166121cf5760405162461bcd60e51b8152600401808060200182810382526026815260200180613b4f6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff16806122445750612244613213565b80612252575060005460ff16155b61228d5760405162461bcd60e51b815260040180806020018281038252602e815260200180613cde602e913960400191505060405180910390fd5b600054610100900460ff161580156122b8576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0386166122fd5760405162461bcd60e51b8152600401808060200182810382526029815260200180613c4a6029913960400191505060405180910390fd5b6001600160a01b0385166123425760405162461bcd60e51b8152600401808060200182810382526025815260200180613dfa6025913960400191505060405180910390fd5b6001600160a01b0384166123875760405162461bcd60e51b815260040180806020018281038252602a815260200180613ba1602a913960400191505060405180910390fd5b6001600160a01b0383166123cc5760405162461bcd60e51b8152600401808060200182810382526022815260200180613c736022913960400191505060405180910390fd5b606680546001600160a01b038089166001600160a01b0319928316179092556067805488841690831617905560698054868416908316179055606880549287169290911691909117905561241f87612c52565b61242761321e565b612431606e6132cf565b60005b82518110156124615761245983828151811061244c57fe5b60200260200101516127fe565b600101612434565b50606c879055606d88905561247660706132cf565b612481610708613112565b856001600160a01b03167ff9632d212436344a25150ff0c161dabf412aade556621c2dea146ca63ff643f589898888888860405180878152602001868152602001856001600160a01b03168152602001846001600160a01b03168152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561252b578181015183820152602001612513565b5050505090500197505050505050505060405180910390a2606d5461254e61263e565b6001600160a01b03167fc61852c20f0b03b31d782f3022f2bf20322ac17ce66c5349fb6e24740cdd645660405160405180910390a38015610e1a576000805461ff00191690555050505050505050565b60405180604001604052806005815260200164332e342e3560d81b81525081565b6000806125ca612625565b905060006125d6612c33565b9050818111156125eb57600092505050610a59565b6125f58282613337565b9250505090565b600080612611670de0b6b3a764000085613394565b905061261d81846133ed565b949350505050565b6000610a77606c54606d54612bd990919063ffffffff16565b3390565b600061264c61342f565b606a54909150600160201b900463ffffffff1615806126795750606a54600160201b900463ffffffff1681105b610ede5760405162461bcd60e51b8152600401808060200182810382526023815260200180613ed86023913960400191505060405180910390fd5b60006126bf83613433565b80156126d057506126d08383613466565b9392505050565b606080826000015467ffffffffffffffff811180156126f557600080fd5b5060405190808252806020026020018201604052801561271f578160200160208202803683370190505b50600160008181529085016020526040812054919250906001600160a01b03165b6001600160a01b0381161580159061276257506001600160a01b038116600114155b156127ae578083838151811061277457fe5b6001600160a01b03928316602091820292909201810191909152918116600090815260018088019093526040902054929091019116612740565b50909392505050565b6000806127db606c546127d5606d548661333790919063ffffffff16565b9061348c565b90506126d06127f5606c548361339490919063ffffffff16565b606d5490612bd9565b612810816001600160a01b03166134f3565b612861576040805162461bcd60e51b815260206004820181905260248201527f506572696f6469635072697a6553747261746567792f65726332302d6e756c6c604482015290519081900360640190fd5b60665460408051636a3fd4f960e01b81526001600160a01b03848116600483015291519190921691636a3fd4f9916024808301926020929190829003018186803b1580156128ae57600080fd5b505afa1580156128c2573d6000803e3d6000fd5b505050506040513d60208110156128d857600080fd5b50516129155760405162461bcd60e51b815260040180806020018281038252602b815260200180613da9602b913960400191505060405180910390fd5b60408051600481526024810182526020810180516001600160e01b03166318160ddd60e01b178152915181516000936060936001600160a01b038716939092909182918083835b6020831061297b5780518252601f19909201916020918201910161295c565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d80600081146129db576040519150601f19603f3d011682016040523d82523d6000602084013e6129e0565b606091505b509150915081612a215760405162461bcd60e51b8152600401808060200182810382526023815260200180613cbb6023913960400191505060405180910390fd5b612a2c606e84612e78565b6040516001600160a01b038416907fbcd6d991f3416e288bf59a2997b423772937b62c7ea7dd1a54af7771de1f741890600090a2505050565b6001600160a01b038116600114801590612a8757506001600160a01b03811615155b612aca576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b6001600160a01b038281166000908152600185016020526040902054811690821614612b33576040805162461bcd60e51b8152602060048201526013602482015272496e76616c696420707265764164647265737360681b604482015290519081900360640190fd5b6001600160a01b039081166000818152600185016020526040808220805495851683529082208054959094166001600160a01b03199586161790935552805490911690558054600019019055565b6001600160a01b0381166000908152607260205260408120612ba291613aa5565b6040516001600160a01b038216907fcd64d9dacd230c5ccf1278ea5332b0621aa28c950fb0e61c8fbc9e2011c88a3490600090a250565b6000828201838110156126d0576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60765490565b6000612c43612625565b612c4b612c33565b1015905090565b60008111612c915760405162461bcd60e51b8152600401808060200182810382526034815260200180613bcb6034913960400191505060405180910390fd5b606c8190556040805182815290517f0d379c1a7282461e725a9dc2d74e65246c77e98ae93835e26c2f1654c48ee4ec9181900360200190a150565b801580612d52575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612d2457600080fd5b505afa158015612d38573d6000803e3d6000fd5b505050506040513d6020811015612d4e57600080fd5b5051155b612d8d5760405162461bcd60e51b8152600401808060200182810382526036815260200180613e7c6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526111399084906134f9565b6000600160201b8210612e235760405162461bcd60e51b8152600401808060200182810382526026815260200180613dd46026913960400191505060405180910390fd5b5090565b60006001600160a01b038216600114801590612e4b57506001600160a01b03821615155b80156126d05750506001600160a01b03908116600090815260019290920160205260409091205416151590565b6001600160a01b038116600114801590612e9a57506001600160a01b03811615155b612edd576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015290519081900360640190fd5b6001600160a01b0381811660009081526001840160205260409020541615612f3c576040805162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481859191959609a1b604482015290519081900360640190fd5b60016000818152838201602052604080822080546001600160a01b039586168085529284208054969091166001600160a01b03199687161790559183905281549093169092179091558154019055565b606654604080516331a9108f60e11b81526004810184905290516001600160a01b0392831692851691636352211e916024808301926020929190829003018186803b158015612fda57600080fd5b505afa158015612fee573d6000803e3d6000fd5b505050506040513d602081101561300457600080fd5b50516001600160a01b03161461304b5760405162461bcd60e51b8152600401808060200182810382526027815260200180613f746027913960400191505060405180910390fd5b60005b6001600160a01b0383166000908152607260205260409020548110156130e5576001600160a01b038316600090815260726020526040902080548391908390811061309557fe5b906000526020600020015414156130dd5760405162461bcd60e51b8152600401808060200182810382526026815260200180613eb26026913960400191505060405180910390fd5b60010161304e565b506001600160a01b0390911660009081526072602090815260408220805460018101825590835291200155565b603c8163ffffffff16116131575760405162461bcd60e51b815260040180806020018281038252602c815260200180613f21602c913960400191505060405180910390fd5b606b805463ffffffff191663ffffffff838116919091179182905560408051929091168252517f4f27f6f220ffad585e728389bc2f0f6b74eeebeb43f95f53752a647cb6e7e687916020908290030190a150565b607554604080516391c05b0b60e01b81526004810184905290516001600160a01b03909216916391c05b0b9160248082019260009290919082900301818387803b1580156131f857600080fd5b505af115801561320c573d6000803e3d6000fd5b5050505050565b6000611452306134f3565b600054610100900460ff16806132375750613237613213565b80613245575060005460ff16155b6132805760405162461bcd60e51b815260040180806020018281038252602e815260200180613cde602e913960400191505060405180910390fd5b600054610100900460ff161580156132ab576000805460ff1961ff0019909116610100171660011790555b6132b36135aa565b6132bb61364a565b8015610ede576000805461ff001916905550565b805415613312576040805162461bcd60e51b815260206004820152600c60248201526b105b1c9958591e481a5b9a5d60a21b604482015290519081900360640190fd5b60016000818152918101602052604090912080546001600160a01b0319169091179055565b60008282111561338e576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6000826133a357506000610a02565b828202828482816133b057fe5b04146126d05760405162461bcd60e51b8152600401808060200182810382526021815260200180613d376021913960400191505060405180910390fd5b60006126d083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613743565b4390565b6000613446826301ffc9a760e01b613466565b8015610a02575061345f826001600160e01b0319613466565b1592915050565b600080600061347585856137e5565b915091508180156134835750805b95945050505050565b60008082116134e2576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816134eb57fe5b049392505050565b3b151590565b606061354e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139199092919063ffffffff16565b8051909150156111395780806020019051602081101561356d57600080fd5b50516111395760405162461bcd60e51b815260040180806020018281038252602a815260200180613e1f602a913960400191505060405180910390fd5b600054610100900460ff16806135c357506135c3613213565b806135d1575060005460ff16155b61360c5760405162461bcd60e51b815260040180806020018281038252602e815260200180613cde602e913960400191505060405180910390fd5b600054610100900460ff161580156132bb576000805460ff1961ff0019909116610100171660011790558015610ede576000805461ff001916905550565b600054610100900460ff16806136635750613663613213565b80613671575060005460ff16155b6136ac5760405162461bcd60e51b815260040180806020018281038252602e815260200180613cde602e913960400191505060405180910390fd5b600054610100900460ff161580156136d7576000805460ff1961ff0019909116610100171660011790555b60006136e161263e565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610ede576000805461ff001916905550565b600081836137cf5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561379457818101518382015260200161377c565b50505050905090810190601f1680156137c15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816137db57fe5b0495945050505050565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b1781529151815160009384939284926060926001600160a01b038a169261753092879282918083835b6020831061386d5780518252601f19909201916020918201910161384e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d80600081146138ce576040519150601f19603f3d011682016040523d82523d6000602084013e6138d3565b606091505b50915091506020815110156138f15760008094509450505050613912565b8181806020019051602081101561390757600080fd5b505190955093505050505b9250929050565b606061261d84846000858561392d856134f3565b61397e576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106139bd5780518252601f19909201916020918201910161399e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613a1f576040519150601f19603f3d011682016040523d82523d6000602084013e613a24565b606091505b5091509150613a34828286613a3f565b979650505050505050565b60608315613a4e5750816126d0565b825115613a5e5782518084602001fd5b60405162461bcd60e51b815260206004820181815284516024840152845185939192839260440191908501908083836000831561379457818101518382015260200161377c565b5080546000825590600052602060002090810190610ede91905b80821115612e235760008155600101613abf56fe506572696f6469635072697a6553747261746567792f6572633732312d696e76616c6964506572696f6469635072697a6553747261746567792f746f6b656e2d6c697374656e65722d696e76616c6964506572696f6469635072697a6553747261746567792f7072697a652d706572696f642d6e6f742d6f7665724f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373506572696f6469635072697a6553747261746567792f6f6e6c792d6f776e65722d6f722d6c697374656e6572506572696f6469635072697a6553747261746567792f73706f6e736f72736869702d6e6f742d7a65726f506572696f6469635072697a6553747261746567792f7072697a652d706572696f642d677265617465722d7468616e2d7a65726f506572696f6469635072697a6553747261746567792f6f6e6c792d7072697a652d706f6f6c506572696f6469635072697a6553747261746567792f7472616e736665722d746f2d73656c66506572696f6469635072697a6553747261746567792f7072697a652d706f6f6c2d6e6f742d7a65726f506572696f6469635072697a6553747261746567792f726e672d6e6f742d7a65726f506572696f6469635072697a6553747261746567792f726e672d6e6f742d636f6d706c657465506572696f6469635072697a6553747261746567792f65726332302d696e76616c6964496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564506572696f6469635072697a6553747261746567792f726e672d616c72656164792d726571756573746564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572506572696f6469635072697a6553747261746567792f6265666f726541776172644c697374656e65722d696e76616c6964506572696f6469635072697a6553747261746567792f63616e6e6f742d61776172642d65787465726e616c53616665436173743a2076616c756520646f65736e27742066697420696e2033322062697473506572696f6469635072697a6553747261746567792f7469636b65742d6e6f742d7a65726f5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564506572696f6469635072697a6553747261746567792f7072697a6553747261746567794c697374656e65722d696e76616c69645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365506572696f6469635072697a6553747261746567792f6572633732312d6475706c6963617465506572696f6469635072697a6553747261746567792f726e672d696e2d666c69676874506572696f6469635072697a6553747261746567792f726e672d6e6f742d74696d65646f7574506572696f6469635072697a6553747261746567792f726e672d74696d656f75742d67742d36302d73656373506572696f6469635072697a6553747261746567792f726e672d6e6f742d726571756573746564506572696f6469635072697a6553747261746567792f756e617661696c61626c652d746f6b656ea26469706673582212205a2d40bc6c9cca45d3c3872fc80f7d222580af405b855a2f9df10813e173ffdf64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x30C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x72F33EA9 GT PUSH2 0x19D JUMPI DUP1 PUSH4 0xB2210957 GT PUSH2 0xE9 JUMPI DUP1 PUSH4 0xD5AD6BF6 GT PUSH2 0xA2 JUMPI DUP1 PUSH4 0xF210A9F3 GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xF210A9F3 EQ PUSH2 0x851 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x877 JUMPI DUP1 PUSH4 0xF97700E2 EQ PUSH2 0x89D JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x972 JUMPI PUSH2 0x30C JUMP JUMPDEST DUP1 PUSH4 0xD5AD6BF6 EQ PUSH2 0x839 JUMPI DUP1 PUSH4 0xD605787B EQ PUSH2 0x841 JUMPI DUP1 PUSH4 0xDFB2F13B EQ PUSH2 0x849 JUMPI PUSH2 0x30C JUMP JUMPDEST DUP1 PUSH4 0xB2210957 EQ PUSH2 0x744 JUMPI DUP1 PUSH4 0xB9EE1E05 EQ PUSH2 0x780 JUMPI DUP1 PUSH4 0xC2F19EE8 EQ PUSH2 0x788 JUMPI DUP1 PUSH4 0xC42B42A0 EQ PUSH2 0x790 JUMPI DUP1 PUSH4 0xC48DDBCB EQ PUSH2 0x798 JUMPI DUP1 PUSH4 0xC6853270 EQ PUSH2 0x816 JUMPI PUSH2 0x30C JUMP JUMPDEST DUP1 PUSH4 0x8AA3EC6F GT PUSH2 0x156 JUMPI DUP1 PUSH4 0x9417783F GT PUSH2 0x130 JUMPI DUP1 PUSH4 0x9417783F EQ PUSH2 0x6E0 JUMPI DUP1 PUSH4 0x95E5F9EE EQ PUSH2 0x706 JUMPI DUP1 PUSH4 0xACCA5B95 EQ PUSH2 0x70E JUMPI DUP1 PUSH4 0xB0244682 EQ PUSH2 0x716 JUMPI PUSH2 0x30C JUMP JUMPDEST DUP1 PUSH4 0x8AA3EC6F EQ PUSH2 0x6AA JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x6D0 JUMPI DUP1 PUSH4 0x94144C6B EQ PUSH2 0x6D8 JUMPI PUSH2 0x30C JUMP JUMPDEST DUP1 PUSH4 0x72F33EA9 EQ PUSH2 0x629 JUMPI DUP1 PUSH4 0x738BBEA8 EQ PUSH2 0x631 JUMPI DUP1 PUSH4 0x75619AB5 EQ PUSH2 0x639 JUMPI DUP1 PUSH4 0x7F4296D7 EQ PUSH2 0x65F JUMPI DUP1 PUSH4 0x876F5C7E EQ PUSH2 0x685 JUMPI DUP1 PUSH4 0x884A4448 EQ PUSH2 0x68D JUMPI PUSH2 0x30C JUMP JUMPDEST DUP1 PUSH4 0x4E5D08E0 GT PUSH2 0x25C JUMPI DUP1 PUSH4 0x671137C4 GT PUSH2 0x215 JUMPI DUP1 PUSH4 0x6BEA5344 GT PUSH2 0x1EF JUMPI DUP1 PUSH4 0x6BEA5344 EQ PUSH2 0x609 JUMPI DUP1 PUSH4 0x6CC25DB7 EQ PUSH2 0x611 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x619 JUMPI DUP1 PUSH4 0x719CE73E EQ PUSH2 0x621 JUMPI PUSH2 0x30C JUMP JUMPDEST DUP1 PUSH4 0x671137C4 EQ PUSH2 0x5CB JUMPI DUP1 PUSH4 0x6A74F107 EQ PUSH2 0x5F9 JUMPI DUP1 PUSH4 0x6BE51C4F EQ PUSH2 0x601 JUMPI PUSH2 0x30C JUMP JUMPDEST DUP1 PUSH4 0x4E5D08E0 EQ PUSH2 0x4D6 JUMPI DUP1 PUSH4 0x500DB70D EQ PUSH2 0x4FC JUMPI DUP1 PUSH4 0x605E25AC EQ PUSH2 0x504 JUMPI DUP1 PUSH4 0x62C77A61 EQ PUSH2 0x52A JUMPI DUP1 PUSH4 0x642D43DB EQ PUSH2 0x532 JUMPI DUP1 PUSH4 0x66968221 EQ PUSH2 0x55D JUMPI PUSH2 0x30C JUMP JUMPDEST DUP1 PUSH4 0x2C8FE73D GT PUSH2 0x2C9 JUMPI DUP1 PUSH4 0x47BED998 GT PUSH2 0x2A3 JUMPI DUP1 PUSH4 0x47BED998 EQ PUSH2 0x46D JUMPI DUP1 PUSH4 0x4ABA4F6B EQ PUSH2 0x48A JUMPI DUP1 PUSH4 0x4C169F4F EQ PUSH2 0x492 JUMPI DUP1 PUSH4 0x4D7F3DB0 EQ PUSH2 0x49A JUMPI PUSH2 0x30C JUMP JUMPDEST DUP1 PUSH4 0x2C8FE73D EQ PUSH2 0x3E7 JUMPI DUP1 PUSH4 0x30FCDF41 EQ PUSH2 0x3EF JUMPI DUP1 PUSH4 0x42D09209 EQ PUSH2 0x415 JUMPI PUSH2 0x30C JUMP JUMPDEST DUP1 PUSH4 0x1B48E34 EQ PUSH2 0x311 JUMPI DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x340 JUMPI DUP1 PUSH4 0xD847FC4 EQ PUSH2 0x37B JUMPI DUP1 PUSH4 0x111070E4 EQ PUSH2 0x39F JUMPI DUP1 PUSH4 0x22F8E566 EQ PUSH2 0x3A7 JUMPI DUP1 PUSH4 0x2A7AD609 EQ PUSH2 0x3C6 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x32E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x327 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x9EF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x367 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x356 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH2 0xA08 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x383 PUSH2 0xA3E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x367 PUSH2 0xA4D JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3BD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xA5C JUMP JUMPDEST STOP JUMPDEST PUSH2 0x3CE PUSH2 0xA61 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0xFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x32E PUSH2 0xA6D JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x405 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xA7C JUMP JUMPDEST PUSH2 0x41D PUSH2 0xB96 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x459 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x441 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x32E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x483 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xBA2 JUMP JUMPDEST PUSH2 0x367 PUSH2 0xBAD JUMP JUMPDEST PUSH2 0x3C4 PUSH2 0xC32 JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x4B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0xD19 JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE25 JUMP JUMPDEST PUSH2 0x383 PUSH2 0xEE1 JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x51A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xEF0 JUMP JUMPDEST PUSH2 0x41D PUSH2 0x1013 JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x548 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH4 0xFFFFFFFF DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x101F JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x573 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x58D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x59F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x5C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x1052 JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x5E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x113E JUMP JUMPDEST PUSH2 0x367 PUSH2 0x11C1 JUMP JUMPDEST PUSH2 0x383 PUSH2 0x11DA JUMP JUMPDEST PUSH2 0x3CE PUSH2 0x11E9 JUMP JUMPDEST PUSH2 0x383 PUSH2 0x11FC JUMP JUMPDEST PUSH2 0x3C4 PUSH2 0x120B JUMP JUMPDEST PUSH2 0x383 PUSH2 0x12B7 JUMP JUMPDEST PUSH2 0x32E PUSH2 0x12C6 JUMP JUMPDEST PUSH2 0x367 PUSH2 0x12CC JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x64F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x131F JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x675 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1341 JUMP JUMPDEST PUSH2 0x367 PUSH2 0x1439 JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1458 JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x14CB JUMP JUMPDEST PUSH2 0x383 PUSH2 0x15E5 JUMP JUMPDEST PUSH2 0x32E PUSH2 0x15F4 JUMP JUMPDEST PUSH2 0x41D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x15FA JUMP JUMPDEST PUSH2 0x367 PUSH2 0x1666 JUMP JUMPDEST PUSH2 0x3CE PUSH2 0x1670 JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x72C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x167C JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x75A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x172A JUMP JUMPDEST PUSH2 0x3C4 PUSH2 0x1868 JUMP JUMPDEST PUSH2 0x383 PUSH2 0x1AE9 JUMP JUMPDEST PUSH2 0x32E PUSH2 0x1AF8 JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x7AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x7D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x7EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x80B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x1B3D JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x82C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH4 0xFFFFFFFF AND PUSH2 0x1DB2 JUMP JUMPDEST PUSH2 0x32E PUSH2 0x1E25 JUMP JUMPDEST PUSH2 0x383 PUSH2 0x1E2F JUMP JUMPDEST PUSH2 0x3C4 PUSH2 0x1E3E JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x867 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2106 JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x88D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2128 JUMP JUMPDEST PUSH2 0x3C4 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0xE0 DUP2 LT ISZERO PUSH2 0x8B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH1 0x40 DUP4 ADD CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x60 DUP2 ADD CALLDATALOAD DUP3 AND SWAP3 PUSH1 0x80 DUP3 ADD CALLDATALOAD DUP4 AND SWAP3 PUSH1 0xA0 DUP4 ADD CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0xE0 DUP2 ADD PUSH1 0xC0 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x901 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x913 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x934 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x222B SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x97A PUSH2 0x259E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x9B4 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x99C JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x9E1 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xA02 PUSH2 0x9FC PUSH2 0x25BF JUMP JUMPDEST DUP4 PUSH2 0x25FC JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL EQ DUP1 PUSH2 0xA02 JUMPI POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT EQ SWAP1 JUMP JUMPDEST PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH4 0xFFFFFFFF AND ISZERO ISZERO JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x76 SSTORE JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA77 PUSH2 0x2625 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0xA84 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xA95 PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xADE JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3D58 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xAE6 PUSH2 0x2642 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0xB11 JUMPI POP PUSH2 0xB11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH4 0x266FCE1F PUSH1 0xE1 SHL PUSH2 0x26B4 JUMP JUMPDEST PUSH2 0xB4C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x31 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3D78 PUSH1 0x31 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x73 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xC4FEFF61630891EA2CB42A54FBE3FF2E65422F2ED17323AC6B65F4521112E87E SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0xA77 PUSH1 0x70 PUSH2 0x26D7 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA02 DUP3 PUSH2 0x27B7 JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x6A SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xE866E6F PUSH1 0xE2 SHL DUP2 MSTORE PUSH4 0xFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x3A19B9BC SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC01 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xC15 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xC2B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0xC3A PUSH2 0x12CC JUMP JUMPDEST PUSH2 0xC75 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3EFB PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF NOT DUP2 AND SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH4 0xFFFFFFFF DUP1 DUP4 AND SWAP3 PUSH1 0x1 PUSH1 0x20 SHL SWAP1 DIV AND SWAP1 PUSH32 0xEE6702C46C5618E6FC7E625C71F4C85DF9C91D456CB16A3AEA71AB83B1FEE005 SWAP1 PUSH1 0x0 SWAP1 LOG1 PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xFFFFFFFF DUP5 DUP2 AND DUP3 MSTORE SWAP2 MLOAD SWAP2 DUP6 AND SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 CALLER SWAP2 PUSH32 0xD50026EE0824513AF20CDF5E72D1FBFBE8FD646EE0576378E080326F1A695E58 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xD2D PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xD72 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3BFF PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0xD90 JUMPI PUSH2 0xD90 PUSH2 0x2642 JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0xE1F JUMPI PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE DUP6 DUP2 AND PUSH1 0x44 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x4D7F3DB0 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE06 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xE1A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0xE2D PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE3E PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0xE6D JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE62 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0xE92 JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE87 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0xECD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3B75 PUSH1 0x2C SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xED5 PUSH2 0x2642 JUMP JUMPDEST PUSH2 0xEDE DUP2 PUSH2 0x27FE JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0xEF8 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF09 PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xF52 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3D58 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xF5A PUSH2 0x2642 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0xF88 JUMPI POP PUSH2 0xF88 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x26B4 JUMP JUMPDEST PUSH2 0xFC3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3AF8 PUSH1 0x2C SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x65 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 AND SWAP1 PUSH32 0x9FC437AA70AD4EE5F33F6772BF338EED41E21B95435820817AB8B4DF161CE4DD SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0xA77 PUSH1 0x6E PUSH2 0x26D7 JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH4 0xFFFFFFFF SWAP3 DUP4 AND PUSH1 0x1 PUSH1 0x20 SHL MUL PUSH8 0xFFFFFFFF00000000 NOT SWAP5 SWAP1 SWAP4 AND PUSH4 0xFFFFFFFF NOT SWAP1 SWAP2 AND OR SWAP3 SWAP1 SWAP3 AND OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x105A PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x106B PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0x109A JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x108F PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0x10BF JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x10B4 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0x10FA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3B75 PUSH1 0x2C SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1102 PUSH2 0x2642 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1139 JUMPI PUSH2 0x1131 DUP4 DUP4 DUP4 DUP2 DUP2 LT PUSH2 0x111C JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x27FE JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x1105 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x1146 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1157 PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x11A0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3D58 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x11A8 PUSH2 0x2642 JUMP JUMPDEST PUSH2 0x11B4 PUSH1 0x70 DUP3 DUP5 PUSH2 0x2A65 JUMP JUMPDEST PUSH2 0x11BD DUP3 PUSH2 0x2B81 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11CB PUSH2 0xA4D JUMP JUMPDEST DUP1 ISZERO PUSH2 0xA77 JUMPI POP PUSH2 0xA77 PUSH2 0xBAD JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH1 0x1 PUSH1 0x20 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1213 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1224 PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x126D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3D58 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x6D SLOAD DUP2 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND PUSH2 0x12EB JUMPI POP PUSH1 0x0 PUSH2 0xA59 JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH1 0x6B SLOAD PUSH2 0x130F SWAP2 PUSH4 0xFFFFFFFF SWAP2 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 SWAP2 DIV DUP2 AND SWAP1 PUSH2 0x2BD9 AND JUMP JUMPDEST PUSH2 0x1317 PUSH2 0x2C33 JUMP JUMPDEST GT SWAP1 POP PUSH2 0xA59 JUMP JUMPDEST PUSH1 0x75 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x1349 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x135A PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x13A3 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3D58 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x13AB PUSH2 0x2642 JUMP JUMPDEST PUSH2 0x13B3 PUSH2 0xA4D JUMP JUMPDEST ISZERO PUSH2 0x13EF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3ED8 PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x69 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xF935763CC7C57EE8ED6318ED71E756CCA0731294C9F46FF5B386F36D6FF1417A SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1443 PUSH2 0x2C39 JUMP JUMPDEST DUP1 ISZERO PUSH2 0xA77 JUMPI POP PUSH2 0x1452 PUSH2 0xA4D JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x1460 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1471 PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x14BA JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3D58 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x14C2 PUSH2 0x2642 JUMP JUMPDEST PUSH2 0xEDE DUP2 PUSH2 0x2C52 JUMP JUMPDEST PUSH2 0x14D3 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x14E4 PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x152D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3D58 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1535 PUSH2 0x2642 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 PUSH2 0x1560 JUMPI POP PUSH2 0x1560 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH4 0x2BA83963 PUSH1 0xE1 SHL PUSH2 0x26B4 JUMP JUMPDEST PUSH2 0x159B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x33 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E49 PUSH1 0x33 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x74 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0xDA05D50A3A1EC0FFAB059F1D457AE59F68CCFB3FFBB4DAD283C516F9103D584B SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x6C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD DUP4 MLOAD DUP2 DUP5 MUL DUP2 ADD DUP5 ADD SWAP1 SWAP5 MSTORE DUP1 DUP5 MSTORE PUSH1 0x60 SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x165A JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x1646 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA77 PUSH2 0x2C39 JUMP JUMPDEST PUSH1 0x6B SLOAD PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x1684 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1695 PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x16DE JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3D58 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x16E6 PUSH2 0x2642 JUMP JUMPDEST PUSH2 0x16F2 PUSH1 0x6E DUP3 DUP5 PUSH2 0x2A65 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 PUSH32 0x58982464497ACDAB11AD29D39907E076B0D3B8DAF1D9B734174C7C3A2A0E8C74 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x173E PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1783 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3BFF PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x17D4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3C24 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x67 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x17F2 JUMPI PUSH2 0x17F2 PUSH2 0x2642 JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0xE1F JUMPI PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP7 SWAP1 MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xB2210957 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE06 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1870 PUSH2 0x2C39 JUMP JUMPDEST PUSH2 0x18AB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3B24 PUSH1 0x2B SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x18B3 PUSH2 0xA4D JUMP JUMPDEST ISZERO PUSH2 0x18EF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3D0C PUSH1 0x2B SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xD37B537 PUSH1 0xE0 SHL DUP2 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP3 PUSH4 0xD37B537 SWAP3 PUSH1 0x4 DUP1 DUP4 ADD SWAP4 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1934 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1948 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x195E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MLOAD SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1984 JUMPI POP PUSH1 0x0 DUP2 GT JUMPDEST ISZERO PUSH2 0x19A3 JUMPI PUSH1 0x69 SLOAD PUSH2 0x19A3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND SWAP2 AND DUP4 PUSH2 0x2CCC JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x433C53D9 PUSH1 0xE1 SHL DUP2 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP3 PUSH4 0x8678A7B2 SWAP3 PUSH1 0x4 DUP1 DUP4 ADD SWAP4 SWAP3 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x19E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x19FD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1A13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MLOAD PUSH1 0x6A DUP1 SLOAD PUSH4 0xFFFFFFFF DUP1 DUP5 AND PUSH1 0x1 PUSH1 0x20 SHL MUL PUSH8 0xFFFFFFFF00000000 NOT SWAP2 DUP7 AND PUSH4 0xFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR AND OR SWAP1 SSTORE SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x1A61 PUSH2 0x1A5C PUSH2 0x2C33 JUMP JUMPDEST PUSH2 0x2DDF JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFF0000000000000000 NOT AND PUSH1 0x1 PUSH1 0x40 SHL PUSH4 0xFFFFFFFF SWAP4 DUP5 AND MUL OR SWAP1 SSTORE PUSH1 0x66 SLOAD SWAP1 DUP4 AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A9D PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x4D31E658DCF617BB3A3C8CF7C6DDDB33F7030AC588E271631ECDB5D76C2E91EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP JUMP JUMPDEST PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x18C1996D PUSH1 0xE2 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x630665B4 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC01 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B45 PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1B56 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ DUP1 PUSH2 0x1B85 JUMPI POP PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1B7A PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST DUP1 PUSH2 0x1BAA JUMPI POP PUSH1 0x73 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1B9F PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ JUMPDEST PUSH2 0x1BE5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3B75 PUSH1 0x2C SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1BED PUSH2 0x2642 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x6A3FD4F9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x6A3FD4F9 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C3A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C4E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1C64 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0x1CA1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3DA9 PUSH1 0x2B SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1CBB PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH4 0x80AC58CD PUSH1 0xE0 SHL PUSH2 0x26B4 JUMP JUMPDEST PUSH2 0x1CF6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3AD4 PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1D01 PUSH1 0x70 DUP5 PUSH2 0x2E27 JUMP JUMPDEST PUSH2 0x1D10 JUMPI PUSH2 0x1D10 PUSH1 0x70 DUP5 PUSH2 0x2E78 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1D3F JUMPI PUSH2 0x1D37 DUP5 DUP5 DUP5 DUP5 DUP2 DUP2 LT PUSH2 0x1D2B JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH2 0x2F8C JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x1D13 JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x51541DC4B4C08A16085809CCCDC4CC77D8000B60FBB00142E57F236D84298675 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP6 POP SWAP1 SWAP4 POP POP POP POP LOG2 POP POP POP JUMP JUMPDEST PUSH2 0x1DBA PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1DCB PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1E14 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3D58 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1E1C PUSH2 0x2642 JUMP JUMPDEST PUSH2 0xEDE DUP2 PUSH2 0x3112 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA77 PUSH2 0x25BF JUMP JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1E46 PUSH2 0xA4D JUMP JUMPDEST PUSH2 0x1E81 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F4D PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1E89 PUSH2 0xBAD JUMP JUMPDEST PUSH2 0x1EC4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3C95 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x69 SLOAD PUSH1 0x6A SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x13A54BF3 PUSH1 0xE3 SHL DUP2 MSTORE PUSH4 0xFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x4 DUP4 ADD MSTORE MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x9D2A5F98 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1F19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1F2D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1F43 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x6A DUP1 SLOAD PUSH12 0xFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE PUSH1 0x73 SLOAD SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x1FDE JUMPI PUSH1 0x73 SLOAD PUSH1 0x6D SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x266FCE1F PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x4CDF9C3E SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1FC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1FD9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x1FE7 DUP2 PUSH2 0x31AB JUMP JUMPDEST PUSH1 0x74 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2068 JUMPI PUSH1 0x74 SLOAD PUSH1 0x6D SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x2BA83963 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP6 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x575072C6 SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x204F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2063 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x2078 PUSH2 0x2073 PUSH2 0x2C33 JUMP JUMPDEST PUSH2 0x27B7 JUMP JUMPDEST PUSH1 0x6D SSTORE PUSH2 0x2083 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x9C4163ECE98173EAB9A496C4DB8BF3E2C8EDCC5D2854377880597CCB858B7A9D DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x6D SLOAD PUSH2 0x20CE PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC61852C20F0B03B31D782F3022F2BF20322AC17CE66C5349FB6E24740CDD6456 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP JUMP JUMPDEST PUSH1 0x73 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x2130 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2141 PUSH2 0x15E5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x218A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3D58 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x21CF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3B4F PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2244 JUMPI POP PUSH2 0x2244 PUSH2 0x3213 JUMP JUMPDEST DUP1 PUSH2 0x2252 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x228D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3CDE PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x22B8 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH2 0x22FD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3C4A PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x2342 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3DFA PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x2387 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3BA1 PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x23CC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3C73 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x66 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP10 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SWAP3 SSTORE PUSH1 0x67 DUP1 SLOAD DUP9 DUP5 AND SWAP1 DUP4 AND OR SWAP1 SSTORE PUSH1 0x69 DUP1 SLOAD DUP7 DUP5 AND SWAP1 DUP4 AND OR SWAP1 SSTORE PUSH1 0x68 DUP1 SLOAD SWAP3 DUP8 AND SWAP3 SWAP1 SWAP2 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x241F DUP8 PUSH2 0x2C52 JUMP JUMPDEST PUSH2 0x2427 PUSH2 0x321E JUMP JUMPDEST PUSH2 0x2431 PUSH1 0x6E PUSH2 0x32CF JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 MLOAD DUP2 LT ISZERO PUSH2 0x2461 JUMPI PUSH2 0x2459 DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x244C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH2 0x27FE JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2434 JUMP JUMPDEST POP PUSH1 0x6C DUP8 SWAP1 SSTORE PUSH1 0x6D DUP9 SWAP1 SSTORE PUSH2 0x2476 PUSH1 0x70 PUSH2 0x32CF JUMP JUMPDEST PUSH2 0x2481 PUSH2 0x708 PUSH2 0x3112 JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xF9632D212436344A25150FF0C161DABF412AADE556621C2DEA146CA63FF643F5 DUP10 DUP10 DUP9 DUP9 DUP9 DUP9 PUSH1 0x40 MLOAD DUP1 DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x252B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2513 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP8 POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x6D SLOAD PUSH2 0x254E PUSH2 0x263E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC61852C20F0B03B31D782F3022F2BF20322AC17CE66C5349FB6E24740CDD6456 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 DUP1 ISZERO PUSH2 0xE1A JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x25CA PUSH2 0x2625 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x25D6 PUSH2 0x2C33 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 GT ISZERO PUSH2 0x25EB JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0xA59 JUMP JUMPDEST PUSH2 0x25F5 DUP3 DUP3 PUSH2 0x3337 JUMP JUMPDEST SWAP3 POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2611 PUSH8 0xDE0B6B3A7640000 DUP6 PUSH2 0x3394 JUMP JUMPDEST SWAP1 POP PUSH2 0x261D DUP2 DUP5 PUSH2 0x33ED JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA77 PUSH1 0x6C SLOAD PUSH1 0x6D SLOAD PUSH2 0x2BD9 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x264C PUSH2 0x342F JUMP JUMPDEST PUSH1 0x6A SLOAD SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x20 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND ISZERO DUP1 PUSH2 0x2679 JUMPI POP PUSH1 0x6A SLOAD PUSH1 0x1 PUSH1 0x20 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP2 LT JUMPDEST PUSH2 0xEDE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3ED8 PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x26BF DUP4 PUSH2 0x3433 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x26D0 JUMPI POP PUSH2 0x26D0 DUP4 DUP4 PUSH2 0x3466 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 PUSH1 0x0 ADD SLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x26F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x271F JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x2762 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ ISZERO JUMPDEST ISZERO PUSH2 0x27AE JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x2774 JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x20 SWAP2 DUP3 MUL SWAP3 SWAP1 SWAP3 ADD DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP1 DUP9 ADD SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP3 SWAP1 SWAP2 ADD SWAP2 AND PUSH2 0x2740 JUMP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x27DB PUSH1 0x6C SLOAD PUSH2 0x27D5 PUSH1 0x6D SLOAD DUP7 PUSH2 0x3337 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 PUSH2 0x348C JUMP JUMPDEST SWAP1 POP PUSH2 0x26D0 PUSH2 0x27F5 PUSH1 0x6C SLOAD DUP4 PUSH2 0x3394 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x6D SLOAD SWAP1 PUSH2 0x2BD9 JUMP JUMPDEST PUSH2 0x2810 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x34F3 JUMP JUMPDEST PUSH2 0x2861 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x506572696F6469635072697A6553747261746567792F65726332302D6E756C6C PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x6A3FD4F9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x6A3FD4F9 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x28AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x28C2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x28D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0x2915 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3DA9 PUSH1 0x2B SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x4 DUP2 MSTORE PUSH1 0x24 DUP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 PUSH1 0x60 SWAP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x297B JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x295C JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x29DB JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x29E0 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 PUSH2 0x2A21 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3CBB PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x2A2C PUSH1 0x6E DUP5 PUSH2 0x2E78 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH32 0xBCD6D991F3416E288BF59A2997B423772937B62C7EA7DD1A54AF7771DE1F7418 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x2A87 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO ISZERO JUMPDEST PUSH2 0x2ACA JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xF PUSH1 0x24 DUP3 ADD MSTORE PUSH15 0x496E76616C69642061646472657373 PUSH1 0x88 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 AND SWAP1 DUP3 AND EQ PUSH2 0x2B33 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH19 0x496E76616C6964207072657641646472657373 PUSH1 0x68 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD SWAP6 DUP6 AND DUP4 MSTORE SWAP1 DUP3 KECCAK256 DUP1 SLOAD SWAP6 SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP6 DUP7 AND OR SWAP1 SWAP4 SSTORE MSTORE DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x2BA2 SWAP2 PUSH2 0x3AA5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH32 0xCD64D9DACD230C5CCF1278EA5332B0621AA28C950FB0E61C8FBC9E2011C88A34 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x26D0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x76 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2C43 PUSH2 0x2625 JUMP JUMPDEST PUSH2 0x2C4B PUSH2 0x2C33 JUMP JUMPDEST LT ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 GT PUSH2 0x2C91 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x34 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3BCB PUSH1 0x34 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x6C DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xD379C1A7282461E725A9DC2D74E65246C77E98AE93835E26C2F1654C48EE4EC SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST DUP1 ISZERO DUP1 PUSH2 0x2D52 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH4 0x6EB1769F PUSH1 0xE1 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 DUP6 AND SWAP2 PUSH4 0xDD62ED3E SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2D24 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2D38 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2D4E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO JUMPDEST PUSH2 0x2D8D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x36 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E7C PUSH1 0x36 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x95EA7B3 PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0x1139 SWAP1 DUP5 SWAP1 PUSH2 0x34F9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x20 SHL DUP3 LT PUSH2 0x2E23 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3DD4 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x2E4B JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x26D0 JUMPI POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD AND ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x1 EQ DUP1 ISZERO SWAP1 PUSH2 0x2E9A JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND ISZERO ISZERO JUMPDEST PUSH2 0x2EDD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xF PUSH1 0x24 DUP3 ADD MSTORE PUSH15 0x496E76616C69642061646472657373 PUSH1 0x88 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 DUP5 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND ISZERO PUSH2 0x2F3C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xD PUSH1 0x24 DUP3 ADD MSTORE PUSH13 0x105B1C9958591E481859191959 PUSH1 0x9A SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE DUP4 DUP3 ADD PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP6 DUP7 AND DUP1 DUP6 MSTORE SWAP3 DUP5 KECCAK256 DUP1 SLOAD SWAP7 SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP7 DUP8 AND OR SWAP1 SSTORE SWAP2 DUP4 SWAP1 MSTORE DUP2 SLOAD SWAP1 SWAP4 AND SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x31A9108F PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND SWAP3 DUP6 AND SWAP2 PUSH4 0x6352211E SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2FDA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2FEE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3004 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x304B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F74 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 LT ISZERO PUSH2 0x30E5 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD DUP4 SWAP2 SWAP1 DUP4 SWAP1 DUP2 LT PUSH2 0x3095 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD EQ ISZERO PUSH2 0x30DD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3EB2 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 ADD PUSH2 0x304E JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x72 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP3 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE SWAP1 DUP4 MSTORE SWAP2 KECCAK256 ADD SSTORE JUMP JUMPDEST PUSH1 0x3C DUP2 PUSH4 0xFFFFFFFF AND GT PUSH2 0x3157 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F21 PUSH1 0x2C SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x6B DUP1 SLOAD PUSH4 0xFFFFFFFF NOT AND PUSH4 0xFFFFFFFF DUP4 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP2 AND DUP3 MSTORE MLOAD PUSH32 0x4F27F6F220FFAD585E728389BC2F0F6B74EEEBEB43F95F53752A647CB6E7E687 SWAP2 PUSH1 0x20 SWAP1 DUP3 SWAP1 SUB ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x75 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x91C05B0B PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x91C05B0B SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x31F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x320C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1452 ADDRESS PUSH2 0x34F3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3237 JUMPI POP PUSH2 0x3237 PUSH2 0x3213 JUMP JUMPDEST DUP1 PUSH2 0x3245 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3280 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3CDE PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x32AB JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x32B3 PUSH2 0x35AA JUMP JUMPDEST PUSH2 0x32BB PUSH2 0x364A JUMP JUMPDEST DUP1 ISZERO PUSH2 0xEDE JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST DUP1 SLOAD ISZERO PUSH2 0x3312 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xC PUSH1 0x24 DUP3 ADD MSTORE PUSH12 0x105B1C9958591E481A5B9A5D PUSH1 0xA2 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP2 DUP2 MSTORE SWAP2 DUP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x338E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x33A3 JUMPI POP PUSH1 0x0 PUSH2 0xA02 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x33B0 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x26D0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3D37 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x26D0 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x3743 JUMP JUMPDEST NUMBER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3446 DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3466 JUMP JUMPDEST DUP1 ISZERO PUSH2 0xA02 JUMPI POP PUSH2 0x345F DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3466 JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x3475 DUP6 DUP6 PUSH2 0x37E5 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x3483 JUMPI POP DUP1 JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x34E2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x34EB JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x354E DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3919 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0x1139 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x356D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0x1139 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E1F PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x35C3 JUMPI POP PUSH2 0x35C3 PUSH2 0x3213 JUMP JUMPDEST DUP1 PUSH2 0x35D1 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x360C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3CDE PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x32BB JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xEDE JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3663 JUMPI POP PUSH2 0x3663 PUSH2 0x3213 JUMP JUMPDEST DUP1 PUSH2 0x3671 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x36AC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3CDE PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x36D7 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x36E1 PUSH2 0x263E JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0xEDE JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x37CF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3794 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x377C JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x37C1 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x37DB JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x24 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP3 DUP5 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND SWAP3 PUSH2 0x7530 SWAP3 DUP8 SWAP3 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x386D JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x384E JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x38CE JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x38D3 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x38F1 JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x3912 JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3907 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x261D DUP5 DUP5 PUSH1 0x0 DUP6 DUP6 PUSH2 0x392D DUP6 PUSH2 0x34F3 JUMP JUMPDEST PUSH2 0x397E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x39BD JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x399E JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3A1F JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3A24 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x3A34 DUP3 DUP3 DUP7 PUSH2 0x3A3F JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x3A4E JUMPI POP DUP2 PUSH2 0x26D0 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x3A5E JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x3794 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x377C JUMP JUMPDEST POP DUP1 SLOAD PUSH1 0x0 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0xEDE SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x2E23 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x3ABF JUMP INVALID POP PUSH6 0x72696F646963 POP PUSH19 0x697A6553747261746567792F6572633732312D PUSH10 0x6E76616C696450657269 PUSH16 0x6469635072697A655374726174656779 0x2F PUSH21 0x6F6B656E2D6C697374656E65722D696E76616C6964 POP PUSH6 0x72696F646963 POP PUSH19 0x697A6553747261746567792F7072697A652D70 PUSH6 0x72696F642D6E PUSH16 0x742D6F7665724F776E61626C653A206E PUSH6 0x77206F776E65 PUSH19 0x20697320746865207A65726F20616464726573 PUSH20 0x506572696F6469635072697A6553747261746567 PUSH26 0x2F6F6E6C792D6F776E65722D6F722D6C697374656E6572506572 PUSH10 0x6F6469635072697A6553 PUSH21 0x7261746567792F73706F6E736F72736869702D6E6F PUSH21 0x2D7A65726F506572696F6469635072697A65537472 PUSH2 0x7465 PUSH8 0x792F7072697A652D PUSH17 0x6572696F642D677265617465722D746861 PUSH15 0x2D7A65726F506572696F6469635072 PUSH10 0x7A655374726174656779 0x2F PUSH16 0x6E6C792D7072697A652D706F6F6C5065 PUSH19 0x696F6469635072697A6553747261746567792F PUSH21 0x72616E736665722D746F2D73656C66506572696F64 PUSH10 0x635072697A6553747261 PUSH21 0x6567792F7072697A652D706F6F6C2D6E6F742D7A65 PUSH19 0x6F506572696F6469635072697A655374726174 PUSH6 0x67792F726E67 0x2D PUSH15 0x6F742D7A65726F506572696F646963 POP PUSH19 0x697A6553747261746567792F726E672D6E6F74 0x2D PUSH4 0x6F6D706C PUSH6 0x746550657269 PUSH16 0x6469635072697A655374726174656779 0x2F PUSH6 0x726332302D69 PUSH15 0x76616C6964496E697469616C697A61 PUSH3 0x6C653A KECCAK256 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 POP PUSH6 0x72696F646963 POP PUSH19 0x697A6553747261746567792F726E672D616C72 PUSH6 0x6164792D7265 PUSH18 0x756573746564536166654D6174683A206D75 PUSH13 0x7469706C69636174696F6E206F PUSH23 0x6572666C6F774F776E61626C653A2063616C6C65722069 PUSH20 0x206E6F7420746865206F776E6572506572696F64 PUSH10 0x635072697A6553747261 PUSH21 0x6567792F6265666F726541776172644C697374656E PUSH6 0x722D696E7661 PUSH13 0x6964506572696F646963507269 PUSH27 0x6553747261746567792F63616E6E6F742D61776172642D65787465 PUSH19 0x6E616C53616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E2033322062697473506572696F64 PUSH10 0x635072697A6553747261 PUSH21 0x6567792F7469636B65742D6E6F742D7A65726F5361 PUSH7 0x6545524332303A KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x756363656564506572696F6469635072697A6553 PUSH21 0x7261746567792F7072697A6553747261746567794C PUSH10 0x7374656E65722D696E76 PUSH2 0x6C69 PUSH5 0x5361666545 MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F76652066726F6D206E6F6E2D7A65726F2074 PUSH16 0x206E6F6E2D7A65726F20616C6C6F7761 PUSH15 0x6365506572696F6469635072697A65 MSTORE8 PUSH21 0x7261746567792F6572633732312D6475706C696361 PUSH21 0x65506572696F6469635072697A6553747261746567 PUSH26 0x2F726E672D696E2D666C69676874506572696F6469635072697A PUSH6 0x537472617465 PUSH8 0x792F726E672D6E6F PUSH21 0x2D74696D65646F7574506572696F6469635072697A PUSH6 0x537472617465 PUSH8 0x792F726E672D7469 PUSH14 0x656F75742D67742D36302D736563 PUSH20 0x506572696F6469635072697A6553747261746567 PUSH26 0x2F726E672D6E6F742D726571756573746564506572696F646963 POP PUSH19 0x697A6553747261746567792F756E617661696C PUSH2 0x626C PUSH6 0x2D746F6B656E LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 GAS 0x2D BLOCKHASH 0xBC PUSH13 0x9CCA45D3C3872FC80F7D222580 0xAF BLOCKHASH JUMPDEST DUP6 GAS 0x2F SWAP14 CALL ADDMOD SGT 0xE1 PUSH20 0xFFDF64736F6C634300060C003300000000000000 ",
              "sourceMap": "185:830:75:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7667:227:50;;;;;;;;;;;;;;;;-1:-1:-1;7667:227:50;;:::i;:::-;;;;;;;;;;;;;;;;191:249:95;;;;;;;;;;;;;;;;-1:-1:-1;191:249:95;-1:-1:-1;;;;;;191:249:95;;:::i;:::-;;;;;;;;;;;;;;;;;;4550:55:50;;;:::i;:::-;;;;-1:-1:-1;;;;;4550:55:50;;;;;;;;;;;;;;18960:89;;;:::i;466:71:75:-;;;;;;;;;;;;;;;;-1:-1:-1;466:71:75;;:::i;:::-;;19655:93:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12004:158;;;:::i;16435:488::-;;;;;;;;;;;;;;;;-1:-1:-1;16435:488:50;-1:-1:-1;;;;;16435:488:50;;:::i;24282:124::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18167:161;;;;;;;;;;;;;;;;-1:-1:-1;18167:161:50;;:::i;19202:107::-;;;:::i;14908:330::-;;;:::i;13261:385::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13261:385:50;;;;;;;;;;;;;;;;;;;;;;:::i;22329:169::-;;;;;;;;;;;;;;;;-1:-1:-1;22329:169:50;-1:-1:-1;;;;;22329:169:50;;:::i;3759:36::-;;;:::i;6934:401::-;;;;;;;;;;;;;;;;-1:-1:-1;6934:401:50;-1:-1:-1;;;;;6934:401:50;;:::i;21913:122::-;;;:::i;632:142:75:-;;;;;;;;;;;;;;;;-1:-1:-1;632:142:75;;;;;;;;;;;:::i;23082:253:50:-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23082:253:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23082:253:50;;;;;;;;;;-1:-1:-1;23082:253:50;;-1:-1:-1;23082:253:50;-1:-1:-1;23082:253:50;:::i;26849:333::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26849:333:50;;;;;;;;;;:::i;18705:111::-;;;:::i;3623:43::-;;;:::i;19465:100::-;;;:::i;3726:29::-;;;:::i;1967:145:0:-;;;:::i;3696:26:50:-;;;:::i;4127:35::-;;;:::i;27625:221::-;;;:::i;311:126:75:-;;;;;;;;;;;;;;;;-1:-1:-1;311:126:75;-1:-1:-1;;;;;311:126:75;;:::i;19896:232:50:-;;;;;;;;;;;;;;;;-1:-1:-1;19896:232:50;-1:-1:-1;;;;;19896:232:50;;:::i;18458:113::-;;;:::i;21170:159::-;;;;;;;;;;;;;;;;-1:-1:-1;21170:159:50;;:::i;17087:601::-;;;;;;;;;;;;;;;;-1:-1:-1;17087:601:50;-1:-1:-1;;;;;17087:601:50;;:::i;1335:85:0:-;;;:::i;4090:33:50:-;;;:::i;24574:174::-;;;;;;;;;;;;;;;;-1:-1:-1;24574:174:50;-1:-1:-1;;;;;24574:174:50;;:::i;8699:96::-;;;:::i;4036:31::-;;;:::i;23818:296::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23818:296:50;;;;;;;;;;:::i;12695:420::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;12695:420:50;;;;;;;;;;;;;;;;;;;;;;:::i;14279:539::-;;;:::i;4677:75::-;;;:::i;6692:96::-;;;:::i;25173:727::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25173:727:50;;;;;;;;;;;;;;;-1:-1:-1;;;25173:727:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25173:727:50;;;;;;;;;;-1:-1:-1;25173:727:50;;-1:-1:-1;25173:727:50;-1:-1:-1;25173:727:50;:::i;20373:154::-;;;;;;;;;;;;;;;;-1:-1:-1;20373:154:50;;;;:::i;8062:119::-;;;:::i;3799:23::-;;;:::i;15374:792::-;;;:::i;890:123:75:-;;;;;;;;;;;;;;;;-1:-1:-1;890:123:75;-1:-1:-1;;;;;890:123:75;;:::i;2261:240:0:-;;;;;;;;;;;;;;;;-1:-1:-1;2261:240:0;-1:-1:-1;;;;;2261:240:0;;:::i;5142:1380:50:-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5142:1380:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5142:1380:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5142:1380:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5142:1380:50;;-1:-1:-1;5142:1380:50;;-1:-1:-1;;;;;5142:1380:50:i;3561:40::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7667:227;7761:7;7783:106;7822:30;:28;:30::i;:::-;7860:23;7783:31;:106::i;:::-;7776:113;7667:227;-1:-1:-1;;7667:227:50:o;191:249:95:-;270:4;-1:-1:-1;;;;;;297:51:95;;-1:-1:-1;;;297:51:95;;:132;;-1:-1:-1;;;;;;;;359:70:95;-1:-1:-1;;;;;;359:70:95;;191:249::o;4550:55:50:-;;;-1:-1:-1;;;;;4550:55:50;;:::o;18960:89::-;19026:10;:13;;;:18;;18960:89;;:::o;466:71:75:-;520:4;:12;466:71::o;19655:93:50:-;19730:10;:13;;;19655:93;:::o;12004:158::-;12055:7;12138:19;:17;:19::i;:::-;12131:26;;12004:158;:::o;16435:488::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;28168:28:50::1;:26;:28::i;:::-;-1:-1:-1::0;;;;;16584:43:50;::::2;::::0;;:164:::2;;-1:-1:-1::0;16631:117:50::2;-1:-1:-1::0;;;;;16631:47:50;::::2;-1:-1:-1::0;;;16631:47:50::2;:117::i;:::-;16569:244;;;;-1:-1:-1::0;;;16569:244:50::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16820:19;:42:::0;;-1:-1:-1;;;;;;16820:42:50::2;-1:-1:-1::0;;;;;16820:42:50;::::2;::::0;;::::2;::::0;;;16874:44:::2;::::0;::::2;::::0;-1:-1:-1;;16874:44:50::2;16435:488:::0;:::o;24282:124::-;24340:16;24371:30;:15;:28;:30::i;18167:161::-;18254:7;18276:47;18311:11;18276:34;:47::i;19202:107::-;19268:3;;19290:10;:13;19268:36;;;-1:-1:-1;;;19268:36:50;;19290:13;;;;19268:36;;;;;19249:4;;-1:-1:-1;;;;;19268:3:50;;:21;;:36;;;;;;;;;;;;;;:3;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19268:36:50;;-1:-1:-1;19202:107:50;:::o;14908:330::-;14952:15;:13;:15::i;:::-;14944:66;;;;-1:-1:-1;;;14944:66:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15035:10;:13;;-1:-1:-1;;15099:17:50;;;;;15127:18;;15035:13;;;;;-1:-1:-1;;;15073:20:50;;;;15127:18;;15016:16;;15127:18;15200:9;;15156:77;;;;;;;;;;;;;;;-1:-1:-1;;;;;15200:9:50;;15180:10;;15156:77;;;;;;;;;;14908:330;;:::o;13261:385::-;28682:9;;-1:-1:-1;;;;;28682:9:50;28658:12;:10;:12::i;:::-;-1:-1:-1;;;;;28658:34:50;;28650:84;;;;-1:-1:-1;;;28650:84:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13460:6:::1;::::0;-1:-1:-1;;;;;13433:34:50;;::::1;13460:6:::0;::::1;13433:34;13429:83;;;13477:28;:26;:28::i;:::-;13529:13;::::0;-1:-1:-1;;;;;13529:13:50::1;13521:36:::0;13517:125:::1;;13567:13;::::0;:68:::1;::::0;;-1:-1:-1;;;13567:68:50;;-1:-1:-1;;;;;13567:68:50;;::::1;;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;;;;;::::1;::::0;;;;;;:13;;;::::1;::::0;:29:::1;::::0;:68;;;;;:13:::1;::::0;:68;;;;;;;:13;;:68;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;13517:125;13261:385:::0;;;;:::o;22329:169::-;27911:7;:5;:7::i;:::-;-1:-1:-1;;;;;27895:23:50;:12;:10;:12::i;:::-;-1:-1:-1;;;;;27895:23:50;;:93;;;-1:-1:-1;27958:29:50;;-1:-1:-1;;;;;27958:29:50;27934:12;:10;:12::i;:::-;-1:-1:-1;;;;;27934:54:50;;27895:93;:153;;;-1:-1:-1;28028:19:50;;-1:-1:-1;;;;;28028:19:50;28004:12;:10;:12::i;:::-;-1:-1:-1;;;;;28004:44:50;;27895:153;27887:222;;;;-1:-1:-1;;;27887:222:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28168:28:::1;:26;:28::i;:::-;22455:38:::2;22478:14;22455:22;:38::i;:::-;22329:169:::0;:::o;3759:36::-;;;-1:-1:-1;;;;;3759:36:50;;:::o;6934:401::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;28168:28:50::1;:26;:28::i;:::-;-1:-1:-1::0;;;;;7058:37:50;::::2;::::0;;:139:::2;;-1:-1:-1::0;7099:98:50::2;-1:-1:-1::0;;;;;7099:41:50;::::2;-1:-1:-1::0;;;;;;7099:41:50::2;:98::i;:::-;7050:196;;;;-1:-1:-1::0;;;7050:196:50::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7253:13;:30:::0;;-1:-1:-1;;;;;;7253:30:50::2;-1:-1:-1::0;;;;;7253:30:50;;::::2;::::0;;;::::2;::::0;;;;7295:35:::2;::::0;7316:13;::::2;::::0;7295:35:::2;::::0;-1:-1:-1;;7295:35:50::2;6934:401:::0;:::o;21913:122::-;21970:16;22001:29;:14;:27;:29::i;632:142:75:-;706:10;:25;;;737:32;;;-1:-1:-1;;;737:32:75;-1:-1:-1;;706:25:75;;;;-1:-1:-1;;706:25:75;;;;737:32;;;;;;;632:142::o;23082:253:50:-;27911:7;:5;:7::i;:::-;-1:-1:-1;;;;;27895:23:50;:12;:10;:12::i;:::-;-1:-1:-1;;;;;27895:23:50;;:93;;;-1:-1:-1;27958:29:50;;-1:-1:-1;;;;;27958:29:50;27934:12;:10;:12::i;:::-;-1:-1:-1;;;;;27934:54:50;;27895:93;:153;;;-1:-1:-1;28028:19:50;;-1:-1:-1;;;;;28028:19:50;28004:12;:10;:12::i;:::-;-1:-1:-1;;;;;28004:44:50;;27895:153;27887:222;;;;-1:-1:-1;;;27887:222:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28168:28:::1;:26;:28::i;:::-;23226:9:::2;23221:110;23241:26:::0;;::::2;23221:110;;;23282:42;23305:15;;23321:1;23305:18;;;;;;;;;;;;;-1:-1:-1::0;;;;;23305:18:50::2;23282:22;:42::i;:::-;23269:3;;23221:110;;;;23082:253:::0;;:::o;26849:333::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;28168:28:50::1;:26;:28::i;:::-;27037:85:::2;:15;27075:19:::0;27105:15;27037:29:::2;:85::i;:::-;27128:49;27161:15;27128:32;:49::i;:::-;26849:333:::0;;:::o;18705:111::-;18756:4;18775:16;:14;:16::i;:::-;:36;;;;;18795:16;:14;:16::i;3623:43::-;;;-1:-1:-1;;;;;3623:43:50;;:::o;19465:100::-;19540:10;:20;-1:-1:-1;;;19540:20:50;;;;;19465:100::o;3726:29::-;;;-1:-1:-1;;;;;3726:29:50;;:::o;1967:145:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;2057:6:::1;::::0;2036:40:::1;::::0;2073:1:::1;::::0;-1:-1:-1;;;;;2057:6:0::1;::::0;2036:40:::1;::::0;2073:1;;2036:40:::1;2086:6;:19:::0;;-1:-1:-1;;;;;;2086:19:0::1;::::0;;1967:145::o;3696:26:50:-;;;-1:-1:-1;;;;;3696:26:50;;:::o;4127:35::-;;;;:::o;27625:221::-;27687:10;:22;27671:4;;-1:-1:-1;;;27687:22:50;;;;27683:159;;-1:-1:-1;27731:5:50;27724:12;;27683:159;27812:10;:22;27789:17;;27781:54;;27812:22;27789:17;;;;-1:-1:-1;;;27812:22:50;;;;;;27781:30;:54;:::i;:::-;27764:14;:12;:14::i;:::-;:71;27757:78;;;;311:126:75;406:11;:26;;-1:-1:-1;;;;;;406:26:75;-1:-1:-1;;;;;406:26:75;;;;;;;;;;311:126::o;19896:232:50:-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;28168:28:50::1;:26;:28::i;:::-;20004:16:::2;:14;:16::i;:::-;20003:17;19995:65;;;;-1:-1:-1::0;;;19995:65:50::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20067:3;:16:::0;;-1:-1:-1;;;;;;20067:16:50::2;-1:-1:-1::0;;;;;20067:16:50;::::2;::::0;;::::2;::::0;;;20094:29:::2;::::0;::::2;::::0;-1:-1:-1;;20094:29:50::2;19896:232:::0;:::o;18458:113::-;18506:4;18525:20;:18;:20::i;:::-;:41;;;;;18550:16;:14;:16::i;:::-;18549:17;18518:48;;18458:113;:::o;21170:159::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;28168:28:50::1;:26;:28::i;:::-;21281:43:::2;21304:19;21281:22;:43::i;17087:601::-:0;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;28168:28:50::1;:26;:28::i;:::-;-1:-1:-1::0;;;;;17266:53:50;::::2;::::0;;:205:::2;;-1:-1:-1::0;17323:148:50::2;-1:-1:-1::0;;;;;17323:57:50;::::2;-1:-1:-1::0;;;17323:57:50::2;:148::i;:::-;17251:287;;;;-1:-1:-1::0;;;17251:287:50::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17545:29;:62:::0;;-1:-1:-1;;;;;;17545:62:50::2;-1:-1:-1::0;;;;;17545:62:50;::::2;::::0;;::::2;::::0;;;17619:64:::2;::::0;::::2;::::0;-1:-1:-1;;17619:64:50::2;17087:601:::0;:::o;1335:85:0:-;1407:6;;-1:-1:-1;;;;;1407:6:0;1335:85;:::o;4090:33:50:-;;;;:::o;24574:174::-;-1:-1:-1;;;;;24704:39:50;;;;;;:22;:39;;;;;;;;;24697:46;;;;;;;;;;;;;;;;;24673:16;;24697:46;;;24704:39;24697:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24574:174;;;:::o;8699:96::-;8751:4;8770:20;:18;:20::i;4036:31::-;;;;;;:::o;23818:296::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;28168:28:50::1;:26;:28::i;:::-;23975:82:::2;:14;24012:18:::0;24041:14;23975:28:::2;:82::i;:::-;24068:41;::::0;-1:-1:-1;;;;;24068:41:50;::::2;::::0;::::2;::::0;;;::::2;23818:296:::0;;:::o;12695:420::-;28682:9;;-1:-1:-1;;;;;28682:9:50;28658:12;:10;:12::i;:::-;-1:-1:-1;;;;;28658:34:50;;28650:84;;;;-1:-1:-1;;;28650:84:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12845:2:::1;-1:-1:-1::0;;;;;12837:10:50::1;:4;-1:-1:-1::0;;;;;12837:10:50::1;;;12829:61;;;;-1:-1:-1::0;;;12829:61:50::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12928:6;::::0;-1:-1:-1;;;;;12901:34:50;;::::1;12928:6:::0;::::1;12901:34;12897:83;;;12945:28;:26;:28::i;:::-;12998:13;::::0;-1:-1:-1;;;;;12998:13:50::1;12990:36:::0;12986:125:::1;;13036:13;::::0;:68:::1;::::0;;-1:-1:-1;;;13036:68:50;;-1:-1:-1;;;;;13036:68:50;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;;;;::::1;::::0;;;;;;:13;;;::::1;::::0;:33:::1;::::0;:68;;;;;:13:::1;::::0;:68;;;;;;;:13;;:68;::::1;;::::0;::::1;;;;::::0;::::1;14279:539:::0;28258:20;:18;:20::i;:::-;28250:76;;;;-1:-1:-1;;;28250:76:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28341:16;:14;:16::i;:::-;28340:17;28332:73;;;;-1:-1:-1;;;28332:73:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14378:3:::1;::::0;:19:::1;::::0;;-1:-1:-1;;;14378:19:50;;;;14338:16:::1;::::0;;;-1:-1:-1;;;;;14378:3:50;;::::1;::::0;:17:::1;::::0;:19:::1;::::0;;::::1;::::0;;;;;;;:3;:19;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;14378:19:50;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;14378:19:50;-1:-1:-1;;;;;;14407:22:50;::::1;::::0;;::::1;::::0;:40:::1;;;14446:1;14433:10;:14;14407:40;14403:126;;;14505:3;::::0;14457:65:::1;::::0;-1:-1:-1;;;;;14457:39:50;;::::1;::::0;14505:3:::1;14511:10:::0;14457:39:::1;:65::i;:::-;14574:3;::::0;:25:::1;::::0;;-1:-1:-1;;;14574:25:50;;;;14536:16:::1;::::0;;;-1:-1:-1;;;;;14574:3:50;;::::1;::::0;:23:::1;::::0;:25:::1;::::0;;::::1;::::0;;;;;;;14536:16;14574:3;:25;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;14574:25:50;;::::1;::::0;;::::1;::::0;14605:10:::1;:25:::0;;::::1;14636:32:::0;;::::1;-1:-1:-1::0;;;14636:32:50::1;-1:-1:-1::0;;14605:25:50;;::::1;-1:-1:-1::0;;14605:25:50;;::::1;::::0;;;::::1;14636:32;;::::0;;14574:25;;-1:-1:-1;14574:25:50;-1:-1:-1;14699:25:50::1;:14;:12;:14::i;:::-;:23;:25::i;:::-;14674:10;:50:::0;;-1:-1:-1;;14674:50:50::1;-1:-1:-1::0;;;14674:50:50::1;::::0;;::::1;;;::::0;;14780:9:::1;::::0;14736:77;;::::1;::::0;-1:-1:-1;;;;;14780:9:50::1;14758:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;14736:77:50::1;;14803:9;14736:77;;;;;;;;;;;;;;;;;;;;28411:1;;;;14279:539::o:0;4677:75::-;;;-1:-1:-1;;;;;4677:75:50;;:::o;6692:96::-;6759:9;;:24;;;-1:-1:-1;;;6759:24:50;;;;6737:7;;-1:-1:-1;;;;;6759:9:50;;:22;;:24;;;;;;;;;;;;;;:9;:24;;;;;;;;;;25173:727;27911:7;:5;:7::i;:::-;-1:-1:-1;;;;;27895:23:50;:12;:10;:12::i;:::-;-1:-1:-1;;;;;27895:23:50;;:93;;;-1:-1:-1;27958:29:50;;-1:-1:-1;;;;;27958:29:50;27934:12;:10;:12::i;:::-;-1:-1:-1;;;;;27934:54:50;;27895:93;:153;;;-1:-1:-1;28028:19:50;;-1:-1:-1;;;;;28028:19:50;28004:12;:10;:12::i;:::-;-1:-1:-1;;;;;28004:44:50;;27895:153;27887:222;;;;-1:-1:-1;;;27887:222:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28168:28:::1;:26;:28::i;:::-;25340:9:::2;::::0;:52:::2;::::0;;-1:-1:-1;;;25340:52:50;;-1:-1:-1;;;;;25340:52:50;;::::2;;::::0;::::2;::::0;;;:9;;;::::2;::::0;:26:::2;::::0;:52;;;;;::::2;::::0;;;;;;;;:9;:52;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;25340:52:50;25332:108:::2;;;;-1:-1:-1::0;;;25332:108:50::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25454:80;-1:-1:-1::0;;;;;25454:42:50;::::2;-1:-1:-1::0;;;25454:42:50::2;:80::i;:::-;25446:129;;;;-1:-1:-1::0;;;25446:129:50::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25591:50;:15;25624::::0;25591:24:::2;:50::i;:::-;25586:124;;25651:52;:15;25686::::0;25651:26:::2;:52::i;:::-;25721:9;25716:116;25736:20:::0;;::::2;25716:116;;;25771:54;25795:15;25812:9;;25822:1;25812:12;;;;;;;;;;;;;25771:23;:54::i;:::-;25758:3;;25716:116;;;;25868:15;-1:-1:-1::0;;;;;25843:52:50::2;;25885:9;;25843:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;-1:-1:-1::0;;25843:52:50::2;::::0;;::::2;::::0;;::::2;::::0;-1:-1:-1;25843:52:50;;-1:-1:-1;;;;25843:52:50::2;25173:727:::0;;;:::o;20373:154::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;28168:28:50::1;:26;:28::i;:::-;20481:41:::2;20503:18;20481:21;:41::i;8062:119::-:0;8124:7;8146:30;:28;:30::i;3799:23::-;;;-1:-1:-1;;;;;3799:23:50;;:::o;15374:792::-;28470:16;:14;:16::i;:::-;28462:68;;;;-1:-1:-1;;;28462:68:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28544:16;:14;:16::i;:::-;28536:67;;;;-1:-1:-1;;;28536:67:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15461:3:::1;::::0;15478:10:::1;:13:::0;15461:31:::1;::::0;;-1:-1:-1;;;15461:31:50;;15478:13:::1;::::0;;::::1;15461:31;::::0;::::1;::::0;;15438:20:::1;::::0;-1:-1:-1;;;;;15461:3:50::1;::::0;:16:::1;::::0;:31;;;;;::::1;::::0;;;;;;;;15438:20;15461:3;:31;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;15461:31:50;15505:10:::1;15498:17:::0;;-1:-1:-1;;15498:17:50;;;15534:19:::1;::::0;15461:31;;-1:-1:-1;;;;;;15534:19:50::1;15526:42:::0;15522:141:::1;;15578:19;::::0;15635:20:::1;::::0;15578:78:::1;::::0;;-1:-1:-1;;;15578:78:50;;::::1;::::0;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;15578:19:50;;::::1;::::0;:42:::1;::::0;:78;;;;;:19:::1;::::0;:78;;;;;;;;:19;;:78;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;15522:141;15668:25;15680:12;15668:11;:25::i;:::-;15711:29;::::0;-1:-1:-1;;;;;15711:29:50::1;15703:52:::0;15699:160:::1;;15765:29;::::0;15831:20:::1;::::0;15765:87:::1;::::0;;-1:-1:-1;;;15765:87:50;;::::1;::::0;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;15765:29:50;;::::1;::::0;:51:::1;::::0;:87;;;;;:29:::1;::::0;:87;;;;;;;;:29;;:87;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;15699:160;15993:50;16028:14;:12;:14::i;:::-;15993:34;:50::i;:::-;15970:20;:73:::0;16072:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;16055:44:50::1;;16086:12;16055:44;;;;;;;;;;;;;;;;;;16140:20;;16126:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;16110:51:50::1;;;;;;;;;;;28609:1;15374:792::o:0;890:123:75:-;978:19;:30;;-1:-1:-1;;;;;;978:30:75;-1:-1:-1;;;;;978:30:75;;;;;;;;;;890:123::o;2261:240:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;2349:22:0;::::1;2341:73;;;;-1:-1:-1::0;;;2341:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2450:6;::::0;2429:38:::1;::::0;-1:-1:-1;;;;;2429:38:0;;::::1;::::0;2450:6:::1;::::0;2429:38:::1;::::0;2450:6:::1;::::0;2429:38:::1;2477:6;:17:::0;;-1:-1:-1;;;;;;2477:17:0::1;-1:-1:-1::0;;;;;2477:17:0;;;::::1;::::0;;;::::1;::::0;;2261:240::o;5142:1380:50:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;-1:-1:-1;;;;;5430:33:50;::::1;5422:87;;;;-1:-1:-1::0;;;5422:87:50::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;5523:30:50;::::1;5515:80;;;;-1:-1:-1::0;;;5515:80:50::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;5609:35:50;::::1;5601:90;;;;-1:-1:-1::0;;;5601:90:50::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;5705:27:50;::::1;5697:74;;;;-1:-1:-1::0;;;5697:74:50::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5777:9;:22:::0;;-1:-1:-1;;;;;5777:22:50;;::::1;-1:-1:-1::0;;;;;;5777:22:50;;::::1;;::::0;;;5805:6:::1;:16:::0;;;;::::1;::::0;;::::1;;::::0;;5827:3:::1;:10:::0;;;;::::1;::::0;;::::1;;::::0;;5843:11:::1;:26:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;5875:43:::1;5898:19:::0;5875:22:::1;:43::i;:::-;5925:16;:14;:16::i;:::-;5948:27;:14;:25;:27::i;:::-;5986:9;5981:118;6005:19;:26;6001:1;:30;5981:118;;;6046:46;6069:19;6089:1;6069:22;;;;;;;;;;;;;;6046;:46::i;:::-;6033:3;;5981:118;;;-1:-1:-1::0;6105:18:50::1;:40:::0;;;6151:20:::1;:40:::0;;;6198:28:::1;:15;:26;:28::i;:::-;6255:27;6277:4;6255:21;:27::i;:::-;6365:10;-1:-1:-1::0;;;;;6294:161:50::1;;6313:17;6338:19;6383:7;6398:12;6418:4;6430:19;6294:161;;;;;;;;;;;;;;-1:-1:-1::0;;;;;6294:161:50::1;;;;;;-1:-1:-1::0;;;;;6294:161:50::1;;;;;;-1:-1:-1::0;;;;;6294:161:50::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;6496:20;;6482:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;6466:51:50::1;;;;;;;;;;;1794:14:9::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;5142:1380:50;;;;;;;;:::o;3561:40::-;;;;;;;;;;;;;;-1:-1:-1;;;3561:40:50;;;;:::o;8349:227::-;8412:7;8427:13;8443:19;:17;:19::i;:::-;8427:35;;8468:12;8483:14;:12;:14::i;:::-;8468:29;;8514:5;8507:4;:12;8503:41;;;8536:1;8529:8;;;;;;8503:41;8556:15;:5;8566:4;8556:9;:15::i;:::-;8549:22;;;;8349:227;:::o;2461:213:26:-;2550:7;;2586:19;1149:4;2596:8;2586:9;:19::i;:::-;2569:36;-1:-1:-1;2624:20:26;2569:36;2635:8;2624:10;:20::i;:::-;2615:29;2461:213;-1:-1:-1;;;;2461:213:26:o;12293:184:50:-;12345:7;12428:44;12453:18;;12428:20;;:24;;:44;;;;:::i;828:104:19:-;915:10;828:104;:::o;27402:219:50:-;27460:20;27483:15;:13;:15::i;:::-;27512:10;:20;27460:38;;-1:-1:-1;;;;27512:20:50;;;;:25;;:64;;-1:-1:-1;27556:10:50;:20;-1:-1:-1;;;27556:20:50;;;;27541:35;;27512:64;27504:112;;;;-1:-1:-1;;;27504:112:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1369:286:5;1456:4;1563:23;1578:7;1563:14;:23::i;:::-;:85;;;;;1602:46;1627:7;1636:11;1602:24;:46::i;:::-;1556:92;1369:286;-1:-1:-1;;;1369:286:5:o;3321:426:99:-;3388:16;3412:22;3451:4;:10;;;3437:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3437:25:99;-1:-1:-1;3512:15:99;3468:13;3512:25;;;:15;;;:25;;;;;;3412:50;;-1:-1:-1;3468:13:99;-1:-1:-1;;;;;3512:25:99;3543:182;-1:-1:-1;;;;;3550:28:99;;;;;;:58;;-1:-1:-1;;;;;;3582:26:99;;451:3;3582:26;;3550:58;3543:182;;;3633:14;3618:5;3624;3618:12;;;;;;;;-1:-1:-1;;;;;3618:29:99;;;:12;;;;;;;;;;:29;;;;3672:31;;;;;;;:15;;;;:31;;;;;;;3711:7;;;;;3672:31;3543:182;;;-1:-1:-1;3737:5:99;;3321:426;-1:-1:-1;;;3321:426:99:o;17692:271:50:-;17780:7;17795:22;17820:61;17862:18;;17820:37;17836:20;;17820:11;:15;;:37;;;;:::i;:::-;:41;;:61::i;:::-;17795:86;;17894:64;17919:38;17938:18;;17919:14;:18;;:38;;;;:::i;:::-;17894:20;;;:24;:64::i;22502:576::-;22591:36;22599:14;-1:-1:-1;;;;;22591:34:50;;:36::i;:::-;22583:81;;;;;-1:-1:-1;;;22583:81:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22678:9;;:51;;;-1:-1:-1;;;22678:51:50;;-1:-1:-1;;;;;22678:51:50;;;;;;;;;:9;;;;;:26;;:51;;;;;;;;;;;;;;:9;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22678:51:50;22670:107;;;;-1:-1:-1;;;22670:107:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22863:40;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22863:40:50;-1:-1:-1;;;22863:40:50;;;22828:76;;;;22784:14;;22800:24;;-1:-1:-1;;;;;22828:34:50;;;22863:40;;22828:76;;;;;;22863:40;22828:76;;;;;;;;;;-1:-1:-1;;22828:76:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22783:121;;;;22918:9;22910:57;;;;-1:-1:-1;;;22910:57:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22973:50;:14;23007;22973:25;:50::i;:::-;23034:39;;-1:-1:-1;;;;;23034:39:50;;;;;;;;22502:576;;;:::o;2266:365:99:-;-1:-1:-1;;;;;2369:16:99;;451:3;2369:16;;;;:38;;-1:-1:-1;;;;;;2389:18:99;;;;2369:38;2361:66;;;;;-1:-1:-1;;;2361:66:99;;;;;;;;;;;;-1:-1:-1;;;2361:66:99;;;;;;;;;;;;;;;-1:-1:-1;;;;;2441:28:99;;;;;;;:15;;;:28;;;;;;;;:36;;;;2433:68;;;;;-1:-1:-1;;;2433:68:99;;;;;;;;;;;;-1:-1:-1;;;2433:68:99;;;;;;;;;;;;;;;-1:-1:-1;;;;;2538:21:99;;;;;;;:15;;;:21;;;;;;;;2507:28;;;;;;;;:52;;2538:21;;;;-1:-1:-1;;;;;;2507:52:99;;;;;;;2572:21;2565:28;;;;;;;2612:10;;-1:-1:-1;;2612:14:99;2599:27;;2266:365::o;27186:212:50:-;-1:-1:-1;;;;;27300:39:50;;;;;;:22;:39;;;;;27293:46;;;:::i;:::-;27350:43;;-1:-1:-1;;;;;27350:43:50;;;;;;;;27186:212;:::o;2701:175:8:-;2759:7;2790:5;;;2813:6;;;;2805:46;;;;;-1:-1:-1;;;2805:46:8;;;;;;;;;;;;;;;;;;;;;;;;;;;541:87:75;619:4;;541:87;:::o;8918:114:50:-;8971:4;9008:19;:17;:19::i;:::-;8990:14;:12;:14::i;:::-;:37;;8983:44;;8918:114;:::o;21475:272::-;21581:1;21559:19;:23;21551:88;;;;-1:-1:-1;;;21551:88:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21645:18;:40;;;21697:45;;;;;;;;;;;;;;;;;21475:272;:::o;1436:624:12:-;1812:10;;;1811:62;;-1:-1:-1;1828:39:12;;;-1:-1:-1;;;1828:39:12;;1852:4;1828:39;;;;-1:-1:-1;;;;;1828:39:12;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1828:39:12;:44;1811:62;1803:150;;;;-1:-1:-1;;;1803:150:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1990:62;;;-1:-1:-1;;;;;1990:62:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1990:62:12;-1:-1:-1;;;1990:62:12;;;1963:90;;1983:5;;1963:19;:90::i;2028:176:24:-;2084:6;-1:-1:-1;;;2110:5:24;:13;2102:65;;;;-1:-1:-1;;;2102:65:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2191:5:24;2028:176::o;2879:178:99:-;2956:4;-1:-1:-1;;;;;2975:16:99;;451:3;2975:16;;;;:38;;-1:-1:-1;;;;;;2995:18:99;;;;2975:38;:77;;;;-1:-1:-1;;;;;;;3017:21:99;;;3050:1;3017:21;;;:15;;;;;:21;;;;;;;;:35;;;2879:178::o;1597:371::-;-1:-1:-1;;;;;1682:22:99;;451:3;1682:22;;;;:50;;-1:-1:-1;;;;;;1708:24:99;;;;1682:50;1674:78;;;;;-1:-1:-1;;;1674:78:99;;;;;;;;;;;;-1:-1:-1;;;1674:78:99;;;;;;;;;;;;;;;-1:-1:-1;;;;;1766:27:99;;;1805:1;1766:27;;;:15;;;:27;;;;;;;:41;1758:67;;;;;-1:-1:-1;;;1758:67:99;;;;;;;;;;;;-1:-1:-1;;;1758:67:99;;;;;;;;;;;;;;;1861:15;:25;;;;:15;;;:25;;;;;;;;-1:-1:-1;;;;;1831:27:99;;;;;;;;;:55;;1861:25;;;;-1:-1:-1;;;;;;1831:55:99;;;;;;1892:25;;;;:38;;;;;;;;;;;1949:10;;:14;1936:27;;1597:371::o;25904:517:50:-;26079:9;;26014:53;;;-1:-1:-1;;;26014:53:50;;;;;;;;;;-1:-1:-1;;;;;26079:9:50;;;;26014:43;;;;;:53;;;;;;;;;;;;;;:43;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26014:53:50;-1:-1:-1;;;;;26014:75:50;;26006:127;;;;-1:-1:-1;;;26006:127:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26144:9;26139:218;-1:-1:-1;;;;;26163:39:50;;;;;;:22;:39;;;;;:46;26159:50;;26139:218;;;-1:-1:-1;;;;;26228:39:50;;;;;;:22;:39;;;;;:42;;26274:8;;26228:39;26268:1;;26228:42;;;;;;;;;;;;;;:54;26224:127;;;26294:48;;-1:-1:-1;;;26294:48:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26224:127;26211:3;;26139:218;;;-1:-1:-1;;;;;;26362:39:50;;;;;;;:22;:39;;;;;;;:54;;;;;;;;;;;;;;25904:517::o;20753:252::-;20855:2;20834:18;:23;;;20826:80;;;;-1:-1:-1;;;20826:80:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20912:17;:38;;-1:-1:-1;;20912:38:50;;;;;;;;;;;;;20961:39;;;20982:17;;;;20961:39;;;;;;;;;;;;;20753:252;:::o;778:108:75:-;845:11;;:36;;;-1:-1:-1;;;845:36:75;;;;;;;;;;-1:-1:-1;;;;;845:11:75;;;;:22;;:36;;;;;:11;;:36;;;;;;;;:11;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;778:108;:::o;1952:123:9:-;2000:4;2024:44;2062:4;2024:29;:44::i;935:126:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;992:26:0::1;:24;:26::i;:::-;1028;:24;:26::i;:::-;1794:14:9::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;935:126:0;:::o;726:144:99:-;791:10;;:15;783:40;;;;;-1:-1:-1;;;783:40:99;;;;;;;;;;;;-1:-1:-1;;;783:40:99;;;;;;;;;;;;;;;451:3;829:25;;;;:15;;;:25;;;;;;:36;;-1:-1:-1;;;;;;829:36:99;;;;;;726:144::o;3147:155:8:-;3205:7;3237:1;3232;:6;;3224:49;;;;;-1:-1:-1;;;3224:49:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3290:5:8;;;3147:155::o;2266:459:27:-;2324:7;2565:6;2561:45;;-1:-1:-1;2594:1:27;2587:8;;2561:45;2628:5;;;2632:1;2628;:5;:1;2651:5;;;;;:10;2643:56;;;;-1:-1:-1;;;2643:56:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3187:130;3245:7;3271:39;3275:1;3278;3271:39;;;;;;;;;;;;;;;;;:3;:39::i;13967:95:50:-;14045:12;13967:95;:::o;757:394:5:-;821:4;1016:55;1041:7;-1:-1:-1;;;1016:24:5;:55::i;:::-;:128;;;;-1:-1:-1;1088:56:5;1113:7;-1:-1:-1;;;;;;1088:24:5;:56::i;:::-;1087:57;;757:394;-1:-1:-1;;757:394:5:o;4243:395::-;4336:4;4515:12;4529:11;4544:50;4573:7;4582:11;4544:28;:50::i;:::-;4514:80;;;;4613:7;:17;;;;;4624:6;4613:17;4605:26;4243:395;-1:-1:-1;;;;;4243:395:5:o;4228:150:8:-;4286:7;4317:1;4313;:5;4305:44;;;;;-1:-1:-1;;;4305:44:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;4370:1;4366;:5;;;;;;;4228:150;-1:-1:-1;;;4228:150:8:o;737:413:18:-;1097:20;1135:8;;;737:413::o;3088:762:12:-;3518:23;3544:69;3572:4;3544:69;;;;;;;;;;;;;;;;;3552:5;-1:-1:-1;;;;;3544:27:12;;;:69;;;;;:::i;:::-;3627:17;;3518:95;;-1:-1:-1;3627:21:12;3623:221;;3767:10;3756:30;;;;;;;;;;;;;;;-1:-1:-1;3756:30:12;3748:85;;;;-1:-1:-1;;;3748:85:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;759:64:19;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1794:14;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;759:64:19;:::o;1067:192:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1134:17:0::1;1154:12;:10;:12::i;:::-;1176:6;:18:::0;;-1:-1:-1;;;;;;1176:18:0::1;-1:-1:-1::0;;;;;1176:18:0;::::1;::::0;;::::1;::::0;;;1209:43:::1;::::0;1176:18;;-1:-1:-1;1176:18:0;-1:-1:-1;;1209:43:0::1;::::0;-1:-1:-1;;1209:43:0::1;1778:1:9;1794:14:::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1067:192:0;:::o;3799:272:27:-;3885:7;3919:12;3912:5;3904:28;;;;-1:-1:-1;;;3904:28:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3942:9;3958:1;3954;:5;;;;;;;3799:272;-1:-1:-1;;;;;3799:272:27:o;5155:444:5:-;5331:57;;;-1:-1:-1;;;;;;5331:57:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5331:57:5;-1:-1:-1;;;5331:57:5;;;5436:47;;;;5276:4;;;;5331:57;5276:4;;5302:26;;-1:-1:-1;;;;;5436:18:5;;;5461:5;;5331:57;;5436:47;;;;5331:57;5436:47;;;;;;;;;;-1:-1:-1;;5436:47:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5398:85;;;;5513:2;5497:6;:13;:18;5493:45;;;5525:5;5532;5517:21;;;;;;;;;5493:45;5556:7;5576:6;5565:26;;;;;;;;;;;;;;;-1:-1:-1;5565:26:5;5548:44;;-1:-1:-1;5565:26:5;-1:-1:-1;;;;5155:444:5;;;;;;:::o;3592:193:18:-;3695:12;3726:52;3748:6;3756:4;3762:1;3765:12;3695;4869:18;4880:6;4869:10;:18::i;:::-;4861:60;;;;;-1:-1:-1;;;4861:60:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;4992:12;5006:23;5033:6;-1:-1:-1;;;;;5033:11:18;5053:5;5061:4;5033:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5033:33:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4991:75;;;;5083:52;5101:7;5110:10;5122:12;5083:17;:52::i;:::-;5076:59;4619:523;-1:-1:-1;;;;;;;4619:523:18:o;6122:725::-;6237:12;6265:7;6261:580;;;-1:-1:-1;6295:10:18;6288:17;;6261:580;6406:17;;:21;6402:429;;6664:10;6658:17;6724:15;6711:10;6707:2;6703:19;6696:44;6613:145;6796:20;;-1:-1:-1;;;6796:20:18;;;;;;;;;;;;;;;;;6803:12;;6796:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "3267200",
                "executionCost": "3627",
                "totalCost": "3270827"
              },
              "external": {
                "VERSION()": "infinite",
                "addExternalErc20Award(address)": "infinite",
                "addExternalErc20Awards(address[])": "infinite",
                "addExternalErc721Award(address,uint256[])": "infinite",
                "beforeAwardListener()": "1128",
                "beforeTokenMint(address,uint256,address,address)": "infinite",
                "beforeTokenTransfer(address,address,uint256,address)": "infinite",
                "calculateNextPrizePeriodStartTime(uint256)": "infinite",
                "canCompleteAward()": "infinite",
                "canStartAward()": "infinite",
                "cancelAward()": "infinite",
                "completeAward()": "infinite",
                "currentPrize()": "infinite",
                "estimateRemainingBlocksToPrize(uint256)": "infinite",
                "forceBeforeAwardListener(address)": "21139",
                "getExternalErc20Awards()": "infinite",
                "getExternalErc721AwardTokenIds(address)": "infinite",
                "getExternalErc721Awards()": "infinite",
                "getLastRngLockBlock()": "1097",
                "getLastRngRequestId()": "1170",
                "initialize(uint256,uint256,address,address,address,address,address[])": "infinite",
                "isPrizePeriodOver()": "infinite",
                "isRngCompleted()": "infinite",
                "isRngRequested()": "1130",
                "isRngTimedOut()": "infinite",
                "owner()": "1127",
                "periodicPrizeStrategyListener()": "1126",
                "prizePeriodEndAt()": "infinite",
                "prizePeriodRemainingSeconds()": "infinite",
                "prizePeriodSeconds()": "1110",
                "prizePeriodStartedAt()": "1044",
                "prizePool()": "1170",
                "removeExternalErc20Award(address,address)": "infinite",
                "removeExternalErc721Award(address,address)": "infinite",
                "renounceOwnership()": "infinite",
                "rng()": "1126",
                "rngRequestTimeout()": "1124",
                "setBeforeAwardListener(address)": "infinite",
                "setCurrentTime(uint256)": "20324",
                "setDistributor(address)": "21163",
                "setPeriodicPrizeStrategyListener(address)": "infinite",
                "setPrizePeriodSeconds(uint256)": "infinite",
                "setRngRequest(uint32,uint32)": "21233",
                "setRngRequestTimeout(uint32)": "infinite",
                "setRngService(address)": "infinite",
                "setTokenListener(address)": "infinite",
                "sponsorship()": "1105",
                "startAward()": "infinite",
                "supportsInterface(bytes4)": "434",
                "ticket()": "1126",
                "tokenListener()": "1149",
                "transferOwnership(address)": "infinite"
              },
              "internal": {
                "_currentTime()": "815",
                "_distribute(uint256)": "infinite"
              }
            },
            "methodIdentifiers": {
              "VERSION()": "ffa1ad74",
              "addExternalErc20Award(address)": "4e5d08e0",
              "addExternalErc20Awards(address[])": "66968221",
              "addExternalErc721Award(address,uint256[])": "c48ddbcb",
              "beforeAwardListener()": "0d847fc4",
              "beforeTokenMint(address,uint256,address,address)": "4d7f3db0",
              "beforeTokenTransfer(address,address,uint256,address)": "b2210957",
              "calculateNextPrizePeriodStartTime(uint256)": "47bed998",
              "canCompleteAward()": "6a74f107",
              "canStartAward()": "876f5c7e",
              "cancelAward()": "4c169f4f",
              "completeAward()": "dfb2f13b",
              "currentPrize()": "c42b42a0",
              "estimateRemainingBlocksToPrize(uint256)": "01b48e34",
              "forceBeforeAwardListener(address)": "f210a9f3",
              "getExternalErc20Awards()": "62c77a61",
              "getExternalErc721AwardTokenIds(address)": "9417783f",
              "getExternalErc721Awards()": "42d09209",
              "getLastRngLockBlock()": "6bea5344",
              "getLastRngRequestId()": "2a7ad609",
              "initialize(uint256,uint256,address,address,address,address,address[])": "f97700e2",
              "isPrizePeriodOver()": "95e5f9ee",
              "isRngCompleted()": "4aba4f6b",
              "isRngRequested()": "111070e4",
              "isRngTimedOut()": "738bbea8",
              "owner()": "8da5cb5b",
              "periodicPrizeStrategyListener()": "c2f19ee8",
              "prizePeriodEndAt()": "2c8fe73d",
              "prizePeriodRemainingSeconds()": "d5ad6bf6",
              "prizePeriodSeconds()": "94144c6b",
              "prizePeriodStartedAt()": "72f33ea9",
              "prizePool()": "719ce73e",
              "removeExternalErc20Award(address,address)": "b0244682",
              "removeExternalErc721Award(address,address)": "671137c4",
              "renounceOwnership()": "715018a6",
              "rng()": "d605787b",
              "rngRequestTimeout()": "acca5b95",
              "setBeforeAwardListener(address)": "30fcdf41",
              "setCurrentTime(uint256)": "22f8e566",
              "setDistributor(address)": "75619ab5",
              "setPeriodicPrizeStrategyListener(address)": "8aa3ec6f",
              "setPrizePeriodSeconds(uint256)": "884a4448",
              "setRngRequest(uint32,uint32)": "642d43db",
              "setRngRequestTimeout(uint32)": "c6853270",
              "setRngService(address)": "7f4296d7",
              "setTokenListener(address)": "605e25ac",
              "sponsorship()": "500db70d",
              "startAward()": "b9ee1e05",
              "supportsInterface(bytes4)": "01ffc9a7",
              "ticket()": "6cc25db7",
              "tokenListener()": "6be51c4f",
              "transferOwnership(address)": "f2fde38b"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract BeforeAwardListenerInterface\",\"name\":\"beforeAwardListener\",\"type\":\"address\"}],\"name\":\"BeforeAwardListenerSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"externalErc20\",\"type\":\"address\"}],\"name\":\"ExternalErc20AwardAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"externalErc20Award\",\"type\":\"address\"}],\"name\":\"ExternalErc20AwardRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"externalErc721\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"ExternalErc721AwardAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"externalErc721Award\",\"type\":\"address\"}],\"name\":\"ExternalErc721AwardRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"prizePeriodStart\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"prizePeriodSeconds\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"contract PrizePool\",\"name\":\"prizePool\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract TicketInterface\",\"name\":\"ticket\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"sponsorship\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract RNGInterface\",\"name\":\"rng\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract IERC20Upgradeable[]\",\"name\":\"externalErc20Awards\",\"type\":\"address[]\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract PeriodicPrizeStrategyListenerInterface\",\"name\":\"periodicPrizeStrategyListener\",\"type\":\"address\"}],\"name\":\"PeriodicPrizeStrategyListenerSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"prizePeriodSeconds\",\"type\":\"uint256\"}],\"name\":\"PrizePeriodSecondsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"prizePool\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"rngRequestId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"rngLockBlock\",\"type\":\"uint32\"}],\"name\":\"PrizePoolAwardCancelled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"prizePool\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"rngRequestId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"rngLockBlock\",\"type\":\"uint32\"}],\"name\":\"PrizePoolAwardStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"randomNumber\",\"type\":\"uint256\"}],\"name\":\"PrizePoolAwarded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"prizePeriodStartedAt\",\"type\":\"uint256\"}],\"name\":\"PrizePoolOpened\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"RngRequestFailed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"rngRequestTimeout\",\"type\":\"uint32\"}],\"name\":\"RngRequestTimeoutSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract RNGInterface\",\"name\":\"rngService\",\"type\":\"address\"}],\"name\":\"RngServiceUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract TokenListenerInterface\",\"name\":\"tokenListener\",\"type\":\"address\"}],\"name\":\"TokenListenerUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_externalErc20\",\"type\":\"address\"}],\"name\":\"addExternalErc20Award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20Upgradeable[]\",\"name\":\"_externalErc20s\",\"type\":\"address[]\"}],\"name\":\"addExternalErc20Awards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"_externalErc721\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"_tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"addExternalErc721Award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"beforeAwardListener\",\"outputs\":[{\"internalType\":\"contract BeforeAwardListenerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"}],\"name\":\"beforeTokenMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"beforeTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"currentTime\",\"type\":\"uint256\"}],\"name\":\"calculateNextPrizePeriodStartTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"canCompleteAward\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"canStartAward\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancelAward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"completeAward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentPrize\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"secondsPerBlockMantissa\",\"type\":\"uint256\"}],\"name\":\"estimateRemainingBlocksToPrize\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract BeforeAwardListenerInterface\",\"name\":\"listener\",\"type\":\"address\"}],\"name\":\"forceBeforeAwardListener\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExternalErc20Awards\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"_externalErc721\",\"type\":\"address\"}],\"name\":\"getExternalErc721AwardTokenIds\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExternalErc721Awards\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastRngLockBlock\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastRngRequestId\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_prizePeriodStart\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_prizePeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"contract PrizePool\",\"name\":\"_prizePool\",\"type\":\"address\"},{\"internalType\":\"contract TicketInterface\",\"name\":\"_ticket\",\"type\":\"address\"},{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_sponsorship\",\"type\":\"address\"},{\"internalType\":\"contract RNGInterface\",\"name\":\"_rng\",\"type\":\"address\"},{\"internalType\":\"contract IERC20Upgradeable[]\",\"name\":\"externalErc20Awards\",\"type\":\"address[]\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isPrizePeriodOver\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isRngCompleted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isRngRequested\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isRngTimedOut\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"periodicPrizeStrategyListener\",\"outputs\":[{\"internalType\":\"contract PeriodicPrizeStrategyListenerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizePeriodEndAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizePeriodRemainingSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizePeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizePeriodStartedAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizePool\",\"outputs\":[{\"internalType\":\"contract PrizePool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_externalErc20\",\"type\":\"address\"},{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_prevExternalErc20\",\"type\":\"address\"}],\"name\":\"removeExternalErc20Award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"_externalErc721\",\"type\":\"address\"},{\"internalType\":\"contract IERC721Upgradeable\",\"name\":\"_prevExternalErc721\",\"type\":\"address\"}],\"name\":\"removeExternalErc721Award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rng\",\"outputs\":[{\"internalType\":\"contract RNGInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rngRequestTimeout\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract BeforeAwardListenerInterface\",\"name\":\"_beforeAwardListener\",\"type\":\"address\"}],\"name\":\"setBeforeAwardListener\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_time\",\"type\":\"uint256\"}],\"name\":\"setCurrentTime\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract PeriodicPrizeStrategyDistributorInterface\",\"name\":\"_distributor\",\"type\":\"address\"}],\"name\":\"setDistributor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract PeriodicPrizeStrategyListenerInterface\",\"name\":\"_periodicPrizeStrategyListener\",\"type\":\"address\"}],\"name\":\"setPeriodicPrizeStrategyListener\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_prizePeriodSeconds\",\"type\":\"uint256\"}],\"name\":\"setPrizePeriodSeconds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"requestId\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"lockBlock\",\"type\":\"uint32\"}],\"name\":\"setRngRequest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_rngRequestTimeout\",\"type\":\"uint32\"}],\"name\":\"setRngRequestTimeout\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract RNGInterface\",\"name\":\"rngService\",\"type\":\"address\"}],\"name\":\"setRngService\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"_tokenListener\",\"type\":\"address\"}],\"name\":\"setTokenListener\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sponsorship\",\"outputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startAward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ticket\",\"outputs\":[{\"internalType\":\"contract TicketInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenListener\",\"outputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addExternalErc20Award(address)\":{\"details\":\"Only the Prize-Strategy owner/creator can assign external tokens, and they must be approved by the Prize-Pool\",\"params\":{\"_externalErc20\":\"The address of an ERC20 token to be awarded\"}},\"addExternalErc721Award(address,uint256[])\":{\"details\":\"Only the Prize-Strategy owner/creator can assign external tokens, and they must be approved by the Prize-Pool NOTE: The NFT must already be owned by the Prize-Pool\",\"params\":{\"_externalErc721\":\"The address of an ERC721 token to be awarded\",\"_tokenIds\":\"An array of token IDs of the ERC721 to be awarded\"}},\"beforeTokenMint(address,uint256,address,address)\":{\"params\":{\"controlledToken\":\"The type of collateral that is being minted\"}},\"beforeTokenTransfer(address,address,uint256,address)\":{\"details\":\"Note that this is only for *transfers*, not mints or burns\",\"params\":{\"controlledToken\":\"The type of collateral that is being sent\"}},\"calculateNextPrizePeriodStartTime(uint256)\":{\"params\":{\"currentTime\":\"The timestamp to use as the current time\"},\"returns\":{\"_0\":\"The timestamp at which the next prize period would start\"}},\"canCompleteAward()\":{\"returns\":{\"_0\":\"True if an award can be completed, false otherwise.\"}},\"canStartAward()\":{\"returns\":{\"_0\":\"True if an award can be started, false otherwise.\"}},\"currentPrize()\":{\"returns\":{\"_0\":\"The current prize size\"}},\"estimateRemainingBlocksToPrize(uint256)\":{\"params\":{\"secondsPerBlockMantissa\":\"The number of seconds per block to use for the calculation.  Should be a fixed point 18 number like Ether.\"},\"returns\":{\"_0\":\"The estimated number of blocks remaining until the prize can be awarded.\"}},\"getExternalErc20Awards()\":{\"returns\":{\"_0\":\"An array of External ERC20 token addresses\"}},\"getExternalErc721AwardTokenIds(address)\":{\"returns\":{\"_0\":\"An array of External ERC721 token addresses\"}},\"getExternalErc721Awards()\":{\"returns\":{\"_0\":\"An array of External ERC721 token addresses\"}},\"getLastRngLockBlock()\":{\"returns\":{\"_0\":\"The block number that the RNG request is locked to\"}},\"getLastRngRequestId()\":{\"returns\":{\"_0\":\"The current Request ID\"}},\"initialize(uint256,uint256,address,address,address,address,address[])\":{\"params\":{\"_prizePeriodSeconds\":\"The duration of the prize period in seconds\",\"_prizePeriodStart\":\"The starting timestamp of the prize period.\",\"_prizePool\":\"The prize pool to award\",\"_rng\":\"The RNG service to use\",\"_sponsorship\":\"The sponsorship token\",\"_ticket\":\"The ticket to use to draw winners\"}},\"isPrizePeriodOver()\":{\"returns\":{\"_0\":\"True if the prize period is over, false otherwise\"}},\"isRngCompleted()\":{\"returns\":{\"_0\":\"True if a random number request has completed, false otherwise.\"}},\"isRngRequested()\":{\"returns\":{\"_0\":\"True if a random number has been requested, false otherwise.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"prizePeriodEndAt()\":{\"returns\":{\"_0\":\"The timestamp at which the prize period ends.\"}},\"prizePeriodRemainingSeconds()\":{\"returns\":{\"_0\":\"The number of seconds remaining until the prize can be awarded.\"}},\"removeExternalErc20Award(address,address)\":{\"details\":\"Only the Prize-Strategy owner/creator can remove external tokens\",\"params\":{\"_externalErc20\":\"The address of an ERC20 token to be removed\",\"_prevExternalErc20\":\"The address of the previous ERC20 token in the `externalErc20s` list. If the ERC20 is the first address, then the previous address is the SENTINEL address: 0x0000000000000000000000000000000000000001\"}},\"removeExternalErc721Award(address,address)\":{\"details\":\"Only the Prize-Strategy owner/creator can remove external tokens\",\"params\":{\"_externalErc721\":\"The address of an ERC721 token to be removed\",\"_prevExternalErc721\":\"The address of the previous ERC721 token in the list. If no previous, then pass the SENTINEL address: 0x0000000000000000000000000000000000000001\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setBeforeAwardListener(address)\":{\"details\":\"The listener must implement ERC165 and the BeforeAwardListenerInterface\",\"params\":{\"_beforeAwardListener\":\"The address of the listener contract\"}},\"setPeriodicPrizeStrategyListener(address)\":{\"params\":{\"_periodicPrizeStrategyListener\":\"The address of the listener contract\"}},\"setPrizePeriodSeconds(uint256)\":{\"params\":{\"_prizePeriodSeconds\":\"The new prize period in seconds.  Must be greater than zero.\"}},\"setRngRequestTimeout(uint32)\":{\"params\":{\"_rngRequestTimeout\":\"The RNG request timeout in seconds.\"}},\"setRngService(address)\":{\"params\":{\"rngService\":\"The address of the new RNG service interface\"}},\"setTokenListener(address)\":{\"params\":{\"_tokenListener\":\"A contract that implements the token listener interface.\"}},\"startAward()\":{\"details\":\"The RNG-Request-Fee is expected to be held within this contract before calling this function\"},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"VERSION()\":{\"notice\":\"Semver Version\"},\"addExternalErc20Award(address)\":{\"notice\":\"Adds an external ERC20 token type as an additional prize that can be awarded\"},\"addExternalErc721Award(address,uint256[])\":{\"notice\":\"Adds an external ERC721 token as an additional prize that can be awarded\"},\"beforeAwardListener()\":{\"notice\":\"A listener that is called before the prize is awarded\"},\"beforeTokenMint(address,uint256,address,address)\":{\"notice\":\"Called by the PrizePool when minting controlled tokens\"},\"beforeTokenTransfer(address,address,uint256,address)\":{\"notice\":\"Called by the PrizePool for transfers of controlled tokens\"},\"calculateNextPrizePeriodStartTime(uint256)\":{\"notice\":\"Calculates when the next prize period will start\"},\"canCompleteAward()\":{\"notice\":\"Returns whether an award process can be completed\"},\"canStartAward()\":{\"notice\":\"Returns whether an award process can be started\"},\"cancelAward()\":{\"notice\":\"Can be called by anyone to unlock the tickets if the RNG has timed out.\"},\"completeAward()\":{\"notice\":\"Completes the award process and awards the winners.  The random number must have been requested and is now available.\"},\"currentPrize()\":{\"notice\":\"Calculates and returns the currently accrued prize\"},\"estimateRemainingBlocksToPrize(uint256)\":{\"notice\":\"Estimates the remaining blocks until the prize given a number of seconds per block\"},\"getExternalErc20Awards()\":{\"notice\":\"Gets the current list of External ERC20 tokens that will be awarded with the current prize\"},\"getExternalErc721AwardTokenIds(address)\":{\"notice\":\"Gets the current list of External ERC721 tokens that will be awarded with the current prize\"},\"getExternalErc721Awards()\":{\"notice\":\"Gets the current list of External ERC721 tokens that will be awarded with the current prize\"},\"getLastRngLockBlock()\":{\"notice\":\"Returns the block number that the current RNG request has been locked to\"},\"getLastRngRequestId()\":{\"notice\":\"Returns the current RNG Request ID\"},\"initialize(uint256,uint256,address,address,address,address,address[])\":{\"notice\":\"Initializes a new strategy\"},\"isPrizePeriodOver()\":{\"notice\":\"Returns whether the prize period is over\"},\"isRngCompleted()\":{\"notice\":\"Returns whether the random number request has completed.\"},\"isRngRequested()\":{\"notice\":\"Returns whether a random number has been requested\"},\"periodicPrizeStrategyListener()\":{\"notice\":\"A listener that is called after the prize is awarded\"},\"prizePeriodEndAt()\":{\"notice\":\"Returns the timestamp at which the prize period ends\"},\"prizePeriodRemainingSeconds()\":{\"notice\":\"Returns the number of seconds remaining until the prize can be awarded.\"},\"removeExternalErc20Award(address,address)\":{\"notice\":\"Removes an external ERC20 token type as an additional prize that can be awarded\"},\"removeExternalErc721Award(address,address)\":{\"notice\":\"Removes an external ERC721 token as an additional prize that can be awarded\"},\"rngRequestTimeout()\":{\"notice\":\"RNG Request Timeout.  In fact, this is really a \\\"complete award\\\" timeout. If the rng completes the award can still be cancelled.\"},\"setBeforeAwardListener(address)\":{\"notice\":\"Allows the owner to set a listener that is triggered immediately before the award is distributed\"},\"setPeriodicPrizeStrategyListener(address)\":{\"notice\":\"Allows the owner to set a listener for prize strategy callbacks.\"},\"setPrizePeriodSeconds(uint256)\":{\"notice\":\"Allows the owner to set the prize period in seconds.\"},\"setRngRequestTimeout(uint32)\":{\"notice\":\"Allows the owner to set the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\"},\"setRngService(address)\":{\"notice\":\"Sets the RNG service that the Prize Strategy is connected to\"},\"setTokenListener(address)\":{\"notice\":\"Allows the owner to set the token listener\"},\"startAward()\":{\"notice\":\"Starts the award process by starting random number request.  The prize period must have ended.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/PeriodicPrizeStrategyHarness.sol\":\"PeriodicPrizeStrategyHarness\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.6.0;\\n\\n/// @title Random Number Generator Interface\\n/// @notice Provides an interface for requesting random numbers from 3rd-party RNG services (Chainlink VRF, Starkware VDF, etc..)\\ninterface RNGInterface {\\n\\n  /// @notice Emitted when a new request for a random number has been submitted\\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\\n  /// @param sender The indexed address of the sender of the request\\n  event RandomNumberRequested(uint32 indexed requestId, address indexed sender);\\n\\n  /// @notice Emitted when an existing request for a random number has been completed\\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\\n  /// @param randomNumber The random number produced by the 3rd-party service\\n  event RandomNumberCompleted(uint32 indexed requestId, uint256 randomNumber);\\n\\n  /// @notice Gets the last request id used by the RNG service\\n  /// @return requestId The last request id used in the last request\\n  function getLastRequestId() external view returns (uint32 requestId);\\n\\n  /// @notice Gets the Fee for making a Request against an RNG service\\n  /// @return feeToken The address of the token that is used to pay fees\\n  /// @return requestFee The fee required to be paid to make a request\\n  function getRequestFee() external view returns (address feeToken, uint256 requestFee);\\n\\n  /// @notice Sends a request for a random number to the 3rd-party service\\n  /// @dev Some services will complete the request immediately, others may have a time-delay\\n  /// @dev Some services require payment in the form of a token, such as $LINK for Chainlink VRF\\n  /// @return requestId The ID of the request used to get the results of the RNG service\\n  /// @return lockBlock The block number at which the RNG service will start generating time-delayed randomness.  The calling contract\\n  /// should \\\"lock\\\" all activity until the result is available via the `requestId`\\n  function requestRandomNumber() external returns (uint32 requestId, uint32 lockBlock);\\n\\n  /// @notice Checks if the request for randomness from the 3rd-party service has completed\\n  /// @dev For time-delayed requests, this function is used to check/confirm completion\\n  /// @param requestId The ID of the request used to get the results of the RNG service\\n  /// @return isCompleted True if the request has completed and a random number is available, false otherwise\\n  function isRequestComplete(uint32 requestId) external view returns (bool isCompleted);\\n\\n  /// @notice Gets the random number produced by the 3rd-party service\\n  /// @param requestId The ID of the request used to get the results of the RNG service\\n  /// @return randomNum The random number\\n  function randomNumber(uint32 requestId) external returns (uint256 randomNum);\\n}\\n\",\"keccak256\":\"0xf917c68439d7476cd226f475e8fce940e0cf1d32cb0ff12e8537072a07f2b1da\",\"license\":\"GPL-3.0\"},\"contracts/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary Constants {\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC721 = 0x80ac58cd;\\n}\",\"keccak256\":\"0x5dc8f8bda4e9668a9ffae6a941774f849adcb368cc2275fd8a91e6ada8fad7fb\",\"license\":\"GPL-3.0\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../external/compound/ICompLike.sol\\\";\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../reserve/ReserveInterface.sol\\\";\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/TokenListenerLibrary.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\nimport \\\"./PrizePoolInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using SafeERC20Upgradeable for IERC721Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    address reserveRegistry,\\n    uint256 maxExitFeeMantissa\\n  );\\n\\n  /// @dev Event emitted when controlled token is added\\n  event ControlledTokenAdded(\\n    ControlledTokenInterface indexed token\\n  );\\n\\n  /// @dev Emitted when reserve is captured.\\n  event ReserveFeeCaptured(\\n    uint256 amount\\n  );\\n\\n  event AwardCaptured(\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when assets are deposited\\n  event Deposited(\\n    address indexed operator,\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount,\\n    address referrer\\n  );\\n\\n  /// @dev Event emitted when interest is awarded to a winner\\n  event Awarded(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are awarded to a winner\\n  event AwardedExternalERC20(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are transferred out\\n  event TransferredExternalERC20(\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC721s are awarded to a winner\\n  event AwardedExternalERC721(\\n    address indexed winner,\\n    address indexed token,\\n    uint256[] tokenIds\\n  );\\n\\n  /// @dev Event emitted when assets are withdrawn instantly\\n  event InstantWithdrawal(\\n    address indexed operator,\\n    address indexed from,\\n    address indexed token,\\n    uint256 amount,\\n    uint256 redeemed,\\n    uint256 exitFee\\n  );\\n\\n  event ReserveWithdrawal(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when the Liquidity Cap is set\\n  event LiquidityCapSet(\\n    uint256 liquidityCap\\n  );\\n\\n  /// @dev Event emitted when the Credit plan is set\\n  event CreditPlanSet(\\n    address token,\\n    uint128 creditLimitMantissa,\\n    uint128 creditRateMantissa\\n  );\\n\\n  /// @dev Event emitted when the Prize Strategy is set\\n  event PrizeStrategySet(\\n    address indexed prizeStrategy\\n  );\\n\\n  /// @dev Emitted when credit is minted\\n  event CreditMinted(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when credit is burned\\n  event CreditBurned(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\\n  event ErrorAwardingExternalERC721(bytes error);\\n\\n\\n  struct CreditPlan {\\n    uint128 creditLimitMantissa;\\n    uint128 creditRateMantissa;\\n  }\\n\\n  struct CreditBalance {\\n    uint192 balance;\\n    uint32 timestamp;\\n    bool initialized;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  /// @dev Reserve to which reserve fees are sent\\n  RegistryInterface public reserveRegistry;\\n\\n  /// @dev An array of all the controlled tokens\\n  ControlledTokenInterface[] internal _tokens;\\n\\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\\n  TokenListenerInterface public prizeStrategy;\\n\\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\\n  /// For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\\n  uint256 public maxExitFeeMantissa;\\n\\n  /// @dev The total funds that have been allocated to the reserve\\n  uint256 public reserveTotalSupply;\\n\\n  /// @dev The total amount of funds that the prize pool can hold.\\n  uint256 public liquidityCap;\\n\\n  /// @dev the The awardable balance\\n  uint256 internal _currentAwardBalance;\\n\\n  /// @dev Stores the credit plan for each token.\\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\\n\\n  /// @dev Stores each users balance of credit per token.\\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\\n\\n  /// @notice Initializes the Prize Pool\\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\\n  /// @param _maxExitFeeMantissa The maximum exit fee size\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_reserveRegistry) != address(0), \\\"PrizePool/reserveRegistry-not-zero\\\");\\n    uint256 controlledTokensLength = _controlledTokens.length;\\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\\n\\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\\n      _addControlledToken(controlledToken, i);\\n    }\\n    __Ownable_init();\\n    __ReentrancyGuard_init();\\n    _setLiquidityCap(uint256(-1));\\n\\n    reserveRegistry = _reserveRegistry;\\n    maxExitFeeMantissa = _maxExitFeeMantissa;\\n\\n    emit Initialized(\\n      address(_reserveRegistry),\\n      maxExitFeeMantissa\\n    );\\n  }\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external override view returns (address) {\\n    return address(_token());\\n  }\\n\\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\\n  /// @return The underlying balance of assets\\n  function balance() external returns (uint256) {\\n    return _balance();\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function canAwardExternal(address _externalToken) external view returns (bool) {\\n    return _canAwardExternal(_externalToken);\\n  }\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    canAddLiquidity(amount)\\n  {\\n    address operator = _msgSender();\\n\\n    _mint(to, amount, controlledToken, referrer);\\n\\n    _token().safeTransferFrom(operator, address(this), amount);\\n    _supply(amount);\\n\\n    emit Deposited(operator, to, controlledToken, amount, referrer);\\n  }\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    returns (uint256)\\n  {\\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n    require(exitFee <= maximumExitFee, \\\"PrizePool/exit-fee-exceeds-user-maximum\\\");\\n\\n    // burn the credit\\n    _burnCredit(from, controlledToken, burnedCredit);\\n\\n    // burn the tickets\\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\\n\\n    // redeem the tickets less the fee\\n    uint256 amountLessFee = amount.sub(exitFee);\\n    uint256 redeemed = _redeem(amountLessFee);\\n\\n    _token().safeTransfer(from, redeemed);\\n\\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\\n\\n    return exitFee;\\n  }\\n\\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\\n  /// @param exitFee The exit fee to check against the limit\\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\\n    if (exitFee > maxFee) {\\n      exitFee = maxFee;\\n    }\\n    return exitFee;\\n  }\\n\\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\\n  /// @param from The address the tokens are being transferred from (0 if minting)\\n  /// @param to The address the tokens are being transferred to (0 if burning)\\n  /// @param amount The amount of tokens being trasferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\\n    if (from != address(0)) {\\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\\n      // first accrue credit for their old balance\\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\\n\\n      if (from != to) {\\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\\n      }\\n\\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\\n    }\\n    if (to != address(0) && to != from) {\\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\\n    }\\n    // if we aren't minting\\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\\n    }\\n  }\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external override view returns (uint256) {\\n    return _currentAwardBalance;\\n  }\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n\\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\\n    uint256 currentBalance = _balance();\\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\\n\\n    if (unaccountedPrizeBalance > 0) {\\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\\n      if (reserveFee > 0) {\\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\\n        emit ReserveFeeCaptured(reserveFee);\\n      }\\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\\n\\n      emit AwardCaptured(unaccountedPrizeBalance);\\n    }\\n\\n    return _currentAwardBalance;\\n  }\\n\\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\\n\\n    uint256 amount = reserveTotalSupply;\\n    reserveTotalSupply = 0;\\n    uint256 redeemed = _redeem(amount);\\n\\n    _token().safeTransfer(address(to), redeemed);\\n\\n    emit ReserveWithdrawal(to, amount);\\n\\n    return redeemed;\\n  }\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external override\\n    onlyPrizeStrategy\\n    onlyControlledToken(controlledToken)\\n  {\\n    if (amount == 0) {\\n      return;\\n    }\\n\\n    require(amount <= _currentAwardBalance, \\\"PrizePool/award-exceeds-avail\\\");\\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\\n\\n    _mint(to, amount, controlledToken, address(0));\\n\\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\\n\\n    emit Awarded(to, controlledToken, amount);\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit TransferredExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit AwardedExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  function _transferOut(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (bool)\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (amount == 0) {\\n      return false;\\n    }\\n\\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\\n\\n    return true;\\n  }\\n\\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\\n  /// @param to The user who is receiving the tokens\\n  /// @param amount The amount of tokens they are receiving\\n  /// @param controlledToken The token that is going to be minted\\n  /// @param referrer The user who referred the minting\\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\\n    if (address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n    ControlledToken(controlledToken).controllerMint(to, amount);\\n  }\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (tokenIds.length == 0) {\\n      return;\\n    }\\n\\n    for (uint256 i = 0; i < tokenIds.length; i++) {\\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\\n\\n      }\\n      catch(bytes memory error){\\n        emit ErrorAwardingExternalERC721(error);\\n      }\\n      \\n    }\\n\\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\\n  }\\n\\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\\n  /// @param amount The prize amount\\n  /// @return The size of the reserve portion of the prize\\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    if (address(reserve) == address(0)) {\\n      return 0;\\n    }\\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\\n    if (reserveRateMantissa == 0) {\\n      return 0;\\n    }\\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\\n  }\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external override\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    )\\n  {\\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n  }\\n\\n  /// @dev Calculates the early exit fee for the given amount\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return Exit fee\\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\\n    return _limitExitFee(\\n      amount,\\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external override\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    durationSeconds =_estimateCreditAccrualTime(\\n      _controlledToken,\\n      _principal,\\n      _interest\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function _estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    internal\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    // interest = credit rate * principal * time\\n    // => time = interest / (credit rate * principal)\\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\\n    if (accruedPerSecond == 0) {\\n      return 0;\\n    }\\n    return _interest.div(accruedPerSecond);\\n  }\\n\\n  /// @notice Burns a users credit.\\n  /// @param user The user whose credit should be burned\\n  /// @param credit The amount of credit to burn\\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\\n\\n    emit CreditBurned(user, controlledToken, credit);\\n  }\\n\\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\\n  /// @param user The user for whom to accrue credit\\n  /// @param controlledToken The controlled token whose balance we are checking\\n  /// @param controlledTokenBalance The balance to use for the user\\n  /// @param extra Additional credit to be added\\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\\n    _updateCreditBalance(\\n      user,\\n      controlledToken,\\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\\n    );\\n  }\\n\\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\\n    uint256 newBalance;\\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\\n    if (!creditBalance.initialized) {\\n      newBalance = 0;\\n    } else {\\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\\n    }\\n    return newBalance;\\n  }\\n\\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\\n\\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\\n      balance: newBalance.toUint128(),\\n      timestamp: _currentTime().toUint32(),\\n      initialized: true\\n    });\\n\\n    if (oldBalance < newBalance) {\\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\\n    } \\n    else if (newBalance < oldBalance) {\\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\\n    }\\n  }\\n\\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\\n  /// @param creditBalance The new credit balance to be checked\\n  /// @return The users new credit balance.  Will not exceed the credit limit.\\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\\n      controlledTokenBalance,\\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\\n    );\\n    if (creditBalance > creditLimit) {\\n      creditBalance = creditLimit;\\n    }\\n\\n    return creditBalance;\\n  }\\n\\n  /// @notice Calculates the accrued interest for a user\\n  /// @param user The user whose credit should be calculated.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\\n  /// @return The credit that has accrued since the last credit update.\\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\\n\\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\\n      return 0;\\n    }\\n\\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\\n  }\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\\n    return _tokenCreditBalances[controlledToken][user].balance;\\n  }\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external override\\n    onlyControlledToken(_controlledToken)\\n    onlyOwner\\n  {\\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\\n      creditLimitMantissa: _creditLimitMantissa,\\n      creditRateMantissa: _creditRateMantissa\\n    });\\n\\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\\n  }\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external override\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    )\\n  {\\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\\n  }\\n\\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The token they are withdrawing\\n  /// @param amount The amount of funds they are withdrawing\\n  /// @return earlyExitFee The additional exit fee that should be charged.\\n  /// @return creditBurned The amount of credit that will be burned\\n  function _calculateEarlyExitFeeLessBurnedCredit(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (\\n      uint256 earlyExitFee,\\n      uint256 creditBurned\\n    )\\n  {\\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\\n    require(controlledTokenBalance >= amount, \\\"PrizePool/insuff-funds\\\");\\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\\n    /*\\n    The credit is used *last*.  Always charge the fees up-front.\\n\\n    How to calculate:\\n\\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\\n\\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\\n    */\\n\\n    // Determine available usable credit based on withdraw amount\\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\\n\\n    uint256 availableCredit;\\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\\n    }\\n\\n    // Determine amount of credit to burn and amount of fees required\\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\\n    earlyExitFee = totalExitFee.sub(creditBurned);\\n  }\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\\n    _setLiquidityCap(_liquidityCap);\\n  }\\n\\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\\n    liquidityCap = _liquidityCap;\\n    emit LiquidityCapSet(_liquidityCap);\\n  }\\n\\n  /// @notice Adds a new controlled token\\n  /// @param _controlledToken The controlled token to add.\\n  /// @param index The index to add the controlledToken\\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\\n    require(_controlledToken.controller() == this, \\\"PrizePool/token-ctrlr-mismatch\\\");\\n    \\n    _tokens[index] = _controlledToken;\\n    emit ControlledTokenAdded(_controlledToken);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\\n    _setPrizeStrategy(_prizeStrategy);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\\n    require(address(_prizeStrategy) != address(0), \\\"PrizePool/prizeStrategy-not-zero\\\");\\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PrizePool/prizeStrategy-invalid\\\");\\n    prizeStrategy = _prizeStrategy;\\n\\n    emit PrizeStrategySet(address(_prizeStrategy));\\n  }\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\\n    return _tokens;\\n  }\\n\\n  /// @dev Gets the current time as represented by the current block\\n  /// @return The timestamp of the current block\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external override view returns (uint256) {\\n    return _tokenTotalSupply();\\n  }\\n\\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\\n  /// @param to The address to delegate to \\n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\\n    if (compLike.balanceOf(address(this)) > 0) {\\n      compLike.delegate(to);\\n    }\\n  }\\n  \\n  /// @notice Required for ERC721 safe token transfers from smart contracts.\\n  /// @param operator The address that acts on behalf of the owner\\n  /// @param from The current owner of the NFT\\n  /// @param tokenId The NFT to transfer\\n  /// @param data Additional data with no specified format, sent in call to `_to`.\\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function _tokenTotalSupply() internal view returns (uint256) {\\n    uint256 total = reserveTotalSupply;\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \\n    uint256 tokensLength = tokens.length;\\n    \\n    for(uint256 i = 0; i < tokensLength; i++){\\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\\n    }\\n\\n    return total;\\n  }\\n\\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\\n  }\\n\\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\\n    uint256 tokensLength = tokens.length;\\n\\n    for(uint256 i = 0; i < tokensLength; i++) {\\n      if(tokens[i] == controlledToken) return true;\\n    }\\n    return false;\\n  }\\n  \\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\\n    return _isControlled(controlledToken);\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function _token() internal virtual view returns (IERC20Upgradeable);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal virtual returns (uint256);\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal virtual;\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\\n\\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  modifier onlyControlledToken(address controlledToken) {\\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \\\"PrizePool/unknown-token\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure caller is the prize-strategy\\n  modifier onlyPrizeStrategy() {\\n    require(_msgSender() == address(prizeStrategy), \\\"PrizePool/only-prizeStrategy\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\\n  modifier canAddLiquidity(uint256 _amount) {\\n    require(_canAddLiquidity(_amount), \\\"PrizePool/exceeds-liquidity-cap\\\");\\n    _;\\n  }\\n\\n  modifier onlyReserve() {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    require(address(reserve) == msg.sender, \\\"PrizePool/only-reserve\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x386ebc1c80ab4424f14125e716dd12641ff933b475bf1082b7b1a6eee4a969c3\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListener.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./BeforeAwardListenerInterface.sol\\\";\\nimport \\\"../Constants.sol\\\";\\nimport \\\"./BeforeAwardListenerLibrary.sol\\\";\\n\\nabstract contract BeforeAwardListener is BeforeAwardListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == BeforeAwardListenerLibrary.ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER\\n    );\\n  }\\n}\",\"keccak256\":\"0x5da2a7332421d6136d793ef55410c2da63a7fb719e8522697f78ac4c50391505\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @notice The interface for the Periodic Prize Strategy before award listener.  This listener will be called immediately before the award is distributed.\\ninterface BeforeAwardListenerInterface is IERC165Upgradeable {\\n  /// @notice Called immediately before the award is distributed\\n  function beforePrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x96145efe8fc65aff97d11ffaf0905d53baf4b87c4a575a84d691804468f12083\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/BeforeAwardListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary BeforeAwardListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforePrizePoolAwarded(uint256,uint256)')) == 0x4cdf9c3e\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER = 0x4cdf9c3e;\\n}\",\"keccak256\":\"0xeac08a7b8e2e7d508a0af89c05c31c36e2b060674d05dfa9a5016cf2d12cf500\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategy.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\\\";\\nimport \\\"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../token/TokenListener.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TicketInterface.sol\\\";\\nimport \\\"../prize-pool/PrizePool.sol\\\";\\nimport \\\"../Constants.sol\\\";\\nimport \\\"./PeriodicPrizeStrategyListenerInterface.sol\\\";\\nimport \\\"./PeriodicPrizeStrategyListenerLibrary.sol\\\";\\nimport \\\"./BeforeAwardListener.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\nabstract contract PeriodicPrizeStrategy is Initializable,\\n                                           OwnableUpgradeable,\\n                                           TokenListener {\\n\\n  using SafeMathUpgradeable for uint256;\\n  using SafeMathUpgradeable for uint16;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using AddressUpgradeable for address;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  uint256 internal constant ETHEREUM_BLOCK_TIME_ESTIMATE_MANTISSA = 13.4 ether;\\n\\n  event PrizePoolOpened(\\n    address indexed operator,\\n    uint256 indexed prizePeriodStartedAt\\n  );\\n\\n  event RngRequestFailed();\\n\\n  event PrizePoolAwardStarted(\\n    address indexed operator,\\n    address indexed prizePool,\\n    uint32 indexed rngRequestId,\\n    uint32 rngLockBlock\\n  );\\n\\n  event PrizePoolAwardCancelled(\\n    address indexed operator,\\n    address indexed prizePool,\\n    uint32 indexed rngRequestId,\\n    uint32 rngLockBlock\\n  );\\n\\n  event PrizePoolAwarded(\\n    address indexed operator,\\n    uint256 randomNumber\\n  );\\n\\n  event RngServiceUpdated(\\n    RNGInterface indexed rngService\\n  );\\n\\n  event TokenListenerUpdated(\\n    TokenListenerInterface indexed tokenListener\\n  );\\n\\n  event RngRequestTimeoutSet(\\n    uint32 rngRequestTimeout\\n  );\\n\\n  event PrizePeriodSecondsUpdated(\\n    uint256 prizePeriodSeconds\\n  );\\n\\n  event BeforeAwardListenerSet(\\n    BeforeAwardListenerInterface indexed beforeAwardListener\\n  );\\n\\n  event PeriodicPrizeStrategyListenerSet(\\n    PeriodicPrizeStrategyListenerInterface indexed periodicPrizeStrategyListener\\n  );\\n\\n  event ExternalErc721AwardAdded(\\n    IERC721Upgradeable indexed externalErc721,\\n    uint256[] tokenIds\\n  );\\n\\n  event ExternalErc20AwardAdded(\\n    IERC20Upgradeable indexed externalErc20\\n  );\\n\\n  event ExternalErc721AwardRemoved(\\n    IERC721Upgradeable indexed externalErc721Award\\n  );\\n\\n  event ExternalErc20AwardRemoved(\\n    IERC20Upgradeable indexed externalErc20Award\\n  );\\n\\n  event Initialized(\\n    uint256 prizePeriodStart,\\n    uint256 prizePeriodSeconds,\\n    PrizePool indexed prizePool,\\n    TicketInterface ticket,\\n    IERC20Upgradeable sponsorship,\\n    RNGInterface rng,\\n    IERC20Upgradeable[] externalErc20Awards\\n  );\\n\\n  struct RngRequest {\\n    uint32 id;\\n    uint32 lockBlock;\\n    uint32 requestedAt;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  // Comptroller\\n  TokenListenerInterface public tokenListener;\\n\\n  // Contract Interfaces\\n  PrizePool public prizePool;\\n  TicketInterface public ticket;\\n  IERC20Upgradeable public sponsorship;\\n  RNGInterface public rng;\\n\\n  // Current RNG Request\\n  RngRequest internal rngRequest;\\n\\n  /// @notice RNG Request Timeout.  In fact, this is really a \\\"complete award\\\" timeout.\\n  /// If the rng completes the award can still be cancelled.\\n  uint32 public rngRequestTimeout;\\n\\n  // Prize period\\n  uint256 public prizePeriodSeconds;\\n  uint256 public prizePeriodStartedAt;\\n\\n  // External tokens awarded as part of prize\\n  MappedSinglyLinkedList.Mapping internal externalErc20s;\\n  MappedSinglyLinkedList.Mapping internal externalErc721s;\\n\\n  // External NFT token IDs to be awarded\\n  //   NFT Address => TokenIds\\n  mapping (IERC721Upgradeable => uint256[]) internal externalErc721TokenIds;\\n\\n  /// @notice A listener that is called before the prize is awarded\\n  BeforeAwardListenerInterface public beforeAwardListener;\\n\\n  /// @notice A listener that is called after the prize is awarded\\n  PeriodicPrizeStrategyListenerInterface public periodicPrizeStrategyListener;\\n\\n  /// @notice Initializes a new strategy\\n  /// @param _prizePeriodStart The starting timestamp of the prize period.\\n  /// @param _prizePeriodSeconds The duration of the prize period in seconds\\n  /// @param _prizePool The prize pool to award\\n  /// @param _ticket The ticket to use to draw winners\\n  /// @param _sponsorship The sponsorship token\\n  /// @param _rng The RNG service to use\\n  function initialize (\\n    uint256 _prizePeriodStart,\\n    uint256 _prizePeriodSeconds,\\n    PrizePool _prizePool,\\n    TicketInterface _ticket,\\n    IERC20Upgradeable _sponsorship,\\n    RNGInterface _rng,\\n    IERC20Upgradeable[] memory externalErc20Awards\\n  ) public initializer {\\n    require(address(_prizePool) != address(0), \\\"PeriodicPrizeStrategy/prize-pool-not-zero\\\");\\n    require(address(_ticket) != address(0), \\\"PeriodicPrizeStrategy/ticket-not-zero\\\");\\n    require(address(_sponsorship) != address(0), \\\"PeriodicPrizeStrategy/sponsorship-not-zero\\\");\\n    require(address(_rng) != address(0), \\\"PeriodicPrizeStrategy/rng-not-zero\\\");\\n    prizePool = _prizePool;\\n    ticket = _ticket;\\n    rng = _rng;\\n    sponsorship = _sponsorship;\\n    _setPrizePeriodSeconds(_prizePeriodSeconds);\\n\\n    __Ownable_init();\\n\\n    externalErc20s.initialize();\\n    for (uint256 i = 0; i < externalErc20Awards.length; i++) {\\n      _addExternalErc20Award(externalErc20Awards[i]);\\n    }\\n\\n    prizePeriodSeconds = _prizePeriodSeconds;\\n    prizePeriodStartedAt = _prizePeriodStart;\\n\\n    externalErc721s.initialize();\\n\\n    // 30 min timeout\\n    _setRngRequestTimeout(1800);\\n\\n    emit Initialized(\\n      _prizePeriodStart,\\n      _prizePeriodSeconds,\\n      _prizePool,\\n      _ticket,\\n      _sponsorship,\\n      _rng,\\n      externalErc20Awards\\n    );\\n    emit PrizePoolOpened(_msgSender(), prizePeriodStartedAt);\\n  }\\n\\n  function _distribute(uint256 randomNumber) internal virtual;\\n\\n  /// @notice Calculates and returns the currently accrued prize\\n  /// @return The current prize size\\n  function currentPrize() public view returns (uint256) {\\n    return prizePool.awardBalance();\\n  }\\n\\n  /// @notice Allows the owner to set the token listener\\n  /// @param _tokenListener A contract that implements the token listener interface.\\n  function setTokenListener(TokenListenerInterface _tokenListener) external onlyOwner requireAwardNotInProgress {\\n    require(address(0) == address(_tokenListener) || address(_tokenListener).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PeriodicPrizeStrategy/token-listener-invalid\\\");\\n\\n    tokenListener = _tokenListener;\\n\\n    emit TokenListenerUpdated(tokenListener);\\n  }\\n\\n  /// @notice Estimates the remaining blocks until the prize given a number of seconds per block\\n  /// @param secondsPerBlockMantissa The number of seconds per block to use for the calculation.  Should be a fixed point 18 number like Ether.\\n  /// @return The estimated number of blocks remaining until the prize can be awarded.\\n  function estimateRemainingBlocksToPrize(uint256 secondsPerBlockMantissa) public view returns (uint256) {\\n    return FixedPoint.divideUintByMantissa(\\n      _prizePeriodRemainingSeconds(),\\n      secondsPerBlockMantissa\\n    );\\n  }\\n\\n  /// @notice Returns the number of seconds remaining until the prize can be awarded.\\n  /// @return The number of seconds remaining until the prize can be awarded.\\n  function prizePeriodRemainingSeconds() external view returns (uint256) {\\n    return _prizePeriodRemainingSeconds();\\n  }\\n\\n  /// @notice Returns the number of seconds remaining until the prize can be awarded.\\n  /// @return The number of seconds remaining until the prize can be awarded.\\n  function _prizePeriodRemainingSeconds() internal view returns (uint256) {\\n    uint256 endAt = _prizePeriodEndAt();\\n    uint256 time = _currentTime();\\n    if (time > endAt) {\\n      return 0;\\n    }\\n    return endAt.sub(time);\\n  }\\n\\n  /// @notice Returns whether the prize period is over\\n  /// @return True if the prize period is over, false otherwise\\n  function isPrizePeriodOver() external view returns (bool) {\\n    return _isPrizePeriodOver();\\n  }\\n\\n  /// @notice Returns whether the prize period is over\\n  /// @return True if the prize period is over, false otherwise\\n  function _isPrizePeriodOver() internal view returns (bool) {\\n    return _currentTime() >= _prizePeriodEndAt();\\n  }\\n\\n  /// @notice Awards collateral as tickets to a user\\n  /// @param user Recipient of minted tokens\\n  /// @param amount Amount of minted tokens\\n  function _awardTickets(address user, uint256 amount) internal {\\n    prizePool.award(user, amount, address(ticket));\\n  }\\n  \\n  /// @notice Mints ticket or sponsorship tokens for user.\\n  /// @dev Mints ticket or sponsorship tokens by looking up the address in the prizePool.tokens mapping. \\n  /// @param user Recipient of minted tokens\\n  /// @param amount Amount of minted tokens\\n  /// @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\\n  function _awardToken(address user, uint256 amount, uint8 tokenIndex) internal {\\n    ControlledTokenInterface[] memory _controlledTokens = prizePool.tokens();\\n    require(tokenIndex <= _controlledTokens.length, \\\"PeriodicPrizeStrategy/award-invalid-token-index\\\");\\n    ControlledTokenInterface _token = _controlledTokens[tokenIndex];\\n    prizePool.award(user, amount, address(_token));\\n  }\\n\\n  /// @notice Awards all external tokens with non-zero balances to the given user.  The external tokens must be held by the PrizePool contract.\\n  /// @param winner The user to transfer the tokens to\\n  function _awardAllExternalTokens(address winner) internal {\\n    _awardExternalErc20s(winner);\\n    _awardExternalErc721s(winner);\\n  }\\n\\n  /// @notice Awards all external ERC20 tokens with non-zero balances to the given user.\\n  /// The external tokens must be held by the PrizePool contract.\\n  /// @param winner The user to transfer the tokens to\\n  function _awardExternalErc20s(address winner) internal {\\n    address currentToken = externalErc20s.start();\\n    while (currentToken != address(0) && currentToken != externalErc20s.end()) {\\n      uint256 balance = IERC20Upgradeable(currentToken).balanceOf(address(prizePool));\\n      if (balance > 0) {\\n        prizePool.awardExternalERC20(winner, currentToken, balance);\\n      }\\n      currentToken = externalErc20s.next(currentToken);\\n    }\\n  }\\n\\n  /// @notice Awards all external ERC721 tokens to the given user.\\n  /// The external tokens must be held by the PrizePool contract.\\n  /// @dev The list of ERC721s is reset after every award\\n  /// @param winner The user to transfer the tokens to\\n  function _awardExternalErc721s(address winner) internal {\\n    address currentToken = externalErc721s.start();\\n    while (currentToken != address(0) && currentToken != externalErc721s.end()) {\\n      uint256 balance = IERC721Upgradeable(currentToken).balanceOf(address(prizePool));\\n      if (balance > 0) {\\n        prizePool.awardExternalERC721(winner, currentToken, externalErc721TokenIds[IERC721Upgradeable(currentToken)]);\\n        _removeExternalErc721AwardTokens(IERC721Upgradeable(currentToken));\\n      }\\n      currentToken = externalErc721s.next(currentToken);\\n    }\\n    externalErc721s.clearAll();\\n  }\\n\\n  /// @notice Returns the timestamp at which the prize period ends\\n  /// @return The timestamp at which the prize period ends.\\n  function prizePeriodEndAt() external view returns (uint256) {\\n    // current prize started at is non-inclusive, so add one\\n    return _prizePeriodEndAt();\\n  }\\n\\n  /// @notice Returns the timestamp at which the prize period ends\\n  /// @return The timestamp at which the prize period ends.\\n  function _prizePeriodEndAt() internal view returns (uint256) {\\n    // current prize started at is non-inclusive, so add one\\n    return prizePeriodStartedAt.add(prizePeriodSeconds);\\n  }\\n\\n  /// @notice Called by the PrizePool for transfers of controlled tokens\\n  /// @dev Note that this is only for *transfers*, not mints or burns\\n  /// @param controlledToken The type of collateral that is being sent\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external override onlyPrizePool {\\n    require(from != to, \\\"PeriodicPrizeStrategy/transfer-to-self\\\");\\n\\n    if (controlledToken == address(ticket)) {\\n      _requireAwardNotInProgress();\\n    }\\n\\n    if (address(tokenListener) != address(0)) {\\n      tokenListener.beforeTokenTransfer(from, to, amount, controlledToken);\\n    }\\n  }\\n\\n  /// @notice Called by the PrizePool when minting controlled tokens\\n  /// @param controlledToken The type of collateral that is being minted\\n  function beforeTokenMint(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external\\n    override\\n    onlyPrizePool\\n  {\\n    if (controlledToken == address(ticket)) {\\n      _requireAwardNotInProgress();\\n    }\\n    if (address(tokenListener) != address(0)) {\\n      tokenListener.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n  }\\n\\n  /// @notice returns the current time.  Used for testing.\\n  /// @return The current time (block.timestamp)\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice returns the current time.  Used for testing.\\n  /// @return The current time (block.timestamp)\\n  function _currentBlock() internal virtual view returns (uint256) {\\n    return block.number;\\n  }\\n\\n  /// @notice Starts the award process by starting random number request.  The prize period must have ended.\\n  /// @dev The RNG-Request-Fee is expected to be held within this contract before calling this function\\n  function startAward() external requireCanStartAward {\\n    (address feeToken, uint256 requestFee) = rng.getRequestFee();\\n    if (feeToken != address(0) && requestFee > 0) {\\n      IERC20Upgradeable(feeToken).safeApprove(address(rng), requestFee);\\n    }\\n\\n    (uint32 requestId, uint32 lockBlock) = rng.requestRandomNumber();\\n    rngRequest.id = requestId;\\n    rngRequest.lockBlock = lockBlock;\\n    rngRequest.requestedAt = _currentTime().toUint32();\\n\\n    emit PrizePoolAwardStarted(_msgSender(), address(prizePool), requestId, lockBlock);\\n  }\\n\\n  /// @notice Can be called by anyone to unlock the tickets if the RNG has timed out.\\n  function cancelAward() public {\\n    require(isRngTimedOut(), \\\"PeriodicPrizeStrategy/rng-not-timedout\\\");\\n    uint32 requestId = rngRequest.id;\\n    uint32 lockBlock = rngRequest.lockBlock;\\n    delete rngRequest;\\n    emit RngRequestFailed();\\n    emit PrizePoolAwardCancelled(msg.sender, address(prizePool), requestId, lockBlock);\\n  }\\n\\n  /// @notice Completes the award process and awards the winners.  The random number must have been requested and is now available.\\n  function completeAward() external requireCanCompleteAward {\\n    uint256 randomNumber = rng.randomNumber(rngRequest.id);\\n    delete rngRequest;\\n\\n    if (address(beforeAwardListener) != address(0)) {\\n      beforeAwardListener.beforePrizePoolAwarded(randomNumber, prizePeriodStartedAt);\\n    }\\n    _distribute(randomNumber);\\n    if (address(periodicPrizeStrategyListener) != address(0)) {\\n      periodicPrizeStrategyListener.afterPrizePoolAwarded(randomNumber, prizePeriodStartedAt);\\n    }\\n\\n    // to avoid clock drift, we should calculate the start time based on the previous period start time.\\n    prizePeriodStartedAt = _calculateNextPrizePeriodStartTime(_currentTime());\\n\\n    emit PrizePoolAwarded(_msgSender(), randomNumber);\\n    emit PrizePoolOpened(_msgSender(), prizePeriodStartedAt);\\n  }\\n\\n  /// @notice Allows the owner to set a listener that is triggered immediately before the award is distributed\\n  /// @dev The listener must implement ERC165 and the BeforeAwardListenerInterface\\n  /// @param _beforeAwardListener The address of the listener contract\\n  function setBeforeAwardListener(BeforeAwardListenerInterface _beforeAwardListener) external onlyOwner requireAwardNotInProgress {\\n    require(\\n      address(0) == address(_beforeAwardListener) || address(_beforeAwardListener).supportsInterface(BeforeAwardListenerLibrary.ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER),\\n      \\\"PeriodicPrizeStrategy/beforeAwardListener-invalid\\\"\\n    );\\n\\n    beforeAwardListener = _beforeAwardListener;\\n\\n    emit BeforeAwardListenerSet(_beforeAwardListener);\\n  }\\n\\n  /// @notice Allows the owner to set a listener for prize strategy callbacks.\\n  /// @param _periodicPrizeStrategyListener The address of the listener contract\\n  function setPeriodicPrizeStrategyListener(PeriodicPrizeStrategyListenerInterface _periodicPrizeStrategyListener) external onlyOwner requireAwardNotInProgress {\\n    require(\\n      address(0) == address(_periodicPrizeStrategyListener) || address(_periodicPrizeStrategyListener).supportsInterface(PeriodicPrizeStrategyListenerLibrary.ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER),\\n      \\\"PeriodicPrizeStrategy/prizeStrategyListener-invalid\\\"\\n    );\\n\\n    periodicPrizeStrategyListener = _periodicPrizeStrategyListener;\\n\\n    emit PeriodicPrizeStrategyListenerSet(_periodicPrizeStrategyListener);\\n  }\\n\\n  function _calculateNextPrizePeriodStartTime(uint256 currentTime) internal view returns (uint256) {\\n    uint256 elapsedPeriods = currentTime.sub(prizePeriodStartedAt).div(prizePeriodSeconds);\\n    return prizePeriodStartedAt.add(elapsedPeriods.mul(prizePeriodSeconds));\\n  }\\n\\n  /// @notice Calculates when the next prize period will start\\n  /// @param currentTime The timestamp to use as the current time\\n  /// @return The timestamp at which the next prize period would start\\n  function calculateNextPrizePeriodStartTime(uint256 currentTime) external view returns (uint256) {\\n    return _calculateNextPrizePeriodStartTime(currentTime);\\n  }\\n\\n  /// @notice Returns whether an award process can be started\\n  /// @return True if an award can be started, false otherwise.\\n  function canStartAward() external view returns (bool) {\\n    return _isPrizePeriodOver() && !isRngRequested();\\n  }\\n\\n  /// @notice Returns whether an award process can be completed\\n  /// @return True if an award can be completed, false otherwise.\\n  function canCompleteAward() external view returns (bool) {\\n    return isRngRequested() && isRngCompleted();\\n  }\\n\\n  /// @notice Returns whether a random number has been requested\\n  /// @return True if a random number has been requested, false otherwise.\\n  function isRngRequested() public view returns (bool) {\\n    return rngRequest.id != 0;\\n  }\\n\\n  /// @notice Returns whether the random number request has completed.\\n  /// @return True if a random number request has completed, false otherwise.\\n  function isRngCompleted() public view returns (bool) {\\n    return rng.isRequestComplete(rngRequest.id);\\n  }\\n\\n  /// @notice Returns the block number that the current RNG request has been locked to\\n  /// @return The block number that the RNG request is locked to\\n  function getLastRngLockBlock() external view returns (uint32) {\\n    return rngRequest.lockBlock;\\n  }\\n\\n  /// @notice Returns the current RNG Request ID\\n  /// @return The current Request ID\\n  function getLastRngRequestId() external view returns (uint32) {\\n    return rngRequest.id;\\n  }\\n\\n  /// @notice Sets the RNG service that the Prize Strategy is connected to\\n  /// @param rngService The address of the new RNG service interface\\n  function setRngService(RNGInterface rngService) external onlyOwner requireAwardNotInProgress {\\n    require(!isRngRequested(), \\\"PeriodicPrizeStrategy/rng-in-flight\\\");\\n\\n    rng = rngService;\\n    emit RngServiceUpdated(rngService);\\n  }\\n\\n  /// @notice Allows the owner to set the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\\n  /// @param _rngRequestTimeout The RNG request timeout in seconds.\\n  function setRngRequestTimeout(uint32 _rngRequestTimeout) external onlyOwner requireAwardNotInProgress {\\n    _setRngRequestTimeout(_rngRequestTimeout);\\n  }\\n\\n  /// @notice Sets the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\\n  /// @param _rngRequestTimeout The RNG request timeout in seconds.\\n  function _setRngRequestTimeout(uint32 _rngRequestTimeout) internal {\\n    require(_rngRequestTimeout > 60, \\\"PeriodicPrizeStrategy/rng-timeout-gt-60-secs\\\");\\n    rngRequestTimeout = _rngRequestTimeout;\\n    emit RngRequestTimeoutSet(rngRequestTimeout);\\n  }\\n\\n  /// @notice Allows the owner to set the prize period in seconds.\\n  /// @param _prizePeriodSeconds The new prize period in seconds.  Must be greater than zero.\\n  function setPrizePeriodSeconds(uint256 _prizePeriodSeconds) external onlyOwner requireAwardNotInProgress {\\n    _setPrizePeriodSeconds(_prizePeriodSeconds);\\n  }\\n\\n  /// @notice Sets the prize period in seconds.\\n  /// @param _prizePeriodSeconds The new prize period in seconds.  Must be greater than zero.\\n  function _setPrizePeriodSeconds(uint256 _prizePeriodSeconds) internal {\\n    require(_prizePeriodSeconds > 0, \\\"PeriodicPrizeStrategy/prize-period-greater-than-zero\\\");\\n    prizePeriodSeconds = _prizePeriodSeconds;\\n\\n    emit PrizePeriodSecondsUpdated(prizePeriodSeconds);\\n  }\\n\\n  /// @notice Gets the current list of External ERC20 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC20 token addresses\\n  function getExternalErc20Awards() external view returns (address[] memory) {\\n    return externalErc20s.addressArray();\\n  }\\n\\n  /// @notice Adds an external ERC20 token type as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can assign external tokens,\\n  /// and they must be approved by the Prize-Pool\\n  /// @param _externalErc20 The address of an ERC20 token to be awarded\\n  function addExternalErc20Award(IERC20Upgradeable _externalErc20) external onlyOwnerOrListener requireAwardNotInProgress {\\n    _addExternalErc20Award(_externalErc20);\\n  }\\n\\n  function _addExternalErc20Award(IERC20Upgradeable _externalErc20) internal {\\n    require(address(_externalErc20).isContract(), \\\"PeriodicPrizeStrategy/erc20-null\\\");\\n    require(prizePool.canAwardExternal(address(_externalErc20)), \\\"PeriodicPrizeStrategy/cannot-award-external\\\");\\n    (bool succeeded, bytes memory returnValue) = address(_externalErc20).staticcall(abi.encodeWithSignature(\\\"totalSupply()\\\"));\\n    require(succeeded, \\\"PeriodicPrizeStrategy/erc20-invalid\\\");\\n    externalErc20s.addAddress(address(_externalErc20));\\n    emit ExternalErc20AwardAdded(_externalErc20);\\n  }\\n\\n  function addExternalErc20Awards(IERC20Upgradeable[] calldata _externalErc20s) external onlyOwnerOrListener requireAwardNotInProgress {\\n    for (uint256 i = 0; i < _externalErc20s.length; i++) {\\n      _addExternalErc20Award(_externalErc20s[i]);\\n    }\\n  }\\n\\n  /// @notice Removes an external ERC20 token type as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can remove external tokens\\n  /// @param _externalErc20 The address of an ERC20 token to be removed\\n  /// @param _prevExternalErc20 The address of the previous ERC20 token in the `externalErc20s` list.\\n  /// If the ERC20 is the first address, then the previous address is the SENTINEL address: 0x0000000000000000000000000000000000000001\\n  function removeExternalErc20Award(IERC20Upgradeable _externalErc20, IERC20Upgradeable _prevExternalErc20) external onlyOwner requireAwardNotInProgress {\\n    externalErc20s.removeAddress(address(_prevExternalErc20), address(_externalErc20));\\n    emit ExternalErc20AwardRemoved(_externalErc20);\\n  }\\n\\n  /// @notice Gets the current list of External ERC721 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC721 token addresses\\n  function getExternalErc721Awards() external view returns (address[] memory) {\\n    return externalErc721s.addressArray();\\n  }\\n\\n  /// @notice Gets the current list of External ERC721 tokens that will be awarded with the current prize\\n  /// @return An array of External ERC721 token addresses\\n  function getExternalErc721AwardTokenIds(IERC721Upgradeable _externalErc721) external view returns (uint256[] memory) {\\n    return externalErc721TokenIds[_externalErc721];\\n  }\\n\\n  /// @notice Adds an external ERC721 token as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can assign external tokens,\\n  /// and they must be approved by the Prize-Pool\\n  /// NOTE: The NFT must already be owned by the Prize-Pool\\n  /// @param _externalErc721 The address of an ERC721 token to be awarded\\n  /// @param _tokenIds An array of token IDs of the ERC721 to be awarded\\n  function addExternalErc721Award(IERC721Upgradeable _externalErc721, uint256[] calldata _tokenIds) external onlyOwnerOrListener requireAwardNotInProgress {\\n    require(prizePool.canAwardExternal(address(_externalErc721)), \\\"PeriodicPrizeStrategy/cannot-award-external\\\");\\n    require(address(_externalErc721).supportsInterface(Constants.ERC165_INTERFACE_ID_ERC721), \\\"PeriodicPrizeStrategy/erc721-invalid\\\");\\n    \\n    if (!externalErc721s.contains(address(_externalErc721))) {\\n      externalErc721s.addAddress(address(_externalErc721));\\n    }\\n\\n    for (uint256 i = 0; i < _tokenIds.length; i++) {\\n      _addExternalErc721Award(_externalErc721, _tokenIds[i]);\\n    }\\n\\n    emit ExternalErc721AwardAdded(_externalErc721, _tokenIds);\\n  }\\n\\n  function _addExternalErc721Award(IERC721Upgradeable _externalErc721, uint256 _tokenId) internal {\\n    require(IERC721Upgradeable(_externalErc721).ownerOf(_tokenId) == address(prizePool), \\\"PeriodicPrizeStrategy/unavailable-token\\\");\\n    for (uint256 i = 0; i < externalErc721TokenIds[_externalErc721].length; i++) {\\n      if (externalErc721TokenIds[_externalErc721][i] == _tokenId) {\\n        revert(\\\"PeriodicPrizeStrategy/erc721-duplicate\\\");\\n      }\\n    }\\n    externalErc721TokenIds[_externalErc721].push(_tokenId);\\n  }\\n\\n  /// @notice Removes an external ERC721 token as an additional prize that can be awarded\\n  /// @dev Only the Prize-Strategy owner/creator can remove external tokens\\n  /// @param _externalErc721 The address of an ERC721 token to be removed\\n  /// @param _prevExternalErc721 The address of the previous ERC721 token in the list.\\n  /// If no previous, then pass the SENTINEL address: 0x0000000000000000000000000000000000000001\\n  function removeExternalErc721Award(\\n    IERC721Upgradeable _externalErc721,\\n    IERC721Upgradeable _prevExternalErc721\\n  )\\n    external\\n    onlyOwner\\n    requireAwardNotInProgress\\n  {\\n    externalErc721s.removeAddress(address(_prevExternalErc721), address(_externalErc721));\\n    _removeExternalErc721AwardTokens(_externalErc721);\\n  }\\n\\n  function _removeExternalErc721AwardTokens(\\n    IERC721Upgradeable _externalErc721\\n  )\\n    internal\\n  {\\n    delete externalErc721TokenIds[_externalErc721];\\n    emit ExternalErc721AwardRemoved(_externalErc721);\\n  }\\n\\n  function _requireAwardNotInProgress() internal view {\\n    uint256 currentBlock = _currentBlock();\\n    require(rngRequest.lockBlock == 0 || currentBlock < rngRequest.lockBlock, \\\"PeriodicPrizeStrategy/rng-in-flight\\\");\\n  }\\n\\n  function isRngTimedOut() public view returns (bool) {\\n    if (rngRequest.requestedAt == 0) {\\n      return false;\\n    } else {\\n      return _currentTime() > uint256(rngRequestTimeout).add(rngRequest.requestedAt);\\n    }\\n  }\\n\\n  modifier onlyOwnerOrListener() {\\n    require(_msgSender() == owner() ||\\n            _msgSender() == address(periodicPrizeStrategyListener) ||\\n            _msgSender() == address(beforeAwardListener),\\n            \\\"PeriodicPrizeStrategy/only-owner-or-listener\\\");\\n    _;\\n  }\\n\\n  modifier requireAwardNotInProgress() {\\n    _requireAwardNotInProgress();\\n    _;\\n  }\\n\\n  modifier requireCanStartAward() {\\n    require(_isPrizePeriodOver(), \\\"PeriodicPrizeStrategy/prize-period-not-over\\\");\\n    require(!isRngRequested(), \\\"PeriodicPrizeStrategy/rng-already-requested\\\");\\n    _;\\n  }\\n\\n  modifier requireCanCompleteAward() {\\n    require(isRngRequested(), \\\"PeriodicPrizeStrategy/rng-not-requested\\\");\\n    require(isRngCompleted(), \\\"PeriodicPrizeStrategy/rng-not-complete\\\");\\n    _;\\n  }\\n\\n  modifier onlyPrizePool() {\\n    require(_msgSender() == address(prizePool), \\\"PeriodicPrizeStrategy/only-prize-pool\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0xd7bf198ab616ed4b3e9c29d20477887d5a1e000e137e447da20bcec73b7cf997\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ninterface PeriodicPrizeStrategyListenerInterface is IERC165Upgradeable {\\n  function afterPrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x229624266562f60200b4e40ebc95a35a8aad799c0ff95a42df243af98a44d198\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary PeriodicPrizeStrategyListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('afterPrizePoolAwarded(uint256,uint256)')) == 0x575072c6\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER = 0x575072c6;\\n}\\n\",\"keccak256\":\"0xed291b9a33e265535032557f0a5430a150701c9eb58b0138c120eb02bc13b514\",\"license\":\"GPL-3.0\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/test/PeriodicPrizeStrategyDistributorInterface.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"../prize-strategy/PeriodicPrizeStrategy.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ninterface PeriodicPrizeStrategyDistributorInterface {\\n  function distribute(uint256 randomNumber) external;\\n}\",\"keccak256\":\"0x86c3cb2540c5ac4900350cd9062f8141ec36cb158e4cbd77548e069d3703da5e\"},\"contracts/test/PeriodicPrizeStrategyHarness.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"../prize-strategy/PeriodicPrizeStrategy.sol\\\";\\nimport \\\"./PeriodicPrizeStrategyDistributorInterface.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ncontract PeriodicPrizeStrategyHarness is PeriodicPrizeStrategy {\\n\\n  PeriodicPrizeStrategyDistributorInterface distributor;\\n\\n  function setDistributor(PeriodicPrizeStrategyDistributorInterface _distributor) external {\\n    distributor = _distributor;\\n  }\\n\\n  uint256 internal time;\\n  function setCurrentTime(uint256 _time) external {\\n    time = _time;\\n  }\\n\\n  function _currentTime() internal override view returns (uint256) {\\n    return time;\\n  }\\n\\n  function setRngRequest(uint32 requestId, uint32 lockBlock) external {\\n    rngRequest.id = requestId;\\n    rngRequest.lockBlock = lockBlock;\\n  }\\n\\n  function _distribute(uint256 randomNumber) internal override {\\n    distributor.distribute(randomNumber);\\n  }\\n\\n  function forceBeforeAwardListener(BeforeAwardListenerInterface listener) external {\\n    beforeAwardListener = listener;\\n  }\\n}\",\"keccak256\":\"0xa9907df4141c801124d3c1e04941ac368562793d32c4ba530929ba36432d7b81\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TicketInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface TicketInterface {\\n  /// @notice Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\\n  /// @param randomNumber The random number to use to select a user.\\n  /// @return The winner\\n  function draw(uint256 randomNumber) external view returns (address);\\n}\",\"keccak256\":\"0x5201a9a22748781592abd2003801289224d4899292195b7de937cd5748be87dd\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListener.sol\":{\"content\":\"pragma solidity ^0.6.4;\\n\\nimport \\\"./TokenListenerInterface.sol\\\";\\nimport \\\"./TokenListenerLibrary.sol\\\";\\nimport \\\"../Constants.sol\\\";\\n\\nabstract contract TokenListener is TokenListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER\\n    );\\n  }\\n}\\n\",\"keccak256\":\"0xb0e98d10b004602e1d4f4369a70e6382002dc0c0c5713698eb6a92943aef2265\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 10,
                "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                "label": "_owner",
                "offset": 0,
                "slot": "51",
                "type": "t_address"
              },
              {
                "astId": 129,
                "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                "label": "__gap",
                "offset": 0,
                "slot": "52",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 9738,
                "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                "label": "tokenListener",
                "offset": 0,
                "slot": "101",
                "type": "t_contract(TokenListenerInterface)16265"
              },
              {
                "astId": 9740,
                "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                "label": "prizePool",
                "offset": 0,
                "slot": "102",
                "type": "t_contract(PrizePool)8751"
              },
              {
                "astId": 9742,
                "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                "label": "ticket",
                "offset": 0,
                "slot": "103",
                "type": "t_contract(TicketInterface)16152"
              },
              {
                "astId": 9744,
                "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                "label": "sponsorship",
                "offset": 0,
                "slot": "104",
                "type": "t_contract(IERC20Upgradeable)1960"
              },
              {
                "astId": 9746,
                "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                "label": "rng",
                "offset": 0,
                "slot": "105",
                "type": "t_contract(RNGInterface)5531"
              },
              {
                "astId": 9748,
                "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                "label": "rngRequest",
                "offset": 0,
                "slot": "106",
                "type": "t_struct(RngRequest)9732_storage"
              },
              {
                "astId": 9751,
                "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                "label": "rngRequestTimeout",
                "offset": 0,
                "slot": "107",
                "type": "t_uint32"
              },
              {
                "astId": 9753,
                "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                "label": "prizePeriodSeconds",
                "offset": 0,
                "slot": "108",
                "type": "t_uint256"
              },
              {
                "astId": 9755,
                "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                "label": "prizePeriodStartedAt",
                "offset": 0,
                "slot": "109",
                "type": "t_uint256"
              },
              {
                "astId": 9757,
                "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                "label": "externalErc20s",
                "offset": 0,
                "slot": "110",
                "type": "t_struct(Mapping)16337_storage"
              },
              {
                "astId": 9759,
                "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                "label": "externalErc721s",
                "offset": 0,
                "slot": "112",
                "type": "t_struct(Mapping)16337_storage"
              },
              {
                "astId": 9764,
                "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                "label": "externalErc721TokenIds",
                "offset": 0,
                "slot": "114",
                "type": "t_mapping(t_contract(IERC721Upgradeable)3338,t_array(t_uint256)dyn_storage)"
              },
              {
                "astId": 9767,
                "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                "label": "beforeAwardListener",
                "offset": 0,
                "slot": "115",
                "type": "t_contract(BeforeAwardListenerInterface)9575"
              },
              {
                "astId": 9770,
                "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                "label": "periodicPrizeStrategyListener",
                "offset": 0,
                "slot": "116",
                "type": "t_contract(PeriodicPrizeStrategyListenerInterface)11432"
              },
              {
                "astId": 14256,
                "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                "label": "distributor",
                "offset": 0,
                "slot": "117",
                "type": "t_contract(PeriodicPrizeStrategyDistributorInterface)14248"
              },
              {
                "astId": 14268,
                "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                "label": "time",
                "offset": 0,
                "slot": "118",
                "type": "t_uint256"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_array(t_uint256)dyn_storage": {
                "base": "t_uint256",
                "encoding": "dynamic_array",
                "label": "uint256[]",
                "numberOfBytes": "32"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_contract(BeforeAwardListenerInterface)9575": {
                "encoding": "inplace",
                "label": "contract BeforeAwardListenerInterface",
                "numberOfBytes": "20"
              },
              "t_contract(IERC20Upgradeable)1960": {
                "encoding": "inplace",
                "label": "contract IERC20Upgradeable",
                "numberOfBytes": "20"
              },
              "t_contract(IERC721Upgradeable)3338": {
                "encoding": "inplace",
                "label": "contract IERC721Upgradeable",
                "numberOfBytes": "20"
              },
              "t_contract(PeriodicPrizeStrategyDistributorInterface)14248": {
                "encoding": "inplace",
                "label": "contract PeriodicPrizeStrategyDistributorInterface",
                "numberOfBytes": "20"
              },
              "t_contract(PeriodicPrizeStrategyListenerInterface)11432": {
                "encoding": "inplace",
                "label": "contract PeriodicPrizeStrategyListenerInterface",
                "numberOfBytes": "20"
              },
              "t_contract(PrizePool)8751": {
                "encoding": "inplace",
                "label": "contract PrizePool",
                "numberOfBytes": "20"
              },
              "t_contract(RNGInterface)5531": {
                "encoding": "inplace",
                "label": "contract RNGInterface",
                "numberOfBytes": "20"
              },
              "t_contract(TicketInterface)16152": {
                "encoding": "inplace",
                "label": "contract TicketInterface",
                "numberOfBytes": "20"
              },
              "t_contract(TokenListenerInterface)16265": {
                "encoding": "inplace",
                "label": "contract TokenListenerInterface",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_address)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => address)",
                "numberOfBytes": "32",
                "value": "t_address"
              },
              "t_mapping(t_contract(IERC721Upgradeable)3338,t_array(t_uint256)dyn_storage)": {
                "encoding": "mapping",
                "key": "t_contract(IERC721Upgradeable)3338",
                "label": "mapping(contract IERC721Upgradeable => uint256[])",
                "numberOfBytes": "32",
                "value": "t_array(t_uint256)dyn_storage"
              },
              "t_struct(Mapping)16337_storage": {
                "encoding": "inplace",
                "label": "struct MappedSinglyLinkedList.Mapping",
                "members": [
                  {
                    "astId": 16332,
                    "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                    "label": "count",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint256"
                  },
                  {
                    "astId": 16336,
                    "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                    "label": "addressMap",
                    "offset": 0,
                    "slot": "1",
                    "type": "t_mapping(t_address,t_address)"
                  }
                ],
                "numberOfBytes": "64"
              },
              "t_struct(RngRequest)9732_storage": {
                "encoding": "inplace",
                "label": "struct PeriodicPrizeStrategy.RngRequest",
                "members": [
                  {
                    "astId": 9727,
                    "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                    "label": "id",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint32"
                  },
                  {
                    "astId": 9729,
                    "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                    "label": "lockBlock",
                    "offset": 4,
                    "slot": "0",
                    "type": "t_uint32"
                  },
                  {
                    "astId": 9731,
                    "contract": "contracts/test/PeriodicPrizeStrategyHarness.sol:PeriodicPrizeStrategyHarness",
                    "label": "requestedAt",
                    "offset": 8,
                    "slot": "0",
                    "type": "t_uint32"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint32": {
                "encoding": "inplace",
                "label": "uint32",
                "numberOfBytes": "4"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "VERSION()": {
                "notice": "Semver Version"
              },
              "addExternalErc20Award(address)": {
                "notice": "Adds an external ERC20 token type as an additional prize that can be awarded"
              },
              "addExternalErc721Award(address,uint256[])": {
                "notice": "Adds an external ERC721 token as an additional prize that can be awarded"
              },
              "beforeAwardListener()": {
                "notice": "A listener that is called before the prize is awarded"
              },
              "beforeTokenMint(address,uint256,address,address)": {
                "notice": "Called by the PrizePool when minting controlled tokens"
              },
              "beforeTokenTransfer(address,address,uint256,address)": {
                "notice": "Called by the PrizePool for transfers of controlled tokens"
              },
              "calculateNextPrizePeriodStartTime(uint256)": {
                "notice": "Calculates when the next prize period will start"
              },
              "canCompleteAward()": {
                "notice": "Returns whether an award process can be completed"
              },
              "canStartAward()": {
                "notice": "Returns whether an award process can be started"
              },
              "cancelAward()": {
                "notice": "Can be called by anyone to unlock the tickets if the RNG has timed out."
              },
              "completeAward()": {
                "notice": "Completes the award process and awards the winners.  The random number must have been requested and is now available."
              },
              "currentPrize()": {
                "notice": "Calculates and returns the currently accrued prize"
              },
              "estimateRemainingBlocksToPrize(uint256)": {
                "notice": "Estimates the remaining blocks until the prize given a number of seconds per block"
              },
              "getExternalErc20Awards()": {
                "notice": "Gets the current list of External ERC20 tokens that will be awarded with the current prize"
              },
              "getExternalErc721AwardTokenIds(address)": {
                "notice": "Gets the current list of External ERC721 tokens that will be awarded with the current prize"
              },
              "getExternalErc721Awards()": {
                "notice": "Gets the current list of External ERC721 tokens that will be awarded with the current prize"
              },
              "getLastRngLockBlock()": {
                "notice": "Returns the block number that the current RNG request has been locked to"
              },
              "getLastRngRequestId()": {
                "notice": "Returns the current RNG Request ID"
              },
              "initialize(uint256,uint256,address,address,address,address,address[])": {
                "notice": "Initializes a new strategy"
              },
              "isPrizePeriodOver()": {
                "notice": "Returns whether the prize period is over"
              },
              "isRngCompleted()": {
                "notice": "Returns whether the random number request has completed."
              },
              "isRngRequested()": {
                "notice": "Returns whether a random number has been requested"
              },
              "periodicPrizeStrategyListener()": {
                "notice": "A listener that is called after the prize is awarded"
              },
              "prizePeriodEndAt()": {
                "notice": "Returns the timestamp at which the prize period ends"
              },
              "prizePeriodRemainingSeconds()": {
                "notice": "Returns the number of seconds remaining until the prize can be awarded."
              },
              "removeExternalErc20Award(address,address)": {
                "notice": "Removes an external ERC20 token type as an additional prize that can be awarded"
              },
              "removeExternalErc721Award(address,address)": {
                "notice": "Removes an external ERC721 token as an additional prize that can be awarded"
              },
              "rngRequestTimeout()": {
                "notice": "RNG Request Timeout.  In fact, this is really a \"complete award\" timeout. If the rng completes the award can still be cancelled."
              },
              "setBeforeAwardListener(address)": {
                "notice": "Allows the owner to set a listener that is triggered immediately before the award is distributed"
              },
              "setPeriodicPrizeStrategyListener(address)": {
                "notice": "Allows the owner to set a listener for prize strategy callbacks."
              },
              "setPrizePeriodSeconds(uint256)": {
                "notice": "Allows the owner to set the prize period in seconds."
              },
              "setRngRequestTimeout(uint32)": {
                "notice": "Allows the owner to set the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked."
              },
              "setRngService(address)": {
                "notice": "Sets the RNG service that the Prize Strategy is connected to"
              },
              "setTokenListener(address)": {
                "notice": "Allows the owner to set the token listener"
              },
              "startAward()": {
                "notice": "Starts the award process by starting random number request.  The prize period must have ended."
              }
            },
            "version": 1
          }
        }
      },
      "contracts/test/PeriodicPrizeStrategyListenerStub.sol": {
        "PeriodicPrizeStrategyListenerStub": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [],
              "name": "Awarded",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "randomNumber",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "prizePeriodStartedAt",
                  "type": "uint256"
                }
              ],
              "name": "afterPrizePoolAwarded",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes4",
                  "name": "interfaceId",
                  "type": "bytes4"
                }
              ],
              "name": "supportsInterface",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "supportsInterface(bytes4)": {
                "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5061012a806100206000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c806301ffc9a7146037578063575072c614606f575b600080fd5b605b60048036036020811015604b57600080fd5b50356001600160e01b0319166091565b604080519115158252519081900360200190f35b608f60048036036040811015608357600080fd5b508035906020013560c7565b005b60006001600160e01b031982166301ffc9a760e01b148060c157506001600160e01b03198216632ba8396360e11b145b92915050565b6040517fff25434fb2c7a5b6e29600471de5f2b833288fc8658779d4766cb8f8f6fbdc3090600090a1505056fea264697066735822122042d4a5e9a52abcc039b39e759976f8d107973894ad7f00093d9c5a60ebe734c064736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x12A DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH1 0x32 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH1 0x37 JUMPI DUP1 PUSH4 0x575072C6 EQ PUSH1 0x6F JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x5B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH1 0x4B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x91 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x8F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH1 0x83 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH1 0xC7 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL EQ DUP1 PUSH1 0xC1 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0x2BA83963 PUSH1 0xE1 SHL EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFF25434FB2C7A5B6E29600471DE5F2B833288FC8658779D4766CB8F8F6FBDC30 SWAP1 PUSH1 0x0 SWAP1 LOG1 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 TIMESTAMP 0xD4 0xA5 0xE9 0xA5 0x2A 0xBC 0xC0 CODECOPY 0xB3 SWAP15 PUSH22 0x9976F8D107973894AD7F00093D9C5A60EBE734C06473 PUSH16 0x6C634300060C00330000000000000000 ",
              "sourceMap": "135:229:76:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "6080604052348015600f57600080fd5b506004361060325760003560e01c806301ffc9a7146037578063575072c614606f575b600080fd5b605b60048036036020811015604b57600080fd5b50356001600160e01b0319166091565b604080519115158252519081900360200190f35b608f60048036036040811015608357600080fd5b508035906020013560c7565b005b60006001600160e01b031982166301ffc9a760e01b148060c157506001600160e01b03198216632ba8396360e11b145b92915050565b6040517fff25434fb2c7a5b6e29600471de5f2b833288fc8658779d4766cb8f8f6fbdc3090600090a1505056fea264697066735822122042d4a5e9a52abcc039b39e759976f8d107973894ad7f00093d9c5a60ebe734c064736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH1 0x32 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH1 0x37 JUMPI DUP1 PUSH4 0x575072C6 EQ PUSH1 0x6F JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x5B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH1 0x4B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH1 0x91 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x8F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH1 0x83 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH1 0xC7 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL EQ DUP1 PUSH1 0xC1 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0x2BA83963 PUSH1 0xE1 SHL EQ JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFF25434FB2C7A5B6E29600471DE5F2B833288FC8658779D4766CB8F8F6FBDC30 SWAP1 PUSH1 0x0 SWAP1 LOG1 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 TIMESTAMP 0xD4 0xA5 0xE9 0xA5 0x2A 0xBC 0xC0 CODECOPY 0xB3 SWAP15 PUSH22 0x9976F8D107973894AD7F00093D9C5A60EBE734C06473 PUSH16 0x6C634300060C00330000000000000000 ",
              "sourceMap": "135:229:76:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;292:283:51;;;;;;;;;;;;;;;;-1:-1:-1;292:283:51;-1:-1:-1;;;;;;292:283:51;;:::i;:::-;;;;;;;;;;;;;;;;;;236:126:76;;;;;;;;;;;;;;;;-1:-1:-1;236:126:76;;;;;;;:::i;:::-;;292:283:51;371:4;-1:-1:-1;;;;;;398:51:51;;-1:-1:-1;;;398:51:51;;:166;;-1:-1:-1;;;;;;;460:104:51;;-1:-1:-1;;;460:104:51;398:166;383:187;292:283;-1:-1:-1;;292:283:51:o;236:126:76:-;348:9;;;;;;;236:126;;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "59600",
                "executionCost": "111",
                "totalCost": "59711"
              },
              "external": {
                "afterPrizePoolAwarded(uint256,uint256)": "973",
                "supportsInterface(bytes4)": "343"
              }
            },
            "methodIdentifiers": {
              "afterPrizePoolAwarded(uint256,uint256)": "575072c6",
              "supportsInterface(bytes4)": "01ffc9a7"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[],\"name\":\"Awarded\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"randomNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"prizePeriodStartedAt\",\"type\":\"uint256\"}],\"name\":\"afterPrizePoolAwarded\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/PeriodicPrizeStrategyListenerStub.sol\":\"PeriodicPrizeStrategyListenerStub\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"contracts/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary Constants {\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC721 = 0x80ac58cd;\\n}\",\"keccak256\":\"0x5dc8f8bda4e9668a9ffae6a941774f849adcb368cc2275fd8a91e6ada8fad7fb\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListener.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./PeriodicPrizeStrategyListenerInterface.sol\\\";\\nimport \\\"./PeriodicPrizeStrategyListenerLibrary.sol\\\";\\nimport \\\"../Constants.sol\\\";\\n\\nabstract contract PeriodicPrizeStrategyListener is PeriodicPrizeStrategyListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == PeriodicPrizeStrategyListenerLibrary.ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER\\n    );\\n  }\\n}\",\"keccak256\":\"0x27259202d2bfa4521832a9469447b58919df102b90b2b253b38cc48a0c37e521\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ninterface PeriodicPrizeStrategyListenerInterface is IERC165Upgradeable {\\n  function afterPrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external;\\n}\\n\",\"keccak256\":\"0x229624266562f60200b4e40ebc95a35a8aad799c0ff95a42df243af98a44d198\",\"license\":\"GPL-3.0\"},\"contracts/prize-strategy/PeriodicPrizeStrategyListenerLibrary.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary PeriodicPrizeStrategyListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('afterPrizePoolAwarded(uint256,uint256)')) == 0x575072c6\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER = 0x575072c6;\\n}\\n\",\"keccak256\":\"0xed291b9a33e265535032557f0a5430a150701c9eb58b0138c120eb02bc13b514\",\"license\":\"GPL-3.0\"},\"contracts/test/PeriodicPrizeStrategyListenerStub.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"../prize-strategy/PeriodicPrizeStrategyListener.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ncontract PeriodicPrizeStrategyListenerStub is PeriodicPrizeStrategyListener {\\n\\n  event Awarded();\\n\\n  function afterPrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external override {\\n    emit Awarded();\\n  }\\n}\",\"keccak256\":\"0x31ed31cd339ab5d53923f2297a1fdc8e77d6ddec24f6ceb9835527842eb64c79\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/test/PrizePoolHarness.sol": {
        "PrizePoolHarness": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "AwardCaptured",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "Awarded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "AwardedExternalERC20",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256[]",
                  "name": "tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "AwardedExternalERC721",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract ControlledTokenInterface",
                  "name": "token",
                  "type": "address"
                }
              ],
              "name": "ControlledTokenAdded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "CreditBurned",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "CreditMinted",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint128",
                  "name": "creditLimitMantissa",
                  "type": "uint128"
                },
                {
                  "indexed": false,
                  "internalType": "uint128",
                  "name": "creditRateMantissa",
                  "type": "uint128"
                }
              ],
              "name": "CreditPlanSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "referrer",
                  "type": "address"
                }
              ],
              "name": "Deposited",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "bytes",
                  "name": "error",
                  "type": "bytes"
                }
              ],
              "name": "ErrorAwardingExternalERC721",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "reserveRegistry",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "maxExitFeeMantissa",
                  "type": "uint256"
                }
              ],
              "name": "Initialized",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "redeemed",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "exitFee",
                  "type": "uint256"
                }
              ],
              "name": "InstantWithdrawal",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "liquidityCap",
                  "type": "uint256"
                }
              ],
              "name": "LiquidityCapSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "prizeStrategy",
                  "type": "address"
                }
              ],
              "name": "PrizeStrategySet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "ReserveFeeCaptured",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "ReserveWithdrawal",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "TransferredExternalERC20",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "VERSION",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "accountedBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "awardBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "awardExternalERC20",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256[]",
                  "name": "tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "awardExternalERC721",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "balance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "balanceOfCredit",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "beforeTokenTransfer",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "calculateEarlyExitFee",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "exitFee",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "burnedCredit",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "calculateReserveFee",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_externalToken",
                  "type": "address"
                }
              ],
              "name": "canAwardExternal",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "captureAwardBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract ICompLike",
                  "name": "compLike",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                }
              ],
              "name": "compLikeDelegate",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "creditPlanOf",
              "outputs": [
                {
                  "internalType": "uint128",
                  "name": "creditLimitMantissa",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "creditRateMantissa",
                  "type": "uint128"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "currentTime",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "referrer",
                  "type": "address"
                }
              ],
              "name": "depositTo",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_principal",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "_interest",
                  "type": "uint256"
                }
              ],
              "name": "estimateCreditAccrualTime",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "durationSeconds",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "_reserveRegistry",
                  "type": "address"
                },
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "_controlledTokens",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256",
                  "name": "_maxExitFeeMantissa",
                  "type": "uint256"
                }
              ],
              "name": "initialize",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "_reserveRegistry",
                  "type": "address"
                },
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "_controlledTokens",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256",
                  "name": "_maxExitFeeMantissa",
                  "type": "uint256"
                },
                {
                  "internalType": "contract YieldSourceStub",
                  "name": "_stubYieldSource",
                  "type": "address"
                }
              ],
              "name": "initializeAll",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract ControlledTokenInterface",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "isControlled",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "liquidityCap",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "maxExitFeeMantissa",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "onERC721Received",
              "outputs": [
                {
                  "internalType": "bytes4",
                  "name": "",
                  "type": "bytes4"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizeStrategy",
              "outputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "redeemAmount",
                  "type": "uint256"
                }
              ],
              "name": "redeem",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "renounceOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "reserveRegistry",
              "outputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "reserveTotalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint128",
                  "name": "_creditRateMantissa",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "_creditLimitMantissa",
                  "type": "uint128"
                }
              ],
              "name": "setCreditPlanOf",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_currentTime",
                  "type": "uint256"
                }
              ],
              "name": "setCurrentTime",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_liquidityCap",
                  "type": "uint256"
                }
              ],
              "name": "setLiquidityCap",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "_prizeStrategy",
                  "type": "address"
                }
              ],
              "name": "setPrizeStrategy",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "mintAmount",
                  "type": "uint256"
                }
              ],
              "name": "supply",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "token",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "tokens",
              "outputs": [
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "",
                  "type": "address[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transferExternalERC20",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "maximumExitFee",
                  "type": "uint256"
                }
              ],
              "name": "withdrawInstantlyFrom",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                }
              ],
              "name": "withdrawReserve",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "accountedBalance()": {
                "returns": {
                  "_0": "The current total of all tokens"
                }
              },
              "award(address,uint256,address)": {
                "details": "The amount awarded must be less than the awardBalance()",
                "params": {
                  "amount": "The amount of assets to be awarded",
                  "controlledToken": "The address of the asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "awardBalance()": {
                "details": "captureAwardBalance() should be called first",
                "returns": {
                  "_0": "The total amount of assets to be awarded for the current prize"
                }
              },
              "awardExternalERC20(address,address,uint256)": {
                "details": "Used to award any arbitrary tokens held by the Prize Pool",
                "params": {
                  "amount": "The amount of external assets to be awarded",
                  "externalToken": "The address of the external asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "awardExternalERC721(address,address,uint256[])": {
                "details": "Used to award any arbitrary NFTs held by the Prize Pool",
                "params": {
                  "externalToken": "The address of the external NFT token being awarded",
                  "to": "The address of the winner that receives the award",
                  "tokenIds": "An array of NFT Token IDs to be transferred"
                }
              },
              "balance()": {
                "details": "Returns the total underlying balance of all assets. This includes both principal and interest.",
                "returns": {
                  "_0": "The underlying balance of assets"
                }
              },
              "balanceOfCredit(address,address)": {
                "params": {
                  "user": "The user whose credit balance should be returned"
                },
                "returns": {
                  "_0": "The balance of the users credit"
                }
              },
              "beforeTokenTransfer(address,address,uint256)": {
                "params": {
                  "amount": "The amount of tokens being trasferred",
                  "from": "The address the tokens are being transferred from (0 if minting)",
                  "to": "The address the tokens are being transferred to (0 if burning)"
                }
              },
              "calculateEarlyExitFee(address,address,uint256)": {
                "params": {
                  "amount": "The amount of collateral to be withdrawn",
                  "controlledToken": "The type of collateral being withdrawn",
                  "from": "The user who is withdrawing"
                },
                "returns": {
                  "burnedCredit": "The user's credit that was burned",
                  "exitFee": "The exit fee"
                }
              },
              "calculateReserveFee(uint256)": {
                "params": {
                  "amount": "The prize amount"
                },
                "returns": {
                  "_0": "The size of the reserve portion of the prize"
                }
              },
              "canAwardExternal(address)": {
                "details": "Checks with the Prize Pool if a specific token type may be awarded as an external prize",
                "params": {
                  "_externalToken": "The address of the token to check"
                },
                "returns": {
                  "_0": "True if the token may be awarded, false otherwise"
                }
              },
              "captureAwardBalance()": {
                "details": "This function also captures the reserve fees.",
                "returns": {
                  "_0": "The total amount of assets to be awarded for the current prize"
                }
              },
              "compLikeDelegate(address,address)": {
                "params": {
                  "compLike": "The COMP-like token held by the prize pool that should be delegated",
                  "to": "The address to delegate to "
                }
              },
              "creditPlanOf(address)": {
                "params": {
                  "controlledToken": "The controlled token to retrieve the credit rates for"
                },
                "returns": {
                  "creditLimitMantissa": "The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.",
                  "creditRateMantissa": "The credit rate. This is the amount of tokens that accrue per second."
                }
              },
              "depositTo(address,uint256,address,address)": {
                "params": {
                  "amount": "The amount of assets to deposit",
                  "controlledToken": "The address of the type of token the user is minting",
                  "referrer": "The referrer of the deposit",
                  "to": "The address receiving the newly minted tokens"
                }
              },
              "estimateCreditAccrualTime(address,uint256,uint256)": {
                "params": {
                  "_interest": "The amount of interest that must accrue",
                  "_principal": "The principal amount on which interest is accruing"
                },
                "returns": {
                  "durationSeconds": "The duration of time it will take to accrue the given amount of interest, in seconds."
                }
              },
              "initialize(address,address[],uint256)": {
                "params": {
                  "_controlledTokens": "Array of ControlledTokens that are controlled by this Prize Pool.",
                  "_maxExitFeeMantissa": "The maximum exit fee size"
                }
              },
              "isControlled(address)": {
                "details": "Checks if a specific token is controlled by the Prize Pool",
                "params": {
                  "controlledToken": "The address of the token to check"
                },
                "returns": {
                  "_0": "True if the token is a controlled token, false otherwise"
                }
              },
              "onERC721Received(address,address,uint256,bytes)": {
                "params": {
                  "data": "Additional data with no specified format, sent in call to `_to`.",
                  "from": "The current owner of the NFT",
                  "operator": "The address that acts on behalf of the owner",
                  "tokenId": "The NFT to transfer"
                }
              },
              "owner()": {
                "details": "Returns the address of the current owner."
              },
              "renounceOwnership()": {
                "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
              },
              "setCreditPlanOf(address,uint128,uint128)": {
                "params": {
                  "_controlledToken": "The controlled token for whom to set the credit plan",
                  "_creditLimitMantissa": "The credit limit to set.  Is a fixed point 18 decimal (like Ether).",
                  "_creditRateMantissa": "The credit rate to set.  Is a fixed point 18 decimal (like Ether)."
                }
              },
              "setLiquidityCap(uint256)": {
                "params": {
                  "_liquidityCap": "The new liquidity cap for the prize pool"
                }
              },
              "setPrizeStrategy(address)": {
                "params": {
                  "_prizeStrategy": "The new prize strategy"
                }
              },
              "token()": {
                "details": "Returns the address of the underlying ERC20 asset",
                "returns": {
                  "_0": "The address of the asset"
                }
              },
              "tokens()": {
                "returns": {
                  "_0": "An array of controlled token addresses"
                }
              },
              "transferExternalERC20(address,address,uint256)": {
                "details": "Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.",
                "params": {
                  "amount": "The amount of external assets to be awarded",
                  "externalToken": "The address of the external asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "transferOwnership(address)": {
                "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
              },
              "withdrawInstantlyFrom(address,uint256,address,uint256)": {
                "params": {
                  "amount": "The amount of tokens to redeem for assets.",
                  "controlledToken": "The address of the token to redeem (i.e. ticket or sponsorship)",
                  "from": "The address to redeem tokens from.",
                  "maximumExitFee": "The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn."
                },
                "returns": {
                  "_0": "The actual exit fee paid"
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506140f6806100206000396000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c80637cbab1c711610146578063a7b2cc31116100c3578063e323f82511610087578063e323f82514610992578063e6d8a94b146109ce578063edb4e1cf146109d6578063f2fde38b146109de578063fc0c546a14610a04578063ffa1ad7414610a0c57610253565b8063a7b2cc31146108d3578063b69ef8a814610910578063d18e81b314610918578063d4a1361d14610920578063db006a751461097557610253565b806398bf3eb61161010a57806398bf3eb6146108145780639d63848a1461081c5780639e167519146108745780639fe32a911461087c578063a016240b1461089957610253565b80637cbab1c71461073d578063888c2b6f146107735780638da5cb5b146107c25780638e71c1f6146107e657806391ca480e146107ee57610253565b806352a387ab116101d4578063715018a611610198578063715018a6146106b857806376687d3d146106c057806378b3d327146106c857806379cb8563146106ee5780637b99adb11461072057610253565b806352a387ab1461055b578063610c75ea14610581578063630665b4146106405780636a3fd4f9146106485780636b1b863a1461068257610253565b80632b0ab1441161021b5780632b0ab144146103f95780632f7627e31461042f578063354030231461045d5780633ede50c61461047a578063494de9f71461052d57610253565b80630937eb541461025857806313f55e3914610272578063150b7a02146102aa57806316960d551461035557806322f8e566146103dc575b600080fd5b610260610a89565b60408051918252519081900360200190f35b6102a86004803603606081101561028857600080fd5b506001600160a01b03813581169160208101359091169060400135610a98565b005b610338600480360360808110156102c057600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156102fa57600080fd5b82018360208201111561030c57600080fd5b803590602001918460018302840111600160201b8311171561032d57600080fd5b509092509050610b56565b604080516001600160e01b03199092168252519081900360200190f35b6102a86004803603606081101561036b57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561039e57600080fd5b8201836020820111156103b057600080fd5b803590602001918460208302840111600160201b831117156103d157600080fd5b509092509050610b67565b6102a8600480360360208110156103f257600080fd5b5035610e14565b6102a86004803603606081101561040f57600080fd5b506001600160a01b03813581169160208101359091169060400135610e19565b6102a86004803603604081101561044557600080fd5b506001600160a01b0381358116916020013516610ed6565b6102a86004803603602081101561047357600080fd5b5035611025565b6102a86004803603606081101561049057600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156104ba57600080fd5b8201836020820111156104cc57600080fd5b803590602001918460208302840111600160201b831117156104ed57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611031915050565b6102606004803603604081101561054357600080fd5b506001600160a01b0381358116916020013516611223565b6102606004803603602081101561057157600080fd5b50356001600160a01b031661132a565b6102a86004803603608081101561059757600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156105c157600080fd5b8201836020820111156105d357600080fd5b803590602001918460208302840111600160201b831117156105f457600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602001356001600160a01b0316611479565b6102606114a9565b61066e6004803603602081101561065e57600080fd5b50356001600160a01b03166114af565b604080519115158252519081900360200190f35b6102a86004803603606081101561069857600080fd5b506001600160a01b038135811691602081013591604090910135166114c2565b6102a86116ca565b610260611776565b61066e600480360360208110156106de57600080fd5b50356001600160a01b031661177c565b6102606004803603606081101561070457600080fd5b506001600160a01b038135169060208101359060400135611787565b6102a86004803603602081101561073657600080fd5b503561179c565b6102a86004803603606081101561075357600080fd5b506001600160a01b03813581169160208101359091169060400135611807565b6107a96004803603606081101561078957600080fd5b506001600160a01b03813581169160208101359091169060400135611a53565b6040805192835260208301919091528051918290030190f35b6107ca611a6d565b604080516001600160a01b039092168252519081900360200190f35b6107ca611a7c565b6102a86004803603602081101561080457600080fd5b50356001600160a01b0316611a8b565b6107ca611af6565b610824611b05565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610860578181015183820152602001610848565b505050509050019250505060405180910390f35b610260611b67565b6102606004803603602081101561089257600080fd5b5035611b6d565b610260600480360360808110156108af57600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611c9b565b6102a8600480360360608110156108e957600080fd5b506001600160a01b03813516906001600160801b0360208201358116916040013516611ed2565b610260612028565b610260612032565b6109466004803603602081101561093657600080fd5b50356001600160a01b0316612038565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b6102a86004803603602081101561098b57600080fd5b5035612068565b6102a8600480360360808110156109a857600080fd5b506001600160a01b03813581169160208101359160408201358116916060013516612071565b610260612226565b61026061239c565b6102a8600480360360208110156109f457600080fd5b50356001600160a01b03166123a2565b6107ca6124a5565b610a146124af565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610a4e578181015183820152602001610a36565b50505050905090810190601f168015610a7b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610a936124d0565b905090565b6099546001600160a01b0316610aac6125db565b6001600160a01b031614610af5576040805162461bcd60e51b815260206004820152601c60248201526000805160206140a1833981519152604482015290519081900360640190fd5b610b008383836125df565b15610b5157816001600160a01b0316836001600160a01b03167fb0bac59718cd343c80a813518afcf36846cfcfe6d56e2b3cab9bd49f5f9b251c836040518082815260200191505060405180910390a35b505050565b630a85bd0160e11b95945050505050565b6099546001600160a01b0316610b7b6125db565b6001600160a01b031614610bc4576040805162461bcd60e51b815260206004820152601c60248201526000805160206140a1833981519152604482015290519081900360640190fd5b610bcd83612667565b610c1e576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b80610c2857610e0e565b60005b81811015610d9557836001600160a01b03166342842e0e3087868686818110610c5057fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610cad57600080fd5b505af1925050508015610cbe575060015b610d8d573d808015610cec576040519150601f19603f3d011682016040523d82523d6000602084013e610cf1565b606091505b507f17e975018310f88872b58d4d8263adca83cf5c1893496ea2a86923dab15276ad816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d51578181015183820152602001610d39565b50505050905090810190601f168015610d7e5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1505b600101610c2b565b50826001600160a01b0316846001600160a01b03167f69c2de32bc4d47f488e72626a6cfdee85089342e52675e7de79c4b417623960c848460405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a35b50505050565b60a055565b6099546001600160a01b0316610e2d6125db565b6001600160a01b031614610e76576040805162461bcd60e51b815260206004820152601c60248201526000805160206140a1833981519152604482015290519081900360640190fd5b610e818383836125df565b15610b5157816001600160a01b0316836001600160a01b03167fc65f48aca3b7a99b7443d04b8ffbb073156179bc628dc3f7def5047748973469836040518082815260200191505060405180910390a3505050565b610ede6125db565b6001600160a01b0316610eef611a6d565b6001600160a01b031614610f38576040805162461bcd60e51b81526020600482018190526024820152600080516020613fea833981519152604482015290519081900360640190fd5b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f8757600080fd5b505afa158015610f9b573d6000803e3d6000fd5b505050506040513d6020811015610fb157600080fd5b5051111561102157816001600160a01b0316635c19a95c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561100857600080fd5b505af115801561101c573d6000803e3d6000fd5b505050505b5050565b61102e816126ea565b50565b600054610100900460ff168061104a575061104a612752565b80611058575060005460ff16155b6110935760405162461bcd60e51b815260040180806020018281038252602e815260200180613f9b602e913960400191505060405180910390fd5b600054610100900460ff161580156110be576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0384166111035760405162461bcd60e51b8152600401808060200182810382526022815260200180613f536022913960400191505060405180910390fd5b82518067ffffffffffffffff8111801561111c57600080fd5b50604051908082528060200260200182016040528015611146578160200160208202803683370190505b50805161115b91609891602090910190613e8a565b5060005b8181101561119257600085828151811061117557fe5b602002602001015190506111898183612763565b5060010161115f565b5061119b61288e565b6111a361293f565b6111ae6000196129d4565b609780546001600160a01b0319166001600160a01b038716908117909155609a849055604080519182526020820185905280517f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce799281900390910190a1508015610e0e576000805461ff001916905550505050565b60008161122f81612a0f565b61126e576040805162461bcd60e51b81526020600482015260176024820152600080516020614031833981519152604482015290519081900360640190fd5b6112f38484856001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112c057600080fd5b505afa1580156112d4573d6000803e3d6000fd5b505050506040513d60208110156112ea57600080fd5b50516000612acb565b50506001600160a01b039081166000908152609f60209081526040808320949093168252929092529020546001600160c01b031690565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561137b57600080fd5b505afa15801561138f573d6000803e3d6000fd5b505050506040513d60208110156113a557600080fd5b505190506001600160a01b03811633146113ff576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f6f6e6c792d7265736572766560501b604482015290519081900360640190fd5b609b80546000918290559061141382612ae1565b90506114328582611422612b42565b6001600160a01b03169190612bb8565b6040805183815290516001600160a01b038716917f1c71c8e11fd443227c8f8d3dc1a237a3a5e8310b540c7fbcf5169754aedf42c9919081900360200190a2949350505050565b611484848484611031565b60a180546001600160a01b0319166001600160a01b0392909216919091179055505050565b609d5490565b60006114ba82612667565b90505b919050565b6099546001600160a01b03166114d66125db565b6001600160a01b03161461151f576040805162461bcd60e51b815260206004820152601c60248201526000805160206140a1833981519152604482015290519081900360640190fd5b8061152981612a0f565b611568576040805162461bcd60e51b81526020600482015260176024820152600080516020614031833981519152604482015290519081900360640190fd5b8261157257610e0e565b609d548311156115c9576040805162461bcd60e51b815260206004820152601d60248201527f5072697a65506f6f6c2f61776172642d657863656564732d617661696c000000604482015290519081900360640190fd5b609d546115d69084612c0a565b609d556115e68484846000612c6c565b60006115f28385612d52565b90506116788584856001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561164657600080fd5b505afa15801561165a573d6000803e3d6000fd5b505050506040513d602081101561167057600080fd5b505184612acb565b826001600160a01b0316856001600160a01b03167fe2554529d99ab7a67db6b4cea2b32c7d55ae325f958861e05f304fdded867e31866040518082815260200191505060405180910390a35050505050565b6116d26125db565b6001600160a01b03166116e3611a6d565b6001600160a01b03161461172c576040805162461bcd60e51b81526020600482018190526024820152600080516020613fea833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b609c5481565b60006114ba82612a0f565b6000611794848484612d8a565b949350505050565b6117a46125db565b6001600160a01b03166117b5611a6d565b6001600160a01b0316146117fe576040805162461bcd60e51b81526020600482018190526024820152600080516020613fea833981519152604482015290519081900360640190fd5b61102e816129d4565b3361181181612a0f565b611850576040805162461bcd60e51b81526020600482015260176024820152600080516020614031833981519152604482015290519081900360640190fd5b6001600160a01b0384161561192a576000336001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156118ae57600080fd5b505afa1580156118c2573d6000803e3d6000fd5b505050506040513d60208110156118d857600080fd5b5051905060006118ea86338484612de4565b9050846001600160a01b0316866001600160a01b03161461191c57611919336119138487612c0a565b83612e73565b90505b611927863383612eb9565b50505b6001600160a01b038316158015906119545750836001600160a01b0316836001600160a01b031614155b156119ab576119ab8333336001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112c057600080fd5b6001600160a01b038416158015906119cd57506099546001600160a01b031615155b15610e0e576099546040805163b221095760e01b81526001600160a01b0387811660048301528681166024830152604482018690523360648301529151919092169163b221095791608480830192600092919082900301818387803b158015611a3557600080fd5b505af1158015611a49573d6000803e3d6000fd5b5050505050505050565b600080611a61858585613057565b90969095509350505050565b6033546001600160a01b031690565b6097546001600160a01b031681565b611a936125db565b6001600160a01b0316611aa4611a6d565b6001600160a01b031614611aed576040805162461bcd60e51b81526020600482018190526024820152600080516020613fea833981519152604482015290519081900360640190fd5b61102e816131f5565b6099546001600160a01b031681565b60606098805480602002602001604051908101604052809291908181526020018280548015611b5d57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b3f575b5050505050905090565b609a5481565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611bbe57600080fd5b505afa158015611bd2573d6000803e3d6000fd5b505050506040513d6020811015611be857600080fd5b505190506001600160a01b038116611c045760009150506114bd565b6000816001600160a01b031663010dfa58306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611c5357600080fd5b505afa158015611c67573d6000803e3d6000fd5b505050506040513d6020811015611c7d57600080fd5b5051905080611c91576000925050506114bd565b6117948482613308565b600060026065541415611cf5576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655582611d0481612a0f565b611d43576040805162461bcd60e51b81526020600482015260176024820152600080516020614031833981519152604482015290519081900360640190fd5b600080611d51888789613057565b9150915084821115611d945760405162461bcd60e51b815260040180806020018281038252602781526020018061400a6027913960400191505060405180910390fd5b611d9f888783613329565b856001600160a01b031663631b5dfb611db66125db565b8a8a6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611e0e57600080fd5b505af1158015611e22573d6000803e3d6000fd5b505050506000611e3b8389612c0a90919063ffffffff16565b90506000611e4882612ae1565b9050611e578a82611422612b42565b876001600160a01b03168a6001600160a01b0316611e736125db565b604080518d81526020810186905280820189905290516001600160a01b0392909216917f0271704a58fd2953e49b87d67a0a3ce28a58147de98a5457f60b4686f63850309181900360600190a450506001606555509695505050505050565b82611edc81612a0f565b611f1b576040805162461bcd60e51b81526020600482015260176024820152600080516020614031833981519152604482015290519081900360640190fd5b611f236125db565b6001600160a01b0316611f34611a6d565b6001600160a01b031614611f7d576040805162461bcd60e51b81526020600482018190526024820152600080516020613fea833981519152604482015290519081900360640190fd5b6040805180820182526001600160801b0380851680835286821660208085018281526001600160a01b038b166000818152609e84528890209651875492518716600160801b029087166fffffffffffffffffffffffffffffffff1990931692909217909516179094558451928352928201528083019190915290517ffb0ba2cf86a2b03bcf387753a2192da80a006afa99dd022bb301c78e323bf1b99181900360600190a150505050565b6000610a936133ea565b60a05481565b6001600160a01b03166000908152609e60205260409020546001600160801b0380821692600160801b9092041690565b61102181612ae1565b600260655414156120c9576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002606555816120d881612a0f565b612117576040805162461bcd60e51b81526020600482015260176024820152600080516020614031833981519152604482015290519081900360640190fd5b8361212181613444565b612172576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f657863656564732d6c69717569646974792d63617000604482015290519081900360640190fd5b600061217c6125db565b905061218a87878787612c6c565b6121a9813088612198612b42565b6001600160a01b0316929190613468565b6121b2866126ea565b846001600160a01b0316876001600160a01b0316826001600160a01b03167f6ce569498e0f86f147466ac49211cb2a1ffe06195adb805e383b3f2365109160898860405180838152602001826001600160a01b031681526020019250505060405180910390a4505060016065555050505050565b600060026065541415612280576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002606555600061228f6124d0565b9050600061229b6133ea565b905060008282116122ad5760006122b7565b6122b78284612c0a565b90506000609d5482116122cb5760006122d9565b609d546122d9908390612c0a565b9050801561238b5760006122ec82611b6d565b9050801561234657609b5461230190826134c2565b609b5561230e8282612c0a565b6040805183815290519193507f5f1703ccfa2730d4245350f228079926a37f26a44ecf6978a7eeafff0af11407919081900360200190a15b609d5461235390836134c2565b609d556040805183815290517fce2b6e507c7ca1a20ce136810f524eefc19ba4c7e4866eb6cc0cba76e778d4be9181900360200190a1505b609d54945050505050600160655590565b609b5481565b6123aa6125db565b6001600160a01b03166123bb611a6d565b6001600160a01b031614612404576040805162461bcd60e51b81526020600482018190526024820152600080516020613fea833981519152604482015290519081900360640190fd5b6001600160a01b0381166124495760405162461bcd60e51b8152600401808060200182810382526026815260200180613f066026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610a93612b42565b60405180604001604052806005815260200164332e342e3560d81b81525081565b600080609b5490506060609880548060200260200160405190810160405280929190818152602001828054801561253057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612512575b505083519394506000925050505b818110156125d2576125c883828151811061255557fe5b60200260200101516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561259557600080fd5b505afa1580156125a9573d6000803e3d6000fd5b505050506040513d60208110156125bf57600080fd5b505185906134c2565b935060010161253e565b50919250505090565b3390565b60006125ea83612667565b61263b576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b8161264857506000612660565b61265c6001600160a01b0384168584612bb8565b5060015b9392505050565b60a15460408051636a3fd4f960e01b81526001600160a01b03848116600483015291516000939290921691636a3fd4f991602480820192602092909190829003018186803b1580156126b857600080fd5b505afa1580156126cc573d6000803e3d6000fd5b505050506040513d60208110156126e257600080fd5b505192915050565b60a15460408051633540302360e01b81526004810184905290516001600160a01b039092169163354030239160248082019260009290919082900301818387803b15801561273757600080fd5b505af115801561274b573d6000803e3d6000fd5b5050505050565b600061275d3061351c565b15905090565b306001600160a01b0316826001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b1580156127a657600080fd5b505afa1580156127ba573d6000803e3d6000fd5b505050506040513d60208110156127d057600080fd5b50516001600160a01b03161461282d576040805162461bcd60e51b815260206004820152601e60248201527f5072697a65506f6f6c2f746f6b656e2d6374726c722d6d69736d617463680000604482015290519081900360640190fd5b816098828154811061283b57fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051918416917f460e712b4a5d801d031ed673dea209b73ab854f7ddeb86b6c48082e92c3eee669190a25050565b600054610100900460ff16806128a757506128a7612752565b806128b5575060005460ff16155b6128f05760405162461bcd60e51b815260040180806020018281038252602e815260200180613f9b602e913960400191505060405180910390fd5b600054610100900460ff1615801561291b576000805460ff1961ff0019909116610100171660011790555b612923613522565b61292b6135c2565b801561102e576000805461ff001916905550565b600054610100900460ff16806129585750612958612752565b80612966575060005460ff16155b6129a15760405162461bcd60e51b815260040180806020018281038252602e815260200180613f9b602e913960400191505060405180910390fd5b600054610100900460ff161580156129cc576000805460ff1961ff0019909116610100171660011790555b61292b6136bb565b609c8190556040805182815290517f3ff20538222f568f27ff436c0c49dfd3e48d5b8f86533a3f759dc1c7089775ab9181900360200190a150565b600060606098805480602002602001604051908101604052809291908181526020018280548015612a6957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612a4b575b505083519394506000925050505b81811015612ac057846001600160a01b0316838281518110612a9557fe5b60200260200101516001600160a01b03161415612ab857600193505050506114bd565b600101612a77565b506000949350505050565b610e0e8484612adc87878787612de4565b612eb9565b60a1546040805163db006a7560e01b81526004810184905290516000926001600160a01b03169163db006a7591602480830192602092919082900301818787803b158015612b2e57600080fd5b505af11580156126cc573d6000803e3d6000fd5b60a15460408051637e062a3560e11b815290516000926001600160a01b03169163fc0c546a916004808301926020929190829003018186803b158015612b8757600080fd5b505afa158015612b9b573d6000803e3d6000fd5b505050506040513d6020811015612bb157600080fd5b5051905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610b51908490613761565b600082821115612c61576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6099546001600160a01b031615612cfb57609954604080516304d7f3db60e41b81526001600160a01b038781166004830152602482018790528581166044830152848116606483015291519190921691634d7f3db091608480830192600092919082900301818387803b158015612ce257600080fd5b505af1158015612cf6573d6000803e3d6000fd5b505050505b816001600160a01b0316635d7b075885856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611a3557600080fd5b6001600160a01b0382166000908152609e6020526040812054612660908390612d859082906001600160801b0316613308565b613812565b6001600160a01b0383166000908152609e60205260408120548190612dc0908590600160801b90046001600160801b0316613308565b905080612dd1576000915050612660565b612ddb8382613837565b95945050505050565b6001600160a01b038381166000908152609f6020908152604080832093881683529290529081208054829190600160e01b900460ff16612e275760009150612e69565b6000612e3488888861389e565b8254909150612e659088908890612e60908990612e5a906001600160c01b0316876134c2565b906134c2565b612e73565b9250505b5095945050505050565b6001600160a01b0383166000908152609e60205260408120548190612ea29085906001600160801b0316613308565b905080831115612eb0578092505b50909392505050565b6001600160a01b038083166000908152609f602090815260408083209387168352929052819020548151606081019092526001600160c01b03169080612efe8461394f565b6001600160801b03168152602001612f1c612f17613997565b61399d565b63ffffffff908116825260016020928301526001600160a01b038681166000908152609f84526040808220928a168252918452819020845181549486015195909201516001600160c01b03199094166001600160c01b039092169190911763ffffffff60c01b1916600160c01b94909216939093021760ff60e01b1916600160e01b9115159190910217905581811015612fff576001600160a01b038084169085167f2f92d56910619b38bc29fd8e4ca5e56359edac7a0c086cdcd305fb603fa37491612fe98585612c0a565b60408051918252519081900360200190a3610e0e565b80821015610e0e576001600160a01b038084169085167ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf6130408486612c0a565b60408051918252519081900360200190a350505050565b6000806000846001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156130a957600080fd5b505afa1580156130bd573d6000803e3d6000fd5b505050506040513d60208110156130d357600080fd5b5051905083811015613125576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f696e737566662d66756e647360501b604482015290519081900360640190fd5b6131328686836000612acb565b6000613147866131428488612c0a565b612d52565b6001600160a01b038088166000908152609f60209081526040808320938c16835292905290812054919250906001600160c01b031682116131be576001600160a01b038088166000908152609f60209081526040808320938c16835292905220546131bb906001600160c01b031683612c0a565b90505b60006131ca8888612d52565b90508082116131d957816131db565b805b94506131e78186612c0a565b955050505050935093915050565b6001600160a01b038116613250576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f7072697a6553747261746567792d6e6f742d7a65726f604482015290519081900360640190fd5b61326d6001600160a01b038216600162a1cb1960e01b03196139e1565b6132be576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f7072697a6553747261746567792d696e76616c696400604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0383169081179091556040517f7f58dc86bc2e435cb77ca0edb1df55e25f90caf2d6bd866971715437d456a21290600090a250565b60008061331583856139fd565b905061179481670de0b6b3a7640000613a56565b6001600160a01b038083166000908152609f602090815260408083209387168352929052205461336b90613366906001600160c01b031683612c0a565b61394f565b6001600160a01b038084166000818152609f602090815260408083209489168084529482529182902080546001600160c01b0319166001600160801b0396909616959095179094558051858152905191937ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf92918290030190a3505050565b60a154604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a891600480830192602092919082900301818787803b15801561343057600080fd5b505af1158015612b9b573d6000803e3d6000fd5b60008061344f6124d0565b609c5490915061345f82856134c2565b11159392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610e0e908590613761565b600082820183811015612660576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3b151590565b600054610100900460ff168061353b575061353b612752565b80613549575060005460ff16155b6135845760405162461bcd60e51b815260040180806020018281038252602e815260200180613f9b602e913960400191505060405180910390fd5b600054610100900460ff1615801561292b576000805460ff1961ff001990911661010017166001179055801561102e576000805461ff001916905550565b600054610100900460ff16806135db57506135db612752565b806135e9575060005460ff16155b6136245760405162461bcd60e51b815260040180806020018281038252602e815260200180613f9b602e913960400191505060405180910390fd5b600054610100900460ff1615801561364f576000805460ff1961ff0019909116610100171660011790555b60006136596125db565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561102e576000805461ff001916905550565b600054610100900460ff16806136d457506136d4612752565b806136e2575060005460ff16155b61371d5760405162461bcd60e51b815260040180806020018281038252602e815260200180613f9b602e913960400191505060405180910390fd5b600054610100900460ff16158015613748576000805460ff1961ff0019909116610100171660011790555b6001606555801561102e576000805461ff001916905550565b60606137b6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a989092919063ffffffff16565b805190915015610b51578080602001905160208110156137d557600080fd5b5051610b515760405162461bcd60e51b815260040180806020018281038252602a815260200180614077602a913960400191505060405180910390fd5b60008061382184609a54613308565b90508083111561382f578092505b509092915050565b600080821161388d576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161389657fe5b049392505050565b6001600160a01b038281166000908152609f60209081526040808320938716835292905290812054600160c01b810463ffffffff1690600160e01b900460ff166138ec576000915050612660565b6000613900826138fa613997565b90612c0a565b6001600160a01b0386166000908152609e602052604081205491925090613938908390600160801b90046001600160801b03166139fd565b90506139448582613308565b979650505050505050565b6000600160801b82106139935760405162461bcd60e51b8152600401808060200182810382526027815260200180613f2c6027913960400191505060405180910390fd5b5090565b60a05490565b6000600160201b82106139935760405162461bcd60e51b81526004018080602001828103825260268152602001806140516026913960400191505060405180910390fd5b60006139ec83613aa7565b801561266057506126608383613ada565b600082613a0c57506000612c66565b82820282848281613a1957fe5b04146126605760405162461bcd60e51b8152600401808060200182810382526021815260200180613fc96021913960400191505060405180910390fd5b600061266083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613afd565b60606117948484600085613b9f565b6000613aba826301ffc9a760e01b613ada565b80156114ba5750613ad3826001600160e01b0319613ada565b1592915050565b6000806000613ae98585613cf0565b91509150818015612ddb5750949350505050565b60008183613b895760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b4e578181015183820152602001613b36565b50505050905090810190601f168015613b7b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613b9557fe5b0495945050505050565b606082471015613be05760405162461bcd60e51b8152600401808060200182810382526026815260200180613f756026913960400191505060405180910390fd5b613be98561351c565b613c3a576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613c795780518252601f199092019160209182019101613c5a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613cdb576040519150601f19603f3d011682016040523d82523d6000602084013e613ce0565b606091505b5091509150613944828286613e24565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b1781529151815160009384939284926060926001600160a01b038a169261753092879282918083835b60208310613d785780518252601f199092019160209182019101613d59565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114613dd9576040519150601f19603f3d011682016040523d82523d6000602084013e613dde565b606091505b5091509150602081511015613dfc5760008094509450505050613e1d565b81818060200190516020811015613e1257600080fd5b505190955093505050505b9250929050565b60608315613e33575081612660565b825115613e435782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315613b4e578181015183820152602001613b36565b828054828255906000526020600020908101928215613edf579160200282015b82811115613edf57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613eaa565b506139939291505b808211156139935780546001600160a01b0319168155600101613ee756fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e2031323820626974735072697a65506f6f6c2f7265736572766552656769737472792d6e6f742d7a65726f416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725072697a65506f6f6c2f657869742d6665652d657863656564732d757365722d6d6178696d756d5072697a65506f6f6c2f756e6b6e6f776e2d746f6b656e00000000000000000053616665436173743a2076616c756520646f65736e27742066697420696e20333220626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645072697a65506f6f6c2f6f6e6c792d7072697a65537472617465677900000000a264697066735822122065cb33f64edf8c379ec66f9728e5e980805796e610b5023d0c212036c869eafc64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x40F6 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x253 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7CBAB1C7 GT PUSH2 0x146 JUMPI DUP1 PUSH4 0xA7B2CC31 GT PUSH2 0xC3 JUMPI DUP1 PUSH4 0xE323F825 GT PUSH2 0x87 JUMPI DUP1 PUSH4 0xE323F825 EQ PUSH2 0x992 JUMPI DUP1 PUSH4 0xE6D8A94B EQ PUSH2 0x9CE JUMPI DUP1 PUSH4 0xEDB4E1CF EQ PUSH2 0x9D6 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x9DE JUMPI DUP1 PUSH4 0xFC0C546A EQ PUSH2 0xA04 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0xA0C JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0xA7B2CC31 EQ PUSH2 0x8D3 JUMPI DUP1 PUSH4 0xB69EF8A8 EQ PUSH2 0x910 JUMPI DUP1 PUSH4 0xD18E81B3 EQ PUSH2 0x918 JUMPI DUP1 PUSH4 0xD4A1361D EQ PUSH2 0x920 JUMPI DUP1 PUSH4 0xDB006A75 EQ PUSH2 0x975 JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x98BF3EB6 GT PUSH2 0x10A JUMPI DUP1 PUSH4 0x98BF3EB6 EQ PUSH2 0x814 JUMPI DUP1 PUSH4 0x9D63848A EQ PUSH2 0x81C JUMPI DUP1 PUSH4 0x9E167519 EQ PUSH2 0x874 JUMPI DUP1 PUSH4 0x9FE32A91 EQ PUSH2 0x87C JUMPI DUP1 PUSH4 0xA016240B EQ PUSH2 0x899 JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x7CBAB1C7 EQ PUSH2 0x73D JUMPI DUP1 PUSH4 0x888C2B6F EQ PUSH2 0x773 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x7C2 JUMPI DUP1 PUSH4 0x8E71C1F6 EQ PUSH2 0x7E6 JUMPI DUP1 PUSH4 0x91CA480E EQ PUSH2 0x7EE JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x52A387AB GT PUSH2 0x1D4 JUMPI DUP1 PUSH4 0x715018A6 GT PUSH2 0x198 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x6B8 JUMPI DUP1 PUSH4 0x76687D3D EQ PUSH2 0x6C0 JUMPI DUP1 PUSH4 0x78B3D327 EQ PUSH2 0x6C8 JUMPI DUP1 PUSH4 0x79CB8563 EQ PUSH2 0x6EE JUMPI DUP1 PUSH4 0x7B99ADB1 EQ PUSH2 0x720 JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x52A387AB EQ PUSH2 0x55B JUMPI DUP1 PUSH4 0x610C75EA EQ PUSH2 0x581 JUMPI DUP1 PUSH4 0x630665B4 EQ PUSH2 0x640 JUMPI DUP1 PUSH4 0x6A3FD4F9 EQ PUSH2 0x648 JUMPI DUP1 PUSH4 0x6B1B863A EQ PUSH2 0x682 JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x2B0AB144 GT PUSH2 0x21B JUMPI DUP1 PUSH4 0x2B0AB144 EQ PUSH2 0x3F9 JUMPI DUP1 PUSH4 0x2F7627E3 EQ PUSH2 0x42F JUMPI DUP1 PUSH4 0x35403023 EQ PUSH2 0x45D JUMPI DUP1 PUSH4 0x3EDE50C6 EQ PUSH2 0x47A JUMPI DUP1 PUSH4 0x494DE9F7 EQ PUSH2 0x52D JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x937EB54 EQ PUSH2 0x258 JUMPI DUP1 PUSH4 0x13F55E39 EQ PUSH2 0x272 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x2AA JUMPI DUP1 PUSH4 0x16960D55 EQ PUSH2 0x355 JUMPI DUP1 PUSH4 0x22F8E566 EQ PUSH2 0x3DC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x260 PUSH2 0xA89 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x288 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xA98 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x338 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x2C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x2FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x30C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x32D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xB56 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x36B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x39E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x3B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x3D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xB67 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xE14 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x40F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xE19 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x445 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xED6 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x473 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1025 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x490 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x4BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x4CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x4ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0x1031 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x543 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x1223 JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x571 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x132A JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x597 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x5C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x5D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x5F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1479 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x14A9 JUMP JUMPDEST PUSH2 0x66E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x65E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x14AF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x698 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 SWAP1 SWAP2 ADD CALLDATALOAD AND PUSH2 0x14C2 JUMP JUMPDEST PUSH2 0x2A8 PUSH2 0x16CA JUMP JUMPDEST PUSH2 0x260 PUSH2 0x1776 JUMP JUMPDEST PUSH2 0x66E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x177C JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x704 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1787 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x736 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x179C JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x753 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1807 JUMP JUMPDEST PUSH2 0x7A9 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x789 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1A53 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB ADD SWAP1 RETURN JUMPDEST PUSH2 0x7CA PUSH2 0x1A6D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x7CA PUSH2 0x1A7C JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x804 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A8B JUMP JUMPDEST PUSH2 0x7CA PUSH2 0x1AF6 JUMP JUMPDEST PUSH2 0x824 PUSH2 0x1B05 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x860 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x848 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x260 PUSH2 0x1B67 JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x892 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1B6D JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x8AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x1C9B JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x8E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x40 ADD CALLDATALOAD AND PUSH2 0x1ED2 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x2028 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x2032 JUMP JUMPDEST PUSH2 0x946 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x936 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2038 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x98B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x2068 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x9A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x2071 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x2226 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x239C JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x9F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x23A2 JUMP JUMPDEST PUSH2 0x7CA PUSH2 0x24A5 JUMP JUMPDEST PUSH2 0xA14 PUSH2 0x24AF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xA4E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xA36 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xA7B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xA93 PUSH2 0x24D0 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xAAC PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xAF5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x40A1 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xB00 DUP4 DUP4 DUP4 PUSH2 0x25DF JUMP JUMPDEST ISZERO PUSH2 0xB51 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB0BAC59718CD343C80A813518AFCF36846CFCFE6D56E2B3CAB9BD49F5F9B251C DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0xA85BD01 PUSH1 0xE1 SHL SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xB7B PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xBC4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x40A1 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xBCD DUP4 PUSH2 0x2667 JUMP JUMPDEST PUSH2 0xC1E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0xC28 JUMPI PUSH2 0xE0E JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xD95 JUMPI DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x42842E0E ADDRESS DUP8 DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0xC50 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0xCBE JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xD8D JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0xCEC JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xCF1 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH32 0x17E975018310F88872B58D4D8263ADCA83CF5C1893496EA2A86923DAB15276AD DUP2 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD51 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD39 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD7E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xC2B JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x69C2DE32BC4D47F488E72626A6CFDEE85089342E52675E7DE79C4B417623960C DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP6 POP SWAP1 SWAP4 POP POP POP POP LOG3 JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0xA0 SSTORE JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE2D PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xE76 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x40A1 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xE81 DUP4 DUP4 DUP4 PUSH2 0x25DF JUMP JUMPDEST ISZERO PUSH2 0xB51 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC65F48ACA3B7A99B7443D04B8FFBB073156179BC628DC3F7DEF5047748973469 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH2 0xEDE PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xEEF PUSH2 0x1A6D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xF38 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FEA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF87 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xF9B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xFB1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD GT ISZERO PUSH2 0x1021 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5C19A95C DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1008 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x101C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x102E DUP2 PUSH2 0x26EA JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x104A JUMPI POP PUSH2 0x104A PUSH2 0x2752 JUMP JUMPDEST DUP1 PUSH2 0x1058 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1093 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F9B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x10BE JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x1103 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F53 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 MLOAD DUP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x111C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1146 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP1 MLOAD PUSH2 0x115B SWAP2 PUSH1 0x98 SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x3E8A JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1192 JUMPI PUSH1 0x0 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1175 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0x1189 DUP2 DUP4 PUSH2 0x2763 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x115F JUMP JUMPDEST POP PUSH2 0x119B PUSH2 0x288E JUMP JUMPDEST PUSH2 0x11A3 PUSH2 0x293F JUMP JUMPDEST PUSH2 0x11AE PUSH1 0x0 NOT PUSH2 0x29D4 JUMP JUMPDEST PUSH1 0x97 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x9A DUP5 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP6 SWAP1 MSTORE DUP1 MLOAD PUSH32 0x25FF68DD81B34665B5BA7E553EE5511BF6812E12ADB4A7E2C0D9E26B3099CE79 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 POP DUP1 ISZERO PUSH2 0xE0E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x122F DUP2 PUSH2 0x2A0F JUMP JUMPDEST PUSH2 0x126E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4031 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x12F3 DUP5 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x12D4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x12EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 PUSH2 0x2ACB JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP4 AND DUP3 MSTORE SWAP3 SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x137B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x138F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x13A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ PUSH2 0x13FF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F6F6E6C792D72657365727665 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9B DUP1 SLOAD PUSH1 0x0 SWAP2 DUP3 SWAP1 SSTORE SWAP1 PUSH2 0x1413 DUP3 PUSH2 0x2AE1 JUMP JUMPDEST SWAP1 POP PUSH2 0x1432 DUP6 DUP3 PUSH2 0x1422 PUSH2 0x2B42 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x2BB8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP2 PUSH32 0x1C71C8E11FD443227C8F8D3DC1A237A3A5E8310B540C7FBCF5169754AEDF42C9 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1484 DUP5 DUP5 DUP5 PUSH2 0x1031 JUMP JUMPDEST PUSH1 0xA1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x9D SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14BA DUP3 PUSH2 0x2667 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x14D6 PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x151F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x40A1 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x1529 DUP2 PUSH2 0x2A0F JUMP JUMPDEST PUSH2 0x1568 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4031 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 PUSH2 0x1572 JUMPI PUSH2 0xE0E JUMP JUMPDEST PUSH1 0x9D SLOAD DUP4 GT ISZERO PUSH2 0x15C9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F61776172642D657863656564732D617661696C000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x15D6 SWAP1 DUP5 PUSH2 0x2C0A JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH2 0x15E6 DUP5 DUP5 DUP5 PUSH1 0x0 PUSH2 0x2C6C JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15F2 DUP4 DUP6 PUSH2 0x2D52 JUMP JUMPDEST SWAP1 POP PUSH2 0x1678 DUP6 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1646 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x165A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1670 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP5 PUSH2 0x2ACB JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xE2554529D99AB7A67DB6B4CEA2B32C7D55AE325F958861E05F304FDDED867E31 DUP7 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x16D2 PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16E3 PUSH2 0x1A6D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x172C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FEA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14BA DUP3 PUSH2 0x2A0F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1794 DUP5 DUP5 DUP5 PUSH2 0x2D8A JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x17A4 PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x17B5 PUSH2 0x1A6D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x17FE JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FEA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x102E DUP2 PUSH2 0x29D4 JUMP JUMPDEST CALLER PUSH2 0x1811 DUP2 PUSH2 0x2A0F JUMP JUMPDEST PUSH2 0x1850 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4031 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO PUSH2 0x192A JUMPI PUSH1 0x0 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP7 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x18C2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x18D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x18EA DUP7 CALLER DUP5 DUP5 PUSH2 0x2DE4 JUMP JUMPDEST SWAP1 POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x191C JUMPI PUSH2 0x1919 CALLER PUSH2 0x1913 DUP5 DUP8 PUSH2 0x2C0A JUMP JUMPDEST DUP4 PUSH2 0x2E73 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x1927 DUP7 CALLER DUP4 PUSH2 0x2EB9 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1954 JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x19AB JUMPI PUSH2 0x19AB DUP4 CALLER CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x19CD JUMPI POP PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xE0E JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP7 SWAP1 MSTORE CALLER PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xB2210957 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1A35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1A49 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1A61 DUP6 DUP6 DUP6 PUSH2 0x3057 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x97 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1A93 PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1AA4 PUSH2 0x1A6D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1AED JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FEA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x102E DUP2 PUSH2 0x31F5 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1B5D JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1B3F JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1BBE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1BD2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1BE8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1C04 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x14BD JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x10DFA58 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C67 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1C7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x1C91 JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x14BD JUMP JUMPDEST PUSH2 0x1794 DUP5 DUP3 PUSH2 0x3308 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x1CF5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP3 PUSH2 0x1D04 DUP2 PUSH2 0x2A0F JUMP JUMPDEST PUSH2 0x1D43 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4031 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1D51 DUP9 DUP8 DUP10 PUSH2 0x3057 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0x1D94 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x400A PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1D9F DUP9 DUP8 DUP4 PUSH2 0x3329 JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x631B5DFB PUSH2 0x1DB6 PUSH2 0x25DB JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E0E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E22 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 PUSH2 0x1E3B DUP4 DUP10 PUSH2 0x2C0A SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1E48 DUP3 PUSH2 0x2AE1 JUMP JUMPDEST SWAP1 POP PUSH2 0x1E57 DUP11 DUP3 PUSH2 0x1422 PUSH2 0x2B42 JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E73 PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP14 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE DUP1 DUP3 ADD DUP10 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x271704A58FD2953E49B87D67A0A3CE28A58147DE98A5457F60B4686F6385030 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH2 0x1EDC DUP2 PUSH2 0x2A0F JUMP JUMPDEST PUSH2 0x1F1B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4031 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1F23 PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1F34 PUSH2 0x1A6D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1F7D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FEA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP6 AND DUP1 DUP4 MSTORE DUP7 DUP3 AND PUSH1 0x20 DUP1 DUP6 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9E DUP5 MSTORE DUP9 SWAP1 KECCAK256 SWAP7 MLOAD DUP8 SLOAD SWAP3 MLOAD DUP8 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP1 DUP8 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP6 AND OR SWAP1 SWAP5 SSTORE DUP5 MLOAD SWAP3 DUP4 MSTORE SWAP3 DUP3 ADD MSTORE DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 MLOAD PUSH32 0xFB0BA2CF86A2B03BCF387753A2192DA80A006AFA99DD022BB301C78E323BF1B9 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA93 PUSH2 0x33EA JUMP JUMPDEST PUSH1 0xA0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP3 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND SWAP1 JUMP JUMPDEST PUSH2 0x1021 DUP2 PUSH2 0x2AE1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x20C9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP2 PUSH2 0x20D8 DUP2 PUSH2 0x2A0F JUMP JUMPDEST PUSH2 0x2117 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4031 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP4 PUSH2 0x2121 DUP2 PUSH2 0x3444 JUMP JUMPDEST PUSH2 0x2172 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F657863656564732D6C69717569646974792D63617000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x217C PUSH2 0x25DB JUMP JUMPDEST SWAP1 POP PUSH2 0x218A DUP8 DUP8 DUP8 DUP8 PUSH2 0x2C6C JUMP JUMPDEST PUSH2 0x21A9 DUP2 ADDRESS DUP9 PUSH2 0x2198 PUSH2 0x2B42 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 SWAP1 PUSH2 0x3468 JUMP JUMPDEST PUSH2 0x21B2 DUP7 PUSH2 0x26EA JUMP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6CE569498E0F86F147466AC49211CB2A1FFE06195ADB805E383B3F2365109160 DUP10 DUP9 PUSH1 0x40 MLOAD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x2280 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE PUSH1 0x0 PUSH2 0x228F PUSH2 0x24D0 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x229B PUSH2 0x33EA JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 DUP3 GT PUSH2 0x22AD JUMPI PUSH1 0x0 PUSH2 0x22B7 JUMP JUMPDEST PUSH2 0x22B7 DUP3 DUP5 PUSH2 0x2C0A JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x9D SLOAD DUP3 GT PUSH2 0x22CB JUMPI PUSH1 0x0 PUSH2 0x22D9 JUMP JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x22D9 SWAP1 DUP4 SWAP1 PUSH2 0x2C0A JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x238B JUMPI PUSH1 0x0 PUSH2 0x22EC DUP3 PUSH2 0x1B6D JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x2346 JUMPI PUSH1 0x9B SLOAD PUSH2 0x2301 SWAP1 DUP3 PUSH2 0x34C2 JUMP JUMPDEST PUSH1 0x9B SSTORE PUSH2 0x230E DUP3 DUP3 PUSH2 0x2C0A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 POP PUSH32 0x5F1703CCFA2730D4245350F228079926A37F26A44ECF6978A7EEAFFF0AF11407 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x2353 SWAP1 DUP4 PUSH2 0x34C2 JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xCE2B6E507C7CA1A20CE136810F524EEFC19BA4C7E4866EB6CC0CBA76E778D4BE SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH1 0x9D SLOAD SWAP5 POP POP POP POP POP PUSH1 0x1 PUSH1 0x65 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x9B SLOAD DUP2 JUMP JUMPDEST PUSH2 0x23AA PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x23BB PUSH2 0x1A6D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2404 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FEA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x2449 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F06 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA93 PUSH2 0x2B42 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x9B SLOAD SWAP1 POP PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2530 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2512 JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x25D2 JUMPI PUSH2 0x25C8 DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2555 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2595 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x25A9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x25BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP6 SWAP1 PUSH2 0x34C2 JUMP JUMPDEST SWAP4 POP PUSH1 0x1 ADD PUSH2 0x253E JUMP JUMPDEST POP SWAP2 SWAP3 POP POP POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x25EA DUP4 PUSH2 0x2667 JUMP JUMPDEST PUSH2 0x263B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x2648 JUMPI POP PUSH1 0x0 PUSH2 0x2660 JUMP JUMPDEST PUSH2 0x265C PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP6 DUP5 PUSH2 0x2BB8 JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x6A3FD4F9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP2 MLOAD PUSH1 0x0 SWAP4 SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH4 0x6A3FD4F9 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x26B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x26CC JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x26E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0xA1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x35403023 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x35403023 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2737 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x274B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x275D ADDRESS PUSH2 0x351C JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF77C4791 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x27A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x27BA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x27D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x282D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F746F6B656E2D6374726C722D6D69736D617463680000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x98 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x283B JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 DUP5 AND SWAP2 PUSH32 0x460E712B4A5D801D031ED673DEA209B73AB854F7DDEB86B6C48082E92C3EEE66 SWAP2 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x28A7 JUMPI POP PUSH2 0x28A7 PUSH2 0x2752 JUMP JUMPDEST DUP1 PUSH2 0x28B5 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x28F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F9B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x291B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2923 PUSH2 0x3522 JUMP JUMPDEST PUSH2 0x292B PUSH2 0x35C2 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x102E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2958 JUMPI POP PUSH2 0x2958 PUSH2 0x2752 JUMP JUMPDEST DUP1 PUSH2 0x2966 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x29A1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F9B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x29CC JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x292B PUSH2 0x36BB JUMP JUMPDEST PUSH1 0x9C DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3FF20538222F568F27FF436C0C49DFD3E48D5B8F86533A3F759DC1C7089775AB SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2A69 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2A4B JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2AC0 JUMPI DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2A95 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x2AB8 JUMPI PUSH1 0x1 SWAP4 POP POP POP POP PUSH2 0x14BD JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2A77 JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xE0E DUP5 DUP5 PUSH2 0x2ADC DUP8 DUP8 DUP8 DUP8 PUSH2 0x2DE4 JUMP JUMPDEST PUSH2 0x2EB9 JUMP JUMPDEST PUSH1 0xA1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xDB006A75 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xDB006A75 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2B2E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x26CC JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0xA1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x7E062A35 PUSH1 0xE1 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xFC0C546A SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2B87 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2B9B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2BB1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xB51 SWAP1 DUP5 SWAP1 PUSH2 0x3761 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2C61 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2CFB JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE DUP6 DUP2 AND PUSH1 0x44 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x4D7F3DB0 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2CE2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2CF6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5D7B0758 DUP6 DUP6 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1A35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x2660 SWAP1 DUP4 SWAP1 PUSH2 0x2D85 SWAP1 DUP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3308 JUMP JUMPDEST PUSH2 0x3812 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2DC0 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3308 JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x2DD1 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x2660 JUMP JUMPDEST PUSH2 0x2DDB DUP4 DUP3 PUSH2 0x3837 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP3 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x2E27 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x2E69 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2E34 DUP9 DUP9 DUP9 PUSH2 0x389E JUMP JUMPDEST DUP3 SLOAD SWAP1 SWAP2 POP PUSH2 0x2E65 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x2E60 SWAP1 DUP10 SWAP1 PUSH2 0x2E5A SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP8 PUSH2 0x34C2 JUMP JUMPDEST SWAP1 PUSH2 0x34C2 JUMP JUMPDEST PUSH2 0x2E73 JUMP JUMPDEST SWAP3 POP POP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2EA2 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3308 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x2EB0 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE DUP2 SWAP1 KECCAK256 SLOAD DUP2 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 DUP1 PUSH2 0x2EFE DUP5 PUSH2 0x394F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2F1C PUSH2 0x2F17 PUSH2 0x3997 JUMP JUMPDEST PUSH2 0x399D JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP3 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 DUP11 AND DUP3 MSTORE SWAP2 DUP5 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP5 DUP7 ADD MLOAD SWAP6 SWAP1 SWAP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH4 0xFFFFFFFF PUSH1 0xC0 SHL NOT AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP5 SWAP1 SWAP3 AND SWAP4 SWAP1 SWAP4 MUL OR PUSH1 0xFF PUSH1 0xE0 SHL NOT AND PUSH1 0x1 PUSH1 0xE0 SHL SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE DUP2 DUP2 LT ISZERO PUSH2 0x2FFF JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0x2F92D56910619B38BC29FD8E4CA5E56359EDAC7A0C086CDCD305FB603FA37491 PUSH2 0x2FE9 DUP6 DUP6 PUSH2 0x2C0A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 PUSH2 0xE0E JUMP JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0xE0E JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF PUSH2 0x3040 DUP5 DUP7 PUSH2 0x2C0A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x30A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x30BD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x30D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x3125 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F696E737566662D66756E6473 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x3132 DUP7 DUP7 DUP4 PUSH1 0x0 PUSH2 0x2ACB JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3147 DUP7 PUSH2 0x3142 DUP5 DUP9 PUSH2 0x2C0A JUMP JUMPDEST PUSH2 0x2D52 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP3 GT PUSH2 0x31BE JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x31BB SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2C0A JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x31CA DUP9 DUP9 PUSH2 0x2D52 JUMP JUMPDEST SWAP1 POP DUP1 DUP3 GT PUSH2 0x31D9 JUMPI DUP2 PUSH2 0x31DB JUMP JUMPDEST DUP1 JUMPDEST SWAP5 POP PUSH2 0x31E7 DUP2 DUP7 PUSH2 0x2C0A JUMP JUMPDEST SWAP6 POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x3250 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D6E6F742D7A65726F PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x326D PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x39E1 JUMP JUMPDEST PUSH2 0x32BE JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D696E76616C696400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x99 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x7F58DC86BC2E435CB77CA0EDB1DF55E25F90CAF2D6BD866971715437D456A212 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3315 DUP4 DUP6 PUSH2 0x39FD JUMP JUMPDEST SWAP1 POP PUSH2 0x1794 DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x3A56 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x336B SWAP1 PUSH2 0x3366 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2C0A JUMP JUMPDEST PUSH2 0x394F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0xA1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x16D3DF15 PUSH1 0xE3 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xB69EF8A8 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3430 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2B9B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x344F PUSH2 0x24D0 JUMP JUMPDEST PUSH1 0x9C SLOAD SWAP1 SWAP2 POP PUSH2 0x345F DUP3 DUP6 PUSH2 0x34C2 JUMP JUMPDEST GT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x24 DUP4 ADD MSTORE DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x84 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xE0E SWAP1 DUP6 SWAP1 PUSH2 0x3761 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x2660 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x353B JUMPI POP PUSH2 0x353B PUSH2 0x2752 JUMP JUMPDEST DUP1 PUSH2 0x3549 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3584 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F9B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x292B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x102E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x35DB JUMPI POP PUSH2 0x35DB PUSH2 0x2752 JUMP JUMPDEST DUP1 PUSH2 0x35E9 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3624 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F9B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x364F JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x3659 PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x102E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x36D4 JUMPI POP PUSH2 0x36D4 PUSH2 0x2752 JUMP JUMPDEST DUP1 PUSH2 0x36E2 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x371D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F9B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3748 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x65 SSTORE DUP1 ISZERO PUSH2 0x102E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x37B6 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3A98 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xB51 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x37D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xB51 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4077 PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3821 DUP5 PUSH1 0x9A SLOAD PUSH2 0x3308 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x382F JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x388D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x3896 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xC0 SHL DUP2 DIV PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x38EC JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x2660 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3900 DUP3 PUSH2 0x38FA PUSH2 0x3997 JUMP JUMPDEST SWAP1 PUSH2 0x2C0A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x3938 SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x39FD JUMP JUMPDEST SWAP1 POP PUSH2 0x3944 DUP6 DUP3 PUSH2 0x3308 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x3993 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F2C PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0xA0 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x20 SHL DUP3 LT PUSH2 0x3993 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4051 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x39EC DUP4 PUSH2 0x3AA7 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x2660 JUMPI POP PUSH2 0x2660 DUP4 DUP4 PUSH2 0x3ADA JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3A0C JUMPI POP PUSH1 0x0 PUSH2 0x2C66 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x3A19 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x2660 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3FC9 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2660 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x3AFD JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1794 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x3B9F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3ABA DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3ADA JUMP JUMPDEST DUP1 ISZERO PUSH2 0x14BA JUMPI POP PUSH2 0x3AD3 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3ADA JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x3AE9 DUP6 DUP6 PUSH2 0x3CF0 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x2DDB JUMPI POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x3B89 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3B4E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3B36 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3B7B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x3B95 JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x3BE0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F75 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3BE9 DUP6 PUSH2 0x351C JUMP JUMPDEST PUSH2 0x3C3A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3C79 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3C5A JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3CDB JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3CE0 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x3944 DUP3 DUP3 DUP7 PUSH2 0x3E24 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x24 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP3 DUP5 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND SWAP3 PUSH2 0x7530 SWAP3 DUP8 SWAP3 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3D78 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3D59 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3DD9 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3DDE JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x3DFC JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x3E1D JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3E12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x3E33 JUMPI POP DUP2 PUSH2 0x2660 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x3E43 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x3B4E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3B36 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x3EDF JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x3EDF JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x3EAA JUMP JUMPDEST POP PUSH2 0x3993 SWAP3 SWAP2 POP JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x3993 JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x3EE7 JUMP INVALID 0x4F PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F206164647265737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E2031323820626974735072697A65 POP PUSH16 0x6F6C2F72657365727665526567697374 PUSH19 0x792D6E6F742D7A65726F416464726573733A20 PUSH10 0x6E73756666696369656E PUSH21 0x2062616C616E636520666F722063616C6C496E6974 PUSH10 0x616C697A61626C653A20 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 MSTORE8 PUSH2 0x6665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F774F776E61626C653A20 PUSH4 0x616C6C65 PUSH19 0x206973206E6F7420746865206F776E65725072 PUSH10 0x7A65506F6F6C2F657869 PUSH21 0x2D6665652D657863656564732D757365722D6D6178 PUSH10 0x6D756D5072697A65506F PUSH16 0x6C2F756E6B6E6F776E2D746F6B656E00 STOP STOP STOP STOP STOP STOP STOP STOP MSTORE8 PUSH2 0x6665 NUMBER PUSH2 0x7374 GASPRICE KECCAK256 PUSH23 0x616C756520646F65736E27742066697420696E20333220 PUSH3 0x697473 MSTORE8 PUSH2 0x6665 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x7563636565645072697A65506F6F6C2F6F6E6C79 0x2D PUSH17 0x72697A65537472617465677900000000A2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH6 0xCB33F64EDF8C CALLDATACOPY SWAP15 0xC6 PUSH16 0x9728E5E980805796E610B5023D0C2120 CALLDATASIZE 0xC8 PUSH10 0xEAFC64736F6C63430006 0xC STOP CALLER ",
              "sourceMap": "96:1450:77:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106102535760003560e01c80637cbab1c711610146578063a7b2cc31116100c3578063e323f82511610087578063e323f82514610992578063e6d8a94b146109ce578063edb4e1cf146109d6578063f2fde38b146109de578063fc0c546a14610a04578063ffa1ad7414610a0c57610253565b8063a7b2cc31146108d3578063b69ef8a814610910578063d18e81b314610918578063d4a1361d14610920578063db006a751461097557610253565b806398bf3eb61161010a57806398bf3eb6146108145780639d63848a1461081c5780639e167519146108745780639fe32a911461087c578063a016240b1461089957610253565b80637cbab1c71461073d578063888c2b6f146107735780638da5cb5b146107c25780638e71c1f6146107e657806391ca480e146107ee57610253565b806352a387ab116101d4578063715018a611610198578063715018a6146106b857806376687d3d146106c057806378b3d327146106c857806379cb8563146106ee5780637b99adb11461072057610253565b806352a387ab1461055b578063610c75ea14610581578063630665b4146106405780636a3fd4f9146106485780636b1b863a1461068257610253565b80632b0ab1441161021b5780632b0ab144146103f95780632f7627e31461042f578063354030231461045d5780633ede50c61461047a578063494de9f71461052d57610253565b80630937eb541461025857806313f55e3914610272578063150b7a02146102aa57806316960d551461035557806322f8e566146103dc575b600080fd5b610260610a89565b60408051918252519081900360200190f35b6102a86004803603606081101561028857600080fd5b506001600160a01b03813581169160208101359091169060400135610a98565b005b610338600480360360808110156102c057600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156102fa57600080fd5b82018360208201111561030c57600080fd5b803590602001918460018302840111600160201b8311171561032d57600080fd5b509092509050610b56565b604080516001600160e01b03199092168252519081900360200190f35b6102a86004803603606081101561036b57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561039e57600080fd5b8201836020820111156103b057600080fd5b803590602001918460208302840111600160201b831117156103d157600080fd5b509092509050610b67565b6102a8600480360360208110156103f257600080fd5b5035610e14565b6102a86004803603606081101561040f57600080fd5b506001600160a01b03813581169160208101359091169060400135610e19565b6102a86004803603604081101561044557600080fd5b506001600160a01b0381358116916020013516610ed6565b6102a86004803603602081101561047357600080fd5b5035611025565b6102a86004803603606081101561049057600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156104ba57600080fd5b8201836020820111156104cc57600080fd5b803590602001918460208302840111600160201b831117156104ed57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611031915050565b6102606004803603604081101561054357600080fd5b506001600160a01b0381358116916020013516611223565b6102606004803603602081101561057157600080fd5b50356001600160a01b031661132a565b6102a86004803603608081101561059757600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156105c157600080fd5b8201836020820111156105d357600080fd5b803590602001918460208302840111600160201b831117156105f457600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602001356001600160a01b0316611479565b6102606114a9565b61066e6004803603602081101561065e57600080fd5b50356001600160a01b03166114af565b604080519115158252519081900360200190f35b6102a86004803603606081101561069857600080fd5b506001600160a01b038135811691602081013591604090910135166114c2565b6102a86116ca565b610260611776565b61066e600480360360208110156106de57600080fd5b50356001600160a01b031661177c565b6102606004803603606081101561070457600080fd5b506001600160a01b038135169060208101359060400135611787565b6102a86004803603602081101561073657600080fd5b503561179c565b6102a86004803603606081101561075357600080fd5b506001600160a01b03813581169160208101359091169060400135611807565b6107a96004803603606081101561078957600080fd5b506001600160a01b03813581169160208101359091169060400135611a53565b6040805192835260208301919091528051918290030190f35b6107ca611a6d565b604080516001600160a01b039092168252519081900360200190f35b6107ca611a7c565b6102a86004803603602081101561080457600080fd5b50356001600160a01b0316611a8b565b6107ca611af6565b610824611b05565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610860578181015183820152602001610848565b505050509050019250505060405180910390f35b610260611b67565b6102606004803603602081101561089257600080fd5b5035611b6d565b610260600480360360808110156108af57600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611c9b565b6102a8600480360360608110156108e957600080fd5b506001600160a01b03813516906001600160801b0360208201358116916040013516611ed2565b610260612028565b610260612032565b6109466004803603602081101561093657600080fd5b50356001600160a01b0316612038565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b6102a86004803603602081101561098b57600080fd5b5035612068565b6102a8600480360360808110156109a857600080fd5b506001600160a01b03813581169160208101359160408201358116916060013516612071565b610260612226565b61026061239c565b6102a8600480360360208110156109f457600080fd5b50356001600160a01b03166123a2565b6107ca6124a5565b610a146124af565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610a4e578181015183820152602001610a36565b50505050905090810190601f168015610a7b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610a936124d0565b905090565b6099546001600160a01b0316610aac6125db565b6001600160a01b031614610af5576040805162461bcd60e51b815260206004820152601c60248201526000805160206140a1833981519152604482015290519081900360640190fd5b610b008383836125df565b15610b5157816001600160a01b0316836001600160a01b03167fb0bac59718cd343c80a813518afcf36846cfcfe6d56e2b3cab9bd49f5f9b251c836040518082815260200191505060405180910390a35b505050565b630a85bd0160e11b95945050505050565b6099546001600160a01b0316610b7b6125db565b6001600160a01b031614610bc4576040805162461bcd60e51b815260206004820152601c60248201526000805160206140a1833981519152604482015290519081900360640190fd5b610bcd83612667565b610c1e576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b80610c2857610e0e565b60005b81811015610d9557836001600160a01b03166342842e0e3087868686818110610c5057fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610cad57600080fd5b505af1925050508015610cbe575060015b610d8d573d808015610cec576040519150601f19603f3d011682016040523d82523d6000602084013e610cf1565b606091505b507f17e975018310f88872b58d4d8263adca83cf5c1893496ea2a86923dab15276ad816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d51578181015183820152602001610d39565b50505050905090810190601f168015610d7e5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1505b600101610c2b565b50826001600160a01b0316846001600160a01b03167f69c2de32bc4d47f488e72626a6cfdee85089342e52675e7de79c4b417623960c848460405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a35b50505050565b60a055565b6099546001600160a01b0316610e2d6125db565b6001600160a01b031614610e76576040805162461bcd60e51b815260206004820152601c60248201526000805160206140a1833981519152604482015290519081900360640190fd5b610e818383836125df565b15610b5157816001600160a01b0316836001600160a01b03167fc65f48aca3b7a99b7443d04b8ffbb073156179bc628dc3f7def5047748973469836040518082815260200191505060405180910390a3505050565b610ede6125db565b6001600160a01b0316610eef611a6d565b6001600160a01b031614610f38576040805162461bcd60e51b81526020600482018190526024820152600080516020613fea833981519152604482015290519081900360640190fd5b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f8757600080fd5b505afa158015610f9b573d6000803e3d6000fd5b505050506040513d6020811015610fb157600080fd5b5051111561102157816001600160a01b0316635c19a95c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561100857600080fd5b505af115801561101c573d6000803e3d6000fd5b505050505b5050565b61102e816126ea565b50565b600054610100900460ff168061104a575061104a612752565b80611058575060005460ff16155b6110935760405162461bcd60e51b815260040180806020018281038252602e815260200180613f9b602e913960400191505060405180910390fd5b600054610100900460ff161580156110be576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0384166111035760405162461bcd60e51b8152600401808060200182810382526022815260200180613f536022913960400191505060405180910390fd5b82518067ffffffffffffffff8111801561111c57600080fd5b50604051908082528060200260200182016040528015611146578160200160208202803683370190505b50805161115b91609891602090910190613e8a565b5060005b8181101561119257600085828151811061117557fe5b602002602001015190506111898183612763565b5060010161115f565b5061119b61288e565b6111a361293f565b6111ae6000196129d4565b609780546001600160a01b0319166001600160a01b038716908117909155609a849055604080519182526020820185905280517f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce799281900390910190a1508015610e0e576000805461ff001916905550505050565b60008161122f81612a0f565b61126e576040805162461bcd60e51b81526020600482015260176024820152600080516020614031833981519152604482015290519081900360640190fd5b6112f38484856001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112c057600080fd5b505afa1580156112d4573d6000803e3d6000fd5b505050506040513d60208110156112ea57600080fd5b50516000612acb565b50506001600160a01b039081166000908152609f60209081526040808320949093168252929092529020546001600160c01b031690565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561137b57600080fd5b505afa15801561138f573d6000803e3d6000fd5b505050506040513d60208110156113a557600080fd5b505190506001600160a01b03811633146113ff576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f6f6e6c792d7265736572766560501b604482015290519081900360640190fd5b609b80546000918290559061141382612ae1565b90506114328582611422612b42565b6001600160a01b03169190612bb8565b6040805183815290516001600160a01b038716917f1c71c8e11fd443227c8f8d3dc1a237a3a5e8310b540c7fbcf5169754aedf42c9919081900360200190a2949350505050565b611484848484611031565b60a180546001600160a01b0319166001600160a01b0392909216919091179055505050565b609d5490565b60006114ba82612667565b90505b919050565b6099546001600160a01b03166114d66125db565b6001600160a01b03161461151f576040805162461bcd60e51b815260206004820152601c60248201526000805160206140a1833981519152604482015290519081900360640190fd5b8061152981612a0f565b611568576040805162461bcd60e51b81526020600482015260176024820152600080516020614031833981519152604482015290519081900360640190fd5b8261157257610e0e565b609d548311156115c9576040805162461bcd60e51b815260206004820152601d60248201527f5072697a65506f6f6c2f61776172642d657863656564732d617661696c000000604482015290519081900360640190fd5b609d546115d69084612c0a565b609d556115e68484846000612c6c565b60006115f28385612d52565b90506116788584856001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561164657600080fd5b505afa15801561165a573d6000803e3d6000fd5b505050506040513d602081101561167057600080fd5b505184612acb565b826001600160a01b0316856001600160a01b03167fe2554529d99ab7a67db6b4cea2b32c7d55ae325f958861e05f304fdded867e31866040518082815260200191505060405180910390a35050505050565b6116d26125db565b6001600160a01b03166116e3611a6d565b6001600160a01b03161461172c576040805162461bcd60e51b81526020600482018190526024820152600080516020613fea833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b609c5481565b60006114ba82612a0f565b6000611794848484612d8a565b949350505050565b6117a46125db565b6001600160a01b03166117b5611a6d565b6001600160a01b0316146117fe576040805162461bcd60e51b81526020600482018190526024820152600080516020613fea833981519152604482015290519081900360640190fd5b61102e816129d4565b3361181181612a0f565b611850576040805162461bcd60e51b81526020600482015260176024820152600080516020614031833981519152604482015290519081900360640190fd5b6001600160a01b0384161561192a576000336001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156118ae57600080fd5b505afa1580156118c2573d6000803e3d6000fd5b505050506040513d60208110156118d857600080fd5b5051905060006118ea86338484612de4565b9050846001600160a01b0316866001600160a01b03161461191c57611919336119138487612c0a565b83612e73565b90505b611927863383612eb9565b50505b6001600160a01b038316158015906119545750836001600160a01b0316836001600160a01b031614155b156119ab576119ab8333336001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112c057600080fd5b6001600160a01b038416158015906119cd57506099546001600160a01b031615155b15610e0e576099546040805163b221095760e01b81526001600160a01b0387811660048301528681166024830152604482018690523360648301529151919092169163b221095791608480830192600092919082900301818387803b158015611a3557600080fd5b505af1158015611a49573d6000803e3d6000fd5b5050505050505050565b600080611a61858585613057565b90969095509350505050565b6033546001600160a01b031690565b6097546001600160a01b031681565b611a936125db565b6001600160a01b0316611aa4611a6d565b6001600160a01b031614611aed576040805162461bcd60e51b81526020600482018190526024820152600080516020613fea833981519152604482015290519081900360640190fd5b61102e816131f5565b6099546001600160a01b031681565b60606098805480602002602001604051908101604052809291908181526020018280548015611b5d57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b3f575b5050505050905090565b609a5481565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611bbe57600080fd5b505afa158015611bd2573d6000803e3d6000fd5b505050506040513d6020811015611be857600080fd5b505190506001600160a01b038116611c045760009150506114bd565b6000816001600160a01b031663010dfa58306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611c5357600080fd5b505afa158015611c67573d6000803e3d6000fd5b505050506040513d6020811015611c7d57600080fd5b5051905080611c91576000925050506114bd565b6117948482613308565b600060026065541415611cf5576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655582611d0481612a0f565b611d43576040805162461bcd60e51b81526020600482015260176024820152600080516020614031833981519152604482015290519081900360640190fd5b600080611d51888789613057565b9150915084821115611d945760405162461bcd60e51b815260040180806020018281038252602781526020018061400a6027913960400191505060405180910390fd5b611d9f888783613329565b856001600160a01b031663631b5dfb611db66125db565b8a8a6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611e0e57600080fd5b505af1158015611e22573d6000803e3d6000fd5b505050506000611e3b8389612c0a90919063ffffffff16565b90506000611e4882612ae1565b9050611e578a82611422612b42565b876001600160a01b03168a6001600160a01b0316611e736125db565b604080518d81526020810186905280820189905290516001600160a01b0392909216917f0271704a58fd2953e49b87d67a0a3ce28a58147de98a5457f60b4686f63850309181900360600190a450506001606555509695505050505050565b82611edc81612a0f565b611f1b576040805162461bcd60e51b81526020600482015260176024820152600080516020614031833981519152604482015290519081900360640190fd5b611f236125db565b6001600160a01b0316611f34611a6d565b6001600160a01b031614611f7d576040805162461bcd60e51b81526020600482018190526024820152600080516020613fea833981519152604482015290519081900360640190fd5b6040805180820182526001600160801b0380851680835286821660208085018281526001600160a01b038b166000818152609e84528890209651875492518716600160801b029087166fffffffffffffffffffffffffffffffff1990931692909217909516179094558451928352928201528083019190915290517ffb0ba2cf86a2b03bcf387753a2192da80a006afa99dd022bb301c78e323bf1b99181900360600190a150505050565b6000610a936133ea565b60a05481565b6001600160a01b03166000908152609e60205260409020546001600160801b0380821692600160801b9092041690565b61102181612ae1565b600260655414156120c9576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002606555816120d881612a0f565b612117576040805162461bcd60e51b81526020600482015260176024820152600080516020614031833981519152604482015290519081900360640190fd5b8361212181613444565b612172576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f657863656564732d6c69717569646974792d63617000604482015290519081900360640190fd5b600061217c6125db565b905061218a87878787612c6c565b6121a9813088612198612b42565b6001600160a01b0316929190613468565b6121b2866126ea565b846001600160a01b0316876001600160a01b0316826001600160a01b03167f6ce569498e0f86f147466ac49211cb2a1ffe06195adb805e383b3f2365109160898860405180838152602001826001600160a01b031681526020019250505060405180910390a4505060016065555050505050565b600060026065541415612280576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002606555600061228f6124d0565b9050600061229b6133ea565b905060008282116122ad5760006122b7565b6122b78284612c0a565b90506000609d5482116122cb5760006122d9565b609d546122d9908390612c0a565b9050801561238b5760006122ec82611b6d565b9050801561234657609b5461230190826134c2565b609b5561230e8282612c0a565b6040805183815290519193507f5f1703ccfa2730d4245350f228079926a37f26a44ecf6978a7eeafff0af11407919081900360200190a15b609d5461235390836134c2565b609d556040805183815290517fce2b6e507c7ca1a20ce136810f524eefc19ba4c7e4866eb6cc0cba76e778d4be9181900360200190a1505b609d54945050505050600160655590565b609b5481565b6123aa6125db565b6001600160a01b03166123bb611a6d565b6001600160a01b031614612404576040805162461bcd60e51b81526020600482018190526024820152600080516020613fea833981519152604482015290519081900360640190fd5b6001600160a01b0381166124495760405162461bcd60e51b8152600401808060200182810382526026815260200180613f066026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610a93612b42565b60405180604001604052806005815260200164332e342e3560d81b81525081565b600080609b5490506060609880548060200260200160405190810160405280929190818152602001828054801561253057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612512575b505083519394506000925050505b818110156125d2576125c883828151811061255557fe5b60200260200101516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561259557600080fd5b505afa1580156125a9573d6000803e3d6000fd5b505050506040513d60208110156125bf57600080fd5b505185906134c2565b935060010161253e565b50919250505090565b3390565b60006125ea83612667565b61263b576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b8161264857506000612660565b61265c6001600160a01b0384168584612bb8565b5060015b9392505050565b60a15460408051636a3fd4f960e01b81526001600160a01b03848116600483015291516000939290921691636a3fd4f991602480820192602092909190829003018186803b1580156126b857600080fd5b505afa1580156126cc573d6000803e3d6000fd5b505050506040513d60208110156126e257600080fd5b505192915050565b60a15460408051633540302360e01b81526004810184905290516001600160a01b039092169163354030239160248082019260009290919082900301818387803b15801561273757600080fd5b505af115801561274b573d6000803e3d6000fd5b5050505050565b600061275d3061351c565b15905090565b306001600160a01b0316826001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b1580156127a657600080fd5b505afa1580156127ba573d6000803e3d6000fd5b505050506040513d60208110156127d057600080fd5b50516001600160a01b03161461282d576040805162461bcd60e51b815260206004820152601e60248201527f5072697a65506f6f6c2f746f6b656e2d6374726c722d6d69736d617463680000604482015290519081900360640190fd5b816098828154811061283b57fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051918416917f460e712b4a5d801d031ed673dea209b73ab854f7ddeb86b6c48082e92c3eee669190a25050565b600054610100900460ff16806128a757506128a7612752565b806128b5575060005460ff16155b6128f05760405162461bcd60e51b815260040180806020018281038252602e815260200180613f9b602e913960400191505060405180910390fd5b600054610100900460ff1615801561291b576000805460ff1961ff0019909116610100171660011790555b612923613522565b61292b6135c2565b801561102e576000805461ff001916905550565b600054610100900460ff16806129585750612958612752565b80612966575060005460ff16155b6129a15760405162461bcd60e51b815260040180806020018281038252602e815260200180613f9b602e913960400191505060405180910390fd5b600054610100900460ff161580156129cc576000805460ff1961ff0019909116610100171660011790555b61292b6136bb565b609c8190556040805182815290517f3ff20538222f568f27ff436c0c49dfd3e48d5b8f86533a3f759dc1c7089775ab9181900360200190a150565b600060606098805480602002602001604051908101604052809291908181526020018280548015612a6957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612a4b575b505083519394506000925050505b81811015612ac057846001600160a01b0316838281518110612a9557fe5b60200260200101516001600160a01b03161415612ab857600193505050506114bd565b600101612a77565b506000949350505050565b610e0e8484612adc87878787612de4565b612eb9565b60a1546040805163db006a7560e01b81526004810184905290516000926001600160a01b03169163db006a7591602480830192602092919082900301818787803b158015612b2e57600080fd5b505af11580156126cc573d6000803e3d6000fd5b60a15460408051637e062a3560e11b815290516000926001600160a01b03169163fc0c546a916004808301926020929190829003018186803b158015612b8757600080fd5b505afa158015612b9b573d6000803e3d6000fd5b505050506040513d6020811015612bb157600080fd5b5051905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610b51908490613761565b600082821115612c61576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6099546001600160a01b031615612cfb57609954604080516304d7f3db60e41b81526001600160a01b038781166004830152602482018790528581166044830152848116606483015291519190921691634d7f3db091608480830192600092919082900301818387803b158015612ce257600080fd5b505af1158015612cf6573d6000803e3d6000fd5b505050505b816001600160a01b0316635d7b075885856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611a3557600080fd5b6001600160a01b0382166000908152609e6020526040812054612660908390612d859082906001600160801b0316613308565b613812565b6001600160a01b0383166000908152609e60205260408120548190612dc0908590600160801b90046001600160801b0316613308565b905080612dd1576000915050612660565b612ddb8382613837565b95945050505050565b6001600160a01b038381166000908152609f6020908152604080832093881683529290529081208054829190600160e01b900460ff16612e275760009150612e69565b6000612e3488888861389e565b8254909150612e659088908890612e60908990612e5a906001600160c01b0316876134c2565b906134c2565b612e73565b9250505b5095945050505050565b6001600160a01b0383166000908152609e60205260408120548190612ea29085906001600160801b0316613308565b905080831115612eb0578092505b50909392505050565b6001600160a01b038083166000908152609f602090815260408083209387168352929052819020548151606081019092526001600160c01b03169080612efe8461394f565b6001600160801b03168152602001612f1c612f17613997565b61399d565b63ffffffff908116825260016020928301526001600160a01b038681166000908152609f84526040808220928a168252918452819020845181549486015195909201516001600160c01b03199094166001600160c01b039092169190911763ffffffff60c01b1916600160c01b94909216939093021760ff60e01b1916600160e01b9115159190910217905581811015612fff576001600160a01b038084169085167f2f92d56910619b38bc29fd8e4ca5e56359edac7a0c086cdcd305fb603fa37491612fe98585612c0a565b60408051918252519081900360200190a3610e0e565b80821015610e0e576001600160a01b038084169085167ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf6130408486612c0a565b60408051918252519081900360200190a350505050565b6000806000846001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156130a957600080fd5b505afa1580156130bd573d6000803e3d6000fd5b505050506040513d60208110156130d357600080fd5b5051905083811015613125576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f696e737566662d66756e647360501b604482015290519081900360640190fd5b6131328686836000612acb565b6000613147866131428488612c0a565b612d52565b6001600160a01b038088166000908152609f60209081526040808320938c16835292905290812054919250906001600160c01b031682116131be576001600160a01b038088166000908152609f60209081526040808320938c16835292905220546131bb906001600160c01b031683612c0a565b90505b60006131ca8888612d52565b90508082116131d957816131db565b805b94506131e78186612c0a565b955050505050935093915050565b6001600160a01b038116613250576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f7072697a6553747261746567792d6e6f742d7a65726f604482015290519081900360640190fd5b61326d6001600160a01b038216600162a1cb1960e01b03196139e1565b6132be576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f7072697a6553747261746567792d696e76616c696400604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0383169081179091556040517f7f58dc86bc2e435cb77ca0edb1df55e25f90caf2d6bd866971715437d456a21290600090a250565b60008061331583856139fd565b905061179481670de0b6b3a7640000613a56565b6001600160a01b038083166000908152609f602090815260408083209387168352929052205461336b90613366906001600160c01b031683612c0a565b61394f565b6001600160a01b038084166000818152609f602090815260408083209489168084529482529182902080546001600160c01b0319166001600160801b0396909616959095179094558051858152905191937ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf92918290030190a3505050565b60a154604080516316d3df1560e31b815290516000926001600160a01b03169163b69ef8a891600480830192602092919082900301818787803b15801561343057600080fd5b505af1158015612b9b573d6000803e3d6000fd5b60008061344f6124d0565b609c5490915061345f82856134c2565b11159392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610e0e908590613761565b600082820183811015612660576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3b151590565b600054610100900460ff168061353b575061353b612752565b80613549575060005460ff16155b6135845760405162461bcd60e51b815260040180806020018281038252602e815260200180613f9b602e913960400191505060405180910390fd5b600054610100900460ff1615801561292b576000805460ff1961ff001990911661010017166001179055801561102e576000805461ff001916905550565b600054610100900460ff16806135db57506135db612752565b806135e9575060005460ff16155b6136245760405162461bcd60e51b815260040180806020018281038252602e815260200180613f9b602e913960400191505060405180910390fd5b600054610100900460ff1615801561364f576000805460ff1961ff0019909116610100171660011790555b60006136596125db565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561102e576000805461ff001916905550565b600054610100900460ff16806136d457506136d4612752565b806136e2575060005460ff16155b61371d5760405162461bcd60e51b815260040180806020018281038252602e815260200180613f9b602e913960400191505060405180910390fd5b600054610100900460ff16158015613748576000805460ff1961ff0019909116610100171660011790555b6001606555801561102e576000805461ff001916905550565b60606137b6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a989092919063ffffffff16565b805190915015610b51578080602001905160208110156137d557600080fd5b5051610b515760405162461bcd60e51b815260040180806020018281038252602a815260200180614077602a913960400191505060405180910390fd5b60008061382184609a54613308565b90508083111561382f578092505b509092915050565b600080821161388d576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161389657fe5b049392505050565b6001600160a01b038281166000908152609f60209081526040808320938716835292905290812054600160c01b810463ffffffff1690600160e01b900460ff166138ec576000915050612660565b6000613900826138fa613997565b90612c0a565b6001600160a01b0386166000908152609e602052604081205491925090613938908390600160801b90046001600160801b03166139fd565b90506139448582613308565b979650505050505050565b6000600160801b82106139935760405162461bcd60e51b8152600401808060200182810382526027815260200180613f2c6027913960400191505060405180910390fd5b5090565b60a05490565b6000600160201b82106139935760405162461bcd60e51b81526004018080602001828103825260268152602001806140516026913960400191505060405180910390fd5b60006139ec83613aa7565b801561266057506126608383613ada565b600082613a0c57506000612c66565b82820282848281613a1957fe5b04146126605760405162461bcd60e51b8152600401808060200182810382526021815260200180613fc96021913960400191505060405180910390fd5b600061266083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613afd565b60606117948484600085613b9f565b6000613aba826301ffc9a760e01b613ada565b80156114ba5750613ad3826001600160e01b0319613ada565b1592915050565b6000806000613ae98585613cf0565b91509150818015612ddb5750949350505050565b60008183613b895760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b4e578181015183820152602001613b36565b50505050905090810190601f168015613b7b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613b9557fe5b0495945050505050565b606082471015613be05760405162461bcd60e51b8152600401808060200182810382526026815260200180613f756026913960400191505060405180910390fd5b613be98561351c565b613c3a576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613c795780518252601f199092019160209182019101613c5a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613cdb576040519150601f19603f3d011682016040523d82523d6000602084013e613ce0565b606091505b5091509150613944828286613e24565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b1781529151815160009384939284926060926001600160a01b038a169261753092879282918083835b60208310613d785780518252601f199092019160209182019101613d59565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114613dd9576040519150601f19603f3d011682016040523d82523d6000602084013e613dde565b606091505b5091509150602081511015613dfc5760008094509450505050613e1d565b81818060200190516020811015613e1257600080fd5b505190955093505050505b9250929050565b60608315613e33575081612660565b825115613e435782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315613b4e578181015183820152602001613b36565b828054828255906000526020600020908101928215613edf579160200282015b82811115613edf57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613eaa565b506139939291505b808211156139935780546001600160a01b0319168155600101613ee756fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e2031323820626974735072697a65506f6f6c2f7265736572766552656769737472792d6e6f742d7a65726f416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725072697a65506f6f6c2f657869742d6665652d657863656564732d757365722d6d6178696d756d5072697a65506f6f6c2f756e6b6e6f776e2d746f6b656e00000000000000000053616665436173743a2076616c756520646f65736e27742066697420696e20333220626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645072697a65506f6f6c2f6f6e6c792d7072697a65537472617465677900000000a264697066735822122065cb33f64edf8c379ec66f9728e5e980805796e610b5023d0c212036c869eafc64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x253 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x7CBAB1C7 GT PUSH2 0x146 JUMPI DUP1 PUSH4 0xA7B2CC31 GT PUSH2 0xC3 JUMPI DUP1 PUSH4 0xE323F825 GT PUSH2 0x87 JUMPI DUP1 PUSH4 0xE323F825 EQ PUSH2 0x992 JUMPI DUP1 PUSH4 0xE6D8A94B EQ PUSH2 0x9CE JUMPI DUP1 PUSH4 0xEDB4E1CF EQ PUSH2 0x9D6 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x9DE JUMPI DUP1 PUSH4 0xFC0C546A EQ PUSH2 0xA04 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0xA0C JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0xA7B2CC31 EQ PUSH2 0x8D3 JUMPI DUP1 PUSH4 0xB69EF8A8 EQ PUSH2 0x910 JUMPI DUP1 PUSH4 0xD18E81B3 EQ PUSH2 0x918 JUMPI DUP1 PUSH4 0xD4A1361D EQ PUSH2 0x920 JUMPI DUP1 PUSH4 0xDB006A75 EQ PUSH2 0x975 JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x98BF3EB6 GT PUSH2 0x10A JUMPI DUP1 PUSH4 0x98BF3EB6 EQ PUSH2 0x814 JUMPI DUP1 PUSH4 0x9D63848A EQ PUSH2 0x81C JUMPI DUP1 PUSH4 0x9E167519 EQ PUSH2 0x874 JUMPI DUP1 PUSH4 0x9FE32A91 EQ PUSH2 0x87C JUMPI DUP1 PUSH4 0xA016240B EQ PUSH2 0x899 JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x7CBAB1C7 EQ PUSH2 0x73D JUMPI DUP1 PUSH4 0x888C2B6F EQ PUSH2 0x773 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x7C2 JUMPI DUP1 PUSH4 0x8E71C1F6 EQ PUSH2 0x7E6 JUMPI DUP1 PUSH4 0x91CA480E EQ PUSH2 0x7EE JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x52A387AB GT PUSH2 0x1D4 JUMPI DUP1 PUSH4 0x715018A6 GT PUSH2 0x198 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x6B8 JUMPI DUP1 PUSH4 0x76687D3D EQ PUSH2 0x6C0 JUMPI DUP1 PUSH4 0x78B3D327 EQ PUSH2 0x6C8 JUMPI DUP1 PUSH4 0x79CB8563 EQ PUSH2 0x6EE JUMPI DUP1 PUSH4 0x7B99ADB1 EQ PUSH2 0x720 JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x52A387AB EQ PUSH2 0x55B JUMPI DUP1 PUSH4 0x610C75EA EQ PUSH2 0x581 JUMPI DUP1 PUSH4 0x630665B4 EQ PUSH2 0x640 JUMPI DUP1 PUSH4 0x6A3FD4F9 EQ PUSH2 0x648 JUMPI DUP1 PUSH4 0x6B1B863A EQ PUSH2 0x682 JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x2B0AB144 GT PUSH2 0x21B JUMPI DUP1 PUSH4 0x2B0AB144 EQ PUSH2 0x3F9 JUMPI DUP1 PUSH4 0x2F7627E3 EQ PUSH2 0x42F JUMPI DUP1 PUSH4 0x35403023 EQ PUSH2 0x45D JUMPI DUP1 PUSH4 0x3EDE50C6 EQ PUSH2 0x47A JUMPI DUP1 PUSH4 0x494DE9F7 EQ PUSH2 0x52D JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x937EB54 EQ PUSH2 0x258 JUMPI DUP1 PUSH4 0x13F55E39 EQ PUSH2 0x272 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x2AA JUMPI DUP1 PUSH4 0x16960D55 EQ PUSH2 0x355 JUMPI DUP1 PUSH4 0x22F8E566 EQ PUSH2 0x3DC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x260 PUSH2 0xA89 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x288 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xA98 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x338 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x2C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x2FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x30C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x32D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xB56 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x36B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x39E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x3B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x3D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xB67 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xE14 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x40F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xE19 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x445 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xED6 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x473 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1025 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x490 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x4BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x4CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x4ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0x1031 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x543 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x1223 JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x571 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x132A JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x597 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x5C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x5D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x5F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1479 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x14A9 JUMP JUMPDEST PUSH2 0x66E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x65E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x14AF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x698 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 SWAP1 SWAP2 ADD CALLDATALOAD AND PUSH2 0x14C2 JUMP JUMPDEST PUSH2 0x2A8 PUSH2 0x16CA JUMP JUMPDEST PUSH2 0x260 PUSH2 0x1776 JUMP JUMPDEST PUSH2 0x66E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x177C JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x704 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1787 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x736 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x179C JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x753 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1807 JUMP JUMPDEST PUSH2 0x7A9 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x789 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1A53 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB ADD SWAP1 RETURN JUMPDEST PUSH2 0x7CA PUSH2 0x1A6D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x7CA PUSH2 0x1A7C JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x804 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A8B JUMP JUMPDEST PUSH2 0x7CA PUSH2 0x1AF6 JUMP JUMPDEST PUSH2 0x824 PUSH2 0x1B05 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x860 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x848 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x260 PUSH2 0x1B67 JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x892 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1B6D JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x8AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x1C9B JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x8E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x40 ADD CALLDATALOAD AND PUSH2 0x1ED2 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x2028 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x2032 JUMP JUMPDEST PUSH2 0x946 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x936 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2038 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x98B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x2068 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x9A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x2071 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x2226 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x239C JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x9F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x23A2 JUMP JUMPDEST PUSH2 0x7CA PUSH2 0x24A5 JUMP JUMPDEST PUSH2 0xA14 PUSH2 0x24AF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xA4E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xA36 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xA7B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xA93 PUSH2 0x24D0 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xAAC PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xAF5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x40A1 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xB00 DUP4 DUP4 DUP4 PUSH2 0x25DF JUMP JUMPDEST ISZERO PUSH2 0xB51 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB0BAC59718CD343C80A813518AFCF36846CFCFE6D56E2B3CAB9BD49F5F9B251C DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0xA85BD01 PUSH1 0xE1 SHL SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xB7B PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xBC4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x40A1 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xBCD DUP4 PUSH2 0x2667 JUMP JUMPDEST PUSH2 0xC1E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0xC28 JUMPI PUSH2 0xE0E JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xD95 JUMPI DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x42842E0E ADDRESS DUP8 DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0xC50 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0xCBE JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xD8D JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0xCEC JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xCF1 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH32 0x17E975018310F88872B58D4D8263ADCA83CF5C1893496EA2A86923DAB15276AD DUP2 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD51 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD39 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD7E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xC2B JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x69C2DE32BC4D47F488E72626A6CFDEE85089342E52675E7DE79C4B417623960C DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP6 POP SWAP1 SWAP4 POP POP POP POP LOG3 JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0xA0 SSTORE JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE2D PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xE76 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x40A1 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xE81 DUP4 DUP4 DUP4 PUSH2 0x25DF JUMP JUMPDEST ISZERO PUSH2 0xB51 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC65F48ACA3B7A99B7443D04B8FFBB073156179BC628DC3F7DEF5047748973469 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH2 0xEDE PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xEEF PUSH2 0x1A6D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xF38 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FEA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF87 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xF9B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xFB1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD GT ISZERO PUSH2 0x1021 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5C19A95C DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1008 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x101C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x102E DUP2 PUSH2 0x26EA JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x104A JUMPI POP PUSH2 0x104A PUSH2 0x2752 JUMP JUMPDEST DUP1 PUSH2 0x1058 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1093 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F9B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x10BE JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x1103 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F53 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 MLOAD DUP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x111C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1146 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP1 MLOAD PUSH2 0x115B SWAP2 PUSH1 0x98 SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x3E8A JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1192 JUMPI PUSH1 0x0 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1175 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0x1189 DUP2 DUP4 PUSH2 0x2763 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x115F JUMP JUMPDEST POP PUSH2 0x119B PUSH2 0x288E JUMP JUMPDEST PUSH2 0x11A3 PUSH2 0x293F JUMP JUMPDEST PUSH2 0x11AE PUSH1 0x0 NOT PUSH2 0x29D4 JUMP JUMPDEST PUSH1 0x97 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x9A DUP5 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP6 SWAP1 MSTORE DUP1 MLOAD PUSH32 0x25FF68DD81B34665B5BA7E553EE5511BF6812E12ADB4A7E2C0D9E26B3099CE79 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 POP DUP1 ISZERO PUSH2 0xE0E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x122F DUP2 PUSH2 0x2A0F JUMP JUMPDEST PUSH2 0x126E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4031 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x12F3 DUP5 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x12D4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x12EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 PUSH2 0x2ACB JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP4 AND DUP3 MSTORE SWAP3 SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x137B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x138F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x13A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ PUSH2 0x13FF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F6F6E6C792D72657365727665 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9B DUP1 SLOAD PUSH1 0x0 SWAP2 DUP3 SWAP1 SSTORE SWAP1 PUSH2 0x1413 DUP3 PUSH2 0x2AE1 JUMP JUMPDEST SWAP1 POP PUSH2 0x1432 DUP6 DUP3 PUSH2 0x1422 PUSH2 0x2B42 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x2BB8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP2 PUSH32 0x1C71C8E11FD443227C8F8D3DC1A237A3A5E8310B540C7FBCF5169754AEDF42C9 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1484 DUP5 DUP5 DUP5 PUSH2 0x1031 JUMP JUMPDEST PUSH1 0xA1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x9D SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14BA DUP3 PUSH2 0x2667 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x14D6 PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x151F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x40A1 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x1529 DUP2 PUSH2 0x2A0F JUMP JUMPDEST PUSH2 0x1568 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4031 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 PUSH2 0x1572 JUMPI PUSH2 0xE0E JUMP JUMPDEST PUSH1 0x9D SLOAD DUP4 GT ISZERO PUSH2 0x15C9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F61776172642D657863656564732D617661696C000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x15D6 SWAP1 DUP5 PUSH2 0x2C0A JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH2 0x15E6 DUP5 DUP5 DUP5 PUSH1 0x0 PUSH2 0x2C6C JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15F2 DUP4 DUP6 PUSH2 0x2D52 JUMP JUMPDEST SWAP1 POP PUSH2 0x1678 DUP6 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1646 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x165A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1670 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP5 PUSH2 0x2ACB JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xE2554529D99AB7A67DB6B4CEA2B32C7D55AE325F958861E05F304FDDED867E31 DUP7 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x16D2 PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16E3 PUSH2 0x1A6D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x172C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FEA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x14BA DUP3 PUSH2 0x2A0F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1794 DUP5 DUP5 DUP5 PUSH2 0x2D8A JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x17A4 PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x17B5 PUSH2 0x1A6D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x17FE JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FEA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x102E DUP2 PUSH2 0x29D4 JUMP JUMPDEST CALLER PUSH2 0x1811 DUP2 PUSH2 0x2A0F JUMP JUMPDEST PUSH2 0x1850 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4031 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO PUSH2 0x192A JUMPI PUSH1 0x0 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP7 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x18C2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x18D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x18EA DUP7 CALLER DUP5 DUP5 PUSH2 0x2DE4 JUMP JUMPDEST SWAP1 POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x191C JUMPI PUSH2 0x1919 CALLER PUSH2 0x1913 DUP5 DUP8 PUSH2 0x2C0A JUMP JUMPDEST DUP4 PUSH2 0x2E73 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x1927 DUP7 CALLER DUP4 PUSH2 0x2EB9 JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1954 JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x19AB JUMPI PUSH2 0x19AB DUP4 CALLER CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x19CD JUMPI POP PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xE0E JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP7 SWAP1 MSTORE CALLER PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xB2210957 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1A35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1A49 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1A61 DUP6 DUP6 DUP6 PUSH2 0x3057 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x97 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1A93 PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1AA4 PUSH2 0x1A6D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1AED JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FEA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x102E DUP2 PUSH2 0x31F5 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1B5D JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1B3F JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1BBE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1BD2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1BE8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1C04 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x14BD JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x10DFA58 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C67 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1C7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x1C91 JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x14BD JUMP JUMPDEST PUSH2 0x1794 DUP5 DUP3 PUSH2 0x3308 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x1CF5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP3 PUSH2 0x1D04 DUP2 PUSH2 0x2A0F JUMP JUMPDEST PUSH2 0x1D43 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4031 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1D51 DUP9 DUP8 DUP10 PUSH2 0x3057 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0x1D94 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x400A PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1D9F DUP9 DUP8 DUP4 PUSH2 0x3329 JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x631B5DFB PUSH2 0x1DB6 PUSH2 0x25DB JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E0E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E22 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 PUSH2 0x1E3B DUP4 DUP10 PUSH2 0x2C0A SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1E48 DUP3 PUSH2 0x2AE1 JUMP JUMPDEST SWAP1 POP PUSH2 0x1E57 DUP11 DUP3 PUSH2 0x1422 PUSH2 0x2B42 JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E73 PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP14 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE DUP1 DUP3 ADD DUP10 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x271704A58FD2953E49B87D67A0A3CE28A58147DE98A5457F60B4686F6385030 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH2 0x1EDC DUP2 PUSH2 0x2A0F JUMP JUMPDEST PUSH2 0x1F1B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4031 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1F23 PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1F34 PUSH2 0x1A6D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1F7D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FEA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP6 AND DUP1 DUP4 MSTORE DUP7 DUP3 AND PUSH1 0x20 DUP1 DUP6 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9E DUP5 MSTORE DUP9 SWAP1 KECCAK256 SWAP7 MLOAD DUP8 SLOAD SWAP3 MLOAD DUP8 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP1 DUP8 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP6 AND OR SWAP1 SWAP5 SSTORE DUP5 MLOAD SWAP3 DUP4 MSTORE SWAP3 DUP3 ADD MSTORE DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 MLOAD PUSH32 0xFB0BA2CF86A2B03BCF387753A2192DA80A006AFA99DD022BB301C78E323BF1B9 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA93 PUSH2 0x33EA JUMP JUMPDEST PUSH1 0xA0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP3 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND SWAP1 JUMP JUMPDEST PUSH2 0x1021 DUP2 PUSH2 0x2AE1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x20C9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP2 PUSH2 0x20D8 DUP2 PUSH2 0x2A0F JUMP JUMPDEST PUSH2 0x2117 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4031 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP4 PUSH2 0x2121 DUP2 PUSH2 0x3444 JUMP JUMPDEST PUSH2 0x2172 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F657863656564732D6C69717569646974792D63617000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x217C PUSH2 0x25DB JUMP JUMPDEST SWAP1 POP PUSH2 0x218A DUP8 DUP8 DUP8 DUP8 PUSH2 0x2C6C JUMP JUMPDEST PUSH2 0x21A9 DUP2 ADDRESS DUP9 PUSH2 0x2198 PUSH2 0x2B42 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 SWAP1 PUSH2 0x3468 JUMP JUMPDEST PUSH2 0x21B2 DUP7 PUSH2 0x26EA JUMP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6CE569498E0F86F147466AC49211CB2A1FFE06195ADB805E383B3F2365109160 DUP10 DUP9 PUSH1 0x40 MLOAD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x2280 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE PUSH1 0x0 PUSH2 0x228F PUSH2 0x24D0 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x229B PUSH2 0x33EA JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 DUP3 GT PUSH2 0x22AD JUMPI PUSH1 0x0 PUSH2 0x22B7 JUMP JUMPDEST PUSH2 0x22B7 DUP3 DUP5 PUSH2 0x2C0A JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x9D SLOAD DUP3 GT PUSH2 0x22CB JUMPI PUSH1 0x0 PUSH2 0x22D9 JUMP JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x22D9 SWAP1 DUP4 SWAP1 PUSH2 0x2C0A JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x238B JUMPI PUSH1 0x0 PUSH2 0x22EC DUP3 PUSH2 0x1B6D JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x2346 JUMPI PUSH1 0x9B SLOAD PUSH2 0x2301 SWAP1 DUP3 PUSH2 0x34C2 JUMP JUMPDEST PUSH1 0x9B SSTORE PUSH2 0x230E DUP3 DUP3 PUSH2 0x2C0A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 POP PUSH32 0x5F1703CCFA2730D4245350F228079926A37F26A44ECF6978A7EEAFFF0AF11407 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x2353 SWAP1 DUP4 PUSH2 0x34C2 JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xCE2B6E507C7CA1A20CE136810F524EEFC19BA4C7E4866EB6CC0CBA76E778D4BE SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH1 0x9D SLOAD SWAP5 POP POP POP POP POP PUSH1 0x1 PUSH1 0x65 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x9B SLOAD DUP2 JUMP JUMPDEST PUSH2 0x23AA PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x23BB PUSH2 0x1A6D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2404 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FEA DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x2449 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F06 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA93 PUSH2 0x2B42 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x9B SLOAD SWAP1 POP PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2530 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2512 JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x25D2 JUMPI PUSH2 0x25C8 DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2555 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2595 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x25A9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x25BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP6 SWAP1 PUSH2 0x34C2 JUMP JUMPDEST SWAP4 POP PUSH1 0x1 ADD PUSH2 0x253E JUMP JUMPDEST POP SWAP2 SWAP3 POP POP POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x25EA DUP4 PUSH2 0x2667 JUMP JUMPDEST PUSH2 0x263B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x2648 JUMPI POP PUSH1 0x0 PUSH2 0x2660 JUMP JUMPDEST PUSH2 0x265C PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP6 DUP5 PUSH2 0x2BB8 JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x6A3FD4F9 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP2 MLOAD PUSH1 0x0 SWAP4 SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH4 0x6A3FD4F9 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x26B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x26CC JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x26E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0xA1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x35403023 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x35403023 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2737 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x274B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x275D ADDRESS PUSH2 0x351C JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF77C4791 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x27A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x27BA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x27D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x282D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F746F6B656E2D6374726C722D6D69736D617463680000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x98 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x283B JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 DUP5 AND SWAP2 PUSH32 0x460E712B4A5D801D031ED673DEA209B73AB854F7DDEB86B6C48082E92C3EEE66 SWAP2 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x28A7 JUMPI POP PUSH2 0x28A7 PUSH2 0x2752 JUMP JUMPDEST DUP1 PUSH2 0x28B5 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x28F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F9B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x291B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2923 PUSH2 0x3522 JUMP JUMPDEST PUSH2 0x292B PUSH2 0x35C2 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x102E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2958 JUMPI POP PUSH2 0x2958 PUSH2 0x2752 JUMP JUMPDEST DUP1 PUSH2 0x2966 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x29A1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F9B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x29CC JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x292B PUSH2 0x36BB JUMP JUMPDEST PUSH1 0x9C DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3FF20538222F568F27FF436C0C49DFD3E48D5B8F86533A3F759DC1C7089775AB SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2A69 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2A4B JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2AC0 JUMPI DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2A95 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x2AB8 JUMPI PUSH1 0x1 SWAP4 POP POP POP POP PUSH2 0x14BD JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2A77 JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xE0E DUP5 DUP5 PUSH2 0x2ADC DUP8 DUP8 DUP8 DUP8 PUSH2 0x2DE4 JUMP JUMPDEST PUSH2 0x2EB9 JUMP JUMPDEST PUSH1 0xA1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xDB006A75 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xDB006A75 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2B2E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x26CC JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0xA1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x7E062A35 PUSH1 0xE1 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xFC0C546A SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2B87 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2B9B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2BB1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xB51 SWAP1 DUP5 SWAP1 PUSH2 0x3761 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2C61 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2CFB JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE DUP6 DUP2 AND PUSH1 0x44 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x4D7F3DB0 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2CE2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2CF6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5D7B0758 DUP6 DUP6 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1A35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x2660 SWAP1 DUP4 SWAP1 PUSH2 0x2D85 SWAP1 DUP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3308 JUMP JUMPDEST PUSH2 0x3812 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2DC0 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3308 JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x2DD1 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x2660 JUMP JUMPDEST PUSH2 0x2DDB DUP4 DUP3 PUSH2 0x3837 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP3 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x2E27 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x2E69 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2E34 DUP9 DUP9 DUP9 PUSH2 0x389E JUMP JUMPDEST DUP3 SLOAD SWAP1 SWAP2 POP PUSH2 0x2E65 SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x2E60 SWAP1 DUP10 SWAP1 PUSH2 0x2E5A SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP8 PUSH2 0x34C2 JUMP JUMPDEST SWAP1 PUSH2 0x34C2 JUMP JUMPDEST PUSH2 0x2E73 JUMP JUMPDEST SWAP3 POP POP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2EA2 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3308 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x2EB0 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE DUP2 SWAP1 KECCAK256 SLOAD DUP2 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 DUP1 PUSH2 0x2EFE DUP5 PUSH2 0x394F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2F1C PUSH2 0x2F17 PUSH2 0x3997 JUMP JUMPDEST PUSH2 0x399D JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP3 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 DUP11 AND DUP3 MSTORE SWAP2 DUP5 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP5 DUP7 ADD MLOAD SWAP6 SWAP1 SWAP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH4 0xFFFFFFFF PUSH1 0xC0 SHL NOT AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP5 SWAP1 SWAP3 AND SWAP4 SWAP1 SWAP4 MUL OR PUSH1 0xFF PUSH1 0xE0 SHL NOT AND PUSH1 0x1 PUSH1 0xE0 SHL SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE DUP2 DUP2 LT ISZERO PUSH2 0x2FFF JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0x2F92D56910619B38BC29FD8E4CA5E56359EDAC7A0C086CDCD305FB603FA37491 PUSH2 0x2FE9 DUP6 DUP6 PUSH2 0x2C0A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 PUSH2 0xE0E JUMP JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0xE0E JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF PUSH2 0x3040 DUP5 DUP7 PUSH2 0x2C0A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x30A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x30BD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x30D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x3125 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F696E737566662D66756E6473 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x3132 DUP7 DUP7 DUP4 PUSH1 0x0 PUSH2 0x2ACB JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3147 DUP7 PUSH2 0x3142 DUP5 DUP9 PUSH2 0x2C0A JUMP JUMPDEST PUSH2 0x2D52 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP3 GT PUSH2 0x31BE JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x31BB SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2C0A JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x31CA DUP9 DUP9 PUSH2 0x2D52 JUMP JUMPDEST SWAP1 POP DUP1 DUP3 GT PUSH2 0x31D9 JUMPI DUP2 PUSH2 0x31DB JUMP JUMPDEST DUP1 JUMPDEST SWAP5 POP PUSH2 0x31E7 DUP2 DUP7 PUSH2 0x2C0A JUMP JUMPDEST SWAP6 POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x3250 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D6E6F742D7A65726F PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x326D PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x39E1 JUMP JUMPDEST PUSH2 0x32BE JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D696E76616C696400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x99 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x7F58DC86BC2E435CB77CA0EDB1DF55E25F90CAF2D6BD866971715437D456A212 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3315 DUP4 DUP6 PUSH2 0x39FD JUMP JUMPDEST SWAP1 POP PUSH2 0x1794 DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x3A56 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x336B SWAP1 PUSH2 0x3366 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2C0A JUMP JUMPDEST PUSH2 0x394F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0xA1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x16D3DF15 PUSH1 0xE3 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xB69EF8A8 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3430 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2B9B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x344F PUSH2 0x24D0 JUMP JUMPDEST PUSH1 0x9C SLOAD SWAP1 SWAP2 POP PUSH2 0x345F DUP3 DUP6 PUSH2 0x34C2 JUMP JUMPDEST GT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x24 DUP4 ADD MSTORE DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x84 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xE0E SWAP1 DUP6 SWAP1 PUSH2 0x3761 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x2660 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x353B JUMPI POP PUSH2 0x353B PUSH2 0x2752 JUMP JUMPDEST DUP1 PUSH2 0x3549 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3584 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F9B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x292B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x102E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x35DB JUMPI POP PUSH2 0x35DB PUSH2 0x2752 JUMP JUMPDEST DUP1 PUSH2 0x35E9 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3624 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F9B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x364F JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x3659 PUSH2 0x25DB JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x102E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x36D4 JUMPI POP PUSH2 0x36D4 PUSH2 0x2752 JUMP JUMPDEST DUP1 PUSH2 0x36E2 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x371D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F9B PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3748 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x65 SSTORE DUP1 ISZERO PUSH2 0x102E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x37B6 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3A98 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xB51 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x37D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xB51 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4077 PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3821 DUP5 PUSH1 0x9A SLOAD PUSH2 0x3308 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x382F JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x388D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x3896 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xC0 SHL DUP2 DIV PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x38EC JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x2660 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3900 DUP3 PUSH2 0x38FA PUSH2 0x3997 JUMP JUMPDEST SWAP1 PUSH2 0x2C0A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x3938 SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x39FD JUMP JUMPDEST SWAP1 POP PUSH2 0x3944 DUP6 DUP3 PUSH2 0x3308 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x3993 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F2C PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0xA0 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x20 SHL DUP3 LT PUSH2 0x3993 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4051 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x39EC DUP4 PUSH2 0x3AA7 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x2660 JUMPI POP PUSH2 0x2660 DUP4 DUP4 PUSH2 0x3ADA JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3A0C JUMPI POP PUSH1 0x0 PUSH2 0x2C66 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x3A19 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x2660 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3FC9 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2660 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x3AFD JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1794 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x3B9F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3ABA DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3ADA JUMP JUMPDEST DUP1 ISZERO PUSH2 0x14BA JUMPI POP PUSH2 0x3AD3 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3ADA JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x3AE9 DUP6 DUP6 PUSH2 0x3CF0 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x2DDB JUMPI POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x3B89 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3B4E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3B36 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3B7B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x3B95 JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x3BE0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F75 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3BE9 DUP6 PUSH2 0x351C JUMP JUMPDEST PUSH2 0x3C3A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3C79 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3C5A JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3CDB JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3CE0 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x3944 DUP3 DUP3 DUP7 PUSH2 0x3E24 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x24 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP3 DUP5 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND SWAP3 PUSH2 0x7530 SWAP3 DUP8 SWAP3 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3D78 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3D59 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3DD9 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3DDE JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x3DFC JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x3E1D JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3E12 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x3E33 JUMPI POP DUP2 PUSH2 0x2660 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x3E43 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x3B4E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3B36 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x3EDF JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x3EDF JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x3EAA JUMP JUMPDEST POP PUSH2 0x3993 SWAP3 SWAP2 POP JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x3993 JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x3EE7 JUMP INVALID 0x4F PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F206164647265737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E2031323820626974735072697A65 POP PUSH16 0x6F6C2F72657365727665526567697374 PUSH19 0x792D6E6F742D7A65726F416464726573733A20 PUSH10 0x6E73756666696369656E PUSH21 0x2062616C616E636520666F722063616C6C496E6974 PUSH10 0x616C697A61626C653A20 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 MSTORE8 PUSH2 0x6665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F774F776E61626C653A20 PUSH4 0x616C6C65 PUSH19 0x206973206E6F7420746865206F776E65725072 PUSH10 0x7A65506F6F6C2F657869 PUSH21 0x2D6665652D657863656564732D757365722D6D6178 PUSH10 0x6D756D5072697A65506F PUSH16 0x6C2F756E6B6E6F776E2D746F6B656E00 STOP STOP STOP STOP STOP STOP STOP STOP MSTORE8 PUSH2 0x6665 NUMBER PUSH2 0x7374 GASPRICE KECCAK256 PUSH23 0x616C756520646F65736E27742066697420696E20333220 PUSH3 0x697473 MSTORE8 PUSH2 0x6665 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x7563636565645072697A65506F6F6C2F6F6E6C79 0x2D PUSH17 0x72697A65537472617465677900000000A2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH6 0xCB33F64EDF8C CALLDATACOPY SWAP15 0xC6 PUSH16 0x9728E5E980805796E610B5023D0C2120 CALLDATASIZE 0xC8 PUSH10 0xEAFC64736F6C63430006 0xC STOP CALLER ",
              "sourceMap": "96:1450:77:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31480:106:39;;;:::i;:::-;;;;;;;;;;;;;;;;14958:270;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14958:270:39;;;;;;;;;;;;;;;;;:::i;:::-;;32298:200;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32298:200:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32298:200:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32298:200:39;;;;;;;;;;-1:-1:-1;32298:200:39;;-1:-1:-1;32298:200:39;-1:-1:-1;32298:200:39;:::i;:::-;;;;-1:-1:-1;;;;;;32298:200:39;;;;;;;;;;;;;;17185:617;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17185:617:39;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17185:617:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17185:617:39;;;;;;;;;;-1:-1:-1;17185:617:39;;-1:-1:-1;17185:617:39;-1:-1:-1;17185:617:39;:::i;734:92:77:-;;;;;;;;;;;;;;;;-1:-1:-1;734:92:77;;:::i;15586:263:39:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15586:263:39;;;;;;;;;;;;;;;;;:::i;31811:166::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31811:166:39;;;;;;;;;;:::i;572:75:77:-;;;;;;;;;;;;;;;;-1:-1:-1;572:75:77;;:::i;5948:860:39:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5948:860:39;;;;;;;;;;;;;;;-1:-1:-1;;;5948:860:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5948:860:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5948:860:39;;-1:-1:-1;;5948:860:39;;;-1:-1:-1;5948:860:39;;-1:-1:-1;;5948:860:39:i;25409:303::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25409:303:39;;;;;;;;;;:::i;13277:314::-;;;;;;;;;;;;;;;;-1:-1:-1;13277:314:39;-1:-1:-1;;;;;13277:314:39;;:::i;207:361:77:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;207:361:77;;;;;;;;;;;;;;;-1:-1:-1;;;207:361:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;207:361:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;207:361:77;;-1:-1:-1;;207:361:77;;;-1:-1:-1;;;207:361:77;;;-1:-1:-1;;;;;207:361:77;;:::i;11940:103:39:-;;;:::i;7465:130::-;;;;;;;;;;;;;;;;-1:-1:-1;7465:130:39;-1:-1:-1;;;;;7465:130:39;;:::i;:::-;;;;;;;;;;;;;;;;;;13917:647;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13917:647:39;;;;;;;;;;;;;;;;;:::i;1967:145:0:-;;;:::i;5382:27:39:-;;;:::i;34141:141::-;;;;;;;;;;;;;;;;-1:-1:-1;34141:141:39;-1:-1:-1;;;;;34141:141:39;;:::i;19907:306::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19907:306:39;;;;;;;;;;;;;:::i;29377:118::-;;;;;;;;;;;;;;;;-1:-1:-1;29377:118:39;;:::i;10723:1018::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10723:1018:39;;;;;;;;;;;;;;;;;:::i;18806:302::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18806:302:39;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1335:85:0;;;:::i;:::-;;;;-1:-1:-1;;;;;1335:85:0;;;;;;;;;;;;;;4710:40:39;;;:::i;30219:137::-;;;;;;;;;;;;;;;;-1:-1:-1;30219:137:39;-1:-1:-1;;;;;30219:137:39;;:::i;4916:43::-;;;:::i;31052:110::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5172:33;;;:::i;18036:430::-;;;;;;;;;;;;;;;;-1:-1:-1;18036:430:39;;:::i;8890:921::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8890:921:39;;;;;;;;;;;;;;;;;;;;:::i;26123:455::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26123:455:39;;;;-1:-1:-1;;;;;26123:455:39;;;;;;;;;;;;:::i;7162:74::-;;;:::i;140:26:77:-;;;:::i;26965:343:39:-;;;;;;;;;;;;;;;;-1:-1:-1;26965:343:39;-1:-1:-1;;;;;26965:343:39;;:::i;:::-;;;;;-1:-1:-1;;;;;26965:343:39;;;;;;-1:-1:-1;;;;;26965:343:39;;;;;;;;;;;;;;;;651:79:77;;;;;;;;;;;;;;;;-1:-1:-1;651:79:77;;:::i;7917:469:39:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7917:469:39;;;;;;;;;;;;;;;;;;;;;;:::i;12245:1028::-;;;:::i;5277:33::-;;;:::i;2261:240:0:-;;;;;;;;;;;;;;;;-1:-1:-1;2261:240:0;-1:-1:-1;;;;;2261:240:0;;:::i;6912:93:39:-;;;:::i;4615:40::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31480:106;31540:7;31562:19;:17;:19::i;:::-;31555:26;;31480:106;:::o;14958:270::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;15112:39:::1;15125:2;15129:13;15144:6;15112:12;:39::i;:::-;15108:116;;;15195:13;-1:-1:-1::0;;;;;15166:51:39::1;15191:2;-1:-1:-1::0;;;;;15166:51:39::1;;15210:6;15166:51;;;;;;;;;;;;;;;;;;15108:116;14958:270:::0;;;:::o;32298:200::-;-1:-1:-1;;;32298:200:39;;;;;;;:::o;17185:617::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;17354:32:::1;17372:13;17354:17;:32::i;:::-;17346:77;;;::::0;;-1:-1:-1;;;17346:77:39;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;17434:20:::0;17430:47:::1;;17464:7;;17430:47;17488:9;17483:253;17503:19:::0;;::::1;17483:253;;;17560:13;-1:-1:-1::0;;;;;17541:50:39::1;;17600:4;17607:2;17611:8;;17620:1;17611:11;;;;;;;;;;;;;17541:82;;;;;;;;;;;;;-1:-1:-1::0;;;;;17541:82:39::1;;;;;;-1:-1:-1::0;;;;;17541:82:39::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;17537:186;;;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17680:34;17708:5;17680:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17640:83;17537:186;17524:3;;17483:253;;;;17773:13;-1:-1:-1::0;;;;;17747:50:39::1;17769:2;-1:-1:-1::0;;;;;17747:50:39::1;;17788:8;;17747:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;17747:50:39::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;17747:50:39;;-1:-1:-1;;;;17747:50:39::1;36121:1;17185:617:::0;;;;:::o;734:92:77:-;795:11;:26;734:92::o;15586:263:39:-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;15737:39:::1;15750:2;15754:13;15769:6;15737:12;:39::i;:::-;15733:112;;;15816:13;-1:-1:-1::0;;;;;15791:47:39::1;15812:2;-1:-1:-1::0;;;;;15791:47:39::1;;15831:6;15791:47;;;;;;;;;;;;;;;;;;15586:263:::0;;;:::o;31811:166::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;31934:1:39::1;31898:8;-1:-1:-1::0;;;;;31898:18:39::1;;31925:4;31898:33;;;;;;;;;;;;;-1:-1:-1::0;;;;;31898:33:39::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31898:33:39;:37:::1;31894:79;;;31945:8;-1:-1:-1::0;;;;;31945:17:39::1;;31963:2;31945:21;;;;;;;;;;;;;-1:-1:-1::0;;;;;31945:21:39::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31894:79;31811:166:::0;;:::o;572:75:77:-;623:19;631:10;623:7;:19::i;:::-;572:75;:::o;5948:860:39:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;-1:-1:-1;;;;;6146:39:39;::::1;6138:86;;;;-1:-1:-1::0;;;6138:86:39::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6263:24:::0;;;6303:54:::1;::::0;::::1;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;6303:54:39::1;-1:-1:-1::0;6293:64:39;;::::1;::::0;:7:::1;::::0;:64:::1;::::0;;::::1;::::0;::::1;:::i;:::-;;6369:9;6364:178;6388:22;6384:1;:26;6364:178;;;6425:40;6468:17;6486:1;6468:20;;;;;;;;;;;;;;6425:63;;6496:39;6516:15;6533:1;6496:19;:39::i;:::-;-1:-1:-1::0;6412:3:39::1;;6364:178;;;;6547:16;:14;:16::i;:::-;6569:24;:22;:24::i;:::-;6599:29;-1:-1:-1::0;;6599:16:39::1;:29::i;:::-;6635:15;:34:::0;;-1:-1:-1;;;;;;6635:34:39::1;-1:-1:-1::0;;;;;6635:34:39;::::1;::::0;;::::1;::::0;;;6675:18:::1;:40:::0;;;6727:76:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;::::1;1778:1:9;1794:14:::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;5948:860:39;;;;:::o;25409:303::-;25537:7;25511:15;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;;;-1:-1:-1;;;35825:92:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;;;25552:91:::1;25566:4;25572:15;25607;-1:-1:-1::0;;;;;25589:44:39::1;;25634:4;25589:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;25589:50:39::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25589:50:39;25641:1:::1;25552:13;:91::i;:::-;-1:-1:-1::0;;;;;;;25656:37:39;;::::1;;::::0;;;:20:::1;:37;::::0;;;;;;;:43;;;::::1;::::0;;;;;;;;:51;-1:-1:-1;;;;;25656:51:39::1;::::0;25409:303::o;13277:314::-;13353:7;36394:24;36438:15;;;;;;;;;-1:-1:-1;;;;;36438:15:39;-1:-1:-1;;;;;36438:22:39;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36438:24:39;;-1:-1:-1;;;;;;36477:30:39;;36497:10;36477:30;36469:65;;;;;-1:-1:-1;;;36469:65:39;;;;;;;;;;;;-1:-1:-1;;;36469:65:39;;;;;;;;;;;;;;;13386:18:::1;::::0;;13369:14:::1;13410:22:::0;;;;13386:18;13457:15:::1;13386:18:::0;13457:7:::1;:15::i;:::-;13438:34;;13479:44;13509:2;13514:8;13479;:6;:8::i;:::-;-1:-1:-1::0;;;;;13479:21:39::1;::::0;:44;:21:::1;:44::i;:::-;13535:29;::::0;;;;;;;-1:-1:-1;;;;;13535:29:39;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;13578:8:::0;13277:314;-1:-1:-1;;;;13277:314:39:o;207:361:77:-;421:102;449:16;473:17;498:19;421:20;:102::i;:::-;529:15;:34;;-1:-1:-1;;;;;;529:34:77;-1:-1:-1;;;;;529:34:77;;;;;;;;;;-1:-1:-1;;;207:361:77:o;11940:103:39:-;12018:20;;11940:103;:::o;7465:130::-;7538:4;7557:33;7575:14;7557:17;:33::i;:::-;7550:40;;7465:130;;;;:::o;13917:647::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;14069:15:::1;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;::::0;;-1:-1:-1;;;35825:92:39;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;::::1;;14098:11:::0;14094:38:::2;;14119:7;;14094:38;14156:20;;14146:6;:30;;14138:72;;;::::0;;-1:-1:-1;;;14138:72:39;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;14239:20;::::0;:32:::2;::::0;14264:6;14239:24:::2;:32::i;:::-;14216:20;:55:::0;14278:46:::2;14284:2:::0;14288:6;14296:15;14321:1:::2;14278:5;:46::i;:::-;14331:19;14353:55;14384:15;14401:6;14353:30;:55::i;:::-;14331:77;;14414:97;14428:2;14432:15;14467;-1:-1:-1::0;;;;;14449:44:39::2;;14494:2;14449:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;14449:48:39::2;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;14449:48:39;14499:11;14414:13:::2;:97::i;:::-;14535:15;-1:-1:-1::0;;;;;14523:36:39::2;14531:2;-1:-1:-1::0;;;;;14523:36:39::2;;14552:6;14523:36;;;;;;;;;;;;;;;;;;35923:1;36121::::1;13917:647:::0;;;:::o;1967:145:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;2057:6:::1;::::0;2036:40:::1;::::0;2073:1:::1;::::0;-1:-1:-1;;;;;2057:6:0::1;::::0;2036:40:::1;::::0;2073:1;;2036:40:::1;2086:6;:19:::0;;-1:-1:-1;;;;;;2086:19:0::1;::::0;;1967:145::o;5382:27:39:-;;;;:::o;34141:141::-;34228:4;34247:30;34261:15;34247:13;:30::i;19907:306::-;20067:23;20117:91;20151:16;20175:10;20193:9;20117:26;:91::i;:::-;20100:108;19907:306;-1:-1:-1;;;;19907:306:39:o;29377:118::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;29459:31:39::1;29476:13;29459:16;:31::i;10723:1018::-:0;10832:10;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;;;-1:-1:-1;;;35825:92:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;;;-1:-1:-1;;;;;10854:18:39;::::1;::::0;10850:579:::1;;10882:25;10928:10;-1:-1:-1::0;;;;;10910:39:39::1;;10950:4;10910:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;10910:45:39::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;10910:45:39;;-1:-1:-1;11014:24:39::1;11041:63;11065:4:::0;11071:10:::1;10910:45:::0;11014:24;11041:23:::1;:63::i;:::-;11014:90;;11125:2;-1:-1:-1::0;;;;;11117:10:39::1;:4;-1:-1:-1::0;;;;;11117:10:39::1;;11113:245;;11271:78;11289:10;11301:29;:17:::0;11323:6;11301:21:::1;:29::i;:::-;11332:16;11271:17;:78::i;:::-;11252:97;;11113:245;11366:56;11387:4;11393:10;11405:16;11366:20;:56::i;:::-;10850:579;;;-1:-1:-1::0;;;;;11438:16:39;::::1;::::0;;::::1;::::0;:30:::1;;;11464:4;-1:-1:-1::0;;;;;11458:10:39::1;:2;-1:-1:-1::0;;;;;11458:10:39::1;;;11438:30;11434:128;;;11478:77;11492:2;11496:10;11526;-1:-1:-1::0;;;;;11508:39:39::1;;11548:2;11508:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;11508:43:39::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;11478:77;-1:-1:-1::0;;;;;11599:18:39;::::1;::::0;;::::1;::::0;:58:::1;;-1:-1:-1::0;11629:13:39::1;::::0;-1:-1:-1;;;;;11629:13:39::1;11621:36:::0;::::1;11599:58;11595:142;;;11667:13;::::0;:63:::1;::::0;;-1:-1:-1;;;11667:63:39;;-1:-1:-1;;;;;11667:63:39;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;;11719:10:::1;11667:63:::0;;;;;;:13;;;::::1;::::0;:33:::1;::::0;:63;;;;;:13:::1;::::0;:63;;;;;;;:13;;:63;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;10723:1018:::0;;;;:::o;18806:302::-;18950:15;18973:20;19034:69;19073:4;19079:15;19096:6;19034:38;:69::i;:::-;19008:95;;;;-1:-1:-1;18806:302:39;-1:-1:-1;;;;18806:302:39:o;1335:85:0:-;1407:6;;-1:-1:-1;;;;;1407:6:0;1335:85;:::o;4710:40:39:-;;;-1:-1:-1;;;;;4710:40:39;;:::o;30219:137::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;30318:33:39::1;30336:14;30318:17;:33::i;4916:43::-:0;;;-1:-1:-1;;;;;4916:43:39;;:::o;31052:110::-;31102:33;31150:7;31143:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31143:14:39;;;;;;;;;;;;;;;;;;;;;;;31052:110;:::o;5172:33::-;;;;:::o;18036:430::-;18102:7;18117:24;18161:15;;;;;;;;;-1:-1:-1;;;;;18161:15:39;-1:-1:-1;;;;;18161:22:39;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18161:24:39;;-1:-1:-1;;;;;;18196:30:39;;18192:59;;18243:1;18236:8;;;;;18192:59;18256:27;18286:7;-1:-1:-1;;;;;18286:27:39;;18322:4;18286:42;;;;;;;;;;;;;-1:-1:-1;;;;;18286:42:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18286:42:39;;-1:-1:-1;18338:24:39;18334:53;;18379:1;18372:8;;;;;;18334:53;18399:62;18433:6;18441:19;18399:33;:62::i;8890:921::-;9113:7;1753:1:23;2495:7;;:19;;2487:63;;;;;-1:-1:-1;;;2487:63:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;1753:1;2625:7;:18;9083:15:39;35833:56:::1;9083:15:::0;35833:13:::1;:56::i;:::-;35825:92;;;::::0;;-1:-1:-1;;;35825:92:39;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;::::1;;9131:15:::2;9148:20:::0;9172:69:::2;9211:4;9217:15;9234:6;9172:38;:69::i;:::-;9130:111;;;;9266:14;9255:7;:25;;9247:77;;;;-1:-1:-1::0;;;9247:77:39::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9354:48;9366:4;9372:15;9389:12;9354:11;:48::i;:::-;9449:15;-1:-1:-1::0;;;;;9433:51:39::2;;9485:12;:10;:12::i;:::-;9499:4;9505:6;9433:79;;;;;;;;;;;;;-1:-1:-1::0;;;;;9433:79:39::2;;;;;;-1:-1:-1::0;;;;;9433:79:39::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;9558:21;9582:19;9593:7;9582:6;:10;;:19;;;;:::i;:::-;9558:43;;9607:16;9626:22;9634:13;9626:7;:22::i;:::-;9607:41;;9655:37;9677:4;9683:8;9655;:6;:8::i;:37::-;9742:15;-1:-1:-1::0;;;;;9704:81:39::2;9736:4;-1:-1:-1::0;;;;;9704:81:39::2;9722:12;:10;:12::i;:::-;9704:81;::::0;;;;;::::2;::::0;::::2;::::0;;;;;;;;;;;-1:-1:-1;;;;;9704:81:39;;;::::2;::::0;::::2;::::0;;;;;;;::::2;-1:-1:-1::0;;1710:1:23;2798:7;:22;-1:-1:-1;9799:7:39;8890:921;-1:-1:-1;;;;;;8890:921:39:o;26123:455::-;26295:16;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;;;-1:-1:-1;;;35825:92:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;;;1558:12:0::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;1547:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;1547:23:0::1;;1539:68;;;::::0;;-1:-1:-1;;;1539:68:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;::::1;;26373:114:39::2;::::0;;;;::::2;::::0;;-1:-1:-1;;;;;26373:114:39;;::::2;::::0;;;;;::::2;;::::0;;::::2;::::0;;;-1:-1:-1;;;;;26335:35:39;::::2;-1:-1:-1::0;26335:35:39;;;:17:::2;:35:::0;;;;;:152;;;;;;;::::2;-1:-1:-1::0;;;26335:152:39::2;::::0;;::::2;-1:-1:-1::0;;26335:152:39;;::::2;::::0;;;::::2;::::0;;::::2;;::::0;;;26499:74;;;;;;;::::2;::::0;;;;;;;;;;::::2;::::0;;;;;;;::::2;26123:455:::0;;;;:::o;7162:74::-;7199:7;7221:10;:8;:10::i;140:26:77:-;;;;:::o;26965:343:39:-;-1:-1:-1;;;;;27169:34:39;27071:27;27169:34;;;:17;:34;;;;;:54;-1:-1:-1;;;;;27169:54:39;;;;-1:-1:-1;;;27250:53:39;;;;;26965:343::o;651:79:77:-;704:21;712:12;704:7;:21::i;7917:469:39:-;1753:1:23;2495:7;;:19;;2487:63;;;;;-1:-1:-1;;;2487:63:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;1753:1;2625:7;:18;8090:15:39;35833:56:::1;8090:15:::0;35833:13:::1;:56::i;:::-;35825:92;;;::::0;;-1:-1:-1;;;35825:92:39;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;::::1;;8127:6:::2;36288:25;36305:7;36288:16;:25::i;:::-;36280:69;;;::::0;;-1:-1:-1;;;36280:69:39;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;8143:16:::3;8162:12;:10;:12::i;:::-;8143:31;;8181:44;8187:2;8191:6;8199:15;8216:8;8181:5;:44::i;:::-;8232:58;8258:8;8276:4;8283:6;8232:8;:6;:8::i;:::-;-1:-1:-1::0;;;;;8232:25:39::3;::::0;:58;;:25:::3;:58::i;:::-;8296:15;8304:6;8296:7;:15::i;:::-;8347;-1:-1:-1::0;;;;;8323:58:39::3;8343:2;-1:-1:-1::0;;;;;8323:58:39::3;8333:8;-1:-1:-1::0;;;;;8323:58:39::3;;8364:6;8372:8;8323:58;;;;;;;;;-1:-1:-1::0;;;;;8323:58:39::3;;;;;;;;;;;;;;;;-1:-1:-1::0;;1710:1:23;2798:7;:22;-1:-1:-1;;;;;7917:469:39:o;12245:1028::-;12316:7;1753:1:23;2495:7;;:19;;2487:63;;;;;-1:-1:-1;;;2487:63:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;1753:1;2625:7;:18;12331:24:39::1;12358:19;:17;:19::i;:::-;12331:46;;12495:22;12520:10;:8;:10::i;:::-;12495:35;;12536:21;12578:16;12561:14;:33;12560:78;;12637:1;12560:78;;;12598:36;:14:::0;12617:16;12598:18:::1;:36::i;:::-;12536:102;;12644:31;12695:20;;12679:13;:36;12678:84;;12761:1;12678:84;;;12737:20;::::0;12719:39:::1;::::0;:13;;:17:::1;:39::i;:::-;12644:118:::0;-1:-1:-1;12773:27:39;;12769:466:::1;;12810:18;12831:44;12851:23;12831:19;:44::i;:::-;12810:65:::0;-1:-1:-1;12887:14:39;;12883:214:::1;;12934:18;::::0;:34:::1;::::0;12957:10;12934:22:::1;:34::i;:::-;12913:18;:55:::0;13004:39:::1;:23:::0;13032:10;13004:27:::1;:39::i;:::-;13058:30;::::0;;;;;;;12978:65;;-1:-1:-1;13058:30:39::1;::::0;;;;;::::1;::::0;;::::1;12883:214;13127:20;::::0;:49:::1;::::0;13152:23;13127:24:::1;:49::i;:::-;13104:20;:72:::0;13190:38:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;12769:466;;13248:20;;13241:27;;;;;;1710:1:23::0;2798:7;:22;12245:1028:39;:::o;5277:33::-;;;;:::o;2261:240:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;2349:22:0;::::1;2341:73;;;;-1:-1:-1::0;;;2341:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2450:6;::::0;2429:38:::1;::::0;-1:-1:-1;;;;;2429:38:0;;::::1;::::0;2450:6:::1;::::0;2429:38:::1;::::0;2450:6:::1;::::0;2429:38:::1;2477:6;:17:::0;;-1:-1:-1;;;;;;2477:17:0::1;-1:-1:-1::0;;;;;2477:17:0;;;::::1;::::0;;;::::1;::::0;;2261:240::o;6912:93:39:-;6961:7;6991:8;:6;:8::i;4615:40::-;;;;;;;;;;;;;;-1:-1:-1;;;4615:40:39;;;;:::o;32597:361::-;32649:7;32664:13;32680:18;;32664:34;;32704:40;32747:7;32704:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32704:50:39;;;;;;;;;;;;;;;;-1:-1:-1;;32794:13:39;;32704:50;;-1:-1:-1;32771:20:39;;-1:-1:-1;;;32818:117:39;32841:12;32837:1;:16;32818:117;;;32875:53;32903:6;32910:1;32903:9;;;;;;;;;;;;;;-1:-1:-1;;;;;32885:40:39;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32885:42:39;32875:5;;:9;:53::i;:::-;32867:61;-1:-1:-1;32855:3:39;;32818:117;;;-1:-1:-1;32948:5:39;;-1:-1:-1;;;32597:361:39;:::o;828:104:19:-;915:10;828:104;:::o;15853:343:39:-;15968:4;15990:32;16008:13;15990:17;:32::i;:::-;15982:77;;;;;-1:-1:-1;;;15982:77:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16070:11;16066:44;;-1:-1:-1;16098:5:39;16091:12;;16066:44;16116:57;-1:-1:-1;;;;;16116:45:39;;16162:2;16166:6;16116:45;:57::i;:::-;-1:-1:-1;16187:4:39;15853:343;;;;;;:::o;928:155:77:-;1030:15;;:48;;;-1:-1:-1;;;1030:48:77;;-1:-1:-1;;;;;1030:48:77;;;;;;;;;1011:4;;1030:15;;;;;:32;;:48;;;;;;;;;;;;;;;:15;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1030:48:77;;928:155;-1:-1:-1;;928:155:77:o;1304:107::-;1372:15;;:34;;;-1:-1:-1;;;1372:34:77;;;;;;;;;;-1:-1:-1;;;;;1372:15:77;;;;:22;;:34;;;;;:15;;:34;;;;;;;;:15;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1304:107;:::o;1952:123:9:-;2000:4;2024:44;2062:4;2024:29;:44::i;:::-;2023:45;2016:52;;1952:123;:::o;29798:280:39:-;29941:4;-1:-1:-1;;;;;29908:37:39;:16;-1:-1:-1;;;;;29908:27:39;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29908:29:39;-1:-1:-1;;;;;29908:37:39;;29900:80;;;;;-1:-1:-1;;;29900:80:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;30008:16;29991:7;29999:5;29991:14;;;;;;;;;;;;;;;;:33;;-1:-1:-1;;;;;;29991:33:39;-1:-1:-1;;;;;29991:33:39;;;;;;30035:38;;;;;;;;29991:14;30035:38;29798:280;;:::o;935:126:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;992:26:0::1;:24;:26::i;:::-;1028;:24;:26::i;:::-;1794:14:9::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;935:126:0;:::o;1791:106:23:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1856:34:23::1;:32;:34::i;29499:138:39:-:0;29563:12;:28;;;29602:30;;;;;;;;;;;;;;;;;29499:138;:::o;33600:331::-;33688:4;33700:40;33743:7;33700:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33700:50:39;;;;;;;;;;;;;;;;-1:-1:-1;;33788:13:39;;33700:50;;-1:-1:-1;33765:20:39;;-1:-1:-1;;;33808:101:39;33831:12;33827:1;:16;33808:101;;;33874:15;-1:-1:-1;;;;;33861:28:39;:6;33868:1;33861:9;;;;;;;;;;;;;;-1:-1:-1;;;;;33861:28:39;;33858:44;;;33898:4;33891:11;;;;;;;33858:44;33845:3;;33808:101;;;-1:-1:-1;33921:5:39;;33600:331;-1:-1:-1;;;;33600:331:39:o;21947:275::-;22071:146;22099:4;22111:15;22134:77;22158:4;22164:15;22181:22;22205:5;22134:23;:77::i;:::-;22071:20;:146::i;1415:129:77:-;1503:15;;:36;;;-1:-1:-1;;;1503:36:77;;;;;;;;;;1481:7;;-1:-1:-1;;;;;1503:15:77;;:22;;:36;;;;;;;;;;;;;;1481:7;1503:15;:36;;;;;;;;;;;;;;;;;;;;;;;;;;1087:110;1169:15;;:23;;;-1:-1:-1;;;1169:23:77;;;;1137:17;;-1:-1:-1;;;;;1169:15:77;;:21;;:23;;;;;;;;;;;;;;:15;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1169:23:77;;-1:-1:-1;1087:110:77;:::o;770:186:12:-;890:58;;;-1:-1:-1;;;;;890:58:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;890:58:12;-1:-1:-1;;;890:58:12;;;863:86;;883:5;;863:19;:86::i;3147:155:8:-;3205:7;3237:1;3232;:6;;3224:49;;;;;-1:-1:-1;;;3224:49:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3290:5:8;;;3147:155;;;;;:::o;16533:295:39:-;16646:13;;-1:-1:-1;;;;;16646:13:39;16638:36;16634:125;;16684:13;;:68;;;-1:-1:-1;;;16684:68:39;;-1:-1:-1;;;;;16684:68:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;;;;;:29;;:68;;;;;:13;;:68;;;;;;;:13;;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16634:125;16780:15;-1:-1:-1;;;;;16764:47:39;;16812:2;16816:6;16764:59;;;;;;;;;;;;;-1:-1:-1;;;;;16764:59:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19258:269;-1:-1:-1;;;;;19461:34:39;;19362:7;19461:34;;;:17;:34;;;;;:54;19384:138;;19405:6;;19419:97;;19405:6;;-1:-1:-1;;;;;19461:54:39;19419:33;:97::i;:::-;19384:13;:138::i;20592:520::-;-1:-1:-1;;;;;20953:35:39;;20744:23;20953:35;;;:17;:35;;;;;:54;20744:23;;20907:101;;20941:10;;-1:-1:-1;;;20953:54:39;;-1:-1:-1;;;;;20953:54:39;20907:33;:101::i;:::-;20880:128;-1:-1:-1;21018:21:39;21014:50;;21056:1;21049:8;;;;;21014:50;21076:31;:9;21090:16;21076:13;:31::i;:::-;21069:38;20592:520;-1:-1:-1;;;;;20592:520:39:o;22226:598::-;-1:-1:-1;;;;;22445:37:39;;;22368:7;22445:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;22499:25;;22368:7;;22445:43;-1:-1:-1;;;22499:25:39;;;;22494:303;;22547:1;22534:14;;22494:303;;;22569:14;22586:70;22610:4;22616:15;22633:22;22586:23;:70::i;:::-;22744:21;;22569:87;;-1:-1:-1;22677:113:39;;22695:15;;22712:22;;22736:53;;22783:5;;22736:42;;-1:-1:-1;;;;;22744:21:39;22569:87;22736:34;:42::i;:::-;:46;;:53::i;:::-;22677:17;:113::i;:::-;22664:126;;22494:303;;-1:-1:-1;22809:10:39;22226:598;-1:-1:-1;;;;;22226:598:39:o;23848:410::-;-1:-1:-1;;;;;24086:34:39;;23978:7;24086:34;;;:17;:34;;;;;:54;23978:7;;24015:131;;24056:22;;-1:-1:-1;;;;;24086:54:39;24015:33;:131::i;:::-;23993:153;;24172:11;24156:13;:27;24152:75;;;24209:11;24193:27;;24152:75;-1:-1:-1;24240:13:39;;23848:410;-1:-1:-1;;;23848:410:39:o;22828:604::-;-1:-1:-1;;;;;22953:37:39;;;22932:18;22953:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;:51;23057:129;;;;;;;;-1:-1:-1;;;;;22953:51:39;;23057:129;23088:22;:10;:20;:22::i;:::-;-1:-1:-1;;;;;23057:129:39;;;;;23129:25;:14;:12;:14::i;:::-;:23;:25::i;:::-;23057:129;;;;;;23175:4;23057:129;;;;;-1:-1:-1;;;;;23011:37:39;;;-1:-1:-1;23011:37:39;;;:20;:37;;;;;;:43;;;;;;;;;;;:175;;;;;;;;;;;;;-1:-1:-1;;;;;;23011:175:39;;;-1:-1:-1;;;;;23011:175:39;;;;;;;-1:-1:-1;;;;23011:175:39;-1:-1:-1;;;23011:175:39;;;;;;;;;-1:-1:-1;;;;23011:175:39;-1:-1:-1;;;23011:175:39;;;;;;;;;;23197:23;;;23193:235;;;-1:-1:-1;;;;;23235:63:39;;;;;;;23271:26;:10;23286;23271:14;:26::i;:::-;23235:63;;;;;;;;;;;;;;;23193:235;;;23333:10;23320;:23;23316:112;;;-1:-1:-1;;;;;23358:63:39;;;;;;;23394:26;:10;23409;23394:14;:26::i;:::-;23358:63;;;;;;;;;;;;;;;22828:604;;;;:::o;27741:1468::-;27893:20;27921;27956:30;28007:15;-1:-1:-1;;;;;27989:44:39;;28034:4;27989:50;;;;;;;;;;;;;-1:-1:-1;;;;;27989:50:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27989:50:39;;-1:-1:-1;28053:32:39;;;;28045:67;;;;;-1:-1:-1;;;28045:67:39;;;;;;;;;;;;-1:-1:-1;;;28045:67:39;;;;;;;;;;;;;;;28118:63;28132:4;28138:15;28155:22;28179:1;28118:13;:63::i;:::-;28575:24;28602:83;28633:15;28650:34;:22;28677:6;28650:26;:34::i;:::-;28602:30;:83::i;:::-;-1:-1:-1;;;;;28725:37:39;;;28692:23;28725:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;:51;28575:110;;-1:-1:-1;28692:23:39;-1:-1:-1;;;;;28725:51:39;:71;-1:-1:-1;28721:192:39;;-1:-1:-1;;;;;28832:37:39;;;;;;;:20;:37;;;;;;;;:43;;;;;;;;;:51;28824:82;;-1:-1:-1;;;;;28832:51:39;28889:16;28824:64;:82::i;:::-;28806:100;;28721:192;28989:20;29012:55;29043:15;29060:6;29012:30;:55::i;:::-;28989:78;;29107:12;29089:15;:30;29088:65;;29138:15;29088:65;;;29123:12;29088:65;29073:80;-1:-1:-1;29174:30:39;:12;29073:80;29174:16;:30::i;:::-;29159:45;;27741:1468;;;;;;;;;;:::o;30497:405::-;-1:-1:-1;;;;;30586:37:39;;30578:82;;;;;-1:-1:-1;;;30578:82:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30674:98;-1:-1:-1;;;;;30674:41:39;;-1:-1:-1;;;;;;30674:41:39;:98::i;:::-;30666:142;;;;;-1:-1:-1;;;30666:142:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;30814:13;:30;;-1:-1:-1;;;;;;30814:30:39;-1:-1:-1;;;;;30814:30:39;;;;;;;;30856:41;;;;-1:-1:-1;;30856:41:39;30497:405;:::o;1967:201:26:-;2051:7;;2087:15;:8;2100:1;2087:12;:15::i;:::-;2070:32;-1:-1:-1;2121:17:26;2070:32;1149:4;2121:10;:17::i;21258:289:39:-;-1:-1:-1;;;;;21411:37:39;;;;;;;:20;:37;;;;;;;;:43;;;;;;;;;:51;21403:84;;:72;;-1:-1:-1;;;;;21411:51:39;21468:6;21403:64;:72::i;:::-;:82;:84::i;:::-;-1:-1:-1;;;;;21349:37:39;;;;;;;:20;:37;;;;;;;;:43;;;;;;;;;;;;;:138;;-1:-1:-1;;;;;;21349:138:39;-1:-1:-1;;;;;21349:138:39;;;;;;;;;;;21499:43;;;;;;;21349:37;;21499:43;;;;;;;;;21258:289;;;:::o;1201:99:77:-;1270:15;;:25;;;-1:-1:-1;;;1270:25:77;;;;1248:7;;-1:-1:-1;;;;;1270:15:77;;:23;;:25;;;;;;;;;;;;;;1248:7;1270:15;:25;;;;;;;;;;;;;;;;;;;;;;;;;;33203:189:39;33269:4;33281:24;33308:19;:17;:19::i;:::-;33374:12;;33281:46;;-1:-1:-1;33341:29:39;33281:46;33362:7;33341:20;:29::i;:::-;:45;;;33203:189;-1:-1:-1;;;33203:189:39:o;962:214:12:-;1100:68;;;-1:-1:-1;;;;;1100:68:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1100:68:12;-1:-1:-1;;;1100:68:12;;;1073:96;;1093:5;;1073:19;:96::i;2701:175:8:-;2759:7;2790:5;;;2813:6;;;;2805:46;;;;;-1:-1:-1;;;2805:46:8;;;;;;;;;;;;;;;;;;;;;;;;;;;737:413:18;1097:20;1135:8;;;737:413::o;759:64:19:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1794:14;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;759:64:19;:::o;1067:192:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1134:17:0::1;1154:12;:10;:12::i;:::-;1176:6;:18:::0;;-1:-1:-1;;;;;;1176:18:0::1;-1:-1:-1::0;;;;;1176:18:0;::::1;::::0;;::::1;::::0;;;1209:43:::1;::::0;1176:18;;-1:-1:-1;1176:18:0;-1:-1:-1;;1209:43:0::1;::::0;-1:-1:-1;;1209:43:0::1;1778:1:9;1794:14:::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1067:192:0;:::o;1903:104:23:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1710:1:23::1;1978:7;:22:::0;1790:66:9;;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1903:104:23;:::o;3088:762:12:-;3518:23;3544:69;3572:4;3544:69;;;;;;;;;;;;;;;;;3552:5;-1:-1:-1;;;;;3544:27:12;;;:69;;;;;:::i;:::-;3627:17;;3518:95;;-1:-1:-1;3627:21:12;3623:221;;3767:10;3756:30;;;;;;;;;;;;;;;-1:-1:-1;3756:30:12;3748:85;;;;-1:-1:-1;;;3748:85:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10138:275:39;10227:7;10242:14;10259:71;10293:16;10311:18;;10259:33;:71::i;:::-;10242:88;;10350:6;10340:7;:16;10336:53;;;10376:6;10366:16;;10336:53;-1:-1:-1;10401:7:39;;10138:275;-1:-1:-1;;10138:275:39:o;4228:150:8:-;4286:7;4317:1;4313;:5;4305:44;;;;;-1:-1:-1;;;4305:44:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;4370:1;4366;:5;;;;;;;4228:150;-1:-1:-1;;;4228:150:8:o;24612:558:39:-;-1:-1:-1;;;;;24778:37:39;;;24739:7;24778:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;:53;-1:-1:-1;;;24778:53:39;;;;;-1:-1:-1;;;24843:55:39;;;;24838:85;;24915:1;24908:8;;;;;24838:85;24929:17;24949:33;24968:13;24949:14;:12;:14::i;:::-;:18;;:33::i;:::-;-1:-1:-1;;;;;25026:34:39;;24988:21;25026:34;;;:17;:34;;;;;:53;24929;;-1:-1:-1;24988:21:39;25012:68;;24929:53;;-1:-1:-1;;;25026:53:39;;-1:-1:-1;;;;;25026:53:39;25012:13;:68::i;:::-;24988:92;;25093:72;25127:22;25151:13;25093:33;:72::i;:::-;25086:79;24612:558;-1:-1:-1;;;;;;;24612:558:39:o;1097:181:24:-;1154:7;-1:-1:-1;;;1181:5:24;:14;1173:67;;;;-1:-1:-1;;;1173:67:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1265:5:24;1097:181::o;830:94:77:-;908:11;;830:94;:::o;2028:176:24:-;2084:6;-1:-1:-1;;;2110:5:24;:13;2102:65;;;;-1:-1:-1;;;2102:65:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1369:286:5;1456:4;1563:23;1578:7;1563:14;:23::i;:::-;:85;;;;;1602:46;1627:7;1636:11;1602:24;:46::i;2266:459:27:-;2324:7;2565:6;2561:45;;-1:-1:-1;2594:1:27;2587:8;;2561:45;2628:5;;;2632:1;2628;:5;:1;2651:5;;;;;:10;2643:56;;;;-1:-1:-1;;;2643:56:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3187:130;3245:7;3271:39;3275:1;3278;3271:39;;;;;;;;;;;;;;;;;:3;:39::i;3592:193:18:-;3695:12;3726:52;3748:6;3756:4;3762:1;3765:12;3726:21;:52::i;757:394:5:-;821:4;1016:55;1041:7;-1:-1:-1;;;1016:24:5;:55::i;:::-;:128;;;;-1:-1:-1;1088:56:5;1113:7;-1:-1:-1;;;;;;1088:24:5;:56::i;:::-;1087:57;;757:394;-1:-1:-1;;757:394:5:o;4243:395::-;4336:4;4515:12;4529:11;4544:50;4573:7;4582:11;4544:28;:50::i;:::-;4514:80;;;;4613:7;:17;;;;-1:-1:-1;4624:6:5;4605:26;-1:-1:-1;;;;4243:395:5:o;3799:272:27:-;3885:7;3919:12;3912:5;3904:28;;;;-1:-1:-1;;;3904:28:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3942:9;3958:1;3954;:5;;;;;;;3799:272;-1:-1:-1;;;;;3799:272:27:o;4619:523:18:-;4746:12;4803:5;4778:21;:30;;4770:81;;;;-1:-1:-1;;;4770:81:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4869:18;4880:6;4869:10;:18::i;:::-;4861:60;;;;;-1:-1:-1;;;4861:60:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;4992:12;5006:23;5033:6;-1:-1:-1;;;;;5033:11:18;5053:5;5061:4;5033:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5033:33:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4991:75;;;;5083:52;5101:7;5110:10;5122:12;5083:17;:52::i;5155:444:5:-;5331:57;;;-1:-1:-1;;;;;;5331:57:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5331:57:5;-1:-1:-1;;;5331:57:5;;;5436:47;;;;5276:4;;;;5331:57;5276:4;;5302:26;;-1:-1:-1;;;;;5436:18:5;;;5461:5;;5331:57;;5436:47;;;;5331:57;5436:47;;;;;;;;;;-1:-1:-1;;5436:47:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5398:85;;;;5513:2;5497:6;:13;:18;5493:45;;;5525:5;5532;5517:21;;;;;;;;;5493:45;5556:7;5576:6;5565:26;;;;;;;;;;;;;;;-1:-1:-1;5565:26:5;5548:44;;-1:-1:-1;5565:26:5;-1:-1:-1;;;;5155:444:5;;;;;;:::o;6122:725:18:-;6237:12;6265:7;6261:580;;;-1:-1:-1;6295:10:18;6288:17;;6261:580;6406:17;;:21;6402:429;;6664:10;6658:17;6724:15;6711:10;6707:2;6703:19;6696:44;6613:145;6796:20;;-1:-1:-1;;;6796:20:18;;;;;;;;;;;;;;;;;6803:12;;6796:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "3326000",
                "executionCost": "3699",
                "totalCost": "3329699"
              },
              "external": {
                "VERSION()": "infinite",
                "accountedBalance()": "infinite",
                "award(address,uint256,address)": "infinite",
                "awardBalance()": "1088",
                "awardExternalERC20(address,address,uint256)": "infinite",
                "awardExternalERC721(address,address,uint256[])": "infinite",
                "balance()": "infinite",
                "balanceOfCredit(address,address)": "infinite",
                "beforeTokenTransfer(address,address,uint256)": "infinite",
                "calculateEarlyExitFee(address,address,uint256)": "infinite",
                "calculateReserveFee(uint256)": "infinite",
                "canAwardExternal(address)": "infinite",
                "captureAwardBalance()": "infinite",
                "compLikeDelegate(address,address)": "infinite",
                "creditPlanOf(address)": "1366",
                "currentTime()": "1087",
                "depositTo(address,uint256,address,address)": "infinite",
                "estimateCreditAccrualTime(address,uint256,uint256)": "infinite",
                "initialize(address,address[],uint256)": "infinite",
                "initializeAll(address,address[],uint256,address)": "infinite",
                "isControlled(address)": "infinite",
                "liquidityCap()": "1065",
                "maxExitFeeMantissa()": "1087",
                "onERC721Received(address,address,uint256,bytes)": "632",
                "owner()": "1127",
                "prizeStrategy()": "1082",
                "redeem(uint256)": "infinite",
                "renounceOwnership()": "infinite",
                "reserveRegistry()": "1149",
                "reserveTotalSupply()": "1086",
                "setCreditPlanOf(address,uint128,uint128)": "infinite",
                "setCurrentTime(uint256)": "20324",
                "setLiquidityCap(uint256)": "infinite",
                "setPrizeStrategy(address)": "infinite",
                "supply(uint256)": "infinite",
                "token()": "infinite",
                "tokens()": "infinite",
                "transferExternalERC20(address,address,uint256)": "infinite",
                "transferOwnership(address)": "infinite",
                "withdrawInstantlyFrom(address,uint256,address,uint256)": "infinite",
                "withdrawReserve(address)": "infinite"
              },
              "internal": {
                "_balance()": "infinite",
                "_canAwardExternal(address)": "infinite",
                "_currentTime()": "815",
                "_redeem(uint256)": "infinite",
                "_supply(uint256)": "infinite",
                "_token()": "infinite"
              }
            },
            "methodIdentifiers": {
              "VERSION()": "ffa1ad74",
              "accountedBalance()": "0937eb54",
              "award(address,uint256,address)": "6b1b863a",
              "awardBalance()": "630665b4",
              "awardExternalERC20(address,address,uint256)": "2b0ab144",
              "awardExternalERC721(address,address,uint256[])": "16960d55",
              "balance()": "b69ef8a8",
              "balanceOfCredit(address,address)": "494de9f7",
              "beforeTokenTransfer(address,address,uint256)": "7cbab1c7",
              "calculateEarlyExitFee(address,address,uint256)": "888c2b6f",
              "calculateReserveFee(uint256)": "9fe32a91",
              "canAwardExternal(address)": "6a3fd4f9",
              "captureAwardBalance()": "e6d8a94b",
              "compLikeDelegate(address,address)": "2f7627e3",
              "creditPlanOf(address)": "d4a1361d",
              "currentTime()": "d18e81b3",
              "depositTo(address,uint256,address,address)": "e323f825",
              "estimateCreditAccrualTime(address,uint256,uint256)": "79cb8563",
              "initialize(address,address[],uint256)": "3ede50c6",
              "initializeAll(address,address[],uint256,address)": "610c75ea",
              "isControlled(address)": "78b3d327",
              "liquidityCap()": "76687d3d",
              "maxExitFeeMantissa()": "9e167519",
              "onERC721Received(address,address,uint256,bytes)": "150b7a02",
              "owner()": "8da5cb5b",
              "prizeStrategy()": "98bf3eb6",
              "redeem(uint256)": "db006a75",
              "renounceOwnership()": "715018a6",
              "reserveRegistry()": "8e71c1f6",
              "reserveTotalSupply()": "edb4e1cf",
              "setCreditPlanOf(address,uint128,uint128)": "a7b2cc31",
              "setCurrentTime(uint256)": "22f8e566",
              "setLiquidityCap(uint256)": "7b99adb1",
              "setPrizeStrategy(address)": "91ca480e",
              "supply(uint256)": "35403023",
              "token()": "fc0c546a",
              "tokens()": "9d63848a",
              "transferExternalERC20(address,address,uint256)": "13f55e39",
              "transferOwnership(address)": "f2fde38b",
              "withdrawInstantlyFrom(address,uint256,address,uint256)": "a016240b",
              "withdrawReserve(address)": "52a387ab"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"AwardCaptured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Awarded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"AwardedExternalERC20\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"AwardedExternalERC721\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract ControlledTokenInterface\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"ControlledTokenAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CreditBurned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CreditMinted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"creditLimitMantissa\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"creditRateMantissa\",\"type\":\"uint128\"}],\"name\":\"CreditPlanSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ErrorAwardingExternalERC721\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"reserveRegistry\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxExitFeeMantissa\",\"type\":\"uint256\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"redeemed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"exitFee\",\"type\":\"uint256\"}],\"name\":\"InstantWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"liquidityCap\",\"type\":\"uint256\"}],\"name\":\"LiquidityCapSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"prizeStrategy\",\"type\":\"address\"}],\"name\":\"PrizeStrategySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ReserveFeeCaptured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ReserveWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferredExternalERC20\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accountedBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"awardBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"awardExternalERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"awardExternalERC721\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"balance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"balanceOfCredit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"beforeTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"calculateEarlyExitFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"exitFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"burnedCredit\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"calculateReserveFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_externalToken\",\"type\":\"address\"}],\"name\":\"canAwardExternal\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"captureAwardBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ICompLike\",\"name\":\"compLike\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"compLikeDelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"creditPlanOf\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"creditLimitMantissa\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"creditRateMantissa\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_principal\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_interest\",\"type\":\"uint256\"}],\"name\":\"estimateCreditAccrualTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"durationSeconds\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"_reserveRegistry\",\"type\":\"address\"},{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"_controlledTokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_maxExitFeeMantissa\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"_reserveRegistry\",\"type\":\"address\"},{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"_controlledTokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_maxExitFeeMantissa\",\"type\":\"uint256\"},{\"internalType\":\"contract YieldSourceStub\",\"name\":\"_stubYieldSource\",\"type\":\"address\"}],\"name\":\"initializeAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ControlledTokenInterface\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"isControlled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"liquidityCap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxExitFeeMantissa\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizeStrategy\",\"outputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"redeemAmount\",\"type\":\"uint256\"}],\"name\":\"redeem\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reserveRegistry\",\"outputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reserveTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"_creditRateMantissa\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"_creditLimitMantissa\",\"type\":\"uint128\"}],\"name\":\"setCreditPlanOf\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_currentTime\",\"type\":\"uint256\"}],\"name\":\"setCurrentTime\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_liquidityCap\",\"type\":\"uint256\"}],\"name\":\"setLiquidityCap\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"_prizeStrategy\",\"type\":\"address\"}],\"name\":\"setPrizeStrategy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"mintAmount\",\"type\":\"uint256\"}],\"name\":\"supply\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokens\",\"outputs\":[{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferExternalERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maximumExitFee\",\"type\":\"uint256\"}],\"name\":\"withdrawInstantlyFrom\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawReserve\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"accountedBalance()\":{\"returns\":{\"_0\":\"The current total of all tokens\"}},\"award(address,uint256,address)\":{\"details\":\"The amount awarded must be less than the awardBalance()\",\"params\":{\"amount\":\"The amount of assets to be awarded\",\"controlledToken\":\"The address of the asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"awardBalance()\":{\"details\":\"captureAwardBalance() should be called first\",\"returns\":{\"_0\":\"The total amount of assets to be awarded for the current prize\"}},\"awardExternalERC20(address,address,uint256)\":{\"details\":\"Used to award any arbitrary tokens held by the Prize Pool\",\"params\":{\"amount\":\"The amount of external assets to be awarded\",\"externalToken\":\"The address of the external asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"awardExternalERC721(address,address,uint256[])\":{\"details\":\"Used to award any arbitrary NFTs held by the Prize Pool\",\"params\":{\"externalToken\":\"The address of the external NFT token being awarded\",\"to\":\"The address of the winner that receives the award\",\"tokenIds\":\"An array of NFT Token IDs to be transferred\"}},\"balance()\":{\"details\":\"Returns the total underlying balance of all assets. This includes both principal and interest.\",\"returns\":{\"_0\":\"The underlying balance of assets\"}},\"balanceOfCredit(address,address)\":{\"params\":{\"user\":\"The user whose credit balance should be returned\"},\"returns\":{\"_0\":\"The balance of the users credit\"}},\"beforeTokenTransfer(address,address,uint256)\":{\"params\":{\"amount\":\"The amount of tokens being trasferred\",\"from\":\"The address the tokens are being transferred from (0 if minting)\",\"to\":\"The address the tokens are being transferred to (0 if burning)\"}},\"calculateEarlyExitFee(address,address,uint256)\":{\"params\":{\"amount\":\"The amount of collateral to be withdrawn\",\"controlledToken\":\"The type of collateral being withdrawn\",\"from\":\"The user who is withdrawing\"},\"returns\":{\"burnedCredit\":\"The user's credit that was burned\",\"exitFee\":\"The exit fee\"}},\"calculateReserveFee(uint256)\":{\"params\":{\"amount\":\"The prize amount\"},\"returns\":{\"_0\":\"The size of the reserve portion of the prize\"}},\"canAwardExternal(address)\":{\"details\":\"Checks with the Prize Pool if a specific token type may be awarded as an external prize\",\"params\":{\"_externalToken\":\"The address of the token to check\"},\"returns\":{\"_0\":\"True if the token may be awarded, false otherwise\"}},\"captureAwardBalance()\":{\"details\":\"This function also captures the reserve fees.\",\"returns\":{\"_0\":\"The total amount of assets to be awarded for the current prize\"}},\"compLikeDelegate(address,address)\":{\"params\":{\"compLike\":\"The COMP-like token held by the prize pool that should be delegated\",\"to\":\"The address to delegate to \"}},\"creditPlanOf(address)\":{\"params\":{\"controlledToken\":\"The controlled token to retrieve the credit rates for\"},\"returns\":{\"creditLimitMantissa\":\"The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\",\"creditRateMantissa\":\"The credit rate. This is the amount of tokens that accrue per second.\"}},\"depositTo(address,uint256,address,address)\":{\"params\":{\"amount\":\"The amount of assets to deposit\",\"controlledToken\":\"The address of the type of token the user is minting\",\"referrer\":\"The referrer of the deposit\",\"to\":\"The address receiving the newly minted tokens\"}},\"estimateCreditAccrualTime(address,uint256,uint256)\":{\"params\":{\"_interest\":\"The amount of interest that must accrue\",\"_principal\":\"The principal amount on which interest is accruing\"},\"returns\":{\"durationSeconds\":\"The duration of time it will take to accrue the given amount of interest, in seconds.\"}},\"initialize(address,address[],uint256)\":{\"params\":{\"_controlledTokens\":\"Array of ControlledTokens that are controlled by this Prize Pool.\",\"_maxExitFeeMantissa\":\"The maximum exit fee size\"}},\"isControlled(address)\":{\"details\":\"Checks if a specific token is controlled by the Prize Pool\",\"params\":{\"controlledToken\":\"The address of the token to check\"},\"returns\":{\"_0\":\"True if the token is a controlled token, false otherwise\"}},\"onERC721Received(address,address,uint256,bytes)\":{\"params\":{\"data\":\"Additional data with no specified format, sent in call to `_to`.\",\"from\":\"The current owner of the NFT\",\"operator\":\"The address that acts on behalf of the owner\",\"tokenId\":\"The NFT to transfer\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setCreditPlanOf(address,uint128,uint128)\":{\"params\":{\"_controlledToken\":\"The controlled token for whom to set the credit plan\",\"_creditLimitMantissa\":\"The credit limit to set.  Is a fixed point 18 decimal (like Ether).\",\"_creditRateMantissa\":\"The credit rate to set.  Is a fixed point 18 decimal (like Ether).\"}},\"setLiquidityCap(uint256)\":{\"params\":{\"_liquidityCap\":\"The new liquidity cap for the prize pool\"}},\"setPrizeStrategy(address)\":{\"params\":{\"_prizeStrategy\":\"The new prize strategy\"}},\"token()\":{\"details\":\"Returns the address of the underlying ERC20 asset\",\"returns\":{\"_0\":\"The address of the asset\"}},\"tokens()\":{\"returns\":{\"_0\":\"An array of controlled token addresses\"}},\"transferExternalERC20(address,address,uint256)\":{\"details\":\"Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\",\"params\":{\"amount\":\"The amount of external assets to be awarded\",\"externalToken\":\"The address of the external asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"withdrawInstantlyFrom(address,uint256,address,uint256)\":{\"params\":{\"amount\":\"The amount of tokens to redeem for assets.\",\"controlledToken\":\"The address of the token to redeem (i.e. ticket or sponsorship)\",\"from\":\"The address to redeem tokens from.\",\"maximumExitFee\":\"The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\"},\"returns\":{\"_0\":\"The actual exit fee paid\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"VERSION()\":{\"notice\":\"Semver Version\"},\"accountedBalance()\":{\"notice\":\"The total of all controlled tokens\"},\"award(address,uint256,address)\":{\"notice\":\"Called by the prize strategy to award prizes.\"},\"awardBalance()\":{\"notice\":\"Returns the balance that is available to award.\"},\"awardExternalERC20(address,address,uint256)\":{\"notice\":\"Called by the Prize-Strategy to award external ERC20 prizes\"},\"awardExternalERC721(address,address,uint256[])\":{\"notice\":\"Called by the prize strategy to award external ERC721 prizes\"},\"balanceOfCredit(address,address)\":{\"notice\":\"Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\"},\"beforeTokenTransfer(address,address,uint256)\":{\"notice\":\"Updates the Prize Strategy when tokens are transferred between holders.\"},\"calculateEarlyExitFee(address,address,uint256)\":{\"notice\":\"Calculates the early exit fee for the given amount\"},\"calculateReserveFee(uint256)\":{\"notice\":\"Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\"},\"captureAwardBalance()\":{\"notice\":\"Captures any available interest as award balance.\"},\"compLikeDelegate(address,address)\":{\"notice\":\"Delegate the votes for a Compound COMP-like token held by the prize pool\"},\"creditPlanOf(address)\":{\"notice\":\"Returns the credit rate of a controlled token\"},\"depositTo(address,uint256,address,address)\":{\"notice\":\"Deposit assets into the Prize Pool in exchange for tokens\"},\"estimateCreditAccrualTime(address,uint256,uint256)\":{\"notice\":\"Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\"},\"initialize(address,address[],uint256)\":{\"notice\":\"Initializes the Prize Pool\"},\"onERC721Received(address,address,uint256,bytes)\":{\"notice\":\"Required for ERC721 safe token transfers from smart contracts.\"},\"setCreditPlanOf(address,uint128,uint128)\":{\"notice\":\"Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\"},\"setLiquidityCap(uint256)\":{\"notice\":\"Allows the Governor to set a cap on the amount of liquidity that he pool can hold\"},\"setPrizeStrategy(address)\":{\"notice\":\"Sets the prize strategy of the prize pool.  Only callable by the owner.\"},\"tokens()\":{\"notice\":\"An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\"},\"transferExternalERC20(address,address,uint256)\":{\"notice\":\"Called by the Prize-Strategy to transfer out external ERC20 tokens\"},\"withdrawInstantlyFrom(address,uint256,address,uint256)\":{\"notice\":\"Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/PrizePoolHarness.sol\":\"PrizePoolHarness\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../external/compound/ICompLike.sol\\\";\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../reserve/ReserveInterface.sol\\\";\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/TokenListenerLibrary.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\nimport \\\"./PrizePoolInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using SafeERC20Upgradeable for IERC721Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    address reserveRegistry,\\n    uint256 maxExitFeeMantissa\\n  );\\n\\n  /// @dev Event emitted when controlled token is added\\n  event ControlledTokenAdded(\\n    ControlledTokenInterface indexed token\\n  );\\n\\n  /// @dev Emitted when reserve is captured.\\n  event ReserveFeeCaptured(\\n    uint256 amount\\n  );\\n\\n  event AwardCaptured(\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when assets are deposited\\n  event Deposited(\\n    address indexed operator,\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount,\\n    address referrer\\n  );\\n\\n  /// @dev Event emitted when interest is awarded to a winner\\n  event Awarded(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are awarded to a winner\\n  event AwardedExternalERC20(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are transferred out\\n  event TransferredExternalERC20(\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC721s are awarded to a winner\\n  event AwardedExternalERC721(\\n    address indexed winner,\\n    address indexed token,\\n    uint256[] tokenIds\\n  );\\n\\n  /// @dev Event emitted when assets are withdrawn instantly\\n  event InstantWithdrawal(\\n    address indexed operator,\\n    address indexed from,\\n    address indexed token,\\n    uint256 amount,\\n    uint256 redeemed,\\n    uint256 exitFee\\n  );\\n\\n  event ReserveWithdrawal(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when the Liquidity Cap is set\\n  event LiquidityCapSet(\\n    uint256 liquidityCap\\n  );\\n\\n  /// @dev Event emitted when the Credit plan is set\\n  event CreditPlanSet(\\n    address token,\\n    uint128 creditLimitMantissa,\\n    uint128 creditRateMantissa\\n  );\\n\\n  /// @dev Event emitted when the Prize Strategy is set\\n  event PrizeStrategySet(\\n    address indexed prizeStrategy\\n  );\\n\\n  /// @dev Emitted when credit is minted\\n  event CreditMinted(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when credit is burned\\n  event CreditBurned(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\\n  event ErrorAwardingExternalERC721(bytes error);\\n\\n\\n  struct CreditPlan {\\n    uint128 creditLimitMantissa;\\n    uint128 creditRateMantissa;\\n  }\\n\\n  struct CreditBalance {\\n    uint192 balance;\\n    uint32 timestamp;\\n    bool initialized;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  /// @dev Reserve to which reserve fees are sent\\n  RegistryInterface public reserveRegistry;\\n\\n  /// @dev An array of all the controlled tokens\\n  ControlledTokenInterface[] internal _tokens;\\n\\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\\n  TokenListenerInterface public prizeStrategy;\\n\\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\\n  /// For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\\n  uint256 public maxExitFeeMantissa;\\n\\n  /// @dev The total funds that have been allocated to the reserve\\n  uint256 public reserveTotalSupply;\\n\\n  /// @dev The total amount of funds that the prize pool can hold.\\n  uint256 public liquidityCap;\\n\\n  /// @dev the The awardable balance\\n  uint256 internal _currentAwardBalance;\\n\\n  /// @dev Stores the credit plan for each token.\\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\\n\\n  /// @dev Stores each users balance of credit per token.\\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\\n\\n  /// @notice Initializes the Prize Pool\\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\\n  /// @param _maxExitFeeMantissa The maximum exit fee size\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_reserveRegistry) != address(0), \\\"PrizePool/reserveRegistry-not-zero\\\");\\n    uint256 controlledTokensLength = _controlledTokens.length;\\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\\n\\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\\n      _addControlledToken(controlledToken, i);\\n    }\\n    __Ownable_init();\\n    __ReentrancyGuard_init();\\n    _setLiquidityCap(uint256(-1));\\n\\n    reserveRegistry = _reserveRegistry;\\n    maxExitFeeMantissa = _maxExitFeeMantissa;\\n\\n    emit Initialized(\\n      address(_reserveRegistry),\\n      maxExitFeeMantissa\\n    );\\n  }\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external override view returns (address) {\\n    return address(_token());\\n  }\\n\\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\\n  /// @return The underlying balance of assets\\n  function balance() external returns (uint256) {\\n    return _balance();\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function canAwardExternal(address _externalToken) external view returns (bool) {\\n    return _canAwardExternal(_externalToken);\\n  }\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    canAddLiquidity(amount)\\n  {\\n    address operator = _msgSender();\\n\\n    _mint(to, amount, controlledToken, referrer);\\n\\n    _token().safeTransferFrom(operator, address(this), amount);\\n    _supply(amount);\\n\\n    emit Deposited(operator, to, controlledToken, amount, referrer);\\n  }\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    returns (uint256)\\n  {\\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n    require(exitFee <= maximumExitFee, \\\"PrizePool/exit-fee-exceeds-user-maximum\\\");\\n\\n    // burn the credit\\n    _burnCredit(from, controlledToken, burnedCredit);\\n\\n    // burn the tickets\\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\\n\\n    // redeem the tickets less the fee\\n    uint256 amountLessFee = amount.sub(exitFee);\\n    uint256 redeemed = _redeem(amountLessFee);\\n\\n    _token().safeTransfer(from, redeemed);\\n\\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\\n\\n    return exitFee;\\n  }\\n\\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\\n  /// @param exitFee The exit fee to check against the limit\\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\\n    if (exitFee > maxFee) {\\n      exitFee = maxFee;\\n    }\\n    return exitFee;\\n  }\\n\\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\\n  /// @param from The address the tokens are being transferred from (0 if minting)\\n  /// @param to The address the tokens are being transferred to (0 if burning)\\n  /// @param amount The amount of tokens being trasferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\\n    if (from != address(0)) {\\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\\n      // first accrue credit for their old balance\\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\\n\\n      if (from != to) {\\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\\n      }\\n\\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\\n    }\\n    if (to != address(0) && to != from) {\\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\\n    }\\n    // if we aren't minting\\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\\n    }\\n  }\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external override view returns (uint256) {\\n    return _currentAwardBalance;\\n  }\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n\\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\\n    uint256 currentBalance = _balance();\\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\\n\\n    if (unaccountedPrizeBalance > 0) {\\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\\n      if (reserveFee > 0) {\\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\\n        emit ReserveFeeCaptured(reserveFee);\\n      }\\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\\n\\n      emit AwardCaptured(unaccountedPrizeBalance);\\n    }\\n\\n    return _currentAwardBalance;\\n  }\\n\\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\\n\\n    uint256 amount = reserveTotalSupply;\\n    reserveTotalSupply = 0;\\n    uint256 redeemed = _redeem(amount);\\n\\n    _token().safeTransfer(address(to), redeemed);\\n\\n    emit ReserveWithdrawal(to, amount);\\n\\n    return redeemed;\\n  }\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external override\\n    onlyPrizeStrategy\\n    onlyControlledToken(controlledToken)\\n  {\\n    if (amount == 0) {\\n      return;\\n    }\\n\\n    require(amount <= _currentAwardBalance, \\\"PrizePool/award-exceeds-avail\\\");\\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\\n\\n    _mint(to, amount, controlledToken, address(0));\\n\\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\\n\\n    emit Awarded(to, controlledToken, amount);\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit TransferredExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit AwardedExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  function _transferOut(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (bool)\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (amount == 0) {\\n      return false;\\n    }\\n\\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\\n\\n    return true;\\n  }\\n\\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\\n  /// @param to The user who is receiving the tokens\\n  /// @param amount The amount of tokens they are receiving\\n  /// @param controlledToken The token that is going to be minted\\n  /// @param referrer The user who referred the minting\\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\\n    if (address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n    ControlledToken(controlledToken).controllerMint(to, amount);\\n  }\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (tokenIds.length == 0) {\\n      return;\\n    }\\n\\n    for (uint256 i = 0; i < tokenIds.length; i++) {\\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\\n\\n      }\\n      catch(bytes memory error){\\n        emit ErrorAwardingExternalERC721(error);\\n      }\\n      \\n    }\\n\\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\\n  }\\n\\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\\n  /// @param amount The prize amount\\n  /// @return The size of the reserve portion of the prize\\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    if (address(reserve) == address(0)) {\\n      return 0;\\n    }\\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\\n    if (reserveRateMantissa == 0) {\\n      return 0;\\n    }\\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\\n  }\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external override\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    )\\n  {\\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n  }\\n\\n  /// @dev Calculates the early exit fee for the given amount\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return Exit fee\\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\\n    return _limitExitFee(\\n      amount,\\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external override\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    durationSeconds =_estimateCreditAccrualTime(\\n      _controlledToken,\\n      _principal,\\n      _interest\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function _estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    internal\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    // interest = credit rate * principal * time\\n    // => time = interest / (credit rate * principal)\\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\\n    if (accruedPerSecond == 0) {\\n      return 0;\\n    }\\n    return _interest.div(accruedPerSecond);\\n  }\\n\\n  /// @notice Burns a users credit.\\n  /// @param user The user whose credit should be burned\\n  /// @param credit The amount of credit to burn\\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\\n\\n    emit CreditBurned(user, controlledToken, credit);\\n  }\\n\\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\\n  /// @param user The user for whom to accrue credit\\n  /// @param controlledToken The controlled token whose balance we are checking\\n  /// @param controlledTokenBalance The balance to use for the user\\n  /// @param extra Additional credit to be added\\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\\n    _updateCreditBalance(\\n      user,\\n      controlledToken,\\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\\n    );\\n  }\\n\\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\\n    uint256 newBalance;\\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\\n    if (!creditBalance.initialized) {\\n      newBalance = 0;\\n    } else {\\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\\n    }\\n    return newBalance;\\n  }\\n\\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\\n\\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\\n      balance: newBalance.toUint128(),\\n      timestamp: _currentTime().toUint32(),\\n      initialized: true\\n    });\\n\\n    if (oldBalance < newBalance) {\\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\\n    } \\n    else if (newBalance < oldBalance) {\\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\\n    }\\n  }\\n\\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\\n  /// @param creditBalance The new credit balance to be checked\\n  /// @return The users new credit balance.  Will not exceed the credit limit.\\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\\n      controlledTokenBalance,\\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\\n    );\\n    if (creditBalance > creditLimit) {\\n      creditBalance = creditLimit;\\n    }\\n\\n    return creditBalance;\\n  }\\n\\n  /// @notice Calculates the accrued interest for a user\\n  /// @param user The user whose credit should be calculated.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\\n  /// @return The credit that has accrued since the last credit update.\\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\\n\\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\\n      return 0;\\n    }\\n\\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\\n  }\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\\n    return _tokenCreditBalances[controlledToken][user].balance;\\n  }\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external override\\n    onlyControlledToken(_controlledToken)\\n    onlyOwner\\n  {\\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\\n      creditLimitMantissa: _creditLimitMantissa,\\n      creditRateMantissa: _creditRateMantissa\\n    });\\n\\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\\n  }\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external override\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    )\\n  {\\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\\n  }\\n\\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The token they are withdrawing\\n  /// @param amount The amount of funds they are withdrawing\\n  /// @return earlyExitFee The additional exit fee that should be charged.\\n  /// @return creditBurned The amount of credit that will be burned\\n  function _calculateEarlyExitFeeLessBurnedCredit(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (\\n      uint256 earlyExitFee,\\n      uint256 creditBurned\\n    )\\n  {\\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\\n    require(controlledTokenBalance >= amount, \\\"PrizePool/insuff-funds\\\");\\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\\n    /*\\n    The credit is used *last*.  Always charge the fees up-front.\\n\\n    How to calculate:\\n\\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\\n\\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\\n    */\\n\\n    // Determine available usable credit based on withdraw amount\\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\\n\\n    uint256 availableCredit;\\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\\n    }\\n\\n    // Determine amount of credit to burn and amount of fees required\\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\\n    earlyExitFee = totalExitFee.sub(creditBurned);\\n  }\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\\n    _setLiquidityCap(_liquidityCap);\\n  }\\n\\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\\n    liquidityCap = _liquidityCap;\\n    emit LiquidityCapSet(_liquidityCap);\\n  }\\n\\n  /// @notice Adds a new controlled token\\n  /// @param _controlledToken The controlled token to add.\\n  /// @param index The index to add the controlledToken\\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\\n    require(_controlledToken.controller() == this, \\\"PrizePool/token-ctrlr-mismatch\\\");\\n    \\n    _tokens[index] = _controlledToken;\\n    emit ControlledTokenAdded(_controlledToken);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\\n    _setPrizeStrategy(_prizeStrategy);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\\n    require(address(_prizeStrategy) != address(0), \\\"PrizePool/prizeStrategy-not-zero\\\");\\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PrizePool/prizeStrategy-invalid\\\");\\n    prizeStrategy = _prizeStrategy;\\n\\n    emit PrizeStrategySet(address(_prizeStrategy));\\n  }\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\\n    return _tokens;\\n  }\\n\\n  /// @dev Gets the current time as represented by the current block\\n  /// @return The timestamp of the current block\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external override view returns (uint256) {\\n    return _tokenTotalSupply();\\n  }\\n\\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\\n  /// @param to The address to delegate to \\n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\\n    if (compLike.balanceOf(address(this)) > 0) {\\n      compLike.delegate(to);\\n    }\\n  }\\n  \\n  /// @notice Required for ERC721 safe token transfers from smart contracts.\\n  /// @param operator The address that acts on behalf of the owner\\n  /// @param from The current owner of the NFT\\n  /// @param tokenId The NFT to transfer\\n  /// @param data Additional data with no specified format, sent in call to `_to`.\\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function _tokenTotalSupply() internal view returns (uint256) {\\n    uint256 total = reserveTotalSupply;\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \\n    uint256 tokensLength = tokens.length;\\n    \\n    for(uint256 i = 0; i < tokensLength; i++){\\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\\n    }\\n\\n    return total;\\n  }\\n\\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\\n  }\\n\\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\\n    uint256 tokensLength = tokens.length;\\n\\n    for(uint256 i = 0; i < tokensLength; i++) {\\n      if(tokens[i] == controlledToken) return true;\\n    }\\n    return false;\\n  }\\n  \\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\\n    return _isControlled(controlledToken);\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function _token() internal virtual view returns (IERC20Upgradeable);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal virtual returns (uint256);\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal virtual;\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\\n\\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  modifier onlyControlledToken(address controlledToken) {\\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \\\"PrizePool/unknown-token\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure caller is the prize-strategy\\n  modifier onlyPrizeStrategy() {\\n    require(_msgSender() == address(prizeStrategy), \\\"PrizePool/only-prizeStrategy\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\\n  modifier canAddLiquidity(uint256 _amount) {\\n    require(_canAddLiquidity(_amount), \\\"PrizePool/exceeds-liquidity-cap\\\");\\n    _;\\n  }\\n\\n  modifier onlyReserve() {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    require(address(reserve) == msg.sender, \\\"PrizePool/only-reserve\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x386ebc1c80ab4424f14125e716dd12641ff933b475bf1082b7b1a6eee4a969c3\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/test/PrizePoolHarness.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"../prize-pool/PrizePool.sol\\\";\\nimport \\\"./YieldSourceStub.sol\\\";\\n\\ncontract PrizePoolHarness is PrizePool {\\n\\n  uint256 public currentTime;\\n\\n  YieldSourceStub stubYieldSource;\\n\\n  function initializeAll(\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa,\\n    YieldSourceStub _stubYieldSource\\n  )\\n    public\\n  {\\n    PrizePool.initialize(\\n      _reserveRegistry,\\n      _controlledTokens,\\n      _maxExitFeeMantissa\\n    );\\n    stubYieldSource = _stubYieldSource;\\n  }\\n\\n  function supply(uint256 mintAmount) external {\\n    _supply(mintAmount);\\n  }\\n\\n  function redeem(uint256 redeemAmount) external {\\n    _redeem(redeemAmount);\\n  }\\n\\n  function setCurrentTime(uint256 _currentTime) external {\\n    currentTime = _currentTime;\\n  }\\n\\n  function _currentTime() internal override view returns (uint256) {\\n    return currentTime;\\n  }\\n\\n  function _canAwardExternal(address _externalToken) internal override view returns (bool) {\\n    return stubYieldSource.canAwardExternal(_externalToken);\\n  }\\n\\n  function _token() internal override view returns (IERC20Upgradeable) {\\n    return stubYieldSource.token();\\n  }\\n\\n  function _balance() internal override returns (uint256) {\\n    return stubYieldSource.balance();\\n  }\\n\\n  function _supply(uint256 mintAmount) internal override {\\n    return stubYieldSource.supply(mintAmount);\\n  }\\n\\n  function _redeem(uint256 redeemAmount) internal override returns (uint256) {\\n    return stubYieldSource.redeem(redeemAmount);\\n  }\\n}\\n\",\"keccak256\":\"0xe29ef1a9d2243db8e58417ef8d34035e0a2cf8ed94658905889f4725e2c6ae97\"},\"contracts/test/YieldSourceStub.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface YieldSourceStub {\\n  function canAwardExternal(address _externalToken) external view returns (bool);\\n\\n  function token() external view returns (IERC20Upgradeable);\\n\\n  function balance() external returns (uint256);\\n\\n  function supply(uint256 mintAmount) external;\\n\\n  function redeem(uint256 redeemAmount) external returns (uint256);\\n}\\n\",\"keccak256\":\"0xc165f66ed227a4ec0a4d316d0ffcb4b7fcc5833935bb638c75f13a1e40a16fdc\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/test/PrizePoolHarness.sol:PrizePoolHarness",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/test/PrizePoolHarness.sol:PrizePoolHarness",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/test/PrizePoolHarness.sol:PrizePoolHarness",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 10,
                "contract": "contracts/test/PrizePoolHarness.sol:PrizePoolHarness",
                "label": "_owner",
                "offset": 0,
                "slot": "51",
                "type": "t_address"
              },
              {
                "astId": 129,
                "contract": "contracts/test/PrizePoolHarness.sol:PrizePoolHarness",
                "label": "__gap",
                "offset": 0,
                "slot": "52",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 4743,
                "contract": "contracts/test/PrizePoolHarness.sol:PrizePoolHarness",
                "label": "_status",
                "offset": 0,
                "slot": "101",
                "type": "t_uint256"
              },
              {
                "astId": 4786,
                "contract": "contracts/test/PrizePoolHarness.sol:PrizePoolHarness",
                "label": "__gap",
                "offset": 0,
                "slot": "102",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 6817,
                "contract": "contracts/test/PrizePoolHarness.sol:PrizePoolHarness",
                "label": "reserveRegistry",
                "offset": 0,
                "slot": "151",
                "type": "t_contract(RegistryInterface)12458"
              },
              {
                "astId": 6821,
                "contract": "contracts/test/PrizePoolHarness.sol:PrizePoolHarness",
                "label": "_tokens",
                "offset": 0,
                "slot": "152",
                "type": "t_array(t_contract(ControlledTokenInterface)15850)dyn_storage"
              },
              {
                "astId": 6824,
                "contract": "contracts/test/PrizePoolHarness.sol:PrizePoolHarness",
                "label": "prizeStrategy",
                "offset": 0,
                "slot": "153",
                "type": "t_contract(TokenListenerInterface)16265"
              },
              {
                "astId": 6827,
                "contract": "contracts/test/PrizePoolHarness.sol:PrizePoolHarness",
                "label": "maxExitFeeMantissa",
                "offset": 0,
                "slot": "154",
                "type": "t_uint256"
              },
              {
                "astId": 6830,
                "contract": "contracts/test/PrizePoolHarness.sol:PrizePoolHarness",
                "label": "reserveTotalSupply",
                "offset": 0,
                "slot": "155",
                "type": "t_uint256"
              },
              {
                "astId": 6833,
                "contract": "contracts/test/PrizePoolHarness.sol:PrizePoolHarness",
                "label": "liquidityCap",
                "offset": 0,
                "slot": "156",
                "type": "t_uint256"
              },
              {
                "astId": 6836,
                "contract": "contracts/test/PrizePoolHarness.sol:PrizePoolHarness",
                "label": "_currentAwardBalance",
                "offset": 0,
                "slot": "157",
                "type": "t_uint256"
              },
              {
                "astId": 6841,
                "contract": "contracts/test/PrizePoolHarness.sol:PrizePoolHarness",
                "label": "_tokenCreditPlans",
                "offset": 0,
                "slot": "158",
                "type": "t_mapping(t_address,t_struct(CreditPlan)6803_storage)"
              },
              {
                "astId": 6848,
                "contract": "contracts/test/PrizePoolHarness.sol:PrizePoolHarness",
                "label": "_tokenCreditBalances",
                "offset": 0,
                "slot": "159",
                "type": "t_mapping(t_address,t_mapping(t_address,t_struct(CreditBalance)6810_storage))"
              },
              {
                "astId": 14359,
                "contract": "contracts/test/PrizePoolHarness.sol:PrizePoolHarness",
                "label": "currentTime",
                "offset": 0,
                "slot": "160",
                "type": "t_uint256"
              },
              {
                "astId": 14361,
                "contract": "contracts/test/PrizePoolHarness.sol:PrizePoolHarness",
                "label": "stubYieldSource",
                "offset": 0,
                "slot": "161",
                "type": "t_contract(YieldSourceStub)14924"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_contract(ControlledTokenInterface)15850)dyn_storage": {
                "base": "t_contract(ControlledTokenInterface)15850",
                "encoding": "dynamic_array",
                "label": "contract ControlledTokenInterface[]",
                "numberOfBytes": "32"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_contract(ControlledTokenInterface)15850": {
                "encoding": "inplace",
                "label": "contract ControlledTokenInterface",
                "numberOfBytes": "20"
              },
              "t_contract(RegistryInterface)12458": {
                "encoding": "inplace",
                "label": "contract RegistryInterface",
                "numberOfBytes": "20"
              },
              "t_contract(TokenListenerInterface)16265": {
                "encoding": "inplace",
                "label": "contract TokenListenerInterface",
                "numberOfBytes": "20"
              },
              "t_contract(YieldSourceStub)14924": {
                "encoding": "inplace",
                "label": "contract YieldSourceStub",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_mapping(t_address,t_struct(CreditBalance)6810_storage))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => struct PrizePool.CreditBalance))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_struct(CreditBalance)6810_storage)"
              },
              "t_mapping(t_address,t_struct(CreditBalance)6810_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct PrizePool.CreditBalance)",
                "numberOfBytes": "32",
                "value": "t_struct(CreditBalance)6810_storage"
              },
              "t_mapping(t_address,t_struct(CreditPlan)6803_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct PrizePool.CreditPlan)",
                "numberOfBytes": "32",
                "value": "t_struct(CreditPlan)6803_storage"
              },
              "t_struct(CreditBalance)6810_storage": {
                "encoding": "inplace",
                "label": "struct PrizePool.CreditBalance",
                "members": [
                  {
                    "astId": 6805,
                    "contract": "contracts/test/PrizePoolHarness.sol:PrizePoolHarness",
                    "label": "balance",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint192"
                  },
                  {
                    "astId": 6807,
                    "contract": "contracts/test/PrizePoolHarness.sol:PrizePoolHarness",
                    "label": "timestamp",
                    "offset": 24,
                    "slot": "0",
                    "type": "t_uint32"
                  },
                  {
                    "astId": 6809,
                    "contract": "contracts/test/PrizePoolHarness.sol:PrizePoolHarness",
                    "label": "initialized",
                    "offset": 28,
                    "slot": "0",
                    "type": "t_bool"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_struct(CreditPlan)6803_storage": {
                "encoding": "inplace",
                "label": "struct PrizePool.CreditPlan",
                "members": [
                  {
                    "astId": 6800,
                    "contract": "contracts/test/PrizePoolHarness.sol:PrizePoolHarness",
                    "label": "creditLimitMantissa",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint128"
                  },
                  {
                    "astId": 6802,
                    "contract": "contracts/test/PrizePoolHarness.sol:PrizePoolHarness",
                    "label": "creditRateMantissa",
                    "offset": 16,
                    "slot": "0",
                    "type": "t_uint128"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_uint128": {
                "encoding": "inplace",
                "label": "uint128",
                "numberOfBytes": "16"
              },
              "t_uint192": {
                "encoding": "inplace",
                "label": "uint192",
                "numberOfBytes": "24"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint32": {
                "encoding": "inplace",
                "label": "uint32",
                "numberOfBytes": "4"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "VERSION()": {
                "notice": "Semver Version"
              },
              "accountedBalance()": {
                "notice": "The total of all controlled tokens"
              },
              "award(address,uint256,address)": {
                "notice": "Called by the prize strategy to award prizes."
              },
              "awardBalance()": {
                "notice": "Returns the balance that is available to award."
              },
              "awardExternalERC20(address,address,uint256)": {
                "notice": "Called by the Prize-Strategy to award external ERC20 prizes"
              },
              "awardExternalERC721(address,address,uint256[])": {
                "notice": "Called by the prize strategy to award external ERC721 prizes"
              },
              "balanceOfCredit(address,address)": {
                "notice": "Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit."
              },
              "beforeTokenTransfer(address,address,uint256)": {
                "notice": "Updates the Prize Strategy when tokens are transferred between holders."
              },
              "calculateEarlyExitFee(address,address,uint256)": {
                "notice": "Calculates the early exit fee for the given amount"
              },
              "calculateReserveFee(uint256)": {
                "notice": "Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero."
              },
              "captureAwardBalance()": {
                "notice": "Captures any available interest as award balance."
              },
              "compLikeDelegate(address,address)": {
                "notice": "Delegate the votes for a Compound COMP-like token held by the prize pool"
              },
              "creditPlanOf(address)": {
                "notice": "Returns the credit rate of a controlled token"
              },
              "depositTo(address,uint256,address,address)": {
                "notice": "Deposit assets into the Prize Pool in exchange for tokens"
              },
              "estimateCreditAccrualTime(address,uint256,uint256)": {
                "notice": "Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit."
              },
              "initialize(address,address[],uint256)": {
                "notice": "Initializes the Prize Pool"
              },
              "onERC721Received(address,address,uint256,bytes)": {
                "notice": "Required for ERC721 safe token transfers from smart contracts."
              },
              "setCreditPlanOf(address,uint128,uint128)": {
                "notice": "Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether)."
              },
              "setLiquidityCap(uint256)": {
                "notice": "Allows the Governor to set a cap on the amount of liquidity that he pool can hold"
              },
              "setPrizeStrategy(address)": {
                "notice": "Sets the prize strategy of the prize pool.  Only callable by the owner."
              },
              "tokens()": {
                "notice": "An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)"
              },
              "transferExternalERC20(address,address,uint256)": {
                "notice": "Called by the Prize-Strategy to transfer out external ERC20 tokens"
              },
              "withdrawInstantlyFrom(address,uint256,address,uint256)": {
                "notice": "Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit."
              }
            },
            "version": 1
          }
        }
      },
      "contracts/test/PrizeSplitHarness.sol": {
        "PrizeSplitHarness": {
          "abi": [
            {
              "inputs": [],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "uint256",
                  "name": "target",
                  "type": "uint256"
                }
              ],
              "name": "PrizeSplitRemoved",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "target",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint16",
                  "name": "percentage",
                  "type": "uint16"
                },
                {
                  "indexed": false,
                  "internalType": "uint8",
                  "name": "token",
                  "type": "uint8"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "index",
                  "type": "uint256"
                }
              ],
              "name": "PrizeSplitSet",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "beforeTokenTransfer",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "prizeAmount",
                  "type": "uint256"
                }
              ],
              "name": "distribute",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract ControlledToken[]",
                  "name": "tokens",
                  "type": "address[]"
                }
              ],
              "name": "initialize",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "prizeSplitIndex",
                  "type": "uint256"
                }
              ],
              "name": "prizeSplit",
              "outputs": [
                {
                  "components": [
                    {
                      "internalType": "address",
                      "name": "target",
                      "type": "address"
                    },
                    {
                      "internalType": "uint16",
                      "name": "percentage",
                      "type": "uint16"
                    },
                    {
                      "internalType": "uint8",
                      "name": "token",
                      "type": "uint8"
                    }
                  ],
                  "internalType": "struct PrizeSplit.PrizeSplitConfig",
                  "name": "",
                  "type": "tuple"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizeSplits",
              "outputs": [
                {
                  "components": [
                    {
                      "internalType": "address",
                      "name": "target",
                      "type": "address"
                    },
                    {
                      "internalType": "uint16",
                      "name": "percentage",
                      "type": "uint16"
                    },
                    {
                      "internalType": "uint8",
                      "name": "token",
                      "type": "uint8"
                    }
                  ],
                  "internalType": "struct PrizeSplit.PrizeSplitConfig[]",
                  "name": "",
                  "type": "tuple[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "renounceOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "components": [
                    {
                      "internalType": "address",
                      "name": "target",
                      "type": "address"
                    },
                    {
                      "internalType": "uint16",
                      "name": "percentage",
                      "type": "uint16"
                    },
                    {
                      "internalType": "uint8",
                      "name": "token",
                      "type": "uint8"
                    }
                  ],
                  "internalType": "struct PrizeSplit.PrizeSplitConfig",
                  "name": "prizeStrategySplit",
                  "type": "tuple"
                },
                {
                  "internalType": "uint8",
                  "name": "prizeSplitIndex",
                  "type": "uint8"
                }
              ],
              "name": "setPrizeSplit",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "components": [
                    {
                      "internalType": "address",
                      "name": "target",
                      "type": "address"
                    },
                    {
                      "internalType": "uint16",
                      "name": "percentage",
                      "type": "uint16"
                    },
                    {
                      "internalType": "uint8",
                      "name": "token",
                      "type": "uint8"
                    }
                  ],
                  "internalType": "struct PrizeSplit.PrizeSplitConfig[]",
                  "name": "newPrizeSplits",
                  "type": "tuple[]"
                }
              ],
              "name": "setPrizeSplits",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "owner()": {
                "details": "Returns the address of the current owner."
              },
              "prizeSplit(uint256)": {
                "details": "Read PrizeSplitConfig struct from _prizeSplits array.",
                "params": {
                  "prizeSplitIndex": "Index position of PrizeSplitConfig"
                },
                "returns": {
                  "_0": "PrizeSplitConfig Single prize split config"
                }
              },
              "prizeSplits()": {
                "details": "Read all PrizeSplitConfig structs stored in _prizeSplits.",
                "returns": {
                  "_0": "_prizeSplits Array of PrizeSplitConfig structs"
                }
              },
              "renounceOwnership()": {
                "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
              },
              "setPrizeSplit((address,uint16,uint8),uint8)": {
                "details": "Updates a prize split config by passing a new PrizeSplitConfig struct and current index position. Limited to contract owner.",
                "params": {
                  "prizeSplitIndex": "Index position of PrizeSplitConfig to update",
                  "prizeStrategySplit": "PrizeSplitConfig config struct"
                }
              },
              "setPrizeSplits((address,uint16,uint8)[])": {
                "details": "Set and remove prize split configs by passing a new PrizeSplitConfig structs array. Will remove existing PrizeSplitConfig(s) if passed array length is less than existing _prizeSplits length.",
                "params": {
                  "newPrizeSplits": "Array of PrizeSplitConfig structs"
                }
              },
              "transferOwnership(address)": {
                "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60806040523480156200001157600080fd5b506200001c62000022565b620002b0565b600054610100900460ff16806200003e57506200003e620000cb565b806200004d575060005460ff16155b620000755760405162461bcd60e51b81526004016200006c9062000262565b60405180910390fd5b600054610100900460ff16158015620000a1576000805460ff1961ff0019909116610100171660011790555b620000ab620000e9565b620000b562000173565b8015620000c8576000805461ff00191690555b50565b6000620000e3306200025860201b620009881760201c565b15905090565b600054610100900460ff168062000105575062000105620000cb565b8062000114575060005460ff16155b620001335760405162461bcd60e51b81526004016200006c9062000262565b600054610100900460ff16158015620000b5576000805460ff1961ff0019909116610100171660011790558015620000c8576000805461ff001916905550565b600054610100900460ff16806200018f57506200018f620000cb565b806200019e575060005460ff16155b620001bd5760405162461bcd60e51b81526004016200006c9062000262565b600054610100900460ff16158015620001e9576000805460ff1961ff0019909116610100171660011790555b6000620001f56200025e565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015620000c8576000805461ff001916905550565b3b151590565b3390565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b61123980620002c06000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063a224cee711610066578063a224cee714610113578063c25a9c3214610126578063eefc8ad114610139578063f2fde38b14610159578063fbf0953e1461016c5761009e565b8063715018a6146100a35780637cbab1c7146100ad5780638d5f10c4146100c05780638da5cb5b146100de57806391c05b0b146100f3575b600080fd5b6100ab61017f565b005b6100ab6100bb366004610ce5565b610211565b6100c8610216565b6040516100d59190610eaf565b60405180910390f35b6100e661029b565b6040516100d59190610e82565b610106610101366004610e41565b6102aa565b6040516100d591906111e2565b6100ab610121366004610d25565b6102bb565b6100ab610134366004610d94565b610321565b61014c610147366004610e41565b6106b6565b6040516100d59190611196565b6100ab610167366004610cc9565b61071b565b6100ab61017a366004610e0d565b6107dc565b61018761098e565b6001600160a01b031661019861029b565b6001600160a01b0316146101c75760405162461bcd60e51b81526004016101be906110bf565b60405180910390fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b505050565b60606065805480602002602001604051908101604052809291908181526020016000905b8282101561029257600084815260209081902060408051606081018252918501546001600160a01b0381168352600160a01b810461ffff1683850152600160b01b900460ff169082015282526001909201910161023a565b50505050905090565b6033546001600160a01b031690565b60006102b582610992565b92915050565b60005b818110156102115760668383838181106102d457fe5b90506020020160208101906102e99190610cc9565b815460018082018455600093845260209093200180546001600160a01b0319166001600160a01b0392909216919091179055016102be565b61032961098e565b6001600160a01b031661033a61029b565b6001600160a01b0316146103605760405162461bcd60e51b81526004016101be906110bf565b8060005b8181101561060557610374610c22565b84848381811061038057fe5b9050606002018036038101906103969190610df2565b90506001816040015160ff1611156103c05760405162461bcd60e51b81526004016101be90610f7a565b80516001600160a01b03166103e75760405162461bcd60e51b81526004016101be90611030565b6065548210610483576065805460018101825560009190915281517f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c790910180546020840151604085015160ff16600160b01b0260ff60b01b1961ffff909216600160a01b0261ffff60a01b196001600160a01b039096166001600160a01b0319909416939093179490941691909117169190911790556105aa565b61048b610c22565b6065838154811061049857fe5b60009182526020918290206040805160608101825292909101546001600160a01b03808216808552600160a01b830461ffff1695850195909552600160b01b90910460ff16918301919091528451919350161415806105075750806020015161ffff16826020015161ffff1614155b806105205750806040015160ff16826040015160ff1614155b156105a157816065848154811061053357fe5b6000918252602091829020835191018054928401516040909401516001600160a01b03199093166001600160a01b039092169190911761ffff60a01b1916600160a01b61ffff909416939093029290921760ff60b01b1916600160b01b60ff909216919091021790556105a8565b50506105fd565b505b80600001516001600160a01b03167fc1bf93444a0055a24a7d0154b75fedf78edfe355c06a2ce8e47f9f390872055982602001518360400151856040516105f3939291906111a4565b60405180910390a2505b600101610364565b505b60655481101561068257606554600090610622906001610a3f565b9050606580548061062f57fe5b600082815260208120820160001990810180546001600160b81b031916905590910190915560405182917f99fa473fdf53414bcd014cf6e7509fc58c68f7b86174767faa6ad5100cd5bae591a250610607565b600061068c610a67565b90506103e88111156106b05760405162461bcd60e51b81526004016101be906110f4565b50505050565b6106be610c22565b606582815481106106cb57fe5b60009182526020918290206040805160608101825292909101546001600160a01b0381168352600160a01b810461ffff1693830193909352600160b01b90920460ff169181019190915292915050565b61072361098e565b6001600160a01b031661073461029b565b6001600160a01b03161461075a5760405162461bcd60e51b81526004016101be906110bf565b6001600160a01b0381166107805760405162461bcd60e51b81526004016101be90610efd565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6107e461098e565b6001600160a01b03166107f561029b565b6001600160a01b03161461081b5760405162461bcd60e51b81526004016101be906110bf565b60655460ff82161061083f5760405162461bcd60e51b81526004016101be90611079565b6001826040015160ff1611156108675760405162461bcd60e51b81526004016101be90610f7a565b81516001600160a01b031661088e5760405162461bcd60e51b81526004016101be90611030565b8160658260ff168154811061089f57fe5b600091825260208083208451920180549185015160409095015160ff16600160b01b0260ff60b01b1961ffff909616600160a01b0261ffff60a01b196001600160a01b039095166001600160a01b0319909416939093179390931691909117939093161790915561090e610a67565b90506103e88111156109325760405162461bcd60e51b81526004016101be906110f4565b82600001516001600160a01b03167fc1bf93444a0055a24a7d0154b75fedf78edfe355c06a2ce8e47f9f3908720559846020015185604001518560405161097b939291906111c3565b60405180910390a2505050565b3b151590565b3390565b6065546000908290825b81811015610a36576109ac610c22565b606582815481106109b957fe5b600091825260208083206040805160608101825293909101546001600160a01b0381168452600160a01b810461ffff16928401839052600160b01b900460ff1690830152909250610a0b908690610af9565b9050610a208260000151828460400151610b14565b610a2a8782610a3f565b9650505060010161099c565b50929392505050565b600082821115610a615760405162461bcd60e51b81526004016101be90610fc2565b50900390565b6065546000908190815b818160ff161015610af157610a84610c22565b60658260ff1681548110610a9457fe5b60009182526020918290206040805160608101825292909101546001600160a01b0381168352600160a01b810461ffff16938301849052600160b01b900460ff16908201529150610ae6908590610bcb565b935050600101610a71565b509091505090565b6000610b0d61ffff831684026103e8610bf0565b9392505050565b60ff81161580610b2757508060ff166001145b610b435760405162461bcd60e51b81526004016101be90611147565b600060668260ff1681548110610b5557fe5b600091825260209091200154604051630baf60eb60e31b81526001600160a01b0390911691508190635d7b075890610b939087908790600401610e96565b600060405180830381600087803b158015610bad57600080fd5b505af1158015610bc1573d6000803e3d6000fd5b5050505050505050565b600082820183811015610b0d5760405162461bcd60e51b81526004016101be90610f43565b6000808211610c115760405162461bcd60e51b81526004016101be90610ff9565b818381610c1a57fe5b049392505050565b604080516060810182526000808252602082018190529181019190915290565b600060608284031215610c53578081fd5b6040516060810181811067ffffffffffffffff82111715610c72578283fd5b6040529050808235610c83816111eb565b8152602083013561ffff81168114610c9a57600080fd5b6020820152610cac8460408501610cb8565b60408201525092915050565b803560ff811681146102b557600080fd5b600060208284031215610cda578081fd5b8135610b0d816111eb565b600080600060608486031215610cf9578182fd5b8335610d04816111eb565b92506020840135610d14816111eb565b929592945050506040919091013590565b60008060208385031215610d37578182fd5b823567ffffffffffffffff80821115610d4e578384fd5b818501915085601f830112610d61578384fd5b813581811115610d6f578485fd5b8660208083028501011115610d82578485fd5b60209290920196919550909350505050565b60008060208385031215610da6578182fd5b823567ffffffffffffffff80821115610dbd578384fd5b818501915085601f830112610dd0578384fd5b813581811115610dde578485fd5b866020606083028501011115610d82578485fd5b600060608284031215610e03578081fd5b610b0d8383610c42565b60008060808385031215610e1f578182fd5b610e298484610c42565b9150610e388460608501610cb8565b90509250929050565b600060208284031215610e52578081fd5b5035919050565b80516001600160a01b0316825260208082015161ffff169083015260409081015160ff16910152565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015610ef157610ede838551610e59565b9284019260609290920191600101610ecb565b50909695505050505050565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526028908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c60408201526734ba16ba37b5b2b760c11b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526029908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c6040820152681a5d0b5d185c99d95d60ba1b606082015260800190565b60208082526026908201527f4d756c7469706c6557696e6e6572732f6e6f6e6578697374656e742d7072697a604082015265195cdc1b1a5d60d21b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c6040820152721a5d0b5c195c98d95b9d1859d94b5d1bdd185b606a1b606082015260800190565b6020808252602f908201527f5072697a6553706c69744861726e6573732f696e76616c69642d7072697a657360408201526e706c69742d746f6b656e2d7479706560881b606082015260800190565b606081016102b58284610e59565b61ffff93909316835260ff919091166020830152604082015260600190565b61ffff93909316835260ff918216602084015216604082015260600190565b90815260200190565b6001600160a01b038116811461120057600080fd5b5056fea2646970667358221220e354615d6bb1cd9da7ad2f2f69b1ccac5d1c769b745b3e096ff2c87c3fe3eead64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0x1C PUSH3 0x22 JUMP JUMPDEST PUSH3 0x2B0 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH3 0x3E JUMPI POP PUSH3 0x3E PUSH3 0xCB JUMP JUMPDEST DUP1 PUSH3 0x4D JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH3 0x75 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x6C SWAP1 PUSH3 0x262 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH3 0xA1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH3 0xAB PUSH3 0xE9 JUMP JUMPDEST PUSH3 0xB5 PUSH3 0x173 JUMP JUMPDEST DUP1 ISZERO PUSH3 0xC8 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0xE3 ADDRESS PUSH3 0x258 PUSH1 0x20 SHL PUSH3 0x988 OR PUSH1 0x20 SHR JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH3 0x105 JUMPI POP PUSH3 0x105 PUSH3 0xCB JUMP JUMPDEST DUP1 PUSH3 0x114 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH3 0x133 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x6C SWAP1 PUSH3 0x262 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH3 0xB5 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH3 0xC8 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH3 0x18F JUMPI POP PUSH3 0x18F PUSH3 0xCB JUMP JUMPDEST DUP1 PUSH3 0x19E JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH3 0x1BD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x6C SWAP1 PUSH3 0x262 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH3 0x1E9 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH3 0x1F5 PUSH3 0x25E JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH3 0xC8 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2E SWAP1 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x40 DUP3 ADD MSTORE PUSH14 0x191E481A5B9A5D1A585B1A5E9959 PUSH1 0x92 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH2 0x1239 DUP1 PUSH3 0x2C0 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x9E JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA224CEE7 GT PUSH2 0x66 JUMPI DUP1 PUSH4 0xA224CEE7 EQ PUSH2 0x113 JUMPI DUP1 PUSH4 0xC25A9C32 EQ PUSH2 0x126 JUMPI DUP1 PUSH4 0xEEFC8AD1 EQ PUSH2 0x139 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x159 JUMPI DUP1 PUSH4 0xFBF0953E EQ PUSH2 0x16C JUMPI PUSH2 0x9E JUMP JUMPDEST DUP1 PUSH4 0x715018A6 EQ PUSH2 0xA3 JUMPI DUP1 PUSH4 0x7CBAB1C7 EQ PUSH2 0xAD JUMPI DUP1 PUSH4 0x8D5F10C4 EQ PUSH2 0xC0 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xDE JUMPI DUP1 PUSH4 0x91C05B0B EQ PUSH2 0xF3 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xAB PUSH2 0x17F JUMP JUMPDEST STOP JUMPDEST PUSH2 0xAB PUSH2 0xBB CALLDATASIZE PUSH1 0x4 PUSH2 0xCE5 JUMP JUMPDEST PUSH2 0x211 JUMP JUMPDEST PUSH2 0xC8 PUSH2 0x216 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xD5 SWAP2 SWAP1 PUSH2 0xEAF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xE6 PUSH2 0x29B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xD5 SWAP2 SWAP1 PUSH2 0xE82 JUMP JUMPDEST PUSH2 0x106 PUSH2 0x101 CALLDATASIZE PUSH1 0x4 PUSH2 0xE41 JUMP JUMPDEST PUSH2 0x2AA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xD5 SWAP2 SWAP1 PUSH2 0x11E2 JUMP JUMPDEST PUSH2 0xAB PUSH2 0x121 CALLDATASIZE PUSH1 0x4 PUSH2 0xD25 JUMP JUMPDEST PUSH2 0x2BB JUMP JUMPDEST PUSH2 0xAB PUSH2 0x134 CALLDATASIZE PUSH1 0x4 PUSH2 0xD94 JUMP JUMPDEST PUSH2 0x321 JUMP JUMPDEST PUSH2 0x14C PUSH2 0x147 CALLDATASIZE PUSH1 0x4 PUSH2 0xE41 JUMP JUMPDEST PUSH2 0x6B6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xD5 SWAP2 SWAP1 PUSH2 0x1196 JUMP JUMPDEST PUSH2 0xAB PUSH2 0x167 CALLDATASIZE PUSH1 0x4 PUSH2 0xCC9 JUMP JUMPDEST PUSH2 0x71B JUMP JUMPDEST PUSH2 0xAB PUSH2 0x17A CALLDATASIZE PUSH1 0x4 PUSH2 0xE0D JUMP JUMPDEST PUSH2 0x7DC JUMP JUMPDEST PUSH2 0x187 PUSH2 0x98E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x198 PUSH2 0x29B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1C7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0x10BF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x65 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0x292 JUMPI PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 SWAP1 DUP2 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP2 DUP6 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND DUP4 DUP6 ADD MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP3 ADD MSTORE DUP3 MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 ADD PUSH2 0x23A JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2B5 DUP3 PUSH2 0x992 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x211 JUMPI PUSH1 0x66 DUP4 DUP4 DUP4 DUP2 DUP2 LT PUSH2 0x2D4 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x2E9 SWAP2 SWAP1 PUSH2 0xCC9 JUMP JUMPDEST DUP2 SLOAD PUSH1 0x1 DUP1 DUP3 ADD DUP5 SSTORE PUSH1 0x0 SWAP4 DUP5 MSTORE PUSH1 0x20 SWAP1 SWAP4 KECCAK256 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE ADD PUSH2 0x2BE JUMP JUMPDEST PUSH2 0x329 PUSH2 0x98E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x33A PUSH2 0x29B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x360 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0x10BF JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x605 JUMPI PUSH2 0x374 PUSH2 0xC22 JUMP JUMPDEST DUP5 DUP5 DUP4 DUP2 DUP2 LT PUSH2 0x380 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x60 MUL ADD DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x396 SWAP2 SWAP1 PUSH2 0xDF2 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP2 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND GT ISZERO PUSH2 0x3C0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0xF7A JUMP JUMPDEST DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3E7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0x1030 JUMP JUMPDEST PUSH1 0x65 SLOAD DUP3 LT PUSH2 0x483 JUMPI PUSH1 0x65 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE PUSH1 0x0 SWAP2 SWAP1 SWAP2 MSTORE DUP2 MLOAD PUSH32 0x8FF97419363FFD7000167F130EF7168FBEA05FAF9251824CA5043F113CC6A7C7 SWAP1 SWAP2 ADD DUP1 SLOAD PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x40 DUP6 ADD MLOAD PUSH1 0xFF AND PUSH1 0x1 PUSH1 0xB0 SHL MUL PUSH1 0xFF PUSH1 0xB0 SHL NOT PUSH2 0xFFFF SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xA0 SHL MUL PUSH2 0xFFFF PUSH1 0xA0 SHL NOT PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP7 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP5 SWAP1 SWAP5 AND SWAP2 SWAP1 SWAP2 OR AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x5AA JUMP JUMPDEST PUSH2 0x48B PUSH2 0xC22 JUMP JUMPDEST PUSH1 0x65 DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x498 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND DUP1 DUP6 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP4 DIV PUSH2 0xFFFF AND SWAP6 DUP6 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 SWAP2 DIV PUSH1 0xFF AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP5 MLOAD SWAP2 SWAP4 POP AND EQ ISZERO DUP1 PUSH2 0x507 JUMPI POP DUP1 PUSH1 0x20 ADD MLOAD PUSH2 0xFFFF AND DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0xFFFF AND EQ ISZERO JUMPDEST DUP1 PUSH2 0x520 JUMPI POP DUP1 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND DUP3 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x5A1 JUMPI DUP2 PUSH1 0x65 DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x533 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 DUP4 MLOAD SWAP2 ADD DUP1 SLOAD SWAP3 DUP5 ADD MLOAD PUSH1 0x40 SWAP1 SWAP5 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP4 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH2 0xFFFF PUSH1 0xA0 SHL NOT AND PUSH1 0x1 PUSH1 0xA0 SHL PUSH2 0xFFFF SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 MUL SWAP3 SWAP1 SWAP3 OR PUSH1 0xFF PUSH1 0xB0 SHL NOT AND PUSH1 0x1 PUSH1 0xB0 SHL PUSH1 0xFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE PUSH2 0x5A8 JUMP JUMPDEST POP POP PUSH2 0x5FD JUMP JUMPDEST POP JUMPDEST DUP1 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC1BF93444A0055A24A7D0154B75FEDF78EDFE355C06A2CE8E47F9F3908720559 DUP3 PUSH1 0x20 ADD MLOAD DUP4 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 MLOAD PUSH2 0x5F3 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x11A4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x364 JUMP JUMPDEST POP JUMPDEST PUSH1 0x65 SLOAD DUP2 LT ISZERO PUSH2 0x682 JUMPI PUSH1 0x65 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x622 SWAP1 PUSH1 0x1 PUSH2 0xA3F JUMP JUMPDEST SWAP1 POP PUSH1 0x65 DUP1 SLOAD DUP1 PUSH2 0x62F JUMPI INVALID JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 DUP3 ADD PUSH1 0x0 NOT SWAP1 DUP2 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xB8 SHL SUB NOT AND SWAP1 SSTORE SWAP1 SWAP2 ADD SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD DUP3 SWAP2 PUSH32 0x99FA473FDF53414BCD014CF6E7509FC58C68F7B86174767FAA6AD5100CD5BAE5 SWAP2 LOG2 POP PUSH2 0x607 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x68C PUSH2 0xA67 JUMP JUMPDEST SWAP1 POP PUSH2 0x3E8 DUP2 GT ISZERO PUSH2 0x6B0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0x10F4 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x6BE PUSH2 0xC22 JUMP JUMPDEST PUSH1 0x65 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x6CB JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP4 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 SWAP3 DIV PUSH1 0xFF AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x723 PUSH2 0x98E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x734 PUSH2 0x29B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x75A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0x10BF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x780 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0xEFD JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x7E4 PUSH2 0x98E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x7F5 PUSH2 0x29B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x81B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0x10BF JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0xFF DUP3 AND LT PUSH2 0x83F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0x1079 JUMP JUMPDEST PUSH1 0x1 DUP3 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND GT ISZERO PUSH2 0x867 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0xF7A JUMP JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x88E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0x1030 JUMP JUMPDEST DUP2 PUSH1 0x65 DUP3 PUSH1 0xFF AND DUP2 SLOAD DUP2 LT PUSH2 0x89F JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 DUP5 MLOAD SWAP3 ADD DUP1 SLOAD SWAP2 DUP6 ADD MLOAD PUSH1 0x40 SWAP1 SWAP6 ADD MLOAD PUSH1 0xFF AND PUSH1 0x1 PUSH1 0xB0 SHL MUL PUSH1 0xFF PUSH1 0xB0 SHL NOT PUSH2 0xFFFF SWAP1 SWAP7 AND PUSH1 0x1 PUSH1 0xA0 SHL MUL PUSH2 0xFFFF PUSH1 0xA0 SHL NOT PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP4 SWAP1 SWAP4 AND SWAP2 SWAP1 SWAP2 OR SWAP4 SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE PUSH2 0x90E PUSH2 0xA67 JUMP JUMPDEST SWAP1 POP PUSH2 0x3E8 DUP2 GT ISZERO PUSH2 0x932 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0x10F4 JUMP JUMPDEST DUP3 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC1BF93444A0055A24A7D0154B75FEDF78EDFE355C06A2CE8E47F9F3908720559 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 MLOAD PUSH2 0x97B SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x11C3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x0 SWAP1 DUP3 SWAP1 DUP3 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xA36 JUMPI PUSH2 0x9AC PUSH2 0xC22 JUMP JUMPDEST PUSH1 0x65 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x9B9 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP4 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP5 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP3 DUP5 ADD DUP4 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP4 ADD MSTORE SWAP1 SWAP3 POP PUSH2 0xA0B SWAP1 DUP7 SWAP1 PUSH2 0xAF9 JUMP JUMPDEST SWAP1 POP PUSH2 0xA20 DUP3 PUSH1 0x0 ADD MLOAD DUP3 DUP5 PUSH1 0x40 ADD MLOAD PUSH2 0xB14 JUMP JUMPDEST PUSH2 0xA2A DUP8 DUP3 PUSH2 0xA3F JUMP JUMPDEST SWAP7 POP POP POP PUSH1 0x1 ADD PUSH2 0x99C JUMP JUMPDEST POP SWAP3 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xA61 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0xFC2 JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP2 JUMPDEST DUP2 DUP2 PUSH1 0xFF AND LT ISZERO PUSH2 0xAF1 JUMPI PUSH2 0xA84 PUSH2 0xC22 JUMP JUMPDEST PUSH1 0x65 DUP3 PUSH1 0xFF AND DUP2 SLOAD DUP2 LT PUSH2 0xA94 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP3 ADD MSTORE SWAP2 POP PUSH2 0xAE6 SWAP1 DUP6 SWAP1 PUSH2 0xBCB JUMP JUMPDEST SWAP4 POP POP PUSH1 0x1 ADD PUSH2 0xA71 JUMP JUMPDEST POP SWAP1 SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB0D PUSH2 0xFFFF DUP4 AND DUP5 MUL PUSH2 0x3E8 PUSH2 0xBF0 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xFF DUP2 AND ISZERO DUP1 PUSH2 0xB27 JUMPI POP DUP1 PUSH1 0xFF AND PUSH1 0x1 EQ JUMPDEST PUSH2 0xB43 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0x1147 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x66 DUP3 PUSH1 0xFF AND DUP2 SLOAD DUP2 LT PUSH2 0xB55 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x40 MLOAD PUSH4 0xBAF60EB PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 POP DUP2 SWAP1 PUSH4 0x5D7B0758 SWAP1 PUSH2 0xB93 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0xE96 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xBAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xBC1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xB0D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0xF43 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0xC11 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0xFF9 JUMP JUMPDEST DUP2 DUP4 DUP2 PUSH2 0xC1A JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xC53 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0xC72 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP1 POP DUP1 DUP3 CALLDATALOAD PUSH2 0xC83 DUP2 PUSH2 0x11EB JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0xFFFF DUP2 AND DUP2 EQ PUSH2 0xC9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0xCAC DUP5 PUSH1 0x40 DUP6 ADD PUSH2 0xCB8 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x2B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xCDA JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xB0D DUP2 PUSH2 0x11EB JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xCF9 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0xD04 DUP2 PUSH2 0x11EB JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0xD14 DUP2 PUSH2 0x11EB JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xD37 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xD4E JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xD61 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0xD6F JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0xD82 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xDA6 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xDBD JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xDD0 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0xDDE JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 PUSH1 0x60 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0xD82 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xE03 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0xB0D DUP4 DUP4 PUSH2 0xC42 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x80 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xE1F JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xE29 DUP5 DUP5 PUSH2 0xC42 JUMP JUMPDEST SWAP2 POP PUSH2 0xE38 DUP5 PUSH1 0x60 DUP6 ADD PUSH2 0xCB8 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xE52 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH2 0xFFFF AND SWAP1 DUP4 ADD MSTORE PUSH1 0x40 SWAP1 DUP2 ADD MLOAD PUSH1 0xFF AND SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xEF1 JUMPI PUSH2 0xEDE DUP4 DUP6 MLOAD PUSH2 0xE59 JUMP JUMPDEST SWAP3 DUP5 ADD SWAP3 PUSH1 0x60 SWAP3 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xECB JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x646472657373 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x28 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH8 0x34BA16BA37B5B2B7 PUSH1 0xC1 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1E SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1A SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x29 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH9 0x1A5D0B5D185C99D95D PUSH1 0xBA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F6E6F6E6578697374656E742D7072697A PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x195CDC1B1A5D PUSH1 0xD2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x33 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH19 0x1A5D0B5C195C98D95B9D1859D94B5D1BDD185B PUSH1 0x6A SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2F SWAP1 DUP3 ADD MSTORE PUSH32 0x5072697A6553706C69744861726E6573732F696E76616C69642D7072697A6573 PUSH1 0x40 DUP3 ADD MSTORE PUSH15 0x706C69742D746F6B656E2D74797065 PUSH1 0x88 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x2B5 DUP3 DUP5 PUSH2 0xE59 JUMP JUMPDEST PUSH2 0xFFFF SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0xFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH2 0xFFFF SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0xFF SWAP2 DUP3 AND PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x1200 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE3 SLOAD PUSH2 0x5D6B 0xB1 0xCD SWAP14 0xA7 0xAD 0x2F 0x2F PUSH10 0xB1CCAC5D1C769B745B3E MULMOD PUSH16 0xF2C87C3FE3EEAD64736F6C634300060C STOP CALLER ",
              "sourceMap": "303:890:78:-:0;;;395:49;;;;;;;;;-1:-1:-1;423:16:78;:14;:16::i;:::-;303:890;;935:126:0;1512:13:9;;;;;;;;:33;;-1:-1:-1;1529:16:9;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;:::i;:::-;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;992:26:0::1;:24;:26::i;:::-;1028;:24;:26::i;:::-;1794:14:9::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1790:66;935:126:0;:::o;1952:123:9:-;2000:4;2024:44;2062:4;2024:29;;;;;:44;;:::i;:::-;2023:45;2016:52;;1952:123;:::o;759:64:19:-;1512:13:9;;;;;;;;:33;;-1:-1:-1;1529:16:9;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;:::i;:::-;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1794:14;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;759:64:19;:::o;1067:192:0:-;1512:13:9;;;;;;;;:33;;-1:-1:-1;1529:16:9;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;:::i;:::-;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1134:17:0::1;1154:12;:10;:12::i;:::-;1176:6;:18:::0;;-1:-1:-1;;;;;;1176:18:0::1;-1:-1:-1::0;;;;;1176:18:0;::::1;::::0;;::::1;::::0;;;1209:43:::1;::::0;1176:18;;-1:-1:-1;1176:18:0;-1:-1:-1;;1209:43:0::1;::::0;-1:-1:-1;;1209:43:0::1;1778:1:9;1794:14:::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1067:192:0;:::o;737:413:18:-;1097:20;1135:8;;;737:413::o;828:104:19:-;915:10;828:104;:::o;397:416:-1:-;597:2;611:47;;;230:2;582:18;;;924:19;266:34;964:14;;;246:55;-1:-1;;;321:12;;;314:38;371:12;;;568:245::o;:::-;303:890:78;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506004361061009e5760003560e01c8063a224cee711610066578063a224cee714610113578063c25a9c3214610126578063eefc8ad114610139578063f2fde38b14610159578063fbf0953e1461016c5761009e565b8063715018a6146100a35780637cbab1c7146100ad5780638d5f10c4146100c05780638da5cb5b146100de57806391c05b0b146100f3575b600080fd5b6100ab61017f565b005b6100ab6100bb366004610ce5565b610211565b6100c8610216565b6040516100d59190610eaf565b60405180910390f35b6100e661029b565b6040516100d59190610e82565b610106610101366004610e41565b6102aa565b6040516100d591906111e2565b6100ab610121366004610d25565b6102bb565b6100ab610134366004610d94565b610321565b61014c610147366004610e41565b6106b6565b6040516100d59190611196565b6100ab610167366004610cc9565b61071b565b6100ab61017a366004610e0d565b6107dc565b61018761098e565b6001600160a01b031661019861029b565b6001600160a01b0316146101c75760405162461bcd60e51b81526004016101be906110bf565b60405180910390fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b505050565b60606065805480602002602001604051908101604052809291908181526020016000905b8282101561029257600084815260209081902060408051606081018252918501546001600160a01b0381168352600160a01b810461ffff1683850152600160b01b900460ff169082015282526001909201910161023a565b50505050905090565b6033546001600160a01b031690565b60006102b582610992565b92915050565b60005b818110156102115760668383838181106102d457fe5b90506020020160208101906102e99190610cc9565b815460018082018455600093845260209093200180546001600160a01b0319166001600160a01b0392909216919091179055016102be565b61032961098e565b6001600160a01b031661033a61029b565b6001600160a01b0316146103605760405162461bcd60e51b81526004016101be906110bf565b8060005b8181101561060557610374610c22565b84848381811061038057fe5b9050606002018036038101906103969190610df2565b90506001816040015160ff1611156103c05760405162461bcd60e51b81526004016101be90610f7a565b80516001600160a01b03166103e75760405162461bcd60e51b81526004016101be90611030565b6065548210610483576065805460018101825560009190915281517f8ff97419363ffd7000167f130ef7168fbea05faf9251824ca5043f113cc6a7c790910180546020840151604085015160ff16600160b01b0260ff60b01b1961ffff909216600160a01b0261ffff60a01b196001600160a01b039096166001600160a01b0319909416939093179490941691909117169190911790556105aa565b61048b610c22565b6065838154811061049857fe5b60009182526020918290206040805160608101825292909101546001600160a01b03808216808552600160a01b830461ffff1695850195909552600160b01b90910460ff16918301919091528451919350161415806105075750806020015161ffff16826020015161ffff1614155b806105205750806040015160ff16826040015160ff1614155b156105a157816065848154811061053357fe5b6000918252602091829020835191018054928401516040909401516001600160a01b03199093166001600160a01b039092169190911761ffff60a01b1916600160a01b61ffff909416939093029290921760ff60b01b1916600160b01b60ff909216919091021790556105a8565b50506105fd565b505b80600001516001600160a01b03167fc1bf93444a0055a24a7d0154b75fedf78edfe355c06a2ce8e47f9f390872055982602001518360400151856040516105f3939291906111a4565b60405180910390a2505b600101610364565b505b60655481101561068257606554600090610622906001610a3f565b9050606580548061062f57fe5b600082815260208120820160001990810180546001600160b81b031916905590910190915560405182917f99fa473fdf53414bcd014cf6e7509fc58c68f7b86174767faa6ad5100cd5bae591a250610607565b600061068c610a67565b90506103e88111156106b05760405162461bcd60e51b81526004016101be906110f4565b50505050565b6106be610c22565b606582815481106106cb57fe5b60009182526020918290206040805160608101825292909101546001600160a01b0381168352600160a01b810461ffff1693830193909352600160b01b90920460ff169181019190915292915050565b61072361098e565b6001600160a01b031661073461029b565b6001600160a01b03161461075a5760405162461bcd60e51b81526004016101be906110bf565b6001600160a01b0381166107805760405162461bcd60e51b81526004016101be90610efd565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6107e461098e565b6001600160a01b03166107f561029b565b6001600160a01b03161461081b5760405162461bcd60e51b81526004016101be906110bf565b60655460ff82161061083f5760405162461bcd60e51b81526004016101be90611079565b6001826040015160ff1611156108675760405162461bcd60e51b81526004016101be90610f7a565b81516001600160a01b031661088e5760405162461bcd60e51b81526004016101be90611030565b8160658260ff168154811061089f57fe5b600091825260208083208451920180549185015160409095015160ff16600160b01b0260ff60b01b1961ffff909616600160a01b0261ffff60a01b196001600160a01b039095166001600160a01b0319909416939093179390931691909117939093161790915561090e610a67565b90506103e88111156109325760405162461bcd60e51b81526004016101be906110f4565b82600001516001600160a01b03167fc1bf93444a0055a24a7d0154b75fedf78edfe355c06a2ce8e47f9f3908720559846020015185604001518560405161097b939291906111c3565b60405180910390a2505050565b3b151590565b3390565b6065546000908290825b81811015610a36576109ac610c22565b606582815481106109b957fe5b600091825260208083206040805160608101825293909101546001600160a01b0381168452600160a01b810461ffff16928401839052600160b01b900460ff1690830152909250610a0b908690610af9565b9050610a208260000151828460400151610b14565b610a2a8782610a3f565b9650505060010161099c565b50929392505050565b600082821115610a615760405162461bcd60e51b81526004016101be90610fc2565b50900390565b6065546000908190815b818160ff161015610af157610a84610c22565b60658260ff1681548110610a9457fe5b60009182526020918290206040805160608101825292909101546001600160a01b0381168352600160a01b810461ffff16938301849052600160b01b900460ff16908201529150610ae6908590610bcb565b935050600101610a71565b509091505090565b6000610b0d61ffff831684026103e8610bf0565b9392505050565b60ff81161580610b2757508060ff166001145b610b435760405162461bcd60e51b81526004016101be90611147565b600060668260ff1681548110610b5557fe5b600091825260209091200154604051630baf60eb60e31b81526001600160a01b0390911691508190635d7b075890610b939087908790600401610e96565b600060405180830381600087803b158015610bad57600080fd5b505af1158015610bc1573d6000803e3d6000fd5b5050505050505050565b600082820183811015610b0d5760405162461bcd60e51b81526004016101be90610f43565b6000808211610c115760405162461bcd60e51b81526004016101be90610ff9565b818381610c1a57fe5b049392505050565b604080516060810182526000808252602082018190529181019190915290565b600060608284031215610c53578081fd5b6040516060810181811067ffffffffffffffff82111715610c72578283fd5b6040529050808235610c83816111eb565b8152602083013561ffff81168114610c9a57600080fd5b6020820152610cac8460408501610cb8565b60408201525092915050565b803560ff811681146102b557600080fd5b600060208284031215610cda578081fd5b8135610b0d816111eb565b600080600060608486031215610cf9578182fd5b8335610d04816111eb565b92506020840135610d14816111eb565b929592945050506040919091013590565b60008060208385031215610d37578182fd5b823567ffffffffffffffff80821115610d4e578384fd5b818501915085601f830112610d61578384fd5b813581811115610d6f578485fd5b8660208083028501011115610d82578485fd5b60209290920196919550909350505050565b60008060208385031215610da6578182fd5b823567ffffffffffffffff80821115610dbd578384fd5b818501915085601f830112610dd0578384fd5b813581811115610dde578485fd5b866020606083028501011115610d82578485fd5b600060608284031215610e03578081fd5b610b0d8383610c42565b60008060808385031215610e1f578182fd5b610e298484610c42565b9150610e388460608501610cb8565b90509250929050565b600060208284031215610e52578081fd5b5035919050565b80516001600160a01b0316825260208082015161ffff169083015260409081015160ff16910152565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015610ef157610ede838551610e59565b9284019260609290920191600101610ecb565b50909695505050505050565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526028908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c60408201526734ba16ba37b5b2b760c11b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526029908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c6040820152681a5d0b5d185c99d95d60ba1b606082015260800190565b60208082526026908201527f4d756c7469706c6557696e6e6572732f6e6f6e6578697374656e742d7072697a604082015265195cdc1b1a5d60d21b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c6040820152721a5d0b5c195c98d95b9d1859d94b5d1bdd185b606a1b606082015260800190565b6020808252602f908201527f5072697a6553706c69744861726e6573732f696e76616c69642d7072697a657360408201526e706c69742d746f6b656e2d7479706560881b606082015260800190565b606081016102b58284610e59565b61ffff93909316835260ff919091166020830152604082015260600190565b61ffff93909316835260ff918216602084015216604082015260600190565b90815260200190565b6001600160a01b038116811461120057600080fd5b5056fea2646970667358221220e354615d6bb1cd9da7ad2f2f69b1ccac5d1c769b745b3e096ff2c87c3fe3eead64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x9E JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xA224CEE7 GT PUSH2 0x66 JUMPI DUP1 PUSH4 0xA224CEE7 EQ PUSH2 0x113 JUMPI DUP1 PUSH4 0xC25A9C32 EQ PUSH2 0x126 JUMPI DUP1 PUSH4 0xEEFC8AD1 EQ PUSH2 0x139 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x159 JUMPI DUP1 PUSH4 0xFBF0953E EQ PUSH2 0x16C JUMPI PUSH2 0x9E JUMP JUMPDEST DUP1 PUSH4 0x715018A6 EQ PUSH2 0xA3 JUMPI DUP1 PUSH4 0x7CBAB1C7 EQ PUSH2 0xAD JUMPI DUP1 PUSH4 0x8D5F10C4 EQ PUSH2 0xC0 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xDE JUMPI DUP1 PUSH4 0x91C05B0B EQ PUSH2 0xF3 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xAB PUSH2 0x17F JUMP JUMPDEST STOP JUMPDEST PUSH2 0xAB PUSH2 0xBB CALLDATASIZE PUSH1 0x4 PUSH2 0xCE5 JUMP JUMPDEST PUSH2 0x211 JUMP JUMPDEST PUSH2 0xC8 PUSH2 0x216 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xD5 SWAP2 SWAP1 PUSH2 0xEAF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xE6 PUSH2 0x29B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xD5 SWAP2 SWAP1 PUSH2 0xE82 JUMP JUMPDEST PUSH2 0x106 PUSH2 0x101 CALLDATASIZE PUSH1 0x4 PUSH2 0xE41 JUMP JUMPDEST PUSH2 0x2AA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xD5 SWAP2 SWAP1 PUSH2 0x11E2 JUMP JUMPDEST PUSH2 0xAB PUSH2 0x121 CALLDATASIZE PUSH1 0x4 PUSH2 0xD25 JUMP JUMPDEST PUSH2 0x2BB JUMP JUMPDEST PUSH2 0xAB PUSH2 0x134 CALLDATASIZE PUSH1 0x4 PUSH2 0xD94 JUMP JUMPDEST PUSH2 0x321 JUMP JUMPDEST PUSH2 0x14C PUSH2 0x147 CALLDATASIZE PUSH1 0x4 PUSH2 0xE41 JUMP JUMPDEST PUSH2 0x6B6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xD5 SWAP2 SWAP1 PUSH2 0x1196 JUMP JUMPDEST PUSH2 0xAB PUSH2 0x167 CALLDATASIZE PUSH1 0x4 PUSH2 0xCC9 JUMP JUMPDEST PUSH2 0x71B JUMP JUMPDEST PUSH2 0xAB PUSH2 0x17A CALLDATASIZE PUSH1 0x4 PUSH2 0xE0D JUMP JUMPDEST PUSH2 0x7DC JUMP JUMPDEST PUSH2 0x187 PUSH2 0x98E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x198 PUSH2 0x29B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1C7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0x10BF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x65 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0x292 JUMPI PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 SWAP1 DUP2 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP2 DUP6 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND DUP4 DUP6 ADD MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP3 ADD MSTORE DUP3 MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 ADD PUSH2 0x23A JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2B5 DUP3 PUSH2 0x992 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x211 JUMPI PUSH1 0x66 DUP4 DUP4 DUP4 DUP2 DUP2 LT PUSH2 0x2D4 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD PUSH1 0x20 DUP2 ADD SWAP1 PUSH2 0x2E9 SWAP2 SWAP1 PUSH2 0xCC9 JUMP JUMPDEST DUP2 SLOAD PUSH1 0x1 DUP1 DUP3 ADD DUP5 SSTORE PUSH1 0x0 SWAP4 DUP5 MSTORE PUSH1 0x20 SWAP1 SWAP4 KECCAK256 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE ADD PUSH2 0x2BE JUMP JUMPDEST PUSH2 0x329 PUSH2 0x98E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x33A PUSH2 0x29B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x360 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0x10BF JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x605 JUMPI PUSH2 0x374 PUSH2 0xC22 JUMP JUMPDEST DUP5 DUP5 DUP4 DUP2 DUP2 LT PUSH2 0x380 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x60 MUL ADD DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x396 SWAP2 SWAP1 PUSH2 0xDF2 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP2 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND GT ISZERO PUSH2 0x3C0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0xF7A JUMP JUMPDEST DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3E7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0x1030 JUMP JUMPDEST PUSH1 0x65 SLOAD DUP3 LT PUSH2 0x483 JUMPI PUSH1 0x65 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE PUSH1 0x0 SWAP2 SWAP1 SWAP2 MSTORE DUP2 MLOAD PUSH32 0x8FF97419363FFD7000167F130EF7168FBEA05FAF9251824CA5043F113CC6A7C7 SWAP1 SWAP2 ADD DUP1 SLOAD PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x40 DUP6 ADD MLOAD PUSH1 0xFF AND PUSH1 0x1 PUSH1 0xB0 SHL MUL PUSH1 0xFF PUSH1 0xB0 SHL NOT PUSH2 0xFFFF SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xA0 SHL MUL PUSH2 0xFFFF PUSH1 0xA0 SHL NOT PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP7 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP5 SWAP1 SWAP5 AND SWAP2 SWAP1 SWAP2 OR AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x5AA JUMP JUMPDEST PUSH2 0x48B PUSH2 0xC22 JUMP JUMPDEST PUSH1 0x65 DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x498 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP3 AND DUP1 DUP6 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP4 DIV PUSH2 0xFFFF AND SWAP6 DUP6 ADD SWAP6 SWAP1 SWAP6 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 SWAP2 DIV PUSH1 0xFF AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP5 MLOAD SWAP2 SWAP4 POP AND EQ ISZERO DUP1 PUSH2 0x507 JUMPI POP DUP1 PUSH1 0x20 ADD MLOAD PUSH2 0xFFFF AND DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0xFFFF AND EQ ISZERO JUMPDEST DUP1 PUSH2 0x520 JUMPI POP DUP1 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND DUP3 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x5A1 JUMPI DUP2 PUSH1 0x65 DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x533 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 DUP4 MLOAD SWAP2 ADD DUP1 SLOAD SWAP3 DUP5 ADD MLOAD PUSH1 0x40 SWAP1 SWAP5 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP4 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH2 0xFFFF PUSH1 0xA0 SHL NOT AND PUSH1 0x1 PUSH1 0xA0 SHL PUSH2 0xFFFF SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 MUL SWAP3 SWAP1 SWAP3 OR PUSH1 0xFF PUSH1 0xB0 SHL NOT AND PUSH1 0x1 PUSH1 0xB0 SHL PUSH1 0xFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE PUSH2 0x5A8 JUMP JUMPDEST POP POP PUSH2 0x5FD JUMP JUMPDEST POP JUMPDEST DUP1 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC1BF93444A0055A24A7D0154B75FEDF78EDFE355C06A2CE8E47F9F3908720559 DUP3 PUSH1 0x20 ADD MLOAD DUP4 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 MLOAD PUSH2 0x5F3 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x11A4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x364 JUMP JUMPDEST POP JUMPDEST PUSH1 0x65 SLOAD DUP2 LT ISZERO PUSH2 0x682 JUMPI PUSH1 0x65 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x622 SWAP1 PUSH1 0x1 PUSH2 0xA3F JUMP JUMPDEST SWAP1 POP PUSH1 0x65 DUP1 SLOAD DUP1 PUSH2 0x62F JUMPI INVALID JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 KECCAK256 DUP3 ADD PUSH1 0x0 NOT SWAP1 DUP2 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xB8 SHL SUB NOT AND SWAP1 SSTORE SWAP1 SWAP2 ADD SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD DUP3 SWAP2 PUSH32 0x99FA473FDF53414BCD014CF6E7509FC58C68F7B86174767FAA6AD5100CD5BAE5 SWAP2 LOG2 POP PUSH2 0x607 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x68C PUSH2 0xA67 JUMP JUMPDEST SWAP1 POP PUSH2 0x3E8 DUP2 GT ISZERO PUSH2 0x6B0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0x10F4 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x6BE PUSH2 0xC22 JUMP JUMPDEST PUSH1 0x65 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x6CB JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP4 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 SWAP3 DIV PUSH1 0xFF AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x723 PUSH2 0x98E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x734 PUSH2 0x29B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x75A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0x10BF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x780 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0xEFD JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x7E4 PUSH2 0x98E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x7F5 PUSH2 0x29B JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x81B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0x10BF JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0xFF DUP3 AND LT PUSH2 0x83F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0x1079 JUMP JUMPDEST PUSH1 0x1 DUP3 PUSH1 0x40 ADD MLOAD PUSH1 0xFF AND GT ISZERO PUSH2 0x867 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0xF7A JUMP JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x88E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0x1030 JUMP JUMPDEST DUP2 PUSH1 0x65 DUP3 PUSH1 0xFF AND DUP2 SLOAD DUP2 LT PUSH2 0x89F JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 DUP5 MLOAD SWAP3 ADD DUP1 SLOAD SWAP2 DUP6 ADD MLOAD PUSH1 0x40 SWAP1 SWAP6 ADD MLOAD PUSH1 0xFF AND PUSH1 0x1 PUSH1 0xB0 SHL MUL PUSH1 0xFF PUSH1 0xB0 SHL NOT PUSH2 0xFFFF SWAP1 SWAP7 AND PUSH1 0x1 PUSH1 0xA0 SHL MUL PUSH2 0xFFFF PUSH1 0xA0 SHL NOT PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP4 SWAP1 SWAP4 AND SWAP2 SWAP1 SWAP2 OR SWAP4 SWAP1 SWAP4 AND OR SWAP1 SWAP2 SSTORE PUSH2 0x90E PUSH2 0xA67 JUMP JUMPDEST SWAP1 POP PUSH2 0x3E8 DUP2 GT ISZERO PUSH2 0x932 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0x10F4 JUMP JUMPDEST DUP3 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC1BF93444A0055A24A7D0154B75FEDF78EDFE355C06A2CE8E47F9F3908720559 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 MLOAD PUSH2 0x97B SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x11C3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x0 SWAP1 DUP3 SWAP1 DUP3 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xA36 JUMPI PUSH2 0x9AC PUSH2 0xC22 JUMP JUMPDEST PUSH1 0x65 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x9B9 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP4 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP5 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP3 DUP5 ADD DUP4 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP4 ADD MSTORE SWAP1 SWAP3 POP PUSH2 0xA0B SWAP1 DUP7 SWAP1 PUSH2 0xAF9 JUMP JUMPDEST SWAP1 POP PUSH2 0xA20 DUP3 PUSH1 0x0 ADD MLOAD DUP3 DUP5 PUSH1 0x40 ADD MLOAD PUSH2 0xB14 JUMP JUMPDEST PUSH2 0xA2A DUP8 DUP3 PUSH2 0xA3F JUMP JUMPDEST SWAP7 POP POP POP PUSH1 0x1 ADD PUSH2 0x99C JUMP JUMPDEST POP SWAP3 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xA61 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0xFC2 JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP2 JUMPDEST DUP2 DUP2 PUSH1 0xFF AND LT ISZERO PUSH2 0xAF1 JUMPI PUSH2 0xA84 PUSH2 0xC22 JUMP JUMPDEST PUSH1 0x65 DUP3 PUSH1 0xFF AND DUP2 SLOAD DUP2 LT PUSH2 0xA94 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0xA0 SHL DUP2 DIV PUSH2 0xFFFF AND SWAP4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP3 ADD MSTORE SWAP2 POP PUSH2 0xAE6 SWAP1 DUP6 SWAP1 PUSH2 0xBCB JUMP JUMPDEST SWAP4 POP POP PUSH1 0x1 ADD PUSH2 0xA71 JUMP JUMPDEST POP SWAP1 SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xB0D PUSH2 0xFFFF DUP4 AND DUP5 MUL PUSH2 0x3E8 PUSH2 0xBF0 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xFF DUP2 AND ISZERO DUP1 PUSH2 0xB27 JUMPI POP DUP1 PUSH1 0xFF AND PUSH1 0x1 EQ JUMPDEST PUSH2 0xB43 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0x1147 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x66 DUP3 PUSH1 0xFF AND DUP2 SLOAD DUP2 LT PUSH2 0xB55 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x40 MLOAD PUSH4 0xBAF60EB PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 POP DUP2 SWAP1 PUSH4 0x5D7B0758 SWAP1 PUSH2 0xB93 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0xE96 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xBAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xBC1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xB0D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0xF43 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0xC11 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1BE SWAP1 PUSH2 0xFF9 JUMP JUMPDEST DUP2 DUP4 DUP2 PUSH2 0xC1A JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xC53 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x60 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH2 0xC72 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP1 POP DUP1 DUP3 CALLDATALOAD PUSH2 0xC83 DUP2 PUSH2 0x11EB JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0xFFFF DUP2 AND DUP2 EQ PUSH2 0xC9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0xCAC DUP5 PUSH1 0x40 DUP6 ADD PUSH2 0xCB8 JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x2B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xCDA JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xB0D DUP2 PUSH2 0x11EB JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xCF9 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0xD04 DUP2 PUSH2 0x11EB JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0xD14 DUP2 PUSH2 0x11EB JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xD37 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xD4E JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xD61 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0xD6F JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0xD82 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xDA6 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xDBD JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0xDD0 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0xDDE JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 PUSH1 0x60 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0xD82 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xE03 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0xB0D DUP4 DUP4 PUSH2 0xC42 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x80 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xE1F JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xE29 DUP5 DUP5 PUSH2 0xC42 JUMP JUMPDEST SWAP2 POP PUSH2 0xE38 DUP5 PUSH1 0x60 DUP6 ADD PUSH2 0xCB8 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xE52 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH2 0xFFFF AND SWAP1 DUP4 ADD MSTORE PUSH1 0x40 SWAP1 DUP2 ADD MLOAD PUSH1 0xFF AND SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP3 MLOAD DUP3 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP2 SWAP1 DUP5 DUP3 ADD SWAP1 PUSH1 0x40 DUP6 ADD SWAP1 DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xEF1 JUMPI PUSH2 0xEDE DUP4 DUP6 MLOAD PUSH2 0xE59 JUMP JUMPDEST SWAP3 DUP5 ADD SWAP3 PUSH1 0x60 SWAP3 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 ADD PUSH2 0xECB JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x646472657373 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x28 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH8 0x34BA16BA37B5B2B7 PUSH1 0xC1 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1E SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1A SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x29 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH9 0x1A5D0B5D185C99D95D PUSH1 0xBA SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F6E6F6E6578697374656E742D7072697A PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x195CDC1B1A5D PUSH1 0xD2 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x33 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D756C7469706C6557696E6E6572732F696E76616C69642D7072697A6573706C PUSH1 0x40 DUP3 ADD MSTORE PUSH19 0x1A5D0B5C195C98D95B9D1859D94B5D1BDD185B PUSH1 0x6A SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2F SWAP1 DUP3 ADD MSTORE PUSH32 0x5072697A6553706C69744861726E6573732F696E76616C69642D7072697A6573 PUSH1 0x40 DUP3 ADD MSTORE PUSH15 0x706C69742D746F6B656E2D74797065 PUSH1 0x88 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x2B5 DUP3 DUP5 PUSH2 0xE59 JUMP JUMPDEST PUSH2 0xFFFF SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0xFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH2 0xFFFF SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0xFF SWAP2 DUP3 AND PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x1200 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xE3 SLOAD PUSH2 0x5D6B 0xB1 0xCD SWAP14 0xA7 0xAD 0x2F 0x2F PUSH10 0xB1CCAC5D1C769B745B3E MULMOD PUSH16 0xF2C87C3FE3EEAD64736F6C634300060C STOP CALLER ",
              "sourceMap": "303:890:78:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1967:145:0;;;:::i;:::-;;1094:97:78;;;;;;:::i;:::-;;:::i;2617:103:54:-;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1335:85:0;;;:::i;:::-;;;;;;;:::i;937:153:78:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;448:177::-;;;;;;:::i;:::-;;:::i;3456:1572:54:-;;;;;;:::i;:::-;;:::i;2984:140::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2261:240:0:-;;;;;;:::i;:::-;;:::i;5375:862:54:-;;;;;;:::i;:::-;;:::i;1967:145:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;;;;;;;;;2057:6:::1;::::0;2036:40:::1;::::0;2073:1:::1;::::0;-1:-1:-1;;;;;2057:6:0::1;::::0;2036:40:::1;::::0;2073:1;;2036:40:::1;2086:6;:19:::0;;-1:-1:-1;;;;;;2086:19:0::1;::::0;;1967:145::o;1094:97:78:-;;;;:::o;2617:103:54:-;2663:25;2703:12;2696:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2696:19:54;;;;-1:-1:-1;;;2696:19:54;;;;;;;;-1:-1:-1;;;2696:19:54;;;;;;;;;;;;;;;;;;;;;;;;;2617:103;:::o;1335:85:0:-;1407:6;;-1:-1:-1;;;;;1407:6:0;1335:85;:::o;937:153:78:-;996:7;1025:35;1048:11;1025:22;:35::i;:::-;1011:49;937:153;-1:-1:-1;;937:153:78:o;448:177::-;521:13;516:105;540:21;;;516:105;;;580:14;600:6;;607:5;600:13;;;;;;;;;;;;;;;;;;;;:::i;:::-;580:34;;;;;;;;-1:-1:-1;580:34:78;;;;;;;;;;-1:-1:-1;;;;;;580:34:78;-1:-1:-1;;;;;580:34:78;;;;;;;;;;563:7;516:105;;3456:1572:54;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;3580:14:54;3549:28:::1;3706:822;3738:20;3730:5;:28;3706:822;;;3777:29;;:::i;:::-;3809:14;;3824:5;3809:21;;;;;;;;;;;;3777:53;;;;;;;;;;:::i;:::-;;;3861:1;3846:5;:11;;;:16;;;;3838:69;;;;-1:-1:-1::0;;;3838:69:54::1;;;;;;;:::i;:::-;3923:12:::0;;-1:-1:-1;;;;;3923:26:54::1;3915:80;;;;-1:-1:-1::0;;;3915:80:54::1;;;;;;;:::i;:::-;4014:12;:19:::0;:28;-1:-1:-1;4010:381:54::1;;4054:12;:24:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;4054:24:54;;;;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;;-1:-1:-1::0;;;4054:24:54::1;-1:-1:-1::0;;;;4054:24:54::1;::::0;;::::1;-1:-1:-1::0;;;4054:24:54::1;-1:-1:-1::0;;;;;;;;;4054:24:54;;::::1;-1:-1:-1::0;;;;;;4054:24:54;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;;4010:381:::1;;;4103:36;;:::i;:::-;4142:12;4155:5;4142:19;;;;;;;;;::::0;;;::::1;::::0;;;;4103:58:::1;::::0;;::::1;::::0;::::1;::::0;;4142:19;;;::::1;4103:58:::0;-1:-1:-1;;;;;4103:58:54;;::::1;::::0;;;-1:-1:-1;;;4103:58:54;::::1;;;::::0;;::::1;::::0;;;;-1:-1:-1;;;4103:58:54;;::::1;;;::::0;;;;;;;4175:12;;4103:58;;-1:-1:-1;4175:35:54::1;;;::::0;:82:::1;;;4234:12;:23;;;4214:43;;:5;:16;;;:43;;;;4175:82;:119;;;;4276:12;:18;;;4261:33;;:5;:11;;;:33;;;;4175:119;4171:212;;;4330:5;4308:12;4321:5;4308:19;;;;;;;;;::::0;;;::::1;::::0;;;;:27;;:19;::::1;:27:::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;;;4308:27:54;;::::1;-1:-1:-1::0;;;;;4308:27:54;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;4308:27:54::1;-1:-1:-1::0;;;4308:27:54::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;4308:27:54::1;-1:-1:-1::0;;;4308:27:54::1;::::0;;::::1;::::0;;;::::1;;::::0;;4171:212:::1;;;4364:8;;;;4171:212;4010:381;;4470:5;:12;;;-1:-1:-1::0;;;;;4456:65:54::1;;4484:5;:16;;;4502:5;:11;;;4515:5;4456:65;;;;;;;;:::i;:::-;;;;;;;;3706:822;;3760:7;;3706:822;;;;4647:173;4654:12;:19:::0;:42;-1:-1:-1;4647:173:54::1;;;4723:12;:19:::0;4706:14:::1;::::0;4723:26:::1;::::0;4747:1:::1;4723:23;:26::i;:::-;4706:43;;4757:12;:18;;;;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;4757:18:54;;;;;-1:-1:-1;;;;;;4757:18:54;;;;;;;;;4788:25:::1;::::0;4806:6;;4788:25:::1;::::0;::::1;4647:173;;;;4870:23;4896:34;:32;:34::i;:::-;4870:60;;4963:4;4944:15;:23;;4936:87;;;;-1:-1:-1::0;;;4936:87:54::1;;;;;;;:::i;:::-;1617:1:0;;3456:1572:54::0;;:::o;2984:140::-;3052:23;;:::i;:::-;3090:12;3103:15;3090:29;;;;;;;;;;;;;;;;;3083:36;;;;;;;;3090:29;;;;3083:36;-1:-1:-1;;;;;3083:36:54;;;;-1:-1:-1;;;3083:36:54;;;;;;;;;;;-1:-1:-1;;;3083:36:54;;;;;;;;;;;;;2984:140;-1:-1:-1;;2984:140:54:o;2261:240:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2349:22:0;::::1;2341:73;;;;-1:-1:-1::0;;;2341:73:0::1;;;;;;;:::i;:::-;2450:6;::::0;2429:38:::1;::::0;-1:-1:-1;;;;;2429:38:0;;::::1;::::0;2450:6:::1;::::0;2429:38:::1;::::0;2450:6:::1;::::0;2429:38:::1;2477:6;:17:::0;;-1:-1:-1;;;;;;2477:17:0::1;-1:-1:-1::0;;;;;2477:17:0;;;::::1;::::0;;;::::1;::::0;;2261:240::o;5375:862:54:-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;5516:12:54::1;:19:::0;5498:37:::1;::::0;::::1;;5490:88;;;;-1:-1:-1::0;;;5490:88:54::1;;;;;;;:::i;:::-;5620:1;5592:18;:24;;;:29;;;;5584:82;;;;-1:-1:-1::0;;;5584:82:54::1;;;;;;;:::i;:::-;5680:25:::0;;-1:-1:-1;;;;;5680:39:54::1;5672:93;;;;-1:-1:-1::0;;;5672:93:54::1;;;;;;;:::i;:::-;5845:18;5813:12;5826:15;5813:29;;;;;;;;;;;::::0;;;::::1;::::0;;;:50;;:29;::::1;:50:::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;;5813:50:54::1;-1:-1:-1::0;;;;5813:50:54::1;::::0;;::::1;-1:-1:-1::0;;;5813:50:54::1;-1:-1:-1::0;;;;;;;;;5813:50:54;;::::1;-1:-1:-1::0;;;;;;5813:50:54;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;;::::0;;;5940:34:::1;:32;:34::i;:::-;5914:60;;6007:4;5988:15;:23;;5980:87;;;;-1:-1:-1::0;;;5980:87:54::1;;;;;;;:::i;:::-;6132:18;:25;;;-1:-1:-1::0;;;;;6118:114:54::1;;6159:18;:29;;;6190:18;:24;;;6216:15;6118:114;;;;;;;;:::i;:::-;;;;;;;;1617:1:0;5375:862:54::0;;:::o;737:413:18:-;1097:20;1135:8;;;737:413::o;828:104:19:-;915:10;828:104;:::o;7641:745:54:-;7877:12;:19;7706:7;;7838:5;;7706:7;7902:461;7934:17;7926:5;:25;7902:461;;;7970:29;;:::i;:::-;8002:12;8015:5;8002:19;;;;;;;;;;;;;;;;7970:51;;;;;;;;8002:19;;;;7970:51;-1:-1:-1;;;;;7970:51:54;;;;-1:-1:-1;;;7970:51:54;;;;;;;;;;-1:-1:-1;;;7970:51:54;;;;;;;;;;-1:-1:-1;8052:50:54;;8073:10;;8052:20;:50::i;:::-;8029:73;;8163:63;8186:5;:12;;;8200;8214:5;:11;;;8163:22;:63::i;:::-;8333:23;:5;8343:12;8333:9;:23::i;:::-;8325:31;-1:-1:-1;;;7953:7:54;;7902:461;;;-1:-1:-1;8376:5:54;;7641:745;-1:-1:-1;;;7641:745:54:o;3147:155:8:-;3205:7;3237:1;3232;:6;;3224:49;;;;-1:-1:-1;;;3224:49:8;;;;;;;:::i;:::-;-1:-1:-1;3290:5:8;;;3147:155::o;6973:403:54:-;7117:12;:19;7040:7;;;;;7142:197;7172:17;7164:5;:25;;;7142:197;;;7208:29;;:::i;:::-;7240:12;7253:5;7240:19;;;;;;;;;;;;;;;;;;;7208:51;;;;;;;;7240:19;;;;7208:51;-1:-1:-1;;;;;7208:51:54;;;;-1:-1:-1;;;7208:51:54;;;;;;;;;;-1:-1:-1;;;7208:51:54;;;;;;;;;-1:-1:-1;7290:42:54;;:20;;:24;:42::i;:::-;7267:65;-1:-1:-1;;7191:7:54;;7142:197;;;-1:-1:-1;7351:20:54;;-1:-1:-1;;6973:403:54;:::o;6568:146::-;6656:7;6678:31;6679:19;;;;;6704:4;6678:25;:31::i;:::-;6671:38;6568:146;-1:-1:-1;;;6568:146:54:o;629:304:78:-;742:15;;;;;:34;;;761:10;:15;;775:1;761:15;742:34;734:94;;;;-1:-1:-1;;;734:94:78;;;;;;;:::i;:::-;834:22;859:14;874:10;859:26;;;;;;;;;;;;;;;;;;;;891:37;;-1:-1:-1;;;891:37:78;;-1:-1:-1;;;;;859:26:78;;;;-1:-1:-1;859:26:78;;891:21;;:37;;913:6;;921;;891:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;629:304;;;;:::o;2701:175:8:-;2759:7;2790:5;;;2813:6;;;;2805:46;;;;-1:-1:-1;;;2805:46:8;;;;;;;:::i;4228:150::-;4286:7;4317:1;4313;:5;4305:44;;;;-1:-1:-1;;;4305:44:8;;;;;;;:::i;:::-;4370:1;4366;:5;;;;;;;4228:150;-1:-1:-1;;;4228:150:8:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1232:627::-;;1356:4;1344:9;1339:3;1335:19;1331:30;1328:2;;;-1:-1;;1364:12;1328:2;19559;19553:9;1356:4;19589:6;19585:17;19696:6;19684:10;19681:22;19660:18;19648:10;19645:34;19642:62;19639:2;;;-1:-1;;19707:12;19639:2;19559;19726:22;1383:29;-1:-1;1383:29;72:20;;97:33;72:20;97:33;:::i;:::-;1471:75;;1613:2;1666:22;;1932:20;20969:6;20958:18;;21750:34;;21740:2;;-1:-1;;21788:12;21740:2;1613;1628:16;;1621:74;1790:47;1833:3;19559:2;1809:22;;1790:47;:::i;:::-;19559:2;1776:5;1772:16;1765:73;;1322:537;;;;:::o;2138:126::-;2203:20;;21266:4;21255:16;;21995:33;;21985:2;;22042:1;;22032:12;2271:241;;2375:2;2363:9;2354:7;2350:23;2346:32;2343:2;;;-1:-1;;2381:12;2343:2;85:6;72:20;97:33;124:5;97:33;:::i;2519:491::-;;;;2657:2;2645:9;2636:7;2632:23;2628:32;2625:2;;;-1:-1;;2663:12;2625:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2715:63;-1:-1;2815:2;2854:22;;72:20;97:33;72:20;97:33;:::i;:::-;2619:391;;2823:63;;-1:-1;;;2923:2;2962:22;;;;2068:20;;2619:391::o;3017:447::-;;;3181:2;3169:9;3160:7;3156:23;3152:32;3149:2;;;-1:-1;;3187:12;3149:2;3245:17;3232:31;3283:18;;3275:6;3272:30;3269:2;;;-1:-1;;3305:12;3269:2;3431:6;3420:9;3416:22;;;332:3;325:4;317:6;313:17;309:27;299:2;;-1:-1;;340:12;299:2;383:6;370:20;3283:18;402:6;399:30;396:2;;;-1:-1;;432:12;396:2;527:3;3181:2;;511:6;507:17;468:6;493:32;;490:41;487:2;;;-1:-1;;534:12;487:2;3181;464:17;;;;;3325:123;;-1:-1;3143:321;;-1:-1;;;;3143:321::o;3471:471::-;;;3647:2;3635:9;3626:7;3622:23;3618:32;3615:2;;;-1:-1;;3653:12;3615:2;3711:17;3698:31;3749:18;;3741:6;3738:30;3735:2;;;-1:-1;;3771:12;3735:2;3909:6;3898:9;3894:22;;;774:3;767:4;759:6;755:17;751:27;741:2;;-1:-1;;782:12;741:2;825:6;812:20;3749:18;844:6;841:30;838:2;;;-1:-1;;874:12;838:2;969:3;3647:2;961:4;953:6;949:17;910:6;935:32;;932:41;929:2;;;-1:-1;;976:12;4247:311;;4386:2;4374:9;4365:7;4361:23;4357:32;4354:2;;;-1:-1;;4392:12;4354:2;4454:88;4534:7;4510:22;4454:88;:::i;4565:433::-;;;4719:3;4707:9;4698:7;4694:23;4690:33;4687:2;;;-1:-1;;4726:12;4687:2;4788:88;4868:7;4844:22;4788:88;:::i;:::-;4778:98;;4931:51;4974:7;4913:2;4954:9;4950:22;4931:51;:::i;:::-;4921:61;;4681:317;;;;;:::o;5005:241::-;;5109:2;5097:9;5088:7;5084:23;5080:32;5077:2;;;-1:-1;;5115:12;5077:2;-1:-1;2068:20;;5071:175;-1:-1;5071:175::o;10629:643::-;10850:23;;-1:-1;;;;;21050:54;5636:37;;11027:4;11016:16;;;11010:23;20969:6;20958:18;11085:14;;;12077:36;11180:4;11169:16;;;11163:23;21266:4;21255:16;11236:14;;12548:35;10755:517::o;12709:222::-;-1:-1;;;;;21050:54;;;;5636:37;;12836:2;12821:18;;12807:124::o;12938:333::-;-1:-1;;;;;21050:54;;;;5636:37;;13257:2;13242:18;;12313:37;13093:2;13078:18;;13064:207::o;13278:510::-;13525:2;13539:47;;;20091:12;;13510:18;;;20436:19;;;13278:510;;13525:2;19910:14;;;;20476;;;;13278:510;6473:365;6498:6;6495:1;6492:13;6473:365;;;5411:116;5523:3;6565:6;6559:13;5411:116;:::i;:::-;20256:14;;;;5556:4;5547:14;;;;;6520:1;6513:9;6473:365;;;-1:-1;13592:186;;13496:292;-1:-1;;;;;;13496:292::o;13795:416::-;13995:2;14009:47;;;7093:2;13980:18;;;20436:19;7129:34;20476:14;;;7109:55;-1:-1;;;7184:12;;;7177:30;7226:12;;;13966:245::o;14218:416::-;14418:2;14432:47;;;7477:2;14403:18;;;20436:19;7513:29;20476:14;;;7493:50;7562:12;;;14389:245::o;14641:416::-;14841:2;14855:47;;;7813:2;14826:18;;;20436:19;7849:34;20476:14;;;7829:55;-1:-1;;;7904:12;;;7897:32;7948:12;;;14812:245::o;15064:416::-;15264:2;15278:47;;;8199:2;15249:18;;;20436:19;8235:32;20476:14;;;8215:53;8287:12;;;15235:245::o;15487:416::-;15687:2;15701:47;;;8538:2;15672:18;;;20436:19;8574:28;20476:14;;;8554:49;8622:12;;;15658:245::o;15910:416::-;16110:2;16124:47;;;8873:2;16095:18;;;20436:19;8909:34;20476:14;;;8889:55;-1:-1;;;8964:12;;;8957:33;9009:12;;;16081:245::o;16333:416::-;16533:2;16547:47;;;9260:2;16518:18;;;20436:19;9296:34;20476:14;;;9276:55;-1:-1;;;9351:12;;;9344:30;9393:12;;;16504:245::o;16756:416::-;16956:2;16970:47;;;16941:18;;;20436:19;9680:34;20476:14;;;9660:55;9734:12;;;16927:245::o;17179:416::-;17379:2;17393:47;;;9985:2;17364:18;;;20436:19;10021:34;20476:14;;;10001:55;-1:-1;;;10076:12;;;10069:43;10131:12;;;17350:245::o;17602:416::-;17802:2;17816:47;;;10382:2;17787:18;;;20436:19;10418:34;20476:14;;;10398:55;-1:-1;;;10473:12;;;10466:39;10524:12;;;17773:245::o;18025:362::-;18222:2;18207:18;;18236:141;18211:9;18350:6;18236:141;:::i;18394:432::-;20969:6;20958:18;;;;12077:36;;21266:4;21255:16;;;;18729:2;18714:18;;12548:35;18812:2;18797:18;;12313:37;18571:2;18556:18;;18542:284::o;18833:428::-;20969:6;20958:18;;;;12077:36;;21266:4;21255:16;;;19166:2;19151:18;;12548:35;21255:16;19247:2;19232:18;;12431:48;19008:2;18993:18;;18979:282::o;19268:222::-;12313:37;;;19395:2;19380:18;;19366:124::o;21394:117::-;-1:-1;;;;;21050:54;;21453:35;;21443:2;;21502:1;;21492:12;21443:2;21437:74;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "933000",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "beforeTokenTransfer(address,address,uint256)": "infinite",
                "distribute(uint256)": "infinite",
                "initialize(address[])": "infinite",
                "owner()": "1137",
                "prizeSplit(uint256)": "2446",
                "prizeSplits()": "infinite",
                "renounceOwnership()": "24253",
                "setPrizeSplit((address,uint16,uint8),uint8)": "infinite",
                "setPrizeSplits((address,uint16,uint8)[])": "infinite",
                "transferOwnership(address)": "24550"
              },
              "internal": {
                "_awardPrizeSplitAmount(address,uint256,uint8)": "infinite"
              }
            },
            "methodIdentifiers": {
              "beforeTokenTransfer(address,address,uint256)": "7cbab1c7",
              "distribute(uint256)": "91c05b0b",
              "initialize(address[])": "a224cee7",
              "owner()": "8da5cb5b",
              "prizeSplit(uint256)": "eefc8ad1",
              "prizeSplits()": "8d5f10c4",
              "renounceOwnership()": "715018a6",
              "setPrizeSplit((address,uint16,uint8),uint8)": "fbf0953e",
              "setPrizeSplits((address,uint16,uint8)[])": "c25a9c32",
              "transferOwnership(address)": "f2fde38b"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"target\",\"type\":\"uint256\"}],\"name\":\"PrizeSplitRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"PrizeSplitSet\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"beforeTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"prizeAmount\",\"type\":\"uint256\"}],\"name\":\"distribute\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ControlledToken[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"prizeSplitIndex\",\"type\":\"uint256\"}],\"name\":\"prizeSplit\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"}],\"internalType\":\"struct PrizeSplit.PrizeSplitConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizeSplits\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"}],\"internalType\":\"struct PrizeSplit.PrizeSplitConfig[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"}],\"internalType\":\"struct PrizeSplit.PrizeSplitConfig\",\"name\":\"prizeStrategySplit\",\"type\":\"tuple\"},{\"internalType\":\"uint8\",\"name\":\"prizeSplitIndex\",\"type\":\"uint8\"}],\"name\":\"setPrizeSplit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"percentage\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"token\",\"type\":\"uint8\"}],\"internalType\":\"struct PrizeSplit.PrizeSplitConfig[]\",\"name\":\"newPrizeSplits\",\"type\":\"tuple[]\"}],\"name\":\"setPrizeSplits\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"prizeSplit(uint256)\":{\"details\":\"Read PrizeSplitConfig struct from _prizeSplits array.\",\"params\":{\"prizeSplitIndex\":\"Index position of PrizeSplitConfig\"},\"returns\":{\"_0\":\"PrizeSplitConfig Single prize split config\"}},\"prizeSplits()\":{\"details\":\"Read all PrizeSplitConfig structs stored in _prizeSplits.\",\"returns\":{\"_0\":\"_prizeSplits Array of PrizeSplitConfig structs\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setPrizeSplit((address,uint16,uint8),uint8)\":{\"details\":\"Updates a prize split config by passing a new PrizeSplitConfig struct and current index position. Limited to contract owner.\",\"params\":{\"prizeSplitIndex\":\"Index position of PrizeSplitConfig to update\",\"prizeStrategySplit\":\"PrizeSplitConfig config struct\"}},\"setPrizeSplits((address,uint16,uint8)[])\":{\"details\":\"Set and remove prize split configs by passing a new PrizeSplitConfig structs array. Will remove existing PrizeSplitConfig(s) if passed array length is less than existing _prizeSplits length.\",\"params\":{\"newPrizeSplits\":\"Array of PrizeSplitConfig structs\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"events\":{\"PrizeSplitRemoved(uint256)\":{\"notice\":\"Emitted when a PrizeSplitConfig config is removed.\"},\"PrizeSplitSet(address,uint16,uint8,uint256)\":{\"notice\":\"Emitted when a PrizeSplitConfig config is added or updated.\"}},\"kind\":\"user\",\"methods\":{\"prizeSplit(uint256)\":{\"notice\":\"Read prize split config from active PrizeSplits.\"},\"prizeSplits()\":{\"notice\":\"Read all prize splits configs.\"},\"setPrizeSplit((address,uint16,uint8),uint8)\":{\"notice\":\"Updates a previously set prize split config.\"},\"setPrizeSplits((address,uint16,uint8)[])\":{\"notice\":\"Set and remove prize split(s) configs.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/PrizeSplitHarness.sol\":\"PrizeSplitHarness\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"contracts/prize-strategy/PrizeSplit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\n\\n/**\\n  * @title Abstract prize split contract for adding unique award distribution to static addresses. \\n  * @author Kames Geraghty (PoolTogether Inc)\\n*/\\nabstract contract PrizeSplit is OwnableUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  \\n  PrizeSplitConfig[] internal _prizeSplits;\\n\\n  /**\\n    * @notice The prize split configuration struct.\\n    * @dev The prize split configuration struct used to award prize splits during distribution.\\n    * @param target Address of recipient receiving the prize split distribution\\n    * @param percentage Percentage of prize split using a 0-1000 range for single decimal precision i.e. 125 = 12.5%\\n    * @param token Position of controlled token in prizePool.tokens (i.e. ticket or sponsorship)\\n  */\\n  struct PrizeSplitConfig {\\n      address target;\\n      uint16 percentage;\\n      uint8 token;\\n  }\\n\\n  /**\\n    * @notice Emitted when a PrizeSplitConfig config is added or updated.\\n    * @dev Emitted when aPrizeSplitConfig config is added or updated in setPrizeSplits or setPrizeSplit.\\n    * @param target Address of prize split recipient\\n    * @param percentage Percentage of prize split. Must be between 0 and 1000 for single decimal precision\\n    * @param token Index (0 or 1) of token in the prizePool.tokens mapping\\n    * @param index Index of prize split in the prizeSplts array\\n  */\\n  event PrizeSplitSet(address indexed target, uint16 percentage, uint8 token, uint256 index);\\n\\n  /**\\n    * @notice Emitted when a PrizeSplitConfig config is removed.\\n    * @dev Emitted when a PrizeSplitConfig config is removed from the _prizeSplits array.\\n    * @param target Index of a previously active prize split config\\n  */\\n  event PrizeSplitRemoved(uint256 indexed target);\\n\\n  /**\\n    * @notice Mints ticket or sponsorship tokens to prize split recipient.\\n    * @dev Mints ticket or sponsorship tokens to prize split recipient via the linked PrizePool contract.\\n    * @param target Recipient of minted tokens\\n    * @param amount Amount of minted tokens\\n    * @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping\\n  */\\n  function _awardPrizeSplitAmount(address target, uint256 amount, uint8 tokenIndex) virtual internal;\\n\\n  /**\\n    * @notice Read all prize splits configs.\\n    * @dev Read all PrizeSplitConfig structs stored in _prizeSplits.\\n    * @return _prizeSplits Array of PrizeSplitConfig structs\\n  */\\n  function prizeSplits() external view returns (PrizeSplitConfig[] memory) {\\n    return _prizeSplits;\\n  }\\n\\n  /**\\n    * @notice Read prize split config from active PrizeSplits.\\n    * @dev Read PrizeSplitConfig struct from _prizeSplits array.\\n    * @param prizeSplitIndex Index position of PrizeSplitConfig\\n    * @return PrizeSplitConfig Single prize split config\\n  */\\n  function prizeSplit(uint256 prizeSplitIndex) external view returns (PrizeSplitConfig memory) {\\n    return _prizeSplits[prizeSplitIndex];\\n  }\\n\\n  /**\\n    * @notice Set and remove prize split(s) configs.\\n    * @dev Set and remove prize split configs by passing a new PrizeSplitConfig structs array. Will remove existing PrizeSplitConfig(s) if passed array length is less than existing _prizeSplits length.\\n    * @param newPrizeSplits Array of PrizeSplitConfig structs\\n  */\\n  function setPrizeSplits(PrizeSplitConfig[] calldata newPrizeSplits) external onlyOwner {\\n    uint256 newPrizeSplitsLength = newPrizeSplits.length;\\n\\n    // Add and/or update prize split configs using newPrizeSplits PrizeSplitConfig structs array.\\n    for (uint256 index = 0; index < newPrizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = newPrizeSplits[index];\\n      require(split.token <= 1, \\\"MultipleWinners/invalid-prizesplit-token\\\");\\n      require(split.target != address(0), \\\"MultipleWinners/invalid-prizesplit-target\\\");\\n      \\n      if (_prizeSplits.length <= index) {\\n        _prizeSplits.push(split);\\n      } else {\\n        PrizeSplitConfig memory currentSplit = _prizeSplits[index];\\n        if (split.target != currentSplit.target || split.percentage != currentSplit.percentage || split.token != currentSplit.token) {\\n          _prizeSplits[index] = split;\\n        } else {\\n          continue;\\n        }\\n      }\\n\\n      // Emit the added/updated prize split config.\\n      emit PrizeSplitSet(split.target, split.percentage, split.token, index);\\n    }\\n\\n    // Remove old prize splits configs. Match storage _prizesSplits.length with the passed newPrizeSplits.length\\n    while (_prizeSplits.length > newPrizeSplitsLength) {\\n      uint256 _index = _prizeSplits.length.sub(1);\\n      _prizeSplits.pop();\\n      emit PrizeSplitRemoved(_index);\\n    }\\n\\n    // Total prize split do not exceed 100%\\n    uint256 totalPercentage = _totalPrizeSplitPercentageAmount();\\n    require(totalPercentage <= 1000, \\\"MultipleWinners/invalid-prizesplit-percentage-total\\\");\\n  }\\n\\n  /**\\n    * @notice Updates a previously set prize split config.\\n    * @dev Updates a prize split config by passing a new PrizeSplitConfig struct and current index position. Limited to contract owner.\\n    * @param prizeStrategySplit PrizeSplitConfig config struct\\n    * @param prizeSplitIndex Index position of PrizeSplitConfig to update\\n  */\\n  function setPrizeSplit(PrizeSplitConfig memory prizeStrategySplit, uint8 prizeSplitIndex) external onlyOwner {\\n    require(prizeSplitIndex < _prizeSplits.length, \\\"MultipleWinners/nonexistent-prizesplit\\\");\\n    require(prizeStrategySplit.token <= 1, \\\"MultipleWinners/invalid-prizesplit-token\\\");\\n    require(prizeStrategySplit.target != address(0), \\\"MultipleWinners/invalid-prizesplit-target\\\");\\n    \\n    // Update the prize split config\\n    _prizeSplits[prizeSplitIndex] = prizeStrategySplit;\\n\\n    // Total prize split do not exceed 100%\\n    uint256 totalPercentage = _totalPrizeSplitPercentageAmount();\\n    require(totalPercentage <= 1000, \\\"MultipleWinners/invalid-prizesplit-percentage-total\\\");\\n\\n    // Emit updated prize split config\\n    emit PrizeSplitSet(prizeStrategySplit.target, prizeStrategySplit.percentage, prizeStrategySplit.token, prizeSplitIndex);\\n  }\\n\\n  /**\\n  * @notice Calculate single prize split distribution amount.\\n  * @dev Calculate single prize split distribution amount using the total prize amount and prize split percentage.\\n  * @param amount Total prize award distribution amount\\n  * @param percentage Percentage with single decimal precision using 0-1000 ranges\\n  */\\n  function _getPrizeSplitAmount(uint256 amount, uint16 percentage) internal pure returns (uint256) {\\n    return (amount * percentage).div(1000);\\n  }\\n\\n  /**\\n  * @notice Calculates total prize split percentage amount.\\n  * @dev Calculates total PrizeSplitConfig percentage(s) amount. Used to check the total does not exceed 100% of award distribution.\\n  * @return Total prize split(s) percentage amount\\n  */\\n  function _totalPrizeSplitPercentageAmount() internal view returns (uint256) {\\n    uint256 _tempTotalPercentage;\\n    uint256 prizeSplitsLength = _prizeSplits.length;\\n    for (uint8 index = 0; index < prizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = _prizeSplits[index];\\n      _tempTotalPercentage = _tempTotalPercentage.add(split.percentage);\\n    }\\n    return _tempTotalPercentage;\\n  }\\n\\n  /**\\n  * @notice Distributes prize split(s).\\n  * @dev Distributes prize split(s) by awarding ticket or sponsorship tokens.\\n  * @param prize Starting prize award amount\\n  * @return Total prize award distribution amount exlcuding the awarded prize split(s)\\n  */\\n  function _distributePrizeSplits(uint256 prize) internal returns (uint256) {\\n    // Store temporary total prize amount for multiple calculations using initial prize amount.\\n    uint256 _prizeTemp = prize;\\n    uint256 prizeSplitsLength = _prizeSplits.length;\\n    for (uint256 index = 0; index < prizeSplitsLength; index++) {\\n      PrizeSplitConfig memory split = _prizeSplits[index];\\n      uint256 _splitAmount = _getPrizeSplitAmount(_prizeTemp, split.percentage);\\n\\n      // Award the prize split distribution amount.\\n      _awardPrizeSplitAmount(split.target, _splitAmount, split.token);\\n\\n      // Update the remaining prize amount after distributing the prize split percentage.\\n      prize = prize.sub(_splitAmount);\\n    }\\n\\n    return prize;\\n  }\\n\\n}\",\"keccak256\":\"0xc736c25922cf9065c73a06108d4d05c18af9a9e393c5280ba5d4cdb1863f3dbd\",\"license\":\"MIT\"},\"contracts/test/PrizeSplitHarness.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../prize-strategy/PrizeSplit.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ncontract PrizeSplitHarness is PrizeSplit {\\n\\n  ControlledToken[] internal externalErc20s;\\n\\n  constructor () public {\\n    __Ownable_init();\\n  }\\n\\n  function initialize(ControlledToken[] calldata tokens) public {\\n    for (uint256 index = 0; index < tokens.length; index++) {\\n      externalErc20s.push(tokens[index]);\\n    }\\n  }\\n\\n  function _awardPrizeSplitAmount(address target, uint256 amount, uint8 tokenIndex) override internal{\\n    require(tokenIndex == 0 || tokenIndex == 1, \\\"PrizeSplitHarness/invalid-prizesplit-token-type\\\");\\n    ControlledToken _token = externalErc20s[tokenIndex];\\n    _token.controllerMint(target, amount);\\n  }\\n\\n  function distribute(uint256 prizeAmount) external returns (uint256) {\\n    prizeAmount = _distributePrizeSplits(prizeAmount);\\n\\n    return prizeAmount;\\n  }\\n\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external {\\n    return;\\n  }\\n}\",\"keccak256\":\"0xa092e873c8730d1907a96a289814a3e8f34e2c90b204619bf355abf6fd36fb94\",\"license\":\"MIT\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/test/PrizeSplitHarness.sol:PrizeSplitHarness",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/test/PrizeSplitHarness.sol:PrizeSplitHarness",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/test/PrizeSplitHarness.sol:PrizeSplitHarness",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 10,
                "contract": "contracts/test/PrizeSplitHarness.sol:PrizeSplitHarness",
                "label": "_owner",
                "offset": 0,
                "slot": "51",
                "type": "t_address"
              },
              {
                "astId": 129,
                "contract": "contracts/test/PrizeSplitHarness.sol:PrizeSplitHarness",
                "label": "__gap",
                "offset": 0,
                "slot": "52",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 11452,
                "contract": "contracts/test/PrizeSplitHarness.sol:PrizeSplitHarness",
                "label": "_prizeSplits",
                "offset": 0,
                "slot": "101",
                "type": "t_array(t_struct(PrizeSplitConfig)11459_storage)dyn_storage"
              },
              {
                "astId": 14499,
                "contract": "contracts/test/PrizeSplitHarness.sol:PrizeSplitHarness",
                "label": "externalErc20s",
                "offset": 0,
                "slot": "102",
                "type": "t_array(t_contract(ControlledToken)15810)dyn_storage"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_contract(ControlledToken)15810)dyn_storage": {
                "base": "t_contract(ControlledToken)15810",
                "encoding": "dynamic_array",
                "label": "contract ControlledToken[]",
                "numberOfBytes": "32"
              },
              "t_array(t_struct(PrizeSplitConfig)11459_storage)dyn_storage": {
                "base": "t_struct(PrizeSplitConfig)11459_storage",
                "encoding": "dynamic_array",
                "label": "struct PrizeSplit.PrizeSplitConfig[]",
                "numberOfBytes": "32"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_contract(ControlledToken)15810": {
                "encoding": "inplace",
                "label": "contract ControlledToken",
                "numberOfBytes": "20"
              },
              "t_struct(PrizeSplitConfig)11459_storage": {
                "encoding": "inplace",
                "label": "struct PrizeSplit.PrizeSplitConfig",
                "members": [
                  {
                    "astId": 11454,
                    "contract": "contracts/test/PrizeSplitHarness.sol:PrizeSplitHarness",
                    "label": "target",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_address"
                  },
                  {
                    "astId": 11456,
                    "contract": "contracts/test/PrizeSplitHarness.sol:PrizeSplitHarness",
                    "label": "percentage",
                    "offset": 20,
                    "slot": "0",
                    "type": "t_uint16"
                  },
                  {
                    "astId": 11458,
                    "contract": "contracts/test/PrizeSplitHarness.sol:PrizeSplitHarness",
                    "label": "token",
                    "offset": 22,
                    "slot": "0",
                    "type": "t_uint8"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_uint16": {
                "encoding": "inplace",
                "label": "uint16",
                "numberOfBytes": "2"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint8": {
                "encoding": "inplace",
                "label": "uint8",
                "numberOfBytes": "1"
              }
            }
          },
          "userdoc": {
            "events": {
              "PrizeSplitRemoved(uint256)": {
                "notice": "Emitted when a PrizeSplitConfig config is removed."
              },
              "PrizeSplitSet(address,uint16,uint8,uint256)": {
                "notice": "Emitted when a PrizeSplitConfig config is added or updated."
              }
            },
            "kind": "user",
            "methods": {
              "prizeSplit(uint256)": {
                "notice": "Read prize split config from active PrizeSplits."
              },
              "prizeSplits()": {
                "notice": "Read all prize splits configs."
              },
              "setPrizeSplit((address,uint16,uint8),uint8)": {
                "notice": "Updates a previously set prize split config."
              },
              "setPrizeSplits((address,uint16,uint8)[])": {
                "notice": "Set and remove prize split(s) configs."
              }
            },
            "version": 1
          }
        }
      },
      "contracts/test/RNGServiceMock.sol": {
        "RNGServiceMock": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "uint32",
                  "name": "requestId",
                  "type": "uint32"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "randomNumber",
                  "type": "uint256"
                }
              ],
              "name": "RandomNumberCompleted",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "uint32",
                  "name": "requestId",
                  "type": "uint32"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "sender",
                  "type": "address"
                }
              ],
              "name": "RandomNumberRequested",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "getLastRequestId",
              "outputs": [
                {
                  "internalType": "uint32",
                  "name": "requestId",
                  "type": "uint32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "getRequestFee",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "_feeToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_requestFee",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint32",
                  "name": "",
                  "type": "uint32"
                }
              ],
              "name": "isRequestComplete",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint32",
                  "name": "",
                  "type": "uint32"
                }
              ],
              "name": "randomNumber",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "requestRandomNumber",
              "outputs": [
                {
                  "internalType": "uint32",
                  "name": "",
                  "type": "uint32"
                },
                {
                  "internalType": "uint32",
                  "name": "",
                  "type": "uint32"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_random",
                  "type": "uint256"
                }
              ],
              "name": "setRandomNumber",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_feeToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_requestFee",
                  "type": "uint256"
                }
              ],
              "name": "setRequestFee",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "getLastRequestId()": {
                "returns": {
                  "requestId": "The last request id used in the last request"
                }
              },
              "getRequestFee()": {
                "returns": {
                  "_feeToken": "_feeToken",
                  "_requestFee": "_requestFee"
                }
              },
              "requestRandomNumber()": {
                "details": "Some services will complete the request immediately, others may have a time-delaySome services require payment in the form of a token, such as $LINK for Chainlink VRF",
                "returns": {
                  "_0": "requestId The ID of the request used to get the results of the RNG service",
                  "_1": "lockBlock The block number at which the RNG service will start generating time-delayed randomness.  The calling contract should \"lock\" all activity until the result is available via the `requestId`"
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50610243806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80638678a7b21161005b5780638678a7b2146101055780639d2a5f9814610136578063d6bfea281461016b578063de1760fd1461018a5761007d565b80630d37b5371461008257806319c2b4c3146100ad5780633a19b9bc146100ce575b600080fd5b61008a6101b6565b604080516001600160a01b03909316835260208301919091528051918290030190f35b6100b56101ca565b6040805163ffffffff9092168252519081900360200190f35b6100f1600480360360208110156100e457600080fd5b503563ffffffff166101cf565b604080519115158252519081900360200190f35b61010d6101d5565b604051808363ffffffff1681526020018263ffffffff1681526020019250505060405180910390f35b6101596004803603602081101561014c57600080fd5b503563ffffffff166101db565b60408051918252519081900360200190f35b6101886004803603602081101561018157600080fd5b50356101e2565b005b610188600480360360408110156101a057600080fd5b506001600160a01b0381351690602001356101e7565b6001546002546001600160a01b0390911691565b600190565b50600190565b60018091565b5060005490565b600055565b600180546001600160a01b0319166001600160a01b03939093169290921790915560025556fea26469706673582212207c6a61f6b370c2f73a28c04017402e7c98ad05a6fd9a2b0c28a29d628611ca7764736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x243 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x7D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8678A7B2 GT PUSH2 0x5B JUMPI DUP1 PUSH4 0x8678A7B2 EQ PUSH2 0x105 JUMPI DUP1 PUSH4 0x9D2A5F98 EQ PUSH2 0x136 JUMPI DUP1 PUSH4 0xD6BFEA28 EQ PUSH2 0x16B JUMPI DUP1 PUSH4 0xDE1760FD EQ PUSH2 0x18A JUMPI PUSH2 0x7D JUMP JUMPDEST DUP1 PUSH4 0xD37B537 EQ PUSH2 0x82 JUMPI DUP1 PUSH4 0x19C2B4C3 EQ PUSH2 0xAD JUMPI DUP1 PUSH4 0x3A19B9BC EQ PUSH2 0xCE JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8A PUSH2 0x1B6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB ADD SWAP1 RETURN JUMPDEST PUSH2 0xB5 PUSH2 0x1CA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0xFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0xF1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xE4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH4 0xFFFFFFFF AND PUSH2 0x1CF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x10D PUSH2 0x1D5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x159 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x14C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH4 0xFFFFFFFF AND PUSH2 0x1DB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x188 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x181 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1E2 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x188 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x1E7 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 SWAP2 JUMP JUMPDEST POP PUSH1 0x0 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 SSTORE JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE PUSH1 0x2 SSTORE JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH29 0x6A61F6B370C2F73A28C04017402E7C98AD05A6FD9A2B0C28A29D628611 0xCA PUSH24 0x64736F6C634300060C003300000000000000000000000000 ",
              "sourceMap": "104:937:79:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506004361061007d5760003560e01c80638678a7b21161005b5780638678a7b2146101055780639d2a5f9814610136578063d6bfea281461016b578063de1760fd1461018a5761007d565b80630d37b5371461008257806319c2b4c3146100ad5780633a19b9bc146100ce575b600080fd5b61008a6101b6565b604080516001600160a01b03909316835260208301919091528051918290030190f35b6100b56101ca565b6040805163ffffffff9092168252519081900360200190f35b6100f1600480360360208110156100e457600080fd5b503563ffffffff166101cf565b604080519115158252519081900360200190f35b61010d6101d5565b604051808363ffffffff1681526020018263ffffffff1681526020019250505060405180910390f35b6101596004803603602081101561014c57600080fd5b503563ffffffff166101db565b60408051918252519081900360200190f35b6101886004803603602081101561018157600080fd5b50356101e2565b005b610188600480360360408110156101a057600080fd5b506001600160a01b0381351690602001356101e7565b6001546002546001600160a01b0390911691565b600190565b50600190565b60018091565b5060005490565b600055565b600180546001600160a01b0319166001600160a01b03939093169290921790915560025556fea26469706673582212207c6a61f6b370c2f73a28c04017402e7c98ad05a6fd9a2b0c28a29d628611ca7764736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x7D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8678A7B2 GT PUSH2 0x5B JUMPI DUP1 PUSH4 0x8678A7B2 EQ PUSH2 0x105 JUMPI DUP1 PUSH4 0x9D2A5F98 EQ PUSH2 0x136 JUMPI DUP1 PUSH4 0xD6BFEA28 EQ PUSH2 0x16B JUMPI DUP1 PUSH4 0xDE1760FD EQ PUSH2 0x18A JUMPI PUSH2 0x7D JUMP JUMPDEST DUP1 PUSH4 0xD37B537 EQ PUSH2 0x82 JUMPI DUP1 PUSH4 0x19C2B4C3 EQ PUSH2 0xAD JUMPI DUP1 PUSH4 0x3A19B9BC EQ PUSH2 0xCE JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8A PUSH2 0x1B6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB ADD SWAP1 RETURN JUMPDEST PUSH2 0xB5 PUSH2 0x1CA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0xFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0xF1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xE4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH4 0xFFFFFFFF AND PUSH2 0x1CF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x10D PUSH2 0x1D5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x159 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x14C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH4 0xFFFFFFFF AND PUSH2 0x1DB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x188 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x181 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1E2 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x188 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x1E7 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST POP PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 SWAP2 JUMP JUMPDEST POP PUSH1 0x0 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 SSTORE JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE PUSH1 0x2 SSTORE JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH29 0x6A61F6B370C2F73A28C04017402E7C98AD05A6FD9A2B0C28A29D628611 0xCA PUSH24 0x64736F6C634300060C003300000000000000000000000000 ",
              "sourceMap": "104:937:79:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;525:137;;;:::i;:::-;;;;-1:-1:-1;;;;;525:137:79;;;;;;;;;;;;;;;;;;;;;237:97;;;:::i;:::-;;;;;;;;;;;;;;;;;;;850:95;;;;;;;;;;;;;;;;-1:-1:-1;850:95:79;;;;:::i;:::-;;;;;;;;;;;;;;;;;;748:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;949:90;;;;;;;;;;;;;;;;-1:-1:-1;949:90:79;;;;:::i;:::-;;;;;;;;;;;;;;;;666:78;;;;;;;;;;;;;;;;-1:-1:-1;666:78:79;;:::i;:::-;;338:133;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;338:133:79;;;;;;;;:::i;525:137::-;636:8;;646:10;;-1:-1:-1;;;;;636:8:79;;;525:137;:::o;237:97::-;328:1;237:97;:::o;850:95::-;-1:-1:-1;936:4:79;;850:95::o;748:98::-;836:1;;748:98;:::o;949:90::-;-1:-1:-1;1006:7:79;1028:6;;949:90::o;666:78::-;723:6;:16;666:78::o;338:133::-;416:8;:20;;-1:-1:-1;;;;;;416:20:79;-1:-1:-1;;;;;416:20:79;;;;;;;;;;;442:10;:24;338:133::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "115800",
                "executionCost": "165",
                "totalCost": "115965"
              },
              "external": {
                "getLastRequestId()": "230",
                "getRequestFee()": "1871",
                "isRequestComplete(uint32)": "299",
                "randomNumber(uint32)": "1070",
                "requestRandomNumber()": "240",
                "setRandomNumber(uint256)": "20233",
                "setRequestFee(address,uint256)": "41160"
              }
            },
            "methodIdentifiers": {
              "getLastRequestId()": "19c2b4c3",
              "getRequestFee()": "0d37b537",
              "isRequestComplete(uint32)": "3a19b9bc",
              "randomNumber(uint32)": "9d2a5f98",
              "requestRandomNumber()": "8678a7b2",
              "setRandomNumber(uint256)": "d6bfea28",
              "setRequestFee(address,uint256)": "de1760fd"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"requestId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"randomNumber\",\"type\":\"uint256\"}],\"name\":\"RandomNumberCompleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"requestId\",\"type\":\"uint32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RandomNumberRequested\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"getLastRequestId\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"requestId\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRequestFee\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_requestFee\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"name\":\"isRequestComplete\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"name\":\"randomNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requestRandomNumber\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_random\",\"type\":\"uint256\"}],\"name\":\"setRandomNumber\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_requestFee\",\"type\":\"uint256\"}],\"name\":\"setRequestFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getLastRequestId()\":{\"returns\":{\"requestId\":\"The last request id used in the last request\"}},\"getRequestFee()\":{\"returns\":{\"_feeToken\":\"_feeToken\",\"_requestFee\":\"_requestFee\"}},\"requestRandomNumber()\":{\"details\":\"Some services will complete the request immediately, others may have a time-delaySome services require payment in the form of a token, such as $LINK for Chainlink VRF\",\"returns\":{\"_0\":\"requestId The ID of the request used to get the results of the RNG service\",\"_1\":\"lockBlock The block number at which the RNG service will start generating time-delayed randomness.  The calling contract should \\\"lock\\\" all activity until the result is available via the `requestId`\"}}},\"version\":1},\"userdoc\":{\"events\":{\"RandomNumberCompleted(uint32,uint256)\":{\"notice\":\"Emitted when an existing request for a random number has been completed\"},\"RandomNumberRequested(uint32,address)\":{\"notice\":\"Emitted when a new request for a random number has been submitted\"}},\"kind\":\"user\",\"methods\":{\"getLastRequestId()\":{\"notice\":\"Gets the last request id used by the RNG service\"},\"requestRandomNumber()\":{\"notice\":\"Sends a request for a random number to the 3rd-party service\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/RNGServiceMock.sol\":\"RNGServiceMock\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.6.0;\\n\\n/// @title Random Number Generator Interface\\n/// @notice Provides an interface for requesting random numbers from 3rd-party RNG services (Chainlink VRF, Starkware VDF, etc..)\\ninterface RNGInterface {\\n\\n  /// @notice Emitted when a new request for a random number has been submitted\\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\\n  /// @param sender The indexed address of the sender of the request\\n  event RandomNumberRequested(uint32 indexed requestId, address indexed sender);\\n\\n  /// @notice Emitted when an existing request for a random number has been completed\\n  /// @param requestId The indexed ID of the request used to get the results of the RNG service\\n  /// @param randomNumber The random number produced by the 3rd-party service\\n  event RandomNumberCompleted(uint32 indexed requestId, uint256 randomNumber);\\n\\n  /// @notice Gets the last request id used by the RNG service\\n  /// @return requestId The last request id used in the last request\\n  function getLastRequestId() external view returns (uint32 requestId);\\n\\n  /// @notice Gets the Fee for making a Request against an RNG service\\n  /// @return feeToken The address of the token that is used to pay fees\\n  /// @return requestFee The fee required to be paid to make a request\\n  function getRequestFee() external view returns (address feeToken, uint256 requestFee);\\n\\n  /// @notice Sends a request for a random number to the 3rd-party service\\n  /// @dev Some services will complete the request immediately, others may have a time-delay\\n  /// @dev Some services require payment in the form of a token, such as $LINK for Chainlink VRF\\n  /// @return requestId The ID of the request used to get the results of the RNG service\\n  /// @return lockBlock The block number at which the RNG service will start generating time-delayed randomness.  The calling contract\\n  /// should \\\"lock\\\" all activity until the result is available via the `requestId`\\n  function requestRandomNumber() external returns (uint32 requestId, uint32 lockBlock);\\n\\n  /// @notice Checks if the request for randomness from the 3rd-party service has completed\\n  /// @dev For time-delayed requests, this function is used to check/confirm completion\\n  /// @param requestId The ID of the request used to get the results of the RNG service\\n  /// @return isCompleted True if the request has completed and a random number is available, false otherwise\\n  function isRequestComplete(uint32 requestId) external view returns (bool isCompleted);\\n\\n  /// @notice Gets the random number produced by the 3rd-party service\\n  /// @param requestId The ID of the request used to get the results of the RNG service\\n  /// @return randomNum The random number\\n  function randomNumber(uint32 requestId) external returns (uint256 randomNum);\\n}\\n\",\"keccak256\":\"0xf917c68439d7476cd226f475e8fce940e0cf1d32cb0ff12e8537072a07f2b1da\",\"license\":\"GPL-3.0\"},\"contracts/test/RNGServiceMock.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol\\\";\\n\\ncontract RNGServiceMock is RNGInterface {\\n\\n  uint256 internal random;\\n  address internal feeToken;\\n  uint256 internal requestFee;\\n\\n  function getLastRequestId() external override view returns (uint32 requestId) {\\n    return 1;\\n  }\\n\\n  function setRequestFee(address _feeToken, uint256 _requestFee) external {\\n    feeToken = _feeToken;\\n    requestFee = _requestFee;\\n  }\\n\\n  /// @return _feeToken\\n  /// @return _requestFee\\n  function getRequestFee() external override view returns (address _feeToken, uint256 _requestFee) {\\n    return (feeToken, requestFee);\\n  }\\n\\n  function setRandomNumber(uint256 _random) external {\\n    random = _random;\\n  }\\n\\n  function requestRandomNumber() external override returns (uint32, uint32) {\\n    return (1, 1);\\n  }\\n\\n  function isRequestComplete(uint32) external override view returns (bool) {\\n    return true;\\n  }\\n\\n  function randomNumber(uint32) external override returns (uint256) {\\n    return random;\\n  }\\n}\",\"keccak256\":\"0xf6a118ee04ee1b1e4d4f6f4617863900fec15408a29cb6e5a2f7f9780f7a8076\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 14604,
                "contract": "contracts/test/RNGServiceMock.sol:RNGServiceMock",
                "label": "random",
                "offset": 0,
                "slot": "0",
                "type": "t_uint256"
              },
              {
                "astId": 14606,
                "contract": "contracts/test/RNGServiceMock.sol:RNGServiceMock",
                "label": "feeToken",
                "offset": 0,
                "slot": "1",
                "type": "t_address"
              },
              {
                "astId": 14608,
                "contract": "contracts/test/RNGServiceMock.sol:RNGServiceMock",
                "label": "requestFee",
                "offset": 0,
                "slot": "2",
                "type": "t_uint256"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              }
            }
          },
          "userdoc": {
            "events": {
              "RandomNumberCompleted(uint32,uint256)": {
                "notice": "Emitted when an existing request for a random number has been completed"
              },
              "RandomNumberRequested(uint32,address)": {
                "notice": "Emitted when a new request for a random number has been submitted"
              }
            },
            "kind": "user",
            "methods": {
              "getLastRequestId()": {
                "notice": "Gets the last request id used by the RNG service"
              },
              "requestRandomNumber()": {
                "notice": "Sends a request for a random number to the 3rd-party service"
              }
            },
            "version": 1
          }
        }
      },
      "contracts/test/StakePrizePoolHarness.sol": {
        "StakePrizePoolHarness": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "AwardCaptured",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "Awarded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "AwardedExternalERC20",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256[]",
                  "name": "tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "AwardedExternalERC721",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract ControlledTokenInterface",
                  "name": "token",
                  "type": "address"
                }
              ],
              "name": "ControlledTokenAdded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "CreditBurned",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "CreditMinted",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint128",
                  "name": "creditLimitMantissa",
                  "type": "uint128"
                },
                {
                  "indexed": false,
                  "internalType": "uint128",
                  "name": "creditRateMantissa",
                  "type": "uint128"
                }
              ],
              "name": "CreditPlanSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "referrer",
                  "type": "address"
                }
              ],
              "name": "Deposited",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "bytes",
                  "name": "error",
                  "type": "bytes"
                }
              ],
              "name": "ErrorAwardingExternalERC721",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "reserveRegistry",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "maxExitFeeMantissa",
                  "type": "uint256"
                }
              ],
              "name": "Initialized",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "redeemed",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "exitFee",
                  "type": "uint256"
                }
              ],
              "name": "InstantWithdrawal",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "liquidityCap",
                  "type": "uint256"
                }
              ],
              "name": "LiquidityCapSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "prizeStrategy",
                  "type": "address"
                }
              ],
              "name": "PrizeStrategySet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "ReserveFeeCaptured",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "ReserveWithdrawal",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "stakeToken",
                  "type": "address"
                }
              ],
              "name": "StakePrizePoolInitialized",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "TransferredExternalERC20",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "VERSION",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "accountedBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "awardBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "awardExternalERC20",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256[]",
                  "name": "tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "awardExternalERC721",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "balance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "balanceOfCredit",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "beforeTokenTransfer",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "calculateEarlyExitFee",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "exitFee",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "burnedCredit",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "calculateReserveFee",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_externalToken",
                  "type": "address"
                }
              ],
              "name": "canAwardExternal",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "captureAwardBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract ICompLike",
                  "name": "compLike",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                }
              ],
              "name": "compLikeDelegate",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "creditPlanOf",
              "outputs": [
                {
                  "internalType": "uint128",
                  "name": "creditLimitMantissa",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "creditRateMantissa",
                  "type": "uint128"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "currentTime",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "referrer",
                  "type": "address"
                }
              ],
              "name": "depositTo",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_principal",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "_interest",
                  "type": "uint256"
                }
              ],
              "name": "estimateCreditAccrualTime",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "durationSeconds",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "_reserveRegistry",
                  "type": "address"
                },
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "_controlledTokens",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256",
                  "name": "_maxExitFeeMantissa",
                  "type": "uint256"
                }
              ],
              "name": "initialize",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "_reserveRegistry",
                  "type": "address"
                },
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "_controlledTokens",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256",
                  "name": "_maxExitFeeMantissa",
                  "type": "uint256"
                },
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_stakeToken",
                  "type": "address"
                }
              ],
              "name": "initialize",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract ControlledTokenInterface",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "isControlled",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "liquidityCap",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "maxExitFeeMantissa",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "onERC721Received",
              "outputs": [
                {
                  "internalType": "bytes4",
                  "name": "",
                  "type": "bytes4"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizeStrategy",
              "outputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "redeemAmount",
                  "type": "uint256"
                }
              ],
              "name": "redeem",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "renounceOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "reserveRegistry",
              "outputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "reserveTotalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint128",
                  "name": "_creditRateMantissa",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "_creditLimitMantissa",
                  "type": "uint128"
                }
              ],
              "name": "setCreditPlanOf",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_currentTime",
                  "type": "uint256"
                }
              ],
              "name": "setCurrentTime",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_liquidityCap",
                  "type": "uint256"
                }
              ],
              "name": "setLiquidityCap",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "_prizeStrategy",
                  "type": "address"
                }
              ],
              "name": "setPrizeStrategy",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "mintAmount",
                  "type": "uint256"
                }
              ],
              "name": "supply",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "token",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "tokens",
              "outputs": [
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "",
                  "type": "address[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transferExternalERC20",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "maximumExitFee",
                  "type": "uint256"
                }
              ],
              "name": "withdrawInstantlyFrom",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                }
              ],
              "name": "withdrawReserve",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "accountedBalance()": {
                "returns": {
                  "_0": "The current total of all tokens"
                }
              },
              "award(address,uint256,address)": {
                "details": "The amount awarded must be less than the awardBalance()",
                "params": {
                  "amount": "The amount of assets to be awarded",
                  "controlledToken": "The address of the asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "awardBalance()": {
                "details": "captureAwardBalance() should be called first",
                "returns": {
                  "_0": "The total amount of assets to be awarded for the current prize"
                }
              },
              "awardExternalERC20(address,address,uint256)": {
                "details": "Used to award any arbitrary tokens held by the Prize Pool",
                "params": {
                  "amount": "The amount of external assets to be awarded",
                  "externalToken": "The address of the external asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "awardExternalERC721(address,address,uint256[])": {
                "details": "Used to award any arbitrary NFTs held by the Prize Pool",
                "params": {
                  "externalToken": "The address of the external NFT token being awarded",
                  "to": "The address of the winner that receives the award",
                  "tokenIds": "An array of NFT Token IDs to be transferred"
                }
              },
              "balance()": {
                "details": "Returns the total underlying balance of all assets. This includes both principal and interest.",
                "returns": {
                  "_0": "The underlying balance of assets"
                }
              },
              "balanceOfCredit(address,address)": {
                "params": {
                  "user": "The user whose credit balance should be returned"
                },
                "returns": {
                  "_0": "The balance of the users credit"
                }
              },
              "beforeTokenTransfer(address,address,uint256)": {
                "params": {
                  "amount": "The amount of tokens being trasferred",
                  "from": "The address the tokens are being transferred from (0 if minting)",
                  "to": "The address the tokens are being transferred to (0 if burning)"
                }
              },
              "calculateEarlyExitFee(address,address,uint256)": {
                "params": {
                  "amount": "The amount of collateral to be withdrawn",
                  "controlledToken": "The type of collateral being withdrawn",
                  "from": "The user who is withdrawing"
                },
                "returns": {
                  "burnedCredit": "The user's credit that was burned",
                  "exitFee": "The exit fee"
                }
              },
              "calculateReserveFee(uint256)": {
                "params": {
                  "amount": "The prize amount"
                },
                "returns": {
                  "_0": "The size of the reserve portion of the prize"
                }
              },
              "canAwardExternal(address)": {
                "details": "Checks with the Prize Pool if a specific token type may be awarded as an external prize",
                "params": {
                  "_externalToken": "The address of the token to check"
                },
                "returns": {
                  "_0": "True if the token may be awarded, false otherwise"
                }
              },
              "captureAwardBalance()": {
                "details": "This function also captures the reserve fees.",
                "returns": {
                  "_0": "The total amount of assets to be awarded for the current prize"
                }
              },
              "compLikeDelegate(address,address)": {
                "params": {
                  "compLike": "The COMP-like token held by the prize pool that should be delegated",
                  "to": "The address to delegate to "
                }
              },
              "creditPlanOf(address)": {
                "params": {
                  "controlledToken": "The controlled token to retrieve the credit rates for"
                },
                "returns": {
                  "creditLimitMantissa": "The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.",
                  "creditRateMantissa": "The credit rate. This is the amount of tokens that accrue per second."
                }
              },
              "depositTo(address,uint256,address,address)": {
                "params": {
                  "amount": "The amount of assets to deposit",
                  "controlledToken": "The address of the type of token the user is minting",
                  "referrer": "The referrer of the deposit",
                  "to": "The address receiving the newly minted tokens"
                }
              },
              "estimateCreditAccrualTime(address,uint256,uint256)": {
                "params": {
                  "_interest": "The amount of interest that must accrue",
                  "_principal": "The principal amount on which interest is accruing"
                },
                "returns": {
                  "durationSeconds": "The duration of time it will take to accrue the given amount of interest, in seconds."
                }
              },
              "initialize(address,address[],uint256)": {
                "params": {
                  "_controlledTokens": "Array of ControlledTokens that are controlled by this Prize Pool.",
                  "_maxExitFeeMantissa": "The maximum exit fee size"
                }
              },
              "initialize(address,address[],uint256,address)": {
                "params": {
                  "_controlledTokens": "Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool",
                  "_maxExitFeeMantissa": "The maximum exit fee size, relative to the withdrawal amount",
                  "_stakeToken": "Address of the stake token"
                }
              },
              "isControlled(address)": {
                "details": "Checks if a specific token is controlled by the Prize Pool",
                "params": {
                  "controlledToken": "The address of the token to check"
                },
                "returns": {
                  "_0": "True if the token is a controlled token, false otherwise"
                }
              },
              "onERC721Received(address,address,uint256,bytes)": {
                "params": {
                  "data": "Additional data with no specified format, sent in call to `_to`.",
                  "from": "The current owner of the NFT",
                  "operator": "The address that acts on behalf of the owner",
                  "tokenId": "The NFT to transfer"
                }
              },
              "owner()": {
                "details": "Returns the address of the current owner."
              },
              "renounceOwnership()": {
                "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
              },
              "setCreditPlanOf(address,uint128,uint128)": {
                "params": {
                  "_controlledToken": "The controlled token for whom to set the credit plan",
                  "_creditLimitMantissa": "The credit limit to set.  Is a fixed point 18 decimal (like Ether).",
                  "_creditRateMantissa": "The credit rate to set.  Is a fixed point 18 decimal (like Ether)."
                }
              },
              "setLiquidityCap(uint256)": {
                "params": {
                  "_liquidityCap": "The new liquidity cap for the prize pool"
                }
              },
              "setPrizeStrategy(address)": {
                "params": {
                  "_prizeStrategy": "The new prize strategy"
                }
              },
              "token()": {
                "details": "Returns the address of the underlying ERC20 asset",
                "returns": {
                  "_0": "The address of the asset"
                }
              },
              "tokens()": {
                "returns": {
                  "_0": "An array of controlled token addresses"
                }
              },
              "transferExternalERC20(address,address,uint256)": {
                "details": "Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.",
                "params": {
                  "amount": "The amount of external assets to be awarded",
                  "externalToken": "The address of the external asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "transferOwnership(address)": {
                "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
              },
              "withdrawInstantlyFrom(address,uint256,address,uint256)": {
                "params": {
                  "amount": "The amount of tokens to redeem for assets.",
                  "controlledToken": "The address of the token to redeem (i.e. ticket or sponsorship)",
                  "from": "The address to redeem tokens from.",
                  "maximumExitFee": "The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn."
                },
                "returns": {
                  "_0": "The actual exit fee paid"
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506140a9806100206000396000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c8063888c2b6f11610146578063b69ef8a8116100c3578063e323f82511610087578063e323f82514610992578063e6d8a94b146109ce578063edb4e1cf146109d6578063f2fde38b146109de578063fc0c546a14610a04578063ffa1ad7414610a0c57610253565b8063b69ef8a814610851578063c587148514610859578063d18e81b314610918578063d4a1361d14610920578063db006a751461097557610253565b80639d63848a1161010a5780639d63848a1461075d5780639e167519146107b55780639fe32a91146107bd578063a016240b146107da578063a7b2cc311461081457610253565b8063888c2b6f146106b45780638da5cb5b146107035780638e71c1f61461072757806391ca480e1461072f57806398bf3eb61461075557610253565b806352a387ab116101d457806376687d3d1161019857806376687d3d1461060157806378b3d3271461060957806379cb85631461062f5780637b99adb1146106615780637cbab1c71461067e57610253565b806352a387ab1461055b578063630665b4146105815780636a3fd4f9146105895780636b1b863a146105c3578063715018a6146105f957610253565b80632b0ab1441161021b5780632b0ab144146103f95780632f7627e31461042f578063354030231461045d5780633ede50c61461047a578063494de9f71461052d57610253565b80630937eb541461025857806313f55e3914610272578063150b7a02146102aa57806316960d551461035557806322f8e566146103dc575b600080fd5b610260610a89565b60408051918252519081900360200190f35b6102a86004803603606081101561028857600080fd5b506001600160a01b03813581169160208101359091169060400135610a98565b005b610338600480360360808110156102c057600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156102fa57600080fd5b82018360208201111561030c57600080fd5b803590602001918460018302840111600160201b8311171561032d57600080fd5b509092509050610b56565b604080516001600160e01b03199092168252519081900360200190f35b6102a86004803603606081101561036b57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561039e57600080fd5b8201836020820111156103b057600080fd5b803590602001918460208302840111600160201b831117156103d157600080fd5b509092509050610b67565b6102a8600480360360208110156103f257600080fd5b5035610e14565b6102a86004803603606081101561040f57600080fd5b506001600160a01b03813581169160208101359091169060400135610e19565b6102a86004803603604081101561044557600080fd5b506001600160a01b0381358116916020013516610ed6565b6102a86004803603602081101561047357600080fd5b5035611025565b6102a86004803603606081101561049057600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156104ba57600080fd5b8201836020820111156104cc57600080fd5b803590602001918460208302840111600160201b831117156104ed57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611028915050565b6102606004803603604081101561054357600080fd5b506001600160a01b038135811691602001351661121a565b6102606004803603602081101561057157600080fd5b50356001600160a01b0316611321565b610260611470565b6105af6004803603602081101561059f57600080fd5b50356001600160a01b0316611476565b604080519115158252519081900360200190f35b6102a8600480360360608110156105d957600080fd5b506001600160a01b03813581169160208101359160409091013516611489565b6102a8611691565b61026061173d565b6105af6004803603602081101561061f57600080fd5b50356001600160a01b0316611743565b6102606004803603606081101561064557600080fd5b506001600160a01b03813516906020810135906040013561174e565b6102a86004803603602081101561067757600080fd5b5035611763565b6102a86004803603606081101561069457600080fd5b506001600160a01b038135811691602081013590911690604001356117ce565b6106ea600480360360608110156106ca57600080fd5b506001600160a01b03813581169160208101359091169060400135611a1a565b6040805192835260208301919091528051918290030190f35b61070b611a34565b604080516001600160a01b039092168252519081900360200190f35b61070b611a43565b6102a86004803603602081101561074557600080fd5b50356001600160a01b0316611a52565b61070b611abd565b610765611acc565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156107a1578181015183820152602001610789565b505050509050019250505060405180910390f35b610260611b2e565b610260600480360360208110156107d357600080fd5b5035611b34565b610260600480360360808110156107f057600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611c62565b6102a86004803603606081101561082a57600080fd5b506001600160a01b03813516906001600160801b0360208201358116916040013516611e99565b610260611fef565b6102a86004803603608081101561086f57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561089957600080fd5b8201836020820111156108ab57600080fd5b803590602001918460208302840111600160201b831117156108cc57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602001356001600160a01b0316611ff9565b61026061213c565b6109466004803603602081101561093657600080fd5b50356001600160a01b0316612142565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b6102606004803603602081101561098b57600080fd5b5035612172565b6102a8600480360360808110156109a857600080fd5b506001600160a01b03813581169160208101359160408201358116916060013516612175565b61026061232a565b6102606124a0565b6102a8600480360360208110156109f457600080fd5b50356001600160a01b03166124a6565b61070b6125a9565b610a146125b3565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610a4e578181015183820152602001610a36565b50505050905090810190601f168015610a7b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610a936125d4565b905090565b6099546001600160a01b0316610aac6126df565b6001600160a01b031614610af5576040805162461bcd60e51b815260206004820152601c6024820152600080516020614054833981519152604482015290519081900360640190fd5b610b008383836126e3565b15610b5157816001600160a01b0316836001600160a01b03167fb0bac59718cd343c80a813518afcf36846cfcfe6d56e2b3cab9bd49f5f9b251c836040518082815260200191505060405180910390a35b505050565b630a85bd0160e11b95945050505050565b6099546001600160a01b0316610b7b6126df565b6001600160a01b031614610bc4576040805162461bcd60e51b815260206004820152601c6024820152600080516020614054833981519152604482015290519081900360640190fd5b610bcd8361276b565b610c1e576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b80610c2857610e0e565b60005b81811015610d9557836001600160a01b03166342842e0e3087868686818110610c5057fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610cad57600080fd5b505af1925050508015610cbe575060015b610d8d573d808015610cec576040519150601f19603f3d011682016040523d82523d6000602084013e610cf1565b606091505b507f17e975018310f88872b58d4d8263adca83cf5c1893496ea2a86923dab15276ad816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d51578181015183820152602001610d39565b50505050905090810190601f168015610d7e5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1505b600101610c2b565b50826001600160a01b0316846001600160a01b03167f69c2de32bc4d47f488e72626a6cfdee85089342e52675e7de79c4b417623960c848460405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a35b50505050565b60a155565b6099546001600160a01b0316610e2d6126df565b6001600160a01b031614610e76576040805162461bcd60e51b815260206004820152601c6024820152600080516020614054833981519152604482015290519081900360640190fd5b610e818383836126e3565b15610b5157816001600160a01b0316836001600160a01b03167fc65f48aca3b7a99b7443d04b8ffbb073156179bc628dc3f7def5047748973469836040518082815260200191505060405180910390a3505050565b610ede6126df565b6001600160a01b0316610eef611a34565b6001600160a01b031614610f38576040805162461bcd60e51b81526020600482018190526024820152600080516020613f72833981519152604482015290519081900360640190fd5b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f8757600080fd5b505afa158015610f9b573d6000803e3d6000fd5b505050506040513d6020811015610fb157600080fd5b5051111561102157816001600160a01b0316635c19a95c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561100857600080fd5b505af115801561101c573d6000803e3d6000fd5b505050505b5050565b50565b600054610100900460ff16806110415750611041612780565b8061104f575060005460ff16155b61108a5760405162461bcd60e51b815260040180806020018281038252602e815260200180613f23602e913960400191505060405180910390fd5b600054610100900460ff161580156110b5576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0384166110fa5760405162461bcd60e51b8152600401808060200182810382526022815260200180613edb6022913960400191505060405180910390fd5b82518067ffffffffffffffff8111801561111357600080fd5b5060405190808252806020026020018201604052801561113d578160200160208202803683370190505b50805161115291609891602090910190613e12565b5060005b8181101561118957600085828151811061116c57fe5b602002602001015190506111808183612791565b50600101611156565b506111926128bc565b61119a61296d565b6111a5600019612a02565b609780546001600160a01b0319166001600160a01b038716908117909155609a849055604080519182526020820185905280517f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce799281900390910190a1508015610e0e576000805461ff001916905550505050565b60008161122681612a3d565b611265576040805162461bcd60e51b81526020600482015260176024820152600080516020613fb9833981519152604482015290519081900360640190fd5b6112ea8484856001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112b757600080fd5b505afa1580156112cb573d6000803e3d6000fd5b505050506040513d60208110156112e157600080fd5b50516000612af9565b50506001600160a01b039081166000908152609f60209081526040808320949093168252929092529020546001600160c01b031690565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561137257600080fd5b505afa158015611386573d6000803e3d6000fd5b505050506040513d602081101561139c57600080fd5b505190506001600160a01b03811633146113f6576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f6f6e6c792d7265736572766560501b604482015290519081900360640190fd5b609b80546000918290559061140a82612172565b90506114298582611419612b0f565b6001600160a01b03169190612b1e565b6040805183815290516001600160a01b038716917f1c71c8e11fd443227c8f8d3dc1a237a3a5e8310b540c7fbcf5169754aedf42c9919081900360200190a2949350505050565b609d5490565b60006114818261276b565b90505b919050565b6099546001600160a01b031661149d6126df565b6001600160a01b0316146114e6576040805162461bcd60e51b815260206004820152601c6024820152600080516020614054833981519152604482015290519081900360640190fd5b806114f081612a3d565b61152f576040805162461bcd60e51b81526020600482015260176024820152600080516020613fb9833981519152604482015290519081900360640190fd5b8261153957610e0e565b609d54831115611590576040805162461bcd60e51b815260206004820152601d60248201527f5072697a65506f6f6c2f61776172642d657863656564732d617661696c000000604482015290519081900360640190fd5b609d5461159d9084612b70565b609d556115ad8484846000612bd2565b60006115b98385612cb8565b905061163f8584856001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561160d57600080fd5b505afa158015611621573d6000803e3d6000fd5b505050506040513d602081101561163757600080fd5b505184612af9565b826001600160a01b0316856001600160a01b03167fe2554529d99ab7a67db6b4cea2b32c7d55ae325f958861e05f304fdded867e31866040518082815260200191505060405180910390a35050505050565b6116996126df565b6001600160a01b03166116aa611a34565b6001600160a01b0316146116f3576040805162461bcd60e51b81526020600482018190526024820152600080516020613f72833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b609c5481565b600061148182612a3d565b600061175b848484612cf0565b949350505050565b61176b6126df565b6001600160a01b031661177c611a34565b6001600160a01b0316146117c5576040805162461bcd60e51b81526020600482018190526024820152600080516020613f72833981519152604482015290519081900360640190fd5b61102581612a02565b336117d881612a3d565b611817576040805162461bcd60e51b81526020600482015260176024820152600080516020613fb9833981519152604482015290519081900360640190fd5b6001600160a01b038416156118f1576000336001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561187557600080fd5b505afa158015611889573d6000803e3d6000fd5b505050506040513d602081101561189f57600080fd5b5051905060006118b186338484612d4a565b9050846001600160a01b0316866001600160a01b0316146118e3576118e0336118da8487612b70565b83612dd9565b90505b6118ee863383612e1f565b50505b6001600160a01b0383161580159061191b5750836001600160a01b0316836001600160a01b031614155b15611972576119728333336001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112b757600080fd5b6001600160a01b0384161580159061199457506099546001600160a01b031615155b15610e0e576099546040805163b221095760e01b81526001600160a01b0387811660048301528681166024830152604482018690523360648301529151919092169163b221095791608480830192600092919082900301818387803b1580156119fc57600080fd5b505af1158015611a10573d6000803e3d6000fd5b5050505050505050565b600080611a28858585612fbd565b90969095509350505050565b6033546001600160a01b031690565b6097546001600160a01b031681565b611a5a6126df565b6001600160a01b0316611a6b611a34565b6001600160a01b031614611ab4576040805162461bcd60e51b81526020600482018190526024820152600080516020613f72833981519152604482015290519081900360640190fd5b6110258161315b565b6099546001600160a01b031681565b60606098805480602002602001604051908101604052809291908181526020018280548015611b2457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b06575b5050505050905090565b609a5481565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b8557600080fd5b505afa158015611b99573d6000803e3d6000fd5b505050506040513d6020811015611baf57600080fd5b505190506001600160a01b038116611bcb576000915050611484565b6000816001600160a01b031663010dfa58306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611c1a57600080fd5b505afa158015611c2e573d6000803e3d6000fd5b505050506040513d6020811015611c4457600080fd5b5051905080611c5857600092505050611484565b61175b848261326e565b600060026065541415611cbc576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655582611ccb81612a3d565b611d0a576040805162461bcd60e51b81526020600482015260176024820152600080516020613fb9833981519152604482015290519081900360640190fd5b600080611d18888789612fbd565b9150915084821115611d5b5760405162461bcd60e51b8152600401808060200182810382526027815260200180613f926027913960400191505060405180910390fd5b611d6688878361328f565b856001600160a01b031663631b5dfb611d7d6126df565b8a8a6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611dd557600080fd5b505af1158015611de9573d6000803e3d6000fd5b505050506000611e028389612b7090919063ffffffff16565b90506000611e0f82612172565b9050611e1e8a82611419612b0f565b876001600160a01b03168a6001600160a01b0316611e3a6126df565b604080518d81526020810186905280820189905290516001600160a01b0392909216917f0271704a58fd2953e49b87d67a0a3ce28a58147de98a5457f60b4686f63850309181900360600190a450506001606555509695505050505050565b82611ea381612a3d565b611ee2576040805162461bcd60e51b81526020600482015260176024820152600080516020613fb9833981519152604482015290519081900360640190fd5b611eea6126df565b6001600160a01b0316611efb611a34565b6001600160a01b031614611f44576040805162461bcd60e51b81526020600482018190526024820152600080516020613f72833981519152604482015290519081900360640190fd5b6040805180820182526001600160801b0380851680835286821660208085018281526001600160a01b038b166000818152609e84528890209651875492518716600160801b029087166fffffffffffffffffffffffffffffffff1990931692909217909516179094558451928352928201528083019190915290517ffb0ba2cf86a2b03bcf387753a2192da80a006afa99dd022bb301c78e323bf1b99181900360600190a150505050565b6000610a93613350565b600054610100900460ff16806120125750612012612780565b80612020575060005460ff16155b61205b5760405162461bcd60e51b815260040180806020018281038252602e815260200180613f23602e913960400191505060405180910390fd5b600054610100900460ff16158015612086576000805460ff1961ff0019909116610100171660011790555b612091858585611028565b6001600160a01b0382166120d65760405162461bcd60e51b815260040180806020018281038252602b815260200180614029602b913960400191505060405180910390fd5b60a080546001600160a01b0319166001600160a01b0384811691909117918290556040519116907fa81053747b04e643171034e5426f6deebb058fc29dfe032e33345a109224b31b90600090a28015612135576000805461ff00191690555b5050505050565b60a15481565b6001600160a01b03166000908152609e60205260409020546001600160801b0380821692600160801b9092041690565b90565b600260655414156121cd576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002606555816121dc81612a3d565b61221b576040805162461bcd60e51b81526020600482015260176024820152600080516020613fb9833981519152604482015290519081900360640190fd5b83612225816133cc565b612276576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f657863656564732d6c69717569646974792d63617000604482015290519081900360640190fd5b60006122806126df565b905061228e87878787612bd2565b6122ad81308861229c612b0f565b6001600160a01b03169291906133f0565b6122b686611025565b846001600160a01b0316876001600160a01b0316826001600160a01b03167f6ce569498e0f86f147466ac49211cb2a1ffe06195adb805e383b3f2365109160898860405180838152602001826001600160a01b031681526020019250505060405180910390a4505060016065555050505050565b600060026065541415612384576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655560006123936125d4565b9050600061239f613350565b905060008282116123b15760006123bb565b6123bb8284612b70565b90506000609d5482116123cf5760006123dd565b609d546123dd908390612b70565b9050801561248f5760006123f082611b34565b9050801561244a57609b54612405908261344a565b609b556124128282612b70565b6040805183815290519193507f5f1703ccfa2730d4245350f228079926a37f26a44ecf6978a7eeafff0af11407919081900360200190a15b609d54612457908361344a565b609d556040805183815290517fce2b6e507c7ca1a20ce136810f524eefc19ba4c7e4866eb6cc0cba76e778d4be9181900360200190a1505b609d54945050505050600160655590565b609b5481565b6124ae6126df565b6001600160a01b03166124bf611a34565b6001600160a01b031614612508576040805162461bcd60e51b81526020600482018190526024820152600080516020613f72833981519152604482015290519081900360640190fd5b6001600160a01b03811661254d5760405162461bcd60e51b8152600401808060200182810382526026815260200180613e8e6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610a93612b0f565b60405180604001604052806005815260200164332e342e3560d81b81525081565b600080609b5490506060609880548060200260200160405190810160405280929190818152602001828054801561263457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612616575b505083519394506000925050505b818110156126d6576126cc83828151811061265957fe5b60200260200101516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561269957600080fd5b505afa1580156126ad573d6000803e3d6000fd5b505050506040513d60208110156126c357600080fd5b5051859061344a565b9350600101612642565b50919250505090565b3390565b60006126ee8361276b565b61273f576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b8161274c57506000612764565b6127606001600160a01b0384168584612b1e565b5060015b9392505050565b60a0546001600160a01b039182169116141590565b600061278b306134a4565b15905090565b306001600160a01b0316826001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b1580156127d457600080fd5b505afa1580156127e8573d6000803e3d6000fd5b505050506040513d60208110156127fe57600080fd5b50516001600160a01b03161461285b576040805162461bcd60e51b815260206004820152601e60248201527f5072697a65506f6f6c2f746f6b656e2d6374726c722d6d69736d617463680000604482015290519081900360640190fd5b816098828154811061286957fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051918416917f460e712b4a5d801d031ed673dea209b73ab854f7ddeb86b6c48082e92c3eee669190a25050565b600054610100900460ff16806128d557506128d5612780565b806128e3575060005460ff16155b61291e5760405162461bcd60e51b815260040180806020018281038252602e815260200180613f23602e913960400191505060405180910390fd5b600054610100900460ff16158015612949576000805460ff1961ff0019909116610100171660011790555b6129516134aa565b61295961354a565b8015611025576000805461ff001916905550565b600054610100900460ff16806129865750612986612780565b80612994575060005460ff16155b6129cf5760405162461bcd60e51b815260040180806020018281038252602e815260200180613f23602e913960400191505060405180910390fd5b600054610100900460ff161580156129fa576000805460ff1961ff0019909116610100171660011790555b612959613643565b609c8190556040805182815290517f3ff20538222f568f27ff436c0c49dfd3e48d5b8f86533a3f759dc1c7089775ab9181900360200190a150565b600060606098805480602002602001604051908101604052809291908181526020018280548015612a9757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612a79575b505083519394506000925050505b81811015612aee57846001600160a01b0316838281518110612ac357fe5b60200260200101516001600160a01b03161415612ae65760019350505050611484565b600101612aa5565b506000949350505050565b610e0e8484612b0a87878787612d4a565b612e1f565b60a0546001600160a01b031690565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610b519084906136e9565b600082821115612bc7576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6099546001600160a01b031615612c6157609954604080516304d7f3db60e41b81526001600160a01b038781166004830152602482018790528581166044830152848116606483015291519190921691634d7f3db091608480830192600092919082900301818387803b158015612c4857600080fd5b505af1158015612c5c573d6000803e3d6000fd5b505050505b816001600160a01b0316635d7b075885856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156119fc57600080fd5b6001600160a01b0382166000908152609e6020526040812054612764908390612ceb9082906001600160801b031661326e565b61379a565b6001600160a01b0383166000908152609e60205260408120548190612d26908590600160801b90046001600160801b031661326e565b905080612d37576000915050612764565b612d4183826137bf565b95945050505050565b6001600160a01b038381166000908152609f6020908152604080832093881683529290529081208054829190600160e01b900460ff16612d8d5760009150612dcf565b6000612d9a888888613826565b8254909150612dcb9088908890612dc6908990612dc0906001600160c01b03168761344a565b9061344a565b612dd9565b9250505b5095945050505050565b6001600160a01b0383166000908152609e60205260408120548190612e089085906001600160801b031661326e565b905080831115612e16578092505b50909392505050565b6001600160a01b038083166000908152609f602090815260408083209387168352929052819020548151606081019092526001600160c01b03169080612e64846138d7565b6001600160801b03168152602001612e82612e7d61391f565b613925565b63ffffffff908116825260016020928301526001600160a01b038681166000908152609f84526040808220928a168252918452819020845181549486015195909201516001600160c01b03199094166001600160c01b039092169190911763ffffffff60c01b1916600160c01b94909216939093021760ff60e01b1916600160e01b9115159190910217905581811015612f65576001600160a01b038084169085167f2f92d56910619b38bc29fd8e4ca5e56359edac7a0c086cdcd305fb603fa37491612f4f8585612b70565b60408051918252519081900360200190a3610e0e565b80821015610e0e576001600160a01b038084169085167ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf612fa68486612b70565b60408051918252519081900360200190a350505050565b6000806000846001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561300f57600080fd5b505afa158015613023573d6000803e3d6000fd5b505050506040513d602081101561303957600080fd5b505190508381101561308b576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f696e737566662d66756e647360501b604482015290519081900360640190fd5b6130988686836000612af9565b60006130ad866130a88488612b70565b612cb8565b6001600160a01b038088166000908152609f60209081526040808320938c16835292905290812054919250906001600160c01b03168211613124576001600160a01b038088166000908152609f60209081526040808320938c1683529290522054613121906001600160c01b031683612b70565b90505b60006131308888612cb8565b905080821161313f5781613141565b805b945061314d8186612b70565b955050505050935093915050565b6001600160a01b0381166131b6576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f7072697a6553747261746567792d6e6f742d7a65726f604482015290519081900360640190fd5b6131d36001600160a01b038216600162a1cb1960e01b0319613969565b613224576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f7072697a6553747261746567792d696e76616c696400604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0383169081179091556040517f7f58dc86bc2e435cb77ca0edb1df55e25f90caf2d6bd866971715437d456a21290600090a250565b60008061327b8385613985565b905061175b81670de0b6b3a76400006139de565b6001600160a01b038083166000908152609f60209081526040808320938716835292905220546132d1906132cc906001600160c01b031683612b70565b6138d7565b6001600160a01b038084166000818152609f602090815260408083209489168084529482529182902080546001600160c01b0319166001600160801b0396909616959095179094558051858152905191937ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf92918290030190a3505050565b60a054604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561339b57600080fd5b505afa1580156133af573d6000803e3d6000fd5b505050506040513d60208110156133c557600080fd5b5051905090565b6000806133d76125d4565b609c549091506133e7828561344a565b11159392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610e0e9085906136e9565b600082820183811015612764576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3b151590565b600054610100900460ff16806134c357506134c3612780565b806134d1575060005460ff16155b61350c5760405162461bcd60e51b815260040180806020018281038252602e815260200180613f23602e913960400191505060405180910390fd5b600054610100900460ff16158015612959576000805460ff1961ff0019909116610100171660011790558015611025576000805461ff001916905550565b600054610100900460ff16806135635750613563612780565b80613571575060005460ff16155b6135ac5760405162461bcd60e51b815260040180806020018281038252602e815260200180613f23602e913960400191505060405180910390fd5b600054610100900460ff161580156135d7576000805460ff1961ff0019909116610100171660011790555b60006135e16126df565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015611025576000805461ff001916905550565b600054610100900460ff168061365c575061365c612780565b8061366a575060005460ff16155b6136a55760405162461bcd60e51b815260040180806020018281038252602e815260200180613f23602e913960400191505060405180910390fd5b600054610100900460ff161580156136d0576000805460ff1961ff0019909116610100171660011790555b60016065558015611025576000805461ff001916905550565b606061373e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a209092919063ffffffff16565b805190915015610b515780806020019051602081101561375d57600080fd5b5051610b515760405162461bcd60e51b815260040180806020018281038252602a815260200180613fff602a913960400191505060405180910390fd5b6000806137a984609a5461326e565b9050808311156137b7578092505b509092915050565b6000808211613815576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161381e57fe5b049392505050565b6001600160a01b038281166000908152609f60209081526040808320938716835292905290812054600160c01b810463ffffffff1690600160e01b900460ff16613874576000915050612764565b60006138888261388261391f565b90612b70565b6001600160a01b0386166000908152609e6020526040812054919250906138c0908390600160801b90046001600160801b0316613985565b90506138cc858261326e565b979650505050505050565b6000600160801b821061391b5760405162461bcd60e51b8152600401808060200182810382526027815260200180613eb46027913960400191505060405180910390fd5b5090565b60a15490565b6000600160201b821061391b5760405162461bcd60e51b8152600401808060200182810382526026815260200180613fd96026913960400191505060405180910390fd5b600061397483613a2f565b801561276457506127648383613a62565b60008261399457506000612bcc565b828202828482816139a157fe5b04146127645760405162461bcd60e51b8152600401808060200182810382526021815260200180613f516021913960400191505060405180910390fd5b600061276483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613a85565b606061175b8484600085613b27565b6000613a42826301ffc9a760e01b613a62565b80156114815750613a5b826001600160e01b0319613a62565b1592915050565b6000806000613a718585613c78565b91509150818015612d415750949350505050565b60008183613b115760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ad6578181015183820152602001613abe565b50505050905090810190601f168015613b035780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613b1d57fe5b0495945050505050565b606082471015613b685760405162461bcd60e51b8152600401808060200182810382526026815260200180613efd6026913960400191505060405180910390fd5b613b71856134a4565b613bc2576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613c015780518252601f199092019160209182019101613be2565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613c63576040519150601f19603f3d011682016040523d82523d6000602084013e613c68565b606091505b50915091506138cc828286613dac565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b1781529151815160009384939284926060926001600160a01b038a169261753092879282918083835b60208310613d005780518252601f199092019160209182019101613ce1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114613d61576040519150601f19603f3d011682016040523d82523d6000602084013e613d66565b606091505b5091509150602081511015613d845760008094509450505050613da5565b81818060200190516020811015613d9a57600080fd5b505190955093505050505b9250929050565b60608315613dbb575081612764565b825115613dcb5782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315613ad6578181015183820152602001613abe565b828054828255906000526020600020908101928215613e67579160200282015b82811115613e6757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613e32565b5061391b9291505b8082111561391b5780546001600160a01b0319168155600101613e6f56fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e2031323820626974735072697a65506f6f6c2f7265736572766552656769737472792d6e6f742d7a65726f416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725072697a65506f6f6c2f657869742d6665652d657863656564732d757365722d6d6178696d756d5072697a65506f6f6c2f756e6b6e6f776e2d746f6b656e00000000000000000053616665436173743a2076616c756520646f65736e27742066697420696e20333220626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645374616b655072697a65506f6f6c2f7374616b652d746f6b656e2d6e6f742d7a65726f2d616464726573735072697a65506f6f6c2f6f6e6c792d7072697a65537472617465677900000000a2646970667358221220796a5105f0457d2d4f8ff8fd9911a364faaee0cfdae58ec57971f0823778de4964736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x40A9 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x253 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x888C2B6F GT PUSH2 0x146 JUMPI DUP1 PUSH4 0xB69EF8A8 GT PUSH2 0xC3 JUMPI DUP1 PUSH4 0xE323F825 GT PUSH2 0x87 JUMPI DUP1 PUSH4 0xE323F825 EQ PUSH2 0x992 JUMPI DUP1 PUSH4 0xE6D8A94B EQ PUSH2 0x9CE JUMPI DUP1 PUSH4 0xEDB4E1CF EQ PUSH2 0x9D6 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x9DE JUMPI DUP1 PUSH4 0xFC0C546A EQ PUSH2 0xA04 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0xA0C JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0xB69EF8A8 EQ PUSH2 0x851 JUMPI DUP1 PUSH4 0xC5871485 EQ PUSH2 0x859 JUMPI DUP1 PUSH4 0xD18E81B3 EQ PUSH2 0x918 JUMPI DUP1 PUSH4 0xD4A1361D EQ PUSH2 0x920 JUMPI DUP1 PUSH4 0xDB006A75 EQ PUSH2 0x975 JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x9D63848A GT PUSH2 0x10A JUMPI DUP1 PUSH4 0x9D63848A EQ PUSH2 0x75D JUMPI DUP1 PUSH4 0x9E167519 EQ PUSH2 0x7B5 JUMPI DUP1 PUSH4 0x9FE32A91 EQ PUSH2 0x7BD JUMPI DUP1 PUSH4 0xA016240B EQ PUSH2 0x7DA JUMPI DUP1 PUSH4 0xA7B2CC31 EQ PUSH2 0x814 JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x888C2B6F EQ PUSH2 0x6B4 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x703 JUMPI DUP1 PUSH4 0x8E71C1F6 EQ PUSH2 0x727 JUMPI DUP1 PUSH4 0x91CA480E EQ PUSH2 0x72F JUMPI DUP1 PUSH4 0x98BF3EB6 EQ PUSH2 0x755 JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x52A387AB GT PUSH2 0x1D4 JUMPI DUP1 PUSH4 0x76687D3D GT PUSH2 0x198 JUMPI DUP1 PUSH4 0x76687D3D EQ PUSH2 0x601 JUMPI DUP1 PUSH4 0x78B3D327 EQ PUSH2 0x609 JUMPI DUP1 PUSH4 0x79CB8563 EQ PUSH2 0x62F JUMPI DUP1 PUSH4 0x7B99ADB1 EQ PUSH2 0x661 JUMPI DUP1 PUSH4 0x7CBAB1C7 EQ PUSH2 0x67E JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x52A387AB EQ PUSH2 0x55B JUMPI DUP1 PUSH4 0x630665B4 EQ PUSH2 0x581 JUMPI DUP1 PUSH4 0x6A3FD4F9 EQ PUSH2 0x589 JUMPI DUP1 PUSH4 0x6B1B863A EQ PUSH2 0x5C3 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x5F9 JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x2B0AB144 GT PUSH2 0x21B JUMPI DUP1 PUSH4 0x2B0AB144 EQ PUSH2 0x3F9 JUMPI DUP1 PUSH4 0x2F7627E3 EQ PUSH2 0x42F JUMPI DUP1 PUSH4 0x35403023 EQ PUSH2 0x45D JUMPI DUP1 PUSH4 0x3EDE50C6 EQ PUSH2 0x47A JUMPI DUP1 PUSH4 0x494DE9F7 EQ PUSH2 0x52D JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x937EB54 EQ PUSH2 0x258 JUMPI DUP1 PUSH4 0x13F55E39 EQ PUSH2 0x272 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x2AA JUMPI DUP1 PUSH4 0x16960D55 EQ PUSH2 0x355 JUMPI DUP1 PUSH4 0x22F8E566 EQ PUSH2 0x3DC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x260 PUSH2 0xA89 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x288 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xA98 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x338 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x2C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x2FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x30C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x32D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xB56 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x36B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x39E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x3B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x3D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xB67 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xE14 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x40F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xE19 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x445 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xED6 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x473 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1025 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x490 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x4BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x4CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x4ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0x1028 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x543 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x121A JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x571 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1321 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x1470 JUMP JUMPDEST PUSH2 0x5AF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x59F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1476 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x5D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 SWAP1 SWAP2 ADD CALLDATALOAD AND PUSH2 0x1489 JUMP JUMPDEST PUSH2 0x2A8 PUSH2 0x1691 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x173D JUMP JUMPDEST PUSH2 0x5AF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x61F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1743 JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x645 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x174E JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x677 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1763 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x694 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x17CE JUMP JUMPDEST PUSH2 0x6EA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x6CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1A1A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB ADD SWAP1 RETURN JUMPDEST PUSH2 0x70B PUSH2 0x1A34 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x70B PUSH2 0x1A43 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x745 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A52 JUMP JUMPDEST PUSH2 0x70B PUSH2 0x1ABD JUMP JUMPDEST PUSH2 0x765 PUSH2 0x1ACC JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x7A1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x789 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x260 PUSH2 0x1B2E JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x7D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1B34 JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x7F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x1C62 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x82A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x40 ADD CALLDATALOAD AND PUSH2 0x1E99 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x1FEF JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x86F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x899 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x8AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x8CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1FF9 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x213C JUMP JUMPDEST PUSH2 0x946 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x936 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2142 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x98B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x2172 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x9A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x2175 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x232A JUMP JUMPDEST PUSH2 0x260 PUSH2 0x24A0 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x9F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x24A6 JUMP JUMPDEST PUSH2 0x70B PUSH2 0x25A9 JUMP JUMPDEST PUSH2 0xA14 PUSH2 0x25B3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xA4E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xA36 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xA7B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xA93 PUSH2 0x25D4 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xAAC PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xAF5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4054 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xB00 DUP4 DUP4 DUP4 PUSH2 0x26E3 JUMP JUMPDEST ISZERO PUSH2 0xB51 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB0BAC59718CD343C80A813518AFCF36846CFCFE6D56E2B3CAB9BD49F5F9B251C DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0xA85BD01 PUSH1 0xE1 SHL SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xB7B PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xBC4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4054 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xBCD DUP4 PUSH2 0x276B JUMP JUMPDEST PUSH2 0xC1E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0xC28 JUMPI PUSH2 0xE0E JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xD95 JUMPI DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x42842E0E ADDRESS DUP8 DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0xC50 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0xCBE JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xD8D JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0xCEC JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xCF1 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH32 0x17E975018310F88872B58D4D8263ADCA83CF5C1893496EA2A86923DAB15276AD DUP2 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD51 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD39 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD7E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xC2B JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x69C2DE32BC4D47F488E72626A6CFDEE85089342E52675E7DE79C4B417623960C DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP6 POP SWAP1 SWAP4 POP POP POP POP LOG3 JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0xA1 SSTORE JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE2D PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xE76 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4054 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xE81 DUP4 DUP4 DUP4 PUSH2 0x26E3 JUMP JUMPDEST ISZERO PUSH2 0xB51 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC65F48ACA3B7A99B7443D04B8FFBB073156179BC628DC3F7DEF5047748973469 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH2 0xEDE PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xEEF PUSH2 0x1A34 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xF38 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F72 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF87 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xF9B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xFB1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD GT ISZERO PUSH2 0x1021 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5C19A95C DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1008 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x101C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1041 JUMPI POP PUSH2 0x1041 PUSH2 0x2780 JUMP JUMPDEST DUP1 PUSH2 0x104F JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x108A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F23 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x10B5 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x10FA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3EDB PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 MLOAD DUP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x1113 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x113D JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP1 MLOAD PUSH2 0x1152 SWAP2 PUSH1 0x98 SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x3E12 JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1189 JUMPI PUSH1 0x0 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x116C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0x1180 DUP2 DUP4 PUSH2 0x2791 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x1156 JUMP JUMPDEST POP PUSH2 0x1192 PUSH2 0x28BC JUMP JUMPDEST PUSH2 0x119A PUSH2 0x296D JUMP JUMPDEST PUSH2 0x11A5 PUSH1 0x0 NOT PUSH2 0x2A02 JUMP JUMPDEST PUSH1 0x97 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x9A DUP5 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP6 SWAP1 MSTORE DUP1 MLOAD PUSH32 0x25FF68DD81B34665B5BA7E553EE5511BF6812E12ADB4A7E2C0D9E26B3099CE79 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 POP DUP1 ISZERO PUSH2 0xE0E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x1226 DUP2 PUSH2 0x2A3D JUMP JUMPDEST PUSH2 0x1265 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FB9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x12EA DUP5 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x12CB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x12E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 PUSH2 0x2AF9 JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP4 AND DUP3 MSTORE SWAP3 SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1386 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x139C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ PUSH2 0x13F6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F6F6E6C792D72657365727665 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9B DUP1 SLOAD PUSH1 0x0 SWAP2 DUP3 SWAP1 SSTORE SWAP1 PUSH2 0x140A DUP3 PUSH2 0x2172 JUMP JUMPDEST SWAP1 POP PUSH2 0x1429 DUP6 DUP3 PUSH2 0x1419 PUSH2 0x2B0F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x2B1E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP2 PUSH32 0x1C71C8E11FD443227C8F8D3DC1A237A3A5E8310B540C7FBCF5169754AEDF42C9 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x9D SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1481 DUP3 PUSH2 0x276B JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x149D PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x14E6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4054 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x14F0 DUP2 PUSH2 0x2A3D JUMP JUMPDEST PUSH2 0x152F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FB9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 PUSH2 0x1539 JUMPI PUSH2 0xE0E JUMP JUMPDEST PUSH1 0x9D SLOAD DUP4 GT ISZERO PUSH2 0x1590 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F61776172642D657863656564732D617661696C000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x159D SWAP1 DUP5 PUSH2 0x2B70 JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH2 0x15AD DUP5 DUP5 DUP5 PUSH1 0x0 PUSH2 0x2BD2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15B9 DUP4 DUP6 PUSH2 0x2CB8 JUMP JUMPDEST SWAP1 POP PUSH2 0x163F DUP6 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x160D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1621 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1637 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP5 PUSH2 0x2AF9 JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xE2554529D99AB7A67DB6B4CEA2B32C7D55AE325F958861E05F304FDDED867E31 DUP7 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1699 PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16AA PUSH2 0x1A34 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x16F3 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F72 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1481 DUP3 PUSH2 0x2A3D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x175B DUP5 DUP5 DUP5 PUSH2 0x2CF0 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x176B PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x177C PUSH2 0x1A34 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x17C5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F72 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1025 DUP2 PUSH2 0x2A02 JUMP JUMPDEST CALLER PUSH2 0x17D8 DUP2 PUSH2 0x2A3D JUMP JUMPDEST PUSH2 0x1817 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FB9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO PUSH2 0x18F1 JUMPI PUSH1 0x0 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP7 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1875 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1889 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x189F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x18B1 DUP7 CALLER DUP5 DUP5 PUSH2 0x2D4A JUMP JUMPDEST SWAP1 POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x18E3 JUMPI PUSH2 0x18E0 CALLER PUSH2 0x18DA DUP5 DUP8 PUSH2 0x2B70 JUMP JUMPDEST DUP4 PUSH2 0x2DD9 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x18EE DUP7 CALLER DUP4 PUSH2 0x2E1F JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x191B JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x1972 JUMPI PUSH2 0x1972 DUP4 CALLER CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1994 JUMPI POP PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xE0E JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP7 SWAP1 MSTORE CALLER PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xB2210957 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x19FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1A10 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1A28 DUP6 DUP6 DUP6 PUSH2 0x2FBD JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x97 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1A5A PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A6B PUSH2 0x1A34 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1AB4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F72 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1025 DUP2 PUSH2 0x315B JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1B24 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1B06 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1B85 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B99 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1BAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1BCB JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x1484 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x10DFA58 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C2E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1C44 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x1C58 JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x1484 JUMP JUMPDEST PUSH2 0x175B DUP5 DUP3 PUSH2 0x326E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x1CBC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP3 PUSH2 0x1CCB DUP2 PUSH2 0x2A3D JUMP JUMPDEST PUSH2 0x1D0A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FB9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1D18 DUP9 DUP8 DUP10 PUSH2 0x2FBD JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0x1D5B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F92 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1D66 DUP9 DUP8 DUP4 PUSH2 0x328F JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x631B5DFB PUSH2 0x1D7D PUSH2 0x26DF JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1DD5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1DE9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 PUSH2 0x1E02 DUP4 DUP10 PUSH2 0x2B70 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1E0F DUP3 PUSH2 0x2172 JUMP JUMPDEST SWAP1 POP PUSH2 0x1E1E DUP11 DUP3 PUSH2 0x1419 PUSH2 0x2B0F JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E3A PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP14 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE DUP1 DUP3 ADD DUP10 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x271704A58FD2953E49B87D67A0A3CE28A58147DE98A5457F60B4686F6385030 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH2 0x1EA3 DUP2 PUSH2 0x2A3D JUMP JUMPDEST PUSH2 0x1EE2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FB9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1EEA PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1EFB PUSH2 0x1A34 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1F44 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F72 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP6 AND DUP1 DUP4 MSTORE DUP7 DUP3 AND PUSH1 0x20 DUP1 DUP6 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9E DUP5 MSTORE DUP9 SWAP1 KECCAK256 SWAP7 MLOAD DUP8 SLOAD SWAP3 MLOAD DUP8 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP1 DUP8 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP6 AND OR SWAP1 SWAP5 SSTORE DUP5 MLOAD SWAP3 DUP4 MSTORE SWAP3 DUP3 ADD MSTORE DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 MLOAD PUSH32 0xFB0BA2CF86A2B03BCF387753A2192DA80A006AFA99DD022BB301C78E323BF1B9 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA93 PUSH2 0x3350 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2012 JUMPI POP PUSH2 0x2012 PUSH2 0x2780 JUMP JUMPDEST DUP1 PUSH2 0x2020 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x205B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F23 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2086 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2091 DUP6 DUP6 DUP6 PUSH2 0x1028 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x20D6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4029 PUSH1 0x2B SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xA0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 AND SWAP1 PUSH32 0xA81053747B04E643171034E5426F6DEEBB058FC29DFE032E33345A109224B31B SWAP1 PUSH1 0x0 SWAP1 LOG2 DUP1 ISZERO PUSH2 0x2135 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0xA1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP3 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x21CD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP2 PUSH2 0x21DC DUP2 PUSH2 0x2A3D JUMP JUMPDEST PUSH2 0x221B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FB9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP4 PUSH2 0x2225 DUP2 PUSH2 0x33CC JUMP JUMPDEST PUSH2 0x2276 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F657863656564732D6C69717569646974792D63617000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2280 PUSH2 0x26DF JUMP JUMPDEST SWAP1 POP PUSH2 0x228E DUP8 DUP8 DUP8 DUP8 PUSH2 0x2BD2 JUMP JUMPDEST PUSH2 0x22AD DUP2 ADDRESS DUP9 PUSH2 0x229C PUSH2 0x2B0F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 SWAP1 PUSH2 0x33F0 JUMP JUMPDEST PUSH2 0x22B6 DUP7 PUSH2 0x1025 JUMP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6CE569498E0F86F147466AC49211CB2A1FFE06195ADB805E383B3F2365109160 DUP10 DUP9 PUSH1 0x40 MLOAD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x2384 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE PUSH1 0x0 PUSH2 0x2393 PUSH2 0x25D4 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x239F PUSH2 0x3350 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 DUP3 GT PUSH2 0x23B1 JUMPI PUSH1 0x0 PUSH2 0x23BB JUMP JUMPDEST PUSH2 0x23BB DUP3 DUP5 PUSH2 0x2B70 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x9D SLOAD DUP3 GT PUSH2 0x23CF JUMPI PUSH1 0x0 PUSH2 0x23DD JUMP JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x23DD SWAP1 DUP4 SWAP1 PUSH2 0x2B70 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x248F JUMPI PUSH1 0x0 PUSH2 0x23F0 DUP3 PUSH2 0x1B34 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x244A JUMPI PUSH1 0x9B SLOAD PUSH2 0x2405 SWAP1 DUP3 PUSH2 0x344A JUMP JUMPDEST PUSH1 0x9B SSTORE PUSH2 0x2412 DUP3 DUP3 PUSH2 0x2B70 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 POP PUSH32 0x5F1703CCFA2730D4245350F228079926A37F26A44ECF6978A7EEAFFF0AF11407 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x2457 SWAP1 DUP4 PUSH2 0x344A JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xCE2B6E507C7CA1A20CE136810F524EEFC19BA4C7E4866EB6CC0CBA76E778D4BE SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH1 0x9D SLOAD SWAP5 POP POP POP POP POP PUSH1 0x1 PUSH1 0x65 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x9B SLOAD DUP2 JUMP JUMPDEST PUSH2 0x24AE PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x24BF PUSH2 0x1A34 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2508 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F72 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x254D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8E PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA93 PUSH2 0x2B0F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x9B SLOAD SWAP1 POP PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2634 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2616 JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x26D6 JUMPI PUSH2 0x26CC DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2659 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2699 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x26AD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x26C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP6 SWAP1 PUSH2 0x344A JUMP JUMPDEST SWAP4 POP PUSH1 0x1 ADD PUSH2 0x2642 JUMP JUMPDEST POP SWAP2 SWAP3 POP POP POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x26EE DUP4 PUSH2 0x276B JUMP JUMPDEST PUSH2 0x273F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x274C JUMPI POP PUSH1 0x0 PUSH2 0x2764 JUMP JUMPDEST PUSH2 0x2760 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP6 DUP5 PUSH2 0x2B1E JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND SWAP2 AND EQ ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x278B ADDRESS PUSH2 0x34A4 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF77C4791 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x27D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x27E8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x27FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x285B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F746F6B656E2D6374726C722D6D69736D617463680000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x98 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x2869 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 DUP5 AND SWAP2 PUSH32 0x460E712B4A5D801D031ED673DEA209B73AB854F7DDEB86B6C48082E92C3EEE66 SWAP2 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x28D5 JUMPI POP PUSH2 0x28D5 PUSH2 0x2780 JUMP JUMPDEST DUP1 PUSH2 0x28E3 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x291E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F23 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2949 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2951 PUSH2 0x34AA JUMP JUMPDEST PUSH2 0x2959 PUSH2 0x354A JUMP JUMPDEST DUP1 ISZERO PUSH2 0x1025 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2986 JUMPI POP PUSH2 0x2986 PUSH2 0x2780 JUMP JUMPDEST DUP1 PUSH2 0x2994 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x29CF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F23 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x29FA JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2959 PUSH2 0x3643 JUMP JUMPDEST PUSH1 0x9C DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3FF20538222F568F27FF436C0C49DFD3E48D5B8F86533A3F759DC1C7089775AB SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2A97 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2A79 JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2AEE JUMPI DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2AC3 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x2AE6 JUMPI PUSH1 0x1 SWAP4 POP POP POP POP PUSH2 0x1484 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2AA5 JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xE0E DUP5 DUP5 PUSH2 0x2B0A DUP8 DUP8 DUP8 DUP8 PUSH2 0x2D4A JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xB51 SWAP1 DUP5 SWAP1 PUSH2 0x36E9 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2BC7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2C61 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE DUP6 DUP2 AND PUSH1 0x44 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x4D7F3DB0 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2C48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2C5C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5D7B0758 DUP6 DUP6 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x19FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x2764 SWAP1 DUP4 SWAP1 PUSH2 0x2CEB SWAP1 DUP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x326E JUMP JUMPDEST PUSH2 0x379A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2D26 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x326E JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x2D37 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x2764 JUMP JUMPDEST PUSH2 0x2D41 DUP4 DUP3 PUSH2 0x37BF JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP3 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x2D8D JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x2DCF JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2D9A DUP9 DUP9 DUP9 PUSH2 0x3826 JUMP JUMPDEST DUP3 SLOAD SWAP1 SWAP2 POP PUSH2 0x2DCB SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x2DC6 SWAP1 DUP10 SWAP1 PUSH2 0x2DC0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP8 PUSH2 0x344A JUMP JUMPDEST SWAP1 PUSH2 0x344A JUMP JUMPDEST PUSH2 0x2DD9 JUMP JUMPDEST SWAP3 POP POP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2E08 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x326E JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x2E16 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE DUP2 SWAP1 KECCAK256 SLOAD DUP2 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 DUP1 PUSH2 0x2E64 DUP5 PUSH2 0x38D7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2E82 PUSH2 0x2E7D PUSH2 0x391F JUMP JUMPDEST PUSH2 0x3925 JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP3 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 DUP11 AND DUP3 MSTORE SWAP2 DUP5 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP5 DUP7 ADD MLOAD SWAP6 SWAP1 SWAP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH4 0xFFFFFFFF PUSH1 0xC0 SHL NOT AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP5 SWAP1 SWAP3 AND SWAP4 SWAP1 SWAP4 MUL OR PUSH1 0xFF PUSH1 0xE0 SHL NOT AND PUSH1 0x1 PUSH1 0xE0 SHL SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE DUP2 DUP2 LT ISZERO PUSH2 0x2F65 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0x2F92D56910619B38BC29FD8E4CA5E56359EDAC7A0C086CDCD305FB603FA37491 PUSH2 0x2F4F DUP6 DUP6 PUSH2 0x2B70 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 PUSH2 0xE0E JUMP JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0xE0E JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF PUSH2 0x2FA6 DUP5 DUP7 PUSH2 0x2B70 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x300F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3023 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3039 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x308B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F696E737566662D66756E6473 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x3098 DUP7 DUP7 DUP4 PUSH1 0x0 PUSH2 0x2AF9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x30AD DUP7 PUSH2 0x30A8 DUP5 DUP9 PUSH2 0x2B70 JUMP JUMPDEST PUSH2 0x2CB8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP3 GT PUSH2 0x3124 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x3121 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2B70 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x3130 DUP9 DUP9 PUSH2 0x2CB8 JUMP JUMPDEST SWAP1 POP DUP1 DUP3 GT PUSH2 0x313F JUMPI DUP2 PUSH2 0x3141 JUMP JUMPDEST DUP1 JUMPDEST SWAP5 POP PUSH2 0x314D DUP2 DUP7 PUSH2 0x2B70 JUMP JUMPDEST SWAP6 POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x31B6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D6E6F742D7A65726F PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x31D3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3969 JUMP JUMPDEST PUSH2 0x3224 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D696E76616C696400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x99 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x7F58DC86BC2E435CB77CA0EDB1DF55E25F90CAF2D6BD866971715437D456A212 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x327B DUP4 DUP6 PUSH2 0x3985 JUMP JUMPDEST SWAP1 POP PUSH2 0x175B DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x39DE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x32D1 SWAP1 PUSH2 0x32CC SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2B70 JUMP JUMPDEST PUSH2 0x38D7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x339B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x33AF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x33C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x33D7 PUSH2 0x25D4 JUMP JUMPDEST PUSH1 0x9C SLOAD SWAP1 SWAP2 POP PUSH2 0x33E7 DUP3 DUP6 PUSH2 0x344A JUMP JUMPDEST GT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x24 DUP4 ADD MSTORE DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x84 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xE0E SWAP1 DUP6 SWAP1 PUSH2 0x36E9 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x2764 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x34C3 JUMPI POP PUSH2 0x34C3 PUSH2 0x2780 JUMP JUMPDEST DUP1 PUSH2 0x34D1 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x350C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F23 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2959 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x1025 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3563 JUMPI POP PUSH2 0x3563 PUSH2 0x2780 JUMP JUMPDEST DUP1 PUSH2 0x3571 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x35AC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F23 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x35D7 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x35E1 PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x1025 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x365C JUMPI POP PUSH2 0x365C PUSH2 0x2780 JUMP JUMPDEST DUP1 PUSH2 0x366A JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x36A5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F23 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x36D0 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x65 SSTORE DUP1 ISZERO PUSH2 0x1025 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x373E DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3A20 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xB51 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x375D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xB51 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3FFF PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x37A9 DUP5 PUSH1 0x9A SLOAD PUSH2 0x326E JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x37B7 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x3815 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x381E JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xC0 SHL DUP2 DIV PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x3874 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x2764 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3888 DUP3 PUSH2 0x3882 PUSH2 0x391F JUMP JUMPDEST SWAP1 PUSH2 0x2B70 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x38C0 SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3985 JUMP JUMPDEST SWAP1 POP PUSH2 0x38CC DUP6 DUP3 PUSH2 0x326E JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x391B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3EB4 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0xA1 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x20 SHL DUP3 LT PUSH2 0x391B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3FD9 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3974 DUP4 PUSH2 0x3A2F JUMP JUMPDEST DUP1 ISZERO PUSH2 0x2764 JUMPI POP PUSH2 0x2764 DUP4 DUP4 PUSH2 0x3A62 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3994 JUMPI POP PUSH1 0x0 PUSH2 0x2BCC JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x39A1 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x2764 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F51 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2764 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x3A85 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x175B DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x3B27 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A42 DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3A62 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x1481 JUMPI POP PUSH2 0x3A5B DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3A62 JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x3A71 DUP6 DUP6 PUSH2 0x3C78 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x2D41 JUMPI POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x3B11 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3AD6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3ABE JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3B03 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x3B1D JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x3B68 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3EFD PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3B71 DUP6 PUSH2 0x34A4 JUMP JUMPDEST PUSH2 0x3BC2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3C01 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3BE2 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3C63 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3C68 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x38CC DUP3 DUP3 DUP7 PUSH2 0x3DAC JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x24 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP3 DUP5 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND SWAP3 PUSH2 0x7530 SWAP3 DUP8 SWAP3 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3D00 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3CE1 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3D61 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3D66 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x3D84 JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x3DA5 JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3D9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x3DBB JUMPI POP DUP2 PUSH2 0x2764 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x3DCB JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x3AD6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3ABE JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x3E67 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x3E67 JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x3E32 JUMP JUMPDEST POP PUSH2 0x391B SWAP3 SWAP2 POP JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x391B JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x3E6F JUMP INVALID 0x4F PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F206164647265737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E2031323820626974735072697A65 POP PUSH16 0x6F6C2F72657365727665526567697374 PUSH19 0x792D6E6F742D7A65726F416464726573733A20 PUSH10 0x6E73756666696369656E PUSH21 0x2062616C616E636520666F722063616C6C496E6974 PUSH10 0x616C697A61626C653A20 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 MSTORE8 PUSH2 0x6665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F774F776E61626C653A20 PUSH4 0x616C6C65 PUSH19 0x206973206E6F7420746865206F776E65725072 PUSH10 0x7A65506F6F6C2F657869 PUSH21 0x2D6665652D657863656564732D757365722D6D6178 PUSH10 0x6D756D5072697A65506F PUSH16 0x6C2F756E6B6E6F776E2D746F6B656E00 STOP STOP STOP STOP STOP STOP STOP STOP MSTORE8 PUSH2 0x6665 NUMBER PUSH2 0x7374 GASPRICE KECCAK256 PUSH23 0x616C756520646F65736E27742066697420696E20333220 PUSH3 0x697473 MSTORE8 PUSH2 0x6665 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x7563636565645374616B655072697A65506F6F6C 0x2F PUSH20 0x74616B652D746F6B656E2D6E6F742D7A65726F2D PUSH2 0x6464 PUSH19 0x6573735072697A65506F6F6C2F6F6E6C792D70 PUSH19 0x697A65537472617465677900000000A2646970 PUSH7 0x7358221220796A MLOAD SDIV CREATE GASLIMIT PUSH30 0x2D4F8FF8FD9911A364FAAEE0CFDAE58EC57971F0823778DE4964736F6C63 NUMBER STOP MOD 0xC STOP CALLER ",
              "sourceMap": "122:457:80:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106102535760003560e01c8063888c2b6f11610146578063b69ef8a8116100c3578063e323f82511610087578063e323f82514610992578063e6d8a94b146109ce578063edb4e1cf146109d6578063f2fde38b146109de578063fc0c546a14610a04578063ffa1ad7414610a0c57610253565b8063b69ef8a814610851578063c587148514610859578063d18e81b314610918578063d4a1361d14610920578063db006a751461097557610253565b80639d63848a1161010a5780639d63848a1461075d5780639e167519146107b55780639fe32a91146107bd578063a016240b146107da578063a7b2cc311461081457610253565b8063888c2b6f146106b45780638da5cb5b146107035780638e71c1f61461072757806391ca480e1461072f57806398bf3eb61461075557610253565b806352a387ab116101d457806376687d3d1161019857806376687d3d1461060157806378b3d3271461060957806379cb85631461062f5780637b99adb1146106615780637cbab1c71461067e57610253565b806352a387ab1461055b578063630665b4146105815780636a3fd4f9146105895780636b1b863a146105c3578063715018a6146105f957610253565b80632b0ab1441161021b5780632b0ab144146103f95780632f7627e31461042f578063354030231461045d5780633ede50c61461047a578063494de9f71461052d57610253565b80630937eb541461025857806313f55e3914610272578063150b7a02146102aa57806316960d551461035557806322f8e566146103dc575b600080fd5b610260610a89565b60408051918252519081900360200190f35b6102a86004803603606081101561028857600080fd5b506001600160a01b03813581169160208101359091169060400135610a98565b005b610338600480360360808110156102c057600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156102fa57600080fd5b82018360208201111561030c57600080fd5b803590602001918460018302840111600160201b8311171561032d57600080fd5b509092509050610b56565b604080516001600160e01b03199092168252519081900360200190f35b6102a86004803603606081101561036b57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561039e57600080fd5b8201836020820111156103b057600080fd5b803590602001918460208302840111600160201b831117156103d157600080fd5b509092509050610b67565b6102a8600480360360208110156103f257600080fd5b5035610e14565b6102a86004803603606081101561040f57600080fd5b506001600160a01b03813581169160208101359091169060400135610e19565b6102a86004803603604081101561044557600080fd5b506001600160a01b0381358116916020013516610ed6565b6102a86004803603602081101561047357600080fd5b5035611025565b6102a86004803603606081101561049057600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156104ba57600080fd5b8201836020820111156104cc57600080fd5b803590602001918460208302840111600160201b831117156104ed57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611028915050565b6102606004803603604081101561054357600080fd5b506001600160a01b038135811691602001351661121a565b6102606004803603602081101561057157600080fd5b50356001600160a01b0316611321565b610260611470565b6105af6004803603602081101561059f57600080fd5b50356001600160a01b0316611476565b604080519115158252519081900360200190f35b6102a8600480360360608110156105d957600080fd5b506001600160a01b03813581169160208101359160409091013516611489565b6102a8611691565b61026061173d565b6105af6004803603602081101561061f57600080fd5b50356001600160a01b0316611743565b6102606004803603606081101561064557600080fd5b506001600160a01b03813516906020810135906040013561174e565b6102a86004803603602081101561067757600080fd5b5035611763565b6102a86004803603606081101561069457600080fd5b506001600160a01b038135811691602081013590911690604001356117ce565b6106ea600480360360608110156106ca57600080fd5b506001600160a01b03813581169160208101359091169060400135611a1a565b6040805192835260208301919091528051918290030190f35b61070b611a34565b604080516001600160a01b039092168252519081900360200190f35b61070b611a43565b6102a86004803603602081101561074557600080fd5b50356001600160a01b0316611a52565b61070b611abd565b610765611acc565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156107a1578181015183820152602001610789565b505050509050019250505060405180910390f35b610260611b2e565b610260600480360360208110156107d357600080fd5b5035611b34565b610260600480360360808110156107f057600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611c62565b6102a86004803603606081101561082a57600080fd5b506001600160a01b03813516906001600160801b0360208201358116916040013516611e99565b610260611fef565b6102a86004803603608081101561086f57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561089957600080fd5b8201836020820111156108ab57600080fd5b803590602001918460208302840111600160201b831117156108cc57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602001356001600160a01b0316611ff9565b61026061213c565b6109466004803603602081101561093657600080fd5b50356001600160a01b0316612142565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b6102606004803603602081101561098b57600080fd5b5035612172565b6102a8600480360360808110156109a857600080fd5b506001600160a01b03813581169160208101359160408201358116916060013516612175565b61026061232a565b6102606124a0565b6102a8600480360360208110156109f457600080fd5b50356001600160a01b03166124a6565b61070b6125a9565b610a146125b3565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610a4e578181015183820152602001610a36565b50505050905090810190601f168015610a7b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610a936125d4565b905090565b6099546001600160a01b0316610aac6126df565b6001600160a01b031614610af5576040805162461bcd60e51b815260206004820152601c6024820152600080516020614054833981519152604482015290519081900360640190fd5b610b008383836126e3565b15610b5157816001600160a01b0316836001600160a01b03167fb0bac59718cd343c80a813518afcf36846cfcfe6d56e2b3cab9bd49f5f9b251c836040518082815260200191505060405180910390a35b505050565b630a85bd0160e11b95945050505050565b6099546001600160a01b0316610b7b6126df565b6001600160a01b031614610bc4576040805162461bcd60e51b815260206004820152601c6024820152600080516020614054833981519152604482015290519081900360640190fd5b610bcd8361276b565b610c1e576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b80610c2857610e0e565b60005b81811015610d9557836001600160a01b03166342842e0e3087868686818110610c5057fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610cad57600080fd5b505af1925050508015610cbe575060015b610d8d573d808015610cec576040519150601f19603f3d011682016040523d82523d6000602084013e610cf1565b606091505b507f17e975018310f88872b58d4d8263adca83cf5c1893496ea2a86923dab15276ad816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d51578181015183820152602001610d39565b50505050905090810190601f168015610d7e5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1505b600101610c2b565b50826001600160a01b0316846001600160a01b03167f69c2de32bc4d47f488e72626a6cfdee85089342e52675e7de79c4b417623960c848460405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a35b50505050565b60a155565b6099546001600160a01b0316610e2d6126df565b6001600160a01b031614610e76576040805162461bcd60e51b815260206004820152601c6024820152600080516020614054833981519152604482015290519081900360640190fd5b610e818383836126e3565b15610b5157816001600160a01b0316836001600160a01b03167fc65f48aca3b7a99b7443d04b8ffbb073156179bc628dc3f7def5047748973469836040518082815260200191505060405180910390a3505050565b610ede6126df565b6001600160a01b0316610eef611a34565b6001600160a01b031614610f38576040805162461bcd60e51b81526020600482018190526024820152600080516020613f72833981519152604482015290519081900360640190fd5b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f8757600080fd5b505afa158015610f9b573d6000803e3d6000fd5b505050506040513d6020811015610fb157600080fd5b5051111561102157816001600160a01b0316635c19a95c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561100857600080fd5b505af115801561101c573d6000803e3d6000fd5b505050505b5050565b50565b600054610100900460ff16806110415750611041612780565b8061104f575060005460ff16155b61108a5760405162461bcd60e51b815260040180806020018281038252602e815260200180613f23602e913960400191505060405180910390fd5b600054610100900460ff161580156110b5576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0384166110fa5760405162461bcd60e51b8152600401808060200182810382526022815260200180613edb6022913960400191505060405180910390fd5b82518067ffffffffffffffff8111801561111357600080fd5b5060405190808252806020026020018201604052801561113d578160200160208202803683370190505b50805161115291609891602090910190613e12565b5060005b8181101561118957600085828151811061116c57fe5b602002602001015190506111808183612791565b50600101611156565b506111926128bc565b61119a61296d565b6111a5600019612a02565b609780546001600160a01b0319166001600160a01b038716908117909155609a849055604080519182526020820185905280517f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce799281900390910190a1508015610e0e576000805461ff001916905550505050565b60008161122681612a3d565b611265576040805162461bcd60e51b81526020600482015260176024820152600080516020613fb9833981519152604482015290519081900360640190fd5b6112ea8484856001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112b757600080fd5b505afa1580156112cb573d6000803e3d6000fd5b505050506040513d60208110156112e157600080fd5b50516000612af9565b50506001600160a01b039081166000908152609f60209081526040808320949093168252929092529020546001600160c01b031690565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561137257600080fd5b505afa158015611386573d6000803e3d6000fd5b505050506040513d602081101561139c57600080fd5b505190506001600160a01b03811633146113f6576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f6f6e6c792d7265736572766560501b604482015290519081900360640190fd5b609b80546000918290559061140a82612172565b90506114298582611419612b0f565b6001600160a01b03169190612b1e565b6040805183815290516001600160a01b038716917f1c71c8e11fd443227c8f8d3dc1a237a3a5e8310b540c7fbcf5169754aedf42c9919081900360200190a2949350505050565b609d5490565b60006114818261276b565b90505b919050565b6099546001600160a01b031661149d6126df565b6001600160a01b0316146114e6576040805162461bcd60e51b815260206004820152601c6024820152600080516020614054833981519152604482015290519081900360640190fd5b806114f081612a3d565b61152f576040805162461bcd60e51b81526020600482015260176024820152600080516020613fb9833981519152604482015290519081900360640190fd5b8261153957610e0e565b609d54831115611590576040805162461bcd60e51b815260206004820152601d60248201527f5072697a65506f6f6c2f61776172642d657863656564732d617661696c000000604482015290519081900360640190fd5b609d5461159d9084612b70565b609d556115ad8484846000612bd2565b60006115b98385612cb8565b905061163f8584856001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561160d57600080fd5b505afa158015611621573d6000803e3d6000fd5b505050506040513d602081101561163757600080fd5b505184612af9565b826001600160a01b0316856001600160a01b03167fe2554529d99ab7a67db6b4cea2b32c7d55ae325f958861e05f304fdded867e31866040518082815260200191505060405180910390a35050505050565b6116996126df565b6001600160a01b03166116aa611a34565b6001600160a01b0316146116f3576040805162461bcd60e51b81526020600482018190526024820152600080516020613f72833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b609c5481565b600061148182612a3d565b600061175b848484612cf0565b949350505050565b61176b6126df565b6001600160a01b031661177c611a34565b6001600160a01b0316146117c5576040805162461bcd60e51b81526020600482018190526024820152600080516020613f72833981519152604482015290519081900360640190fd5b61102581612a02565b336117d881612a3d565b611817576040805162461bcd60e51b81526020600482015260176024820152600080516020613fb9833981519152604482015290519081900360640190fd5b6001600160a01b038416156118f1576000336001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561187557600080fd5b505afa158015611889573d6000803e3d6000fd5b505050506040513d602081101561189f57600080fd5b5051905060006118b186338484612d4a565b9050846001600160a01b0316866001600160a01b0316146118e3576118e0336118da8487612b70565b83612dd9565b90505b6118ee863383612e1f565b50505b6001600160a01b0383161580159061191b5750836001600160a01b0316836001600160a01b031614155b15611972576119728333336001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112b757600080fd5b6001600160a01b0384161580159061199457506099546001600160a01b031615155b15610e0e576099546040805163b221095760e01b81526001600160a01b0387811660048301528681166024830152604482018690523360648301529151919092169163b221095791608480830192600092919082900301818387803b1580156119fc57600080fd5b505af1158015611a10573d6000803e3d6000fd5b5050505050505050565b600080611a28858585612fbd565b90969095509350505050565b6033546001600160a01b031690565b6097546001600160a01b031681565b611a5a6126df565b6001600160a01b0316611a6b611a34565b6001600160a01b031614611ab4576040805162461bcd60e51b81526020600482018190526024820152600080516020613f72833981519152604482015290519081900360640190fd5b6110258161315b565b6099546001600160a01b031681565b60606098805480602002602001604051908101604052809291908181526020018280548015611b2457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b06575b5050505050905090565b609a5481565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b8557600080fd5b505afa158015611b99573d6000803e3d6000fd5b505050506040513d6020811015611baf57600080fd5b505190506001600160a01b038116611bcb576000915050611484565b6000816001600160a01b031663010dfa58306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611c1a57600080fd5b505afa158015611c2e573d6000803e3d6000fd5b505050506040513d6020811015611c4457600080fd5b5051905080611c5857600092505050611484565b61175b848261326e565b600060026065541415611cbc576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655582611ccb81612a3d565b611d0a576040805162461bcd60e51b81526020600482015260176024820152600080516020613fb9833981519152604482015290519081900360640190fd5b600080611d18888789612fbd565b9150915084821115611d5b5760405162461bcd60e51b8152600401808060200182810382526027815260200180613f926027913960400191505060405180910390fd5b611d6688878361328f565b856001600160a01b031663631b5dfb611d7d6126df565b8a8a6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611dd557600080fd5b505af1158015611de9573d6000803e3d6000fd5b505050506000611e028389612b7090919063ffffffff16565b90506000611e0f82612172565b9050611e1e8a82611419612b0f565b876001600160a01b03168a6001600160a01b0316611e3a6126df565b604080518d81526020810186905280820189905290516001600160a01b0392909216917f0271704a58fd2953e49b87d67a0a3ce28a58147de98a5457f60b4686f63850309181900360600190a450506001606555509695505050505050565b82611ea381612a3d565b611ee2576040805162461bcd60e51b81526020600482015260176024820152600080516020613fb9833981519152604482015290519081900360640190fd5b611eea6126df565b6001600160a01b0316611efb611a34565b6001600160a01b031614611f44576040805162461bcd60e51b81526020600482018190526024820152600080516020613f72833981519152604482015290519081900360640190fd5b6040805180820182526001600160801b0380851680835286821660208085018281526001600160a01b038b166000818152609e84528890209651875492518716600160801b029087166fffffffffffffffffffffffffffffffff1990931692909217909516179094558451928352928201528083019190915290517ffb0ba2cf86a2b03bcf387753a2192da80a006afa99dd022bb301c78e323bf1b99181900360600190a150505050565b6000610a93613350565b600054610100900460ff16806120125750612012612780565b80612020575060005460ff16155b61205b5760405162461bcd60e51b815260040180806020018281038252602e815260200180613f23602e913960400191505060405180910390fd5b600054610100900460ff16158015612086576000805460ff1961ff0019909116610100171660011790555b612091858585611028565b6001600160a01b0382166120d65760405162461bcd60e51b815260040180806020018281038252602b815260200180614029602b913960400191505060405180910390fd5b60a080546001600160a01b0319166001600160a01b0384811691909117918290556040519116907fa81053747b04e643171034e5426f6deebb058fc29dfe032e33345a109224b31b90600090a28015612135576000805461ff00191690555b5050505050565b60a15481565b6001600160a01b03166000908152609e60205260409020546001600160801b0380821692600160801b9092041690565b90565b600260655414156121cd576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002606555816121dc81612a3d565b61221b576040805162461bcd60e51b81526020600482015260176024820152600080516020613fb9833981519152604482015290519081900360640190fd5b83612225816133cc565b612276576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f657863656564732d6c69717569646974792d63617000604482015290519081900360640190fd5b60006122806126df565b905061228e87878787612bd2565b6122ad81308861229c612b0f565b6001600160a01b03169291906133f0565b6122b686611025565b846001600160a01b0316876001600160a01b0316826001600160a01b03167f6ce569498e0f86f147466ac49211cb2a1ffe06195adb805e383b3f2365109160898860405180838152602001826001600160a01b031681526020019250505060405180910390a4505060016065555050505050565b600060026065541415612384576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655560006123936125d4565b9050600061239f613350565b905060008282116123b15760006123bb565b6123bb8284612b70565b90506000609d5482116123cf5760006123dd565b609d546123dd908390612b70565b9050801561248f5760006123f082611b34565b9050801561244a57609b54612405908261344a565b609b556124128282612b70565b6040805183815290519193507f5f1703ccfa2730d4245350f228079926a37f26a44ecf6978a7eeafff0af11407919081900360200190a15b609d54612457908361344a565b609d556040805183815290517fce2b6e507c7ca1a20ce136810f524eefc19ba4c7e4866eb6cc0cba76e778d4be9181900360200190a1505b609d54945050505050600160655590565b609b5481565b6124ae6126df565b6001600160a01b03166124bf611a34565b6001600160a01b031614612508576040805162461bcd60e51b81526020600482018190526024820152600080516020613f72833981519152604482015290519081900360640190fd5b6001600160a01b03811661254d5760405162461bcd60e51b8152600401808060200182810382526026815260200180613e8e6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610a93612b0f565b60405180604001604052806005815260200164332e342e3560d81b81525081565b600080609b5490506060609880548060200260200160405190810160405280929190818152602001828054801561263457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612616575b505083519394506000925050505b818110156126d6576126cc83828151811061265957fe5b60200260200101516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561269957600080fd5b505afa1580156126ad573d6000803e3d6000fd5b505050506040513d60208110156126c357600080fd5b5051859061344a565b9350600101612642565b50919250505090565b3390565b60006126ee8361276b565b61273f576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b8161274c57506000612764565b6127606001600160a01b0384168584612b1e565b5060015b9392505050565b60a0546001600160a01b039182169116141590565b600061278b306134a4565b15905090565b306001600160a01b0316826001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b1580156127d457600080fd5b505afa1580156127e8573d6000803e3d6000fd5b505050506040513d60208110156127fe57600080fd5b50516001600160a01b03161461285b576040805162461bcd60e51b815260206004820152601e60248201527f5072697a65506f6f6c2f746f6b656e2d6374726c722d6d69736d617463680000604482015290519081900360640190fd5b816098828154811061286957fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051918416917f460e712b4a5d801d031ed673dea209b73ab854f7ddeb86b6c48082e92c3eee669190a25050565b600054610100900460ff16806128d557506128d5612780565b806128e3575060005460ff16155b61291e5760405162461bcd60e51b815260040180806020018281038252602e815260200180613f23602e913960400191505060405180910390fd5b600054610100900460ff16158015612949576000805460ff1961ff0019909116610100171660011790555b6129516134aa565b61295961354a565b8015611025576000805461ff001916905550565b600054610100900460ff16806129865750612986612780565b80612994575060005460ff16155b6129cf5760405162461bcd60e51b815260040180806020018281038252602e815260200180613f23602e913960400191505060405180910390fd5b600054610100900460ff161580156129fa576000805460ff1961ff0019909116610100171660011790555b612959613643565b609c8190556040805182815290517f3ff20538222f568f27ff436c0c49dfd3e48d5b8f86533a3f759dc1c7089775ab9181900360200190a150565b600060606098805480602002602001604051908101604052809291908181526020018280548015612a9757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612a79575b505083519394506000925050505b81811015612aee57846001600160a01b0316838281518110612ac357fe5b60200260200101516001600160a01b03161415612ae65760019350505050611484565b600101612aa5565b506000949350505050565b610e0e8484612b0a87878787612d4a565b612e1f565b60a0546001600160a01b031690565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610b519084906136e9565b600082821115612bc7576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6099546001600160a01b031615612c6157609954604080516304d7f3db60e41b81526001600160a01b038781166004830152602482018790528581166044830152848116606483015291519190921691634d7f3db091608480830192600092919082900301818387803b158015612c4857600080fd5b505af1158015612c5c573d6000803e3d6000fd5b505050505b816001600160a01b0316635d7b075885856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156119fc57600080fd5b6001600160a01b0382166000908152609e6020526040812054612764908390612ceb9082906001600160801b031661326e565b61379a565b6001600160a01b0383166000908152609e60205260408120548190612d26908590600160801b90046001600160801b031661326e565b905080612d37576000915050612764565b612d4183826137bf565b95945050505050565b6001600160a01b038381166000908152609f6020908152604080832093881683529290529081208054829190600160e01b900460ff16612d8d5760009150612dcf565b6000612d9a888888613826565b8254909150612dcb9088908890612dc6908990612dc0906001600160c01b03168761344a565b9061344a565b612dd9565b9250505b5095945050505050565b6001600160a01b0383166000908152609e60205260408120548190612e089085906001600160801b031661326e565b905080831115612e16578092505b50909392505050565b6001600160a01b038083166000908152609f602090815260408083209387168352929052819020548151606081019092526001600160c01b03169080612e64846138d7565b6001600160801b03168152602001612e82612e7d61391f565b613925565b63ffffffff908116825260016020928301526001600160a01b038681166000908152609f84526040808220928a168252918452819020845181549486015195909201516001600160c01b03199094166001600160c01b039092169190911763ffffffff60c01b1916600160c01b94909216939093021760ff60e01b1916600160e01b9115159190910217905581811015612f65576001600160a01b038084169085167f2f92d56910619b38bc29fd8e4ca5e56359edac7a0c086cdcd305fb603fa37491612f4f8585612b70565b60408051918252519081900360200190a3610e0e565b80821015610e0e576001600160a01b038084169085167ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf612fa68486612b70565b60408051918252519081900360200190a350505050565b6000806000846001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561300f57600080fd5b505afa158015613023573d6000803e3d6000fd5b505050506040513d602081101561303957600080fd5b505190508381101561308b576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f696e737566662d66756e647360501b604482015290519081900360640190fd5b6130988686836000612af9565b60006130ad866130a88488612b70565b612cb8565b6001600160a01b038088166000908152609f60209081526040808320938c16835292905290812054919250906001600160c01b03168211613124576001600160a01b038088166000908152609f60209081526040808320938c1683529290522054613121906001600160c01b031683612b70565b90505b60006131308888612cb8565b905080821161313f5781613141565b805b945061314d8186612b70565b955050505050935093915050565b6001600160a01b0381166131b6576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f7072697a6553747261746567792d6e6f742d7a65726f604482015290519081900360640190fd5b6131d36001600160a01b038216600162a1cb1960e01b0319613969565b613224576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f7072697a6553747261746567792d696e76616c696400604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0383169081179091556040517f7f58dc86bc2e435cb77ca0edb1df55e25f90caf2d6bd866971715437d456a21290600090a250565b60008061327b8385613985565b905061175b81670de0b6b3a76400006139de565b6001600160a01b038083166000908152609f60209081526040808320938716835292905220546132d1906132cc906001600160c01b031683612b70565b6138d7565b6001600160a01b038084166000818152609f602090815260408083209489168084529482529182902080546001600160c01b0319166001600160801b0396909616959095179094558051858152905191937ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf92918290030190a3505050565b60a054604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561339b57600080fd5b505afa1580156133af573d6000803e3d6000fd5b505050506040513d60208110156133c557600080fd5b5051905090565b6000806133d76125d4565b609c549091506133e7828561344a565b11159392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610e0e9085906136e9565b600082820183811015612764576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3b151590565b600054610100900460ff16806134c357506134c3612780565b806134d1575060005460ff16155b61350c5760405162461bcd60e51b815260040180806020018281038252602e815260200180613f23602e913960400191505060405180910390fd5b600054610100900460ff16158015612959576000805460ff1961ff0019909116610100171660011790558015611025576000805461ff001916905550565b600054610100900460ff16806135635750613563612780565b80613571575060005460ff16155b6135ac5760405162461bcd60e51b815260040180806020018281038252602e815260200180613f23602e913960400191505060405180910390fd5b600054610100900460ff161580156135d7576000805460ff1961ff0019909116610100171660011790555b60006135e16126df565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015611025576000805461ff001916905550565b600054610100900460ff168061365c575061365c612780565b8061366a575060005460ff16155b6136a55760405162461bcd60e51b815260040180806020018281038252602e815260200180613f23602e913960400191505060405180910390fd5b600054610100900460ff161580156136d0576000805460ff1961ff0019909116610100171660011790555b60016065558015611025576000805461ff001916905550565b606061373e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a209092919063ffffffff16565b805190915015610b515780806020019051602081101561375d57600080fd5b5051610b515760405162461bcd60e51b815260040180806020018281038252602a815260200180613fff602a913960400191505060405180910390fd5b6000806137a984609a5461326e565b9050808311156137b7578092505b509092915050565b6000808211613815576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161381e57fe5b049392505050565b6001600160a01b038281166000908152609f60209081526040808320938716835292905290812054600160c01b810463ffffffff1690600160e01b900460ff16613874576000915050612764565b60006138888261388261391f565b90612b70565b6001600160a01b0386166000908152609e6020526040812054919250906138c0908390600160801b90046001600160801b0316613985565b90506138cc858261326e565b979650505050505050565b6000600160801b821061391b5760405162461bcd60e51b8152600401808060200182810382526027815260200180613eb46027913960400191505060405180910390fd5b5090565b60a15490565b6000600160201b821061391b5760405162461bcd60e51b8152600401808060200182810382526026815260200180613fd96026913960400191505060405180910390fd5b600061397483613a2f565b801561276457506127648383613a62565b60008261399457506000612bcc565b828202828482816139a157fe5b04146127645760405162461bcd60e51b8152600401808060200182810382526021815260200180613f516021913960400191505060405180910390fd5b600061276483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613a85565b606061175b8484600085613b27565b6000613a42826301ffc9a760e01b613a62565b80156114815750613a5b826001600160e01b0319613a62565b1592915050565b6000806000613a718585613c78565b91509150818015612d415750949350505050565b60008183613b115760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ad6578181015183820152602001613abe565b50505050905090810190601f168015613b035780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613b1d57fe5b0495945050505050565b606082471015613b685760405162461bcd60e51b8152600401808060200182810382526026815260200180613efd6026913960400191505060405180910390fd5b613b71856134a4565b613bc2576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613c015780518252601f199092019160209182019101613be2565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613c63576040519150601f19603f3d011682016040523d82523d6000602084013e613c68565b606091505b50915091506138cc828286613dac565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b1781529151815160009384939284926060926001600160a01b038a169261753092879282918083835b60208310613d005780518252601f199092019160209182019101613ce1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114613d61576040519150601f19603f3d011682016040523d82523d6000602084013e613d66565b606091505b5091509150602081511015613d845760008094509450505050613da5565b81818060200190516020811015613d9a57600080fd5b505190955093505050505b9250929050565b60608315613dbb575081612764565b825115613dcb5782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315613ad6578181015183820152602001613abe565b828054828255906000526020600020908101928215613e67579160200282015b82811115613e6757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613e32565b5061391b9291505b8082111561391b5780546001600160a01b0319168155600101613e6f56fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e2031323820626974735072697a65506f6f6c2f7265736572766552656769737472792d6e6f742d7a65726f416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725072697a65506f6f6c2f657869742d6665652d657863656564732d757365722d6d6178696d756d5072697a65506f6f6c2f756e6b6e6f776e2d746f6b656e00000000000000000053616665436173743a2076616c756520646f65736e27742066697420696e20333220626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645374616b655072697a65506f6f6c2f7374616b652d746f6b656e2d6e6f742d7a65726f2d616464726573735072697a65506f6f6c2f6f6e6c792d7072697a65537472617465677900000000a2646970667358221220796a5105f0457d2d4f8ff8fd9911a364faaee0cfdae58ec57971f0823778de4964736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x253 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x888C2B6F GT PUSH2 0x146 JUMPI DUP1 PUSH4 0xB69EF8A8 GT PUSH2 0xC3 JUMPI DUP1 PUSH4 0xE323F825 GT PUSH2 0x87 JUMPI DUP1 PUSH4 0xE323F825 EQ PUSH2 0x992 JUMPI DUP1 PUSH4 0xE6D8A94B EQ PUSH2 0x9CE JUMPI DUP1 PUSH4 0xEDB4E1CF EQ PUSH2 0x9D6 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x9DE JUMPI DUP1 PUSH4 0xFC0C546A EQ PUSH2 0xA04 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0xA0C JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0xB69EF8A8 EQ PUSH2 0x851 JUMPI DUP1 PUSH4 0xC5871485 EQ PUSH2 0x859 JUMPI DUP1 PUSH4 0xD18E81B3 EQ PUSH2 0x918 JUMPI DUP1 PUSH4 0xD4A1361D EQ PUSH2 0x920 JUMPI DUP1 PUSH4 0xDB006A75 EQ PUSH2 0x975 JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x9D63848A GT PUSH2 0x10A JUMPI DUP1 PUSH4 0x9D63848A EQ PUSH2 0x75D JUMPI DUP1 PUSH4 0x9E167519 EQ PUSH2 0x7B5 JUMPI DUP1 PUSH4 0x9FE32A91 EQ PUSH2 0x7BD JUMPI DUP1 PUSH4 0xA016240B EQ PUSH2 0x7DA JUMPI DUP1 PUSH4 0xA7B2CC31 EQ PUSH2 0x814 JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x888C2B6F EQ PUSH2 0x6B4 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x703 JUMPI DUP1 PUSH4 0x8E71C1F6 EQ PUSH2 0x727 JUMPI DUP1 PUSH4 0x91CA480E EQ PUSH2 0x72F JUMPI DUP1 PUSH4 0x98BF3EB6 EQ PUSH2 0x755 JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x52A387AB GT PUSH2 0x1D4 JUMPI DUP1 PUSH4 0x76687D3D GT PUSH2 0x198 JUMPI DUP1 PUSH4 0x76687D3D EQ PUSH2 0x601 JUMPI DUP1 PUSH4 0x78B3D327 EQ PUSH2 0x609 JUMPI DUP1 PUSH4 0x79CB8563 EQ PUSH2 0x62F JUMPI DUP1 PUSH4 0x7B99ADB1 EQ PUSH2 0x661 JUMPI DUP1 PUSH4 0x7CBAB1C7 EQ PUSH2 0x67E JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x52A387AB EQ PUSH2 0x55B JUMPI DUP1 PUSH4 0x630665B4 EQ PUSH2 0x581 JUMPI DUP1 PUSH4 0x6A3FD4F9 EQ PUSH2 0x589 JUMPI DUP1 PUSH4 0x6B1B863A EQ PUSH2 0x5C3 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x5F9 JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x2B0AB144 GT PUSH2 0x21B JUMPI DUP1 PUSH4 0x2B0AB144 EQ PUSH2 0x3F9 JUMPI DUP1 PUSH4 0x2F7627E3 EQ PUSH2 0x42F JUMPI DUP1 PUSH4 0x35403023 EQ PUSH2 0x45D JUMPI DUP1 PUSH4 0x3EDE50C6 EQ PUSH2 0x47A JUMPI DUP1 PUSH4 0x494DE9F7 EQ PUSH2 0x52D JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x937EB54 EQ PUSH2 0x258 JUMPI DUP1 PUSH4 0x13F55E39 EQ PUSH2 0x272 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x2AA JUMPI DUP1 PUSH4 0x16960D55 EQ PUSH2 0x355 JUMPI DUP1 PUSH4 0x22F8E566 EQ PUSH2 0x3DC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x260 PUSH2 0xA89 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x288 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xA98 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x338 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x2C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x2FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x30C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x32D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xB56 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x36B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x39E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x3B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x3D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xB67 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xE14 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x40F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xE19 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x445 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xED6 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x473 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1025 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x490 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x4BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x4CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x4ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0x1028 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x543 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x121A JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x571 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1321 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x1470 JUMP JUMPDEST PUSH2 0x5AF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x59F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1476 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x5D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 SWAP1 SWAP2 ADD CALLDATALOAD AND PUSH2 0x1489 JUMP JUMPDEST PUSH2 0x2A8 PUSH2 0x1691 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x173D JUMP JUMPDEST PUSH2 0x5AF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x61F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1743 JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x645 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x174E JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x677 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1763 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x694 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x17CE JUMP JUMPDEST PUSH2 0x6EA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x6CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1A1A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB ADD SWAP1 RETURN JUMPDEST PUSH2 0x70B PUSH2 0x1A34 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x70B PUSH2 0x1A43 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x745 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A52 JUMP JUMPDEST PUSH2 0x70B PUSH2 0x1ABD JUMP JUMPDEST PUSH2 0x765 PUSH2 0x1ACC JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x7A1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x789 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x260 PUSH2 0x1B2E JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x7D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1B34 JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x7F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x1C62 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x82A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x40 ADD CALLDATALOAD AND PUSH2 0x1E99 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x1FEF JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x86F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x899 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x8AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x8CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1FF9 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x213C JUMP JUMPDEST PUSH2 0x946 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x936 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2142 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x98B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x2172 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x9A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x2175 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x232A JUMP JUMPDEST PUSH2 0x260 PUSH2 0x24A0 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x9F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x24A6 JUMP JUMPDEST PUSH2 0x70B PUSH2 0x25A9 JUMP JUMPDEST PUSH2 0xA14 PUSH2 0x25B3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xA4E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xA36 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xA7B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xA93 PUSH2 0x25D4 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xAAC PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xAF5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4054 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xB00 DUP4 DUP4 DUP4 PUSH2 0x26E3 JUMP JUMPDEST ISZERO PUSH2 0xB51 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB0BAC59718CD343C80A813518AFCF36846CFCFE6D56E2B3CAB9BD49F5F9B251C DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0xA85BD01 PUSH1 0xE1 SHL SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xB7B PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xBC4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4054 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xBCD DUP4 PUSH2 0x276B JUMP JUMPDEST PUSH2 0xC1E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0xC28 JUMPI PUSH2 0xE0E JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xD95 JUMPI DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x42842E0E ADDRESS DUP8 DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0xC50 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0xCBE JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xD8D JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0xCEC JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xCF1 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH32 0x17E975018310F88872B58D4D8263ADCA83CF5C1893496EA2A86923DAB15276AD DUP2 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD51 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD39 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD7E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xC2B JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x69C2DE32BC4D47F488E72626A6CFDEE85089342E52675E7DE79C4B417623960C DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP6 POP SWAP1 SWAP4 POP POP POP POP LOG3 JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0xA1 SSTORE JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE2D PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xE76 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4054 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xE81 DUP4 DUP4 DUP4 PUSH2 0x26E3 JUMP JUMPDEST ISZERO PUSH2 0xB51 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC65F48ACA3B7A99B7443D04B8FFBB073156179BC628DC3F7DEF5047748973469 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH2 0xEDE PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xEEF PUSH2 0x1A34 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xF38 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F72 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF87 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xF9B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xFB1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD GT ISZERO PUSH2 0x1021 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5C19A95C DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1008 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x101C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1041 JUMPI POP PUSH2 0x1041 PUSH2 0x2780 JUMP JUMPDEST DUP1 PUSH2 0x104F JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x108A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F23 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x10B5 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x10FA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3EDB PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 MLOAD DUP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x1113 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x113D JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP1 MLOAD PUSH2 0x1152 SWAP2 PUSH1 0x98 SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x3E12 JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1189 JUMPI PUSH1 0x0 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x116C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0x1180 DUP2 DUP4 PUSH2 0x2791 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x1156 JUMP JUMPDEST POP PUSH2 0x1192 PUSH2 0x28BC JUMP JUMPDEST PUSH2 0x119A PUSH2 0x296D JUMP JUMPDEST PUSH2 0x11A5 PUSH1 0x0 NOT PUSH2 0x2A02 JUMP JUMPDEST PUSH1 0x97 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x9A DUP5 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP6 SWAP1 MSTORE DUP1 MLOAD PUSH32 0x25FF68DD81B34665B5BA7E553EE5511BF6812E12ADB4A7E2C0D9E26B3099CE79 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 POP DUP1 ISZERO PUSH2 0xE0E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x1226 DUP2 PUSH2 0x2A3D JUMP JUMPDEST PUSH2 0x1265 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FB9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x12EA DUP5 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x12CB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x12E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 PUSH2 0x2AF9 JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP4 AND DUP3 MSTORE SWAP3 SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1386 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x139C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ PUSH2 0x13F6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F6F6E6C792D72657365727665 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9B DUP1 SLOAD PUSH1 0x0 SWAP2 DUP3 SWAP1 SSTORE SWAP1 PUSH2 0x140A DUP3 PUSH2 0x2172 JUMP JUMPDEST SWAP1 POP PUSH2 0x1429 DUP6 DUP3 PUSH2 0x1419 PUSH2 0x2B0F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x2B1E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP2 PUSH32 0x1C71C8E11FD443227C8F8D3DC1A237A3A5E8310B540C7FBCF5169754AEDF42C9 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x9D SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1481 DUP3 PUSH2 0x276B JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x149D PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x14E6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4054 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x14F0 DUP2 PUSH2 0x2A3D JUMP JUMPDEST PUSH2 0x152F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FB9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 PUSH2 0x1539 JUMPI PUSH2 0xE0E JUMP JUMPDEST PUSH1 0x9D SLOAD DUP4 GT ISZERO PUSH2 0x1590 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F61776172642D657863656564732D617661696C000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x159D SWAP1 DUP5 PUSH2 0x2B70 JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH2 0x15AD DUP5 DUP5 DUP5 PUSH1 0x0 PUSH2 0x2BD2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15B9 DUP4 DUP6 PUSH2 0x2CB8 JUMP JUMPDEST SWAP1 POP PUSH2 0x163F DUP6 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x160D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1621 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1637 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP5 PUSH2 0x2AF9 JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xE2554529D99AB7A67DB6B4CEA2B32C7D55AE325F958861E05F304FDDED867E31 DUP7 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1699 PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16AA PUSH2 0x1A34 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x16F3 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F72 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1481 DUP3 PUSH2 0x2A3D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x175B DUP5 DUP5 DUP5 PUSH2 0x2CF0 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x176B PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x177C PUSH2 0x1A34 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x17C5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F72 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1025 DUP2 PUSH2 0x2A02 JUMP JUMPDEST CALLER PUSH2 0x17D8 DUP2 PUSH2 0x2A3D JUMP JUMPDEST PUSH2 0x1817 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FB9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO PUSH2 0x18F1 JUMPI PUSH1 0x0 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP7 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1875 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1889 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x189F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x18B1 DUP7 CALLER DUP5 DUP5 PUSH2 0x2D4A JUMP JUMPDEST SWAP1 POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x18E3 JUMPI PUSH2 0x18E0 CALLER PUSH2 0x18DA DUP5 DUP8 PUSH2 0x2B70 JUMP JUMPDEST DUP4 PUSH2 0x2DD9 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x18EE DUP7 CALLER DUP4 PUSH2 0x2E1F JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x191B JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x1972 JUMPI PUSH2 0x1972 DUP4 CALLER CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1994 JUMPI POP PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xE0E JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP7 SWAP1 MSTORE CALLER PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xB2210957 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x19FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1A10 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1A28 DUP6 DUP6 DUP6 PUSH2 0x2FBD JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x97 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1A5A PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A6B PUSH2 0x1A34 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1AB4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F72 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1025 DUP2 PUSH2 0x315B JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1B24 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1B06 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1B85 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B99 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1BAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1BCB JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x1484 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x10DFA58 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C2E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1C44 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x1C58 JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x1484 JUMP JUMPDEST PUSH2 0x175B DUP5 DUP3 PUSH2 0x326E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x1CBC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP3 PUSH2 0x1CCB DUP2 PUSH2 0x2A3D JUMP JUMPDEST PUSH2 0x1D0A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FB9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1D18 DUP9 DUP8 DUP10 PUSH2 0x2FBD JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0x1D5B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F92 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1D66 DUP9 DUP8 DUP4 PUSH2 0x328F JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x631B5DFB PUSH2 0x1D7D PUSH2 0x26DF JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1DD5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1DE9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 PUSH2 0x1E02 DUP4 DUP10 PUSH2 0x2B70 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1E0F DUP3 PUSH2 0x2172 JUMP JUMPDEST SWAP1 POP PUSH2 0x1E1E DUP11 DUP3 PUSH2 0x1419 PUSH2 0x2B0F JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E3A PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP14 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE DUP1 DUP3 ADD DUP10 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x271704A58FD2953E49B87D67A0A3CE28A58147DE98A5457F60B4686F6385030 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH2 0x1EA3 DUP2 PUSH2 0x2A3D JUMP JUMPDEST PUSH2 0x1EE2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FB9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1EEA PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1EFB PUSH2 0x1A34 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1F44 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F72 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP6 AND DUP1 DUP4 MSTORE DUP7 DUP3 AND PUSH1 0x20 DUP1 DUP6 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9E DUP5 MSTORE DUP9 SWAP1 KECCAK256 SWAP7 MLOAD DUP8 SLOAD SWAP3 MLOAD DUP8 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP1 DUP8 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP6 AND OR SWAP1 SWAP5 SSTORE DUP5 MLOAD SWAP3 DUP4 MSTORE SWAP3 DUP3 ADD MSTORE DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 MLOAD PUSH32 0xFB0BA2CF86A2B03BCF387753A2192DA80A006AFA99DD022BB301C78E323BF1B9 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA93 PUSH2 0x3350 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2012 JUMPI POP PUSH2 0x2012 PUSH2 0x2780 JUMP JUMPDEST DUP1 PUSH2 0x2020 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x205B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F23 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2086 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2091 DUP6 DUP6 DUP6 PUSH2 0x1028 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x20D6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4029 PUSH1 0x2B SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xA0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 AND SWAP1 PUSH32 0xA81053747B04E643171034E5426F6DEEBB058FC29DFE032E33345A109224B31B SWAP1 PUSH1 0x0 SWAP1 LOG2 DUP1 ISZERO PUSH2 0x2135 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0xA1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP3 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x21CD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP2 PUSH2 0x21DC DUP2 PUSH2 0x2A3D JUMP JUMPDEST PUSH2 0x221B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FB9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP4 PUSH2 0x2225 DUP2 PUSH2 0x33CC JUMP JUMPDEST PUSH2 0x2276 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F657863656564732D6C69717569646974792D63617000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2280 PUSH2 0x26DF JUMP JUMPDEST SWAP1 POP PUSH2 0x228E DUP8 DUP8 DUP8 DUP8 PUSH2 0x2BD2 JUMP JUMPDEST PUSH2 0x22AD DUP2 ADDRESS DUP9 PUSH2 0x229C PUSH2 0x2B0F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 SWAP1 PUSH2 0x33F0 JUMP JUMPDEST PUSH2 0x22B6 DUP7 PUSH2 0x1025 JUMP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6CE569498E0F86F147466AC49211CB2A1FFE06195ADB805E383B3F2365109160 DUP10 DUP9 PUSH1 0x40 MLOAD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x2384 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE PUSH1 0x0 PUSH2 0x2393 PUSH2 0x25D4 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x239F PUSH2 0x3350 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 DUP3 GT PUSH2 0x23B1 JUMPI PUSH1 0x0 PUSH2 0x23BB JUMP JUMPDEST PUSH2 0x23BB DUP3 DUP5 PUSH2 0x2B70 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x9D SLOAD DUP3 GT PUSH2 0x23CF JUMPI PUSH1 0x0 PUSH2 0x23DD JUMP JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x23DD SWAP1 DUP4 SWAP1 PUSH2 0x2B70 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x248F JUMPI PUSH1 0x0 PUSH2 0x23F0 DUP3 PUSH2 0x1B34 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x244A JUMPI PUSH1 0x9B SLOAD PUSH2 0x2405 SWAP1 DUP3 PUSH2 0x344A JUMP JUMPDEST PUSH1 0x9B SSTORE PUSH2 0x2412 DUP3 DUP3 PUSH2 0x2B70 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 POP PUSH32 0x5F1703CCFA2730D4245350F228079926A37F26A44ECF6978A7EEAFFF0AF11407 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x2457 SWAP1 DUP4 PUSH2 0x344A JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xCE2B6E507C7CA1A20CE136810F524EEFC19BA4C7E4866EB6CC0CBA76E778D4BE SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH1 0x9D SLOAD SWAP5 POP POP POP POP POP PUSH1 0x1 PUSH1 0x65 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x9B SLOAD DUP2 JUMP JUMPDEST PUSH2 0x24AE PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x24BF PUSH2 0x1A34 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2508 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F72 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x254D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8E PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA93 PUSH2 0x2B0F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x9B SLOAD SWAP1 POP PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2634 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2616 JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x26D6 JUMPI PUSH2 0x26CC DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2659 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2699 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x26AD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x26C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP6 SWAP1 PUSH2 0x344A JUMP JUMPDEST SWAP4 POP PUSH1 0x1 ADD PUSH2 0x2642 JUMP JUMPDEST POP SWAP2 SWAP3 POP POP POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x26EE DUP4 PUSH2 0x276B JUMP JUMPDEST PUSH2 0x273F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x274C JUMPI POP PUSH1 0x0 PUSH2 0x2764 JUMP JUMPDEST PUSH2 0x2760 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP6 DUP5 PUSH2 0x2B1E JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND SWAP2 AND EQ ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x278B ADDRESS PUSH2 0x34A4 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF77C4791 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x27D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x27E8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x27FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x285B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F746F6B656E2D6374726C722D6D69736D617463680000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x98 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x2869 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 DUP5 AND SWAP2 PUSH32 0x460E712B4A5D801D031ED673DEA209B73AB854F7DDEB86B6C48082E92C3EEE66 SWAP2 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x28D5 JUMPI POP PUSH2 0x28D5 PUSH2 0x2780 JUMP JUMPDEST DUP1 PUSH2 0x28E3 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x291E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F23 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2949 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2951 PUSH2 0x34AA JUMP JUMPDEST PUSH2 0x2959 PUSH2 0x354A JUMP JUMPDEST DUP1 ISZERO PUSH2 0x1025 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2986 JUMPI POP PUSH2 0x2986 PUSH2 0x2780 JUMP JUMPDEST DUP1 PUSH2 0x2994 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x29CF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F23 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x29FA JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2959 PUSH2 0x3643 JUMP JUMPDEST PUSH1 0x9C DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3FF20538222F568F27FF436C0C49DFD3E48D5B8F86533A3F759DC1C7089775AB SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2A97 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2A79 JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2AEE JUMPI DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2AC3 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x2AE6 JUMPI PUSH1 0x1 SWAP4 POP POP POP POP PUSH2 0x1484 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2AA5 JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xE0E DUP5 DUP5 PUSH2 0x2B0A DUP8 DUP8 DUP8 DUP8 PUSH2 0x2D4A JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xB51 SWAP1 DUP5 SWAP1 PUSH2 0x36E9 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2BC7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2C61 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE DUP6 DUP2 AND PUSH1 0x44 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x4D7F3DB0 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2C48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2C5C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5D7B0758 DUP6 DUP6 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x19FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x2764 SWAP1 DUP4 SWAP1 PUSH2 0x2CEB SWAP1 DUP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x326E JUMP JUMPDEST PUSH2 0x379A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2D26 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x326E JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x2D37 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x2764 JUMP JUMPDEST PUSH2 0x2D41 DUP4 DUP3 PUSH2 0x37BF JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP3 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x2D8D JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x2DCF JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2D9A DUP9 DUP9 DUP9 PUSH2 0x3826 JUMP JUMPDEST DUP3 SLOAD SWAP1 SWAP2 POP PUSH2 0x2DCB SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x2DC6 SWAP1 DUP10 SWAP1 PUSH2 0x2DC0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP8 PUSH2 0x344A JUMP JUMPDEST SWAP1 PUSH2 0x344A JUMP JUMPDEST PUSH2 0x2DD9 JUMP JUMPDEST SWAP3 POP POP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2E08 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x326E JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x2E16 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE DUP2 SWAP1 KECCAK256 SLOAD DUP2 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 DUP1 PUSH2 0x2E64 DUP5 PUSH2 0x38D7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2E82 PUSH2 0x2E7D PUSH2 0x391F JUMP JUMPDEST PUSH2 0x3925 JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP3 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 DUP11 AND DUP3 MSTORE SWAP2 DUP5 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP5 DUP7 ADD MLOAD SWAP6 SWAP1 SWAP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH4 0xFFFFFFFF PUSH1 0xC0 SHL NOT AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP5 SWAP1 SWAP3 AND SWAP4 SWAP1 SWAP4 MUL OR PUSH1 0xFF PUSH1 0xE0 SHL NOT AND PUSH1 0x1 PUSH1 0xE0 SHL SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE DUP2 DUP2 LT ISZERO PUSH2 0x2F65 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0x2F92D56910619B38BC29FD8E4CA5E56359EDAC7A0C086CDCD305FB603FA37491 PUSH2 0x2F4F DUP6 DUP6 PUSH2 0x2B70 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 PUSH2 0xE0E JUMP JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0xE0E JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF PUSH2 0x2FA6 DUP5 DUP7 PUSH2 0x2B70 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x300F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3023 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3039 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x308B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F696E737566662D66756E6473 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x3098 DUP7 DUP7 DUP4 PUSH1 0x0 PUSH2 0x2AF9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x30AD DUP7 PUSH2 0x30A8 DUP5 DUP9 PUSH2 0x2B70 JUMP JUMPDEST PUSH2 0x2CB8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP3 GT PUSH2 0x3124 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x3121 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2B70 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x3130 DUP9 DUP9 PUSH2 0x2CB8 JUMP JUMPDEST SWAP1 POP DUP1 DUP3 GT PUSH2 0x313F JUMPI DUP2 PUSH2 0x3141 JUMP JUMPDEST DUP1 JUMPDEST SWAP5 POP PUSH2 0x314D DUP2 DUP7 PUSH2 0x2B70 JUMP JUMPDEST SWAP6 POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x31B6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D6E6F742D7A65726F PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x31D3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3969 JUMP JUMPDEST PUSH2 0x3224 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D696E76616C696400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x99 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x7F58DC86BC2E435CB77CA0EDB1DF55E25F90CAF2D6BD866971715437D456A212 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x327B DUP4 DUP6 PUSH2 0x3985 JUMP JUMPDEST SWAP1 POP PUSH2 0x175B DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x39DE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x32D1 SWAP1 PUSH2 0x32CC SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2B70 JUMP JUMPDEST PUSH2 0x38D7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x339B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x33AF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x33C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x33D7 PUSH2 0x25D4 JUMP JUMPDEST PUSH1 0x9C SLOAD SWAP1 SWAP2 POP PUSH2 0x33E7 DUP3 DUP6 PUSH2 0x344A JUMP JUMPDEST GT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x24 DUP4 ADD MSTORE DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x84 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xE0E SWAP1 DUP6 SWAP1 PUSH2 0x36E9 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x2764 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x34C3 JUMPI POP PUSH2 0x34C3 PUSH2 0x2780 JUMP JUMPDEST DUP1 PUSH2 0x34D1 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x350C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F23 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2959 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x1025 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3563 JUMPI POP PUSH2 0x3563 PUSH2 0x2780 JUMP JUMPDEST DUP1 PUSH2 0x3571 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x35AC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F23 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x35D7 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x35E1 PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x1025 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x365C JUMPI POP PUSH2 0x365C PUSH2 0x2780 JUMP JUMPDEST DUP1 PUSH2 0x366A JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x36A5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F23 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x36D0 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x65 SSTORE DUP1 ISZERO PUSH2 0x1025 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x373E DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3A20 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xB51 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x375D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xB51 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3FFF PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x37A9 DUP5 PUSH1 0x9A SLOAD PUSH2 0x326E JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x37B7 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x3815 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x381E JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xC0 SHL DUP2 DIV PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x3874 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x2764 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3888 DUP3 PUSH2 0x3882 PUSH2 0x391F JUMP JUMPDEST SWAP1 PUSH2 0x2B70 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x38C0 SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3985 JUMP JUMPDEST SWAP1 POP PUSH2 0x38CC DUP6 DUP3 PUSH2 0x326E JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x391B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3EB4 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0xA1 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x20 SHL DUP3 LT PUSH2 0x391B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3FD9 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3974 DUP4 PUSH2 0x3A2F JUMP JUMPDEST DUP1 ISZERO PUSH2 0x2764 JUMPI POP PUSH2 0x2764 DUP4 DUP4 PUSH2 0x3A62 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3994 JUMPI POP PUSH1 0x0 PUSH2 0x2BCC JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x39A1 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x2764 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F51 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2764 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x3A85 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x175B DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x3B27 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A42 DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3A62 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x1481 JUMPI POP PUSH2 0x3A5B DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3A62 JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x3A71 DUP6 DUP6 PUSH2 0x3C78 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x2D41 JUMPI POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x3B11 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3AD6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3ABE JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3B03 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x3B1D JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x3B68 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3EFD PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3B71 DUP6 PUSH2 0x34A4 JUMP JUMPDEST PUSH2 0x3BC2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3C01 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3BE2 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3C63 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3C68 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x38CC DUP3 DUP3 DUP7 PUSH2 0x3DAC JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x24 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP3 DUP5 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND SWAP3 PUSH2 0x7530 SWAP3 DUP8 SWAP3 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3D00 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3CE1 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3D61 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3D66 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x3D84 JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x3DA5 JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3D9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x3DBB JUMPI POP DUP2 PUSH2 0x2764 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x3DCB JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x3AD6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3ABE JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x3E67 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x3E67 JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x3E32 JUMP JUMPDEST POP PUSH2 0x391B SWAP3 SWAP2 POP JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x391B JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x3E6F JUMP INVALID 0x4F PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F206164647265737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E2031323820626974735072697A65 POP PUSH16 0x6F6C2F72657365727665526567697374 PUSH19 0x792D6E6F742D7A65726F416464726573733A20 PUSH10 0x6E73756666696369656E PUSH21 0x2062616C616E636520666F722063616C6C496E6974 PUSH10 0x616C697A61626C653A20 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 MSTORE8 PUSH2 0x6665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F774F776E61626C653A20 PUSH4 0x616C6C65 PUSH19 0x206973206E6F7420746865206F776E65725072 PUSH10 0x7A65506F6F6C2F657869 PUSH21 0x2D6665652D657863656564732D757365722D6D6178 PUSH10 0x6D756D5072697A65506F PUSH16 0x6C2F756E6B6E6F776E2D746F6B656E00 STOP STOP STOP STOP STOP STOP STOP STOP MSTORE8 PUSH2 0x6665 NUMBER PUSH2 0x7374 GASPRICE KECCAK256 PUSH23 0x616C756520646F65736E27742066697420696E20333220 PUSH3 0x697473 MSTORE8 PUSH2 0x6665 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x7563636565645374616B655072697A65506F6F6C 0x2F PUSH20 0x74616B652D746F6B656E2D6E6F742D7A65726F2D PUSH2 0x6464 PUSH19 0x6573735072697A65506F6F6C2F6F6E6C792D70 PUSH19 0x697A65537472617465677900000000A2646970 PUSH7 0x7358221220796A MLOAD SDIV CREATE GASLIMIT PUSH30 0x2D4F8FF8FD9911A364FAAEE0CFDAE58EC57971F0823778DE4964736F6C63 NUMBER STOP MOD 0xC STOP CALLER ",
              "sourceMap": "122:457:80:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31480:106:39;;;:::i;:::-;;;;;;;;;;;;;;;;14958:270;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14958:270:39;;;;;;;;;;;;;;;;;:::i;:::-;;32298:200;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32298:200:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32298:200:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32298:200:39;;;;;;;;;;-1:-1:-1;32298:200:39;;-1:-1:-1;32298:200:39;-1:-1:-1;32298:200:39;:::i;:::-;;;;-1:-1:-1;;;;;;32298:200:39;;;;;;;;;;;;;;;17185:617;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17185:617:39;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17185:617:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17185:617:39;;;;;;;;;;-1:-1:-1;17185:617:39;;-1:-1:-1;17185:617:39;-1:-1:-1;17185:617:39;:::i;207:92:80:-;;;;;;;;;;;;;;;;-1:-1:-1;207:92:80;;:::i;15586:263:39:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15586:263:39;;;;;;;;;;;;;;;;;:::i;31811:166::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31811:166:39;;;;;;;;;;:::i;401:77:80:-;;;;;;;;;;;;;;;;-1:-1:-1;401:77:80;;:::i;5948:860:39:-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5948:860:39;;;;;;;;;;;;;-1:-1:-1;5948:860:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5948:860:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5948:860:39;;-1:-1:-1;;5948:860:39;;;-1:-1:-1;5948:860:39;;-1:-1:-1;;5948:860:39:i;25409:303::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25409:303:39;;;;;;;;;;:::i;13277:314::-;;;;;;;;;;;;;;;;-1:-1:-1;13277:314:39;-1:-1:-1;;;;;13277:314:39;;:::i;11940:103::-;;;:::i;7465:130::-;;;;;;;;;;;;;;;;-1:-1:-1;7465:130:39;-1:-1:-1;;;;;7465:130:39;;:::i;:::-;;;;;;;;;;;;;;;;;;13917:647;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13917:647:39;;;;;;;;;;;;;;;;;:::i;1967:145:0:-;;;:::i;5382:27:39:-;;;:::i;34141:141::-;;;;;;;;;;;;;;;;-1:-1:-1;34141:141:39;-1:-1:-1;;;;;34141:141:39;;:::i;19907:306::-;;;;;;;;;;;;;;;;-1:-1:-1;19907:306:39;;-1:-1:-1;;;;;19907:306:39;;;;;;;;;;;:::i;29377:118::-;;;;;;;;;;;;;;;;-1:-1:-1;29377:118:39;;:::i;10723:1018::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10723:1018:39;;;;;;;;;;;;;;;;;:::i;18806:302::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18806:302:39;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1335:85:0;;;:::i;:::-;;;;-1:-1:-1;;;;;1335:85:0;;;;;;;;;;;;;;4710:40:39;;;:::i;30219:137::-;;;;;;;;;;;;;;;;-1:-1:-1;30219:137:39;-1:-1:-1;;;;;30219:137:39;;:::i;4916:43::-;;;:::i;31052:110::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5172:33;;;:::i;18036:430::-;;;;;;;;;;;;;;;;-1:-1:-1;18036:430:39;;:::i;8890:921::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8890:921:39;;;;;;;;;;;;;;;;;;;;:::i;26123:455::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26123:455:39;;;;-1:-1:-1;;;;;26123:455:39;;;;;;;;;;;;:::i;7162:74::-;;;:::i;679:517:43:-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;679:517:43;;;;;;;;;;;;;-1:-1:-1;679:517:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;679:517:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;679:517:43;;-1:-1:-1;;679:517:43;;;-1:-1:-1;;;679:517:43;;;-1:-1:-1;;;;;679:517:43;;:::i;176:26:80:-;;;:::i;26965:343:39:-;;;;;;;;;;;;;;;;-1:-1:-1;26965:343:39;-1:-1:-1;;;;;26965:343:39;;:::i;:::-;;;;-1:-1:-1;;;;;26965:343:39;;;;;;;;;;;;;;;;;;;;;;;;482:95:80;;;;;;;;;;;;;;;;-1:-1:-1;482:95:80;;:::i;7917:469:39:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7917:469:39;;;;;;;;;;;;;;;;;;;;;;:::i;12245:1028::-;;;:::i;5277:33::-;;;:::i;2261:240:0:-;;;;;;;;;;;;;;;;-1:-1:-1;2261:240:0;-1:-1:-1;;;;;2261:240:0;;:::i;6912:93:39:-;;;:::i;4615:40::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31480:106;31540:7;31562:19;:17;:19::i;:::-;31555:26;;31480:106;:::o;14958:270::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;15112:39:::1;15125:2;15129:13;15144:6;15112:12;:39::i;:::-;15108:116;;;15166:51;::::0;;;;;;;-1:-1:-1;;;;;15166:51:39;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;15108:116;14958:270:::0;;;:::o;32298:200::-;-1:-1:-1;;;;;32298:200:39;-1:-1:-1;;;;32298:200:39:o;17185:617::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;17354:32:::1;17372:13;17354:17;:32::i;:::-;17346:77;;;::::0;;-1:-1:-1;;;17346:77:39;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;17434:20:::0;17430:47:::1;;17464:7;;17430:47;17488:9;17483:253;17503:19:::0;;::::1;17483:253;;;-1:-1:-1::0;;;;;17541:50:39;::::1;;17600:4;17607:2:::0;17611:8;;17620:1;17611:11;;::::1;;;;;17541:82;::::0;;-1:-1:-1;;;;;;17541:82:39::1;::::0;;;;;;-1:-1:-1;;;;;17541:82:39;;::::1;;::::0;::::1;::::0;;;;::::1;::::0;;;;17611:11:::1;;::::0;;;::::1;;17541:82:::0;;;;-1:-1:-1;17541:82:39;;;;;;;-1:-1:-1;;17541:82:39;;;;;;;-1:-1:-1;17541:82:39;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;;;;;17537:186;;;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17680:34;17708:5;17680:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17640:83;17537:186;17524:3;;17483:253;;;-1:-1:-1::0;17747:50:39::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;-1:-1:-1;;;;;17747:50:39;;::::1;::::0;;;::::1;::::0;::::1;::::0;17788:8;;;;17747:50;;;;;;17788:8;;17747:50;::::1;::::0;17788:8;17747:50;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;17747:50:39::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;17747:50:39;;-1:-1:-1;;;;17747:50:39::1;36121:1;17185:617:::0;;;;:::o;207:92:80:-;268:11;:26;207:92::o;15586:263:39:-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;15737:39:::1;15750:2;15754:13;15769:6;15737:12;:39::i;:::-;15733:112;;;15791:47;::::0;;;;;;;-1:-1:-1;;;;;15791:47:39;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;15586:263:::0;;;:::o;31811:166::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;31898:33:39::1;::::0;;-1:-1:-1;;;31898:33:39;;31925:4:::1;31898:33;::::0;::::1;::::0;;;31934:1:::1;::::0;-1:-1:-1;;;;;31898:18:39;::::1;::::0;::::1;::::0;:33;;;;;::::1;::::0;;;;;;;;;:18;:33;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31898:33:39;:37:::1;31894:79;;;31945:21;::::0;;-1:-1:-1;;;31945:21:39;;-1:-1:-1;;;;;31945:21:39;;::::1;;::::0;::::1;::::0;;;:17;;::::1;::::0;::::1;::::0;:21;;;;;-1:-1:-1;;31945:21:39;;;;;;;;-1:-1:-1;31945:17:39;:21;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31894:79;31811:166:::0;;:::o;401:77:80:-;;:::o;5948:860:39:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;-1:-1:-1;;;;;6146:39:39;::::1;6138:86;;;;-1:-1:-1::0;;;6138:86:39::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6263:24:::0;;;6303:54:::1;::::0;::::1;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;6303:54:39::1;-1:-1:-1::0;6293:64:39;;::::1;::::0;:7:::1;::::0;:64:::1;::::0;;::::1;::::0;::::1;:::i;:::-;;6369:9;6364:178;6388:22;6384:1;:26;6364:178;;;6425:40;6468:17;6486:1;6468:20;;;;;;;;;;;;;;6425:63;;6496:39;6516:15;6533:1;6496:19;:39::i;:::-;-1:-1:-1::0;6412:3:39::1;;6364:178;;;;6547:16;:14;:16::i;:::-;6569:24;:22;:24::i;:::-;6599:29;-1:-1:-1::0;;6599:16:39::1;:29::i;:::-;6635:15;:34:::0;;-1:-1:-1;;;;;;6635:34:39::1;-1:-1:-1::0;;;;;6635:34:39;::::1;::::0;;::::1;::::0;;;6675:18:::1;:40:::0;;;6727:76:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;::::1;1778:1:9;1794:14:::0;1790:66;;;-1:-1:-1;;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;-1:-1:-1;;5948:860:39:o;25409:303::-;25537:7;25511:15;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;;;-1:-1:-1;;;35825:92:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;;;25589:50:::1;::::0;;-1:-1:-1;;;25589:50:39;;-1:-1:-1;;;;;25589:50:39;;::::1;;::::0;::::1;::::0;;;25552:91:::1;::::0;25566:4;;25572:15;;25589:44;;::::1;::::0;::::1;::::0;:50;;;;;::::1;::::0;;;;;;;;;:44;:50;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25589:50:39;25641:1:::1;25552:13;:91::i;:::-;-1:-1:-1::0;;;;;;;25656:37:39;;::::1;;::::0;;;:20:::1;:37;::::0;;;;;;;:43;;;::::1;::::0;;;;;;;;:51;-1:-1:-1;;;;;25656:51:39::1;::::0;25409:303::o;13277:314::-;36438:15;;:24;;;-1:-1:-1;;;36438:24:39;;;;13353:7;;;;-1:-1:-1;;;;;36438:15:39;;;;:22;;:24;;;;;;;;;;;;;;;:15;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36438:24:39;;-1:-1:-1;36497:10:39;-1:-1:-1;;;;;36477:30:39;;;36469:65;;;;;-1:-1:-1;;;36469:65:39;;;;;;;;;;;;-1:-1:-1;;;36469:65:39;;;;;;;;;;;;;;;13386:18:::1;::::0;;13369:14:::1;13410:22:::0;;;;13386:18;13457:15:::1;13386:18:::0;13457:7:::1;:15::i;:::-;13438:34;;13479:44;13509:2;13514:8;13479;:6;:8::i;:::-;-1:-1:-1::0;;;;;13479:21:39::1;::::0;;::::1;:44::i;:::-;13535:29;::::0;;;;;;;-1:-1:-1;;;;;13535:29:39;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;13578:8:::0;13277:314;-1:-1:-1;;;;13277:314:39:o;11940:103::-;12018:20;;11940:103;:::o;7465:130::-;7538:4;7557:33;7575:14;7557:17;:33::i;:::-;7550:40;;7465:130;;;;:::o;13917:647::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;14069:15:::1;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;::::0;;-1:-1:-1;;;35825:92:39;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;::::1;;14098:11:::0;14094:38:::2;;14119:7;;14094:38;14156:20;;14146:6;:30;;14138:72;;;::::0;;-1:-1:-1;;;14138:72:39;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;14239:20;::::0;:32:::2;::::0;14264:6;14239:24:::2;:32::i;:::-;14216:20;:55:::0;14278:46:::2;14284:2:::0;14288:6;14296:15;14321:1:::2;14278:5;:46::i;:::-;14331:19;14353:55;14384:15;14401:6;14353:30;:55::i;:::-;14449:48;::::0;;-1:-1:-1;;;14449:48:39;;-1:-1:-1;;;;;14449:48:39;;::::2;;::::0;::::2;::::0;;;14331:77;;-1:-1:-1;14414:97:39::2;::::0;14428:2;;14432:15;;14449:44;;::::2;::::0;::::2;::::0;:48;;;;;::::2;::::0;;;;;;;;;:44;:48;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;14449:48:39;14499:11;14414:13:::2;:97::i;:::-;14523:36;::::0;;;;;;;-1:-1:-1;;;;;14523:36:39;;::::2;::::0;;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;35923:1;36121::::1;13917:647:::0;;;:::o;1967:145:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;2057:6:::1;::::0;2036:40:::1;::::0;2073:1:::1;::::0;-1:-1:-1;;;;;2057:6:0::1;::::0;2036:40:::1;::::0;2073:1;;2036:40:::1;2086:6;:19:::0;;-1:-1:-1;;;;;;2086:19:0::1;::::0;;1967:145::o;5382:27:39:-;;;;:::o;34141:141::-;34228:4;34247:30;34261:15;34247:13;:30::i;19907:306::-;20067:23;20117:91;20151:16;20175:10;20193:9;20117:26;:91::i;:::-;20100:108;19907:306;-1:-1:-1;;;;19907:306:39:o;29377:118::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;29459:31:39::1;29476:13;29459:16;:31::i;10723:1018::-:0;10832:10;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;;;-1:-1:-1;;;35825:92:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;;;-1:-1:-1;;;;;10854:18:39;::::1;::::0;10850:579:::1;;10910:45;::::0;;-1:-1:-1;;;10910:45:39;;-1:-1:-1;;;;;10910:45:39;::::1;;::::0;::::1;::::0;;;10882:25:::1;::::0;10928:10:::1;::::0;10910:39:::1;::::0;:45;;;;;::::1;::::0;;;;;;;;;10928:10;10910:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;10910:45:39;;-1:-1:-1;11014:24:39::1;11041:63;11065:4:::0;11071:10:::1;10910:45:::0;11014:24;11041:23:::1;:63::i;:::-;11014:90:::0;-1:-1:-1;;;;;;11117:10:39;;::::1;::::0;;::::1;;11113:245;;11271:78;11289:10;11301:29;:17:::0;11323:6;11301:21:::1;:29::i;:::-;11332:16;11271:17;:78::i;:::-;11252:97;;11113:245;11366:56;11387:4;11393:10;11405:16;11366:20;:56::i;:::-;10850:579;;;-1:-1:-1::0;;;;;11438:16:39;::::1;::::0;;::::1;::::0;:30:::1;;-1:-1:-1::0;;;;;;11458:10:39;;::::1;::::0;;::::1;;;11438:30;11434:128;;;11508:43;::::0;;-1:-1:-1;;;11508:43:39;;-1:-1:-1;;;;;11508:43:39;::::1;;::::0;::::1;::::0;;;11478:77:::1;::::0;11492:2;;11496:10:::1;::::0;;;11508:39:::1;::::0;:43;;;;;::::1;::::0;;;;;;;;;11496:10;11508:43;::::1;;::::0;::::1;;;;::::0;::::1;11478:77;-1:-1:-1::0;;;;;11599:18:39;::::1;::::0;;::::1;::::0;:58:::1;;-1:-1:-1::0;11629:13:39::1;::::0;-1:-1:-1;;;;;11629:13:39::1;11621:36:::0;::::1;11599:58;11595:142;;;11667:13;::::0;:63:::1;::::0;;-1:-1:-1;;;11667:63:39;;-1:-1:-1;;;;;11667:63:39;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;;11719:10:::1;11667:63:::0;;;;;;:13;;;::::1;::::0;-1:-1:-1;;11667:63:39;;;;;-1:-1:-1;;11667:63:39;;;;;;;-1:-1:-1;11667:13:39;:63;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;10723:1018:::0;;;;:::o;18806:302::-;18950:15;18973:20;19034:69;19073:4;19079:15;19096:6;19034:38;:69::i;:::-;19008:95;;;;-1:-1:-1;18806:302:39;-1:-1:-1;;;;18806:302:39:o;1335:85:0:-;1407:6;;-1:-1:-1;;;;;1407:6:0;;1335:85::o;4710:40:39:-;;;-1:-1:-1;;;;;4710:40:39;;:::o;30219:137::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;30318:33:39::1;30336:14;30318:17;:33::i;4916:43::-:0;;;-1:-1:-1;;;;;4916:43:39;;:::o;31052:110::-;31102:33;31150:7;31143:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31143:14:39;;;-1:-1:-1;31143:14:39;;;;;;;;;;;;;;;;;;;31052:110;:::o;5172:33::-;;;;:::o;18036:430::-;18161:15;;:24;;;-1:-1:-1;;;18161:24:39;;;;18102:7;;;;-1:-1:-1;;;;;18161:15:39;;;;:22;;:24;;;;;;;;;;;;;;;:15;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18161:24:39;;-1:-1:-1;;;;;;18196:30:39;;18192:59;;18243:1;18236:8;;;;;18192:59;18286:42;;;-1:-1:-1;;;18286:42:39;;18322:4;18286:42;;;;;;18256:27;;-1:-1:-1;;;;;18286:27:39;;;;;:42;;;;;;;;;;;;;;;:27;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18286:42:39;;-1:-1:-1;18338:24:39;18334:53;;18379:1;18372:8;;;;;;18334:53;18399:62;18433:6;18441:19;18399:33;:62::i;8890:921::-;9113:7;1753:1:23;2495:7;;:19;;2487:63;;;;;-1:-1:-1;;;2487:63:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;1753:1;2625:7;:18;9083:15:39;35833:56:::1;9083:15:::0;35833:13:::1;:56::i;:::-;35825:92;;;::::0;;-1:-1:-1;;;35825:92:39;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;::::1;;9131:15:::2;9148:20:::0;9172:69:::2;9211:4;9217:15;9234:6;9172:38;:69::i;:::-;9130:111;;;;9266:14;9255:7;:25;;9247:77;;;;-1:-1:-1::0;;;9247:77:39::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9354:48;9366:4;9372:15;9389:12;9354:11;:48::i;:::-;-1:-1:-1::0;;;;;9433:51:39;::::2;;9485:12;:10;:12::i;:::-;9433:79;::::0;;-1:-1:-1;;;;;;9433:79:39::2;::::0;;;;;;-1:-1:-1;;;;;9433:79:39;;::::2;;::::0;::::2;::::0;;;::::2;::::0;;;;;;;;;;;;;;;;-1:-1:-1;;9433:79:39;;;;;;;-1:-1:-1;9433:79:39;;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;9558:21;9582:19;9593:7;9582:6;:10;;:19;;;;:::i;:::-;9558:43;;9607:16;9626:22;9634:13;9626:7;:22::i;:::-;9607:41;;9655:37;9677:4;9683:8;9655;:6;:8::i;:37::-;-1:-1:-1::0;;;;;9704:81:39;;::::2;::::0;;::::2;9722:12;:10;:12::i;:::-;9704:81;::::0;;;;;::::2;::::0;::::2;::::0;;;;;;;;;;;-1:-1:-1;;;;;9704:81:39;;;::::2;::::0;::::2;::::0;;;;;;;::::2;-1:-1:-1::0;;1710:1:23;2798:7;:22;-1:-1:-1;9799:7:39;8890:921;-1:-1:-1;;;;;;8890:921:39:o;26123:455::-;26295:16;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;;;-1:-1:-1;;;35825:92:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;;;1558:12:0::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;1547:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;1547:23:0::1;;1539:68;;;::::0;;-1:-1:-1;;;1539:68:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;::::1;;26373:114:39::2;::::0;;;;::::2;::::0;;-1:-1:-1;;;;;26373:114:39;;::::2;::::0;;;;;::::2;;::::0;;::::2;::::0;;;-1:-1:-1;;;;;26335:35:39;::::2;-1:-1:-1::0;26335:35:39;;;:17:::2;:35:::0;;;;;:152;;;;;;-1:-1:-1;;26335:152:39;;::::2;::::0;;::::2;;::::0;::::2;::::0;;;::::2;-1:-1:-1::0;;;26335:152:39::2;;::::0;;;26499:74;;;;;;;::::2;::::0;;;;;;;;;;::::2;::::0;;;;;;;;::::2;26123:455:::0;;;;:::o;7162:74::-;7199:7;7221:10;:8;:10::i;679:517:43:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;904:102:43::1;932:16;956:17;981:19;904:20;:102::i;:::-;-1:-1:-1::0;;;;;1021:34:43;::::1;1013:90;;;;-1:-1:-1::0;;;1013:90:43::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1109:10;:24:::0;;-1:-1:-1;;;;;;1109:24:43::1;-1:-1:-1::0;;;;;1109:24:43;;::::1;::::0;;;::::1;::::0;;;;1145:46:::1;::::0;1179:10;::::1;::::0;1145:46:::1;::::0;-1:-1:-1;;1145:46:43::1;1794:14:9::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1790:66;679:517:43;;;;;:::o;176:26:80:-;;;;:::o;26965:343:39:-;-1:-1:-1;;;;;27169:34:39;27071:27;27169:34;;;:17;:34;;;;;:54;-1:-1:-1;;;;;27169:54:39;;;;-1:-1:-1;;;27250:53:39;;;;;26965:343::o;482:95:80:-;560:12;482:95::o;7917:469:39:-;1753:1:23;2495:7;;:19;;2487:63;;;;;-1:-1:-1;;;2487:63:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;1753:1;2625:7;:18;8090:15:39;35833:56:::1;8090:15:::0;35833:13:::1;:56::i;:::-;35825:92;;;::::0;;-1:-1:-1;;;35825:92:39;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;::::1;;8127:6:::2;36288:25;36305:7;36288:16;:25::i;:::-;36280:69;;;::::0;;-1:-1:-1;;;36280:69:39;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;8143:16:::3;8162:12;:10;:12::i;:::-;8143:31;;8181:44;8187:2;8191:6;8199:15;8216:8;8181:5;:44::i;:::-;8232:58;8258:8;8276:4;8283:6;8232:8;:6;:8::i;:::-;-1:-1:-1::0;;;;;8232:25:39::3;::::0;;:58;:25:::3;:58::i;:::-;8296:15;8304:6;8296:7;:15::i;:::-;8323:58;::::0;;;;;-1:-1:-1;;;;;8323:58:39;;::::3;;::::0;::::3;::::0;;;;;::::3;::::0;;;::::3;::::0;;;::::3;::::0;::::3;::::0;;;;;;;;;::::3;-1:-1:-1::0;;1710:1:23;2798:7;:22;-1:-1:-1;;;;;7917:469:39:o;12245:1028::-;12316:7;1753:1:23;2495:7;;:19;;2487:63;;;;;-1:-1:-1;;;2487:63:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;1753:1;2625:7;:18;12331:24:39::1;12358:19;:17;:19::i;:::-;12331:46;;12495:22;12520:10;:8;:10::i;:::-;12495:35;;12536:21;12578:16;12561:14;:33;12560:78;;12637:1;12560:78;;;12598:36;:14:::0;12617:16;12598:18:::1;:36::i;:::-;12536:102;;12644:31;12695:20;;12679:13;:36;12678:84;;12761:1;12678:84;;;12737:20;::::0;12719:39:::1;::::0;:13;;:17:::1;:39::i;:::-;12644:118:::0;-1:-1:-1;12773:27:39;;12769:466:::1;;12810:18;12831:44;12851:23;12831:19;:44::i;:::-;12810:65:::0;-1:-1:-1;12887:14:39;;12883:214:::1;;12934:18;::::0;:34:::1;::::0;12957:10;12934:22:::1;:34::i;:::-;12913:18;:55:::0;13004:39:::1;:23:::0;13032:10;13004:27:::1;:39::i;:::-;13058:30;::::0;;;;;;;12978:65;;-1:-1:-1;13058:30:39::1;::::0;;;;;::::1;::::0;;::::1;12883:214;13127:20;::::0;:49:::1;::::0;13152:23;13127:24:::1;:49::i;:::-;13104:20;:72:::0;13190:38:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;12769:466;;13248:20;;13241:27;;;;;;1710:1:23::0;2798:7;:22;12245:1028:39;:::o;5277:33::-;;;;:::o;2261:240:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;2349:22:0;::::1;2341:73;;;;-1:-1:-1::0;;;2341:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2450:6;::::0;2429:38:::1;::::0;-1:-1:-1;;;;;2429:38:0;;::::1;::::0;2450:6:::1;::::0;2429:38:::1;::::0;2450:6:::1;::::0;2429:38:::1;2477:6;:17:::0;;-1:-1:-1;;;;;;2477:17:0::1;-1:-1:-1::0;;;;;2477:17:0;;;::::1;::::0;;;::::1;::::0;;2261:240::o;6912:93:39:-;6961:7;6991:8;:6;:8::i;4615:40::-;;;;;;;;;;;;;-1:-1:-1;;;4615:40:39;;;;;:::o;32597:361::-;32649:7;32664:13;32680:18;;32664:34;;32704:40;32747:7;32704:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32704:50:39;;;-1:-1:-1;32704:50:39;;;;;;;;;;;;-1:-1:-1;;32794:13:39;;32704:50;;-1:-1:-1;32771:20:39;;-1:-1:-1;;;32818:117:39;32841:12;32837:1;:16;32818:117;;;32875:53;32903:6;32910:1;32903:9;;;;;;;;;;;;;;-1:-1:-1;;;;;32885:40:39;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32885:42:39;32875:5;;:9;:53::i;:::-;32867:61;-1:-1:-1;32855:3:39;;32818:117;;;-1:-1:-1;32948:5:39;;-1:-1:-1;;;32597:361:39;:::o;828:104:19:-;915:10;828:104;:::o;15853:343:39:-;15968:4;15990:32;16008:13;15990:17;:32::i;:::-;15982:77;;;;;-1:-1:-1;;;15982:77:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16070:11;16066:44;;-1:-1:-1;16098:5:39;16091:12;;16066:44;16116:57;-1:-1:-1;;;;;16116:45:39;;16162:2;16166:6;16116:45;:57::i;:::-;-1:-1:-1;16187:4:39;15853:343;;;;;;:::o;1601:144:43:-;1711:10;;-1:-1:-1;;;;;1711:10:43;;;1703:37;;;;;1601:144::o;1952:123:9:-;2000:4;2024:44;2062:4;2024:29;:44::i;:::-;2023:45;2016:52;;1952:123;:::o;29798:280:39:-;29908:29;;;-1:-1:-1;;;29908:29:39;;;;29941:4;;-1:-1:-1;;;;;29908:27:39;;;;;:29;;;;;;;;;;;;;;;:27;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29908:29:39;-1:-1:-1;;;;;29908:37:39;;29900:80;;;;;-1:-1:-1;;;29900:80:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;30008:16;29991:7;29999:5;29991:14;;;;;;;;;;;;;;;;:33;;-1:-1:-1;;;;;;29991:33:39;-1:-1:-1;;;;;29991:33:39;;;;;;30035:38;;;;;;;;29991:14;30035:38;29798:280;;:::o;935:126:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;992:26:0::1;:24;:26::i;:::-;1028;:24;:26::i;:::-;1794:14:9::0;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;935:126:0:o;1791:106:23:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1856:34:23::1;:32;:34::i;29499:138:39:-:0;29563:12;:28;;;29602:30;;;;;;;;;;;;;;;;;29499:138;:::o;33600:331::-;33688:4;33700:40;33743:7;33700:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33700:50:39;;;-1:-1:-1;33700:50:39;;;;;;;;;;;;-1:-1:-1;;33788:13:39;;33700:50;;-1:-1:-1;33765:20:39;;-1:-1:-1;;;33808:101:39;33831:12;33827:1;:16;33808:101;;;33861:9;;-1:-1:-1;;;;;33861:28:39;;;:6;;33868:1;;33861:9;;;;;;;;;;;;-1:-1:-1;;;;;33861:28:39;;33858:44;;;33898:4;33891:11;;;;;;;33858:44;33845:3;;33808:101;;;-1:-1:-1;33921:5:39;;33600:331;-1:-1:-1;;;;33600:331:39:o;21947:275::-;22071:146;22099:4;22111:15;22134:77;22158:4;22164:15;22181:22;22205:5;22134:23;:77::i;:::-;22071:20;:146::i;2016:97:43:-;2098:10;;-1:-1:-1;;;;;2098:10:43;;2016:97::o;770:186:12:-;890:58;;;-1:-1:-1;;;;;890:58:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;890:58:12;-1:-1:-1;;;890:58:12;;;863:86;;883:5;;863:19;:86::i;3147:155:8:-;3205:7;3237:1;3232;:6;;3224:49;;;;;-1:-1:-1;;;3224:49:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3290:5:8;;;3147:155;;;;;:::o;16533:295:39:-;16646:13;;-1:-1:-1;;;;;16646:13:39;16638:36;16634:125;;16684:13;;:68;;;-1:-1:-1;;;16684:68:39;;-1:-1:-1;;;;;16684:68:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;;;;;:29;;:68;;;;;-1:-1:-1;;16684:68:39;;;;;;;-1:-1:-1;16684:13:39;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16634:125;16764:59;;;-1:-1:-1;;;16764:59:39;;-1:-1:-1;;;;;16764:59:39;;;;;;;;;;;;;;;:47;;;;;;:59;;;;;-1:-1:-1;;16764:59:39;;;;;;;;-1:-1:-1;16764:47:39;:59;;;;;;;;;;19258:269;-1:-1:-1;;;;;19461:34:39;;19362:7;19461:34;;;:17;:34;;;;;:54;19384:138;;19405:6;;19419:97;;19405:6;;-1:-1:-1;;;;;19461:54:39;19419:33;:97::i;:::-;19384:13;:138::i;20592:520::-;-1:-1:-1;;;;;20953:35:39;;20744:23;20953:35;;;:17;:35;;;;;:54;20744:23;;20907:101;;20941:10;;-1:-1:-1;;;20953:54:39;;-1:-1:-1;;;;;20953:54:39;20907:33;:101::i;:::-;20880:128;-1:-1:-1;21018:21:39;21014:50;;21056:1;21049:8;;;;;21014:50;21076:31;:9;21090:16;21076:13;:31::i;:::-;21069:38;20592:520;-1:-1:-1;;;;;20592:520:39:o;22226:598::-;-1:-1:-1;;;;;22445:37:39;;;22368:7;22445:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;22499:25;;22368:7;;22445:43;-1:-1:-1;;;22499:25:39;;;;22494:303;;22547:1;22534:14;;22494:303;;;22569:14;22586:70;22610:4;22616:15;22633:22;22586:23;:70::i;:::-;22744:21;;22569:87;;-1:-1:-1;22677:113:39;;22695:15;;22712:22;;22736:53;;22783:5;;22736:42;;-1:-1:-1;;;;;22744:21:39;22569:87;22736:34;:42::i;:::-;:46;;:53::i;:::-;22677:17;:113::i;:::-;22664:126;;22494:303;;-1:-1:-1;22809:10:39;22226:598;-1:-1:-1;;;;;22226:598:39:o;23848:410::-;-1:-1:-1;;;;;24086:34:39;;23978:7;24086:34;;;:17;:34;;;;;:54;23978:7;;24015:131;;24056:22;;-1:-1:-1;;;;;24086:54:39;24015:33;:131::i;:::-;23993:153;;24172:11;24156:13;:27;24152:75;;;24209:11;24193:27;;24152:75;-1:-1:-1;24240:13:39;;23848:410;-1:-1:-1;;;23848:410:39:o;22828:604::-;-1:-1:-1;;;;;22953:37:39;;;22932:18;22953:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;:51;23057:129;;;;;;;;-1:-1:-1;;;;;22953:51:39;;23057:129;23088:22;:10;:20;:22::i;:::-;-1:-1:-1;;;;;23057:129:39;;;;;23129:25;:14;:12;:14::i;:::-;:23;:25::i;:::-;23057:129;;;;;;23175:4;23057:129;;;;;-1:-1:-1;;;;;23011:37:39;;;-1:-1:-1;23011:37:39;;;:20;:37;;;;;;:43;;;;;;;;;;;:175;;;;;;;;;;;;;-1:-1:-1;;;;;;23011:175:39;;;-1:-1:-1;;;;;23011:175:39;;;;;;;-1:-1:-1;;;;23011:175:39;-1:-1:-1;;;23011:175:39;;;;;;;;;-1:-1:-1;;;;23011:175:39;-1:-1:-1;;;23011:175:39;;;;;;;;;;23197:23;;;23193:235;;;-1:-1:-1;;;;;23235:63:39;;;;;;;23271:26;:10;23286;23271:14;:26::i;:::-;23235:63;;;;;;;;;;;;;;;23193:235;;;23333:10;23320;:23;23316:112;;;-1:-1:-1;;;;;23358:63:39;;;;;;;23394:26;:10;23409;23394:14;:26::i;:::-;23358:63;;;;;;;;;;;;;;;22828:604;;;;:::o;27741:1468::-;27989:50;;;-1:-1:-1;;;27989:50:39;;-1:-1:-1;;;;;27989:50:39;;;;;;;;;27893:20;;;;;;27989:44;;;;;;:50;;;;;;;;;;;;;;;:44;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27989:50:39;;-1:-1:-1;28053:32:39;;;;28045:67;;;;;-1:-1:-1;;;28045:67:39;;;;;;;;;;;;-1:-1:-1;;;28045:67:39;;;;;;;;;;;;;;;28118:63;28132:4;28138:15;28155:22;28179:1;28118:13;:63::i;:::-;28575:24;28602:83;28633:15;28650:34;:22;28677:6;28650:26;:34::i;:::-;28602:30;:83::i;:::-;-1:-1:-1;;;;;28725:37:39;;;28692:23;28725:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;:51;28575:110;;-1:-1:-1;28692:23:39;-1:-1:-1;;;;;28725:51:39;-1:-1:-1;;28721:192:39;;-1:-1:-1;;;;;28832:37:39;;;;;;;:20;:37;;;;;;;;:43;;;;;;;;;:51;28824:82;;-1:-1:-1;;;;;28832:51:39;28889:16;28824:64;:82::i;:::-;28806:100;;28721:192;28989:20;29012:55;29043:15;29060:6;29012:30;:55::i;:::-;28989:78;;29107:12;29089:15;:30;29088:65;;29138:15;29088:65;;;29123:12;29088:65;29073:80;-1:-1:-1;29174:30:39;:12;29073:80;29174:16;:30::i;:::-;29159:45;;27741:1468;;;;;;;;;;:::o;30497:405::-;-1:-1:-1;;;;;30586:37:39;;30578:82;;;;;-1:-1:-1;;;30578:82:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30674:98;-1:-1:-1;;;;;30674:41:39;;-1:-1:-1;;;;;;30674:41:39;:98::i;:::-;30666:142;;;;;-1:-1:-1;;;30666:142:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;30814:13;:30;;-1:-1:-1;;;;;;30814:30:39;-1:-1:-1;;;;;30814:30:39;;;;;;;;30856:41;;;;-1:-1:-1;;30856:41:39;30497:405;:::o;1967:201:26:-;2051:7;;2087:15;:8;2100:1;2087:12;:15::i;:::-;2070:32;-1:-1:-1;2121:17:26;2070:32;1149:4;2121:10;:17::i;21258:289:39:-;-1:-1:-1;;;;;21411:37:39;;;;;;;:20;:37;;;;;;;;:43;;;;;;;;;:51;21403:84;;:72;;-1:-1:-1;;;;;21411:51:39;21468:6;21403:64;:72::i;:::-;:82;:84::i;:::-;-1:-1:-1;;;;;21349:37:39;;;;;;;:20;:37;;;;;;;;:43;;;;;;;;;;;;;:138;;-1:-1:-1;;;;;;21349:138:39;-1:-1:-1;;;;;21349:138:39;;;;;;;;;;;21499:43;;;;;;;21349:37;;21499:43;;;;;;;;;21258:289;;;:::o;1903:109:43:-;1972:10;;:35;;;-1:-1:-1;;;1972:35:43;;2001:4;1972:35;;;;;;-1:-1:-1;;;;;;;1972:10:43;;-1:-1:-1;;1972:35:43;;;;;;;;;;;;;;:10;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1972:35:43;;-1:-1:-1;1903:109:43;:::o;33203:189:39:-;33269:4;33281:24;33308:19;:17;:19::i;:::-;33374:12;;33281:46;;-1:-1:-1;33341:29:39;33281:46;33362:7;33341:20;:29::i;:::-;:45;;;33203:189;-1:-1:-1;;;33203:189:39:o;962:214:12:-;1100:68;;;-1:-1:-1;;;;;1100:68:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1100:68:12;-1:-1:-1;;;1100:68:12;;;1073:96;;1093:5;;1073:19;:96::i;2701:175:8:-;2759:7;2790:5;;;2813:6;;;;2805:46;;;;;-1:-1:-1;;;2805:46:8;;;;;;;;;;;;;;;;;;;;;;;;;;;737:413:18;1097:20;1135:8;;;737:413::o;759:64:19:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1794:14;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;759:64:19:o;1067:192:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1134:17:0::1;1154:12;:10;:12::i;:::-;1176:6;:18:::0;;-1:-1:-1;;;;;;1176:18:0::1;-1:-1:-1::0;;;;;1176:18:0;::::1;::::0;;::::1;::::0;;;1209:43:::1;::::0;1176:18;;-1:-1:-1;1176:18:0;-1:-1:-1;;1209:43:0::1;::::0;-1:-1:-1;;1209:43:0::1;1778:1:9;1794:14:::0;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;1067:192:0:o;1903:104:23:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1710:1:23::1;1978:7;:22:::0;1790:66:9;;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;1903:104:23:o;3088:762:12:-;3544:69;;;;;;;;;;;;;;;;;;3518:23;;3544:69;;-1:-1:-1;;;;;3544:27:12;;;3572:4;;3544:27;:69::i;:::-;3627:17;;3518:95;;-1:-1:-1;3627:21:12;3623:221;;3767:10;3756:30;;;;;;;;;;;;;;;-1:-1:-1;3756:30:12;3748:85;;;;-1:-1:-1;;;3748:85:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10138:275:39;10227:7;10242:14;10259:71;10293:16;10311:18;;10259:33;:71::i;:::-;10242:88;;10350:6;10340:7;:16;10336:53;;;10376:6;10366:16;;10336:53;-1:-1:-1;10401:7:39;;10138:275;-1:-1:-1;;10138:275:39:o;4228:150:8:-;4286:7;4317:1;4313;:5;4305:44;;;;;-1:-1:-1;;;4305:44:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;4370:1;4366;:5;;;;;;;4228:150;-1:-1:-1;;;4228:150:8:o;24612:558:39:-;-1:-1:-1;;;;;24778:37:39;;;24739:7;24778:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;:53;-1:-1:-1;;;24778:53:39;;;;;-1:-1:-1;;;24843:55:39;;;;24838:85;;24915:1;24908:8;;;;;24838:85;24929:17;24949:33;24968:13;24949:14;:12;:14::i;:::-;:18;;:33::i;:::-;-1:-1:-1;;;;;25026:34:39;;24988:21;25026:34;;;:17;:34;;;;;:53;24929;;-1:-1:-1;24988:21:39;25012:68;;24929:53;;-1:-1:-1;;;25026:53:39;;-1:-1:-1;;;;;25026:53:39;25012:13;:68::i;:::-;24988:92;;25093:72;25127:22;25151:13;25093:33;:72::i;:::-;25086:79;24612:558;-1:-1:-1;;;;;;;24612:558:39:o;1097:181:24:-;1154:7;-1:-1:-1;;;1181:14:24;;1173:67;;;;-1:-1:-1;;;1173:67:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1265:5:24;1097:181::o;303:94:80:-;381:11;;303:94;:::o;2028:176:24:-;2084:6;-1:-1:-1;2110:13:24;;2102:65;;;;-1:-1:-1;;;2102:65:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1369:286:5;1456:4;1563:23;1578:7;1563:14;:23::i;:::-;:85;;;;;1602:46;1627:7;1636:11;1602:24;:46::i;2266:459:27:-;2324:7;2565:6;2561:45;;-1:-1:-1;2594:1:27;2587:8;;2561:45;2628:5;;;2632:1;2628;:5;:1;2651:5;;;;;:10;2643:56;;;;-1:-1:-1;;;2643:56:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3187:130;3245:7;3271:39;3275:1;3278;3271:39;;;;;;;;;;;;;;;;;:3;:39::i;3592:193:18:-;3695:12;3726:52;3748:6;3756:4;3762:1;3765:12;3726:21;:52::i;757:394:5:-;821:4;1016:55;1041:7;-1:-1:-1;;;1016:24:5;:55::i;:::-;:128;;;;-1:-1:-1;1088:56:5;1113:7;-1:-1:-1;;;;;;1088:24:5;:56::i;:::-;1087:57;;757:394;-1:-1:-1;;757:394:5:o;4243:395::-;4336:4;4515:12;4529:11;4544:50;4573:7;4582:11;4544:28;:50::i;:::-;4514:80;;;;4613:7;:17;;;;-1:-1:-1;4624:6:5;4605:26;-1:-1:-1;;;;4243:395:5:o;3799:272:27:-;3885:7;3919:12;3912:5;3904:28;;;;-1:-1:-1;;;3904:28:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3942:9;3958:1;3954;:5;;;;;;;3799:272;-1:-1:-1;;;;;3799:272:27:o;4619:523:18:-;4746:12;4803:5;4778:21;:30;;4770:81;;;;-1:-1:-1;;;4770:81:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4869:18;4880:6;4869:10;:18::i;:::-;4861:60;;;;;-1:-1:-1;;;4861:60:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;4992:12;5006:23;5033:6;-1:-1:-1;;;;;5033:11:18;5053:5;5061:4;5033:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5033:33:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4991:75;;;;5083:52;5101:7;5110:10;5122:12;5083:17;:52::i;5155:444:5:-;5331:57;;;-1:-1:-1;;;;;;5331:57:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5331:57:5;-1:-1:-1;;;5331:57:5;;;5436:47;;;;-1:-1:-1;;;;5331:57:5;-1:-1:-1;;5302:26:5;;-1:-1:-1;;;;;5436:18:5;;;5461:5;;5331:57;;5436:47;;;;5331:57;5436:47;;;;;;;;;;-1:-1:-1;;5436:47:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5398:85;;;;5513:2;5497:6;:13;:18;5493:45;;;5525:5;5532;5517:21;;;;;;;;;5493:45;5556:7;5576:6;5565:26;;;;;;;;;;;;;;;-1:-1:-1;5565:26:5;5548:44;;-1:-1:-1;5565:26:5;-1:-1:-1;;;;5155:444:5;;;;;;:::o;6122:725:18:-;6237:12;6265:7;6261:580;;;-1:-1:-1;6295:10:18;6288:17;;6261:580;6406:17;;:21;6402:429;;6664:10;6658:17;6724:15;6711:10;6707:2;6703:19;6696:44;6613:145;6796:20;;-1:-1:-1;;;6796:20:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6796:20:18;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "3310600",
                "executionCost": "3683",
                "totalCost": "3314283"
              },
              "external": {
                "VERSION()": "infinite",
                "accountedBalance()": "infinite",
                "award(address,uint256,address)": "infinite",
                "awardBalance()": "1066",
                "awardExternalERC20(address,address,uint256)": "infinite",
                "awardExternalERC721(address,address,uint256[])": "infinite",
                "balance()": "infinite",
                "balanceOfCredit(address,address)": "infinite",
                "beforeTokenTransfer(address,address,uint256)": "infinite",
                "calculateEarlyExitFee(address,address,uint256)": "infinite",
                "calculateReserveFee(uint256)": "infinite",
                "canAwardExternal(address)": "1234",
                "captureAwardBalance()": "infinite",
                "compLikeDelegate(address,address)": "infinite",
                "creditPlanOf(address)": "1357",
                "currentTime()": "1087",
                "depositTo(address,uint256,address,address)": "infinite",
                "estimateCreditAccrualTime(address,uint256,uint256)": "infinite",
                "initialize(address,address[],uint256)": "infinite",
                "initialize(address,address[],uint256,address)": "infinite",
                "isControlled(address)": "infinite",
                "liquidityCap()": "1043",
                "maxExitFeeMantissa()": "1065",
                "onERC721Received(address,address,uint256,bytes)": "629",
                "owner()": "1105",
                "prizeStrategy()": "1171",
                "redeem(uint256)": "370",
                "renounceOwnership()": "infinite",
                "reserveRegistry()": "1127",
                "reserveTotalSupply()": "1086",
                "setCreditPlanOf(address,uint128,uint128)": "infinite",
                "setCurrentTime(uint256)": "20324",
                "setLiquidityCap(uint256)": "infinite",
                "setPrizeStrategy(address)": "infinite",
                "supply(uint256)": "278",
                "token()": "1204",
                "tokens()": "infinite",
                "transferExternalERC20(address,address,uint256)": "infinite",
                "transferOwnership(address)": "infinite",
                "withdrawInstantlyFrom(address,uint256,address,uint256)": "infinite",
                "withdrawReserve(address)": "infinite"
              },
              "internal": {
                "_currentTime()": "815"
              }
            },
            "methodIdentifiers": {
              "VERSION()": "ffa1ad74",
              "accountedBalance()": "0937eb54",
              "award(address,uint256,address)": "6b1b863a",
              "awardBalance()": "630665b4",
              "awardExternalERC20(address,address,uint256)": "2b0ab144",
              "awardExternalERC721(address,address,uint256[])": "16960d55",
              "balance()": "b69ef8a8",
              "balanceOfCredit(address,address)": "494de9f7",
              "beforeTokenTransfer(address,address,uint256)": "7cbab1c7",
              "calculateEarlyExitFee(address,address,uint256)": "888c2b6f",
              "calculateReserveFee(uint256)": "9fe32a91",
              "canAwardExternal(address)": "6a3fd4f9",
              "captureAwardBalance()": "e6d8a94b",
              "compLikeDelegate(address,address)": "2f7627e3",
              "creditPlanOf(address)": "d4a1361d",
              "currentTime()": "d18e81b3",
              "depositTo(address,uint256,address,address)": "e323f825",
              "estimateCreditAccrualTime(address,uint256,uint256)": "79cb8563",
              "initialize(address,address[],uint256)": "3ede50c6",
              "initialize(address,address[],uint256,address)": "c5871485",
              "isControlled(address)": "78b3d327",
              "liquidityCap()": "76687d3d",
              "maxExitFeeMantissa()": "9e167519",
              "onERC721Received(address,address,uint256,bytes)": "150b7a02",
              "owner()": "8da5cb5b",
              "prizeStrategy()": "98bf3eb6",
              "redeem(uint256)": "db006a75",
              "renounceOwnership()": "715018a6",
              "reserveRegistry()": "8e71c1f6",
              "reserveTotalSupply()": "edb4e1cf",
              "setCreditPlanOf(address,uint128,uint128)": "a7b2cc31",
              "setCurrentTime(uint256)": "22f8e566",
              "setLiquidityCap(uint256)": "7b99adb1",
              "setPrizeStrategy(address)": "91ca480e",
              "supply(uint256)": "35403023",
              "token()": "fc0c546a",
              "tokens()": "9d63848a",
              "transferExternalERC20(address,address,uint256)": "13f55e39",
              "transferOwnership(address)": "f2fde38b",
              "withdrawInstantlyFrom(address,uint256,address,uint256)": "a016240b",
              "withdrawReserve(address)": "52a387ab"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"AwardCaptured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Awarded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"AwardedExternalERC20\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"AwardedExternalERC721\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract ControlledTokenInterface\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"ControlledTokenAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CreditBurned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CreditMinted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"creditLimitMantissa\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"creditRateMantissa\",\"type\":\"uint128\"}],\"name\":\"CreditPlanSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ErrorAwardingExternalERC721\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"reserveRegistry\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxExitFeeMantissa\",\"type\":\"uint256\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"redeemed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"exitFee\",\"type\":\"uint256\"}],\"name\":\"InstantWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"liquidityCap\",\"type\":\"uint256\"}],\"name\":\"LiquidityCapSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"prizeStrategy\",\"type\":\"address\"}],\"name\":\"PrizeStrategySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ReserveFeeCaptured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ReserveWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"stakeToken\",\"type\":\"address\"}],\"name\":\"StakePrizePoolInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferredExternalERC20\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accountedBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"awardBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"awardExternalERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"awardExternalERC721\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"balance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"balanceOfCredit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"beforeTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"calculateEarlyExitFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"exitFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"burnedCredit\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"calculateReserveFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_externalToken\",\"type\":\"address\"}],\"name\":\"canAwardExternal\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"captureAwardBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ICompLike\",\"name\":\"compLike\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"compLikeDelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"creditPlanOf\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"creditLimitMantissa\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"creditRateMantissa\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_principal\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_interest\",\"type\":\"uint256\"}],\"name\":\"estimateCreditAccrualTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"durationSeconds\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"_reserveRegistry\",\"type\":\"address\"},{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"_controlledTokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_maxExitFeeMantissa\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"_reserveRegistry\",\"type\":\"address\"},{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"_controlledTokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_maxExitFeeMantissa\",\"type\":\"uint256\"},{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_stakeToken\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ControlledTokenInterface\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"isControlled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"liquidityCap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxExitFeeMantissa\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizeStrategy\",\"outputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"redeemAmount\",\"type\":\"uint256\"}],\"name\":\"redeem\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reserveRegistry\",\"outputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reserveTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"_creditRateMantissa\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"_creditLimitMantissa\",\"type\":\"uint128\"}],\"name\":\"setCreditPlanOf\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_currentTime\",\"type\":\"uint256\"}],\"name\":\"setCurrentTime\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_liquidityCap\",\"type\":\"uint256\"}],\"name\":\"setLiquidityCap\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"_prizeStrategy\",\"type\":\"address\"}],\"name\":\"setPrizeStrategy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"mintAmount\",\"type\":\"uint256\"}],\"name\":\"supply\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokens\",\"outputs\":[{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferExternalERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maximumExitFee\",\"type\":\"uint256\"}],\"name\":\"withdrawInstantlyFrom\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawReserve\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"accountedBalance()\":{\"returns\":{\"_0\":\"The current total of all tokens\"}},\"award(address,uint256,address)\":{\"details\":\"The amount awarded must be less than the awardBalance()\",\"params\":{\"amount\":\"The amount of assets to be awarded\",\"controlledToken\":\"The address of the asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"awardBalance()\":{\"details\":\"captureAwardBalance() should be called first\",\"returns\":{\"_0\":\"The total amount of assets to be awarded for the current prize\"}},\"awardExternalERC20(address,address,uint256)\":{\"details\":\"Used to award any arbitrary tokens held by the Prize Pool\",\"params\":{\"amount\":\"The amount of external assets to be awarded\",\"externalToken\":\"The address of the external asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"awardExternalERC721(address,address,uint256[])\":{\"details\":\"Used to award any arbitrary NFTs held by the Prize Pool\",\"params\":{\"externalToken\":\"The address of the external NFT token being awarded\",\"to\":\"The address of the winner that receives the award\",\"tokenIds\":\"An array of NFT Token IDs to be transferred\"}},\"balance()\":{\"details\":\"Returns the total underlying balance of all assets. This includes both principal and interest.\",\"returns\":{\"_0\":\"The underlying balance of assets\"}},\"balanceOfCredit(address,address)\":{\"params\":{\"user\":\"The user whose credit balance should be returned\"},\"returns\":{\"_0\":\"The balance of the users credit\"}},\"beforeTokenTransfer(address,address,uint256)\":{\"params\":{\"amount\":\"The amount of tokens being trasferred\",\"from\":\"The address the tokens are being transferred from (0 if minting)\",\"to\":\"The address the tokens are being transferred to (0 if burning)\"}},\"calculateEarlyExitFee(address,address,uint256)\":{\"params\":{\"amount\":\"The amount of collateral to be withdrawn\",\"controlledToken\":\"The type of collateral being withdrawn\",\"from\":\"The user who is withdrawing\"},\"returns\":{\"burnedCredit\":\"The user's credit that was burned\",\"exitFee\":\"The exit fee\"}},\"calculateReserveFee(uint256)\":{\"params\":{\"amount\":\"The prize amount\"},\"returns\":{\"_0\":\"The size of the reserve portion of the prize\"}},\"canAwardExternal(address)\":{\"details\":\"Checks with the Prize Pool if a specific token type may be awarded as an external prize\",\"params\":{\"_externalToken\":\"The address of the token to check\"},\"returns\":{\"_0\":\"True if the token may be awarded, false otherwise\"}},\"captureAwardBalance()\":{\"details\":\"This function also captures the reserve fees.\",\"returns\":{\"_0\":\"The total amount of assets to be awarded for the current prize\"}},\"compLikeDelegate(address,address)\":{\"params\":{\"compLike\":\"The COMP-like token held by the prize pool that should be delegated\",\"to\":\"The address to delegate to \"}},\"creditPlanOf(address)\":{\"params\":{\"controlledToken\":\"The controlled token to retrieve the credit rates for\"},\"returns\":{\"creditLimitMantissa\":\"The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\",\"creditRateMantissa\":\"The credit rate. This is the amount of tokens that accrue per second.\"}},\"depositTo(address,uint256,address,address)\":{\"params\":{\"amount\":\"The amount of assets to deposit\",\"controlledToken\":\"The address of the type of token the user is minting\",\"referrer\":\"The referrer of the deposit\",\"to\":\"The address receiving the newly minted tokens\"}},\"estimateCreditAccrualTime(address,uint256,uint256)\":{\"params\":{\"_interest\":\"The amount of interest that must accrue\",\"_principal\":\"The principal amount on which interest is accruing\"},\"returns\":{\"durationSeconds\":\"The duration of time it will take to accrue the given amount of interest, in seconds.\"}},\"initialize(address,address[],uint256)\":{\"params\":{\"_controlledTokens\":\"Array of ControlledTokens that are controlled by this Prize Pool.\",\"_maxExitFeeMantissa\":\"The maximum exit fee size\"}},\"initialize(address,address[],uint256,address)\":{\"params\":{\"_controlledTokens\":\"Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\",\"_maxExitFeeMantissa\":\"The maximum exit fee size, relative to the withdrawal amount\",\"_stakeToken\":\"Address of the stake token\"}},\"isControlled(address)\":{\"details\":\"Checks if a specific token is controlled by the Prize Pool\",\"params\":{\"controlledToken\":\"The address of the token to check\"},\"returns\":{\"_0\":\"True if the token is a controlled token, false otherwise\"}},\"onERC721Received(address,address,uint256,bytes)\":{\"params\":{\"data\":\"Additional data with no specified format, sent in call to `_to`.\",\"from\":\"The current owner of the NFT\",\"operator\":\"The address that acts on behalf of the owner\",\"tokenId\":\"The NFT to transfer\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setCreditPlanOf(address,uint128,uint128)\":{\"params\":{\"_controlledToken\":\"The controlled token for whom to set the credit plan\",\"_creditLimitMantissa\":\"The credit limit to set.  Is a fixed point 18 decimal (like Ether).\",\"_creditRateMantissa\":\"The credit rate to set.  Is a fixed point 18 decimal (like Ether).\"}},\"setLiquidityCap(uint256)\":{\"params\":{\"_liquidityCap\":\"The new liquidity cap for the prize pool\"}},\"setPrizeStrategy(address)\":{\"params\":{\"_prizeStrategy\":\"The new prize strategy\"}},\"token()\":{\"details\":\"Returns the address of the underlying ERC20 asset\",\"returns\":{\"_0\":\"The address of the asset\"}},\"tokens()\":{\"returns\":{\"_0\":\"An array of controlled token addresses\"}},\"transferExternalERC20(address,address,uint256)\":{\"details\":\"Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\",\"params\":{\"amount\":\"The amount of external assets to be awarded\",\"externalToken\":\"The address of the external asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"withdrawInstantlyFrom(address,uint256,address,uint256)\":{\"params\":{\"amount\":\"The amount of tokens to redeem for assets.\",\"controlledToken\":\"The address of the token to redeem (i.e. ticket or sponsorship)\",\"from\":\"The address to redeem tokens from.\",\"maximumExitFee\":\"The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\"},\"returns\":{\"_0\":\"The actual exit fee paid\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"VERSION()\":{\"notice\":\"Semver Version\"},\"accountedBalance()\":{\"notice\":\"The total of all controlled tokens\"},\"award(address,uint256,address)\":{\"notice\":\"Called by the prize strategy to award prizes.\"},\"awardBalance()\":{\"notice\":\"Returns the balance that is available to award.\"},\"awardExternalERC20(address,address,uint256)\":{\"notice\":\"Called by the Prize-Strategy to award external ERC20 prizes\"},\"awardExternalERC721(address,address,uint256[])\":{\"notice\":\"Called by the prize strategy to award external ERC721 prizes\"},\"balanceOfCredit(address,address)\":{\"notice\":\"Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\"},\"beforeTokenTransfer(address,address,uint256)\":{\"notice\":\"Updates the Prize Strategy when tokens are transferred between holders.\"},\"calculateEarlyExitFee(address,address,uint256)\":{\"notice\":\"Calculates the early exit fee for the given amount\"},\"calculateReserveFee(uint256)\":{\"notice\":\"Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\"},\"captureAwardBalance()\":{\"notice\":\"Captures any available interest as award balance.\"},\"compLikeDelegate(address,address)\":{\"notice\":\"Delegate the votes for a Compound COMP-like token held by the prize pool\"},\"creditPlanOf(address)\":{\"notice\":\"Returns the credit rate of a controlled token\"},\"depositTo(address,uint256,address,address)\":{\"notice\":\"Deposit assets into the Prize Pool in exchange for tokens\"},\"estimateCreditAccrualTime(address,uint256,uint256)\":{\"notice\":\"Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\"},\"initialize(address,address[],uint256)\":{\"notice\":\"Initializes the Prize Pool\"},\"initialize(address,address[],uint256,address)\":{\"notice\":\"Initializes the Prize Pool and Yield Service with the required contract connections\"},\"onERC721Received(address,address,uint256,bytes)\":{\"notice\":\"Required for ERC721 safe token transfers from smart contracts.\"},\"setCreditPlanOf(address,uint128,uint128)\":{\"notice\":\"Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\"},\"setLiquidityCap(uint256)\":{\"notice\":\"Allows the Governor to set a cap on the amount of liquidity that he pool can hold\"},\"setPrizeStrategy(address)\":{\"notice\":\"Sets the prize strategy of the prize pool.  Only callable by the owner.\"},\"tokens()\":{\"notice\":\"An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\"},\"transferExternalERC20(address,address,uint256)\":{\"notice\":\"Called by the Prize-Strategy to transfer out external ERC20 tokens\"},\"withdrawInstantlyFrom(address,uint256,address,uint256)\":{\"notice\":\"Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/StakePrizePoolHarness.sol\":\"StakePrizePoolHarness\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../external/compound/ICompLike.sol\\\";\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../reserve/ReserveInterface.sol\\\";\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/TokenListenerLibrary.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\nimport \\\"./PrizePoolInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using SafeERC20Upgradeable for IERC721Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    address reserveRegistry,\\n    uint256 maxExitFeeMantissa\\n  );\\n\\n  /// @dev Event emitted when controlled token is added\\n  event ControlledTokenAdded(\\n    ControlledTokenInterface indexed token\\n  );\\n\\n  /// @dev Emitted when reserve is captured.\\n  event ReserveFeeCaptured(\\n    uint256 amount\\n  );\\n\\n  event AwardCaptured(\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when assets are deposited\\n  event Deposited(\\n    address indexed operator,\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount,\\n    address referrer\\n  );\\n\\n  /// @dev Event emitted when interest is awarded to a winner\\n  event Awarded(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are awarded to a winner\\n  event AwardedExternalERC20(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are transferred out\\n  event TransferredExternalERC20(\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC721s are awarded to a winner\\n  event AwardedExternalERC721(\\n    address indexed winner,\\n    address indexed token,\\n    uint256[] tokenIds\\n  );\\n\\n  /// @dev Event emitted when assets are withdrawn instantly\\n  event InstantWithdrawal(\\n    address indexed operator,\\n    address indexed from,\\n    address indexed token,\\n    uint256 amount,\\n    uint256 redeemed,\\n    uint256 exitFee\\n  );\\n\\n  event ReserveWithdrawal(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when the Liquidity Cap is set\\n  event LiquidityCapSet(\\n    uint256 liquidityCap\\n  );\\n\\n  /// @dev Event emitted when the Credit plan is set\\n  event CreditPlanSet(\\n    address token,\\n    uint128 creditLimitMantissa,\\n    uint128 creditRateMantissa\\n  );\\n\\n  /// @dev Event emitted when the Prize Strategy is set\\n  event PrizeStrategySet(\\n    address indexed prizeStrategy\\n  );\\n\\n  /// @dev Emitted when credit is minted\\n  event CreditMinted(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when credit is burned\\n  event CreditBurned(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\\n  event ErrorAwardingExternalERC721(bytes error);\\n\\n\\n  struct CreditPlan {\\n    uint128 creditLimitMantissa;\\n    uint128 creditRateMantissa;\\n  }\\n\\n  struct CreditBalance {\\n    uint192 balance;\\n    uint32 timestamp;\\n    bool initialized;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  /// @dev Reserve to which reserve fees are sent\\n  RegistryInterface public reserveRegistry;\\n\\n  /// @dev An array of all the controlled tokens\\n  ControlledTokenInterface[] internal _tokens;\\n\\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\\n  TokenListenerInterface public prizeStrategy;\\n\\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\\n  /// For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\\n  uint256 public maxExitFeeMantissa;\\n\\n  /// @dev The total funds that have been allocated to the reserve\\n  uint256 public reserveTotalSupply;\\n\\n  /// @dev The total amount of funds that the prize pool can hold.\\n  uint256 public liquidityCap;\\n\\n  /// @dev the The awardable balance\\n  uint256 internal _currentAwardBalance;\\n\\n  /// @dev Stores the credit plan for each token.\\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\\n\\n  /// @dev Stores each users balance of credit per token.\\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\\n\\n  /// @notice Initializes the Prize Pool\\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\\n  /// @param _maxExitFeeMantissa The maximum exit fee size\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_reserveRegistry) != address(0), \\\"PrizePool/reserveRegistry-not-zero\\\");\\n    uint256 controlledTokensLength = _controlledTokens.length;\\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\\n\\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\\n      _addControlledToken(controlledToken, i);\\n    }\\n    __Ownable_init();\\n    __ReentrancyGuard_init();\\n    _setLiquidityCap(uint256(-1));\\n\\n    reserveRegistry = _reserveRegistry;\\n    maxExitFeeMantissa = _maxExitFeeMantissa;\\n\\n    emit Initialized(\\n      address(_reserveRegistry),\\n      maxExitFeeMantissa\\n    );\\n  }\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external override view returns (address) {\\n    return address(_token());\\n  }\\n\\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\\n  /// @return The underlying balance of assets\\n  function balance() external returns (uint256) {\\n    return _balance();\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function canAwardExternal(address _externalToken) external view returns (bool) {\\n    return _canAwardExternal(_externalToken);\\n  }\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    canAddLiquidity(amount)\\n  {\\n    address operator = _msgSender();\\n\\n    _mint(to, amount, controlledToken, referrer);\\n\\n    _token().safeTransferFrom(operator, address(this), amount);\\n    _supply(amount);\\n\\n    emit Deposited(operator, to, controlledToken, amount, referrer);\\n  }\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    returns (uint256)\\n  {\\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n    require(exitFee <= maximumExitFee, \\\"PrizePool/exit-fee-exceeds-user-maximum\\\");\\n\\n    // burn the credit\\n    _burnCredit(from, controlledToken, burnedCredit);\\n\\n    // burn the tickets\\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\\n\\n    // redeem the tickets less the fee\\n    uint256 amountLessFee = amount.sub(exitFee);\\n    uint256 redeemed = _redeem(amountLessFee);\\n\\n    _token().safeTransfer(from, redeemed);\\n\\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\\n\\n    return exitFee;\\n  }\\n\\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\\n  /// @param exitFee The exit fee to check against the limit\\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\\n    if (exitFee > maxFee) {\\n      exitFee = maxFee;\\n    }\\n    return exitFee;\\n  }\\n\\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\\n  /// @param from The address the tokens are being transferred from (0 if minting)\\n  /// @param to The address the tokens are being transferred to (0 if burning)\\n  /// @param amount The amount of tokens being trasferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\\n    if (from != address(0)) {\\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\\n      // first accrue credit for their old balance\\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\\n\\n      if (from != to) {\\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\\n      }\\n\\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\\n    }\\n    if (to != address(0) && to != from) {\\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\\n    }\\n    // if we aren't minting\\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\\n    }\\n  }\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external override view returns (uint256) {\\n    return _currentAwardBalance;\\n  }\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n\\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\\n    uint256 currentBalance = _balance();\\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\\n\\n    if (unaccountedPrizeBalance > 0) {\\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\\n      if (reserveFee > 0) {\\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\\n        emit ReserveFeeCaptured(reserveFee);\\n      }\\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\\n\\n      emit AwardCaptured(unaccountedPrizeBalance);\\n    }\\n\\n    return _currentAwardBalance;\\n  }\\n\\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\\n\\n    uint256 amount = reserveTotalSupply;\\n    reserveTotalSupply = 0;\\n    uint256 redeemed = _redeem(amount);\\n\\n    _token().safeTransfer(address(to), redeemed);\\n\\n    emit ReserveWithdrawal(to, amount);\\n\\n    return redeemed;\\n  }\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external override\\n    onlyPrizeStrategy\\n    onlyControlledToken(controlledToken)\\n  {\\n    if (amount == 0) {\\n      return;\\n    }\\n\\n    require(amount <= _currentAwardBalance, \\\"PrizePool/award-exceeds-avail\\\");\\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\\n\\n    _mint(to, amount, controlledToken, address(0));\\n\\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\\n\\n    emit Awarded(to, controlledToken, amount);\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit TransferredExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit AwardedExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  function _transferOut(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (bool)\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (amount == 0) {\\n      return false;\\n    }\\n\\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\\n\\n    return true;\\n  }\\n\\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\\n  /// @param to The user who is receiving the tokens\\n  /// @param amount The amount of tokens they are receiving\\n  /// @param controlledToken The token that is going to be minted\\n  /// @param referrer The user who referred the minting\\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\\n    if (address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n    ControlledToken(controlledToken).controllerMint(to, amount);\\n  }\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (tokenIds.length == 0) {\\n      return;\\n    }\\n\\n    for (uint256 i = 0; i < tokenIds.length; i++) {\\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\\n\\n      }\\n      catch(bytes memory error){\\n        emit ErrorAwardingExternalERC721(error);\\n      }\\n      \\n    }\\n\\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\\n  }\\n\\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\\n  /// @param amount The prize amount\\n  /// @return The size of the reserve portion of the prize\\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    if (address(reserve) == address(0)) {\\n      return 0;\\n    }\\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\\n    if (reserveRateMantissa == 0) {\\n      return 0;\\n    }\\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\\n  }\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external override\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    )\\n  {\\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n  }\\n\\n  /// @dev Calculates the early exit fee for the given amount\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return Exit fee\\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\\n    return _limitExitFee(\\n      amount,\\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external override\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    durationSeconds =_estimateCreditAccrualTime(\\n      _controlledToken,\\n      _principal,\\n      _interest\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function _estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    internal\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    // interest = credit rate * principal * time\\n    // => time = interest / (credit rate * principal)\\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\\n    if (accruedPerSecond == 0) {\\n      return 0;\\n    }\\n    return _interest.div(accruedPerSecond);\\n  }\\n\\n  /// @notice Burns a users credit.\\n  /// @param user The user whose credit should be burned\\n  /// @param credit The amount of credit to burn\\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\\n\\n    emit CreditBurned(user, controlledToken, credit);\\n  }\\n\\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\\n  /// @param user The user for whom to accrue credit\\n  /// @param controlledToken The controlled token whose balance we are checking\\n  /// @param controlledTokenBalance The balance to use for the user\\n  /// @param extra Additional credit to be added\\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\\n    _updateCreditBalance(\\n      user,\\n      controlledToken,\\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\\n    );\\n  }\\n\\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\\n    uint256 newBalance;\\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\\n    if (!creditBalance.initialized) {\\n      newBalance = 0;\\n    } else {\\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\\n    }\\n    return newBalance;\\n  }\\n\\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\\n\\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\\n      balance: newBalance.toUint128(),\\n      timestamp: _currentTime().toUint32(),\\n      initialized: true\\n    });\\n\\n    if (oldBalance < newBalance) {\\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\\n    } \\n    else if (newBalance < oldBalance) {\\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\\n    }\\n  }\\n\\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\\n  /// @param creditBalance The new credit balance to be checked\\n  /// @return The users new credit balance.  Will not exceed the credit limit.\\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\\n      controlledTokenBalance,\\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\\n    );\\n    if (creditBalance > creditLimit) {\\n      creditBalance = creditLimit;\\n    }\\n\\n    return creditBalance;\\n  }\\n\\n  /// @notice Calculates the accrued interest for a user\\n  /// @param user The user whose credit should be calculated.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\\n  /// @return The credit that has accrued since the last credit update.\\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\\n\\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\\n      return 0;\\n    }\\n\\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\\n  }\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\\n    return _tokenCreditBalances[controlledToken][user].balance;\\n  }\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external override\\n    onlyControlledToken(_controlledToken)\\n    onlyOwner\\n  {\\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\\n      creditLimitMantissa: _creditLimitMantissa,\\n      creditRateMantissa: _creditRateMantissa\\n    });\\n\\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\\n  }\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external override\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    )\\n  {\\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\\n  }\\n\\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The token they are withdrawing\\n  /// @param amount The amount of funds they are withdrawing\\n  /// @return earlyExitFee The additional exit fee that should be charged.\\n  /// @return creditBurned The amount of credit that will be burned\\n  function _calculateEarlyExitFeeLessBurnedCredit(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (\\n      uint256 earlyExitFee,\\n      uint256 creditBurned\\n    )\\n  {\\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\\n    require(controlledTokenBalance >= amount, \\\"PrizePool/insuff-funds\\\");\\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\\n    /*\\n    The credit is used *last*.  Always charge the fees up-front.\\n\\n    How to calculate:\\n\\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\\n\\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\\n    */\\n\\n    // Determine available usable credit based on withdraw amount\\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\\n\\n    uint256 availableCredit;\\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\\n    }\\n\\n    // Determine amount of credit to burn and amount of fees required\\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\\n    earlyExitFee = totalExitFee.sub(creditBurned);\\n  }\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\\n    _setLiquidityCap(_liquidityCap);\\n  }\\n\\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\\n    liquidityCap = _liquidityCap;\\n    emit LiquidityCapSet(_liquidityCap);\\n  }\\n\\n  /// @notice Adds a new controlled token\\n  /// @param _controlledToken The controlled token to add.\\n  /// @param index The index to add the controlledToken\\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\\n    require(_controlledToken.controller() == this, \\\"PrizePool/token-ctrlr-mismatch\\\");\\n    \\n    _tokens[index] = _controlledToken;\\n    emit ControlledTokenAdded(_controlledToken);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\\n    _setPrizeStrategy(_prizeStrategy);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\\n    require(address(_prizeStrategy) != address(0), \\\"PrizePool/prizeStrategy-not-zero\\\");\\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PrizePool/prizeStrategy-invalid\\\");\\n    prizeStrategy = _prizeStrategy;\\n\\n    emit PrizeStrategySet(address(_prizeStrategy));\\n  }\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\\n    return _tokens;\\n  }\\n\\n  /// @dev Gets the current time as represented by the current block\\n  /// @return The timestamp of the current block\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external override view returns (uint256) {\\n    return _tokenTotalSupply();\\n  }\\n\\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\\n  /// @param to The address to delegate to \\n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\\n    if (compLike.balanceOf(address(this)) > 0) {\\n      compLike.delegate(to);\\n    }\\n  }\\n  \\n  /// @notice Required for ERC721 safe token transfers from smart contracts.\\n  /// @param operator The address that acts on behalf of the owner\\n  /// @param from The current owner of the NFT\\n  /// @param tokenId The NFT to transfer\\n  /// @param data Additional data with no specified format, sent in call to `_to`.\\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function _tokenTotalSupply() internal view returns (uint256) {\\n    uint256 total = reserveTotalSupply;\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \\n    uint256 tokensLength = tokens.length;\\n    \\n    for(uint256 i = 0; i < tokensLength; i++){\\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\\n    }\\n\\n    return total;\\n  }\\n\\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\\n  }\\n\\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\\n    uint256 tokensLength = tokens.length;\\n\\n    for(uint256 i = 0; i < tokensLength; i++) {\\n      if(tokens[i] == controlledToken) return true;\\n    }\\n    return false;\\n  }\\n  \\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\\n    return _isControlled(controlledToken);\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function _token() internal virtual view returns (IERC20Upgradeable);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal virtual returns (uint256);\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal virtual;\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\\n\\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  modifier onlyControlledToken(address controlledToken) {\\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \\\"PrizePool/unknown-token\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure caller is the prize-strategy\\n  modifier onlyPrizeStrategy() {\\n    require(_msgSender() == address(prizeStrategy), \\\"PrizePool/only-prizeStrategy\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\\n  modifier canAddLiquidity(uint256 _amount) {\\n    require(_canAddLiquidity(_amount), \\\"PrizePool/exceeds-liquidity-cap\\\");\\n    _;\\n  }\\n\\n  modifier onlyReserve() {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    require(address(reserve) == msg.sender, \\\"PrizePool/only-reserve\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x386ebc1c80ab4424f14125e716dd12641ff933b475bf1082b7b1a6eee4a969c3\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/stake/StakePrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"../PrizePool.sol\\\";\\n\\ncontract StakePrizePool is PrizePool {\\n\\n  IERC20Upgradeable private stakeToken;\\n\\n  event StakePrizePoolInitialized(address indexed stakeToken);\\n\\n  /// @notice Initializes the Prize Pool and Yield Service with the required contract connections\\n  /// @param _controlledTokens Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\\n  /// @param _maxExitFeeMantissa The maximum exit fee size, relative to the withdrawal amount\\n  /// @param _stakeToken Address of the stake token\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa,\\n    IERC20Upgradeable _stakeToken\\n  )\\n    public\\n    initializer\\n  {\\n    PrizePool.initialize(\\n      _reserveRegistry,\\n      _controlledTokens,\\n      _maxExitFeeMantissa\\n    );\\n\\n    require(address(_stakeToken) != address(0), \\\"StakePrizePool/stake-token-not-zero-address\\\");\\n    stakeToken = _stakeToken;\\n\\n    emit StakePrizePoolInitialized(address(stakeToken));\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal override view returns (bool) {\\n    return address(stakeToken) != _externalToken;\\n  }\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal override returns (uint256) {\\n    return stakeToken.balanceOf(address(this));\\n  }\\n\\n  function _token() internal override view returns (IERC20Upgradeable) {\\n    return stakeToken;\\n  }\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal override {\\n    // no-op because nothing else needs to be done\\n  }\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal override returns (uint256) {\\n    return redeemAmount;\\n  }\\n}\\n\",\"keccak256\":\"0x3410ac3873521a451484e54c6319be3042f2d92da8030511403f192edb3f5798\",\"license\":\"GPL-3.0\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/test/StakePrizePoolHarness.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"../prize-pool/stake/StakePrizePool.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ncontract StakePrizePoolHarness is StakePrizePool {\\n\\n  uint256 public currentTime;\\n\\n  function setCurrentTime(uint256 _currentTime) external {\\n    currentTime = _currentTime;\\n  }\\n\\n  function _currentTime() internal override view returns (uint256) {\\n    return currentTime;\\n  }\\n\\n  function supply(uint256 mintAmount) external {\\n    //_supply(mintAmount);\\n  }\\n\\n  function redeem(uint256 redeemAmount) external returns (uint256) {\\n    return redeemAmount;\\n  }\\n}\",\"keccak256\":\"0x7975faa4daca38cda37956f7bbf0fdbf012c6a87399d0dedaf8377f97f950640\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/test/StakePrizePoolHarness.sol:StakePrizePoolHarness",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/test/StakePrizePoolHarness.sol:StakePrizePoolHarness",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/test/StakePrizePoolHarness.sol:StakePrizePoolHarness",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 10,
                "contract": "contracts/test/StakePrizePoolHarness.sol:StakePrizePoolHarness",
                "label": "_owner",
                "offset": 0,
                "slot": "51",
                "type": "t_address"
              },
              {
                "astId": 129,
                "contract": "contracts/test/StakePrizePoolHarness.sol:StakePrizePoolHarness",
                "label": "__gap",
                "offset": 0,
                "slot": "52",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 4743,
                "contract": "contracts/test/StakePrizePoolHarness.sol:StakePrizePoolHarness",
                "label": "_status",
                "offset": 0,
                "slot": "101",
                "type": "t_uint256"
              },
              {
                "astId": 4786,
                "contract": "contracts/test/StakePrizePoolHarness.sol:StakePrizePoolHarness",
                "label": "__gap",
                "offset": 0,
                "slot": "102",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 6817,
                "contract": "contracts/test/StakePrizePoolHarness.sol:StakePrizePoolHarness",
                "label": "reserveRegistry",
                "offset": 0,
                "slot": "151",
                "type": "t_contract(RegistryInterface)12458"
              },
              {
                "astId": 6821,
                "contract": "contracts/test/StakePrizePoolHarness.sol:StakePrizePoolHarness",
                "label": "_tokens",
                "offset": 0,
                "slot": "152",
                "type": "t_array(t_contract(ControlledTokenInterface)15850)dyn_storage"
              },
              {
                "astId": 6824,
                "contract": "contracts/test/StakePrizePoolHarness.sol:StakePrizePoolHarness",
                "label": "prizeStrategy",
                "offset": 0,
                "slot": "153",
                "type": "t_contract(TokenListenerInterface)16265"
              },
              {
                "astId": 6827,
                "contract": "contracts/test/StakePrizePoolHarness.sol:StakePrizePoolHarness",
                "label": "maxExitFeeMantissa",
                "offset": 0,
                "slot": "154",
                "type": "t_uint256"
              },
              {
                "astId": 6830,
                "contract": "contracts/test/StakePrizePoolHarness.sol:StakePrizePoolHarness",
                "label": "reserveTotalSupply",
                "offset": 0,
                "slot": "155",
                "type": "t_uint256"
              },
              {
                "astId": 6833,
                "contract": "contracts/test/StakePrizePoolHarness.sol:StakePrizePoolHarness",
                "label": "liquidityCap",
                "offset": 0,
                "slot": "156",
                "type": "t_uint256"
              },
              {
                "astId": 6836,
                "contract": "contracts/test/StakePrizePoolHarness.sol:StakePrizePoolHarness",
                "label": "_currentAwardBalance",
                "offset": 0,
                "slot": "157",
                "type": "t_uint256"
              },
              {
                "astId": 6841,
                "contract": "contracts/test/StakePrizePoolHarness.sol:StakePrizePoolHarness",
                "label": "_tokenCreditPlans",
                "offset": 0,
                "slot": "158",
                "type": "t_mapping(t_address,t_struct(CreditPlan)6803_storage)"
              },
              {
                "astId": 6848,
                "contract": "contracts/test/StakePrizePoolHarness.sol:StakePrizePoolHarness",
                "label": "_tokenCreditBalances",
                "offset": 0,
                "slot": "159",
                "type": "t_mapping(t_address,t_mapping(t_address,t_struct(CreditBalance)6810_storage))"
              },
              {
                "astId": 9163,
                "contract": "contracts/test/StakePrizePoolHarness.sol:StakePrizePoolHarness",
                "label": "stakeToken",
                "offset": 0,
                "slot": "160",
                "type": "t_contract(IERC20Upgradeable)1960"
              },
              {
                "astId": 14700,
                "contract": "contracts/test/StakePrizePoolHarness.sol:StakePrizePoolHarness",
                "label": "currentTime",
                "offset": 0,
                "slot": "161",
                "type": "t_uint256"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_contract(ControlledTokenInterface)15850)dyn_storage": {
                "base": "t_contract(ControlledTokenInterface)15850",
                "encoding": "dynamic_array",
                "label": "contract ControlledTokenInterface[]",
                "numberOfBytes": "32"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_contract(ControlledTokenInterface)15850": {
                "encoding": "inplace",
                "label": "contract ControlledTokenInterface",
                "numberOfBytes": "20"
              },
              "t_contract(IERC20Upgradeable)1960": {
                "encoding": "inplace",
                "label": "contract IERC20Upgradeable",
                "numberOfBytes": "20"
              },
              "t_contract(RegistryInterface)12458": {
                "encoding": "inplace",
                "label": "contract RegistryInterface",
                "numberOfBytes": "20"
              },
              "t_contract(TokenListenerInterface)16265": {
                "encoding": "inplace",
                "label": "contract TokenListenerInterface",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_mapping(t_address,t_struct(CreditBalance)6810_storage))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => struct PrizePool.CreditBalance))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_struct(CreditBalance)6810_storage)"
              },
              "t_mapping(t_address,t_struct(CreditBalance)6810_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct PrizePool.CreditBalance)",
                "numberOfBytes": "32",
                "value": "t_struct(CreditBalance)6810_storage"
              },
              "t_mapping(t_address,t_struct(CreditPlan)6803_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct PrizePool.CreditPlan)",
                "numberOfBytes": "32",
                "value": "t_struct(CreditPlan)6803_storage"
              },
              "t_struct(CreditBalance)6810_storage": {
                "encoding": "inplace",
                "label": "struct PrizePool.CreditBalance",
                "members": [
                  {
                    "astId": 6805,
                    "contract": "contracts/test/StakePrizePoolHarness.sol:StakePrizePoolHarness",
                    "label": "balance",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint192"
                  },
                  {
                    "astId": 6807,
                    "contract": "contracts/test/StakePrizePoolHarness.sol:StakePrizePoolHarness",
                    "label": "timestamp",
                    "offset": 24,
                    "slot": "0",
                    "type": "t_uint32"
                  },
                  {
                    "astId": 6809,
                    "contract": "contracts/test/StakePrizePoolHarness.sol:StakePrizePoolHarness",
                    "label": "initialized",
                    "offset": 28,
                    "slot": "0",
                    "type": "t_bool"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_struct(CreditPlan)6803_storage": {
                "encoding": "inplace",
                "label": "struct PrizePool.CreditPlan",
                "members": [
                  {
                    "astId": 6800,
                    "contract": "contracts/test/StakePrizePoolHarness.sol:StakePrizePoolHarness",
                    "label": "creditLimitMantissa",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint128"
                  },
                  {
                    "astId": 6802,
                    "contract": "contracts/test/StakePrizePoolHarness.sol:StakePrizePoolHarness",
                    "label": "creditRateMantissa",
                    "offset": 16,
                    "slot": "0",
                    "type": "t_uint128"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_uint128": {
                "encoding": "inplace",
                "label": "uint128",
                "numberOfBytes": "16"
              },
              "t_uint192": {
                "encoding": "inplace",
                "label": "uint192",
                "numberOfBytes": "24"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint32": {
                "encoding": "inplace",
                "label": "uint32",
                "numberOfBytes": "4"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "VERSION()": {
                "notice": "Semver Version"
              },
              "accountedBalance()": {
                "notice": "The total of all controlled tokens"
              },
              "award(address,uint256,address)": {
                "notice": "Called by the prize strategy to award prizes."
              },
              "awardBalance()": {
                "notice": "Returns the balance that is available to award."
              },
              "awardExternalERC20(address,address,uint256)": {
                "notice": "Called by the Prize-Strategy to award external ERC20 prizes"
              },
              "awardExternalERC721(address,address,uint256[])": {
                "notice": "Called by the prize strategy to award external ERC721 prizes"
              },
              "balanceOfCredit(address,address)": {
                "notice": "Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit."
              },
              "beforeTokenTransfer(address,address,uint256)": {
                "notice": "Updates the Prize Strategy when tokens are transferred between holders."
              },
              "calculateEarlyExitFee(address,address,uint256)": {
                "notice": "Calculates the early exit fee for the given amount"
              },
              "calculateReserveFee(uint256)": {
                "notice": "Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero."
              },
              "captureAwardBalance()": {
                "notice": "Captures any available interest as award balance."
              },
              "compLikeDelegate(address,address)": {
                "notice": "Delegate the votes for a Compound COMP-like token held by the prize pool"
              },
              "creditPlanOf(address)": {
                "notice": "Returns the credit rate of a controlled token"
              },
              "depositTo(address,uint256,address,address)": {
                "notice": "Deposit assets into the Prize Pool in exchange for tokens"
              },
              "estimateCreditAccrualTime(address,uint256,uint256)": {
                "notice": "Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit."
              },
              "initialize(address,address[],uint256)": {
                "notice": "Initializes the Prize Pool"
              },
              "initialize(address,address[],uint256,address)": {
                "notice": "Initializes the Prize Pool and Yield Service with the required contract connections"
              },
              "onERC721Received(address,address,uint256,bytes)": {
                "notice": "Required for ERC721 safe token transfers from smart contracts."
              },
              "setCreditPlanOf(address,uint128,uint128)": {
                "notice": "Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether)."
              },
              "setLiquidityCap(uint256)": {
                "notice": "Allows the Governor to set a cap on the amount of liquidity that he pool can hold"
              },
              "setPrizeStrategy(address)": {
                "notice": "Sets the prize strategy of the prize pool.  Only callable by the owner."
              },
              "tokens()": {
                "notice": "An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)"
              },
              "transferExternalERC20(address,address,uint256)": {
                "notice": "Called by the Prize-Strategy to transfer out external ERC20 tokens"
              },
              "withdrawInstantlyFrom(address,uint256,address,uint256)": {
                "notice": "Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit."
              }
            },
            "version": 1
          }
        }
      },
      "contracts/test/StakePrizePoolHarnessProxyFactory.sol": {
        "StakePrizePoolHarnessProxyFactory": {
          "abi": [
            {
              "inputs": [],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "name": "ProxyCreated",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "create",
              "outputs": [
                {
                  "internalType": "contract StakePrizePoolHarness",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_logic",
                  "type": "address"
                },
                {
                  "internalType": "bytes",
                  "name": "_data",
                  "type": "bytes"
                }
              ],
              "name": "deployMinimal",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "instance",
              "outputs": [
                {
                  "internalType": "contract StakePrizePoolHarness",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "create()": {
                "returns": {
                  "_0": "A reference to the new proxied Stake Prize Pool"
                }
              }
            },
            "title": "Stake Prize Pool Proxy Factory",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5060405161001d9061005f565b604051809103906000f080158015610039573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b039290921691909117905561006c565b6140c9806103b283390190565b6103378061007b6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063022ec09514610046578063b3eeb5e21461006a578063efc81a8c14610120575b600080fd5b61004e610128565b604080516001600160a01b039092168252519081900360200190f35b61004e6004803603604081101561008057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100ab57600080fd5b8201836020820111156100bd57600080fd5b803590602001918460018302840111640100000000831117156100df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610137945050505050565b61004e6102b3565b6000546001600160a01b031681565b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a18251156102ac576000826001600160a01b0316846040518082805190602001908083835b602083106102035780518252601f1990920191602091820191016101e4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610265576040519150601f19603f3d011682016040523d82523d6000602084013e61026a565b606091505b50509050806102aa5760405162461bcd60e51b81526004018080602001828103825260248152602001806102de6024913960400191505060405180910390fd5b505b5092915050565b6000805460408051602081019091528281526102d8916001600160a01b031690610137565b90509056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a26469706673582212201f42cac44f5113f7207f7541c56f8fea8fe63c33dcfeda7f77b16fe819056f2764736f6c634300060c0033608060405234801561001057600080fd5b506140a9806100206000396000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c8063888c2b6f11610146578063b69ef8a8116100c3578063e323f82511610087578063e323f82514610992578063e6d8a94b146109ce578063edb4e1cf146109d6578063f2fde38b146109de578063fc0c546a14610a04578063ffa1ad7414610a0c57610253565b8063b69ef8a814610851578063c587148514610859578063d18e81b314610918578063d4a1361d14610920578063db006a751461097557610253565b80639d63848a1161010a5780639d63848a1461075d5780639e167519146107b55780639fe32a91146107bd578063a016240b146107da578063a7b2cc311461081457610253565b8063888c2b6f146106b45780638da5cb5b146107035780638e71c1f61461072757806391ca480e1461072f57806398bf3eb61461075557610253565b806352a387ab116101d457806376687d3d1161019857806376687d3d1461060157806378b3d3271461060957806379cb85631461062f5780637b99adb1146106615780637cbab1c71461067e57610253565b806352a387ab1461055b578063630665b4146105815780636a3fd4f9146105895780636b1b863a146105c3578063715018a6146105f957610253565b80632b0ab1441161021b5780632b0ab144146103f95780632f7627e31461042f578063354030231461045d5780633ede50c61461047a578063494de9f71461052d57610253565b80630937eb541461025857806313f55e3914610272578063150b7a02146102aa57806316960d551461035557806322f8e566146103dc575b600080fd5b610260610a89565b60408051918252519081900360200190f35b6102a86004803603606081101561028857600080fd5b506001600160a01b03813581169160208101359091169060400135610a98565b005b610338600480360360808110156102c057600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156102fa57600080fd5b82018360208201111561030c57600080fd5b803590602001918460018302840111600160201b8311171561032d57600080fd5b509092509050610b56565b604080516001600160e01b03199092168252519081900360200190f35b6102a86004803603606081101561036b57600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561039e57600080fd5b8201836020820111156103b057600080fd5b803590602001918460208302840111600160201b831117156103d157600080fd5b509092509050610b67565b6102a8600480360360208110156103f257600080fd5b5035610e14565b6102a86004803603606081101561040f57600080fd5b506001600160a01b03813581169160208101359091169060400135610e19565b6102a86004803603604081101561044557600080fd5b506001600160a01b0381358116916020013516610ed6565b6102a86004803603602081101561047357600080fd5b5035611025565b6102a86004803603606081101561049057600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156104ba57600080fd5b8201836020820111156104cc57600080fd5b803590602001918460208302840111600160201b831117156104ed57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611028915050565b6102606004803603604081101561054357600080fd5b506001600160a01b038135811691602001351661121a565b6102606004803603602081101561057157600080fd5b50356001600160a01b0316611321565b610260611470565b6105af6004803603602081101561059f57600080fd5b50356001600160a01b0316611476565b604080519115158252519081900360200190f35b6102a8600480360360608110156105d957600080fd5b506001600160a01b03813581169160208101359160409091013516611489565b6102a8611691565b61026061173d565b6105af6004803603602081101561061f57600080fd5b50356001600160a01b0316611743565b6102606004803603606081101561064557600080fd5b506001600160a01b03813516906020810135906040013561174e565b6102a86004803603602081101561067757600080fd5b5035611763565b6102a86004803603606081101561069457600080fd5b506001600160a01b038135811691602081013590911690604001356117ce565b6106ea600480360360608110156106ca57600080fd5b506001600160a01b03813581169160208101359091169060400135611a1a565b6040805192835260208301919091528051918290030190f35b61070b611a34565b604080516001600160a01b039092168252519081900360200190f35b61070b611a43565b6102a86004803603602081101561074557600080fd5b50356001600160a01b0316611a52565b61070b611abd565b610765611acc565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156107a1578181015183820152602001610789565b505050509050019250505060405180910390f35b610260611b2e565b610260600480360360208110156107d357600080fd5b5035611b34565b610260600480360360808110156107f057600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611c62565b6102a86004803603606081101561082a57600080fd5b506001600160a01b03813516906001600160801b0360208201358116916040013516611e99565b610260611fef565b6102a86004803603608081101561086f57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561089957600080fd5b8201836020820111156108ab57600080fd5b803590602001918460208302840111600160201b831117156108cc57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602001356001600160a01b0316611ff9565b61026061213c565b6109466004803603602081101561093657600080fd5b50356001600160a01b0316612142565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b6102606004803603602081101561098b57600080fd5b5035612172565b6102a8600480360360808110156109a857600080fd5b506001600160a01b03813581169160208101359160408201358116916060013516612175565b61026061232a565b6102606124a0565b6102a8600480360360208110156109f457600080fd5b50356001600160a01b03166124a6565b61070b6125a9565b610a146125b3565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610a4e578181015183820152602001610a36565b50505050905090810190601f168015610a7b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610a936125d4565b905090565b6099546001600160a01b0316610aac6126df565b6001600160a01b031614610af5576040805162461bcd60e51b815260206004820152601c6024820152600080516020614054833981519152604482015290519081900360640190fd5b610b008383836126e3565b15610b5157816001600160a01b0316836001600160a01b03167fb0bac59718cd343c80a813518afcf36846cfcfe6d56e2b3cab9bd49f5f9b251c836040518082815260200191505060405180910390a35b505050565b630a85bd0160e11b95945050505050565b6099546001600160a01b0316610b7b6126df565b6001600160a01b031614610bc4576040805162461bcd60e51b815260206004820152601c6024820152600080516020614054833981519152604482015290519081900360640190fd5b610bcd8361276b565b610c1e576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b80610c2857610e0e565b60005b81811015610d9557836001600160a01b03166342842e0e3087868686818110610c5057fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610cad57600080fd5b505af1925050508015610cbe575060015b610d8d573d808015610cec576040519150601f19603f3d011682016040523d82523d6000602084013e610cf1565b606091505b507f17e975018310f88872b58d4d8263adca83cf5c1893496ea2a86923dab15276ad816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d51578181015183820152602001610d39565b50505050905090810190601f168015610d7e5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1505b600101610c2b565b50826001600160a01b0316846001600160a01b03167f69c2de32bc4d47f488e72626a6cfdee85089342e52675e7de79c4b417623960c848460405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a35b50505050565b60a155565b6099546001600160a01b0316610e2d6126df565b6001600160a01b031614610e76576040805162461bcd60e51b815260206004820152601c6024820152600080516020614054833981519152604482015290519081900360640190fd5b610e818383836126e3565b15610b5157816001600160a01b0316836001600160a01b03167fc65f48aca3b7a99b7443d04b8ffbb073156179bc628dc3f7def5047748973469836040518082815260200191505060405180910390a3505050565b610ede6126df565b6001600160a01b0316610eef611a34565b6001600160a01b031614610f38576040805162461bcd60e51b81526020600482018190526024820152600080516020613f72833981519152604482015290519081900360640190fd5b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f8757600080fd5b505afa158015610f9b573d6000803e3d6000fd5b505050506040513d6020811015610fb157600080fd5b5051111561102157816001600160a01b0316635c19a95c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561100857600080fd5b505af115801561101c573d6000803e3d6000fd5b505050505b5050565b50565b600054610100900460ff16806110415750611041612780565b8061104f575060005460ff16155b61108a5760405162461bcd60e51b815260040180806020018281038252602e815260200180613f23602e913960400191505060405180910390fd5b600054610100900460ff161580156110b5576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0384166110fa5760405162461bcd60e51b8152600401808060200182810382526022815260200180613edb6022913960400191505060405180910390fd5b82518067ffffffffffffffff8111801561111357600080fd5b5060405190808252806020026020018201604052801561113d578160200160208202803683370190505b50805161115291609891602090910190613e12565b5060005b8181101561118957600085828151811061116c57fe5b602002602001015190506111808183612791565b50600101611156565b506111926128bc565b61119a61296d565b6111a5600019612a02565b609780546001600160a01b0319166001600160a01b038716908117909155609a849055604080519182526020820185905280517f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce799281900390910190a1508015610e0e576000805461ff001916905550505050565b60008161122681612a3d565b611265576040805162461bcd60e51b81526020600482015260176024820152600080516020613fb9833981519152604482015290519081900360640190fd5b6112ea8484856001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112b757600080fd5b505afa1580156112cb573d6000803e3d6000fd5b505050506040513d60208110156112e157600080fd5b50516000612af9565b50506001600160a01b039081166000908152609f60209081526040808320949093168252929092529020546001600160c01b031690565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561137257600080fd5b505afa158015611386573d6000803e3d6000fd5b505050506040513d602081101561139c57600080fd5b505190506001600160a01b03811633146113f6576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f6f6e6c792d7265736572766560501b604482015290519081900360640190fd5b609b80546000918290559061140a82612172565b90506114298582611419612b0f565b6001600160a01b03169190612b1e565b6040805183815290516001600160a01b038716917f1c71c8e11fd443227c8f8d3dc1a237a3a5e8310b540c7fbcf5169754aedf42c9919081900360200190a2949350505050565b609d5490565b60006114818261276b565b90505b919050565b6099546001600160a01b031661149d6126df565b6001600160a01b0316146114e6576040805162461bcd60e51b815260206004820152601c6024820152600080516020614054833981519152604482015290519081900360640190fd5b806114f081612a3d565b61152f576040805162461bcd60e51b81526020600482015260176024820152600080516020613fb9833981519152604482015290519081900360640190fd5b8261153957610e0e565b609d54831115611590576040805162461bcd60e51b815260206004820152601d60248201527f5072697a65506f6f6c2f61776172642d657863656564732d617661696c000000604482015290519081900360640190fd5b609d5461159d9084612b70565b609d556115ad8484846000612bd2565b60006115b98385612cb8565b905061163f8584856001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561160d57600080fd5b505afa158015611621573d6000803e3d6000fd5b505050506040513d602081101561163757600080fd5b505184612af9565b826001600160a01b0316856001600160a01b03167fe2554529d99ab7a67db6b4cea2b32c7d55ae325f958861e05f304fdded867e31866040518082815260200191505060405180910390a35050505050565b6116996126df565b6001600160a01b03166116aa611a34565b6001600160a01b0316146116f3576040805162461bcd60e51b81526020600482018190526024820152600080516020613f72833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b609c5481565b600061148182612a3d565b600061175b848484612cf0565b949350505050565b61176b6126df565b6001600160a01b031661177c611a34565b6001600160a01b0316146117c5576040805162461bcd60e51b81526020600482018190526024820152600080516020613f72833981519152604482015290519081900360640190fd5b61102581612a02565b336117d881612a3d565b611817576040805162461bcd60e51b81526020600482015260176024820152600080516020613fb9833981519152604482015290519081900360640190fd5b6001600160a01b038416156118f1576000336001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561187557600080fd5b505afa158015611889573d6000803e3d6000fd5b505050506040513d602081101561189f57600080fd5b5051905060006118b186338484612d4a565b9050846001600160a01b0316866001600160a01b0316146118e3576118e0336118da8487612b70565b83612dd9565b90505b6118ee863383612e1f565b50505b6001600160a01b0383161580159061191b5750836001600160a01b0316836001600160a01b031614155b15611972576119728333336001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112b757600080fd5b6001600160a01b0384161580159061199457506099546001600160a01b031615155b15610e0e576099546040805163b221095760e01b81526001600160a01b0387811660048301528681166024830152604482018690523360648301529151919092169163b221095791608480830192600092919082900301818387803b1580156119fc57600080fd5b505af1158015611a10573d6000803e3d6000fd5b5050505050505050565b600080611a28858585612fbd565b90969095509350505050565b6033546001600160a01b031690565b6097546001600160a01b031681565b611a5a6126df565b6001600160a01b0316611a6b611a34565b6001600160a01b031614611ab4576040805162461bcd60e51b81526020600482018190526024820152600080516020613f72833981519152604482015290519081900360640190fd5b6110258161315b565b6099546001600160a01b031681565b60606098805480602002602001604051908101604052809291908181526020018280548015611b2457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b06575b5050505050905090565b609a5481565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b8557600080fd5b505afa158015611b99573d6000803e3d6000fd5b505050506040513d6020811015611baf57600080fd5b505190506001600160a01b038116611bcb576000915050611484565b6000816001600160a01b031663010dfa58306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611c1a57600080fd5b505afa158015611c2e573d6000803e3d6000fd5b505050506040513d6020811015611c4457600080fd5b5051905080611c5857600092505050611484565b61175b848261326e565b600060026065541415611cbc576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655582611ccb81612a3d565b611d0a576040805162461bcd60e51b81526020600482015260176024820152600080516020613fb9833981519152604482015290519081900360640190fd5b600080611d18888789612fbd565b9150915084821115611d5b5760405162461bcd60e51b8152600401808060200182810382526027815260200180613f926027913960400191505060405180910390fd5b611d6688878361328f565b856001600160a01b031663631b5dfb611d7d6126df565b8a8a6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611dd557600080fd5b505af1158015611de9573d6000803e3d6000fd5b505050506000611e028389612b7090919063ffffffff16565b90506000611e0f82612172565b9050611e1e8a82611419612b0f565b876001600160a01b03168a6001600160a01b0316611e3a6126df565b604080518d81526020810186905280820189905290516001600160a01b0392909216917f0271704a58fd2953e49b87d67a0a3ce28a58147de98a5457f60b4686f63850309181900360600190a450506001606555509695505050505050565b82611ea381612a3d565b611ee2576040805162461bcd60e51b81526020600482015260176024820152600080516020613fb9833981519152604482015290519081900360640190fd5b611eea6126df565b6001600160a01b0316611efb611a34565b6001600160a01b031614611f44576040805162461bcd60e51b81526020600482018190526024820152600080516020613f72833981519152604482015290519081900360640190fd5b6040805180820182526001600160801b0380851680835286821660208085018281526001600160a01b038b166000818152609e84528890209651875492518716600160801b029087166fffffffffffffffffffffffffffffffff1990931692909217909516179094558451928352928201528083019190915290517ffb0ba2cf86a2b03bcf387753a2192da80a006afa99dd022bb301c78e323bf1b99181900360600190a150505050565b6000610a93613350565b600054610100900460ff16806120125750612012612780565b80612020575060005460ff16155b61205b5760405162461bcd60e51b815260040180806020018281038252602e815260200180613f23602e913960400191505060405180910390fd5b600054610100900460ff16158015612086576000805460ff1961ff0019909116610100171660011790555b612091858585611028565b6001600160a01b0382166120d65760405162461bcd60e51b815260040180806020018281038252602b815260200180614029602b913960400191505060405180910390fd5b60a080546001600160a01b0319166001600160a01b0384811691909117918290556040519116907fa81053747b04e643171034e5426f6deebb058fc29dfe032e33345a109224b31b90600090a28015612135576000805461ff00191690555b5050505050565b60a15481565b6001600160a01b03166000908152609e60205260409020546001600160801b0380821692600160801b9092041690565b90565b600260655414156121cd576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002606555816121dc81612a3d565b61221b576040805162461bcd60e51b81526020600482015260176024820152600080516020613fb9833981519152604482015290519081900360640190fd5b83612225816133cc565b612276576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f657863656564732d6c69717569646974792d63617000604482015290519081900360640190fd5b60006122806126df565b905061228e87878787612bd2565b6122ad81308861229c612b0f565b6001600160a01b03169291906133f0565b6122b686611025565b846001600160a01b0316876001600160a01b0316826001600160a01b03167f6ce569498e0f86f147466ac49211cb2a1ffe06195adb805e383b3f2365109160898860405180838152602001826001600160a01b031681526020019250505060405180910390a4505060016065555050505050565b600060026065541415612384576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655560006123936125d4565b9050600061239f613350565b905060008282116123b15760006123bb565b6123bb8284612b70565b90506000609d5482116123cf5760006123dd565b609d546123dd908390612b70565b9050801561248f5760006123f082611b34565b9050801561244a57609b54612405908261344a565b609b556124128282612b70565b6040805183815290519193507f5f1703ccfa2730d4245350f228079926a37f26a44ecf6978a7eeafff0af11407919081900360200190a15b609d54612457908361344a565b609d556040805183815290517fce2b6e507c7ca1a20ce136810f524eefc19ba4c7e4866eb6cc0cba76e778d4be9181900360200190a1505b609d54945050505050600160655590565b609b5481565b6124ae6126df565b6001600160a01b03166124bf611a34565b6001600160a01b031614612508576040805162461bcd60e51b81526020600482018190526024820152600080516020613f72833981519152604482015290519081900360640190fd5b6001600160a01b03811661254d5760405162461bcd60e51b8152600401808060200182810382526026815260200180613e8e6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610a93612b0f565b60405180604001604052806005815260200164332e342e3560d81b81525081565b600080609b5490506060609880548060200260200160405190810160405280929190818152602001828054801561263457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612616575b505083519394506000925050505b818110156126d6576126cc83828151811061265957fe5b60200260200101516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561269957600080fd5b505afa1580156126ad573d6000803e3d6000fd5b505050506040513d60208110156126c357600080fd5b5051859061344a565b9350600101612642565b50919250505090565b3390565b60006126ee8361276b565b61273f576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b8161274c57506000612764565b6127606001600160a01b0384168584612b1e565b5060015b9392505050565b60a0546001600160a01b039182169116141590565b600061278b306134a4565b15905090565b306001600160a01b0316826001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b1580156127d457600080fd5b505afa1580156127e8573d6000803e3d6000fd5b505050506040513d60208110156127fe57600080fd5b50516001600160a01b03161461285b576040805162461bcd60e51b815260206004820152601e60248201527f5072697a65506f6f6c2f746f6b656e2d6374726c722d6d69736d617463680000604482015290519081900360640190fd5b816098828154811061286957fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051918416917f460e712b4a5d801d031ed673dea209b73ab854f7ddeb86b6c48082e92c3eee669190a25050565b600054610100900460ff16806128d557506128d5612780565b806128e3575060005460ff16155b61291e5760405162461bcd60e51b815260040180806020018281038252602e815260200180613f23602e913960400191505060405180910390fd5b600054610100900460ff16158015612949576000805460ff1961ff0019909116610100171660011790555b6129516134aa565b61295961354a565b8015611025576000805461ff001916905550565b600054610100900460ff16806129865750612986612780565b80612994575060005460ff16155b6129cf5760405162461bcd60e51b815260040180806020018281038252602e815260200180613f23602e913960400191505060405180910390fd5b600054610100900460ff161580156129fa576000805460ff1961ff0019909116610100171660011790555b612959613643565b609c8190556040805182815290517f3ff20538222f568f27ff436c0c49dfd3e48d5b8f86533a3f759dc1c7089775ab9181900360200190a150565b600060606098805480602002602001604051908101604052809291908181526020018280548015612a9757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612a79575b505083519394506000925050505b81811015612aee57846001600160a01b0316838281518110612ac357fe5b60200260200101516001600160a01b03161415612ae65760019350505050611484565b600101612aa5565b506000949350505050565b610e0e8484612b0a87878787612d4a565b612e1f565b60a0546001600160a01b031690565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610b519084906136e9565b600082821115612bc7576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6099546001600160a01b031615612c6157609954604080516304d7f3db60e41b81526001600160a01b038781166004830152602482018790528581166044830152848116606483015291519190921691634d7f3db091608480830192600092919082900301818387803b158015612c4857600080fd5b505af1158015612c5c573d6000803e3d6000fd5b505050505b816001600160a01b0316635d7b075885856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156119fc57600080fd5b6001600160a01b0382166000908152609e6020526040812054612764908390612ceb9082906001600160801b031661326e565b61379a565b6001600160a01b0383166000908152609e60205260408120548190612d26908590600160801b90046001600160801b031661326e565b905080612d37576000915050612764565b612d4183826137bf565b95945050505050565b6001600160a01b038381166000908152609f6020908152604080832093881683529290529081208054829190600160e01b900460ff16612d8d5760009150612dcf565b6000612d9a888888613826565b8254909150612dcb9088908890612dc6908990612dc0906001600160c01b03168761344a565b9061344a565b612dd9565b9250505b5095945050505050565b6001600160a01b0383166000908152609e60205260408120548190612e089085906001600160801b031661326e565b905080831115612e16578092505b50909392505050565b6001600160a01b038083166000908152609f602090815260408083209387168352929052819020548151606081019092526001600160c01b03169080612e64846138d7565b6001600160801b03168152602001612e82612e7d61391f565b613925565b63ffffffff908116825260016020928301526001600160a01b038681166000908152609f84526040808220928a168252918452819020845181549486015195909201516001600160c01b03199094166001600160c01b039092169190911763ffffffff60c01b1916600160c01b94909216939093021760ff60e01b1916600160e01b9115159190910217905581811015612f65576001600160a01b038084169085167f2f92d56910619b38bc29fd8e4ca5e56359edac7a0c086cdcd305fb603fa37491612f4f8585612b70565b60408051918252519081900360200190a3610e0e565b80821015610e0e576001600160a01b038084169085167ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf612fa68486612b70565b60408051918252519081900360200190a350505050565b6000806000846001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561300f57600080fd5b505afa158015613023573d6000803e3d6000fd5b505050506040513d602081101561303957600080fd5b505190508381101561308b576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f696e737566662d66756e647360501b604482015290519081900360640190fd5b6130988686836000612af9565b60006130ad866130a88488612b70565b612cb8565b6001600160a01b038088166000908152609f60209081526040808320938c16835292905290812054919250906001600160c01b03168211613124576001600160a01b038088166000908152609f60209081526040808320938c1683529290522054613121906001600160c01b031683612b70565b90505b60006131308888612cb8565b905080821161313f5781613141565b805b945061314d8186612b70565b955050505050935093915050565b6001600160a01b0381166131b6576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f7072697a6553747261746567792d6e6f742d7a65726f604482015290519081900360640190fd5b6131d36001600160a01b038216600162a1cb1960e01b0319613969565b613224576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f7072697a6553747261746567792d696e76616c696400604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0383169081179091556040517f7f58dc86bc2e435cb77ca0edb1df55e25f90caf2d6bd866971715437d456a21290600090a250565b60008061327b8385613985565b905061175b81670de0b6b3a76400006139de565b6001600160a01b038083166000908152609f60209081526040808320938716835292905220546132d1906132cc906001600160c01b031683612b70565b6138d7565b6001600160a01b038084166000818152609f602090815260408083209489168084529482529182902080546001600160c01b0319166001600160801b0396909616959095179094558051858152905191937ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf92918290030190a3505050565b60a054604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561339b57600080fd5b505afa1580156133af573d6000803e3d6000fd5b505050506040513d60208110156133c557600080fd5b5051905090565b6000806133d76125d4565b609c549091506133e7828561344a565b11159392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610e0e9085906136e9565b600082820183811015612764576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3b151590565b600054610100900460ff16806134c357506134c3612780565b806134d1575060005460ff16155b61350c5760405162461bcd60e51b815260040180806020018281038252602e815260200180613f23602e913960400191505060405180910390fd5b600054610100900460ff16158015612959576000805460ff1961ff0019909116610100171660011790558015611025576000805461ff001916905550565b600054610100900460ff16806135635750613563612780565b80613571575060005460ff16155b6135ac5760405162461bcd60e51b815260040180806020018281038252602e815260200180613f23602e913960400191505060405180910390fd5b600054610100900460ff161580156135d7576000805460ff1961ff0019909116610100171660011790555b60006135e16126df565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015611025576000805461ff001916905550565b600054610100900460ff168061365c575061365c612780565b8061366a575060005460ff16155b6136a55760405162461bcd60e51b815260040180806020018281038252602e815260200180613f23602e913960400191505060405180910390fd5b600054610100900460ff161580156136d0576000805460ff1961ff0019909116610100171660011790555b60016065558015611025576000805461ff001916905550565b606061373e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a209092919063ffffffff16565b805190915015610b515780806020019051602081101561375d57600080fd5b5051610b515760405162461bcd60e51b815260040180806020018281038252602a815260200180613fff602a913960400191505060405180910390fd5b6000806137a984609a5461326e565b9050808311156137b7578092505b509092915050565b6000808211613815576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161381e57fe5b049392505050565b6001600160a01b038281166000908152609f60209081526040808320938716835292905290812054600160c01b810463ffffffff1690600160e01b900460ff16613874576000915050612764565b60006138888261388261391f565b90612b70565b6001600160a01b0386166000908152609e6020526040812054919250906138c0908390600160801b90046001600160801b0316613985565b90506138cc858261326e565b979650505050505050565b6000600160801b821061391b5760405162461bcd60e51b8152600401808060200182810382526027815260200180613eb46027913960400191505060405180910390fd5b5090565b60a15490565b6000600160201b821061391b5760405162461bcd60e51b8152600401808060200182810382526026815260200180613fd96026913960400191505060405180910390fd5b600061397483613a2f565b801561276457506127648383613a62565b60008261399457506000612bcc565b828202828482816139a157fe5b04146127645760405162461bcd60e51b8152600401808060200182810382526021815260200180613f516021913960400191505060405180910390fd5b600061276483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613a85565b606061175b8484600085613b27565b6000613a42826301ffc9a760e01b613a62565b80156114815750613a5b826001600160e01b0319613a62565b1592915050565b6000806000613a718585613c78565b91509150818015612d415750949350505050565b60008183613b115760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ad6578181015183820152602001613abe565b50505050905090810190601f168015613b035780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613b1d57fe5b0495945050505050565b606082471015613b685760405162461bcd60e51b8152600401808060200182810382526026815260200180613efd6026913960400191505060405180910390fd5b613b71856134a4565b613bc2576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613c015780518252601f199092019160209182019101613be2565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613c63576040519150601f19603f3d011682016040523d82523d6000602084013e613c68565b606091505b50915091506138cc828286613dac565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b1781529151815160009384939284926060926001600160a01b038a169261753092879282918083835b60208310613d005780518252601f199092019160209182019101613ce1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114613d61576040519150601f19603f3d011682016040523d82523d6000602084013e613d66565b606091505b5091509150602081511015613d845760008094509450505050613da5565b81818060200190516020811015613d9a57600080fd5b505190955093505050505b9250929050565b60608315613dbb575081612764565b825115613dcb5782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315613ad6578181015183820152602001613abe565b828054828255906000526020600020908101928215613e67579160200282015b82811115613e6757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613e32565b5061391b9291505b8082111561391b5780546001600160a01b0319168155600101613e6f56fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e2031323820626974735072697a65506f6f6c2f7265736572766552656769737472792d6e6f742d7a65726f416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725072697a65506f6f6c2f657869742d6665652d657863656564732d757365722d6d6178696d756d5072697a65506f6f6c2f756e6b6e6f776e2d746f6b656e00000000000000000053616665436173743a2076616c756520646f65736e27742066697420696e20333220626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645374616b655072697a65506f6f6c2f7374616b652d746f6b656e2d6e6f742d7a65726f2d616464726573735072697a65506f6f6c2f6f6e6c792d7072697a65537472617465677900000000a2646970667358221220796a5105f0457d2d4f8ff8fd9911a364faaee0cfdae58ec57971f0823778de4964736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x1D SWAP1 PUSH2 0x5F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x39 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x6C JUMP JUMPDEST PUSH2 0x40C9 DUP1 PUSH2 0x3B2 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH2 0x337 DUP1 PUSH2 0x7B PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x22EC095 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x6A JUMPI DUP1 PUSH4 0xEFC81A8C EQ PUSH2 0x120 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x128 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x137 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x4E PUSH2 0x2B3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x265 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x26A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2DE PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE DUP3 DUP2 MSTORE PUSH2 0x2D8 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x137 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 0x1F TIMESTAMP 0xCA 0xC4 0x4F MLOAD SGT 0xF7 KECCAK256 PUSH32 0x7541C56F8FEA8FE63C33DCFEDA7F77B16FE819056F2764736F6C634300060C00 CALLER PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x40A9 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x253 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x888C2B6F GT PUSH2 0x146 JUMPI DUP1 PUSH4 0xB69EF8A8 GT PUSH2 0xC3 JUMPI DUP1 PUSH4 0xE323F825 GT PUSH2 0x87 JUMPI DUP1 PUSH4 0xE323F825 EQ PUSH2 0x992 JUMPI DUP1 PUSH4 0xE6D8A94B EQ PUSH2 0x9CE JUMPI DUP1 PUSH4 0xEDB4E1CF EQ PUSH2 0x9D6 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x9DE JUMPI DUP1 PUSH4 0xFC0C546A EQ PUSH2 0xA04 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0xA0C JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0xB69EF8A8 EQ PUSH2 0x851 JUMPI DUP1 PUSH4 0xC5871485 EQ PUSH2 0x859 JUMPI DUP1 PUSH4 0xD18E81B3 EQ PUSH2 0x918 JUMPI DUP1 PUSH4 0xD4A1361D EQ PUSH2 0x920 JUMPI DUP1 PUSH4 0xDB006A75 EQ PUSH2 0x975 JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x9D63848A GT PUSH2 0x10A JUMPI DUP1 PUSH4 0x9D63848A EQ PUSH2 0x75D JUMPI DUP1 PUSH4 0x9E167519 EQ PUSH2 0x7B5 JUMPI DUP1 PUSH4 0x9FE32A91 EQ PUSH2 0x7BD JUMPI DUP1 PUSH4 0xA016240B EQ PUSH2 0x7DA JUMPI DUP1 PUSH4 0xA7B2CC31 EQ PUSH2 0x814 JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x888C2B6F EQ PUSH2 0x6B4 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x703 JUMPI DUP1 PUSH4 0x8E71C1F6 EQ PUSH2 0x727 JUMPI DUP1 PUSH4 0x91CA480E EQ PUSH2 0x72F JUMPI DUP1 PUSH4 0x98BF3EB6 EQ PUSH2 0x755 JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x52A387AB GT PUSH2 0x1D4 JUMPI DUP1 PUSH4 0x76687D3D GT PUSH2 0x198 JUMPI DUP1 PUSH4 0x76687D3D EQ PUSH2 0x601 JUMPI DUP1 PUSH4 0x78B3D327 EQ PUSH2 0x609 JUMPI DUP1 PUSH4 0x79CB8563 EQ PUSH2 0x62F JUMPI DUP1 PUSH4 0x7B99ADB1 EQ PUSH2 0x661 JUMPI DUP1 PUSH4 0x7CBAB1C7 EQ PUSH2 0x67E JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x52A387AB EQ PUSH2 0x55B JUMPI DUP1 PUSH4 0x630665B4 EQ PUSH2 0x581 JUMPI DUP1 PUSH4 0x6A3FD4F9 EQ PUSH2 0x589 JUMPI DUP1 PUSH4 0x6B1B863A EQ PUSH2 0x5C3 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x5F9 JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x2B0AB144 GT PUSH2 0x21B JUMPI DUP1 PUSH4 0x2B0AB144 EQ PUSH2 0x3F9 JUMPI DUP1 PUSH4 0x2F7627E3 EQ PUSH2 0x42F JUMPI DUP1 PUSH4 0x35403023 EQ PUSH2 0x45D JUMPI DUP1 PUSH4 0x3EDE50C6 EQ PUSH2 0x47A JUMPI DUP1 PUSH4 0x494DE9F7 EQ PUSH2 0x52D JUMPI PUSH2 0x253 JUMP JUMPDEST DUP1 PUSH4 0x937EB54 EQ PUSH2 0x258 JUMPI DUP1 PUSH4 0x13F55E39 EQ PUSH2 0x272 JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x2AA JUMPI DUP1 PUSH4 0x16960D55 EQ PUSH2 0x355 JUMPI DUP1 PUSH4 0x22F8E566 EQ PUSH2 0x3DC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x260 PUSH2 0xA89 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x288 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xA98 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x338 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x2C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x2FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x30C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x32D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xB56 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x36B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x39E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x3B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x3D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xB67 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xE14 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x40F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xE19 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x445 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xED6 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x473 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1025 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x490 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x4BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x4CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x4ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0x1028 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x543 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x121A JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x571 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1321 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x1470 JUMP JUMPDEST PUSH2 0x5AF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x59F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1476 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x5D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 SWAP1 SWAP2 ADD CALLDATALOAD AND PUSH2 0x1489 JUMP JUMPDEST PUSH2 0x2A8 PUSH2 0x1691 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x173D JUMP JUMPDEST PUSH2 0x5AF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x61F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1743 JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x645 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x174E JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x677 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1763 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x694 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x17CE JUMP JUMPDEST PUSH2 0x6EA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x6CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1A1A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB ADD SWAP1 RETURN JUMPDEST PUSH2 0x70B PUSH2 0x1A34 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x70B PUSH2 0x1A43 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x745 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A52 JUMP JUMPDEST PUSH2 0x70B PUSH2 0x1ABD JUMP JUMPDEST PUSH2 0x765 PUSH2 0x1ACC JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x7A1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x789 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x260 PUSH2 0x1B2E JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x7D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1B34 JUMP JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x7F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x1C62 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x82A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x40 ADD CALLDATALOAD AND PUSH2 0x1E99 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x1FEF JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x86F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x899 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x8AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x8CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1FF9 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x213C JUMP JUMPDEST PUSH2 0x946 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x936 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2142 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x260 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x98B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x2172 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x9A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x2175 JUMP JUMPDEST PUSH2 0x260 PUSH2 0x232A JUMP JUMPDEST PUSH2 0x260 PUSH2 0x24A0 JUMP JUMPDEST PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x9F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x24A6 JUMP JUMPDEST PUSH2 0x70B PUSH2 0x25A9 JUMP JUMPDEST PUSH2 0xA14 PUSH2 0x25B3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xA4E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xA36 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xA7B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xA93 PUSH2 0x25D4 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xAAC PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xAF5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4054 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xB00 DUP4 DUP4 DUP4 PUSH2 0x26E3 JUMP JUMPDEST ISZERO PUSH2 0xB51 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB0BAC59718CD343C80A813518AFCF36846CFCFE6D56E2B3CAB9BD49F5F9B251C DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0xA85BD01 PUSH1 0xE1 SHL SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xB7B PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xBC4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4054 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xBCD DUP4 PUSH2 0x276B JUMP JUMPDEST PUSH2 0xC1E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0xC28 JUMPI PUSH2 0xE0E JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xD95 JUMPI DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x42842E0E ADDRESS DUP8 DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0xC50 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0xCBE JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xD8D JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0xCEC JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xCF1 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH32 0x17E975018310F88872B58D4D8263ADCA83CF5C1893496EA2A86923DAB15276AD DUP2 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD51 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD39 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD7E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xC2B JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x69C2DE32BC4D47F488E72626A6CFDEE85089342E52675E7DE79C4B417623960C DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP6 POP SWAP1 SWAP4 POP POP POP POP LOG3 JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0xA1 SSTORE JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE2D PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xE76 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4054 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xE81 DUP4 DUP4 DUP4 PUSH2 0x26E3 JUMP JUMPDEST ISZERO PUSH2 0xB51 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC65F48ACA3B7A99B7443D04B8FFBB073156179BC628DC3F7DEF5047748973469 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH2 0xEDE PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xEEF PUSH2 0x1A34 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xF38 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F72 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF87 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xF9B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xFB1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD GT ISZERO PUSH2 0x1021 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5C19A95C DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1008 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x101C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1041 JUMPI POP PUSH2 0x1041 PUSH2 0x2780 JUMP JUMPDEST DUP1 PUSH2 0x104F JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x108A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F23 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x10B5 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x10FA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3EDB PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 MLOAD DUP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x1113 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x113D JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP1 MLOAD PUSH2 0x1152 SWAP2 PUSH1 0x98 SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x3E12 JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1189 JUMPI PUSH1 0x0 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x116C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0x1180 DUP2 DUP4 PUSH2 0x2791 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x1156 JUMP JUMPDEST POP PUSH2 0x1192 PUSH2 0x28BC JUMP JUMPDEST PUSH2 0x119A PUSH2 0x296D JUMP JUMPDEST PUSH2 0x11A5 PUSH1 0x0 NOT PUSH2 0x2A02 JUMP JUMPDEST PUSH1 0x97 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x9A DUP5 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP6 SWAP1 MSTORE DUP1 MLOAD PUSH32 0x25FF68DD81B34665B5BA7E553EE5511BF6812E12ADB4A7E2C0D9E26B3099CE79 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 POP DUP1 ISZERO PUSH2 0xE0E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x1226 DUP2 PUSH2 0x2A3D JUMP JUMPDEST PUSH2 0x1265 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FB9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x12EA DUP5 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x12CB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x12E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 PUSH2 0x2AF9 JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP4 AND DUP3 MSTORE SWAP3 SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1386 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x139C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ PUSH2 0x13F6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F6F6E6C792D72657365727665 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9B DUP1 SLOAD PUSH1 0x0 SWAP2 DUP3 SWAP1 SSTORE SWAP1 PUSH2 0x140A DUP3 PUSH2 0x2172 JUMP JUMPDEST SWAP1 POP PUSH2 0x1429 DUP6 DUP3 PUSH2 0x1419 PUSH2 0x2B0F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x2B1E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP2 PUSH32 0x1C71C8E11FD443227C8F8D3DC1A237A3A5E8310B540C7FBCF5169754AEDF42C9 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x9D SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1481 DUP3 PUSH2 0x276B JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x149D PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x14E6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4054 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x14F0 DUP2 PUSH2 0x2A3D JUMP JUMPDEST PUSH2 0x152F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FB9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 PUSH2 0x1539 JUMPI PUSH2 0xE0E JUMP JUMPDEST PUSH1 0x9D SLOAD DUP4 GT ISZERO PUSH2 0x1590 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F61776172642D657863656564732D617661696C000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x159D SWAP1 DUP5 PUSH2 0x2B70 JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH2 0x15AD DUP5 DUP5 DUP5 PUSH1 0x0 PUSH2 0x2BD2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15B9 DUP4 DUP6 PUSH2 0x2CB8 JUMP JUMPDEST SWAP1 POP PUSH2 0x163F DUP6 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x160D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1621 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1637 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP5 PUSH2 0x2AF9 JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xE2554529D99AB7A67DB6B4CEA2B32C7D55AE325F958861E05F304FDDED867E31 DUP7 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1699 PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16AA PUSH2 0x1A34 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x16F3 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F72 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1481 DUP3 PUSH2 0x2A3D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x175B DUP5 DUP5 DUP5 PUSH2 0x2CF0 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x176B PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x177C PUSH2 0x1A34 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x17C5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F72 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1025 DUP2 PUSH2 0x2A02 JUMP JUMPDEST CALLER PUSH2 0x17D8 DUP2 PUSH2 0x2A3D JUMP JUMPDEST PUSH2 0x1817 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FB9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO PUSH2 0x18F1 JUMPI PUSH1 0x0 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP7 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1875 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1889 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x189F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x18B1 DUP7 CALLER DUP5 DUP5 PUSH2 0x2D4A JUMP JUMPDEST SWAP1 POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x18E3 JUMPI PUSH2 0x18E0 CALLER PUSH2 0x18DA DUP5 DUP8 PUSH2 0x2B70 JUMP JUMPDEST DUP4 PUSH2 0x2DD9 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x18EE DUP7 CALLER DUP4 PUSH2 0x2E1F JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x191B JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x1972 JUMPI PUSH2 0x1972 DUP4 CALLER CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1994 JUMPI POP PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xE0E JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP7 SWAP1 MSTORE CALLER PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xB2210957 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x19FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1A10 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1A28 DUP6 DUP6 DUP6 PUSH2 0x2FBD JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x97 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1A5A PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A6B PUSH2 0x1A34 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1AB4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F72 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1025 DUP2 PUSH2 0x315B JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1B24 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1B06 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1B85 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1B99 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1BAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1BCB JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x1484 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x10DFA58 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C2E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1C44 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x1C58 JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x1484 JUMP JUMPDEST PUSH2 0x175B DUP5 DUP3 PUSH2 0x326E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x1CBC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP3 PUSH2 0x1CCB DUP2 PUSH2 0x2A3D JUMP JUMPDEST PUSH2 0x1D0A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FB9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1D18 DUP9 DUP8 DUP10 PUSH2 0x2FBD JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0x1D5B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F92 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1D66 DUP9 DUP8 DUP4 PUSH2 0x328F JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x631B5DFB PUSH2 0x1D7D PUSH2 0x26DF JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1DD5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1DE9 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 PUSH2 0x1E02 DUP4 DUP10 PUSH2 0x2B70 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1E0F DUP3 PUSH2 0x2172 JUMP JUMPDEST SWAP1 POP PUSH2 0x1E1E DUP11 DUP3 PUSH2 0x1419 PUSH2 0x2B0F JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E3A PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP14 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE DUP1 DUP3 ADD DUP10 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x271704A58FD2953E49B87D67A0A3CE28A58147DE98A5457F60B4686F6385030 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH2 0x1EA3 DUP2 PUSH2 0x2A3D JUMP JUMPDEST PUSH2 0x1EE2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FB9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1EEA PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1EFB PUSH2 0x1A34 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1F44 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F72 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP6 AND DUP1 DUP4 MSTORE DUP7 DUP3 AND PUSH1 0x20 DUP1 DUP6 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9E DUP5 MSTORE DUP9 SWAP1 KECCAK256 SWAP7 MLOAD DUP8 SLOAD SWAP3 MLOAD DUP8 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP1 DUP8 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP6 AND OR SWAP1 SWAP5 SSTORE DUP5 MLOAD SWAP3 DUP4 MSTORE SWAP3 DUP3 ADD MSTORE DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 MLOAD PUSH32 0xFB0BA2CF86A2B03BCF387753A2192DA80A006AFA99DD022BB301C78E323BF1B9 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA93 PUSH2 0x3350 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2012 JUMPI POP PUSH2 0x2012 PUSH2 0x2780 JUMP JUMPDEST DUP1 PUSH2 0x2020 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x205B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F23 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2086 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2091 DUP6 DUP6 DUP6 PUSH2 0x1028 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x20D6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4029 PUSH1 0x2B SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0xA0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 AND SWAP1 PUSH32 0xA81053747B04E643171034E5426F6DEEBB058FC29DFE032E33345A109224B31B SWAP1 PUSH1 0x0 SWAP1 LOG2 DUP1 ISZERO PUSH2 0x2135 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0xA1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP3 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x21CD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP2 PUSH2 0x21DC DUP2 PUSH2 0x2A3D JUMP JUMPDEST PUSH2 0x221B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3FB9 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP4 PUSH2 0x2225 DUP2 PUSH2 0x33CC JUMP JUMPDEST PUSH2 0x2276 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F657863656564732D6C69717569646974792D63617000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2280 PUSH2 0x26DF JUMP JUMPDEST SWAP1 POP PUSH2 0x228E DUP8 DUP8 DUP8 DUP8 PUSH2 0x2BD2 JUMP JUMPDEST PUSH2 0x22AD DUP2 ADDRESS DUP9 PUSH2 0x229C PUSH2 0x2B0F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 SWAP1 PUSH2 0x33F0 JUMP JUMPDEST PUSH2 0x22B6 DUP7 PUSH2 0x1025 JUMP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6CE569498E0F86F147466AC49211CB2A1FFE06195ADB805E383B3F2365109160 DUP10 DUP9 PUSH1 0x40 MLOAD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x2384 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE PUSH1 0x0 PUSH2 0x2393 PUSH2 0x25D4 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x239F PUSH2 0x3350 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 DUP3 GT PUSH2 0x23B1 JUMPI PUSH1 0x0 PUSH2 0x23BB JUMP JUMPDEST PUSH2 0x23BB DUP3 DUP5 PUSH2 0x2B70 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x9D SLOAD DUP3 GT PUSH2 0x23CF JUMPI PUSH1 0x0 PUSH2 0x23DD JUMP JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x23DD SWAP1 DUP4 SWAP1 PUSH2 0x2B70 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x248F JUMPI PUSH1 0x0 PUSH2 0x23F0 DUP3 PUSH2 0x1B34 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x244A JUMPI PUSH1 0x9B SLOAD PUSH2 0x2405 SWAP1 DUP3 PUSH2 0x344A JUMP JUMPDEST PUSH1 0x9B SSTORE PUSH2 0x2412 DUP3 DUP3 PUSH2 0x2B70 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 POP PUSH32 0x5F1703CCFA2730D4245350F228079926A37F26A44ECF6978A7EEAFFF0AF11407 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x2457 SWAP1 DUP4 PUSH2 0x344A JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xCE2B6E507C7CA1A20CE136810F524EEFC19BA4C7E4866EB6CC0CBA76E778D4BE SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH1 0x9D SLOAD SWAP5 POP POP POP POP POP PUSH1 0x1 PUSH1 0x65 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x9B SLOAD DUP2 JUMP JUMPDEST PUSH2 0x24AE PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x24BF PUSH2 0x1A34 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2508 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x3F72 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x254D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3E8E PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA93 PUSH2 0x2B0F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x9B SLOAD SWAP1 POP PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2634 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2616 JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x26D6 JUMPI PUSH2 0x26CC DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2659 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2699 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x26AD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x26C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP6 SWAP1 PUSH2 0x344A JUMP JUMPDEST SWAP4 POP PUSH1 0x1 ADD PUSH2 0x2642 JUMP JUMPDEST POP SWAP2 SWAP3 POP POP POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x26EE DUP4 PUSH2 0x276B JUMP JUMPDEST PUSH2 0x273F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x274C JUMPI POP PUSH1 0x0 PUSH2 0x2764 JUMP JUMPDEST PUSH2 0x2760 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP6 DUP5 PUSH2 0x2B1E JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND SWAP2 AND EQ ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x278B ADDRESS PUSH2 0x34A4 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF77C4791 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x27D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x27E8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x27FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x285B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F746F6B656E2D6374726C722D6D69736D617463680000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x98 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x2869 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 DUP5 AND SWAP2 PUSH32 0x460E712B4A5D801D031ED673DEA209B73AB854F7DDEB86B6C48082E92C3EEE66 SWAP2 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x28D5 JUMPI POP PUSH2 0x28D5 PUSH2 0x2780 JUMP JUMPDEST DUP1 PUSH2 0x28E3 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x291E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F23 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2949 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2951 PUSH2 0x34AA JUMP JUMPDEST PUSH2 0x2959 PUSH2 0x354A JUMP JUMPDEST DUP1 ISZERO PUSH2 0x1025 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2986 JUMPI POP PUSH2 0x2986 PUSH2 0x2780 JUMP JUMPDEST DUP1 PUSH2 0x2994 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x29CF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F23 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x29FA JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2959 PUSH2 0x3643 JUMP JUMPDEST PUSH1 0x9C DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3FF20538222F568F27FF436C0C49DFD3E48D5B8F86533A3F759DC1C7089775AB SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2A97 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2A79 JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2AEE JUMPI DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2AC3 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x2AE6 JUMPI PUSH1 0x1 SWAP4 POP POP POP POP PUSH2 0x1484 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2AA5 JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xE0E DUP5 DUP5 PUSH2 0x2B0A DUP8 DUP8 DUP8 DUP8 PUSH2 0x2D4A JUMP JUMPDEST PUSH2 0x2E1F JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xB51 SWAP1 DUP5 SWAP1 PUSH2 0x36E9 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2BC7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2C61 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE DUP6 DUP2 AND PUSH1 0x44 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x4D7F3DB0 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2C48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2C5C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5D7B0758 DUP6 DUP6 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x19FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x2764 SWAP1 DUP4 SWAP1 PUSH2 0x2CEB SWAP1 DUP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x326E JUMP JUMPDEST PUSH2 0x379A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2D26 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x326E JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x2D37 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x2764 JUMP JUMPDEST PUSH2 0x2D41 DUP4 DUP3 PUSH2 0x37BF JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP3 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x2D8D JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x2DCF JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2D9A DUP9 DUP9 DUP9 PUSH2 0x3826 JUMP JUMPDEST DUP3 SLOAD SWAP1 SWAP2 POP PUSH2 0x2DCB SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x2DC6 SWAP1 DUP10 SWAP1 PUSH2 0x2DC0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP8 PUSH2 0x344A JUMP JUMPDEST SWAP1 PUSH2 0x344A JUMP JUMPDEST PUSH2 0x2DD9 JUMP JUMPDEST SWAP3 POP POP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2E08 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x326E JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x2E16 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE DUP2 SWAP1 KECCAK256 SLOAD DUP2 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 DUP1 PUSH2 0x2E64 DUP5 PUSH2 0x38D7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2E82 PUSH2 0x2E7D PUSH2 0x391F JUMP JUMPDEST PUSH2 0x3925 JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP3 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 DUP11 AND DUP3 MSTORE SWAP2 DUP5 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP5 DUP7 ADD MLOAD SWAP6 SWAP1 SWAP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH4 0xFFFFFFFF PUSH1 0xC0 SHL NOT AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP5 SWAP1 SWAP3 AND SWAP4 SWAP1 SWAP4 MUL OR PUSH1 0xFF PUSH1 0xE0 SHL NOT AND PUSH1 0x1 PUSH1 0xE0 SHL SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE DUP2 DUP2 LT ISZERO PUSH2 0x2F65 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0x2F92D56910619B38BC29FD8E4CA5E56359EDAC7A0C086CDCD305FB603FA37491 PUSH2 0x2F4F DUP6 DUP6 PUSH2 0x2B70 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 PUSH2 0xE0E JUMP JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0xE0E JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF PUSH2 0x2FA6 DUP5 DUP7 PUSH2 0x2B70 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x300F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x3023 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3039 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x308B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F696E737566662D66756E6473 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x3098 DUP7 DUP7 DUP4 PUSH1 0x0 PUSH2 0x2AF9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x30AD DUP7 PUSH2 0x30A8 DUP5 DUP9 PUSH2 0x2B70 JUMP JUMPDEST PUSH2 0x2CB8 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP3 GT PUSH2 0x3124 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x3121 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2B70 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x3130 DUP9 DUP9 PUSH2 0x2CB8 JUMP JUMPDEST SWAP1 POP DUP1 DUP3 GT PUSH2 0x313F JUMPI DUP2 PUSH2 0x3141 JUMP JUMPDEST DUP1 JUMPDEST SWAP5 POP PUSH2 0x314D DUP2 DUP7 PUSH2 0x2B70 JUMP JUMPDEST SWAP6 POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x31B6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D6E6F742D7A65726F PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x31D3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3969 JUMP JUMPDEST PUSH2 0x3224 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D696E76616C696400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x99 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x7F58DC86BC2E435CB77CA0EDB1DF55E25F90CAF2D6BD866971715437D456A212 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x327B DUP4 DUP6 PUSH2 0x3985 JUMP JUMPDEST SWAP1 POP PUSH2 0x175B DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x39DE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x32D1 SWAP1 PUSH2 0x32CC SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2B70 JUMP JUMPDEST PUSH2 0x38D7 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x339B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x33AF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x33C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x33D7 PUSH2 0x25D4 JUMP JUMPDEST PUSH1 0x9C SLOAD SWAP1 SWAP2 POP PUSH2 0x33E7 DUP3 DUP6 PUSH2 0x344A JUMP JUMPDEST GT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x24 DUP4 ADD MSTORE DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x84 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xE0E SWAP1 DUP6 SWAP1 PUSH2 0x36E9 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x2764 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x34C3 JUMPI POP PUSH2 0x34C3 PUSH2 0x2780 JUMP JUMPDEST DUP1 PUSH2 0x34D1 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x350C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F23 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2959 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x1025 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3563 JUMPI POP PUSH2 0x3563 PUSH2 0x2780 JUMP JUMPDEST DUP1 PUSH2 0x3571 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x35AC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F23 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x35D7 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x35E1 PUSH2 0x26DF JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x1025 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x365C JUMPI POP PUSH2 0x365C PUSH2 0x2780 JUMP JUMPDEST DUP1 PUSH2 0x366A JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x36A5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F23 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x36D0 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x65 SSTORE DUP1 ISZERO PUSH2 0x1025 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x373E DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3A20 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xB51 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x375D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xB51 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3FFF PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x37A9 DUP5 PUSH1 0x9A SLOAD PUSH2 0x326E JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x37B7 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x3815 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x381E JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xC0 SHL DUP2 DIV PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x3874 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x2764 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3888 DUP3 PUSH2 0x3882 PUSH2 0x391F JUMP JUMPDEST SWAP1 PUSH2 0x2B70 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x38C0 SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3985 JUMP JUMPDEST SWAP1 POP PUSH2 0x38CC DUP6 DUP3 PUSH2 0x326E JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x391B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3EB4 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0xA1 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x20 SHL DUP3 LT PUSH2 0x391B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3FD9 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3974 DUP4 PUSH2 0x3A2F JUMP JUMPDEST DUP1 ISZERO PUSH2 0x2764 JUMPI POP PUSH2 0x2764 DUP4 DUP4 PUSH2 0x3A62 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3994 JUMPI POP PUSH1 0x0 PUSH2 0x2BCC JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x39A1 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x2764 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3F51 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2764 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x3A85 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x175B DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x3B27 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A42 DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3A62 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x1481 JUMPI POP PUSH2 0x3A5B DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3A62 JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x3A71 DUP6 DUP6 PUSH2 0x3C78 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x2D41 JUMPI POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x3B11 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3AD6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3ABE JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3B03 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x3B1D JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x3B68 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x3EFD PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3B71 DUP6 PUSH2 0x34A4 JUMP JUMPDEST PUSH2 0x3BC2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3C01 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3BE2 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3C63 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3C68 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x38CC DUP3 DUP3 DUP7 PUSH2 0x3DAC JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x24 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP3 DUP5 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND SWAP3 PUSH2 0x7530 SWAP3 DUP8 SWAP3 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3D00 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3CE1 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x3D61 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x3D66 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x3D84 JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x3DA5 JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3D9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x3DBB JUMPI POP DUP2 PUSH2 0x2764 JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x3DCB JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x3AD6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3ABE JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x3E67 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x3E67 JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x3E32 JUMP JUMPDEST POP PUSH2 0x391B SWAP3 SWAP2 POP JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x391B JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x3E6F JUMP INVALID 0x4F PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F206164647265737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E2031323820626974735072697A65 POP PUSH16 0x6F6C2F72657365727665526567697374 PUSH19 0x792D6E6F742D7A65726F416464726573733A20 PUSH10 0x6E73756666696369656E PUSH21 0x2062616C616E636520666F722063616C6C496E6974 PUSH10 0x616C697A61626C653A20 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 MSTORE8 PUSH2 0x6665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F774F776E61626C653A20 PUSH4 0x616C6C65 PUSH19 0x206973206E6F7420746865206F776E65725072 PUSH10 0x7A65506F6F6C2F657869 PUSH21 0x2D6665652D657863656564732D757365722D6D6178 PUSH10 0x6D756D5072697A65506F PUSH16 0x6C2F756E6B6E6F776E2D746F6B656E00 STOP STOP STOP STOP STOP STOP STOP STOP MSTORE8 PUSH2 0x6665 NUMBER PUSH2 0x7374 GASPRICE KECCAK256 PUSH23 0x616C756520646F65736E27742066697420696E20333220 PUSH3 0x697473 MSTORE8 PUSH2 0x6665 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x7563636565645374616B655072697A65506F6F6C 0x2F PUSH20 0x74616B652D746F6B656E2D6E6F742D7A65726F2D PUSH2 0x6464 PUSH19 0x6573735072697A65506F6F6C2F6F6E6C792D70 PUSH19 0x697A65537472617465677900000000A2646970 PUSH7 0x7358221220796A MLOAD SDIV CREATE GASLIMIT PUSH30 0x2D4F8FF8FD9911A364FAAEE0CFDAE58EC57971F0823778DE4964736F6C63 NUMBER STOP MOD 0xC STOP CALLER ",
              "sourceMap": "227:607:81:-:0;;;478:71;;;;;;;;;;517:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;506:8:81;:38;;-1:-1:-1;;;;;;506:38:81;-1:-1:-1;;;;;506:38:81;;;;;;;;;;227:607;;;;;;;;;;:::o;:::-;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106100415760003560e01c8063022ec09514610046578063b3eeb5e21461006a578063efc81a8c14610120575b600080fd5b61004e610128565b604080516001600160a01b039092168252519081900360200190f35b61004e6004803603604081101561008057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100ab57600080fd5b8201836020820111156100bd57600080fd5b803590602001918460018302840111640100000000831117156100df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610137945050505050565b61004e6102b3565b6000546001600160a01b031681565b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a18251156102ac576000826001600160a01b0316846040518082805190602001908083835b602083106102035780518252601f1990920191602091820191016101e4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610265576040519150601f19603f3d011682016040523d82523d6000602084013e61026a565b606091505b50509050806102aa5760405162461bcd60e51b81526004018080602001828103825260248152602001806102de6024913960400191505060405180910390fd5b505b5092915050565b6000805460408051602081019091528281526102d8916001600160a01b031690610137565b90509056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a26469706673582212201f42cac44f5113f7207f7541c56f8fea8fe63c33dcfeda7f77b16fe819056f2764736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x22EC095 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x6A JUMPI DUP1 PUSH4 0xEFC81A8C EQ PUSH2 0x120 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x128 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x137 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x4E PUSH2 0x2B3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x265 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x26A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2DE PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE DUP3 DUP2 MSTORE PUSH2 0x2D8 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x137 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 0x1F TIMESTAMP 0xCA 0xC4 0x4F MLOAD SGT 0xF7 KECCAK256 PUSH32 0x7541C56F8FEA8FE63C33DCFEDA7F77B16FE819056F2764736F6C634300060C00 CALLER ",
              "sourceMap": "227:607:81:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;357:37;;;:::i;:::-;;;;-1:-1:-1;;;;;357:37:81;;;;;;;;;;;;;;182:778:38;;;;;;;;;;;;;;;;-1:-1:-1;;;;;182:778:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;182:778:38;;-1:-1:-1;182:778:38;;-1:-1:-1;;;;;182:778:38:i;696:136:81:-;;;:::i;357:37::-;;;-1:-1:-1;;;;;357:37:81;;:::o;182:778:38:-;257:13;416:19;446:6;438:15;;416:37;;495:4;489:11;-1:-1:-1;;;514:5:38;507:81;620:11;613:4;606:5;602:16;595:37;-1:-1:-1;;;657:4:38;650:5;646:16;639:92;764:4;757:5;754:1;747:22;786:28;;;-1:-1:-1;;;;;786:28:38;;;;;;738:31;;-1:-1:-1;786:28:38;;-1:-1:-1;786:28:38;;;;;;;824:12;;:16;821:135;;851:12;868:5;-1:-1:-1;;;;;868:10:38;879:5;868:17;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;868:17:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;850:35;;;901:7;893:56;;;;-1:-1:-1;;;893:56:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;821:135;;182:778;;;;;:::o;696:136:81:-;732:21;812:8;;790:36;;;;;;;;;;;;;;-1:-1:-1;;;;;812:8:81;;790:13;:36::i;:::-;761:66;;696:136;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "164600",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "create()": "infinite",
                "deployMinimal(address,bytes)": "infinite",
                "instance()": "1015"
              }
            },
            "methodIdentifiers": {
              "create()": "efc81a8c",
              "deployMinimal(address,bytes)": "b3eeb5e2",
              "instance()": "022ec095"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"name\":\"ProxyCreated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract StakePrizePoolHarness\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"deployMinimal\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"instance\",\"outputs\":[{\"internalType\":\"contract StakePrizePoolHarness\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"create()\":{\"returns\":{\"_0\":\"A reference to the new proxied Stake Prize Pool\"}}},\"title\":\"Stake Prize Pool Proxy Factory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":\"Initializes the Factory with an instance of the Stake Prize Pool\",\"create()\":{\"notice\":\"Creates a new Stake Prize Pool as a proxy of the template instance\"},\"instance()\":{\"notice\":\"Contract template for deploying proxied Prize Pools\"}},\"notice\":\"Minimal proxy pattern for creating new Stake Prize Pools\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/StakePrizePoolHarnessProxyFactory.sol\":\"StakePrizePoolHarnessProxyFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"},\"contracts/external/openzeppelin/ProxyFactory.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\n// solium-disable security/no-inline-assembly\\n// solium-disable security/no-low-level-calls\\ncontract ProxyFactory {\\n\\n  event ProxyCreated(address proxy);\\n\\n  function deployMinimal(address _logic, bytes memory _data) public returns (address proxy) {\\n    // Adapted from https://github.com/optionality/clone-factory/blob/32782f82dfc5a00d103a7e61a17a5dedbd1e8e9d/contracts/CloneFactory.sol\\n    bytes20 targetBytes = bytes20(_logic);\\n    assembly {\\n      let clone := mload(0x40)\\n      mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n      mstore(add(clone, 0x14), targetBytes)\\n      mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n      proxy := create(0, clone, 0x37)\\n    }\\n\\n    emit ProxyCreated(address(proxy));\\n\\n    if(_data.length > 0) {\\n      (bool success,) = proxy.call(_data);\\n      require(success, \\\"ProxyFactory/constructor-call-failed\\\");\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0xf0422303985796fdd8bdf772ac8e34331e2e63006f657989cca010fa4776d735\"},\"contracts/prize-pool/PrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../external/compound/ICompLike.sol\\\";\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../reserve/ReserveInterface.sol\\\";\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/TokenListenerLibrary.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\nimport \\\"./PrizePoolInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using SafeERC20Upgradeable for IERC721Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    address reserveRegistry,\\n    uint256 maxExitFeeMantissa\\n  );\\n\\n  /// @dev Event emitted when controlled token is added\\n  event ControlledTokenAdded(\\n    ControlledTokenInterface indexed token\\n  );\\n\\n  /// @dev Emitted when reserve is captured.\\n  event ReserveFeeCaptured(\\n    uint256 amount\\n  );\\n\\n  event AwardCaptured(\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when assets are deposited\\n  event Deposited(\\n    address indexed operator,\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount,\\n    address referrer\\n  );\\n\\n  /// @dev Event emitted when interest is awarded to a winner\\n  event Awarded(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are awarded to a winner\\n  event AwardedExternalERC20(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are transferred out\\n  event TransferredExternalERC20(\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC721s are awarded to a winner\\n  event AwardedExternalERC721(\\n    address indexed winner,\\n    address indexed token,\\n    uint256[] tokenIds\\n  );\\n\\n  /// @dev Event emitted when assets are withdrawn instantly\\n  event InstantWithdrawal(\\n    address indexed operator,\\n    address indexed from,\\n    address indexed token,\\n    uint256 amount,\\n    uint256 redeemed,\\n    uint256 exitFee\\n  );\\n\\n  event ReserveWithdrawal(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when the Liquidity Cap is set\\n  event LiquidityCapSet(\\n    uint256 liquidityCap\\n  );\\n\\n  /// @dev Event emitted when the Credit plan is set\\n  event CreditPlanSet(\\n    address token,\\n    uint128 creditLimitMantissa,\\n    uint128 creditRateMantissa\\n  );\\n\\n  /// @dev Event emitted when the Prize Strategy is set\\n  event PrizeStrategySet(\\n    address indexed prizeStrategy\\n  );\\n\\n  /// @dev Emitted when credit is minted\\n  event CreditMinted(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when credit is burned\\n  event CreditBurned(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\\n  event ErrorAwardingExternalERC721(bytes error);\\n\\n\\n  struct CreditPlan {\\n    uint128 creditLimitMantissa;\\n    uint128 creditRateMantissa;\\n  }\\n\\n  struct CreditBalance {\\n    uint192 balance;\\n    uint32 timestamp;\\n    bool initialized;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  /// @dev Reserve to which reserve fees are sent\\n  RegistryInterface public reserveRegistry;\\n\\n  /// @dev An array of all the controlled tokens\\n  ControlledTokenInterface[] internal _tokens;\\n\\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\\n  TokenListenerInterface public prizeStrategy;\\n\\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\\n  /// For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\\n  uint256 public maxExitFeeMantissa;\\n\\n  /// @dev The total funds that have been allocated to the reserve\\n  uint256 public reserveTotalSupply;\\n\\n  /// @dev The total amount of funds that the prize pool can hold.\\n  uint256 public liquidityCap;\\n\\n  /// @dev the The awardable balance\\n  uint256 internal _currentAwardBalance;\\n\\n  /// @dev Stores the credit plan for each token.\\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\\n\\n  /// @dev Stores each users balance of credit per token.\\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\\n\\n  /// @notice Initializes the Prize Pool\\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\\n  /// @param _maxExitFeeMantissa The maximum exit fee size\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_reserveRegistry) != address(0), \\\"PrizePool/reserveRegistry-not-zero\\\");\\n    uint256 controlledTokensLength = _controlledTokens.length;\\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\\n\\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\\n      _addControlledToken(controlledToken, i);\\n    }\\n    __Ownable_init();\\n    __ReentrancyGuard_init();\\n    _setLiquidityCap(uint256(-1));\\n\\n    reserveRegistry = _reserveRegistry;\\n    maxExitFeeMantissa = _maxExitFeeMantissa;\\n\\n    emit Initialized(\\n      address(_reserveRegistry),\\n      maxExitFeeMantissa\\n    );\\n  }\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external override view returns (address) {\\n    return address(_token());\\n  }\\n\\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\\n  /// @return The underlying balance of assets\\n  function balance() external returns (uint256) {\\n    return _balance();\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function canAwardExternal(address _externalToken) external view returns (bool) {\\n    return _canAwardExternal(_externalToken);\\n  }\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    canAddLiquidity(amount)\\n  {\\n    address operator = _msgSender();\\n\\n    _mint(to, amount, controlledToken, referrer);\\n\\n    _token().safeTransferFrom(operator, address(this), amount);\\n    _supply(amount);\\n\\n    emit Deposited(operator, to, controlledToken, amount, referrer);\\n  }\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    returns (uint256)\\n  {\\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n    require(exitFee <= maximumExitFee, \\\"PrizePool/exit-fee-exceeds-user-maximum\\\");\\n\\n    // burn the credit\\n    _burnCredit(from, controlledToken, burnedCredit);\\n\\n    // burn the tickets\\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\\n\\n    // redeem the tickets less the fee\\n    uint256 amountLessFee = amount.sub(exitFee);\\n    uint256 redeemed = _redeem(amountLessFee);\\n\\n    _token().safeTransfer(from, redeemed);\\n\\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\\n\\n    return exitFee;\\n  }\\n\\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\\n  /// @param exitFee The exit fee to check against the limit\\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\\n    if (exitFee > maxFee) {\\n      exitFee = maxFee;\\n    }\\n    return exitFee;\\n  }\\n\\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\\n  /// @param from The address the tokens are being transferred from (0 if minting)\\n  /// @param to The address the tokens are being transferred to (0 if burning)\\n  /// @param amount The amount of tokens being trasferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\\n    if (from != address(0)) {\\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\\n      // first accrue credit for their old balance\\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\\n\\n      if (from != to) {\\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\\n      }\\n\\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\\n    }\\n    if (to != address(0) && to != from) {\\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\\n    }\\n    // if we aren't minting\\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\\n    }\\n  }\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external override view returns (uint256) {\\n    return _currentAwardBalance;\\n  }\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n\\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\\n    uint256 currentBalance = _balance();\\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\\n\\n    if (unaccountedPrizeBalance > 0) {\\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\\n      if (reserveFee > 0) {\\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\\n        emit ReserveFeeCaptured(reserveFee);\\n      }\\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\\n\\n      emit AwardCaptured(unaccountedPrizeBalance);\\n    }\\n\\n    return _currentAwardBalance;\\n  }\\n\\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\\n\\n    uint256 amount = reserveTotalSupply;\\n    reserveTotalSupply = 0;\\n    uint256 redeemed = _redeem(amount);\\n\\n    _token().safeTransfer(address(to), redeemed);\\n\\n    emit ReserveWithdrawal(to, amount);\\n\\n    return redeemed;\\n  }\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external override\\n    onlyPrizeStrategy\\n    onlyControlledToken(controlledToken)\\n  {\\n    if (amount == 0) {\\n      return;\\n    }\\n\\n    require(amount <= _currentAwardBalance, \\\"PrizePool/award-exceeds-avail\\\");\\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\\n\\n    _mint(to, amount, controlledToken, address(0));\\n\\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\\n\\n    emit Awarded(to, controlledToken, amount);\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit TransferredExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit AwardedExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  function _transferOut(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (bool)\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (amount == 0) {\\n      return false;\\n    }\\n\\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\\n\\n    return true;\\n  }\\n\\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\\n  /// @param to The user who is receiving the tokens\\n  /// @param amount The amount of tokens they are receiving\\n  /// @param controlledToken The token that is going to be minted\\n  /// @param referrer The user who referred the minting\\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\\n    if (address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n    ControlledToken(controlledToken).controllerMint(to, amount);\\n  }\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (tokenIds.length == 0) {\\n      return;\\n    }\\n\\n    for (uint256 i = 0; i < tokenIds.length; i++) {\\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\\n\\n      }\\n      catch(bytes memory error){\\n        emit ErrorAwardingExternalERC721(error);\\n      }\\n      \\n    }\\n\\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\\n  }\\n\\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\\n  /// @param amount The prize amount\\n  /// @return The size of the reserve portion of the prize\\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    if (address(reserve) == address(0)) {\\n      return 0;\\n    }\\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\\n    if (reserveRateMantissa == 0) {\\n      return 0;\\n    }\\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\\n  }\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external override\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    )\\n  {\\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n  }\\n\\n  /// @dev Calculates the early exit fee for the given amount\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return Exit fee\\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\\n    return _limitExitFee(\\n      amount,\\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external override\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    durationSeconds =_estimateCreditAccrualTime(\\n      _controlledToken,\\n      _principal,\\n      _interest\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function _estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    internal\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    // interest = credit rate * principal * time\\n    // => time = interest / (credit rate * principal)\\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\\n    if (accruedPerSecond == 0) {\\n      return 0;\\n    }\\n    return _interest.div(accruedPerSecond);\\n  }\\n\\n  /// @notice Burns a users credit.\\n  /// @param user The user whose credit should be burned\\n  /// @param credit The amount of credit to burn\\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\\n\\n    emit CreditBurned(user, controlledToken, credit);\\n  }\\n\\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\\n  /// @param user The user for whom to accrue credit\\n  /// @param controlledToken The controlled token whose balance we are checking\\n  /// @param controlledTokenBalance The balance to use for the user\\n  /// @param extra Additional credit to be added\\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\\n    _updateCreditBalance(\\n      user,\\n      controlledToken,\\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\\n    );\\n  }\\n\\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\\n    uint256 newBalance;\\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\\n    if (!creditBalance.initialized) {\\n      newBalance = 0;\\n    } else {\\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\\n    }\\n    return newBalance;\\n  }\\n\\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\\n\\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\\n      balance: newBalance.toUint128(),\\n      timestamp: _currentTime().toUint32(),\\n      initialized: true\\n    });\\n\\n    if (oldBalance < newBalance) {\\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\\n    } \\n    else if (newBalance < oldBalance) {\\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\\n    }\\n  }\\n\\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\\n  /// @param creditBalance The new credit balance to be checked\\n  /// @return The users new credit balance.  Will not exceed the credit limit.\\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\\n      controlledTokenBalance,\\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\\n    );\\n    if (creditBalance > creditLimit) {\\n      creditBalance = creditLimit;\\n    }\\n\\n    return creditBalance;\\n  }\\n\\n  /// @notice Calculates the accrued interest for a user\\n  /// @param user The user whose credit should be calculated.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\\n  /// @return The credit that has accrued since the last credit update.\\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\\n\\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\\n      return 0;\\n    }\\n\\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\\n  }\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\\n    return _tokenCreditBalances[controlledToken][user].balance;\\n  }\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external override\\n    onlyControlledToken(_controlledToken)\\n    onlyOwner\\n  {\\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\\n      creditLimitMantissa: _creditLimitMantissa,\\n      creditRateMantissa: _creditRateMantissa\\n    });\\n\\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\\n  }\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external override\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    )\\n  {\\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\\n  }\\n\\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The token they are withdrawing\\n  /// @param amount The amount of funds they are withdrawing\\n  /// @return earlyExitFee The additional exit fee that should be charged.\\n  /// @return creditBurned The amount of credit that will be burned\\n  function _calculateEarlyExitFeeLessBurnedCredit(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (\\n      uint256 earlyExitFee,\\n      uint256 creditBurned\\n    )\\n  {\\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\\n    require(controlledTokenBalance >= amount, \\\"PrizePool/insuff-funds\\\");\\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\\n    /*\\n    The credit is used *last*.  Always charge the fees up-front.\\n\\n    How to calculate:\\n\\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\\n\\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\\n    */\\n\\n    // Determine available usable credit based on withdraw amount\\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\\n\\n    uint256 availableCredit;\\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\\n    }\\n\\n    // Determine amount of credit to burn and amount of fees required\\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\\n    earlyExitFee = totalExitFee.sub(creditBurned);\\n  }\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\\n    _setLiquidityCap(_liquidityCap);\\n  }\\n\\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\\n    liquidityCap = _liquidityCap;\\n    emit LiquidityCapSet(_liquidityCap);\\n  }\\n\\n  /// @notice Adds a new controlled token\\n  /// @param _controlledToken The controlled token to add.\\n  /// @param index The index to add the controlledToken\\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\\n    require(_controlledToken.controller() == this, \\\"PrizePool/token-ctrlr-mismatch\\\");\\n    \\n    _tokens[index] = _controlledToken;\\n    emit ControlledTokenAdded(_controlledToken);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\\n    _setPrizeStrategy(_prizeStrategy);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\\n    require(address(_prizeStrategy) != address(0), \\\"PrizePool/prizeStrategy-not-zero\\\");\\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PrizePool/prizeStrategy-invalid\\\");\\n    prizeStrategy = _prizeStrategy;\\n\\n    emit PrizeStrategySet(address(_prizeStrategy));\\n  }\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\\n    return _tokens;\\n  }\\n\\n  /// @dev Gets the current time as represented by the current block\\n  /// @return The timestamp of the current block\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external override view returns (uint256) {\\n    return _tokenTotalSupply();\\n  }\\n\\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\\n  /// @param to The address to delegate to \\n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\\n    if (compLike.balanceOf(address(this)) > 0) {\\n      compLike.delegate(to);\\n    }\\n  }\\n  \\n  /// @notice Required for ERC721 safe token transfers from smart contracts.\\n  /// @param operator The address that acts on behalf of the owner\\n  /// @param from The current owner of the NFT\\n  /// @param tokenId The NFT to transfer\\n  /// @param data Additional data with no specified format, sent in call to `_to`.\\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function _tokenTotalSupply() internal view returns (uint256) {\\n    uint256 total = reserveTotalSupply;\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \\n    uint256 tokensLength = tokens.length;\\n    \\n    for(uint256 i = 0; i < tokensLength; i++){\\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\\n    }\\n\\n    return total;\\n  }\\n\\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\\n  }\\n\\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\\n    uint256 tokensLength = tokens.length;\\n\\n    for(uint256 i = 0; i < tokensLength; i++) {\\n      if(tokens[i] == controlledToken) return true;\\n    }\\n    return false;\\n  }\\n  \\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\\n    return _isControlled(controlledToken);\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function _token() internal virtual view returns (IERC20Upgradeable);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal virtual returns (uint256);\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal virtual;\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\\n\\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  modifier onlyControlledToken(address controlledToken) {\\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \\\"PrizePool/unknown-token\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure caller is the prize-strategy\\n  modifier onlyPrizeStrategy() {\\n    require(_msgSender() == address(prizeStrategy), \\\"PrizePool/only-prizeStrategy\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\\n  modifier canAddLiquidity(uint256 _amount) {\\n    require(_canAddLiquidity(_amount), \\\"PrizePool/exceeds-liquidity-cap\\\");\\n    _;\\n  }\\n\\n  modifier onlyReserve() {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    require(address(reserve) == msg.sender, \\\"PrizePool/only-reserve\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x386ebc1c80ab4424f14125e716dd12641ff933b475bf1082b7b1a6eee4a969c3\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/stake/StakePrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"../PrizePool.sol\\\";\\n\\ncontract StakePrizePool is PrizePool {\\n\\n  IERC20Upgradeable private stakeToken;\\n\\n  event StakePrizePoolInitialized(address indexed stakeToken);\\n\\n  /// @notice Initializes the Prize Pool and Yield Service with the required contract connections\\n  /// @param _controlledTokens Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\\n  /// @param _maxExitFeeMantissa The maximum exit fee size, relative to the withdrawal amount\\n  /// @param _stakeToken Address of the stake token\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa,\\n    IERC20Upgradeable _stakeToken\\n  )\\n    public\\n    initializer\\n  {\\n    PrizePool.initialize(\\n      _reserveRegistry,\\n      _controlledTokens,\\n      _maxExitFeeMantissa\\n    );\\n\\n    require(address(_stakeToken) != address(0), \\\"StakePrizePool/stake-token-not-zero-address\\\");\\n    stakeToken = _stakeToken;\\n\\n    emit StakePrizePoolInitialized(address(stakeToken));\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal override view returns (bool) {\\n    return address(stakeToken) != _externalToken;\\n  }\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal override returns (uint256) {\\n    return stakeToken.balanceOf(address(this));\\n  }\\n\\n  function _token() internal override view returns (IERC20Upgradeable) {\\n    return stakeToken;\\n  }\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal override {\\n    // no-op because nothing else needs to be done\\n  }\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal override returns (uint256) {\\n    return redeemAmount;\\n  }\\n}\\n\",\"keccak256\":\"0x3410ac3873521a451484e54c6319be3042f2d92da8030511403f192edb3f5798\",\"license\":\"GPL-3.0\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/test/StakePrizePoolHarness.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"../prize-pool/stake/StakePrizePool.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ncontract StakePrizePoolHarness is StakePrizePool {\\n\\n  uint256 public currentTime;\\n\\n  function setCurrentTime(uint256 _currentTime) external {\\n    currentTime = _currentTime;\\n  }\\n\\n  function _currentTime() internal override view returns (uint256) {\\n    return currentTime;\\n  }\\n\\n  function supply(uint256 mintAmount) external {\\n    //_supply(mintAmount);\\n  }\\n\\n  function redeem(uint256 redeemAmount) external returns (uint256) {\\n    return redeemAmount;\\n  }\\n}\",\"keccak256\":\"0x7975faa4daca38cda37956f7bbf0fdbf012c6a87399d0dedaf8377f97f950640\"},\"contracts/test/StakePrizePoolHarnessProxyFactory.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"./StakePrizePoolHarness.sol\\\";\\nimport \\\"../external/openzeppelin/ProxyFactory.sol\\\";\\n\\n/// @title Stake Prize Pool Proxy Factory\\n/// @notice Minimal proxy pattern for creating new Stake Prize Pools\\ncontract StakePrizePoolHarnessProxyFactory is ProxyFactory {\\n\\n  /// @notice Contract template for deploying proxied Prize Pools\\n  StakePrizePoolHarness public instance;\\n\\n  /// @notice Initializes the Factory with an instance of the Stake Prize Pool\\n  constructor () public {\\n    instance = new StakePrizePoolHarness();\\n  }\\n\\n  /// @notice Creates a new Stake Prize Pool as a proxy of the template instance\\n  /// @return A reference to the new proxied Stake Prize Pool\\n  function create() external returns (StakePrizePoolHarness) {\\n    return StakePrizePoolHarness(deployMinimal(address(instance), \\\"\\\"));\\n  }\\n}\\n\",\"keccak256\":\"0x19fa05ccbd0ffc1ed06fa0800442e67ee7e6446334a4f78d82f8152b906c8fef\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 14746,
                "contract": "contracts/test/StakePrizePoolHarnessProxyFactory.sol:StakePrizePoolHarnessProxyFactory",
                "label": "instance",
                "offset": 0,
                "slot": "0",
                "type": "t_contract(StakePrizePoolHarness)14736"
              }
            ],
            "types": {
              "t_contract(StakePrizePoolHarness)14736": {
                "encoding": "inplace",
                "label": "contract StakePrizePoolHarness",
                "numberOfBytes": "20"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "constructor": "Initializes the Factory with an instance of the Stake Prize Pool",
              "create()": {
                "notice": "Creates a new Stake Prize Pool as a proxy of the template instance"
              },
              "instance()": {
                "notice": "Contract template for deploying proxied Prize Pools"
              }
            },
            "notice": "Minimal proxy pattern for creating new Stake Prize Pools",
            "version": 1
          }
        }
      },
      "contracts/test/TokenFaucetHarness.sol": {
        "TokenFaucetHarness": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "newTokens",
                  "type": "uint256"
                }
              ],
              "name": "Claimed",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "Deposited",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "dripRatePerSecond",
                  "type": "uint256"
                }
              ],
              "name": "DripRateChanged",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "newTokens",
                  "type": "uint256"
                }
              ],
              "name": "Dripped",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20Upgradeable",
                  "name": "asset",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "contract IERC20Upgradeable",
                  "name": "measure",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "dripRatePerSecond",
                  "type": "uint256"
                }
              ],
              "name": "Initialized",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "Withdrawn",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "asset",
              "outputs": [
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "beforeTokenMint",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                }
              ],
              "name": "beforeTokenTransfer",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                }
              ],
              "name": "claim",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "deposit",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "drip",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "dripRatePerSecond",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "exchangeRateMantissa",
              "outputs": [
                {
                  "internalType": "uint112",
                  "name": "",
                  "type": "uint112"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_asset",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_measure",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_dripRatePerSecond",
                  "type": "uint256"
                }
              ],
              "name": "initialize",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "lastDripTimestamp",
              "outputs": [
                {
                  "internalType": "uint32",
                  "name": "",
                  "type": "uint32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "measure",
              "outputs": [
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "renounceOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint32",
                  "name": "_time",
                  "type": "uint32"
                }
              ],
              "name": "setCurrentTime",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_dripRatePerSecond",
                  "type": "uint256"
                }
              ],
              "name": "setDripRatePerSecond",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes4",
                  "name": "interfaceId",
                  "type": "bytes4"
                }
              ],
              "name": "supportsInterface",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalUnclaimed",
              "outputs": [
                {
                  "internalType": "uint112",
                  "name": "",
                  "type": "uint112"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "userStates",
              "outputs": [
                {
                  "internalType": "uint128",
                  "name": "lastExchangeRateMantissa",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "balance",
                  "type": "uint128"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "withdrawTo",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "beforeTokenMint(address,uint256,address,address)": {
                "params": {
                  "to": "The user who is minting the tokens",
                  "token": "The token they are minting"
                }
              },
              "beforeTokenTransfer(address,address,uint256,address)": {
                "params": {
                  "from": "The user who is sending the tokens",
                  "to": "The user who is receiving the tokens",
                  "token": "The token token they are burning"
                }
              },
              "claim(address)": {
                "params": {
                  "user": "The user to claim tokens for"
                },
                "returns": {
                  "_0": "The amount of tokens that were claimed."
                }
              },
              "deposit(uint256)": {
                "params": {
                  "amount": "The amount of asset tokens to add (must be approved already)"
                }
              },
              "drip()": {
                "details": "Should be called immediately before any measure token mints/transfers/burns",
                "returns": {
                  "_0": "The number of new tokens dripped."
                }
              },
              "initialize(address,address,uint256)": {
                "params": {
                  "_asset": "The asset to disburse to users",
                  "_dripRatePerSecond": "The amount of the asset to drip each second",
                  "_measure": "The token to use to measure a users portion"
                }
              },
              "owner()": {
                "details": "Returns the address of the current owner."
              },
              "renounceOwnership()": {
                "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
              },
              "setDripRatePerSecond(uint256)": {
                "params": {
                  "_dripRatePerSecond": "The new drip rate in tokens per second"
                }
              },
              "supportsInterface(bytes4)": {
                "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."
              },
              "transferOwnership(address)": {
                "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
              },
              "withdrawTo(address,uint256)": {
                "params": {
                  "amount": "The amount to withdraw",
                  "to": "The address to withdraw to"
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50611947806100206000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c80638da5cb5b116100ad578063ca5baafc11610071578063ca5baafc14610259578063d9772a251461026c578063e318613e14610281578063efa9a1ad14610289578063f2fde38b146102915761012c565b80638da5cb5b1461020e5780639f678cca14610216578063b22109571461021e578063b6b55f2514610231578063c96f14b8146102445761012c565b8063205c2878116100f4578063205c2878146101b857806338d52e0f146101cb5780634d7f3db0146101e0578063644a9e71146101f3578063715018a6146102065761012c565b806301ffc9a7146101315780630ecc535f1461015a5780631794bb3c1461017b578063187f3334146101905780631e83409a146101a5575b600080fd5b61014461013f36600461148d565b6102a4565b604051610151919061159a565b60405180910390f35b61016d61016836600461138d565b6102e0565b6040516101519291906118c8565b61018e6101893660046114b5565b610306565b005b610198610451565b60405161015191906118e2565b6101986101b336600461138d565b610457565b61018e6101c63660046113fb565b6105c4565b6101d361079f565b6040516101519190611549565b61018e6101ee366004611426565b6107ae565b61018e610201366004611525565b6107dd565b61018e6107f9565b6101d3610882565b610198610892565b61018e61022c3660046113a9565b610b47565b61018e61023f3660046114f5565b610b83565b61024c610c57565b60405161015191906118b4565b61018e6102673660046114f5565b610c6d565b610274610d15565b60405161015191906118eb565b61024c610d28565b6101d3610d37565b61018e61029f36600461138d565b610d46565b60006001600160e01b031982166301ffc9a760e01b14806102d857506001600160e01b03198216600162a1cb1960e01b0319145b90505b919050565b6069602052600090815260409020546001600160801b0380821691600160801b90041682565b600054610100900460ff168061031f575061031f610e07565b8061032d575060005460ff16155b6103525760405162461bcd60e51b8152600401610349906116f3565b60405180910390fd5b600054610100900460ff1615801561037d576000805460ff1961ff0019909116610100171660011790555b610385610e18565b61038d610eab565b6068805463ffffffff92909216600160e01b026001600160e01b03909216919091179055606580546001600160a01b038087166001600160a01b03199283161790925560668054928616929091169190911790556103ea82610c6d565b6066546065546067546040516001600160a01b0393841693909216917f10f27652c1015195ca7e6bc9b4c724cbf18e91c42117d92124703a3f49bb240f91610431916118e2565b60405180910390a3801561044b576000805461ff00191690555b50505050565b60675481565b6000610461610892565b5061046b82610eb7565b506001600160a01b038216600090815260696020526040902080546001600160801b03808216909255606854600160801b909104909116906104c6906104c190600160701b90046001600160701b031683611063565b611090565b606880546001600160701b0392909216600160701b026dffffffffffffffffffffffffffff60701b1990921691909117905560655460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061052a9086908590600401611581565b602060405180830381600087803b15801561054457600080fd5b505af1158015610558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057c919061146d565b50826001600160a01b03167fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a826040516105b691906118e2565b60405180910390a292915050565b6105cc6110b9565b6001600160a01b03166105dd610882565b6001600160a01b0316146106035760405162461bcd60e51b8152600401610349906117b9565b61060b610892565b506065546040516370a0823160e01b81526000916001600160a01b0316906370a082319061063d903090600401611549565b60206040518083038186803b15801561065557600080fd5b505afa158015610669573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068d919061150d565b6068549091506000906106b1908390600160701b90046001600160701b0316611063565b9050808311156106d35760405162461bcd60e51b81526004016103499061187d565b60655460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906107059087908790600401611581565b602060405180830381600087803b15801561071f57600080fd5b505af1158015610733573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610757919061146d565b50836001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58460405161079191906118e2565b60405180910390a250505050565b6065546001600160a01b031681565b6066546001600160a01b038381169116141561044b576107cc610892565b506107d684610eb7565b5050505050565b606a805463ffffffff191663ffffffff92909216919091179055565b6108016110b9565b6001600160a01b0316610812610882565b6001600160a01b0316146108385760405162461bcd60e51b8152600401610349906117b9565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6033546001600160a01b03165b90565b60008061089d610eab565b60685463ffffffff9182169250600160e01b9004168114156108c357600091505061088f565b6065546040516370a0823160e01b81526000916001600160a01b0316906370a08231906108f4903090600401611549565b60206040518083038186803b15801561090c57600080fd5b505afa158015610920573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610944919061150d565b606854909150600090610968908390600160701b90046001600160701b0316611063565b60685490915060009061098d90859063ffffffff600160e01b90910481169061106316565b606854606654604080516318160ddd60e01b815290519394506001600160701b039092169260009283926001600160a01b0316916318160ddd91600480820192602092909190829003018186803b1580156109e757600080fd5b505afa1580156109fb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1f919061150d565b9050600081118015610a315750600085115b15610aa557606754610a449085906110bd565b915084821115610a52578491505b6000610a5e83836110fe565b9050610a6a8482611127565b93507f7de59a92c9386255180c28ede4b61edb9b7b2ac96855ac634151489cef21bad683604051610a9b91906118e2565b60405180910390a1505b610aae83611090565b606880546dffffffffffffffffffffffffffff19166001600160701b039283161790819055610ae9916104c191600160701b90041684611127565b6068600e6101000a8154816001600160701b0302191690836001600160701b03160217905550610b188761114c565b6068805463ffffffff92909216600160e01b026001600160e01b03909216919091179055509550505050505090565b6066546001600160a01b038281169116148015610b6c57506001600160a01b03841615155b1561044b57610b79610892565b506107cc83610eb7565b610b8b610892565b506065546040516323b872dd60e01b81526001600160a01b03909116906323b872dd90610bc09033903090869060040161155d565b602060405180830381600087803b158015610bda57600080fd5b505af1158015610bee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c12919061146d565b50336001600160a01b03167f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c482604051610c4c91906118e2565b60405180910390a250565b606854600160701b90046001600160701b031681565b610c756110b9565b6001600160a01b0316610c86610882565b6001600160a01b031614610cac5760405162461bcd60e51b8152600401610349906117b9565b60008111610ccc5760405162461bcd60e51b815260040161034990611782565b610cd4610892565b5060678190556040517f3d38e7cd2e029035006f9977a727c8724cd41dffb6d2a40d9f66bd4c26836a3290610d0a9083906118e2565b60405180910390a150565b606854600160e01b900463ffffffff1681565b6068546001600160701b031681565b6066546001600160a01b031681565b610d4e6110b9565b6001600160a01b0316610d5f610882565b6001600160a01b031614610d855760405162461bcd60e51b8152600401610349906117b9565b6001600160a01b038116610dab5760405162461bcd60e51b8152600401610349906115f8565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610e1230611172565b15905090565b600054610100900460ff1680610e315750610e31610e07565b80610e3f575060005460ff16155b610e5b5760405162461bcd60e51b8152600401610349906116f3565b600054610100900460ff16158015610e86576000805460ff1961ff0019909116610100171660011790555b610e8e611178565b610e966111f9565b8015610ea8576000805461ff00191690555b50565b606a5463ffffffff1690565b6001600160a01b038116600090815260696020526040812080546068546001600160701b03166001600160801b039091161415610ef85760009150506102db565b8054606854600091610f1c916001600160701b0316906001600160801b0316611063565b6066546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190610f52908890600401611549565b60206040518083038186803b158015610f6a57600080fd5b505afa158015610f7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa2919061150d565b90506000610fb8610fb383856112d3565b6112f4565b604080518082019091526068546001600160701b031681528554919250906020820190610ffd90610fb390600160801b90046001600160801b03908116908616611127565b6001600160801b039081169091526001600160a01b03881660009081526069602090815260409091208351815494909201518316600160801b029183166fffffffffffffffffffffffffffffffff19909416939093179091161790559350505050919050565b6000828211156110855760405162461bcd60e51b8152600401610349906116bc565b508082035b92915050565b6000600160701b82106110b55760405162461bcd60e51b8152600401610349906117ee565b5090565b3390565b6000826110cc5750600061108a565b828202828482816110d957fe5b04146110f75760405162461bcd60e51b815260040161034990611741565b9392505050565b60008061111384670de0b6b3a76400006110bd565b905061111f8184611319565b949350505050565b6000828201838110156110f75760405162461bcd60e51b81526004016103499061163e565b600064010000000082106110b55760405162461bcd60e51b815260040161034990611837565b3b151590565b600054610100900460ff16806111915750611191610e07565b8061119f575060005460ff16155b6111bb5760405162461bcd60e51b8152600401610349906116f3565b600054610100900460ff16158015610e96576000805460ff1961ff0019909116610100171660011790558015610ea8576000805461ff001916905550565b600054610100900460ff16806112125750611212610e07565b80611220575060005460ff16155b61123c5760405162461bcd60e51b8152600401610349906116f3565b600054610100900460ff16158015611267576000805460ff1961ff0019909116610100171660011790555b60006112716110b9565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610ea8576000805461ff001916905550565b6000806112e083856110bd565b905061111f81670de0b6b3a7640000611319565b6000600160801b82106110b55760405162461bcd60e51b815260040161034990611675565b60006110f783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250600081836113775760405162461bcd60e51b815260040161034991906115a5565b50600083858161138357fe5b0495945050505050565b60006020828403121561139e578081fd5b81356110f7816118fc565b600080600080608085870312156113be578283fd5b84356113c9816118fc565b935060208501356113d9816118fc565b92506040850135915060608501356113f0816118fc565b939692955090935050565b6000806040838503121561140d578182fd5b8235611418816118fc565b946020939093013593505050565b6000806000806080858703121561143b578384fd5b8435611446816118fc565b935060208501359250604085013561145d816118fc565b915060608501356113f0816118fc565b60006020828403121561147e578081fd5b815180151581146110f7578182fd5b60006020828403121561149e578081fd5b81356001600160e01b0319811681146110f7578182fd5b6000806000606084860312156114c9578283fd5b83356114d4816118fc565b925060208401356114e4816118fc565b929592945050506040919091013590565b600060208284031215611506578081fd5b5035919050565b60006020828403121561151e578081fd5b5051919050565b600060208284031215611536578081fd5b813563ffffffff811681146110f7578182fd5b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602080835283518082850152825b818110156115d1578581018301518582016040015282016115b5565b818111156115e25783604083870101525b50601f01601f1916929092016040019392505050565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526027908201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316040820152663238206269747360c81b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601c908201527f546f6b656e4661756365742f64726970526174652d67742d7a65726f00000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f53616665436173743a2076616c756520646f65736e27742066697420696e206160408201526837103ab4b73a18989960b91b606082015260800190565b60208082526026908201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360408201526532206269747360d01b606082015260800190565b6020808252601e908201527f546f6b656e4661756365742f696e73756666696369656e742d66756e64730000604082015260600190565b6001600160701b0391909116815260200190565b6001600160801b0392831681529116602082015260400190565b90815260200190565b63ffffffff91909116815260200190565b6001600160a01b0381168114610ea857600080fdfea2646970667358221220ac65a85dad87186737a581e0a956ff8c914a0953e072c5fa94384fe21bff04c964736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1947 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x12C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0xAD JUMPI DUP1 PUSH4 0xCA5BAAFC GT PUSH2 0x71 JUMPI DUP1 PUSH4 0xCA5BAAFC EQ PUSH2 0x259 JUMPI DUP1 PUSH4 0xD9772A25 EQ PUSH2 0x26C JUMPI DUP1 PUSH4 0xE318613E EQ PUSH2 0x281 JUMPI DUP1 PUSH4 0xEFA9A1AD EQ PUSH2 0x289 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x291 JUMPI PUSH2 0x12C JUMP JUMPDEST DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x20E JUMPI DUP1 PUSH4 0x9F678CCA EQ PUSH2 0x216 JUMPI DUP1 PUSH4 0xB2210957 EQ PUSH2 0x21E JUMPI DUP1 PUSH4 0xB6B55F25 EQ PUSH2 0x231 JUMPI DUP1 PUSH4 0xC96F14B8 EQ PUSH2 0x244 JUMPI PUSH2 0x12C JUMP JUMPDEST DUP1 PUSH4 0x205C2878 GT PUSH2 0xF4 JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x1B8 JUMPI DUP1 PUSH4 0x38D52E0F EQ PUSH2 0x1CB JUMPI DUP1 PUSH4 0x4D7F3DB0 EQ PUSH2 0x1E0 JUMPI DUP1 PUSH4 0x644A9E71 EQ PUSH2 0x1F3 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x206 JUMPI PUSH2 0x12C JUMP JUMPDEST DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x131 JUMPI DUP1 PUSH4 0xECC535F EQ PUSH2 0x15A JUMPI DUP1 PUSH4 0x1794BB3C EQ PUSH2 0x17B JUMPI DUP1 PUSH4 0x187F3334 EQ PUSH2 0x190 JUMPI DUP1 PUSH4 0x1E83409A EQ PUSH2 0x1A5 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x144 PUSH2 0x13F CALLDATASIZE PUSH1 0x4 PUSH2 0x148D JUMP JUMPDEST PUSH2 0x2A4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x151 SWAP2 SWAP1 PUSH2 0x159A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x16D PUSH2 0x168 CALLDATASIZE PUSH1 0x4 PUSH2 0x138D JUMP JUMPDEST PUSH2 0x2E0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x151 SWAP3 SWAP2 SWAP1 PUSH2 0x18C8 JUMP JUMPDEST PUSH2 0x18E PUSH2 0x189 CALLDATASIZE PUSH1 0x4 PUSH2 0x14B5 JUMP JUMPDEST PUSH2 0x306 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x198 PUSH2 0x451 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x151 SWAP2 SWAP1 PUSH2 0x18E2 JUMP JUMPDEST PUSH2 0x198 PUSH2 0x1B3 CALLDATASIZE PUSH1 0x4 PUSH2 0x138D JUMP JUMPDEST PUSH2 0x457 JUMP JUMPDEST PUSH2 0x18E PUSH2 0x1C6 CALLDATASIZE PUSH1 0x4 PUSH2 0x13FB JUMP JUMPDEST PUSH2 0x5C4 JUMP JUMPDEST PUSH2 0x1D3 PUSH2 0x79F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x151 SWAP2 SWAP1 PUSH2 0x1549 JUMP JUMPDEST PUSH2 0x18E PUSH2 0x1EE CALLDATASIZE PUSH1 0x4 PUSH2 0x1426 JUMP JUMPDEST PUSH2 0x7AE JUMP JUMPDEST PUSH2 0x18E PUSH2 0x201 CALLDATASIZE PUSH1 0x4 PUSH2 0x1525 JUMP JUMPDEST PUSH2 0x7DD JUMP JUMPDEST PUSH2 0x18E PUSH2 0x7F9 JUMP JUMPDEST PUSH2 0x1D3 PUSH2 0x882 JUMP JUMPDEST PUSH2 0x198 PUSH2 0x892 JUMP JUMPDEST PUSH2 0x18E PUSH2 0x22C CALLDATASIZE PUSH1 0x4 PUSH2 0x13A9 JUMP JUMPDEST PUSH2 0xB47 JUMP JUMPDEST PUSH2 0x18E PUSH2 0x23F CALLDATASIZE PUSH1 0x4 PUSH2 0x14F5 JUMP JUMPDEST PUSH2 0xB83 JUMP JUMPDEST PUSH2 0x24C PUSH2 0xC57 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x151 SWAP2 SWAP1 PUSH2 0x18B4 JUMP JUMPDEST PUSH2 0x18E PUSH2 0x267 CALLDATASIZE PUSH1 0x4 PUSH2 0x14F5 JUMP JUMPDEST PUSH2 0xC6D JUMP JUMPDEST PUSH2 0x274 PUSH2 0xD15 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x151 SWAP2 SWAP1 PUSH2 0x18EB JUMP JUMPDEST PUSH2 0x24C PUSH2 0xD28 JUMP JUMPDEST PUSH2 0x1D3 PUSH2 0xD37 JUMP JUMPDEST PUSH2 0x18E PUSH2 0x29F CALLDATASIZE PUSH1 0x4 PUSH2 0x138D JUMP JUMPDEST PUSH2 0xD46 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL EQ DUP1 PUSH2 0x2D8 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT EQ JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x69 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV AND DUP3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x31F JUMPI POP PUSH2 0x31F PUSH2 0xE07 JUMP JUMPDEST DUP1 PUSH2 0x32D JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x352 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x16F3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x37D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x385 PUSH2 0xE18 JUMP JUMPDEST PUSH2 0x38D PUSH2 0xEAB JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH4 0xFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xE0 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x65 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SWAP3 SSTORE PUSH1 0x66 DUP1 SLOAD SWAP3 DUP7 AND SWAP3 SWAP1 SWAP2 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x3EA DUP3 PUSH2 0xC6D JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x65 SLOAD PUSH1 0x67 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND SWAP4 SWAP1 SWAP3 AND SWAP2 PUSH32 0x10F27652C1015195CA7E6BC9B4C724CBF18E91C42117D92124703A3F49BB240F SWAP2 PUSH2 0x431 SWAP2 PUSH2 0x18E2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 DUP1 ISZERO PUSH2 0x44B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x67 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x461 PUSH2 0x892 JUMP JUMPDEST POP PUSH2 0x46B DUP3 PUSH2 0xEB7 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP1 SWAP3 SSTORE PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV SWAP1 SWAP2 AND SWAP1 PUSH2 0x4C6 SWAP1 PUSH2 0x4C1 SWAP1 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP4 PUSH2 0x1063 JUMP JUMPDEST PUSH2 0x1090 JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP3 SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x70 SHL MUL PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x70 SHL NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x65 SLOAD PUSH1 0x40 MLOAD PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xA9059CBB SWAP1 PUSH2 0x52A SWAP1 DUP7 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x1581 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x544 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x558 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x57C SWAP2 SWAP1 PUSH2 0x146D JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xD8138F8A3F377C5259CA548E70E4C2DE94F129F5A11036A15B69513CBA2B426A DUP3 PUSH1 0x40 MLOAD PUSH2 0x5B6 SWAP2 SWAP1 PUSH2 0x18E2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x5CC PUSH2 0x10B9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x5DD PUSH2 0x882 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x603 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x17B9 JUMP JUMPDEST PUSH2 0x60B PUSH2 0x892 JUMP JUMPDEST POP PUSH1 0x65 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0x63D SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x1549 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x655 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x669 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x68D SWAP2 SWAP1 PUSH2 0x150D JUMP JUMPDEST PUSH1 0x68 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0x6B1 SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND PUSH2 0x1063 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x6D3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x187D JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x40 MLOAD PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xA9059CBB SWAP1 PUSH2 0x705 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x1581 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x71F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x733 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x757 SWAP2 SWAP1 PUSH2 0x146D JUMP JUMPDEST POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x7084F5476618D8E60B11EF0D7D3F06914655ADB8793E28FF7F018D4C76D505D5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x791 SWAP2 SWAP1 PUSH2 0x18E2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x44B JUMPI PUSH2 0x7CC PUSH2 0x892 JUMP JUMPDEST POP PUSH2 0x7D6 DUP5 PUSH2 0xEB7 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH4 0xFFFFFFFF NOT AND PUSH4 0xFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x801 PUSH2 0x10B9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x812 PUSH2 0x882 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x838 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x17B9 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x89D PUSH2 0xEAB JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH4 0xFFFFFFFF SWAP2 DUP3 AND SWAP3 POP PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV AND DUP2 EQ ISZERO PUSH2 0x8C3 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x88F JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0x8F4 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x1549 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x90C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x920 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x944 SWAP2 SWAP1 PUSH2 0x150D JUMP JUMPDEST PUSH1 0x68 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0x968 SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND PUSH2 0x1063 JUMP JUMPDEST PUSH1 0x68 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0x98D SWAP1 DUP6 SWAP1 PUSH4 0xFFFFFFFF PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 SWAP2 DIV DUP2 AND SWAP1 PUSH2 0x1063 AND JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x18160DDD PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD SWAP4 SWAP5 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP1 SWAP3 AND SWAP3 PUSH1 0x0 SWAP3 DUP4 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x18160DDD SWAP2 PUSH1 0x4 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x9E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x9FB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xA1F SWAP2 SWAP1 PUSH2 0x150D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 GT DUP1 ISZERO PUSH2 0xA31 JUMPI POP PUSH1 0x0 DUP6 GT JUMPDEST ISZERO PUSH2 0xAA5 JUMPI PUSH1 0x67 SLOAD PUSH2 0xA44 SWAP1 DUP6 SWAP1 PUSH2 0x10BD JUMP JUMPDEST SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0xA52 JUMPI DUP5 SWAP2 POP JUMPDEST PUSH1 0x0 PUSH2 0xA5E DUP4 DUP4 PUSH2 0x10FE JUMP JUMPDEST SWAP1 POP PUSH2 0xA6A DUP5 DUP3 PUSH2 0x1127 JUMP JUMPDEST SWAP4 POP PUSH32 0x7DE59A92C9386255180C28EDE4B61EDB9B7B2AC96855AC634151489CEF21BAD6 DUP4 PUSH1 0x40 MLOAD PUSH2 0xA9B SWAP2 SWAP1 PUSH2 0x18E2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMPDEST PUSH2 0xAAE DUP4 PUSH2 0x1090 JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP3 DUP4 AND OR SWAP1 DUP2 SWAP1 SSTORE PUSH2 0xAE9 SWAP2 PUSH2 0x4C1 SWAP2 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV AND DUP5 PUSH2 0x1127 JUMP JUMPDEST PUSH1 0x68 PUSH1 0xE PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND MUL OR SWAP1 SSTORE POP PUSH2 0xB18 DUP8 PUSH2 0x114C JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH4 0xFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xE0 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP SWAP6 POP POP POP POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND SWAP2 AND EQ DUP1 ISZERO PUSH2 0xB6C JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x44B JUMPI PUSH2 0xB79 PUSH2 0x892 JUMP JUMPDEST POP PUSH2 0x7CC DUP4 PUSH2 0xEB7 JUMP JUMPDEST PUSH2 0xB8B PUSH2 0x892 JUMP JUMPDEST POP PUSH1 0x65 SLOAD PUSH1 0x40 MLOAD PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x23B872DD SWAP1 PUSH2 0xBC0 SWAP1 CALLER SWAP1 ADDRESS SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x155D JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xBDA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xBEE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xC12 SWAP2 SWAP1 PUSH2 0x146D JUMP JUMPDEST POP CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x2DA466A7B24304F47E87FA2E1E5A81B9831CE54FEC19055CE277CA2F39BA42C4 DUP3 PUSH1 0x40 MLOAD PUSH2 0xC4C SWAP2 SWAP1 PUSH2 0x18E2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0xC75 PUSH2 0x10B9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xC86 PUSH2 0x882 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xCAC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x17B9 JUMP JUMPDEST PUSH1 0x0 DUP2 GT PUSH2 0xCCC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x1782 JUMP JUMPDEST PUSH2 0xCD4 PUSH2 0x892 JUMP JUMPDEST POP PUSH1 0x67 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x3D38E7CD2E029035006F9977A727C8724CD41DFFB6D2A40D9F66BD4C26836A32 SWAP1 PUSH2 0xD0A SWAP1 DUP4 SWAP1 PUSH2 0x18E2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0xD4E PUSH2 0x10B9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xD5F PUSH2 0x882 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xD85 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x17B9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0xDAB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x15F8 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE12 ADDRESS PUSH2 0x1172 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0xE31 JUMPI POP PUSH2 0xE31 PUSH2 0xE07 JUMP JUMPDEST DUP1 PUSH2 0xE3F JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0xE5B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x16F3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0xE86 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0xE8E PUSH2 0x1178 JUMP JUMPDEST PUSH2 0xE96 PUSH2 0x11F9 JUMP JUMPDEST DUP1 ISZERO PUSH2 0xEA8 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 SWAP2 AND EQ ISZERO PUSH2 0xEF8 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x2DB JUMP JUMPDEST DUP1 SLOAD PUSH1 0x68 SLOAD PUSH1 0x0 SWAP2 PUSH2 0xF1C SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x1063 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE SWAP2 SWAP3 POP PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0xF52 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x1549 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF6A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xF7E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xFA2 SWAP2 SWAP1 PUSH2 0x150D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xFB8 PUSH2 0xFB3 DUP4 DUP6 PUSH2 0x12D3 JUMP JUMPDEST PUSH2 0x12F4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP2 MSTORE DUP6 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x20 DUP3 ADD SWAP1 PUSH2 0xFFD SWAP1 PUSH2 0xFB3 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND SWAP1 DUP7 AND PUSH2 0x1127 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP4 MLOAD DUP2 SLOAD SWAP5 SWAP1 SWAP3 ADD MLOAD DUP4 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP2 DUP4 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP2 AND OR SWAP1 SSTORE SWAP4 POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1085 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x16BC JUMP JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x70 SHL DUP3 LT PUSH2 0x10B5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x17EE JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x10CC JUMPI POP PUSH1 0x0 PUSH2 0x108A JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x10D9 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x10F7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x1741 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1113 DUP5 PUSH8 0xDE0B6B3A7640000 PUSH2 0x10BD JUMP JUMPDEST SWAP1 POP PUSH2 0x111F DUP2 DUP5 PUSH2 0x1319 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x10F7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x163E JUMP JUMPDEST PUSH1 0x0 PUSH5 0x100000000 DUP3 LT PUSH2 0x10B5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x1837 JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1191 JUMPI POP PUSH2 0x1191 PUSH2 0xE07 JUMP JUMPDEST DUP1 PUSH2 0x119F JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x11BB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x16F3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0xE96 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xEA8 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1212 JUMPI POP PUSH2 0x1212 PUSH2 0xE07 JUMP JUMPDEST DUP1 PUSH2 0x1220 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x123C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x16F3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1267 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x1271 PUSH2 0x10B9 JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0xEA8 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x12E0 DUP4 DUP6 PUSH2 0x10BD JUMP JUMPDEST SWAP1 POP PUSH2 0x111F DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x1319 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x10B5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x1675 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10F7 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH1 0x0 DUP2 DUP4 PUSH2 0x1377 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP2 SWAP1 PUSH2 0x15A5 JUMP JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x1383 JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x139E JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x10F7 DUP2 PUSH2 0x18FC JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x13BE JUMPI DUP3 DUP4 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x13C9 DUP2 PUSH2 0x18FC JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x13D9 DUP2 PUSH2 0x18FC JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x13F0 DUP2 PUSH2 0x18FC JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x140D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1418 DUP2 PUSH2 0x18FC JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x143B JUMPI DUP4 DUP5 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1446 DUP2 PUSH2 0x18FC JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x145D DUP2 PUSH2 0x18FC JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x13F0 DUP2 PUSH2 0x18FC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x147E JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x10F7 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x149E JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND DUP2 EQ PUSH2 0x10F7 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x14C9 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x14D4 DUP2 PUSH2 0x18FC JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x14E4 DUP2 PUSH2 0x18FC JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1506 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x151E JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1536 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x10F7 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 MSTORE DUP4 MLOAD DUP1 DUP3 DUP6 ADD MSTORE DUP3 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x15D1 JUMPI DUP6 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0x40 ADD MSTORE DUP3 ADD PUSH2 0x15B5 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x15E2 JUMPI DUP4 PUSH1 0x40 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x40 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x646472657373 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x27 SWAP1 DUP3 ADD MSTORE PUSH32 0x53616665436173743A2076616C756520646F65736E27742066697420696E2031 PUSH1 0x40 DUP3 ADD MSTORE PUSH7 0x32382062697473 PUSH1 0xC8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1E SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2E SWAP1 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x40 DUP3 ADD MSTORE PUSH14 0x191E481A5B9A5D1A585B1A5E9959 PUSH1 0x92 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x21 SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206D756C7469706C69636174696F6E206F766572666C6F PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x77 PUSH1 0xF8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x546F6B656E4661756365742F64726970526174652D67742D7A65726F00000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x29 SWAP1 DUP3 ADD MSTORE PUSH32 0x53616665436173743A2076616C756520646F65736E27742066697420696E2061 PUSH1 0x40 DUP3 ADD MSTORE PUSH9 0x37103AB4B73A189899 PUSH1 0xB9 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x53616665436173743A2076616C756520646F65736E27742066697420696E2033 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x322062697473 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1E SWAP1 DUP3 ADD MSTORE PUSH32 0x546F6B656E4661756365742F696E73756666696369656E742D66756E64730000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xEA8 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xAC PUSH6 0xA85DAD871867 CALLDATACOPY 0xA5 DUP2 0xE0 0xA9 JUMP SELFDESTRUCT DUP13 SWAP2 0x4A MULMOD MSTORE8 0xE0 PUSH19 0xC5FA94384FE21BFF04C964736F6C634300060C STOP CALLER ",
              "sourceMap": "149:236:82:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506004361061012c5760003560e01c80638da5cb5b116100ad578063ca5baafc11610071578063ca5baafc14610259578063d9772a251461026c578063e318613e14610281578063efa9a1ad14610289578063f2fde38b146102915761012c565b80638da5cb5b1461020e5780639f678cca14610216578063b22109571461021e578063b6b55f2514610231578063c96f14b8146102445761012c565b8063205c2878116100f4578063205c2878146101b857806338d52e0f146101cb5780634d7f3db0146101e0578063644a9e71146101f3578063715018a6146102065761012c565b806301ffc9a7146101315780630ecc535f1461015a5780631794bb3c1461017b578063187f3334146101905780631e83409a146101a5575b600080fd5b61014461013f36600461148d565b6102a4565b604051610151919061159a565b60405180910390f35b61016d61016836600461138d565b6102e0565b6040516101519291906118c8565b61018e6101893660046114b5565b610306565b005b610198610451565b60405161015191906118e2565b6101986101b336600461138d565b610457565b61018e6101c63660046113fb565b6105c4565b6101d361079f565b6040516101519190611549565b61018e6101ee366004611426565b6107ae565b61018e610201366004611525565b6107dd565b61018e6107f9565b6101d3610882565b610198610892565b61018e61022c3660046113a9565b610b47565b61018e61023f3660046114f5565b610b83565b61024c610c57565b60405161015191906118b4565b61018e6102673660046114f5565b610c6d565b610274610d15565b60405161015191906118eb565b61024c610d28565b6101d3610d37565b61018e61029f36600461138d565b610d46565b60006001600160e01b031982166301ffc9a760e01b14806102d857506001600160e01b03198216600162a1cb1960e01b0319145b90505b919050565b6069602052600090815260409020546001600160801b0380821691600160801b90041682565b600054610100900460ff168061031f575061031f610e07565b8061032d575060005460ff16155b6103525760405162461bcd60e51b8152600401610349906116f3565b60405180910390fd5b600054610100900460ff1615801561037d576000805460ff1961ff0019909116610100171660011790555b610385610e18565b61038d610eab565b6068805463ffffffff92909216600160e01b026001600160e01b03909216919091179055606580546001600160a01b038087166001600160a01b03199283161790925560668054928616929091169190911790556103ea82610c6d565b6066546065546067546040516001600160a01b0393841693909216917f10f27652c1015195ca7e6bc9b4c724cbf18e91c42117d92124703a3f49bb240f91610431916118e2565b60405180910390a3801561044b576000805461ff00191690555b50505050565b60675481565b6000610461610892565b5061046b82610eb7565b506001600160a01b038216600090815260696020526040902080546001600160801b03808216909255606854600160801b909104909116906104c6906104c190600160701b90046001600160701b031683611063565b611090565b606880546001600160701b0392909216600160701b026dffffffffffffffffffffffffffff60701b1990921691909117905560655460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061052a9086908590600401611581565b602060405180830381600087803b15801561054457600080fd5b505af1158015610558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057c919061146d565b50826001600160a01b03167fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a826040516105b691906118e2565b60405180910390a292915050565b6105cc6110b9565b6001600160a01b03166105dd610882565b6001600160a01b0316146106035760405162461bcd60e51b8152600401610349906117b9565b61060b610892565b506065546040516370a0823160e01b81526000916001600160a01b0316906370a082319061063d903090600401611549565b60206040518083038186803b15801561065557600080fd5b505afa158015610669573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068d919061150d565b6068549091506000906106b1908390600160701b90046001600160701b0316611063565b9050808311156106d35760405162461bcd60e51b81526004016103499061187d565b60655460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906107059087908790600401611581565b602060405180830381600087803b15801561071f57600080fd5b505af1158015610733573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610757919061146d565b50836001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58460405161079191906118e2565b60405180910390a250505050565b6065546001600160a01b031681565b6066546001600160a01b038381169116141561044b576107cc610892565b506107d684610eb7565b5050505050565b606a805463ffffffff191663ffffffff92909216919091179055565b6108016110b9565b6001600160a01b0316610812610882565b6001600160a01b0316146108385760405162461bcd60e51b8152600401610349906117b9565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6033546001600160a01b03165b90565b60008061089d610eab565b60685463ffffffff9182169250600160e01b9004168114156108c357600091505061088f565b6065546040516370a0823160e01b81526000916001600160a01b0316906370a08231906108f4903090600401611549565b60206040518083038186803b15801561090c57600080fd5b505afa158015610920573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610944919061150d565b606854909150600090610968908390600160701b90046001600160701b0316611063565b60685490915060009061098d90859063ffffffff600160e01b90910481169061106316565b606854606654604080516318160ddd60e01b815290519394506001600160701b039092169260009283926001600160a01b0316916318160ddd91600480820192602092909190829003018186803b1580156109e757600080fd5b505afa1580156109fb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1f919061150d565b9050600081118015610a315750600085115b15610aa557606754610a449085906110bd565b915084821115610a52578491505b6000610a5e83836110fe565b9050610a6a8482611127565b93507f7de59a92c9386255180c28ede4b61edb9b7b2ac96855ac634151489cef21bad683604051610a9b91906118e2565b60405180910390a1505b610aae83611090565b606880546dffffffffffffffffffffffffffff19166001600160701b039283161790819055610ae9916104c191600160701b90041684611127565b6068600e6101000a8154816001600160701b0302191690836001600160701b03160217905550610b188761114c565b6068805463ffffffff92909216600160e01b026001600160e01b03909216919091179055509550505050505090565b6066546001600160a01b038281169116148015610b6c57506001600160a01b03841615155b1561044b57610b79610892565b506107cc83610eb7565b610b8b610892565b506065546040516323b872dd60e01b81526001600160a01b03909116906323b872dd90610bc09033903090869060040161155d565b602060405180830381600087803b158015610bda57600080fd5b505af1158015610bee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c12919061146d565b50336001600160a01b03167f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c482604051610c4c91906118e2565b60405180910390a250565b606854600160701b90046001600160701b031681565b610c756110b9565b6001600160a01b0316610c86610882565b6001600160a01b031614610cac5760405162461bcd60e51b8152600401610349906117b9565b60008111610ccc5760405162461bcd60e51b815260040161034990611782565b610cd4610892565b5060678190556040517f3d38e7cd2e029035006f9977a727c8724cd41dffb6d2a40d9f66bd4c26836a3290610d0a9083906118e2565b60405180910390a150565b606854600160e01b900463ffffffff1681565b6068546001600160701b031681565b6066546001600160a01b031681565b610d4e6110b9565b6001600160a01b0316610d5f610882565b6001600160a01b031614610d855760405162461bcd60e51b8152600401610349906117b9565b6001600160a01b038116610dab5760405162461bcd60e51b8152600401610349906115f8565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610e1230611172565b15905090565b600054610100900460ff1680610e315750610e31610e07565b80610e3f575060005460ff16155b610e5b5760405162461bcd60e51b8152600401610349906116f3565b600054610100900460ff16158015610e86576000805460ff1961ff0019909116610100171660011790555b610e8e611178565b610e966111f9565b8015610ea8576000805461ff00191690555b50565b606a5463ffffffff1690565b6001600160a01b038116600090815260696020526040812080546068546001600160701b03166001600160801b039091161415610ef85760009150506102db565b8054606854600091610f1c916001600160701b0316906001600160801b0316611063565b6066546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190610f52908890600401611549565b60206040518083038186803b158015610f6a57600080fd5b505afa158015610f7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa2919061150d565b90506000610fb8610fb383856112d3565b6112f4565b604080518082019091526068546001600160701b031681528554919250906020820190610ffd90610fb390600160801b90046001600160801b03908116908616611127565b6001600160801b039081169091526001600160a01b03881660009081526069602090815260409091208351815494909201518316600160801b029183166fffffffffffffffffffffffffffffffff19909416939093179091161790559350505050919050565b6000828211156110855760405162461bcd60e51b8152600401610349906116bc565b508082035b92915050565b6000600160701b82106110b55760405162461bcd60e51b8152600401610349906117ee565b5090565b3390565b6000826110cc5750600061108a565b828202828482816110d957fe5b04146110f75760405162461bcd60e51b815260040161034990611741565b9392505050565b60008061111384670de0b6b3a76400006110bd565b905061111f8184611319565b949350505050565b6000828201838110156110f75760405162461bcd60e51b81526004016103499061163e565b600064010000000082106110b55760405162461bcd60e51b815260040161034990611837565b3b151590565b600054610100900460ff16806111915750611191610e07565b8061119f575060005460ff16155b6111bb5760405162461bcd60e51b8152600401610349906116f3565b600054610100900460ff16158015610e96576000805460ff1961ff0019909116610100171660011790558015610ea8576000805461ff001916905550565b600054610100900460ff16806112125750611212610e07565b80611220575060005460ff16155b61123c5760405162461bcd60e51b8152600401610349906116f3565b600054610100900460ff16158015611267576000805460ff1961ff0019909116610100171660011790555b60006112716110b9565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610ea8576000805461ff001916905550565b6000806112e083856110bd565b905061111f81670de0b6b3a7640000611319565b6000600160801b82106110b55760405162461bcd60e51b815260040161034990611675565b60006110f783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250600081836113775760405162461bcd60e51b815260040161034991906115a5565b50600083858161138357fe5b0495945050505050565b60006020828403121561139e578081fd5b81356110f7816118fc565b600080600080608085870312156113be578283fd5b84356113c9816118fc565b935060208501356113d9816118fc565b92506040850135915060608501356113f0816118fc565b939692955090935050565b6000806040838503121561140d578182fd5b8235611418816118fc565b946020939093013593505050565b6000806000806080858703121561143b578384fd5b8435611446816118fc565b935060208501359250604085013561145d816118fc565b915060608501356113f0816118fc565b60006020828403121561147e578081fd5b815180151581146110f7578182fd5b60006020828403121561149e578081fd5b81356001600160e01b0319811681146110f7578182fd5b6000806000606084860312156114c9578283fd5b83356114d4816118fc565b925060208401356114e4816118fc565b929592945050506040919091013590565b600060208284031215611506578081fd5b5035919050565b60006020828403121561151e578081fd5b5051919050565b600060208284031215611536578081fd5b813563ffffffff811681146110f7578182fd5b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602080835283518082850152825b818110156115d1578581018301518582016040015282016115b5565b818111156115e25783604083870101525b50601f01601f1916929092016040019392505050565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526027908201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316040820152663238206269747360c81b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601c908201527f546f6b656e4661756365742f64726970526174652d67742d7a65726f00000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f53616665436173743a2076616c756520646f65736e27742066697420696e206160408201526837103ab4b73a18989960b91b606082015260800190565b60208082526026908201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360408201526532206269747360d01b606082015260800190565b6020808252601e908201527f546f6b656e4661756365742f696e73756666696369656e742d66756e64730000604082015260600190565b6001600160701b0391909116815260200190565b6001600160801b0392831681529116602082015260400190565b90815260200190565b63ffffffff91909116815260200190565b6001600160a01b0381168114610ea857600080fdfea2646970667358221220ac65a85dad87186737a581e0a956ff8c914a0953e072c5fa94384fe21bff04c964736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x12C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0xAD JUMPI DUP1 PUSH4 0xCA5BAAFC GT PUSH2 0x71 JUMPI DUP1 PUSH4 0xCA5BAAFC EQ PUSH2 0x259 JUMPI DUP1 PUSH4 0xD9772A25 EQ PUSH2 0x26C JUMPI DUP1 PUSH4 0xE318613E EQ PUSH2 0x281 JUMPI DUP1 PUSH4 0xEFA9A1AD EQ PUSH2 0x289 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x291 JUMPI PUSH2 0x12C JUMP JUMPDEST DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x20E JUMPI DUP1 PUSH4 0x9F678CCA EQ PUSH2 0x216 JUMPI DUP1 PUSH4 0xB2210957 EQ PUSH2 0x21E JUMPI DUP1 PUSH4 0xB6B55F25 EQ PUSH2 0x231 JUMPI DUP1 PUSH4 0xC96F14B8 EQ PUSH2 0x244 JUMPI PUSH2 0x12C JUMP JUMPDEST DUP1 PUSH4 0x205C2878 GT PUSH2 0xF4 JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x1B8 JUMPI DUP1 PUSH4 0x38D52E0F EQ PUSH2 0x1CB JUMPI DUP1 PUSH4 0x4D7F3DB0 EQ PUSH2 0x1E0 JUMPI DUP1 PUSH4 0x644A9E71 EQ PUSH2 0x1F3 JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x206 JUMPI PUSH2 0x12C JUMP JUMPDEST DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x131 JUMPI DUP1 PUSH4 0xECC535F EQ PUSH2 0x15A JUMPI DUP1 PUSH4 0x1794BB3C EQ PUSH2 0x17B JUMPI DUP1 PUSH4 0x187F3334 EQ PUSH2 0x190 JUMPI DUP1 PUSH4 0x1E83409A EQ PUSH2 0x1A5 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x144 PUSH2 0x13F CALLDATASIZE PUSH1 0x4 PUSH2 0x148D JUMP JUMPDEST PUSH2 0x2A4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x151 SWAP2 SWAP1 PUSH2 0x159A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x16D PUSH2 0x168 CALLDATASIZE PUSH1 0x4 PUSH2 0x138D JUMP JUMPDEST PUSH2 0x2E0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x151 SWAP3 SWAP2 SWAP1 PUSH2 0x18C8 JUMP JUMPDEST PUSH2 0x18E PUSH2 0x189 CALLDATASIZE PUSH1 0x4 PUSH2 0x14B5 JUMP JUMPDEST PUSH2 0x306 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x198 PUSH2 0x451 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x151 SWAP2 SWAP1 PUSH2 0x18E2 JUMP JUMPDEST PUSH2 0x198 PUSH2 0x1B3 CALLDATASIZE PUSH1 0x4 PUSH2 0x138D JUMP JUMPDEST PUSH2 0x457 JUMP JUMPDEST PUSH2 0x18E PUSH2 0x1C6 CALLDATASIZE PUSH1 0x4 PUSH2 0x13FB JUMP JUMPDEST PUSH2 0x5C4 JUMP JUMPDEST PUSH2 0x1D3 PUSH2 0x79F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x151 SWAP2 SWAP1 PUSH2 0x1549 JUMP JUMPDEST PUSH2 0x18E PUSH2 0x1EE CALLDATASIZE PUSH1 0x4 PUSH2 0x1426 JUMP JUMPDEST PUSH2 0x7AE JUMP JUMPDEST PUSH2 0x18E PUSH2 0x201 CALLDATASIZE PUSH1 0x4 PUSH2 0x1525 JUMP JUMPDEST PUSH2 0x7DD JUMP JUMPDEST PUSH2 0x18E PUSH2 0x7F9 JUMP JUMPDEST PUSH2 0x1D3 PUSH2 0x882 JUMP JUMPDEST PUSH2 0x198 PUSH2 0x892 JUMP JUMPDEST PUSH2 0x18E PUSH2 0x22C CALLDATASIZE PUSH1 0x4 PUSH2 0x13A9 JUMP JUMPDEST PUSH2 0xB47 JUMP JUMPDEST PUSH2 0x18E PUSH2 0x23F CALLDATASIZE PUSH1 0x4 PUSH2 0x14F5 JUMP JUMPDEST PUSH2 0xB83 JUMP JUMPDEST PUSH2 0x24C PUSH2 0xC57 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x151 SWAP2 SWAP1 PUSH2 0x18B4 JUMP JUMPDEST PUSH2 0x18E PUSH2 0x267 CALLDATASIZE PUSH1 0x4 PUSH2 0x14F5 JUMP JUMPDEST PUSH2 0xC6D JUMP JUMPDEST PUSH2 0x274 PUSH2 0xD15 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x151 SWAP2 SWAP1 PUSH2 0x18EB JUMP JUMPDEST PUSH2 0x24C PUSH2 0xD28 JUMP JUMPDEST PUSH2 0x1D3 PUSH2 0xD37 JUMP JUMPDEST PUSH2 0x18E PUSH2 0x29F CALLDATASIZE PUSH1 0x4 PUSH2 0x138D JUMP JUMPDEST PUSH2 0xD46 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL EQ DUP1 PUSH2 0x2D8 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT EQ JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x69 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV AND DUP3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x31F JUMPI POP PUSH2 0x31F PUSH2 0xE07 JUMP JUMPDEST DUP1 PUSH2 0x32D JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x352 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x16F3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x37D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x385 PUSH2 0xE18 JUMP JUMPDEST PUSH2 0x38D PUSH2 0xEAB JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH4 0xFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xE0 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x65 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SWAP3 SSTORE PUSH1 0x66 DUP1 SLOAD SWAP3 DUP7 AND SWAP3 SWAP1 SWAP2 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x3EA DUP3 PUSH2 0xC6D JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x65 SLOAD PUSH1 0x67 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND SWAP4 SWAP1 SWAP3 AND SWAP2 PUSH32 0x10F27652C1015195CA7E6BC9B4C724CBF18E91C42117D92124703A3F49BB240F SWAP2 PUSH2 0x431 SWAP2 PUSH2 0x18E2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 DUP1 ISZERO PUSH2 0x44B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x67 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x461 PUSH2 0x892 JUMP JUMPDEST POP PUSH2 0x46B DUP3 PUSH2 0xEB7 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP1 SWAP3 SSTORE PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV SWAP1 SWAP2 AND SWAP1 PUSH2 0x4C6 SWAP1 PUSH2 0x4C1 SWAP1 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP4 PUSH2 0x1063 JUMP JUMPDEST PUSH2 0x1090 JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP3 SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x70 SHL MUL PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x70 SHL NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x65 SLOAD PUSH1 0x40 MLOAD PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xA9059CBB SWAP1 PUSH2 0x52A SWAP1 DUP7 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x1581 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x544 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x558 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x57C SWAP2 SWAP1 PUSH2 0x146D JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xD8138F8A3F377C5259CA548E70E4C2DE94F129F5A11036A15B69513CBA2B426A DUP3 PUSH1 0x40 MLOAD PUSH2 0x5B6 SWAP2 SWAP1 PUSH2 0x18E2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x5CC PUSH2 0x10B9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x5DD PUSH2 0x882 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x603 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x17B9 JUMP JUMPDEST PUSH2 0x60B PUSH2 0x892 JUMP JUMPDEST POP PUSH1 0x65 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0x63D SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x1549 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x655 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x669 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x68D SWAP2 SWAP1 PUSH2 0x150D JUMP JUMPDEST PUSH1 0x68 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0x6B1 SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND PUSH2 0x1063 JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x6D3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x187D JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x40 MLOAD PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0xA9059CBB SWAP1 PUSH2 0x705 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x1581 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x71F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x733 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x757 SWAP2 SWAP1 PUSH2 0x146D JUMP JUMPDEST POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x7084F5476618D8E60B11EF0D7D3F06914655ADB8793E28FF7F018D4C76D505D5 DUP5 PUSH1 0x40 MLOAD PUSH2 0x791 SWAP2 SWAP1 PUSH2 0x18E2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x44B JUMPI PUSH2 0x7CC PUSH2 0x892 JUMP JUMPDEST POP PUSH2 0x7D6 DUP5 PUSH2 0xEB7 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x6A DUP1 SLOAD PUSH4 0xFFFFFFFF NOT AND PUSH4 0xFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x801 PUSH2 0x10B9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x812 PUSH2 0x882 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x838 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x17B9 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x89D PUSH2 0xEAB JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH4 0xFFFFFFFF SWAP2 DUP3 AND SWAP3 POP PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV AND DUP2 EQ ISZERO PUSH2 0x8C3 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x88F JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0x8F4 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x1549 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x90C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x920 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x944 SWAP2 SWAP1 PUSH2 0x150D JUMP JUMPDEST PUSH1 0x68 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0x968 SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND PUSH2 0x1063 JUMP JUMPDEST PUSH1 0x68 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0x98D SWAP1 DUP6 SWAP1 PUSH4 0xFFFFFFFF PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 SWAP2 DIV DUP2 AND SWAP1 PUSH2 0x1063 AND JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x18160DDD PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD SWAP4 SWAP5 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP1 SWAP3 AND SWAP3 PUSH1 0x0 SWAP3 DUP4 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x18160DDD SWAP2 PUSH1 0x4 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x9E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x9FB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xA1F SWAP2 SWAP1 PUSH2 0x150D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 GT DUP1 ISZERO PUSH2 0xA31 JUMPI POP PUSH1 0x0 DUP6 GT JUMPDEST ISZERO PUSH2 0xAA5 JUMPI PUSH1 0x67 SLOAD PUSH2 0xA44 SWAP1 DUP6 SWAP1 PUSH2 0x10BD JUMP JUMPDEST SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0xA52 JUMPI DUP5 SWAP2 POP JUMPDEST PUSH1 0x0 PUSH2 0xA5E DUP4 DUP4 PUSH2 0x10FE JUMP JUMPDEST SWAP1 POP PUSH2 0xA6A DUP5 DUP3 PUSH2 0x1127 JUMP JUMPDEST SWAP4 POP PUSH32 0x7DE59A92C9386255180C28EDE4B61EDB9B7B2AC96855AC634151489CEF21BAD6 DUP4 PUSH1 0x40 MLOAD PUSH2 0xA9B SWAP2 SWAP1 PUSH2 0x18E2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMPDEST PUSH2 0xAAE DUP4 PUSH2 0x1090 JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP3 DUP4 AND OR SWAP1 DUP2 SWAP1 SSTORE PUSH2 0xAE9 SWAP2 PUSH2 0x4C1 SWAP2 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV AND DUP5 PUSH2 0x1127 JUMP JUMPDEST PUSH1 0x68 PUSH1 0xE PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND MUL OR SWAP1 SSTORE POP PUSH2 0xB18 DUP8 PUSH2 0x114C JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH4 0xFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xE0 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP SWAP6 POP POP POP POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND SWAP2 AND EQ DUP1 ISZERO PUSH2 0xB6C JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x44B JUMPI PUSH2 0xB79 PUSH2 0x892 JUMP JUMPDEST POP PUSH2 0x7CC DUP4 PUSH2 0xEB7 JUMP JUMPDEST PUSH2 0xB8B PUSH2 0x892 JUMP JUMPDEST POP PUSH1 0x65 SLOAD PUSH1 0x40 MLOAD PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x23B872DD SWAP1 PUSH2 0xBC0 SWAP1 CALLER SWAP1 ADDRESS SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x155D JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xBDA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xBEE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xC12 SWAP2 SWAP1 PUSH2 0x146D JUMP JUMPDEST POP CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x2DA466A7B24304F47E87FA2E1E5A81B9831CE54FEC19055CE277CA2F39BA42C4 DUP3 PUSH1 0x40 MLOAD PUSH2 0xC4C SWAP2 SWAP1 PUSH2 0x18E2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0xC75 PUSH2 0x10B9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xC86 PUSH2 0x882 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xCAC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x17B9 JUMP JUMPDEST PUSH1 0x0 DUP2 GT PUSH2 0xCCC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x1782 JUMP JUMPDEST PUSH2 0xCD4 PUSH2 0x892 JUMP JUMPDEST POP PUSH1 0x67 DUP2 SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x3D38E7CD2E029035006F9977A727C8724CD41DFFB6D2A40D9F66BD4C26836A32 SWAP1 PUSH2 0xD0A SWAP1 DUP4 SWAP1 PUSH2 0x18E2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0xD4E PUSH2 0x10B9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xD5F PUSH2 0x882 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xD85 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x17B9 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0xDAB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x15F8 JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE12 ADDRESS PUSH2 0x1172 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0xE31 JUMPI POP PUSH2 0xE31 PUSH2 0xE07 JUMP JUMPDEST DUP1 PUSH2 0xE3F JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0xE5B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x16F3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0xE86 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0xE8E PUSH2 0x1178 JUMP JUMPDEST PUSH2 0xE96 PUSH2 0x11F9 JUMP JUMPDEST DUP1 ISZERO PUSH2 0xEA8 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x6A SLOAD PUSH4 0xFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 SWAP2 AND EQ ISZERO PUSH2 0xEF8 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x2DB JUMP JUMPDEST DUP1 SLOAD PUSH1 0x68 SLOAD PUSH1 0x0 SWAP2 PUSH2 0xF1C SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x1063 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE SWAP2 SWAP3 POP PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0xF52 SWAP1 DUP9 SWAP1 PUSH1 0x4 ADD PUSH2 0x1549 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF6A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xF7E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xFA2 SWAP2 SWAP1 PUSH2 0x150D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xFB8 PUSH2 0xFB3 DUP4 DUP6 PUSH2 0x12D3 JUMP JUMPDEST PUSH2 0x12F4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP2 MSTORE DUP6 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x20 DUP3 ADD SWAP1 PUSH2 0xFFD SWAP1 PUSH2 0xFB3 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND SWAP1 DUP7 AND PUSH2 0x1127 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP4 MLOAD DUP2 SLOAD SWAP5 SWAP1 SWAP3 ADD MLOAD DUP4 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP2 DUP4 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP2 AND OR SWAP1 SSTORE SWAP4 POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1085 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x16BC JUMP JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x70 SHL DUP3 LT PUSH2 0x10B5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x17EE JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x10CC JUMPI POP PUSH1 0x0 PUSH2 0x108A JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x10D9 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x10F7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x1741 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1113 DUP5 PUSH8 0xDE0B6B3A7640000 PUSH2 0x10BD JUMP JUMPDEST SWAP1 POP PUSH2 0x111F DUP2 DUP5 PUSH2 0x1319 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x10F7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x163E JUMP JUMPDEST PUSH1 0x0 PUSH5 0x100000000 DUP3 LT PUSH2 0x10B5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x1837 JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1191 JUMPI POP PUSH2 0x1191 PUSH2 0xE07 JUMP JUMPDEST DUP1 PUSH2 0x119F JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x11BB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x16F3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0xE96 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0xEA8 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1212 JUMPI POP PUSH2 0x1212 PUSH2 0xE07 JUMP JUMPDEST DUP1 PUSH2 0x1220 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x123C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x16F3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1267 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x1271 PUSH2 0x10B9 JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0xEA8 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x12E0 DUP4 DUP6 PUSH2 0x10BD JUMP JUMPDEST SWAP1 POP PUSH2 0x111F DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x1319 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x10B5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP1 PUSH2 0x1675 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10F7 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH1 0x0 DUP2 DUP4 PUSH2 0x1377 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x349 SWAP2 SWAP1 PUSH2 0x15A5 JUMP JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x1383 JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x139E JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x10F7 DUP2 PUSH2 0x18FC JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x13BE JUMPI DUP3 DUP4 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x13C9 DUP2 PUSH2 0x18FC JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH2 0x13D9 DUP2 PUSH2 0x18FC JUMP JUMPDEST SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x13F0 DUP2 PUSH2 0x18FC JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x140D JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH2 0x1418 DUP2 PUSH2 0x18FC JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x143B JUMPI DUP4 DUP5 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH2 0x1446 DUP2 PUSH2 0x18FC JUMP JUMPDEST SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x145D DUP2 PUSH2 0x18FC JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x13F0 DUP2 PUSH2 0x18FC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x147E JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x10F7 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x149E JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP2 AND DUP2 EQ PUSH2 0x10F7 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x14C9 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x14D4 DUP2 PUSH2 0x18FC JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x14E4 DUP2 PUSH2 0x18FC JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1506 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x151E JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1536 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH4 0xFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x10F7 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 MSTORE DUP4 MLOAD DUP1 DUP3 DUP6 ADD MSTORE DUP3 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x15D1 JUMPI DUP6 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0x40 ADD MSTORE DUP3 ADD PUSH2 0x15B5 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x15E2 JUMPI DUP4 PUSH1 0x40 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x40 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x646472657373 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x27 SWAP1 DUP3 ADD MSTORE PUSH32 0x53616665436173743A2076616C756520646F65736E27742066697420696E2031 PUSH1 0x40 DUP3 ADD MSTORE PUSH7 0x32382062697473 PUSH1 0xC8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1E SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x2E SWAP1 DUP3 ADD MSTORE PUSH32 0x496E697469616C697A61626C653A20636F6E747261637420697320616C726561 PUSH1 0x40 DUP3 ADD MSTORE PUSH14 0x191E481A5B9A5D1A585B1A5E9959 PUSH1 0x92 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x21 SWAP1 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206D756C7469706C69636174696F6E206F766572666C6F PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x77 PUSH1 0xF8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x546F6B656E4661756365742F64726970526174652D67742D7A65726F00000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x29 SWAP1 DUP3 ADD MSTORE PUSH32 0x53616665436173743A2076616C756520646F65736E27742066697420696E2061 PUSH1 0x40 DUP3 ADD MSTORE PUSH9 0x37103AB4B73A189899 PUSH1 0xB9 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x53616665436173743A2076616C756520646F65736E27742066697420696E2033 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x322062697473 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1E SWAP1 DUP3 ADD MSTORE PUSH32 0x546F6B656E4661756365742F696E73756666696369656E742D66756E64730000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP3 DUP4 AND DUP2 MSTORE SWAP2 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xEA8 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xAC PUSH6 0xA85DAD871867 CALLDATACOPY 0xA5 DUP2 0xE0 0xA9 JUMP SELFDESTRUCT DUP13 SWAP2 0x4A MULMOD MSTORE8 0xE0 PUSH19 0xC5FA94384FE21BFF04C964736F6C634300060C STOP CALLER ",
              "sourceMap": "149:236:82:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;191:249:95;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2374:47:86;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;2666:377::-;;;;;;:::i;:::-;;:::i;:::-;;1919:32;;;:::i;:::-;;;;;;;:::i;4202:352::-;;;;;;:::i;:::-;;:::i;3676:364::-;;;;;;:::i;:::-;;:::i;1690:30::-;;;:::i;:::-;;;;;;;:::i;7597:216::-;;;;;;:::i;:::-;;:::i;222:70:82:-;;;;;;:::i;:::-;;:::i;1967:145:0:-;;;:::i;1335:85::-;;;:::i;4725:1220:86:-;;;:::i;8056:327::-;;;;;;:::i;:::-;;:::i;3345:159::-;;;;;;:::i;:::-;;:::i;2160:29::-;;;:::i;:::-;;;;;;;:::i;6144:287::-;;;;;;:::i;:::-;;:::i;2260:31::-;;;:::i;:::-;;;;;;;:::i;2040:35::-;;;:::i;1810:32::-;;;:::i;2261:240:0:-;;;;;;:::i;:::-;;:::i;191:249:95:-;270:4;-1:-1:-1;;;;;;297:51:95;;-1:-1:-1;;;297:51:95;;:132;;-1:-1:-1;;;;;;;359:70:95;;-1:-1:-1;;;;;;359:70:95;297:132;282:153;;191:249;;;;:::o;2374:47:86:-;;;;;;;;;;;;-1:-1:-1;;;;;2374:47:86;;;;-1:-1:-1;;;2374:47:86;;;;:::o;2666:377::-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;:::i;:::-;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;2810:16:86::1;:14;:16::i;:::-;2852:14;:12;:14::i;:::-;2832:17;:34:::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;2832:34:86::1;-1:-1:-1::0;;;;;2832:34:86;;::::1;::::0;;;::::1;::::0;;2872:5:::1;:14:::0;;-1:-1:-1;;;;;2872:14:86;;::::1;-1:-1:-1::0;;;;;;2872:14:86;;::::1;;::::0;;;2892:7:::1;:18:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;2916:40:::1;2937:18:::0;2916:20:::1;:40::i;:::-;3000:7;::::0;2987:5:::1;::::0;3015:17:::1;::::0;2968:70:::1;::::0;-1:-1:-1;;;;;3000:7:86;;::::1;::::0;2987:5;;::::1;::::0;2968:70:::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;1794:14:9::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1790:66;2666:377:86;;;;:::o;1919:32::-;;;;:::o;4202:352::-;4249:7;4264:6;:4;:6::i;:::-;;4276:30;4301:4;4276:24;:30::i;:::-;-1:-1:-1;;;;;;4330:16:86;;4312:15;4330:16;;;:10;:16;;;;;:24;;-1:-1:-1;;;;;4360:28:86;;;;;;4419:14;;-1:-1:-1;;;4330:24:86;;;;;;;4411:48;;:36;;-1:-1:-1;;;4419:14:86;;-1:-1:-1;;;;;4419:14:86;4330:24;4411:27;:36::i;:::-;:46;:48::i;:::-;4394:14;:65;;-1:-1:-1;;;;;4394:65:86;;;;-1:-1:-1;;;4394:65:86;-1:-1:-1;;;;4394:65:86;;;;;;;;;4465:5;;:29;;-1:-1:-1;;;4465:29:86;;-1:-1:-1;;;;;4465:5:86;;;;:14;;:29;;4480:4;;4486:7;;4465:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4514:4;-1:-1:-1;;;;;4506:22:86;;4520:7;4506:22;;;;;;:::i;:::-;;;;;;;;4542:7;4202:352;-1:-1:-1;;4202:352:86:o;3676:364::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;3749:6:86::1;:4;:6::i;:::-;-1:-1:-1::0;3788:5:86::1;::::0;:30:::1;::::0;-1:-1:-1;;;3788:30:86;;3761:24:::1;::::0;-1:-1:-1;;;;;3788:5:86::1;::::0;:15:::1;::::0;:30:::1;::::0;3812:4:::1;::::0;3788:30:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3876:14;::::0;3761:57;;-1:-1:-1;3824:28:86::1;::::0;3855:36:::1;::::0;3761:57;;-1:-1:-1;;;3876:14:86;::::1;-1:-1:-1::0;;;;;3876:14:86::1;3855:20;:36::i;:::-;3824:67;;3915:20;3905:6;:30;;3897:73;;;;-1:-1:-1::0;;;3897:73:86::1;;;;;;;:::i;:::-;3976:5;::::0;:26:::1;::::0;-1:-1:-1;;;3976:26:86;;-1:-1:-1;;;;;3976:5:86;;::::1;::::0;:14:::1;::::0;:26:::1;::::0;3991:2;;3995:6;;3976:26:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4024:2;-1:-1:-1::0;;;;;4014:21:86::1;;4028:6;4014:21;;;;;;:::i;:::-;;;;;;;;1617:1:0;;3676:364:86::0;;:::o;1690:30::-;;;-1:-1:-1;;;;;1690:30:86;;:::o;7597:216::-;7742:7;;-1:-1:-1;;;;;7725:25:86;;;7742:7;;7725:25;7721:88;;;7760:6;:4;:6::i;:::-;;7774:28;7799:2;7774:24;:28::i;:::-;;7597:216;;;;:::o;222:70:82:-;275:4;:12;;-1:-1:-1;;275:12:82;;;;;;;;;;;;222:70::o;1967:145:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;2057:6:::1;::::0;2036:40:::1;::::0;2073:1:::1;::::0;-1:-1:-1;;;;;2057:6:0::1;::::0;2036:40:::1;::::0;2073:1;;2036:40:::1;2086:6;:19:::0;;-1:-1:-1;;;;;;2086:19:0::1;::::0;;1967:145::o;1335:85::-;1407:6;;-1:-1:-1;;;;;1407:6:0;1335:85;;:::o;4725:1220:86:-;4757:7;4772:24;4799:14;:12;:14::i;:::-;4868:17;;4772:41;;;;;-1:-1:-1;;;;4868:17:86;;;:45;;4864:74;;;4930:1;4923:8;;;;;4864:74;4971:5;;:30;;-1:-1:-1;;;4971:30:86;;4944:24;;-1:-1:-1;;;;;4971:5:86;;:15;;:30;;4995:4;;4971:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5059:14;;4944:57;;-1:-1:-1;5007:28:86;;5038:36;;4944:57;;-1:-1:-1;;;5059:14:86;;-1:-1:-1;;;;;5059:14:86;5038:20;:36::i;:::-;5122:17;;5007:67;;-1:-1:-1;5080:18:86;;5101:39;;:16;;5122:17;-1:-1:-1;;;5122:17:86;;;;;;5101:20;:39;:::i;:::-;5181:20;;5259:7;;:21;;;-1:-1:-1;;;5259:21:86;;;;5080:60;;-1:-1:-1;;;;;;5181:20:86;;;;5146:32;;;;-1:-1:-1;;;;;5259:7:86;;:19;;:21;;;;;;;;;;;;;;;:7;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5230:50;;5312:1;5291:18;:22;:50;;;;;5340:1;5317:20;:24;5291:50;5287:439;;;5378:17;;5363:33;;:10;;:14;:33::i;:::-;5351:45;;5420:20;5408:9;:32;5404:89;;;5464:20;5452:32;;5404:89;5500:26;5529:59;5558:9;5569:18;5529:28;:59::i;:::-;5500:88;-1:-1:-1;5623:48:86;:24;5500:88;5623:28;:48::i;:::-;5596:75;;5685:34;5702:9;5685:34;;;;;;:::i;:::-;;;;;;;;5287:439;;5755:36;:24;:34;:36::i;:::-;5732:20;:59;;-1:-1:-1;;5732:59:86;-1:-1:-1;;;;;5732:59:86;;;;;;;;5814:50;;:38;;-1:-1:-1;;;5822:14:86;;;5842:9;5814:27;:38::i;:50::-;5797:14;;:67;;;;;-1:-1:-1;;;;;5797:67:86;;;;;-1:-1:-1;;;;;5797:67:86;;;;;;5890:27;:16;:25;:27::i;:::-;5870:17;:47;;;;;;;-1:-1:-1;;;5870:47:86;-1:-1:-1;;;;;5870:47:86;;;;;;;;;-1:-1:-1;5931:9:86;-1:-1:-1;;;;;;4725:1220:86;:::o;8056:327::-;8252:7;;-1:-1:-1;;;;;8235:25:86;;;8252:7;;8235:25;:47;;;;-1:-1:-1;;;;;;8264:18:86;;;;8235:47;8231:148;;;8292:6;:4;:6::i;:::-;;8306:28;8331:2;8306:24;:28::i;3345:159::-;3393:6;:4;:6::i;:::-;-1:-1:-1;3405:5:86;;:53;;-1:-1:-1;;;3405:53:86;;-1:-1:-1;;;;;3405:5:86;;;;:18;;:53;;3424:10;;3444:4;;3451:6;;3405:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3480:10;-1:-1:-1;;;;;3470:29:86;;3492:6;3470:29;;;;;;:::i;:::-;;;;;;;;3345:159;:::o;2160:29::-;;;-1:-1:-1;;;2160:29:86;;-1:-1:-1;;;;;2160:29:86;;:::o;6144:287::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;6254:1:86::1;6233:18;:22;6225:63;;;;-1:-1:-1::0;;;6225:63:86::1;;;;;;;:::i;:::-;6329:6;:4;:6::i;:::-;-1:-1:-1::0;6342:17:86::1;:38:::0;;;6392:34:::1;::::0;::::1;::::0;::::1;::::0;6362:18;;6392:34:::1;:::i;:::-;;;;;;;;6144:287:::0;:::o;2260:31::-;;;-1:-1:-1;;;2260:31:86;;;;;:::o;2040:35::-;;;-1:-1:-1;;;;;2040:35:86;;:::o;1810:32::-;;;-1:-1:-1;;;;;1810:32:86;;:::o;2261:240:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;-1:-1:-1;;;1539:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2349:22:0;::::1;2341:73;;;;-1:-1:-1::0;;;2341:73:0::1;;;;;;;:::i;:::-;2450:6;::::0;2429:38:::1;::::0;-1:-1:-1;;;;;2429:38:0;;::::1;::::0;2450:6:::1;::::0;2429:38:::1;::::0;2450:6:::1;::::0;2429:38:::1;2477:6;:17:::0;;-1:-1:-1;;;;;;2477:17:0::1;-1:-1:-1::0;;;;;2477:17:0;;;::::1;::::0;;;::::1;::::0;;2261:240::o;1952:123:9:-;2000:4;2024:44;2062:4;2024:29;:44::i;:::-;2023:45;2016:52;;1952:123;:::o;935:126:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;:::i;:::-;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;992:26:0::1;:24;:26::i;:::-;1028;:24;:26::i;:::-;1794:14:9::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1790:66;935:126:0;:::o;296:86:82:-;373:4;;;;296:86;:::o;6674:749:86:-;-1:-1:-1;;;;;6792:16:86;;6747:7;6792:16;;;:10;:16;;;;;6842:34;;6818:20;;-1:-1:-1;;;;;6818:20:86;-1:-1:-1;;;;;6842:34:86;;;6818:58;6814:128;;;6934:1;6927:8;;;;;6814:128;7017:34;;6991:20;;6947:33;;6983:69;;-1:-1:-1;;;;;6991:20:86;;-1:-1:-1;;;;;7017:34:86;6983:33;:69::i;:::-;7087:7;;:23;;-1:-1:-1;;;7087:23:86;;6947:105;;-1:-1:-1;7058:26:86;;-1:-1:-1;;;;;7087:7:86;;;;:17;;:23;;7105:4;;7087:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7058:52;;7116:17;7136:92;:80;7170:18;7190:25;7136:33;:80::i;:::-;:90;:92::i;:::-;7254:141;;;;;;;;;7298:20;;-1:-1:-1;;;;;7298:20:86;7254:141;;7343:17;;7116:112;;-1:-1:-1;7254:141:86;;;;;7335:53;;:41;;-1:-1:-1;;;7343:17:86;;-1:-1:-1;;;;;7343:17:86;;;;7335:41;;:30;:41::i;:53::-;-1:-1:-1;;;;;7254:141:86;;;;;;-1:-1:-1;;;;;7235:16:86;;;;;;:10;:16;;;;;;;;:160;;;;;;;;;;;-1:-1:-1;;;7235:160:86;;;;-1:-1:-1;;7235:160:86;;;;;;;;;;;;;7409:9;-1:-1:-1;;;;6674:749:86;;;:::o;3147:155:8:-;3205:7;3237:1;3232;:6;;3224:49;;;;-1:-1:-1;;;3224:49:8;;;;;;;:::i;:::-;-1:-1:-1;3290:5:8;;;3147:155;;;;;:::o;258:172:98:-;315:7;-1:-1:-1;;;338:5:98;:14;330:68;;;;-1:-1:-1;;;330:68:98;;;;;;;:::i;:::-;-1:-1:-1;419:5:98;258:172::o;828:104:19:-;915:10;828:104;:::o;3549:215:8:-;3607:7;3630:6;3626:20;;-1:-1:-1;3645:1:8;3638:8;;3626:20;3668:5;;;3672:1;3668;:5;:1;3691:5;;;;;:10;3683:56;;;;-1:-1:-1;;;3683:56:8;;;;;;;:::i;:::-;3756:1;3549:215;-1:-1:-1;;;3549:215:8:o;1484:226:26:-;1574:7;;1612:20;:9;1149:4;1612:13;:20::i;:::-;1593:39;-1:-1:-1;1653:25:26;1593:39;1666:11;1653:12;:25::i;:::-;1642:36;1484:226;-1:-1:-1;;;;1484:226:26:o;2701:175:8:-;2759:7;2790:5;;;2813:6;;;;2805:46;;;;-1:-1:-1;;;2805:46:8;;;;;;;:::i;2028:176:24:-;2084:6;2118:5;2110;:13;2102:65;;;;-1:-1:-1;;;2102:65:24;;;;;;;:::i;737:413:18:-;1097:20;1135:8;;;737:413::o;759:64:19:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;:::i;:::-;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1794:14;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;759:64:19;:::o;1067:192:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;:::i;:::-;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1134:17:0::1;1154:12;:10;:12::i;:::-;1176:6;:18:::0;;-1:-1:-1;;;;;;1176:18:0::1;-1:-1:-1::0;;;;;1176:18:0;::::1;::::0;;::::1;::::0;;;1209:43:::1;::::0;1176:18;;-1:-1:-1;1176:18:0;-1:-1:-1;;1209:43:0::1;::::0;-1:-1:-1;;1209:43:0::1;1778:1:9;1794:14:::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1067:192:0;:::o;1967:201:26:-;2051:7;;2087:15;:8;2100:1;2087:12;:15::i;:::-;2070:32;-1:-1:-1;2121:17:26;2070:32;1149:4;2121:10;:17::i;1097:181:24:-;1154:7;-1:-1:-1;;;1181:5:24;:14;1173:67;;;;-1:-1:-1;;;1173:67:24;;;;;;;:::i;3187:130:27:-;3245:7;3271:39;3275:1;3278;3271:39;;;;;;;;;;;;;;;;;3885:7;3919:12;3912:5;3904:28;;;;-1:-1:-1;;;3904:28:27;;;;;;;;:::i;:::-;;3942:9;3958:1;3954;:5;;;;;;;3799:272;-1:-1:-1;;;;;3799:272:27:o;1014:241:-1:-;;1118:2;1106:9;1097:7;1093:23;1089:32;1086:2;;;-1:-1;;1124:12;1086:2;85:6;72:20;97:33;124:5;97:33;:::i;1262:617::-;;;;;1417:3;1405:9;1396:7;1392:23;1388:33;1385:2;;;-1:-1;;1424:12;1385:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1476:63;-1:-1;1576:2;1615:22;;72:20;97:33;72:20;97:33;:::i;:::-;1584:63;-1:-1;1684:2;1723:22;;668:20;;-1:-1;1792:2;1831:22;;72:20;97:33;72:20;97:33;:::i;:::-;1379:500;;;;-1:-1;1379:500;;-1:-1;;1379:500::o;1886:366::-;;;2007:2;1995:9;1986:7;1982:23;1978:32;1975:2;;;-1:-1;;2013:12;1975:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2065:63;2165:2;2204:22;;;;668:20;;-1:-1;;;1969:283::o;2259:617::-;;;;;2414:3;2402:9;2393:7;2389:23;2385:33;2382:2;;;-1:-1;;2421:12;2382:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2473:63;-1:-1;2573:2;2612:22;;668:20;;-1:-1;2681:2;2720:22;;72:20;97:33;72:20;97:33;:::i;:::-;2689:63;-1:-1;2789:2;2828:22;;72:20;97:33;72:20;97:33;:::i;2883:257::-;;2995:2;2983:9;2974:7;2970:23;2966:32;2963:2;;;-1:-1;;3001:12;2963:2;223:6;217:13;20276:5;18150:13;18143:21;20254:5;20251:32;20241:2;;-1:-1;;20287:12;3147:239;;3250:2;3238:9;3229:7;3225:23;3221:32;3218:2;;;-1:-1;;3256:12;3218:2;343:20;;-1:-1;;;;;;18237:78;;20371:34;;20361:2;;-1:-1;;20409:12;3393:595;;;;3583:2;3571:9;3562:7;3558:23;3554:32;3551:2;;;-1:-1;;3589:12;3551:2;518:6;505:20;530:59;583:5;530:59;:::i;:::-;3641:89;-1:-1;3767:2;3832:22;;505:20;530:59;505:20;530:59;:::i;:::-;3545:443;;3775:89;;-1:-1;;;3901:2;3940:22;;;;668:20;;3545:443::o;3995:241::-;;4099:2;4087:9;4078:7;4074:23;4070:32;4067:2;;;-1:-1;;4105:12;4067:2;-1:-1;668:20;;4061:175;-1:-1;4061:175::o;4243:263::-;;4358:2;4346:9;4337:7;4333:23;4329:32;4326:2;;;-1:-1;;4364:12;4326:2;-1:-1;816:13;;4320:186;-1:-1;4320:186::o;4513:239::-;;4616:2;4604:9;4595:7;4591:23;4587:32;4584:2;;;-1:-1;;4622:12;4584:2;958:6;945:20;18966:10;20820:5;18955:22;20796:5;20793:34;20783:2;;-1:-1;;20831:12;10158:222;-1:-1;;;;;18749:54;;;;4979:37;;10285:2;10270:18;;10256:124::o;10387:460::-;-1:-1;;;;;18749:54;;;4838:58;;18749:54;;;;10750:2;10735:18;;4979:37;10833:2;10818:18;;9992:37;;;;10578:2;10563:18;;10549:298::o;10854:333::-;-1:-1;;;;;18749:54;;;;4979:37;;11173:2;11158:18;;9992:37;11009:2;10994:18;;10980:207::o;11194:210::-;18150:13;;18143:21;5093:34;;11315:2;11300:18;;11286:118::o;11692:310::-;;11839:2;;11860:17;11853:47;5469:5;17773:12;17930:6;11839:2;11828:9;11824:18;17918:19;-1:-1;19762:101;19776:6;19773:1;19770:13;19762:101;;;19843:11;;;;;19837:18;19824:11;;;17958:14;19824:11;19817:39;19791:10;;19762:101;;;19878:6;19875:1;19872:13;19869:2;;;-1:-1;17958:14;19934:6;11828:9;19925:16;;19918:27;19869:2;-1:-1;20050:7;20034:14;-1:-1;;20030:28;5627:39;;;;17958:14;5627:39;;11810:192;-1:-1;;;11810:192::o;12009:416::-;12209:2;12223:47;;;5903:2;12194:18;;;17918:19;5939:34;17958:14;;;5919:55;-1:-1;;;5994:12;;;5987:30;6036:12;;;12180:245::o;12432:416::-;12632:2;12646:47;;;6287:2;12617:18;;;17918:19;6323:29;17958:14;;;6303:50;6372:12;;;12603:245::o;12855:416::-;13055:2;13069:47;;;6623:2;13040:18;;;17918:19;6659:34;17958:14;;;6639:55;-1:-1;;;6714:12;;;6707:31;6757:12;;;13026:245::o;13278:416::-;13478:2;13492:47;;;7008:2;13463:18;;;17918:19;7044:32;17958:14;;;7024:53;7096:12;;;13449:245::o;13701:416::-;13901:2;13915:47;;;7347:2;13886:18;;;17918:19;7383:34;17958:14;;;7363:55;-1:-1;;;7438:12;;;7431:38;7488:12;;;13872:245::o;14124:416::-;14324:2;14338:47;;;7739:2;14309:18;;;17918:19;7775:34;17958:14;;;7755:55;-1:-1;;;7830:12;;;7823:25;7867:12;;;14295:245::o;14547:416::-;14747:2;14761:47;;;8118:2;14732:18;;;17918:19;8154:30;17958:14;;;8134:51;8204:12;;;14718:245::o;14970:416::-;15170:2;15184:47;;;15155:18;;;17918:19;8491:34;17958:14;;;8471:55;8545:12;;;15141:245::o;15393:416::-;15593:2;15607:47;;;8796:2;15578:18;;;17918:19;8832:34;17958:14;;;8812:55;-1:-1;;;8887:12;;;8880:33;8932:12;;;15564:245::o;15816:416::-;16016:2;16030:47;;;9183:2;16001:18;;;17918:19;9219:34;17958:14;;;9199:55;-1:-1;;;9274:12;;;9267:30;9316:12;;;15987:245::o;16239:416::-;16439:2;16453:47;;;9567:2;16424:18;;;17918:19;9603:32;17958:14;;;9583:53;9655:12;;;16410:245::o;16662:222::-;-1:-1;;;;;18513:42;;;;9752:37;;16789:2;16774:18;;16760:124::o;16891:333::-;-1:-1;;;;;18629:46;;;9872:37;;18629:46;;17210:2;17195:18;;9872:37;17046:2;17031:18;;17017:207::o;17231:222::-;9992:37;;;17358:2;17343:18;;17329:124::o;17460:218::-;18966:10;18955:22;;;;10110:36;;17585:2;17570:18;;17556:122::o;20071:117::-;-1:-1;;;;;18749:54;;20130:35;;20120:2;;20179:1;;20169:12"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "1294200",
                "executionCost": "1349",
                "totalCost": "1295549"
              },
              "external": {
                "asset()": "1115",
                "beforeTokenMint(address,uint256,address,address)": "infinite",
                "beforeTokenTransfer(address,address,uint256,address)": "infinite",
                "claim(address)": "infinite",
                "deposit(uint256)": "infinite",
                "drip()": "infinite",
                "dripRatePerSecond()": "1118",
                "exchangeRateMantissa()": "1136",
                "initialize(address,address,uint256)": "infinite",
                "lastDripTimestamp()": "1107",
                "measure()": "1158",
                "owner()": "1094",
                "renounceOwnership()": "24364",
                "setCurrentTime(uint32)": "21189",
                "setDripRatePerSecond(uint256)": "infinite",
                "supportsInterface(bytes4)": "495",
                "totalUnclaimed()": "1198",
                "transferOwnership(address)": "24595",
                "userStates(address)": "1384",
                "withdrawTo(address,uint256)": "infinite"
              },
              "internal": {
                "_currentTime()": "821"
              }
            },
            "methodIdentifiers": {
              "asset()": "38d52e0f",
              "beforeTokenMint(address,uint256,address,address)": "4d7f3db0",
              "beforeTokenTransfer(address,address,uint256,address)": "b2210957",
              "claim(address)": "1e83409a",
              "deposit(uint256)": "b6b55f25",
              "drip()": "9f678cca",
              "dripRatePerSecond()": "187f3334",
              "exchangeRateMantissa()": "e318613e",
              "initialize(address,address,uint256)": "1794bb3c",
              "lastDripTimestamp()": "d9772a25",
              "measure()": "efa9a1ad",
              "owner()": "8da5cb5b",
              "renounceOwnership()": "715018a6",
              "setCurrentTime(uint32)": "644a9e71",
              "setDripRatePerSecond(uint256)": "ca5baafc",
              "supportsInterface(bytes4)": "01ffc9a7",
              "totalUnclaimed()": "c96f14b8",
              "transferOwnership(address)": "f2fde38b",
              "userStates(address)": "0ecc535f",
              "withdrawTo(address,uint256)": "205c2878"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newTokens\",\"type\":\"uint256\"}],\"name\":\"Claimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"dripRatePerSecond\",\"type\":\"uint256\"}],\"name\":\"DripRateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newTokens\",\"type\":\"uint256\"}],\"name\":\"Dripped\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"measure\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"dripRatePerSecond\",\"type\":\"uint256\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"asset\",\"outputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"beforeTokenMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"beforeTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"claim\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"drip\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"dripRatePerSecond\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"exchangeRateMantissa\",\"outputs\":[{\"internalType\":\"uint112\",\"name\":\"\",\"type\":\"uint112\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_asset\",\"type\":\"address\"},{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_measure\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_dripRatePerSecond\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastDripTimestamp\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"measure\",\"outputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_time\",\"type\":\"uint32\"}],\"name\":\"setCurrentTime\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_dripRatePerSecond\",\"type\":\"uint256\"}],\"name\":\"setDripRatePerSecond\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalUnclaimed\",\"outputs\":[{\"internalType\":\"uint112\",\"name\":\"\",\"type\":\"uint112\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"userStates\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"lastExchangeRateMantissa\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"balance\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"beforeTokenMint(address,uint256,address,address)\":{\"params\":{\"to\":\"The user who is minting the tokens\",\"token\":\"The token they are minting\"}},\"beforeTokenTransfer(address,address,uint256,address)\":{\"params\":{\"from\":\"The user who is sending the tokens\",\"to\":\"The user who is receiving the tokens\",\"token\":\"The token token they are burning\"}},\"claim(address)\":{\"params\":{\"user\":\"The user to claim tokens for\"},\"returns\":{\"_0\":\"The amount of tokens that were claimed.\"}},\"deposit(uint256)\":{\"params\":{\"amount\":\"The amount of asset tokens to add (must be approved already)\"}},\"drip()\":{\"details\":\"Should be called immediately before any measure token mints/transfers/burns\",\"returns\":{\"_0\":\"The number of new tokens dripped.\"}},\"initialize(address,address,uint256)\":{\"params\":{\"_asset\":\"The asset to disburse to users\",\"_dripRatePerSecond\":\"The amount of the asset to drip each second\",\"_measure\":\"The token to use to measure a users portion\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setDripRatePerSecond(uint256)\":{\"params\":{\"_dripRatePerSecond\":\"The new drip rate in tokens per second\"}},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"withdrawTo(address,uint256)\":{\"params\":{\"amount\":\"The amount to withdraw\",\"to\":\"The address to withdraw to\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"asset()\":{\"notice\":\"The token that is being disbursed\"},\"beforeTokenMint(address,uint256,address,address)\":{\"notice\":\"Should be called before a user mints new \\\"measure\\\" tokens.\"},\"beforeTokenTransfer(address,address,uint256,address)\":{\"notice\":\"Should be called before \\\"measure\\\" tokens are transferred or burned\"},\"claim(address)\":{\"notice\":\"Transfers all unclaimed tokens to the user\"},\"deposit(uint256)\":{\"notice\":\"Safely deposits asset tokens into the faucet.  Must be pre-approved This should be used instead of transferring directly because the drip function must be called before receiving new assets.\"},\"drip()\":{\"notice\":\"Drips new tokens.\"},\"dripRatePerSecond()\":{\"notice\":\"The total number of tokens that are disbursed each second\"},\"exchangeRateMantissa()\":{\"notice\":\"The cumulative exchange rate of measure token supply : dripped tokens\"},\"initialize(address,address,uint256)\":{\"notice\":\"Initializes a new Comptroller V2\"},\"lastDripTimestamp()\":{\"notice\":\"The timestamp at which the tokens were last dripped\"},\"measure()\":{\"notice\":\"The token that is user to measure a user's portion of disbursed tokens\"},\"setDripRatePerSecond(uint256)\":{\"notice\":\"Allows the owner to set the drip rate per second.  This is the number of tokens that are dripped each second.\"},\"totalUnclaimed()\":{\"notice\":\"The total amount of tokens that have been dripped but not claimed\"},\"userStates(address)\":{\"notice\":\"The data structure that tracks when a user last received tokens\"},\"withdrawTo(address,uint256)\":{\"notice\":\"Allows the owner to withdraw tokens that have not been dripped yet.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/TokenFaucetHarness.sol\":\"TokenFaucetHarness\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"contracts/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary Constants {\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC721 = 0x80ac58cd;\\n}\",\"keccak256\":\"0x5dc8f8bda4e9668a9ffae6a941774f849adcb368cc2275fd8a91e6ada8fad7fb\",\"license\":\"GPL-3.0\"},\"contracts/test/TokenFaucetHarness.sol\":{\"content\":\"pragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"../token-faucet/TokenFaucet.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ncontract TokenFaucetHarness is TokenFaucet {\\n\\n  uint32 internal time;\\n\\n  function setCurrentTime(uint32 _time) external {\\n    time = _time;\\n  }\\n\\n  function _currentTime() internal override view returns (uint32) {\\n    return time;\\n  }\\n\\n}\",\"keccak256\":\"0x5002ada24602cf806778facece2674560bb28039834c6856e0f59a15d6059a6c\"},\"contracts/token-faucet/TokenFaucet.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\n\\nimport \\\"../utils/ExtendedSafeCast.sol\\\";\\nimport \\\"../token/TokenListener.sol\\\";\\n\\n/// @title Disburses a token at a fixed rate per second to holders of another token.\\n/// @notice The tokens are dripped at a \\\"drip rate per second\\\".  This is the number of tokens that\\n/// are dripped each second.  A user's share of the dripped tokens is based on how many 'measure' tokens they hold.\\n/* solium-disable security/no-block-members */\\ncontract TokenFaucet is OwnableUpgradeable, TokenListener {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using ExtendedSafeCast for uint256;\\n\\n  event Initialized(\\n    IERC20Upgradeable indexed asset,\\n    IERC20Upgradeable indexed measure,\\n    uint256 dripRatePerSecond\\n  );\\n\\n  event Dripped(\\n    uint256 newTokens\\n  );\\n\\n  event Deposited(\\n    address indexed user,\\n    uint256 amount\\n  );\\n\\n  event Withdrawn(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  event Claimed(\\n    address indexed user,\\n    uint256 newTokens\\n  );\\n\\n  event DripRateChanged(\\n    uint256 dripRatePerSecond\\n  );\\n\\n  struct UserState {\\n    uint128 lastExchangeRateMantissa;\\n    uint128 balance;\\n  }\\n\\n  /// @notice The token that is being disbursed\\n  IERC20Upgradeable public asset;\\n\\n  /// @notice The token that is user to measure a user's portion of disbursed tokens\\n  IERC20Upgradeable public measure;\\n\\n  /// @notice The total number of tokens that are disbursed each second\\n  uint256 public dripRatePerSecond;\\n\\n  /// @notice The cumulative exchange rate of measure token supply : dripped tokens\\n  uint112 public exchangeRateMantissa;\\n\\n  /// @notice The total amount of tokens that have been dripped but not claimed\\n  uint112 public totalUnclaimed;\\n\\n  /// @notice The timestamp at which the tokens were last dripped\\n  uint32 public lastDripTimestamp;\\n\\n  /// @notice The data structure that tracks when a user last received tokens\\n  mapping(address => UserState) public userStates;\\n\\n  /// @notice Initializes a new Comptroller V2\\n  /// @param _asset The asset to disburse to users\\n  /// @param _measure The token to use to measure a users portion\\n  /// @param _dripRatePerSecond The amount of the asset to drip each second\\n  function initialize (\\n    IERC20Upgradeable _asset,\\n    IERC20Upgradeable _measure,\\n    uint256 _dripRatePerSecond\\n  ) public initializer {\\n    __Ownable_init();\\n    lastDripTimestamp = _currentTime();\\n    asset = _asset;\\n    measure = _measure;\\n    setDripRatePerSecond(_dripRatePerSecond);\\n\\n    emit Initialized(\\n      asset,\\n      measure,\\n      dripRatePerSecond\\n    );\\n  }\\n\\n  /// @notice Safely deposits asset tokens into the faucet.  Must be pre-approved\\n  /// This should be used instead of transferring directly because the drip function must\\n  /// be called before receiving new assets.\\n  /// @param amount The amount of asset tokens to add (must be approved already)\\n  function deposit(uint256 amount) external {\\n    drip();\\n    asset.transferFrom(msg.sender, address(this), amount);\\n\\n    emit Deposited(msg.sender, amount);\\n  }\\n\\n  /// @notice Allows the owner to withdraw tokens that have not been dripped yet.\\n  /// @param to The address to withdraw to\\n  /// @param amount The amount to withdraw\\n  function withdrawTo(address to, uint256 amount) external onlyOwner {\\n    drip();\\n    uint256 assetTotalSupply = asset.balanceOf(address(this));\\n    uint256 availableTotalSupply = assetTotalSupply.sub(totalUnclaimed);\\n    require(amount <= availableTotalSupply, \\\"TokenFaucet/insufficient-funds\\\");\\n    asset.transfer(to, amount);\\n\\n    emit Withdrawn(to, amount);\\n  }\\n\\n  /// @notice Transfers all unclaimed tokens to the user\\n  /// @param user The user to claim tokens for\\n  /// @return The amount of tokens that were claimed.\\n  function claim(address user) external returns (uint256) {\\n    drip();\\n    _captureNewTokensForUser(user);\\n    uint256 balance = userStates[user].balance;\\n    userStates[user].balance = 0;\\n    totalUnclaimed = uint256(totalUnclaimed).sub(balance).toUint112();\\n    asset.transfer(user, balance);\\n\\n    emit Claimed(user, balance);\\n\\n    return balance;\\n  }\\n\\n  /// @notice Drips new tokens.\\n  /// @dev Should be called immediately before any measure token mints/transfers/burns\\n  /// @return The number of new tokens dripped.\\n  function drip() public returns (uint256) {\\n    uint256 currentTimestamp = _currentTime();\\n\\n    // this should only run once per block.\\n    if (lastDripTimestamp == uint32(currentTimestamp)) {\\n      return 0;\\n    }\\n\\n    uint256 assetTotalSupply = asset.balanceOf(address(this));\\n    uint256 availableTotalSupply = assetTotalSupply.sub(totalUnclaimed);\\n    uint256 newSeconds = currentTimestamp.sub(lastDripTimestamp);\\n    uint256 nextExchangeRateMantissa = exchangeRateMantissa;\\n    uint256 newTokens;\\n    uint256 measureTotalSupply = measure.totalSupply();\\n\\n    if (measureTotalSupply > 0 && availableTotalSupply > 0) {\\n      newTokens = newSeconds.mul(dripRatePerSecond);\\n      if (newTokens > availableTotalSupply) {\\n        newTokens = availableTotalSupply;\\n      }\\n      uint256 indexDeltaMantissa = FixedPoint.calculateMantissa(newTokens, measureTotalSupply);\\n      nextExchangeRateMantissa = nextExchangeRateMantissa.add(indexDeltaMantissa);\\n\\n      emit Dripped(\\n        newTokens\\n      );\\n    }\\n\\n    exchangeRateMantissa = nextExchangeRateMantissa.toUint112();\\n    totalUnclaimed = uint256(totalUnclaimed).add(newTokens).toUint112();\\n    lastDripTimestamp = currentTimestamp.toUint32();\\n\\n    return newTokens;\\n  }\\n\\n  /// @notice Allows the owner to set the drip rate per second.  This is the number of tokens that are dripped each second.\\n  /// @param _dripRatePerSecond The new drip rate in tokens per second\\n  function setDripRatePerSecond(uint256 _dripRatePerSecond) public onlyOwner {\\n    require(_dripRatePerSecond > 0, \\\"TokenFaucet/dripRate-gt-zero\\\");\\n\\n    // ensure we're all caught up\\n    drip();\\n\\n    dripRatePerSecond = _dripRatePerSecond;\\n\\n    emit DripRateChanged(dripRatePerSecond);\\n  }\\n\\n  /// @notice Captures new tokens for a user\\n  /// @dev This must be called before changes to the user's balance (i.e. before mint, transfer or burns)\\n  /// @param user The user to capture tokens for\\n  /// @return The number of new tokens\\n  function _captureNewTokensForUser(\\n    address user\\n  ) private returns (uint128) {\\n    UserState storage userState = userStates[user];\\n    if (exchangeRateMantissa == userState.lastExchangeRateMantissa) {\\n      // ignore if exchange rate is same\\n      return 0;\\n    }\\n    uint256 deltaExchangeRateMantissa = uint256(exchangeRateMantissa).sub(userState.lastExchangeRateMantissa);\\n    uint256 userMeasureBalance = measure.balanceOf(user);\\n    uint128 newTokens = FixedPoint.multiplyUintByMantissa(userMeasureBalance, deltaExchangeRateMantissa).toUint128();\\n\\n    userStates[user] = UserState({\\n      lastExchangeRateMantissa: exchangeRateMantissa,\\n      balance: uint256(userState.balance).add(newTokens).toUint128()\\n    });\\n\\n    return newTokens;\\n  }\\n\\n  /// @notice Should be called before a user mints new \\\"measure\\\" tokens.\\n  /// @param to The user who is minting the tokens\\n  /// @param token The token they are minting\\n  function beforeTokenMint(\\n    address to,\\n    uint256,\\n    address token,\\n    address\\n  )\\n    external\\n    override\\n  {\\n    if (token == address(measure)) {\\n      drip();\\n      _captureNewTokensForUser(to);\\n    }\\n  }\\n\\n  /// @notice Should be called before \\\"measure\\\" tokens are transferred or burned\\n  /// @param from The user who is sending the tokens\\n  /// @param to The user who is receiving the tokens\\n  /// @param token The token token they are burning\\n  function beforeTokenTransfer(\\n    address from,\\n    address to,\\n    uint256,\\n    address token\\n  )\\n    external\\n    override\\n  {\\n    // must be measure and not be minting\\n    if (token == address(measure) && from != address(0)) {\\n      drip();\\n      _captureNewTokensForUser(to);\\n      _captureNewTokensForUser(from);\\n    }\\n  }\\n\\n  /// @notice returns the current time.  Allows for override in testing.\\n  /// @return The current time (block.timestamp)\\n  function _currentTime() internal virtual view returns (uint32) {\\n    return block.timestamp.toUint32();\\n  }\\n\\n}\\n\",\"keccak256\":\"0x5ebdc4cebd97cf8ca5f0ad6829ce6a98a37fa40fa6e9058446e4acdb43ffcb45\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListener.sol\":{\"content\":\"pragma solidity ^0.6.4;\\n\\nimport \\\"./TokenListenerInterface.sol\\\";\\nimport \\\"./TokenListenerLibrary.sol\\\";\\nimport \\\"../Constants.sol\\\";\\n\\nabstract contract TokenListener is TokenListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER\\n    );\\n  }\\n}\\n\",\"keccak256\":\"0xb0e98d10b004602e1d4f4369a70e6382002dc0c0c5713698eb6a92943aef2265\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/ExtendedSafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary ExtendedSafeCast {\\n\\n  /**\\n    * @dev Converts an unsigned uint256 into a unsigned uint112.\\n    *\\n    * Requirements:\\n    *\\n    * - input must be less than or equal to maxUint112.\\n    */\\n  function toUint112(uint256 value) internal pure returns (uint112) {\\n    require(value < 2**112, \\\"SafeCast: value doesn't fit in an uint112\\\");\\n    return uint112(value);\\n  }\\n\\n  /**\\n    * @dev Converts an unsigned uint256 into a unsigned uint96.\\n    *\\n    * Requirements:\\n    *\\n    * - input must be less than or equal to maxUint96.\\n    */\\n  function toUint96(uint256 value) internal pure returns (uint96) {\\n    require(value < 2**96, \\\"SafeCast: value doesn't fit in an uint96\\\");\\n    return uint96(value);\\n  }\\n\\n}\",\"keccak256\":\"0x6c8940ba9b1789d362c550be1da5c667ad990e2ff22423ca2d11402e545d3057\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/test/TokenFaucetHarness.sol:TokenFaucetHarness",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/test/TokenFaucetHarness.sol:TokenFaucetHarness",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/test/TokenFaucetHarness.sol:TokenFaucetHarness",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 10,
                "contract": "contracts/test/TokenFaucetHarness.sol:TokenFaucetHarness",
                "label": "_owner",
                "offset": 0,
                "slot": "51",
                "type": "t_address"
              },
              {
                "astId": 129,
                "contract": "contracts/test/TokenFaucetHarness.sol:TokenFaucetHarness",
                "label": "__gap",
                "offset": 0,
                "slot": "52",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 14990,
                "contract": "contracts/test/TokenFaucetHarness.sol:TokenFaucetHarness",
                "label": "asset",
                "offset": 0,
                "slot": "101",
                "type": "t_contract(IERC20Upgradeable)1960"
              },
              {
                "astId": 14993,
                "contract": "contracts/test/TokenFaucetHarness.sol:TokenFaucetHarness",
                "label": "measure",
                "offset": 0,
                "slot": "102",
                "type": "t_contract(IERC20Upgradeable)1960"
              },
              {
                "astId": 14996,
                "contract": "contracts/test/TokenFaucetHarness.sol:TokenFaucetHarness",
                "label": "dripRatePerSecond",
                "offset": 0,
                "slot": "103",
                "type": "t_uint256"
              },
              {
                "astId": 14999,
                "contract": "contracts/test/TokenFaucetHarness.sol:TokenFaucetHarness",
                "label": "exchangeRateMantissa",
                "offset": 0,
                "slot": "104",
                "type": "t_uint112"
              },
              {
                "astId": 15002,
                "contract": "contracts/test/TokenFaucetHarness.sol:TokenFaucetHarness",
                "label": "totalUnclaimed",
                "offset": 14,
                "slot": "104",
                "type": "t_uint112"
              },
              {
                "astId": 15005,
                "contract": "contracts/test/TokenFaucetHarness.sol:TokenFaucetHarness",
                "label": "lastDripTimestamp",
                "offset": 28,
                "slot": "104",
                "type": "t_uint32"
              },
              {
                "astId": 15010,
                "contract": "contracts/test/TokenFaucetHarness.sol:TokenFaucetHarness",
                "label": "userStates",
                "offset": 0,
                "slot": "105",
                "type": "t_mapping(t_address,t_struct(UserState)14987_storage)"
              },
              {
                "astId": 14783,
                "contract": "contracts/test/TokenFaucetHarness.sol:TokenFaucetHarness",
                "label": "time",
                "offset": 0,
                "slot": "106",
                "type": "t_uint32"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_contract(IERC20Upgradeable)1960": {
                "encoding": "inplace",
                "label": "contract IERC20Upgradeable",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_struct(UserState)14987_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct TokenFaucet.UserState)",
                "numberOfBytes": "32",
                "value": "t_struct(UserState)14987_storage"
              },
              "t_struct(UserState)14987_storage": {
                "encoding": "inplace",
                "label": "struct TokenFaucet.UserState",
                "members": [
                  {
                    "astId": 14984,
                    "contract": "contracts/test/TokenFaucetHarness.sol:TokenFaucetHarness",
                    "label": "lastExchangeRateMantissa",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint128"
                  },
                  {
                    "astId": 14986,
                    "contract": "contracts/test/TokenFaucetHarness.sol:TokenFaucetHarness",
                    "label": "balance",
                    "offset": 16,
                    "slot": "0",
                    "type": "t_uint128"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_uint112": {
                "encoding": "inplace",
                "label": "uint112",
                "numberOfBytes": "14"
              },
              "t_uint128": {
                "encoding": "inplace",
                "label": "uint128",
                "numberOfBytes": "16"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint32": {
                "encoding": "inplace",
                "label": "uint32",
                "numberOfBytes": "4"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "asset()": {
                "notice": "The token that is being disbursed"
              },
              "beforeTokenMint(address,uint256,address,address)": {
                "notice": "Should be called before a user mints new \"measure\" tokens."
              },
              "beforeTokenTransfer(address,address,uint256,address)": {
                "notice": "Should be called before \"measure\" tokens are transferred or burned"
              },
              "claim(address)": {
                "notice": "Transfers all unclaimed tokens to the user"
              },
              "deposit(uint256)": {
                "notice": "Safely deposits asset tokens into the faucet.  Must be pre-approved This should be used instead of transferring directly because the drip function must be called before receiving new assets."
              },
              "drip()": {
                "notice": "Drips new tokens."
              },
              "dripRatePerSecond()": {
                "notice": "The total number of tokens that are disbursed each second"
              },
              "exchangeRateMantissa()": {
                "notice": "The cumulative exchange rate of measure token supply : dripped tokens"
              },
              "initialize(address,address,uint256)": {
                "notice": "Initializes a new Comptroller V2"
              },
              "lastDripTimestamp()": {
                "notice": "The timestamp at which the tokens were last dripped"
              },
              "measure()": {
                "notice": "The token that is user to measure a user's portion of disbursed tokens"
              },
              "setDripRatePerSecond(uint256)": {
                "notice": "Allows the owner to set the drip rate per second.  This is the number of tokens that are dripped each second."
              },
              "totalUnclaimed()": {
                "notice": "The total amount of tokens that have been dripped but not claimed"
              },
              "userStates(address)": {
                "notice": "The data structure that tracks when a user last received tokens"
              },
              "withdrawTo(address,uint256)": {
                "notice": "Allows the owner to withdraw tokens that have not been dripped yet."
              }
            },
            "version": 1
          }
        }
      },
      "contracts/test/YieldSourcePrizePoolHarness.sol": {
        "YieldSourcePrizePoolHarness": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "AwardCaptured",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "Awarded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "AwardedExternalERC20",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "winner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256[]",
                  "name": "tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "AwardedExternalERC721",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract ControlledTokenInterface",
                  "name": "token",
                  "type": "address"
                }
              ],
              "name": "ControlledTokenAdded",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "CreditBurned",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "CreditMinted",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint128",
                  "name": "creditLimitMantissa",
                  "type": "uint128"
                },
                {
                  "indexed": false,
                  "internalType": "uint128",
                  "name": "creditRateMantissa",
                  "type": "uint128"
                }
              ],
              "name": "CreditPlanSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "referrer",
                  "type": "address"
                }
              ],
              "name": "Deposited",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "bytes",
                  "name": "error",
                  "type": "bytes"
                }
              ],
              "name": "ErrorAwardingExternalERC721",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "reserveRegistry",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "maxExitFeeMantissa",
                  "type": "uint256"
                }
              ],
              "name": "Initialized",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "redeemed",
                  "type": "uint256"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "exitFee",
                  "type": "uint256"
                }
              ],
              "name": "InstantWithdrawal",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "liquidityCap",
                  "type": "uint256"
                }
              ],
              "name": "LiquidityCapSet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "prizeStrategy",
                  "type": "address"
                }
              ],
              "name": "PrizeStrategySet",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "ReserveFeeCaptured",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "ReserveWithdrawal",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "TransferredExternalERC20",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "yieldSource",
                  "type": "address"
                }
              ],
              "name": "YieldSourcePrizePoolInitialized",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "VERSION",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "accountedBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "award",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "awardBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "awardExternalERC20",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256[]",
                  "name": "tokenIds",
                  "type": "uint256[]"
                }
              ],
              "name": "awardExternalERC721",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "balance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "balanceOfCredit",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "beforeTokenTransfer",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "calculateEarlyExitFee",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "exitFee",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "burnedCredit",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "calculateReserveFee",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_externalToken",
                  "type": "address"
                }
              ],
              "name": "canAwardExternal",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "captureAwardBalance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract ICompLike",
                  "name": "compLike",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                }
              ],
              "name": "compLikeDelegate",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "creditPlanOf",
              "outputs": [
                {
                  "internalType": "uint128",
                  "name": "creditLimitMantissa",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "creditRateMantissa",
                  "type": "uint128"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "currentTime",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "referrer",
                  "type": "address"
                }
              ],
              "name": "depositTo",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_principal",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "_interest",
                  "type": "uint256"
                }
              ],
              "name": "estimateCreditAccrualTime",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "durationSeconds",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "_reserveRegistry",
                  "type": "address"
                },
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "_controlledTokens",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256",
                  "name": "_maxExitFeeMantissa",
                  "type": "uint256"
                }
              ],
              "name": "initialize",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "_reserveRegistry",
                  "type": "address"
                },
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "_controlledTokens",
                  "type": "address[]"
                },
                {
                  "internalType": "uint256",
                  "name": "_maxExitFeeMantissa",
                  "type": "uint256"
                },
                {
                  "internalType": "contract IYieldSource",
                  "name": "_yieldSource",
                  "type": "address"
                }
              ],
              "name": "initializeYieldSourcePrizePool",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract ControlledTokenInterface",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "isControlled",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "liquidityCap",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "maxExitFeeMantissa",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "tokenId",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes",
                  "name": "data",
                  "type": "bytes"
                }
              ],
              "name": "onERC721Received",
              "outputs": [
                {
                  "internalType": "bytes4",
                  "name": "",
                  "type": "bytes4"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "prizeStrategy",
              "outputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "redeemAmount",
                  "type": "uint256"
                }
              ],
              "name": "redeem",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "renounceOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "reserveRegistry",
              "outputs": [
                {
                  "internalType": "contract RegistryInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "reserveTotalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint128",
                  "name": "_creditRateMantissa",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "_creditLimitMantissa",
                  "type": "uint128"
                }
              ],
              "name": "setCreditPlanOf",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_currentTime",
                  "type": "uint256"
                }
              ],
              "name": "setCurrentTime",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_liquidityCap",
                  "type": "uint256"
                }
              ],
              "name": "setLiquidityCap",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract TokenListenerInterface",
                  "name": "_prizeStrategy",
                  "type": "address"
                }
              ],
              "name": "setPrizeStrategy",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "mintAmount",
                  "type": "uint256"
                }
              ],
              "name": "supply",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "token",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "tokens",
              "outputs": [
                {
                  "internalType": "contract ControlledTokenInterface[]",
                  "name": "",
                  "type": "address[]"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "externalToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transferExternalERC20",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "maximumExitFee",
                  "type": "uint256"
                }
              ],
              "name": "withdrawInstantlyFrom",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                }
              ],
              "name": "withdrawReserve",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "yieldSource",
              "outputs": [
                {
                  "internalType": "contract IYieldSource",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "accountedBalance()": {
                "returns": {
                  "_0": "The current total of all tokens"
                }
              },
              "award(address,uint256,address)": {
                "details": "The amount awarded must be less than the awardBalance()",
                "params": {
                  "amount": "The amount of assets to be awarded",
                  "controlledToken": "The address of the asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "awardBalance()": {
                "details": "captureAwardBalance() should be called first",
                "returns": {
                  "_0": "The total amount of assets to be awarded for the current prize"
                }
              },
              "awardExternalERC20(address,address,uint256)": {
                "details": "Used to award any arbitrary tokens held by the Prize Pool",
                "params": {
                  "amount": "The amount of external assets to be awarded",
                  "externalToken": "The address of the external asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "awardExternalERC721(address,address,uint256[])": {
                "details": "Used to award any arbitrary NFTs held by the Prize Pool",
                "params": {
                  "externalToken": "The address of the external NFT token being awarded",
                  "to": "The address of the winner that receives the award",
                  "tokenIds": "An array of NFT Token IDs to be transferred"
                }
              },
              "balance()": {
                "details": "Returns the total underlying balance of all assets. This includes both principal and interest.",
                "returns": {
                  "_0": "The underlying balance of assets"
                }
              },
              "balanceOfCredit(address,address)": {
                "params": {
                  "user": "The user whose credit balance should be returned"
                },
                "returns": {
                  "_0": "The balance of the users credit"
                }
              },
              "beforeTokenTransfer(address,address,uint256)": {
                "params": {
                  "amount": "The amount of tokens being trasferred",
                  "from": "The address the tokens are being transferred from (0 if minting)",
                  "to": "The address the tokens are being transferred to (0 if burning)"
                }
              },
              "calculateEarlyExitFee(address,address,uint256)": {
                "params": {
                  "amount": "The amount of collateral to be withdrawn",
                  "controlledToken": "The type of collateral being withdrawn",
                  "from": "The user who is withdrawing"
                },
                "returns": {
                  "burnedCredit": "The user's credit that was burned",
                  "exitFee": "The exit fee"
                }
              },
              "calculateReserveFee(uint256)": {
                "params": {
                  "amount": "The prize amount"
                },
                "returns": {
                  "_0": "The size of the reserve portion of the prize"
                }
              },
              "canAwardExternal(address)": {
                "details": "Checks with the Prize Pool if a specific token type may be awarded as an external prize",
                "params": {
                  "_externalToken": "The address of the token to check"
                },
                "returns": {
                  "_0": "True if the token may be awarded, false otherwise"
                }
              },
              "captureAwardBalance()": {
                "details": "This function also captures the reserve fees.",
                "returns": {
                  "_0": "The total amount of assets to be awarded for the current prize"
                }
              },
              "compLikeDelegate(address,address)": {
                "params": {
                  "compLike": "The COMP-like token held by the prize pool that should be delegated",
                  "to": "The address to delegate to "
                }
              },
              "creditPlanOf(address)": {
                "params": {
                  "controlledToken": "The controlled token to retrieve the credit rates for"
                },
                "returns": {
                  "creditLimitMantissa": "The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.",
                  "creditRateMantissa": "The credit rate. This is the amount of tokens that accrue per second."
                }
              },
              "depositTo(address,uint256,address,address)": {
                "params": {
                  "amount": "The amount of assets to deposit",
                  "controlledToken": "The address of the type of token the user is minting",
                  "referrer": "The referrer of the deposit",
                  "to": "The address receiving the newly minted tokens"
                }
              },
              "estimateCreditAccrualTime(address,uint256,uint256)": {
                "params": {
                  "_interest": "The amount of interest that must accrue",
                  "_principal": "The principal amount on which interest is accruing"
                },
                "returns": {
                  "durationSeconds": "The duration of time it will take to accrue the given amount of interest, in seconds."
                }
              },
              "initialize(address,address[],uint256)": {
                "params": {
                  "_controlledTokens": "Array of ControlledTokens that are controlled by this Prize Pool.",
                  "_maxExitFeeMantissa": "The maximum exit fee size"
                }
              },
              "initializeYieldSourcePrizePool(address,address[],uint256,address)": {
                "params": {
                  "_controlledTokens": "Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool",
                  "_maxExitFeeMantissa": "The maximum exit fee size, relative to the withdrawal amount",
                  "_yieldSource": "Address of the yield source"
                }
              },
              "isControlled(address)": {
                "details": "Checks if a specific token is controlled by the Prize Pool",
                "params": {
                  "controlledToken": "The address of the token to check"
                },
                "returns": {
                  "_0": "True if the token is a controlled token, false otherwise"
                }
              },
              "onERC721Received(address,address,uint256,bytes)": {
                "params": {
                  "data": "Additional data with no specified format, sent in call to `_to`.",
                  "from": "The current owner of the NFT",
                  "operator": "The address that acts on behalf of the owner",
                  "tokenId": "The NFT to transfer"
                }
              },
              "owner()": {
                "details": "Returns the address of the current owner."
              },
              "renounceOwnership()": {
                "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
              },
              "setCreditPlanOf(address,uint128,uint128)": {
                "params": {
                  "_controlledToken": "The controlled token for whom to set the credit plan",
                  "_creditLimitMantissa": "The credit limit to set.  Is a fixed point 18 decimal (like Ether).",
                  "_creditRateMantissa": "The credit rate to set.  Is a fixed point 18 decimal (like Ether)."
                }
              },
              "setLiquidityCap(uint256)": {
                "params": {
                  "_liquidityCap": "The new liquidity cap for the prize pool"
                }
              },
              "setPrizeStrategy(address)": {
                "params": {
                  "_prizeStrategy": "The new prize strategy"
                }
              },
              "token()": {
                "details": "Returns the address of the underlying ERC20 asset",
                "returns": {
                  "_0": "The address of the asset"
                }
              },
              "tokens()": {
                "returns": {
                  "_0": "An array of controlled token addresses"
                }
              },
              "transferExternalERC20(address,address,uint256)": {
                "details": "Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.",
                "params": {
                  "amount": "The amount of external assets to be awarded",
                  "externalToken": "The address of the external asset token being awarded",
                  "to": "The address of the winner that receives the award"
                }
              },
              "transferOwnership(address)": {
                "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
              },
              "withdrawInstantlyFrom(address,uint256,address,uint256)": {
                "params": {
                  "amount": "The amount of tokens to redeem for assets.",
                  "controlledToken": "The address of the token to redeem (i.e. ticket or sponsorship)",
                  "from": "The address to redeem tokens from.",
                  "maximumExitFee": "The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn."
                },
                "returns": {
                  "_0": "The actual exit fee paid"
                }
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506144ba806100206000396000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c80638da5cb5b11610146578063b69ef8a8116100c3578063e323f82511610087578063e323f825146109a5578063e6d8a94b146109e1578063edb4e1cf146109e9578063f2fde38b146109f1578063fc0c546a14610a17578063ffa1ad7414610a1f5761025e565b8063b69ef8a814610864578063cfa240071461086c578063d18e81b31461092b578063d4a1361d14610933578063db006a75146109885761025e565b80639e1675191161010a5780639e167519146107c05780639fe32a91146107c8578063a016240b146107e5578063a7b2cc311461081f578063b2470e5c1461085c5761025e565b80638da5cb5b1461070e5780638e71c1f61461073257806391ca480e1461073a57806398bf3eb6146107605780639d63848a146107685761025e565b806352a387ab116101df57806376687d3d116101a357806376687d3d1461060c57806378b3d3271461061457806379cb85631461063a5780637b99adb11461066c5780637cbab1c714610689578063888c2b6f146106bf5761025e565b806352a387ab14610566578063630665b41461058c5780636a3fd4f9146105945780636b1b863a146105ce578063715018a6146106045761025e565b80632b0ab144116102265780632b0ab144146104045780632f7627e31461043a57806335403023146104685780633ede50c614610485578063494de9f7146105385761025e565b80630937eb541461026357806313f55e391461027d578063150b7a02146102b557806316960d551461036057806322f8e566146103e7575b600080fd5b61026b610a9c565b60408051918252519081900360200190f35b6102b36004803603606081101561029357600080fd5b506001600160a01b03813581169160208101359091169060400135610aab565b005b610343600480360360808110156102cb57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561030557600080fd5b82018360208201111561031757600080fd5b803590602001918460018302840111600160201b8311171561033857600080fd5b509092509050610b69565b604080516001600160e01b03199092168252519081900360200190f35b6102b36004803603606081101561037657600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b8111156103a957600080fd5b8201836020820111156103bb57600080fd5b803590602001918460208302840111600160201b831117156103dc57600080fd5b509092509050610b7a565b6102b3600480360360208110156103fd57600080fd5b5035610e27565b6102b36004803603606081101561041a57600080fd5b506001600160a01b03813581169160208101359091169060400135610e2c565b6102b36004803603604081101561045057600080fd5b506001600160a01b0381358116916020013516610ee9565b6102b36004803603602081101561047e57600080fd5b5035611038565b6102b36004803603606081101561049b57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156104c557600080fd5b8201836020820111156104d757600080fd5b803590602001918460208302840111600160201b831117156104f857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611044915050565b61026b6004803603604081101561054e57600080fd5b506001600160a01b0381358116916020013516611236565b61026b6004803603602081101561057c57600080fd5b50356001600160a01b031661133d565b61026b61148c565b6105ba600480360360208110156105aa57600080fd5b50356001600160a01b0316611492565b604080519115158252519081900360200190f35b6102b3600480360360608110156105e457600080fd5b506001600160a01b038135811691602081013591604090910135166114a5565b6102b36116ad565b61026b611759565b6105ba6004803603602081101561062a57600080fd5b50356001600160a01b031661175f565b61026b6004803603606081101561065057600080fd5b506001600160a01b03813516906020810135906040013561176a565b6102b36004803603602081101561068257600080fd5b503561177f565b6102b36004803603606081101561069f57600080fd5b506001600160a01b038135811691602081013590911690604001356117ea565b6106f5600480360360608110156106d557600080fd5b506001600160a01b03813581169160208101359091169060400135611a36565b6040805192835260208301919091528051918290030190f35b610716611a50565b604080516001600160a01b039092168252519081900360200190f35b610716611a5f565b6102b36004803603602081101561075057600080fd5b50356001600160a01b0316611a6e565b610716611ad9565b610770611ae8565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156107ac578181015183820152602001610794565b505050509050019250505060405180910390f35b61026b611b4a565b61026b600480360360208110156107de57600080fd5b5035611b50565b61026b600480360360808110156107fb57600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611c7e565b6102b36004803603606081101561083557600080fd5b506001600160a01b03813516906001600160801b0360208201358116916040013516611eb5565b61071661200b565b61026b61201a565b6102b36004803603608081101561088257600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156108ac57600080fd5b8201836020820111156108be57600080fd5b803590602001918460208302840111600160201b831117156108df57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602001356001600160a01b0316612024565b61026b61226f565b6109596004803603602081101561094957600080fd5b50356001600160a01b0316612275565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b61026b6004803603602081101561099e57600080fd5b50356122a5565b6102b3600480360360808110156109bb57600080fd5b506001600160a01b038135811691602081013591604082013581169160600135166122b0565b61026b612465565b61026b6125db565b6102b360048036036020811015610a0757600080fd5b50356001600160a01b03166125e1565b6107166126e4565b610a276126ee565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610a61578181015183820152602001610a49565b50505050905090810190601f168015610a8e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610aa661270f565b905090565b6099546001600160a01b0316610abf61281a565b6001600160a01b031614610b08576040805162461bcd60e51b815260206004820152601c6024820152600080516020614465833981519152604482015290519081900360640190fd5b610b1383838361281e565b15610b6457816001600160a01b0316836001600160a01b03167fb0bac59718cd343c80a813518afcf36846cfcfe6d56e2b3cab9bd49f5f9b251c836040518082815260200191505060405180910390a35b505050565b630a85bd0160e11b95945050505050565b6099546001600160a01b0316610b8e61281a565b6001600160a01b031614610bd7576040805162461bcd60e51b815260206004820152601c6024820152600080516020614465833981519152604482015290519081900360640190fd5b610be0836128a6565b610c31576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b80610c3b57610e21565b60005b81811015610da857836001600160a01b03166342842e0e3087868686818110610c6357fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610cc057600080fd5b505af1925050508015610cd1575060015b610da0573d808015610cff576040519150601f19603f3d011682016040523d82523d6000602084013e610d04565b606091505b507f17e975018310f88872b58d4d8263adca83cf5c1893496ea2a86923dab15276ad816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d64578181015183820152602001610d4c565b50505050905090810190601f168015610d915780820380516001836020036101000a031916815260200191505b509250505060405180910390a1505b600101610c3e565b50826001600160a01b0316846001600160a01b03167f69c2de32bc4d47f488e72626a6cfdee85089342e52675e7de79c4b417623960c848460405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a35b50505050565b60a155565b6099546001600160a01b0316610e4061281a565b6001600160a01b031614610e89576040805162461bcd60e51b815260206004820152601c6024820152600080516020614465833981519152604482015290519081900360640190fd5b610e9483838361281e565b15610b6457816001600160a01b0316836001600160a01b03167fc65f48aca3b7a99b7443d04b8ffbb073156179bc628dc3f7def5047748973469836040518082815260200191505060405180910390a3505050565b610ef161281a565b6001600160a01b0316610f02611a50565b6001600160a01b031614610f4b576040805162461bcd60e51b81526020600482018190526024820152600080516020614342833981519152604482015290519081900360640190fd5b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f9a57600080fd5b505afa158015610fae573d6000803e3d6000fd5b505050506040513d6020811015610fc457600080fd5b5051111561103457816001600160a01b0316635c19a95c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561101b57600080fd5b505af115801561102f573d6000803e3d6000fd5b505050505b5050565b611041816128bb565b50565b600054610100900460ff168061105d575061105d61294b565b8061106b575060005460ff16155b6110a65760405162461bcd60e51b815260040180806020018281038252602e8152602001806142f3602e913960400191505060405180910390fd5b600054610100900460ff161580156110d1576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0384166111165760405162461bcd60e51b81526004018080602001828103825260228152602001806142ab6022913960400191505060405180910390fd5b82518067ffffffffffffffff8111801561112f57600080fd5b50604051908082528060200260200182016040528015611159578160200160208202803683370190505b50805161116e916098916020909101906141b9565b5060005b818110156111a557600085828151811061118857fe5b6020026020010151905061119c818361295c565b50600101611172565b506111ae612a87565b6111b6612b38565b6111c1600019612bcd565b609780546001600160a01b0319166001600160a01b038716908117909155609a849055604080519182526020820185905280517f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce799281900390910190a1508015610e21576000805461ff001916905550505050565b60008161124281612c08565b611281576040805162461bcd60e51b81526020600482015260176024820152600080516020614389833981519152604482015290519081900360640190fd5b6113068484856001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112d357600080fd5b505afa1580156112e7573d6000803e3d6000fd5b505050506040513d60208110156112fd57600080fd5b50516000612cc4565b50506001600160a01b039081166000908152609f60209081526040808320949093168252929092529020546001600160c01b031690565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561138e57600080fd5b505afa1580156113a2573d6000803e3d6000fd5b505050506040513d60208110156113b857600080fd5b505190506001600160a01b0381163314611412576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f6f6e6c792d7265736572766560501b604482015290519081900360640190fd5b609b80546000918290559061142682612cda565b90506114458582611435612d58565b6001600160a01b03169190612dce565b6040805183815290516001600160a01b038716917f1c71c8e11fd443227c8f8d3dc1a237a3a5e8310b540c7fbcf5169754aedf42c9919081900360200190a2949350505050565b609d5490565b600061149d826128a6565b90505b919050565b6099546001600160a01b03166114b961281a565b6001600160a01b031614611502576040805162461bcd60e51b815260206004820152601c6024820152600080516020614465833981519152604482015290519081900360640190fd5b8061150c81612c08565b61154b576040805162461bcd60e51b81526020600482015260176024820152600080516020614389833981519152604482015290519081900360640190fd5b8261155557610e21565b609d548311156115ac576040805162461bcd60e51b815260206004820152601d60248201527f5072697a65506f6f6c2f61776172642d657863656564732d617661696c000000604482015290519081900360640190fd5b609d546115b99084612e20565b609d556115c98484846000612e82565b60006115d58385612f68565b905061165b8584856001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561162957600080fd5b505afa15801561163d573d6000803e3d6000fd5b505050506040513d602081101561165357600080fd5b505184612cc4565b826001600160a01b0316856001600160a01b03167fe2554529d99ab7a67db6b4cea2b32c7d55ae325f958861e05f304fdded867e31866040518082815260200191505060405180910390a35050505050565b6116b561281a565b6001600160a01b03166116c6611a50565b6001600160a01b03161461170f576040805162461bcd60e51b81526020600482018190526024820152600080516020614342833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b609c5481565b600061149d82612c08565b6000611777848484612fa0565b949350505050565b61178761281a565b6001600160a01b0316611798611a50565b6001600160a01b0316146117e1576040805162461bcd60e51b81526020600482018190526024820152600080516020614342833981519152604482015290519081900360640190fd5b61104181612bcd565b336117f481612c08565b611833576040805162461bcd60e51b81526020600482015260176024820152600080516020614389833981519152604482015290519081900360640190fd5b6001600160a01b0384161561190d576000336001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561189157600080fd5b505afa1580156118a5573d6000803e3d6000fd5b505050506040513d60208110156118bb57600080fd5b5051905060006118cd86338484612ffa565b9050846001600160a01b0316866001600160a01b0316146118ff576118fc336118f68487612e20565b83613089565b90505b61190a8633836130cf565b50505b6001600160a01b038316158015906119375750836001600160a01b0316836001600160a01b031614155b1561198e5761198e8333336001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112d357600080fd5b6001600160a01b038416158015906119b057506099546001600160a01b031615155b15610e21576099546040805163b221095760e01b81526001600160a01b0387811660048301528681166024830152604482018690523360648301529151919092169163b221095791608480830192600092919082900301818387803b158015611a1857600080fd5b505af1158015611a2c573d6000803e3d6000fd5b5050505050505050565b600080611a4485858561326d565b90969095509350505050565b6033546001600160a01b031690565b6097546001600160a01b031681565b611a7661281a565b6001600160a01b0316611a87611a50565b6001600160a01b031614611ad0576040805162461bcd60e51b81526020600482018190526024820152600080516020614342833981519152604482015290519081900360640190fd5b6110418161340b565b6099546001600160a01b031681565b60606098805480602002602001604051908101604052809291908181526020018280548015611b4057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b22575b5050505050905090565b609a5481565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ba157600080fd5b505afa158015611bb5573d6000803e3d6000fd5b505050506040513d6020811015611bcb57600080fd5b505190506001600160a01b038116611be75760009150506114a0565b6000816001600160a01b031663010dfa58306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611c3657600080fd5b505afa158015611c4a573d6000803e3d6000fd5b505050506040513d6020811015611c6057600080fd5b5051905080611c74576000925050506114a0565b611777848261351e565b600060026065541415611cd8576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655582611ce781612c08565b611d26576040805162461bcd60e51b81526020600482015260176024820152600080516020614389833981519152604482015290519081900360640190fd5b600080611d3488878961326d565b9150915084821115611d775760405162461bcd60e51b81526004018080602001828103825260278152602001806143626027913960400191505060405180910390fd5b611d8288878361353f565b856001600160a01b031663631b5dfb611d9961281a565b8a8a6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611df157600080fd5b505af1158015611e05573d6000803e3d6000fd5b505050506000611e1e8389612e2090919063ffffffff16565b90506000611e2b82612cda565b9050611e3a8a82611435612d58565b876001600160a01b03168a6001600160a01b0316611e5661281a565b604080518d81526020810186905280820189905290516001600160a01b0392909216917f0271704a58fd2953e49b87d67a0a3ce28a58147de98a5457f60b4686f63850309181900360600190a450506001606555509695505050505050565b82611ebf81612c08565b611efe576040805162461bcd60e51b81526020600482015260176024820152600080516020614389833981519152604482015290519081900360640190fd5b611f0661281a565b6001600160a01b0316611f17611a50565b6001600160a01b031614611f60576040805162461bcd60e51b81526020600482018190526024820152600080516020614342833981519152604482015290519081900360640190fd5b6040805180820182526001600160801b0380851680835286821660208085018281526001600160a01b038b166000818152609e84528890209651875492518716600160801b029087166fffffffffffffffffffffffffffffffff1990931692909217909516179094558451928352928201528083019190915290517ffb0ba2cf86a2b03bcf387753a2192da80a006afa99dd022bb301c78e323bf1b99181900360600190a150505050565b60a0546001600160a01b031681565b6000610aa6613600565b600054610100900460ff168061203d575061203d61294b565b8061204b575060005460ff16155b6120865760405162461bcd60e51b815260040180806020018281038252602e8152602001806142f3602e913960400191505060405180910390fd5b600054610100900460ff161580156120b1576000805460ff1961ff0019909116610100171660011790555b6120c3826001600160a01b0316613660565b6120fe5760405162461bcd60e51b81526004018080602001828103825260368152602001806143f96036913960400191505060405180910390fd5b612109858585611044565b60a080546001600160a01b0319166001600160a01b0384169081179091556040805163c89039c560e01b60208083019190915282518083038201815291830192839052815160009493918291908401908083835b6020831061217c5780518252601f19909201916020918201910161215d565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d80600081146121dc576040519150601f19603f3d011682016040523d82523d6000602084013e6121e1565b606091505b50509050806122215760405162461bcd60e51b81526004018080602001828103825260298152602001806142356029913960400191505060405180910390fd5b6040516001600160a01b038416907f7a0ca506edc9fcd36e010dbcaad57dade17bbac71dfeb53269077098e863eeca90600090a2508015612268576000805461ff00191690555b5050505050565b60a15481565b6001600160a01b03166000908152609e60205260409020546001600160801b0380821692600160801b9092041690565b600061149d82612cda565b60026065541415612308576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026065558161231781612c08565b612356576040805162461bcd60e51b81526020600482015260176024820152600080516020614389833981519152604482015290519081900360640190fd5b8361236081613666565b6123b1576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f657863656564732d6c69717569646974792d63617000604482015290519081900360640190fd5b60006123bb61281a565b90506123c987878787612e82565b6123e88130886123d7612d58565b6001600160a01b031692919061368a565b6123f1866128bb565b846001600160a01b0316876001600160a01b0316826001600160a01b03167f6ce569498e0f86f147466ac49211cb2a1ffe06195adb805e383b3f2365109160898860405180838152602001826001600160a01b031681526020019250505060405180910390a4505060016065555050505050565b6000600260655414156124bf576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655560006124ce61270f565b905060006124da613600565b905060008282116124ec5760006124f6565b6124f68284612e20565b90506000609d54821161250a576000612518565b609d54612518908390612e20565b905080156125ca57600061252b82611b50565b9050801561258557609b5461254090826136e4565b609b5561254d8282612e20565b6040805183815290519193507f5f1703ccfa2730d4245350f228079926a37f26a44ecf6978a7eeafff0af11407919081900360200190a15b609d5461259290836136e4565b609d556040805183815290517fce2b6e507c7ca1a20ce136810f524eefc19ba4c7e4866eb6cc0cba76e778d4be9181900360200190a1505b609d54945050505050600160655590565b609b5481565b6125e961281a565b6001600160a01b03166125fa611a50565b6001600160a01b031614612643576040805162461bcd60e51b81526020600482018190526024820152600080516020614342833981519152604482015290519081900360640190fd5b6001600160a01b0381166126885760405162461bcd60e51b815260040180806020018281038252602681526020018061425e6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610aa6612d58565b60405180604001604052806005815260200164332e342e3560d81b81525081565b600080609b5490506060609880548060200260200160405190810160405280929190818152602001828054801561276f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612751575b505083519394506000925050505b818110156128115761280783828151811061279457fe5b60200260200101516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127d457600080fd5b505afa1580156127e8573d6000803e3d6000fd5b505050506040513d60208110156127fe57600080fd5b505185906136e4565b935060010161277d565b50919250505090565b3390565b6000612829836128a6565b61287a576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b816128875750600061289f565b61289b6001600160a01b0384168584612dce565b5060015b9392505050565b60a0546001600160a01b039081169116141590565b60a0546128e4906001600160a01b0316826128d4612d58565b6001600160a01b0316919061373e565b60a054604080516387a6eeef60e01b81526004810184905230602482015290516001600160a01b03909216916387a6eeef9160448082019260009290919082900301818387803b15801561293757600080fd5b505af1158015612268573d6000803e3d6000fd5b600061295630613660565b15905090565b306001600160a01b0316826001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b15801561299f57600080fd5b505afa1580156129b3573d6000803e3d6000fd5b505050506040513d60208110156129c957600080fd5b50516001600160a01b031614612a26576040805162461bcd60e51b815260206004820152601e60248201527f5072697a65506f6f6c2f746f6b656e2d6374726c722d6d69736d617463680000604482015290519081900360640190fd5b8160988281548110612a3457fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051918416917f460e712b4a5d801d031ed673dea209b73ab854f7ddeb86b6c48082e92c3eee669190a25050565b600054610100900460ff1680612aa05750612aa061294b565b80612aae575060005460ff16155b612ae95760405162461bcd60e51b815260040180806020018281038252602e8152602001806142f3602e913960400191505060405180910390fd5b600054610100900460ff16158015612b14576000805460ff1961ff0019909116610100171660011790555b612b1c613851565b612b246138f1565b8015611041576000805461ff001916905550565b600054610100900460ff1680612b515750612b5161294b565b80612b5f575060005460ff16155b612b9a5760405162461bcd60e51b815260040180806020018281038252602e8152602001806142f3602e913960400191505060405180910390fd5b600054610100900460ff16158015612bc5576000805460ff1961ff0019909116610100171660011790555b612b246139ea565b609c8190556040805182815290517f3ff20538222f568f27ff436c0c49dfd3e48d5b8f86533a3f759dc1c7089775ab9181900360200190a150565b600060606098805480602002602001604051908101604052809291908181526020018280548015612c6257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612c44575b505083519394506000925050505b81811015612cb957846001600160a01b0316838281518110612c8e57fe5b60200260200101516001600160a01b03161415612cb157600193505050506114a0565b600101612c70565b506000949350505050565b610e218484612cd587878787612ffa565b6130cf565b60a0546040805162982a6160e11b81526004810184905290516000926001600160a01b03169163013054c291602480830192602092919082900301818787803b158015612d2657600080fd5b505af1158015612d3a573d6000803e3d6000fd5b505050506040513d6020811015612d5057600080fd5b505192915050565b60a0546040805163c89039c560e01b815290516000926001600160a01b03169163c89039c5916004808301926020929190829003018186803b158015612d9d57600080fd5b505afa158015612db1573d6000803e3d6000fd5b505050506040513d6020811015612dc757600080fd5b5051905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610b64908490613a90565b600082821115612e77576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6099546001600160a01b031615612f1157609954604080516304d7f3db60e41b81526001600160a01b038781166004830152602482018790528581166044830152848116606483015291519190921691634d7f3db091608480830192600092919082900301818387803b158015612ef857600080fd5b505af1158015612f0c573d6000803e3d6000fd5b505050505b816001600160a01b0316635d7b075885856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611a1857600080fd5b6001600160a01b0382166000908152609e602052604081205461289f908390612f9b9082906001600160801b031661351e565b613b41565b6001600160a01b0383166000908152609e60205260408120548190612fd6908590600160801b90046001600160801b031661351e565b905080612fe757600091505061289f565b612ff18382613b66565b95945050505050565b6001600160a01b038381166000908152609f6020908152604080832093881683529290529081208054829190600160e01b900460ff1661303d576000915061307f565b600061304a888888613bcd565b825490915061307b9088908890613076908990613070906001600160c01b0316876136e4565b906136e4565b613089565b9250505b5095945050505050565b6001600160a01b0383166000908152609e602052604081205481906130b89085906001600160801b031661351e565b9050808311156130c6578092505b50909392505050565b6001600160a01b038083166000908152609f602090815260408083209387168352929052819020548151606081019092526001600160c01b0316908061311484613c7e565b6001600160801b0316815260200161313261312d613cc6565b613ccc565b63ffffffff908116825260016020928301526001600160a01b038681166000908152609f84526040808220928a168252918452819020845181549486015195909201516001600160c01b03199094166001600160c01b039092169190911763ffffffff60c01b1916600160c01b94909216939093021760ff60e01b1916600160e01b9115159190910217905581811015613215576001600160a01b038084169085167f2f92d56910619b38bc29fd8e4ca5e56359edac7a0c086cdcd305fb603fa374916131ff8585612e20565b60408051918252519081900360200190a3610e21565b80821015610e21576001600160a01b038084169085167ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf6132568486612e20565b60408051918252519081900360200190a350505050565b6000806000846001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156132bf57600080fd5b505afa1580156132d3573d6000803e3d6000fd5b505050506040513d60208110156132e957600080fd5b505190508381101561333b576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f696e737566662d66756e647360501b604482015290519081900360640190fd5b6133488686836000612cc4565b600061335d866133588488612e20565b612f68565b6001600160a01b038088166000908152609f60209081526040808320938c16835292905290812054919250906001600160c01b031682116133d4576001600160a01b038088166000908152609f60209081526040808320938c16835292905220546133d1906001600160c01b031683612e20565b90505b60006133e08888612f68565b90508082116133ef57816133f1565b805b94506133fd8186612e20565b955050505050935093915050565b6001600160a01b038116613466576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f7072697a6553747261746567792d6e6f742d7a65726f604482015290519081900360640190fd5b6134836001600160a01b038216600162a1cb1960e01b0319613d10565b6134d4576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f7072697a6553747261746567792d696e76616c696400604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0383169081179091556040517f7f58dc86bc2e435cb77ca0edb1df55e25f90caf2d6bd866971715437d456a21290600090a250565b60008061352b8385613d2c565b905061177781670de0b6b3a7640000613d85565b6001600160a01b038083166000908152609f60209081526040808320938716835292905220546135819061357c906001600160c01b031683612e20565b613c7e565b6001600160a01b038084166000818152609f602090815260408083209489168084529482529182902080546001600160c01b0319166001600160801b0396909616959095179094558051858152905191937ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf92918290030190a3505050565b60a05460408051630b99152d60e41b815230600482015290516000926001600160a01b03169163b99152d091602480830192602092919082900301818787803b15801561364c57600080fd5b505af1158015612db1573d6000803e3d6000fd5b3b151590565b60008061367161270f565b609c5490915061368182856136e4565b11159392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610e21908590613a90565b60008282018381101561289f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b8015806137c4575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561379657600080fd5b505afa1580156137aa573d6000803e3d6000fd5b505050506040513d60208110156137c057600080fd5b5051155b6137ff5760405162461bcd60e51b815260040180806020018281038252603681526020018061442f6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610b64908490613a90565b600054610100900460ff168061386a575061386a61294b565b80613878575060005460ff16155b6138b35760405162461bcd60e51b815260040180806020018281038252602e8152602001806142f3602e913960400191505060405180910390fd5b600054610100900460ff16158015612b24576000805460ff1961ff0019909116610100171660011790558015611041576000805461ff001916905550565b600054610100900460ff168061390a575061390a61294b565b80613918575060005460ff16155b6139535760405162461bcd60e51b815260040180806020018281038252602e8152602001806142f3602e913960400191505060405180910390fd5b600054610100900460ff1615801561397e576000805460ff1961ff0019909116610100171660011790555b600061398861281a565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015611041576000805461ff001916905550565b600054610100900460ff1680613a035750613a0361294b565b80613a11575060005460ff16155b613a4c5760405162461bcd60e51b815260040180806020018281038252602e8152602001806142f3602e913960400191505060405180910390fd5b600054610100900460ff16158015613a77576000805460ff1961ff0019909116610100171660011790555b60016065558015611041576000805461ff001916905550565b6060613ae5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613dc79092919063ffffffff16565b805190915015610b6457808060200190516020811015613b0457600080fd5b5051610b645760405162461bcd60e51b815260040180806020018281038252602a8152602001806143cf602a913960400191505060405180910390fd5b600080613b5084609a5461351e565b905080831115613b5e578092505b509092915050565b6000808211613bbc576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381613bc557fe5b049392505050565b6001600160a01b038281166000908152609f60209081526040808320938716835292905290812054600160c01b810463ffffffff1690600160e01b900460ff16613c1b57600091505061289f565b6000613c2f82613c29613cc6565b90612e20565b6001600160a01b0386166000908152609e602052604081205491925090613c67908390600160801b90046001600160801b0316613d2c565b9050613c73858261351e565b979650505050505050565b6000600160801b8210613cc25760405162461bcd60e51b81526004018080602001828103825260278152602001806142846027913960400191505060405180910390fd5b5090565b60a15490565b6000600160201b8210613cc25760405162461bcd60e51b81526004018080602001828103825260268152602001806143a96026913960400191505060405180910390fd5b6000613d1b83613dd6565b801561289f575061289f8383613e09565b600082613d3b57506000612e7c565b82820282848281613d4857fe5b041461289f5760405162461bcd60e51b81526004018080602001828103825260218152602001806143216021913960400191505060405180910390fd5b600061289f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613e2c565b60606117778484600085613ece565b6000613de9826301ffc9a760e01b613e09565b801561149d5750613e02826001600160e01b0319613e09565b1592915050565b6000806000613e18858561401f565b91509150818015612ff15750949350505050565b60008183613eb85760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613e7d578181015183820152602001613e65565b50505050905090810190601f168015613eaa5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613ec457fe5b0495945050505050565b606082471015613f0f5760405162461bcd60e51b81526004018080602001828103825260268152602001806142cd6026913960400191505060405180910390fd5b613f1885613660565b613f69576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613fa85780518252601f199092019160209182019101613f89565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461400a576040519150601f19603f3d011682016040523d82523d6000602084013e61400f565b606091505b5091509150613c73828286614153565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b1781529151815160009384939284926060926001600160a01b038a169261753092879282918083835b602083106140a75780518252601f199092019160209182019101614088565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114614108576040519150601f19603f3d011682016040523d82523d6000602084013e61410d565b606091505b509150915060208151101561412b576000809450945050505061414c565b8181806020019051602081101561414157600080fd5b505190955093505050505b9250929050565b6060831561416257508161289f565b8251156141725782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315613e7d578181015183820152602001613e65565b82805482825590600052602060002090810192821561420e579160200282015b8281111561420e57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906141d9565b50613cc29291505b80821115613cc25780546001600160a01b031916815560010161421656fe5969656c64536f757263655072697a65506f6f6c2f696e76616c69642d7969656c642d736f757263654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e2031323820626974735072697a65506f6f6c2f7265736572766552656769737472792d6e6f742d7a65726f416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725072697a65506f6f6c2f657869742d6665652d657863656564732d757365722d6d6178696d756d5072697a65506f6f6c2f756e6b6e6f776e2d746f6b656e00000000000000000053616665436173743a2076616c756520646f65736e27742066697420696e20333220626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645969656c64536f757263655072697a65506f6f6c2f7969656c642d736f757263652d6e6f742d636f6e74726163742d616464726573735361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e63655072697a65506f6f6c2f6f6e6c792d7072697a65537472617465677900000000a26469706673582212203135eaf4609c9c05130cbcc71f888d1063cd87122b3fc032b8baefb6dc0b694f64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x44BA DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x25E JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0x146 JUMPI DUP1 PUSH4 0xB69EF8A8 GT PUSH2 0xC3 JUMPI DUP1 PUSH4 0xE323F825 GT PUSH2 0x87 JUMPI DUP1 PUSH4 0xE323F825 EQ PUSH2 0x9A5 JUMPI DUP1 PUSH4 0xE6D8A94B EQ PUSH2 0x9E1 JUMPI DUP1 PUSH4 0xEDB4E1CF EQ PUSH2 0x9E9 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x9F1 JUMPI DUP1 PUSH4 0xFC0C546A EQ PUSH2 0xA17 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0xA1F JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0xB69EF8A8 EQ PUSH2 0x864 JUMPI DUP1 PUSH4 0xCFA24007 EQ PUSH2 0x86C JUMPI DUP1 PUSH4 0xD18E81B3 EQ PUSH2 0x92B JUMPI DUP1 PUSH4 0xD4A1361D EQ PUSH2 0x933 JUMPI DUP1 PUSH4 0xDB006A75 EQ PUSH2 0x988 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x9E167519 GT PUSH2 0x10A JUMPI DUP1 PUSH4 0x9E167519 EQ PUSH2 0x7C0 JUMPI DUP1 PUSH4 0x9FE32A91 EQ PUSH2 0x7C8 JUMPI DUP1 PUSH4 0xA016240B EQ PUSH2 0x7E5 JUMPI DUP1 PUSH4 0xA7B2CC31 EQ PUSH2 0x81F JUMPI DUP1 PUSH4 0xB2470E5C EQ PUSH2 0x85C JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x70E JUMPI DUP1 PUSH4 0x8E71C1F6 EQ PUSH2 0x732 JUMPI DUP1 PUSH4 0x91CA480E EQ PUSH2 0x73A JUMPI DUP1 PUSH4 0x98BF3EB6 EQ PUSH2 0x760 JUMPI DUP1 PUSH4 0x9D63848A EQ PUSH2 0x768 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x52A387AB GT PUSH2 0x1DF JUMPI DUP1 PUSH4 0x76687D3D GT PUSH2 0x1A3 JUMPI DUP1 PUSH4 0x76687D3D EQ PUSH2 0x60C JUMPI DUP1 PUSH4 0x78B3D327 EQ PUSH2 0x614 JUMPI DUP1 PUSH4 0x79CB8563 EQ PUSH2 0x63A JUMPI DUP1 PUSH4 0x7B99ADB1 EQ PUSH2 0x66C JUMPI DUP1 PUSH4 0x7CBAB1C7 EQ PUSH2 0x689 JUMPI DUP1 PUSH4 0x888C2B6F EQ PUSH2 0x6BF JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x52A387AB EQ PUSH2 0x566 JUMPI DUP1 PUSH4 0x630665B4 EQ PUSH2 0x58C JUMPI DUP1 PUSH4 0x6A3FD4F9 EQ PUSH2 0x594 JUMPI DUP1 PUSH4 0x6B1B863A EQ PUSH2 0x5CE JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x604 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x2B0AB144 GT PUSH2 0x226 JUMPI DUP1 PUSH4 0x2B0AB144 EQ PUSH2 0x404 JUMPI DUP1 PUSH4 0x2F7627E3 EQ PUSH2 0x43A JUMPI DUP1 PUSH4 0x35403023 EQ PUSH2 0x468 JUMPI DUP1 PUSH4 0x3EDE50C6 EQ PUSH2 0x485 JUMPI DUP1 PUSH4 0x494DE9F7 EQ PUSH2 0x538 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x937EB54 EQ PUSH2 0x263 JUMPI DUP1 PUSH4 0x13F55E39 EQ PUSH2 0x27D JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x2B5 JUMPI DUP1 PUSH4 0x16960D55 EQ PUSH2 0x360 JUMPI DUP1 PUSH4 0x22F8E566 EQ PUSH2 0x3E7 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26B PUSH2 0xA9C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x293 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xAAB JUMP JUMPDEST STOP JUMPDEST PUSH2 0x343 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x2CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x305 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x317 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x338 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xB69 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x376 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x3A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x3BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x3DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xB7A JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xE27 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x41A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xE2C JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x450 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xEE9 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x47E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1038 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x49B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x4C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x4D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x4F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0x1044 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x54E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x1236 JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x57C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x133D JUMP JUMPDEST PUSH2 0x26B PUSH2 0x148C JUMP JUMPDEST PUSH2 0x5BA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1492 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x5E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 SWAP1 SWAP2 ADD CALLDATALOAD AND PUSH2 0x14A5 JUMP JUMPDEST PUSH2 0x2B3 PUSH2 0x16AD JUMP JUMPDEST PUSH2 0x26B PUSH2 0x1759 JUMP JUMPDEST PUSH2 0x5BA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x62A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x175F JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x650 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x176A JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x682 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x177F JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x69F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x17EA JUMP JUMPDEST PUSH2 0x6F5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x6D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1A36 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB ADD SWAP1 RETURN JUMPDEST PUSH2 0x716 PUSH2 0x1A50 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x716 PUSH2 0x1A5F JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x750 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A6E JUMP JUMPDEST PUSH2 0x716 PUSH2 0x1AD9 JUMP JUMPDEST PUSH2 0x770 PUSH2 0x1AE8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x7AC JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x794 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x26B PUSH2 0x1B4A JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x7DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1B50 JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x7FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x1C7E JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x835 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x40 ADD CALLDATALOAD AND PUSH2 0x1EB5 JUMP JUMPDEST PUSH2 0x716 PUSH2 0x200B JUMP JUMPDEST PUSH2 0x26B PUSH2 0x201A JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x882 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x8AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x8BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x8DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2024 JUMP JUMPDEST PUSH2 0x26B PUSH2 0x226F JUMP JUMPDEST PUSH2 0x959 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x949 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2275 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x99E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x22A5 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x9BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x22B0 JUMP JUMPDEST PUSH2 0x26B PUSH2 0x2465 JUMP JUMPDEST PUSH2 0x26B PUSH2 0x25DB JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xA07 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x25E1 JUMP JUMPDEST PUSH2 0x716 PUSH2 0x26E4 JUMP JUMPDEST PUSH2 0xA27 PUSH2 0x26EE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xA61 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xA49 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xA8E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xAA6 PUSH2 0x270F JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xABF PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xB08 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4465 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xB13 DUP4 DUP4 DUP4 PUSH2 0x281E JUMP JUMPDEST ISZERO PUSH2 0xB64 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB0BAC59718CD343C80A813518AFCF36846CFCFE6D56E2B3CAB9BD49F5F9B251C DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0xA85BD01 PUSH1 0xE1 SHL SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xB8E PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xBD7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4465 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xBE0 DUP4 PUSH2 0x28A6 JUMP JUMPDEST PUSH2 0xC31 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0xC3B JUMPI PUSH2 0xE21 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xDA8 JUMPI DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x42842E0E ADDRESS DUP8 DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0xC63 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0xCD1 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xDA0 JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0xCFF JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xD04 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH32 0x17E975018310F88872B58D4D8263ADCA83CF5C1893496EA2A86923DAB15276AD DUP2 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD64 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD4C JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD91 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xC3E JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x69C2DE32BC4D47F488E72626A6CFDEE85089342E52675E7DE79C4B417623960C DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP6 POP SWAP1 SWAP4 POP POP POP POP LOG3 JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0xA1 SSTORE JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE40 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xE89 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4465 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xE94 DUP4 DUP4 DUP4 PUSH2 0x281E JUMP JUMPDEST ISZERO PUSH2 0xB64 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC65F48ACA3B7A99B7443D04B8FFBB073156179BC628DC3F7DEF5047748973469 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH2 0xEF1 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF02 PUSH2 0x1A50 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xF4B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4342 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xFAE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xFC4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD GT ISZERO PUSH2 0x1034 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5C19A95C DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x101B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x102F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x1041 DUP2 PUSH2 0x28BB JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x105D JUMPI POP PUSH2 0x105D PUSH2 0x294B JUMP JUMPDEST DUP1 PUSH2 0x106B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x10A6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F3 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x10D1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x1116 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42AB PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 MLOAD DUP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x112F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1159 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP1 MLOAD PUSH2 0x116E SWAP2 PUSH1 0x98 SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x41B9 JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x11A5 JUMPI PUSH1 0x0 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1188 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0x119C DUP2 DUP4 PUSH2 0x295C JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x1172 JUMP JUMPDEST POP PUSH2 0x11AE PUSH2 0x2A87 JUMP JUMPDEST PUSH2 0x11B6 PUSH2 0x2B38 JUMP JUMPDEST PUSH2 0x11C1 PUSH1 0x0 NOT PUSH2 0x2BCD JUMP JUMPDEST PUSH1 0x97 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x9A DUP5 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP6 SWAP1 MSTORE DUP1 MLOAD PUSH32 0x25FF68DD81B34665B5BA7E553EE5511BF6812E12ADB4A7E2C0D9E26B3099CE79 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 POP DUP1 ISZERO PUSH2 0xE21 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x1242 DUP2 PUSH2 0x2C08 JUMP JUMPDEST PUSH2 0x1281 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4389 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1306 DUP5 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x12E7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x12FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 PUSH2 0x2CC4 JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP4 AND DUP3 MSTORE SWAP3 SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x138E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x13A2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x13B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ PUSH2 0x1412 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F6F6E6C792D72657365727665 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9B DUP1 SLOAD PUSH1 0x0 SWAP2 DUP3 SWAP1 SSTORE SWAP1 PUSH2 0x1426 DUP3 PUSH2 0x2CDA JUMP JUMPDEST SWAP1 POP PUSH2 0x1445 DUP6 DUP3 PUSH2 0x1435 PUSH2 0x2D58 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x2DCE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP2 PUSH32 0x1C71C8E11FD443227C8F8D3DC1A237A3A5E8310B540C7FBCF5169754AEDF42C9 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x9D SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x149D DUP3 PUSH2 0x28A6 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x14B9 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1502 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4465 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x150C DUP2 PUSH2 0x2C08 JUMP JUMPDEST PUSH2 0x154B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4389 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 PUSH2 0x1555 JUMPI PUSH2 0xE21 JUMP JUMPDEST PUSH1 0x9D SLOAD DUP4 GT ISZERO PUSH2 0x15AC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F61776172642D657863656564732D617661696C000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x15B9 SWAP1 DUP5 PUSH2 0x2E20 JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH2 0x15C9 DUP5 DUP5 DUP5 PUSH1 0x0 PUSH2 0x2E82 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15D5 DUP4 DUP6 PUSH2 0x2F68 JUMP JUMPDEST SWAP1 POP PUSH2 0x165B DUP6 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1629 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x163D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1653 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP5 PUSH2 0x2CC4 JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xE2554529D99AB7A67DB6B4CEA2B32C7D55AE325F958861E05F304FDDED867E31 DUP7 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x16B5 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16C6 PUSH2 0x1A50 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x170F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4342 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x149D DUP3 PUSH2 0x2C08 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1777 DUP5 DUP5 DUP5 PUSH2 0x2FA0 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1787 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1798 PUSH2 0x1A50 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x17E1 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4342 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1041 DUP2 PUSH2 0x2BCD JUMP JUMPDEST CALLER PUSH2 0x17F4 DUP2 PUSH2 0x2C08 JUMP JUMPDEST PUSH2 0x1833 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4389 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO PUSH2 0x190D JUMPI PUSH1 0x0 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP7 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1891 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x18A5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x18BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x18CD DUP7 CALLER DUP5 DUP5 PUSH2 0x2FFA JUMP JUMPDEST SWAP1 POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x18FF JUMPI PUSH2 0x18FC CALLER PUSH2 0x18F6 DUP5 DUP8 PUSH2 0x2E20 JUMP JUMPDEST DUP4 PUSH2 0x3089 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x190A DUP7 CALLER DUP4 PUSH2 0x30CF JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1937 JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x198E JUMPI PUSH2 0x198E DUP4 CALLER CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x19B0 JUMPI POP PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xE21 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP7 SWAP1 MSTORE CALLER PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xB2210957 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1A18 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1A2C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1A44 DUP6 DUP6 DUP6 PUSH2 0x326D JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x97 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1A76 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A87 PUSH2 0x1A50 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1AD0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4342 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1041 DUP2 PUSH2 0x340B JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1B40 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1B22 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1BA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1BB5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1BCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1BE7 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x14A0 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x10DFA58 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C36 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C4A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1C60 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x1C74 JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x14A0 JUMP JUMPDEST PUSH2 0x1777 DUP5 DUP3 PUSH2 0x351E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x1CD8 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP3 PUSH2 0x1CE7 DUP2 PUSH2 0x2C08 JUMP JUMPDEST PUSH2 0x1D26 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4389 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1D34 DUP9 DUP8 DUP10 PUSH2 0x326D JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0x1D77 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4362 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1D82 DUP9 DUP8 DUP4 PUSH2 0x353F JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x631B5DFB PUSH2 0x1D99 PUSH2 0x281A JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1DF1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E05 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 PUSH2 0x1E1E DUP4 DUP10 PUSH2 0x2E20 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1E2B DUP3 PUSH2 0x2CDA JUMP JUMPDEST SWAP1 POP PUSH2 0x1E3A DUP11 DUP3 PUSH2 0x1435 PUSH2 0x2D58 JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E56 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP14 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE DUP1 DUP3 ADD DUP10 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x271704A58FD2953E49B87D67A0A3CE28A58147DE98A5457F60B4686F6385030 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH2 0x1EBF DUP2 PUSH2 0x2C08 JUMP JUMPDEST PUSH2 0x1EFE JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4389 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1F06 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1F17 PUSH2 0x1A50 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1F60 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4342 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP6 AND DUP1 DUP4 MSTORE DUP7 DUP3 AND PUSH1 0x20 DUP1 DUP6 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9E DUP5 MSTORE DUP9 SWAP1 KECCAK256 SWAP7 MLOAD DUP8 SLOAD SWAP3 MLOAD DUP8 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP1 DUP8 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP6 AND OR SWAP1 SWAP5 SSTORE DUP5 MLOAD SWAP3 DUP4 MSTORE SWAP3 DUP3 ADD MSTORE DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 MLOAD PUSH32 0xFB0BA2CF86A2B03BCF387753A2192DA80A006AFA99DD022BB301C78E323BF1B9 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xAA6 PUSH2 0x3600 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x203D JUMPI POP PUSH2 0x203D PUSH2 0x294B JUMP JUMPDEST DUP1 PUSH2 0x204B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2086 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F3 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x20B1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x20C3 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3660 JUMP JUMPDEST PUSH2 0x20FE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x36 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x43F9 PUSH1 0x36 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x2109 DUP6 DUP6 DUP6 PUSH2 0x1044 JUMP JUMPDEST PUSH1 0xA0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH4 0xC89039C5 PUSH1 0xE0 SHL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP3 ADD DUP2 MSTORE SWAP2 DUP4 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP5 SWAP4 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x217C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x215D JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x21DC JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x21E1 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2221 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4235 PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH32 0x7A0CA506EDC9FCD36E010DBCAAD57DADE17BBAC71DFEB53269077098E863EECA SWAP1 PUSH1 0x0 SWAP1 LOG2 POP DUP1 ISZERO PUSH2 0x2268 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0xA1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP3 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x149D DUP3 PUSH2 0x2CDA JUMP JUMPDEST PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x2308 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP2 PUSH2 0x2317 DUP2 PUSH2 0x2C08 JUMP JUMPDEST PUSH2 0x2356 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4389 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP4 PUSH2 0x2360 DUP2 PUSH2 0x3666 JUMP JUMPDEST PUSH2 0x23B1 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F657863656564732D6C69717569646974792D63617000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x23BB PUSH2 0x281A JUMP JUMPDEST SWAP1 POP PUSH2 0x23C9 DUP8 DUP8 DUP8 DUP8 PUSH2 0x2E82 JUMP JUMPDEST PUSH2 0x23E8 DUP2 ADDRESS DUP9 PUSH2 0x23D7 PUSH2 0x2D58 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 SWAP1 PUSH2 0x368A JUMP JUMPDEST PUSH2 0x23F1 DUP7 PUSH2 0x28BB JUMP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6CE569498E0F86F147466AC49211CB2A1FFE06195ADB805E383B3F2365109160 DUP10 DUP9 PUSH1 0x40 MLOAD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x24BF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE PUSH1 0x0 PUSH2 0x24CE PUSH2 0x270F JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x24DA PUSH2 0x3600 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 DUP3 GT PUSH2 0x24EC JUMPI PUSH1 0x0 PUSH2 0x24F6 JUMP JUMPDEST PUSH2 0x24F6 DUP3 DUP5 PUSH2 0x2E20 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x9D SLOAD DUP3 GT PUSH2 0x250A JUMPI PUSH1 0x0 PUSH2 0x2518 JUMP JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x2518 SWAP1 DUP4 SWAP1 PUSH2 0x2E20 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x25CA JUMPI PUSH1 0x0 PUSH2 0x252B DUP3 PUSH2 0x1B50 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x2585 JUMPI PUSH1 0x9B SLOAD PUSH2 0x2540 SWAP1 DUP3 PUSH2 0x36E4 JUMP JUMPDEST PUSH1 0x9B SSTORE PUSH2 0x254D DUP3 DUP3 PUSH2 0x2E20 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 POP PUSH32 0x5F1703CCFA2730D4245350F228079926A37F26A44ECF6978A7EEAFFF0AF11407 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x2592 SWAP1 DUP4 PUSH2 0x36E4 JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xCE2B6E507C7CA1A20CE136810F524EEFC19BA4C7E4866EB6CC0CBA76E778D4BE SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH1 0x9D SLOAD SWAP5 POP POP POP POP POP PUSH1 0x1 PUSH1 0x65 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x9B SLOAD DUP2 JUMP JUMPDEST PUSH2 0x25E9 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x25FA PUSH2 0x1A50 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2643 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4342 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x2688 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x425E PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xAA6 PUSH2 0x2D58 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x9B SLOAD SWAP1 POP PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x276F JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2751 JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2811 JUMPI PUSH2 0x2807 DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2794 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x27D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x27E8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x27FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP6 SWAP1 PUSH2 0x36E4 JUMP JUMPDEST SWAP4 POP PUSH1 0x1 ADD PUSH2 0x277D JUMP JUMPDEST POP SWAP2 SWAP3 POP POP POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2829 DUP4 PUSH2 0x28A6 JUMP JUMPDEST PUSH2 0x287A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x2887 JUMPI POP PUSH1 0x0 PUSH2 0x289F JUMP JUMPDEST PUSH2 0x289B PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP6 DUP5 PUSH2 0x2DCE JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND SWAP2 AND EQ ISZERO SWAP1 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH2 0x28E4 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH2 0x28D4 PUSH2 0x2D58 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x373E JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x87A6EEEF PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x87A6EEEF SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2937 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2268 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2956 ADDRESS PUSH2 0x3660 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF77C4791 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x299F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x29B3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x29C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2A26 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F746F6B656E2D6374726C722D6D69736D617463680000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x98 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x2A34 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 DUP5 AND SWAP2 PUSH32 0x460E712B4A5D801D031ED673DEA209B73AB854F7DDEB86B6C48082E92C3EEE66 SWAP2 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2AA0 JUMPI POP PUSH2 0x2AA0 PUSH2 0x294B JUMP JUMPDEST DUP1 PUSH2 0x2AAE JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2AE9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F3 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2B14 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2B1C PUSH2 0x3851 JUMP JUMPDEST PUSH2 0x2B24 PUSH2 0x38F1 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2B51 JUMPI POP PUSH2 0x2B51 PUSH2 0x294B JUMP JUMPDEST DUP1 PUSH2 0x2B5F JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2B9A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F3 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2BC5 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2B24 PUSH2 0x39EA JUMP JUMPDEST PUSH1 0x9C DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3FF20538222F568F27FF436C0C49DFD3E48D5B8F86533A3F759DC1C7089775AB SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2C62 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2C44 JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2CB9 JUMPI DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2C8E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x2CB1 JUMPI PUSH1 0x1 SWAP4 POP POP POP POP PUSH2 0x14A0 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2C70 JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xE21 DUP5 DUP5 PUSH2 0x2CD5 DUP8 DUP8 DUP8 DUP8 PUSH2 0x2FFA JUMP JUMPDEST PUSH2 0x30CF JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH3 0x982A61 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x13054C2 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2D26 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2D3A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2D50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xC89039C5 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xC89039C5 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2D9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2DB1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2DC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xB64 SWAP1 DUP5 SWAP1 PUSH2 0x3A90 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2E77 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2F11 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE DUP6 DUP2 AND PUSH1 0x44 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x4D7F3DB0 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2EF8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2F0C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5D7B0758 DUP6 DUP6 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1A18 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x289F SWAP1 DUP4 SWAP1 PUSH2 0x2F9B SWAP1 DUP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x351E JUMP JUMPDEST PUSH2 0x3B41 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2FD6 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x351E JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x2FE7 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x289F JUMP JUMPDEST PUSH2 0x2FF1 DUP4 DUP3 PUSH2 0x3B66 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP3 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x303D JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x307F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x304A DUP9 DUP9 DUP9 PUSH2 0x3BCD JUMP JUMPDEST DUP3 SLOAD SWAP1 SWAP2 POP PUSH2 0x307B SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x3076 SWAP1 DUP10 SWAP1 PUSH2 0x3070 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP8 PUSH2 0x36E4 JUMP JUMPDEST SWAP1 PUSH2 0x36E4 JUMP JUMPDEST PUSH2 0x3089 JUMP JUMPDEST SWAP3 POP POP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x30B8 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x351E JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x30C6 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE DUP2 SWAP1 KECCAK256 SLOAD DUP2 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 DUP1 PUSH2 0x3114 DUP5 PUSH2 0x3C7E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x3132 PUSH2 0x312D PUSH2 0x3CC6 JUMP JUMPDEST PUSH2 0x3CCC JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP3 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 DUP11 AND DUP3 MSTORE SWAP2 DUP5 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP5 DUP7 ADD MLOAD SWAP6 SWAP1 SWAP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH4 0xFFFFFFFF PUSH1 0xC0 SHL NOT AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP5 SWAP1 SWAP3 AND SWAP4 SWAP1 SWAP4 MUL OR PUSH1 0xFF PUSH1 0xE0 SHL NOT AND PUSH1 0x1 PUSH1 0xE0 SHL SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE DUP2 DUP2 LT ISZERO PUSH2 0x3215 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0x2F92D56910619B38BC29FD8E4CA5E56359EDAC7A0C086CDCD305FB603FA37491 PUSH2 0x31FF DUP6 DUP6 PUSH2 0x2E20 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 PUSH2 0xE21 JUMP JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0xE21 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF PUSH2 0x3256 DUP5 DUP7 PUSH2 0x2E20 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x32BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x32D3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x32E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x333B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F696E737566662D66756E6473 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x3348 DUP7 DUP7 DUP4 PUSH1 0x0 PUSH2 0x2CC4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x335D DUP7 PUSH2 0x3358 DUP5 DUP9 PUSH2 0x2E20 JUMP JUMPDEST PUSH2 0x2F68 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP3 GT PUSH2 0x33D4 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x33D1 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2E20 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x33E0 DUP9 DUP9 PUSH2 0x2F68 JUMP JUMPDEST SWAP1 POP DUP1 DUP3 GT PUSH2 0x33EF JUMPI DUP2 PUSH2 0x33F1 JUMP JUMPDEST DUP1 JUMPDEST SWAP5 POP PUSH2 0x33FD DUP2 DUP7 PUSH2 0x2E20 JUMP JUMPDEST SWAP6 POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x3466 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D6E6F742D7A65726F PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x3483 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3D10 JUMP JUMPDEST PUSH2 0x34D4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D696E76616C696400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x99 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x7F58DC86BC2E435CB77CA0EDB1DF55E25F90CAF2D6BD866971715437D456A212 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x352B DUP4 DUP6 PUSH2 0x3D2C JUMP JUMPDEST SWAP1 POP PUSH2 0x1777 DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x3D85 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x3581 SWAP1 PUSH2 0x357C SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2E20 JUMP JUMPDEST PUSH2 0x3C7E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB99152D PUSH1 0xE4 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xB99152D0 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x364C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2DB1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3671 PUSH2 0x270F JUMP JUMPDEST PUSH1 0x9C SLOAD SWAP1 SWAP2 POP PUSH2 0x3681 DUP3 DUP6 PUSH2 0x36E4 JUMP JUMPDEST GT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x24 DUP4 ADD MSTORE DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x84 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xE21 SWAP1 DUP6 SWAP1 PUSH2 0x3A90 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x289F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 ISZERO DUP1 PUSH2 0x37C4 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH4 0x6EB1769F PUSH1 0xE1 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 DUP6 AND SWAP2 PUSH4 0xDD62ED3E SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3796 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x37AA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x37C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO JUMPDEST PUSH2 0x37FF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x36 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x442F PUSH1 0x36 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x95EA7B3 PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xB64 SWAP1 DUP5 SWAP1 PUSH2 0x3A90 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x386A JUMPI POP PUSH2 0x386A PUSH2 0x294B JUMP JUMPDEST DUP1 PUSH2 0x3878 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x38B3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F3 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2B24 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x390A JUMPI POP PUSH2 0x390A PUSH2 0x294B JUMP JUMPDEST DUP1 PUSH2 0x3918 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3953 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F3 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x397E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x3988 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3A03 JUMPI POP PUSH2 0x3A03 PUSH2 0x294B JUMP JUMPDEST DUP1 PUSH2 0x3A11 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3A4C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F3 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3A77 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x65 SSTORE DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x3AE5 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3DC7 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xB64 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3B04 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xB64 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x43CF PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3B50 DUP5 PUSH1 0x9A SLOAD PUSH2 0x351E JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x3B5E JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x3BBC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x3BC5 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xC0 SHL DUP2 DIV PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x3C1B JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x289F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3C2F DUP3 PUSH2 0x3C29 PUSH2 0x3CC6 JUMP JUMPDEST SWAP1 PUSH2 0x2E20 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x3C67 SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3D2C JUMP JUMPDEST SWAP1 POP PUSH2 0x3C73 DUP6 DUP3 PUSH2 0x351E JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x3CC2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4284 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0xA1 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x20 SHL DUP3 LT PUSH2 0x3CC2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x43A9 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3D1B DUP4 PUSH2 0x3DD6 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x289F JUMPI POP PUSH2 0x289F DUP4 DUP4 PUSH2 0x3E09 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3D3B JUMPI POP PUSH1 0x0 PUSH2 0x2E7C JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x3D48 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x289F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4321 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x289F DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x3E2C JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1777 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x3ECE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3DE9 DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3E09 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x149D JUMPI POP PUSH2 0x3E02 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3E09 JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x3E18 DUP6 DUP6 PUSH2 0x401F JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x2FF1 JUMPI POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x3EB8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3E7D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3E65 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3EAA JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x3EC4 JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x3F0F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42CD PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3F18 DUP6 PUSH2 0x3660 JUMP JUMPDEST PUSH2 0x3F69 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3FA8 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3F89 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x400A JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x400F JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x3C73 DUP3 DUP3 DUP7 PUSH2 0x4153 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x24 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP3 DUP5 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND SWAP3 PUSH2 0x7530 SWAP3 DUP8 SWAP3 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x40A7 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x4088 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x4108 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x410D JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x412B JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x414C JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4141 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x4162 JUMPI POP DUP2 PUSH2 0x289F JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x4172 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x3E7D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3E65 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x420E JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x420E JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x41D9 JUMP JUMPDEST POP PUSH2 0x3CC2 SWAP3 SWAP2 POP JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x3CC2 JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x4216 JUMP INVALID MSIZE PUSH10 0x656C64536F7572636550 PUSH19 0x697A65506F6F6C2F696E76616C69642D796965 PUSH13 0x642D736F757263654F776E6162 PUSH13 0x653A206E6577206F776E657220 PUSH10 0x7320746865207A65726F KECCAK256 PUSH2 0x6464 PUSH19 0x65737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E2031323820626974735072697A65 POP PUSH16 0x6F6C2F72657365727665526567697374 PUSH19 0x792D6E6F742D7A65726F416464726573733A20 PUSH10 0x6E73756666696369656E PUSH21 0x2062616C616E636520666F722063616C6C496E6974 PUSH10 0x616C697A61626C653A20 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 MSTORE8 PUSH2 0x6665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F774F776E61626C653A20 PUSH4 0x616C6C65 PUSH19 0x206973206E6F7420746865206F776E65725072 PUSH10 0x7A65506F6F6C2F657869 PUSH21 0x2D6665652D657863656564732D757365722D6D6178 PUSH10 0x6D756D5072697A65506F PUSH16 0x6C2F756E6B6E6F776E2D746F6B656E00 STOP STOP STOP STOP STOP STOP STOP STOP MSTORE8 PUSH2 0x6665 NUMBER PUSH2 0x7374 GASPRICE KECCAK256 PUSH23 0x616C756520646F65736E27742066697420696E20333220 PUSH3 0x697473 MSTORE8 PUSH2 0x6665 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x7563636565645969656C64536F75726365507269 PUSH27 0x65506F6F6C2F7969656C642D736F757263652D6E6F742D636F6E74 PUSH19 0x6163742D616464726573735361666545524332 ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F76652066726F6D206E6F6E2D7A65726F2074 PUSH16 0x206E6F6E2D7A65726F20616C6C6F7761 PUSH15 0x63655072697A65506F6F6C2F6F6E6C PUSH26 0x2D7072697A65537472617465677900000000A264697066735822 SLT KECCAK256 BALANCE CALLDATALOAD 0xEA DELEGATECALL PUSH1 0x9C SWAP13 SDIV SGT 0xC 0xBC 0xC7 0x1F DUP9 DUP14 LT PUSH4 0xCD87122B EXTCODEHASH 0xC0 ORIGIN 0xB8 0xBA 0xEF 0xB6 0xDC SIGNEXTEND PUSH10 0x4F64736F6C634300060C STOP CALLER ",
              "sourceMap": "135:476:83:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506004361061025e5760003560e01c80638da5cb5b11610146578063b69ef8a8116100c3578063e323f82511610087578063e323f825146109a5578063e6d8a94b146109e1578063edb4e1cf146109e9578063f2fde38b146109f1578063fc0c546a14610a17578063ffa1ad7414610a1f5761025e565b8063b69ef8a814610864578063cfa240071461086c578063d18e81b31461092b578063d4a1361d14610933578063db006a75146109885761025e565b80639e1675191161010a5780639e167519146107c05780639fe32a91146107c8578063a016240b146107e5578063a7b2cc311461081f578063b2470e5c1461085c5761025e565b80638da5cb5b1461070e5780638e71c1f61461073257806391ca480e1461073a57806398bf3eb6146107605780639d63848a146107685761025e565b806352a387ab116101df57806376687d3d116101a357806376687d3d1461060c57806378b3d3271461061457806379cb85631461063a5780637b99adb11461066c5780637cbab1c714610689578063888c2b6f146106bf5761025e565b806352a387ab14610566578063630665b41461058c5780636a3fd4f9146105945780636b1b863a146105ce578063715018a6146106045761025e565b80632b0ab144116102265780632b0ab144146104045780632f7627e31461043a57806335403023146104685780633ede50c614610485578063494de9f7146105385761025e565b80630937eb541461026357806313f55e391461027d578063150b7a02146102b557806316960d551461036057806322f8e566146103e7575b600080fd5b61026b610a9c565b60408051918252519081900360200190f35b6102b36004803603606081101561029357600080fd5b506001600160a01b03813581169160208101359091169060400135610aab565b005b610343600480360360808110156102cb57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561030557600080fd5b82018360208201111561031757600080fd5b803590602001918460018302840111600160201b8311171561033857600080fd5b509092509050610b69565b604080516001600160e01b03199092168252519081900360200190f35b6102b36004803603606081101561037657600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b8111156103a957600080fd5b8201836020820111156103bb57600080fd5b803590602001918460208302840111600160201b831117156103dc57600080fd5b509092509050610b7a565b6102b3600480360360208110156103fd57600080fd5b5035610e27565b6102b36004803603606081101561041a57600080fd5b506001600160a01b03813581169160208101359091169060400135610e2c565b6102b36004803603604081101561045057600080fd5b506001600160a01b0381358116916020013516610ee9565b6102b36004803603602081101561047e57600080fd5b5035611038565b6102b36004803603606081101561049b57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156104c557600080fd5b8201836020820111156104d757600080fd5b803590602001918460208302840111600160201b831117156104f857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611044915050565b61026b6004803603604081101561054e57600080fd5b506001600160a01b0381358116916020013516611236565b61026b6004803603602081101561057c57600080fd5b50356001600160a01b031661133d565b61026b61148c565b6105ba600480360360208110156105aa57600080fd5b50356001600160a01b0316611492565b604080519115158252519081900360200190f35b6102b3600480360360608110156105e457600080fd5b506001600160a01b038135811691602081013591604090910135166114a5565b6102b36116ad565b61026b611759565b6105ba6004803603602081101561062a57600080fd5b50356001600160a01b031661175f565b61026b6004803603606081101561065057600080fd5b506001600160a01b03813516906020810135906040013561176a565b6102b36004803603602081101561068257600080fd5b503561177f565b6102b36004803603606081101561069f57600080fd5b506001600160a01b038135811691602081013590911690604001356117ea565b6106f5600480360360608110156106d557600080fd5b506001600160a01b03813581169160208101359091169060400135611a36565b6040805192835260208301919091528051918290030190f35b610716611a50565b604080516001600160a01b039092168252519081900360200190f35b610716611a5f565b6102b36004803603602081101561075057600080fd5b50356001600160a01b0316611a6e565b610716611ad9565b610770611ae8565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156107ac578181015183820152602001610794565b505050509050019250505060405180910390f35b61026b611b4a565b61026b600480360360208110156107de57600080fd5b5035611b50565b61026b600480360360808110156107fb57600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611c7e565b6102b36004803603606081101561083557600080fd5b506001600160a01b03813516906001600160801b0360208201358116916040013516611eb5565b61071661200b565b61026b61201a565b6102b36004803603608081101561088257600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156108ac57600080fd5b8201836020820111156108be57600080fd5b803590602001918460208302840111600160201b831117156108df57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602001356001600160a01b0316612024565b61026b61226f565b6109596004803603602081101561094957600080fd5b50356001600160a01b0316612275565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b61026b6004803603602081101561099e57600080fd5b50356122a5565b6102b3600480360360808110156109bb57600080fd5b506001600160a01b038135811691602081013591604082013581169160600135166122b0565b61026b612465565b61026b6125db565b6102b360048036036020811015610a0757600080fd5b50356001600160a01b03166125e1565b6107166126e4565b610a276126ee565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610a61578181015183820152602001610a49565b50505050905090810190601f168015610a8e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610aa661270f565b905090565b6099546001600160a01b0316610abf61281a565b6001600160a01b031614610b08576040805162461bcd60e51b815260206004820152601c6024820152600080516020614465833981519152604482015290519081900360640190fd5b610b1383838361281e565b15610b6457816001600160a01b0316836001600160a01b03167fb0bac59718cd343c80a813518afcf36846cfcfe6d56e2b3cab9bd49f5f9b251c836040518082815260200191505060405180910390a35b505050565b630a85bd0160e11b95945050505050565b6099546001600160a01b0316610b8e61281a565b6001600160a01b031614610bd7576040805162461bcd60e51b815260206004820152601c6024820152600080516020614465833981519152604482015290519081900360640190fd5b610be0836128a6565b610c31576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b80610c3b57610e21565b60005b81811015610da857836001600160a01b03166342842e0e3087868686818110610c6357fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610cc057600080fd5b505af1925050508015610cd1575060015b610da0573d808015610cff576040519150601f19603f3d011682016040523d82523d6000602084013e610d04565b606091505b507f17e975018310f88872b58d4d8263adca83cf5c1893496ea2a86923dab15276ad816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d64578181015183820152602001610d4c565b50505050905090810190601f168015610d915780820380516001836020036101000a031916815260200191505b509250505060405180910390a1505b600101610c3e565b50826001600160a01b0316846001600160a01b03167f69c2de32bc4d47f488e72626a6cfdee85089342e52675e7de79c4b417623960c848460405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a35b50505050565b60a155565b6099546001600160a01b0316610e4061281a565b6001600160a01b031614610e89576040805162461bcd60e51b815260206004820152601c6024820152600080516020614465833981519152604482015290519081900360640190fd5b610e9483838361281e565b15610b6457816001600160a01b0316836001600160a01b03167fc65f48aca3b7a99b7443d04b8ffbb073156179bc628dc3f7def5047748973469836040518082815260200191505060405180910390a3505050565b610ef161281a565b6001600160a01b0316610f02611a50565b6001600160a01b031614610f4b576040805162461bcd60e51b81526020600482018190526024820152600080516020614342833981519152604482015290519081900360640190fd5b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f9a57600080fd5b505afa158015610fae573d6000803e3d6000fd5b505050506040513d6020811015610fc457600080fd5b5051111561103457816001600160a01b0316635c19a95c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561101b57600080fd5b505af115801561102f573d6000803e3d6000fd5b505050505b5050565b611041816128bb565b50565b600054610100900460ff168061105d575061105d61294b565b8061106b575060005460ff16155b6110a65760405162461bcd60e51b815260040180806020018281038252602e8152602001806142f3602e913960400191505060405180910390fd5b600054610100900460ff161580156110d1576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0384166111165760405162461bcd60e51b81526004018080602001828103825260228152602001806142ab6022913960400191505060405180910390fd5b82518067ffffffffffffffff8111801561112f57600080fd5b50604051908082528060200260200182016040528015611159578160200160208202803683370190505b50805161116e916098916020909101906141b9565b5060005b818110156111a557600085828151811061118857fe5b6020026020010151905061119c818361295c565b50600101611172565b506111ae612a87565b6111b6612b38565b6111c1600019612bcd565b609780546001600160a01b0319166001600160a01b038716908117909155609a849055604080519182526020820185905280517f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce799281900390910190a1508015610e21576000805461ff001916905550505050565b60008161124281612c08565b611281576040805162461bcd60e51b81526020600482015260176024820152600080516020614389833981519152604482015290519081900360640190fd5b6113068484856001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112d357600080fd5b505afa1580156112e7573d6000803e3d6000fd5b505050506040513d60208110156112fd57600080fd5b50516000612cc4565b50506001600160a01b039081166000908152609f60209081526040808320949093168252929092529020546001600160c01b031690565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561138e57600080fd5b505afa1580156113a2573d6000803e3d6000fd5b505050506040513d60208110156113b857600080fd5b505190506001600160a01b0381163314611412576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f6f6e6c792d7265736572766560501b604482015290519081900360640190fd5b609b80546000918290559061142682612cda565b90506114458582611435612d58565b6001600160a01b03169190612dce565b6040805183815290516001600160a01b038716917f1c71c8e11fd443227c8f8d3dc1a237a3a5e8310b540c7fbcf5169754aedf42c9919081900360200190a2949350505050565b609d5490565b600061149d826128a6565b90505b919050565b6099546001600160a01b03166114b961281a565b6001600160a01b031614611502576040805162461bcd60e51b815260206004820152601c6024820152600080516020614465833981519152604482015290519081900360640190fd5b8061150c81612c08565b61154b576040805162461bcd60e51b81526020600482015260176024820152600080516020614389833981519152604482015290519081900360640190fd5b8261155557610e21565b609d548311156115ac576040805162461bcd60e51b815260206004820152601d60248201527f5072697a65506f6f6c2f61776172642d657863656564732d617661696c000000604482015290519081900360640190fd5b609d546115b99084612e20565b609d556115c98484846000612e82565b60006115d58385612f68565b905061165b8584856001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561162957600080fd5b505afa15801561163d573d6000803e3d6000fd5b505050506040513d602081101561165357600080fd5b505184612cc4565b826001600160a01b0316856001600160a01b03167fe2554529d99ab7a67db6b4cea2b32c7d55ae325f958861e05f304fdded867e31866040518082815260200191505060405180910390a35050505050565b6116b561281a565b6001600160a01b03166116c6611a50565b6001600160a01b03161461170f576040805162461bcd60e51b81526020600482018190526024820152600080516020614342833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b609c5481565b600061149d82612c08565b6000611777848484612fa0565b949350505050565b61178761281a565b6001600160a01b0316611798611a50565b6001600160a01b0316146117e1576040805162461bcd60e51b81526020600482018190526024820152600080516020614342833981519152604482015290519081900360640190fd5b61104181612bcd565b336117f481612c08565b611833576040805162461bcd60e51b81526020600482015260176024820152600080516020614389833981519152604482015290519081900360640190fd5b6001600160a01b0384161561190d576000336001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561189157600080fd5b505afa1580156118a5573d6000803e3d6000fd5b505050506040513d60208110156118bb57600080fd5b5051905060006118cd86338484612ffa565b9050846001600160a01b0316866001600160a01b0316146118ff576118fc336118f68487612e20565b83613089565b90505b61190a8633836130cf565b50505b6001600160a01b038316158015906119375750836001600160a01b0316836001600160a01b031614155b1561198e5761198e8333336001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112d357600080fd5b6001600160a01b038416158015906119b057506099546001600160a01b031615155b15610e21576099546040805163b221095760e01b81526001600160a01b0387811660048301528681166024830152604482018690523360648301529151919092169163b221095791608480830192600092919082900301818387803b158015611a1857600080fd5b505af1158015611a2c573d6000803e3d6000fd5b5050505050505050565b600080611a4485858561326d565b90969095509350505050565b6033546001600160a01b031690565b6097546001600160a01b031681565b611a7661281a565b6001600160a01b0316611a87611a50565b6001600160a01b031614611ad0576040805162461bcd60e51b81526020600482018190526024820152600080516020614342833981519152604482015290519081900360640190fd5b6110418161340b565b6099546001600160a01b031681565b60606098805480602002602001604051908101604052809291908181526020018280548015611b4057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b22575b5050505050905090565b609a5481565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ba157600080fd5b505afa158015611bb5573d6000803e3d6000fd5b505050506040513d6020811015611bcb57600080fd5b505190506001600160a01b038116611be75760009150506114a0565b6000816001600160a01b031663010dfa58306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611c3657600080fd5b505afa158015611c4a573d6000803e3d6000fd5b505050506040513d6020811015611c6057600080fd5b5051905080611c74576000925050506114a0565b611777848261351e565b600060026065541415611cd8576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655582611ce781612c08565b611d26576040805162461bcd60e51b81526020600482015260176024820152600080516020614389833981519152604482015290519081900360640190fd5b600080611d3488878961326d565b9150915084821115611d775760405162461bcd60e51b81526004018080602001828103825260278152602001806143626027913960400191505060405180910390fd5b611d8288878361353f565b856001600160a01b031663631b5dfb611d9961281a565b8a8a6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611df157600080fd5b505af1158015611e05573d6000803e3d6000fd5b505050506000611e1e8389612e2090919063ffffffff16565b90506000611e2b82612cda565b9050611e3a8a82611435612d58565b876001600160a01b03168a6001600160a01b0316611e5661281a565b604080518d81526020810186905280820189905290516001600160a01b0392909216917f0271704a58fd2953e49b87d67a0a3ce28a58147de98a5457f60b4686f63850309181900360600190a450506001606555509695505050505050565b82611ebf81612c08565b611efe576040805162461bcd60e51b81526020600482015260176024820152600080516020614389833981519152604482015290519081900360640190fd5b611f0661281a565b6001600160a01b0316611f17611a50565b6001600160a01b031614611f60576040805162461bcd60e51b81526020600482018190526024820152600080516020614342833981519152604482015290519081900360640190fd5b6040805180820182526001600160801b0380851680835286821660208085018281526001600160a01b038b166000818152609e84528890209651875492518716600160801b029087166fffffffffffffffffffffffffffffffff1990931692909217909516179094558451928352928201528083019190915290517ffb0ba2cf86a2b03bcf387753a2192da80a006afa99dd022bb301c78e323bf1b99181900360600190a150505050565b60a0546001600160a01b031681565b6000610aa6613600565b600054610100900460ff168061203d575061203d61294b565b8061204b575060005460ff16155b6120865760405162461bcd60e51b815260040180806020018281038252602e8152602001806142f3602e913960400191505060405180910390fd5b600054610100900460ff161580156120b1576000805460ff1961ff0019909116610100171660011790555b6120c3826001600160a01b0316613660565b6120fe5760405162461bcd60e51b81526004018080602001828103825260368152602001806143f96036913960400191505060405180910390fd5b612109858585611044565b60a080546001600160a01b0319166001600160a01b0384169081179091556040805163c89039c560e01b60208083019190915282518083038201815291830192839052815160009493918291908401908083835b6020831061217c5780518252601f19909201916020918201910161215d565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d80600081146121dc576040519150601f19603f3d011682016040523d82523d6000602084013e6121e1565b606091505b50509050806122215760405162461bcd60e51b81526004018080602001828103825260298152602001806142356029913960400191505060405180910390fd5b6040516001600160a01b038416907f7a0ca506edc9fcd36e010dbcaad57dade17bbac71dfeb53269077098e863eeca90600090a2508015612268576000805461ff00191690555b5050505050565b60a15481565b6001600160a01b03166000908152609e60205260409020546001600160801b0380821692600160801b9092041690565b600061149d82612cda565b60026065541415612308576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026065558161231781612c08565b612356576040805162461bcd60e51b81526020600482015260176024820152600080516020614389833981519152604482015290519081900360640190fd5b8361236081613666565b6123b1576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f657863656564732d6c69717569646974792d63617000604482015290519081900360640190fd5b60006123bb61281a565b90506123c987878787612e82565b6123e88130886123d7612d58565b6001600160a01b031692919061368a565b6123f1866128bb565b846001600160a01b0316876001600160a01b0316826001600160a01b03167f6ce569498e0f86f147466ac49211cb2a1ffe06195adb805e383b3f2365109160898860405180838152602001826001600160a01b031681526020019250505060405180910390a4505060016065555050505050565b6000600260655414156124bf576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655560006124ce61270f565b905060006124da613600565b905060008282116124ec5760006124f6565b6124f68284612e20565b90506000609d54821161250a576000612518565b609d54612518908390612e20565b905080156125ca57600061252b82611b50565b9050801561258557609b5461254090826136e4565b609b5561254d8282612e20565b6040805183815290519193507f5f1703ccfa2730d4245350f228079926a37f26a44ecf6978a7eeafff0af11407919081900360200190a15b609d5461259290836136e4565b609d556040805183815290517fce2b6e507c7ca1a20ce136810f524eefc19ba4c7e4866eb6cc0cba76e778d4be9181900360200190a1505b609d54945050505050600160655590565b609b5481565b6125e961281a565b6001600160a01b03166125fa611a50565b6001600160a01b031614612643576040805162461bcd60e51b81526020600482018190526024820152600080516020614342833981519152604482015290519081900360640190fd5b6001600160a01b0381166126885760405162461bcd60e51b815260040180806020018281038252602681526020018061425e6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610aa6612d58565b60405180604001604052806005815260200164332e342e3560d81b81525081565b600080609b5490506060609880548060200260200160405190810160405280929190818152602001828054801561276f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612751575b505083519394506000925050505b818110156128115761280783828151811061279457fe5b60200260200101516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127d457600080fd5b505afa1580156127e8573d6000803e3d6000fd5b505050506040513d60208110156127fe57600080fd5b505185906136e4565b935060010161277d565b50919250505090565b3390565b6000612829836128a6565b61287a576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b816128875750600061289f565b61289b6001600160a01b0384168584612dce565b5060015b9392505050565b60a0546001600160a01b039081169116141590565b60a0546128e4906001600160a01b0316826128d4612d58565b6001600160a01b0316919061373e565b60a054604080516387a6eeef60e01b81526004810184905230602482015290516001600160a01b03909216916387a6eeef9160448082019260009290919082900301818387803b15801561293757600080fd5b505af1158015612268573d6000803e3d6000fd5b600061295630613660565b15905090565b306001600160a01b0316826001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b15801561299f57600080fd5b505afa1580156129b3573d6000803e3d6000fd5b505050506040513d60208110156129c957600080fd5b50516001600160a01b031614612a26576040805162461bcd60e51b815260206004820152601e60248201527f5072697a65506f6f6c2f746f6b656e2d6374726c722d6d69736d617463680000604482015290519081900360640190fd5b8160988281548110612a3457fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051918416917f460e712b4a5d801d031ed673dea209b73ab854f7ddeb86b6c48082e92c3eee669190a25050565b600054610100900460ff1680612aa05750612aa061294b565b80612aae575060005460ff16155b612ae95760405162461bcd60e51b815260040180806020018281038252602e8152602001806142f3602e913960400191505060405180910390fd5b600054610100900460ff16158015612b14576000805460ff1961ff0019909116610100171660011790555b612b1c613851565b612b246138f1565b8015611041576000805461ff001916905550565b600054610100900460ff1680612b515750612b5161294b565b80612b5f575060005460ff16155b612b9a5760405162461bcd60e51b815260040180806020018281038252602e8152602001806142f3602e913960400191505060405180910390fd5b600054610100900460ff16158015612bc5576000805460ff1961ff0019909116610100171660011790555b612b246139ea565b609c8190556040805182815290517f3ff20538222f568f27ff436c0c49dfd3e48d5b8f86533a3f759dc1c7089775ab9181900360200190a150565b600060606098805480602002602001604051908101604052809291908181526020018280548015612c6257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612c44575b505083519394506000925050505b81811015612cb957846001600160a01b0316838281518110612c8e57fe5b60200260200101516001600160a01b03161415612cb157600193505050506114a0565b600101612c70565b506000949350505050565b610e218484612cd587878787612ffa565b6130cf565b60a0546040805162982a6160e11b81526004810184905290516000926001600160a01b03169163013054c291602480830192602092919082900301818787803b158015612d2657600080fd5b505af1158015612d3a573d6000803e3d6000fd5b505050506040513d6020811015612d5057600080fd5b505192915050565b60a0546040805163c89039c560e01b815290516000926001600160a01b03169163c89039c5916004808301926020929190829003018186803b158015612d9d57600080fd5b505afa158015612db1573d6000803e3d6000fd5b505050506040513d6020811015612dc757600080fd5b5051905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610b64908490613a90565b600082821115612e77576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6099546001600160a01b031615612f1157609954604080516304d7f3db60e41b81526001600160a01b038781166004830152602482018790528581166044830152848116606483015291519190921691634d7f3db091608480830192600092919082900301818387803b158015612ef857600080fd5b505af1158015612f0c573d6000803e3d6000fd5b505050505b816001600160a01b0316635d7b075885856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611a1857600080fd5b6001600160a01b0382166000908152609e602052604081205461289f908390612f9b9082906001600160801b031661351e565b613b41565b6001600160a01b0383166000908152609e60205260408120548190612fd6908590600160801b90046001600160801b031661351e565b905080612fe757600091505061289f565b612ff18382613b66565b95945050505050565b6001600160a01b038381166000908152609f6020908152604080832093881683529290529081208054829190600160e01b900460ff1661303d576000915061307f565b600061304a888888613bcd565b825490915061307b9088908890613076908990613070906001600160c01b0316876136e4565b906136e4565b613089565b9250505b5095945050505050565b6001600160a01b0383166000908152609e602052604081205481906130b89085906001600160801b031661351e565b9050808311156130c6578092505b50909392505050565b6001600160a01b038083166000908152609f602090815260408083209387168352929052819020548151606081019092526001600160c01b0316908061311484613c7e565b6001600160801b0316815260200161313261312d613cc6565b613ccc565b63ffffffff908116825260016020928301526001600160a01b038681166000908152609f84526040808220928a168252918452819020845181549486015195909201516001600160c01b03199094166001600160c01b039092169190911763ffffffff60c01b1916600160c01b94909216939093021760ff60e01b1916600160e01b9115159190910217905581811015613215576001600160a01b038084169085167f2f92d56910619b38bc29fd8e4ca5e56359edac7a0c086cdcd305fb603fa374916131ff8585612e20565b60408051918252519081900360200190a3610e21565b80821015610e21576001600160a01b038084169085167ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf6132568486612e20565b60408051918252519081900360200190a350505050565b6000806000846001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156132bf57600080fd5b505afa1580156132d3573d6000803e3d6000fd5b505050506040513d60208110156132e957600080fd5b505190508381101561333b576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f696e737566662d66756e647360501b604482015290519081900360640190fd5b6133488686836000612cc4565b600061335d866133588488612e20565b612f68565b6001600160a01b038088166000908152609f60209081526040808320938c16835292905290812054919250906001600160c01b031682116133d4576001600160a01b038088166000908152609f60209081526040808320938c16835292905220546133d1906001600160c01b031683612e20565b90505b60006133e08888612f68565b90508082116133ef57816133f1565b805b94506133fd8186612e20565b955050505050935093915050565b6001600160a01b038116613466576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f7072697a6553747261746567792d6e6f742d7a65726f604482015290519081900360640190fd5b6134836001600160a01b038216600162a1cb1960e01b0319613d10565b6134d4576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f7072697a6553747261746567792d696e76616c696400604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0383169081179091556040517f7f58dc86bc2e435cb77ca0edb1df55e25f90caf2d6bd866971715437d456a21290600090a250565b60008061352b8385613d2c565b905061177781670de0b6b3a7640000613d85565b6001600160a01b038083166000908152609f60209081526040808320938716835292905220546135819061357c906001600160c01b031683612e20565b613c7e565b6001600160a01b038084166000818152609f602090815260408083209489168084529482529182902080546001600160c01b0319166001600160801b0396909616959095179094558051858152905191937ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf92918290030190a3505050565b60a05460408051630b99152d60e41b815230600482015290516000926001600160a01b03169163b99152d091602480830192602092919082900301818787803b15801561364c57600080fd5b505af1158015612db1573d6000803e3d6000fd5b3b151590565b60008061367161270f565b609c5490915061368182856136e4565b11159392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610e21908590613a90565b60008282018381101561289f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b8015806137c4575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561379657600080fd5b505afa1580156137aa573d6000803e3d6000fd5b505050506040513d60208110156137c057600080fd5b5051155b6137ff5760405162461bcd60e51b815260040180806020018281038252603681526020018061442f6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610b64908490613a90565b600054610100900460ff168061386a575061386a61294b565b80613878575060005460ff16155b6138b35760405162461bcd60e51b815260040180806020018281038252602e8152602001806142f3602e913960400191505060405180910390fd5b600054610100900460ff16158015612b24576000805460ff1961ff0019909116610100171660011790558015611041576000805461ff001916905550565b600054610100900460ff168061390a575061390a61294b565b80613918575060005460ff16155b6139535760405162461bcd60e51b815260040180806020018281038252602e8152602001806142f3602e913960400191505060405180910390fd5b600054610100900460ff1615801561397e576000805460ff1961ff0019909116610100171660011790555b600061398861281a565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015611041576000805461ff001916905550565b600054610100900460ff1680613a035750613a0361294b565b80613a11575060005460ff16155b613a4c5760405162461bcd60e51b815260040180806020018281038252602e8152602001806142f3602e913960400191505060405180910390fd5b600054610100900460ff16158015613a77576000805460ff1961ff0019909116610100171660011790555b60016065558015611041576000805461ff001916905550565b6060613ae5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613dc79092919063ffffffff16565b805190915015610b6457808060200190516020811015613b0457600080fd5b5051610b645760405162461bcd60e51b815260040180806020018281038252602a8152602001806143cf602a913960400191505060405180910390fd5b600080613b5084609a5461351e565b905080831115613b5e578092505b509092915050565b6000808211613bbc576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381613bc557fe5b049392505050565b6001600160a01b038281166000908152609f60209081526040808320938716835292905290812054600160c01b810463ffffffff1690600160e01b900460ff16613c1b57600091505061289f565b6000613c2f82613c29613cc6565b90612e20565b6001600160a01b0386166000908152609e602052604081205491925090613c67908390600160801b90046001600160801b0316613d2c565b9050613c73858261351e565b979650505050505050565b6000600160801b8210613cc25760405162461bcd60e51b81526004018080602001828103825260278152602001806142846027913960400191505060405180910390fd5b5090565b60a15490565b6000600160201b8210613cc25760405162461bcd60e51b81526004018080602001828103825260268152602001806143a96026913960400191505060405180910390fd5b6000613d1b83613dd6565b801561289f575061289f8383613e09565b600082613d3b57506000612e7c565b82820282848281613d4857fe5b041461289f5760405162461bcd60e51b81526004018080602001828103825260218152602001806143216021913960400191505060405180910390fd5b600061289f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613e2c565b60606117778484600085613ece565b6000613de9826301ffc9a760e01b613e09565b801561149d5750613e02826001600160e01b0319613e09565b1592915050565b6000806000613e18858561401f565b91509150818015612ff15750949350505050565b60008183613eb85760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613e7d578181015183820152602001613e65565b50505050905090810190601f168015613eaa5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613ec457fe5b0495945050505050565b606082471015613f0f5760405162461bcd60e51b81526004018080602001828103825260268152602001806142cd6026913960400191505060405180910390fd5b613f1885613660565b613f69576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613fa85780518252601f199092019160209182019101613f89565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461400a576040519150601f19603f3d011682016040523d82523d6000602084013e61400f565b606091505b5091509150613c73828286614153565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b1781529151815160009384939284926060926001600160a01b038a169261753092879282918083835b602083106140a75780518252601f199092019160209182019101614088565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114614108576040519150601f19603f3d011682016040523d82523d6000602084013e61410d565b606091505b509150915060208151101561412b576000809450945050505061414c565b8181806020019051602081101561414157600080fd5b505190955093505050505b9250929050565b6060831561416257508161289f565b8251156141725782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315613e7d578181015183820152602001613e65565b82805482825590600052602060002090810192821561420e579160200282015b8281111561420e57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906141d9565b50613cc29291505b80821115613cc25780546001600160a01b031916815560010161421656fe5969656c64536f757263655072697a65506f6f6c2f696e76616c69642d7969656c642d736f757263654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e2031323820626974735072697a65506f6f6c2f7265736572766552656769737472792d6e6f742d7a65726f416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725072697a65506f6f6c2f657869742d6665652d657863656564732d757365722d6d6178696d756d5072697a65506f6f6c2f756e6b6e6f776e2d746f6b656e00000000000000000053616665436173743a2076616c756520646f65736e27742066697420696e20333220626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645969656c64536f757263655072697a65506f6f6c2f7969656c642d736f757263652d6e6f742d636f6e74726163742d616464726573735361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e63655072697a65506f6f6c2f6f6e6c792d7072697a65537472617465677900000000a26469706673582212203135eaf4609c9c05130cbcc71f888d1063cd87122b3fc032b8baefb6dc0b694f64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x25E JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0x146 JUMPI DUP1 PUSH4 0xB69EF8A8 GT PUSH2 0xC3 JUMPI DUP1 PUSH4 0xE323F825 GT PUSH2 0x87 JUMPI DUP1 PUSH4 0xE323F825 EQ PUSH2 0x9A5 JUMPI DUP1 PUSH4 0xE6D8A94B EQ PUSH2 0x9E1 JUMPI DUP1 PUSH4 0xEDB4E1CF EQ PUSH2 0x9E9 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x9F1 JUMPI DUP1 PUSH4 0xFC0C546A EQ PUSH2 0xA17 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0xA1F JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0xB69EF8A8 EQ PUSH2 0x864 JUMPI DUP1 PUSH4 0xCFA24007 EQ PUSH2 0x86C JUMPI DUP1 PUSH4 0xD18E81B3 EQ PUSH2 0x92B JUMPI DUP1 PUSH4 0xD4A1361D EQ PUSH2 0x933 JUMPI DUP1 PUSH4 0xDB006A75 EQ PUSH2 0x988 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x9E167519 GT PUSH2 0x10A JUMPI DUP1 PUSH4 0x9E167519 EQ PUSH2 0x7C0 JUMPI DUP1 PUSH4 0x9FE32A91 EQ PUSH2 0x7C8 JUMPI DUP1 PUSH4 0xA016240B EQ PUSH2 0x7E5 JUMPI DUP1 PUSH4 0xA7B2CC31 EQ PUSH2 0x81F JUMPI DUP1 PUSH4 0xB2470E5C EQ PUSH2 0x85C JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x70E JUMPI DUP1 PUSH4 0x8E71C1F6 EQ PUSH2 0x732 JUMPI DUP1 PUSH4 0x91CA480E EQ PUSH2 0x73A JUMPI DUP1 PUSH4 0x98BF3EB6 EQ PUSH2 0x760 JUMPI DUP1 PUSH4 0x9D63848A EQ PUSH2 0x768 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x52A387AB GT PUSH2 0x1DF JUMPI DUP1 PUSH4 0x76687D3D GT PUSH2 0x1A3 JUMPI DUP1 PUSH4 0x76687D3D EQ PUSH2 0x60C JUMPI DUP1 PUSH4 0x78B3D327 EQ PUSH2 0x614 JUMPI DUP1 PUSH4 0x79CB8563 EQ PUSH2 0x63A JUMPI DUP1 PUSH4 0x7B99ADB1 EQ PUSH2 0x66C JUMPI DUP1 PUSH4 0x7CBAB1C7 EQ PUSH2 0x689 JUMPI DUP1 PUSH4 0x888C2B6F EQ PUSH2 0x6BF JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x52A387AB EQ PUSH2 0x566 JUMPI DUP1 PUSH4 0x630665B4 EQ PUSH2 0x58C JUMPI DUP1 PUSH4 0x6A3FD4F9 EQ PUSH2 0x594 JUMPI DUP1 PUSH4 0x6B1B863A EQ PUSH2 0x5CE JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x604 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x2B0AB144 GT PUSH2 0x226 JUMPI DUP1 PUSH4 0x2B0AB144 EQ PUSH2 0x404 JUMPI DUP1 PUSH4 0x2F7627E3 EQ PUSH2 0x43A JUMPI DUP1 PUSH4 0x35403023 EQ PUSH2 0x468 JUMPI DUP1 PUSH4 0x3EDE50C6 EQ PUSH2 0x485 JUMPI DUP1 PUSH4 0x494DE9F7 EQ PUSH2 0x538 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x937EB54 EQ PUSH2 0x263 JUMPI DUP1 PUSH4 0x13F55E39 EQ PUSH2 0x27D JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x2B5 JUMPI DUP1 PUSH4 0x16960D55 EQ PUSH2 0x360 JUMPI DUP1 PUSH4 0x22F8E566 EQ PUSH2 0x3E7 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26B PUSH2 0xA9C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x293 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xAAB JUMP JUMPDEST STOP JUMPDEST PUSH2 0x343 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x2CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x305 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x317 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x338 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xB69 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x376 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x3A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x3BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x3DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xB7A JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xE27 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x41A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xE2C JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x450 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xEE9 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x47E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1038 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x49B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x4C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x4D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x4F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0x1044 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x54E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x1236 JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x57C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x133D JUMP JUMPDEST PUSH2 0x26B PUSH2 0x148C JUMP JUMPDEST PUSH2 0x5BA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1492 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x5E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 SWAP1 SWAP2 ADD CALLDATALOAD AND PUSH2 0x14A5 JUMP JUMPDEST PUSH2 0x2B3 PUSH2 0x16AD JUMP JUMPDEST PUSH2 0x26B PUSH2 0x1759 JUMP JUMPDEST PUSH2 0x5BA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x62A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x175F JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x650 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x176A JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x682 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x177F JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x69F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x17EA JUMP JUMPDEST PUSH2 0x6F5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x6D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1A36 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB ADD SWAP1 RETURN JUMPDEST PUSH2 0x716 PUSH2 0x1A50 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x716 PUSH2 0x1A5F JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x750 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A6E JUMP JUMPDEST PUSH2 0x716 PUSH2 0x1AD9 JUMP JUMPDEST PUSH2 0x770 PUSH2 0x1AE8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x7AC JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x794 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x26B PUSH2 0x1B4A JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x7DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1B50 JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x7FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x1C7E JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x835 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x40 ADD CALLDATALOAD AND PUSH2 0x1EB5 JUMP JUMPDEST PUSH2 0x716 PUSH2 0x200B JUMP JUMPDEST PUSH2 0x26B PUSH2 0x201A JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x882 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x8AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x8BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x8DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2024 JUMP JUMPDEST PUSH2 0x26B PUSH2 0x226F JUMP JUMPDEST PUSH2 0x959 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x949 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2275 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x99E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x22A5 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x9BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x22B0 JUMP JUMPDEST PUSH2 0x26B PUSH2 0x2465 JUMP JUMPDEST PUSH2 0x26B PUSH2 0x25DB JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xA07 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x25E1 JUMP JUMPDEST PUSH2 0x716 PUSH2 0x26E4 JUMP JUMPDEST PUSH2 0xA27 PUSH2 0x26EE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xA61 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xA49 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xA8E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xAA6 PUSH2 0x270F JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xABF PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xB08 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4465 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xB13 DUP4 DUP4 DUP4 PUSH2 0x281E JUMP JUMPDEST ISZERO PUSH2 0xB64 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB0BAC59718CD343C80A813518AFCF36846CFCFE6D56E2B3CAB9BD49F5F9B251C DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0xA85BD01 PUSH1 0xE1 SHL SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xB8E PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xBD7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4465 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xBE0 DUP4 PUSH2 0x28A6 JUMP JUMPDEST PUSH2 0xC31 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0xC3B JUMPI PUSH2 0xE21 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xDA8 JUMPI DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x42842E0E ADDRESS DUP8 DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0xC63 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0xCD1 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xDA0 JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0xCFF JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xD04 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH32 0x17E975018310F88872B58D4D8263ADCA83CF5C1893496EA2A86923DAB15276AD DUP2 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD64 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD4C JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD91 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xC3E JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x69C2DE32BC4D47F488E72626A6CFDEE85089342E52675E7DE79C4B417623960C DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP6 POP SWAP1 SWAP4 POP POP POP POP LOG3 JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0xA1 SSTORE JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE40 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xE89 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4465 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xE94 DUP4 DUP4 DUP4 PUSH2 0x281E JUMP JUMPDEST ISZERO PUSH2 0xB64 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC65F48ACA3B7A99B7443D04B8FFBB073156179BC628DC3F7DEF5047748973469 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH2 0xEF1 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF02 PUSH2 0x1A50 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xF4B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4342 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xFAE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xFC4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD GT ISZERO PUSH2 0x1034 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5C19A95C DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x101B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x102F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x1041 DUP2 PUSH2 0x28BB JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x105D JUMPI POP PUSH2 0x105D PUSH2 0x294B JUMP JUMPDEST DUP1 PUSH2 0x106B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x10A6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F3 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x10D1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x1116 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42AB PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 MLOAD DUP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x112F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1159 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP1 MLOAD PUSH2 0x116E SWAP2 PUSH1 0x98 SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x41B9 JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x11A5 JUMPI PUSH1 0x0 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1188 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0x119C DUP2 DUP4 PUSH2 0x295C JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x1172 JUMP JUMPDEST POP PUSH2 0x11AE PUSH2 0x2A87 JUMP JUMPDEST PUSH2 0x11B6 PUSH2 0x2B38 JUMP JUMPDEST PUSH2 0x11C1 PUSH1 0x0 NOT PUSH2 0x2BCD JUMP JUMPDEST PUSH1 0x97 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x9A DUP5 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP6 SWAP1 MSTORE DUP1 MLOAD PUSH32 0x25FF68DD81B34665B5BA7E553EE5511BF6812E12ADB4A7E2C0D9E26B3099CE79 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 POP DUP1 ISZERO PUSH2 0xE21 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x1242 DUP2 PUSH2 0x2C08 JUMP JUMPDEST PUSH2 0x1281 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4389 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1306 DUP5 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x12E7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x12FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 PUSH2 0x2CC4 JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP4 AND DUP3 MSTORE SWAP3 SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x138E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x13A2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x13B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ PUSH2 0x1412 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F6F6E6C792D72657365727665 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9B DUP1 SLOAD PUSH1 0x0 SWAP2 DUP3 SWAP1 SSTORE SWAP1 PUSH2 0x1426 DUP3 PUSH2 0x2CDA JUMP JUMPDEST SWAP1 POP PUSH2 0x1445 DUP6 DUP3 PUSH2 0x1435 PUSH2 0x2D58 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x2DCE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP2 PUSH32 0x1C71C8E11FD443227C8F8D3DC1A237A3A5E8310B540C7FBCF5169754AEDF42C9 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x9D SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x149D DUP3 PUSH2 0x28A6 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x14B9 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1502 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4465 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x150C DUP2 PUSH2 0x2C08 JUMP JUMPDEST PUSH2 0x154B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4389 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 PUSH2 0x1555 JUMPI PUSH2 0xE21 JUMP JUMPDEST PUSH1 0x9D SLOAD DUP4 GT ISZERO PUSH2 0x15AC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F61776172642D657863656564732D617661696C000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x15B9 SWAP1 DUP5 PUSH2 0x2E20 JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH2 0x15C9 DUP5 DUP5 DUP5 PUSH1 0x0 PUSH2 0x2E82 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15D5 DUP4 DUP6 PUSH2 0x2F68 JUMP JUMPDEST SWAP1 POP PUSH2 0x165B DUP6 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1629 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x163D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1653 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP5 PUSH2 0x2CC4 JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xE2554529D99AB7A67DB6B4CEA2B32C7D55AE325F958861E05F304FDDED867E31 DUP7 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x16B5 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16C6 PUSH2 0x1A50 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x170F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4342 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x149D DUP3 PUSH2 0x2C08 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1777 DUP5 DUP5 DUP5 PUSH2 0x2FA0 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1787 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1798 PUSH2 0x1A50 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x17E1 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4342 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1041 DUP2 PUSH2 0x2BCD JUMP JUMPDEST CALLER PUSH2 0x17F4 DUP2 PUSH2 0x2C08 JUMP JUMPDEST PUSH2 0x1833 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4389 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO PUSH2 0x190D JUMPI PUSH1 0x0 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP7 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1891 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x18A5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x18BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x18CD DUP7 CALLER DUP5 DUP5 PUSH2 0x2FFA JUMP JUMPDEST SWAP1 POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x18FF JUMPI PUSH2 0x18FC CALLER PUSH2 0x18F6 DUP5 DUP8 PUSH2 0x2E20 JUMP JUMPDEST DUP4 PUSH2 0x3089 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x190A DUP7 CALLER DUP4 PUSH2 0x30CF JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1937 JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x198E JUMPI PUSH2 0x198E DUP4 CALLER CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x19B0 JUMPI POP PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xE21 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP7 SWAP1 MSTORE CALLER PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xB2210957 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1A18 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1A2C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1A44 DUP6 DUP6 DUP6 PUSH2 0x326D JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x97 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1A76 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A87 PUSH2 0x1A50 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1AD0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4342 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1041 DUP2 PUSH2 0x340B JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1B40 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1B22 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1BA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1BB5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1BCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1BE7 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x14A0 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x10DFA58 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C36 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C4A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1C60 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x1C74 JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x14A0 JUMP JUMPDEST PUSH2 0x1777 DUP5 DUP3 PUSH2 0x351E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x1CD8 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP3 PUSH2 0x1CE7 DUP2 PUSH2 0x2C08 JUMP JUMPDEST PUSH2 0x1D26 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4389 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1D34 DUP9 DUP8 DUP10 PUSH2 0x326D JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0x1D77 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4362 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1D82 DUP9 DUP8 DUP4 PUSH2 0x353F JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x631B5DFB PUSH2 0x1D99 PUSH2 0x281A JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1DF1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E05 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 PUSH2 0x1E1E DUP4 DUP10 PUSH2 0x2E20 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1E2B DUP3 PUSH2 0x2CDA JUMP JUMPDEST SWAP1 POP PUSH2 0x1E3A DUP11 DUP3 PUSH2 0x1435 PUSH2 0x2D58 JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E56 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP14 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE DUP1 DUP3 ADD DUP10 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x271704A58FD2953E49B87D67A0A3CE28A58147DE98A5457F60B4686F6385030 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH2 0x1EBF DUP2 PUSH2 0x2C08 JUMP JUMPDEST PUSH2 0x1EFE JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4389 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1F06 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1F17 PUSH2 0x1A50 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1F60 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4342 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP6 AND DUP1 DUP4 MSTORE DUP7 DUP3 AND PUSH1 0x20 DUP1 DUP6 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9E DUP5 MSTORE DUP9 SWAP1 KECCAK256 SWAP7 MLOAD DUP8 SLOAD SWAP3 MLOAD DUP8 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP1 DUP8 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP6 AND OR SWAP1 SWAP5 SSTORE DUP5 MLOAD SWAP3 DUP4 MSTORE SWAP3 DUP3 ADD MSTORE DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 MLOAD PUSH32 0xFB0BA2CF86A2B03BCF387753A2192DA80A006AFA99DD022BB301C78E323BF1B9 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xAA6 PUSH2 0x3600 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x203D JUMPI POP PUSH2 0x203D PUSH2 0x294B JUMP JUMPDEST DUP1 PUSH2 0x204B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2086 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F3 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x20B1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x20C3 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3660 JUMP JUMPDEST PUSH2 0x20FE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x36 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x43F9 PUSH1 0x36 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x2109 DUP6 DUP6 DUP6 PUSH2 0x1044 JUMP JUMPDEST PUSH1 0xA0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH4 0xC89039C5 PUSH1 0xE0 SHL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP3 ADD DUP2 MSTORE SWAP2 DUP4 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP5 SWAP4 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x217C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x215D JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x21DC JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x21E1 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2221 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4235 PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH32 0x7A0CA506EDC9FCD36E010DBCAAD57DADE17BBAC71DFEB53269077098E863EECA SWAP1 PUSH1 0x0 SWAP1 LOG2 POP DUP1 ISZERO PUSH2 0x2268 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0xA1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP3 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x149D DUP3 PUSH2 0x2CDA JUMP JUMPDEST PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x2308 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP2 PUSH2 0x2317 DUP2 PUSH2 0x2C08 JUMP JUMPDEST PUSH2 0x2356 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4389 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP4 PUSH2 0x2360 DUP2 PUSH2 0x3666 JUMP JUMPDEST PUSH2 0x23B1 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F657863656564732D6C69717569646974792D63617000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x23BB PUSH2 0x281A JUMP JUMPDEST SWAP1 POP PUSH2 0x23C9 DUP8 DUP8 DUP8 DUP8 PUSH2 0x2E82 JUMP JUMPDEST PUSH2 0x23E8 DUP2 ADDRESS DUP9 PUSH2 0x23D7 PUSH2 0x2D58 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 SWAP1 PUSH2 0x368A JUMP JUMPDEST PUSH2 0x23F1 DUP7 PUSH2 0x28BB JUMP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6CE569498E0F86F147466AC49211CB2A1FFE06195ADB805E383B3F2365109160 DUP10 DUP9 PUSH1 0x40 MLOAD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x24BF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE PUSH1 0x0 PUSH2 0x24CE PUSH2 0x270F JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x24DA PUSH2 0x3600 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 DUP3 GT PUSH2 0x24EC JUMPI PUSH1 0x0 PUSH2 0x24F6 JUMP JUMPDEST PUSH2 0x24F6 DUP3 DUP5 PUSH2 0x2E20 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x9D SLOAD DUP3 GT PUSH2 0x250A JUMPI PUSH1 0x0 PUSH2 0x2518 JUMP JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x2518 SWAP1 DUP4 SWAP1 PUSH2 0x2E20 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x25CA JUMPI PUSH1 0x0 PUSH2 0x252B DUP3 PUSH2 0x1B50 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x2585 JUMPI PUSH1 0x9B SLOAD PUSH2 0x2540 SWAP1 DUP3 PUSH2 0x36E4 JUMP JUMPDEST PUSH1 0x9B SSTORE PUSH2 0x254D DUP3 DUP3 PUSH2 0x2E20 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 POP PUSH32 0x5F1703CCFA2730D4245350F228079926A37F26A44ECF6978A7EEAFFF0AF11407 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x2592 SWAP1 DUP4 PUSH2 0x36E4 JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xCE2B6E507C7CA1A20CE136810F524EEFC19BA4C7E4866EB6CC0CBA76E778D4BE SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH1 0x9D SLOAD SWAP5 POP POP POP POP POP PUSH1 0x1 PUSH1 0x65 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x9B SLOAD DUP2 JUMP JUMPDEST PUSH2 0x25E9 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x25FA PUSH2 0x1A50 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2643 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4342 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x2688 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x425E PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xAA6 PUSH2 0x2D58 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x9B SLOAD SWAP1 POP PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x276F JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2751 JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2811 JUMPI PUSH2 0x2807 DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2794 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x27D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x27E8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x27FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP6 SWAP1 PUSH2 0x36E4 JUMP JUMPDEST SWAP4 POP PUSH1 0x1 ADD PUSH2 0x277D JUMP JUMPDEST POP SWAP2 SWAP3 POP POP POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2829 DUP4 PUSH2 0x28A6 JUMP JUMPDEST PUSH2 0x287A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x2887 JUMPI POP PUSH1 0x0 PUSH2 0x289F JUMP JUMPDEST PUSH2 0x289B PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP6 DUP5 PUSH2 0x2DCE JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND SWAP2 AND EQ ISZERO SWAP1 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH2 0x28E4 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH2 0x28D4 PUSH2 0x2D58 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x373E JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x87A6EEEF PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x87A6EEEF SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2937 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2268 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2956 ADDRESS PUSH2 0x3660 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF77C4791 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x299F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x29B3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x29C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2A26 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F746F6B656E2D6374726C722D6D69736D617463680000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x98 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x2A34 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 DUP5 AND SWAP2 PUSH32 0x460E712B4A5D801D031ED673DEA209B73AB854F7DDEB86B6C48082E92C3EEE66 SWAP2 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2AA0 JUMPI POP PUSH2 0x2AA0 PUSH2 0x294B JUMP JUMPDEST DUP1 PUSH2 0x2AAE JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2AE9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F3 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2B14 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2B1C PUSH2 0x3851 JUMP JUMPDEST PUSH2 0x2B24 PUSH2 0x38F1 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2B51 JUMPI POP PUSH2 0x2B51 PUSH2 0x294B JUMP JUMPDEST DUP1 PUSH2 0x2B5F JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2B9A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F3 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2BC5 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2B24 PUSH2 0x39EA JUMP JUMPDEST PUSH1 0x9C DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3FF20538222F568F27FF436C0C49DFD3E48D5B8F86533A3F759DC1C7089775AB SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2C62 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2C44 JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2CB9 JUMPI DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2C8E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x2CB1 JUMPI PUSH1 0x1 SWAP4 POP POP POP POP PUSH2 0x14A0 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2C70 JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xE21 DUP5 DUP5 PUSH2 0x2CD5 DUP8 DUP8 DUP8 DUP8 PUSH2 0x2FFA JUMP JUMPDEST PUSH2 0x30CF JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH3 0x982A61 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x13054C2 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2D26 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2D3A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2D50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xC89039C5 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xC89039C5 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2D9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2DB1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2DC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xB64 SWAP1 DUP5 SWAP1 PUSH2 0x3A90 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2E77 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2F11 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE DUP6 DUP2 AND PUSH1 0x44 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x4D7F3DB0 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2EF8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2F0C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5D7B0758 DUP6 DUP6 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1A18 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x289F SWAP1 DUP4 SWAP1 PUSH2 0x2F9B SWAP1 DUP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x351E JUMP JUMPDEST PUSH2 0x3B41 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2FD6 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x351E JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x2FE7 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x289F JUMP JUMPDEST PUSH2 0x2FF1 DUP4 DUP3 PUSH2 0x3B66 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP3 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x303D JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x307F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x304A DUP9 DUP9 DUP9 PUSH2 0x3BCD JUMP JUMPDEST DUP3 SLOAD SWAP1 SWAP2 POP PUSH2 0x307B SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x3076 SWAP1 DUP10 SWAP1 PUSH2 0x3070 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP8 PUSH2 0x36E4 JUMP JUMPDEST SWAP1 PUSH2 0x36E4 JUMP JUMPDEST PUSH2 0x3089 JUMP JUMPDEST SWAP3 POP POP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x30B8 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x351E JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x30C6 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE DUP2 SWAP1 KECCAK256 SLOAD DUP2 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 DUP1 PUSH2 0x3114 DUP5 PUSH2 0x3C7E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x3132 PUSH2 0x312D PUSH2 0x3CC6 JUMP JUMPDEST PUSH2 0x3CCC JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP3 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 DUP11 AND DUP3 MSTORE SWAP2 DUP5 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP5 DUP7 ADD MLOAD SWAP6 SWAP1 SWAP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH4 0xFFFFFFFF PUSH1 0xC0 SHL NOT AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP5 SWAP1 SWAP3 AND SWAP4 SWAP1 SWAP4 MUL OR PUSH1 0xFF PUSH1 0xE0 SHL NOT AND PUSH1 0x1 PUSH1 0xE0 SHL SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE DUP2 DUP2 LT ISZERO PUSH2 0x3215 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0x2F92D56910619B38BC29FD8E4CA5E56359EDAC7A0C086CDCD305FB603FA37491 PUSH2 0x31FF DUP6 DUP6 PUSH2 0x2E20 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 PUSH2 0xE21 JUMP JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0xE21 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF PUSH2 0x3256 DUP5 DUP7 PUSH2 0x2E20 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x32BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x32D3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x32E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x333B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F696E737566662D66756E6473 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x3348 DUP7 DUP7 DUP4 PUSH1 0x0 PUSH2 0x2CC4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x335D DUP7 PUSH2 0x3358 DUP5 DUP9 PUSH2 0x2E20 JUMP JUMPDEST PUSH2 0x2F68 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP3 GT PUSH2 0x33D4 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x33D1 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2E20 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x33E0 DUP9 DUP9 PUSH2 0x2F68 JUMP JUMPDEST SWAP1 POP DUP1 DUP3 GT PUSH2 0x33EF JUMPI DUP2 PUSH2 0x33F1 JUMP JUMPDEST DUP1 JUMPDEST SWAP5 POP PUSH2 0x33FD DUP2 DUP7 PUSH2 0x2E20 JUMP JUMPDEST SWAP6 POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x3466 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D6E6F742D7A65726F PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x3483 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3D10 JUMP JUMPDEST PUSH2 0x34D4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D696E76616C696400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x99 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x7F58DC86BC2E435CB77CA0EDB1DF55E25F90CAF2D6BD866971715437D456A212 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x352B DUP4 DUP6 PUSH2 0x3D2C JUMP JUMPDEST SWAP1 POP PUSH2 0x1777 DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x3D85 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x3581 SWAP1 PUSH2 0x357C SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2E20 JUMP JUMPDEST PUSH2 0x3C7E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB99152D PUSH1 0xE4 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xB99152D0 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x364C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2DB1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3671 PUSH2 0x270F JUMP JUMPDEST PUSH1 0x9C SLOAD SWAP1 SWAP2 POP PUSH2 0x3681 DUP3 DUP6 PUSH2 0x36E4 JUMP JUMPDEST GT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x24 DUP4 ADD MSTORE DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x84 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xE21 SWAP1 DUP6 SWAP1 PUSH2 0x3A90 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x289F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 ISZERO DUP1 PUSH2 0x37C4 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH4 0x6EB1769F PUSH1 0xE1 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 DUP6 AND SWAP2 PUSH4 0xDD62ED3E SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3796 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x37AA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x37C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO JUMPDEST PUSH2 0x37FF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x36 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x442F PUSH1 0x36 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x95EA7B3 PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xB64 SWAP1 DUP5 SWAP1 PUSH2 0x3A90 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x386A JUMPI POP PUSH2 0x386A PUSH2 0x294B JUMP JUMPDEST DUP1 PUSH2 0x3878 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x38B3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F3 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2B24 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x390A JUMPI POP PUSH2 0x390A PUSH2 0x294B JUMP JUMPDEST DUP1 PUSH2 0x3918 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3953 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F3 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x397E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x3988 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3A03 JUMPI POP PUSH2 0x3A03 PUSH2 0x294B JUMP JUMPDEST DUP1 PUSH2 0x3A11 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3A4C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F3 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3A77 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x65 SSTORE DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x3AE5 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3DC7 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xB64 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3B04 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xB64 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x43CF PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3B50 DUP5 PUSH1 0x9A SLOAD PUSH2 0x351E JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x3B5E JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x3BBC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x3BC5 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xC0 SHL DUP2 DIV PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x3C1B JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x289F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3C2F DUP3 PUSH2 0x3C29 PUSH2 0x3CC6 JUMP JUMPDEST SWAP1 PUSH2 0x2E20 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x3C67 SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3D2C JUMP JUMPDEST SWAP1 POP PUSH2 0x3C73 DUP6 DUP3 PUSH2 0x351E JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x3CC2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4284 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0xA1 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x20 SHL DUP3 LT PUSH2 0x3CC2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x43A9 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3D1B DUP4 PUSH2 0x3DD6 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x289F JUMPI POP PUSH2 0x289F DUP4 DUP4 PUSH2 0x3E09 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3D3B JUMPI POP PUSH1 0x0 PUSH2 0x2E7C JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x3D48 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x289F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4321 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x289F DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x3E2C JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1777 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x3ECE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3DE9 DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3E09 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x149D JUMPI POP PUSH2 0x3E02 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3E09 JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x3E18 DUP6 DUP6 PUSH2 0x401F JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x2FF1 JUMPI POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x3EB8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3E7D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3E65 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3EAA JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x3EC4 JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x3F0F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42CD PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3F18 DUP6 PUSH2 0x3660 JUMP JUMPDEST PUSH2 0x3F69 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3FA8 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3F89 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x400A JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x400F JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x3C73 DUP3 DUP3 DUP7 PUSH2 0x4153 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x24 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP3 DUP5 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND SWAP3 PUSH2 0x7530 SWAP3 DUP8 SWAP3 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x40A7 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x4088 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x4108 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x410D JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x412B JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x414C JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4141 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x4162 JUMPI POP DUP2 PUSH2 0x289F JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x4172 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x3E7D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3E65 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x420E JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x420E JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x41D9 JUMP JUMPDEST POP PUSH2 0x3CC2 SWAP3 SWAP2 POP JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x3CC2 JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x4216 JUMP INVALID MSIZE PUSH10 0x656C64536F7572636550 PUSH19 0x697A65506F6F6C2F696E76616C69642D796965 PUSH13 0x642D736F757263654F776E6162 PUSH13 0x653A206E6577206F776E657220 PUSH10 0x7320746865207A65726F KECCAK256 PUSH2 0x6464 PUSH19 0x65737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E2031323820626974735072697A65 POP PUSH16 0x6F6C2F72657365727665526567697374 PUSH19 0x792D6E6F742D7A65726F416464726573733A20 PUSH10 0x6E73756666696369656E PUSH21 0x2062616C616E636520666F722063616C6C496E6974 PUSH10 0x616C697A61626C653A20 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 MSTORE8 PUSH2 0x6665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F774F776E61626C653A20 PUSH4 0x616C6C65 PUSH19 0x206973206E6F7420746865206F776E65725072 PUSH10 0x7A65506F6F6C2F657869 PUSH21 0x2D6665652D657863656564732D757365722D6D6178 PUSH10 0x6D756D5072697A65506F PUSH16 0x6C2F756E6B6E6F776E2D746F6B656E00 STOP STOP STOP STOP STOP STOP STOP STOP MSTORE8 PUSH2 0x6665 NUMBER PUSH2 0x7374 GASPRICE KECCAK256 PUSH23 0x616C756520646F65736E27742066697420696E20333220 PUSH3 0x697473 MSTORE8 PUSH2 0x6665 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x7563636565645969656C64536F75726365507269 PUSH27 0x65506F6F6C2F7969656C642D736F757263652D6E6F742D636F6E74 PUSH19 0x6163742D616464726573735361666545524332 ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F76652066726F6D206E6F6E2D7A65726F2074 PUSH16 0x206E6F6E2D7A65726F20616C6C6F7761 PUSH15 0x63655072697A65506F6F6C2F6F6E6C PUSH26 0x2D7072697A65537472617465677900000000A264697066735822 SLT KECCAK256 BALANCE CALLDATALOAD 0xEA DELEGATECALL PUSH1 0x9C SWAP13 SDIV SGT 0xC 0xBC 0xC7 0x1F DUP9 DUP14 LT PUSH4 0xCD87122B EXTCODEHASH 0xC0 ORIGIN 0xB8 0xBA 0xEF 0xB6 0xDC SIGNEXTEND PUSH10 0x4F64736F6C634300060C STOP CALLER ",
              "sourceMap": "135:476:83:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31480:106:39;;;:::i;:::-;;;;;;;;;;;;;;;;14958:270;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14958:270:39;;;;;;;;;;;;;;;;;:::i;:::-;;32298:200;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32298:200:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32298:200:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32298:200:39;;;;;;;;;;-1:-1:-1;32298:200:39;;-1:-1:-1;32298:200:39;-1:-1:-1;32298:200:39;:::i;:::-;;;;-1:-1:-1;;;;;;32298:200:39;;;;;;;;;;;;;;;17185:617;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17185:617:39;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17185:617:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17185:617:39;;;;;;;;;;-1:-1:-1;17185:617:39;;-1:-1:-1;17185:617:39;-1:-1:-1;17185:617:39;:::i;232:92:83:-;;;;;;;;;;;;;;;;-1:-1:-1;232:92:83;;:::i;15586:263:39:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15586:263:39;;;;;;;;;;;;;;;;;:::i;31811:166::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31811:166:39;;;;;;;;;;:::i;426:75:83:-;;;;;;;;;;;;;;;;-1:-1:-1;426:75:83;;:::i;5948:860:39:-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5948:860:39;;;;;;;;;;;;;-1:-1:-1;5948:860:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5948:860:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5948:860:39;;-1:-1:-1;;5948:860:39;;;-1:-1:-1;5948:860:39;;-1:-1:-1;;5948:860:39:i;25409:303::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25409:303:39;;;;;;;;;;:::i;13277:314::-;;;;;;;;;;;;;;;;-1:-1:-1;13277:314:39;-1:-1:-1;;;;;13277:314:39;;:::i;11940:103::-;;;:::i;7465:130::-;;;;;;;;;;;;;;;;-1:-1:-1;7465:130:39;-1:-1:-1;;;;;7465:130:39;;:::i;:::-;;;;;;;;;;;;;;;;;;13917:647;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13917:647:39;;;;;;;;;;;;;;;;;:::i;1967:145:0:-;;;:::i;5382:27:39:-;;;:::i;34141:141::-;;;;;;;;;;;;;;;;-1:-1:-1;34141:141:39;-1:-1:-1;;;;;34141:141:39;;:::i;19907:306::-;;;;;;;;;;;;;;;;-1:-1:-1;19907:306:39;;-1:-1:-1;;;;;19907:306:39;;;;;;;;;;;:::i;29377:118::-;;;;;;;;;;;;;;;;-1:-1:-1;29377:118:39;;:::i;10723:1018::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10723:1018:39;;;;;;;;;;;;;;;;;:::i;18806:302::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18806:302:39;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1335:85:0;;;:::i;:::-;;;;-1:-1:-1;;;;;1335:85:0;;;;;;;;;;;;;;4710:40:39;;;:::i;30219:137::-;;;;;;;;;;;;;;;;-1:-1:-1;30219:137:39;-1:-1:-1;;;;;30219:137:39;;:::i;4916:43::-;;;:::i;31052:110::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5172:33;;;:::i;18036:430::-;;;;;;;;;;;;;;;;-1:-1:-1;18036:430:39;;:::i;8890:921::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8890:921:39;;;;;;;;;;;;;;;;;;;;:::i;26123:455::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26123:455:39;;;;-1:-1:-1;;;;;26123:455:39;;;;;;;;;;;;:::i;545:31:45:-;;;:::i;7162:74:39:-;;;:::i;1015:792:45:-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1015:792:45;;;;;;;;;;;;;-1:-1:-1;1015:792:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1015:792:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1015:792:45;;-1:-1:-1;;1015:792:45;;;-1:-1:-1;;;1015:792:45;;;-1:-1:-1;;;;;1015:792:45;;:::i;201:26:83:-;;;:::i;26965:343:39:-;;;;;;;;;;;;;;;;-1:-1:-1;26965:343:39;-1:-1:-1;;;;;26965:343:39;;:::i;:::-;;;;-1:-1:-1;;;;;26965:343:39;;;;;;;;;;;;;;;;;;;;;;;;505:104:83;;;;;;;;;;;;;;;;-1:-1:-1;505:104:83;;:::i;7917:469:39:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7917:469:39;;;;;;;;;;;;;;;;;;;;;;:::i;12245:1028::-;;;:::i;5277:33::-;;;:::i;2261:240:0:-;;;;;;;;;;;;;;;;-1:-1:-1;2261:240:0;-1:-1:-1;;;;;2261:240:0;;:::i;6912:93:39:-;;;:::i;4615:40::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31480:106;31540:7;31562:19;:17;:19::i;:::-;31555:26;;31480:106;:::o;14958:270::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;15112:39:::1;15125:2;15129:13;15144:6;15112:12;:39::i;:::-;15108:116;;;15166:51;::::0;;;;;;;-1:-1:-1;;;;;15166:51:39;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;15108:116;14958:270:::0;;;:::o;32298:200::-;-1:-1:-1;;;;;32298:200:39;-1:-1:-1;;;;32298:200:39:o;17185:617::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;17354:32:::1;17372:13;17354:17;:32::i;:::-;17346:77;;;::::0;;-1:-1:-1;;;17346:77:39;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;17434:20:::0;17430:47:::1;;17464:7;;17430:47;17488:9;17483:253;17503:19:::0;;::::1;17483:253;;;-1:-1:-1::0;;;;;17541:50:39;::::1;;17600:4;17607:2:::0;17611:8;;17620:1;17611:11;;::::1;;;;;17541:82;::::0;;-1:-1:-1;;;;;;17541:82:39::1;::::0;;;;;;-1:-1:-1;;;;;17541:82:39;;::::1;;::::0;::::1;::::0;;;;::::1;::::0;;;;17611:11:::1;;::::0;;;::::1;;17541:82:::0;;;;-1:-1:-1;17541:82:39;;;;;;;-1:-1:-1;;17541:82:39;;;;;;;-1:-1:-1;17541:82:39;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;;;;;17537:186;;;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17680:34;17708:5;17680:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17640:83;17537:186;17524:3;;17483:253;;;-1:-1:-1::0;17747:50:39::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;-1:-1:-1;;;;;17747:50:39;;::::1;::::0;;;::::1;::::0;::::1;::::0;17788:8;;;;17747:50;;;;;;17788:8;;17747:50;::::1;::::0;17788:8;17747:50;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;17747:50:39::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;17747:50:39;;-1:-1:-1;;;;17747:50:39::1;36121:1;17185:617:::0;;;;:::o;232:92:83:-;293:11;:26;232:92::o;15586:263:39:-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;15737:39:::1;15750:2;15754:13;15769:6;15737:12;:39::i;:::-;15733:112;;;15791:47;::::0;;;;;;;-1:-1:-1;;;;;15791:47:39;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;15586:263:::0;;;:::o;31811:166::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;31898:33:39::1;::::0;;-1:-1:-1;;;31898:33:39;;31925:4:::1;31898:33;::::0;::::1;::::0;;;31934:1:::1;::::0;-1:-1:-1;;;;;31898:18:39;::::1;::::0;::::1;::::0;:33;;;;;::::1;::::0;;;;;;;;;:18;:33;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31898:33:39;:37:::1;31894:79;;;31945:21;::::0;;-1:-1:-1;;;31945:21:39;;-1:-1:-1;;;;;31945:21:39;;::::1;;::::0;::::1;::::0;;;:17;;::::1;::::0;::::1;::::0;:21;;;;;-1:-1:-1;;31945:21:39;;;;;;;;-1:-1:-1;31945:17:39;:21;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31894:79;31811:166:::0;;:::o;426:75:83:-;477:19;485:10;477:7;:19::i;:::-;426:75;:::o;5948:860:39:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;-1:-1:-1;;;;;6146:39:39;::::1;6138:86;;;;-1:-1:-1::0;;;6138:86:39::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6263:24:::0;;;6303:54:::1;::::0;::::1;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;6303:54:39::1;-1:-1:-1::0;6293:64:39;;::::1;::::0;:7:::1;::::0;:64:::1;::::0;;::::1;::::0;::::1;:::i;:::-;;6369:9;6364:178;6388:22;6384:1;:26;6364:178;;;6425:40;6468:17;6486:1;6468:20;;;;;;;;;;;;;;6425:63;;6496:39;6516:15;6533:1;6496:19;:39::i;:::-;-1:-1:-1::0;6412:3:39::1;;6364:178;;;;6547:16;:14;:16::i;:::-;6569:24;:22;:24::i;:::-;6599:29;-1:-1:-1::0;;6599:16:39::1;:29::i;:::-;6635:15;:34:::0;;-1:-1:-1;;;;;;6635:34:39::1;-1:-1:-1::0;;;;;6635:34:39;::::1;::::0;;::::1;::::0;;;6675:18:::1;:40:::0;;;6727:76:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;::::1;1778:1:9;1794:14:::0;1790:66;;;-1:-1:-1;;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;-1:-1:-1;;5948:860:39:o;25409:303::-;25537:7;25511:15;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;;;-1:-1:-1;;;35825:92:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;;;25589:50:::1;::::0;;-1:-1:-1;;;25589:50:39;;-1:-1:-1;;;;;25589:50:39;;::::1;;::::0;::::1;::::0;;;25552:91:::1;::::0;25566:4;;25572:15;;25589:44;;::::1;::::0;::::1;::::0;:50;;;;;::::1;::::0;;;;;;;;;:44;:50;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25589:50:39;25641:1:::1;25552:13;:91::i;:::-;-1:-1:-1::0;;;;;;;25656:37:39;;::::1;;::::0;;;:20:::1;:37;::::0;;;;;;;:43;;;::::1;::::0;;;;;;;;:51;-1:-1:-1;;;;;25656:51:39::1;::::0;25409:303::o;13277:314::-;36438:15;;:24;;;-1:-1:-1;;;36438:24:39;;;;13353:7;;;;-1:-1:-1;;;;;36438:15:39;;;;:22;;:24;;;;;;;;;;;;;;;:15;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36438:24:39;;-1:-1:-1;36497:10:39;-1:-1:-1;;;;;36477:30:39;;;36469:65;;;;;-1:-1:-1;;;36469:65:39;;;;;;;;;;;;-1:-1:-1;;;36469:65:39;;;;;;;;;;;;;;;13386:18:::1;::::0;;13369:14:::1;13410:22:::0;;;;13386:18;13457:15:::1;13386:18:::0;13457:7:::1;:15::i;:::-;13438:34;;13479:44;13509:2;13514:8;13479;:6;:8::i;:::-;-1:-1:-1::0;;;;;13479:21:39::1;::::0;;::::1;:44::i;:::-;13535:29;::::0;;;;;;;-1:-1:-1;;;;;13535:29:39;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;13578:8:::0;13277:314;-1:-1:-1;;;;13277:314:39:o;11940:103::-;12018:20;;11940:103;:::o;7465:130::-;7538:4;7557:33;7575:14;7557:17;:33::i;:::-;7550:40;;7465:130;;;;:::o;13917:647::-;36068:13;;-1:-1:-1;;;;;36068:13:39;36044:12;:10;:12::i;:::-;-1:-1:-1;;;;;36044:38:39;;36036:79;;;;;-1:-1:-1;;;36036:79:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36036:79:39;;;;;;;;;;;;;;;14069:15:::1;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;::::0;;-1:-1:-1;;;35825:92:39;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;::::1;;14098:11:::0;14094:38:::2;;14119:7;;14094:38;14156:20;;14146:6;:30;;14138:72;;;::::0;;-1:-1:-1;;;14138:72:39;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;14239:20;::::0;:32:::2;::::0;14264:6;14239:24:::2;:32::i;:::-;14216:20;:55:::0;14278:46:::2;14284:2:::0;14288:6;14296:15;14321:1:::2;14278:5;:46::i;:::-;14331:19;14353:55;14384:15;14401:6;14353:30;:55::i;:::-;14449:48;::::0;;-1:-1:-1;;;14449:48:39;;-1:-1:-1;;;;;14449:48:39;;::::2;;::::0;::::2;::::0;;;14331:77;;-1:-1:-1;14414:97:39::2;::::0;14428:2;;14432:15;;14449:44;;::::2;::::0;::::2;::::0;:48;;;;;::::2;::::0;;;;;;;;;:44;:48;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;14449:48:39;14499:11;14414:13:::2;:97::i;:::-;14523:36;::::0;;;;;;;-1:-1:-1;;;;;14523:36:39;;::::2;::::0;;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;35923:1;36121::::1;13917:647:::0;;;:::o;1967:145:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;2057:6:::1;::::0;2036:40:::1;::::0;2073:1:::1;::::0;-1:-1:-1;;;;;2057:6:0::1;::::0;2036:40:::1;::::0;2073:1;;2036:40:::1;2086:6;:19:::0;;-1:-1:-1;;;;;;2086:19:0::1;::::0;;1967:145::o;5382:27:39:-;;;;:::o;34141:141::-;34228:4;34247:30;34261:15;34247:13;:30::i;19907:306::-;20067:23;20117:91;20151:16;20175:10;20193:9;20117:26;:91::i;:::-;20100:108;19907:306;-1:-1:-1;;;;19907:306:39:o;29377:118::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;29459:31:39::1;29476:13;29459:16;:31::i;10723:1018::-:0;10832:10;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;;;-1:-1:-1;;;35825:92:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;;;-1:-1:-1;;;;;10854:18:39;::::1;::::0;10850:579:::1;;10910:45;::::0;;-1:-1:-1;;;10910:45:39;;-1:-1:-1;;;;;10910:45:39;::::1;;::::0;::::1;::::0;;;10882:25:::1;::::0;10928:10:::1;::::0;10910:39:::1;::::0;:45;;;;;::::1;::::0;;;;;;;;;10928:10;10910:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;10910:45:39;;-1:-1:-1;11014:24:39::1;11041:63;11065:4:::0;11071:10:::1;10910:45:::0;11014:24;11041:23:::1;:63::i;:::-;11014:90:::0;-1:-1:-1;;;;;;11117:10:39;;::::1;::::0;;::::1;;11113:245;;11271:78;11289:10;11301:29;:17:::0;11323:6;11301:21:::1;:29::i;:::-;11332:16;11271:17;:78::i;:::-;11252:97;;11113:245;11366:56;11387:4;11393:10;11405:16;11366:20;:56::i;:::-;10850:579;;;-1:-1:-1::0;;;;;11438:16:39;::::1;::::0;;::::1;::::0;:30:::1;;-1:-1:-1::0;;;;;;11458:10:39;;::::1;::::0;;::::1;;;11438:30;11434:128;;;11508:43;::::0;;-1:-1:-1;;;11508:43:39;;-1:-1:-1;;;;;11508:43:39;::::1;;::::0;::::1;::::0;;;11478:77:::1;::::0;11492:2;;11496:10:::1;::::0;;;11508:39:::1;::::0;:43;;;;;::::1;::::0;;;;;;;;;11496:10;11508:43;::::1;;::::0;::::1;;;;::::0;::::1;11478:77;-1:-1:-1::0;;;;;11599:18:39;::::1;::::0;;::::1;::::0;:58:::1;;-1:-1:-1::0;11629:13:39::1;::::0;-1:-1:-1;;;;;11629:13:39::1;11621:36:::0;::::1;11599:58;11595:142;;;11667:13;::::0;:63:::1;::::0;;-1:-1:-1;;;11667:63:39;;-1:-1:-1;;;;;11667:63:39;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;;11719:10:::1;11667:63:::0;;;;;;:13;;;::::1;::::0;-1:-1:-1;;11667:63:39;;;;;-1:-1:-1;;11667:63:39;;;;;;;-1:-1:-1;11667:13:39;:63;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;10723:1018:::0;;;;:::o;18806:302::-;18950:15;18973:20;19034:69;19073:4;19079:15;19096:6;19034:38;:69::i;:::-;19008:95;;;;-1:-1:-1;18806:302:39;-1:-1:-1;;;;18806:302:39:o;1335:85:0:-;1407:6;;-1:-1:-1;;;;;1407:6:0;;1335:85::o;4710:40:39:-;;;-1:-1:-1;;;;;4710:40:39;;:::o;30219:137::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;30318:33:39::1;30336:14;30318:17;:33::i;4916:43::-:0;;;-1:-1:-1;;;;;4916:43:39;;:::o;31052:110::-;31102:33;31150:7;31143:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31143:14:39;;;-1:-1:-1;31143:14:39;;;;;;;;;;;;;;;;;;;31052:110;:::o;5172:33::-;;;;:::o;18036:430::-;18161:15;;:24;;;-1:-1:-1;;;18161:24:39;;;;18102:7;;;;-1:-1:-1;;;;;18161:15:39;;;;:22;;:24;;;;;;;;;;;;;;;:15;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18161:24:39;;-1:-1:-1;;;;;;18196:30:39;;18192:59;;18243:1;18236:8;;;;;18192:59;18286:42;;;-1:-1:-1;;;18286:42:39;;18322:4;18286:42;;;;;;18256:27;;-1:-1:-1;;;;;18286:27:39;;;;;:42;;;;;;;;;;;;;;;:27;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18286:42:39;;-1:-1:-1;18338:24:39;18334:53;;18379:1;18372:8;;;;;;18334:53;18399:62;18433:6;18441:19;18399:33;:62::i;8890:921::-;9113:7;1753:1:23;2495:7;;:19;;2487:63;;;;;-1:-1:-1;;;2487:63:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;1753:1;2625:7;:18;9083:15:39;35833:56:::1;9083:15:::0;35833:13:::1;:56::i;:::-;35825:92;;;::::0;;-1:-1:-1;;;35825:92:39;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;::::1;;9131:15:::2;9148:20:::0;9172:69:::2;9211:4;9217:15;9234:6;9172:38;:69::i;:::-;9130:111;;;;9266:14;9255:7;:25;;9247:77;;;;-1:-1:-1::0;;;9247:77:39::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9354:48;9366:4;9372:15;9389:12;9354:11;:48::i;:::-;-1:-1:-1::0;;;;;9433:51:39;::::2;;9485:12;:10;:12::i;:::-;9433:79;::::0;;-1:-1:-1;;;;;;9433:79:39::2;::::0;;;;;;-1:-1:-1;;;;;9433:79:39;;::::2;;::::0;::::2;::::0;;;::::2;::::0;;;;;;;;;;;;;;;;-1:-1:-1;;9433:79:39;;;;;;;-1:-1:-1;9433:79:39;;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;9558:21;9582:19;9593:7;9582:6;:10;;:19;;;;:::i;:::-;9558:43;;9607:16;9626:22;9634:13;9626:7;:22::i;:::-;9607:41;;9655:37;9677:4;9683:8;9655;:6;:8::i;:37::-;-1:-1:-1::0;;;;;9704:81:39;;::::2;::::0;;::::2;9722:12;:10;:12::i;:::-;9704:81;::::0;;;;;::::2;::::0;::::2;::::0;;;;;;;;;;;-1:-1:-1;;;;;9704:81:39;;;::::2;::::0;::::2;::::0;;;;;;;::::2;-1:-1:-1::0;;1710:1:23;2798:7;:22;-1:-1:-1;9799:7:39;8890:921;-1:-1:-1;;;;;;8890:921:39:o;26123:455::-;26295:16;35833:56;35872:15;35833:13;:56::i;:::-;35825:92;;;;;-1:-1:-1;;;35825:92:39;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;;;1558:12:0::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;1547:23:0::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;1547:23:0::1;;1539:68;;;::::0;;-1:-1:-1;;;1539:68:0;;::::1;;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;::::1;;26373:114:39::2;::::0;;;;::::2;::::0;;-1:-1:-1;;;;;26373:114:39;;::::2;::::0;;;;;::::2;;::::0;;::::2;::::0;;;-1:-1:-1;;;;;26335:35:39;::::2;-1:-1:-1::0;26335:35:39;;;:17:::2;:35:::0;;;;;:152;;;;;;-1:-1:-1;;26335:152:39;;::::2;::::0;;::::2;;::::0;::::2;::::0;;;::::2;-1:-1:-1::0;;;26335:152:39::2;;::::0;;;26499:74;;;;;;;::::2;::::0;;;;;;;;;;::::2;::::0;;;;;;;;::::2;26123:455:::0;;;;:::o;545:31:45:-;;;-1:-1:-1;;;;;545:31:45;;:::o;7162:74:39:-;7199:7;7221:10;:8;:10::i;1015:792:45:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1264:34:45::1;-1:-1:-1::0;;;;;1264:32:45;::::1;;:34::i;:::-;1256:101;;;;-1:-1:-1::0;;;1256:101:45::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1363:102;1391:16;1415:17;1440:19;1363:20;:102::i;:::-;1471:11;:26:::0;;-1:-1:-1;;;;;;1471:26:45::1;-1:-1:-1::0;;;;;1471:26:45;::::1;::::0;;::::1;::::0;;;1620:46:::1;::::0;;-1:-1:-1;;;1620:46:45::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;1587:80;;-1:-1:-1;;1471:26:45;1620:46;;;1587:80;;::::1;::::0;;1620:46;1587:80;::::1;;;;;;::::0;;;;-1:-1:-1;;1587:80:45;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1567:100;;;1681:9;1673:63;;;;-1:-1:-1::0;;;1673:63:45::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1748:54;::::0;-1:-1:-1;;;;;1748:54:45;::::1;::::0;::::1;::::0;;;::::1;1778:1:9;1794:14:::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1790:66;1015:792:45;;;;;:::o;201:26:83:-;;;;:::o;26965:343:39:-;-1:-1:-1;;;;;27169:34:39;27071:27;27169:34;;;:17;:34;;;;;:54;-1:-1:-1;;;;;27169:54:39;;;;-1:-1:-1;;;27250:53:39;;;;;26965:343::o;505:104:83:-;561:7;583:21;591:12;583:7;:21::i;7917:469:39:-;1753:1:23;2495:7;;:19;;2487:63;;;;;-1:-1:-1;;;2487:63:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;1753:1;2625:7;:18;8090:15:39;35833:56:::1;8090:15:::0;35833:13:::1;:56::i;:::-;35825:92;;;::::0;;-1:-1:-1;;;35825:92:39;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;35825:92:39;;;;;;;;;;;;;::::1;;8127:6:::2;36288:25;36305:7;36288:16;:25::i;:::-;36280:69;;;::::0;;-1:-1:-1;;;36280:69:39;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;8143:16:::3;8162:12;:10;:12::i;:::-;8143:31;;8181:44;8187:2;8191:6;8199:15;8216:8;8181:5;:44::i;:::-;8232:58;8258:8;8276:4;8283:6;8232:8;:6;:8::i;:::-;-1:-1:-1::0;;;;;8232:25:39::3;::::0;;:58;:25:::3;:58::i;:::-;8296:15;8304:6;8296:7;:15::i;:::-;8323:58;::::0;;;;;-1:-1:-1;;;;;8323:58:39;;::::3;;::::0;::::3;::::0;;;;;::::3;::::0;;;::::3;::::0;;;::::3;::::0;::::3;::::0;;;;;;;;;::::3;-1:-1:-1::0;;1710:1:23;2798:7;:22;-1:-1:-1;;;;;7917:469:39:o;12245:1028::-;12316:7;1753:1:23;2495:7;;:19;;2487:63;;;;;-1:-1:-1;;;2487:63:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;1753:1;2625:7;:18;12331:24:39::1;12358:19;:17;:19::i;:::-;12331:46;;12495:22;12520:10;:8;:10::i;:::-;12495:35;;12536:21;12578:16;12561:14;:33;12560:78;;12637:1;12560:78;;;12598:36;:14:::0;12617:16;12598:18:::1;:36::i;:::-;12536:102;;12644:31;12695:20;;12679:13;:36;12678:84;;12761:1;12678:84;;;12737:20;::::0;12719:39:::1;::::0;:13;;:17:::1;:39::i;:::-;12644:118:::0;-1:-1:-1;12773:27:39;;12769:466:::1;;12810:18;12831:44;12851:23;12831:19;:44::i;:::-;12810:65:::0;-1:-1:-1;12887:14:39;;12883:214:::1;;12934:18;::::0;:34:::1;::::0;12957:10;12934:22:::1;:34::i;:::-;12913:18;:55:::0;13004:39:::1;:23:::0;13032:10;13004:27:::1;:39::i;:::-;13058:30;::::0;;;;;;;12978:65;;-1:-1:-1;13058:30:39::1;::::0;;;;;::::1;::::0;;::::1;12883:214;13127:20;::::0;:49:::1;::::0;13152:23;13127:24:::1;:49::i;:::-;13104:20;:72:::0;13190:38:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;12769:466;;13248:20;;13241:27;;;;;;1710:1:23::0;2798:7;:22;12245:1028:39;:::o;5277:33::-;;;;:::o;2261:240:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;2349:22:0;::::1;2341:73;;;;-1:-1:-1::0;;;2341:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2450:6;::::0;2429:38:::1;::::0;-1:-1:-1;;;;;2429:38:0;;::::1;::::0;2450:6:::1;::::0;2429:38:::1;::::0;2450:6:::1;::::0;2429:38:::1;2477:6;:17:::0;;-1:-1:-1;;;;;;2477:17:0::1;-1:-1:-1::0;;;;;2477:17:0;;;::::1;::::0;;;::::1;::::0;;2261:240::o;6912:93:39:-;6961:7;6991:8;:6;:8::i;4615:40::-;;;;;;;;;;;;;-1:-1:-1;;;4615:40:39;;;;;:::o;32597:361::-;32649:7;32664:13;32680:18;;32664:34;;32704:40;32747:7;32704:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32704:50:39;;;-1:-1:-1;32704:50:39;;;;;;;;;;;;-1:-1:-1;;32794:13:39;;32704:50;;-1:-1:-1;32771:20:39;;-1:-1:-1;;;32818:117:39;32841:12;32837:1;:16;32818:117;;;32875:53;32903:6;32910:1;32903:9;;;;;;;;;;;;;;-1:-1:-1;;;;;32885:40:39;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32885:42:39;32875:5;;:9;:53::i;:::-;32867:61;-1:-1:-1;32855:3:39;;32818:117;;;-1:-1:-1;32948:5:39;;-1:-1:-1;;;32597:361:39;:::o;828:104:19:-;915:10;828:104;:::o;15853:343:39:-;15968:4;15990:32;16008:13;15990:17;:32::i;:::-;15982:77;;;;;-1:-1:-1;;;15982:77:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16070:11;16066:44;;-1:-1:-1;16098:5:39;16091:12;;16066:44;16116:57;-1:-1:-1;;;;;16116:45:39;;16162:2;16166:6;16116:45;:57::i;:::-;-1:-1:-1;16187:4:39;15853:343;;;;;;:::o;2212:145:45:-;2340:11;;-1:-1:-1;;;;;2314:38:45;;;2340:11;;2314:38;;;2212:145::o;2893:178::-;2983:11;;2954:54;;-1:-1:-1;;;;;2983:11:45;2997:10;2954:8;:6;:8::i;:::-;-1:-1:-1;;;;;2954:20:45;;;;:54::i;:::-;3014:11;;:52;;;-1:-1:-1;;;3014:52:45;;;;;;;;3060:4;3014:52;;;;;;-1:-1:-1;;;;;3014:11:45;;;;-1:-1:-1;;3014:52:45;;;;;-1:-1:-1;;3014:52:45;;;;;;;;-1:-1:-1;3014:11:45;:52;;;;;;;;;;;;;;;;;;;;;;;;;;1952:123:9;2000:4;2024:44;2062:4;2024:29;:44::i;:::-;2023:45;2016:52;;1952:123;:::o;29798:280:39:-;29908:29;;;-1:-1:-1;;;29908:29:39;;;;29941:4;;-1:-1:-1;;;;;29908:27:39;;;;;:29;;;;;;;;;;;;;;;:27;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29908:29:39;-1:-1:-1;;;;;29908:37:39;;29900:80;;;;;-1:-1:-1;;;29900:80:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;30008:16;29991:7;29999:5;29991:14;;;;;;;;;;;;;;;;:33;;-1:-1:-1;;;;;;29991:33:39;-1:-1:-1;;;;;29991:33:39;;;;;;30035:38;;;;;;;;29991:14;30035:38;29798:280;;:::o;935:126:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;992:26:0::1;:24;:26::i;:::-;1028;:24;:26::i;:::-;1794:14:9::0;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;935:126:0:o;1791:106:23:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1856:34:23::1;:32;:34::i;29499:138:39:-:0;29563:12;:28;;;29602:30;;;;;;;;;;;;;;;;;29499:138;:::o;33600:331::-;33688:4;33700:40;33743:7;33700:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33700:50:39;;;-1:-1:-1;33700:50:39;;;;;;;;;;;;-1:-1:-1;;33788:13:39;;33700:50;;-1:-1:-1;33765:20:39;;-1:-1:-1;;;33808:101:39;33831:12;33827:1;:16;33808:101;;;33861:9;;-1:-1:-1;;;;;33861:28:39;;;:6;;33868:1;;33861:9;;;;;;;;;;;;-1:-1:-1;;;;;33861:28:39;;33858:44;;;33898:4;33891:11;;;;;;;33858:44;33845:3;;33808:101;;;-1:-1:-1;33921:5:39;;33600:331;-1:-1:-1;;;;33600:331:39:o;21947:275::-;22071:146;22099:4;22111:15;22134:77;22158:4;22164:15;22181:22;22205:5;22134:23;:77::i;:::-;22071:20;:146::i;3271:130:45:-;3359:11;;:37;;;-1:-1:-1;;;3359:37:45;;;;;;;;;;-1:-1:-1;;;;;;;3359:11:45;;:23;;:37;;;;;;;;;;;;;;-1:-1:-1;3359:11:45;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3359:37:45;;3271:130;-1:-1:-1;;3271:130:45:o;2634:132::-;2734:11;;:26;;;-1:-1:-1;;;2734:26:45;;;;2684:17;;-1:-1:-1;;;;;2734:11:45;;-1:-1:-1;;2734:26:45;;;;;;;;;;;;;;:11;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2734:26:45;;-1:-1:-1;2634:132:45;:::o;770:186:12:-;890:58;;;-1:-1:-1;;;;;890:58:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;890:58:12;-1:-1:-1;;;890:58:12;;;863:86;;883:5;;863:19;:86::i;3147:155:8:-;3205:7;3237:1;3232;:6;;3224:49;;;;;-1:-1:-1;;;3224:49:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3290:5:8;;;3147:155;;;;;:::o;16533:295:39:-;16646:13;;-1:-1:-1;;;;;16646:13:39;16638:36;16634:125;;16684:13;;:68;;;-1:-1:-1;;;16684:68:39;;-1:-1:-1;;;;;16684:68:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;;;;;:29;;:68;;;;;-1:-1:-1;;16684:68:39;;;;;;;-1:-1:-1;16684:13:39;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16634:125;16764:59;;;-1:-1:-1;;;16764:59:39;;-1:-1:-1;;;;;16764:59:39;;;;;;;;;;;;;;;:47;;;;;;:59;;;;;-1:-1:-1;;16764:59:39;;;;;;;;-1:-1:-1;16764:47:39;:59;;;;;;;;;;19258:269;-1:-1:-1;;;;;19461:34:39;;19362:7;19461:34;;;:17;:34;;;;;:54;19384:138;;19405:6;;19419:97;;19405:6;;-1:-1:-1;;;;;19461:54:39;19419:33;:97::i;:::-;19384:13;:138::i;20592:520::-;-1:-1:-1;;;;;20953:35:39;;20744:23;20953:35;;;:17;:35;;;;;:54;20744:23;;20907:101;;20941:10;;-1:-1:-1;;;20953:54:39;;-1:-1:-1;;;;;20953:54:39;20907:33;:101::i;:::-;20880:128;-1:-1:-1;21018:21:39;21014:50;;21056:1;21049:8;;;;;21014:50;21076:31;:9;21090:16;21076:13;:31::i;:::-;21069:38;20592:520;-1:-1:-1;;;;;20592:520:39:o;22226:598::-;-1:-1:-1;;;;;22445:37:39;;;22368:7;22445:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;22499:25;;22368:7;;22445:43;-1:-1:-1;;;22499:25:39;;;;22494:303;;22547:1;22534:14;;22494:303;;;22569:14;22586:70;22610:4;22616:15;22633:22;22586:23;:70::i;:::-;22744:21;;22569:87;;-1:-1:-1;22677:113:39;;22695:15;;22712:22;;22736:53;;22783:5;;22736:42;;-1:-1:-1;;;;;22744:21:39;22569:87;22736:34;:42::i;:::-;:46;;:53::i;:::-;22677:17;:113::i;:::-;22664:126;;22494:303;;-1:-1:-1;22809:10:39;22226:598;-1:-1:-1;;;;;22226:598:39:o;23848:410::-;-1:-1:-1;;;;;24086:34:39;;23978:7;24086:34;;;:17;:34;;;;;:54;23978:7;;24015:131;;24056:22;;-1:-1:-1;;;;;24086:54:39;24015:33;:131::i;:::-;23993:153;;24172:11;24156:13;:27;24152:75;;;24209:11;24193:27;;24152:75;-1:-1:-1;24240:13:39;;23848:410;-1:-1:-1;;;23848:410:39:o;22828:604::-;-1:-1:-1;;;;;22953:37:39;;;22932:18;22953:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;:51;23057:129;;;;;;;;-1:-1:-1;;;;;22953:51:39;;23057:129;23088:22;:10;:20;:22::i;:::-;-1:-1:-1;;;;;23057:129:39;;;;;23129:25;:14;:12;:14::i;:::-;:23;:25::i;:::-;23057:129;;;;;;23175:4;23057:129;;;;;-1:-1:-1;;;;;23011:37:39;;;-1:-1:-1;23011:37:39;;;:20;:37;;;;;;:43;;;;;;;;;;;:175;;;;;;;;;;;;;-1:-1:-1;;;;;;23011:175:39;;;-1:-1:-1;;;;;23011:175:39;;;;;;;-1:-1:-1;;;;23011:175:39;-1:-1:-1;;;23011:175:39;;;;;;;;;-1:-1:-1;;;;23011:175:39;-1:-1:-1;;;23011:175:39;;;;;;;;;;23197:23;;;23193:235;;;-1:-1:-1;;;;;23235:63:39;;;;;;;23271:26;:10;23286;23271:14;:26::i;:::-;23235:63;;;;;;;;;;;;;;;23193:235;;;23333:10;23320;:23;23316:112;;;-1:-1:-1;;;;;23358:63:39;;;;;;;23394:26;:10;23409;23394:14;:26::i;:::-;23358:63;;;;;;;;;;;;;;;22828:604;;;;:::o;27741:1468::-;27989:50;;;-1:-1:-1;;;27989:50:39;;-1:-1:-1;;;;;27989:50:39;;;;;;;;;27893:20;;;;;;27989:44;;;;;;:50;;;;;;;;;;;;;;;:44;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27989:50:39;;-1:-1:-1;28053:32:39;;;;28045:67;;;;;-1:-1:-1;;;28045:67:39;;;;;;;;;;;;-1:-1:-1;;;28045:67:39;;;;;;;;;;;;;;;28118:63;28132:4;28138:15;28155:22;28179:1;28118:13;:63::i;:::-;28575:24;28602:83;28633:15;28650:34;:22;28677:6;28650:26;:34::i;:::-;28602:30;:83::i;:::-;-1:-1:-1;;;;;28725:37:39;;;28692:23;28725:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;:51;28575:110;;-1:-1:-1;28692:23:39;-1:-1:-1;;;;;28725:51:39;-1:-1:-1;;28721:192:39;;-1:-1:-1;;;;;28832:37:39;;;;;;;:20;:37;;;;;;;;:43;;;;;;;;;:51;28824:82;;-1:-1:-1;;;;;28832:51:39;28889:16;28824:64;:82::i;:::-;28806:100;;28721:192;28989:20;29012:55;29043:15;29060:6;29012:30;:55::i;:::-;28989:78;;29107:12;29089:15;:30;29088:65;;29138:15;29088:65;;;29123:12;29088:65;29073:80;-1:-1:-1;29174:30:39;:12;29073:80;29174:16;:30::i;:::-;29159:45;;27741:1468;;;;;;;;;;:::o;30497:405::-;-1:-1:-1;;;;;30586:37:39;;30578:82;;;;;-1:-1:-1;;;30578:82:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30674:98;-1:-1:-1;;;;;30674:41:39;;-1:-1:-1;;;;;;30674:41:39;:98::i;:::-;30666:142;;;;;-1:-1:-1;;;30666:142:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;30814:13;:30;;-1:-1:-1;;;;;;30814:30:39;-1:-1:-1;;;;;30814:30:39;;;;;;;;30856:41;;;;-1:-1:-1;;30856:41:39;30497:405;:::o;1967:201:26:-;2051:7;;2087:15;:8;2100:1;2087:12;:15::i;:::-;2070:32;-1:-1:-1;2121:17:26;2070:32;1149:4;2121:10;:17::i;21258:289:39:-;-1:-1:-1;;;;;21411:37:39;;;;;;;:20;:37;;;;;;;;:43;;;;;;;;;:51;21403:84;;:72;;-1:-1:-1;;;;;21411:51:39;21468:6;21403:64;:72::i;:::-;:82;:84::i;:::-;-1:-1:-1;;;;;21349:37:39;;;;;;;:20;:37;;;;;;;;:43;;;;;;;;;;;;;:138;;-1:-1:-1;;;;;;21349:138:39;-1:-1:-1;;;;;21349:138:39;;;;;;;;;;;21499:43;;;;;;;21349:37;;21499:43;;;;;;;;;21258:289;;;:::o;2515:115:45:-;2584:11;;:41;;;-1:-1:-1;;;2584:41:45;;2619:4;2584:41;;;;;;-1:-1:-1;;;;;;;2584:11:45;;:26;;:41;;;;;;;;;;;;;;-1:-1:-1;2584:11:45;:41;;;;;;;;;;;;;;;;;;;;;;;;;;737:413:18;1097:20;1135:8;;;737:413::o;33203:189:39:-;33269:4;33281:24;33308:19;:17;:19::i;:::-;33374:12;;33281:46;;-1:-1:-1;33341:29:39;33281:46;33362:7;33341:20;:29::i;:::-;:45;;;33203:189;-1:-1:-1;;;33203:189:39:o;962:214:12:-;1100:68;;;-1:-1:-1;;;;;1100:68:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1100:68:12;-1:-1:-1;;;1100:68:12;;;1073:96;;1093:5;;1073:19;:96::i;2701:175:8:-;2759:7;2790:5;;;2813:6;;;;2805:46;;;;;-1:-1:-1;;;2805:46:8;;;;;;;;;;;;;;;;;;;;;;;;;;;1436:624:12;1812:10;;;1811:62;;-1:-1:-1;1828:39:12;;;-1:-1:-1;;;1828:39:12;;1852:4;1828:39;;;;-1:-1:-1;;;;;1828:39:12;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1828:39:12;:44;1811:62;1803:150;;;;-1:-1:-1;;;1803:150:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1990:62;;;-1:-1:-1;;;;;1990:62:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1990:62:12;-1:-1:-1;;;1990:62:12;;;1963:90;;1983:5;;1963:19;:90::i;759:64:19:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1794:14;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;759:64:19:o;1067:192:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1134:17:0::1;1154:12;:10;:12::i;:::-;1176:6;:18:::0;;-1:-1:-1;;;;;;1176:18:0::1;-1:-1:-1::0;;;;;1176:18:0;::::1;::::0;;::::1;::::0;;;1209:43:::1;::::0;1176:18;;-1:-1:-1;1176:18:0;-1:-1:-1;;1209:43:0::1;::::0;-1:-1:-1;;1209:43:0::1;1778:1:9;1794:14:::0;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;1067:192:0:o;1903:104:23:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1710:1:23::1;1978:7;:22:::0;1790:66:9;;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;1903:104:23:o;3088:762:12:-;3544:69;;;;;;;;;;;;;;;;;;3518:23;;3544:69;;-1:-1:-1;;;;;3544:27:12;;;3572:4;;3544:27;:69::i;:::-;3627:17;;3518:95;;-1:-1:-1;3627:21:12;3623:221;;3767:10;3756:30;;;;;;;;;;;;;;;-1:-1:-1;3756:30:12;3748:85;;;;-1:-1:-1;;;3748:85:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10138:275:39;10227:7;10242:14;10259:71;10293:16;10311:18;;10259:33;:71::i;:::-;10242:88;;10350:6;10340:7;:16;10336:53;;;10376:6;10366:16;;10336:53;-1:-1:-1;10401:7:39;;10138:275;-1:-1:-1;;10138:275:39:o;4228:150:8:-;4286:7;4317:1;4313;:5;4305:44;;;;;-1:-1:-1;;;4305:44:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;4370:1;4366;:5;;;;;;;4228:150;-1:-1:-1;;;4228:150:8:o;24612:558:39:-;-1:-1:-1;;;;;24778:37:39;;;24739:7;24778:37;;;:20;:37;;;;;;;;:43;;;;;;;;;;;:53;-1:-1:-1;;;24778:53:39;;;;;-1:-1:-1;;;24843:55:39;;;;24838:85;;24915:1;24908:8;;;;;24838:85;24929:17;24949:33;24968:13;24949:14;:12;:14::i;:::-;:18;;:33::i;:::-;-1:-1:-1;;;;;25026:34:39;;24988:21;25026:34;;;:17;:34;;;;;:53;24929;;-1:-1:-1;24988:21:39;25012:68;;24929:53;;-1:-1:-1;;;25026:53:39;;-1:-1:-1;;;;;25026:53:39;25012:13;:68::i;:::-;24988:92;;25093:72;25127:22;25151:13;25093:33;:72::i;:::-;25086:79;24612:558;-1:-1:-1;;;;;;;24612:558:39:o;1097:181:24:-;1154:7;-1:-1:-1;;;1181:14:24;;1173:67;;;;-1:-1:-1;;;1173:67:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1265:5:24;1097:181::o;328:94:83:-;406:11;;328:94;:::o;2028:176:24:-;2084:6;-1:-1:-1;2110:13:24;;2102:65;;;;-1:-1:-1;;;2102:65:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1369:286:5;1456:4;1563:23;1578:7;1563:14;:23::i;:::-;:85;;;;;1602:46;1627:7;1636:11;1602:24;:46::i;2266:459:27:-;2324:7;2565:6;2561:45;;-1:-1:-1;2594:1:27;2587:8;;2561:45;2628:5;;;2632:1;2628;:5;:1;2651:5;;;;;:10;2643:56;;;;-1:-1:-1;;;2643:56:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3187:130;3245:7;3271:39;3275:1;3278;3271:39;;;;;;;;;;;;;;;;;:3;:39::i;3592:193:18:-;3695:12;3726:52;3748:6;3756:4;3762:1;3765:12;3726:21;:52::i;757:394:5:-;821:4;1016:55;1041:7;-1:-1:-1;;;1016:24:5;:55::i;:::-;:128;;;;-1:-1:-1;1088:56:5;1113:7;-1:-1:-1;;;;;;1088:24:5;:56::i;:::-;1087:57;;757:394;-1:-1:-1;;757:394:5:o;4243:395::-;4336:4;4515:12;4529:11;4544:50;4573:7;4582:11;4544:28;:50::i;:::-;4514:80;;;;4613:7;:17;;;;-1:-1:-1;4624:6:5;4605:26;-1:-1:-1;;;;4243:395:5:o;3799:272:27:-;3885:7;3919:12;3912:5;3904:28;;;;-1:-1:-1;;;3904:28:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3942:9;3958:1;3954;:5;;;;;;;3799:272;-1:-1:-1;;;;;3799:272:27:o;4619:523:18:-;4746:12;4803:5;4778:21;:30;;4770:81;;;;-1:-1:-1;;;4770:81:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4869:18;4880:6;4869:10;:18::i;:::-;4861:60;;;;;-1:-1:-1;;;4861:60:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;4992:12;5006:23;5033:6;-1:-1:-1;;;;;5033:11:18;5053:5;5061:4;5033:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5033:33:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4991:75;;;;5083:52;5101:7;5110:10;5122:12;5083:17;:52::i;5155:444:5:-;5331:57;;;-1:-1:-1;;;;;;5331:57:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5331:57:5;-1:-1:-1;;;5331:57:5;;;5436:47;;;;-1:-1:-1;;;;5331:57:5;-1:-1:-1;;5302:26:5;;-1:-1:-1;;;;;5436:18:5;;;5461:5;;5331:57;;5436:47;;;;5331:57;5436:47;;;;;;;;;;-1:-1:-1;;5436:47:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5398:85;;;;5513:2;5497:6;:13;:18;5493:45;;;5525:5;5532;5517:21;;;;;;;;;5493:45;5556:7;5576:6;5565:26;;;;;;;;;;;;;;;-1:-1:-1;5565:26:5;5548:44;;-1:-1:-1;5565:26:5;-1:-1:-1;;;;5155:444:5;;;;;;:::o;6122:725:18:-;6237:12;6265:7;6261:580;;;-1:-1:-1;6295:10:18;6288:17;;6261:580;6406:17;;:21;6402:429;;6664:10;6658:17;6724:15;6711:10;6707:2;6703:19;6696:44;6613:145;6796:20;;-1:-1:-1;;;6796:20:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6796:20:18;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "3518800",
                "executionCost": "3941",
                "totalCost": "3522741"
              },
              "external": {
                "VERSION()": "infinite",
                "accountedBalance()": "infinite",
                "award(address,uint256,address)": "infinite",
                "awardBalance()": "1066",
                "awardExternalERC20(address,address,uint256)": "infinite",
                "awardExternalERC721(address,address,uint256[])": "infinite",
                "balance()": "infinite",
                "balanceOfCredit(address,address)": "infinite",
                "beforeTokenTransfer(address,address,uint256)": "infinite",
                "calculateEarlyExitFee(address,address,uint256)": "infinite",
                "calculateReserveFee(uint256)": "infinite",
                "canAwardExternal(address)": "1234",
                "captureAwardBalance()": "infinite",
                "compLikeDelegate(address,address)": "infinite",
                "creditPlanOf(address)": "1357",
                "currentTime()": "1087",
                "depositTo(address,uint256,address,address)": "infinite",
                "estimateCreditAccrualTime(address,uint256,uint256)": "infinite",
                "initialize(address,address[],uint256)": "infinite",
                "initializeYieldSourcePrizePool(address,address[],uint256,address)": "infinite",
                "isControlled(address)": "infinite",
                "liquidityCap()": "1043",
                "maxExitFeeMantissa()": "1043",
                "onERC721Received(address,address,uint256,bytes)": "629",
                "owner()": "1083",
                "prizeStrategy()": "1149",
                "redeem(uint256)": "infinite",
                "renounceOwnership()": "infinite",
                "reserveRegistry()": "1105",
                "reserveTotalSupply()": "1086",
                "setCreditPlanOf(address,uint128,uint128)": "infinite",
                "setCurrentTime(uint256)": "20324",
                "setLiquidityCap(uint256)": "infinite",
                "setPrizeStrategy(address)": "infinite",
                "supply(uint256)": "infinite",
                "token()": "infinite",
                "tokens()": "infinite",
                "transferExternalERC20(address,address,uint256)": "infinite",
                "transferOwnership(address)": "infinite",
                "withdrawInstantlyFrom(address,uint256,address,uint256)": "infinite",
                "withdrawReserve(address)": "infinite",
                "yieldSource()": "1170"
              },
              "internal": {
                "_currentTime()": "815"
              }
            },
            "methodIdentifiers": {
              "VERSION()": "ffa1ad74",
              "accountedBalance()": "0937eb54",
              "award(address,uint256,address)": "6b1b863a",
              "awardBalance()": "630665b4",
              "awardExternalERC20(address,address,uint256)": "2b0ab144",
              "awardExternalERC721(address,address,uint256[])": "16960d55",
              "balance()": "b69ef8a8",
              "balanceOfCredit(address,address)": "494de9f7",
              "beforeTokenTransfer(address,address,uint256)": "7cbab1c7",
              "calculateEarlyExitFee(address,address,uint256)": "888c2b6f",
              "calculateReserveFee(uint256)": "9fe32a91",
              "canAwardExternal(address)": "6a3fd4f9",
              "captureAwardBalance()": "e6d8a94b",
              "compLikeDelegate(address,address)": "2f7627e3",
              "creditPlanOf(address)": "d4a1361d",
              "currentTime()": "d18e81b3",
              "depositTo(address,uint256,address,address)": "e323f825",
              "estimateCreditAccrualTime(address,uint256,uint256)": "79cb8563",
              "initialize(address,address[],uint256)": "3ede50c6",
              "initializeYieldSourcePrizePool(address,address[],uint256,address)": "cfa24007",
              "isControlled(address)": "78b3d327",
              "liquidityCap()": "76687d3d",
              "maxExitFeeMantissa()": "9e167519",
              "onERC721Received(address,address,uint256,bytes)": "150b7a02",
              "owner()": "8da5cb5b",
              "prizeStrategy()": "98bf3eb6",
              "redeem(uint256)": "db006a75",
              "renounceOwnership()": "715018a6",
              "reserveRegistry()": "8e71c1f6",
              "reserveTotalSupply()": "edb4e1cf",
              "setCreditPlanOf(address,uint128,uint128)": "a7b2cc31",
              "setCurrentTime(uint256)": "22f8e566",
              "setLiquidityCap(uint256)": "7b99adb1",
              "setPrizeStrategy(address)": "91ca480e",
              "supply(uint256)": "35403023",
              "token()": "fc0c546a",
              "tokens()": "9d63848a",
              "transferExternalERC20(address,address,uint256)": "13f55e39",
              "transferOwnership(address)": "f2fde38b",
              "withdrawInstantlyFrom(address,uint256,address,uint256)": "a016240b",
              "withdrawReserve(address)": "52a387ab",
              "yieldSource()": "b2470e5c"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"AwardCaptured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Awarded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"AwardedExternalERC20\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"AwardedExternalERC721\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract ControlledTokenInterface\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"ControlledTokenAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CreditBurned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CreditMinted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"creditLimitMantissa\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"creditRateMantissa\",\"type\":\"uint128\"}],\"name\":\"CreditPlanSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ErrorAwardingExternalERC721\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"reserveRegistry\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxExitFeeMantissa\",\"type\":\"uint256\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"redeemed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"exitFee\",\"type\":\"uint256\"}],\"name\":\"InstantWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"liquidityCap\",\"type\":\"uint256\"}],\"name\":\"LiquidityCapSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"prizeStrategy\",\"type\":\"address\"}],\"name\":\"PrizeStrategySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ReserveFeeCaptured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ReserveWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TransferredExternalERC20\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"yieldSource\",\"type\":\"address\"}],\"name\":\"YieldSourcePrizePoolInitialized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accountedBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"award\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"awardBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"awardExternalERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenIds\",\"type\":\"uint256[]\"}],\"name\":\"awardExternalERC721\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"balance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"balanceOfCredit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"beforeTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"calculateEarlyExitFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"exitFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"burnedCredit\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"calculateReserveFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_externalToken\",\"type\":\"address\"}],\"name\":\"canAwardExternal\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"captureAwardBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ICompLike\",\"name\":\"compLike\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"compLikeDelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"creditPlanOf\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"creditLimitMantissa\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"creditRateMantissa\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"}],\"name\":\"depositTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_principal\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_interest\",\"type\":\"uint256\"}],\"name\":\"estimateCreditAccrualTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"durationSeconds\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"_reserveRegistry\",\"type\":\"address\"},{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"_controlledTokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_maxExitFeeMantissa\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"_reserveRegistry\",\"type\":\"address\"},{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"_controlledTokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_maxExitFeeMantissa\",\"type\":\"uint256\"},{\"internalType\":\"contract IYieldSource\",\"name\":\"_yieldSource\",\"type\":\"address\"}],\"name\":\"initializeYieldSourcePrizePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ControlledTokenInterface\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"isControlled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"liquidityCap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxExitFeeMantissa\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prizeStrategy\",\"outputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"redeemAmount\",\"type\":\"uint256\"}],\"name\":\"redeem\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reserveRegistry\",\"outputs\":[{\"internalType\":\"contract RegistryInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reserveTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"_creditRateMantissa\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"_creditLimitMantissa\",\"type\":\"uint128\"}],\"name\":\"setCreditPlanOf\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_currentTime\",\"type\":\"uint256\"}],\"name\":\"setCurrentTime\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_liquidityCap\",\"type\":\"uint256\"}],\"name\":\"setLiquidityCap\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract TokenListenerInterface\",\"name\":\"_prizeStrategy\",\"type\":\"address\"}],\"name\":\"setPrizeStrategy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"mintAmount\",\"type\":\"uint256\"}],\"name\":\"supply\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokens\",\"outputs\":[{\"internalType\":\"contract ControlledTokenInterface[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"externalToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferExternalERC20\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maximumExitFee\",\"type\":\"uint256\"}],\"name\":\"withdrawInstantlyFrom\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawReserve\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"yieldSource\",\"outputs\":[{\"internalType\":\"contract IYieldSource\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"accountedBalance()\":{\"returns\":{\"_0\":\"The current total of all tokens\"}},\"award(address,uint256,address)\":{\"details\":\"The amount awarded must be less than the awardBalance()\",\"params\":{\"amount\":\"The amount of assets to be awarded\",\"controlledToken\":\"The address of the asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"awardBalance()\":{\"details\":\"captureAwardBalance() should be called first\",\"returns\":{\"_0\":\"The total amount of assets to be awarded for the current prize\"}},\"awardExternalERC20(address,address,uint256)\":{\"details\":\"Used to award any arbitrary tokens held by the Prize Pool\",\"params\":{\"amount\":\"The amount of external assets to be awarded\",\"externalToken\":\"The address of the external asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"awardExternalERC721(address,address,uint256[])\":{\"details\":\"Used to award any arbitrary NFTs held by the Prize Pool\",\"params\":{\"externalToken\":\"The address of the external NFT token being awarded\",\"to\":\"The address of the winner that receives the award\",\"tokenIds\":\"An array of NFT Token IDs to be transferred\"}},\"balance()\":{\"details\":\"Returns the total underlying balance of all assets. This includes both principal and interest.\",\"returns\":{\"_0\":\"The underlying balance of assets\"}},\"balanceOfCredit(address,address)\":{\"params\":{\"user\":\"The user whose credit balance should be returned\"},\"returns\":{\"_0\":\"The balance of the users credit\"}},\"beforeTokenTransfer(address,address,uint256)\":{\"params\":{\"amount\":\"The amount of tokens being trasferred\",\"from\":\"The address the tokens are being transferred from (0 if minting)\",\"to\":\"The address the tokens are being transferred to (0 if burning)\"}},\"calculateEarlyExitFee(address,address,uint256)\":{\"params\":{\"amount\":\"The amount of collateral to be withdrawn\",\"controlledToken\":\"The type of collateral being withdrawn\",\"from\":\"The user who is withdrawing\"},\"returns\":{\"burnedCredit\":\"The user's credit that was burned\",\"exitFee\":\"The exit fee\"}},\"calculateReserveFee(uint256)\":{\"params\":{\"amount\":\"The prize amount\"},\"returns\":{\"_0\":\"The size of the reserve portion of the prize\"}},\"canAwardExternal(address)\":{\"details\":\"Checks with the Prize Pool if a specific token type may be awarded as an external prize\",\"params\":{\"_externalToken\":\"The address of the token to check\"},\"returns\":{\"_0\":\"True if the token may be awarded, false otherwise\"}},\"captureAwardBalance()\":{\"details\":\"This function also captures the reserve fees.\",\"returns\":{\"_0\":\"The total amount of assets to be awarded for the current prize\"}},\"compLikeDelegate(address,address)\":{\"params\":{\"compLike\":\"The COMP-like token held by the prize pool that should be delegated\",\"to\":\"The address to delegate to \"}},\"creditPlanOf(address)\":{\"params\":{\"controlledToken\":\"The controlled token to retrieve the credit rates for\"},\"returns\":{\"creditLimitMantissa\":\"The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\",\"creditRateMantissa\":\"The credit rate. This is the amount of tokens that accrue per second.\"}},\"depositTo(address,uint256,address,address)\":{\"params\":{\"amount\":\"The amount of assets to deposit\",\"controlledToken\":\"The address of the type of token the user is minting\",\"referrer\":\"The referrer of the deposit\",\"to\":\"The address receiving the newly minted tokens\"}},\"estimateCreditAccrualTime(address,uint256,uint256)\":{\"params\":{\"_interest\":\"The amount of interest that must accrue\",\"_principal\":\"The principal amount on which interest is accruing\"},\"returns\":{\"durationSeconds\":\"The duration of time it will take to accrue the given amount of interest, in seconds.\"}},\"initialize(address,address[],uint256)\":{\"params\":{\"_controlledTokens\":\"Array of ControlledTokens that are controlled by this Prize Pool.\",\"_maxExitFeeMantissa\":\"The maximum exit fee size\"}},\"initializeYieldSourcePrizePool(address,address[],uint256,address)\":{\"params\":{\"_controlledTokens\":\"Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\",\"_maxExitFeeMantissa\":\"The maximum exit fee size, relative to the withdrawal amount\",\"_yieldSource\":\"Address of the yield source\"}},\"isControlled(address)\":{\"details\":\"Checks if a specific token is controlled by the Prize Pool\",\"params\":{\"controlledToken\":\"The address of the token to check\"},\"returns\":{\"_0\":\"True if the token is a controlled token, false otherwise\"}},\"onERC721Received(address,address,uint256,bytes)\":{\"params\":{\"data\":\"Additional data with no specified format, sent in call to `_to`.\",\"from\":\"The current owner of the NFT\",\"operator\":\"The address that acts on behalf of the owner\",\"tokenId\":\"The NFT to transfer\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setCreditPlanOf(address,uint128,uint128)\":{\"params\":{\"_controlledToken\":\"The controlled token for whom to set the credit plan\",\"_creditLimitMantissa\":\"The credit limit to set.  Is a fixed point 18 decimal (like Ether).\",\"_creditRateMantissa\":\"The credit rate to set.  Is a fixed point 18 decimal (like Ether).\"}},\"setLiquidityCap(uint256)\":{\"params\":{\"_liquidityCap\":\"The new liquidity cap for the prize pool\"}},\"setPrizeStrategy(address)\":{\"params\":{\"_prizeStrategy\":\"The new prize strategy\"}},\"token()\":{\"details\":\"Returns the address of the underlying ERC20 asset\",\"returns\":{\"_0\":\"The address of the asset\"}},\"tokens()\":{\"returns\":{\"_0\":\"An array of controlled token addresses\"}},\"transferExternalERC20(address,address,uint256)\":{\"details\":\"Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\",\"params\":{\"amount\":\"The amount of external assets to be awarded\",\"externalToken\":\"The address of the external asset token being awarded\",\"to\":\"The address of the winner that receives the award\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"withdrawInstantlyFrom(address,uint256,address,uint256)\":{\"params\":{\"amount\":\"The amount of tokens to redeem for assets.\",\"controlledToken\":\"The address of the token to redeem (i.e. ticket or sponsorship)\",\"from\":\"The address to redeem tokens from.\",\"maximumExitFee\":\"The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\"},\"returns\":{\"_0\":\"The actual exit fee paid\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"VERSION()\":{\"notice\":\"Semver Version\"},\"accountedBalance()\":{\"notice\":\"The total of all controlled tokens\"},\"award(address,uint256,address)\":{\"notice\":\"Called by the prize strategy to award prizes.\"},\"awardBalance()\":{\"notice\":\"Returns the balance that is available to award.\"},\"awardExternalERC20(address,address,uint256)\":{\"notice\":\"Called by the Prize-Strategy to award external ERC20 prizes\"},\"awardExternalERC721(address,address,uint256[])\":{\"notice\":\"Called by the prize strategy to award external ERC721 prizes\"},\"balanceOfCredit(address,address)\":{\"notice\":\"Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\"},\"beforeTokenTransfer(address,address,uint256)\":{\"notice\":\"Updates the Prize Strategy when tokens are transferred between holders.\"},\"calculateEarlyExitFee(address,address,uint256)\":{\"notice\":\"Calculates the early exit fee for the given amount\"},\"calculateReserveFee(uint256)\":{\"notice\":\"Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\"},\"captureAwardBalance()\":{\"notice\":\"Captures any available interest as award balance.\"},\"compLikeDelegate(address,address)\":{\"notice\":\"Delegate the votes for a Compound COMP-like token held by the prize pool\"},\"creditPlanOf(address)\":{\"notice\":\"Returns the credit rate of a controlled token\"},\"depositTo(address,uint256,address,address)\":{\"notice\":\"Deposit assets into the Prize Pool in exchange for tokens\"},\"estimateCreditAccrualTime(address,uint256,uint256)\":{\"notice\":\"Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\"},\"initialize(address,address[],uint256)\":{\"notice\":\"Initializes the Prize Pool\"},\"initializeYieldSourcePrizePool(address,address[],uint256,address)\":{\"notice\":\"Initializes the Prize Pool and Yield Service with the required contract connections\"},\"onERC721Received(address,address,uint256,bytes)\":{\"notice\":\"Required for ERC721 safe token transfers from smart contracts.\"},\"setCreditPlanOf(address,uint128,uint128)\":{\"notice\":\"Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\"},\"setLiquidityCap(uint256)\":{\"notice\":\"Allows the Governor to set a cap on the amount of liquidity that he pool can hold\"},\"setPrizeStrategy(address)\":{\"notice\":\"Sets the prize strategy of the prize pool.  Only callable by the owner.\"},\"tokens()\":{\"notice\":\"An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\"},\"transferExternalERC20(address,address,uint256)\":{\"notice\":\"Called by the Prize-Strategy to transfer out external ERC20 tokens\"},\"withdrawInstantlyFrom(address,uint256,address,uint256)\":{\"notice\":\"Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/YieldSourcePrizePoolHarness.sol\":\"YieldSourcePrizePoolHarness\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"@pooltogether/yield-source-interface/contracts/IYieldSource.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.4.0 <0.8.0;\\n\\n/// @title Defines the functions used to interact with a yield source.  The Prize Pool inherits this contract.\\n/// @notice Prize Pools subclasses need to implement this interface so that yield can be generated.\\ninterface IYieldSource {\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function depositToken() external view returns (address);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function balanceOfToken(address addr) external returns (uint256);\\n\\n  /// @notice Supplies tokens to the yield source.  Allows assets to be supplied on other user's behalf using the `to` param.\\n  /// @param amount The amount of `token()` to be supplied\\n  /// @param to The user whose balance will receive the tokens\\n  function supplyTokenTo(uint256 amount, address to) external;\\n\\n  /// @notice Redeems tokens from the yield source.\\n  /// @param amount The amount of `token()` to withdraw.  Denominated in `token()` as above.\\n  /// @return The actual amount of tokens that were redeemed.\\n  function redeemToken(uint256 amount) external returns (uint256);\\n\\n}\\n\",\"keccak256\":\"0xee862089c29ec1f9b2a1df7c01953d88ef5dfcfb2c2198e8926f692ec76537f1\",\"license\":\"MIT\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../external/compound/ICompLike.sol\\\";\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../reserve/ReserveInterface.sol\\\";\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/TokenListenerLibrary.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\nimport \\\"./PrizePoolInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using SafeERC20Upgradeable for IERC721Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    address reserveRegistry,\\n    uint256 maxExitFeeMantissa\\n  );\\n\\n  /// @dev Event emitted when controlled token is added\\n  event ControlledTokenAdded(\\n    ControlledTokenInterface indexed token\\n  );\\n\\n  /// @dev Emitted when reserve is captured.\\n  event ReserveFeeCaptured(\\n    uint256 amount\\n  );\\n\\n  event AwardCaptured(\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when assets are deposited\\n  event Deposited(\\n    address indexed operator,\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount,\\n    address referrer\\n  );\\n\\n  /// @dev Event emitted when interest is awarded to a winner\\n  event Awarded(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are awarded to a winner\\n  event AwardedExternalERC20(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are transferred out\\n  event TransferredExternalERC20(\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC721s are awarded to a winner\\n  event AwardedExternalERC721(\\n    address indexed winner,\\n    address indexed token,\\n    uint256[] tokenIds\\n  );\\n\\n  /// @dev Event emitted when assets are withdrawn instantly\\n  event InstantWithdrawal(\\n    address indexed operator,\\n    address indexed from,\\n    address indexed token,\\n    uint256 amount,\\n    uint256 redeemed,\\n    uint256 exitFee\\n  );\\n\\n  event ReserveWithdrawal(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when the Liquidity Cap is set\\n  event LiquidityCapSet(\\n    uint256 liquidityCap\\n  );\\n\\n  /// @dev Event emitted when the Credit plan is set\\n  event CreditPlanSet(\\n    address token,\\n    uint128 creditLimitMantissa,\\n    uint128 creditRateMantissa\\n  );\\n\\n  /// @dev Event emitted when the Prize Strategy is set\\n  event PrizeStrategySet(\\n    address indexed prizeStrategy\\n  );\\n\\n  /// @dev Emitted when credit is minted\\n  event CreditMinted(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when credit is burned\\n  event CreditBurned(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\\n  event ErrorAwardingExternalERC721(bytes error);\\n\\n\\n  struct CreditPlan {\\n    uint128 creditLimitMantissa;\\n    uint128 creditRateMantissa;\\n  }\\n\\n  struct CreditBalance {\\n    uint192 balance;\\n    uint32 timestamp;\\n    bool initialized;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  /// @dev Reserve to which reserve fees are sent\\n  RegistryInterface public reserveRegistry;\\n\\n  /// @dev An array of all the controlled tokens\\n  ControlledTokenInterface[] internal _tokens;\\n\\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\\n  TokenListenerInterface public prizeStrategy;\\n\\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\\n  /// For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\\n  uint256 public maxExitFeeMantissa;\\n\\n  /// @dev The total funds that have been allocated to the reserve\\n  uint256 public reserveTotalSupply;\\n\\n  /// @dev The total amount of funds that the prize pool can hold.\\n  uint256 public liquidityCap;\\n\\n  /// @dev the The awardable balance\\n  uint256 internal _currentAwardBalance;\\n\\n  /// @dev Stores the credit plan for each token.\\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\\n\\n  /// @dev Stores each users balance of credit per token.\\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\\n\\n  /// @notice Initializes the Prize Pool\\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\\n  /// @param _maxExitFeeMantissa The maximum exit fee size\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_reserveRegistry) != address(0), \\\"PrizePool/reserveRegistry-not-zero\\\");\\n    uint256 controlledTokensLength = _controlledTokens.length;\\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\\n\\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\\n      _addControlledToken(controlledToken, i);\\n    }\\n    __Ownable_init();\\n    __ReentrancyGuard_init();\\n    _setLiquidityCap(uint256(-1));\\n\\n    reserveRegistry = _reserveRegistry;\\n    maxExitFeeMantissa = _maxExitFeeMantissa;\\n\\n    emit Initialized(\\n      address(_reserveRegistry),\\n      maxExitFeeMantissa\\n    );\\n  }\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external override view returns (address) {\\n    return address(_token());\\n  }\\n\\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\\n  /// @return The underlying balance of assets\\n  function balance() external returns (uint256) {\\n    return _balance();\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function canAwardExternal(address _externalToken) external view returns (bool) {\\n    return _canAwardExternal(_externalToken);\\n  }\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    canAddLiquidity(amount)\\n  {\\n    address operator = _msgSender();\\n\\n    _mint(to, amount, controlledToken, referrer);\\n\\n    _token().safeTransferFrom(operator, address(this), amount);\\n    _supply(amount);\\n\\n    emit Deposited(operator, to, controlledToken, amount, referrer);\\n  }\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    returns (uint256)\\n  {\\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n    require(exitFee <= maximumExitFee, \\\"PrizePool/exit-fee-exceeds-user-maximum\\\");\\n\\n    // burn the credit\\n    _burnCredit(from, controlledToken, burnedCredit);\\n\\n    // burn the tickets\\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\\n\\n    // redeem the tickets less the fee\\n    uint256 amountLessFee = amount.sub(exitFee);\\n    uint256 redeemed = _redeem(amountLessFee);\\n\\n    _token().safeTransfer(from, redeemed);\\n\\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\\n\\n    return exitFee;\\n  }\\n\\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\\n  /// @param exitFee The exit fee to check against the limit\\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\\n    if (exitFee > maxFee) {\\n      exitFee = maxFee;\\n    }\\n    return exitFee;\\n  }\\n\\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\\n  /// @param from The address the tokens are being transferred from (0 if minting)\\n  /// @param to The address the tokens are being transferred to (0 if burning)\\n  /// @param amount The amount of tokens being trasferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\\n    if (from != address(0)) {\\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\\n      // first accrue credit for their old balance\\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\\n\\n      if (from != to) {\\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\\n      }\\n\\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\\n    }\\n    if (to != address(0) && to != from) {\\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\\n    }\\n    // if we aren't minting\\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\\n    }\\n  }\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external override view returns (uint256) {\\n    return _currentAwardBalance;\\n  }\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n\\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\\n    uint256 currentBalance = _balance();\\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\\n\\n    if (unaccountedPrizeBalance > 0) {\\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\\n      if (reserveFee > 0) {\\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\\n        emit ReserveFeeCaptured(reserveFee);\\n      }\\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\\n\\n      emit AwardCaptured(unaccountedPrizeBalance);\\n    }\\n\\n    return _currentAwardBalance;\\n  }\\n\\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\\n\\n    uint256 amount = reserveTotalSupply;\\n    reserveTotalSupply = 0;\\n    uint256 redeemed = _redeem(amount);\\n\\n    _token().safeTransfer(address(to), redeemed);\\n\\n    emit ReserveWithdrawal(to, amount);\\n\\n    return redeemed;\\n  }\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external override\\n    onlyPrizeStrategy\\n    onlyControlledToken(controlledToken)\\n  {\\n    if (amount == 0) {\\n      return;\\n    }\\n\\n    require(amount <= _currentAwardBalance, \\\"PrizePool/award-exceeds-avail\\\");\\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\\n\\n    _mint(to, amount, controlledToken, address(0));\\n\\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\\n\\n    emit Awarded(to, controlledToken, amount);\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit TransferredExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit AwardedExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  function _transferOut(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (bool)\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (amount == 0) {\\n      return false;\\n    }\\n\\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\\n\\n    return true;\\n  }\\n\\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\\n  /// @param to The user who is receiving the tokens\\n  /// @param amount The amount of tokens they are receiving\\n  /// @param controlledToken The token that is going to be minted\\n  /// @param referrer The user who referred the minting\\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\\n    if (address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n    ControlledToken(controlledToken).controllerMint(to, amount);\\n  }\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (tokenIds.length == 0) {\\n      return;\\n    }\\n\\n    for (uint256 i = 0; i < tokenIds.length; i++) {\\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\\n\\n      }\\n      catch(bytes memory error){\\n        emit ErrorAwardingExternalERC721(error);\\n      }\\n      \\n    }\\n\\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\\n  }\\n\\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\\n  /// @param amount The prize amount\\n  /// @return The size of the reserve portion of the prize\\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    if (address(reserve) == address(0)) {\\n      return 0;\\n    }\\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\\n    if (reserveRateMantissa == 0) {\\n      return 0;\\n    }\\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\\n  }\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external override\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    )\\n  {\\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n  }\\n\\n  /// @dev Calculates the early exit fee for the given amount\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return Exit fee\\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\\n    return _limitExitFee(\\n      amount,\\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external override\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    durationSeconds =_estimateCreditAccrualTime(\\n      _controlledToken,\\n      _principal,\\n      _interest\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function _estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    internal\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    // interest = credit rate * principal * time\\n    // => time = interest / (credit rate * principal)\\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\\n    if (accruedPerSecond == 0) {\\n      return 0;\\n    }\\n    return _interest.div(accruedPerSecond);\\n  }\\n\\n  /// @notice Burns a users credit.\\n  /// @param user The user whose credit should be burned\\n  /// @param credit The amount of credit to burn\\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\\n\\n    emit CreditBurned(user, controlledToken, credit);\\n  }\\n\\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\\n  /// @param user The user for whom to accrue credit\\n  /// @param controlledToken The controlled token whose balance we are checking\\n  /// @param controlledTokenBalance The balance to use for the user\\n  /// @param extra Additional credit to be added\\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\\n    _updateCreditBalance(\\n      user,\\n      controlledToken,\\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\\n    );\\n  }\\n\\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\\n    uint256 newBalance;\\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\\n    if (!creditBalance.initialized) {\\n      newBalance = 0;\\n    } else {\\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\\n    }\\n    return newBalance;\\n  }\\n\\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\\n\\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\\n      balance: newBalance.toUint128(),\\n      timestamp: _currentTime().toUint32(),\\n      initialized: true\\n    });\\n\\n    if (oldBalance < newBalance) {\\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\\n    } \\n    else if (newBalance < oldBalance) {\\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\\n    }\\n  }\\n\\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\\n  /// @param creditBalance The new credit balance to be checked\\n  /// @return The users new credit balance.  Will not exceed the credit limit.\\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\\n      controlledTokenBalance,\\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\\n    );\\n    if (creditBalance > creditLimit) {\\n      creditBalance = creditLimit;\\n    }\\n\\n    return creditBalance;\\n  }\\n\\n  /// @notice Calculates the accrued interest for a user\\n  /// @param user The user whose credit should be calculated.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\\n  /// @return The credit that has accrued since the last credit update.\\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\\n\\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\\n      return 0;\\n    }\\n\\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\\n  }\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\\n    return _tokenCreditBalances[controlledToken][user].balance;\\n  }\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external override\\n    onlyControlledToken(_controlledToken)\\n    onlyOwner\\n  {\\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\\n      creditLimitMantissa: _creditLimitMantissa,\\n      creditRateMantissa: _creditRateMantissa\\n    });\\n\\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\\n  }\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external override\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    )\\n  {\\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\\n  }\\n\\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The token they are withdrawing\\n  /// @param amount The amount of funds they are withdrawing\\n  /// @return earlyExitFee The additional exit fee that should be charged.\\n  /// @return creditBurned The amount of credit that will be burned\\n  function _calculateEarlyExitFeeLessBurnedCredit(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (\\n      uint256 earlyExitFee,\\n      uint256 creditBurned\\n    )\\n  {\\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\\n    require(controlledTokenBalance >= amount, \\\"PrizePool/insuff-funds\\\");\\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\\n    /*\\n    The credit is used *last*.  Always charge the fees up-front.\\n\\n    How to calculate:\\n\\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\\n\\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\\n    */\\n\\n    // Determine available usable credit based on withdraw amount\\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\\n\\n    uint256 availableCredit;\\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\\n    }\\n\\n    // Determine amount of credit to burn and amount of fees required\\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\\n    earlyExitFee = totalExitFee.sub(creditBurned);\\n  }\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\\n    _setLiquidityCap(_liquidityCap);\\n  }\\n\\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\\n    liquidityCap = _liquidityCap;\\n    emit LiquidityCapSet(_liquidityCap);\\n  }\\n\\n  /// @notice Adds a new controlled token\\n  /// @param _controlledToken The controlled token to add.\\n  /// @param index The index to add the controlledToken\\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\\n    require(_controlledToken.controller() == this, \\\"PrizePool/token-ctrlr-mismatch\\\");\\n    \\n    _tokens[index] = _controlledToken;\\n    emit ControlledTokenAdded(_controlledToken);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\\n    _setPrizeStrategy(_prizeStrategy);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\\n    require(address(_prizeStrategy) != address(0), \\\"PrizePool/prizeStrategy-not-zero\\\");\\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PrizePool/prizeStrategy-invalid\\\");\\n    prizeStrategy = _prizeStrategy;\\n\\n    emit PrizeStrategySet(address(_prizeStrategy));\\n  }\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\\n    return _tokens;\\n  }\\n\\n  /// @dev Gets the current time as represented by the current block\\n  /// @return The timestamp of the current block\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external override view returns (uint256) {\\n    return _tokenTotalSupply();\\n  }\\n\\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\\n  /// @param to The address to delegate to \\n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\\n    if (compLike.balanceOf(address(this)) > 0) {\\n      compLike.delegate(to);\\n    }\\n  }\\n  \\n  /// @notice Required for ERC721 safe token transfers from smart contracts.\\n  /// @param operator The address that acts on behalf of the owner\\n  /// @param from The current owner of the NFT\\n  /// @param tokenId The NFT to transfer\\n  /// @param data Additional data with no specified format, sent in call to `_to`.\\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function _tokenTotalSupply() internal view returns (uint256) {\\n    uint256 total = reserveTotalSupply;\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \\n    uint256 tokensLength = tokens.length;\\n    \\n    for(uint256 i = 0; i < tokensLength; i++){\\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\\n    }\\n\\n    return total;\\n  }\\n\\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\\n  }\\n\\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\\n    uint256 tokensLength = tokens.length;\\n\\n    for(uint256 i = 0; i < tokensLength; i++) {\\n      if(tokens[i] == controlledToken) return true;\\n    }\\n    return false;\\n  }\\n  \\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\\n    return _isControlled(controlledToken);\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function _token() internal virtual view returns (IERC20Upgradeable);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal virtual returns (uint256);\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal virtual;\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\\n\\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  modifier onlyControlledToken(address controlledToken) {\\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \\\"PrizePool/unknown-token\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure caller is the prize-strategy\\n  modifier onlyPrizeStrategy() {\\n    require(_msgSender() == address(prizeStrategy), \\\"PrizePool/only-prizeStrategy\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\\n  modifier canAddLiquidity(uint256 _amount) {\\n    require(_canAddLiquidity(_amount), \\\"PrizePool/exceeds-liquidity-cap\\\");\\n    _;\\n  }\\n\\n  modifier onlyReserve() {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    require(address(reserve) == msg.sender, \\\"PrizePool/only-reserve\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x386ebc1c80ab4424f14125e716dd12641ff933b475bf1082b7b1a6eee4a969c3\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/yield-source/YieldSourcePrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\\\";\\n\\nimport \\\"@pooltogether/yield-source-interface/contracts/IYieldSource.sol\\\";\\n\\nimport \\\"../PrizePool.sol\\\";\\n\\ncontract YieldSourcePrizePool is PrizePool {\\n\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using AddressUpgradeable for address;\\n\\n  IYieldSource public yieldSource;\\n\\n  event YieldSourcePrizePoolInitialized(address indexed yieldSource);\\n\\n  /// @notice Initializes the Prize Pool and Yield Service with the required contract connections\\n  /// @param _controlledTokens Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\\n  /// @param _maxExitFeeMantissa The maximum exit fee size, relative to the withdrawal amount\\n  /// @param _yieldSource Address of the yield source\\n  function initializeYieldSourcePrizePool (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa,\\n    IYieldSource _yieldSource\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_yieldSource).isContract(), \\\"YieldSourcePrizePool/yield-source-not-contract-address\\\");\\n    PrizePool.initialize(\\n      _reserveRegistry,\\n      _controlledTokens,\\n      _maxExitFeeMantissa\\n    );\\n    yieldSource = _yieldSource;\\n\\n    // A hack to determine whether it's an actual yield source\\n    (bool succeeded,) = address(_yieldSource).staticcall(abi.encode(_yieldSource.depositToken.selector));\\n    require(succeeded, \\\"YieldSourcePrizePool/invalid-yield-source\\\");\\n\\n    emit YieldSourcePrizePoolInitialized(address(_yieldSource));\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal override view returns (bool) {\\n    return _externalToken != address(yieldSource);\\n  }\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal override returns (uint256) {\\n    return yieldSource.balanceOfToken(address(this));\\n  }\\n\\n  function _token() internal override view returns (IERC20Upgradeable) {\\n    return IERC20Upgradeable(yieldSource.depositToken());\\n  }\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal override {\\n    _token().safeApprove(address(yieldSource), mintAmount);\\n    yieldSource.supplyTokenTo(mintAmount, address(this));\\n  }\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal override returns (uint256) {\\n    return yieldSource.redeemToken(redeemAmount);\\n  }\\n}\",\"keccak256\":\"0x74b0899be05f0fa46f6818359aabb09b10ce1e6f14b407b733adc207d5b72104\",\"license\":\"GPL-3.0\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/test/YieldSourcePrizePoolHarness.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"../prize-pool/yield-source/YieldSourcePrizePool.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ncontract YieldSourcePrizePoolHarness is YieldSourcePrizePool {\\n\\n  uint256 public currentTime;\\n\\n  function setCurrentTime(uint256 _currentTime) external {\\n    currentTime = _currentTime;\\n  }\\n\\n  function _currentTime() internal override view returns (uint256) {\\n    return currentTime;\\n  }\\n\\n  function supply(uint256 mintAmount) external {\\n    _supply(mintAmount);\\n  }\\n\\n  function redeem(uint256 redeemAmount) external returns (uint256) {\\n    return _redeem(redeemAmount);\\n  }\\n}\\n\",\"keccak256\":\"0xe5b8f021d0644e96da1ef1a6c5f7df8bc3d9d92dd13b3f7825ca69b24a1c7222\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/test/YieldSourcePrizePoolHarness.sol:YieldSourcePrizePoolHarness",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/test/YieldSourcePrizePoolHarness.sol:YieldSourcePrizePoolHarness",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/test/YieldSourcePrizePoolHarness.sol:YieldSourcePrizePoolHarness",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 10,
                "contract": "contracts/test/YieldSourcePrizePoolHarness.sol:YieldSourcePrizePoolHarness",
                "label": "_owner",
                "offset": 0,
                "slot": "51",
                "type": "t_address"
              },
              {
                "astId": 129,
                "contract": "contracts/test/YieldSourcePrizePoolHarness.sol:YieldSourcePrizePoolHarness",
                "label": "__gap",
                "offset": 0,
                "slot": "52",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 4743,
                "contract": "contracts/test/YieldSourcePrizePoolHarness.sol:YieldSourcePrizePoolHarness",
                "label": "_status",
                "offset": 0,
                "slot": "101",
                "type": "t_uint256"
              },
              {
                "astId": 4786,
                "contract": "contracts/test/YieldSourcePrizePoolHarness.sol:YieldSourcePrizePoolHarness",
                "label": "__gap",
                "offset": 0,
                "slot": "102",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 6817,
                "contract": "contracts/test/YieldSourcePrizePoolHarness.sol:YieldSourcePrizePoolHarness",
                "label": "reserveRegistry",
                "offset": 0,
                "slot": "151",
                "type": "t_contract(RegistryInterface)12458"
              },
              {
                "astId": 6821,
                "contract": "contracts/test/YieldSourcePrizePoolHarness.sol:YieldSourcePrizePoolHarness",
                "label": "_tokens",
                "offset": 0,
                "slot": "152",
                "type": "t_array(t_contract(ControlledTokenInterface)15850)dyn_storage"
              },
              {
                "astId": 6824,
                "contract": "contracts/test/YieldSourcePrizePoolHarness.sol:YieldSourcePrizePoolHarness",
                "label": "prizeStrategy",
                "offset": 0,
                "slot": "153",
                "type": "t_contract(TokenListenerInterface)16265"
              },
              {
                "astId": 6827,
                "contract": "contracts/test/YieldSourcePrizePoolHarness.sol:YieldSourcePrizePoolHarness",
                "label": "maxExitFeeMantissa",
                "offset": 0,
                "slot": "154",
                "type": "t_uint256"
              },
              {
                "astId": 6830,
                "contract": "contracts/test/YieldSourcePrizePoolHarness.sol:YieldSourcePrizePoolHarness",
                "label": "reserveTotalSupply",
                "offset": 0,
                "slot": "155",
                "type": "t_uint256"
              },
              {
                "astId": 6833,
                "contract": "contracts/test/YieldSourcePrizePoolHarness.sol:YieldSourcePrizePoolHarness",
                "label": "liquidityCap",
                "offset": 0,
                "slot": "156",
                "type": "t_uint256"
              },
              {
                "astId": 6836,
                "contract": "contracts/test/YieldSourcePrizePoolHarness.sol:YieldSourcePrizePoolHarness",
                "label": "_currentAwardBalance",
                "offset": 0,
                "slot": "157",
                "type": "t_uint256"
              },
              {
                "astId": 6841,
                "contract": "contracts/test/YieldSourcePrizePoolHarness.sol:YieldSourcePrizePoolHarness",
                "label": "_tokenCreditPlans",
                "offset": 0,
                "slot": "158",
                "type": "t_mapping(t_address,t_struct(CreditPlan)6803_storage)"
              },
              {
                "astId": 6848,
                "contract": "contracts/test/YieldSourcePrizePoolHarness.sol:YieldSourcePrizePoolHarness",
                "label": "_tokenCreditBalances",
                "offset": 0,
                "slot": "159",
                "type": "t_mapping(t_address,t_mapping(t_address,t_struct(CreditBalance)6810_storage))"
              },
              {
                "astId": 9334,
                "contract": "contracts/test/YieldSourcePrizePoolHarness.sol:YieldSourcePrizePoolHarness",
                "label": "yieldSource",
                "offset": 0,
                "slot": "160",
                "type": "t_contract(IYieldSource)5623"
              },
              {
                "astId": 14810,
                "contract": "contracts/test/YieldSourcePrizePoolHarness.sol:YieldSourcePrizePoolHarness",
                "label": "currentTime",
                "offset": 0,
                "slot": "161",
                "type": "t_uint256"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_contract(ControlledTokenInterface)15850)dyn_storage": {
                "base": "t_contract(ControlledTokenInterface)15850",
                "encoding": "dynamic_array",
                "label": "contract ControlledTokenInterface[]",
                "numberOfBytes": "32"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_contract(ControlledTokenInterface)15850": {
                "encoding": "inplace",
                "label": "contract ControlledTokenInterface",
                "numberOfBytes": "20"
              },
              "t_contract(IYieldSource)5623": {
                "encoding": "inplace",
                "label": "contract IYieldSource",
                "numberOfBytes": "20"
              },
              "t_contract(RegistryInterface)12458": {
                "encoding": "inplace",
                "label": "contract RegistryInterface",
                "numberOfBytes": "20"
              },
              "t_contract(TokenListenerInterface)16265": {
                "encoding": "inplace",
                "label": "contract TokenListenerInterface",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_mapping(t_address,t_struct(CreditBalance)6810_storage))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => struct PrizePool.CreditBalance))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_struct(CreditBalance)6810_storage)"
              },
              "t_mapping(t_address,t_struct(CreditBalance)6810_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct PrizePool.CreditBalance)",
                "numberOfBytes": "32",
                "value": "t_struct(CreditBalance)6810_storage"
              },
              "t_mapping(t_address,t_struct(CreditPlan)6803_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct PrizePool.CreditPlan)",
                "numberOfBytes": "32",
                "value": "t_struct(CreditPlan)6803_storage"
              },
              "t_struct(CreditBalance)6810_storage": {
                "encoding": "inplace",
                "label": "struct PrizePool.CreditBalance",
                "members": [
                  {
                    "astId": 6805,
                    "contract": "contracts/test/YieldSourcePrizePoolHarness.sol:YieldSourcePrizePoolHarness",
                    "label": "balance",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint192"
                  },
                  {
                    "astId": 6807,
                    "contract": "contracts/test/YieldSourcePrizePoolHarness.sol:YieldSourcePrizePoolHarness",
                    "label": "timestamp",
                    "offset": 24,
                    "slot": "0",
                    "type": "t_uint32"
                  },
                  {
                    "astId": 6809,
                    "contract": "contracts/test/YieldSourcePrizePoolHarness.sol:YieldSourcePrizePoolHarness",
                    "label": "initialized",
                    "offset": 28,
                    "slot": "0",
                    "type": "t_bool"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_struct(CreditPlan)6803_storage": {
                "encoding": "inplace",
                "label": "struct PrizePool.CreditPlan",
                "members": [
                  {
                    "astId": 6800,
                    "contract": "contracts/test/YieldSourcePrizePoolHarness.sol:YieldSourcePrizePoolHarness",
                    "label": "creditLimitMantissa",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint128"
                  },
                  {
                    "astId": 6802,
                    "contract": "contracts/test/YieldSourcePrizePoolHarness.sol:YieldSourcePrizePoolHarness",
                    "label": "creditRateMantissa",
                    "offset": 16,
                    "slot": "0",
                    "type": "t_uint128"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_uint128": {
                "encoding": "inplace",
                "label": "uint128",
                "numberOfBytes": "16"
              },
              "t_uint192": {
                "encoding": "inplace",
                "label": "uint192",
                "numberOfBytes": "24"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint32": {
                "encoding": "inplace",
                "label": "uint32",
                "numberOfBytes": "4"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "VERSION()": {
                "notice": "Semver Version"
              },
              "accountedBalance()": {
                "notice": "The total of all controlled tokens"
              },
              "award(address,uint256,address)": {
                "notice": "Called by the prize strategy to award prizes."
              },
              "awardBalance()": {
                "notice": "Returns the balance that is available to award."
              },
              "awardExternalERC20(address,address,uint256)": {
                "notice": "Called by the Prize-Strategy to award external ERC20 prizes"
              },
              "awardExternalERC721(address,address,uint256[])": {
                "notice": "Called by the prize strategy to award external ERC721 prizes"
              },
              "balanceOfCredit(address,address)": {
                "notice": "Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit."
              },
              "beforeTokenTransfer(address,address,uint256)": {
                "notice": "Updates the Prize Strategy when tokens are transferred between holders."
              },
              "calculateEarlyExitFee(address,address,uint256)": {
                "notice": "Calculates the early exit fee for the given amount"
              },
              "calculateReserveFee(uint256)": {
                "notice": "Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero."
              },
              "captureAwardBalance()": {
                "notice": "Captures any available interest as award balance."
              },
              "compLikeDelegate(address,address)": {
                "notice": "Delegate the votes for a Compound COMP-like token held by the prize pool"
              },
              "creditPlanOf(address)": {
                "notice": "Returns the credit rate of a controlled token"
              },
              "depositTo(address,uint256,address,address)": {
                "notice": "Deposit assets into the Prize Pool in exchange for tokens"
              },
              "estimateCreditAccrualTime(address,uint256,uint256)": {
                "notice": "Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit."
              },
              "initialize(address,address[],uint256)": {
                "notice": "Initializes the Prize Pool"
              },
              "initializeYieldSourcePrizePool(address,address[],uint256,address)": {
                "notice": "Initializes the Prize Pool and Yield Service with the required contract connections"
              },
              "onERC721Received(address,address,uint256,bytes)": {
                "notice": "Required for ERC721 safe token transfers from smart contracts."
              },
              "setCreditPlanOf(address,uint128,uint128)": {
                "notice": "Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether)."
              },
              "setLiquidityCap(uint256)": {
                "notice": "Allows the Governor to set a cap on the amount of liquidity that he pool can hold"
              },
              "setPrizeStrategy(address)": {
                "notice": "Sets the prize strategy of the prize pool.  Only callable by the owner."
              },
              "tokens()": {
                "notice": "An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)"
              },
              "transferExternalERC20(address,address,uint256)": {
                "notice": "Called by the Prize-Strategy to transfer out external ERC20 tokens"
              },
              "withdrawInstantlyFrom(address,uint256,address,uint256)": {
                "notice": "Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit."
              }
            },
            "version": 1
          }
        }
      },
      "contracts/test/YieldSourcePrizePoolHarnessProxyFactory.sol": {
        "YieldSourcePrizePoolHarnessProxyFactory": {
          "abi": [
            {
              "inputs": [],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "name": "ProxyCreated",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "create",
              "outputs": [
                {
                  "internalType": "contract YieldSourcePrizePoolHarness",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_logic",
                  "type": "address"
                },
                {
                  "internalType": "bytes",
                  "name": "_data",
                  "type": "bytes"
                }
              ],
              "name": "deployMinimal",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "instance",
              "outputs": [
                {
                  "internalType": "contract YieldSourcePrizePoolHarness",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "create()": {
                "returns": {
                  "_0": "A reference to the new proxied YieldSource Prize Pool"
                }
              }
            },
            "title": "YieldSource Prize Pool Proxy Factory",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5060405161001d9061005f565b604051809103906000f080158015610039573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b039290921691909117905561006c565b6144da806103b283390190565b6103378061007b6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063022ec09514610046578063b3eeb5e21461006a578063efc81a8c14610120575b600080fd5b61004e610128565b604080516001600160a01b039092168252519081900360200190f35b61004e6004803603604081101561008057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100ab57600080fd5b8201836020820111156100bd57600080fd5b803590602001918460018302840111640100000000831117156100df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610137945050505050565b61004e6102b3565b6000546001600160a01b031681565b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a18251156102ac576000826001600160a01b0316846040518082805190602001908083835b602083106102035780518252601f1990920191602091820191016101e4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610265576040519150601f19603f3d011682016040523d82523d6000602084013e61026a565b606091505b50509050806102aa5760405162461bcd60e51b81526004018080602001828103825260248152602001806102de6024913960400191505060405180910390fd5b505b5092915050565b6000805460408051602081019091528281526102d8916001600160a01b031690610137565b90509056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a264697066735822122083e999ce707553b53bfc6c15686c341a64aa32b0527d01a5e9bd546f4abc30d864736f6c634300060c0033608060405234801561001057600080fd5b506144ba806100206000396000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c80638da5cb5b11610146578063b69ef8a8116100c3578063e323f82511610087578063e323f825146109a5578063e6d8a94b146109e1578063edb4e1cf146109e9578063f2fde38b146109f1578063fc0c546a14610a17578063ffa1ad7414610a1f5761025e565b8063b69ef8a814610864578063cfa240071461086c578063d18e81b31461092b578063d4a1361d14610933578063db006a75146109885761025e565b80639e1675191161010a5780639e167519146107c05780639fe32a91146107c8578063a016240b146107e5578063a7b2cc311461081f578063b2470e5c1461085c5761025e565b80638da5cb5b1461070e5780638e71c1f61461073257806391ca480e1461073a57806398bf3eb6146107605780639d63848a146107685761025e565b806352a387ab116101df57806376687d3d116101a357806376687d3d1461060c57806378b3d3271461061457806379cb85631461063a5780637b99adb11461066c5780637cbab1c714610689578063888c2b6f146106bf5761025e565b806352a387ab14610566578063630665b41461058c5780636a3fd4f9146105945780636b1b863a146105ce578063715018a6146106045761025e565b80632b0ab144116102265780632b0ab144146104045780632f7627e31461043a57806335403023146104685780633ede50c614610485578063494de9f7146105385761025e565b80630937eb541461026357806313f55e391461027d578063150b7a02146102b557806316960d551461036057806322f8e566146103e7575b600080fd5b61026b610a9c565b60408051918252519081900360200190f35b6102b36004803603606081101561029357600080fd5b506001600160a01b03813581169160208101359091169060400135610aab565b005b610343600480360360808110156102cb57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b81111561030557600080fd5b82018360208201111561031757600080fd5b803590602001918460018302840111600160201b8311171561033857600080fd5b509092509050610b69565b604080516001600160e01b03199092168252519081900360200190f35b6102b36004803603606081101561037657600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b8111156103a957600080fd5b8201836020820111156103bb57600080fd5b803590602001918460208302840111600160201b831117156103dc57600080fd5b509092509050610b7a565b6102b3600480360360208110156103fd57600080fd5b5035610e27565b6102b36004803603606081101561041a57600080fd5b506001600160a01b03813581169160208101359091169060400135610e2c565b6102b36004803603604081101561045057600080fd5b506001600160a01b0381358116916020013516610ee9565b6102b36004803603602081101561047e57600080fd5b5035611038565b6102b36004803603606081101561049b57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156104c557600080fd5b8201836020820111156104d757600080fd5b803590602001918460208302840111600160201b831117156104f857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250611044915050565b61026b6004803603604081101561054e57600080fd5b506001600160a01b0381358116916020013516611236565b61026b6004803603602081101561057c57600080fd5b50356001600160a01b031661133d565b61026b61148c565b6105ba600480360360208110156105aa57600080fd5b50356001600160a01b0316611492565b604080519115158252519081900360200190f35b6102b3600480360360608110156105e457600080fd5b506001600160a01b038135811691602081013591604090910135166114a5565b6102b36116ad565b61026b611759565b6105ba6004803603602081101561062a57600080fd5b50356001600160a01b031661175f565b61026b6004803603606081101561065057600080fd5b506001600160a01b03813516906020810135906040013561176a565b6102b36004803603602081101561068257600080fd5b503561177f565b6102b36004803603606081101561069f57600080fd5b506001600160a01b038135811691602081013590911690604001356117ea565b6106f5600480360360608110156106d557600080fd5b506001600160a01b03813581169160208101359091169060400135611a36565b6040805192835260208301919091528051918290030190f35b610716611a50565b604080516001600160a01b039092168252519081900360200190f35b610716611a5f565b6102b36004803603602081101561075057600080fd5b50356001600160a01b0316611a6e565b610716611ad9565b610770611ae8565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156107ac578181015183820152602001610794565b505050509050019250505060405180910390f35b61026b611b4a565b61026b600480360360208110156107de57600080fd5b5035611b50565b61026b600480360360808110156107fb57600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611c7e565b6102b36004803603606081101561083557600080fd5b506001600160a01b03813516906001600160801b0360208201358116916040013516611eb5565b61071661200b565b61026b61201a565b6102b36004803603608081101561088257600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156108ac57600080fd5b8201836020820111156108be57600080fd5b803590602001918460208302840111600160201b831117156108df57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602001356001600160a01b0316612024565b61026b61226f565b6109596004803603602081101561094957600080fd5b50356001600160a01b0316612275565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b61026b6004803603602081101561099e57600080fd5b50356122a5565b6102b3600480360360808110156109bb57600080fd5b506001600160a01b038135811691602081013591604082013581169160600135166122b0565b61026b612465565b61026b6125db565b6102b360048036036020811015610a0757600080fd5b50356001600160a01b03166125e1565b6107166126e4565b610a276126ee565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610a61578181015183820152602001610a49565b50505050905090810190601f168015610a8e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610aa661270f565b905090565b6099546001600160a01b0316610abf61281a565b6001600160a01b031614610b08576040805162461bcd60e51b815260206004820152601c6024820152600080516020614465833981519152604482015290519081900360640190fd5b610b1383838361281e565b15610b6457816001600160a01b0316836001600160a01b03167fb0bac59718cd343c80a813518afcf36846cfcfe6d56e2b3cab9bd49f5f9b251c836040518082815260200191505060405180910390a35b505050565b630a85bd0160e11b95945050505050565b6099546001600160a01b0316610b8e61281a565b6001600160a01b031614610bd7576040805162461bcd60e51b815260206004820152601c6024820152600080516020614465833981519152604482015290519081900360640190fd5b610be0836128a6565b610c31576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b80610c3b57610e21565b60005b81811015610da857836001600160a01b03166342842e0e3087868686818110610c6357fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610cc057600080fd5b505af1925050508015610cd1575060015b610da0573d808015610cff576040519150601f19603f3d011682016040523d82523d6000602084013e610d04565b606091505b507f17e975018310f88872b58d4d8263adca83cf5c1893496ea2a86923dab15276ad816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d64578181015183820152602001610d4c565b50505050905090810190601f168015610d915780820380516001836020036101000a031916815260200191505b509250505060405180910390a1505b600101610c3e565b50826001600160a01b0316846001600160a01b03167f69c2de32bc4d47f488e72626a6cfdee85089342e52675e7de79c4b417623960c848460405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a35b50505050565b60a155565b6099546001600160a01b0316610e4061281a565b6001600160a01b031614610e89576040805162461bcd60e51b815260206004820152601c6024820152600080516020614465833981519152604482015290519081900360640190fd5b610e9483838361281e565b15610b6457816001600160a01b0316836001600160a01b03167fc65f48aca3b7a99b7443d04b8ffbb073156179bc628dc3f7def5047748973469836040518082815260200191505060405180910390a3505050565b610ef161281a565b6001600160a01b0316610f02611a50565b6001600160a01b031614610f4b576040805162461bcd60e51b81526020600482018190526024820152600080516020614342833981519152604482015290519081900360640190fd5b6000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f9a57600080fd5b505afa158015610fae573d6000803e3d6000fd5b505050506040513d6020811015610fc457600080fd5b5051111561103457816001600160a01b0316635c19a95c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561101b57600080fd5b505af115801561102f573d6000803e3d6000fd5b505050505b5050565b611041816128bb565b50565b600054610100900460ff168061105d575061105d61294b565b8061106b575060005460ff16155b6110a65760405162461bcd60e51b815260040180806020018281038252602e8152602001806142f3602e913960400191505060405180910390fd5b600054610100900460ff161580156110d1576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0384166111165760405162461bcd60e51b81526004018080602001828103825260228152602001806142ab6022913960400191505060405180910390fd5b82518067ffffffffffffffff8111801561112f57600080fd5b50604051908082528060200260200182016040528015611159578160200160208202803683370190505b50805161116e916098916020909101906141b9565b5060005b818110156111a557600085828151811061118857fe5b6020026020010151905061119c818361295c565b50600101611172565b506111ae612a87565b6111b6612b38565b6111c1600019612bcd565b609780546001600160a01b0319166001600160a01b038716908117909155609a849055604080519182526020820185905280517f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce799281900390910190a1508015610e21576000805461ff001916905550505050565b60008161124281612c08565b611281576040805162461bcd60e51b81526020600482015260176024820152600080516020614389833981519152604482015290519081900360640190fd5b6113068484856001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112d357600080fd5b505afa1580156112e7573d6000803e3d6000fd5b505050506040513d60208110156112fd57600080fd5b50516000612cc4565b50506001600160a01b039081166000908152609f60209081526040808320949093168252929092529020546001600160c01b031690565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561138e57600080fd5b505afa1580156113a2573d6000803e3d6000fd5b505050506040513d60208110156113b857600080fd5b505190506001600160a01b0381163314611412576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f6f6e6c792d7265736572766560501b604482015290519081900360640190fd5b609b80546000918290559061142682612cda565b90506114458582611435612d58565b6001600160a01b03169190612dce565b6040805183815290516001600160a01b038716917f1c71c8e11fd443227c8f8d3dc1a237a3a5e8310b540c7fbcf5169754aedf42c9919081900360200190a2949350505050565b609d5490565b600061149d826128a6565b90505b919050565b6099546001600160a01b03166114b961281a565b6001600160a01b031614611502576040805162461bcd60e51b815260206004820152601c6024820152600080516020614465833981519152604482015290519081900360640190fd5b8061150c81612c08565b61154b576040805162461bcd60e51b81526020600482015260176024820152600080516020614389833981519152604482015290519081900360640190fd5b8261155557610e21565b609d548311156115ac576040805162461bcd60e51b815260206004820152601d60248201527f5072697a65506f6f6c2f61776172642d657863656564732d617661696c000000604482015290519081900360640190fd5b609d546115b99084612e20565b609d556115c98484846000612e82565b60006115d58385612f68565b905061165b8584856001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561162957600080fd5b505afa15801561163d573d6000803e3d6000fd5b505050506040513d602081101561165357600080fd5b505184612cc4565b826001600160a01b0316856001600160a01b03167fe2554529d99ab7a67db6b4cea2b32c7d55ae325f958861e05f304fdded867e31866040518082815260200191505060405180910390a35050505050565b6116b561281a565b6001600160a01b03166116c6611a50565b6001600160a01b03161461170f576040805162461bcd60e51b81526020600482018190526024820152600080516020614342833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b609c5481565b600061149d82612c08565b6000611777848484612fa0565b949350505050565b61178761281a565b6001600160a01b0316611798611a50565b6001600160a01b0316146117e1576040805162461bcd60e51b81526020600482018190526024820152600080516020614342833981519152604482015290519081900360640190fd5b61104181612bcd565b336117f481612c08565b611833576040805162461bcd60e51b81526020600482015260176024820152600080516020614389833981519152604482015290519081900360640190fd5b6001600160a01b0384161561190d576000336001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561189157600080fd5b505afa1580156118a5573d6000803e3d6000fd5b505050506040513d60208110156118bb57600080fd5b5051905060006118cd86338484612ffa565b9050846001600160a01b0316866001600160a01b0316146118ff576118fc336118f68487612e20565b83613089565b90505b61190a8633836130cf565b50505b6001600160a01b038316158015906119375750836001600160a01b0316836001600160a01b031614155b1561198e5761198e8333336001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156112d357600080fd5b6001600160a01b038416158015906119b057506099546001600160a01b031615155b15610e21576099546040805163b221095760e01b81526001600160a01b0387811660048301528681166024830152604482018690523360648301529151919092169163b221095791608480830192600092919082900301818387803b158015611a1857600080fd5b505af1158015611a2c573d6000803e3d6000fd5b5050505050505050565b600080611a4485858561326d565b90969095509350505050565b6033546001600160a01b031690565b6097546001600160a01b031681565b611a7661281a565b6001600160a01b0316611a87611a50565b6001600160a01b031614611ad0576040805162461bcd60e51b81526020600482018190526024820152600080516020614342833981519152604482015290519081900360640190fd5b6110418161340b565b6099546001600160a01b031681565b60606098805480602002602001604051908101604052809291908181526020018280548015611b4057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b22575b5050505050905090565b609a5481565b600080609760009054906101000a90046001600160a01b03166001600160a01b031663f5e3542b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ba157600080fd5b505afa158015611bb5573d6000803e3d6000fd5b505050506040513d6020811015611bcb57600080fd5b505190506001600160a01b038116611be75760009150506114a0565b6000816001600160a01b031663010dfa58306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611c3657600080fd5b505afa158015611c4a573d6000803e3d6000fd5b505050506040513d6020811015611c6057600080fd5b5051905080611c74576000925050506114a0565b611777848261351e565b600060026065541415611cd8576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655582611ce781612c08565b611d26576040805162461bcd60e51b81526020600482015260176024820152600080516020614389833981519152604482015290519081900360640190fd5b600080611d3488878961326d565b9150915084821115611d775760405162461bcd60e51b81526004018080602001828103825260278152602001806143626027913960400191505060405180910390fd5b611d8288878361353f565b856001600160a01b031663631b5dfb611d9961281a565b8a8a6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611df157600080fd5b505af1158015611e05573d6000803e3d6000fd5b505050506000611e1e8389612e2090919063ffffffff16565b90506000611e2b82612cda565b9050611e3a8a82611435612d58565b876001600160a01b03168a6001600160a01b0316611e5661281a565b604080518d81526020810186905280820189905290516001600160a01b0392909216917f0271704a58fd2953e49b87d67a0a3ce28a58147de98a5457f60b4686f63850309181900360600190a450506001606555509695505050505050565b82611ebf81612c08565b611efe576040805162461bcd60e51b81526020600482015260176024820152600080516020614389833981519152604482015290519081900360640190fd5b611f0661281a565b6001600160a01b0316611f17611a50565b6001600160a01b031614611f60576040805162461bcd60e51b81526020600482018190526024820152600080516020614342833981519152604482015290519081900360640190fd5b6040805180820182526001600160801b0380851680835286821660208085018281526001600160a01b038b166000818152609e84528890209651875492518716600160801b029087166fffffffffffffffffffffffffffffffff1990931692909217909516179094558451928352928201528083019190915290517ffb0ba2cf86a2b03bcf387753a2192da80a006afa99dd022bb301c78e323bf1b99181900360600190a150505050565b60a0546001600160a01b031681565b6000610aa6613600565b600054610100900460ff168061203d575061203d61294b565b8061204b575060005460ff16155b6120865760405162461bcd60e51b815260040180806020018281038252602e8152602001806142f3602e913960400191505060405180910390fd5b600054610100900460ff161580156120b1576000805460ff1961ff0019909116610100171660011790555b6120c3826001600160a01b0316613660565b6120fe5760405162461bcd60e51b81526004018080602001828103825260368152602001806143f96036913960400191505060405180910390fd5b612109858585611044565b60a080546001600160a01b0319166001600160a01b0384169081179091556040805163c89039c560e01b60208083019190915282518083038201815291830192839052815160009493918291908401908083835b6020831061217c5780518252601f19909201916020918201910161215d565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d80600081146121dc576040519150601f19603f3d011682016040523d82523d6000602084013e6121e1565b606091505b50509050806122215760405162461bcd60e51b81526004018080602001828103825260298152602001806142356029913960400191505060405180910390fd5b6040516001600160a01b038416907f7a0ca506edc9fcd36e010dbcaad57dade17bbac71dfeb53269077098e863eeca90600090a2508015612268576000805461ff00191690555b5050505050565b60a15481565b6001600160a01b03166000908152609e60205260409020546001600160801b0380821692600160801b9092041690565b600061149d82612cda565b60026065541415612308576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026065558161231781612c08565b612356576040805162461bcd60e51b81526020600482015260176024820152600080516020614389833981519152604482015290519081900360640190fd5b8361236081613666565b6123b1576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f657863656564732d6c69717569646974792d63617000604482015290519081900360640190fd5b60006123bb61281a565b90506123c987878787612e82565b6123e88130886123d7612d58565b6001600160a01b031692919061368a565b6123f1866128bb565b846001600160a01b0316876001600160a01b0316826001600160a01b03167f6ce569498e0f86f147466ac49211cb2a1ffe06195adb805e383b3f2365109160898860405180838152602001826001600160a01b031681526020019250505060405180910390a4505060016065555050505050565b6000600260655414156124bf576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260655560006124ce61270f565b905060006124da613600565b905060008282116124ec5760006124f6565b6124f68284612e20565b90506000609d54821161250a576000612518565b609d54612518908390612e20565b905080156125ca57600061252b82611b50565b9050801561258557609b5461254090826136e4565b609b5561254d8282612e20565b6040805183815290519193507f5f1703ccfa2730d4245350f228079926a37f26a44ecf6978a7eeafff0af11407919081900360200190a15b609d5461259290836136e4565b609d556040805183815290517fce2b6e507c7ca1a20ce136810f524eefc19ba4c7e4866eb6cc0cba76e778d4be9181900360200190a1505b609d54945050505050600160655590565b609b5481565b6125e961281a565b6001600160a01b03166125fa611a50565b6001600160a01b031614612643576040805162461bcd60e51b81526020600482018190526024820152600080516020614342833981519152604482015290519081900360640190fd5b6001600160a01b0381166126885760405162461bcd60e51b815260040180806020018281038252602681526020018061425e6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610aa6612d58565b60405180604001604052806005815260200164332e342e3560d81b81525081565b600080609b5490506060609880548060200260200160405190810160405280929190818152602001828054801561276f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612751575b505083519394506000925050505b818110156128115761280783828151811061279457fe5b60200260200101516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127d457600080fd5b505afa1580156127e8573d6000803e3d6000fd5b505050506040513d60208110156127fe57600080fd5b505185906136e4565b935060010161277d565b50919250505090565b3390565b6000612829836128a6565b61287a576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e604482015290519081900360640190fd5b816128875750600061289f565b61289b6001600160a01b0384168584612dce565b5060015b9392505050565b60a0546001600160a01b039081169116141590565b60a0546128e4906001600160a01b0316826128d4612d58565b6001600160a01b0316919061373e565b60a054604080516387a6eeef60e01b81526004810184905230602482015290516001600160a01b03909216916387a6eeef9160448082019260009290919082900301818387803b15801561293757600080fd5b505af1158015612268573d6000803e3d6000fd5b600061295630613660565b15905090565b306001600160a01b0316826001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b15801561299f57600080fd5b505afa1580156129b3573d6000803e3d6000fd5b505050506040513d60208110156129c957600080fd5b50516001600160a01b031614612a26576040805162461bcd60e51b815260206004820152601e60248201527f5072697a65506f6f6c2f746f6b656e2d6374726c722d6d69736d617463680000604482015290519081900360640190fd5b8160988281548110612a3457fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051918416917f460e712b4a5d801d031ed673dea209b73ab854f7ddeb86b6c48082e92c3eee669190a25050565b600054610100900460ff1680612aa05750612aa061294b565b80612aae575060005460ff16155b612ae95760405162461bcd60e51b815260040180806020018281038252602e8152602001806142f3602e913960400191505060405180910390fd5b600054610100900460ff16158015612b14576000805460ff1961ff0019909116610100171660011790555b612b1c613851565b612b246138f1565b8015611041576000805461ff001916905550565b600054610100900460ff1680612b515750612b5161294b565b80612b5f575060005460ff16155b612b9a5760405162461bcd60e51b815260040180806020018281038252602e8152602001806142f3602e913960400191505060405180910390fd5b600054610100900460ff16158015612bc5576000805460ff1961ff0019909116610100171660011790555b612b246139ea565b609c8190556040805182815290517f3ff20538222f568f27ff436c0c49dfd3e48d5b8f86533a3f759dc1c7089775ab9181900360200190a150565b600060606098805480602002602001604051908101604052809291908181526020018280548015612c6257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612c44575b505083519394506000925050505b81811015612cb957846001600160a01b0316838281518110612c8e57fe5b60200260200101516001600160a01b03161415612cb157600193505050506114a0565b600101612c70565b506000949350505050565b610e218484612cd587878787612ffa565b6130cf565b60a0546040805162982a6160e11b81526004810184905290516000926001600160a01b03169163013054c291602480830192602092919082900301818787803b158015612d2657600080fd5b505af1158015612d3a573d6000803e3d6000fd5b505050506040513d6020811015612d5057600080fd5b505192915050565b60a0546040805163c89039c560e01b815290516000926001600160a01b03169163c89039c5916004808301926020929190829003018186803b158015612d9d57600080fd5b505afa158015612db1573d6000803e3d6000fd5b505050506040513d6020811015612dc757600080fd5b5051905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610b64908490613a90565b600082821115612e77576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6099546001600160a01b031615612f1157609954604080516304d7f3db60e41b81526001600160a01b038781166004830152602482018790528581166044830152848116606483015291519190921691634d7f3db091608480830192600092919082900301818387803b158015612ef857600080fd5b505af1158015612f0c573d6000803e3d6000fd5b505050505b816001600160a01b0316635d7b075885856040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611a1857600080fd5b6001600160a01b0382166000908152609e602052604081205461289f908390612f9b9082906001600160801b031661351e565b613b41565b6001600160a01b0383166000908152609e60205260408120548190612fd6908590600160801b90046001600160801b031661351e565b905080612fe757600091505061289f565b612ff18382613b66565b95945050505050565b6001600160a01b038381166000908152609f6020908152604080832093881683529290529081208054829190600160e01b900460ff1661303d576000915061307f565b600061304a888888613bcd565b825490915061307b9088908890613076908990613070906001600160c01b0316876136e4565b906136e4565b613089565b9250505b5095945050505050565b6001600160a01b0383166000908152609e602052604081205481906130b89085906001600160801b031661351e565b9050808311156130c6578092505b50909392505050565b6001600160a01b038083166000908152609f602090815260408083209387168352929052819020548151606081019092526001600160c01b0316908061311484613c7e565b6001600160801b0316815260200161313261312d613cc6565b613ccc565b63ffffffff908116825260016020928301526001600160a01b038681166000908152609f84526040808220928a168252918452819020845181549486015195909201516001600160c01b03199094166001600160c01b039092169190911763ffffffff60c01b1916600160c01b94909216939093021760ff60e01b1916600160e01b9115159190910217905581811015613215576001600160a01b038084169085167f2f92d56910619b38bc29fd8e4ca5e56359edac7a0c086cdcd305fb603fa374916131ff8585612e20565b60408051918252519081900360200190a3610e21565b80821015610e21576001600160a01b038084169085167ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf6132568486612e20565b60408051918252519081900360200190a350505050565b6000806000846001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156132bf57600080fd5b505afa1580156132d3573d6000803e3d6000fd5b505050506040513d60208110156132e957600080fd5b505190508381101561333b576040805162461bcd60e51b81526020600482015260166024820152755072697a65506f6f6c2f696e737566662d66756e647360501b604482015290519081900360640190fd5b6133488686836000612cc4565b600061335d866133588488612e20565b612f68565b6001600160a01b038088166000908152609f60209081526040808320938c16835292905290812054919250906001600160c01b031682116133d4576001600160a01b038088166000908152609f60209081526040808320938c16835292905220546133d1906001600160c01b031683612e20565b90505b60006133e08888612f68565b90508082116133ef57816133f1565b805b94506133fd8186612e20565b955050505050935093915050565b6001600160a01b038116613466576040805162461bcd60e51b815260206004820181905260248201527f5072697a65506f6f6c2f7072697a6553747261746567792d6e6f742d7a65726f604482015290519081900360640190fd5b6134836001600160a01b038216600162a1cb1960e01b0319613d10565b6134d4576040805162461bcd60e51b815260206004820152601f60248201527f5072697a65506f6f6c2f7072697a6553747261746567792d696e76616c696400604482015290519081900360640190fd5b609980546001600160a01b0319166001600160a01b0383169081179091556040517f7f58dc86bc2e435cb77ca0edb1df55e25f90caf2d6bd866971715437d456a21290600090a250565b60008061352b8385613d2c565b905061177781670de0b6b3a7640000613d85565b6001600160a01b038083166000908152609f60209081526040808320938716835292905220546135819061357c906001600160c01b031683612e20565b613c7e565b6001600160a01b038084166000818152609f602090815260408083209489168084529482529182902080546001600160c01b0319166001600160801b0396909616959095179094558051858152905191937ff584c579437bc25785b953cc4d8d247251812751e1871c6130cbdecf95a106cf92918290030190a3505050565b60a05460408051630b99152d60e41b815230600482015290516000926001600160a01b03169163b99152d091602480830192602092919082900301818787803b15801561364c57600080fd5b505af1158015612db1573d6000803e3d6000fd5b3b151590565b60008061367161270f565b609c5490915061368182856136e4565b11159392505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610e21908590613a90565b60008282018381101561289f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b8015806137c4575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b15801561379657600080fd5b505afa1580156137aa573d6000803e3d6000fd5b505050506040513d60208110156137c057600080fd5b5051155b6137ff5760405162461bcd60e51b815260040180806020018281038252603681526020018061442f6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610b64908490613a90565b600054610100900460ff168061386a575061386a61294b565b80613878575060005460ff16155b6138b35760405162461bcd60e51b815260040180806020018281038252602e8152602001806142f3602e913960400191505060405180910390fd5b600054610100900460ff16158015612b24576000805460ff1961ff0019909116610100171660011790558015611041576000805461ff001916905550565b600054610100900460ff168061390a575061390a61294b565b80613918575060005460ff16155b6139535760405162461bcd60e51b815260040180806020018281038252602e8152602001806142f3602e913960400191505060405180910390fd5b600054610100900460ff1615801561397e576000805460ff1961ff0019909116610100171660011790555b600061398861281a565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015611041576000805461ff001916905550565b600054610100900460ff1680613a035750613a0361294b565b80613a11575060005460ff16155b613a4c5760405162461bcd60e51b815260040180806020018281038252602e8152602001806142f3602e913960400191505060405180910390fd5b600054610100900460ff16158015613a77576000805460ff1961ff0019909116610100171660011790555b60016065558015611041576000805461ff001916905550565b6060613ae5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613dc79092919063ffffffff16565b805190915015610b6457808060200190516020811015613b0457600080fd5b5051610b645760405162461bcd60e51b815260040180806020018281038252602a8152602001806143cf602a913960400191505060405180910390fd5b600080613b5084609a5461351e565b905080831115613b5e578092505b509092915050565b6000808211613bbc576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381613bc557fe5b049392505050565b6001600160a01b038281166000908152609f60209081526040808320938716835292905290812054600160c01b810463ffffffff1690600160e01b900460ff16613c1b57600091505061289f565b6000613c2f82613c29613cc6565b90612e20565b6001600160a01b0386166000908152609e602052604081205491925090613c67908390600160801b90046001600160801b0316613d2c565b9050613c73858261351e565b979650505050505050565b6000600160801b8210613cc25760405162461bcd60e51b81526004018080602001828103825260278152602001806142846027913960400191505060405180910390fd5b5090565b60a15490565b6000600160201b8210613cc25760405162461bcd60e51b81526004018080602001828103825260268152602001806143a96026913960400191505060405180910390fd5b6000613d1b83613dd6565b801561289f575061289f8383613e09565b600082613d3b57506000612e7c565b82820282848281613d4857fe5b041461289f5760405162461bcd60e51b81526004018080602001828103825260218152602001806143216021913960400191505060405180910390fd5b600061289f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613e2c565b60606117778484600085613ece565b6000613de9826301ffc9a760e01b613e09565b801561149d5750613e02826001600160e01b0319613e09565b1592915050565b6000806000613e18858561401f565b91509150818015612ff15750949350505050565b60008183613eb85760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613e7d578181015183820152602001613e65565b50505050905090810190601f168015613eaa5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613ec457fe5b0495945050505050565b606082471015613f0f5760405162461bcd60e51b81526004018080602001828103825260268152602001806142cd6026913960400191505060405180910390fd5b613f1885613660565b613f69576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310613fa85780518252601f199092019160209182019101613f89565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461400a576040519150601f19603f3d011682016040523d82523d6000602084013e61400f565b606091505b5091509150613c73828286614153565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180516001600160e01b03166301ffc9a760e01b1781529151815160009384939284926060926001600160a01b038a169261753092879282918083835b602083106140a75780518252601f199092019160209182019101614088565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114614108576040519150601f19603f3d011682016040523d82523d6000602084013e61410d565b606091505b509150915060208151101561412b576000809450945050505061414c565b8181806020019051602081101561414157600080fd5b505190955093505050505b9250929050565b6060831561416257508161289f565b8251156141725782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315613e7d578181015183820152602001613e65565b82805482825590600052602060002090810192821561420e579160200282015b8281111561420e57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906141d9565b50613cc29291505b80821115613cc25780546001600160a01b031916815560010161421656fe5969656c64536f757263655072697a65506f6f6c2f696e76616c69642d7969656c642d736f757263654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e2031323820626974735072697a65506f6f6c2f7265736572766552656769737472792d6e6f742d7a65726f416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725072697a65506f6f6c2f657869742d6665652d657863656564732d757365722d6d6178696d756d5072697a65506f6f6c2f756e6b6e6f776e2d746f6b656e00000000000000000053616665436173743a2076616c756520646f65736e27742066697420696e20333220626974735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645969656c64536f757263655072697a65506f6f6c2f7969656c642d736f757263652d6e6f742d636f6e74726163742d616464726573735361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e63655072697a65506f6f6c2f6f6e6c792d7072697a65537472617465677900000000a26469706673582212203135eaf4609c9c05130cbcc71f888d1063cd87122b3fc032b8baefb6dc0b694f64736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x1D SWAP1 PUSH2 0x5F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x39 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x6C JUMP JUMPDEST PUSH2 0x44DA DUP1 PUSH2 0x3B2 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH2 0x337 DUP1 PUSH2 0x7B PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x22EC095 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x6A JUMPI DUP1 PUSH4 0xEFC81A8C EQ PUSH2 0x120 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x128 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x137 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x4E PUSH2 0x2B3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x265 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x26A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2DE PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE DUP3 DUP2 MSTORE PUSH2 0x2D8 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x137 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 DUP4 0xE9 SWAP10 0xCE PUSH17 0x7553B53BFC6C15686C341A64AA32B0527D ADD 0xA5 0xE9 0xBD SLOAD PUSH16 0x4ABC30D864736F6C634300060C003360 DUP1 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x44BA DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x25E JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0x146 JUMPI DUP1 PUSH4 0xB69EF8A8 GT PUSH2 0xC3 JUMPI DUP1 PUSH4 0xE323F825 GT PUSH2 0x87 JUMPI DUP1 PUSH4 0xE323F825 EQ PUSH2 0x9A5 JUMPI DUP1 PUSH4 0xE6D8A94B EQ PUSH2 0x9E1 JUMPI DUP1 PUSH4 0xEDB4E1CF EQ PUSH2 0x9E9 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x9F1 JUMPI DUP1 PUSH4 0xFC0C546A EQ PUSH2 0xA17 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0xA1F JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0xB69EF8A8 EQ PUSH2 0x864 JUMPI DUP1 PUSH4 0xCFA24007 EQ PUSH2 0x86C JUMPI DUP1 PUSH4 0xD18E81B3 EQ PUSH2 0x92B JUMPI DUP1 PUSH4 0xD4A1361D EQ PUSH2 0x933 JUMPI DUP1 PUSH4 0xDB006A75 EQ PUSH2 0x988 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x9E167519 GT PUSH2 0x10A JUMPI DUP1 PUSH4 0x9E167519 EQ PUSH2 0x7C0 JUMPI DUP1 PUSH4 0x9FE32A91 EQ PUSH2 0x7C8 JUMPI DUP1 PUSH4 0xA016240B EQ PUSH2 0x7E5 JUMPI DUP1 PUSH4 0xA7B2CC31 EQ PUSH2 0x81F JUMPI DUP1 PUSH4 0xB2470E5C EQ PUSH2 0x85C JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x70E JUMPI DUP1 PUSH4 0x8E71C1F6 EQ PUSH2 0x732 JUMPI DUP1 PUSH4 0x91CA480E EQ PUSH2 0x73A JUMPI DUP1 PUSH4 0x98BF3EB6 EQ PUSH2 0x760 JUMPI DUP1 PUSH4 0x9D63848A EQ PUSH2 0x768 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x52A387AB GT PUSH2 0x1DF JUMPI DUP1 PUSH4 0x76687D3D GT PUSH2 0x1A3 JUMPI DUP1 PUSH4 0x76687D3D EQ PUSH2 0x60C JUMPI DUP1 PUSH4 0x78B3D327 EQ PUSH2 0x614 JUMPI DUP1 PUSH4 0x79CB8563 EQ PUSH2 0x63A JUMPI DUP1 PUSH4 0x7B99ADB1 EQ PUSH2 0x66C JUMPI DUP1 PUSH4 0x7CBAB1C7 EQ PUSH2 0x689 JUMPI DUP1 PUSH4 0x888C2B6F EQ PUSH2 0x6BF JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x52A387AB EQ PUSH2 0x566 JUMPI DUP1 PUSH4 0x630665B4 EQ PUSH2 0x58C JUMPI DUP1 PUSH4 0x6A3FD4F9 EQ PUSH2 0x594 JUMPI DUP1 PUSH4 0x6B1B863A EQ PUSH2 0x5CE JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x604 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x2B0AB144 GT PUSH2 0x226 JUMPI DUP1 PUSH4 0x2B0AB144 EQ PUSH2 0x404 JUMPI DUP1 PUSH4 0x2F7627E3 EQ PUSH2 0x43A JUMPI DUP1 PUSH4 0x35403023 EQ PUSH2 0x468 JUMPI DUP1 PUSH4 0x3EDE50C6 EQ PUSH2 0x485 JUMPI DUP1 PUSH4 0x494DE9F7 EQ PUSH2 0x538 JUMPI PUSH2 0x25E JUMP JUMPDEST DUP1 PUSH4 0x937EB54 EQ PUSH2 0x263 JUMPI DUP1 PUSH4 0x13F55E39 EQ PUSH2 0x27D JUMPI DUP1 PUSH4 0x150B7A02 EQ PUSH2 0x2B5 JUMPI DUP1 PUSH4 0x16960D55 EQ PUSH2 0x360 JUMPI DUP1 PUSH4 0x22F8E566 EQ PUSH2 0x3E7 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26B PUSH2 0xA9C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x293 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xAAB JUMP JUMPDEST STOP JUMPDEST PUSH2 0x343 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x2CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x80 DUP2 ADD PUSH1 0x60 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x305 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x317 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x338 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xB69 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x376 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD DUP2 AND SWAP3 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP2 DUP2 ADD SWAP1 PUSH1 0x60 DUP2 ADD PUSH1 0x40 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x3A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x3BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x3DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0xB7A JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xE27 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x41A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0xE2C JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x450 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xEE9 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x47E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1038 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x49B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x4C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x4D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x4F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0x1044 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x54E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0x1236 JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x57C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x133D JUMP JUMPDEST PUSH2 0x26B PUSH2 0x148C JUMP JUMPDEST PUSH2 0x5BA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1492 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x5E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 SWAP1 SWAP2 ADD CALLDATALOAD AND PUSH2 0x14A5 JUMP JUMPDEST PUSH2 0x2B3 PUSH2 0x16AD JUMP JUMPDEST PUSH2 0x26B PUSH2 0x1759 JUMP JUMPDEST PUSH2 0x5BA PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x62A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x175F JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x650 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x176A JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x682 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x177F JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x69F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x17EA JUMP JUMPDEST PUSH2 0x6F5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x6D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x1A36 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 DUP3 SWAP1 SUB ADD SWAP1 RETURN JUMPDEST PUSH2 0x716 PUSH2 0x1A50 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x716 PUSH2 0x1A5F JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x750 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A6E JUMP JUMPDEST PUSH2 0x716 PUSH2 0x1AD9 JUMP JUMPDEST PUSH2 0x770 PUSH2 0x1AE8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x7AC JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x794 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x26B PUSH2 0x1B4A JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x7DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x1B50 JUMP JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x7FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x1C7E JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x835 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB PUSH1 0x20 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x40 ADD CALLDATALOAD AND PUSH2 0x1EB5 JUMP JUMPDEST PUSH2 0x716 PUSH2 0x200B JUMP JUMPDEST PUSH2 0x26B PUSH2 0x201A JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x882 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x20 SHL DUP2 GT ISZERO PUSH2 0x8AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x8BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH1 0x1 PUSH1 0x20 SHL DUP4 GT OR ISZERO PUSH2 0x8DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2024 JUMP JUMPDEST PUSH2 0x26B PUSH2 0x226F JUMP JUMPDEST PUSH2 0x959 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x949 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x2275 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x26B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x99E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x22A5 JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x9BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x22B0 JUMP JUMPDEST PUSH2 0x26B PUSH2 0x2465 JUMP JUMPDEST PUSH2 0x26B PUSH2 0x25DB JUMP JUMPDEST PUSH2 0x2B3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xA07 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x25E1 JUMP JUMPDEST PUSH2 0x716 PUSH2 0x26E4 JUMP JUMPDEST PUSH2 0xA27 PUSH2 0x26EE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xA61 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xA49 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xA8E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH2 0xAA6 PUSH2 0x270F JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xABF PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xB08 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4465 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xB13 DUP4 DUP4 DUP4 PUSH2 0x281E JUMP JUMPDEST ISZERO PUSH2 0xB64 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xB0BAC59718CD343C80A813518AFCF36846CFCFE6D56E2B3CAB9BD49F5F9B251C DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST PUSH4 0xA85BD01 PUSH1 0xE1 SHL SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xB8E PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xBD7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4465 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xBE0 DUP4 PUSH2 0x28A6 JUMP JUMPDEST PUSH2 0xC31 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0xC3B JUMPI PUSH2 0xE21 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xDA8 JUMPI DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x42842E0E ADDRESS DUP8 DUP7 DUP7 DUP7 DUP2 DUP2 LT PUSH2 0xC63 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCC0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL SWAP3 POP POP POP DUP1 ISZERO PUSH2 0xCD1 JUMPI POP PUSH1 0x1 JUMPDEST PUSH2 0xDA0 JUMPI RETURNDATASIZE DUP1 DUP1 ISZERO PUSH2 0xCFF JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0xD04 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP PUSH32 0x17E975018310F88872B58D4D8263ADCA83CF5C1893496EA2A86923DAB15276AD DUP2 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD64 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD4C JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD91 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xC3E JUMP JUMPDEST POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x69C2DE32BC4D47F488E72626A6CFDEE85089342E52675E7DE79C4B417623960C DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP5 DUP3 DUP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP4 DUP3 ADD MSTORE PUSH1 0x40 MLOAD PUSH1 0x1F SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND SWAP1 SWAP3 ADD DUP3 SWAP1 SUB SWAP6 POP SWAP1 SWAP4 POP POP POP POP LOG3 JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0xA1 SSTORE JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xE40 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xE89 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4465 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xE94 DUP4 DUP4 DUP4 PUSH2 0x281E JUMP JUMPDEST ISZERO PUSH2 0xB64 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xC65F48ACA3B7A99B7443D04B8FFBB073156179BC628DC3F7DEF5047748973469 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH2 0xEF1 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF02 PUSH2 0x1A50 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xF4B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4342 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xFAE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xFC4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD GT ISZERO PUSH2 0x1034 JUMPI DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5C19A95C DUP3 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x101B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x102F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x1041 DUP2 PUSH2 0x28BB JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x105D JUMPI POP PUSH2 0x105D PUSH2 0x294B JUMP JUMPDEST DUP1 PUSH2 0x106B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x10A6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F3 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x10D1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH2 0x1116 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42AB PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 MLOAD DUP1 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x112F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1159 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP DUP1 MLOAD PUSH2 0x116E SWAP2 PUSH1 0x98 SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x41B9 JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x11A5 JUMPI PUSH1 0x0 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x1188 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP PUSH2 0x119C DUP2 DUP4 PUSH2 0x295C JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x1172 JUMP JUMPDEST POP PUSH2 0x11AE PUSH2 0x2A87 JUMP JUMPDEST PUSH2 0x11B6 PUSH2 0x2B38 JUMP JUMPDEST PUSH2 0x11C1 PUSH1 0x0 NOT PUSH2 0x2BCD JUMP JUMPDEST PUSH1 0x97 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x9A DUP5 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP6 SWAP1 MSTORE DUP1 MLOAD PUSH32 0x25FF68DD81B34665B5BA7E553EE5511BF6812E12ADB4A7E2C0D9E26B3099CE79 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 POP DUP1 ISZERO PUSH2 0xE21 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x1242 DUP2 PUSH2 0x2C08 JUMP JUMPDEST PUSH2 0x1281 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4389 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1306 DUP5 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP9 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x12E7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x12FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x0 PUSH2 0x2CC4 JUMP JUMPDEST POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP4 AND DUP3 MSTORE SWAP3 SWAP1 SWAP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x138E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x13A2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x13B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND CALLER EQ PUSH2 0x1412 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F6F6E6C792D72657365727665 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9B DUP1 SLOAD PUSH1 0x0 SWAP2 DUP3 SWAP1 SSTORE SWAP1 PUSH2 0x1426 DUP3 PUSH2 0x2CDA JUMP JUMPDEST SWAP1 POP PUSH2 0x1445 DUP6 DUP3 PUSH2 0x1435 PUSH2 0x2D58 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x2DCE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND SWAP2 PUSH32 0x1C71C8E11FD443227C8F8D3DC1A237A3A5E8310B540C7FBCF5169754AEDF42C9 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x9D SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x149D DUP3 PUSH2 0x28A6 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x14B9 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1502 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4465 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 PUSH2 0x150C DUP2 PUSH2 0x2C08 JUMP JUMPDEST PUSH2 0x154B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4389 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 PUSH2 0x1555 JUMPI PUSH2 0xE21 JUMP JUMPDEST PUSH1 0x9D SLOAD DUP4 GT ISZERO PUSH2 0x15AC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F61776172642D657863656564732D617661696C000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x15B9 SWAP1 DUP5 PUSH2 0x2E20 JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH2 0x15C9 DUP5 DUP5 DUP5 PUSH1 0x0 PUSH2 0x2E82 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15D5 DUP4 DUP6 PUSH2 0x2F68 JUMP JUMPDEST SWAP1 POP PUSH2 0x165B DUP6 DUP5 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP10 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1629 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x163D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1653 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP5 PUSH2 0x2CC4 JUMP JUMPDEST DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xE2554529D99AB7A67DB6B4CEA2B32C7D55AE325F958861E05F304FDDED867E31 DUP7 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x16B5 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x16C6 PUSH2 0x1A50 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x170F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4342 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x9C SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x149D DUP3 PUSH2 0x2C08 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1777 DUP5 DUP5 DUP5 PUSH2 0x2FA0 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1787 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1798 PUSH2 0x1A50 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x17E1 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4342 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1041 DUP2 PUSH2 0x2BCD JUMP JUMPDEST CALLER PUSH2 0x17F4 DUP2 PUSH2 0x2C08 JUMP JUMPDEST PUSH2 0x1833 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4389 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO PUSH2 0x190D JUMPI PUSH1 0x0 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP7 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1891 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x18A5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x18BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x18CD DUP7 CALLER DUP5 DUP5 PUSH2 0x2FFA JUMP JUMPDEST SWAP1 POP DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x18FF JUMPI PUSH2 0x18FC CALLER PUSH2 0x18F6 DUP5 DUP8 PUSH2 0x2E20 JUMP JUMPDEST DUP4 PUSH2 0x3089 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x190A DUP7 CALLER DUP4 PUSH2 0x30CF JUMP JUMPDEST POP POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x1937 JUMPI POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO JUMPDEST ISZERO PUSH2 0x198E JUMPI PUSH2 0x198E DUP4 CALLER CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x12D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x19B0 JUMPI POP PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xE21 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB2210957 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP7 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP7 SWAP1 MSTORE CALLER PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xB2210957 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1A18 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1A2C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1A44 DUP6 DUP6 DUP6 PUSH2 0x326D JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x97 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x1A76 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1A87 PUSH2 0x1A50 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1AD0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4342 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1041 DUP2 PUSH2 0x340B JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x1B40 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1B22 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9A SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x97 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF5E3542B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1BA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1BB5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1BCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1BE7 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x14A0 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x10DFA58 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C36 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C4A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1C60 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x1C74 JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x14A0 JUMP JUMPDEST PUSH2 0x1777 DUP5 DUP3 PUSH2 0x351E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x1CD8 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP3 PUSH2 0x1CE7 DUP2 PUSH2 0x2C08 JUMP JUMPDEST PUSH2 0x1D26 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4389 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1D34 DUP9 DUP8 DUP10 PUSH2 0x326D JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0x1D77 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4362 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1D82 DUP9 DUP8 DUP4 PUSH2 0x353F JUMP JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x631B5DFB PUSH2 0x1D99 PUSH2 0x281A JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1DF1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E05 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 PUSH2 0x1E1E DUP4 DUP10 PUSH2 0x2E20 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1E2B DUP3 PUSH2 0x2CDA JUMP JUMPDEST SWAP1 POP PUSH2 0x1E3A DUP11 DUP3 PUSH2 0x1435 PUSH2 0x2D58 JUMP JUMPDEST DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP11 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1E56 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP14 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP7 SWAP1 MSTORE DUP1 DUP3 ADD DUP10 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x271704A58FD2953E49B87D67A0A3CE28A58147DE98A5457F60B4686F6385030 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST DUP3 PUSH2 0x1EBF DUP2 PUSH2 0x2C08 JUMP JUMPDEST PUSH2 0x1EFE JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4389 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1F06 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x1F17 PUSH2 0x1A50 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x1F60 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4342 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP6 AND DUP1 DUP4 MSTORE DUP7 DUP3 AND PUSH1 0x20 DUP1 DUP6 ADD DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP12 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9E DUP5 MSTORE DUP9 SWAP1 KECCAK256 SWAP7 MLOAD DUP8 SLOAD SWAP3 MLOAD DUP8 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP1 DUP8 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP6 AND OR SWAP1 SWAP5 SSTORE DUP5 MLOAD SWAP3 DUP4 MSTORE SWAP3 DUP3 ADD MSTORE DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 MLOAD PUSH32 0xFB0BA2CF86A2B03BCF387753A2192DA80A006AFA99DD022BB301C78E323BF1B9 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xAA6 PUSH2 0x3600 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x203D JUMPI POP PUSH2 0x203D PUSH2 0x294B JUMP JUMPDEST DUP1 PUSH2 0x204B JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2086 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F3 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x20B1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x20C3 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3660 JUMP JUMPDEST PUSH2 0x20FE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x36 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x43F9 PUSH1 0x36 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x2109 DUP6 DUP6 DUP6 PUSH2 0x1044 JUMP JUMPDEST PUSH1 0xA0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH4 0xC89039C5 PUSH1 0xE0 SHL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP3 ADD DUP2 MSTORE SWAP2 DUP4 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP5 SWAP4 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x217C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x215D JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS STATICCALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x21DC JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x21E1 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2221 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4235 PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND SWAP1 PUSH32 0x7A0CA506EDC9FCD36E010DBCAAD57DADE17BBAC71DFEB53269077098E863EECA SWAP1 PUSH1 0x0 SWAP1 LOG2 POP DUP1 ISZERO PUSH2 0x2268 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0xA1 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP3 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP3 DIV AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x149D DUP3 PUSH2 0x2CDA JUMP JUMPDEST PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x2308 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE DUP2 PUSH2 0x2317 DUP2 PUSH2 0x2C08 JUMP JUMPDEST PUSH2 0x2356 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4389 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP4 PUSH2 0x2360 DUP2 PUSH2 0x3666 JUMP JUMPDEST PUSH2 0x23B1 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F657863656564732D6C69717569646974792D63617000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x23BB PUSH2 0x281A JUMP JUMPDEST SWAP1 POP PUSH2 0x23C9 DUP8 DUP8 DUP8 DUP8 PUSH2 0x2E82 JUMP JUMPDEST PUSH2 0x23E8 DUP2 ADDRESS DUP9 PUSH2 0x23D7 PUSH2 0x2D58 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 SWAP1 PUSH2 0x368A JUMP JUMPDEST PUSH2 0x23F1 DUP7 PUSH2 0x28BB JUMP JUMPDEST DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP8 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x6CE569498E0F86F147466AC49211CB2A1FFE06195ADB805E383B3F2365109160 DUP10 DUP9 PUSH1 0x40 MLOAD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP PUSH1 0x1 PUSH1 0x65 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x65 SLOAD EQ ISZERO PUSH2 0x24BF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265656E7472616E637947756172643A207265656E7472616E742063616C6C00 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x65 SSTORE PUSH1 0x0 PUSH2 0x24CE PUSH2 0x270F JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x24DA PUSH2 0x3600 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 DUP3 GT PUSH2 0x24EC JUMPI PUSH1 0x0 PUSH2 0x24F6 JUMP JUMPDEST PUSH2 0x24F6 DUP3 DUP5 PUSH2 0x2E20 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x9D SLOAD DUP3 GT PUSH2 0x250A JUMPI PUSH1 0x0 PUSH2 0x2518 JUMP JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x2518 SWAP1 DUP4 SWAP1 PUSH2 0x2E20 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x25CA JUMPI PUSH1 0x0 PUSH2 0x252B DUP3 PUSH2 0x1B50 JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x2585 JUMPI PUSH1 0x9B SLOAD PUSH2 0x2540 SWAP1 DUP3 PUSH2 0x36E4 JUMP JUMPDEST PUSH1 0x9B SSTORE PUSH2 0x254D DUP3 DUP3 PUSH2 0x2E20 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 POP PUSH32 0x5F1703CCFA2730D4245350F228079926A37F26A44ECF6978A7EEAFFF0AF11407 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST PUSH1 0x9D SLOAD PUSH2 0x2592 SWAP1 DUP4 PUSH2 0x36E4 JUMP JUMPDEST PUSH1 0x9D SSTORE PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xCE2B6E507C7CA1A20CE136810F524EEFC19BA4C7E4866EB6CC0CBA76E778D4BE SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH1 0x9D SLOAD SWAP5 POP POP POP POP POP PUSH1 0x1 PUSH1 0x65 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x9B SLOAD DUP2 JUMP JUMPDEST PUSH2 0x25E9 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x25FA PUSH2 0x1A50 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2643 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x4342 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x2688 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x425E PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xAA6 PUSH2 0x2D58 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH5 0x332E342E35 PUSH1 0xD8 SHL DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x9B SLOAD SWAP1 POP PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x276F JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2751 JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2811 JUMPI PUSH2 0x2807 DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2794 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x18160DDD PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x27D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x27E8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x27FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP6 SWAP1 PUSH2 0x36E4 JUMP JUMPDEST SWAP4 POP PUSH1 0x1 ADD PUSH2 0x277D JUMP JUMPDEST POP SWAP2 SWAP3 POP POP POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2829 DUP4 PUSH2 0x28A6 JUMP JUMPDEST PUSH2 0x287A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F696E76616C69642D65787465726E616C2D746F6B656E PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH2 0x2887 JUMPI POP PUSH1 0x0 PUSH2 0x289F JUMP JUMPDEST PUSH2 0x289B PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND DUP6 DUP5 PUSH2 0x2DCE JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND SWAP2 AND EQ ISZERO SWAP1 JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH2 0x28E4 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH2 0x28D4 PUSH2 0x2D58 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x373E JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x87A6EEEF PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x87A6EEEF SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2937 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2268 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2956 ADDRESS PUSH2 0x3660 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xF77C4791 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x299F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x29B3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x29C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x2A26 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F746F6B656E2D6374726C722D6D69736D617463680000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x98 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x2A34 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 DUP5 AND SWAP2 PUSH32 0x460E712B4A5D801D031ED673DEA209B73AB854F7DDEB86B6C48082E92C3EEE66 SWAP2 SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2AA0 JUMPI POP PUSH2 0x2AA0 PUSH2 0x294B JUMP JUMPDEST DUP1 PUSH2 0x2AAE JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2AE9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F3 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2B14 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2B1C PUSH2 0x3851 JUMP JUMPDEST PUSH2 0x2B24 PUSH2 0x38F1 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2B51 JUMPI POP PUSH2 0x2B51 PUSH2 0x294B JUMP JUMPDEST DUP1 PUSH2 0x2B5F JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2B9A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F3 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2BC5 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x2B24 PUSH2 0x39EA JUMP JUMPDEST PUSH1 0x9C DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3FF20538222F568F27FF436C0C49DFD3E48D5B8F86533A3F759DC1C7089775AB SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x98 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2C62 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2C44 JUMPI JUMPDEST POP POP DUP4 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP3 POP POP POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2CB9 JUMPI DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x2C8E JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x2CB1 JUMPI PUSH1 0x1 SWAP4 POP POP POP POP PUSH2 0x14A0 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x2C70 JUMP JUMPDEST POP PUSH1 0x0 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xE21 DUP5 DUP5 PUSH2 0x2CD5 DUP8 DUP8 DUP8 DUP8 PUSH2 0x2FFA JUMP JUMPDEST PUSH2 0x30CF JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH3 0x982A61 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x13054C2 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2D26 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2D3A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2D50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xC89039C5 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xC89039C5 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2D9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x2DB1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2DC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0xA9059CBB PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xB64 SWAP1 DUP5 SWAP1 PUSH2 0x3A90 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2E77 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x99 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND ISZERO PUSH2 0x2F11 JUMPI PUSH1 0x99 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x4D7F3DB PUSH1 0xE4 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE DUP6 DUP2 AND PUSH1 0x44 DUP4 ADD MSTORE DUP5 DUP2 AND PUSH1 0x64 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x4D7F3DB0 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2EF8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2F0C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x5D7B0758 DUP6 DUP6 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1A18 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x289F SWAP1 DUP4 SWAP1 PUSH2 0x2F9B SWAP1 DUP3 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x351E JUMP JUMPDEST PUSH2 0x3B41 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x2FD6 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x351E JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x2FE7 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x289F JUMP JUMPDEST PUSH2 0x2FF1 DUP4 DUP3 PUSH2 0x3B66 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP9 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP3 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x303D JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x307F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x304A DUP9 DUP9 DUP9 PUSH2 0x3BCD JUMP JUMPDEST DUP3 SLOAD SWAP1 SWAP2 POP PUSH2 0x307B SWAP1 DUP9 SWAP1 DUP9 SWAP1 PUSH2 0x3076 SWAP1 DUP10 SWAP1 PUSH2 0x3070 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP8 PUSH2 0x36E4 JUMP JUMPDEST SWAP1 PUSH2 0x36E4 JUMP JUMPDEST PUSH2 0x3089 JUMP JUMPDEST SWAP3 POP POP JUMPDEST POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP2 SWAP1 PUSH2 0x30B8 SWAP1 DUP6 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x351E JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x30C6 JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE DUP2 SWAP1 KECCAK256 SLOAD DUP2 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND SWAP1 DUP1 PUSH2 0x3114 DUP5 PUSH2 0x3C7E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x3132 PUSH2 0x312D PUSH2 0x3CC6 JUMP JUMPDEST PUSH2 0x3CCC JUMP JUMPDEST PUSH4 0xFFFFFFFF SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP3 DUP4 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F DUP5 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 DUP11 AND DUP3 MSTORE SWAP2 DUP5 MSTORE DUP2 SWAP1 KECCAK256 DUP5 MLOAD DUP2 SLOAD SWAP5 DUP7 ADD MLOAD SWAP6 SWAP1 SWAP3 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR PUSH4 0xFFFFFFFF PUSH1 0xC0 SHL NOT AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP5 SWAP1 SWAP3 AND SWAP4 SWAP1 SWAP4 MUL OR PUSH1 0xFF PUSH1 0xE0 SHL NOT AND PUSH1 0x1 PUSH1 0xE0 SHL SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 MUL OR SWAP1 SSTORE DUP2 DUP2 LT ISZERO PUSH2 0x3215 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0x2F92D56910619B38BC29FD8E4CA5E56359EDAC7A0C086CDCD305FB603FA37491 PUSH2 0x31FF DUP6 DUP6 PUSH2 0x2E20 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 PUSH2 0xE21 JUMP JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0xE21 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP1 DUP6 AND PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF PUSH2 0x3256 DUP5 DUP7 PUSH2 0x2E20 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 DUP8 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x32BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x32D3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x32E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x333B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH22 0x5072697A65506F6F6C2F696E737566662D66756E6473 PUSH1 0x50 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x3348 DUP7 DUP7 DUP4 PUSH1 0x0 PUSH2 0x2CC4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x335D DUP7 PUSH2 0x3358 DUP5 DUP9 PUSH2 0x2E20 JUMP JUMPDEST PUSH2 0x2F68 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP3 GT PUSH2 0x33D4 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP13 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x33D1 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2E20 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x33E0 DUP9 DUP9 PUSH2 0x2F68 JUMP JUMPDEST SWAP1 POP DUP1 DUP3 GT PUSH2 0x33EF JUMPI DUP2 PUSH2 0x33F1 JUMP JUMPDEST DUP1 JUMPDEST SWAP5 POP PUSH2 0x33FD DUP2 DUP7 PUSH2 0x2E20 JUMP JUMPDEST SWAP6 POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x3466 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D6E6F742D7A65726F PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x3483 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3D10 JUMP JUMPDEST PUSH2 0x34D4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5072697A65506F6F6C2F7072697A6553747261746567792D696E76616C696400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x99 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD PUSH32 0x7F58DC86BC2E435CB77CA0EDB1DF55E25F90CAF2D6BD866971715437D456A212 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x352B DUP4 DUP6 PUSH2 0x3D2C JUMP JUMPDEST SWAP1 POP PUSH2 0x1777 DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x3D85 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD PUSH2 0x3581 SWAP1 PUSH2 0x357C SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND DUP4 PUSH2 0x2E20 JUMP JUMPDEST PUSH2 0x3C7E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 PUSH32 0xF584C579437BC25785B953CC4D8D247251812751E1871C6130CBDECF95A106CF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0xA0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xB99152D PUSH1 0xE4 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0xB99152D0 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x364C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2DB1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3671 PUSH2 0x270F JUMP JUMPDEST PUSH1 0x9C SLOAD SWAP1 SWAP2 POP PUSH2 0x3681 DUP3 DUP6 PUSH2 0x36E4 JUMP JUMPDEST GT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x24 DUP4 ADD MSTORE DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x84 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x23B872DD PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xE21 SWAP1 DUP6 SWAP1 PUSH2 0x3A90 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x289F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP1 ISZERO DUP1 PUSH2 0x37C4 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH4 0x6EB1769F PUSH1 0xE1 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE SWAP2 MLOAD SWAP2 DUP6 AND SWAP2 PUSH4 0xDD62ED3E SWAP2 PUSH1 0x44 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3796 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x37AA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x37C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO JUMPDEST PUSH2 0x37FF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x36 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x442F PUSH1 0x36 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x64 SWAP1 SWAP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x95EA7B3 PUSH1 0xE0 SHL OR SWAP1 MSTORE PUSH2 0xB64 SWAP1 DUP5 SWAP1 PUSH2 0x3A90 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x386A JUMPI POP PUSH2 0x386A PUSH2 0x294B JUMP JUMPDEST DUP1 PUSH2 0x3878 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x38B3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F3 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2B24 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x390A JUMPI POP PUSH2 0x390A PUSH2 0x294B JUMP JUMPDEST DUP1 PUSH2 0x3918 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3953 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F3 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x397E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x3988 PUSH2 0x281A JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x3A03 JUMPI POP PUSH2 0x3A03 PUSH2 0x294B JUMP JUMPDEST DUP1 PUSH2 0x3A11 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x3A4C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42F3 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x3A77 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x65 SSTORE DUP1 ISZERO PUSH2 0x1041 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x3AE5 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5361666545524332303A206C6F772D6C6576656C2063616C6C206661696C6564 DUP2 MSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3DC7 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP2 POP ISZERO PUSH2 0xB64 JUMPI DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3B04 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xB64 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x43CF PUSH1 0x2A SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x3B50 DUP5 PUSH1 0x9A SLOAD PUSH2 0x351E JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x3B5E JUMPI DUP1 SWAP3 POP JUMPDEST POP SWAP1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x3BBC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0x3BC5 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9F PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP8 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SWAP1 DUP2 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0xC0 SHL DUP2 DIV PUSH4 0xFFFFFFFF AND SWAP1 PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x3C1B JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x289F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3C2F DUP3 PUSH2 0x3C29 PUSH2 0x3CC6 JUMP JUMPDEST SWAP1 PUSH2 0x2E20 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x9E PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x3C67 SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x3D2C JUMP JUMPDEST SWAP1 POP PUSH2 0x3C73 DUP6 DUP3 PUSH2 0x351E JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x3CC2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4284 PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0xA1 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x20 SHL DUP3 LT PUSH2 0x3CC2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x43A9 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3D1B DUP4 PUSH2 0x3DD6 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x289F JUMPI POP PUSH2 0x289F DUP4 DUP4 PUSH2 0x3E09 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x3D3B JUMPI POP PUSH1 0x0 PUSH2 0x2E7C JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x3D48 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x289F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x4321 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x289F DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH2 0x3E2C JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1777 DUP5 DUP5 PUSH1 0x0 DUP6 PUSH2 0x3ECE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3DE9 DUP3 PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL PUSH2 0x3E09 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x149D JUMPI POP PUSH2 0x3E02 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT PUSH2 0x3E09 JUMP JUMPDEST ISZERO SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x3E18 DUP6 DUP6 PUSH2 0x401F JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x2FF1 JUMPI POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x3EB8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3E7D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3E65 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3EAA JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x3EC4 JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 SELFBALANCE LT ISZERO PUSH2 0x3F0F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x42CD PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3F18 DUP6 PUSH2 0x3660 JUMP JUMPDEST PUSH2 0x3F69 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x416464726573733A2063616C6C20746F206E6F6E2D636F6E7472616374000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 DUP8 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3FA8 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3F89 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x400A JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x400F JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH2 0x3C73 DUP3 DUP3 DUP7 PUSH2 0x4153 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP4 AND PUSH1 0x24 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP2 ADD DUP3 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL OR DUP2 MSTORE SWAP2 MLOAD DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP3 DUP5 SWAP3 PUSH1 0x60 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND SWAP3 PUSH2 0x7530 SWAP3 DUP8 SWAP3 DUP3 SWAP2 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x40A7 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x4088 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP7 STATICCALL SWAP3 POP POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x4108 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x410D JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP PUSH1 0x20 DUP2 MLOAD LT ISZERO PUSH2 0x412B JUMPI PUSH1 0x0 DUP1 SWAP5 POP SWAP5 POP POP POP POP PUSH2 0x414C JUMP JUMPDEST DUP2 DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4141 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP4 ISZERO PUSH2 0x4162 JUMPI POP DUP2 PUSH2 0x289F JUMP JUMPDEST DUP3 MLOAD ISZERO PUSH2 0x4172 JUMPI DUP3 MLOAD DUP1 DUP5 PUSH1 0x20 ADD REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 DUP2 MSTORE DUP5 MLOAD PUSH1 0x24 DUP5 ADD MSTORE DUP5 MLOAD DUP6 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 PUSH1 0x44 ADD SWAP2 SWAP1 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 ISZERO PUSH2 0x3E7D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3E65 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x420E JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x420E JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x41D9 JUMP JUMPDEST POP PUSH2 0x3CC2 SWAP3 SWAP2 POP JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x3CC2 JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x4216 JUMP INVALID MSIZE PUSH10 0x656C64536F7572636550 PUSH19 0x697A65506F6F6C2F696E76616C69642D796965 PUSH13 0x642D736F757263654F776E6162 PUSH13 0x653A206E6577206F776E657220 PUSH10 0x7320746865207A65726F KECCAK256 PUSH2 0x6464 PUSH19 0x65737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E2031323820626974735072697A65 POP PUSH16 0x6F6C2F72657365727665526567697374 PUSH19 0x792D6E6F742D7A65726F416464726573733A20 PUSH10 0x6E73756666696369656E PUSH21 0x2062616C616E636520666F722063616C6C496E6974 PUSH10 0x616C697A61626C653A20 PUSH4 0x6F6E7472 PUSH2 0x6374 KECCAK256 PUSH10 0x7320616C726561647920 PUSH10 0x6E697469616C697A6564 MSTORE8 PUSH2 0x6665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F774F776E61626C653A20 PUSH4 0x616C6C65 PUSH19 0x206973206E6F7420746865206F776E65725072 PUSH10 0x7A65506F6F6C2F657869 PUSH21 0x2D6665652D657863656564732D757365722D6D6178 PUSH10 0x6D756D5072697A65506F PUSH16 0x6C2F756E6B6E6F776E2D746F6B656E00 STOP STOP STOP STOP STOP STOP STOP STOP MSTORE8 PUSH2 0x6665 NUMBER PUSH2 0x7374 GASPRICE KECCAK256 PUSH23 0x616C756520646F65736E27742066697420696E20333220 PUSH3 0x697473 MSTORE8 PUSH2 0x6665 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS KECCAK256 PUSH16 0x7065726174696F6E20646964206E6F74 KECCAK256 PUSH20 0x7563636565645969656C64536F75726365507269 PUSH27 0x65506F6F6C2F7969656C642D736F757263652D6E6F742D636F6E74 PUSH19 0x6163742D616464726573735361666545524332 ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F76652066726F6D206E6F6E2D7A65726F2074 PUSH16 0x206E6F6E2D7A65726F20616C6C6F7761 PUSH15 0x63655072697A65506F6F6C2F6F6E6C PUSH26 0x2D7072697A65537472617465677900000000A264697066735822 SLT KECCAK256 BALANCE CALLDATALOAD 0xEA DELEGATECALL PUSH1 0x9C SWAP13 SDIV SGT 0xC 0xBC 0xC7 0x1F DUP9 DUP14 LT PUSH4 0xCD87122B EXTCODEHASH 0xC0 ORIGIN 0xB8 0xBA 0xEF 0xB6 0xDC SIGNEXTEND PUSH10 0x4F64736F6C634300060C STOP CALLER ",
              "sourceMap": "245:655:84:-:0;;;514:77;;;;;;;;;;553:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;542:8:84;:44;;-1:-1:-1;;;;;;542:44:84;-1:-1:-1;;;;;542:44:84;;;;;;;;;;245:655;;;;;;;;;;:::o;:::-;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106100415760003560e01c8063022ec09514610046578063b3eeb5e21461006a578063efc81a8c14610120575b600080fd5b61004e610128565b604080516001600160a01b039092168252519081900360200190f35b61004e6004803603604081101561008057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100ab57600080fd5b8201836020820111156100bd57600080fd5b803590602001918460018302840111640100000000831117156100df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610137945050505050565b61004e6102b3565b6000546001600160a01b031681565b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a18251156102ac576000826001600160a01b0316846040518082805190602001908083835b602083106102035780518252601f1990920191602091820191016101e4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610265576040519150601f19603f3d011682016040523d82523d6000602084013e61026a565b606091505b50509050806102aa5760405162461bcd60e51b81526004018080602001828103825260248152602001806102de6024913960400191505060405180910390fd5b505b5092915050565b6000805460408051602081019091528281526102d8916001600160a01b031690610137565b90509056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a264697066735822122083e999ce707553b53bfc6c15686c341a64aa32b0527d01a5e9bd546f4abc30d864736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x22EC095 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x6A JUMPI DUP1 PUSH4 0xEFC81A8C EQ PUSH2 0x120 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x128 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x137 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x4E PUSH2 0x2B3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x265 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x26A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2DE PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE DUP3 DUP2 MSTORE PUSH2 0x2D8 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x137 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 DUP4 0xE9 SWAP10 0xCE PUSH17 0x7553B53BFC6C15686C341A64AA32B0527D ADD 0xA5 0xE9 0xBD SLOAD PUSH16 0x4ABC30D864736F6C634300060C003300 ",
              "sourceMap": "245:655:84:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;381:43;;;:::i;:::-;;;;-1:-1:-1;;;;;381:43:84;;;;;;;;;;;;;;182:778:38;;;;;;;;;;;;;;;;-1:-1:-1;;;;;182:778:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;182:778:38;;-1:-1:-1;182:778:38;;-1:-1:-1;;;;;182:778:38:i;750:148:84:-;;;:::i;381:43::-;;;-1:-1:-1;;;;;381:43:84;;:::o;182:778:38:-;257:13;416:19;446:6;438:15;;416:37;;495:4;489:11;-1:-1:-1;;;514:5:38;507:81;620:11;613:4;606:5;602:16;595:37;-1:-1:-1;;;657:4:38;650:5;646:16;639:92;764:4;757:5;754:1;747:22;786:28;;;-1:-1:-1;;;;;786:28:38;;;;;;738:31;;-1:-1:-1;786:28:38;;-1:-1:-1;786:28:38;;;;;;;824:12;;:16;821:135;;851:12;868:5;-1:-1:-1;;;;;868:10:38;879:5;868:17;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;868:17:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;850:35;;;901:7;893:56;;;;-1:-1:-1;;;893:56:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;821:135;;182:778;;;;;:::o;750:148:84:-;786:27;878:8;;856:36;;;;;;;;;;;;;;-1:-1:-1;;;;;878:8:84;;856:13;:36::i;:::-;821:72;;750:148;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "164600",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "create()": "infinite",
                "deployMinimal(address,bytes)": "infinite",
                "instance()": "1015"
              }
            },
            "methodIdentifiers": {
              "create()": "efc81a8c",
              "deployMinimal(address,bytes)": "b3eeb5e2",
              "instance()": "022ec095"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"name\":\"ProxyCreated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract YieldSourcePrizePoolHarness\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"deployMinimal\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"instance\",\"outputs\":[{\"internalType\":\"contract YieldSourcePrizePoolHarness\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"create()\":{\"returns\":{\"_0\":\"A reference to the new proxied YieldSource Prize Pool\"}}},\"title\":\"YieldSource Prize Pool Proxy Factory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":\"Initializes the Factory with an instance of the YieldSource Prize Pool\",\"create()\":{\"notice\":\"Creates a new YieldSource Prize Pool as a proxy of the template instance\"},\"instance()\":{\"notice\":\"Contract template for deploying proxied Prize Pools\"}},\"notice\":\"Minimal proxy pattern for creating new YieldSource Prize Pools\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/YieldSourcePrizePoolHarnessProxyFactory.sol\":\"YieldSourcePrizePoolHarnessProxyFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Library used to query support of an interface declared via {IERC165}.\\n *\\n * Note that these functions return the actual result of the query: they do not\\n * `revert` if an interface is not supported. It is up to the caller to decide\\n * what to do in these cases.\\n */\\nlibrary ERC165CheckerUpgradeable {\\n    // As per the EIP-165 spec, no interface should ever match 0xffffffff\\n    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;\\n\\n    /*\\n     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7\\n     */\\n    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n\\n    /**\\n     * @dev Returns true if `account` supports the {IERC165} interface,\\n     */\\n    function supportsERC165(address account) internal view returns (bool) {\\n        // Any contract that implements ERC165 must explicitly indicate support of\\n        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\\n        return _supportsERC165Interface(account, _INTERFACE_ID_ERC165) &&\\n            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports the interface defined by\\n     * `interfaceId`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\\n        // query support of both ERC165 as per the spec and support of _interfaceId\\n        return supportsERC165(account) &&\\n            _supportsERC165Interface(account, interfaceId);\\n    }\\n\\n    /**\\n     * @dev Returns a boolean array where each value corresponds to the\\n     * interfaces passed in and whether they're supported or not. This allows\\n     * you to batch check interfaces for a contract where your expectation\\n     * is that some interfaces may not be supported.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) {\\n        // an array of booleans corresponding to interfaceIds and whether they're supported or not\\n        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\\n\\n        // query support of ERC165 itself\\n        if (supportsERC165(account)) {\\n            // query support of each interface in interfaceIds\\n            for (uint256 i = 0; i < interfaceIds.length; i++) {\\n                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);\\n            }\\n        }\\n\\n        return interfaceIdsSupported;\\n    }\\n\\n    /**\\n     * @dev Returns true if `account` supports all the interfaces defined in\\n     * `interfaceIds`. Support for {IERC165} itself is queried automatically.\\n     *\\n     * Batch-querying can lead to gas savings by skipping repeated checks for\\n     * {IERC165} support.\\n     *\\n     * See {IERC165-supportsInterface}.\\n     */\\n    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\\n        // query support of ERC165 itself\\n        if (!supportsERC165(account)) {\\n            return false;\\n        }\\n\\n        // query support of each interface in _interfaceIds\\n        for (uint256 i = 0; i < interfaceIds.length; i++) {\\n            if (!_supportsERC165Interface(account, interfaceIds[i])) {\\n                return false;\\n            }\\n        }\\n\\n        // all interfaces supported\\n        return true;\\n    }\\n\\n    /**\\n     * @notice Query if a contract implements an interface, does not check ERC165 support\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return true if the contract at account indicates support of the interface with\\n     * identifier interfaceId, false otherwise\\n     * @dev Assumes that account contains a contract that supports ERC165, otherwise\\n     * the behavior of this method is undefined. This precondition can be checked\\n     * with {supportsERC165}.\\n     * Interface identification is specified in ERC-165.\\n     */\\n    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {\\n        // success determines whether the staticcall succeeded and result determines\\n        // whether the contract at account indicates support of _interfaceId\\n        (bool success, bool result) = _callERC165SupportsInterface(account, interfaceId);\\n\\n        return (success && result);\\n    }\\n\\n    /**\\n     * @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\\n     * @param account The address of the contract to query for support of an interface\\n     * @param interfaceId The interface identifier, as specified in ERC-165\\n     * @return success true if the STATICCALL succeeded, false otherwise\\n     * @return result true if the STATICCALL succeeded and the contract at account\\n     * indicates support of the interface with identifier interfaceId, false otherwise\\n     */\\n    function _callERC165SupportsInterface(address account, bytes4 interfaceId)\\n        private\\n        view\\n        returns (bool, bool)\\n    {\\n        bytes memory encodedParams = abi.encodeWithSelector(_INTERFACE_ID_ERC165, interfaceId);\\n        (bool success, bytes memory result) = account.staticcall{ gas: 30000 }(encodedParams);\\n        if (result.length < 32) return (false, false);\\n        return (success, abi.decode(result, (bool)));\\n    }\\n}\\n\",\"keccak256\":\"0x0a6e54697511dffc43eaf2490fa35437ed69f70ccf529568252204035f1e513c\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n    using AddressUpgradeable for address;\\n\\n    function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        // solhint-disable-next-line max-line-length\\n        require((value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).add(value);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender).sub(value, \\\"SafeERC20: decreased allowance below zero\\\");\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) { // Return data is optional\\n            // solhint-disable-next-line max-line-length\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x8457e15aa90badabe0d6ef6f572f1ebd47bebf156921c825ae6e009dda15b706\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n    /**\\n     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n     * by `operator` from `from`, this function is called.\\n     *\\n     * It must return its Solidity selector to confirm the token transfer.\\n     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n     *\\n     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n     */\\n    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0x53552243cd7de0d57a876cbaee3485d4bdc2b1c7d58ff15447cd623a3ddb5cd0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\nimport \\\"../../introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n    /**\\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\\n      *\\n      * Requirements:\\n      *\\n      * - `from` cannot be the zero address.\\n      * - `to` cannot be the zero address.\\n      * - `tokenId` token must exist and be owned by `from`.\\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n      *\\n      * Emits a {Transfer} event.\\n      */\\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n}\\n\",\"keccak256\":\"0x3dab19bb4a63bcbda1ee153ca291694f92f9009fad28626126b15a8503b0e5ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    function __ReentrancyGuard_init() internal initializer {\\n        __ReentrancyGuard_init_unchained();\\n    }\\n\\n    function __ReentrancyGuard_init_unchained() internal initializer {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x46034cd5cca740f636345c8f7aebae0f78adfd4b70e31e6f888cccbe1086586e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"@pooltogether/yield-source-interface/contracts/IYieldSource.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.4.0 <0.8.0;\\n\\n/// @title Defines the functions used to interact with a yield source.  The Prize Pool inherits this contract.\\n/// @notice Prize Pools subclasses need to implement this interface so that yield can be generated.\\ninterface IYieldSource {\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function depositToken() external view returns (address);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function balanceOfToken(address addr) external returns (uint256);\\n\\n  /// @notice Supplies tokens to the yield source.  Allows assets to be supplied on other user's behalf using the `to` param.\\n  /// @param amount The amount of `token()` to be supplied\\n  /// @param to The user whose balance will receive the tokens\\n  function supplyTokenTo(uint256 amount, address to) external;\\n\\n  /// @notice Redeems tokens from the yield source.\\n  /// @param amount The amount of `token()` to withdraw.  Denominated in `token()` as above.\\n  /// @return The actual amount of tokens that were redeemed.\\n  function redeemToken(uint256 amount) external returns (uint256);\\n\\n}\\n\",\"keccak256\":\"0xee862089c29ec1f9b2a1df7c01953d88ef5dfcfb2c2198e8926f692ec76537f1\",\"license\":\"MIT\"},\"contracts/external/compound/ICompLike.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface ICompLike is IERC20Upgradeable {\\n  function getCurrentVotes(address account) external view returns (uint96);\\n  function delegate(address delegatee) external;\\n}\\n\",\"keccak256\":\"0xb1603ed025f146aeca1e4de6f1910b460f8dee891a3a4a48a79ab829725bdb06\",\"license\":\"GPL-3.0\"},\"contracts/external/openzeppelin/ProxyFactory.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\n// solium-disable security/no-inline-assembly\\n// solium-disable security/no-low-level-calls\\ncontract ProxyFactory {\\n\\n  event ProxyCreated(address proxy);\\n\\n  function deployMinimal(address _logic, bytes memory _data) public returns (address proxy) {\\n    // Adapted from https://github.com/optionality/clone-factory/blob/32782f82dfc5a00d103a7e61a17a5dedbd1e8e9d/contracts/CloneFactory.sol\\n    bytes20 targetBytes = bytes20(_logic);\\n    assembly {\\n      let clone := mload(0x40)\\n      mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n      mstore(add(clone, 0x14), targetBytes)\\n      mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n      proxy := create(0, clone, 0x37)\\n    }\\n\\n    emit ProxyCreated(address(proxy));\\n\\n    if(_data.length > 0) {\\n      (bool success,) = proxy.call(_data);\\n      require(success, \\\"ProxyFactory/constructor-call-failed\\\");\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0xf0422303985796fdd8bdf772ac8e34331e2e63006f657989cca010fa4776d735\"},\"contracts/prize-pool/PrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\n\\nimport \\\"../external/compound/ICompLike.sol\\\";\\nimport \\\"../registry/RegistryInterface.sol\\\";\\nimport \\\"../reserve/ReserveInterface.sol\\\";\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/TokenListenerLibrary.sol\\\";\\nimport \\\"../token/ControlledToken.sol\\\";\\nimport \\\"../token/TokenControllerInterface.sol\\\";\\nimport \\\"../utils/MappedSinglyLinkedList.sol\\\";\\nimport \\\"./PrizePoolInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\nabstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, ReentrancyGuardUpgradeable, TokenControllerInterface, IERC721ReceiverUpgradeable {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using SafeERC20Upgradeable for IERC721Upgradeable;\\n  using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;\\n  using ERC165CheckerUpgradeable for address;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    address reserveRegistry,\\n    uint256 maxExitFeeMantissa\\n  );\\n\\n  /// @dev Event emitted when controlled token is added\\n  event ControlledTokenAdded(\\n    ControlledTokenInterface indexed token\\n  );\\n\\n  /// @dev Emitted when reserve is captured.\\n  event ReserveFeeCaptured(\\n    uint256 amount\\n  );\\n\\n  event AwardCaptured(\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when assets are deposited\\n  event Deposited(\\n    address indexed operator,\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount,\\n    address referrer\\n  );\\n\\n  /// @dev Event emitted when interest is awarded to a winner\\n  event Awarded(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are awarded to a winner\\n  event AwardedExternalERC20(\\n    address indexed winner,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC20s are transferred out\\n  event TransferredExternalERC20(\\n    address indexed to,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when external ERC721s are awarded to a winner\\n  event AwardedExternalERC721(\\n    address indexed winner,\\n    address indexed token,\\n    uint256[] tokenIds\\n  );\\n\\n  /// @dev Event emitted when assets are withdrawn instantly\\n  event InstantWithdrawal(\\n    address indexed operator,\\n    address indexed from,\\n    address indexed token,\\n    uint256 amount,\\n    uint256 redeemed,\\n    uint256 exitFee\\n  );\\n\\n  event ReserveWithdrawal(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  /// @dev Event emitted when the Liquidity Cap is set\\n  event LiquidityCapSet(\\n    uint256 liquidityCap\\n  );\\n\\n  /// @dev Event emitted when the Credit plan is set\\n  event CreditPlanSet(\\n    address token,\\n    uint128 creditLimitMantissa,\\n    uint128 creditRateMantissa\\n  );\\n\\n  /// @dev Event emitted when the Prize Strategy is set\\n  event PrizeStrategySet(\\n    address indexed prizeStrategy\\n  );\\n\\n  /// @dev Emitted when credit is minted\\n  event CreditMinted(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when credit is burned\\n  event CreditBurned(\\n    address indexed user,\\n    address indexed token,\\n    uint256 amount\\n  );\\n\\n  /// @dev Emitted when there was an error thrown awarding an External ERC721\\n  event ErrorAwardingExternalERC721(bytes error);\\n\\n\\n  struct CreditPlan {\\n    uint128 creditLimitMantissa;\\n    uint128 creditRateMantissa;\\n  }\\n\\n  struct CreditBalance {\\n    uint192 balance;\\n    uint32 timestamp;\\n    bool initialized;\\n  }\\n\\n  /// @notice Semver Version\\n  string constant public VERSION = \\\"3.4.5\\\";\\n\\n  /// @dev Reserve to which reserve fees are sent\\n  RegistryInterface public reserveRegistry;\\n\\n  /// @dev An array of all the controlled tokens\\n  ControlledTokenInterface[] internal _tokens;\\n\\n  /// @dev The Prize Strategy that this Prize Pool is bound to.\\n  TokenListenerInterface public prizeStrategy;\\n\\n  /// @dev The maximum possible exit fee fraction as a fixed point 18 number.\\n  /// For example, if the maxExitFeeMantissa is \\\"0.1 ether\\\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai\\n  uint256 public maxExitFeeMantissa;\\n\\n  /// @dev The total funds that have been allocated to the reserve\\n  uint256 public reserveTotalSupply;\\n\\n  /// @dev The total amount of funds that the prize pool can hold.\\n  uint256 public liquidityCap;\\n\\n  /// @dev the The awardable balance\\n  uint256 internal _currentAwardBalance;\\n\\n  /// @dev Stores the credit plan for each token.\\n  mapping(address => CreditPlan) internal _tokenCreditPlans;\\n\\n  /// @dev Stores each users balance of credit per token.\\n  mapping(address => mapping(address => CreditBalance)) internal _tokenCreditBalances;\\n\\n  /// @notice Initializes the Prize Pool\\n  /// @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\\n  /// @param _maxExitFeeMantissa The maximum exit fee size\\n  function initialize (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_reserveRegistry) != address(0), \\\"PrizePool/reserveRegistry-not-zero\\\");\\n    uint256 controlledTokensLength = _controlledTokens.length;\\n    _tokens = new ControlledTokenInterface[](controlledTokensLength);\\n\\n    for (uint256 i = 0; i < controlledTokensLength; i++) {\\n      ControlledTokenInterface controlledToken = _controlledTokens[i];\\n      _addControlledToken(controlledToken, i);\\n    }\\n    __Ownable_init();\\n    __ReentrancyGuard_init();\\n    _setLiquidityCap(uint256(-1));\\n\\n    reserveRegistry = _reserveRegistry;\\n    maxExitFeeMantissa = _maxExitFeeMantissa;\\n\\n    emit Initialized(\\n      address(_reserveRegistry),\\n      maxExitFeeMantissa\\n    );\\n  }\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external override view returns (address) {\\n    return address(_token());\\n  }\\n\\n  /// @dev Returns the total underlying balance of all assets. This includes both principal and interest.\\n  /// @return The underlying balance of assets\\n  function balance() external returns (uint256) {\\n    return _balance();\\n  }\\n\\n  /// @dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function canAwardExternal(address _externalToken) external view returns (bool) {\\n    return _canAwardExternal(_externalToken);\\n  }\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    canAddLiquidity(amount)\\n  {\\n    address operator = _msgSender();\\n\\n    _mint(to, amount, controlledToken, referrer);\\n\\n    _token().safeTransferFrom(operator, address(this), amount);\\n    _supply(amount);\\n\\n    emit Deposited(operator, to, controlledToken, amount, referrer);\\n  }\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  )\\n    external override\\n    nonReentrant\\n    onlyControlledToken(controlledToken)\\n    returns (uint256)\\n  {\\n    (uint256 exitFee, uint256 burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n    require(exitFee <= maximumExitFee, \\\"PrizePool/exit-fee-exceeds-user-maximum\\\");\\n\\n    // burn the credit\\n    _burnCredit(from, controlledToken, burnedCredit);\\n\\n    // burn the tickets\\n    ControlledToken(controlledToken).controllerBurnFrom(_msgSender(), from, amount);\\n\\n    // redeem the tickets less the fee\\n    uint256 amountLessFee = amount.sub(exitFee);\\n    uint256 redeemed = _redeem(amountLessFee);\\n\\n    _token().safeTransfer(from, redeemed);\\n\\n    emit InstantWithdrawal(_msgSender(), from, controlledToken, amount, redeemed, exitFee);\\n\\n    return exitFee;\\n  }\\n\\n  /// @notice Limits the exit fee to the maximum as hard-coded into the contract\\n  /// @param withdrawalAmount The amount that is attempting to be withdrawn\\n  /// @param exitFee The exit fee to check against the limit\\n  /// @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned.\\n  function _limitExitFee(uint256 withdrawalAmount, uint256 exitFee) internal view returns (uint256) {\\n    uint256 maxFee = FixedPoint.multiplyUintByMantissa(withdrawalAmount, maxExitFeeMantissa);\\n    if (exitFee > maxFee) {\\n      exitFee = maxFee;\\n    }\\n    return exitFee;\\n  }\\n\\n  /// @notice Updates the Prize Strategy when tokens are transferred between holders.\\n  /// @param from The address the tokens are being transferred from (0 if minting)\\n  /// @param to The address the tokens are being transferred to (0 if burning)\\n  /// @param amount The amount of tokens being trasferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external override onlyControlledToken(msg.sender) {\\n    if (from != address(0)) {\\n      uint256 fromBeforeBalance = IERC20Upgradeable(msg.sender).balanceOf(from);\\n      // first accrue credit for their old balance\\n      uint256 newCreditBalance = _calculateCreditBalance(from, msg.sender, fromBeforeBalance, 0);\\n\\n      if (from != to) {\\n        // if they are sending funds to someone else, we need to limit their accrued credit to their new balance\\n        newCreditBalance = _applyCreditLimit(msg.sender, fromBeforeBalance.sub(amount), newCreditBalance);\\n      }\\n\\n      _updateCreditBalance(from, msg.sender, newCreditBalance);\\n    }\\n    if (to != address(0) && to != from) {\\n      _accrueCredit(to, msg.sender, IERC20Upgradeable(msg.sender).balanceOf(to), 0);\\n    }\\n    // if we aren't minting\\n    if (from != address(0) && address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenTransfer(from, to, amount, msg.sender);\\n    }\\n  }\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external override view returns (uint256) {\\n    return _currentAwardBalance;\\n  }\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external override nonReentrant returns (uint256) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n\\n    // it's possible for the balance to be slightly less due to rounding errors in the underlying yield source\\n    uint256 currentBalance = _balance();\\n    uint256 totalInterest = (currentBalance > tokenTotalSupply) ? currentBalance.sub(tokenTotalSupply) : 0;\\n    uint256 unaccountedPrizeBalance = (totalInterest > _currentAwardBalance) ? totalInterest.sub(_currentAwardBalance) : 0;\\n\\n    if (unaccountedPrizeBalance > 0) {\\n      uint256 reserveFee = calculateReserveFee(unaccountedPrizeBalance);\\n      if (reserveFee > 0) {\\n        reserveTotalSupply = reserveTotalSupply.add(reserveFee);\\n        unaccountedPrizeBalance = unaccountedPrizeBalance.sub(reserveFee);\\n        emit ReserveFeeCaptured(reserveFee);\\n      }\\n      _currentAwardBalance = _currentAwardBalance.add(unaccountedPrizeBalance);\\n\\n      emit AwardCaptured(unaccountedPrizeBalance);\\n    }\\n\\n    return _currentAwardBalance;\\n  }\\n\\n  function withdrawReserve(address to) external override onlyReserve returns (uint256) {\\n\\n    uint256 amount = reserveTotalSupply;\\n    reserveTotalSupply = 0;\\n    uint256 redeemed = _redeem(amount);\\n\\n    _token().safeTransfer(address(to), redeemed);\\n\\n    emit ReserveWithdrawal(to, amount);\\n\\n    return redeemed;\\n  }\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external override\\n    onlyPrizeStrategy\\n    onlyControlledToken(controlledToken)\\n  {\\n    if (amount == 0) {\\n      return;\\n    }\\n\\n    require(amount <= _currentAwardBalance, \\\"PrizePool/award-exceeds-avail\\\");\\n    _currentAwardBalance = _currentAwardBalance.sub(amount);\\n\\n    _mint(to, amount, controlledToken, address(0));\\n\\n    uint256 extraCredit = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    _accrueCredit(to, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(to), extraCredit);\\n\\n    emit Awarded(to, controlledToken, amount);\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit TransferredExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    if (_transferOut(to, externalToken, amount)) {\\n      emit AwardedExternalERC20(to, externalToken, amount);\\n    }\\n  }\\n\\n  function _transferOut(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (bool)\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (amount == 0) {\\n      return false;\\n    }\\n\\n    IERC20Upgradeable(externalToken).safeTransfer(to, amount);\\n\\n    return true;\\n  }\\n\\n  /// @notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\\n  /// @param to The user who is receiving the tokens\\n  /// @param amount The amount of tokens they are receiving\\n  /// @param controlledToken The token that is going to be minted\\n  /// @param referrer The user who referred the minting\\n  function _mint(address to, uint256 amount, address controlledToken, address referrer) internal {\\n    if (address(prizeStrategy) != address(0)) {\\n      prizeStrategy.beforeTokenMint(to, amount, controlledToken, referrer);\\n    }\\n    ControlledToken(controlledToken).controllerMint(to, amount);\\n  }\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external override\\n    onlyPrizeStrategy\\n  {\\n    require(_canAwardExternal(externalToken), \\\"PrizePool/invalid-external-token\\\");\\n\\n    if (tokenIds.length == 0) {\\n      return;\\n    }\\n\\n    for (uint256 i = 0; i < tokenIds.length; i++) {\\n      try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){\\n\\n      }\\n      catch(bytes memory error){\\n        emit ErrorAwardingExternalERC721(error);\\n      }\\n      \\n    }\\n\\n    emit AwardedExternalERC721(to, externalToken, tokenIds);\\n  }\\n\\n  /// @notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\\n  /// @param amount The prize amount\\n  /// @return The size of the reserve portion of the prize\\n  function calculateReserveFee(uint256 amount) public view returns (uint256) {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    if (address(reserve) == address(0)) {\\n      return 0;\\n    }\\n    uint256 reserveRateMantissa = reserve.reserveRateMantissa(address(this));\\n    if (reserveRateMantissa == 0) {\\n      return 0;\\n    }\\n    return FixedPoint.multiplyUintByMantissa(amount, reserveRateMantissa);\\n  }\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external override\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    )\\n  {\\n    (exitFee, burnedCredit) = _calculateEarlyExitFeeLessBurnedCredit(from, controlledToken, amount);\\n  }\\n\\n  /// @dev Calculates the early exit fee for the given amount\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return Exit fee\\n  function _calculateEarlyExitFeeNoCredit(address controlledToken, uint256 amount) internal view returns (uint256) {\\n    return _limitExitFee(\\n      amount,\\n      FixedPoint.multiplyUintByMantissa(amount, _tokenCreditPlans[controlledToken].creditLimitMantissa)\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external override\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    durationSeconds =_estimateCreditAccrualTime(\\n      _controlledToken,\\n      _principal,\\n      _interest\\n    );\\n  }\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function _estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    internal\\n    view\\n    returns (uint256 durationSeconds)\\n  {\\n    // interest = credit rate * principal * time\\n    // => time = interest / (credit rate * principal)\\n    uint256 accruedPerSecond = FixedPoint.multiplyUintByMantissa(_principal, _tokenCreditPlans[_controlledToken].creditRateMantissa);\\n    if (accruedPerSecond == 0) {\\n      return 0;\\n    }\\n    return _interest.div(accruedPerSecond);\\n  }\\n\\n  /// @notice Burns a users credit.\\n  /// @param user The user whose credit should be burned\\n  /// @param credit The amount of credit to burn\\n  function _burnCredit(address user, address controlledToken, uint256 credit) internal {\\n    _tokenCreditBalances[controlledToken][user].balance = uint256(_tokenCreditBalances[controlledToken][user].balance).sub(credit).toUint128();\\n\\n    emit CreditBurned(user, controlledToken, credit);\\n  }\\n\\n  /// @notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\\n  /// @param user The user for whom to accrue credit\\n  /// @param controlledToken The controlled token whose balance we are checking\\n  /// @param controlledTokenBalance The balance to use for the user\\n  /// @param extra Additional credit to be added\\n  function _accrueCredit(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal {\\n    _updateCreditBalance(\\n      user,\\n      controlledToken,\\n      _calculateCreditBalance(user, controlledToken, controlledTokenBalance, extra)\\n    );\\n  }\\n\\n  function _calculateCreditBalance(address user, address controlledToken, uint256 controlledTokenBalance, uint256 extra) internal view returns (uint256) {\\n    uint256 newBalance;\\n    CreditBalance storage creditBalance = _tokenCreditBalances[controlledToken][user];\\n    if (!creditBalance.initialized) {\\n      newBalance = 0;\\n    } else {\\n      uint256 credit = _calculateAccruedCredit(user, controlledToken, controlledTokenBalance);\\n      newBalance = _applyCreditLimit(controlledToken, controlledTokenBalance, uint256(creditBalance.balance).add(credit).add(extra));\\n    }\\n    return newBalance;\\n  }\\n\\n  function _updateCreditBalance(address user, address controlledToken, uint256 newBalance) internal {\\n    uint256 oldBalance = _tokenCreditBalances[controlledToken][user].balance;\\n\\n    _tokenCreditBalances[controlledToken][user] = CreditBalance({\\n      balance: newBalance.toUint128(),\\n      timestamp: _currentTime().toUint32(),\\n      initialized: true\\n    });\\n\\n    if (oldBalance < newBalance) {\\n      emit CreditMinted(user, controlledToken, newBalance.sub(oldBalance));\\n    } \\n    else if (newBalance < oldBalance) {\\n      emit CreditBurned(user, controlledToken, oldBalance.sub(newBalance));\\n    }\\n  }\\n\\n  /// @notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\\n  /// @param creditBalance The new credit balance to be checked\\n  /// @return The users new credit balance.  Will not exceed the credit limit.\\n  function _applyCreditLimit(address controlledToken, uint256 controlledTokenBalance, uint256 creditBalance) internal view returns (uint256) {\\n    uint256 creditLimit = FixedPoint.multiplyUintByMantissa(\\n      controlledTokenBalance,\\n      _tokenCreditPlans[controlledToken].creditLimitMantissa\\n    );\\n    if (creditBalance > creditLimit) {\\n      creditBalance = creditLimit;\\n    }\\n\\n    return creditBalance;\\n  }\\n\\n  /// @notice Calculates the accrued interest for a user\\n  /// @param user The user whose credit should be calculated.\\n  /// @param controlledToken The controlled token that the user holds\\n  /// @param controlledTokenBalance The user's current balance of the controlled tokens.\\n  /// @return The credit that has accrued since the last credit update.\\n  function _calculateAccruedCredit(address user, address controlledToken, uint256 controlledTokenBalance) internal view returns (uint256) {\\n    uint256 userTimestamp = _tokenCreditBalances[controlledToken][user].timestamp;\\n\\n    if (!_tokenCreditBalances[controlledToken][user].initialized) {\\n      return 0;\\n    }\\n\\n    uint256 deltaTime = _currentTime().sub(userTimestamp);\\n    uint256 deltaMantissa = deltaTime.mul(_tokenCreditPlans[controlledToken].creditRateMantissa);\\n    return FixedPoint.multiplyUintByMantissa(controlledTokenBalance, deltaMantissa);\\n  }\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external override onlyControlledToken(controlledToken) returns (uint256) {\\n    _accrueCredit(user, controlledToken, IERC20Upgradeable(controlledToken).balanceOf(user), 0);\\n    return _tokenCreditBalances[controlledToken][user].balance;\\n  }\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external override\\n    onlyControlledToken(_controlledToken)\\n    onlyOwner\\n  {\\n    _tokenCreditPlans[_controlledToken] = CreditPlan({\\n      creditLimitMantissa: _creditLimitMantissa,\\n      creditRateMantissa: _creditRateMantissa\\n    });\\n\\n    emit CreditPlanSet(_controlledToken, _creditLimitMantissa, _creditRateMantissa);\\n  }\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external override\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    )\\n  {\\n    creditLimitMantissa = _tokenCreditPlans[controlledToken].creditLimitMantissa;\\n    creditRateMantissa = _tokenCreditPlans[controlledToken].creditRateMantissa;\\n  }\\n\\n  /// @notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The token they are withdrawing\\n  /// @param amount The amount of funds they are withdrawing\\n  /// @return earlyExitFee The additional exit fee that should be charged.\\n  /// @return creditBurned The amount of credit that will be burned\\n  function _calculateEarlyExitFeeLessBurnedCredit(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    internal\\n    returns (\\n      uint256 earlyExitFee,\\n      uint256 creditBurned\\n    )\\n  {\\n    uint256 controlledTokenBalance = IERC20Upgradeable(controlledToken).balanceOf(from);\\n    require(controlledTokenBalance >= amount, \\\"PrizePool/insuff-funds\\\");\\n    _accrueCredit(from, controlledToken, controlledTokenBalance, 0);\\n    /*\\n    The credit is used *last*.  Always charge the fees up-front.\\n\\n    How to calculate:\\n\\n    Calculate their remaining exit fee.  I.e. full exit fee of their balance less their credit.\\n\\n    If the exit fee on their withdrawal is greater than the remaining exit fee, then they'll have to pay the difference.\\n    */\\n\\n    // Determine available usable credit based on withdraw amount\\n    uint256 remainingExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, controlledTokenBalance.sub(amount));\\n\\n    uint256 availableCredit;\\n    if (_tokenCreditBalances[controlledToken][from].balance >= remainingExitFee) {\\n      availableCredit = uint256(_tokenCreditBalances[controlledToken][from].balance).sub(remainingExitFee);\\n    }\\n\\n    // Determine amount of credit to burn and amount of fees required\\n    uint256 totalExitFee = _calculateEarlyExitFeeNoCredit(controlledToken, amount);\\n    creditBurned = (availableCredit > totalExitFee) ? totalExitFee : availableCredit;\\n    earlyExitFee = totalExitFee.sub(creditBurned);\\n  }\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external override onlyOwner {\\n    _setLiquidityCap(_liquidityCap);\\n  }\\n\\n  function _setLiquidityCap(uint256 _liquidityCap) internal {\\n    liquidityCap = _liquidityCap;\\n    emit LiquidityCapSet(_liquidityCap);\\n  }\\n\\n  /// @notice Adds a new controlled token\\n  /// @param _controlledToken The controlled token to add.\\n  /// @param index The index to add the controlledToken\\n  function _addControlledToken(ControlledTokenInterface _controlledToken, uint256 index) internal {\\n    require(_controlledToken.controller() == this, \\\"PrizePool/token-ctrlr-mismatch\\\");\\n    \\n    _tokens[index] = _controlledToken;\\n    emit ControlledTokenAdded(_controlledToken);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external override onlyOwner {\\n    _setPrizeStrategy(_prizeStrategy);\\n  }\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy\\n  function _setPrizeStrategy(TokenListenerInterface _prizeStrategy) internal {\\n    require(address(_prizeStrategy) != address(0), \\\"PrizePool/prizeStrategy-not-zero\\\");\\n    require(address(_prizeStrategy).supportsInterface(TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER), \\\"PrizePool/prizeStrategy-invalid\\\");\\n    prizeStrategy = _prizeStrategy;\\n\\n    emit PrizeStrategySet(address(_prizeStrategy));\\n  }\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\\n    return _tokens;\\n  }\\n\\n  /// @dev Gets the current time as represented by the current block\\n  /// @return The timestamp of the current block\\n  function _currentTime() internal virtual view returns (uint256) {\\n    return block.timestamp;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external override view returns (uint256) {\\n    return _tokenTotalSupply();\\n  }\\n\\n  /// @notice Delegate the votes for a Compound COMP-like token held by the prize pool\\n  /// @param compLike The COMP-like token held by the prize pool that should be delegated\\n  /// @param to The address to delegate to \\n  function compLikeDelegate(ICompLike compLike, address to) external onlyOwner {\\n    if (compLike.balanceOf(address(this)) > 0) {\\n      compLike.delegate(to);\\n    }\\n  }\\n  \\n  /// @notice Required for ERC721 safe token transfers from smart contracts.\\n  /// @param operator The address that acts on behalf of the owner\\n  /// @param from The current owner of the NFT\\n  /// @param tokenId The NFT to transfer\\n  /// @param data Additional data with no specified format, sent in call to `_to`.\\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\\n    return IERC721ReceiverUpgradeable.onERC721Received.selector;\\n  }\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function _tokenTotalSupply() internal view returns (uint256) {\\n    uint256 total = reserveTotalSupply;\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \\n    uint256 tokensLength = tokens.length;\\n    \\n    for(uint256 i = 0; i < tokensLength; i++){\\n      total = total.add(IERC20Upgradeable(tokens[i]).totalSupply());\\n    }\\n\\n    return total;\\n  }\\n\\n  /// @dev Checks if the Prize Pool can receive liquidity based on the current cap\\n  /// @param _amount The amount of liquidity to be added to the Prize Pool\\n  /// @return True if the Prize Pool can receive the specified amount of liquidity\\n  function _canAddLiquidity(uint256 _amount) internal view returns (bool) {\\n    uint256 tokenTotalSupply = _tokenTotalSupply();\\n    return (tokenTotalSupply.add(_amount) <= liquidityCap);\\n  }\\n\\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function _isControlled(ControlledTokenInterface controlledToken) internal view returns (bool) {\\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\\n    uint256 tokensLength = tokens.length;\\n\\n    for(uint256 i = 0; i < tokensLength; i++) {\\n      if(tokens[i] == controlledToken) return true;\\n    }\\n    return false;\\n  }\\n  \\n  /// @dev Checks if a specific token is controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  /// @return True if the token is a controlled token, false otherwise\\n  function isControlled(ControlledTokenInterface controlledToken) external view returns (bool) {\\n    return _isControlled(controlledToken);\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal virtual view returns (bool);\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function _token() internal virtual view returns (IERC20Upgradeable);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal virtual returns (uint256);\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal virtual;\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal virtual returns (uint256);\\n\\n  /// @dev Function modifier to ensure usage of tokens controlled by the Prize Pool\\n  /// @param controlledToken The address of the token to check\\n  modifier onlyControlledToken(address controlledToken) {\\n    require(_isControlled(ControlledTokenInterface(controlledToken)), \\\"PrizePool/unknown-token\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure caller is the prize-strategy\\n  modifier onlyPrizeStrategy() {\\n    require(_msgSender() == address(prizeStrategy), \\\"PrizePool/only-prizeStrategy\\\");\\n    _;\\n  }\\n\\n  /// @dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)\\n  modifier canAddLiquidity(uint256 _amount) {\\n    require(_canAddLiquidity(_amount), \\\"PrizePool/exceeds-liquidity-cap\\\");\\n    _;\\n  }\\n\\n  modifier onlyReserve() {\\n    ReserveInterface reserve = ReserveInterface(reserveRegistry.lookup());\\n    require(address(reserve) == msg.sender, \\\"PrizePool/only-reserve\\\");\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x386ebc1c80ab4424f14125e716dd12641ff933b475bf1082b7b1a6eee4a969c3\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/PrizePoolInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"../token/TokenListenerInterface.sol\\\";\\nimport \\\"../token/ControlledTokenInterface.sol\\\";\\n\\n/// @title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\\n/// @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\\n/// @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens\\ninterface PrizePoolInterface {\\n\\n  /// @notice Deposit assets into the Prize Pool in exchange for tokens\\n  /// @param to The address receiving the newly minted tokens\\n  /// @param amount The amount of assets to deposit\\n  /// @param controlledToken The address of the type of token the user is minting\\n  /// @param referrer The referrer of the deposit\\n  function depositTo(\\n    address to,\\n    uint256 amount,\\n    address controlledToken,\\n    address referrer\\n  )\\n    external;\\n\\n  /// @notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\\n  /// @param from The address to redeem tokens from.\\n  /// @param amount The amount of tokens to redeem for assets.\\n  /// @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\\n  /// @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\\n  /// @return The actual exit fee paid\\n  function withdrawInstantlyFrom(\\n    address from,\\n    uint256 amount,\\n    address controlledToken,\\n    uint256 maximumExitFee\\n  ) external returns (uint256);\\n\\n\\n  function withdrawReserve(address to) external returns (uint256);\\n\\n  /// @notice Returns the balance that is available to award.\\n  /// @dev captureAwardBalance() should be called first\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function awardBalance() external view returns (uint256);\\n\\n  /// @notice Captures any available interest as award balance.\\n  /// @dev This function also captures the reserve fees.\\n  /// @return The total amount of assets to be awarded for the current prize\\n  function captureAwardBalance() external returns (uint256);\\n\\n  /// @notice Called by the prize strategy to award prizes.\\n  /// @dev The amount awarded must be less than the awardBalance()\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of assets to be awarded\\n  /// @param controlledToken The address of the asset token being awarded\\n  function award(\\n    address to,\\n    uint256 amount,\\n    address controlledToken\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to transfer out external ERC20 tokens\\n  /// @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function transferExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the Prize-Strategy to award external ERC20 prizes\\n  /// @dev Used to award any arbitrary tokens held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param amount The amount of external assets to be awarded\\n  /// @param externalToken The address of the external asset token being awarded\\n  function awardExternalERC20(\\n    address to,\\n    address externalToken,\\n    uint256 amount\\n  )\\n    external;\\n\\n  /// @notice Called by the prize strategy to award external ERC721 prizes\\n  /// @dev Used to award any arbitrary NFTs held by the Prize Pool\\n  /// @param to The address of the winner that receives the award\\n  /// @param externalToken The address of the external NFT token being awarded\\n  /// @param tokenIds An array of NFT Token IDs to be transferred\\n  function awardExternalERC721(\\n    address to,\\n    address externalToken,\\n    uint256[] calldata tokenIds\\n  )\\n    external;\\n\\n  /// @notice Calculates the early exit fee for the given amount\\n  /// @param from The user who is withdrawing\\n  /// @param controlledToken The type of collateral being withdrawn\\n  /// @param amount The amount of collateral to be withdrawn\\n  /// @return exitFee The exit fee\\n  /// @return burnedCredit The user's credit that was burned\\n  function calculateEarlyExitFee(\\n    address from,\\n    address controlledToken,\\n    uint256 amount\\n  )\\n    external\\n    returns (\\n      uint256 exitFee,\\n      uint256 burnedCredit\\n    );\\n\\n  /// @notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\\n  /// @param _principal The principal amount on which interest is accruing\\n  /// @param _interest The amount of interest that must accrue\\n  /// @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds.\\n  function estimateCreditAccrualTime(\\n    address _controlledToken,\\n    uint256 _principal,\\n    uint256 _interest\\n  )\\n    external\\n    view\\n    returns (uint256 durationSeconds);\\n\\n  /// @notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\\n  /// @param user The user whose credit balance should be returned\\n  /// @return The balance of the users credit\\n  function balanceOfCredit(address user, address controlledToken) external returns (uint256);\\n\\n  /// @notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\\n  /// @param _controlledToken The controlled token for whom to set the credit plan\\n  /// @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\\n  /// @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether).\\n  function setCreditPlanOf(\\n    address _controlledToken,\\n    uint128 _creditRateMantissa,\\n    uint128 _creditLimitMantissa\\n  )\\n    external;\\n\\n  /// @notice Returns the credit rate of a controlled token\\n  /// @param controlledToken The controlled token to retrieve the credit rates for\\n  /// @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\\n  /// @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second.\\n  function creditPlanOf(\\n    address controlledToken\\n  )\\n    external\\n    view\\n    returns (\\n      uint128 creditLimitMantissa,\\n      uint128 creditRateMantissa\\n    );\\n\\n  /// @notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\\n  /// @param _liquidityCap The new liquidity cap for the prize pool\\n  function setLiquidityCap(uint256 _liquidityCap) external;\\n\\n  /// @notice Sets the prize strategy of the prize pool.  Only callable by the owner.\\n  /// @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface\\n  function setPrizeStrategy(TokenListenerInterface _prizeStrategy) external;\\n\\n  /// @dev Returns the address of the underlying ERC20 asset\\n  /// @return The address of the asset\\n  function token() external view returns (address);\\n\\n  /// @notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\\n  /// @return An array of controlled token addresses\\n  function tokens() external view returns (ControlledTokenInterface[] memory);\\n\\n  /// @notice The total of all controlled tokens\\n  /// @return The current total of all tokens\\n  function accountedBalance() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x565996844374be1e1baf5f3cbc50c1cf6cd09eed72d37887a6795e4dbcd5c738\",\"license\":\"GPL-3.0\"},\"contracts/prize-pool/yield-source/YieldSourcePrizePool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\\\";\\n\\nimport \\\"@pooltogether/yield-source-interface/contracts/IYieldSource.sol\\\";\\n\\nimport \\\"../PrizePool.sol\\\";\\n\\ncontract YieldSourcePrizePool is PrizePool {\\n\\n  using SafeERC20Upgradeable for IERC20Upgradeable;\\n  using AddressUpgradeable for address;\\n\\n  IYieldSource public yieldSource;\\n\\n  event YieldSourcePrizePoolInitialized(address indexed yieldSource);\\n\\n  /// @notice Initializes the Prize Pool and Yield Service with the required contract connections\\n  /// @param _controlledTokens Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\\n  /// @param _maxExitFeeMantissa The maximum exit fee size, relative to the withdrawal amount\\n  /// @param _yieldSource Address of the yield source\\n  function initializeYieldSourcePrizePool (\\n    RegistryInterface _reserveRegistry,\\n    ControlledTokenInterface[] memory _controlledTokens,\\n    uint256 _maxExitFeeMantissa,\\n    IYieldSource _yieldSource\\n  )\\n    public\\n    initializer\\n  {\\n    require(address(_yieldSource).isContract(), \\\"YieldSourcePrizePool/yield-source-not-contract-address\\\");\\n    PrizePool.initialize(\\n      _reserveRegistry,\\n      _controlledTokens,\\n      _maxExitFeeMantissa\\n    );\\n    yieldSource = _yieldSource;\\n\\n    // A hack to determine whether it's an actual yield source\\n    (bool succeeded,) = address(_yieldSource).staticcall(abi.encode(_yieldSource.depositToken.selector));\\n    require(succeeded, \\\"YieldSourcePrizePool/invalid-yield-source\\\");\\n\\n    emit YieldSourcePrizePoolInitialized(address(_yieldSource));\\n  }\\n\\n  /// @notice Determines whether the passed token can be transferred out as an external award.\\n  /// @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\\n  /// prize strategy should not be allowed to move those tokens.\\n  /// @param _externalToken The address of the token to check\\n  /// @return True if the token may be awarded, false otherwise\\n  function _canAwardExternal(address _externalToken) internal override view returns (bool) {\\n    return _externalToken != address(yieldSource);\\n  }\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function _balance() internal override returns (uint256) {\\n    return yieldSource.balanceOfToken(address(this));\\n  }\\n\\n  function _token() internal override view returns (IERC20Upgradeable) {\\n    return IERC20Upgradeable(yieldSource.depositToken());\\n  }\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param mintAmount The amount of asset tokens to be supplied\\n  function _supply(uint256 mintAmount) internal override {\\n    _token().safeApprove(address(yieldSource), mintAmount);\\n    yieldSource.supplyTokenTo(mintAmount, address(this));\\n  }\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function _redeem(uint256 redeemAmount) internal override returns (uint256) {\\n    return yieldSource.redeemToken(redeemAmount);\\n  }\\n}\",\"keccak256\":\"0x74b0899be05f0fa46f6818359aabb09b10ce1e6f14b407b733adc207d5b72104\",\"license\":\"GPL-3.0\"},\"contracts/registry/RegistryInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface RegistryInterface {\\n  function lookup() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd0fddf5084e3ac12e24209768ab5a08261fc119df9a0ae5b30c9e1bd9f97d1dd\",\"license\":\"GPL-3.0\"},\"contracts/reserve/ReserveInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface ReserveInterface {\\n  function reserveRateMantissa(address prizePool) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x1a616be27f36f0d3919d2927db1e79a1cac4978d800da554b45f37df9b26d5a9\",\"license\":\"GPL-3.0\"},\"contracts/test/YieldSourcePrizePoolHarness.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"../prize-pool/yield-source/YieldSourcePrizePool.sol\\\";\\n\\n/* solium-disable security/no-block-members */\\ncontract YieldSourcePrizePoolHarness is YieldSourcePrizePool {\\n\\n  uint256 public currentTime;\\n\\n  function setCurrentTime(uint256 _currentTime) external {\\n    currentTime = _currentTime;\\n  }\\n\\n  function _currentTime() internal override view returns (uint256) {\\n    return currentTime;\\n  }\\n\\n  function supply(uint256 mintAmount) external {\\n    _supply(mintAmount);\\n  }\\n\\n  function redeem(uint256 redeemAmount) external returns (uint256) {\\n    return _redeem(redeemAmount);\\n  }\\n}\\n\",\"keccak256\":\"0xe5b8f021d0644e96da1ef1a6c5f7df8bc3d9d92dd13b3f7825ca69b24a1c7222\"},\"contracts/test/YieldSourcePrizePoolHarnessProxyFactory.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"./YieldSourcePrizePoolHarness.sol\\\";\\nimport \\\"../external/openzeppelin/ProxyFactory.sol\\\";\\n\\n/// @title YieldSource Prize Pool Proxy Factory\\n/// @notice Minimal proxy pattern for creating new YieldSource Prize Pools\\ncontract YieldSourcePrizePoolHarnessProxyFactory is ProxyFactory {\\n\\n  /// @notice Contract template for deploying proxied Prize Pools\\n  YieldSourcePrizePoolHarness public instance;\\n\\n  /// @notice Initializes the Factory with an instance of the YieldSource Prize Pool\\n  constructor () public {\\n    instance = new YieldSourcePrizePoolHarness();\\n  }\\n\\n  /// @notice Creates a new YieldSource Prize Pool as a proxy of the template instance\\n  /// @return A reference to the new proxied YieldSource Prize Pool\\n  function create() external returns (YieldSourcePrizePoolHarness) {\\n    return YieldSourcePrizePoolHarness(deployMinimal(address(instance), \\\"\\\"));\\n  }\\n}\\n\",\"keccak256\":\"0x594610308742c5952ee3104690aaa14152fc00bf23881894e508e5632f6339a4\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 14862,
                "contract": "contracts/test/YieldSourcePrizePoolHarnessProxyFactory.sol:YieldSourcePrizePoolHarnessProxyFactory",
                "label": "instance",
                "offset": 0,
                "slot": "0",
                "type": "t_contract(YieldSourcePrizePoolHarness)14852"
              }
            ],
            "types": {
              "t_contract(YieldSourcePrizePoolHarness)14852": {
                "encoding": "inplace",
                "label": "contract YieldSourcePrizePoolHarness",
                "numberOfBytes": "20"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "constructor": "Initializes the Factory with an instance of the YieldSource Prize Pool",
              "create()": {
                "notice": "Creates a new YieldSource Prize Pool as a proxy of the template instance"
              },
              "instance()": {
                "notice": "Contract template for deploying proxied Prize Pools"
              }
            },
            "notice": "Minimal proxy pattern for creating new YieldSource Prize Pools",
            "version": 1
          }
        }
      },
      "contracts/test/YieldSourceStub.sol": {
        "YieldSourceStub": {
          "abi": [
            {
              "inputs": [],
              "name": "balance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_externalToken",
                  "type": "address"
                }
              ],
              "name": "canAwardExternal",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "redeemAmount",
                  "type": "uint256"
                }
              ],
              "name": "redeem",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "mintAmount",
                  "type": "uint256"
                }
              ],
              "name": "supply",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "token",
              "outputs": [
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "balance()": "b69ef8a8",
              "canAwardExternal(address)": "6a3fd4f9",
              "redeem(uint256)": "db006a75",
              "supply(uint256)": "35403023",
              "token()": "fc0c546a"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"balance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_externalToken\",\"type\":\"address\"}],\"name\":\"canAwardExternal\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"redeemAmount\",\"type\":\"uint256\"}],\"name\":\"redeem\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"mintAmount\",\"type\":\"uint256\"}],\"name\":\"supply\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token\",\"outputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/YieldSourceStub.sol\":\"YieldSourceStub\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"contracts/test/YieldSourceStub.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface YieldSourceStub {\\n  function canAwardExternal(address _externalToken) external view returns (bool);\\n\\n  function token() external view returns (IERC20Upgradeable);\\n\\n  function balance() external returns (uint256);\\n\\n  function supply(uint256 mintAmount) external;\\n\\n  function redeem(uint256 redeemAmount) external returns (uint256);\\n}\\n\",\"keccak256\":\"0xc165f66ed227a4ec0a4d316d0ffcb4b7fcc5833935bb638c75f13a1e40a16fdc\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/token-faucet/TokenFaucet.sol": {
        "TokenFaucet": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "newTokens",
                  "type": "uint256"
                }
              ],
              "name": "Claimed",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "Deposited",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "dripRatePerSecond",
                  "type": "uint256"
                }
              ],
              "name": "DripRateChanged",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "newTokens",
                  "type": "uint256"
                }
              ],
              "name": "Dripped",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "contract IERC20Upgradeable",
                  "name": "asset",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "contract IERC20Upgradeable",
                  "name": "measure",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "dripRatePerSecond",
                  "type": "uint256"
                }
              ],
              "name": "Initialized",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "previousOwner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "OwnershipTransferred",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "Withdrawn",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "asset",
              "outputs": [
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "beforeTokenMint",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                }
              ],
              "name": "beforeTokenTransfer",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                }
              ],
              "name": "claim",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "deposit",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "drip",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "dripRatePerSecond",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "exchangeRateMantissa",
              "outputs": [
                {
                  "internalType": "uint112",
                  "name": "",
                  "type": "uint112"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_asset",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_measure",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_dripRatePerSecond",
                  "type": "uint256"
                }
              ],
              "name": "initialize",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "lastDripTimestamp",
              "outputs": [
                {
                  "internalType": "uint32",
                  "name": "",
                  "type": "uint32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "measure",
              "outputs": [
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "owner",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "renounceOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "_dripRatePerSecond",
                  "type": "uint256"
                }
              ],
              "name": "setDripRatePerSecond",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes4",
                  "name": "interfaceId",
                  "type": "bytes4"
                }
              ],
              "name": "supportsInterface",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalUnclaimed",
              "outputs": [
                {
                  "internalType": "uint112",
                  "name": "",
                  "type": "uint112"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "newOwner",
                  "type": "address"
                }
              ],
              "name": "transferOwnership",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "userStates",
              "outputs": [
                {
                  "internalType": "uint128",
                  "name": "lastExchangeRateMantissa",
                  "type": "uint128"
                },
                {
                  "internalType": "uint128",
                  "name": "balance",
                  "type": "uint128"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "withdrawTo",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "beforeTokenMint(address,uint256,address,address)": {
                "params": {
                  "to": "The user who is minting the tokens",
                  "token": "The token they are minting"
                }
              },
              "beforeTokenTransfer(address,address,uint256,address)": {
                "params": {
                  "from": "The user who is sending the tokens",
                  "to": "The user who is receiving the tokens",
                  "token": "The token token they are burning"
                }
              },
              "claim(address)": {
                "params": {
                  "user": "The user to claim tokens for"
                },
                "returns": {
                  "_0": "The amount of tokens that were claimed."
                }
              },
              "deposit(uint256)": {
                "params": {
                  "amount": "The amount of asset tokens to add (must be approved already)"
                }
              },
              "drip()": {
                "details": "Should be called immediately before any measure token mints/transfers/burns",
                "returns": {
                  "_0": "The number of new tokens dripped."
                }
              },
              "initialize(address,address,uint256)": {
                "params": {
                  "_asset": "The asset to disburse to users",
                  "_dripRatePerSecond": "The amount of the asset to drip each second",
                  "_measure": "The token to use to measure a users portion"
                }
              },
              "owner()": {
                "details": "Returns the address of the current owner."
              },
              "renounceOwnership()": {
                "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
              },
              "setDripRatePerSecond(uint256)": {
                "params": {
                  "_dripRatePerSecond": "The new drip rate in tokens per second"
                }
              },
              "supportsInterface(bytes4)": {
                "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."
              },
              "transferOwnership(address)": {
                "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
              },
              "withdrawTo(address,uint256)": {
                "params": {
                  "amount": "The amount to withdraw",
                  "to": "The address to withdraw to"
                }
              }
            },
            "title": "Disburses a token at a fixed rate per second to holders of another token.",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50611866806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c80638da5cb5b116100ad578063ca5baafc11610071578063ca5baafc1461034f578063d9772a251461036c578063e318613e1461038d578063efa9a1ad14610395578063f2fde38b1461039d57610121565b80638da5cb5b146102c25780639f678cca146102ca578063b2210957146102d2578063b6b55f251461030e578063c96f14b81461032b57610121565b80631e83409a116100f45780631e83409a14610208578063205c28781461022e57806338d52e0f1461025a5780634d7f3db01461027e578063715018a6146102ba57610121565b806301ffc9a7146101265780630ecc535f146101615780631794bb3c146101b6578063187f3334146101ee575b600080fd5b61014d6004803603602081101561013c57600080fd5b50356001600160e01b0319166103c3565b604080519115158252519081900360200190f35b6101876004803603602081101561017757600080fd5b50356001600160a01b03166103ff565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b6101ec600480360360608110156101cc57600080fd5b506001600160a01b03813581169160208101359091169060400135610425565b005b6101f6610583565b60408051918252519081900360200190f35b6101f66004803603602081101561021e57600080fd5b50356001600160a01b0316610589565b6101ec6004803603604081101561024457600080fd5b506001600160a01b0381351690602001356106f1565b610262610915565b604080516001600160a01b039092168252519081900360200190f35b6101ec6004803603608081101561029457600080fd5b506001600160a01b03813581169160208101359160408201358116916060013516610924565b6101ec610953565b6102626109ff565b6101f6610a0f565b6101ec600480360360808110156102e857600080fd5b506001600160a01b03813581169160208101358216916040820135916060013516610cab565b6101ec6004803603602081101561032457600080fd5b5035610ce7565b610333610daf565b604080516001600160701b039092168252519081900360200190f35b6101ec6004803603602081101561036557600080fd5b5035610dc5565b610374610ec0565b6040805163ffffffff9092168252519081900360200190f35b610333610ed3565b610262610ee2565b6101ec600480360360208110156103b357600080fd5b50356001600160a01b0316610ef1565b60006001600160e01b031982166301ffc9a760e01b14806103f757506001600160e01b03198216600162a1cb1960e01b0319145b90505b919050565b6069602052600090815260409020546001600160801b0380821691600160801b90041682565b600054610100900460ff168061043e575061043e610ff4565b8061044c575060005460ff16155b6104875760405162461bcd60e51b815260040180806020018281038252602e815260200180611773602e913960400191505060405180910390fd5b600054610100900460ff161580156104b2576000805460ff1961ff0019909116610100171660011790555b6104ba611005565b6104c26110b7565b6068805463ffffffff92909216600160e01b026001600160e01b03909216919091179055606580546001600160a01b038087166001600160a01b031992831617909255606680549286169290911691909117905561051f82610dc5565b60665460655460675460408051918252516001600160a01b039384169392909216917f10f27652c1015195ca7e6bc9b4c724cbf18e91c42117d92124703a3f49bb240f9181900360200190a3801561057d576000805461ff00191690555b50505050565b60675481565b6000610593610a0f565b5061059d826110c7565b506001600160a01b038216600090815260696020526040902080546001600160801b03808216909255606854600160801b909104909116906105f8906105f390600160701b90046001600160701b03168361126c565b6112ce565b606880546001600160701b0392909216600160701b026dffffffffffffffffffffffffffff60701b199092169190911790556065546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561068057600080fd5b505af1158015610694573d6000803e3d6000fd5b505050506040513d60208110156106aa57600080fd5b50506040805182815290516001600160a01b038516917fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a919081900360200190a292915050565b6106f9611316565b6001600160a01b031661070a6109ff565b6001600160a01b031614610753576040805162461bcd60e51b815260206004820181905260248201526000805160206117c2833981519152604482015290519081900360640190fd5b61075b610a0f565b50606554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156107a757600080fd5b505afa1580156107bb573d6000803e3d6000fd5b505050506040513d60208110156107d157600080fd5b50516068549091506000906107f7908390600160701b90046001600160701b031661126c565b90508083111561084e576040805162461bcd60e51b815260206004820152601e60248201527f546f6b656e4661756365742f696e73756666696369656e742d66756e64730000604482015290519081900360640190fd5b6065546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018790529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156108a457600080fd5b505af11580156108b8573d6000803e3d6000fd5b505050506040513d60208110156108ce57600080fd5b50506040805184815290516001600160a01b038616917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a250505050565b6065546001600160a01b031681565b6066546001600160a01b038381169116141561057d57610942610a0f565b5061094c846110c7565b5050505050565b61095b611316565b6001600160a01b031661096c6109ff565b6001600160a01b0316146109b5576040805162461bcd60e51b815260206004820181905260248201526000805160206117c2833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6033546001600160a01b03165b90565b600080610a1a6110b7565b60685463ffffffff9182169250600160e01b900416811415610a40576000915050610a0c565b606554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610a8b57600080fd5b505afa158015610a9f573d6000803e3d6000fd5b505050506040513d6020811015610ab557600080fd5b5051606854909150600090610adb908390600160701b90046001600160701b031661126c565b606854909150600090610b0090859063ffffffff600160e01b90910481169061126c16565b606854606654604080516318160ddd60e01b815290519394506001600160701b039092169260009283926001600160a01b0316916318160ddd91600480820192602092909190829003018186803b158015610b5a57600080fd5b505afa158015610b6e573d6000803e3d6000fd5b505050506040513d6020811015610b8457600080fd5b505190508015801590610b975750600085115b15610c0957606754610baa90859061131a565b915084821115610bb8578491505b6000610bc4838361137a565b9050610bd084826113a3565b6040805185815290519195507f7de59a92c9386255180c28ede4b61edb9b7b2ac96855ac634151489cef21bad6919081900360200190a1505b610c12836112ce565b606880546dffffffffffffffffffffffffffff19166001600160701b039283161790819055610c4d916105f391600160701b900416846113a3565b6068600e6101000a8154816001600160701b0302191690836001600160701b03160217905550610c7c876113fd565b6068805463ffffffff92909216600160e01b026001600160e01b03909216919091179055509550505050505090565b6066546001600160a01b038281169116148015610cd057506001600160a01b03841615155b1561057d57610cdd610a0f565b50610942836110c7565b610cef610a0f565b50606554604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015610d4a57600080fd5b505af1158015610d5e573d6000803e3d6000fd5b505050506040513d6020811015610d7457600080fd5b505060408051828152905133917f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4919081900360200190a250565b606854600160701b90046001600160701b031681565b610dcd611316565b6001600160a01b0316610dde6109ff565b6001600160a01b031614610e27576040805162461bcd60e51b815260206004820181905260248201526000805160206117c2833981519152604482015290519081900360640190fd5b60008111610e7c576040805162461bcd60e51b815260206004820152601c60248201527f546f6b656e4661756365742f64726970526174652d67742d7a65726f00000000604482015290519081900360640190fd5b610e84610a0f565b5060678190556040805182815290517f3d38e7cd2e029035006f9977a727c8724cd41dffb6d2a40d9f66bd4c26836a329181900360200190a150565b606854600160e01b900463ffffffff1681565b6068546001600160701b031681565b6066546001600160a01b031681565b610ef9611316565b6001600160a01b0316610f0a6109ff565b6001600160a01b031614610f53576040805162461bcd60e51b815260206004820181905260248201526000805160206117c2833981519152604482015290519081900360640190fd5b6001600160a01b038116610f985760405162461bcd60e51b81526004018080602001828103825260268152602001806117266026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610fff30611442565b15905090565b600054610100900460ff168061101e575061101e610ff4565b8061102c575060005460ff16155b6110675760405162461bcd60e51b815260040180806020018281038252602e815260200180611773602e913960400191505060405180910390fd5b600054610100900460ff16158015611092576000805460ff1961ff0019909116610100171660011790555b61109a611448565b6110a26114e8565b80156110b4576000805461ff00191690555b50565b60006110c2426113fd565b905090565b6001600160a01b038116600090815260696020526040812080546068546001600160701b03166001600160801b0390911614156111085760009150506103fa565b805460685460009161112c916001600160701b0316906001600160801b031661126c565b606654604080516370a0823160e01b81526001600160a01b038881166004830152915193945060009391909216916370a08231916024808301926020929190829003018186803b15801561117f57600080fd5b505afa158015611193573d6000803e3d6000fd5b505050506040513d60208110156111a957600080fd5b5051905060006111c16111bc83856115e1565b611602565b604080518082019091526068546001600160701b031681528554919250906020820190611206906111bc90600160801b90046001600160801b039081169086166113a3565b6001600160801b039081169091526001600160a01b03881660009081526069602090815260409091208351815494909201518316600160801b029183166fffffffffffffffffffffffffffffffff19909416939093179091161790559350505050919050565b6000828211156112c3576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6000600160701b82106113125760405162461bcd60e51b81526004018080602001828103825260298152602001806117e26029913960400191505060405180910390fd5b5090565b3390565b600082611329575060006112c8565b8282028284828161133657fe5b04146113735760405162461bcd60e51b81526004018080602001828103825260218152602001806117a16021913960400191505060405180910390fd5b9392505050565b60008061138f84670de0b6b3a764000061131a565b905061139b8184611646565b949350505050565b600082820183811015611373576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600064010000000082106113125760405162461bcd60e51b815260040180806020018281038252602681526020018061180b6026913960400191505060405180910390fd5b3b151590565b600054610100900460ff16806114615750611461610ff4565b8061146f575060005460ff16155b6114aa5760405162461bcd60e51b815260040180806020018281038252602e815260200180611773602e913960400191505060405180910390fd5b600054610100900460ff161580156110a2576000805460ff1961ff00199091166101001716600117905580156110b4576000805461ff001916905550565b600054610100900460ff16806115015750611501610ff4565b8061150f575060005460ff16155b61154a5760405162461bcd60e51b815260040180806020018281038252602e815260200180611773602e913960400191505060405180910390fd5b600054610100900460ff16158015611575576000805460ff1961ff0019909116610100171660011790555b600061157f611316565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156110b4576000805461ff001916905550565b6000806115ee838561131a565b905061139b81670de0b6b3a7640000611646565b6000600160801b82106113125760405162461bcd60e51b815260040180806020018281038252602781526020018061174c6027913960400191505060405180910390fd5b600061137383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506000818361170f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156116d45781810151838201526020016116bc565b50505050905090810190601f1680156117015780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161171b57fe5b049594505050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e203132382062697473496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657253616665436173743a2076616c756520646f65736e27742066697420696e20616e2075696e7431313253616665436173743a2076616c756520646f65736e27742066697420696e2033322062697473a2646970667358221220ca90e018c76dda1f3b271af212deb27b3e80278ba6dc894d44af423d3761577064736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1866 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x121 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0xAD JUMPI DUP1 PUSH4 0xCA5BAAFC GT PUSH2 0x71 JUMPI DUP1 PUSH4 0xCA5BAAFC EQ PUSH2 0x34F JUMPI DUP1 PUSH4 0xD9772A25 EQ PUSH2 0x36C JUMPI DUP1 PUSH4 0xE318613E EQ PUSH2 0x38D JUMPI DUP1 PUSH4 0xEFA9A1AD EQ PUSH2 0x395 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x39D JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x2C2 JUMPI DUP1 PUSH4 0x9F678CCA EQ PUSH2 0x2CA JUMPI DUP1 PUSH4 0xB2210957 EQ PUSH2 0x2D2 JUMPI DUP1 PUSH4 0xB6B55F25 EQ PUSH2 0x30E JUMPI DUP1 PUSH4 0xC96F14B8 EQ PUSH2 0x32B JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x1E83409A GT PUSH2 0xF4 JUMPI DUP1 PUSH4 0x1E83409A EQ PUSH2 0x208 JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x22E JUMPI DUP1 PUSH4 0x38D52E0F EQ PUSH2 0x25A JUMPI DUP1 PUSH4 0x4D7F3DB0 EQ PUSH2 0x27E JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x2BA JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x126 JUMPI DUP1 PUSH4 0xECC535F EQ PUSH2 0x161 JUMPI DUP1 PUSH4 0x1794BB3C EQ PUSH2 0x1B6 JUMPI DUP1 PUSH4 0x187F3334 EQ PUSH2 0x1EE JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x14D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x13C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH2 0x3C3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x187 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x177 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3FF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x1CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x425 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1F6 PUSH2 0x583 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1F6 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x21E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x589 JUMP JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x244 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x6F1 JUMP JUMPDEST PUSH2 0x262 PUSH2 0x915 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x294 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x924 JUMP JUMPDEST PUSH2 0x1EC PUSH2 0x953 JUMP JUMPDEST PUSH2 0x262 PUSH2 0x9FF JUMP JUMPDEST PUSH2 0x1F6 PUSH2 0xA0F JUMP JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x2E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0xCAB JUMP JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x324 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xCE7 JUMP JUMPDEST PUSH2 0x333 PUSH2 0xDAF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x365 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xDC5 JUMP JUMPDEST PUSH2 0x374 PUSH2 0xEC0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0xFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x333 PUSH2 0xED3 JUMP JUMPDEST PUSH2 0x262 PUSH2 0xEE2 JUMP JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xEF1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL EQ DUP1 PUSH2 0x3F7 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT EQ JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x69 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV AND DUP3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x43E JUMPI POP PUSH2 0x43E PUSH2 0xFF4 JUMP JUMPDEST DUP1 PUSH2 0x44C JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x487 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1773 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x4B2 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x4BA PUSH2 0x1005 JUMP JUMPDEST PUSH2 0x4C2 PUSH2 0x10B7 JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH4 0xFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xE0 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x65 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SWAP3 SSTORE PUSH1 0x66 DUP1 SLOAD SWAP3 DUP7 AND SWAP3 SWAP1 SWAP2 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x51F DUP3 PUSH2 0xDC5 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x65 SLOAD PUSH1 0x67 SLOAD PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND SWAP4 SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x10F27652C1015195CA7E6BC9B4C724CBF18E91C42117D92124703A3F49BB240F SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 DUP1 ISZERO PUSH2 0x57D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x67 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x593 PUSH2 0xA0F JUMP JUMPDEST POP PUSH2 0x59D DUP3 PUSH2 0x10C7 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP1 SWAP3 SSTORE PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV SWAP1 SWAP2 AND SWAP1 PUSH2 0x5F8 SWAP1 PUSH2 0x5F3 SWAP1 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP4 PUSH2 0x126C JUMP JUMPDEST PUSH2 0x12CE JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP3 SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x70 SHL MUL PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x70 SHL NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP6 SWAP1 MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xA9059CBB SWAP2 PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x680 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x694 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP2 PUSH32 0xD8138F8A3F377C5259CA548E70E4C2DE94F129F5A11036A15B69513CBA2B426A SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x6F9 PUSH2 0x1316 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x70A PUSH2 0x9FF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x753 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x17C2 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x75B PUSH2 0xA0F JUMP JUMPDEST POP PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x7A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x7BB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x7D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x68 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0x7F7 SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND PUSH2 0x126C JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x84E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6B656E4661756365742F696E73756666696369656E742D66756E64730000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xA9059CBB SWAP2 PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x8A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8B8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x8CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND SWAP2 PUSH32 0x7084F5476618D8E60B11EF0D7D3F06914655ADB8793E28FF7F018D4C76D505D5 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 POP POP POP POP JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x57D JUMPI PUSH2 0x942 PUSH2 0xA0F JUMP JUMPDEST POP PUSH2 0x94C DUP5 PUSH2 0x10C7 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x95B PUSH2 0x1316 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x96C PUSH2 0x9FF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x9B5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x17C2 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xA1A PUSH2 0x10B7 JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH4 0xFFFFFFFF SWAP2 DUP3 AND SWAP3 POP PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV AND DUP2 EQ ISZERO PUSH2 0xA40 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0xA0C JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xA9F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xAB5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x68 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0xADB SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND PUSH2 0x126C JUMP JUMPDEST PUSH1 0x68 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0xB00 SWAP1 DUP6 SWAP1 PUSH4 0xFFFFFFFF PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 SWAP2 DIV DUP2 AND SWAP1 PUSH2 0x126C AND JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x18160DDD PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD SWAP4 SWAP5 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP1 SWAP3 AND SWAP3 PUSH1 0x0 SWAP3 DUP4 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x18160DDD SWAP2 PUSH1 0x4 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB5A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xB6E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xB84 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 ISZERO DUP1 ISZERO SWAP1 PUSH2 0xB97 JUMPI POP PUSH1 0x0 DUP6 GT JUMPDEST ISZERO PUSH2 0xC09 JUMPI PUSH1 0x67 SLOAD PUSH2 0xBAA SWAP1 DUP6 SWAP1 PUSH2 0x131A JUMP JUMPDEST SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0xBB8 JUMPI DUP5 SWAP2 POP JUMPDEST PUSH1 0x0 PUSH2 0xBC4 DUP4 DUP4 PUSH2 0x137A JUMP JUMPDEST SWAP1 POP PUSH2 0xBD0 DUP5 DUP3 PUSH2 0x13A3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP6 POP PUSH32 0x7DE59A92C9386255180C28EDE4B61EDB9B7B2AC96855AC634151489CEF21BAD6 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH2 0xC12 DUP4 PUSH2 0x12CE JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP3 DUP4 AND OR SWAP1 DUP2 SWAP1 SSTORE PUSH2 0xC4D SWAP2 PUSH2 0x5F3 SWAP2 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV AND DUP5 PUSH2 0x13A3 JUMP JUMPDEST PUSH1 0x68 PUSH1 0xE PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND MUL OR SWAP1 SSTORE POP PUSH2 0xC7C DUP8 PUSH2 0x13FD JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH4 0xFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xE0 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP SWAP6 POP POP POP POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND SWAP2 AND EQ DUP1 ISZERO PUSH2 0xCD0 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x57D JUMPI PUSH2 0xCDD PUSH2 0xA0F JUMP JUMPDEST POP PUSH2 0x942 DUP4 PUSH2 0x10C7 JUMP JUMPDEST PUSH2 0xCEF PUSH2 0xA0F JUMP JUMPDEST POP PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x23B872DD SWAP2 PUSH1 0x64 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD5E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xD74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD CALLER SWAP2 PUSH32 0x2DA466A7B24304F47E87FA2E1E5A81B9831CE54FEC19055CE277CA2F39BA42C4 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0xDCD PUSH2 0x1316 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xDDE PUSH2 0x9FF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xE27 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x17C2 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 GT PUSH2 0xE7C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6B656E4661756365742F64726970526174652D67742D7A65726F00000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xE84 PUSH2 0xA0F JUMP JUMPDEST POP PUSH1 0x67 DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3D38E7CD2E029035006F9977A727C8724CD41DFFB6D2A40D9F66BD4C26836A32 SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0xEF9 PUSH2 0x1316 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF0A PUSH2 0x9FF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xF53 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x17C2 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0xF98 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1726 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFFF ADDRESS PUSH2 0x1442 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x101E JUMPI POP PUSH2 0x101E PUSH2 0xFF4 JUMP JUMPDEST DUP1 PUSH2 0x102C JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1067 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1773 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1092 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x109A PUSH2 0x1448 JUMP JUMPDEST PUSH2 0x10A2 PUSH2 0x14E8 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x10B4 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10C2 TIMESTAMP PUSH2 0x13FD JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 SWAP2 AND EQ ISZERO PUSH2 0x1108 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x3FA JUMP JUMPDEST DUP1 SLOAD PUSH1 0x68 SLOAD PUSH1 0x0 SWAP2 PUSH2 0x112C SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x126C JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP2 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP4 SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x117F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1193 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x11A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x11C1 PUSH2 0x11BC DUP4 DUP6 PUSH2 0x15E1 JUMP JUMPDEST PUSH2 0x1602 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP2 MSTORE DUP6 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x20 DUP3 ADD SWAP1 PUSH2 0x1206 SWAP1 PUSH2 0x11BC SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND SWAP1 DUP7 AND PUSH2 0x13A3 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP4 MLOAD DUP2 SLOAD SWAP5 SWAP1 SWAP3 ADD MLOAD DUP4 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP2 DUP4 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP2 AND OR SWAP1 SSTORE SWAP4 POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x12C3 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x70 SHL DUP3 LT PUSH2 0x1312 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x17E2 PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1329 JUMPI POP PUSH1 0x0 PUSH2 0x12C8 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x1336 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x1373 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x17A1 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x138F DUP5 PUSH8 0xDE0B6B3A7640000 PUSH2 0x131A JUMP JUMPDEST SWAP1 POP PUSH2 0x139B DUP2 DUP5 PUSH2 0x1646 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1373 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH5 0x100000000 DUP3 LT PUSH2 0x1312 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x180B PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1461 JUMPI POP PUSH2 0x1461 PUSH2 0xFF4 JUMP JUMPDEST DUP1 PUSH2 0x146F JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x14AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1773 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x10A2 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x10B4 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1501 JUMPI POP PUSH2 0x1501 PUSH2 0xFF4 JUMP JUMPDEST DUP1 PUSH2 0x150F JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x154A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1773 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1575 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x157F PUSH2 0x1316 JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x10B4 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x15EE DUP4 DUP6 PUSH2 0x131A JUMP JUMPDEST SWAP1 POP PUSH2 0x139B DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x1646 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x1312 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x174C PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1373 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH1 0x0 DUP2 DUP4 PUSH2 0x170F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x16D4 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x16BC JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1701 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x171B JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP INVALID 0x4F PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F206164647265737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E203132382062697473496E697469 PUSH2 0x6C69 PUSH27 0x61626C653A20636F6E747261637420697320616C72656164792069 PUSH15 0x697469616C697A6564536166654D61 PUSH21 0x683A206D756C7469706C69636174696F6E206F7665 PUSH19 0x666C6F774F776E61626C653A2063616C6C6572 KECCAK256 PUSH10 0x73206E6F742074686520 PUSH16 0x776E657253616665436173743A207661 PUSH13 0x756520646F65736E2774206669 PUSH21 0x20696E20616E2075696E7431313253616665436173 PUSH21 0x3A2076616C756520646F65736E2774206669742069 PUSH15 0x2033322062697473A2646970667358 0x22 SLT KECCAK256 0xCA SWAP1 0xE0 XOR 0xC7 PUSH14 0xDA1F3B271AF212DEB27B3E80278B 0xA6 0xDC DUP10 0x4D DIFFICULTY 0xAF TIMESTAMP RETURNDATASIZE CALLDATACOPY PUSH2 0x5770 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "926:7693:86:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106101215760003560e01c80638da5cb5b116100ad578063ca5baafc11610071578063ca5baafc1461034f578063d9772a251461036c578063e318613e1461038d578063efa9a1ad14610395578063f2fde38b1461039d57610121565b80638da5cb5b146102c25780639f678cca146102ca578063b2210957146102d2578063b6b55f251461030e578063c96f14b81461032b57610121565b80631e83409a116100f45780631e83409a14610208578063205c28781461022e57806338d52e0f1461025a5780634d7f3db01461027e578063715018a6146102ba57610121565b806301ffc9a7146101265780630ecc535f146101615780631794bb3c146101b6578063187f3334146101ee575b600080fd5b61014d6004803603602081101561013c57600080fd5b50356001600160e01b0319166103c3565b604080519115158252519081900360200190f35b6101876004803603602081101561017757600080fd5b50356001600160a01b03166103ff565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b6101ec600480360360608110156101cc57600080fd5b506001600160a01b03813581169160208101359091169060400135610425565b005b6101f6610583565b60408051918252519081900360200190f35b6101f66004803603602081101561021e57600080fd5b50356001600160a01b0316610589565b6101ec6004803603604081101561024457600080fd5b506001600160a01b0381351690602001356106f1565b610262610915565b604080516001600160a01b039092168252519081900360200190f35b6101ec6004803603608081101561029457600080fd5b506001600160a01b03813581169160208101359160408201358116916060013516610924565b6101ec610953565b6102626109ff565b6101f6610a0f565b6101ec600480360360808110156102e857600080fd5b506001600160a01b03813581169160208101358216916040820135916060013516610cab565b6101ec6004803603602081101561032457600080fd5b5035610ce7565b610333610daf565b604080516001600160701b039092168252519081900360200190f35b6101ec6004803603602081101561036557600080fd5b5035610dc5565b610374610ec0565b6040805163ffffffff9092168252519081900360200190f35b610333610ed3565b610262610ee2565b6101ec600480360360208110156103b357600080fd5b50356001600160a01b0316610ef1565b60006001600160e01b031982166301ffc9a760e01b14806103f757506001600160e01b03198216600162a1cb1960e01b0319145b90505b919050565b6069602052600090815260409020546001600160801b0380821691600160801b90041682565b600054610100900460ff168061043e575061043e610ff4565b8061044c575060005460ff16155b6104875760405162461bcd60e51b815260040180806020018281038252602e815260200180611773602e913960400191505060405180910390fd5b600054610100900460ff161580156104b2576000805460ff1961ff0019909116610100171660011790555b6104ba611005565b6104c26110b7565b6068805463ffffffff92909216600160e01b026001600160e01b03909216919091179055606580546001600160a01b038087166001600160a01b031992831617909255606680549286169290911691909117905561051f82610dc5565b60665460655460675460408051918252516001600160a01b039384169392909216917f10f27652c1015195ca7e6bc9b4c724cbf18e91c42117d92124703a3f49bb240f9181900360200190a3801561057d576000805461ff00191690555b50505050565b60675481565b6000610593610a0f565b5061059d826110c7565b506001600160a01b038216600090815260696020526040902080546001600160801b03808216909255606854600160801b909104909116906105f8906105f390600160701b90046001600160701b03168361126c565b6112ce565b606880546001600160701b0392909216600160701b026dffffffffffffffffffffffffffff60701b199092169190911790556065546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561068057600080fd5b505af1158015610694573d6000803e3d6000fd5b505050506040513d60208110156106aa57600080fd5b50506040805182815290516001600160a01b038516917fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a919081900360200190a292915050565b6106f9611316565b6001600160a01b031661070a6109ff565b6001600160a01b031614610753576040805162461bcd60e51b815260206004820181905260248201526000805160206117c2833981519152604482015290519081900360640190fd5b61075b610a0f565b50606554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156107a757600080fd5b505afa1580156107bb573d6000803e3d6000fd5b505050506040513d60208110156107d157600080fd5b50516068549091506000906107f7908390600160701b90046001600160701b031661126c565b90508083111561084e576040805162461bcd60e51b815260206004820152601e60248201527f546f6b656e4661756365742f696e73756666696369656e742d66756e64730000604482015290519081900360640190fd5b6065546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018790529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156108a457600080fd5b505af11580156108b8573d6000803e3d6000fd5b505050506040513d60208110156108ce57600080fd5b50506040805184815290516001600160a01b038616917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a250505050565b6065546001600160a01b031681565b6066546001600160a01b038381169116141561057d57610942610a0f565b5061094c846110c7565b5050505050565b61095b611316565b6001600160a01b031661096c6109ff565b6001600160a01b0316146109b5576040805162461bcd60e51b815260206004820181905260248201526000805160206117c2833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6033546001600160a01b03165b90565b600080610a1a6110b7565b60685463ffffffff9182169250600160e01b900416811415610a40576000915050610a0c565b606554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610a8b57600080fd5b505afa158015610a9f573d6000803e3d6000fd5b505050506040513d6020811015610ab557600080fd5b5051606854909150600090610adb908390600160701b90046001600160701b031661126c565b606854909150600090610b0090859063ffffffff600160e01b90910481169061126c16565b606854606654604080516318160ddd60e01b815290519394506001600160701b039092169260009283926001600160a01b0316916318160ddd91600480820192602092909190829003018186803b158015610b5a57600080fd5b505afa158015610b6e573d6000803e3d6000fd5b505050506040513d6020811015610b8457600080fd5b505190508015801590610b975750600085115b15610c0957606754610baa90859061131a565b915084821115610bb8578491505b6000610bc4838361137a565b9050610bd084826113a3565b6040805185815290519195507f7de59a92c9386255180c28ede4b61edb9b7b2ac96855ac634151489cef21bad6919081900360200190a1505b610c12836112ce565b606880546dffffffffffffffffffffffffffff19166001600160701b039283161790819055610c4d916105f391600160701b900416846113a3565b6068600e6101000a8154816001600160701b0302191690836001600160701b03160217905550610c7c876113fd565b6068805463ffffffff92909216600160e01b026001600160e01b03909216919091179055509550505050505090565b6066546001600160a01b038281169116148015610cd057506001600160a01b03841615155b1561057d57610cdd610a0f565b50610942836110c7565b610cef610a0f565b50606554604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015610d4a57600080fd5b505af1158015610d5e573d6000803e3d6000fd5b505050506040513d6020811015610d7457600080fd5b505060408051828152905133917f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4919081900360200190a250565b606854600160701b90046001600160701b031681565b610dcd611316565b6001600160a01b0316610dde6109ff565b6001600160a01b031614610e27576040805162461bcd60e51b815260206004820181905260248201526000805160206117c2833981519152604482015290519081900360640190fd5b60008111610e7c576040805162461bcd60e51b815260206004820152601c60248201527f546f6b656e4661756365742f64726970526174652d67742d7a65726f00000000604482015290519081900360640190fd5b610e84610a0f565b5060678190556040805182815290517f3d38e7cd2e029035006f9977a727c8724cd41dffb6d2a40d9f66bd4c26836a329181900360200190a150565b606854600160e01b900463ffffffff1681565b6068546001600160701b031681565b6066546001600160a01b031681565b610ef9611316565b6001600160a01b0316610f0a6109ff565b6001600160a01b031614610f53576040805162461bcd60e51b815260206004820181905260248201526000805160206117c2833981519152604482015290519081900360640190fd5b6001600160a01b038116610f985760405162461bcd60e51b81526004018080602001828103825260268152602001806117266026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610fff30611442565b15905090565b600054610100900460ff168061101e575061101e610ff4565b8061102c575060005460ff16155b6110675760405162461bcd60e51b815260040180806020018281038252602e815260200180611773602e913960400191505060405180910390fd5b600054610100900460ff16158015611092576000805460ff1961ff0019909116610100171660011790555b61109a611448565b6110a26114e8565b80156110b4576000805461ff00191690555b50565b60006110c2426113fd565b905090565b6001600160a01b038116600090815260696020526040812080546068546001600160701b03166001600160801b0390911614156111085760009150506103fa565b805460685460009161112c916001600160701b0316906001600160801b031661126c565b606654604080516370a0823160e01b81526001600160a01b038881166004830152915193945060009391909216916370a08231916024808301926020929190829003018186803b15801561117f57600080fd5b505afa158015611193573d6000803e3d6000fd5b505050506040513d60208110156111a957600080fd5b5051905060006111c16111bc83856115e1565b611602565b604080518082019091526068546001600160701b031681528554919250906020820190611206906111bc90600160801b90046001600160801b039081169086166113a3565b6001600160801b039081169091526001600160a01b03881660009081526069602090815260409091208351815494909201518316600160801b029183166fffffffffffffffffffffffffffffffff19909416939093179091161790559350505050919050565b6000828211156112c3576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6000600160701b82106113125760405162461bcd60e51b81526004018080602001828103825260298152602001806117e26029913960400191505060405180910390fd5b5090565b3390565b600082611329575060006112c8565b8282028284828161133657fe5b04146113735760405162461bcd60e51b81526004018080602001828103825260218152602001806117a16021913960400191505060405180910390fd5b9392505050565b60008061138f84670de0b6b3a764000061131a565b905061139b8184611646565b949350505050565b600082820183811015611373576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600064010000000082106113125760405162461bcd60e51b815260040180806020018281038252602681526020018061180b6026913960400191505060405180910390fd5b3b151590565b600054610100900460ff16806114615750611461610ff4565b8061146f575060005460ff16155b6114aa5760405162461bcd60e51b815260040180806020018281038252602e815260200180611773602e913960400191505060405180910390fd5b600054610100900460ff161580156110a2576000805460ff1961ff00199091166101001716600117905580156110b4576000805461ff001916905550565b600054610100900460ff16806115015750611501610ff4565b8061150f575060005460ff16155b61154a5760405162461bcd60e51b815260040180806020018281038252602e815260200180611773602e913960400191505060405180910390fd5b600054610100900460ff16158015611575576000805460ff1961ff0019909116610100171660011790555b600061157f611316565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156110b4576000805461ff001916905550565b6000806115ee838561131a565b905061139b81670de0b6b3a7640000611646565b6000600160801b82106113125760405162461bcd60e51b815260040180806020018281038252602781526020018061174c6027913960400191505060405180910390fd5b600061137383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506000818361170f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156116d45781810151838201526020016116bc565b50505050905090810190601f1680156117015780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161171b57fe5b049594505050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e203132382062697473496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657253616665436173743a2076616c756520646f65736e27742066697420696e20616e2075696e7431313253616665436173743a2076616c756520646f65736e27742066697420696e2033322062697473a2646970667358221220ca90e018c76dda1f3b271af212deb27b3e80278ba6dc894d44af423d3761577064736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x121 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0xAD JUMPI DUP1 PUSH4 0xCA5BAAFC GT PUSH2 0x71 JUMPI DUP1 PUSH4 0xCA5BAAFC EQ PUSH2 0x34F JUMPI DUP1 PUSH4 0xD9772A25 EQ PUSH2 0x36C JUMPI DUP1 PUSH4 0xE318613E EQ PUSH2 0x38D JUMPI DUP1 PUSH4 0xEFA9A1AD EQ PUSH2 0x395 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x39D JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x2C2 JUMPI DUP1 PUSH4 0x9F678CCA EQ PUSH2 0x2CA JUMPI DUP1 PUSH4 0xB2210957 EQ PUSH2 0x2D2 JUMPI DUP1 PUSH4 0xB6B55F25 EQ PUSH2 0x30E JUMPI DUP1 PUSH4 0xC96F14B8 EQ PUSH2 0x32B JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x1E83409A GT PUSH2 0xF4 JUMPI DUP1 PUSH4 0x1E83409A EQ PUSH2 0x208 JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x22E JUMPI DUP1 PUSH4 0x38D52E0F EQ PUSH2 0x25A JUMPI DUP1 PUSH4 0x4D7F3DB0 EQ PUSH2 0x27E JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x2BA JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x126 JUMPI DUP1 PUSH4 0xECC535F EQ PUSH2 0x161 JUMPI DUP1 PUSH4 0x1794BB3C EQ PUSH2 0x1B6 JUMPI DUP1 PUSH4 0x187F3334 EQ PUSH2 0x1EE JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x14D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x13C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH2 0x3C3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x187 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x177 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3FF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x1CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x425 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1F6 PUSH2 0x583 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1F6 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x21E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x589 JUMP JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x244 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x6F1 JUMP JUMPDEST PUSH2 0x262 PUSH2 0x915 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x294 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x924 JUMP JUMPDEST PUSH2 0x1EC PUSH2 0x953 JUMP JUMPDEST PUSH2 0x262 PUSH2 0x9FF JUMP JUMPDEST PUSH2 0x1F6 PUSH2 0xA0F JUMP JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x2E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0xCAB JUMP JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x324 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xCE7 JUMP JUMPDEST PUSH2 0x333 PUSH2 0xDAF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x365 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xDC5 JUMP JUMPDEST PUSH2 0x374 PUSH2 0xEC0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0xFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x333 PUSH2 0xED3 JUMP JUMPDEST PUSH2 0x262 PUSH2 0xEE2 JUMP JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xEF1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL EQ DUP1 PUSH2 0x3F7 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT EQ JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x69 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV AND DUP3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x43E JUMPI POP PUSH2 0x43E PUSH2 0xFF4 JUMP JUMPDEST DUP1 PUSH2 0x44C JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x487 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1773 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x4B2 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x4BA PUSH2 0x1005 JUMP JUMPDEST PUSH2 0x4C2 PUSH2 0x10B7 JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH4 0xFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xE0 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x65 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SWAP3 SSTORE PUSH1 0x66 DUP1 SLOAD SWAP3 DUP7 AND SWAP3 SWAP1 SWAP2 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x51F DUP3 PUSH2 0xDC5 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x65 SLOAD PUSH1 0x67 SLOAD PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND SWAP4 SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x10F27652C1015195CA7E6BC9B4C724CBF18E91C42117D92124703A3F49BB240F SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 DUP1 ISZERO PUSH2 0x57D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x67 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x593 PUSH2 0xA0F JUMP JUMPDEST POP PUSH2 0x59D DUP3 PUSH2 0x10C7 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP1 SWAP3 SSTORE PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV SWAP1 SWAP2 AND SWAP1 PUSH2 0x5F8 SWAP1 PUSH2 0x5F3 SWAP1 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP4 PUSH2 0x126C JUMP JUMPDEST PUSH2 0x12CE JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP3 SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x70 SHL MUL PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x70 SHL NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP6 SWAP1 MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xA9059CBB SWAP2 PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x680 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x694 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP2 PUSH32 0xD8138F8A3F377C5259CA548E70E4C2DE94F129F5A11036A15B69513CBA2B426A SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x6F9 PUSH2 0x1316 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x70A PUSH2 0x9FF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x753 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x17C2 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x75B PUSH2 0xA0F JUMP JUMPDEST POP PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x7A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x7BB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x7D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x68 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0x7F7 SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND PUSH2 0x126C JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x84E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6B656E4661756365742F696E73756666696369656E742D66756E64730000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xA9059CBB SWAP2 PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x8A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8B8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x8CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND SWAP2 PUSH32 0x7084F5476618D8E60B11EF0D7D3F06914655ADB8793E28FF7F018D4C76D505D5 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 POP POP POP POP JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x57D JUMPI PUSH2 0x942 PUSH2 0xA0F JUMP JUMPDEST POP PUSH2 0x94C DUP5 PUSH2 0x10C7 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x95B PUSH2 0x1316 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x96C PUSH2 0x9FF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x9B5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x17C2 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xA1A PUSH2 0x10B7 JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH4 0xFFFFFFFF SWAP2 DUP3 AND SWAP3 POP PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV AND DUP2 EQ ISZERO PUSH2 0xA40 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0xA0C JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xA9F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xAB5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x68 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0xADB SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND PUSH2 0x126C JUMP JUMPDEST PUSH1 0x68 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0xB00 SWAP1 DUP6 SWAP1 PUSH4 0xFFFFFFFF PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 SWAP2 DIV DUP2 AND SWAP1 PUSH2 0x126C AND JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x18160DDD PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD SWAP4 SWAP5 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP1 SWAP3 AND SWAP3 PUSH1 0x0 SWAP3 DUP4 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x18160DDD SWAP2 PUSH1 0x4 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB5A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xB6E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xB84 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 ISZERO DUP1 ISZERO SWAP1 PUSH2 0xB97 JUMPI POP PUSH1 0x0 DUP6 GT JUMPDEST ISZERO PUSH2 0xC09 JUMPI PUSH1 0x67 SLOAD PUSH2 0xBAA SWAP1 DUP6 SWAP1 PUSH2 0x131A JUMP JUMPDEST SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0xBB8 JUMPI DUP5 SWAP2 POP JUMPDEST PUSH1 0x0 PUSH2 0xBC4 DUP4 DUP4 PUSH2 0x137A JUMP JUMPDEST SWAP1 POP PUSH2 0xBD0 DUP5 DUP3 PUSH2 0x13A3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP6 POP PUSH32 0x7DE59A92C9386255180C28EDE4B61EDB9B7B2AC96855AC634151489CEF21BAD6 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH2 0xC12 DUP4 PUSH2 0x12CE JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP3 DUP4 AND OR SWAP1 DUP2 SWAP1 SSTORE PUSH2 0xC4D SWAP2 PUSH2 0x5F3 SWAP2 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV AND DUP5 PUSH2 0x13A3 JUMP JUMPDEST PUSH1 0x68 PUSH1 0xE PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND MUL OR SWAP1 SSTORE POP PUSH2 0xC7C DUP8 PUSH2 0x13FD JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH4 0xFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xE0 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP SWAP6 POP POP POP POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND SWAP2 AND EQ DUP1 ISZERO PUSH2 0xCD0 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x57D JUMPI PUSH2 0xCDD PUSH2 0xA0F JUMP JUMPDEST POP PUSH2 0x942 DUP4 PUSH2 0x10C7 JUMP JUMPDEST PUSH2 0xCEF PUSH2 0xA0F JUMP JUMPDEST POP PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x23B872DD SWAP2 PUSH1 0x64 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD5E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xD74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD CALLER SWAP2 PUSH32 0x2DA466A7B24304F47E87FA2E1E5A81B9831CE54FEC19055CE277CA2F39BA42C4 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0xDCD PUSH2 0x1316 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xDDE PUSH2 0x9FF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xE27 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x17C2 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 GT PUSH2 0xE7C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6B656E4661756365742F64726970526174652D67742D7A65726F00000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xE84 PUSH2 0xA0F JUMP JUMPDEST POP PUSH1 0x67 DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3D38E7CD2E029035006F9977A727C8724CD41DFFB6D2A40D9F66BD4C26836A32 SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0xEF9 PUSH2 0x1316 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF0A PUSH2 0x9FF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xF53 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x17C2 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0xF98 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1726 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFFF ADDRESS PUSH2 0x1442 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x101E JUMPI POP PUSH2 0x101E PUSH2 0xFF4 JUMP JUMPDEST DUP1 PUSH2 0x102C JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1067 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1773 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1092 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x109A PUSH2 0x1448 JUMP JUMPDEST PUSH2 0x10A2 PUSH2 0x14E8 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x10B4 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10C2 TIMESTAMP PUSH2 0x13FD JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 SWAP2 AND EQ ISZERO PUSH2 0x1108 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x3FA JUMP JUMPDEST DUP1 SLOAD PUSH1 0x68 SLOAD PUSH1 0x0 SWAP2 PUSH2 0x112C SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x126C JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP2 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP4 SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x117F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1193 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x11A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x11C1 PUSH2 0x11BC DUP4 DUP6 PUSH2 0x15E1 JUMP JUMPDEST PUSH2 0x1602 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP2 MSTORE DUP6 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x20 DUP3 ADD SWAP1 PUSH2 0x1206 SWAP1 PUSH2 0x11BC SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND SWAP1 DUP7 AND PUSH2 0x13A3 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP4 MLOAD DUP2 SLOAD SWAP5 SWAP1 SWAP3 ADD MLOAD DUP4 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP2 DUP4 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP2 AND OR SWAP1 SSTORE SWAP4 POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x12C3 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x70 SHL DUP3 LT PUSH2 0x1312 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x17E2 PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1329 JUMPI POP PUSH1 0x0 PUSH2 0x12C8 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x1336 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x1373 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x17A1 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x138F DUP5 PUSH8 0xDE0B6B3A7640000 PUSH2 0x131A JUMP JUMPDEST SWAP1 POP PUSH2 0x139B DUP2 DUP5 PUSH2 0x1646 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1373 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH5 0x100000000 DUP3 LT PUSH2 0x1312 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x180B PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1461 JUMPI POP PUSH2 0x1461 PUSH2 0xFF4 JUMP JUMPDEST DUP1 PUSH2 0x146F JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x14AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1773 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x10A2 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x10B4 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1501 JUMPI POP PUSH2 0x1501 PUSH2 0xFF4 JUMP JUMPDEST DUP1 PUSH2 0x150F JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x154A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1773 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1575 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x157F PUSH2 0x1316 JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x10B4 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x15EE DUP4 DUP6 PUSH2 0x131A JUMP JUMPDEST SWAP1 POP PUSH2 0x139B DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x1646 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x1312 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x174C PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1373 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH1 0x0 DUP2 DUP4 PUSH2 0x170F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x16D4 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x16BC JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1701 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x171B JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP INVALID 0x4F PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F206164647265737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E203132382062697473496E697469 PUSH2 0x6C69 PUSH27 0x61626C653A20636F6E747261637420697320616C72656164792069 PUSH15 0x697469616C697A6564536166654D61 PUSH21 0x683A206D756C7469706C69636174696F6E206F7665 PUSH19 0x666C6F774F776E61626C653A2063616C6C6572 KECCAK256 PUSH10 0x73206E6F742074686520 PUSH16 0x776E657253616665436173743A207661 PUSH13 0x756520646F65736E2774206669 PUSH21 0x20696E20616E2075696E7431313253616665436173 PUSH21 0x3A2076616C756520646F65736E2774206669742069 PUSH15 0x2033322062697473A2646970667358 0x22 SLT KECCAK256 0xCA SWAP1 0xE0 XOR 0xC7 PUSH14 0xDA1F3B271AF212DEB27B3E80278B 0xA6 0xDC DUP10 0x4D DIFFICULTY 0xAF TIMESTAMP RETURNDATASIZE CALLDATACOPY PUSH2 0x5770 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "926:7693:86:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;191:249:95;;;;;;;;;;;;;;;;-1:-1:-1;191:249:95;-1:-1:-1;;;;;;191:249:95;;:::i;:::-;;;;;;;;;;;;;;;;;;2374:47:86;;;;;;;;;;;;;;;;-1:-1:-1;2374:47:86;-1:-1:-1;;;;;2374:47:86;;:::i;:::-;;;;-1:-1:-1;;;;;2374:47:86;;;;;;;;;;;;;;;;;;;;;;;;2666:377;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2666:377:86;;;;;;;;;;;;;;;;;:::i;:::-;;1919:32;;;:::i;:::-;;;;;;;;;;;;;;;;4202:352;;;;;;;;;;;;;;;;-1:-1:-1;4202:352:86;-1:-1:-1;;;;;4202:352:86;;:::i;3676:364::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3676:364:86;;;;;;;;:::i;1690:30::-;;;:::i;:::-;;;;-1:-1:-1;;;;;1690:30:86;;;;;;;;;;;;;;7597:216;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7597:216:86;;;;;;;;;;;;;;;;;;;;;;:::i;1967:145:0:-;;;:::i;1335:85::-;;;:::i;4725:1220:86:-;;;:::i;8056:327::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8056:327:86;;;;;;;;;;;;;;;;;;;;;;:::i;3345:159::-;;;;;;;;;;;;;;;;-1:-1:-1;3345:159:86;;:::i;2160:29::-;;;:::i;:::-;;;;-1:-1:-1;;;;;2160:29:86;;;;;;;;;;;;;;6144:287;;;;;;;;;;;;;;;;-1:-1:-1;6144:287:86;;:::i;2260:31::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2040:35;;;:::i;1810:32::-;;;:::i;2261:240:0:-;;;;;;;;;;;;;;;;-1:-1:-1;2261:240:0;-1:-1:-1;;;;;2261:240:0;;:::i;191:249:95:-;270:4;-1:-1:-1;;;;;;297:51:95;;-1:-1:-1;;;297:51:95;;:132;;-1:-1:-1;;;;;;;359:70:95;;-1:-1:-1;;;;;;359:70:95;297:132;282:153;;191:249;;;;:::o;2374:47:86:-;;;;;;;;;;;;-1:-1:-1;;;;;2374:47:86;;;;-1:-1:-1;;;2374:47:86;;;;:::o;2666:377::-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;2810:16:86::1;:14;:16::i;:::-;2852:14;:12;:14::i;:::-;2832:17;:34:::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;2832:34:86::1;-1:-1:-1::0;;;;;2832:34:86;;::::1;::::0;;;::::1;::::0;;2872:5:::1;:14:::0;;-1:-1:-1;;;;;2872:14:86;;::::1;-1:-1:-1::0;;;;;;2872:14:86;;::::1;;::::0;;;2892:7:::1;:18:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;2916:40:::1;2937:18:::0;2916:20:::1;:40::i;:::-;3000:7;::::0;2987:5:::1;::::0;3015:17:::1;::::0;2968:70:::1;::::0;;;;;;-1:-1:-1;;;;;3000:7:86;;::::1;::::0;2987:5;;::::1;::::0;2968:70:::1;::::0;;;;::::1;::::0;;::::1;1794:14:9::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1790:66;2666:377:86;;;;:::o;1919:32::-;;;;:::o;4202:352::-;4249:7;4264:6;:4;:6::i;:::-;;4276:30;4301:4;4276:24;:30::i;:::-;-1:-1:-1;;;;;;4330:16:86;;4312:15;4330:16;;;:10;:16;;;;;:24;;-1:-1:-1;;;;;4360:28:86;;;;;;4419:14;;-1:-1:-1;;;4330:24:86;;;;;;;4411:48;;:36;;-1:-1:-1;;;4419:14:86;;-1:-1:-1;;;;;4419:14:86;4330:24;4411:27;:36::i;:::-;:46;:48::i;:::-;4394:14;:65;;-1:-1:-1;;;;;4394:65:86;;;;-1:-1:-1;;;4394:65:86;-1:-1:-1;;;;;;;;4394:65:86;;;;;;;;;4465:5;;:29;;;-1:-1:-1;;;4465:29:86;;-1:-1:-1;;;;;4465:29:86;;;;;;;;;;;;;;;:5;;;;;-1:-1:-1;;4465:29:86;;;;;;;;;;;;;;-1:-1:-1;4465:5:86;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4506:22:86;;;;;;;;-1:-1:-1;;;;;4506:22:86;;;;;;;;;4465:29;4506:22;;;4542:7;4202:352;-1:-1:-1;;4202:352:86:o;3676:364::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;3749:6:86::1;:4;:6::i;:::-;-1:-1:-1::0;3788:5:86::1;::::0;:30:::1;::::0;;-1:-1:-1;;;3788:30:86;;3812:4:::1;3788:30;::::0;::::1;::::0;;;-1:-1:-1;;;;;;;3788:5:86::1;::::0;-1:-1:-1;;3788:30:86;;;;;::::1;::::0;;;;;;;;:5;:30;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;3788:30:86;3876:14:::1;::::0;3788:30;;-1:-1:-1;3824:28:86::1;::::0;3855:36:::1;::::0;3788:30;;-1:-1:-1;;;3876:14:86;::::1;-1:-1:-1::0;;;;;3876:14:86::1;3855:20;:36::i;:::-;3824:67;;3915:20;3905:6;:30;;3897:73;;;::::0;;-1:-1:-1;;;3897:73:86;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;3976:5;::::0;:26:::1;::::0;;-1:-1:-1;;;3976:26:86;;-1:-1:-1;;;;;3976:26:86;;::::1;;::::0;::::1;::::0;;;;;;;;;:5;;;::::1;::::0;-1:-1:-1;;3976:26:86;;;;;::::1;::::0;;;;;;;;-1:-1:-1;3976:5:86;:26;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;4014:21:86::1;::::0;;;;;;;-1:-1:-1;;;;;4014:21:86;::::1;::::0;::::1;::::0;;;;;3976:26:::1;4014:21:::0;;::::1;1617:1:0;;3676:364:86::0;;:::o;1690:30::-;;;-1:-1:-1;;;;;1690:30:86;;:::o;7597:216::-;7742:7;;-1:-1:-1;;;;;7725:25:86;;;7742:7;;7725:25;7721:88;;;7760:6;:4;:6::i;:::-;;7774:28;7799:2;7774:24;:28::i;:::-;;7597:216;;;;:::o;1967:145:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;2057:6:::1;::::0;2036:40:::1;::::0;2073:1:::1;::::0;-1:-1:-1;;;;;2057:6:0::1;::::0;2036:40:::1;::::0;2073:1;;2036:40:::1;2086:6;:19:::0;;-1:-1:-1;;;;;;2086:19:0::1;::::0;;1967:145::o;1335:85::-;1407:6;;-1:-1:-1;;;;;1407:6:0;1335:85;;:::o;4725:1220:86:-;4757:7;4772:24;4799:14;:12;:14::i;:::-;4868:17;;4772:41;;;;;-1:-1:-1;;;;4868:17:86;;;:45;;4864:74;;;4930:1;4923:8;;;;;4864:74;4971:5;;:30;;;-1:-1:-1;;;4971:30:86;;4995:4;4971:30;;;;;;-1:-1:-1;;;;;;;4971:5:86;;-1:-1:-1;;4971:30:86;;;;;;;;;;;;;;:5;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4971:30:86;5059:14;;4971:30;;-1:-1:-1;5007:28:86;;5038:36;;4971:30;;-1:-1:-1;;;5059:14:86;;-1:-1:-1;;;;;5059:14:86;5038:20;:36::i;:::-;5122:17;;5007:67;;-1:-1:-1;5080:18:86;;5101:39;;:16;;5122:17;-1:-1:-1;;;5122:17:86;;;;;;5101:20;:39;:::i;:::-;5181:20;;5259:7;;:21;;;-1:-1:-1;;;5259:21:86;;;;5080:60;;-1:-1:-1;;;;;;5181:20:86;;;;5146:32;;;;-1:-1:-1;;;;;5259:7:86;;-1:-1:-1;;5259:21:86;;;;;;;;;;;;;;;:7;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5259:21:86;;-1:-1:-1;5291:22:86;;;;;:50;;;5340:1;5317:20;:24;5291:50;5287:439;;;5378:17;;5363:33;;:10;;:14;:33::i;:::-;5351:45;;5420:20;5408:9;:32;5404:89;;;5464:20;5452:32;;5404:89;5500:26;5529:59;5558:9;5569:18;5529:28;:59::i;:::-;5500:88;-1:-1:-1;5623:48:86;:24;5500:88;5623:28;:48::i;:::-;5685:34;;;;;;;;5596:75;;-1:-1:-1;5685:34:86;;;;;;;;;;5287:439;;5755:36;:24;:34;:36::i;:::-;5732:20;:59;;-1:-1:-1;;5732:59:86;-1:-1:-1;;;;;5732:59:86;;;;;;;;5814:50;;:38;;-1:-1:-1;;;5822:14:86;;;5842:9;5814:27;:38::i;:50::-;5797:14;:67;;-1:-1:-1;;;;;;;;5797:67:86;-1:-1:-1;;;;;5797:67:86;;;;-1:-1:-1;;;5797:67:86;;;;;;;5890:27;:16;:25;:27::i;:::-;5870:17;:47;;;;;;;-1:-1:-1;;;5870:47:86;-1:-1:-1;;;;;5870:47:86;;;;;;;;;-1:-1:-1;5931:9:86;;-1:-1:-1;;;;;;4725:1220:86:o;8056:327::-;8252:7;;-1:-1:-1;;;;;8235:25:86;;;8252:7;;8235:25;:47;;;;-1:-1:-1;;;;;;8264:18:86;;;;8235:47;8231:148;;;8292:6;:4;:6::i;:::-;;8306:28;8331:2;8306:24;:28::i;3345:159::-;3393:6;:4;:6::i;:::-;-1:-1:-1;3405:5:86;;:53;;;-1:-1:-1;;;3405:53:86;;3424:10;3405:53;;;;3444:4;3405:53;;;;;;;;;;;;-1:-1:-1;;;;;3405:5:86;;;;-1:-1:-1;;3405:53:86;;;;;;;;;;;;;;;-1:-1:-1;3405:5:86;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3470:29:86;;;;;;;;3480:10;;3470:29;;;;;;3405:53;3470:29;;;3345:159;:::o;2160:29::-;;;-1:-1:-1;;;2160:29:86;;-1:-1:-1;;;;;2160:29:86;;:::o;6144:287::-;1558:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;6254:1:86::1;6233:18;:22;6225:63;;;::::0;;-1:-1:-1;;;6225:63:86;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;6329:6;:4;:6::i;:::-;-1:-1:-1::0;6342:17:86::1;:38:::0;;;6392:34:::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;6144:287:::0;:::o;2260:31::-;;;-1:-1:-1;;;2260:31:86;;;;;:::o;2040:35::-;;;-1:-1:-1;;;;;2040:35:86;;:::o;1810:32::-;;;-1:-1:-1;;;;;1810:32:86;;:::o;2261:240:0:-;1558:12;:10;:12::i;:::-;-1:-1:-1;;;;;1547:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1547:23:0;;1539:68;;;;;-1:-1:-1;;;1539:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1539:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;2349:22:0;::::1;2341:73;;;;-1:-1:-1::0;;;2341:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2450:6;::::0;2429:38:::1;::::0;-1:-1:-1;;;;;2429:38:0;;::::1;::::0;2450:6:::1;::::0;2429:38:::1;::::0;2450:6:::1;::::0;2429:38:::1;2477:6;:17:::0;;-1:-1:-1;;;;;;2477:17:0::1;-1:-1:-1::0;;;;;2477:17:0;;;::::1;::::0;;;::::1;::::0;;2261:240::o;1952:123:9:-;2000:4;2024:44;2062:4;2024:29;:44::i;:::-;2023:45;2016:52;;1952:123;:::o;935:126:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;992:26:0::1;:24;:26::i;:::-;1028;:24;:26::i;:::-;1794:14:9::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1790:66;935:126:0;:::o;8509:107:86:-;8564:6;8585:26;:15;:24;:26::i;:::-;8578:33;;8509:107;:::o;6674:749::-;-1:-1:-1;;;;;6792:16:86;;6747:7;6792:16;;;:10;:16;;;;;6842:34;;6818:20;;-1:-1:-1;;;;;6818:20:86;-1:-1:-1;;;;;6842:34:86;;;6818:58;6814:128;;;6934:1;6927:8;;;;;6814:128;7017:34;;6991:20;;6947:33;;6983:69;;-1:-1:-1;;;;;6991:20:86;;-1:-1:-1;;;;;7017:34:86;6983:33;:69::i;:::-;7087:7;;:23;;;-1:-1:-1;;;7087:23:86;;-1:-1:-1;;;;;7087:23:86;;;;;;;;;6947:105;;-1:-1:-1;;;7087:7:86;;;;;-1:-1:-1;;7087:23:86;;;;;;;;;;;;;;:7;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7087:23:86;;-1:-1:-1;7116:17:86;7136:92;:80;7087:23;7190:25;7136:33;:80::i;:::-;:90;:92::i;:::-;7254:141;;;;;;;;;7298:20;;-1:-1:-1;;;;;7298:20:86;7254:141;;7343:17;;7116:112;;-1:-1:-1;7254:141:86;;;;;7335:53;;:41;;-1:-1:-1;;;7343:17:86;;-1:-1:-1;;;;;7343:17:86;;;;7335:41;;:30;:41::i;:53::-;-1:-1:-1;;;;;7254:141:86;;;;;;-1:-1:-1;;;;;7235:16:86;;;;;;;;:10;:16;;;;;;;;:160;;;;;;;;;;;-1:-1:-1;;;7235:160:86;;;;-1:-1:-1;;7235:160:86;;;;;;;;;;;;;;;;;-1:-1:-1;7235:160:86;;7409:9;-1:-1:-1;;;6674:749:86:o;3147:155:8:-;3205:7;3237:1;3232;:6;;3224:49;;;;;-1:-1:-1;;;3224:49:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3290:5:8;;;3147:155;;;;;:::o;258:172:98:-;315:7;-1:-1:-1;;;338:14:98;;330:68;;;;-1:-1:-1;;;330:68:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;419:5:98;258:172::o;828:104:19:-;915:10;828:104;:::o;3549:215:8:-;3607:7;3630:6;3626:20;;-1:-1:-1;3645:1:8;3638:8;;3626:20;3668:5;;;3672:1;3668;:5;:1;3691:5;;;;;:10;3683:56;;;;-1:-1:-1;;;3683:56:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3756:1;3549:215;-1:-1:-1;;;3549:215:8:o;1484:226:26:-;1574:7;;1612:20;:9;1149:4;1612:13;:20::i;:::-;1593:39;-1:-1:-1;1653:25:26;1593:39;1666:11;1653:12;:25::i;:::-;1642:36;1484:226;-1:-1:-1;;;;1484:226:26:o;2701:175:8:-;2759:7;2790:5;;;2813:6;;;;2805:46;;;;;-1:-1:-1;;;2805:46:8;;;;;;;;;;;;;;;;;;;;;;;;;;;2028:176:24;2084:6;2118:5;2110;:13;2102:65;;;;-1:-1:-1;;;2102:65:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;737:413:18;1097:20;1135:8;;;737:413::o;759:64:19:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1794:14;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;759:64:19:o;1067:192:0:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1134:17:0::1;1154:12;:10;:12::i;:::-;1176:6;:18:::0;;-1:-1:-1;;;;;;1176:18:0::1;-1:-1:-1::0;;;;;1176:18:0;::::1;::::0;;::::1;::::0;;;1209:43:::1;::::0;1176:18;;-1:-1:-1;1176:18:0;-1:-1:-1;;1209:43:0::1;::::0;-1:-1:-1;;1209:43:0::1;1778:1:9;1794:14:::0;1790:66;;;-1:-1:-1;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;1067:192:0:o;1967:201:26:-;2051:7;;2087:15;:8;2100:1;2087:12;:15::i;:::-;2070:32;-1:-1:-1;2121:17:26;2070:32;1149:4;2121:10;:17::i;1097:181:24:-;1154:7;-1:-1:-1;;;1181:14:24;;1173:67;;;;-1:-1:-1;;;1173:67:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3187:130:27;3245:7;3271:39;3275:1;3278;3271:39;;;;;;;;;;;;;;;;;3885:7;3919:12;3912:5;3904:28;;;;-1:-1:-1;;;3904:28:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3904:28:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3942:9;3958:1;3954;:5;;;;;;;3799:272;-1:-1:-1;;;;;3799:272:27:o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "1249200",
                "executionCost": "1302",
                "totalCost": "1250502"
              },
              "external": {
                "asset()": "1104",
                "beforeTokenMint(address,uint256,address,address)": "infinite",
                "beforeTokenTransfer(address,address,uint256,address)": "infinite",
                "claim(address)": "infinite",
                "deposit(uint256)": "infinite",
                "drip()": "infinite",
                "dripRatePerSecond()": "1088",
                "exchangeRateMantissa()": "1103",
                "initialize(address,address,uint256)": "infinite",
                "lastDripTimestamp()": "1074",
                "measure()": "1125",
                "owner()": "1061",
                "renounceOwnership()": "infinite",
                "setDripRatePerSecond(uint256)": "infinite",
                "supportsInterface(bytes4)": "402",
                "totalUnclaimed()": "1165",
                "transferOwnership(address)": "infinite",
                "userStates(address)": "1271",
                "withdrawTo(address,uint256)": "infinite"
              },
              "internal": {
                "_captureNewTokensForUser(address)": "infinite",
                "_currentTime()": "infinite"
              }
            },
            "methodIdentifiers": {
              "asset()": "38d52e0f",
              "beforeTokenMint(address,uint256,address,address)": "4d7f3db0",
              "beforeTokenTransfer(address,address,uint256,address)": "b2210957",
              "claim(address)": "1e83409a",
              "deposit(uint256)": "b6b55f25",
              "drip()": "9f678cca",
              "dripRatePerSecond()": "187f3334",
              "exchangeRateMantissa()": "e318613e",
              "initialize(address,address,uint256)": "1794bb3c",
              "lastDripTimestamp()": "d9772a25",
              "measure()": "efa9a1ad",
              "owner()": "8da5cb5b",
              "renounceOwnership()": "715018a6",
              "setDripRatePerSecond(uint256)": "ca5baafc",
              "supportsInterface(bytes4)": "01ffc9a7",
              "totalUnclaimed()": "c96f14b8",
              "transferOwnership(address)": "f2fde38b",
              "userStates(address)": "0ecc535f",
              "withdrawTo(address,uint256)": "205c2878"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newTokens\",\"type\":\"uint256\"}],\"name\":\"Claimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"dripRatePerSecond\",\"type\":\"uint256\"}],\"name\":\"DripRateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newTokens\",\"type\":\"uint256\"}],\"name\":\"Dripped\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"measure\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"dripRatePerSecond\",\"type\":\"uint256\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"asset\",\"outputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"beforeTokenMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"beforeTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"claim\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"drip\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"dripRatePerSecond\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"exchangeRateMantissa\",\"outputs\":[{\"internalType\":\"uint112\",\"name\":\"\",\"type\":\"uint112\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_asset\",\"type\":\"address\"},{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_measure\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_dripRatePerSecond\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastDripTimestamp\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"measure\",\"outputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_dripRatePerSecond\",\"type\":\"uint256\"}],\"name\":\"setDripRatePerSecond\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalUnclaimed\",\"outputs\":[{\"internalType\":\"uint112\",\"name\":\"\",\"type\":\"uint112\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"userStates\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"lastExchangeRateMantissa\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"balance\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"beforeTokenMint(address,uint256,address,address)\":{\"params\":{\"to\":\"The user who is minting the tokens\",\"token\":\"The token they are minting\"}},\"beforeTokenTransfer(address,address,uint256,address)\":{\"params\":{\"from\":\"The user who is sending the tokens\",\"to\":\"The user who is receiving the tokens\",\"token\":\"The token token they are burning\"}},\"claim(address)\":{\"params\":{\"user\":\"The user to claim tokens for\"},\"returns\":{\"_0\":\"The amount of tokens that were claimed.\"}},\"deposit(uint256)\":{\"params\":{\"amount\":\"The amount of asset tokens to add (must be approved already)\"}},\"drip()\":{\"details\":\"Should be called immediately before any measure token mints/transfers/burns\",\"returns\":{\"_0\":\"The number of new tokens dripped.\"}},\"initialize(address,address,uint256)\":{\"params\":{\"_asset\":\"The asset to disburse to users\",\"_dripRatePerSecond\":\"The amount of the asset to drip each second\",\"_measure\":\"The token to use to measure a users portion\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setDripRatePerSecond(uint256)\":{\"params\":{\"_dripRatePerSecond\":\"The new drip rate in tokens per second\"}},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"withdrawTo(address,uint256)\":{\"params\":{\"amount\":\"The amount to withdraw\",\"to\":\"The address to withdraw to\"}}},\"title\":\"Disburses a token at a fixed rate per second to holders of another token.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"asset()\":{\"notice\":\"The token that is being disbursed\"},\"beforeTokenMint(address,uint256,address,address)\":{\"notice\":\"Should be called before a user mints new \\\"measure\\\" tokens.\"},\"beforeTokenTransfer(address,address,uint256,address)\":{\"notice\":\"Should be called before \\\"measure\\\" tokens are transferred or burned\"},\"claim(address)\":{\"notice\":\"Transfers all unclaimed tokens to the user\"},\"deposit(uint256)\":{\"notice\":\"Safely deposits asset tokens into the faucet.  Must be pre-approved This should be used instead of transferring directly because the drip function must be called before receiving new assets.\"},\"drip()\":{\"notice\":\"Drips new tokens.\"},\"dripRatePerSecond()\":{\"notice\":\"The total number of tokens that are disbursed each second\"},\"exchangeRateMantissa()\":{\"notice\":\"The cumulative exchange rate of measure token supply : dripped tokens\"},\"initialize(address,address,uint256)\":{\"notice\":\"Initializes a new Comptroller V2\"},\"lastDripTimestamp()\":{\"notice\":\"The timestamp at which the tokens were last dripped\"},\"measure()\":{\"notice\":\"The token that is user to measure a user's portion of disbursed tokens\"},\"setDripRatePerSecond(uint256)\":{\"notice\":\"Allows the owner to set the drip rate per second.  This is the number of tokens that are dripped each second.\"},\"totalUnclaimed()\":{\"notice\":\"The total amount of tokens that have been dripped but not claimed\"},\"userStates(address)\":{\"notice\":\"The data structure that tracks when a user last received tokens\"},\"withdrawTo(address,uint256)\":{\"notice\":\"Allows the owner to withdraw tokens that have not been dripped yet.\"}},\"notice\":\"The tokens are dripped at a \\\"drip rate per second\\\".  This is the number of tokens that are dripped each second.  A user's share of the dripped tokens is based on how many 'measure' tokens they hold.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token-faucet/TokenFaucet.sol\":\"TokenFaucet\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"contracts/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary Constants {\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC721 = 0x80ac58cd;\\n}\",\"keccak256\":\"0x5dc8f8bda4e9668a9ffae6a941774f849adcb368cc2275fd8a91e6ada8fad7fb\",\"license\":\"GPL-3.0\"},\"contracts/token-faucet/TokenFaucet.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\n\\nimport \\\"../utils/ExtendedSafeCast.sol\\\";\\nimport \\\"../token/TokenListener.sol\\\";\\n\\n/// @title Disburses a token at a fixed rate per second to holders of another token.\\n/// @notice The tokens are dripped at a \\\"drip rate per second\\\".  This is the number of tokens that\\n/// are dripped each second.  A user's share of the dripped tokens is based on how many 'measure' tokens they hold.\\n/* solium-disable security/no-block-members */\\ncontract TokenFaucet is OwnableUpgradeable, TokenListener {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using ExtendedSafeCast for uint256;\\n\\n  event Initialized(\\n    IERC20Upgradeable indexed asset,\\n    IERC20Upgradeable indexed measure,\\n    uint256 dripRatePerSecond\\n  );\\n\\n  event Dripped(\\n    uint256 newTokens\\n  );\\n\\n  event Deposited(\\n    address indexed user,\\n    uint256 amount\\n  );\\n\\n  event Withdrawn(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  event Claimed(\\n    address indexed user,\\n    uint256 newTokens\\n  );\\n\\n  event DripRateChanged(\\n    uint256 dripRatePerSecond\\n  );\\n\\n  struct UserState {\\n    uint128 lastExchangeRateMantissa;\\n    uint128 balance;\\n  }\\n\\n  /// @notice The token that is being disbursed\\n  IERC20Upgradeable public asset;\\n\\n  /// @notice The token that is user to measure a user's portion of disbursed tokens\\n  IERC20Upgradeable public measure;\\n\\n  /// @notice The total number of tokens that are disbursed each second\\n  uint256 public dripRatePerSecond;\\n\\n  /// @notice The cumulative exchange rate of measure token supply : dripped tokens\\n  uint112 public exchangeRateMantissa;\\n\\n  /// @notice The total amount of tokens that have been dripped but not claimed\\n  uint112 public totalUnclaimed;\\n\\n  /// @notice The timestamp at which the tokens were last dripped\\n  uint32 public lastDripTimestamp;\\n\\n  /// @notice The data structure that tracks when a user last received tokens\\n  mapping(address => UserState) public userStates;\\n\\n  /// @notice Initializes a new Comptroller V2\\n  /// @param _asset The asset to disburse to users\\n  /// @param _measure The token to use to measure a users portion\\n  /// @param _dripRatePerSecond The amount of the asset to drip each second\\n  function initialize (\\n    IERC20Upgradeable _asset,\\n    IERC20Upgradeable _measure,\\n    uint256 _dripRatePerSecond\\n  ) public initializer {\\n    __Ownable_init();\\n    lastDripTimestamp = _currentTime();\\n    asset = _asset;\\n    measure = _measure;\\n    setDripRatePerSecond(_dripRatePerSecond);\\n\\n    emit Initialized(\\n      asset,\\n      measure,\\n      dripRatePerSecond\\n    );\\n  }\\n\\n  /// @notice Safely deposits asset tokens into the faucet.  Must be pre-approved\\n  /// This should be used instead of transferring directly because the drip function must\\n  /// be called before receiving new assets.\\n  /// @param amount The amount of asset tokens to add (must be approved already)\\n  function deposit(uint256 amount) external {\\n    drip();\\n    asset.transferFrom(msg.sender, address(this), amount);\\n\\n    emit Deposited(msg.sender, amount);\\n  }\\n\\n  /// @notice Allows the owner to withdraw tokens that have not been dripped yet.\\n  /// @param to The address to withdraw to\\n  /// @param amount The amount to withdraw\\n  function withdrawTo(address to, uint256 amount) external onlyOwner {\\n    drip();\\n    uint256 assetTotalSupply = asset.balanceOf(address(this));\\n    uint256 availableTotalSupply = assetTotalSupply.sub(totalUnclaimed);\\n    require(amount <= availableTotalSupply, \\\"TokenFaucet/insufficient-funds\\\");\\n    asset.transfer(to, amount);\\n\\n    emit Withdrawn(to, amount);\\n  }\\n\\n  /// @notice Transfers all unclaimed tokens to the user\\n  /// @param user The user to claim tokens for\\n  /// @return The amount of tokens that were claimed.\\n  function claim(address user) external returns (uint256) {\\n    drip();\\n    _captureNewTokensForUser(user);\\n    uint256 balance = userStates[user].balance;\\n    userStates[user].balance = 0;\\n    totalUnclaimed = uint256(totalUnclaimed).sub(balance).toUint112();\\n    asset.transfer(user, balance);\\n\\n    emit Claimed(user, balance);\\n\\n    return balance;\\n  }\\n\\n  /// @notice Drips new tokens.\\n  /// @dev Should be called immediately before any measure token mints/transfers/burns\\n  /// @return The number of new tokens dripped.\\n  function drip() public returns (uint256) {\\n    uint256 currentTimestamp = _currentTime();\\n\\n    // this should only run once per block.\\n    if (lastDripTimestamp == uint32(currentTimestamp)) {\\n      return 0;\\n    }\\n\\n    uint256 assetTotalSupply = asset.balanceOf(address(this));\\n    uint256 availableTotalSupply = assetTotalSupply.sub(totalUnclaimed);\\n    uint256 newSeconds = currentTimestamp.sub(lastDripTimestamp);\\n    uint256 nextExchangeRateMantissa = exchangeRateMantissa;\\n    uint256 newTokens;\\n    uint256 measureTotalSupply = measure.totalSupply();\\n\\n    if (measureTotalSupply > 0 && availableTotalSupply > 0) {\\n      newTokens = newSeconds.mul(dripRatePerSecond);\\n      if (newTokens > availableTotalSupply) {\\n        newTokens = availableTotalSupply;\\n      }\\n      uint256 indexDeltaMantissa = FixedPoint.calculateMantissa(newTokens, measureTotalSupply);\\n      nextExchangeRateMantissa = nextExchangeRateMantissa.add(indexDeltaMantissa);\\n\\n      emit Dripped(\\n        newTokens\\n      );\\n    }\\n\\n    exchangeRateMantissa = nextExchangeRateMantissa.toUint112();\\n    totalUnclaimed = uint256(totalUnclaimed).add(newTokens).toUint112();\\n    lastDripTimestamp = currentTimestamp.toUint32();\\n\\n    return newTokens;\\n  }\\n\\n  /// @notice Allows the owner to set the drip rate per second.  This is the number of tokens that are dripped each second.\\n  /// @param _dripRatePerSecond The new drip rate in tokens per second\\n  function setDripRatePerSecond(uint256 _dripRatePerSecond) public onlyOwner {\\n    require(_dripRatePerSecond > 0, \\\"TokenFaucet/dripRate-gt-zero\\\");\\n\\n    // ensure we're all caught up\\n    drip();\\n\\n    dripRatePerSecond = _dripRatePerSecond;\\n\\n    emit DripRateChanged(dripRatePerSecond);\\n  }\\n\\n  /// @notice Captures new tokens for a user\\n  /// @dev This must be called before changes to the user's balance (i.e. before mint, transfer or burns)\\n  /// @param user The user to capture tokens for\\n  /// @return The number of new tokens\\n  function _captureNewTokensForUser(\\n    address user\\n  ) private returns (uint128) {\\n    UserState storage userState = userStates[user];\\n    if (exchangeRateMantissa == userState.lastExchangeRateMantissa) {\\n      // ignore if exchange rate is same\\n      return 0;\\n    }\\n    uint256 deltaExchangeRateMantissa = uint256(exchangeRateMantissa).sub(userState.lastExchangeRateMantissa);\\n    uint256 userMeasureBalance = measure.balanceOf(user);\\n    uint128 newTokens = FixedPoint.multiplyUintByMantissa(userMeasureBalance, deltaExchangeRateMantissa).toUint128();\\n\\n    userStates[user] = UserState({\\n      lastExchangeRateMantissa: exchangeRateMantissa,\\n      balance: uint256(userState.balance).add(newTokens).toUint128()\\n    });\\n\\n    return newTokens;\\n  }\\n\\n  /// @notice Should be called before a user mints new \\\"measure\\\" tokens.\\n  /// @param to The user who is minting the tokens\\n  /// @param token The token they are minting\\n  function beforeTokenMint(\\n    address to,\\n    uint256,\\n    address token,\\n    address\\n  )\\n    external\\n    override\\n  {\\n    if (token == address(measure)) {\\n      drip();\\n      _captureNewTokensForUser(to);\\n    }\\n  }\\n\\n  /// @notice Should be called before \\\"measure\\\" tokens are transferred or burned\\n  /// @param from The user who is sending the tokens\\n  /// @param to The user who is receiving the tokens\\n  /// @param token The token token they are burning\\n  function beforeTokenTransfer(\\n    address from,\\n    address to,\\n    uint256,\\n    address token\\n  )\\n    external\\n    override\\n  {\\n    // must be measure and not be minting\\n    if (token == address(measure) && from != address(0)) {\\n      drip();\\n      _captureNewTokensForUser(to);\\n      _captureNewTokensForUser(from);\\n    }\\n  }\\n\\n  /// @notice returns the current time.  Allows for override in testing.\\n  /// @return The current time (block.timestamp)\\n  function _currentTime() internal virtual view returns (uint32) {\\n    return block.timestamp.toUint32();\\n  }\\n\\n}\\n\",\"keccak256\":\"0x5ebdc4cebd97cf8ca5f0ad6829ce6a98a37fa40fa6e9058446e4acdb43ffcb45\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListener.sol\":{\"content\":\"pragma solidity ^0.6.4;\\n\\nimport \\\"./TokenListenerInterface.sol\\\";\\nimport \\\"./TokenListenerLibrary.sol\\\";\\nimport \\\"../Constants.sol\\\";\\n\\nabstract contract TokenListener is TokenListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER\\n    );\\n  }\\n}\\n\",\"keccak256\":\"0xb0e98d10b004602e1d4f4369a70e6382002dc0c0c5713698eb6a92943aef2265\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/ExtendedSafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary ExtendedSafeCast {\\n\\n  /**\\n    * @dev Converts an unsigned uint256 into a unsigned uint112.\\n    *\\n    * Requirements:\\n    *\\n    * - input must be less than or equal to maxUint112.\\n    */\\n  function toUint112(uint256 value) internal pure returns (uint112) {\\n    require(value < 2**112, \\\"SafeCast: value doesn't fit in an uint112\\\");\\n    return uint112(value);\\n  }\\n\\n  /**\\n    * @dev Converts an unsigned uint256 into a unsigned uint96.\\n    *\\n    * Requirements:\\n    *\\n    * - input must be less than or equal to maxUint96.\\n    */\\n  function toUint96(uint256 value) internal pure returns (uint96) {\\n    require(value < 2**96, \\\"SafeCast: value doesn't fit in an uint96\\\");\\n    return uint96(value);\\n  }\\n\\n}\",\"keccak256\":\"0x6c8940ba9b1789d362c550be1da5c667ad990e2ff22423ca2d11402e545d3057\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/token-faucet/TokenFaucet.sol:TokenFaucet",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/token-faucet/TokenFaucet.sol:TokenFaucet",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/token-faucet/TokenFaucet.sol:TokenFaucet",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 10,
                "contract": "contracts/token-faucet/TokenFaucet.sol:TokenFaucet",
                "label": "_owner",
                "offset": 0,
                "slot": "51",
                "type": "t_address"
              },
              {
                "astId": 129,
                "contract": "contracts/token-faucet/TokenFaucet.sol:TokenFaucet",
                "label": "__gap",
                "offset": 0,
                "slot": "52",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 14990,
                "contract": "contracts/token-faucet/TokenFaucet.sol:TokenFaucet",
                "label": "asset",
                "offset": 0,
                "slot": "101",
                "type": "t_contract(IERC20Upgradeable)1960"
              },
              {
                "astId": 14993,
                "contract": "contracts/token-faucet/TokenFaucet.sol:TokenFaucet",
                "label": "measure",
                "offset": 0,
                "slot": "102",
                "type": "t_contract(IERC20Upgradeable)1960"
              },
              {
                "astId": 14996,
                "contract": "contracts/token-faucet/TokenFaucet.sol:TokenFaucet",
                "label": "dripRatePerSecond",
                "offset": 0,
                "slot": "103",
                "type": "t_uint256"
              },
              {
                "astId": 14999,
                "contract": "contracts/token-faucet/TokenFaucet.sol:TokenFaucet",
                "label": "exchangeRateMantissa",
                "offset": 0,
                "slot": "104",
                "type": "t_uint112"
              },
              {
                "astId": 15002,
                "contract": "contracts/token-faucet/TokenFaucet.sol:TokenFaucet",
                "label": "totalUnclaimed",
                "offset": 14,
                "slot": "104",
                "type": "t_uint112"
              },
              {
                "astId": 15005,
                "contract": "contracts/token-faucet/TokenFaucet.sol:TokenFaucet",
                "label": "lastDripTimestamp",
                "offset": 28,
                "slot": "104",
                "type": "t_uint32"
              },
              {
                "astId": 15010,
                "contract": "contracts/token-faucet/TokenFaucet.sol:TokenFaucet",
                "label": "userStates",
                "offset": 0,
                "slot": "105",
                "type": "t_mapping(t_address,t_struct(UserState)14987_storage)"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_contract(IERC20Upgradeable)1960": {
                "encoding": "inplace",
                "label": "contract IERC20Upgradeable",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_struct(UserState)14987_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct TokenFaucet.UserState)",
                "numberOfBytes": "32",
                "value": "t_struct(UserState)14987_storage"
              },
              "t_struct(UserState)14987_storage": {
                "encoding": "inplace",
                "label": "struct TokenFaucet.UserState",
                "members": [
                  {
                    "astId": 14984,
                    "contract": "contracts/token-faucet/TokenFaucet.sol:TokenFaucet",
                    "label": "lastExchangeRateMantissa",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint128"
                  },
                  {
                    "astId": 14986,
                    "contract": "contracts/token-faucet/TokenFaucet.sol:TokenFaucet",
                    "label": "balance",
                    "offset": 16,
                    "slot": "0",
                    "type": "t_uint128"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_uint112": {
                "encoding": "inplace",
                "label": "uint112",
                "numberOfBytes": "14"
              },
              "t_uint128": {
                "encoding": "inplace",
                "label": "uint128",
                "numberOfBytes": "16"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint32": {
                "encoding": "inplace",
                "label": "uint32",
                "numberOfBytes": "4"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "asset()": {
                "notice": "The token that is being disbursed"
              },
              "beforeTokenMint(address,uint256,address,address)": {
                "notice": "Should be called before a user mints new \"measure\" tokens."
              },
              "beforeTokenTransfer(address,address,uint256,address)": {
                "notice": "Should be called before \"measure\" tokens are transferred or burned"
              },
              "claim(address)": {
                "notice": "Transfers all unclaimed tokens to the user"
              },
              "deposit(uint256)": {
                "notice": "Safely deposits asset tokens into the faucet.  Must be pre-approved This should be used instead of transferring directly because the drip function must be called before receiving new assets."
              },
              "drip()": {
                "notice": "Drips new tokens."
              },
              "dripRatePerSecond()": {
                "notice": "The total number of tokens that are disbursed each second"
              },
              "exchangeRateMantissa()": {
                "notice": "The cumulative exchange rate of measure token supply : dripped tokens"
              },
              "initialize(address,address,uint256)": {
                "notice": "Initializes a new Comptroller V2"
              },
              "lastDripTimestamp()": {
                "notice": "The timestamp at which the tokens were last dripped"
              },
              "measure()": {
                "notice": "The token that is user to measure a user's portion of disbursed tokens"
              },
              "setDripRatePerSecond(uint256)": {
                "notice": "Allows the owner to set the drip rate per second.  This is the number of tokens that are dripped each second."
              },
              "totalUnclaimed()": {
                "notice": "The total amount of tokens that have been dripped but not claimed"
              },
              "userStates(address)": {
                "notice": "The data structure that tracks when a user last received tokens"
              },
              "withdrawTo(address,uint256)": {
                "notice": "Allows the owner to withdraw tokens that have not been dripped yet."
              }
            },
            "notice": "The tokens are dripped at a \"drip rate per second\".  This is the number of tokens that are dripped each second.  A user's share of the dripped tokens is based on how many 'measure' tokens they hold.",
            "version": 1
          }
        }
      },
      "contracts/token-faucet/TokenFaucetProxyFactory.sol": {
        "TokenFaucetProxyFactory": {
          "abi": [
            {
              "inputs": [],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "name": "ProxyCreated",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                },
                {
                  "internalType": "contract TokenFaucet[]",
                  "name": "tokenFaucets",
                  "type": "address[]"
                }
              ],
              "name": "claimAll",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_asset",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_measure",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_dripRatePerSecond",
                  "type": "uint256"
                }
              ],
              "name": "create",
              "outputs": [
                {
                  "internalType": "contract TokenFaucet",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_asset",
                  "type": "address"
                },
                {
                  "internalType": "contract IERC20Upgradeable",
                  "name": "_measure",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_dripRatePerSecond",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "_amount",
                  "type": "uint256"
                }
              ],
              "name": "createAndDeposit",
              "outputs": [
                {
                  "internalType": "contract TokenFaucet",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_logic",
                  "type": "address"
                },
                {
                  "internalType": "bytes",
                  "name": "_data",
                  "type": "bytes"
                }
              ],
              "name": "deployMinimal",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "instance",
              "outputs": [
                {
                  "internalType": "contract TokenFaucet",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "claimAll(address,address[])": {
                "params": {
                  "tokenFaucets": "The tokenFaucets to call claim on.",
                  "user": "The user to claim for"
                }
              },
              "create(address,address,uint256)": {
                "params": {
                  "_asset": "The asset to disburse to users",
                  "_dripRatePerSecond": "The amount of the asset to drip each second",
                  "_measure": "The token to use to measure a users portion"
                },
                "returns": {
                  "_0": "A reference to the new proxied TokenFaucet"
                }
              },
              "createAndDeposit(address,address,uint256,uint256)": {
                "params": {
                  "_amount": "The amount of assets to deposit into the faucet",
                  "_asset": "The asset to disburse to users",
                  "_dripRatePerSecond": "The amount of the asset to drip each second",
                  "_measure": "The token to use to measure a users portion"
                },
                "returns": {
                  "_0": "A reference to the new proxied TokenFaucet"
                }
              }
            },
            "title": "Stake Prize Pool Proxy Factory",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5060405161001d9061005f565b604051809103906000f080158015610039573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b039290921691909117905561006c565b611886806106ec83390190565b6106718061007b6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063022ec0951461005c57806313e7e05814610080578063244a79d614610102578063b3eeb5e21461013e578063ffe5725f146101f4575b600080fd5b61006461022a565b604080516001600160a01b039092168252519081900360200190f35b6101006004803603604081101561009657600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100c157600080fd5b8201836020820111156100d357600080fd5b803590602001918460208302840111640100000000831117156100f557600080fd5b509092509050610239565b005b6100646004803603608081101561011857600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356102e8565b6100646004803603604081101561015457600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561017f57600080fd5b82018360208201111561019157600080fd5b803590602001918460018302840111640100000000831117156101b357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610388945050505050565b6100646004803603606081101561020a57600080fd5b506001600160a01b03813581169160208101359091169060400135610504565b6000546001600160a01b031681565b60005b818110156102e25782828281811061025057fe5b905060200201356001600160a01b03166001600160a01b0316631e83409a856040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b1580156102ae57600080fd5b505af11580156102c2573d6000803e3d6000fd5b505050506040513d60208110156102d857600080fd5b505060010161023c565b50505050565b6000806102f6868686610504565b604080516323b872dd60e01b81523360048201526001600160a01b038084166024830152604482018790529151929350908816916323b872dd916064808201926020929091908290030181600087803b15801561035257600080fd5b505af1158015610366573d6000803e3d6000fd5b505050506040513d602081101561037c57600080fd5b50919695505050505050565b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a18251156104fd576000826001600160a01b0316846040518082805190602001908083835b602083106104545780518252601f199092019160209182019101610435565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146104b6576040519150601f19603f3d011682016040523d82523d6000602084013e6104bb565b606091505b50509050806104fb5760405162461bcd60e51b81526004018080602001828103825260248152602001806106186024913960400191505060405180910390fd5b505b5092915050565b600080546040805160208101909152828152829161052d916001600160a01b0390911690610388565b9050806001600160a01b0316631794bb3c8686866040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801561059757600080fd5b505af11580156105ab573d6000803e3d6000fd5b50506040805163f2fde38b60e01b815233600482015290516001600160a01b038516935063f2fde38b9250602480830192600092919082900301818387803b1580156105f657600080fd5b505af115801561060a573d6000803e3d6000fd5b509297965050505050505056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a26469706673582212206e5dad9c8646daec2d2b274fdae5e9df46e9c347e2d84dd4b77fb49f65c7a49564736f6c634300060c0033608060405234801561001057600080fd5b50611866806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c80638da5cb5b116100ad578063ca5baafc11610071578063ca5baafc1461034f578063d9772a251461036c578063e318613e1461038d578063efa9a1ad14610395578063f2fde38b1461039d57610121565b80638da5cb5b146102c25780639f678cca146102ca578063b2210957146102d2578063b6b55f251461030e578063c96f14b81461032b57610121565b80631e83409a116100f45780631e83409a14610208578063205c28781461022e57806338d52e0f1461025a5780634d7f3db01461027e578063715018a6146102ba57610121565b806301ffc9a7146101265780630ecc535f146101615780631794bb3c146101b6578063187f3334146101ee575b600080fd5b61014d6004803603602081101561013c57600080fd5b50356001600160e01b0319166103c3565b604080519115158252519081900360200190f35b6101876004803603602081101561017757600080fd5b50356001600160a01b03166103ff565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b6101ec600480360360608110156101cc57600080fd5b506001600160a01b03813581169160208101359091169060400135610425565b005b6101f6610583565b60408051918252519081900360200190f35b6101f66004803603602081101561021e57600080fd5b50356001600160a01b0316610589565b6101ec6004803603604081101561024457600080fd5b506001600160a01b0381351690602001356106f1565b610262610915565b604080516001600160a01b039092168252519081900360200190f35b6101ec6004803603608081101561029457600080fd5b506001600160a01b03813581169160208101359160408201358116916060013516610924565b6101ec610953565b6102626109ff565b6101f6610a0f565b6101ec600480360360808110156102e857600080fd5b506001600160a01b03813581169160208101358216916040820135916060013516610cab565b6101ec6004803603602081101561032457600080fd5b5035610ce7565b610333610daf565b604080516001600160701b039092168252519081900360200190f35b6101ec6004803603602081101561036557600080fd5b5035610dc5565b610374610ec0565b6040805163ffffffff9092168252519081900360200190f35b610333610ed3565b610262610ee2565b6101ec600480360360208110156103b357600080fd5b50356001600160a01b0316610ef1565b60006001600160e01b031982166301ffc9a760e01b14806103f757506001600160e01b03198216600162a1cb1960e01b0319145b90505b919050565b6069602052600090815260409020546001600160801b0380821691600160801b90041682565b600054610100900460ff168061043e575061043e610ff4565b8061044c575060005460ff16155b6104875760405162461bcd60e51b815260040180806020018281038252602e815260200180611773602e913960400191505060405180910390fd5b600054610100900460ff161580156104b2576000805460ff1961ff0019909116610100171660011790555b6104ba611005565b6104c26110b7565b6068805463ffffffff92909216600160e01b026001600160e01b03909216919091179055606580546001600160a01b038087166001600160a01b031992831617909255606680549286169290911691909117905561051f82610dc5565b60665460655460675460408051918252516001600160a01b039384169392909216917f10f27652c1015195ca7e6bc9b4c724cbf18e91c42117d92124703a3f49bb240f9181900360200190a3801561057d576000805461ff00191690555b50505050565b60675481565b6000610593610a0f565b5061059d826110c7565b506001600160a01b038216600090815260696020526040902080546001600160801b03808216909255606854600160801b909104909116906105f8906105f390600160701b90046001600160701b03168361126c565b6112ce565b606880546001600160701b0392909216600160701b026dffffffffffffffffffffffffffff60701b199092169190911790556065546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561068057600080fd5b505af1158015610694573d6000803e3d6000fd5b505050506040513d60208110156106aa57600080fd5b50506040805182815290516001600160a01b038516917fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a919081900360200190a292915050565b6106f9611316565b6001600160a01b031661070a6109ff565b6001600160a01b031614610753576040805162461bcd60e51b815260206004820181905260248201526000805160206117c2833981519152604482015290519081900360640190fd5b61075b610a0f565b50606554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156107a757600080fd5b505afa1580156107bb573d6000803e3d6000fd5b505050506040513d60208110156107d157600080fd5b50516068549091506000906107f7908390600160701b90046001600160701b031661126c565b90508083111561084e576040805162461bcd60e51b815260206004820152601e60248201527f546f6b656e4661756365742f696e73756666696369656e742d66756e64730000604482015290519081900360640190fd5b6065546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018790529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156108a457600080fd5b505af11580156108b8573d6000803e3d6000fd5b505050506040513d60208110156108ce57600080fd5b50506040805184815290516001600160a01b038616917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a250505050565b6065546001600160a01b031681565b6066546001600160a01b038381169116141561057d57610942610a0f565b5061094c846110c7565b5050505050565b61095b611316565b6001600160a01b031661096c6109ff565b6001600160a01b0316146109b5576040805162461bcd60e51b815260206004820181905260248201526000805160206117c2833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6033546001600160a01b03165b90565b600080610a1a6110b7565b60685463ffffffff9182169250600160e01b900416811415610a40576000915050610a0c565b606554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610a8b57600080fd5b505afa158015610a9f573d6000803e3d6000fd5b505050506040513d6020811015610ab557600080fd5b5051606854909150600090610adb908390600160701b90046001600160701b031661126c565b606854909150600090610b0090859063ffffffff600160e01b90910481169061126c16565b606854606654604080516318160ddd60e01b815290519394506001600160701b039092169260009283926001600160a01b0316916318160ddd91600480820192602092909190829003018186803b158015610b5a57600080fd5b505afa158015610b6e573d6000803e3d6000fd5b505050506040513d6020811015610b8457600080fd5b505190508015801590610b975750600085115b15610c0957606754610baa90859061131a565b915084821115610bb8578491505b6000610bc4838361137a565b9050610bd084826113a3565b6040805185815290519195507f7de59a92c9386255180c28ede4b61edb9b7b2ac96855ac634151489cef21bad6919081900360200190a1505b610c12836112ce565b606880546dffffffffffffffffffffffffffff19166001600160701b039283161790819055610c4d916105f391600160701b900416846113a3565b6068600e6101000a8154816001600160701b0302191690836001600160701b03160217905550610c7c876113fd565b6068805463ffffffff92909216600160e01b026001600160e01b03909216919091179055509550505050505090565b6066546001600160a01b038281169116148015610cd057506001600160a01b03841615155b1561057d57610cdd610a0f565b50610942836110c7565b610cef610a0f565b50606554604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015610d4a57600080fd5b505af1158015610d5e573d6000803e3d6000fd5b505050506040513d6020811015610d7457600080fd5b505060408051828152905133917f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4919081900360200190a250565b606854600160701b90046001600160701b031681565b610dcd611316565b6001600160a01b0316610dde6109ff565b6001600160a01b031614610e27576040805162461bcd60e51b815260206004820181905260248201526000805160206117c2833981519152604482015290519081900360640190fd5b60008111610e7c576040805162461bcd60e51b815260206004820152601c60248201527f546f6b656e4661756365742f64726970526174652d67742d7a65726f00000000604482015290519081900360640190fd5b610e84610a0f565b5060678190556040805182815290517f3d38e7cd2e029035006f9977a727c8724cd41dffb6d2a40d9f66bd4c26836a329181900360200190a150565b606854600160e01b900463ffffffff1681565b6068546001600160701b031681565b6066546001600160a01b031681565b610ef9611316565b6001600160a01b0316610f0a6109ff565b6001600160a01b031614610f53576040805162461bcd60e51b815260206004820181905260248201526000805160206117c2833981519152604482015290519081900360640190fd5b6001600160a01b038116610f985760405162461bcd60e51b81526004018080602001828103825260268152602001806117266026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610fff30611442565b15905090565b600054610100900460ff168061101e575061101e610ff4565b8061102c575060005460ff16155b6110675760405162461bcd60e51b815260040180806020018281038252602e815260200180611773602e913960400191505060405180910390fd5b600054610100900460ff16158015611092576000805460ff1961ff0019909116610100171660011790555b61109a611448565b6110a26114e8565b80156110b4576000805461ff00191690555b50565b60006110c2426113fd565b905090565b6001600160a01b038116600090815260696020526040812080546068546001600160701b03166001600160801b0390911614156111085760009150506103fa565b805460685460009161112c916001600160701b0316906001600160801b031661126c565b606654604080516370a0823160e01b81526001600160a01b038881166004830152915193945060009391909216916370a08231916024808301926020929190829003018186803b15801561117f57600080fd5b505afa158015611193573d6000803e3d6000fd5b505050506040513d60208110156111a957600080fd5b5051905060006111c16111bc83856115e1565b611602565b604080518082019091526068546001600160701b031681528554919250906020820190611206906111bc90600160801b90046001600160801b039081169086166113a3565b6001600160801b039081169091526001600160a01b03881660009081526069602090815260409091208351815494909201518316600160801b029183166fffffffffffffffffffffffffffffffff19909416939093179091161790559350505050919050565b6000828211156112c3576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b6000600160701b82106113125760405162461bcd60e51b81526004018080602001828103825260298152602001806117e26029913960400191505060405180910390fd5b5090565b3390565b600082611329575060006112c8565b8282028284828161133657fe5b04146113735760405162461bcd60e51b81526004018080602001828103825260218152602001806117a16021913960400191505060405180910390fd5b9392505050565b60008061138f84670de0b6b3a764000061131a565b905061139b8184611646565b949350505050565b600082820183811015611373576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600064010000000082106113125760405162461bcd60e51b815260040180806020018281038252602681526020018061180b6026913960400191505060405180910390fd5b3b151590565b600054610100900460ff16806114615750611461610ff4565b8061146f575060005460ff16155b6114aa5760405162461bcd60e51b815260040180806020018281038252602e815260200180611773602e913960400191505060405180910390fd5b600054610100900460ff161580156110a2576000805460ff1961ff00199091166101001716600117905580156110b4576000805461ff001916905550565b600054610100900460ff16806115015750611501610ff4565b8061150f575060005460ff16155b61154a5760405162461bcd60e51b815260040180806020018281038252602e815260200180611773602e913960400191505060405180910390fd5b600054610100900460ff16158015611575576000805460ff1961ff0019909116610100171660011790555b600061157f611316565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156110b4576000805461ff001916905550565b6000806115ee838561131a565b905061139b81670de0b6b3a7640000611646565b6000600160801b82106113125760405162461bcd60e51b815260040180806020018281038252602781526020018061174c6027913960400191505060405180910390fd5b600061137383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506000818361170f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156116d45781810151838201526020016116bc565b50505050905090810190601f1680156117015780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161171b57fe5b049594505050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737353616665436173743a2076616c756520646f65736e27742066697420696e203132382062697473496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657253616665436173743a2076616c756520646f65736e27742066697420696e20616e2075696e7431313253616665436173743a2076616c756520646f65736e27742066697420696e2033322062697473a2646970667358221220ca90e018c76dda1f3b271af212deb27b3e80278ba6dc894d44af423d3761577064736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x1D SWAP1 PUSH2 0x5F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x39 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x6C JUMP JUMPDEST PUSH2 0x1886 DUP1 PUSH2 0x6EC DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH2 0x671 DUP1 PUSH2 0x7B PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x57 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x22EC095 EQ PUSH2 0x5C JUMPI DUP1 PUSH4 0x13E7E058 EQ PUSH2 0x80 JUMPI DUP1 PUSH4 0x244A79D6 EQ PUSH2 0x102 JUMPI DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x13E JUMPI DUP1 PUSH4 0xFFE5725F EQ PUSH2 0x1F4 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x64 PUSH2 0x22A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x100 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x96 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xC1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xD3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x239 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x64 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x118 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x2E8 JUMP JUMPDEST PUSH2 0x64 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x154 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x17F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x191 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x1B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x388 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x64 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x20A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x504 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2E2 JUMPI DUP3 DUP3 DUP3 DUP2 DUP2 LT PUSH2 0x250 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x1E83409A DUP6 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2C2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0x23C JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2F6 DUP7 DUP7 DUP7 PUSH2 0x504 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP8 SWAP1 MSTORE SWAP2 MLOAD SWAP3 SWAP4 POP SWAP1 DUP9 AND SWAP2 PUSH4 0x23B872DD SWAP2 PUSH1 0x64 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x352 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x366 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x37C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP2 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x4FD JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x454 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x435 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x4B6 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4BB JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x4FB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x618 PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE DUP3 DUP2 MSTORE DUP3 SWAP2 PUSH2 0x52D SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH2 0x388 JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x1794BB3C DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x597 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x5AB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH4 0xF2FDE38B PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP4 POP PUSH4 0xF2FDE38B SWAP3 POP PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x60A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP3 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 PUSH15 0x5DAD9C8646DAEC2D2B274FDAE5E9DF CHAINID 0xE9 0xC3 SELFBALANCE 0xE2 0xD8 0x4D 0xD4 0xB7 PUSH32 0xB49F65C7A49564736F6C634300060C0033608060405234801561001057600080 REVERT JUMPDEST POP PUSH2 0x1866 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x121 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0xAD JUMPI DUP1 PUSH4 0xCA5BAAFC GT PUSH2 0x71 JUMPI DUP1 PUSH4 0xCA5BAAFC EQ PUSH2 0x34F JUMPI DUP1 PUSH4 0xD9772A25 EQ PUSH2 0x36C JUMPI DUP1 PUSH4 0xE318613E EQ PUSH2 0x38D JUMPI DUP1 PUSH4 0xEFA9A1AD EQ PUSH2 0x395 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x39D JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x2C2 JUMPI DUP1 PUSH4 0x9F678CCA EQ PUSH2 0x2CA JUMPI DUP1 PUSH4 0xB2210957 EQ PUSH2 0x2D2 JUMPI DUP1 PUSH4 0xB6B55F25 EQ PUSH2 0x30E JUMPI DUP1 PUSH4 0xC96F14B8 EQ PUSH2 0x32B JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x1E83409A GT PUSH2 0xF4 JUMPI DUP1 PUSH4 0x1E83409A EQ PUSH2 0x208 JUMPI DUP1 PUSH4 0x205C2878 EQ PUSH2 0x22E JUMPI DUP1 PUSH4 0x38D52E0F EQ PUSH2 0x25A JUMPI DUP1 PUSH4 0x4D7F3DB0 EQ PUSH2 0x27E JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x2BA JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x126 JUMPI DUP1 PUSH4 0xECC535F EQ PUSH2 0x161 JUMPI DUP1 PUSH4 0x1794BB3C EQ PUSH2 0x1B6 JUMPI DUP1 PUSH4 0x187F3334 EQ PUSH2 0x1EE JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x14D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x13C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT AND PUSH2 0x3C3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x187 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x177 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x3FF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x1CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x425 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1F6 PUSH2 0x583 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1F6 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x21E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x589 JUMP JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x244 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x6F1 JUMP JUMPDEST PUSH2 0x262 PUSH2 0x915 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x294 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0x924 JUMP JUMPDEST PUSH2 0x1EC PUSH2 0x953 JUMP JUMPDEST PUSH2 0x262 PUSH2 0x9FF JUMP JUMPDEST PUSH2 0x1F6 PUSH2 0xA0F JUMP JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x2E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 AND SWAP2 PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0x60 ADD CALLDATALOAD AND PUSH2 0xCAB JUMP JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x324 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xCE7 JUMP JUMPDEST PUSH2 0x333 PUSH2 0xDAF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x365 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0xDC5 JUMP JUMPDEST PUSH2 0x374 PUSH2 0xEC0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0xFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x333 PUSH2 0xED3 JUMP JUMPDEST PUSH2 0x262 PUSH2 0xEE2 JUMP JUMPDEST PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xEF1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH4 0x1FFC9A7 PUSH1 0xE0 SHL EQ DUP1 PUSH2 0x3F7 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT DUP3 AND PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT EQ JUMPDEST SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x69 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP2 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV AND DUP3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x43E JUMPI POP PUSH2 0x43E PUSH2 0xFF4 JUMP JUMPDEST DUP1 PUSH2 0x44C JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x487 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1773 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x4B2 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x4BA PUSH2 0x1005 JUMP JUMPDEST PUSH2 0x4C2 PUSH2 0x10B7 JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH4 0xFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xE0 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x65 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SWAP3 SSTORE PUSH1 0x66 DUP1 SLOAD SWAP3 DUP7 AND SWAP3 SWAP1 SWAP2 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x51F DUP3 PUSH2 0xDC5 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x65 SLOAD PUSH1 0x67 SLOAD PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND SWAP4 SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH32 0x10F27652C1015195CA7E6BC9B4C724CBF18E91C42117D92124703A3F49BB240F SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 DUP1 ISZERO PUSH2 0x57D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x67 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x593 PUSH2 0xA0F JUMP JUMPDEST POP PUSH2 0x59D DUP3 PUSH2 0x10C7 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND SWAP1 SWAP3 SSTORE PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x80 SHL SWAP1 SWAP2 DIV SWAP1 SWAP2 AND SWAP1 PUSH2 0x5F8 SWAP1 PUSH2 0x5F3 SWAP1 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP4 PUSH2 0x126C JUMP JUMPDEST PUSH2 0x12CE JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP3 SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x70 SHL MUL PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x70 SHL NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP6 SWAP1 MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xA9059CBB SWAP2 PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x680 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x694 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP2 PUSH32 0xD8138F8A3F377C5259CA548E70E4C2DE94F129F5A11036A15B69513CBA2B426A SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x6F9 PUSH2 0x1316 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x70A PUSH2 0x9FF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x753 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x17C2 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x75B PUSH2 0xA0F JUMP JUMPDEST POP PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x7A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x7BB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x7D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x68 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0x7F7 SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND PUSH2 0x126C JUMP JUMPDEST SWAP1 POP DUP1 DUP4 GT ISZERO PUSH2 0x84E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6B656E4661756365742F696E73756666696369656E742D66756E64730000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0xA9059CBB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE PUSH1 0x24 DUP3 ADD DUP8 SWAP1 MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0xA9059CBB SWAP2 PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x8A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8B8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x8CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND SWAP2 PUSH32 0x7084F5476618D8E60B11EF0D7D3F06914655ADB8793E28FF7F018D4C76D505D5 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 POP POP POP POP JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x57D JUMPI PUSH2 0x942 PUSH2 0xA0F JUMP JUMPDEST POP PUSH2 0x94C DUP5 PUSH2 0x10C7 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x95B PUSH2 0x1316 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x96C PUSH2 0x9FF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x9B5 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x17C2 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xA1A PUSH2 0x10B7 JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH4 0xFFFFFFFF SWAP2 DUP3 AND SWAP3 POP PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV AND DUP2 EQ ISZERO PUSH2 0xA40 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0xA0C JUMP JUMPDEST PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xA9F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xAB5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x68 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0xADB SWAP1 DUP4 SWAP1 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND PUSH2 0x126C JUMP JUMPDEST PUSH1 0x68 SLOAD SWAP1 SWAP2 POP PUSH1 0x0 SWAP1 PUSH2 0xB00 SWAP1 DUP6 SWAP1 PUSH4 0xFFFFFFFF PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 SWAP2 DIV DUP2 AND SWAP1 PUSH2 0x126C AND JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x18160DDD PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD SWAP4 SWAP5 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP1 SWAP3 AND SWAP3 PUSH1 0x0 SWAP3 DUP4 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x18160DDD SWAP2 PUSH1 0x4 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB5A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xB6E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xB84 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 ISZERO DUP1 ISZERO SWAP1 PUSH2 0xB97 JUMPI POP PUSH1 0x0 DUP6 GT JUMPDEST ISZERO PUSH2 0xC09 JUMPI PUSH1 0x67 SLOAD PUSH2 0xBAA SWAP1 DUP6 SWAP1 PUSH2 0x131A JUMP JUMPDEST SWAP2 POP DUP5 DUP3 GT ISZERO PUSH2 0xBB8 JUMPI DUP5 SWAP2 POP JUMPDEST PUSH1 0x0 PUSH2 0xBC4 DUP4 DUP4 PUSH2 0x137A JUMP JUMPDEST SWAP1 POP PUSH2 0xBD0 DUP5 DUP3 PUSH2 0x13A3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP6 POP PUSH32 0x7DE59A92C9386255180C28EDE4B61EDB9B7B2AC96855AC634151489CEF21BAD6 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMPDEST PUSH2 0xC12 DUP4 PUSH2 0x12CE JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH14 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB SWAP3 DUP4 AND OR SWAP1 DUP2 SWAP1 SSTORE PUSH2 0xC4D SWAP2 PUSH2 0x5F3 SWAP2 PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV AND DUP5 PUSH2 0x13A3 JUMP JUMPDEST PUSH1 0x68 PUSH1 0xE PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND MUL OR SWAP1 SSTORE POP PUSH2 0xC7C DUP8 PUSH2 0x13FD JUMP JUMPDEST PUSH1 0x68 DUP1 SLOAD PUSH4 0xFFFFFFFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xE0 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE POP SWAP6 POP POP POP POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 DUP2 AND SWAP2 AND EQ DUP1 ISZERO PUSH2 0xCD0 JUMPI POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x57D JUMPI PUSH2 0xCDD PUSH2 0xA0F JUMP JUMPDEST POP PUSH2 0x942 DUP4 PUSH2 0x10C7 JUMP JUMPDEST PUSH2 0xCEF PUSH2 0xA0F JUMP JUMPDEST POP PUSH1 0x65 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x23B872DD SWAP2 PUSH1 0x64 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD5E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xD74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD CALLER SWAP2 PUSH32 0x2DA466A7B24304F47E87FA2E1E5A81B9831CE54FEC19055CE277CA2F39BA42C4 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x70 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0xDCD PUSH2 0x1316 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xDDE PUSH2 0x9FF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xE27 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x17C2 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 GT PUSH2 0xE7C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6B656E4661756365742F64726970526174652D67742D7A65726F00000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xE84 PUSH2 0xA0F JUMP JUMPDEST POP PUSH1 0x67 DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0x3D38E7CD2E029035006F9977A727C8724CD41DFFB6D2A40D9F66BD4C26836A32 SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0xE0 SHL SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0xEF9 PUSH2 0x1316 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xF0A PUSH2 0x9FF JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xF53 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x17C2 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0xF98 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1726 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x33 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFFF ADDRESS PUSH2 0x1442 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x101E JUMPI POP PUSH2 0x101E PUSH2 0xFF4 JUMP JUMPDEST DUP1 PUSH2 0x102C JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1067 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1773 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1092 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x109A PUSH2 0x1448 JUMP JUMPDEST PUSH2 0x10A2 PUSH2 0x14E8 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x10B4 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10C2 TIMESTAMP PUSH2 0x13FD JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 SWAP2 AND EQ ISZERO PUSH2 0x1108 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x3FA JUMP JUMPDEST DUP1 SLOAD PUSH1 0x68 SLOAD PUSH1 0x0 SWAP2 PUSH2 0x112C SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x126C JUMP JUMPDEST PUSH1 0x66 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE SWAP2 MLOAD SWAP4 SWAP5 POP PUSH1 0x0 SWAP4 SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x117F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1193 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x11A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x11C1 PUSH2 0x11BC DUP4 DUP6 PUSH2 0x15E1 JUMP JUMPDEST PUSH2 0x1602 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x68 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x70 SHL SUB AND DUP2 MSTORE DUP6 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x20 DUP3 ADD SWAP1 PUSH2 0x1206 SWAP1 PUSH2 0x11BC SWAP1 PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND SWAP1 DUP7 AND PUSH2 0x13A3 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 DUP2 AND SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x69 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 DUP4 MLOAD DUP2 SLOAD SWAP5 SWAP1 SWAP3 ADD MLOAD DUP4 AND PUSH1 0x1 PUSH1 0x80 SHL MUL SWAP2 DUP4 AND PUSH16 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP2 AND OR SWAP1 SSTORE SWAP4 POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x12C3 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x70 SHL DUP3 LT PUSH2 0x1312 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x29 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x17E2 PUSH1 0x29 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1329 JUMPI POP PUSH1 0x0 PUSH2 0x12C8 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0x1336 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x1373 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x17A1 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x138F DUP5 PUSH8 0xDE0B6B3A7640000 PUSH2 0x131A JUMP JUMPDEST SWAP1 POP PUSH2 0x139B DUP2 DUP5 PUSH2 0x1646 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1373 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH5 0x100000000 DUP3 LT PUSH2 0x1312 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x180B PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1461 JUMPI POP PUSH2 0x1461 PUSH2 0xFF4 JUMP JUMPDEST DUP1 PUSH2 0x146F JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x14AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1773 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x10A2 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x10B4 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1501 JUMPI POP PUSH2 0x1501 PUSH2 0xFF4 JUMP JUMPDEST DUP1 PUSH2 0x150F JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x154A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1773 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1575 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 PUSH2 0x157F PUSH2 0x1316 JUMP JUMPDEST PUSH1 0x33 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP DUP1 ISZERO PUSH2 0x10B4 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x15EE DUP4 DUP6 PUSH2 0x131A JUMP JUMPDEST SWAP1 POP PUSH2 0x139B DUP2 PUSH8 0xDE0B6B3A7640000 PUSH2 0x1646 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x80 SHL DUP3 LT PUSH2 0x1312 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x174C PUSH1 0x27 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1373 DUP4 DUP4 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 DUP2 MSTORE POP PUSH1 0x0 DUP2 DUP4 PUSH2 0x170F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x16D4 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x16BC JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1701 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 DUP2 PUSH2 0x171B JUMPI INVALID JUMPDEST DIV SWAP6 SWAP5 POP POP POP POP POP JUMP INVALID 0x4F PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F206164647265737353616665436173743A2076616C756520 PUSH5 0x6F65736E27 PUSH21 0x2066697420696E203132382062697473496E697469 PUSH2 0x6C69 PUSH27 0x61626C653A20636F6E747261637420697320616C72656164792069 PUSH15 0x697469616C697A6564536166654D61 PUSH21 0x683A206D756C7469706C69636174696F6E206F7665 PUSH19 0x666C6F774F776E61626C653A2063616C6C6572 KECCAK256 PUSH10 0x73206E6F742074686520 PUSH16 0x776E657253616665436173743A207661 PUSH13 0x756520646F65736E2774206669 PUSH21 0x20696E20616E2075696E7431313253616665436173 PUSH21 0x3A2076616C756520646F65736E2774206669742069 PUSH15 0x2033322062697473A2646970667358 0x22 SLT KECCAK256 0xCA SWAP1 0xE0 XOR 0xC7 PUSH14 0xDA1F3B271AF212DEB27B3E80278B 0xA6 0xDC DUP10 0x4D DIFFICULTY 0xAF TIMESTAMP RETURNDATASIZE CALLDATACOPY PUSH2 0x5770 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "258:2020:87:-:0;;;485:61;;;;;;;;;;524:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;513:8:87;:28;;-1:-1:-1;;;;;;513:28:87;-1:-1:-1;;;;;513:28:87;;;;;;;;;;258:2020;;;;;;;;;;:::o;:::-;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106100575760003560e01c8063022ec0951461005c57806313e7e05814610080578063244a79d614610102578063b3eeb5e21461013e578063ffe5725f146101f4575b600080fd5b61006461022a565b604080516001600160a01b039092168252519081900360200190f35b6101006004803603604081101561009657600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100c157600080fd5b8201836020820111156100d357600080fd5b803590602001918460208302840111640100000000831117156100f557600080fd5b509092509050610239565b005b6100646004803603608081101561011857600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356102e8565b6100646004803603604081101561015457600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561017f57600080fd5b82018360208201111561019157600080fd5b803590602001918460018302840111640100000000831117156101b357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610388945050505050565b6100646004803603606081101561020a57600080fd5b506001600160a01b03813581169160208101359091169060400135610504565b6000546001600160a01b031681565b60005b818110156102e25782828281811061025057fe5b905060200201356001600160a01b03166001600160a01b0316631e83409a856040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b1580156102ae57600080fd5b505af11580156102c2573d6000803e3d6000fd5b505050506040513d60208110156102d857600080fd5b505060010161023c565b50505050565b6000806102f6868686610504565b604080516323b872dd60e01b81523360048201526001600160a01b038084166024830152604482018790529151929350908816916323b872dd916064808201926020929091908290030181600087803b15801561035257600080fd5b505af1158015610366573d6000803e3d6000fd5b505050506040513d602081101561037c57600080fd5b50919695505050505050565b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a18251156104fd576000826001600160a01b0316846040518082805190602001908083835b602083106104545780518252601f199092019160209182019101610435565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146104b6576040519150601f19603f3d011682016040523d82523d6000602084013e6104bb565b606091505b50509050806104fb5760405162461bcd60e51b81526004018080602001828103825260248152602001806106186024913960400191505060405180910390fd5b505b5092915050565b600080546040805160208101909152828152829161052d916001600160a01b0390911690610388565b9050806001600160a01b0316631794bb3c8686866040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801561059757600080fd5b505af11580156105ab573d6000803e3d6000fd5b50506040805163f2fde38b60e01b815233600482015290516001600160a01b038516935063f2fde38b9250602480830192600092919082900301818387803b1580156105f657600080fd5b505af115801561060a573d6000803e3d6000fd5b509297965050505050505056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a26469706673582212206e5dad9c8646daec2d2b274fdae5e9df46e9c347e2d84dd4b77fb49f65c7a49564736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x57 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x22EC095 EQ PUSH2 0x5C JUMPI DUP1 PUSH4 0x13E7E058 EQ PUSH2 0x80 JUMPI DUP1 PUSH4 0x244A79D6 EQ PUSH2 0x102 JUMPI DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x13E JUMPI DUP1 PUSH4 0xFFE5725F EQ PUSH2 0x1F4 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x64 PUSH2 0x22A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x100 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x96 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xC1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xD3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP3 POP SWAP1 POP PUSH2 0x239 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x64 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x118 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x2E8 JUMP JUMPDEST PUSH2 0x64 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x154 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x17F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x191 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x1B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x388 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x64 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x20A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x504 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2E2 JUMPI DUP3 DUP3 DUP3 DUP2 DUP2 LT PUSH2 0x250 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x1E83409A DUP6 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2C2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0x23C JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2F6 DUP7 DUP7 DUP7 PUSH2 0x504 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP8 SWAP1 MSTORE SWAP2 MLOAD SWAP3 SWAP4 POP SWAP1 DUP9 AND SWAP2 PUSH4 0x23B872DD SWAP2 PUSH1 0x64 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x352 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x366 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x37C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP2 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x4FD JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x454 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x435 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x4B6 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x4BB JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x4FB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x618 PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE DUP3 DUP2 MSTORE DUP3 SWAP2 PUSH2 0x52D SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH2 0x388 JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x1794BB3C DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x597 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x5AB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH4 0xF2FDE38B PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP4 POP PUSH4 0xF2FDE38B SWAP3 POP PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x60A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP3 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 PUSH15 0x5DAD9C8646DAEC2D2B274FDAE5E9DF CHAINID 0xE9 0xC3 SELFBALANCE 0xE2 0xD8 0x4D 0xD4 0xB7 PUSH32 0xB49F65C7A49564736F6C634300060C0033000000000000000000000000000000 ",
              "sourceMap": "258:2020:87:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;379:27;;;:::i;:::-;;;;-1:-1:-1;;;;;379:27:87;;;;;;;;;;;;;;2096:180;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2096:180:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2096:180:87;;-1:-1:-1;2096:180:87;-1:-1:-1;2096:180:87;:::i;:::-;;1612:315;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1612:315:87;;;;;;;;;;;;;;;;;;;;;;:::i;182:778:38:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;182:778:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;182:778:38;;-1:-1:-1;182:778:38;;-1:-1:-1;;;;;182:778:38:i;840:378:87:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;840:378:87;;;;;;;;;;;;;;;;;:::i;379:27::-;;;-1:-1:-1;;;;;379:27:87;;:::o;2096:180::-;2185:9;2180:92;2200:23;;;2180:92;;;2238:12;;2251:1;2238:15;;;;;;;;;;;;;-1:-1:-1;;;;;2238:15:87;-1:-1:-1;;;;;2238:21:87;;2260:4;2238:27;;;;;;;;;;;;;-1:-1:-1;;;;;2238:27:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2225:3:87;;2180:92;;;;2096:180;;;:::o;1612:315::-;1775:11;1794:18;1815:44;1822:6;1830:8;1840:18;1815:6;:44::i;:::-;1865:57;;;-1:-1:-1;;;1865:57:87;;1885:10;1865:57;;;;-1:-1:-1;;;;;1865:57:87;;;;;;;;;;;;;;;1794:65;;-1:-1:-1;1865:19:87;;;;;;:57;;;;;;;;;;;;;;;-1:-1:-1;1865:19:87;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1612:315:87;;;-1:-1:-1;;;;;;1612:315:87:o;182:778:38:-;257:13;416:19;446:6;438:15;;416:37;;495:4;489:11;-1:-1:-1;;;514:5:38;507:81;620:11;613:4;606:5;602:16;595:37;-1:-1:-1;;;657:4:38;650:5;646:16;639:92;764:4;757:5;754:1;747:22;786:28;;;-1:-1:-1;;;;;786:28:38;;;;;;738:31;;-1:-1:-1;786:28:38;;-1:-1:-1;786:28:38;;;;;;;824:12;;:16;821:135;;851:12;868:5;-1:-1:-1;;;;;868:10:38;879:5;868:17;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;868:17:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;850:35;;;901:7;893:56;;;;-1:-1:-1;;;893:56:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;821:135;;182:778;;;;;:::o;840:378:87:-;970:11;1049:8;;1027:36;;;;;;;;;;;;970:11;;1027:36;;-1:-1:-1;;;;;1049:8:87;;;;1027:13;:36::i;:::-;989:75;;1070:11;-1:-1:-1;;;;;1070:22:87;;1100:6;1108:8;1118:18;1070:72;;;;;;;;;;;;;-1:-1:-1;;;;;1070:72:87;;;;;;-1:-1:-1;;;;;1070:72:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1148:41:87;;;-1:-1:-1;;;1148:41:87;;1178:10;1148:41;;;;;;-1:-1:-1;;;;;1148:29:87;;;-1:-1:-1;1148:29:87;;-1:-1:-1;1148:41:87;;;;;-1:-1:-1;;1148:41:87;;;;;;;-1:-1:-1;1148:29:87;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1202:11:87;;840:378;-1:-1:-1;;;;;;;840:378:87:o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "329800",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "claimAll(address,address[])": "infinite",
                "create(address,address,uint256)": "infinite",
                "createAndDeposit(address,address,uint256,uint256)": "infinite",
                "deployMinimal(address,bytes)": "infinite",
                "instance()": "1015"
              }
            },
            "methodIdentifiers": {
              "claimAll(address,address[])": "13e7e058",
              "create(address,address,uint256)": "ffe5725f",
              "createAndDeposit(address,address,uint256,uint256)": "244a79d6",
              "deployMinimal(address,bytes)": "b3eeb5e2",
              "instance()": "022ec095"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"name\":\"ProxyCreated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"contract TokenFaucet[]\",\"name\":\"tokenFaucets\",\"type\":\"address[]\"}],\"name\":\"claimAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_asset\",\"type\":\"address\"},{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_measure\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_dripRatePerSecond\",\"type\":\"uint256\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract TokenFaucet\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_asset\",\"type\":\"address\"},{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"_measure\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_dripRatePerSecond\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"createAndDeposit\",\"outputs\":[{\"internalType\":\"contract TokenFaucet\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"deployMinimal\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"instance\",\"outputs\":[{\"internalType\":\"contract TokenFaucet\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"claimAll(address,address[])\":{\"params\":{\"tokenFaucets\":\"The tokenFaucets to call claim on.\",\"user\":\"The user to claim for\"}},\"create(address,address,uint256)\":{\"params\":{\"_asset\":\"The asset to disburse to users\",\"_dripRatePerSecond\":\"The amount of the asset to drip each second\",\"_measure\":\"The token to use to measure a users portion\"},\"returns\":{\"_0\":\"A reference to the new proxied TokenFaucet\"}},\"createAndDeposit(address,address,uint256,uint256)\":{\"params\":{\"_amount\":\"The amount of assets to deposit into the faucet\",\"_asset\":\"The asset to disburse to users\",\"_dripRatePerSecond\":\"The amount of the asset to drip each second\",\"_measure\":\"The token to use to measure a users portion\"},\"returns\":{\"_0\":\"A reference to the new proxied TokenFaucet\"}}},\"title\":\"Stake Prize Pool Proxy Factory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"claimAll(address,address[])\":{\"notice\":\"Runs claim on all passed comptrollers for a user.\"},\"constructor\":\"Initializes the Factory with an instance of the TokenFaucet\",\"create(address,address,uint256)\":{\"notice\":\"Creates a new TokenFaucet\"},\"createAndDeposit(address,address,uint256,uint256)\":{\"notice\":\"Creates a new TokenFaucet and immediately deposits funds\"},\"instance()\":{\"notice\":\"Contract template for deploying proxied Comptrollers\"}},\"notice\":\"Minimal proxy pattern for creating new TokenFaucet contracts\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token-faucet/TokenFaucetProxyFactory.sol\":\"TokenFaucetProxyFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    function __Ownable_init() internal initializer {\\n        __Context_init_unchained();\\n        __Ownable_init_unchained();\\n    }\\n\\n    function __Ownable_init_unchained() internal initializer {\\n        address msgSender = _msgSender();\\n        _owner = msgSender;\\n        emit OwnershipTransferred(address(0), msgSender);\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        emit OwnershipTransferred(_owner, address(0));\\n        _owner = address(0);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        emit OwnershipTransferred(_owner, newOwner);\\n        _owner = newOwner;\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb419e68addcb82ecda3ad3974b0d2db76435ce9b08435a04d5b119a0c5d45ea5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCastUpgradeable {\\n\\n    /**\\n     * @dev Returns the downcasted uint128 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint128).\\n     *\\n     * Counterpart to Solidity's `uint128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     */\\n    function toUint128(uint256 value) internal pure returns (uint128) {\\n        require(value < 2**128, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return uint128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint64 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint64).\\n     *\\n     * Counterpart to Solidity's `uint64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     */\\n    function toUint64(uint256 value) internal pure returns (uint64) {\\n        require(value < 2**64, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return uint64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint32 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint32).\\n     *\\n     * Counterpart to Solidity's `uint32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     */\\n    function toUint32(uint256 value) internal pure returns (uint32) {\\n        require(value < 2**32, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return uint32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint16 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint16).\\n     *\\n     * Counterpart to Solidity's `uint16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     */\\n    function toUint16(uint256 value) internal pure returns (uint16) {\\n        require(value < 2**16, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return uint16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted uint8 from uint256, reverting on\\n     * overflow (when the input is greater than largest uint8).\\n     *\\n     * Counterpart to Solidity's `uint8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     */\\n    function toUint8(uint256 value) internal pure returns (uint8) {\\n        require(value < 2**8, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return uint8(value);\\n    }\\n\\n    /**\\n     * @dev Converts a signed int256 into an unsigned uint256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be greater than or equal to 0.\\n     */\\n    function toUint256(int256 value) internal pure returns (uint256) {\\n        require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n        return uint256(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int128 from int256, reverting on\\n     * overflow (when the input is less than smallest int128 or\\n     * greater than largest int128).\\n     *\\n     * Counterpart to Solidity's `int128` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 128 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt128(int256 value) internal pure returns (int128) {\\n        require(value >= -2**127 && value < 2**127, \\\"SafeCast: value doesn\\\\'t fit in 128 bits\\\");\\n        return int128(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int64 from int256, reverting on\\n     * overflow (when the input is less than smallest int64 or\\n     * greater than largest int64).\\n     *\\n     * Counterpart to Solidity's `int64` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 64 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt64(int256 value) internal pure returns (int64) {\\n        require(value >= -2**63 && value < 2**63, \\\"SafeCast: value doesn\\\\'t fit in 64 bits\\\");\\n        return int64(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int32 from int256, reverting on\\n     * overflow (when the input is less than smallest int32 or\\n     * greater than largest int32).\\n     *\\n     * Counterpart to Solidity's `int32` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 32 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt32(int256 value) internal pure returns (int32) {\\n        require(value >= -2**31 && value < 2**31, \\\"SafeCast: value doesn\\\\'t fit in 32 bits\\\");\\n        return int32(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int16 from int256, reverting on\\n     * overflow (when the input is less than smallest int16 or\\n     * greater than largest int16).\\n     *\\n     * Counterpart to Solidity's `int16` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 16 bits\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt16(int256 value) internal pure returns (int16) {\\n        require(value >= -2**15 && value < 2**15, \\\"SafeCast: value doesn\\\\'t fit in 16 bits\\\");\\n        return int16(value);\\n    }\\n\\n    /**\\n     * @dev Returns the downcasted int8 from int256, reverting on\\n     * overflow (when the input is less than smallest int8 or\\n     * greater than largest int8).\\n     *\\n     * Counterpart to Solidity's `int8` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - input must fit into 8 bits.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function toInt8(int256 value) internal pure returns (int8) {\\n        require(value >= -2**7 && value < 2**7, \\\"SafeCast: value doesn\\\\'t fit in 8 bits\\\");\\n        return int8(value);\\n    }\\n\\n    /**\\n     * @dev Converts an unsigned uint256 into a signed int256.\\n     *\\n     * Requirements:\\n     *\\n     * - input must be less than or equal to maxInt256.\\n     */\\n    function toInt256(uint256 value) internal pure returns (int256) {\\n        require(value < 2**255, \\\"SafeCast: value doesn't fit in an int256\\\");\\n        return int256(value);\\n    }\\n}\\n\",\"keccak256\":\"0x8bba8b7cb2b7a53b4b669acdaeeafc697502e1d762716f1110a9a99bff1f1c4d\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"contracts/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary Constants {\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC721 = 0x80ac58cd;\\n}\",\"keccak256\":\"0x5dc8f8bda4e9668a9ffae6a941774f849adcb368cc2275fd8a91e6ada8fad7fb\",\"license\":\"GPL-3.0\"},\"contracts/external/openzeppelin/ProxyFactory.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\n// solium-disable security/no-inline-assembly\\n// solium-disable security/no-low-level-calls\\ncontract ProxyFactory {\\n\\n  event ProxyCreated(address proxy);\\n\\n  function deployMinimal(address _logic, bytes memory _data) public returns (address proxy) {\\n    // Adapted from https://github.com/optionality/clone-factory/blob/32782f82dfc5a00d103a7e61a17a5dedbd1e8e9d/contracts/CloneFactory.sol\\n    bytes20 targetBytes = bytes20(_logic);\\n    assembly {\\n      let clone := mload(0x40)\\n      mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n      mstore(add(clone, 0x14), targetBytes)\\n      mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n      proxy := create(0, clone, 0x37)\\n    }\\n\\n    emit ProxyCreated(address(proxy));\\n\\n    if(_data.length > 0) {\\n      (bool success,) = proxy.call(_data);\\n      require(success, \\\"ProxyFactory/constructor-call-failed\\\");\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0xf0422303985796fdd8bdf772ac8e34331e2e63006f657989cca010fa4776d735\"},\"contracts/token-faucet/TokenFaucet.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\\\";\\n\\nimport \\\"../utils/ExtendedSafeCast.sol\\\";\\nimport \\\"../token/TokenListener.sol\\\";\\n\\n/// @title Disburses a token at a fixed rate per second to holders of another token.\\n/// @notice The tokens are dripped at a \\\"drip rate per second\\\".  This is the number of tokens that\\n/// are dripped each second.  A user's share of the dripped tokens is based on how many 'measure' tokens they hold.\\n/* solium-disable security/no-block-members */\\ncontract TokenFaucet is OwnableUpgradeable, TokenListener {\\n  using SafeMathUpgradeable for uint256;\\n  using SafeCastUpgradeable for uint256;\\n  using ExtendedSafeCast for uint256;\\n\\n  event Initialized(\\n    IERC20Upgradeable indexed asset,\\n    IERC20Upgradeable indexed measure,\\n    uint256 dripRatePerSecond\\n  );\\n\\n  event Dripped(\\n    uint256 newTokens\\n  );\\n\\n  event Deposited(\\n    address indexed user,\\n    uint256 amount\\n  );\\n\\n  event Withdrawn(\\n    address indexed to,\\n    uint256 amount\\n  );\\n\\n  event Claimed(\\n    address indexed user,\\n    uint256 newTokens\\n  );\\n\\n  event DripRateChanged(\\n    uint256 dripRatePerSecond\\n  );\\n\\n  struct UserState {\\n    uint128 lastExchangeRateMantissa;\\n    uint128 balance;\\n  }\\n\\n  /// @notice The token that is being disbursed\\n  IERC20Upgradeable public asset;\\n\\n  /// @notice The token that is user to measure a user's portion of disbursed tokens\\n  IERC20Upgradeable public measure;\\n\\n  /// @notice The total number of tokens that are disbursed each second\\n  uint256 public dripRatePerSecond;\\n\\n  /// @notice The cumulative exchange rate of measure token supply : dripped tokens\\n  uint112 public exchangeRateMantissa;\\n\\n  /// @notice The total amount of tokens that have been dripped but not claimed\\n  uint112 public totalUnclaimed;\\n\\n  /// @notice The timestamp at which the tokens were last dripped\\n  uint32 public lastDripTimestamp;\\n\\n  /// @notice The data structure that tracks when a user last received tokens\\n  mapping(address => UserState) public userStates;\\n\\n  /// @notice Initializes a new Comptroller V2\\n  /// @param _asset The asset to disburse to users\\n  /// @param _measure The token to use to measure a users portion\\n  /// @param _dripRatePerSecond The amount of the asset to drip each second\\n  function initialize (\\n    IERC20Upgradeable _asset,\\n    IERC20Upgradeable _measure,\\n    uint256 _dripRatePerSecond\\n  ) public initializer {\\n    __Ownable_init();\\n    lastDripTimestamp = _currentTime();\\n    asset = _asset;\\n    measure = _measure;\\n    setDripRatePerSecond(_dripRatePerSecond);\\n\\n    emit Initialized(\\n      asset,\\n      measure,\\n      dripRatePerSecond\\n    );\\n  }\\n\\n  /// @notice Safely deposits asset tokens into the faucet.  Must be pre-approved\\n  /// This should be used instead of transferring directly because the drip function must\\n  /// be called before receiving new assets.\\n  /// @param amount The amount of asset tokens to add (must be approved already)\\n  function deposit(uint256 amount) external {\\n    drip();\\n    asset.transferFrom(msg.sender, address(this), amount);\\n\\n    emit Deposited(msg.sender, amount);\\n  }\\n\\n  /// @notice Allows the owner to withdraw tokens that have not been dripped yet.\\n  /// @param to The address to withdraw to\\n  /// @param amount The amount to withdraw\\n  function withdrawTo(address to, uint256 amount) external onlyOwner {\\n    drip();\\n    uint256 assetTotalSupply = asset.balanceOf(address(this));\\n    uint256 availableTotalSupply = assetTotalSupply.sub(totalUnclaimed);\\n    require(amount <= availableTotalSupply, \\\"TokenFaucet/insufficient-funds\\\");\\n    asset.transfer(to, amount);\\n\\n    emit Withdrawn(to, amount);\\n  }\\n\\n  /// @notice Transfers all unclaimed tokens to the user\\n  /// @param user The user to claim tokens for\\n  /// @return The amount of tokens that were claimed.\\n  function claim(address user) external returns (uint256) {\\n    drip();\\n    _captureNewTokensForUser(user);\\n    uint256 balance = userStates[user].balance;\\n    userStates[user].balance = 0;\\n    totalUnclaimed = uint256(totalUnclaimed).sub(balance).toUint112();\\n    asset.transfer(user, balance);\\n\\n    emit Claimed(user, balance);\\n\\n    return balance;\\n  }\\n\\n  /// @notice Drips new tokens.\\n  /// @dev Should be called immediately before any measure token mints/transfers/burns\\n  /// @return The number of new tokens dripped.\\n  function drip() public returns (uint256) {\\n    uint256 currentTimestamp = _currentTime();\\n\\n    // this should only run once per block.\\n    if (lastDripTimestamp == uint32(currentTimestamp)) {\\n      return 0;\\n    }\\n\\n    uint256 assetTotalSupply = asset.balanceOf(address(this));\\n    uint256 availableTotalSupply = assetTotalSupply.sub(totalUnclaimed);\\n    uint256 newSeconds = currentTimestamp.sub(lastDripTimestamp);\\n    uint256 nextExchangeRateMantissa = exchangeRateMantissa;\\n    uint256 newTokens;\\n    uint256 measureTotalSupply = measure.totalSupply();\\n\\n    if (measureTotalSupply > 0 && availableTotalSupply > 0) {\\n      newTokens = newSeconds.mul(dripRatePerSecond);\\n      if (newTokens > availableTotalSupply) {\\n        newTokens = availableTotalSupply;\\n      }\\n      uint256 indexDeltaMantissa = FixedPoint.calculateMantissa(newTokens, measureTotalSupply);\\n      nextExchangeRateMantissa = nextExchangeRateMantissa.add(indexDeltaMantissa);\\n\\n      emit Dripped(\\n        newTokens\\n      );\\n    }\\n\\n    exchangeRateMantissa = nextExchangeRateMantissa.toUint112();\\n    totalUnclaimed = uint256(totalUnclaimed).add(newTokens).toUint112();\\n    lastDripTimestamp = currentTimestamp.toUint32();\\n\\n    return newTokens;\\n  }\\n\\n  /// @notice Allows the owner to set the drip rate per second.  This is the number of tokens that are dripped each second.\\n  /// @param _dripRatePerSecond The new drip rate in tokens per second\\n  function setDripRatePerSecond(uint256 _dripRatePerSecond) public onlyOwner {\\n    require(_dripRatePerSecond > 0, \\\"TokenFaucet/dripRate-gt-zero\\\");\\n\\n    // ensure we're all caught up\\n    drip();\\n\\n    dripRatePerSecond = _dripRatePerSecond;\\n\\n    emit DripRateChanged(dripRatePerSecond);\\n  }\\n\\n  /// @notice Captures new tokens for a user\\n  /// @dev This must be called before changes to the user's balance (i.e. before mint, transfer or burns)\\n  /// @param user The user to capture tokens for\\n  /// @return The number of new tokens\\n  function _captureNewTokensForUser(\\n    address user\\n  ) private returns (uint128) {\\n    UserState storage userState = userStates[user];\\n    if (exchangeRateMantissa == userState.lastExchangeRateMantissa) {\\n      // ignore if exchange rate is same\\n      return 0;\\n    }\\n    uint256 deltaExchangeRateMantissa = uint256(exchangeRateMantissa).sub(userState.lastExchangeRateMantissa);\\n    uint256 userMeasureBalance = measure.balanceOf(user);\\n    uint128 newTokens = FixedPoint.multiplyUintByMantissa(userMeasureBalance, deltaExchangeRateMantissa).toUint128();\\n\\n    userStates[user] = UserState({\\n      lastExchangeRateMantissa: exchangeRateMantissa,\\n      balance: uint256(userState.balance).add(newTokens).toUint128()\\n    });\\n\\n    return newTokens;\\n  }\\n\\n  /// @notice Should be called before a user mints new \\\"measure\\\" tokens.\\n  /// @param to The user who is minting the tokens\\n  /// @param token The token they are minting\\n  function beforeTokenMint(\\n    address to,\\n    uint256,\\n    address token,\\n    address\\n  )\\n    external\\n    override\\n  {\\n    if (token == address(measure)) {\\n      drip();\\n      _captureNewTokensForUser(to);\\n    }\\n  }\\n\\n  /// @notice Should be called before \\\"measure\\\" tokens are transferred or burned\\n  /// @param from The user who is sending the tokens\\n  /// @param to The user who is receiving the tokens\\n  /// @param token The token token they are burning\\n  function beforeTokenTransfer(\\n    address from,\\n    address to,\\n    uint256,\\n    address token\\n  )\\n    external\\n    override\\n  {\\n    // must be measure and not be minting\\n    if (token == address(measure) && from != address(0)) {\\n      drip();\\n      _captureNewTokensForUser(to);\\n      _captureNewTokensForUser(from);\\n    }\\n  }\\n\\n  /// @notice returns the current time.  Allows for override in testing.\\n  /// @return The current time (block.timestamp)\\n  function _currentTime() internal virtual view returns (uint32) {\\n    return block.timestamp.toUint32();\\n  }\\n\\n}\\n\",\"keccak256\":\"0x5ebdc4cebd97cf8ca5f0ad6829ce6a98a37fa40fa6e9058446e4acdb43ffcb45\",\"license\":\"GPL-3.0\"},\"contracts/token-faucet/TokenFaucetProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./TokenFaucet.sol\\\";\\nimport \\\"../external/openzeppelin/ProxyFactory.sol\\\";\\n\\n/// @title Stake Prize Pool Proxy Factory\\n/// @notice Minimal proxy pattern for creating new TokenFaucet contracts\\ncontract TokenFaucetProxyFactory is ProxyFactory {\\n\\n  /// @notice Contract template for deploying proxied Comptrollers\\n  TokenFaucet public instance;\\n\\n  /// @notice Initializes the Factory with an instance of the TokenFaucet\\n  constructor () public {\\n    instance = new TokenFaucet();\\n  }\\n\\n  /// @notice Creates a new TokenFaucet\\n  /// @param _asset The asset to disburse to users\\n  /// @param _measure The token to use to measure a users portion\\n  /// @param _dripRatePerSecond The amount of the asset to drip each second\\n  /// @return A reference to the new proxied TokenFaucet\\n  function create(\\n    IERC20Upgradeable _asset,\\n    IERC20Upgradeable _measure,\\n    uint256 _dripRatePerSecond\\n  ) public returns (TokenFaucet) {\\n    TokenFaucet tokenFaucet = TokenFaucet(deployMinimal(address(instance), \\\"\\\"));\\n    tokenFaucet.initialize(\\n      _asset, _measure, _dripRatePerSecond\\n    );\\n    tokenFaucet.transferOwnership(msg.sender);\\n    return tokenFaucet;\\n  }\\n\\n  /// @notice Creates a new TokenFaucet and immediately deposits funds\\n  /// @param _asset The asset to disburse to users\\n  /// @param _measure The token to use to measure a users portion\\n  /// @param _dripRatePerSecond The amount of the asset to drip each second\\n  /// @param _amount The amount of assets to deposit into the faucet\\n  /// @return A reference to the new proxied TokenFaucet\\n  function createAndDeposit(\\n    IERC20Upgradeable _asset,\\n    IERC20Upgradeable _measure,\\n    uint256 _dripRatePerSecond,\\n    uint256 _amount\\n  ) external returns (TokenFaucet) {\\n    TokenFaucet faucet = create(_asset, _measure, _dripRatePerSecond);\\n    _asset.transferFrom(msg.sender, address(faucet), _amount);\\n  }\\n\\n  /// @notice Runs claim on all passed comptrollers for a user.\\n  /// @param user The user to claim for\\n  /// @param tokenFaucets The tokenFaucets to call claim on.\\n  function claimAll(address user, TokenFaucet[] calldata tokenFaucets) external {\\n    for (uint256 i = 0; i < tokenFaucets.length; i++) {\\n      tokenFaucets[i].claim(user);\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0xfbbffba82cce41a1ac2430b924ae0214e1d1ff2dcd845cfcc45596d53b4e3d6a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListener.sol\":{\"content\":\"pragma solidity ^0.6.4;\\n\\nimport \\\"./TokenListenerInterface.sol\\\";\\nimport \\\"./TokenListenerLibrary.sol\\\";\\nimport \\\"../Constants.sol\\\";\\n\\nabstract contract TokenListener is TokenListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER\\n    );\\n  }\\n}\\n\",\"keccak256\":\"0xb0e98d10b004602e1d4f4369a70e6382002dc0c0c5713698eb6a92943aef2265\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"},\"contracts/utils/ExtendedSafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary ExtendedSafeCast {\\n\\n  /**\\n    * @dev Converts an unsigned uint256 into a unsigned uint112.\\n    *\\n    * Requirements:\\n    *\\n    * - input must be less than or equal to maxUint112.\\n    */\\n  function toUint112(uint256 value) internal pure returns (uint112) {\\n    require(value < 2**112, \\\"SafeCast: value doesn't fit in an uint112\\\");\\n    return uint112(value);\\n  }\\n\\n  /**\\n    * @dev Converts an unsigned uint256 into a unsigned uint96.\\n    *\\n    * Requirements:\\n    *\\n    * - input must be less than or equal to maxUint96.\\n    */\\n  function toUint96(uint256 value) internal pure returns (uint96) {\\n    require(value < 2**96, \\\"SafeCast: value doesn't fit in an uint96\\\");\\n    return uint96(value);\\n  }\\n\\n}\",\"keccak256\":\"0x6c8940ba9b1789d362c550be1da5c667ad990e2ff22423ca2d11402e545d3057\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 15502,
                "contract": "contracts/token-faucet/TokenFaucetProxyFactory.sol:TokenFaucetProxyFactory",
                "label": "instance",
                "offset": 0,
                "slot": "0",
                "type": "t_contract(TokenFaucet)15492"
              }
            ],
            "types": {
              "t_contract(TokenFaucet)15492": {
                "encoding": "inplace",
                "label": "contract TokenFaucet",
                "numberOfBytes": "20"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "claimAll(address,address[])": {
                "notice": "Runs claim on all passed comptrollers for a user."
              },
              "constructor": "Initializes the Factory with an instance of the TokenFaucet",
              "create(address,address,uint256)": {
                "notice": "Creates a new TokenFaucet"
              },
              "createAndDeposit(address,address,uint256,uint256)": {
                "notice": "Creates a new TokenFaucet and immediately deposits funds"
              },
              "instance()": {
                "notice": "Contract template for deploying proxied Comptrollers"
              }
            },
            "notice": "Minimal proxy pattern for creating new TokenFaucet contracts",
            "version": 1
          }
        }
      },
      "contracts/token/ControlledToken.sol": {
        "ControlledToken": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Approval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "string",
                  "name": "_name",
                  "type": "string"
                },
                {
                  "indexed": false,
                  "internalType": "string",
                  "name": "_symbol",
                  "type": "string"
                },
                {
                  "indexed": false,
                  "internalType": "uint8",
                  "name": "_decimals",
                  "type": "uint8"
                },
                {
                  "indexed": false,
                  "internalType": "contract TokenControllerInterface",
                  "name": "_controller",
                  "type": "address"
                }
              ],
              "name": "Initialized",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Transfer",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "DOMAIN_SEPARATOR",
              "outputs": [
                {
                  "internalType": "bytes32",
                  "name": "",
                  "type": "bytes32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                }
              ],
              "name": "allowance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "approve",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "controller",
              "outputs": [
                {
                  "internalType": "contract TokenControllerInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_user",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_amount",
                  "type": "uint256"
                }
              ],
              "name": "controllerBurn",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_operator",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "_user",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_amount",
                  "type": "uint256"
                }
              ],
              "name": "controllerBurnFrom",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_user",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_amount",
                  "type": "uint256"
                }
              ],
              "name": "controllerMint",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "decimals",
              "outputs": [
                {
                  "internalType": "uint8",
                  "name": "",
                  "type": "uint8"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "subtractedValue",
                  "type": "uint256"
                }
              ],
              "name": "decreaseAllowance",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "addedValue",
                  "type": "uint256"
                }
              ],
              "name": "increaseAllowance",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "string",
                  "name": "_name",
                  "type": "string"
                },
                {
                  "internalType": "string",
                  "name": "_symbol",
                  "type": "string"
                },
                {
                  "internalType": "uint8",
                  "name": "_decimals",
                  "type": "uint8"
                },
                {
                  "internalType": "contract TokenControllerInterface",
                  "name": "_controller",
                  "type": "address"
                }
              ],
              "name": "initialize",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "name",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                }
              ],
              "name": "nonces",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "deadline",
                  "type": "uint256"
                },
                {
                  "internalType": "uint8",
                  "name": "v",
                  "type": "uint8"
                },
                {
                  "internalType": "bytes32",
                  "name": "r",
                  "type": "bytes32"
                },
                {
                  "internalType": "bytes32",
                  "name": "s",
                  "type": "bytes32"
                }
              ],
              "name": "permit",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "symbol",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transfer",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "sender",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transferFrom",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "events": {
              "Initialized(string,string,uint8,address)": {
                "details": "Emitted when an instance is initialized"
              }
            },
            "kind": "dev",
            "methods": {
              "DOMAIN_SEPARATOR()": {
                "details": "See {IERC20Permit-DOMAIN_SEPARATOR}."
              },
              "allowance(address,address)": {
                "details": "See {IERC20-allowance}."
              },
              "approve(address,uint256)": {
                "details": "See {IERC20-approve}. Requirements: - `spender` cannot be the zero address."
              },
              "balanceOf(address)": {
                "details": "See {IERC20-balanceOf}."
              },
              "controllerBurn(address,uint256)": {
                "details": "May be overridden to provide more granular control over burning",
                "params": {
                  "_amount": "Amount of tokens to burn",
                  "_user": "Address of the holder account to burn tokens from"
                }
              },
              "controllerBurnFrom(address,address,uint256)": {
                "details": "May be overridden to provide more granular control over operator-burning",
                "params": {
                  "_amount": "Amount of tokens to burn",
                  "_operator": "Address of the operator performing the burn action via the controller contract",
                  "_user": "Address of the holder account to burn tokens from"
                }
              },
              "controllerMint(address,uint256)": {
                "details": "May be overridden to provide more granular control over minting",
                "params": {
                  "_amount": "Amount of tokens to mint",
                  "_user": "Address of the receiver of the minted tokens"
                }
              },
              "decimals()": {
                "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is called. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."
              },
              "decreaseAllowance(address,uint256)": {
                "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."
              },
              "increaseAllowance(address,uint256)": {
                "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address."
              },
              "initialize(string,string,uint8,address)": {
                "params": {
                  "_controller": "Address of the Controller contract for minting & burning",
                  "_decimals": "The number of decimals for the Token",
                  "_name": "The name of the Token",
                  "_symbol": "The symbol for the Token"
                }
              },
              "name()": {
                "details": "Returns the name of the token."
              },
              "nonces(address)": {
                "details": "See {IERC20Permit-nonces}."
              },
              "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": {
                "details": "See {IERC20Permit-permit}."
              },
              "symbol()": {
                "details": "Returns the symbol of the token, usually a shorter version of the name."
              },
              "totalSupply()": {
                "details": "See {IERC20-totalSupply}."
              },
              "transfer(address,uint256)": {
                "details": "See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`."
              },
              "transferFrom(address,address,uint256)": {
                "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`."
              }
            },
            "title": "Controlled ERC20 Token",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50611e8c806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806370a08231116100ad578063a9059cbb11610071578063a9059cbb14610395578063d505accf146103c1578063dd62ed3e14610412578063de7ea79d14610440578063f77c47911461057e57610121565b806370a08231146102e95780637ecebe001461030f57806390596dd11461033557806395d89b4114610361578063a457c2d71461036957610121565b8063313ce567116100f4578063313ce567146102335780633644e5151461025157806339509351146102595780635d7b075814610285578063631b5dfb146102b357610121565b806306fdde0314610126578063095ea7b3146101a357806318160ddd146101e357806323b872dd146101fd575b600080fd5b61012e6105a2565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610168578181015183820152602001610150565b50505050905090810190601f1680156101955780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101cf600480360360408110156101b957600080fd5b506001600160a01b038135169060200135610638565b604080519115158252519081900360200190f35b6101eb610655565b60408051918252519081900360200190f35b6101cf6004803603606081101561021357600080fd5b506001600160a01b0381358116916020810135909116906040013561065b565b61023b6106e2565b6040805160ff9092168252519081900360200190f35b6101eb6106eb565b6101cf6004803603604081101561026f57600080fd5b506001600160a01b0381351690602001356106fa565b6102b16004803603604081101561029b57600080fd5b506001600160a01b038135169060200135610748565b005b6102b1600480360360608110156102c957600080fd5b506001600160a01b038135811691602081013590911690604001356107c5565b6101eb600480360360208110156102ff57600080fd5b50356001600160a01b031661089b565b6101eb6004803603602081101561032557600080fd5b50356001600160a01b03166108b6565b6102b16004803603604081101561034b57600080fd5b506001600160a01b0381351690602001356108dd565b61012e610956565b6101cf6004803603604081101561037f57600080fd5b506001600160a01b0381351690602001356109b7565b6101cf600480360360408110156103ab57600080fd5b506001600160a01b038135169060200135610a1f565b6102b1600480360360e08110156103d757600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610a33565b6101eb6004803603604081101561042857600080fd5b506001600160a01b0381358116916020013516610bd6565b6102b16004803603608081101561045657600080fd5b81019060208101813564010000000081111561047157600080fd5b82018360208201111561048357600080fd5b803590602001918460018302840111640100000000831117156104a557600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156104f857600080fd5b82018360208201111561050a57600080fd5b8035906020019184600183028401116401000000008311171561052c57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050813560ff16925050602001356001600160a01b0316610c01565b610586610e74565b604080516001600160a01b039092168252519081900360200190f35b60368054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561062e5780601f106106035761010080835404028352916020019161062e565b820191906000526020600020905b81548152906001019060200180831161061157829003601f168201915b5050505050905090565b600061064c610645610e83565b8484610e87565b50600192915050565b60355490565b6000610668848484610f73565b6106d884610674610e83565b6106d385604051806060016040528060288152602001611d5c602891396001600160a01b038a166000908152603460205260408120906106b2610e83565b6001600160a01b0316815260208101919091526040016000205491906110d0565b610e87565b5060019392505050565b60385460ff1690565b60006106f5611167565b905090565b600061064c610707610e83565b846106d38560346000610718610e83565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906111a2565b60cc546001600160a01b031661075c610e83565b6001600160a01b0316146107b7576040805162461bcd60e51b815260206004820152601f60248201527f436f6e74726f6c6c6564546f6b656e2f6f6e6c792d636f6e74726f6c6c657200604482015290519081900360640190fd5b6107c18282611203565b5050565b60cc546001600160a01b03166107d9610e83565b6001600160a01b031614610834576040805162461bcd60e51b815260206004820152601f60248201527f436f6e74726f6c6c6564546f6b656e2f6f6e6c792d636f6e74726f6c6c657200604482015290519081900360640190fd5b816001600160a01b0316836001600160a01b03161461088c57600061087d82604051806060016040528060218152602001611d84602191396108768688610bd6565b91906110d0565b905061088a838583610e87565b505b61089682826112f5565b505050565b6001600160a01b031660009081526033602052604090205490565b6001600160a01b03811660009081526099602052604081206108d7906113f1565b92915050565b60cc546001600160a01b03166108f1610e83565b6001600160a01b03161461094c576040805162461bcd60e51b815260206004820152601f60248201527f436f6e74726f6c6c6564546f6b656e2f6f6e6c792d636f6e74726f6c6c657200604482015290519081900360640190fd5b6107c182826112f5565b60378054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561062e5780601f106106035761010080835404028352916020019161062e565b600061064c6109c4610e83565b846106d385604051806060016040528060258152602001611e3260259139603460006109ee610e83565b6001600160a01b03908116825260208083019390935260409182016000908120918d168152925290205491906110d0565b600061064c610a2c610e83565b8484610f73565b83421115610a88576040805162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015290519081900360640190fd5b6000609a54888888610abd609960008e6001600160a01b03166001600160a01b031681526020019081526020016000206113f1565b8960405160200180878152602001866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200182815260200196505050505050506040516020818303038152906040528051906020012090506000610b26826113f5565b90506000610b3682878787611441565b9050896001600160a01b0316816001600160a01b031614610b9e576040805162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b6001600160a01b038a166000908152609960205260409020610bbf906115bf565b610bca8a8a8a610e87565b50505050505050505050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b600054610100900460ff1680610c1a5750610c1a6115c8565b80610c28575060005460ff16155b610c635760405162461bcd60e51b815260040180806020018281038252602e815260200180611d0c602e913960400191505060405180910390fd5b600054610100900460ff16158015610c8e576000805460ff1961ff0019909116610100171660011790555b6001600160a01b038216610cd35760405162461bcd60e51b8152600401808060200182810382526023815260200180611e0f6023913960400191505060405180910390fd5b610cdd85856115d9565b610d1b6040518060400160405280601c81526020017f506f6f6c546f67657468657220436f6e74726f6c6c6564546f6b656e0000000081525061168e565b60cc80546001600160a01b0319166001600160a01b038416179055610d3f83611764565b7f41bc1176d7b9b7bc036f385a7e5b08b0662a7afa0844af8a599ad431150227e1858585856040518080602001806020018560ff168152602001846001600160a01b03168152602001838103835287818151815260200191508051906020019080838360005b83811015610dbd578181015183820152602001610da5565b50505050905090810190601f168015610dea5780820380516001836020036101000a031916815260200191505b50838103825286518152865160209182019188019080838360005b83811015610e1d578181015183820152602001610e05565b50505050905090810190601f168015610e4a5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a18015610e6d576000805461ff00191690555b5050505050565b60cc546001600160a01b031681565b3390565b6001600160a01b038316610ecc5760405162461bcd60e51b8152600401808060200182810382526024815260200180611deb6024913960400191505060405180910390fd5b6001600160a01b038216610f115760405162461bcd60e51b8152600401808060200182810382526022815260200180611ca26022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610fb85760405162461bcd60e51b8152600401808060200182810382526025815260200180611dc66025913960400191505060405180910390fd5b6001600160a01b038216610ffd5760405162461bcd60e51b8152600401808060200182810382526023815260200180611c5d6023913960400191505060405180910390fd5b61100883838361177a565b61104581604051806060016040528060268152602001611cc4602691396001600160a01b03861660009081526033602052604090205491906110d0565b6001600160a01b03808516600090815260336020526040808220939093559084168152205461107490826111a2565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561115f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561112457818101518382015260200161110c565b50505050905090810190601f1680156111515780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60006106f57f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6111956117f4565b61119d6117fa565b611800565b6000828201838110156111fc576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b03821661125e576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61126a6000838361177a565b60355461127790826111a2565b6035556001600160a01b03821660009081526033602052604090205461129d90826111a2565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b03821661133a5760405162461bcd60e51b8152600401808060200182810382526021815260200180611da56021913960400191505060405180910390fd5b6113468260008361177a565b61138381604051806060016040528060228152602001611c80602291396001600160a01b03851660009081526033602052604090205491906110d0565b6001600160a01b0383166000908152603360205260409020556035546113a99082611862565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b5490565b60006113ff611167565b82604051602001808061190160f01b81525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156114a25760405162461bcd60e51b8152600401808060200182810382526022815260200180611cea6022913960400191505060405180910390fd5b8360ff16601b14806114b757508360ff16601c145b6114f25760405162461bcd60e51b8152600401808060200182810382526022815260200180611d3a6022913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561154e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166115b6576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b95945050505050565b80546001019055565b60006115d3306118bf565b15905090565b600054610100900460ff16806115f257506115f26115c8565b80611600575060005460ff16155b61163b5760405162461bcd60e51b815260040180806020018281038252602e815260200180611d0c602e913960400191505060405180910390fd5b600054610100900460ff16158015611666576000805460ff1961ff0019909116610100171660011790555b61166e6118c5565b6116788383611967565b8015610896576000805461ff0019169055505050565b600054610100900460ff16806116a757506116a76115c8565b806116b5575060005460ff16155b6116f05760405162461bcd60e51b815260040180806020018281038252602e815260200180611d0c602e913960400191505060405180910390fd5b600054610100900460ff1615801561171b576000805460ff1961ff0019909116610100171660011790555b6117236118c5565b61174682604051806040016040528060018152602001603160f81b815250611a3f565b61174f82611aff565b80156107c1576000805461ff00191690555050565b6038805460ff191660ff92909216919091179055565b60cc5460408051637cbab1c760e01b81526001600160a01b03868116600483015285811660248301526044820185905291519190921691637cbab1c791606480830192600092919082900301818387803b1580156117d757600080fd5b505af11580156117eb573d6000803e3d6000fd5b50505050505050565b60655490565b60665490565b600083838361180d611bc5565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b03168152602001955050505050506040516020818303038152906040528051906020012090509392505050565b6000828211156118b9576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b3b151590565b600054610100900460ff16806118de57506118de6115c8565b806118ec575060005460ff16155b6119275760405162461bcd60e51b815260040180806020018281038252602e815260200180611d0c602e913960400191505060405180910390fd5b600054610100900460ff16158015611952576000805460ff1961ff0019909116610100171660011790555b8015611964576000805461ff00191690555b50565b600054610100900460ff168061198057506119806115c8565b8061198e575060005460ff16155b6119c95760405162461bcd60e51b815260040180806020018281038252602e815260200180611d0c602e913960400191505060405180910390fd5b600054610100900460ff161580156119f4576000805460ff1961ff0019909116610100171660011790555b8251611a07906036906020860190611bc9565b508151611a1b906037906020850190611bc9565b506038805460ff191660121790558015610896576000805461ff0019169055505050565b600054610100900460ff1680611a585750611a586115c8565b80611a66575060005460ff16155b611aa15760405162461bcd60e51b815260040180806020018281038252602e815260200180611d0c602e913960400191505060405180910390fd5b600054610100900460ff16158015611acc576000805460ff1961ff0019909116610100171660011790555b82516020808501919091208351918401919091206065919091556066558015610896576000805461ff0019169055505050565b600054610100900460ff1680611b185750611b186115c8565b80611b26575060005460ff16155b611b615760405162461bcd60e51b815260040180806020018281038252602e815260200180611d0c602e913960400191505060405180910390fd5b600054610100900460ff16158015611b8c576000805460ff1961ff0019909116610100171660011790555b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9609a5580156107c1576000805461ff00191690555050565b4690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611c0a57805160ff1916838001178555611c37565b82800160010185558215611c37579182015b82811115611c37578251825591602001919060010190611c1c565b50611c43929150611c47565b5090565b5b80821115611c435760008155600101611c4856fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545434453413a20696e76616c6964207369676e6174757265202773272076616c7565496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656445434453413a20696e76616c6964207369676e6174757265202776272076616c756545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365436f6e74726f6c6c6564546f6b656e2f657863656564732d616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373436f6e74726f6c6c6564546f6b656e2f636f6e74726f6c6c65722d6e6f742d7a65726f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220d4c3e2aa538767119b3c10619b4d96ae68b6504b82292d8648426183c0aebbb664736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E8C DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x121 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x70A08231 GT PUSH2 0xAD JUMPI DUP1 PUSH4 0xA9059CBB GT PUSH2 0x71 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x395 JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x3C1 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x412 JUMPI DUP1 PUSH4 0xDE7EA79D EQ PUSH2 0x440 JUMPI DUP1 PUSH4 0xF77C4791 EQ PUSH2 0x57E JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2E9 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x30F JUMPI DUP1 PUSH4 0x90596DD1 EQ PUSH2 0x335 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x361 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x369 JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x313CE567 GT PUSH2 0xF4 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x233 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x251 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x259 JUMPI DUP1 PUSH4 0x5D7B0758 EQ PUSH2 0x285 JUMPI DUP1 PUSH4 0x631B5DFB EQ PUSH2 0x2B3 JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x126 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x1A3 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x1E3 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1FD JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x12E PUSH2 0x5A2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x168 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x150 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x195 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1CF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x638 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1EB PUSH2 0x655 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1CF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x213 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x65B JUMP JUMPDEST PUSH2 0x23B PUSH2 0x6E2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1EB PUSH2 0x6EB JUMP JUMPDEST PUSH2 0x1CF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x26F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x6FA JUMP JUMPDEST PUSH2 0x2B1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x29B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x748 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x2B1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x2C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x7C5 JUMP JUMPDEST PUSH2 0x1EB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x89B JUMP JUMPDEST PUSH2 0x1EB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x325 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x8B6 JUMP JUMPDEST PUSH2 0x2B1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x34B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x8DD JUMP JUMPDEST PUSH2 0x12E PUSH2 0x956 JUMP JUMPDEST PUSH2 0x1CF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x37F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x9B7 JUMP JUMPDEST PUSH2 0x1CF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0xA1F JUMP JUMPDEST PUSH2 0x2B1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0xE0 DUP2 LT ISZERO PUSH2 0x3D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0xFF PUSH1 0x80 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0xA0 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0xC0 ADD CALLDATALOAD PUSH2 0xA33 JUMP JUMPDEST PUSH2 0x1EB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x428 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xBD6 JUMP JUMPDEST PUSH2 0x2B1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x456 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x471 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x483 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x4A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 SWAP5 SWAP4 PUSH1 0x20 DUP2 ADD SWAP4 POP CALLDATALOAD SWAP2 POP POP PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x4F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x50A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x52C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP POP DUP2 CALLDATALOAD PUSH1 0xFF AND SWAP3 POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xC01 JUMP JUMPDEST PUSH2 0x586 PUSH2 0xE74 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x36 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x62E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x603 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x62E JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x611 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x64C PUSH2 0x645 PUSH2 0xE83 JUMP JUMPDEST DUP5 DUP5 PUSH2 0xE87 JUMP JUMPDEST POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x35 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x668 DUP5 DUP5 DUP5 PUSH2 0xF73 JUMP JUMPDEST PUSH2 0x6D8 DUP5 PUSH2 0x674 PUSH2 0xE83 JUMP JUMPDEST PUSH2 0x6D3 DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1D5C PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP1 PUSH2 0x6B2 PUSH2 0xE83 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x10D0 JUMP JUMPDEST PUSH2 0xE87 JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x38 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6F5 PUSH2 0x1167 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x64C PUSH2 0x707 PUSH2 0xE83 JUMP JUMPDEST DUP5 PUSH2 0x6D3 DUP6 PUSH1 0x34 PUSH1 0x0 PUSH2 0x718 PUSH2 0xE83 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP13 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP1 PUSH2 0x11A2 JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x75C PUSH2 0xE83 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x7B7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6E74726F6C6C6564546F6B656E2F6F6E6C792D636F6E74726F6C6C657200 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x7C1 DUP3 DUP3 PUSH2 0x1203 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x7D9 PUSH2 0xE83 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x834 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6E74726F6C6C6564546F6B656E2F6F6E6C792D636F6E74726F6C6C657200 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x88C JUMPI PUSH1 0x0 PUSH2 0x87D DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1D84 PUSH1 0x21 SWAP2 CODECOPY PUSH2 0x876 DUP7 DUP9 PUSH2 0xBD6 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x10D0 JUMP JUMPDEST SWAP1 POP PUSH2 0x88A DUP4 DUP6 DUP4 PUSH2 0xE87 JUMP JUMPDEST POP JUMPDEST PUSH2 0x896 DUP3 DUP3 PUSH2 0x12F5 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x99 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x8D7 SWAP1 PUSH2 0x13F1 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x8F1 PUSH2 0xE83 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x94C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6E74726F6C6C6564546F6B656E2F6F6E6C792D636F6E74726F6C6C657200 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x7C1 DUP3 DUP3 PUSH2 0x12F5 JUMP JUMPDEST PUSH1 0x37 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x62E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x603 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x62E JUMP JUMPDEST PUSH1 0x0 PUSH2 0x64C PUSH2 0x9C4 PUSH2 0xE83 JUMP JUMPDEST DUP5 PUSH2 0x6D3 DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1E32 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x34 PUSH1 0x0 PUSH2 0x9EE PUSH2 0xE83 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP14 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x10D0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x64C PUSH2 0xA2C PUSH2 0xE83 JUMP JUMPDEST DUP5 DUP5 PUSH2 0xF73 JUMP JUMPDEST DUP4 TIMESTAMP GT ISZERO PUSH2 0xA88 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305065726D69743A206578706972656420646561646C696E65000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x9A SLOAD DUP9 DUP9 DUP9 PUSH2 0xABD PUSH1 0x99 PUSH1 0x0 DUP15 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH2 0x13F1 JUMP JUMPDEST DUP10 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH2 0xB26 DUP3 PUSH2 0x13F5 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xB36 DUP3 DUP8 DUP8 DUP8 PUSH2 0x1441 JUMP JUMPDEST SWAP1 POP DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xB9E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305065726D69743A20696E76616C6964207369676E61747572650000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x99 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0xBBF SWAP1 PUSH2 0x15BF JUMP JUMPDEST PUSH2 0xBCA DUP11 DUP11 DUP11 PUSH2 0xE87 JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0xC1A JUMPI POP PUSH2 0xC1A PUSH2 0x15C8 JUMP JUMPDEST DUP1 PUSH2 0xC28 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0xC63 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D0C PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0xC8E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xCD3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1E0F PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xCDD DUP6 DUP6 PUSH2 0x15D9 JUMP JUMPDEST PUSH2 0xD1B PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x506F6F6C546F67657468657220436F6E74726F6C6C6564546F6B656E00000000 DUP2 MSTORE POP PUSH2 0x168E JUMP JUMPDEST PUSH1 0xCC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND OR SWAP1 SSTORE PUSH2 0xD3F DUP4 PUSH2 0x1764 JUMP JUMPDEST PUSH32 0x41BC1176D7B9B7BC036F385A7E5B08B0662A7AFA0844AF8A599AD431150227E1 DUP6 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP8 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xDBD JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xDA5 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xDEA JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP4 DUP2 SUB DUP3 MSTORE DUP7 MLOAD DUP2 MSTORE DUP7 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP9 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xE1D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xE05 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xE4A JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP1 ISZERO PUSH2 0xE6D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0xECC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1DEB PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xF11 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1CA2 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE DUP2 MLOAD DUP6 DUP2 MSTORE SWAP2 MLOAD PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0xFB8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1DC6 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xFFD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1C5D PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1008 DUP4 DUP4 DUP4 PUSH2 0x177A JUMP JUMPDEST PUSH2 0x1045 DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1CC4 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x10D0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP5 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x1074 SWAP1 DUP3 PUSH2 0x11A2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 SWAP3 DUP8 AND SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP5 DUP5 GT ISZERO PUSH2 0x115F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1124 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x110C JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1151 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6F5 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F PUSH2 0x1195 PUSH2 0x17F4 JUMP JUMPDEST PUSH2 0x119D PUSH2 0x17FA JUMP JUMPDEST PUSH2 0x1800 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x11FC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x125E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x126A PUSH1 0x0 DUP4 DUP4 PUSH2 0x177A JUMP JUMPDEST PUSH1 0x35 SLOAD PUSH2 0x1277 SWAP1 DUP3 PUSH2 0x11A2 JUMP JUMPDEST PUSH1 0x35 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x129D SWAP1 DUP3 PUSH2 0x11A2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP4 MLOAD DUP6 DUP2 MSTORE SWAP4 MLOAD SWAP3 SWAP4 SWAP2 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x133A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1DA5 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1346 DUP3 PUSH1 0x0 DUP4 PUSH2 0x177A JUMP JUMPDEST PUSH2 0x1383 DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1C80 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x10D0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x35 SLOAD PUSH2 0x13A9 SWAP1 DUP3 PUSH2 0x1862 JUMP JUMPDEST PUSH1 0x35 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x13FF PUSH2 0x1167 JUMP JUMPDEST DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH2 0x1901 PUSH1 0xF0 SHL DUP2 MSTORE POP PUSH1 0x2 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP3 GT ISZERO PUSH2 0x14A2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1CEA PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP4 PUSH1 0xFF AND PUSH1 0x1B EQ DUP1 PUSH2 0x14B7 JUMPI POP DUP4 PUSH1 0xFF AND PUSH1 0x1C EQ JUMPDEST PUSH2 0x14F2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D3A PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x154E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD SWAP2 POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x15B6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15D3 ADDRESS PUSH2 0x18BF JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x15F2 JUMPI POP PUSH2 0x15F2 PUSH2 0x15C8 JUMP JUMPDEST DUP1 PUSH2 0x1600 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x163B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D0C PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1666 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x166E PUSH2 0x18C5 JUMP JUMPDEST PUSH2 0x1678 DUP4 DUP4 PUSH2 0x1967 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x896 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x16A7 JUMPI POP PUSH2 0x16A7 PUSH2 0x15C8 JUMP JUMPDEST DUP1 PUSH2 0x16B5 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x16F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D0C PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x171B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x1723 PUSH2 0x18C5 JUMP JUMPDEST PUSH2 0x1746 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x31 PUSH1 0xF8 SHL DUP2 MSTORE POP PUSH2 0x1A3F JUMP JUMPDEST PUSH2 0x174F DUP3 PUSH2 0x1AFF JUMP JUMPDEST DUP1 ISZERO PUSH2 0x7C1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x38 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x7CBAB1C7 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP6 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP6 SWAP1 MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x7CBAB1C7 SWAP2 PUSH1 0x64 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x17D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x17EB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x65 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x66 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP4 DUP4 PUSH2 0x180D PUSH2 0x1BC5 JUMP JUMPDEST ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x18B9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x18DE JUMPI POP PUSH2 0x18DE PUSH2 0x15C8 JUMP JUMPDEST DUP1 PUSH2 0x18EC JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1927 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D0C PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1952 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP1 ISZERO PUSH2 0x1964 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1980 JUMPI POP PUSH2 0x1980 PUSH2 0x15C8 JUMP JUMPDEST DUP1 PUSH2 0x198E JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x19C9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D0C PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x19F4 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP3 MLOAD PUSH2 0x1A07 SWAP1 PUSH1 0x36 SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x1BC9 JUMP JUMPDEST POP DUP2 MLOAD PUSH2 0x1A1B SWAP1 PUSH1 0x37 SWAP1 PUSH1 0x20 DUP6 ADD SWAP1 PUSH2 0x1BC9 JUMP JUMPDEST POP PUSH1 0x38 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x12 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x896 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1A58 JUMPI POP PUSH2 0x1A58 PUSH2 0x15C8 JUMP JUMPDEST DUP1 PUSH2 0x1A66 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1AA1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D0C PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1ACC JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP3 MLOAD PUSH1 0x20 DUP1 DUP6 ADD SWAP2 SWAP1 SWAP2 KECCAK256 DUP4 MLOAD SWAP2 DUP5 ADD SWAP2 SWAP1 SWAP2 KECCAK256 PUSH1 0x65 SWAP2 SWAP1 SWAP2 SSTORE PUSH1 0x66 SSTORE DUP1 ISZERO PUSH2 0x896 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1B18 JUMPI POP PUSH2 0x1B18 PUSH2 0x15C8 JUMP JUMPDEST DUP1 PUSH2 0x1B26 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1B61 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D0C PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1B8C JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 PUSH1 0x9A SSTORE DUP1 ISZERO PUSH2 0x7C1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP JUMP JUMPDEST CHAINID SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x1C0A JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x1C37 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x1C37 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1C37 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x1C1C JUMP JUMPDEST POP PUSH2 0x1C43 SWAP3 SWAP2 POP PUSH2 0x1C47 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1C43 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1C48 JUMP INVALID GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220746F20746865207A65726F2061 PUSH5 0x6472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH3 0x75726E KECCAK256 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545524332 ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F766520746F20746865207A65726F20616464 PUSH19 0x65737345524332303A207472616E7366657220 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545434453 COINBASE GASPRICE KECCAK256 PUSH10 0x6E76616C696420736967 PUSH15 0x6174757265202773272076616C7565 0x49 PUSH15 0x697469616C697A61626C653A20636F PUSH15 0x747261637420697320616C72656164 PUSH26 0x20696E697469616C697A656445434453413A20696E76616C6964 KECCAK256 PUSH20 0x69676E6174757265202776272076616C75654552 NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220616D6F756E7420657863656564 PUSH20 0x20616C6C6F77616E6365436F6E74726F6C6C6564 SLOAD PUSH16 0x6B656E2F657863656564732D616C6C6F PUSH24 0x616E636545524332303A206275726E2066726F6D20746865 KECCAK256 PUSH27 0x65726F206164647265737345524332303A207472616E7366657220 PUSH7 0x726F6D20746865 KECCAK256 PUSH27 0x65726F206164647265737345524332303A20617070726F76652066 PUSH19 0x6F6D20746865207A65726F2061646472657373 NUMBER PUSH16 0x6E74726F6C6C6564546F6B656E2F636F PUSH15 0x74726F6C6C65722D6E6F742D7A6572 PUSH16 0x45524332303A20646563726561736564 KECCAK256 PUSH2 0x6C6C PUSH16 0x77616E63652062656C6F77207A65726F LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD4 0xC3 0xE2 0xAA MSTORE8 DUP8 PUSH8 0x119B3C10619B4D96 0xAE PUSH9 0xB6504B82292D864842 PUSH2 0x83C0 0xAE 0xBB 0xB6 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "325:3589:88:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106101215760003560e01c806370a08231116100ad578063a9059cbb11610071578063a9059cbb14610395578063d505accf146103c1578063dd62ed3e14610412578063de7ea79d14610440578063f77c47911461057e57610121565b806370a08231146102e95780637ecebe001461030f57806390596dd11461033557806395d89b4114610361578063a457c2d71461036957610121565b8063313ce567116100f4578063313ce567146102335780633644e5151461025157806339509351146102595780635d7b075814610285578063631b5dfb146102b357610121565b806306fdde0314610126578063095ea7b3146101a357806318160ddd146101e357806323b872dd146101fd575b600080fd5b61012e6105a2565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610168578181015183820152602001610150565b50505050905090810190601f1680156101955780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101cf600480360360408110156101b957600080fd5b506001600160a01b038135169060200135610638565b604080519115158252519081900360200190f35b6101eb610655565b60408051918252519081900360200190f35b6101cf6004803603606081101561021357600080fd5b506001600160a01b0381358116916020810135909116906040013561065b565b61023b6106e2565b6040805160ff9092168252519081900360200190f35b6101eb6106eb565b6101cf6004803603604081101561026f57600080fd5b506001600160a01b0381351690602001356106fa565b6102b16004803603604081101561029b57600080fd5b506001600160a01b038135169060200135610748565b005b6102b1600480360360608110156102c957600080fd5b506001600160a01b038135811691602081013590911690604001356107c5565b6101eb600480360360208110156102ff57600080fd5b50356001600160a01b031661089b565b6101eb6004803603602081101561032557600080fd5b50356001600160a01b03166108b6565b6102b16004803603604081101561034b57600080fd5b506001600160a01b0381351690602001356108dd565b61012e610956565b6101cf6004803603604081101561037f57600080fd5b506001600160a01b0381351690602001356109b7565b6101cf600480360360408110156103ab57600080fd5b506001600160a01b038135169060200135610a1f565b6102b1600480360360e08110156103d757600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610a33565b6101eb6004803603604081101561042857600080fd5b506001600160a01b0381358116916020013516610bd6565b6102b16004803603608081101561045657600080fd5b81019060208101813564010000000081111561047157600080fd5b82018360208201111561048357600080fd5b803590602001918460018302840111640100000000831117156104a557600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156104f857600080fd5b82018360208201111561050a57600080fd5b8035906020019184600183028401116401000000008311171561052c57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050813560ff16925050602001356001600160a01b0316610c01565b610586610e74565b604080516001600160a01b039092168252519081900360200190f35b60368054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561062e5780601f106106035761010080835404028352916020019161062e565b820191906000526020600020905b81548152906001019060200180831161061157829003601f168201915b5050505050905090565b600061064c610645610e83565b8484610e87565b50600192915050565b60355490565b6000610668848484610f73565b6106d884610674610e83565b6106d385604051806060016040528060288152602001611d5c602891396001600160a01b038a166000908152603460205260408120906106b2610e83565b6001600160a01b0316815260208101919091526040016000205491906110d0565b610e87565b5060019392505050565b60385460ff1690565b60006106f5611167565b905090565b600061064c610707610e83565b846106d38560346000610718610e83565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906111a2565b60cc546001600160a01b031661075c610e83565b6001600160a01b0316146107b7576040805162461bcd60e51b815260206004820152601f60248201527f436f6e74726f6c6c6564546f6b656e2f6f6e6c792d636f6e74726f6c6c657200604482015290519081900360640190fd5b6107c18282611203565b5050565b60cc546001600160a01b03166107d9610e83565b6001600160a01b031614610834576040805162461bcd60e51b815260206004820152601f60248201527f436f6e74726f6c6c6564546f6b656e2f6f6e6c792d636f6e74726f6c6c657200604482015290519081900360640190fd5b816001600160a01b0316836001600160a01b03161461088c57600061087d82604051806060016040528060218152602001611d84602191396108768688610bd6565b91906110d0565b905061088a838583610e87565b505b61089682826112f5565b505050565b6001600160a01b031660009081526033602052604090205490565b6001600160a01b03811660009081526099602052604081206108d7906113f1565b92915050565b60cc546001600160a01b03166108f1610e83565b6001600160a01b03161461094c576040805162461bcd60e51b815260206004820152601f60248201527f436f6e74726f6c6c6564546f6b656e2f6f6e6c792d636f6e74726f6c6c657200604482015290519081900360640190fd5b6107c182826112f5565b60378054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561062e5780601f106106035761010080835404028352916020019161062e565b600061064c6109c4610e83565b846106d385604051806060016040528060258152602001611e3260259139603460006109ee610e83565b6001600160a01b03908116825260208083019390935260409182016000908120918d168152925290205491906110d0565b600061064c610a2c610e83565b8484610f73565b83421115610a88576040805162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015290519081900360640190fd5b6000609a54888888610abd609960008e6001600160a01b03166001600160a01b031681526020019081526020016000206113f1565b8960405160200180878152602001866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200182815260200196505050505050506040516020818303038152906040528051906020012090506000610b26826113f5565b90506000610b3682878787611441565b9050896001600160a01b0316816001600160a01b031614610b9e576040805162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b6001600160a01b038a166000908152609960205260409020610bbf906115bf565b610bca8a8a8a610e87565b50505050505050505050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b600054610100900460ff1680610c1a5750610c1a6115c8565b80610c28575060005460ff16155b610c635760405162461bcd60e51b815260040180806020018281038252602e815260200180611d0c602e913960400191505060405180910390fd5b600054610100900460ff16158015610c8e576000805460ff1961ff0019909116610100171660011790555b6001600160a01b038216610cd35760405162461bcd60e51b8152600401808060200182810382526023815260200180611e0f6023913960400191505060405180910390fd5b610cdd85856115d9565b610d1b6040518060400160405280601c81526020017f506f6f6c546f67657468657220436f6e74726f6c6c6564546f6b656e0000000081525061168e565b60cc80546001600160a01b0319166001600160a01b038416179055610d3f83611764565b7f41bc1176d7b9b7bc036f385a7e5b08b0662a7afa0844af8a599ad431150227e1858585856040518080602001806020018560ff168152602001846001600160a01b03168152602001838103835287818151815260200191508051906020019080838360005b83811015610dbd578181015183820152602001610da5565b50505050905090810190601f168015610dea5780820380516001836020036101000a031916815260200191505b50838103825286518152865160209182019188019080838360005b83811015610e1d578181015183820152602001610e05565b50505050905090810190601f168015610e4a5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a18015610e6d576000805461ff00191690555b5050505050565b60cc546001600160a01b031681565b3390565b6001600160a01b038316610ecc5760405162461bcd60e51b8152600401808060200182810382526024815260200180611deb6024913960400191505060405180910390fd5b6001600160a01b038216610f115760405162461bcd60e51b8152600401808060200182810382526022815260200180611ca26022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610fb85760405162461bcd60e51b8152600401808060200182810382526025815260200180611dc66025913960400191505060405180910390fd5b6001600160a01b038216610ffd5760405162461bcd60e51b8152600401808060200182810382526023815260200180611c5d6023913960400191505060405180910390fd5b61100883838361177a565b61104581604051806060016040528060268152602001611cc4602691396001600160a01b03861660009081526033602052604090205491906110d0565b6001600160a01b03808516600090815260336020526040808220939093559084168152205461107490826111a2565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561115f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561112457818101518382015260200161110c565b50505050905090810190601f1680156111515780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60006106f57f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6111956117f4565b61119d6117fa565b611800565b6000828201838110156111fc576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b03821661125e576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61126a6000838361177a565b60355461127790826111a2565b6035556001600160a01b03821660009081526033602052604090205461129d90826111a2565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b03821661133a5760405162461bcd60e51b8152600401808060200182810382526021815260200180611da56021913960400191505060405180910390fd5b6113468260008361177a565b61138381604051806060016040528060228152602001611c80602291396001600160a01b03851660009081526033602052604090205491906110d0565b6001600160a01b0383166000908152603360205260409020556035546113a99082611862565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b5490565b60006113ff611167565b82604051602001808061190160f01b81525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156114a25760405162461bcd60e51b8152600401808060200182810382526022815260200180611cea6022913960400191505060405180910390fd5b8360ff16601b14806114b757508360ff16601c145b6114f25760405162461bcd60e51b8152600401808060200182810382526022815260200180611d3a6022913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561154e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166115b6576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b95945050505050565b80546001019055565b60006115d3306118bf565b15905090565b600054610100900460ff16806115f257506115f26115c8565b80611600575060005460ff16155b61163b5760405162461bcd60e51b815260040180806020018281038252602e815260200180611d0c602e913960400191505060405180910390fd5b600054610100900460ff16158015611666576000805460ff1961ff0019909116610100171660011790555b61166e6118c5565b6116788383611967565b8015610896576000805461ff0019169055505050565b600054610100900460ff16806116a757506116a76115c8565b806116b5575060005460ff16155b6116f05760405162461bcd60e51b815260040180806020018281038252602e815260200180611d0c602e913960400191505060405180910390fd5b600054610100900460ff1615801561171b576000805460ff1961ff0019909116610100171660011790555b6117236118c5565b61174682604051806040016040528060018152602001603160f81b815250611a3f565b61174f82611aff565b80156107c1576000805461ff00191690555050565b6038805460ff191660ff92909216919091179055565b60cc5460408051637cbab1c760e01b81526001600160a01b03868116600483015285811660248301526044820185905291519190921691637cbab1c791606480830192600092919082900301818387803b1580156117d757600080fd5b505af11580156117eb573d6000803e3d6000fd5b50505050505050565b60655490565b60665490565b600083838361180d611bc5565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b03168152602001955050505050506040516020818303038152906040528051906020012090509392505050565b6000828211156118b9576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b3b151590565b600054610100900460ff16806118de57506118de6115c8565b806118ec575060005460ff16155b6119275760405162461bcd60e51b815260040180806020018281038252602e815260200180611d0c602e913960400191505060405180910390fd5b600054610100900460ff16158015611952576000805460ff1961ff0019909116610100171660011790555b8015611964576000805461ff00191690555b50565b600054610100900460ff168061198057506119806115c8565b8061198e575060005460ff16155b6119c95760405162461bcd60e51b815260040180806020018281038252602e815260200180611d0c602e913960400191505060405180910390fd5b600054610100900460ff161580156119f4576000805460ff1961ff0019909116610100171660011790555b8251611a07906036906020860190611bc9565b508151611a1b906037906020850190611bc9565b506038805460ff191660121790558015610896576000805461ff0019169055505050565b600054610100900460ff1680611a585750611a586115c8565b80611a66575060005460ff16155b611aa15760405162461bcd60e51b815260040180806020018281038252602e815260200180611d0c602e913960400191505060405180910390fd5b600054610100900460ff16158015611acc576000805460ff1961ff0019909116610100171660011790555b82516020808501919091208351918401919091206065919091556066558015610896576000805461ff0019169055505050565b600054610100900460ff1680611b185750611b186115c8565b80611b26575060005460ff16155b611b615760405162461bcd60e51b815260040180806020018281038252602e815260200180611d0c602e913960400191505060405180910390fd5b600054610100900460ff16158015611b8c576000805460ff1961ff0019909116610100171660011790555b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9609a5580156107c1576000805461ff00191690555050565b4690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611c0a57805160ff1916838001178555611c37565b82800160010185558215611c37579182015b82811115611c37578251825591602001919060010190611c1c565b50611c43929150611c47565b5090565b5b80821115611c435760008155600101611c4856fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545434453413a20696e76616c6964207369676e6174757265202773272076616c7565496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656445434453413a20696e76616c6964207369676e6174757265202776272076616c756545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365436f6e74726f6c6c6564546f6b656e2f657863656564732d616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373436f6e74726f6c6c6564546f6b656e2f636f6e74726f6c6c65722d6e6f742d7a65726f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220d4c3e2aa538767119b3c10619b4d96ae68b6504b82292d8648426183c0aebbb664736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x121 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x70A08231 GT PUSH2 0xAD JUMPI DUP1 PUSH4 0xA9059CBB GT PUSH2 0x71 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x395 JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x3C1 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x412 JUMPI DUP1 PUSH4 0xDE7EA79D EQ PUSH2 0x440 JUMPI DUP1 PUSH4 0xF77C4791 EQ PUSH2 0x57E JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2E9 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x30F JUMPI DUP1 PUSH4 0x90596DD1 EQ PUSH2 0x335 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x361 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x369 JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x313CE567 GT PUSH2 0xF4 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x233 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x251 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x259 JUMPI DUP1 PUSH4 0x5D7B0758 EQ PUSH2 0x285 JUMPI DUP1 PUSH4 0x631B5DFB EQ PUSH2 0x2B3 JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x126 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x1A3 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x1E3 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1FD JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x12E PUSH2 0x5A2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x168 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x150 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x195 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1CF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x638 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1EB PUSH2 0x655 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1CF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x213 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x65B JUMP JUMPDEST PUSH2 0x23B PUSH2 0x6E2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1EB PUSH2 0x6EB JUMP JUMPDEST PUSH2 0x1CF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x26F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x6FA JUMP JUMPDEST PUSH2 0x2B1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x29B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x748 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x2B1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x2C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x7C5 JUMP JUMPDEST PUSH2 0x1EB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x89B JUMP JUMPDEST PUSH2 0x1EB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x325 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x8B6 JUMP JUMPDEST PUSH2 0x2B1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x34B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x8DD JUMP JUMPDEST PUSH2 0x12E PUSH2 0x956 JUMP JUMPDEST PUSH2 0x1CF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x37F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x9B7 JUMP JUMPDEST PUSH2 0x1CF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0xA1F JUMP JUMPDEST PUSH2 0x2B1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0xE0 DUP2 LT ISZERO PUSH2 0x3D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0xFF PUSH1 0x80 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0xA0 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0xC0 ADD CALLDATALOAD PUSH2 0xA33 JUMP JUMPDEST PUSH2 0x1EB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x428 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xBD6 JUMP JUMPDEST PUSH2 0x2B1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x456 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x471 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x483 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x4A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 SWAP5 SWAP4 PUSH1 0x20 DUP2 ADD SWAP4 POP CALLDATALOAD SWAP2 POP POP PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x4F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x50A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x52C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP POP DUP2 CALLDATALOAD PUSH1 0xFF AND SWAP3 POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xC01 JUMP JUMPDEST PUSH2 0x586 PUSH2 0xE74 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x36 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x62E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x603 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x62E JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x611 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x64C PUSH2 0x645 PUSH2 0xE83 JUMP JUMPDEST DUP5 DUP5 PUSH2 0xE87 JUMP JUMPDEST POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x35 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x668 DUP5 DUP5 DUP5 PUSH2 0xF73 JUMP JUMPDEST PUSH2 0x6D8 DUP5 PUSH2 0x674 PUSH2 0xE83 JUMP JUMPDEST PUSH2 0x6D3 DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1D5C PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP1 PUSH2 0x6B2 PUSH2 0xE83 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x10D0 JUMP JUMPDEST PUSH2 0xE87 JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x38 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6F5 PUSH2 0x1167 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x64C PUSH2 0x707 PUSH2 0xE83 JUMP JUMPDEST DUP5 PUSH2 0x6D3 DUP6 PUSH1 0x34 PUSH1 0x0 PUSH2 0x718 PUSH2 0xE83 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP13 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP1 PUSH2 0x11A2 JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x75C PUSH2 0xE83 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x7B7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6E74726F6C6C6564546F6B656E2F6F6E6C792D636F6E74726F6C6C657200 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x7C1 DUP3 DUP3 PUSH2 0x1203 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x7D9 PUSH2 0xE83 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x834 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6E74726F6C6C6564546F6B656E2F6F6E6C792D636F6E74726F6C6C657200 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x88C JUMPI PUSH1 0x0 PUSH2 0x87D DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1D84 PUSH1 0x21 SWAP2 CODECOPY PUSH2 0x876 DUP7 DUP9 PUSH2 0xBD6 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x10D0 JUMP JUMPDEST SWAP1 POP PUSH2 0x88A DUP4 DUP6 DUP4 PUSH2 0xE87 JUMP JUMPDEST POP JUMPDEST PUSH2 0x896 DUP3 DUP3 PUSH2 0x12F5 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x99 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x8D7 SWAP1 PUSH2 0x13F1 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x8F1 PUSH2 0xE83 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x94C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6E74726F6C6C6564546F6B656E2F6F6E6C792D636F6E74726F6C6C657200 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x7C1 DUP3 DUP3 PUSH2 0x12F5 JUMP JUMPDEST PUSH1 0x37 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x62E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x603 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x62E JUMP JUMPDEST PUSH1 0x0 PUSH2 0x64C PUSH2 0x9C4 PUSH2 0xE83 JUMP JUMPDEST DUP5 PUSH2 0x6D3 DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1E32 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x34 PUSH1 0x0 PUSH2 0x9EE PUSH2 0xE83 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP14 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x10D0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x64C PUSH2 0xA2C PUSH2 0xE83 JUMP JUMPDEST DUP5 DUP5 PUSH2 0xF73 JUMP JUMPDEST DUP4 TIMESTAMP GT ISZERO PUSH2 0xA88 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305065726D69743A206578706972656420646561646C696E65000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x9A SLOAD DUP9 DUP9 DUP9 PUSH2 0xABD PUSH1 0x99 PUSH1 0x0 DUP15 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH2 0x13F1 JUMP JUMPDEST DUP10 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH2 0xB26 DUP3 PUSH2 0x13F5 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xB36 DUP3 DUP8 DUP8 DUP8 PUSH2 0x1441 JUMP JUMPDEST SWAP1 POP DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xB9E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305065726D69743A20696E76616C6964207369676E61747572650000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x99 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0xBBF SWAP1 PUSH2 0x15BF JUMP JUMPDEST PUSH2 0xBCA DUP11 DUP11 DUP11 PUSH2 0xE87 JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0xC1A JUMPI POP PUSH2 0xC1A PUSH2 0x15C8 JUMP JUMPDEST DUP1 PUSH2 0xC28 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0xC63 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D0C PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0xC8E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xCD3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1E0F PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xCDD DUP6 DUP6 PUSH2 0x15D9 JUMP JUMPDEST PUSH2 0xD1B PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x506F6F6C546F67657468657220436F6E74726F6C6C6564546F6B656E00000000 DUP2 MSTORE POP PUSH2 0x168E JUMP JUMPDEST PUSH1 0xCC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND OR SWAP1 SSTORE PUSH2 0xD3F DUP4 PUSH2 0x1764 JUMP JUMPDEST PUSH32 0x41BC1176D7B9B7BC036F385A7E5B08B0662A7AFA0844AF8A599AD431150227E1 DUP6 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP8 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xDBD JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xDA5 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xDEA JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP4 DUP2 SUB DUP3 MSTORE DUP7 MLOAD DUP2 MSTORE DUP7 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP9 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xE1D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xE05 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xE4A JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP1 ISZERO PUSH2 0xE6D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0xECC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1DEB PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xF11 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1CA2 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE DUP2 MLOAD DUP6 DUP2 MSTORE SWAP2 MLOAD PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0xFB8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1DC6 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xFFD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1C5D PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1008 DUP4 DUP4 DUP4 PUSH2 0x177A JUMP JUMPDEST PUSH2 0x1045 DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1CC4 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x10D0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP5 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x1074 SWAP1 DUP3 PUSH2 0x11A2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 SWAP3 DUP8 AND SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP5 DUP5 GT ISZERO PUSH2 0x115F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1124 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x110C JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1151 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6F5 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F PUSH2 0x1195 PUSH2 0x17F4 JUMP JUMPDEST PUSH2 0x119D PUSH2 0x17FA JUMP JUMPDEST PUSH2 0x1800 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x11FC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x125E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x126A PUSH1 0x0 DUP4 DUP4 PUSH2 0x177A JUMP JUMPDEST PUSH1 0x35 SLOAD PUSH2 0x1277 SWAP1 DUP3 PUSH2 0x11A2 JUMP JUMPDEST PUSH1 0x35 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x129D SWAP1 DUP3 PUSH2 0x11A2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP4 MLOAD DUP6 DUP2 MSTORE SWAP4 MLOAD SWAP3 SWAP4 SWAP2 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x133A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1DA5 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1346 DUP3 PUSH1 0x0 DUP4 PUSH2 0x177A JUMP JUMPDEST PUSH2 0x1383 DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1C80 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x10D0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x35 SLOAD PUSH2 0x13A9 SWAP1 DUP3 PUSH2 0x1862 JUMP JUMPDEST PUSH1 0x35 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x13FF PUSH2 0x1167 JUMP JUMPDEST DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH2 0x1901 PUSH1 0xF0 SHL DUP2 MSTORE POP PUSH1 0x2 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP3 GT ISZERO PUSH2 0x14A2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1CEA PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP4 PUSH1 0xFF AND PUSH1 0x1B EQ DUP1 PUSH2 0x14B7 JUMPI POP DUP4 PUSH1 0xFF AND PUSH1 0x1C EQ JUMPDEST PUSH2 0x14F2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D3A PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x154E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD SWAP2 POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x15B6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15D3 ADDRESS PUSH2 0x18BF JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x15F2 JUMPI POP PUSH2 0x15F2 PUSH2 0x15C8 JUMP JUMPDEST DUP1 PUSH2 0x1600 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x163B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D0C PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1666 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x166E PUSH2 0x18C5 JUMP JUMPDEST PUSH2 0x1678 DUP4 DUP4 PUSH2 0x1967 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x896 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x16A7 JUMPI POP PUSH2 0x16A7 PUSH2 0x15C8 JUMP JUMPDEST DUP1 PUSH2 0x16B5 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x16F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D0C PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x171B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x1723 PUSH2 0x18C5 JUMP JUMPDEST PUSH2 0x1746 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x31 PUSH1 0xF8 SHL DUP2 MSTORE POP PUSH2 0x1A3F JUMP JUMPDEST PUSH2 0x174F DUP3 PUSH2 0x1AFF JUMP JUMPDEST DUP1 ISZERO PUSH2 0x7C1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x38 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x7CBAB1C7 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP6 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP6 SWAP1 MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x7CBAB1C7 SWAP2 PUSH1 0x64 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x17D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x17EB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x65 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x66 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP4 DUP4 PUSH2 0x180D PUSH2 0x1BC5 JUMP JUMPDEST ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x18B9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x18DE JUMPI POP PUSH2 0x18DE PUSH2 0x15C8 JUMP JUMPDEST DUP1 PUSH2 0x18EC JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1927 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D0C PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1952 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP1 ISZERO PUSH2 0x1964 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1980 JUMPI POP PUSH2 0x1980 PUSH2 0x15C8 JUMP JUMPDEST DUP1 PUSH2 0x198E JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x19C9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D0C PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x19F4 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP3 MLOAD PUSH2 0x1A07 SWAP1 PUSH1 0x36 SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x1BC9 JUMP JUMPDEST POP DUP2 MLOAD PUSH2 0x1A1B SWAP1 PUSH1 0x37 SWAP1 PUSH1 0x20 DUP6 ADD SWAP1 PUSH2 0x1BC9 JUMP JUMPDEST POP PUSH1 0x38 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x12 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x896 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1A58 JUMPI POP PUSH2 0x1A58 PUSH2 0x15C8 JUMP JUMPDEST DUP1 PUSH2 0x1A66 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1AA1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D0C PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1ACC JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP3 MLOAD PUSH1 0x20 DUP1 DUP6 ADD SWAP2 SWAP1 SWAP2 KECCAK256 DUP4 MLOAD SWAP2 DUP5 ADD SWAP2 SWAP1 SWAP2 KECCAK256 PUSH1 0x65 SWAP2 SWAP1 SWAP2 SSTORE PUSH1 0x66 SSTORE DUP1 ISZERO PUSH2 0x896 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1B18 JUMPI POP PUSH2 0x1B18 PUSH2 0x15C8 JUMP JUMPDEST DUP1 PUSH2 0x1B26 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1B61 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D0C PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1B8C JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 PUSH1 0x9A SSTORE DUP1 ISZERO PUSH2 0x7C1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP JUMP JUMPDEST CHAINID SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x1C0A JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x1C37 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x1C37 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1C37 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x1C1C JUMP JUMPDEST POP PUSH2 0x1C43 SWAP3 SWAP2 POP PUSH2 0x1C47 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1C43 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1C48 JUMP INVALID GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220746F20746865207A65726F2061 PUSH5 0x6472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH3 0x75726E KECCAK256 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545524332 ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F766520746F20746865207A65726F20616464 PUSH19 0x65737345524332303A207472616E7366657220 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545434453 COINBASE GASPRICE KECCAK256 PUSH10 0x6E76616C696420736967 PUSH15 0x6174757265202773272076616C7565 0x49 PUSH15 0x697469616C697A61626C653A20636F PUSH15 0x747261637420697320616C72656164 PUSH26 0x20696E697469616C697A656445434453413A20696E76616C6964 KECCAK256 PUSH20 0x69676E6174757265202776272076616C75654552 NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220616D6F756E7420657863656564 PUSH20 0x20616C6C6F77616E6365436F6E74726F6C6C6564 SLOAD PUSH16 0x6B656E2F657863656564732D616C6C6F PUSH24 0x616E636545524332303A206275726E2066726F6D20746865 KECCAK256 PUSH27 0x65726F206164647265737345524332303A207472616E7366657220 PUSH7 0x726F6D20746865 KECCAK256 PUSH27 0x65726F206164647265737345524332303A20617070726F76652066 PUSH19 0x6F6D20746865207A65726F2061646472657373 NUMBER PUSH16 0x6E74726F6C6C6564546F6B656E2F636F PUSH15 0x74726F6C6C65722D6E6F742D7A6572 PUSH16 0x45524332303A20646563726561736564 KECCAK256 PUSH2 0x6C6C PUSH16 0x77616E63652062656C6F77207A65726F LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD4 0xC3 0xE2 0xAA MSTORE8 DUP8 PUSH8 0x119B3C10619B4D96 0xAE PUSH9 0xB6504B82292D864842 PUSH2 0x83C0 0xAE 0xBB 0xB6 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "325:3589:88:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2517:89:10;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4593:166;;;;;;;;;;;;;;;;-1:-1:-1;4593:166:10;;-1:-1:-1;;;;;4593:166:10;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;3584:106;;;:::i;:::-;;;;;;;;;;;;;;;;5226:317;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5226:317:10;;;;;;;;;;;;;;;;;:::i;3435:89::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2994:113:3;;;:::i;5938:215:10:-;;;;;;;;;;;;;;;;-1:-1:-1;5938:215:10;;-1:-1:-1;;;;;5938:215:10;;;;;;:::i;1809:129:88:-;;;;;;;;;;;;;;;;-1:-1:-1;1809:129:88;;-1:-1:-1;;;;;1809:129:88;;;;;;:::i;:::-;;2732:356;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2732:356:88;;;;;;;;;;;;;;;;;:::i;3748:125:10:-;;;;;;;;;;;;;;;;-1:-1:-1;3748:125:10;-1:-1:-1;;;;;3748:125:10;;:::i;2752:118:3:-;;;;;;;;;;;;;;;;-1:-1:-1;2752:118:3;-1:-1:-1;;;;;2752:118:3;;:::i;2203:129:88:-;;;;;;;;;;;;;;;;-1:-1:-1;2203:129:88;;-1:-1:-1;;;;;2203:129:88;;;;;;:::i;2719:93:10:-;;;:::i;6640:266::-;;;;;;;;;;;;;;;;-1:-1:-1;6640:266:10;;-1:-1:-1;;;;;6640:266:10;;;;;;:::i;4076:172::-;;;;;;;;;;;;;;;;-1:-1:-1;4076:172:10;;-1:-1:-1;;;;;4076:172:10;;;;;;:::i;1886:805:3:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1886:805:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1886:805:3;;;;;;;;:::i;4306:149:10:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4306:149:10;;;;;;;;;;:::i;1033:517:88:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1033:517:88;;;;;;;;-1:-1:-1;1033:517:88;;-1:-1:-1;;1033:517:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1033:517:88;;-1:-1:-1;;;1033:517:88;;;;;-1:-1:-1;;1033:517:88;;;-1:-1:-1;;;;;1033:517:88;;:::i;663:51::-;;;:::i;:::-;;;;-1:-1:-1;;;;;663:51:88;;;;;;;;;;;;;;2517:89:10;2594:5;2587:12;;;;;;;;;;;;;-1:-1:-1;;2587:12:10;;;;;;;;;;;;;;;;;;;;;;;;;;2562:13;;2587:12;;2594:5;;2587:12;;;2594:5;2587:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2517:89;:::o;4593:166::-;4676:4;4692:39;4701:12;:10;:12::i;:::-;4715:7;4724:6;4692:8;:39::i;:::-;-1:-1:-1;4748:4:10;4593:166;;;;:::o;3584:106::-;3671:12;;3584:106;:::o;5226:317::-;5332:4;5348:36;5358:6;5366:9;5377:6;5348:9;:36::i;:::-;5394:121;5403:6;5411:12;:10;:12::i;:::-;5425:89;5463:6;5425:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5425:19:10;;;;;;:11;:19;;;;;;5445:12;:10;:12::i;:::-;-1:-1:-1;;;;;5425:33:10;;;;;;;;;;;;-1:-1:-1;5425:33:10;;;;:37;:89::i;:::-;5394:8;:121::i;:::-;-1:-1:-1;5532:4:10;5226:317;;;;;:::o;3435:89::-;3508:9;;;;3435:89;:::o;2994:113:3:-;3054:7;3080:20;:18;:20::i;:::-;3073:27;;2994:113;:::o;5938:215:10:-;6026:4;6042:83;6051:12;:10;:12::i;:::-;6065:7;6074:50;6113:10;6074:11;:25;6086:12;:10;:12::i;:::-;-1:-1:-1;;;;;6074:25:10;;;;;;;;;;;;;;;;;-1:-1:-1;6074:25:10;;;:34;;;;;;;;;;;:38;:50::i;1809:129:88:-;3236:10;;-1:-1:-1;;;;;3236:10:88;3212:12;:10;:12::i;:::-;-1:-1:-1;;;;;3212:35:88;;3204:79;;;;;-1:-1:-1;;;3204:79:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;1912:21:::1;1918:5;1925:7;1912:5;:21::i;:::-;1809:129:::0;;:::o;2732:356::-;3236:10;;-1:-1:-1;;;;;3236:10:88;3212:12;:10;:12::i;:::-;-1:-1:-1;;;;;3212:35:88;;3204:79;;;;;-1:-1:-1;;;3204:79:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2862:18:88;;::::1;::::0;;::::1;;2858:199;;2890:26;2919:77;2951:7;2919:77;;;;;;;;;;;;;;;;;:27;2929:5;2936:9;2919;:27::i;:::-;:31:::0;:77;:31:::1;:77::i;:::-;2890:106;;3004:46;3013:5;3020:9;3031:18;3004:8;:46::i;:::-;2858:199;;3062:21;3068:5;3075:7;3062:5;:21::i;:::-;2732:356:::0;;;:::o;3748:125:10:-;-1:-1:-1;;;;;3848:18:10;3822:7;3848:18;;;:9;:18;;;;;;;3748:125::o;2752:118:3:-;-1:-1:-1;;;;;2839:14:3;;2813:7;2839:14;;;:7;:14;;;;;:24;;:22;:24::i;:::-;2832:31;2752:118;-1:-1:-1;;2752:118:3:o;2203:129:88:-;3236:10;;-1:-1:-1;;;;;3236:10:88;3212:12;:10;:12::i;:::-;-1:-1:-1;;;;;3212:35:88;;3204:79;;;;;-1:-1:-1;;;3204:79:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;2306:21:::1;2312:5;2319:7;2306:5;:21::i;2719:93:10:-:0;2798:7;2791:14;;;;;;;;;;;;;-1:-1:-1;;2791:14:10;;;;;;;;;;;;;;;;;;;;;;;;;;2766:13;;2791:14;;2798:7;;2791:14;;;2798:7;2791:14;;;;;;;;;;;;;;;;;;;;;;;;6640:266;6733:4;6749:129;6758:12;:10;:12::i;:::-;6772:7;6781:96;6820:15;6781:96;;;;;;;;;;;;;;;;;:11;:25;6793:12;:10;:12::i;:::-;-1:-1:-1;;;;;6781:25:10;;;;;;;;;;;;;;;;;-1:-1:-1;6781:25:10;;;:34;;;;;;;;;;;;:38;:96::i;4076:172::-;4162:4;4178:42;4188:12;:10;:12::i;:::-;4202:9;4213:6;4178:9;:42::i;1886:805:3:-;2113:8;2094:15;:27;;2086:69;;;;;-1:-1:-1;;;2086:69:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;2238:16;;-1:-1:-1;;;;;2343:14:3;;2166:18;2343:14;;;:7;:14;;;;;2166:18;;2238:16;2272:5;;2295:7;;2320:5;;2343:24;;:22;:24::i;:::-;2210:197;;;;;;;;;;;-1:-1:-1;;;;;2210:197:3;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2210:197:3;;;;;;;;;;;;;;;;;;;;;;;;;;;2187:230;;;;;;-1:-1:-1;;2443:28:3;2187:230;2443:16;:28::i;:::-;2428:43;;2482:14;2499:39;2524:4;2530:1;2533;2536;2499:24;:39::i;:::-;2482:56;-1:-1:-1;;;;;;2556:15:3;;;;;;;2548:58;;;;;-1:-1:-1;;;2548:58:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2617:14:3;;;;;;:7;:14;;;;;:26;;:24;:26::i;:::-;2653:31;2662:5;2669:7;2678:5;2653:8;:31::i;:::-;1886:805;;;;;;;;;;:::o;4306:149:10:-;-1:-1:-1;;;;;4421:18:10;;;4395:7;4421:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4306:149::o;1033:517:88:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;-1:-1:-1;;;;;1227:34:88;::::1;1219:82;;;;-1:-1:-1::0;;;1219:82:88::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1307:28;1320:5;1327:7;1307:12;:28::i;:::-;1341:50;;;;;;;;;;;;;;;;;::::0;:18:::1;:50::i;:::-;1397:10;:24:::0;;-1:-1:-1;;;;;;1397:24:88::1;-1:-1:-1::0;;;;;1397:24:88;::::1;;::::0;;1427:25:::1;1442:9:::0;1427:14:::1;:25::i;:::-;1464:81;1483:5;1496:7;1511:9;1528:11;1464:81;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;1464:81:88::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;1464:81:88;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1794:14:9::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1790:66;1033:517:88;;;;;:::o;663:51::-;;;-1:-1:-1;;;;;663:51:88;;:::o;828:104:19:-;915:10;828:104;:::o;9704:340:10:-;-1:-1:-1;;;;;9805:19:10;;9797:68;;;;-1:-1:-1;;;9797:68:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9883:21:10;;9875:68;;;;-1:-1:-1;;;9875:68:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9954:18:10;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10005:32;;;;;;;;;;;;;;;;;9704:340;;;:::o;7380:530::-;-1:-1:-1;;;;;7485:20:10;;7477:70;;;;-1:-1:-1;;;7477:70:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7565:23:10;;7557:71;;;;-1:-1:-1;;;7557:71:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7639:47;7660:6;7668:9;7679:6;7639:20;:47::i;:::-;7717:71;7739:6;7717:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7717:17:10;;;;;;:9;:17;;;;;;;;:21;:71::i;:::-;-1:-1:-1;;;;;7697:17:10;;;;;;;:9;:17;;;;;;:91;;;;7821:20;;;;;;;:32;;7846:6;7821:24;:32::i;:::-;-1:-1:-1;;;;;7798:20:10;;;;;;;:9;:20;;;;;;;;;:55;;;;7868:35;;;;;;;7798:20;;7868:35;;;;;;;;;;;;;7380:530;;;:::o;5443:163:8:-;5529:7;5564:12;5556:6;;;;5548:29;;;;-1:-1:-1;;;5548:29:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5594:5:8;;;5443:163::o;2695:160:2:-;2748:7;2774:74;1459:95;2808:17;:15;:17::i;:::-;2827:20;:18;:20::i;:::-;2774:21;:74::i;2701:175:8:-;2759:7;2790:5;;;2813:6;;;;2805:46;;;;;-1:-1:-1;;;2805:46:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;2868:1;2701:175;-1:-1:-1;;;2701:175:8:o;8181:370:10:-;-1:-1:-1;;;;;8264:21:10;;8256:65;;;;;-1:-1:-1;;;8256:65:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;8332:49;8361:1;8365:7;8374:6;8332:20;:49::i;:::-;8407:12;;:24;;8424:6;8407:16;:24::i;:::-;8392:12;:39;-1:-1:-1;;;;;8462:18:10;;;;;;:9;:18;;;;;;:30;;8485:6;8462:22;:30::i;:::-;-1:-1:-1;;;;;8441:18:10;;;;;;:9;:18;;;;;;;;:51;;;;8507:37;;;;;;;8441:18;;;;8507:37;;;;;;;;;;8181:370;;:::o;8871:410::-;-1:-1:-1;;;;;8954:21:10;;8946:67;;;;-1:-1:-1;;;8946:67:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9024:49;9045:7;9062:1;9066:6;9024:20;:49::i;:::-;9105:68;9128:6;9105:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9105:18:10;;;;;;:9;:18;;;;;;;;:22;:68::i;:::-;-1:-1:-1;;;;;9084:18:10;;;;;;:9;:18;;;;;:89;9198:12;;:24;;9215:6;9198:16;:24::i;:::-;9183:12;:39;9237:37;;;;;;;;9263:1;;-1:-1:-1;;;;;9237:37:10;;;;;;;;;;;;8871:410;;:::o;1139:112:20:-;1230:14;;1139:112::o;3813:183:2:-;3890:7;3955:20;:18;:20::i;:::-;3977:10;3926:62;;;;;;-1:-1:-1;;;3926:62:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3916:73;;;;;;3909:80;;3813:183;;;:::o;1971:1414:1:-;2056:7;2971:66;2957:80;;;2949:127;;;;-1:-1:-1;;;2949:127:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3094:1;:7;;3099:2;3094:7;:18;;;;3105:1;:7;;3110:2;3105:7;3094:18;3086:65;;;;-1:-1:-1;;;3086:65:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3246:14;3263:24;3273:4;3279:1;3282;3285;3263:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3263:24:1;;-1:-1:-1;;3263:24:1;;;-1:-1:-1;;;;;;;3305:20:1;;3297:57;;;;;-1:-1:-1;;;3297:57:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;3372:6;1971:1414;-1:-1:-1;;;;;1971:1414:1:o;1257:178:20:-;1409:19;;1427:1;1409:19;;;1257:178::o;1952:123:9:-;2000:4;2024:44;2062:4;2024:29;:44::i;:::-;2023:45;2016:52;;1952:123;:::o;2090:178:10:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;2187:26:10::1;:24;:26::i;:::-;2223:38;2246:5;2253:7;2223:22;:38::i;:::-;1794:14:9::0;1790:66;;;-1:-1:-1;;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;-1:-1:-1;2090:178:10:o;1409:200:3:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1488:26:3::1;:24;:26::i;:::-;1524:34;1548:4;1524:34;;;;;;;;;;;;;-1:-1:-1::0;;;1524:34:3::1;;::::0;:23:::1;:34::i;:::-;1568;1597:4;1568:28;:34::i;:::-;1794:14:9::0;1790:66;;;-1:-1:-1;;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;1409:200:3:o;10367:96:10:-;10435:9;:21;;-1:-1:-1;;10435:21:10;;;;;;;;;;;;10367:96::o;3755:157:88:-;3859:10;;:48;;;-1:-1:-1;;;3859:48:88;;-1:-1:-1;;;;;3859:48:88;;;;;;;;;;;;;;;;;;;;;;:10;;;;;-1:-1:-1;;3859:48:88;;;;;-1:-1:-1;;3859:48:88;;;;;;;-1:-1:-1;3859:10:88;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3755:157;;;:::o;4558:103:2:-;4642:12;;4558:103;:::o;4900:109::-;4987:15;;4900:109;:::o;2861:327::-;2963:7;3040:8;3066:4;3088:7;3113:13;:11;:13::i;:::-;3012:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3152:4;3012:159;;;;;;;;;;;;;;;;;;;;;;;;2989:192;;;;;;2861:327;-1:-1:-1;;;;2861:327:2:o;3147:155:8:-;3205:7;3237:1;3232;:6;;3224:49;;;;;-1:-1:-1;;;3224:49:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3290:5:8;;;3147:155::o;737:413:18:-;1097:20;1135:8;;;737:413::o;759:64:19:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1794:14;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1790:66;759:64:19;:::o;2274:178:10:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;2381:13:10;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;2404:17:10;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;2431:9:10::1;:14:::0;;-1:-1:-1;;2431:14:10::1;2443:2;2431:14;::::0;;1790:66:9;;;;-1:-1:-1;;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;-1:-1:-1;2274:178:10:o;2317:292:2:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;2445:22:2;;::::1;::::0;;::::1;::::0;;;;2501:25;;;;::::1;::::0;;;;2536:12:::1;:25:::0;;;;2571:15:::1;:31:::0;1790:66:9;;;;-1:-1:-1;;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;-1:-1:-1;2317:292:2:o;1615:210:3:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1723:95:3::1;1704:16;:114:::0;1790:66:9;;;;-1:-1:-1;;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;1615:210:3:o;4002:320:2:-;4297:9;;4272:44::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "1564000",
                "executionCost": "1638",
                "totalCost": "1565638"
              },
              "external": {
                "DOMAIN_SEPARATOR()": "infinite",
                "allowance(address,address)": "1316",
                "approve(address,uint256)": "infinite",
                "balanceOf(address)": "1165",
                "controller()": "1147",
                "controllerBurn(address,uint256)": "infinite",
                "controllerBurnFrom(address,address,uint256)": "infinite",
                "controllerMint(address,uint256)": "infinite",
                "decimals()": "1036",
                "decreaseAllowance(address,uint256)": "infinite",
                "increaseAllowance(address,uint256)": "infinite",
                "initialize(string,string,uint8,address)": "infinite",
                "name()": "infinite",
                "nonces(address)": "1227",
                "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": "infinite",
                "symbol()": "infinite",
                "totalSupply()": "1066",
                "transfer(address,uint256)": "infinite",
                "transferFrom(address,address,uint256)": "infinite"
              },
              "internal": {
                "_beforeTokenTransfer(address,address,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {
              "DOMAIN_SEPARATOR()": "3644e515",
              "allowance(address,address)": "dd62ed3e",
              "approve(address,uint256)": "095ea7b3",
              "balanceOf(address)": "70a08231",
              "controller()": "f77c4791",
              "controllerBurn(address,uint256)": "90596dd1",
              "controllerBurnFrom(address,address,uint256)": "631b5dfb",
              "controllerMint(address,uint256)": "5d7b0758",
              "decimals()": "313ce567",
              "decreaseAllowance(address,uint256)": "a457c2d7",
              "increaseAllowance(address,uint256)": "39509351",
              "initialize(string,string,uint8,address)": "de7ea79d",
              "name()": "06fdde03",
              "nonces(address)": "7ecebe00",
              "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": "d505accf",
              "symbol()": "95d89b41",
              "totalSupply()": "18160ddd",
              "transfer(address,uint256)": "a9059cbb",
              "transferFrom(address,address,uint256)": "23b872dd"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"contract TokenControllerInterface\",\"name\":\"_controller\",\"type\":\"address\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"controller\",\"outputs\":[{\"internalType\":\"contract TokenControllerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"controllerBurn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"controllerBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"controllerMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"},{\"internalType\":\"contract TokenControllerInterface\",\"name\":\"_controller\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Initialized(string,string,uint8,address)\":{\"details\":\"Emitted when an instance is initialized\"}},\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"controllerBurn(address,uint256)\":{\"details\":\"May be overridden to provide more granular control over burning\",\"params\":{\"_amount\":\"Amount of tokens to burn\",\"_user\":\"Address of the holder account to burn tokens from\"}},\"controllerBurnFrom(address,address,uint256)\":{\"details\":\"May be overridden to provide more granular control over operator-burning\",\"params\":{\"_amount\":\"Amount of tokens to burn\",\"_operator\":\"Address of the operator performing the burn action via the controller contract\",\"_user\":\"Address of the holder account to burn tokens from\"}},\"controllerMint(address,uint256)\":{\"details\":\"May be overridden to provide more granular control over minting\",\"params\":{\"_amount\":\"Amount of tokens to mint\",\"_user\":\"Address of the receiver of the minted tokens\"}},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is called. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"initialize(string,string,uint8,address)\":{\"params\":{\"_controller\":\"Address of the Controller contract for minting & burning\",\"_decimals\":\"The number of decimals for the Token\",\"_name\":\"The name of the Token\",\"_symbol\":\"The symbol for the Token\"}},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`.\"}},\"title\":\"Controlled ERC20 Token\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"controller()\":{\"notice\":\"Interface to the contract responsible for controlling mint/burn\"},\"controllerBurn(address,uint256)\":{\"notice\":\"Allows the controller to burn tokens from a user account\"},\"controllerBurnFrom(address,address,uint256)\":{\"notice\":\"Allows an operator via the controller to burn tokens on behalf of a user account\"},\"controllerMint(address,uint256)\":{\"notice\":\"Allows the controller to mint tokens for a user account\"},\"initialize(string,string,uint8,address)\":{\"notice\":\"Initializes the Controlled Token with Token Details and the Controller\"}},\"notice\":\"ERC20 Tokens with a controller for minting & burning\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ControlledToken.sol\":\"ControlledToken\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/token/ControlledToken.sol:ControlledToken",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/token/ControlledToken.sol:ControlledToken",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/token/ControlledToken.sol:ControlledToken",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 1372,
                "contract": "contracts/token/ControlledToken.sol:ControlledToken",
                "label": "_balances",
                "offset": 0,
                "slot": "51",
                "type": "t_mapping(t_address,t_uint256)"
              },
              {
                "astId": 1378,
                "contract": "contracts/token/ControlledToken.sol:ControlledToken",
                "label": "_allowances",
                "offset": 0,
                "slot": "52",
                "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
              },
              {
                "astId": 1380,
                "contract": "contracts/token/ControlledToken.sol:ControlledToken",
                "label": "_totalSupply",
                "offset": 0,
                "slot": "53",
                "type": "t_uint256"
              },
              {
                "astId": 1382,
                "contract": "contracts/token/ControlledToken.sol:ControlledToken",
                "label": "_name",
                "offset": 0,
                "slot": "54",
                "type": "t_string_storage"
              },
              {
                "astId": 1384,
                "contract": "contracts/token/ControlledToken.sol:ControlledToken",
                "label": "_symbol",
                "offset": 0,
                "slot": "55",
                "type": "t_string_storage"
              },
              {
                "astId": 1386,
                "contract": "contracts/token/ControlledToken.sol:ControlledToken",
                "label": "_decimals",
                "offset": 0,
                "slot": "56",
                "type": "t_uint8"
              },
              {
                "astId": 1881,
                "contract": "contracts/token/ControlledToken.sol:ControlledToken",
                "label": "__gap",
                "offset": 0,
                "slot": "57",
                "type": "t_array(t_uint256)44_storage"
              },
              {
                "astId": 254,
                "contract": "contracts/token/ControlledToken.sol:ControlledToken",
                "label": "_HASHED_NAME",
                "offset": 0,
                "slot": "101",
                "type": "t_bytes32"
              },
              {
                "astId": 256,
                "contract": "contracts/token/ControlledToken.sol:ControlledToken",
                "label": "_HASHED_VERSION",
                "offset": 0,
                "slot": "102",
                "type": "t_bytes32"
              },
              {
                "astId": 405,
                "contract": "contracts/token/ControlledToken.sol:ControlledToken",
                "label": "__gap",
                "offset": 0,
                "slot": "103",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 430,
                "contract": "contracts/token/ControlledToken.sol:ControlledToken",
                "label": "_nonces",
                "offset": 0,
                "slot": "153",
                "type": "t_mapping(t_address,t_struct(Counter)3637_storage)"
              },
              {
                "astId": 432,
                "contract": "contracts/token/ControlledToken.sol:ControlledToken",
                "label": "_PERMIT_TYPEHASH",
                "offset": 0,
                "slot": "154",
                "type": "t_bytes32"
              },
              {
                "astId": 579,
                "contract": "contracts/token/ControlledToken.sol:ControlledToken",
                "label": "__gap",
                "offset": 0,
                "slot": "155",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 15646,
                "contract": "contracts/token/ControlledToken.sol:ControlledToken",
                "label": "controller",
                "offset": 0,
                "slot": "204",
                "type": "t_contract(TokenControllerInterface)16206"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_uint256)44_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[44]",
                "numberOfBytes": "1408"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_bytes32": {
                "encoding": "inplace",
                "label": "bytes32",
                "numberOfBytes": "32"
              },
              "t_contract(TokenControllerInterface)16206": {
                "encoding": "inplace",
                "label": "contract TokenControllerInterface",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_mapping(t_address,t_uint256))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => uint256))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_uint256)"
              },
              "t_mapping(t_address,t_struct(Counter)3637_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct CountersUpgradeable.Counter)",
                "numberOfBytes": "32",
                "value": "t_struct(Counter)3637_storage"
              },
              "t_mapping(t_address,t_uint256)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => uint256)",
                "numberOfBytes": "32",
                "value": "t_uint256"
              },
              "t_string_storage": {
                "encoding": "bytes",
                "label": "string",
                "numberOfBytes": "32"
              },
              "t_struct(Counter)3637_storage": {
                "encoding": "inplace",
                "label": "struct CountersUpgradeable.Counter",
                "members": [
                  {
                    "astId": 3636,
                    "contract": "contracts/token/ControlledToken.sol:ControlledToken",
                    "label": "_value",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint256"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint8": {
                "encoding": "inplace",
                "label": "uint8",
                "numberOfBytes": "1"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "controller()": {
                "notice": "Interface to the contract responsible for controlling mint/burn"
              },
              "controllerBurn(address,uint256)": {
                "notice": "Allows the controller to burn tokens from a user account"
              },
              "controllerBurnFrom(address,address,uint256)": {
                "notice": "Allows an operator via the controller to burn tokens on behalf of a user account"
              },
              "controllerMint(address,uint256)": {
                "notice": "Allows the controller to mint tokens for a user account"
              },
              "initialize(string,string,uint8,address)": {
                "notice": "Initializes the Controlled Token with Token Details and the Controller"
              }
            },
            "notice": "ERC20 Tokens with a controller for minting & burning",
            "version": 1
          }
        }
      },
      "contracts/token/ControlledTokenInterface.sol": {
        "ControlledTokenInterface": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Approval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Transfer",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                }
              ],
              "name": "allowance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "approve",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "controller",
              "outputs": [
                {
                  "internalType": "contract TokenControllerInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_user",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_amount",
                  "type": "uint256"
                }
              ],
              "name": "controllerBurn",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_operator",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "_user",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_amount",
                  "type": "uint256"
                }
              ],
              "name": "controllerBurnFrom",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_user",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_amount",
                  "type": "uint256"
                }
              ],
              "name": "controllerMint",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transfer",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "sender",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transferFrom",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "allowance(address,address)": {
                "details": "Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."
              },
              "approve(address,uint256)": {
                "details": "Sets `amount` as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event."
              },
              "balanceOf(address)": {
                "details": "Returns the amount of tokens owned by `account`."
              },
              "controllerBurn(address,uint256)": {
                "details": "May be overridden to provide more granular control over burning",
                "params": {
                  "_amount": "Amount of tokens to burn",
                  "_user": "Address of the holder account to burn tokens from"
                }
              },
              "controllerBurnFrom(address,address,uint256)": {
                "details": "May be overridden to provide more granular control over operator-burning",
                "params": {
                  "_amount": "Amount of tokens to burn",
                  "_operator": "Address of the operator performing the burn action via the controller contract",
                  "_user": "Address of the holder account to burn tokens from"
                }
              },
              "controllerMint(address,uint256)": {
                "details": "May be overridden to provide more granular control over minting",
                "params": {
                  "_amount": "Amount of tokens to mint",
                  "_user": "Address of the receiver of the minted tokens"
                }
              },
              "totalSupply()": {
                "details": "Returns the amount of tokens in existence."
              },
              "transfer(address,uint256)": {
                "details": "Moves `amount` tokens from the caller's account to `recipient`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."
              },
              "transferFrom(address,address,uint256)": {
                "details": "Moves `amount` tokens from `sender` to `recipient` using the allowance mechanism. `amount` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."
              }
            },
            "title": "Controlled ERC20 Token",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "allowance(address,address)": "dd62ed3e",
              "approve(address,uint256)": "095ea7b3",
              "balanceOf(address)": "70a08231",
              "controller()": "f77c4791",
              "controllerBurn(address,uint256)": "90596dd1",
              "controllerBurnFrom(address,address,uint256)": "631b5dfb",
              "controllerMint(address,uint256)": "5d7b0758",
              "totalSupply()": "18160ddd",
              "transfer(address,uint256)": "a9059cbb",
              "transferFrom(address,address,uint256)": "23b872dd"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"controller\",\"outputs\":[{\"internalType\":\"contract TokenControllerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"controllerBurn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"controllerBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"controllerMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.\"},\"approve(address,uint256)\":{\"details\":\"Sets `amount` as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the amount of tokens owned by `account`.\"},\"controllerBurn(address,uint256)\":{\"details\":\"May be overridden to provide more granular control over burning\",\"params\":{\"_amount\":\"Amount of tokens to burn\",\"_user\":\"Address of the holder account to burn tokens from\"}},\"controllerBurnFrom(address,address,uint256)\":{\"details\":\"May be overridden to provide more granular control over operator-burning\",\"params\":{\"_amount\":\"Amount of tokens to burn\",\"_operator\":\"Address of the operator performing the burn action via the controller contract\",\"_user\":\"Address of the holder account to burn tokens from\"}},\"controllerMint(address,uint256)\":{\"details\":\"May be overridden to provide more granular control over minting\",\"params\":{\"_amount\":\"Amount of tokens to mint\",\"_user\":\"Address of the receiver of the minted tokens\"}},\"totalSupply()\":{\"details\":\"Returns the amount of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves `amount` tokens from the caller's account to `recipient`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Moves `amount` tokens from `sender` to `recipient` using the allowance mechanism. `amount` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"}},\"title\":\"Controlled ERC20 Token\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"controller()\":{\"notice\":\"Interface to the contract responsible for controlling mint/burn\"},\"controllerBurn(address,uint256)\":{\"notice\":\"Allows the controller to burn tokens from a user account\"},\"controllerBurnFrom(address,address,uint256)\":{\"notice\":\"Allows an operator via the controller to burn tokens on behalf of a user account\"},\"controllerMint(address,uint256)\":{\"notice\":\"Allows the controller to mint tokens for a user account\"}},\"notice\":\"ERC20 Tokens with a controller for minting & burning\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ControlledTokenInterface.sol\":\"ControlledTokenInterface\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "controller()": {
                "notice": "Interface to the contract responsible for controlling mint/burn"
              },
              "controllerBurn(address,uint256)": {
                "notice": "Allows the controller to burn tokens from a user account"
              },
              "controllerBurnFrom(address,address,uint256)": {
                "notice": "Allows an operator via the controller to burn tokens on behalf of a user account"
              },
              "controllerMint(address,uint256)": {
                "notice": "Allows the controller to mint tokens for a user account"
              }
            },
            "notice": "ERC20 Tokens with a controller for minting & burning",
            "version": 1
          }
        }
      },
      "contracts/token/ControlledTokenProxyFactory.sol": {
        "ControlledTokenProxyFactory": {
          "abi": [
            {
              "inputs": [],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "name": "ProxyCreated",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "create",
              "outputs": [
                {
                  "internalType": "contract ControlledToken",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_logic",
                  "type": "address"
                },
                {
                  "internalType": "bytes",
                  "name": "_data",
                  "type": "bytes"
                }
              ],
              "name": "deployMinimal",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "instance",
              "outputs": [
                {
                  "internalType": "contract ControlledToken",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "create()": {
                "returns": {
                  "_0": "A reference to the new proxied Controlled ERC20 Token"
                }
              }
            },
            "title": "Controlled ERC20 Token Factory",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5060405161001d9061005f565b604051809103906000f080158015610039573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b039290921691909117905561006c565b611eac806103b283390190565b6103378061007b6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063022ec09514610046578063b3eeb5e21461006a578063efc81a8c14610120575b600080fd5b61004e610128565b604080516001600160a01b039092168252519081900360200190f35b61004e6004803603604081101561008057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100ab57600080fd5b8201836020820111156100bd57600080fd5b803590602001918460018302840111640100000000831117156100df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610137945050505050565b61004e6102b3565b6000546001600160a01b031681565b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a18251156102ac576000826001600160a01b0316846040518082805190602001908083835b602083106102035780518252601f1990920191602091820191016101e4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610265576040519150601f19603f3d011682016040523d82523d6000602084013e61026a565b606091505b50509050806102aa5760405162461bcd60e51b81526004018080602001828103825260248152602001806102de6024913960400191505060405180910390fd5b505b5092915050565b6000805460408051602081019091528281526102d8916001600160a01b031690610137565b90509056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a2646970667358221220077150a22fa3dafe7ec6f9077b5cb47ff7e368738b58d18c44939a97cbe245e764736f6c634300060c0033608060405234801561001057600080fd5b50611e8c806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806370a08231116100ad578063a9059cbb11610071578063a9059cbb14610395578063d505accf146103c1578063dd62ed3e14610412578063de7ea79d14610440578063f77c47911461057e57610121565b806370a08231146102e95780637ecebe001461030f57806390596dd11461033557806395d89b4114610361578063a457c2d71461036957610121565b8063313ce567116100f4578063313ce567146102335780633644e5151461025157806339509351146102595780635d7b075814610285578063631b5dfb146102b357610121565b806306fdde0314610126578063095ea7b3146101a357806318160ddd146101e357806323b872dd146101fd575b600080fd5b61012e6105a2565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610168578181015183820152602001610150565b50505050905090810190601f1680156101955780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101cf600480360360408110156101b957600080fd5b506001600160a01b038135169060200135610638565b604080519115158252519081900360200190f35b6101eb610655565b60408051918252519081900360200190f35b6101cf6004803603606081101561021357600080fd5b506001600160a01b0381358116916020810135909116906040013561065b565b61023b6106e2565b6040805160ff9092168252519081900360200190f35b6101eb6106eb565b6101cf6004803603604081101561026f57600080fd5b506001600160a01b0381351690602001356106fa565b6102b16004803603604081101561029b57600080fd5b506001600160a01b038135169060200135610748565b005b6102b1600480360360608110156102c957600080fd5b506001600160a01b038135811691602081013590911690604001356107c5565b6101eb600480360360208110156102ff57600080fd5b50356001600160a01b031661089b565b6101eb6004803603602081101561032557600080fd5b50356001600160a01b03166108b6565b6102b16004803603604081101561034b57600080fd5b506001600160a01b0381351690602001356108dd565b61012e610956565b6101cf6004803603604081101561037f57600080fd5b506001600160a01b0381351690602001356109b7565b6101cf600480360360408110156103ab57600080fd5b506001600160a01b038135169060200135610a1f565b6102b1600480360360e08110156103d757600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610a33565b6101eb6004803603604081101561042857600080fd5b506001600160a01b0381358116916020013516610bd6565b6102b16004803603608081101561045657600080fd5b81019060208101813564010000000081111561047157600080fd5b82018360208201111561048357600080fd5b803590602001918460018302840111640100000000831117156104a557600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156104f857600080fd5b82018360208201111561050a57600080fd5b8035906020019184600183028401116401000000008311171561052c57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050813560ff16925050602001356001600160a01b0316610c01565b610586610e74565b604080516001600160a01b039092168252519081900360200190f35b60368054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561062e5780601f106106035761010080835404028352916020019161062e565b820191906000526020600020905b81548152906001019060200180831161061157829003601f168201915b5050505050905090565b600061064c610645610e83565b8484610e87565b50600192915050565b60355490565b6000610668848484610f73565b6106d884610674610e83565b6106d385604051806060016040528060288152602001611d5c602891396001600160a01b038a166000908152603460205260408120906106b2610e83565b6001600160a01b0316815260208101919091526040016000205491906110d0565b610e87565b5060019392505050565b60385460ff1690565b60006106f5611167565b905090565b600061064c610707610e83565b846106d38560346000610718610e83565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906111a2565b60cc546001600160a01b031661075c610e83565b6001600160a01b0316146107b7576040805162461bcd60e51b815260206004820152601f60248201527f436f6e74726f6c6c6564546f6b656e2f6f6e6c792d636f6e74726f6c6c657200604482015290519081900360640190fd5b6107c18282611203565b5050565b60cc546001600160a01b03166107d9610e83565b6001600160a01b031614610834576040805162461bcd60e51b815260206004820152601f60248201527f436f6e74726f6c6c6564546f6b656e2f6f6e6c792d636f6e74726f6c6c657200604482015290519081900360640190fd5b816001600160a01b0316836001600160a01b03161461088c57600061087d82604051806060016040528060218152602001611d84602191396108768688610bd6565b91906110d0565b905061088a838583610e87565b505b61089682826112f5565b505050565b6001600160a01b031660009081526033602052604090205490565b6001600160a01b03811660009081526099602052604081206108d7906113f1565b92915050565b60cc546001600160a01b03166108f1610e83565b6001600160a01b03161461094c576040805162461bcd60e51b815260206004820152601f60248201527f436f6e74726f6c6c6564546f6b656e2f6f6e6c792d636f6e74726f6c6c657200604482015290519081900360640190fd5b6107c182826112f5565b60378054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561062e5780601f106106035761010080835404028352916020019161062e565b600061064c6109c4610e83565b846106d385604051806060016040528060258152602001611e3260259139603460006109ee610e83565b6001600160a01b03908116825260208083019390935260409182016000908120918d168152925290205491906110d0565b600061064c610a2c610e83565b8484610f73565b83421115610a88576040805162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015290519081900360640190fd5b6000609a54888888610abd609960008e6001600160a01b03166001600160a01b031681526020019081526020016000206113f1565b8960405160200180878152602001866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200182815260200196505050505050506040516020818303038152906040528051906020012090506000610b26826113f5565b90506000610b3682878787611441565b9050896001600160a01b0316816001600160a01b031614610b9e576040805162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b6001600160a01b038a166000908152609960205260409020610bbf906115bf565b610bca8a8a8a610e87565b50505050505050505050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b600054610100900460ff1680610c1a5750610c1a6115c8565b80610c28575060005460ff16155b610c635760405162461bcd60e51b815260040180806020018281038252602e815260200180611d0c602e913960400191505060405180910390fd5b600054610100900460ff16158015610c8e576000805460ff1961ff0019909116610100171660011790555b6001600160a01b038216610cd35760405162461bcd60e51b8152600401808060200182810382526023815260200180611e0f6023913960400191505060405180910390fd5b610cdd85856115d9565b610d1b6040518060400160405280601c81526020017f506f6f6c546f67657468657220436f6e74726f6c6c6564546f6b656e0000000081525061168e565b60cc80546001600160a01b0319166001600160a01b038416179055610d3f83611764565b7f41bc1176d7b9b7bc036f385a7e5b08b0662a7afa0844af8a599ad431150227e1858585856040518080602001806020018560ff168152602001846001600160a01b03168152602001838103835287818151815260200191508051906020019080838360005b83811015610dbd578181015183820152602001610da5565b50505050905090810190601f168015610dea5780820380516001836020036101000a031916815260200191505b50838103825286518152865160209182019188019080838360005b83811015610e1d578181015183820152602001610e05565b50505050905090810190601f168015610e4a5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a18015610e6d576000805461ff00191690555b5050505050565b60cc546001600160a01b031681565b3390565b6001600160a01b038316610ecc5760405162461bcd60e51b8152600401808060200182810382526024815260200180611deb6024913960400191505060405180910390fd5b6001600160a01b038216610f115760405162461bcd60e51b8152600401808060200182810382526022815260200180611ca26022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610fb85760405162461bcd60e51b8152600401808060200182810382526025815260200180611dc66025913960400191505060405180910390fd5b6001600160a01b038216610ffd5760405162461bcd60e51b8152600401808060200182810382526023815260200180611c5d6023913960400191505060405180910390fd5b61100883838361177a565b61104581604051806060016040528060268152602001611cc4602691396001600160a01b03861660009081526033602052604090205491906110d0565b6001600160a01b03808516600090815260336020526040808220939093559084168152205461107490826111a2565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561115f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561112457818101518382015260200161110c565b50505050905090810190601f1680156111515780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60006106f57f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6111956117f4565b61119d6117fa565b611800565b6000828201838110156111fc576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b03821661125e576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61126a6000838361177a565b60355461127790826111a2565b6035556001600160a01b03821660009081526033602052604090205461129d90826111a2565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b03821661133a5760405162461bcd60e51b8152600401808060200182810382526021815260200180611da56021913960400191505060405180910390fd5b6113468260008361177a565b61138381604051806060016040528060228152602001611c80602291396001600160a01b03851660009081526033602052604090205491906110d0565b6001600160a01b0383166000908152603360205260409020556035546113a99082611862565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b5490565b60006113ff611167565b82604051602001808061190160f01b81525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156114a25760405162461bcd60e51b8152600401808060200182810382526022815260200180611cea6022913960400191505060405180910390fd5b8360ff16601b14806114b757508360ff16601c145b6114f25760405162461bcd60e51b8152600401808060200182810382526022815260200180611d3a6022913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561154e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166115b6576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b95945050505050565b80546001019055565b60006115d3306118bf565b15905090565b600054610100900460ff16806115f257506115f26115c8565b80611600575060005460ff16155b61163b5760405162461bcd60e51b815260040180806020018281038252602e815260200180611d0c602e913960400191505060405180910390fd5b600054610100900460ff16158015611666576000805460ff1961ff0019909116610100171660011790555b61166e6118c5565b6116788383611967565b8015610896576000805461ff0019169055505050565b600054610100900460ff16806116a757506116a76115c8565b806116b5575060005460ff16155b6116f05760405162461bcd60e51b815260040180806020018281038252602e815260200180611d0c602e913960400191505060405180910390fd5b600054610100900460ff1615801561171b576000805460ff1961ff0019909116610100171660011790555b6117236118c5565b61174682604051806040016040528060018152602001603160f81b815250611a3f565b61174f82611aff565b80156107c1576000805461ff00191690555050565b6038805460ff191660ff92909216919091179055565b60cc5460408051637cbab1c760e01b81526001600160a01b03868116600483015285811660248301526044820185905291519190921691637cbab1c791606480830192600092919082900301818387803b1580156117d757600080fd5b505af11580156117eb573d6000803e3d6000fd5b50505050505050565b60655490565b60665490565b600083838361180d611bc5565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b03168152602001955050505050506040516020818303038152906040528051906020012090509392505050565b6000828211156118b9576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b3b151590565b600054610100900460ff16806118de57506118de6115c8565b806118ec575060005460ff16155b6119275760405162461bcd60e51b815260040180806020018281038252602e815260200180611d0c602e913960400191505060405180910390fd5b600054610100900460ff16158015611952576000805460ff1961ff0019909116610100171660011790555b8015611964576000805461ff00191690555b50565b600054610100900460ff168061198057506119806115c8565b8061198e575060005460ff16155b6119c95760405162461bcd60e51b815260040180806020018281038252602e815260200180611d0c602e913960400191505060405180910390fd5b600054610100900460ff161580156119f4576000805460ff1961ff0019909116610100171660011790555b8251611a07906036906020860190611bc9565b508151611a1b906037906020850190611bc9565b506038805460ff191660121790558015610896576000805461ff0019169055505050565b600054610100900460ff1680611a585750611a586115c8565b80611a66575060005460ff16155b611aa15760405162461bcd60e51b815260040180806020018281038252602e815260200180611d0c602e913960400191505060405180910390fd5b600054610100900460ff16158015611acc576000805460ff1961ff0019909116610100171660011790555b82516020808501919091208351918401919091206065919091556066558015610896576000805461ff0019169055505050565b600054610100900460ff1680611b185750611b186115c8565b80611b26575060005460ff16155b611b615760405162461bcd60e51b815260040180806020018281038252602e815260200180611d0c602e913960400191505060405180910390fd5b600054610100900460ff16158015611b8c576000805460ff1961ff0019909116610100171660011790555b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9609a5580156107c1576000805461ff00191690555050565b4690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611c0a57805160ff1916838001178555611c37565b82800160010185558215611c37579182015b82811115611c37578251825591602001919060010190611c1c565b50611c43929150611c47565b5090565b5b80821115611c435760008155600101611c4856fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545434453413a20696e76616c6964207369676e6174757265202773272076616c7565496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656445434453413a20696e76616c6964207369676e6174757265202776272076616c756545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365436f6e74726f6c6c6564546f6b656e2f657863656564732d616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373436f6e74726f6c6c6564546f6b656e2f636f6e74726f6c6c65722d6e6f742d7a65726f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220d4c3e2aa538767119b3c10619b4d96ae68b6504b82292d8648426183c0aebbb664736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x1D SWAP1 PUSH2 0x5F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x39 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x6C JUMP JUMPDEST PUSH2 0x1EAC DUP1 PUSH2 0x3B2 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH2 0x337 DUP1 PUSH2 0x7B PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x22EC095 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x6A JUMPI DUP1 PUSH4 0xEFC81A8C EQ PUSH2 0x120 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x128 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x137 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x4E PUSH2 0x2B3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x265 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x26A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2DE PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE DUP3 DUP2 MSTORE PUSH2 0x2D8 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x137 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 SMOD PUSH18 0x50A22FA3DAFE7EC6F9077B5CB47FF7E36873 DUP12 PC 0xD1 DUP13 DIFFICULTY SWAP4 SWAP11 SWAP8 0xCB 0xE2 GASLIMIT 0xE7 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E8C DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x121 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x70A08231 GT PUSH2 0xAD JUMPI DUP1 PUSH4 0xA9059CBB GT PUSH2 0x71 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x395 JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x3C1 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x412 JUMPI DUP1 PUSH4 0xDE7EA79D EQ PUSH2 0x440 JUMPI DUP1 PUSH4 0xF77C4791 EQ PUSH2 0x57E JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2E9 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x30F JUMPI DUP1 PUSH4 0x90596DD1 EQ PUSH2 0x335 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x361 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x369 JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x313CE567 GT PUSH2 0xF4 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x233 JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x251 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x259 JUMPI DUP1 PUSH4 0x5D7B0758 EQ PUSH2 0x285 JUMPI DUP1 PUSH4 0x631B5DFB EQ PUSH2 0x2B3 JUMPI PUSH2 0x121 JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x126 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x1A3 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x1E3 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1FD JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x12E PUSH2 0x5A2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x168 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x150 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x195 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1CF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x638 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1EB PUSH2 0x655 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1CF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x213 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x65B JUMP JUMPDEST PUSH2 0x23B PUSH2 0x6E2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1EB PUSH2 0x6EB JUMP JUMPDEST PUSH2 0x1CF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x26F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x6FA JUMP JUMPDEST PUSH2 0x2B1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x29B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x748 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x2B1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x2C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x7C5 JUMP JUMPDEST PUSH2 0x1EB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x89B JUMP JUMPDEST PUSH2 0x1EB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x325 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x8B6 JUMP JUMPDEST PUSH2 0x2B1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x34B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x8DD JUMP JUMPDEST PUSH2 0x12E PUSH2 0x956 JUMP JUMPDEST PUSH2 0x1CF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x37F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x9B7 JUMP JUMPDEST PUSH2 0x1CF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0xA1F JUMP JUMPDEST PUSH2 0x2B1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0xE0 DUP2 LT ISZERO PUSH2 0x3D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0xFF PUSH1 0x80 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0xA0 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0xC0 ADD CALLDATALOAD PUSH2 0xA33 JUMP JUMPDEST PUSH2 0x1EB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x428 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xBD6 JUMP JUMPDEST PUSH2 0x2B1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x456 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x471 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x483 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x4A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 SWAP5 SWAP4 PUSH1 0x20 DUP2 ADD SWAP4 POP CALLDATALOAD SWAP2 POP POP PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x4F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x50A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x52C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP POP DUP2 CALLDATALOAD PUSH1 0xFF AND SWAP3 POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xC01 JUMP JUMPDEST PUSH2 0x586 PUSH2 0xE74 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x36 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x62E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x603 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x62E JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x611 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x64C PUSH2 0x645 PUSH2 0xE83 JUMP JUMPDEST DUP5 DUP5 PUSH2 0xE87 JUMP JUMPDEST POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x35 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x668 DUP5 DUP5 DUP5 PUSH2 0xF73 JUMP JUMPDEST PUSH2 0x6D8 DUP5 PUSH2 0x674 PUSH2 0xE83 JUMP JUMPDEST PUSH2 0x6D3 DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1D5C PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP1 PUSH2 0x6B2 PUSH2 0xE83 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x10D0 JUMP JUMPDEST PUSH2 0xE87 JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x38 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6F5 PUSH2 0x1167 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x64C PUSH2 0x707 PUSH2 0xE83 JUMP JUMPDEST DUP5 PUSH2 0x6D3 DUP6 PUSH1 0x34 PUSH1 0x0 PUSH2 0x718 PUSH2 0xE83 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP13 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP1 PUSH2 0x11A2 JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x75C PUSH2 0xE83 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x7B7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6E74726F6C6C6564546F6B656E2F6F6E6C792D636F6E74726F6C6C657200 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x7C1 DUP3 DUP3 PUSH2 0x1203 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x7D9 PUSH2 0xE83 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x834 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6E74726F6C6C6564546F6B656E2F6F6E6C792D636F6E74726F6C6C657200 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x88C JUMPI PUSH1 0x0 PUSH2 0x87D DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1D84 PUSH1 0x21 SWAP2 CODECOPY PUSH2 0x876 DUP7 DUP9 PUSH2 0xBD6 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x10D0 JUMP JUMPDEST SWAP1 POP PUSH2 0x88A DUP4 DUP6 DUP4 PUSH2 0xE87 JUMP JUMPDEST POP JUMPDEST PUSH2 0x896 DUP3 DUP3 PUSH2 0x12F5 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x99 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x8D7 SWAP1 PUSH2 0x13F1 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x8F1 PUSH2 0xE83 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x94C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6E74726F6C6C6564546F6B656E2F6F6E6C792D636F6E74726F6C6C657200 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x7C1 DUP3 DUP3 PUSH2 0x12F5 JUMP JUMPDEST PUSH1 0x37 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x62E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x603 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x62E JUMP JUMPDEST PUSH1 0x0 PUSH2 0x64C PUSH2 0x9C4 PUSH2 0xE83 JUMP JUMPDEST DUP5 PUSH2 0x6D3 DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1E32 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x34 PUSH1 0x0 PUSH2 0x9EE PUSH2 0xE83 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP14 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x10D0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x64C PUSH2 0xA2C PUSH2 0xE83 JUMP JUMPDEST DUP5 DUP5 PUSH2 0xF73 JUMP JUMPDEST DUP4 TIMESTAMP GT ISZERO PUSH2 0xA88 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305065726D69743A206578706972656420646561646C696E65000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x9A SLOAD DUP9 DUP9 DUP9 PUSH2 0xABD PUSH1 0x99 PUSH1 0x0 DUP15 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH2 0x13F1 JUMP JUMPDEST DUP10 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH2 0xB26 DUP3 PUSH2 0x13F5 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xB36 DUP3 DUP8 DUP8 DUP8 PUSH2 0x1441 JUMP JUMPDEST SWAP1 POP DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xB9E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305065726D69743A20696E76616C6964207369676E61747572650000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x99 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0xBBF SWAP1 PUSH2 0x15BF JUMP JUMPDEST PUSH2 0xBCA DUP11 DUP11 DUP11 PUSH2 0xE87 JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0xC1A JUMPI POP PUSH2 0xC1A PUSH2 0x15C8 JUMP JUMPDEST DUP1 PUSH2 0xC28 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0xC63 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D0C PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0xC8E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xCD3 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1E0F PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xCDD DUP6 DUP6 PUSH2 0x15D9 JUMP JUMPDEST PUSH2 0xD1B PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x506F6F6C546F67657468657220436F6E74726F6C6C6564546F6B656E00000000 DUP2 MSTORE POP PUSH2 0x168E JUMP JUMPDEST PUSH1 0xCC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND OR SWAP1 SSTORE PUSH2 0xD3F DUP4 PUSH2 0x1764 JUMP JUMPDEST PUSH32 0x41BC1176D7B9B7BC036F385A7E5B08B0662A7AFA0844AF8A599AD431150227E1 DUP6 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP8 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xDBD JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xDA5 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xDEA JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP4 DUP2 SUB DUP3 MSTORE DUP7 MLOAD DUP2 MSTORE DUP7 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP9 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xE1D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xE05 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xE4A JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP1 ISZERO PUSH2 0xE6D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0xECC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1DEB PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xF11 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1CA2 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE DUP2 MLOAD DUP6 DUP2 MSTORE SWAP2 MLOAD PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0xFB8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1DC6 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xFFD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1C5D PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1008 DUP4 DUP4 DUP4 PUSH2 0x177A JUMP JUMPDEST PUSH2 0x1045 DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1CC4 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x10D0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP5 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x1074 SWAP1 DUP3 PUSH2 0x11A2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 SWAP3 DUP8 AND SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP5 DUP5 GT ISZERO PUSH2 0x115F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1124 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x110C JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1151 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6F5 PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F PUSH2 0x1195 PUSH2 0x17F4 JUMP JUMPDEST PUSH2 0x119D PUSH2 0x17FA JUMP JUMPDEST PUSH2 0x1800 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x11FC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x125E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x126A PUSH1 0x0 DUP4 DUP4 PUSH2 0x177A JUMP JUMPDEST PUSH1 0x35 SLOAD PUSH2 0x1277 SWAP1 DUP3 PUSH2 0x11A2 JUMP JUMPDEST PUSH1 0x35 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x129D SWAP1 DUP3 PUSH2 0x11A2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP4 MLOAD DUP6 DUP2 MSTORE SWAP4 MLOAD SWAP3 SWAP4 SWAP2 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x133A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1DA5 PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1346 DUP3 PUSH1 0x0 DUP4 PUSH2 0x177A JUMP JUMPDEST PUSH2 0x1383 DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1C80 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x10D0 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x35 SLOAD PUSH2 0x13A9 SWAP1 DUP3 PUSH2 0x1862 JUMP JUMPDEST PUSH1 0x35 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x13FF PUSH2 0x1167 JUMP JUMPDEST DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH2 0x1901 PUSH1 0xF0 SHL DUP2 MSTORE POP PUSH1 0x2 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP3 GT ISZERO PUSH2 0x14A2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1CEA PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP4 PUSH1 0xFF AND PUSH1 0x1B EQ DUP1 PUSH2 0x14B7 JUMPI POP DUP4 PUSH1 0xFF AND PUSH1 0x1C EQ JUMPDEST PUSH2 0x14F2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D3A PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x154E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD SWAP2 POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x15B6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15D3 ADDRESS PUSH2 0x18BF JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x15F2 JUMPI POP PUSH2 0x15F2 PUSH2 0x15C8 JUMP JUMPDEST DUP1 PUSH2 0x1600 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x163B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D0C PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1666 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x166E PUSH2 0x18C5 JUMP JUMPDEST PUSH2 0x1678 DUP4 DUP4 PUSH2 0x1967 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x896 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x16A7 JUMPI POP PUSH2 0x16A7 PUSH2 0x15C8 JUMP JUMPDEST DUP1 PUSH2 0x16B5 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x16F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D0C PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x171B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x1723 PUSH2 0x18C5 JUMP JUMPDEST PUSH2 0x1746 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x31 PUSH1 0xF8 SHL DUP2 MSTORE POP PUSH2 0x1A3F JUMP JUMPDEST PUSH2 0x174F DUP3 PUSH2 0x1AFF JUMP JUMPDEST DUP1 ISZERO PUSH2 0x7C1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x38 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x7CBAB1C7 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP6 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP6 SWAP1 MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x7CBAB1C7 SWAP2 PUSH1 0x64 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x17D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x17EB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x65 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x66 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP4 DUP4 PUSH2 0x180D PUSH2 0x1BC5 JUMP JUMPDEST ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x18B9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x18DE JUMPI POP PUSH2 0x18DE PUSH2 0x15C8 JUMP JUMPDEST DUP1 PUSH2 0x18EC JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1927 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D0C PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1952 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP1 ISZERO PUSH2 0x1964 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1980 JUMPI POP PUSH2 0x1980 PUSH2 0x15C8 JUMP JUMPDEST DUP1 PUSH2 0x198E JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x19C9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D0C PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x19F4 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP3 MLOAD PUSH2 0x1A07 SWAP1 PUSH1 0x36 SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x1BC9 JUMP JUMPDEST POP DUP2 MLOAD PUSH2 0x1A1B SWAP1 PUSH1 0x37 SWAP1 PUSH1 0x20 DUP6 ADD SWAP1 PUSH2 0x1BC9 JUMP JUMPDEST POP PUSH1 0x38 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x12 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x896 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1A58 JUMPI POP PUSH2 0x1A58 PUSH2 0x15C8 JUMP JUMPDEST DUP1 PUSH2 0x1A66 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1AA1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D0C PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1ACC JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP3 MLOAD PUSH1 0x20 DUP1 DUP6 ADD SWAP2 SWAP1 SWAP2 KECCAK256 DUP4 MLOAD SWAP2 DUP5 ADD SWAP2 SWAP1 SWAP2 KECCAK256 PUSH1 0x65 SWAP2 SWAP1 SWAP2 SSTORE PUSH1 0x66 SSTORE DUP1 ISZERO PUSH2 0x896 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1B18 JUMPI POP PUSH2 0x1B18 PUSH2 0x15C8 JUMP JUMPDEST DUP1 PUSH2 0x1B26 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1B61 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1D0C PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1B8C JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 PUSH1 0x9A SSTORE DUP1 ISZERO PUSH2 0x7C1 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP JUMP JUMPDEST CHAINID SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x1C0A JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x1C37 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x1C37 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1C37 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x1C1C JUMP JUMPDEST POP PUSH2 0x1C43 SWAP3 SWAP2 POP PUSH2 0x1C47 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1C43 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1C48 JUMP INVALID GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220746F20746865207A65726F2061 PUSH5 0x6472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH3 0x75726E KECCAK256 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545524332 ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F766520746F20746865207A65726F20616464 PUSH19 0x65737345524332303A207472616E7366657220 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545434453 COINBASE GASPRICE KECCAK256 PUSH10 0x6E76616C696420736967 PUSH15 0x6174757265202773272076616C7565 0x49 PUSH15 0x697469616C697A61626C653A20636F PUSH15 0x747261637420697320616C72656164 PUSH26 0x20696E697469616C697A656445434453413A20696E76616C6964 KECCAK256 PUSH20 0x69676E6174757265202776272076616C75654552 NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220616D6F756E7420657863656564 PUSH20 0x20616C6C6F77616E6365436F6E74726F6C6C6564 SLOAD PUSH16 0x6B656E2F657863656564732D616C6C6F PUSH24 0x616E636545524332303A206275726E2066726F6D20746865 KECCAK256 PUSH27 0x65726F206164647265737345524332303A207472616E7366657220 PUSH7 0x726F6D20746865 KECCAK256 PUSH27 0x65726F206164647265737345524332303A20617070726F76652066 PUSH19 0x6F6D20746865207A65726F2061646472657373 NUMBER PUSH16 0x6E74726F6C6C6564546F6B656E2F636F PUSH15 0x74726F6C6C65722D6E6F742D7A6572 PUSH16 0x45524332303A20646563726561736564 KECCAK256 PUSH2 0x6C6C PUSH16 0x77616E63652062656C6F77207A65726F LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD4 0xC3 0xE2 0xAA MSTORE8 DUP8 PUSH8 0x119B3C10619B4D96 0xAE PUSH9 0xB6504B82292D864842 PUSH2 0x83C0 0xAE 0xBB 0xB6 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "264:590:90:-:0;;;504:65;;;;;;;;;;543:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;532:8:90;:32;;-1:-1:-1;;;;;;532:32:90;-1:-1:-1;;;;;532:32:90;;;;;;;;;;264:590;;;;;;;;;;:::o;:::-;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106100415760003560e01c8063022ec09514610046578063b3eeb5e21461006a578063efc81a8c14610120575b600080fd5b61004e610128565b604080516001600160a01b039092168252519081900360200190f35b61004e6004803603604081101561008057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100ab57600080fd5b8201836020820111156100bd57600080fd5b803590602001918460018302840111640100000000831117156100df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610137945050505050565b61004e6102b3565b6000546001600160a01b031681565b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a18251156102ac576000826001600160a01b0316846040518082805190602001908083835b602083106102035780518252601f1990920191602091820191016101e4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610265576040519150601f19603f3d011682016040523d82523d6000602084013e61026a565b606091505b50509050806102aa5760405162461bcd60e51b81526004018080602001828103825260248152602001806102de6024913960400191505060405180910390fd5b505b5092915050565b6000805460408051602081019091528281526102d8916001600160a01b031690610137565b90509056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a2646970667358221220077150a22fa3dafe7ec6f9077b5cb47ff7e368738b58d18c44939a97cbe245e764736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x22EC095 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x6A JUMPI DUP1 PUSH4 0xEFC81A8C EQ PUSH2 0x120 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x128 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x137 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x4E PUSH2 0x2B3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x265 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x26A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2DE PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE DUP3 DUP2 MSTORE PUSH2 0x2D8 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x137 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 SMOD PUSH18 0x50A22FA3DAFE7EC6F9077B5CB47FF7E36873 DUP12 PC 0xD1 DUP13 DIFFICULTY SWAP4 SWAP11 SWAP8 0xCB 0xE2 GASLIMIT 0xE7 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "264:590:90:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;383:31;;;:::i;:::-;;;;-1:-1:-1;;;;;383:31:90;;;;;;;;;;;;;;182:778:38;;;;;;;;;;;;;;;;-1:-1:-1;;;;;182:778:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;182:778:38;;-1:-1:-1;182:778:38;;-1:-1:-1;;;;;182:778:38:i;728:124:90:-;;;:::i;383:31::-;;;-1:-1:-1;;;;;383:31:90;;:::o;182:778:38:-;257:13;416:19;446:6;438:15;;416:37;;495:4;489:11;-1:-1:-1;;;514:5:38;507:81;620:11;613:4;606:5;602:16;595:37;-1:-1:-1;;;657:4:38;650:5;646:16;639:92;764:4;757:5;754:1;747:22;786:28;;;-1:-1:-1;;;;;786:28:38;;;;;;738:31;;-1:-1:-1;786:28:38;;-1:-1:-1;786:28:38;;;;;;;824:12;;:16;821:135;;851:12;868:5;-1:-1:-1;;;;;868:10:38;879:5;868:17;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;868:17:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;850:35;;;901:7;893:56;;;;-1:-1:-1;;;893:56:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;821:135;;182:778;;;;;:::o;728:124:90:-;764:15;832:8;;810:36;;;;;;;;;;;;;;-1:-1:-1;;;;;832:8:90;;810:13;:36::i;:::-;787:60;;728:124;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "164600",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "create()": "infinite",
                "deployMinimal(address,bytes)": "infinite",
                "instance()": "1015"
              }
            },
            "methodIdentifiers": {
              "create()": "efc81a8c",
              "deployMinimal(address,bytes)": "b3eeb5e2",
              "instance()": "022ec095"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"name\":\"ProxyCreated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract ControlledToken\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"deployMinimal\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"instance\",\"outputs\":[{\"internalType\":\"contract ControlledToken\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"create()\":{\"returns\":{\"_0\":\"A reference to the new proxied Controlled ERC20 Token\"}}},\"title\":\"Controlled ERC20 Token Factory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":\"Initializes the Factory with an instance of the Controlled ERC20 Token\",\"create()\":{\"notice\":\"Creates a new Controlled ERC20 Token as a proxy of the template instance\"},\"instance()\":{\"notice\":\"Contract template for deploying proxied tokens\"}},\"notice\":\"Minimal proxy pattern for creating new Controlled ERC20 Tokens\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/ControlledTokenProxyFactory.sol\":\"ControlledTokenProxyFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"contracts/external/openzeppelin/ProxyFactory.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\n// solium-disable security/no-inline-assembly\\n// solium-disable security/no-low-level-calls\\ncontract ProxyFactory {\\n\\n  event ProxyCreated(address proxy);\\n\\n  function deployMinimal(address _logic, bytes memory _data) public returns (address proxy) {\\n    // Adapted from https://github.com/optionality/clone-factory/blob/32782f82dfc5a00d103a7e61a17a5dedbd1e8e9d/contracts/CloneFactory.sol\\n    bytes20 targetBytes = bytes20(_logic);\\n    assembly {\\n      let clone := mload(0x40)\\n      mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n      mstore(add(clone, 0x14), targetBytes)\\n      mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n      proxy := create(0, clone, 0x37)\\n    }\\n\\n    emit ProxyCreated(address(proxy));\\n\\n    if(_data.length > 0) {\\n      (bool success,) = proxy.call(_data);\\n      require(success, \\\"ProxyFactory/constructor-call-failed\\\");\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0xf0422303985796fdd8bdf772ac8e34331e2e63006f657989cca010fa4776d735\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"./ControlledToken.sol\\\";\\nimport \\\"../external/openzeppelin/ProxyFactory.sol\\\";\\n\\n/// @title Controlled ERC20 Token Factory\\n/// @notice Minimal proxy pattern for creating new Controlled ERC20 Tokens\\ncontract ControlledTokenProxyFactory is ProxyFactory {\\n\\n  /// @notice Contract template for deploying proxied tokens\\n  ControlledToken public instance;\\n\\n  /// @notice Initializes the Factory with an instance of the Controlled ERC20 Token\\n  constructor () public {\\n    instance = new ControlledToken();\\n  }\\n\\n  /// @notice Creates a new Controlled ERC20 Token as a proxy of the template instance\\n  /// @return A reference to the new proxied Controlled ERC20 Token\\n  function create() external returns (ControlledToken) {\\n    return ControlledToken(deployMinimal(address(instance), \\\"\\\"));\\n  }\\n}\\n\",\"keccak256\":\"0x3872184d356e0bc4aadf034dbc8dccb454c00b7efdc8f4d0a96621702a9d5135\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 15860,
                "contract": "contracts/token/ControlledTokenProxyFactory.sol:ControlledTokenProxyFactory",
                "label": "instance",
                "offset": 0,
                "slot": "0",
                "type": "t_contract(ControlledToken)15810"
              }
            ],
            "types": {
              "t_contract(ControlledToken)15810": {
                "encoding": "inplace",
                "label": "contract ControlledToken",
                "numberOfBytes": "20"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "constructor": "Initializes the Factory with an instance of the Controlled ERC20 Token",
              "create()": {
                "notice": "Creates a new Controlled ERC20 Token as a proxy of the template instance"
              },
              "instance()": {
                "notice": "Contract template for deploying proxied tokens"
              }
            },
            "notice": "Minimal proxy pattern for creating new Controlled ERC20 Tokens",
            "version": 1
          }
        }
      },
      "contracts/token/Ticket.sol": {
        "Ticket": {
          "abi": [
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Approval",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "string",
                  "name": "_name",
                  "type": "string"
                },
                {
                  "indexed": false,
                  "internalType": "string",
                  "name": "_symbol",
                  "type": "string"
                },
                {
                  "indexed": false,
                  "internalType": "uint8",
                  "name": "_decimals",
                  "type": "uint8"
                },
                {
                  "indexed": false,
                  "internalType": "contract TokenControllerInterface",
                  "name": "_controller",
                  "type": "address"
                }
              ],
              "name": "Initialized",
              "type": "event"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "indexed": false,
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                }
              ],
              "name": "Transfer",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "DOMAIN_SEPARATOR",
              "outputs": [
                {
                  "internalType": "bytes32",
                  "name": "",
                  "type": "bytes32"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                }
              ],
              "name": "allowance",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "approve",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "account",
                  "type": "address"
                }
              ],
              "name": "balanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "user",
                  "type": "address"
                }
              ],
              "name": "chanceOf",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "controller",
              "outputs": [
                {
                  "internalType": "contract TokenControllerInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_user",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_amount",
                  "type": "uint256"
                }
              ],
              "name": "controllerBurn",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_operator",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "_user",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_amount",
                  "type": "uint256"
                }
              ],
              "name": "controllerBurnFrom",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_user",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "_amount",
                  "type": "uint256"
                }
              ],
              "name": "controllerMint",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "decimals",
              "outputs": [
                {
                  "internalType": "uint8",
                  "name": "",
                  "type": "uint8"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "subtractedValue",
                  "type": "uint256"
                }
              ],
              "name": "decreaseAllowance",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "randomNumber",
                  "type": "uint256"
                }
              ],
              "name": "draw",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "addedValue",
                  "type": "uint256"
                }
              ],
              "name": "increaseAllowance",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "string",
                  "name": "_name",
                  "type": "string"
                },
                {
                  "internalType": "string",
                  "name": "_symbol",
                  "type": "string"
                },
                {
                  "internalType": "uint8",
                  "name": "_decimals",
                  "type": "uint8"
                },
                {
                  "internalType": "contract TokenControllerInterface",
                  "name": "_controller",
                  "type": "address"
                }
              ],
              "name": "initialize",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "name",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                }
              ],
              "name": "nonces",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "owner",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "spender",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "value",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "deadline",
                  "type": "uint256"
                },
                {
                  "internalType": "uint8",
                  "name": "v",
                  "type": "uint8"
                },
                {
                  "internalType": "bytes32",
                  "name": "r",
                  "type": "bytes32"
                },
                {
                  "internalType": "bytes32",
                  "name": "s",
                  "type": "bytes32"
                }
              ],
              "name": "permit",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "symbol",
              "outputs": [
                {
                  "internalType": "string",
                  "name": "",
                  "type": "string"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "totalSupply",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transfer",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "sender",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "transferFrom",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "events": {
              "Initialized(string,string,uint8,address)": {
                "details": "Emitted when an instance is initialized"
              }
            },
            "kind": "dev",
            "methods": {
              "DOMAIN_SEPARATOR()": {
                "details": "See {IERC20Permit-DOMAIN_SEPARATOR}."
              },
              "allowance(address,address)": {
                "details": "See {IERC20-allowance}."
              },
              "approve(address,uint256)": {
                "details": "See {IERC20-approve}. Requirements: - `spender` cannot be the zero address."
              },
              "balanceOf(address)": {
                "details": "See {IERC20-balanceOf}."
              },
              "controllerBurn(address,uint256)": {
                "details": "May be overridden to provide more granular control over burning",
                "params": {
                  "_amount": "Amount of tokens to burn",
                  "_user": "Address of the holder account to burn tokens from"
                }
              },
              "controllerBurnFrom(address,address,uint256)": {
                "details": "May be overridden to provide more granular control over operator-burning",
                "params": {
                  "_amount": "Amount of tokens to burn",
                  "_operator": "Address of the operator performing the burn action via the controller contract",
                  "_user": "Address of the holder account to burn tokens from"
                }
              },
              "controllerMint(address,uint256)": {
                "details": "May be overridden to provide more granular control over minting",
                "params": {
                  "_amount": "Amount of tokens to mint",
                  "_user": "Address of the receiver of the minted tokens"
                }
              },
              "decimals()": {
                "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is called. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."
              },
              "decreaseAllowance(address,uint256)": {
                "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."
              },
              "draw(uint256)": {
                "params": {
                  "randomNumber": "The random number to use to select a user."
                },
                "returns": {
                  "_0": "The winner"
                }
              },
              "increaseAllowance(address,uint256)": {
                "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address."
              },
              "initialize(string,string,uint8,address)": {
                "params": {
                  "_controller": "Address of the Controller contract for minting & burning",
                  "_decimals": "The number of decimals for the Token",
                  "_name": "The name of the Token",
                  "_symbol": "The symbol for the Token"
                }
              },
              "name()": {
                "details": "Returns the name of the token."
              },
              "nonces(address)": {
                "details": "See {IERC20Permit-nonces}."
              },
              "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": {
                "details": "See {IERC20Permit-permit}."
              },
              "symbol()": {
                "details": "Returns the symbol of the token, usually a shorter version of the name."
              },
              "totalSupply()": {
                "details": "See {IERC20-totalSupply}."
              },
              "transfer(address,uint256)": {
                "details": "See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`."
              },
              "transferFrom(address,address,uint256)": {
                "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b506127b4806100206000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146103de578063a9059cbb1461040a578063d505accf14610436578063dd62ed3e14610487578063de7ea79d146104b5578063f77c4791146105f357610137565b806370a08231146103385780637ecebe001461035e578063885d194d1461038457806390596dd1146103aa57806395d89b41146103d657610137565b80633644e515116100ff5780633644e51514610267578063395093511461026f5780633b3041471461029b5780635d7b0758146102d4578063631b5dfb1461030257610137565b806306fdde031461013c578063095ea7b3146101b957806318160ddd146101f957806323b872dd14610213578063313ce56714610249575b600080fd5b6101446105fb565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561017e578181015183820152602001610166565b50505050905090810190601f1680156101ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101e5600480360360408110156101cf57600080fd5b506001600160a01b038135169060200135610691565b604080519115158252519081900360200190f35b6102016106ae565b60408051918252519081900360200190f35b6101e56004803603606081101561022957600080fd5b506001600160a01b038135811691602081013590911690604001356106b4565b61025161073b565b6040805160ff9092168252519081900360200190f35b610201610744565b6101e56004803603604081101561028557600080fd5b506001600160a01b038135169060200135610753565b6102b8600480360360208110156102b157600080fd5b50356107a1565b604080516001600160a01b039092168252519081900360200190f35b610300600480360360408110156102ea57600080fd5b506001600160a01b0381351690602001356107f0565b005b6103006004803603606081101561031857600080fd5b506001600160a01b0381358116916020810135909116906040013561086d565b6102016004803603602081101561034e57600080fd5b50356001600160a01b0316610943565b6102016004803603602081101561037457600080fd5b50356001600160a01b031661095e565b6102016004803603602081101561039a57600080fd5b50356001600160a01b0316610985565b610300600480360360408110156103c057600080fd5b506001600160a01b0381351690602001356109aa565b610144610a23565b6101e5600480360360408110156103f457600080fd5b506001600160a01b038135169060200135610a84565b6101e56004803603604081101561042057600080fd5b506001600160a01b038135169060200135610aec565b610300600480360360e081101561044c57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610b00565b6102016004803603604081101561049d57600080fd5b506001600160a01b0381358116916020013516610ca3565b610300600480360360808110156104cb57600080fd5b8101906020810181356401000000008111156104e657600080fd5b8201836020820111156104f857600080fd5b8035906020019184600183028401116401000000008311171561051a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561056d57600080fd5b82018360208201111561057f57600080fd5b803590602001918460018302840111640100000000831117156105a157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050813560ff16925050602001356001600160a01b0316610cce565b6102b8610f12565b60368054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106875780601f1061065c57610100808354040283529160200191610687565b820191906000526020600020905b81548152906001019060200180831161066a57829003601f168201915b5050505050905090565b60006106a561069e610f21565b8484610f25565b50600192915050565b60355490565b60006106c1848484611011565b610731846106cd610f21565b61072c85604051806060016040528060288152602001612684602891396001600160a01b038a1660009081526034602052604081209061070b610f21565b6001600160a01b03168152602081019190915260400160002054919061116e565b610f25565b5060019392505050565b60385460ff1690565b600061074e611205565b905090565b60006106a5610760610f21565b8461072c8560346000610771610f21565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611240565b6000806107ac6106ae565b90506000816107bd575060006107e9565b60006107c9858461129a565b90506107e560cd60008051602061266483398151915283611340565b9150505b9392505050565b60cc546001600160a01b0316610804610f21565b6001600160a01b03161461085f576040805162461bcd60e51b815260206004820152601f60248201527f436f6e74726f6c6c6564546f6b656e2f6f6e6c792d636f6e74726f6c6c657200604482015290519081900360640190fd5b6108698282611403565b5050565b60cc546001600160a01b0316610881610f21565b6001600160a01b0316146108dc576040805162461bcd60e51b815260206004820152601f60248201527f436f6e74726f6c6c6564546f6b656e2f6f6e6c792d636f6e74726f6c6c657200604482015290519081900360640190fd5b816001600160a01b0316836001600160a01b031614610934576000610925826040518060600160405280602181526020016126ac6021913961091e8688610ca3565b919061116e565b9050610932838583610f25565b505b61093e82826114f5565b505050565b6001600160a01b031660009081526033602052604090205490565b6001600160a01b038116600090815260996020526040812061097f906115f1565b92915050565b600061097f60cd6000805160206126648339815191526001600160a01b0385166115f5565b60cc546001600160a01b03166109be610f21565b6001600160a01b031614610a19576040805162461bcd60e51b815260206004820152601f60248201527f436f6e74726f6c6c6564546f6b656e2f6f6e6c792d636f6e74726f6c6c657200604482015290519081900360640190fd5b61086982826114f5565b60378054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106875780601f1061065c57610100808354040283529160200191610687565b60006106a5610a91610f21565b8461072c8560405180606001604052806025815260200161275a6025913960346000610abb610f21565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919061116e565b60006106a5610af9610f21565b8484611011565b83421115610b55576040805162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015290519081900360640190fd5b6000609a54888888610b8a609960008e6001600160a01b03166001600160a01b031681526020019081526020016000206115f1565b8960405160200180878152602001866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200182815260200196505050505050506040516020818303038152906040528051906020012090506000610bf382611645565b90506000610c0382878787611691565b9050896001600160a01b0316816001600160a01b031614610c6b576040805162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b6001600160a01b038a166000908152609960205260409020610c8c9061180f565b610c978a8a8a610f25565b50505050505050505050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b600054610100900460ff1680610ce75750610ce7611818565b80610cf5575060005460ff16155b610d305760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff16158015610d5b576000805460ff1961ff0019909116610100171660011790555b6001600160a01b038216610db6576040805162461bcd60e51b815260206004820152601a60248201527f5469636b65742f636f6e74726f6c6c65722d6e6f742d7a65726f000000000000604482015290519081900360640190fd5b610dc285858585611829565b610ddd60cd6000805160206126648339815191526005611967565b7f41bc1176d7b9b7bc036f385a7e5b08b0662a7afa0844af8a599ad431150227e1858585856040518080602001806020018560ff168152602001846001600160a01b03168152602001838103835287818151815260200191508051906020019080838360005b83811015610e5b578181015183820152602001610e43565b50505050905090810190601f168015610e885780820380516001836020036101000a031916815260200191505b50838103825286518152865160209182019188019080838360005b83811015610ebb578181015183820152602001610ea3565b50505050905090810190601f168015610ee85780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a18015610f0b576000805461ff00191690555b5050505050565b60cc546001600160a01b031681565b3390565b6001600160a01b038316610f6a5760405162461bcd60e51b81526004018080602001828103825260248152602001806127136024913960400191505060405180910390fd5b6001600160a01b038216610faf5760405162461bcd60e51b81526004018080602001828103825260228152602001806125aa6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166110565760405162461bcd60e51b81526004018080602001828103825260258152602001806126ee6025913960400191505060405180910390fd5b6001600160a01b03821661109b5760405162461bcd60e51b81526004018080602001828103825260238152602001806125656023913960400191505060405180910390fd5b6110a6838383611a73565b6110e3816040518060600160405280602681526020016125cc602691396001600160a01b038616600090815260336020526040902054919061116e565b6001600160a01b0380851660009081526033602052604080822093909355908416815220546111129082611240565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156111fd5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156111c25781810151838201526020016111aa565b50505050905090810190601f1680156111ef5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600061074e7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611233611b39565b61123b611b3f565b611b45565b6000828201838110156107e9576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008082116112e8576040805162461bcd60e51b8152602060048201526015602482015274155b9a599bdc9b54985b990bdb5a5b8b589bdd5b99605a1b604482015290519081900360640190fd5b60008283600003816112f657fe5b069050835b8181106113075761132d565b6040805160208082019390935281518082038401815290820190915280519101206112fb565b83818161133657fe5b0695945050505050565b600082815260208490526040812060028101805483918291829061136057fe5b9060005260206000200154858161137357fe5b0690505b60028301548354830260010110156113e85760015b835481116113e2576000818486600001540201905060008560020182815481106113b257fe5b906000526020600020015490508084106113d05780840393506113d8565b5092506113e2565b505060010161138c565b50611377565b50600090815260049091016020526040902054949350505050565b6001600160a01b03821661145e576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61146a60008383611a73565b6035546114779082611240565b6035556001600160a01b03821660009081526033602052604090205461149d9082611240565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b03821661153a5760405162461bcd60e51b81526004018080602001828103825260218152602001806126cd6021913960400191505060405180910390fd5b61154682600083611a73565b61158381604051806060016040528060228152602001612588602291396001600160a01b038516600090815260336020526040902054919061116e565b6001600160a01b0383166000908152603360205260409020556035546115a99082611ba7565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b5490565b600082815260208481526040808320848452600381019092528220548061161f576000925061163c565b81600201818154811061162e57fe5b906000526020600020015492505b50509392505050565b600061164f611205565b82604051602001808061190160f01b81525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156116f25760405162461bcd60e51b81526004018080602001828103825260228152602001806125f26022913960400191505060405180910390fd5b8360ff16601b148061170757508360ff16601c145b6117425760405162461bcd60e51b81526004018080602001828103825260228152602001806126426022913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561179e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611806576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b95945050505050565b80546001019055565b600061182330611c04565b15905090565b600054610100900460ff16806118425750611842611818565b80611850575060005460ff16155b61188b5760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff161580156118b6576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0382166118fb5760405162461bcd60e51b81526004018080602001828103825260238152602001806127376023913960400191505060405180910390fd5b6119058585611c0a565b6119436040518060400160405280601c81526020017f506f6f6c546f67657468657220436f6e74726f6c6c6564546f6b656e00000000815250611cbf565b60cc80546001600160a01b0319166001600160a01b038416179055610ddd83611d95565b60008281526020849052604090208054156119c0576040805162461bcd60e51b81526020600482015260146024820152732a3932b29030b63932b0b23c9032bc34b9ba399760611b604482015290519081900360640190fd5b60018211611a15576040805162461bcd60e51b815260206004820152601b60248201527f4b206d7573742062652067726561746572207468616e206f6e652e0000000000604482015290519081900360640190fd5b8181556040805160008152602081019182905251611a37916001840191612497565b506040805160008152602081019182905251611a57916002840191612497565b5060020180546001810182556000918252602082200155505050565b611a7e838383611dab565b816001600160a01b0316836001600160a01b03161415611a9d5761093e565b6001600160a01b03831615611ae9576000611ac182611abb86610943565b90611ba7565b9050611ae760cd600080516020612664833981519152836001600160a01b038816611e25565b505b6001600160a01b0382161561093e576000611b0d82611b0785610943565b90611240565b9050611b3360cd600080516020612664833981519152836001600160a01b038716611e25565b50505050565b60655490565b60665490565b6000838383611b52612109565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b03168152602001955050505050506040516020818303038152906040528051906020012090509392505050565b600082821115611bfe576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b3b151590565b600054610100900460ff1680611c235750611c23611818565b80611c31575060005460ff16155b611c6c5760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff16158015611c97576000805460ff1961ff0019909116610100171660011790555b611c9f61210d565b611ca983836121af565b801561093e576000805461ff0019169055505050565b600054610100900460ff1680611cd85750611cd8611818565b80611ce6575060005460ff16155b611d215760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff16158015611d4c576000805460ff1961ff0019909116610100171660011790555b611d5461210d565b611d7782604051806040016040528060018152602001603160f81b815250612287565b611d8082612347565b8015610869576000805461ff00191690555050565b6038805460ff191660ff92909216919091179055565b60cc5460408051637cbab1c760e01b81526001600160a01b03868116600483015285811660248301526044820185905291519190921691637cbab1c791606480830192600092919082900301818387803b158015611e0857600080fd5b505af1158015611e1c573d6000803e3d6000fd5b50505050505050565b600083815260208581526040808320848452600381019092529091205480611fbc578315611fb7576001820154611f23575060028101805460018082018355600092835260209092208101859055908114801590611e8f57508154600019820181611e8c57fe5b06155b15611f1e5781546000908281611ea157fe5b0460008181526004850160205260409020546002850180549293509091600185019190819085908110611ed057fe5b60009182526020808320909101548354600181018555938352818320909301929092559384526004860180825260408086208690558486526003880183528086208490559285529052909120555b611f84565b6001820180546000198101908110611f3757fe5b9060005260206000200154905081600101805480611f5157fe5b6001900381819060005260206000200160009055905583826002018281548110611f7757fe5b6000918252602090912001555b60008381526003830160209081526040808320849055838352600485019091529020839055611fb786868360018861240d565b612101565b8361204d576000826002018281548110611fd257fe5b906000526020600020015490506000836002018381548110611ff057fe5b6000918252602080832090910192909255600180860180549182018155825282822001849055858152600385018252604080822082905584825260048601909252908120819055612047908890889085908561240d565b50612101565b81600201818154811061205c57fe5b906000526020600020015484146121015760008483600201838154811061207f57fe5b9060005260206000200154111590506000816120b657858460020184815481106120a557fe5b9060005260206000200154036120d3565b8360020183815481106120c557fe5b906000526020600020015486035b9050858460020184815481106120e557fe5b6000918252602090912001556120fe888885858561240d565b50505b505050505050565b4690565b600054610100900460ff16806121265750612126611818565b80612134575060005460ff16155b61216f5760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff1615801561219a576000805460ff1961ff0019909116610100171660011790555b80156121ac576000805461ff00191690555b50565b600054610100900460ff16806121c857506121c8611818565b806121d6575060005460ff16155b6122115760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff1615801561223c576000805460ff1961ff0019909116610100171660011790555b825161224f9060369060208601906124e2565b5081516122639060379060208501906124e2565b506038805460ff19166012179055801561093e576000805461ff0019169055505050565b600054610100900460ff16806122a057506122a0611818565b806122ae575060005460ff16155b6122e95760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff16158015612314576000805460ff1961ff0019909116610100171660011790555b8251602080850191909120835191840191909120606591909155606655801561093e576000805461ff0019169055505050565b600054610100900460ff16806123605750612360611818565b8061236e575060005460ff16155b6123a95760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff161580156123d4576000805460ff1961ff0019909116610100171660011790555b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9609a558015610869576000805461ff00191690555050565b6000848152602086905260409020835b8015611e1c57815460001982018161243157fe5b0490508361245a578282600201828154811061244957fe5b906000526020600020015403612477565b8282600201828154811061246a57fe5b9060005260206000200154015b82600201828154811061248657fe5b60009182526020909120015561241d565b8280548282559060005260206000209081019282156124d2579160200282015b828111156124d25782518255916020019190600101906124b7565b506124de92915061254f565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061252357805160ff19168380011785556124d2565b828001600101855582156124d257918201828111156124d25782518255916020019190600101906124b7565b5b808211156124de576000815560010161255056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545434453413a20696e76616c6964207369676e6174757265202773272076616c7565496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656445434453413a20696e76616c6964207369676e6174757265202776272076616c7565af45c4fb9ef70911e5444b8eedce607366e494224d52e6feab07fbd62a53b26f45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365436f6e74726f6c6c6564546f6b656e2f657863656564732d616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373436f6e74726f6c6c6564546f6b656e2f636f6e74726f6c6c65722d6e6f742d7a65726f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220249ea71f3d53c945962821ae2787942e0997b146abdb205938e3ea4d4543472864736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x27B4 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x137 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x70A08231 GT PUSH2 0xB8 JUMPI DUP1 PUSH4 0xA457C2D7 GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x3DE JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x40A JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x436 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x487 JUMPI DUP1 PUSH4 0xDE7EA79D EQ PUSH2 0x4B5 JUMPI DUP1 PUSH4 0xF77C4791 EQ PUSH2 0x5F3 JUMPI PUSH2 0x137 JUMP JUMPDEST DUP1 PUSH4 0x70A08231 EQ PUSH2 0x338 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x35E JUMPI DUP1 PUSH4 0x885D194D EQ PUSH2 0x384 JUMPI DUP1 PUSH4 0x90596DD1 EQ PUSH2 0x3AA JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x3D6 JUMPI PUSH2 0x137 JUMP JUMPDEST DUP1 PUSH4 0x3644E515 GT PUSH2 0xFF JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x267 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x26F JUMPI DUP1 PUSH4 0x3B304147 EQ PUSH2 0x29B JUMPI DUP1 PUSH4 0x5D7B0758 EQ PUSH2 0x2D4 JUMPI DUP1 PUSH4 0x631B5DFB EQ PUSH2 0x302 JUMPI PUSH2 0x137 JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x13C JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x1B9 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x1F9 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x213 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x249 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x144 PUSH2 0x5FB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x17E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x166 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1AB JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1E5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x691 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x201 PUSH2 0x6AE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1E5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x229 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x6B4 JUMP JUMPDEST PUSH2 0x251 PUSH2 0x73B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x201 PUSH2 0x744 JUMP JUMPDEST PUSH2 0x1E5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x285 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x753 JUMP JUMPDEST PUSH2 0x2B8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x7A1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x300 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x2EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x7F0 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x300 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x318 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x86D JUMP JUMPDEST PUSH2 0x201 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x34E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x943 JUMP JUMPDEST PUSH2 0x201 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x374 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x95E JUMP JUMPDEST PUSH2 0x201 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x39A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x985 JUMP JUMPDEST PUSH2 0x300 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x9AA JUMP JUMPDEST PUSH2 0x144 PUSH2 0xA23 JUMP JUMPDEST PUSH2 0x1E5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0xA84 JUMP JUMPDEST PUSH2 0x1E5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x420 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0xAEC JUMP JUMPDEST PUSH2 0x300 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0xE0 DUP2 LT ISZERO PUSH2 0x44C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0xFF PUSH1 0x80 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0xA0 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0xC0 ADD CALLDATALOAD PUSH2 0xB00 JUMP JUMPDEST PUSH2 0x201 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x49D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xCA3 JUMP JUMPDEST PUSH2 0x300 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x4CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x4E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x4F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x51A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 SWAP5 SWAP4 PUSH1 0x20 DUP2 ADD SWAP4 POP CALLDATALOAD SWAP2 POP POP PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x56D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x57F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x5A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP POP DUP2 CALLDATALOAD PUSH1 0xFF AND SWAP3 POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xCCE JUMP JUMPDEST PUSH2 0x2B8 PUSH2 0xF12 JUMP JUMPDEST PUSH1 0x36 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x687 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x65C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x687 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x66A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6A5 PUSH2 0x69E PUSH2 0xF21 JUMP JUMPDEST DUP5 DUP5 PUSH2 0xF25 JUMP JUMPDEST POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x35 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6C1 DUP5 DUP5 DUP5 PUSH2 0x1011 JUMP JUMPDEST PUSH2 0x731 DUP5 PUSH2 0x6CD PUSH2 0xF21 JUMP JUMPDEST PUSH2 0x72C DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2684 PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP1 PUSH2 0x70B PUSH2 0xF21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x116E JUMP JUMPDEST PUSH2 0xF25 JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x38 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x74E PUSH2 0x1205 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6A5 PUSH2 0x760 PUSH2 0xF21 JUMP JUMPDEST DUP5 PUSH2 0x72C DUP6 PUSH1 0x34 PUSH1 0x0 PUSH2 0x771 PUSH2 0xF21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP13 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP1 PUSH2 0x1240 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x7AC PUSH2 0x6AE JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH2 0x7BD JUMPI POP PUSH1 0x0 PUSH2 0x7E9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7C9 DUP6 DUP5 PUSH2 0x129A JUMP JUMPDEST SWAP1 POP PUSH2 0x7E5 PUSH1 0xCD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x2664 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE DUP4 PUSH2 0x1340 JUMP JUMPDEST SWAP2 POP POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x804 PUSH2 0xF21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x85F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6E74726F6C6C6564546F6B656E2F6F6E6C792D636F6E74726F6C6C657200 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x869 DUP3 DUP3 PUSH2 0x1403 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x881 PUSH2 0xF21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x8DC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6E74726F6C6C6564546F6B656E2F6F6E6C792D636F6E74726F6C6C657200 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x934 JUMPI PUSH1 0x0 PUSH2 0x925 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x26AC PUSH1 0x21 SWAP2 CODECOPY PUSH2 0x91E DUP7 DUP9 PUSH2 0xCA3 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x116E JUMP JUMPDEST SWAP1 POP PUSH2 0x932 DUP4 DUP6 DUP4 PUSH2 0xF25 JUMP JUMPDEST POP JUMPDEST PUSH2 0x93E DUP3 DUP3 PUSH2 0x14F5 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x99 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x97F SWAP1 PUSH2 0x15F1 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x97F PUSH1 0xCD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x2664 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x15F5 JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x9BE PUSH2 0xF21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xA19 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6E74726F6C6C6564546F6B656E2F6F6E6C792D636F6E74726F6C6C657200 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x869 DUP3 DUP3 PUSH2 0x14F5 JUMP JUMPDEST PUSH1 0x37 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x687 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x65C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x687 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6A5 PUSH2 0xA91 PUSH2 0xF21 JUMP JUMPDEST DUP5 PUSH2 0x72C DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x275A PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x34 PUSH1 0x0 PUSH2 0xABB PUSH2 0xF21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP14 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x116E JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6A5 PUSH2 0xAF9 PUSH2 0xF21 JUMP JUMPDEST DUP5 DUP5 PUSH2 0x1011 JUMP JUMPDEST DUP4 TIMESTAMP GT ISZERO PUSH2 0xB55 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305065726D69743A206578706972656420646561646C696E65000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x9A SLOAD DUP9 DUP9 DUP9 PUSH2 0xB8A PUSH1 0x99 PUSH1 0x0 DUP15 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH2 0x15F1 JUMP JUMPDEST DUP10 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH2 0xBF3 DUP3 PUSH2 0x1645 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xC03 DUP3 DUP8 DUP8 DUP8 PUSH2 0x1691 JUMP JUMPDEST SWAP1 POP DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xC6B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305065726D69743A20696E76616C6964207369676E61747572650000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x99 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0xC8C SWAP1 PUSH2 0x180F JUMP JUMPDEST PUSH2 0xC97 DUP11 DUP11 DUP11 PUSH2 0xF25 JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0xCE7 JUMPI POP PUSH2 0xCE7 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0xCF5 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0xD30 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0xD5B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xDB6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5469636B65742F636F6E74726F6C6C65722D6E6F742D7A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xDC2 DUP6 DUP6 DUP6 DUP6 PUSH2 0x1829 JUMP JUMPDEST PUSH2 0xDDD PUSH1 0xCD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x2664 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x5 PUSH2 0x1967 JUMP JUMPDEST PUSH32 0x41BC1176D7B9B7BC036F385A7E5B08B0662A7AFA0844AF8A599AD431150227E1 DUP6 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP8 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xE5B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xE43 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xE88 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP4 DUP2 SUB DUP3 MSTORE DUP7 MLOAD DUP2 MSTORE DUP7 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP9 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xEBB JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xEA3 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xEE8 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP1 ISZERO PUSH2 0xF0B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0xF6A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2713 PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xFAF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x25AA PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE DUP2 MLOAD DUP6 DUP2 MSTORE SWAP2 MLOAD PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x1056 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x26EE PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x109B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2565 PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x10A6 DUP4 DUP4 DUP4 PUSH2 0x1A73 JUMP JUMPDEST PUSH2 0x10E3 DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x25CC PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x116E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP5 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x1112 SWAP1 DUP3 PUSH2 0x1240 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 SWAP3 DUP8 AND SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP5 DUP5 GT ISZERO PUSH2 0x11FD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x11C2 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x11AA JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x11EF JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x74E PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F PUSH2 0x1233 PUSH2 0x1B39 JUMP JUMPDEST PUSH2 0x123B PUSH2 0x1B3F JUMP JUMPDEST PUSH2 0x1B45 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x7E9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x12E8 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH21 0x155B9A599BDC9B54985B990BDB5A5B8B589BDD5B99 PUSH1 0x5A SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP4 PUSH1 0x0 SUB DUP2 PUSH2 0x12F6 JUMPI INVALID JUMPDEST MOD SWAP1 POP DUP4 JUMPDEST DUP2 DUP2 LT PUSH2 0x1307 JUMPI PUSH2 0x132D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 ADD SWAP4 SWAP1 SWAP4 MSTORE DUP2 MLOAD DUP1 DUP3 SUB DUP5 ADD DUP2 MSTORE SWAP1 DUP3 ADD SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 ADD KECCAK256 PUSH2 0x12FB JUMP JUMPDEST DUP4 DUP2 DUP2 PUSH2 0x1336 JUMPI INVALID JUMPDEST MOD SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP5 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x2 DUP2 ADD DUP1 SLOAD DUP4 SWAP2 DUP3 SWAP2 DUP3 SWAP1 PUSH2 0x1360 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD DUP6 DUP2 PUSH2 0x1373 JUMPI INVALID JUMPDEST MOD SWAP1 POP JUMPDEST PUSH1 0x2 DUP4 ADD SLOAD DUP4 SLOAD DUP4 MUL PUSH1 0x1 ADD LT ISZERO PUSH2 0x13E8 JUMPI PUSH1 0x1 JUMPDEST DUP4 SLOAD DUP2 GT PUSH2 0x13E2 JUMPI PUSH1 0x0 DUP2 DUP5 DUP7 PUSH1 0x0 ADD SLOAD MUL ADD SWAP1 POP PUSH1 0x0 DUP6 PUSH1 0x2 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x13B2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP DUP1 DUP5 LT PUSH2 0x13D0 JUMPI DUP1 DUP5 SUB SWAP4 POP PUSH2 0x13D8 JUMP JUMPDEST POP SWAP3 POP PUSH2 0x13E2 JUMP JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0x138C JUMP JUMPDEST POP PUSH2 0x1377 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 SWAP1 SWAP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x145E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x146A PUSH1 0x0 DUP4 DUP4 PUSH2 0x1A73 JUMP JUMPDEST PUSH1 0x35 SLOAD PUSH2 0x1477 SWAP1 DUP3 PUSH2 0x1240 JUMP JUMPDEST PUSH1 0x35 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x149D SWAP1 DUP3 PUSH2 0x1240 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP4 MLOAD DUP6 DUP2 MSTORE SWAP4 MLOAD SWAP3 SWAP4 SWAP2 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x153A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x26CD PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1546 DUP3 PUSH1 0x0 DUP4 PUSH2 0x1A73 JUMP JUMPDEST PUSH2 0x1583 DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2588 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x116E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x35 SLOAD PUSH2 0x15A9 SWAP1 DUP3 PUSH2 0x1BA7 JUMP JUMPDEST PUSH1 0x35 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP5 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 DUP5 MSTORE PUSH1 0x3 DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 KECCAK256 SLOAD DUP1 PUSH2 0x161F JUMPI PUSH1 0x0 SWAP3 POP PUSH2 0x163C JUMP JUMPDEST DUP2 PUSH1 0x2 ADD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x162E JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP3 POP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x164F PUSH2 0x1205 JUMP JUMPDEST DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH2 0x1901 PUSH1 0xF0 SHL DUP2 MSTORE POP PUSH1 0x2 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP3 GT ISZERO PUSH2 0x16F2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x25F2 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP4 PUSH1 0xFF AND PUSH1 0x1B EQ DUP1 PUSH2 0x1707 JUMPI POP DUP4 PUSH1 0xFF AND PUSH1 0x1C EQ JUMPDEST PUSH2 0x1742 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2642 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x179E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD SWAP2 POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1806 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1823 ADDRESS PUSH2 0x1C04 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1842 JUMPI POP PUSH2 0x1842 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0x1850 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x188B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x18B6 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x18FB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2737 PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1905 DUP6 DUP6 PUSH2 0x1C0A JUMP JUMPDEST PUSH2 0x1943 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x506F6F6C546F67657468657220436F6E74726F6C6C6564546F6B656E00000000 DUP2 MSTORE POP PUSH2 0x1CBF JUMP JUMPDEST PUSH1 0xCC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND OR SWAP1 SSTORE PUSH2 0xDDD DUP4 PUSH2 0x1D95 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP5 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD ISZERO PUSH2 0x19C0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x14 PUSH1 0x24 DUP3 ADD MSTORE PUSH20 0x2A3932B29030B63932B0B23C9032BC34B9BA3997 PUSH1 0x61 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 DUP3 GT PUSH2 0x1A15 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4B206D7573742062652067726561746572207468616E206F6E652E0000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP2 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 DUP3 SWAP1 MSTORE MLOAD PUSH2 0x1A37 SWAP2 PUSH1 0x1 DUP5 ADD SWAP2 PUSH2 0x2497 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 DUP3 SWAP1 MSTORE MLOAD PUSH2 0x1A57 SWAP2 PUSH1 0x2 DUP5 ADD SWAP2 PUSH2 0x2497 JUMP JUMPDEST POP PUSH1 0x2 ADD DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD SSTORE POP POP POP JUMP JUMPDEST PUSH2 0x1A7E DUP4 DUP4 DUP4 PUSH2 0x1DAB JUMP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x1A9D JUMPI PUSH2 0x93E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO PUSH2 0x1AE9 JUMPI PUSH1 0x0 PUSH2 0x1AC1 DUP3 PUSH2 0x1ABB DUP7 PUSH2 0x943 JUMP JUMPDEST SWAP1 PUSH2 0x1BA7 JUMP JUMPDEST SWAP1 POP PUSH2 0x1AE7 PUSH1 0xCD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x2664 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND PUSH2 0x1E25 JUMP JUMPDEST POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO PUSH2 0x93E JUMPI PUSH1 0x0 PUSH2 0x1B0D DUP3 PUSH2 0x1B07 DUP6 PUSH2 0x943 JUMP JUMPDEST SWAP1 PUSH2 0x1240 JUMP JUMPDEST SWAP1 POP PUSH2 0x1B33 PUSH1 0xCD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x2664 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH2 0x1E25 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x65 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x66 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP4 DUP4 PUSH2 0x1B52 PUSH2 0x2109 JUMP JUMPDEST ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1BFE JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1C23 JUMPI POP PUSH2 0x1C23 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0x1C31 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1C6C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1C97 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x1C9F PUSH2 0x210D JUMP JUMPDEST PUSH2 0x1CA9 DUP4 DUP4 PUSH2 0x21AF JUMP JUMPDEST DUP1 ISZERO PUSH2 0x93E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1CD8 JUMPI POP PUSH2 0x1CD8 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0x1CE6 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1D21 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1D4C JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x1D54 PUSH2 0x210D JUMP JUMPDEST PUSH2 0x1D77 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x31 PUSH1 0xF8 SHL DUP2 MSTORE POP PUSH2 0x2287 JUMP JUMPDEST PUSH2 0x1D80 DUP3 PUSH2 0x2347 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x869 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x38 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x7CBAB1C7 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP6 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP6 SWAP1 MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x7CBAB1C7 SWAP2 PUSH1 0x64 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E08 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E1C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 DUP6 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 DUP5 MSTORE PUSH1 0x3 DUP2 ADD SWAP1 SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD DUP1 PUSH2 0x1FBC JUMPI DUP4 ISZERO PUSH2 0x1FB7 JUMPI PUSH1 0x1 DUP3 ADD SLOAD PUSH2 0x1F23 JUMPI POP PUSH1 0x2 DUP2 ADD DUP1 SLOAD PUSH1 0x1 DUP1 DUP3 ADD DUP4 SSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP1 SWAP3 KECCAK256 DUP2 ADD DUP6 SWAP1 SSTORE SWAP1 DUP2 EQ DUP1 ISZERO SWAP1 PUSH2 0x1E8F JUMPI POP DUP2 SLOAD PUSH1 0x0 NOT DUP3 ADD DUP2 PUSH2 0x1E8C JUMPI INVALID JUMPDEST MOD ISZERO JUMPDEST ISZERO PUSH2 0x1F1E JUMPI DUP2 SLOAD PUSH1 0x0 SWAP1 DUP3 DUP2 PUSH2 0x1EA1 JUMPI INVALID JUMPDEST DIV PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x2 DUP6 ADD DUP1 SLOAD SWAP3 SWAP4 POP SWAP1 SWAP2 PUSH1 0x1 DUP6 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP6 SWAP1 DUP2 LT PUSH2 0x1ED0 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD DUP4 SLOAD PUSH1 0x1 DUP2 ADD DUP6 SSTORE SWAP4 DUP4 MSTORE DUP2 DUP4 KECCAK256 SWAP1 SWAP4 ADD SWAP3 SWAP1 SWAP3 SSTORE SWAP4 DUP5 MSTORE PUSH1 0x4 DUP7 ADD DUP1 DUP3 MSTORE PUSH1 0x40 DUP1 DUP7 KECCAK256 DUP7 SWAP1 SSTORE DUP5 DUP7 MSTORE PUSH1 0x3 DUP9 ADD DUP4 MSTORE DUP1 DUP7 KECCAK256 DUP5 SWAP1 SSTORE SWAP3 DUP6 MSTORE SWAP1 MSTORE SWAP1 SWAP2 KECCAK256 SSTORE JUMPDEST PUSH2 0x1F84 JUMP JUMPDEST PUSH1 0x1 DUP3 ADD DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x1F37 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP DUP2 PUSH1 0x1 ADD DUP1 SLOAD DUP1 PUSH2 0x1F51 JUMPI INVALID JUMPDEST PUSH1 0x1 SWAP1 SUB DUP2 DUP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SSTORE SWAP1 SSTORE DUP4 DUP3 PUSH1 0x2 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x1F77 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SSTORE JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x3 DUP4 ADD PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 SWAP1 SSTORE DUP4 DUP4 MSTORE PUSH1 0x4 DUP6 ADD SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 DUP4 SWAP1 SSTORE PUSH2 0x1FB7 DUP7 DUP7 DUP4 PUSH1 0x1 DUP9 PUSH2 0x240D JUMP JUMPDEST PUSH2 0x2101 JUMP JUMPDEST DUP4 PUSH2 0x204D JUMPI PUSH1 0x0 DUP3 PUSH1 0x2 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x1FD2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP PUSH1 0x0 DUP4 PUSH1 0x2 ADD DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x1FF0 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SWAP3 SWAP1 SWAP3 SSTORE PUSH1 0x1 DUP1 DUP7 ADD DUP1 SLOAD SWAP2 DUP3 ADD DUP2 SSTORE DUP3 MSTORE DUP3 DUP3 KECCAK256 ADD DUP5 SWAP1 SSTORE DUP6 DUP2 MSTORE PUSH1 0x3 DUP6 ADD DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP3 SWAP1 SSTORE DUP5 DUP3 MSTORE PUSH1 0x4 DUP7 ADD SWAP1 SWAP3 MSTORE SWAP1 DUP2 KECCAK256 DUP2 SWAP1 SSTORE PUSH2 0x2047 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP6 SWAP1 DUP6 PUSH2 0x240D JUMP JUMPDEST POP PUSH2 0x2101 JUMP JUMPDEST DUP2 PUSH1 0x2 ADD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x205C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD DUP5 EQ PUSH2 0x2101 JUMPI PUSH1 0x0 DUP5 DUP4 PUSH1 0x2 ADD DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x207F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD GT ISZERO SWAP1 POP PUSH1 0x0 DUP2 PUSH2 0x20B6 JUMPI DUP6 DUP5 PUSH1 0x2 ADD DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x20A5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SUB PUSH2 0x20D3 JUMP JUMPDEST DUP4 PUSH1 0x2 ADD DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x20C5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD DUP7 SUB JUMPDEST SWAP1 POP DUP6 DUP5 PUSH1 0x2 ADD DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x20E5 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SSTORE PUSH2 0x20FE DUP9 DUP9 DUP6 DUP6 DUP6 PUSH2 0x240D JUMP JUMPDEST POP POP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST CHAINID SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2126 JUMPI POP PUSH2 0x2126 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0x2134 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x216F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x219A JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP1 ISZERO PUSH2 0x21AC JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x21C8 JUMPI POP PUSH2 0x21C8 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0x21D6 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2211 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x223C JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP3 MLOAD PUSH2 0x224F SWAP1 PUSH1 0x36 SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x24E2 JUMP JUMPDEST POP DUP2 MLOAD PUSH2 0x2263 SWAP1 PUSH1 0x37 SWAP1 PUSH1 0x20 DUP6 ADD SWAP1 PUSH2 0x24E2 JUMP JUMPDEST POP PUSH1 0x38 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x12 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x93E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x22A0 JUMPI POP PUSH2 0x22A0 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0x22AE JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x22E9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2314 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP3 MLOAD PUSH1 0x20 DUP1 DUP6 ADD SWAP2 SWAP1 SWAP2 KECCAK256 DUP4 MLOAD SWAP2 DUP5 ADD SWAP2 SWAP1 SWAP2 KECCAK256 PUSH1 0x65 SWAP2 SWAP1 SWAP2 SSTORE PUSH1 0x66 SSTORE DUP1 ISZERO PUSH2 0x93E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2360 JUMPI POP PUSH2 0x2360 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0x236E JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x23A9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x23D4 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 PUSH1 0x9A SSTORE DUP1 ISZERO PUSH2 0x869 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP7 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP4 JUMPDEST DUP1 ISZERO PUSH2 0x1E1C JUMPI DUP2 SLOAD PUSH1 0x0 NOT DUP3 ADD DUP2 PUSH2 0x2431 JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP4 PUSH2 0x245A JUMPI DUP3 DUP3 PUSH1 0x2 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x2449 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SUB PUSH2 0x2477 JUMP JUMPDEST DUP3 DUP3 PUSH1 0x2 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x246A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD ADD JUMPDEST DUP3 PUSH1 0x2 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x2486 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SSTORE PUSH2 0x241D JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x24D2 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x24D2 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x24B7 JUMP JUMPDEST POP PUSH2 0x24DE SWAP3 SWAP2 POP PUSH2 0x254F JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x2523 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x24D2 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x24D2 JUMPI SWAP2 DUP3 ADD DUP3 DUP2 GT ISZERO PUSH2 0x24D2 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x24B7 JUMP JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x24DE JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2550 JUMP INVALID GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220746F20746865207A65726F2061 PUSH5 0x6472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH3 0x75726E KECCAK256 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545524332 ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F766520746F20746865207A65726F20616464 PUSH19 0x65737345524332303A207472616E7366657220 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545434453 COINBASE GASPRICE KECCAK256 PUSH10 0x6E76616C696420736967 PUSH15 0x6174757265202773272076616C7565 0x49 PUSH15 0x697469616C697A61626C653A20636F PUSH15 0x747261637420697320616C72656164 PUSH26 0x20696E697469616C697A656445434453413A20696E76616C6964 KECCAK256 PUSH20 0x69676E6174757265202776272076616C7565AF45 0xC4 0xFB SWAP15 0xF7 MULMOD GT 0xE5 DIFFICULTY 0x4B DUP15 0xED 0xCE PUSH1 0x73 PUSH7 0xE494224D52E6FE 0xAB SMOD 0xFB 0xD6 0x2A MSTORE8 0xB2 PUSH16 0x45524332303A207472616E7366657220 PUSH2 0x6D6F PUSH22 0x6E74206578636565647320616C6C6F77616E6365436F PUSH15 0x74726F6C6C6564546F6B656E2F6578 PUSH4 0x65656473 0x2D PUSH2 0x6C6C PUSH16 0x77616E636545524332303A206275726E KECCAK256 PUSH7 0x726F6D20746865 KECCAK256 PUSH27 0x65726F206164647265737345524332303A207472616E7366657220 PUSH7 0x726F6D20746865 KECCAK256 PUSH27 0x65726F206164647265737345524332303A20617070726F76652066 PUSH19 0x6F6D20746865207A65726F2061646472657373 NUMBER PUSH16 0x6E74726F6C6C6564546F6B656E2F636F PUSH15 0x74726F6C6C65722D6E6F742D7A6572 PUSH16 0x45524332303A20646563726561736564 KECCAK256 PUSH2 0x6C6C PUSH16 0x77616E63652062656C6F77207A65726F LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x24 SWAP15 0xA7 0x1F RETURNDATASIZE MSTORE8 0xC9 GASLIMIT SWAP7 0x28 0x21 0xAE 0x27 DUP8 SWAP5 0x2E MULMOD SWAP8 0xB1 CHAINID 0xAB 0xDB KECCAK256 MSIZE CODESIZE 0xE3 0xEA 0x4D GASLIMIT NUMBER SELFBALANCE 0x28 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "283:3178:91:-:0;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146103de578063a9059cbb1461040a578063d505accf14610436578063dd62ed3e14610487578063de7ea79d146104b5578063f77c4791146105f357610137565b806370a08231146103385780637ecebe001461035e578063885d194d1461038457806390596dd1146103aa57806395d89b41146103d657610137565b80633644e515116100ff5780633644e51514610267578063395093511461026f5780633b3041471461029b5780635d7b0758146102d4578063631b5dfb1461030257610137565b806306fdde031461013c578063095ea7b3146101b957806318160ddd146101f957806323b872dd14610213578063313ce56714610249575b600080fd5b6101446105fb565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561017e578181015183820152602001610166565b50505050905090810190601f1680156101ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101e5600480360360408110156101cf57600080fd5b506001600160a01b038135169060200135610691565b604080519115158252519081900360200190f35b6102016106ae565b60408051918252519081900360200190f35b6101e56004803603606081101561022957600080fd5b506001600160a01b038135811691602081013590911690604001356106b4565b61025161073b565b6040805160ff9092168252519081900360200190f35b610201610744565b6101e56004803603604081101561028557600080fd5b506001600160a01b038135169060200135610753565b6102b8600480360360208110156102b157600080fd5b50356107a1565b604080516001600160a01b039092168252519081900360200190f35b610300600480360360408110156102ea57600080fd5b506001600160a01b0381351690602001356107f0565b005b6103006004803603606081101561031857600080fd5b506001600160a01b0381358116916020810135909116906040013561086d565b6102016004803603602081101561034e57600080fd5b50356001600160a01b0316610943565b6102016004803603602081101561037457600080fd5b50356001600160a01b031661095e565b6102016004803603602081101561039a57600080fd5b50356001600160a01b0316610985565b610300600480360360408110156103c057600080fd5b506001600160a01b0381351690602001356109aa565b610144610a23565b6101e5600480360360408110156103f457600080fd5b506001600160a01b038135169060200135610a84565b6101e56004803603604081101561042057600080fd5b506001600160a01b038135169060200135610aec565b610300600480360360e081101561044c57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610b00565b6102016004803603604081101561049d57600080fd5b506001600160a01b0381358116916020013516610ca3565b610300600480360360808110156104cb57600080fd5b8101906020810181356401000000008111156104e657600080fd5b8201836020820111156104f857600080fd5b8035906020019184600183028401116401000000008311171561051a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561056d57600080fd5b82018360208201111561057f57600080fd5b803590602001918460018302840111640100000000831117156105a157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050813560ff16925050602001356001600160a01b0316610cce565b6102b8610f12565b60368054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106875780601f1061065c57610100808354040283529160200191610687565b820191906000526020600020905b81548152906001019060200180831161066a57829003601f168201915b5050505050905090565b60006106a561069e610f21565b8484610f25565b50600192915050565b60355490565b60006106c1848484611011565b610731846106cd610f21565b61072c85604051806060016040528060288152602001612684602891396001600160a01b038a1660009081526034602052604081209061070b610f21565b6001600160a01b03168152602081019190915260400160002054919061116e565b610f25565b5060019392505050565b60385460ff1690565b600061074e611205565b905090565b60006106a5610760610f21565b8461072c8560346000610771610f21565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611240565b6000806107ac6106ae565b90506000816107bd575060006107e9565b60006107c9858461129a565b90506107e560cd60008051602061266483398151915283611340565b9150505b9392505050565b60cc546001600160a01b0316610804610f21565b6001600160a01b03161461085f576040805162461bcd60e51b815260206004820152601f60248201527f436f6e74726f6c6c6564546f6b656e2f6f6e6c792d636f6e74726f6c6c657200604482015290519081900360640190fd5b6108698282611403565b5050565b60cc546001600160a01b0316610881610f21565b6001600160a01b0316146108dc576040805162461bcd60e51b815260206004820152601f60248201527f436f6e74726f6c6c6564546f6b656e2f6f6e6c792d636f6e74726f6c6c657200604482015290519081900360640190fd5b816001600160a01b0316836001600160a01b031614610934576000610925826040518060600160405280602181526020016126ac6021913961091e8688610ca3565b919061116e565b9050610932838583610f25565b505b61093e82826114f5565b505050565b6001600160a01b031660009081526033602052604090205490565b6001600160a01b038116600090815260996020526040812061097f906115f1565b92915050565b600061097f60cd6000805160206126648339815191526001600160a01b0385166115f5565b60cc546001600160a01b03166109be610f21565b6001600160a01b031614610a19576040805162461bcd60e51b815260206004820152601f60248201527f436f6e74726f6c6c6564546f6b656e2f6f6e6c792d636f6e74726f6c6c657200604482015290519081900360640190fd5b61086982826114f5565b60378054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106875780601f1061065c57610100808354040283529160200191610687565b60006106a5610a91610f21565b8461072c8560405180606001604052806025815260200161275a6025913960346000610abb610f21565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919061116e565b60006106a5610af9610f21565b8484611011565b83421115610b55576040805162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015290519081900360640190fd5b6000609a54888888610b8a609960008e6001600160a01b03166001600160a01b031681526020019081526020016000206115f1565b8960405160200180878152602001866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200182815260200196505050505050506040516020818303038152906040528051906020012090506000610bf382611645565b90506000610c0382878787611691565b9050896001600160a01b0316816001600160a01b031614610c6b576040805162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b6001600160a01b038a166000908152609960205260409020610c8c9061180f565b610c978a8a8a610f25565b50505050505050505050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b600054610100900460ff1680610ce75750610ce7611818565b80610cf5575060005460ff16155b610d305760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff16158015610d5b576000805460ff1961ff0019909116610100171660011790555b6001600160a01b038216610db6576040805162461bcd60e51b815260206004820152601a60248201527f5469636b65742f636f6e74726f6c6c65722d6e6f742d7a65726f000000000000604482015290519081900360640190fd5b610dc285858585611829565b610ddd60cd6000805160206126648339815191526005611967565b7f41bc1176d7b9b7bc036f385a7e5b08b0662a7afa0844af8a599ad431150227e1858585856040518080602001806020018560ff168152602001846001600160a01b03168152602001838103835287818151815260200191508051906020019080838360005b83811015610e5b578181015183820152602001610e43565b50505050905090810190601f168015610e885780820380516001836020036101000a031916815260200191505b50838103825286518152865160209182019188019080838360005b83811015610ebb578181015183820152602001610ea3565b50505050905090810190601f168015610ee85780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a18015610f0b576000805461ff00191690555b5050505050565b60cc546001600160a01b031681565b3390565b6001600160a01b038316610f6a5760405162461bcd60e51b81526004018080602001828103825260248152602001806127136024913960400191505060405180910390fd5b6001600160a01b038216610faf5760405162461bcd60e51b81526004018080602001828103825260228152602001806125aa6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166110565760405162461bcd60e51b81526004018080602001828103825260258152602001806126ee6025913960400191505060405180910390fd5b6001600160a01b03821661109b5760405162461bcd60e51b81526004018080602001828103825260238152602001806125656023913960400191505060405180910390fd5b6110a6838383611a73565b6110e3816040518060600160405280602681526020016125cc602691396001600160a01b038616600090815260336020526040902054919061116e565b6001600160a01b0380851660009081526033602052604080822093909355908416815220546111129082611240565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156111fd5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156111c25781810151838201526020016111aa565b50505050905090810190601f1680156111ef5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600061074e7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611233611b39565b61123b611b3f565b611b45565b6000828201838110156107e9576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008082116112e8576040805162461bcd60e51b8152602060048201526015602482015274155b9a599bdc9b54985b990bdb5a5b8b589bdd5b99605a1b604482015290519081900360640190fd5b60008283600003816112f657fe5b069050835b8181106113075761132d565b6040805160208082019390935281518082038401815290820190915280519101206112fb565b83818161133657fe5b0695945050505050565b600082815260208490526040812060028101805483918291829061136057fe5b9060005260206000200154858161137357fe5b0690505b60028301548354830260010110156113e85760015b835481116113e2576000818486600001540201905060008560020182815481106113b257fe5b906000526020600020015490508084106113d05780840393506113d8565b5092506113e2565b505060010161138c565b50611377565b50600090815260049091016020526040902054949350505050565b6001600160a01b03821661145e576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61146a60008383611a73565b6035546114779082611240565b6035556001600160a01b03821660009081526033602052604090205461149d9082611240565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b03821661153a5760405162461bcd60e51b81526004018080602001828103825260218152602001806126cd6021913960400191505060405180910390fd5b61154682600083611a73565b61158381604051806060016040528060228152602001612588602291396001600160a01b038516600090815260336020526040902054919061116e565b6001600160a01b0383166000908152603360205260409020556035546115a99082611ba7565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b5490565b600082815260208481526040808320848452600381019092528220548061161f576000925061163c565b81600201818154811061162e57fe5b906000526020600020015492505b50509392505050565b600061164f611205565b82604051602001808061190160f01b81525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156116f25760405162461bcd60e51b81526004018080602001828103825260228152602001806125f26022913960400191505060405180910390fd5b8360ff16601b148061170757508360ff16601c145b6117425760405162461bcd60e51b81526004018080602001828103825260228152602001806126426022913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561179e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611806576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b95945050505050565b80546001019055565b600061182330611c04565b15905090565b600054610100900460ff16806118425750611842611818565b80611850575060005460ff16155b61188b5760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff161580156118b6576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0382166118fb5760405162461bcd60e51b81526004018080602001828103825260238152602001806127376023913960400191505060405180910390fd5b6119058585611c0a565b6119436040518060400160405280601c81526020017f506f6f6c546f67657468657220436f6e74726f6c6c6564546f6b656e00000000815250611cbf565b60cc80546001600160a01b0319166001600160a01b038416179055610ddd83611d95565b60008281526020849052604090208054156119c0576040805162461bcd60e51b81526020600482015260146024820152732a3932b29030b63932b0b23c9032bc34b9ba399760611b604482015290519081900360640190fd5b60018211611a15576040805162461bcd60e51b815260206004820152601b60248201527f4b206d7573742062652067726561746572207468616e206f6e652e0000000000604482015290519081900360640190fd5b8181556040805160008152602081019182905251611a37916001840191612497565b506040805160008152602081019182905251611a57916002840191612497565b5060020180546001810182556000918252602082200155505050565b611a7e838383611dab565b816001600160a01b0316836001600160a01b03161415611a9d5761093e565b6001600160a01b03831615611ae9576000611ac182611abb86610943565b90611ba7565b9050611ae760cd600080516020612664833981519152836001600160a01b038816611e25565b505b6001600160a01b0382161561093e576000611b0d82611b0785610943565b90611240565b9050611b3360cd600080516020612664833981519152836001600160a01b038716611e25565b50505050565b60655490565b60665490565b6000838383611b52612109565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b03168152602001955050505050506040516020818303038152906040528051906020012090509392505050565b600082821115611bfe576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b3b151590565b600054610100900460ff1680611c235750611c23611818565b80611c31575060005460ff16155b611c6c5760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff16158015611c97576000805460ff1961ff0019909116610100171660011790555b611c9f61210d565b611ca983836121af565b801561093e576000805461ff0019169055505050565b600054610100900460ff1680611cd85750611cd8611818565b80611ce6575060005460ff16155b611d215760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff16158015611d4c576000805460ff1961ff0019909116610100171660011790555b611d5461210d565b611d7782604051806040016040528060018152602001603160f81b815250612287565b611d8082612347565b8015610869576000805461ff00191690555050565b6038805460ff191660ff92909216919091179055565b60cc5460408051637cbab1c760e01b81526001600160a01b03868116600483015285811660248301526044820185905291519190921691637cbab1c791606480830192600092919082900301818387803b158015611e0857600080fd5b505af1158015611e1c573d6000803e3d6000fd5b50505050505050565b600083815260208581526040808320848452600381019092529091205480611fbc578315611fb7576001820154611f23575060028101805460018082018355600092835260209092208101859055908114801590611e8f57508154600019820181611e8c57fe5b06155b15611f1e5781546000908281611ea157fe5b0460008181526004850160205260409020546002850180549293509091600185019190819085908110611ed057fe5b60009182526020808320909101548354600181018555938352818320909301929092559384526004860180825260408086208690558486526003880183528086208490559285529052909120555b611f84565b6001820180546000198101908110611f3757fe5b9060005260206000200154905081600101805480611f5157fe5b6001900381819060005260206000200160009055905583826002018281548110611f7757fe5b6000918252602090912001555b60008381526003830160209081526040808320849055838352600485019091529020839055611fb786868360018861240d565b612101565b8361204d576000826002018281548110611fd257fe5b906000526020600020015490506000836002018381548110611ff057fe5b6000918252602080832090910192909255600180860180549182018155825282822001849055858152600385018252604080822082905584825260048601909252908120819055612047908890889085908561240d565b50612101565b81600201818154811061205c57fe5b906000526020600020015484146121015760008483600201838154811061207f57fe5b9060005260206000200154111590506000816120b657858460020184815481106120a557fe5b9060005260206000200154036120d3565b8360020183815481106120c557fe5b906000526020600020015486035b9050858460020184815481106120e557fe5b6000918252602090912001556120fe888885858561240d565b50505b505050505050565b4690565b600054610100900460ff16806121265750612126611818565b80612134575060005460ff16155b61216f5760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff1615801561219a576000805460ff1961ff0019909116610100171660011790555b80156121ac576000805461ff00191690555b50565b600054610100900460ff16806121c857506121c8611818565b806121d6575060005460ff16155b6122115760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff1615801561223c576000805460ff1961ff0019909116610100171660011790555b825161224f9060369060208601906124e2565b5081516122639060379060208501906124e2565b506038805460ff19166012179055801561093e576000805461ff0019169055505050565b600054610100900460ff16806122a057506122a0611818565b806122ae575060005460ff16155b6122e95760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff16158015612314576000805460ff1961ff0019909116610100171660011790555b8251602080850191909120835191840191909120606591909155606655801561093e576000805461ff0019169055505050565b600054610100900460ff16806123605750612360611818565b8061236e575060005460ff16155b6123a95760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff161580156123d4576000805460ff1961ff0019909116610100171660011790555b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9609a558015610869576000805461ff00191690555050565b6000848152602086905260409020835b8015611e1c57815460001982018161243157fe5b0490508361245a578282600201828154811061244957fe5b906000526020600020015403612477565b8282600201828154811061246a57fe5b9060005260206000200154015b82600201828154811061248657fe5b60009182526020909120015561241d565b8280548282559060005260206000209081019282156124d2579160200282015b828111156124d25782518255916020019190600101906124b7565b506124de92915061254f565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061252357805160ff19168380011785556124d2565b828001600101855582156124d257918201828111156124d25782518255916020019190600101906124b7565b5b808211156124de576000815560010161255056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545434453413a20696e76616c6964207369676e6174757265202773272076616c7565496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656445434453413a20696e76616c6964207369676e6174757265202776272076616c7565af45c4fb9ef70911e5444b8eedce607366e494224d52e6feab07fbd62a53b26f45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365436f6e74726f6c6c6564546f6b656e2f657863656564732d616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373436f6e74726f6c6c6564546f6b656e2f636f6e74726f6c6c65722d6e6f742d7a65726f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220249ea71f3d53c945962821ae2787942e0997b146abdb205938e3ea4d4543472864736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x137 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x70A08231 GT PUSH2 0xB8 JUMPI DUP1 PUSH4 0xA457C2D7 GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x3DE JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x40A JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x436 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x487 JUMPI DUP1 PUSH4 0xDE7EA79D EQ PUSH2 0x4B5 JUMPI DUP1 PUSH4 0xF77C4791 EQ PUSH2 0x5F3 JUMPI PUSH2 0x137 JUMP JUMPDEST DUP1 PUSH4 0x70A08231 EQ PUSH2 0x338 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x35E JUMPI DUP1 PUSH4 0x885D194D EQ PUSH2 0x384 JUMPI DUP1 PUSH4 0x90596DD1 EQ PUSH2 0x3AA JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x3D6 JUMPI PUSH2 0x137 JUMP JUMPDEST DUP1 PUSH4 0x3644E515 GT PUSH2 0xFF JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x267 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x26F JUMPI DUP1 PUSH4 0x3B304147 EQ PUSH2 0x29B JUMPI DUP1 PUSH4 0x5D7B0758 EQ PUSH2 0x2D4 JUMPI DUP1 PUSH4 0x631B5DFB EQ PUSH2 0x302 JUMPI PUSH2 0x137 JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x13C JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x1B9 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x1F9 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x213 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x249 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x144 PUSH2 0x5FB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x17E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x166 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1AB JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1E5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x691 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x201 PUSH2 0x6AE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1E5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x229 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x6B4 JUMP JUMPDEST PUSH2 0x251 PUSH2 0x73B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x201 PUSH2 0x744 JUMP JUMPDEST PUSH2 0x1E5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x285 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x753 JUMP JUMPDEST PUSH2 0x2B8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x7A1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x300 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x2EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x7F0 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x300 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x318 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x86D JUMP JUMPDEST PUSH2 0x201 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x34E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x943 JUMP JUMPDEST PUSH2 0x201 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x374 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x95E JUMP JUMPDEST PUSH2 0x201 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x39A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x985 JUMP JUMPDEST PUSH2 0x300 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x9AA JUMP JUMPDEST PUSH2 0x144 PUSH2 0xA23 JUMP JUMPDEST PUSH2 0x1E5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0xA84 JUMP JUMPDEST PUSH2 0x1E5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x420 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0xAEC JUMP JUMPDEST PUSH2 0x300 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0xE0 DUP2 LT ISZERO PUSH2 0x44C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0xFF PUSH1 0x80 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0xA0 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0xC0 ADD CALLDATALOAD PUSH2 0xB00 JUMP JUMPDEST PUSH2 0x201 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x49D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xCA3 JUMP JUMPDEST PUSH2 0x300 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x4CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x4E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x4F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x51A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 SWAP5 SWAP4 PUSH1 0x20 DUP2 ADD SWAP4 POP CALLDATALOAD SWAP2 POP POP PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x56D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x57F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x5A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP POP DUP2 CALLDATALOAD PUSH1 0xFF AND SWAP3 POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xCCE JUMP JUMPDEST PUSH2 0x2B8 PUSH2 0xF12 JUMP JUMPDEST PUSH1 0x36 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x687 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x65C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x687 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x66A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6A5 PUSH2 0x69E PUSH2 0xF21 JUMP JUMPDEST DUP5 DUP5 PUSH2 0xF25 JUMP JUMPDEST POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x35 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6C1 DUP5 DUP5 DUP5 PUSH2 0x1011 JUMP JUMPDEST PUSH2 0x731 DUP5 PUSH2 0x6CD PUSH2 0xF21 JUMP JUMPDEST PUSH2 0x72C DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2684 PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP1 PUSH2 0x70B PUSH2 0xF21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x116E JUMP JUMPDEST PUSH2 0xF25 JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x38 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x74E PUSH2 0x1205 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6A5 PUSH2 0x760 PUSH2 0xF21 JUMP JUMPDEST DUP5 PUSH2 0x72C DUP6 PUSH1 0x34 PUSH1 0x0 PUSH2 0x771 PUSH2 0xF21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP13 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP1 PUSH2 0x1240 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x7AC PUSH2 0x6AE JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH2 0x7BD JUMPI POP PUSH1 0x0 PUSH2 0x7E9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7C9 DUP6 DUP5 PUSH2 0x129A JUMP JUMPDEST SWAP1 POP PUSH2 0x7E5 PUSH1 0xCD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x2664 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE DUP4 PUSH2 0x1340 JUMP JUMPDEST SWAP2 POP POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x804 PUSH2 0xF21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x85F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6E74726F6C6C6564546F6B656E2F6F6E6C792D636F6E74726F6C6C657200 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x869 DUP3 DUP3 PUSH2 0x1403 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x881 PUSH2 0xF21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x8DC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6E74726F6C6C6564546F6B656E2F6F6E6C792D636F6E74726F6C6C657200 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x934 JUMPI PUSH1 0x0 PUSH2 0x925 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x26AC PUSH1 0x21 SWAP2 CODECOPY PUSH2 0x91E DUP7 DUP9 PUSH2 0xCA3 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x116E JUMP JUMPDEST SWAP1 POP PUSH2 0x932 DUP4 DUP6 DUP4 PUSH2 0xF25 JUMP JUMPDEST POP JUMPDEST PUSH2 0x93E DUP3 DUP3 PUSH2 0x14F5 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x99 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x97F SWAP1 PUSH2 0x15F1 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x97F PUSH1 0xCD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x2664 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x15F5 JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x9BE PUSH2 0xF21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xA19 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6E74726F6C6C6564546F6B656E2F6F6E6C792D636F6E74726F6C6C657200 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x869 DUP3 DUP3 PUSH2 0x14F5 JUMP JUMPDEST PUSH1 0x37 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x687 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x65C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x687 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6A5 PUSH2 0xA91 PUSH2 0xF21 JUMP JUMPDEST DUP5 PUSH2 0x72C DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x275A PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x34 PUSH1 0x0 PUSH2 0xABB PUSH2 0xF21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP14 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x116E JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6A5 PUSH2 0xAF9 PUSH2 0xF21 JUMP JUMPDEST DUP5 DUP5 PUSH2 0x1011 JUMP JUMPDEST DUP4 TIMESTAMP GT ISZERO PUSH2 0xB55 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305065726D69743A206578706972656420646561646C696E65000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x9A SLOAD DUP9 DUP9 DUP9 PUSH2 0xB8A PUSH1 0x99 PUSH1 0x0 DUP15 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH2 0x15F1 JUMP JUMPDEST DUP10 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH2 0xBF3 DUP3 PUSH2 0x1645 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xC03 DUP3 DUP8 DUP8 DUP8 PUSH2 0x1691 JUMP JUMPDEST SWAP1 POP DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xC6B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305065726D69743A20696E76616C6964207369676E61747572650000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x99 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0xC8C SWAP1 PUSH2 0x180F JUMP JUMPDEST PUSH2 0xC97 DUP11 DUP11 DUP11 PUSH2 0xF25 JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0xCE7 JUMPI POP PUSH2 0xCE7 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0xCF5 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0xD30 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0xD5B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xDB6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5469636B65742F636F6E74726F6C6C65722D6E6F742D7A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xDC2 DUP6 DUP6 DUP6 DUP6 PUSH2 0x1829 JUMP JUMPDEST PUSH2 0xDDD PUSH1 0xCD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x2664 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x5 PUSH2 0x1967 JUMP JUMPDEST PUSH32 0x41BC1176D7B9B7BC036F385A7E5B08B0662A7AFA0844AF8A599AD431150227E1 DUP6 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP8 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xE5B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xE43 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xE88 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP4 DUP2 SUB DUP3 MSTORE DUP7 MLOAD DUP2 MSTORE DUP7 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP9 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xEBB JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xEA3 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xEE8 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP1 ISZERO PUSH2 0xF0B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0xF6A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2713 PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xFAF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x25AA PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE DUP2 MLOAD DUP6 DUP2 MSTORE SWAP2 MLOAD PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x1056 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x26EE PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x109B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2565 PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x10A6 DUP4 DUP4 DUP4 PUSH2 0x1A73 JUMP JUMPDEST PUSH2 0x10E3 DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x25CC PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x116E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP5 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x1112 SWAP1 DUP3 PUSH2 0x1240 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 SWAP3 DUP8 AND SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP5 DUP5 GT ISZERO PUSH2 0x11FD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x11C2 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x11AA JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x11EF JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x74E PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F PUSH2 0x1233 PUSH2 0x1B39 JUMP JUMPDEST PUSH2 0x123B PUSH2 0x1B3F JUMP JUMPDEST PUSH2 0x1B45 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x7E9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x12E8 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH21 0x155B9A599BDC9B54985B990BDB5A5B8B589BDD5B99 PUSH1 0x5A SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP4 PUSH1 0x0 SUB DUP2 PUSH2 0x12F6 JUMPI INVALID JUMPDEST MOD SWAP1 POP DUP4 JUMPDEST DUP2 DUP2 LT PUSH2 0x1307 JUMPI PUSH2 0x132D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 ADD SWAP4 SWAP1 SWAP4 MSTORE DUP2 MLOAD DUP1 DUP3 SUB DUP5 ADD DUP2 MSTORE SWAP1 DUP3 ADD SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 ADD KECCAK256 PUSH2 0x12FB JUMP JUMPDEST DUP4 DUP2 DUP2 PUSH2 0x1336 JUMPI INVALID JUMPDEST MOD SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP5 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x2 DUP2 ADD DUP1 SLOAD DUP4 SWAP2 DUP3 SWAP2 DUP3 SWAP1 PUSH2 0x1360 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD DUP6 DUP2 PUSH2 0x1373 JUMPI INVALID JUMPDEST MOD SWAP1 POP JUMPDEST PUSH1 0x2 DUP4 ADD SLOAD DUP4 SLOAD DUP4 MUL PUSH1 0x1 ADD LT ISZERO PUSH2 0x13E8 JUMPI PUSH1 0x1 JUMPDEST DUP4 SLOAD DUP2 GT PUSH2 0x13E2 JUMPI PUSH1 0x0 DUP2 DUP5 DUP7 PUSH1 0x0 ADD SLOAD MUL ADD SWAP1 POP PUSH1 0x0 DUP6 PUSH1 0x2 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x13B2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP DUP1 DUP5 LT PUSH2 0x13D0 JUMPI DUP1 DUP5 SUB SWAP4 POP PUSH2 0x13D8 JUMP JUMPDEST POP SWAP3 POP PUSH2 0x13E2 JUMP JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0x138C JUMP JUMPDEST POP PUSH2 0x1377 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 SWAP1 SWAP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x145E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x146A PUSH1 0x0 DUP4 DUP4 PUSH2 0x1A73 JUMP JUMPDEST PUSH1 0x35 SLOAD PUSH2 0x1477 SWAP1 DUP3 PUSH2 0x1240 JUMP JUMPDEST PUSH1 0x35 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x149D SWAP1 DUP3 PUSH2 0x1240 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP4 MLOAD DUP6 DUP2 MSTORE SWAP4 MLOAD SWAP3 SWAP4 SWAP2 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x153A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x26CD PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1546 DUP3 PUSH1 0x0 DUP4 PUSH2 0x1A73 JUMP JUMPDEST PUSH2 0x1583 DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2588 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x116E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x35 SLOAD PUSH2 0x15A9 SWAP1 DUP3 PUSH2 0x1BA7 JUMP JUMPDEST PUSH1 0x35 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP5 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 DUP5 MSTORE PUSH1 0x3 DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 KECCAK256 SLOAD DUP1 PUSH2 0x161F JUMPI PUSH1 0x0 SWAP3 POP PUSH2 0x163C JUMP JUMPDEST DUP2 PUSH1 0x2 ADD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x162E JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP3 POP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x164F PUSH2 0x1205 JUMP JUMPDEST DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH2 0x1901 PUSH1 0xF0 SHL DUP2 MSTORE POP PUSH1 0x2 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP3 GT ISZERO PUSH2 0x16F2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x25F2 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP4 PUSH1 0xFF AND PUSH1 0x1B EQ DUP1 PUSH2 0x1707 JUMPI POP DUP4 PUSH1 0xFF AND PUSH1 0x1C EQ JUMPDEST PUSH2 0x1742 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2642 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x179E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD SWAP2 POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1806 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1823 ADDRESS PUSH2 0x1C04 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1842 JUMPI POP PUSH2 0x1842 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0x1850 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x188B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x18B6 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x18FB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2737 PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1905 DUP6 DUP6 PUSH2 0x1C0A JUMP JUMPDEST PUSH2 0x1943 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x506F6F6C546F67657468657220436F6E74726F6C6C6564546F6B656E00000000 DUP2 MSTORE POP PUSH2 0x1CBF JUMP JUMPDEST PUSH1 0xCC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND OR SWAP1 SSTORE PUSH2 0xDDD DUP4 PUSH2 0x1D95 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP5 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD ISZERO PUSH2 0x19C0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x14 PUSH1 0x24 DUP3 ADD MSTORE PUSH20 0x2A3932B29030B63932B0B23C9032BC34B9BA3997 PUSH1 0x61 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 DUP3 GT PUSH2 0x1A15 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4B206D7573742062652067726561746572207468616E206F6E652E0000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP2 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 DUP3 SWAP1 MSTORE MLOAD PUSH2 0x1A37 SWAP2 PUSH1 0x1 DUP5 ADD SWAP2 PUSH2 0x2497 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 DUP3 SWAP1 MSTORE MLOAD PUSH2 0x1A57 SWAP2 PUSH1 0x2 DUP5 ADD SWAP2 PUSH2 0x2497 JUMP JUMPDEST POP PUSH1 0x2 ADD DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD SSTORE POP POP POP JUMP JUMPDEST PUSH2 0x1A7E DUP4 DUP4 DUP4 PUSH2 0x1DAB JUMP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x1A9D JUMPI PUSH2 0x93E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO PUSH2 0x1AE9 JUMPI PUSH1 0x0 PUSH2 0x1AC1 DUP3 PUSH2 0x1ABB DUP7 PUSH2 0x943 JUMP JUMPDEST SWAP1 PUSH2 0x1BA7 JUMP JUMPDEST SWAP1 POP PUSH2 0x1AE7 PUSH1 0xCD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x2664 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND PUSH2 0x1E25 JUMP JUMPDEST POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO PUSH2 0x93E JUMPI PUSH1 0x0 PUSH2 0x1B0D DUP3 PUSH2 0x1B07 DUP6 PUSH2 0x943 JUMP JUMPDEST SWAP1 PUSH2 0x1240 JUMP JUMPDEST SWAP1 POP PUSH2 0x1B33 PUSH1 0xCD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x2664 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH2 0x1E25 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x65 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x66 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP4 DUP4 PUSH2 0x1B52 PUSH2 0x2109 JUMP JUMPDEST ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1BFE JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1C23 JUMPI POP PUSH2 0x1C23 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0x1C31 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1C6C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1C97 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x1C9F PUSH2 0x210D JUMP JUMPDEST PUSH2 0x1CA9 DUP4 DUP4 PUSH2 0x21AF JUMP JUMPDEST DUP1 ISZERO PUSH2 0x93E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1CD8 JUMPI POP PUSH2 0x1CD8 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0x1CE6 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1D21 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1D4C JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x1D54 PUSH2 0x210D JUMP JUMPDEST PUSH2 0x1D77 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x31 PUSH1 0xF8 SHL DUP2 MSTORE POP PUSH2 0x2287 JUMP JUMPDEST PUSH2 0x1D80 DUP3 PUSH2 0x2347 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x869 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x38 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x7CBAB1C7 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP6 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP6 SWAP1 MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x7CBAB1C7 SWAP2 PUSH1 0x64 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E08 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E1C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 DUP6 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 DUP5 MSTORE PUSH1 0x3 DUP2 ADD SWAP1 SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD DUP1 PUSH2 0x1FBC JUMPI DUP4 ISZERO PUSH2 0x1FB7 JUMPI PUSH1 0x1 DUP3 ADD SLOAD PUSH2 0x1F23 JUMPI POP PUSH1 0x2 DUP2 ADD DUP1 SLOAD PUSH1 0x1 DUP1 DUP3 ADD DUP4 SSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP1 SWAP3 KECCAK256 DUP2 ADD DUP6 SWAP1 SSTORE SWAP1 DUP2 EQ DUP1 ISZERO SWAP1 PUSH2 0x1E8F JUMPI POP DUP2 SLOAD PUSH1 0x0 NOT DUP3 ADD DUP2 PUSH2 0x1E8C JUMPI INVALID JUMPDEST MOD ISZERO JUMPDEST ISZERO PUSH2 0x1F1E JUMPI DUP2 SLOAD PUSH1 0x0 SWAP1 DUP3 DUP2 PUSH2 0x1EA1 JUMPI INVALID JUMPDEST DIV PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x2 DUP6 ADD DUP1 SLOAD SWAP3 SWAP4 POP SWAP1 SWAP2 PUSH1 0x1 DUP6 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP6 SWAP1 DUP2 LT PUSH2 0x1ED0 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD DUP4 SLOAD PUSH1 0x1 DUP2 ADD DUP6 SSTORE SWAP4 DUP4 MSTORE DUP2 DUP4 KECCAK256 SWAP1 SWAP4 ADD SWAP3 SWAP1 SWAP3 SSTORE SWAP4 DUP5 MSTORE PUSH1 0x4 DUP7 ADD DUP1 DUP3 MSTORE PUSH1 0x40 DUP1 DUP7 KECCAK256 DUP7 SWAP1 SSTORE DUP5 DUP7 MSTORE PUSH1 0x3 DUP9 ADD DUP4 MSTORE DUP1 DUP7 KECCAK256 DUP5 SWAP1 SSTORE SWAP3 DUP6 MSTORE SWAP1 MSTORE SWAP1 SWAP2 KECCAK256 SSTORE JUMPDEST PUSH2 0x1F84 JUMP JUMPDEST PUSH1 0x1 DUP3 ADD DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x1F37 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP DUP2 PUSH1 0x1 ADD DUP1 SLOAD DUP1 PUSH2 0x1F51 JUMPI INVALID JUMPDEST PUSH1 0x1 SWAP1 SUB DUP2 DUP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SSTORE SWAP1 SSTORE DUP4 DUP3 PUSH1 0x2 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x1F77 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SSTORE JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x3 DUP4 ADD PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 SWAP1 SSTORE DUP4 DUP4 MSTORE PUSH1 0x4 DUP6 ADD SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 DUP4 SWAP1 SSTORE PUSH2 0x1FB7 DUP7 DUP7 DUP4 PUSH1 0x1 DUP9 PUSH2 0x240D JUMP JUMPDEST PUSH2 0x2101 JUMP JUMPDEST DUP4 PUSH2 0x204D JUMPI PUSH1 0x0 DUP3 PUSH1 0x2 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x1FD2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP PUSH1 0x0 DUP4 PUSH1 0x2 ADD DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x1FF0 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SWAP3 SWAP1 SWAP3 SSTORE PUSH1 0x1 DUP1 DUP7 ADD DUP1 SLOAD SWAP2 DUP3 ADD DUP2 SSTORE DUP3 MSTORE DUP3 DUP3 KECCAK256 ADD DUP5 SWAP1 SSTORE DUP6 DUP2 MSTORE PUSH1 0x3 DUP6 ADD DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP3 SWAP1 SSTORE DUP5 DUP3 MSTORE PUSH1 0x4 DUP7 ADD SWAP1 SWAP3 MSTORE SWAP1 DUP2 KECCAK256 DUP2 SWAP1 SSTORE PUSH2 0x2047 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP6 SWAP1 DUP6 PUSH2 0x240D JUMP JUMPDEST POP PUSH2 0x2101 JUMP JUMPDEST DUP2 PUSH1 0x2 ADD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x205C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD DUP5 EQ PUSH2 0x2101 JUMPI PUSH1 0x0 DUP5 DUP4 PUSH1 0x2 ADD DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x207F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD GT ISZERO SWAP1 POP PUSH1 0x0 DUP2 PUSH2 0x20B6 JUMPI DUP6 DUP5 PUSH1 0x2 ADD DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x20A5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SUB PUSH2 0x20D3 JUMP JUMPDEST DUP4 PUSH1 0x2 ADD DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x20C5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD DUP7 SUB JUMPDEST SWAP1 POP DUP6 DUP5 PUSH1 0x2 ADD DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x20E5 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SSTORE PUSH2 0x20FE DUP9 DUP9 DUP6 DUP6 DUP6 PUSH2 0x240D JUMP JUMPDEST POP POP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST CHAINID SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2126 JUMPI POP PUSH2 0x2126 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0x2134 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x216F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x219A JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP1 ISZERO PUSH2 0x21AC JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x21C8 JUMPI POP PUSH2 0x21C8 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0x21D6 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2211 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x223C JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP3 MLOAD PUSH2 0x224F SWAP1 PUSH1 0x36 SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x24E2 JUMP JUMPDEST POP DUP2 MLOAD PUSH2 0x2263 SWAP1 PUSH1 0x37 SWAP1 PUSH1 0x20 DUP6 ADD SWAP1 PUSH2 0x24E2 JUMP JUMPDEST POP PUSH1 0x38 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x12 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x93E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x22A0 JUMPI POP PUSH2 0x22A0 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0x22AE JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x22E9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2314 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP3 MLOAD PUSH1 0x20 DUP1 DUP6 ADD SWAP2 SWAP1 SWAP2 KECCAK256 DUP4 MLOAD SWAP2 DUP5 ADD SWAP2 SWAP1 SWAP2 KECCAK256 PUSH1 0x65 SWAP2 SWAP1 SWAP2 SSTORE PUSH1 0x66 SSTORE DUP1 ISZERO PUSH2 0x93E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2360 JUMPI POP PUSH2 0x2360 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0x236E JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x23A9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x23D4 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 PUSH1 0x9A SSTORE DUP1 ISZERO PUSH2 0x869 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP7 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP4 JUMPDEST DUP1 ISZERO PUSH2 0x1E1C JUMPI DUP2 SLOAD PUSH1 0x0 NOT DUP3 ADD DUP2 PUSH2 0x2431 JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP4 PUSH2 0x245A JUMPI DUP3 DUP3 PUSH1 0x2 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x2449 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SUB PUSH2 0x2477 JUMP JUMPDEST DUP3 DUP3 PUSH1 0x2 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x246A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD ADD JUMPDEST DUP3 PUSH1 0x2 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x2486 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SSTORE PUSH2 0x241D JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x24D2 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x24D2 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x24B7 JUMP JUMPDEST POP PUSH2 0x24DE SWAP3 SWAP2 POP PUSH2 0x254F JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x2523 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x24D2 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x24D2 JUMPI SWAP2 DUP3 ADD DUP3 DUP2 GT ISZERO PUSH2 0x24D2 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x24B7 JUMP JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x24DE JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2550 JUMP INVALID GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220746F20746865207A65726F2061 PUSH5 0x6472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH3 0x75726E KECCAK256 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545524332 ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F766520746F20746865207A65726F20616464 PUSH19 0x65737345524332303A207472616E7366657220 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545434453 COINBASE GASPRICE KECCAK256 PUSH10 0x6E76616C696420736967 PUSH15 0x6174757265202773272076616C7565 0x49 PUSH15 0x697469616C697A61626C653A20636F PUSH15 0x747261637420697320616C72656164 PUSH26 0x20696E697469616C697A656445434453413A20696E76616C6964 KECCAK256 PUSH20 0x69676E6174757265202776272076616C7565AF45 0xC4 0xFB SWAP15 0xF7 MULMOD GT 0xE5 DIFFICULTY 0x4B DUP15 0xED 0xCE PUSH1 0x73 PUSH7 0xE494224D52E6FE 0xAB SMOD 0xFB 0xD6 0x2A MSTORE8 0xB2 PUSH16 0x45524332303A207472616E7366657220 PUSH2 0x6D6F PUSH22 0x6E74206578636565647320616C6C6F77616E6365436F PUSH15 0x74726F6C6C6564546F6B656E2F6578 PUSH4 0x65656473 0x2D PUSH2 0x6C6C PUSH16 0x77616E636545524332303A206275726E KECCAK256 PUSH7 0x726F6D20746865 KECCAK256 PUSH27 0x65726F206164647265737345524332303A207472616E7366657220 PUSH7 0x726F6D20746865 KECCAK256 PUSH27 0x65726F206164647265737345524332303A20617070726F76652066 PUSH19 0x6F6D20746865207A65726F2061646472657373 NUMBER PUSH16 0x6E74726F6C6C6564546F6B656E2F636F PUSH15 0x74726F6C6C65722D6E6F742D7A6572 PUSH16 0x45524332303A20646563726561736564 KECCAK256 PUSH2 0x6C6C PUSH16 0x77616E63652062656C6F77207A65726F LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x24 SWAP15 0xA7 0x1F RETURNDATASIZE MSTORE8 0xC9 GASLIMIT SWAP7 0x28 0x21 0xAE 0x27 DUP8 SWAP5 0x2E MULMOD SWAP8 0xB1 CHAINID 0xAB 0xDB KECCAK256 MSIZE CODESIZE 0xE3 0xEA 0x4D GASLIMIT NUMBER SELFBALANCE 0x28 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "283:3178:91:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2517:89:10;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4593:166;;;;;;;;;;;;;;;;-1:-1:-1;4593:166:10;;-1:-1:-1;;;;;4593:166:10;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;3584:106;;;:::i;:::-;;;;;;;;;;;;;;;;5226:317;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5226:317:10;;;;;;;;;;;;;;;;;:::i;3435:89::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2994:113:3;;;:::i;5938:215:10:-;;;;;;;;;;;;;;;;-1:-1:-1;5938:215:10;;-1:-1:-1;;;;;5938:215:10;;;;;;:::i;2052:378:91:-;;;;;;;;;;;;;;;;-1:-1:-1;2052:378:91;;:::i;:::-;;;;-1:-1:-1;;;;;2052:378:91;;;;;;;;;;;;;;1809:129:88;;;;;;;;;;;;;;;;-1:-1:-1;1809:129:88;;-1:-1:-1;;;;;1809:129:88;;;;;;:::i;:::-;;2732:356;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2732:356:88;;;;;;;;;;;;;;;;;:::i;3748:125:10:-;;;;;;;;;;;;;;;;-1:-1:-1;3748:125:10;-1:-1:-1;;;;;3748:125:10;;:::i;2752:118:3:-;;;;;;;;;;;;;;;;-1:-1:-1;2752:118:3;-1:-1:-1;;;;;2752:118:3;;:::i;1689:141:91:-;;;;;;;;;;;;;;;;-1:-1:-1;1689:141:91;-1:-1:-1;;;;;1689:141:91;;:::i;2203:129:88:-;;;;;;;;;;;;;;;;-1:-1:-1;2203:129:88;;-1:-1:-1;;;;;2203:129:88;;;;;;:::i;2719:93:10:-;;;:::i;6640:266::-;;;;;;;;;;;;;;;;-1:-1:-1;6640:266:10;;-1:-1:-1;;;;;6640:266:10;;;;;;:::i;4076:172::-;;;;;;;;;;;;;;;;-1:-1:-1;4076:172:10;;-1:-1:-1;;;;;4076:172:10;;;;;;:::i;1886:805:3:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1886:805:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1886:805:3;;;;;;;;:::i;4306:149:10:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4306:149:10;;;;;;;;;;:::i;1131:502:91:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1131:502:91;;;;;;;;-1:-1:-1;1131:502:91;;-1:-1:-1;;1131:502:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1131:502:91;;-1:-1:-1;;;1131:502:91;;;;;-1:-1:-1;;1131:502:91;;;-1:-1:-1;;;;;1131:502:91;;:::i;663:51:88:-;;;:::i;2517:89:10:-;2594:5;2587:12;;;;;;;;;;;;;-1:-1:-1;;2587:12:10;;;;;;;;;;;;;;;;;;;;;;;;;;2562:13;;2587:12;;2594:5;;2587:12;;;2594:5;2587:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2517:89;:::o;4593:166::-;4676:4;4692:39;4701:12;:10;:12::i;:::-;4715:7;4724:6;4692:8;:39::i;:::-;-1:-1:-1;4748:4:10;4593:166;;;;:::o;3584:106::-;3671:12;;3584:106;:::o;5226:317::-;5332:4;5348:36;5358:6;5366:9;5377:6;5348:9;:36::i;:::-;5394:121;5403:6;5411:12;:10;:12::i;:::-;5425:89;5463:6;5425:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5425:19:10;;;;;;:11;:19;;;;;;5445:12;:10;:12::i;:::-;-1:-1:-1;;;;;5425:33:10;;;;;;;;;;;;-1:-1:-1;5425:33:10;;;;:37;:89::i;:::-;5394:8;:121::i;:::-;-1:-1:-1;5532:4:10;5226:317;;;;;:::o;3435:89::-;3508:9;;;;3435:89;:::o;2994:113:3:-;3054:7;3080:20;:18;:20::i;:::-;3073:27;;2994:113;:::o;5938:215:10:-;6026:4;6042:83;6051:12;:10;:12::i;:::-;6065:7;6074:50;6113:10;6074:11;:25;6086:12;:10;:12::i;:::-;-1:-1:-1;;;;;6074:25:10;;;;;;;;;;;;;;;;;-1:-1:-1;6074:25:10;;;:34;;;;;;;;;;;:38;:50::i;2052:378:91:-;2120:7;2135:13;2151;:11;:13::i;:::-;2135:29;-1:-1:-1;2170:16:91;2196:10;2192:213;;-1:-1:-1;2235:1:91;2192:213;;;2258:13;2274:48;2302:12;2316:5;2274:27;:48::i;:::-;2258:64;-1:-1:-1;2357:39:91;:17;-1:-1:-1;;;;;;;;;;;2258:64:91;2357:22;:39::i;:::-;2349:48;-1:-1:-1;;2192:213:91;2417:8;2052:378;-1:-1:-1;;;2052:378:91:o;1809:129:88:-;3236:10;;-1:-1:-1;;;;;3236:10:88;3212:12;:10;:12::i;:::-;-1:-1:-1;;;;;3212:35:88;;3204:79;;;;;-1:-1:-1;;;3204:79:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;1912:21:::1;1918:5;1925:7;1912:5;:21::i;:::-;1809:129:::0;;:::o;2732:356::-;3236:10;;-1:-1:-1;;;;;3236:10:88;3212:12;:10;:12::i;:::-;-1:-1:-1;;;;;3212:35:88;;3204:79;;;;;-1:-1:-1;;;3204:79:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2862:18:88;;::::1;::::0;;::::1;;2858:199;;2890:26;2919:77;2951:7;2919:77;;;;;;;;;;;;;;;;;:27;2929:5;2936:9;2919;:27::i;:::-;:31:::0;:77;:31:::1;:77::i;:::-;2890:106;;3004:46;3013:5;3020:9;3031:18;3004:8;:46::i;:::-;2858:199;;3062:21;3068:5;3075:7;3062:5;:21::i;:::-;2732:356:::0;;;:::o;3748:125:10:-;-1:-1:-1;;;;;3848:18:10;3822:7;3848:18;;;:9;:18;;;;;;;3748:125::o;2752:118:3:-;-1:-1:-1;;;;;2839:14:3;;2813:7;2839:14;;;:7;:14;;;;;:24;;:22;:24::i;:::-;2832:31;2752:118;-1:-1:-1;;2752:118:3:o;1689:141:91:-;1744:7;1766:59;:17;-1:-1:-1;;;;;;;;;;;;;;;;1810:13:91;;1766:25;:59::i;2203:129:88:-;3236:10;;-1:-1:-1;;;;;3236:10:88;3212:12;:10;:12::i;:::-;-1:-1:-1;;;;;3212:35:88;;3204:79;;;;;-1:-1:-1;;;3204:79:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;2306:21:::1;2312:5;2319:7;2306:5;:21::i;2719:93:10:-:0;2798:7;2791:14;;;;;;;;;;;;;-1:-1:-1;;2791:14:10;;;;;;;;;;;;;;;;;;;;;;;;;;2766:13;;2791:14;;2798:7;;2791:14;;;2798:7;2791:14;;;;;;;;;;;;;;;;;;;;;;;;6640:266;6733:4;6749:129;6758:12;:10;:12::i;:::-;6772:7;6781:96;6820:15;6781:96;;;;;;;;;;;;;;;;;:11;:25;6793:12;:10;:12::i;:::-;-1:-1:-1;;;;;6781:25:10;;;;;;;;;;;;;;;;;-1:-1:-1;6781:25:10;;;:34;;;;;;;;;;;;:38;:96::i;4076:172::-;4162:4;4178:42;4188:12;:10;:12::i;:::-;4202:9;4213:6;4178:9;:42::i;1886:805:3:-;2113:8;2094:15;:27;;2086:69;;;;;-1:-1:-1;;;2086:69:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;2238:16;;-1:-1:-1;;;;;2343:14:3;;2166:18;2343:14;;;:7;:14;;;;;2166:18;;2238:16;2272:5;;2295:7;;2320:5;;2343:24;;:22;:24::i;:::-;2210:197;;;;;;;;;;;-1:-1:-1;;;;;2210:197:3;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2210:197:3;;;;;;;;;;;;;;;;;;;;;;;;;;;2187:230;;;;;;-1:-1:-1;;2443:28:3;2187:230;2443:16;:28::i;:::-;2428:43;;2482:14;2499:39;2524:4;2530:1;2533;2536;2499:24;:39::i;:::-;2482:56;-1:-1:-1;;;;;;2556:15:3;;;;;;;2548:58;;;;;-1:-1:-1;;;2548:58:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2617:14:3;;;;;;:7;:14;;;;;:26;;:24;:26::i;:::-;2653:31;2662:5;2669:7;2678:5;2653:8;:31::i;:::-;1886:805;;;;;;;;;;:::o;4306:149:10:-;-1:-1:-1;;;;;4421:18:10;;;4395:7;4421:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4306:149::o;1131:502:91:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;-1:-1:-1;;;;;1338:34:91;::::1;1330:73;;;::::0;;-1:-1:-1;;;1330:73:91;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;1409:66;1436:5;1443:7;1452:9;1463:11;1409:26;:66::i;:::-;1481:55;:17;-1:-1:-1::0;;;;;;;;;;;534:1:91::1;1481:28;:55::i;:::-;1547:81;1566:5;1579:7;1594:9;1611:11;1547:81;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;1547:81:91::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;1547:81:91;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1794:14:9::0;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1790:66;1131:502:91;;;;;:::o;663:51:88:-;;;-1:-1:-1;;;;;663:51:88;;:::o;828:104:19:-;915:10;828:104;:::o;9704:340:10:-;-1:-1:-1;;;;;9805:19:10;;9797:68;;;;-1:-1:-1;;;9797:68:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9883:21:10;;9875:68;;;;-1:-1:-1;;;9875:68:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9954:18:10;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10005:32;;;;;;;;;;;;;;;;;9704:340;;;:::o;7380:530::-;-1:-1:-1;;;;;7485:20:10;;7477:70;;;;-1:-1:-1;;;7477:70:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7565:23:10;;7557:71;;;;-1:-1:-1;;;7557:71:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7639:47;7660:6;7668:9;7679:6;7639:20;:47::i;:::-;7717:71;7739:6;7717:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7717:17:10;;;;;;:9;:17;;;;;;;;:21;:71::i;:::-;-1:-1:-1;;;;;7697:17:10;;;;;;;:9;:17;;;;;;:91;;;;7821:20;;;;;;;:32;;7846:6;7821:24;:32::i;:::-;-1:-1:-1;;;;;7798:20:10;;;;;;;:9;:20;;;;;;;;;:55;;;;7868:35;;;;;;;7798:20;;7868:35;;;;;;;;;;;;;7380:530;;;:::o;5443:163:8:-;5529:7;5564:12;5556:6;;;;5548:29;;;;-1:-1:-1;;;5548:29:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5594:5:8;;;5443:163::o;2695:160:2:-;2748:7;2774:74;1459:95;2808:17;:15;:17::i;:::-;2827:20;:18;:20::i;:::-;2774:21;:74::i;2701:175:8:-;2759:7;2790:5;;;2813:6;;;;2805:46;;;;;-1:-1:-1;;;2805:46:8;;;;;;;;;;;;;;;;;;;;;;;;;;;1218:394:29;1297:7;1334:1;1320:11;:15;1312:49;;;;;-1:-1:-1;;;1312:49:29;;;;;;;;;;;;-1:-1:-1;;;1312:49:29;;;;;;;;;;;;;;;1367:11;1396;1382;1381:12;;:26;;;;;;;-1:-1:-1;1430:8:29;1444:131;1479:3;1469:6;:13;1465:43;;1494:5;;1465:43;1542:24;;;;;;;;;;;;;;;;;;;;;;;;;;1532:35;;;;;1444:131;;;1596:11;1587:6;:20;;;;;;;1218:394;-1:-1:-1;;;;;1218:394:29:o;6873:877:102:-;6974:10;7028:28;;;;;;;;;;7135:10;;;:13;;6974:10;;;;;;7135:13;;;;;;;;;;;;7120:12;:28;;;;;;7094:54;;7159:529;7193:10;;;:17;7167:6;;:18;;7189:1;7166:24;:44;7159:529;;;7271:1;7257:431;7279:6;;7274:11;;7257:431;;7333:14;7373:1;7360:9;7351:4;:6;;;:18;7350:24;7333:41;;7392:14;7409:4;:10;;7420:9;7409:21;;;;;;;;;;;;;;;;7392:38;;7475:9;7453:18;:31;7449:225;;7508:9;7486:31;;;;7449:225;;;-1:-1:-1;7619:9:102;-1:-1:-1;7650:5:102;;7449:225;-1:-1:-1;;7287:3:102;;7257:431;;;;7159:529;;;-1:-1:-1;7711:32:102;;;;:21;;;;:32;;;;;;;6873:877;-1:-1:-1;;;;6873:877:102:o;8181:370:10:-;-1:-1:-1;;;;;8264:21:10;;8256:65;;;;;-1:-1:-1;;;8256:65:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;8332:49;8361:1;8365:7;8374:6;8332:20;:49::i;:::-;8407:12;;:24;;8424:6;8407:16;:24::i;:::-;8392:12;:39;-1:-1:-1;;;;;8462:18:10;;;;;;:9;:18;;;;;;:30;;8485:6;8462:22;:30::i;:::-;-1:-1:-1;;;;;8441:18:10;;;;;;:9;:18;;;;;;;;:51;;;;8507:37;;;;;;;8441:18;;;;8507:37;;;;;;;;;;8181:370;;:::o;8871:410::-;-1:-1:-1;;;;;8954:21:10;;8946:67;;;;-1:-1:-1;;;8946:67:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9024:49;9045:7;9062:1;9066:6;9024:20;:49::i;:::-;9105:68;9128:6;9105:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9105:18:10;;;;;;:9;:18;;;;;;;;:22;:68::i;:::-;-1:-1:-1;;;;;9084:18:10;;;;;;:9;:18;;;;;:89;9198:12;;:24;;9215:6;9198:16;:24::i;:::-;9183:12;:39;9237:37;;;;;;;;9263:1;;-1:-1:-1;;;;;9237:37:10;;;;;;;;;;;;8871:410;;:::o;1139:112:20:-;1230:14;;1139:112::o;7942:324:102:-;8040:10;8094:28;;;;;;;;;;;8149:26;;;:21;;;:26;;;;;;8190:14;8186:73;;8214:1;8206:9;;8186:73;;;8238:4;:10;;8249:9;8238:21;;;;;;;;;;;;;;;;8230:29;;8186:73;7942:324;;;;;;;:::o;3813:183:2:-;3890:7;3955:20;:18;:20::i;:::-;3977:10;3926:62;;;;;;-1:-1:-1;;;3926:62:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3916:73;;;;;;3909:80;;3813:183;;;:::o;1971:1414:1:-;2056:7;2971:66;2957:80;;;2949:127;;;;-1:-1:-1;;;2949:127:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3094:1;:7;;3099:2;3094:7;:18;;;;3105:1;:7;;3110:2;3105:7;3094:18;3086:65;;;;-1:-1:-1;;;3086:65:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3246:14;3263:24;3273:4;3279:1;3282;3285;3263:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3263:24:1;;-1:-1:-1;;3263:24:1;;;-1:-1:-1;;;;;;;3305:20:1;;3297:57;;;;;-1:-1:-1;;;3297:57:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;3372:6;1971:1414;-1:-1:-1;;;;;1971:1414:1:o;1257:178:20:-;1409:19;;1427:1;1409:19;;;1257:178::o;1952:123:9:-;2000:4;2024:44;2062:4;2024:29;:44::i;:::-;2023:45;2016:52;;1952:123;:::o;1033:517:88:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;-1:-1:-1;;;;;1227:34:88;::::1;1219:82;;;;-1:-1:-1::0;;;1219:82:88::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1307:28;1320:5;1327:7;1307:12;:28::i;:::-;1341:50;;;;;;;;;;;;;;;;;::::0;:18:::1;:50::i;:::-;1397:10;:24:::0;;-1:-1:-1;;;;;;1397:24:88::1;-1:-1:-1::0;;;;;1397:24:88;::::1;;::::0;;1427:25:::1;1442:9:::0;1427:14:::1;:25::i;1324:392:102:-:0;1418:29;1450:28;;;;;;;;;;1496:6;;:11;1488:44;;;;;-1:-1:-1;;;1488:44:102;;;;;;;;;;;;-1:-1:-1;;;1488:44:102;;;;;;;;;;;;;;;1555:1;1550:2;:6;1542:46;;;;;-1:-1:-1;;;1542:46:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;1598:11;;;1632:13;;;1598:6;1632:13;;;;;;;;;1619:26;;;:10;;;;:26;:::i;:::-;-1:-1:-1;1668:13:102;;;1679:1;1668:13;;;;;;;;;1655:26;;;:10;;;;:26;:::i;:::-;-1:-1:-1;1691:10:102;;:18;;;;;;;1707:1;1691:18;;;;;;;;-1:-1:-1;;;1324:392:102:o;2890:568:91:-;2994:44;3021:4;3027:2;3031:6;2994:26;:44::i;:::-;-1:-1:-1;;;;;3091:10:91;;;;;;;3087:37;;;3111:7;;3087:37;-1:-1:-1;;;;;3134:18:91;;;3130:164;;3162:19;3184:27;3204:6;3184:15;3194:4;3184:9;:15::i;:::-;:19;;:27::i;:::-;3162:49;-1:-1:-1;3219:68:91;:17;-1:-1:-1;;;;;;;;;;;3162:49:91;-1:-1:-1;;;;;3272:13:91;;3219:21;:68::i;:::-;3130:164;;-1:-1:-1;;;;;3304:16:91;;;3300:154;;3330:17;3350:25;3368:6;3350:13;3360:2;3350:9;:13::i;:::-;:17;;:25::i;:::-;3330:45;-1:-1:-1;3383:64:91;:17;-1:-1:-1;;;;;;;;;;;3330:45:91;-1:-1:-1;;;;;3434:11:91;;3383:21;:64::i;:::-;3300:154;2890:568;;;:::o;4558:103:2:-;4642:12;;4558:103;:::o;4900:109::-;4987:15;;4900:109;:::o;2861:327::-;2963:7;3040:8;3066:4;3088:7;3113:13;:11;:13::i;:::-;3012:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3152:4;3012:159;;;;;;;;;;;;;;;;;;;;;;;;2989:192;;;;;;2861:327;-1:-1:-1;;;;2861:327:2:o;3147:155:8:-;3205:7;3237:1;3232;:6;;3224:49;;;;;-1:-1:-1;;;3224:49:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3290:5:8;;;3147:155::o;737:413:18:-;1097:20;1135:8;;;737:413::o;2090:178:10:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;2187:26:10::1;:24;:26::i;:::-;2223:38;2246:5;2253:7;2223:22;:38::i;:::-;1794:14:9::0;1790:66;;;-1:-1:-1;;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;-1:-1:-1;2090:178:10:o;1409:200:3:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1488:26:3::1;:24;:26::i;:::-;1524:34;1548:4;1524:34;;;;;;;;;;;;;-1:-1:-1::0;;;1524:34:3::1;;::::0;:23:::1;:34::i;:::-;1568;1597:4;1568:28;:34::i;:::-;1794:14:9::0;1790:66;;;-1:-1:-1;;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;1409:200:3:o;10367:96:10:-;10435:9;:21;;-1:-1:-1;;10435:21:10;;;;;;;;;;;;10367:96::o;3755:157:88:-;3859:10;;:48;;;-1:-1:-1;;;3859:48:88;;-1:-1:-1;;;;;3859:48:88;;;;;;;;;;;;;;;;;;;;;;:10;;;;;-1:-1:-1;;3859:48:88;;;;;-1:-1:-1;;3859:48:88;;;;;;;-1:-1:-1;3859:10:88;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3755:157;;;:::o;2049:2768:102:-;2153:29;2185:28;;;;;;;;;;;2240:26;;;:21;;;:26;;;;;;;2281:14;2277:2534;;2336:11;;2332:1488;;2446:10;;;:17;2442:1152;;-1:-1:-1;2583:10:102;;;:17;;2622:23;;;;;;-1:-1:-1;2622:23:102;;;;;;;;;;;;2583:17;2757:14;;;;;:47;;-1:-1:-1;2793:6:102;;-1:-1:-1;;2776:13:102;;2793:6;2775:24;;;;;:29;2757:47;2753:561;;;2882:6;;2851:16;;2870:9;2882:6;2870:18;;;;;2914:16;2933:34;;;:21;;;:34;;;;;;3048:10;;;3064:23;;2870:18;;-1:-1:-1;2933:34:102;;3021:1;3009:13;;;3048:10;;;2870:18;;3064:23;;;;;;;;;;;;;;;;;;3048:40;;;;;;;;;;;;;;;;;;;;3121:34;;;:21;;;:34;;;;;;;3114:41;;;3181:31;;;:21;;;:31;;;;;:42;;;3249:31;;;;;;;;:42;2753:561;2442:1152;;;3452:10;;;3463:17;;-1:-1:-1;;3463:21:102;;;3452:33;;;;;;;;;;;;;;3440:45;;3507:4;:10;;:16;;;;;;;;;;;;;;;;;;;;;;;;3569:6;3545:4;:10;;3556:9;3545:21;;;;;;;;;;;;;;;;;:30;2442:1152;3642:26;;;;:21;;;:26;;;;;;;;:38;;;3698:32;;;:21;;;:32;;;;;:38;;;3755:50;3769:4;3775;3671:9;3792:4;3798:6;3755:13;:50::i;:::-;2277:2534;;;3872:11;3868:933;;3993:10;4006:4;:10;;4017:9;4006:21;;;;;;;;;;;;;;;;3993:34;;4069:1;4045:4;:10;;4056:9;4045:21;;;;;;;;;;;;;;;;;;;:25;;;;4123:10;;;;:26;;;;;;;;;;;;;;;;4207;;;:21;;;:26;;;;;;4200:33;;;4258:32;;;:21;;;:32;;;;;;4251:39;;;4309:50;;4323:4;;4329;;4139:9;;4353:5;4309:13;:50::i;:::-;3868:933;;;;4394:4;:10;;4405:9;4394:21;;;;;;;;;;;;;;;;4384:6;:31;4380:421;;4483:16;4527:6;4502:4;:10;;4513:9;4502:21;;;;;;;;;;;;;;;;:31;;4483:50;;4551:21;4575:11;:77;;4646:6;4622:4;:10;;4633:9;4622:21;;;;;;;;;;;;;;;;:30;4575:77;;;4598:4;:10;;4609:9;4598:21;;;;;;;;;;;;;;;;4589:6;:30;4575:77;4551:101;;4694:6;4670:4;:10;;4681:9;4670:21;;;;;;;;;;;;;;;;;:30;4719:67;4733:4;4739;4745:9;4756:11;4769:16;4719:13;:67::i;:::-;4380:421;;;2049:2768;;;;;;:::o;4002:320:2:-;4297:9;;4272:44::o;759:64:19:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1794:14;1790:66;;;1840:5;1824:21;;-1:-1:-1;;1824:21:9;;;1790:66;759:64:19;:::o;2274:178:10:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;2381:13:10;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;2404:17:10;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;2431:9:10::1;:14:::0;;-1:-1:-1;;2431:14:10::1;2443:2;2431:14;::::0;;1790:66:9;;;;-1:-1:-1;;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;-1:-1:-1;2274:178:10:o;2317:292:2:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;2445:22:2;;::::1;::::0;;::::1;::::0;;;;2501:25;;;;::::1;::::0;;;;2536:12:::1;:25:::0;;;;2571:15:::1;:31:::0;1790:66:9;;;;-1:-1:-1;;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;-1:-1:-1;2317:292:2:o;1615:210:3:-;1512:13:9;;;;;;;;:33;;;1529:16;:14;:16::i;:::-;1512:50;;;-1:-1:-1;1550:12:9;;;;1549:13;1512:50;1504:109;;;;-1:-1:-1;;;1504:109:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1624:19;1647:13;;;;;;1646:14;1670:98;;;;1704:13;:20;;-1:-1:-1;;;;1704:20:9;;;;;1738:19;1720:4;1738:19;;;1670:98;1723:95:3::1;1704:16;:114:::0;1790:66:9;;;;-1:-1:-1;;1840:5:9;1824:21;;-1:-1:-1;;1824:21:9;;;1615:210:3:o;9043:464:102:-;9179:29;9211:28;;;;;;;;;;9269:10;9289:212;9296:16;;9289:212;;9362:6;;-1:-1:-1;;9343:15:102;;9362:6;9342:26;;;;;9328:40;;9408:12;:82;;9484:6;9458:4;:10;;9469:11;9458:23;;;;;;;;;;;;;;;;:32;9408:82;;;9449:6;9423:4;:10;;9434:11;9423:23;;;;;;;;;;;;;;;;:32;9408:82;9382:4;:10;;9393:11;9382:23;;;;;;;;;;;;;;;;;:108;9289:212;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "2032800",
                "executionCost": "2156",
                "totalCost": "2034956"
              },
              "external": {
                "DOMAIN_SEPARATOR()": "infinite",
                "allowance(address,address)": "1338",
                "approve(address,uint256)": "infinite",
                "balanceOf(address)": "1165",
                "chanceOf(address)": "infinite",
                "controller()": "1169",
                "controllerBurn(address,uint256)": "infinite",
                "controllerBurnFrom(address,address,uint256)": "infinite",
                "controllerMint(address,uint256)": "infinite",
                "decimals()": "1125",
                "decreaseAllowance(address,uint256)": "infinite",
                "draw(uint256)": "infinite",
                "increaseAllowance(address,uint256)": "infinite",
                "initialize(string,string,uint8,address)": "infinite",
                "name()": "infinite",
                "nonces(address)": "1227",
                "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": "infinite",
                "symbol()": "infinite",
                "totalSupply()": "1066",
                "transfer(address,uint256)": "infinite",
                "transferFrom(address,address,uint256)": "infinite"
              },
              "internal": {
                "_beforeTokenTransfer(address,address,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {
              "DOMAIN_SEPARATOR()": "3644e515",
              "allowance(address,address)": "dd62ed3e",
              "approve(address,uint256)": "095ea7b3",
              "balanceOf(address)": "70a08231",
              "chanceOf(address)": "885d194d",
              "controller()": "f77c4791",
              "controllerBurn(address,uint256)": "90596dd1",
              "controllerBurnFrom(address,address,uint256)": "631b5dfb",
              "controllerMint(address,uint256)": "5d7b0758",
              "decimals()": "313ce567",
              "decreaseAllowance(address,uint256)": "a457c2d7",
              "draw(uint256)": "3b304147",
              "increaseAllowance(address,uint256)": "39509351",
              "initialize(string,string,uint8,address)": "de7ea79d",
              "name()": "06fdde03",
              "nonces(address)": "7ecebe00",
              "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)": "d505accf",
              "symbol()": "95d89b41",
              "totalSupply()": "18160ddd",
              "transfer(address,uint256)": "a9059cbb",
              "transferFrom(address,address,uint256)": "23b872dd"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"contract TokenControllerInterface\",\"name\":\"_controller\",\"type\":\"address\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"chanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"controller\",\"outputs\":[{\"internalType\":\"contract TokenControllerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"controllerBurn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"controllerBurnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"controllerMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"randomNumber\",\"type\":\"uint256\"}],\"name\":\"draw\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"},{\"internalType\":\"contract TokenControllerInterface\",\"name\":\"_controller\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Initialized(string,string,uint8,address)\":{\"details\":\"Emitted when an instance is initialized\"}},\"kind\":\"dev\",\"methods\":{\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"controllerBurn(address,uint256)\":{\"details\":\"May be overridden to provide more granular control over burning\",\"params\":{\"_amount\":\"Amount of tokens to burn\",\"_user\":\"Address of the holder account to burn tokens from\"}},\"controllerBurnFrom(address,address,uint256)\":{\"details\":\"May be overridden to provide more granular control over operator-burning\",\"params\":{\"_amount\":\"Amount of tokens to burn\",\"_operator\":\"Address of the operator performing the burn action via the controller contract\",\"_user\":\"Address of the holder account to burn tokens from\"}},\"controllerMint(address,uint256)\":{\"details\":\"May be overridden to provide more granular control over minting\",\"params\":{\"_amount\":\"Amount of tokens to mint\",\"_user\":\"Address of the receiver of the minted tokens\"}},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is called. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"draw(uint256)\":{\"params\":{\"randomNumber\":\"The random number to use to select a user.\"},\"returns\":{\"_0\":\"The winner\"}},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"initialize(string,string,uint8,address)\":{\"params\":{\"_controller\":\"Address of the Controller contract for minting & burning\",\"_decimals\":\"The number of decimals for the Token\",\"_name\":\"The name of the Token\",\"_symbol\":\"The symbol for the Token\"}},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"chanceOf(address)\":{\"notice\":\"Returns the user's chance of winning.\"},\"controller()\":{\"notice\":\"Interface to the contract responsible for controlling mint/burn\"},\"controllerBurn(address,uint256)\":{\"notice\":\"Allows the controller to burn tokens from a user account\"},\"controllerBurnFrom(address,address,uint256)\":{\"notice\":\"Allows an operator via the controller to burn tokens on behalf of a user account\"},\"controllerMint(address,uint256)\":{\"notice\":\"Allows the controller to mint tokens for a user account\"},\"draw(uint256)\":{\"notice\":\"Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\"},\"initialize(string,string,uint8,address)\":{\"notice\":\"Initializes the Controlled Token with Token Details and the Controller\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/Ticket.sol\":\"Ticket\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@pooltogether/uniform-random-number/contracts/UniformRandomNumber.sol\":{\"content\":\"/**\\nCopyright 2019 PoolTogether LLC\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice A library that uses entropy to select a random number within a bound.  Compensates for modulo bias.\\n * @dev Thanks to https://medium.com/hownetworks/dont-waste-cycles-with-modulo-bias-35b6fdafcf94\\n */\\nlibrary UniformRandomNumber {\\n  /// @notice Select a random number without modulo bias using a random seed and upper bound\\n  /// @param _entropy The seed for randomness\\n  /// @param _upperBound The upper bound of the desired number\\n  /// @return A random number less than the _upperBound\\n  function uniform(uint256 _entropy, uint256 _upperBound) internal pure returns (uint256) {\\n    require(_upperBound > 0, \\\"UniformRand/min-bound\\\");\\n    uint256 min = -_upperBound % _upperBound;\\n    uint256 random = _entropy;\\n    while (true) {\\n      if (random >= min) {\\n        break;\\n      }\\n      random = uint256(keccak256(abi.encodePacked(random)));\\n    }\\n    return random % _upperBound;\\n  }\\n}\",\"keccak256\":\"0x0d86eb3349d8a9e226ff6f3328a6a79bbf872859a4afbe489051fbf3b8550df4\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/Ticket.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"sortition-sum-tree-factory/contracts/SortitionSumTreeFactory.sol\\\";\\nimport \\\"@pooltogether/uniform-random-number/contracts/UniformRandomNumber.sol\\\";\\n\\nimport \\\"./ControlledToken.sol\\\";\\nimport \\\"./TicketInterface.sol\\\";\\n\\ncontract Ticket is ControlledToken, TicketInterface {\\n  using SortitionSumTreeFactory for SortitionSumTreeFactory.SortitionSumTrees;\\n\\n  bytes32 constant private TREE_KEY = keccak256(\\\"PoolTogether/Ticket\\\");\\n  uint256 constant private MAX_TREE_LEAVES = 5;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  // Ticket-weighted odds\\n  SortitionSumTreeFactory.SortitionSumTrees internal sortitionSumTrees;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    override\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"Ticket/controller-not-zero\\\");\\n    ControlledToken.initialize(_name, _symbol, _decimals, _controller);\\n    sortitionSumTrees.createTree(TREE_KEY, MAX_TREE_LEAVES);\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Returns the user's chance of winning.\\n  function chanceOf(address user) external view returns (uint256) {\\n    return sortitionSumTrees.stakeOf(TREE_KEY, bytes32(uint256(user)));\\n  }\\n\\n  /// @notice Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\\n  /// @param randomNumber The random number to use to select a user.\\n  /// @return The winner\\n  function draw(uint256 randomNumber) external view override returns (address) {\\n    uint256 bound = totalSupply();\\n    address selected;\\n    if (bound == 0) {\\n      selected = address(0);\\n    } else {\\n      uint256 token = UniformRandomNumber.uniform(randomNumber, bound);\\n      selected = address(uint256(sortitionSumTrees.draw(TREE_KEY, token)));\\n    }\\n    return selected;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    super._beforeTokenTransfer(from, to, amount);\\n\\n    // optimize: ignore transfers to self\\n    if (from == to) {\\n      return;\\n    }\\n\\n    if (from != address(0)) {\\n      uint256 fromBalance = balanceOf(from).sub(amount);\\n      sortitionSumTrees.set(TREE_KEY, fromBalance, bytes32(uint256(from)));\\n    }\\n\\n    if (to != address(0)) {\\n      uint256 toBalance = balanceOf(to).add(amount);\\n      sortitionSumTrees.set(TREE_KEY, toBalance, bytes32(uint256(to)));\\n    }\\n  }\\n\\n}\",\"keccak256\":\"0xf659dcfda626c713b7dd64525476d282e141163977edd881b647e83f505c4044\",\"license\":\"GPL-3.0\"},\"contracts/token/TicketInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface TicketInterface {\\n  /// @notice Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\\n  /// @param randomNumber The random number to use to select a user.\\n  /// @return The winner\\n  function draw(uint256 randomNumber) external view returns (address);\\n}\",\"keccak256\":\"0x5201a9a22748781592abd2003801289224d4899292195b7de937cd5748be87dd\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"sortition-sum-tree-factory/contracts/SortitionSumTreeFactory.sol\":{\"content\":\"/**\\n *  @reviewers: [@clesaege, @unknownunknown1, @ferittuncer]\\n *  @auditors: []\\n *  @bounties: [<14 days 10 ETH max payout>]\\n *  @deployments: []\\n */\\n\\npragma solidity ^0.6.0;\\n\\n/**\\n *  @title SortitionSumTreeFactory\\n *  @author Enrique Piqueras - <epiquerass@gmail.com>\\n *  @dev A factory of trees that keep track of staked values for sortition.\\n */\\nlibrary SortitionSumTreeFactory {\\n    /* Structs */\\n\\n    struct SortitionSumTree {\\n        uint K; // The maximum number of childs per node.\\n        // We use this to keep track of vacant positions in the tree after removing a leaf. This is for keeping the tree as balanced as possible without spending gas on moving nodes around.\\n        uint[] stack;\\n        uint[] nodes;\\n        // Two-way mapping of IDs to node indexes. Note that node index 0 is reserved for the root node, and means the ID does not have a node.\\n        mapping(bytes32 => uint) IDsToNodeIndexes;\\n        mapping(uint => bytes32) nodeIndexesToIDs;\\n    }\\n\\n    /* Storage */\\n\\n    struct SortitionSumTrees {\\n        mapping(bytes32 => SortitionSumTree) sortitionSumTrees;\\n    }\\n\\n    /* internal */\\n\\n    /**\\n     *  @dev Create a sortition sum tree at the specified key.\\n     *  @param _key The key of the new tree.\\n     *  @param _K The number of children each node in the tree should have.\\n     */\\n    function createTree(SortitionSumTrees storage self, bytes32 _key, uint _K) internal {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        require(tree.K == 0, \\\"Tree already exists.\\\");\\n        require(_K > 1, \\\"K must be greater than one.\\\");\\n        tree.K = _K;\\n        tree.stack = new uint[](0);\\n        tree.nodes = new uint[](0);\\n        tree.nodes.push(0);\\n    }\\n\\n    /**\\n     *  @dev Set a value of a tree.\\n     *  @param _key The key of the tree.\\n     *  @param _value The new value.\\n     *  @param _ID The ID of the value.\\n     *  `O(log_k(n))` where\\n     *  `k` is the maximum number of childs per node in the tree,\\n     *   and `n` is the maximum number of nodes ever appended.\\n     */\\n    function set(SortitionSumTrees storage self, bytes32 _key, uint _value, bytes32 _ID) internal {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        uint treeIndex = tree.IDsToNodeIndexes[_ID];\\n\\n        if (treeIndex == 0) { // No existing node.\\n            if (_value != 0) { // Non zero value.\\n                // Append.\\n                // Add node.\\n                if (tree.stack.length == 0) { // No vacant spots.\\n                    // Get the index and append the value.\\n                    treeIndex = tree.nodes.length;\\n                    tree.nodes.push(_value);\\n\\n                    // Potentially append a new node and make the parent a sum node.\\n                    if (treeIndex != 1 && (treeIndex - 1) % tree.K == 0) { // Is first child.\\n                        uint parentIndex = treeIndex / tree.K;\\n                        bytes32 parentID = tree.nodeIndexesToIDs[parentIndex];\\n                        uint newIndex = treeIndex + 1;\\n                        tree.nodes.push(tree.nodes[parentIndex]);\\n                        delete tree.nodeIndexesToIDs[parentIndex];\\n                        tree.IDsToNodeIndexes[parentID] = newIndex;\\n                        tree.nodeIndexesToIDs[newIndex] = parentID;\\n                    }\\n                } else { // Some vacant spot.\\n                    // Pop the stack and append the value.\\n                    treeIndex = tree.stack[tree.stack.length - 1];\\n                    tree.stack.pop();\\n                    tree.nodes[treeIndex] = _value;\\n                }\\n\\n                // Add label.\\n                tree.IDsToNodeIndexes[_ID] = treeIndex;\\n                tree.nodeIndexesToIDs[treeIndex] = _ID;\\n\\n                updateParents(self, _key, treeIndex, true, _value);\\n            }\\n        } else { // Existing node.\\n            if (_value == 0) { // Zero value.\\n                // Remove.\\n                // Remember value and set to 0.\\n                uint value = tree.nodes[treeIndex];\\n                tree.nodes[treeIndex] = 0;\\n\\n                // Push to stack.\\n                tree.stack.push(treeIndex);\\n\\n                // Clear label.\\n                delete tree.IDsToNodeIndexes[_ID];\\n                delete tree.nodeIndexesToIDs[treeIndex];\\n\\n                updateParents(self, _key, treeIndex, false, value);\\n            } else if (_value != tree.nodes[treeIndex]) { // New, non zero value.\\n                // Set.\\n                bool plusOrMinus = tree.nodes[treeIndex] <= _value;\\n                uint plusOrMinusValue = plusOrMinus ? _value - tree.nodes[treeIndex] : tree.nodes[treeIndex] - _value;\\n                tree.nodes[treeIndex] = _value;\\n\\n                updateParents(self, _key, treeIndex, plusOrMinus, plusOrMinusValue);\\n            }\\n        }\\n    }\\n\\n    /* internal Views */\\n\\n    /**\\n     *  @dev Query the leaves of a tree. Note that if `startIndex == 0`, the tree is empty and the root node will be returned.\\n     *  @param _key The key of the tree to get the leaves from.\\n     *  @param _cursor The pagination cursor.\\n     *  @param _count The number of items to return.\\n     *  @return startIndex The index at which leaves start\\n     *  @return values The values of the returned leaves\\n     *  @return hasMore Whether there are more for pagination.\\n     *  `O(n)` where\\n     *  `n` is the maximum number of nodes ever appended.\\n     */\\n    function queryLeafs(\\n        SortitionSumTrees storage self,\\n        bytes32 _key,\\n        uint _cursor,\\n        uint _count\\n    ) internal view returns(uint startIndex, uint[] memory values, bool hasMore) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n\\n        // Find the start index.\\n        for (uint i = 0; i < tree.nodes.length; i++) {\\n            if ((tree.K * i) + 1 >= tree.nodes.length) {\\n                startIndex = i;\\n                break;\\n            }\\n        }\\n\\n        // Get the values.\\n        uint loopStartIndex = startIndex + _cursor;\\n        values = new uint[](loopStartIndex + _count > tree.nodes.length ? tree.nodes.length - loopStartIndex : _count);\\n        uint valuesIndex = 0;\\n        for (uint j = loopStartIndex; j < tree.nodes.length; j++) {\\n            if (valuesIndex < _count) {\\n                values[valuesIndex] = tree.nodes[j];\\n                valuesIndex++;\\n            } else {\\n                hasMore = true;\\n                break;\\n            }\\n        }\\n    }\\n\\n    /**\\n     *  @dev Draw an ID from a tree using a number. Note that this function reverts if the sum of all values in the tree is 0.\\n     *  @param _key The key of the tree.\\n     *  @param _drawnNumber The drawn number.\\n     *  @return ID The drawn ID.\\n     *  `O(k * log_k(n))` where\\n     *  `k` is the maximum number of childs per node in the tree,\\n     *   and `n` is the maximum number of nodes ever appended.\\n     */\\n    function draw(SortitionSumTrees storage self, bytes32 _key, uint _drawnNumber) internal view returns(bytes32 ID) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        uint treeIndex = 0;\\n        uint currentDrawnNumber = _drawnNumber % tree.nodes[0];\\n\\n        while ((tree.K * treeIndex) + 1 < tree.nodes.length)  // While it still has children.\\n            for (uint i = 1; i <= tree.K; i++) { // Loop over children.\\n                uint nodeIndex = (tree.K * treeIndex) + i;\\n                uint nodeValue = tree.nodes[nodeIndex];\\n\\n                if (currentDrawnNumber >= nodeValue) currentDrawnNumber -= nodeValue; // Go to the next child.\\n                else { // Pick this child.\\n                    treeIndex = nodeIndex;\\n                    break;\\n                }\\n            }\\n        \\n        ID = tree.nodeIndexesToIDs[treeIndex];\\n    }\\n\\n    /** @dev Gets a specified ID's associated value.\\n     *  @param _key The key of the tree.\\n     *  @param _ID The ID of the value.\\n     *  @return value The associated value.\\n     */\\n    function stakeOf(SortitionSumTrees storage self, bytes32 _key, bytes32 _ID) internal view returns(uint value) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        uint treeIndex = tree.IDsToNodeIndexes[_ID];\\n\\n        if (treeIndex == 0) value = 0;\\n        else value = tree.nodes[treeIndex];\\n    }\\n\\n    function total(SortitionSumTrees storage self, bytes32 _key) internal view returns (uint) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        if (tree.nodes.length == 0) {\\n            return 0;\\n        } else {\\n            return tree.nodes[0];\\n        }\\n    }\\n\\n    /* Private */\\n\\n    /**\\n     *  @dev Update all the parents of a node.\\n     *  @param _key The key of the tree to update.\\n     *  @param _treeIndex The index of the node to start from.\\n     *  @param _plusOrMinus Wether to add (true) or substract (false).\\n     *  @param _value The value to add or substract.\\n     *  `O(log_k(n))` where\\n     *  `k` is the maximum number of childs per node in the tree,\\n     *   and `n` is the maximum number of nodes ever appended.\\n     */\\n    function updateParents(SortitionSumTrees storage self, bytes32 _key, uint _treeIndex, bool _plusOrMinus, uint _value) private {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n\\n        uint parentIndex = _treeIndex;\\n        while (parentIndex != 0) {\\n            parentIndex = (parentIndex - 1) / tree.K;\\n            tree.nodes[parentIndex] = _plusOrMinus ? tree.nodes[parentIndex] + _value : tree.nodes[parentIndex] - _value;\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa20ece2e1ddeaa6432549a7c38cd02594000b93a54b92399b89bae0dd76dbc7e\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 1293,
                "contract": "contracts/token/Ticket.sol:Ticket",
                "label": "_initialized",
                "offset": 0,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 1296,
                "contract": "contracts/token/Ticket.sol:Ticket",
                "label": "_initializing",
                "offset": 1,
                "slot": "0",
                "type": "t_bool"
              },
              {
                "astId": 3626,
                "contract": "contracts/token/Ticket.sol:Ticket",
                "label": "__gap",
                "offset": 0,
                "slot": "1",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 1372,
                "contract": "contracts/token/Ticket.sol:Ticket",
                "label": "_balances",
                "offset": 0,
                "slot": "51",
                "type": "t_mapping(t_address,t_uint256)"
              },
              {
                "astId": 1378,
                "contract": "contracts/token/Ticket.sol:Ticket",
                "label": "_allowances",
                "offset": 0,
                "slot": "52",
                "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
              },
              {
                "astId": 1380,
                "contract": "contracts/token/Ticket.sol:Ticket",
                "label": "_totalSupply",
                "offset": 0,
                "slot": "53",
                "type": "t_uint256"
              },
              {
                "astId": 1382,
                "contract": "contracts/token/Ticket.sol:Ticket",
                "label": "_name",
                "offset": 0,
                "slot": "54",
                "type": "t_string_storage"
              },
              {
                "astId": 1384,
                "contract": "contracts/token/Ticket.sol:Ticket",
                "label": "_symbol",
                "offset": 0,
                "slot": "55",
                "type": "t_string_storage"
              },
              {
                "astId": 1386,
                "contract": "contracts/token/Ticket.sol:Ticket",
                "label": "_decimals",
                "offset": 0,
                "slot": "56",
                "type": "t_uint8"
              },
              {
                "astId": 1881,
                "contract": "contracts/token/Ticket.sol:Ticket",
                "label": "__gap",
                "offset": 0,
                "slot": "57",
                "type": "t_array(t_uint256)44_storage"
              },
              {
                "astId": 254,
                "contract": "contracts/token/Ticket.sol:Ticket",
                "label": "_HASHED_NAME",
                "offset": 0,
                "slot": "101",
                "type": "t_bytes32"
              },
              {
                "astId": 256,
                "contract": "contracts/token/Ticket.sol:Ticket",
                "label": "_HASHED_VERSION",
                "offset": 0,
                "slot": "102",
                "type": "t_bytes32"
              },
              {
                "astId": 405,
                "contract": "contracts/token/Ticket.sol:Ticket",
                "label": "__gap",
                "offset": 0,
                "slot": "103",
                "type": "t_array(t_uint256)50_storage"
              },
              {
                "astId": 430,
                "contract": "contracts/token/Ticket.sol:Ticket",
                "label": "_nonces",
                "offset": 0,
                "slot": "153",
                "type": "t_mapping(t_address,t_struct(Counter)3637_storage)"
              },
              {
                "astId": 432,
                "contract": "contracts/token/Ticket.sol:Ticket",
                "label": "_PERMIT_TYPEHASH",
                "offset": 0,
                "slot": "154",
                "type": "t_bytes32"
              },
              {
                "astId": 579,
                "contract": "contracts/token/Ticket.sol:Ticket",
                "label": "__gap",
                "offset": 0,
                "slot": "155",
                "type": "t_array(t_uint256)49_storage"
              },
              {
                "astId": 15646,
                "contract": "contracts/token/Ticket.sol:Ticket",
                "label": "controller",
                "offset": 0,
                "slot": "204",
                "type": "t_contract(TokenControllerInterface)16206"
              },
              {
                "astId": 15923,
                "contract": "contracts/token/Ticket.sol:Ticket",
                "label": "sortitionSumTrees",
                "offset": 0,
                "slot": "205",
                "type": "t_struct(SortitionSumTrees)25087_storage"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_array(t_uint256)44_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[44]",
                "numberOfBytes": "1408"
              },
              "t_array(t_uint256)49_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[49]",
                "numberOfBytes": "1568"
              },
              "t_array(t_uint256)50_storage": {
                "base": "t_uint256",
                "encoding": "inplace",
                "label": "uint256[50]",
                "numberOfBytes": "1600"
              },
              "t_array(t_uint256)dyn_storage": {
                "base": "t_uint256",
                "encoding": "dynamic_array",
                "label": "uint256[]",
                "numberOfBytes": "32"
              },
              "t_bool": {
                "encoding": "inplace",
                "label": "bool",
                "numberOfBytes": "1"
              },
              "t_bytes32": {
                "encoding": "inplace",
                "label": "bytes32",
                "numberOfBytes": "32"
              },
              "t_contract(TokenControllerInterface)16206": {
                "encoding": "inplace",
                "label": "contract TokenControllerInterface",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_mapping(t_address,t_uint256))": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => mapping(address => uint256))",
                "numberOfBytes": "32",
                "value": "t_mapping(t_address,t_uint256)"
              },
              "t_mapping(t_address,t_struct(Counter)3637_storage)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => struct CountersUpgradeable.Counter)",
                "numberOfBytes": "32",
                "value": "t_struct(Counter)3637_storage"
              },
              "t_mapping(t_address,t_uint256)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => uint256)",
                "numberOfBytes": "32",
                "value": "t_uint256"
              },
              "t_mapping(t_bytes32,t_struct(SortitionSumTree)25082_storage)": {
                "encoding": "mapping",
                "key": "t_bytes32",
                "label": "mapping(bytes32 => struct SortitionSumTreeFactory.SortitionSumTree)",
                "numberOfBytes": "32",
                "value": "t_struct(SortitionSumTree)25082_storage"
              },
              "t_mapping(t_bytes32,t_uint256)": {
                "encoding": "mapping",
                "key": "t_bytes32",
                "label": "mapping(bytes32 => uint256)",
                "numberOfBytes": "32",
                "value": "t_uint256"
              },
              "t_mapping(t_uint256,t_bytes32)": {
                "encoding": "mapping",
                "key": "t_uint256",
                "label": "mapping(uint256 => bytes32)",
                "numberOfBytes": "32",
                "value": "t_bytes32"
              },
              "t_string_storage": {
                "encoding": "bytes",
                "label": "string",
                "numberOfBytes": "32"
              },
              "t_struct(Counter)3637_storage": {
                "encoding": "inplace",
                "label": "struct CountersUpgradeable.Counter",
                "members": [
                  {
                    "astId": 3636,
                    "contract": "contracts/token/Ticket.sol:Ticket",
                    "label": "_value",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint256"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_struct(SortitionSumTree)25082_storage": {
                "encoding": "inplace",
                "label": "struct SortitionSumTreeFactory.SortitionSumTree",
                "members": [
                  {
                    "astId": 25067,
                    "contract": "contracts/token/Ticket.sol:Ticket",
                    "label": "K",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_uint256"
                  },
                  {
                    "astId": 25070,
                    "contract": "contracts/token/Ticket.sol:Ticket",
                    "label": "stack",
                    "offset": 0,
                    "slot": "1",
                    "type": "t_array(t_uint256)dyn_storage"
                  },
                  {
                    "astId": 25073,
                    "contract": "contracts/token/Ticket.sol:Ticket",
                    "label": "nodes",
                    "offset": 0,
                    "slot": "2",
                    "type": "t_array(t_uint256)dyn_storage"
                  },
                  {
                    "astId": 25077,
                    "contract": "contracts/token/Ticket.sol:Ticket",
                    "label": "IDsToNodeIndexes",
                    "offset": 0,
                    "slot": "3",
                    "type": "t_mapping(t_bytes32,t_uint256)"
                  },
                  {
                    "astId": 25081,
                    "contract": "contracts/token/Ticket.sol:Ticket",
                    "label": "nodeIndexesToIDs",
                    "offset": 0,
                    "slot": "4",
                    "type": "t_mapping(t_uint256,t_bytes32)"
                  }
                ],
                "numberOfBytes": "160"
              },
              "t_struct(SortitionSumTrees)25087_storage": {
                "encoding": "inplace",
                "label": "struct SortitionSumTreeFactory.SortitionSumTrees",
                "members": [
                  {
                    "astId": 25086,
                    "contract": "contracts/token/Ticket.sol:Ticket",
                    "label": "sortitionSumTrees",
                    "offset": 0,
                    "slot": "0",
                    "type": "t_mapping(t_bytes32,t_struct(SortitionSumTree)25082_storage)"
                  }
                ],
                "numberOfBytes": "32"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              },
              "t_uint8": {
                "encoding": "inplace",
                "label": "uint8",
                "numberOfBytes": "1"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "chanceOf(address)": {
                "notice": "Returns the user's chance of winning."
              },
              "controller()": {
                "notice": "Interface to the contract responsible for controlling mint/burn"
              },
              "controllerBurn(address,uint256)": {
                "notice": "Allows the controller to burn tokens from a user account"
              },
              "controllerBurnFrom(address,address,uint256)": {
                "notice": "Allows an operator via the controller to burn tokens on behalf of a user account"
              },
              "controllerMint(address,uint256)": {
                "notice": "Allows the controller to mint tokens for a user account"
              },
              "draw(uint256)": {
                "notice": "Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply."
              },
              "initialize(string,string,uint8,address)": {
                "notice": "Initializes the Controlled Token with Token Details and the Controller"
              }
            },
            "version": 1
          }
        }
      },
      "contracts/token/TicketInterface.sol": {
        "TicketInterface": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "randomNumber",
                  "type": "uint256"
                }
              ],
              "name": "draw",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "draw(uint256)": {
                "params": {
                  "randomNumber": "The random number to use to select a user."
                },
                "returns": {
                  "_0": "The winner"
                }
              }
            },
            "title": "Interface that allows a user to draw an address using an index",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "draw(uint256)": "3b304147"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"randomNumber\",\"type\":\"uint256\"}],\"name\":\"draw\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"draw(uint256)\":{\"params\":{\"randomNumber\":\"The random number to use to select a user.\"},\"returns\":{\"_0\":\"The winner\"}}},\"title\":\"Interface that allows a user to draw an address using an index\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"draw(uint256)\":{\"notice\":\"Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/TicketInterface.sol\":\"TicketInterface\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/token/TicketInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface TicketInterface {\\n  /// @notice Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\\n  /// @param randomNumber The random number to use to select a user.\\n  /// @return The winner\\n  function draw(uint256 randomNumber) external view returns (address);\\n}\",\"keccak256\":\"0x5201a9a22748781592abd2003801289224d4899292195b7de937cd5748be87dd\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "draw(uint256)": {
                "notice": "Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply."
              }
            },
            "version": 1
          }
        }
      },
      "contracts/token/TicketProxyFactory.sol": {
        "TicketProxyFactory": {
          "abi": [
            {
              "inputs": [],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": false,
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "name": "ProxyCreated",
              "type": "event"
            },
            {
              "inputs": [],
              "name": "create",
              "outputs": [
                {
                  "internalType": "contract Ticket",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "_logic",
                  "type": "address"
                },
                {
                  "internalType": "bytes",
                  "name": "_data",
                  "type": "bytes"
                }
              ],
              "name": "deployMinimal",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "proxy",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "instance",
              "outputs": [
                {
                  "internalType": "contract Ticket",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "create()": {
                "returns": {
                  "_0": "A reference to the new proxied Controlled ERC20 Token"
                }
              }
            },
            "title": "Controlled ERC20 Token Factory",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b5060405161001d9061005f565b604051809103906000f080158015610039573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b039290921691909117905561006c565b6127d4806103b283390190565b6103378061007b6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063022ec09514610046578063b3eeb5e21461006a578063efc81a8c14610120575b600080fd5b61004e610128565b604080516001600160a01b039092168252519081900360200190f35b61004e6004803603604081101561008057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100ab57600080fd5b8201836020820111156100bd57600080fd5b803590602001918460018302840111640100000000831117156100df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610137945050505050565b61004e6102b3565b6000546001600160a01b031681565b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a18251156102ac576000826001600160a01b0316846040518082805190602001908083835b602083106102035780518252601f1990920191602091820191016101e4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610265576040519150601f19603f3d011682016040523d82523d6000602084013e61026a565b606091505b50509050806102aa5760405162461bcd60e51b81526004018080602001828103825260248152602001806102de6024913960400191505060405180910390fd5b505b5092915050565b6000805460408051602081019091528281526102d8916001600160a01b031690610137565b90509056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a26469706673582212205ae3412cec8c2db03f6c7ec02aac9a02672e7d53a07498e960daa42ca4a37a2564736f6c634300060c0033608060405234801561001057600080fd5b506127b4806100206000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146103de578063a9059cbb1461040a578063d505accf14610436578063dd62ed3e14610487578063de7ea79d146104b5578063f77c4791146105f357610137565b806370a08231146103385780637ecebe001461035e578063885d194d1461038457806390596dd1146103aa57806395d89b41146103d657610137565b80633644e515116100ff5780633644e51514610267578063395093511461026f5780633b3041471461029b5780635d7b0758146102d4578063631b5dfb1461030257610137565b806306fdde031461013c578063095ea7b3146101b957806318160ddd146101f957806323b872dd14610213578063313ce56714610249575b600080fd5b6101446105fb565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561017e578181015183820152602001610166565b50505050905090810190601f1680156101ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101e5600480360360408110156101cf57600080fd5b506001600160a01b038135169060200135610691565b604080519115158252519081900360200190f35b6102016106ae565b60408051918252519081900360200190f35b6101e56004803603606081101561022957600080fd5b506001600160a01b038135811691602081013590911690604001356106b4565b61025161073b565b6040805160ff9092168252519081900360200190f35b610201610744565b6101e56004803603604081101561028557600080fd5b506001600160a01b038135169060200135610753565b6102b8600480360360208110156102b157600080fd5b50356107a1565b604080516001600160a01b039092168252519081900360200190f35b610300600480360360408110156102ea57600080fd5b506001600160a01b0381351690602001356107f0565b005b6103006004803603606081101561031857600080fd5b506001600160a01b0381358116916020810135909116906040013561086d565b6102016004803603602081101561034e57600080fd5b50356001600160a01b0316610943565b6102016004803603602081101561037457600080fd5b50356001600160a01b031661095e565b6102016004803603602081101561039a57600080fd5b50356001600160a01b0316610985565b610300600480360360408110156103c057600080fd5b506001600160a01b0381351690602001356109aa565b610144610a23565b6101e5600480360360408110156103f457600080fd5b506001600160a01b038135169060200135610a84565b6101e56004803603604081101561042057600080fd5b506001600160a01b038135169060200135610aec565b610300600480360360e081101561044c57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610b00565b6102016004803603604081101561049d57600080fd5b506001600160a01b0381358116916020013516610ca3565b610300600480360360808110156104cb57600080fd5b8101906020810181356401000000008111156104e657600080fd5b8201836020820111156104f857600080fd5b8035906020019184600183028401116401000000008311171561051a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561056d57600080fd5b82018360208201111561057f57600080fd5b803590602001918460018302840111640100000000831117156105a157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050813560ff16925050602001356001600160a01b0316610cce565b6102b8610f12565b60368054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106875780601f1061065c57610100808354040283529160200191610687565b820191906000526020600020905b81548152906001019060200180831161066a57829003601f168201915b5050505050905090565b60006106a561069e610f21565b8484610f25565b50600192915050565b60355490565b60006106c1848484611011565b610731846106cd610f21565b61072c85604051806060016040528060288152602001612684602891396001600160a01b038a1660009081526034602052604081209061070b610f21565b6001600160a01b03168152602081019190915260400160002054919061116e565b610f25565b5060019392505050565b60385460ff1690565b600061074e611205565b905090565b60006106a5610760610f21565b8461072c8560346000610771610f21565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611240565b6000806107ac6106ae565b90506000816107bd575060006107e9565b60006107c9858461129a565b90506107e560cd60008051602061266483398151915283611340565b9150505b9392505050565b60cc546001600160a01b0316610804610f21565b6001600160a01b03161461085f576040805162461bcd60e51b815260206004820152601f60248201527f436f6e74726f6c6c6564546f6b656e2f6f6e6c792d636f6e74726f6c6c657200604482015290519081900360640190fd5b6108698282611403565b5050565b60cc546001600160a01b0316610881610f21565b6001600160a01b0316146108dc576040805162461bcd60e51b815260206004820152601f60248201527f436f6e74726f6c6c6564546f6b656e2f6f6e6c792d636f6e74726f6c6c657200604482015290519081900360640190fd5b816001600160a01b0316836001600160a01b031614610934576000610925826040518060600160405280602181526020016126ac6021913961091e8688610ca3565b919061116e565b9050610932838583610f25565b505b61093e82826114f5565b505050565b6001600160a01b031660009081526033602052604090205490565b6001600160a01b038116600090815260996020526040812061097f906115f1565b92915050565b600061097f60cd6000805160206126648339815191526001600160a01b0385166115f5565b60cc546001600160a01b03166109be610f21565b6001600160a01b031614610a19576040805162461bcd60e51b815260206004820152601f60248201527f436f6e74726f6c6c6564546f6b656e2f6f6e6c792d636f6e74726f6c6c657200604482015290519081900360640190fd5b61086982826114f5565b60378054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106875780601f1061065c57610100808354040283529160200191610687565b60006106a5610a91610f21565b8461072c8560405180606001604052806025815260200161275a6025913960346000610abb610f21565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919061116e565b60006106a5610af9610f21565b8484611011565b83421115610b55576040805162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015290519081900360640190fd5b6000609a54888888610b8a609960008e6001600160a01b03166001600160a01b031681526020019081526020016000206115f1565b8960405160200180878152602001866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200182815260200196505050505050506040516020818303038152906040528051906020012090506000610bf382611645565b90506000610c0382878787611691565b9050896001600160a01b0316816001600160a01b031614610c6b576040805162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015290519081900360640190fd5b6001600160a01b038a166000908152609960205260409020610c8c9061180f565b610c978a8a8a610f25565b50505050505050505050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b600054610100900460ff1680610ce75750610ce7611818565b80610cf5575060005460ff16155b610d305760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff16158015610d5b576000805460ff1961ff0019909116610100171660011790555b6001600160a01b038216610db6576040805162461bcd60e51b815260206004820152601a60248201527f5469636b65742f636f6e74726f6c6c65722d6e6f742d7a65726f000000000000604482015290519081900360640190fd5b610dc285858585611829565b610ddd60cd6000805160206126648339815191526005611967565b7f41bc1176d7b9b7bc036f385a7e5b08b0662a7afa0844af8a599ad431150227e1858585856040518080602001806020018560ff168152602001846001600160a01b03168152602001838103835287818151815260200191508051906020019080838360005b83811015610e5b578181015183820152602001610e43565b50505050905090810190601f168015610e885780820380516001836020036101000a031916815260200191505b50838103825286518152865160209182019188019080838360005b83811015610ebb578181015183820152602001610ea3565b50505050905090810190601f168015610ee85780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a18015610f0b576000805461ff00191690555b5050505050565b60cc546001600160a01b031681565b3390565b6001600160a01b038316610f6a5760405162461bcd60e51b81526004018080602001828103825260248152602001806127136024913960400191505060405180910390fd5b6001600160a01b038216610faf5760405162461bcd60e51b81526004018080602001828103825260228152602001806125aa6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166110565760405162461bcd60e51b81526004018080602001828103825260258152602001806126ee6025913960400191505060405180910390fd5b6001600160a01b03821661109b5760405162461bcd60e51b81526004018080602001828103825260238152602001806125656023913960400191505060405180910390fd5b6110a6838383611a73565b6110e3816040518060600160405280602681526020016125cc602691396001600160a01b038616600090815260336020526040902054919061116e565b6001600160a01b0380851660009081526033602052604080822093909355908416815220546111129082611240565b6001600160a01b0380841660008181526033602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156111fd5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156111c25781810151838201526020016111aa565b50505050905090810190601f1680156111ef5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600061074e7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611233611b39565b61123b611b3f565b611b45565b6000828201838110156107e9576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008082116112e8576040805162461bcd60e51b8152602060048201526015602482015274155b9a599bdc9b54985b990bdb5a5b8b589bdd5b99605a1b604482015290519081900360640190fd5b60008283600003816112f657fe5b069050835b8181106113075761132d565b6040805160208082019390935281518082038401815290820190915280519101206112fb565b83818161133657fe5b0695945050505050565b600082815260208490526040812060028101805483918291829061136057fe5b9060005260206000200154858161137357fe5b0690505b60028301548354830260010110156113e85760015b835481116113e2576000818486600001540201905060008560020182815481106113b257fe5b906000526020600020015490508084106113d05780840393506113d8565b5092506113e2565b505060010161138c565b50611377565b50600090815260049091016020526040902054949350505050565b6001600160a01b03821661145e576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61146a60008383611a73565b6035546114779082611240565b6035556001600160a01b03821660009081526033602052604090205461149d9082611240565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b03821661153a5760405162461bcd60e51b81526004018080602001828103825260218152602001806126cd6021913960400191505060405180910390fd5b61154682600083611a73565b61158381604051806060016040528060228152602001612588602291396001600160a01b038516600090815260336020526040902054919061116e565b6001600160a01b0383166000908152603360205260409020556035546115a99082611ba7565b6035556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b5490565b600082815260208481526040808320848452600381019092528220548061161f576000925061163c565b81600201818154811061162e57fe5b906000526020600020015492505b50509392505050565b600061164f611205565b82604051602001808061190160f01b81525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156116f25760405162461bcd60e51b81526004018080602001828103825260228152602001806125f26022913960400191505060405180910390fd5b8360ff16601b148061170757508360ff16601c145b6117425760405162461bcd60e51b81526004018080602001828103825260228152602001806126426022913960400191505060405180910390fd5b600060018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561179e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611806576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b95945050505050565b80546001019055565b600061182330611c04565b15905090565b600054610100900460ff16806118425750611842611818565b80611850575060005460ff16155b61188b5760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff161580156118b6576000805460ff1961ff0019909116610100171660011790555b6001600160a01b0382166118fb5760405162461bcd60e51b81526004018080602001828103825260238152602001806127376023913960400191505060405180910390fd5b6119058585611c0a565b6119436040518060400160405280601c81526020017f506f6f6c546f67657468657220436f6e74726f6c6c6564546f6b656e00000000815250611cbf565b60cc80546001600160a01b0319166001600160a01b038416179055610ddd83611d95565b60008281526020849052604090208054156119c0576040805162461bcd60e51b81526020600482015260146024820152732a3932b29030b63932b0b23c9032bc34b9ba399760611b604482015290519081900360640190fd5b60018211611a15576040805162461bcd60e51b815260206004820152601b60248201527f4b206d7573742062652067726561746572207468616e206f6e652e0000000000604482015290519081900360640190fd5b8181556040805160008152602081019182905251611a37916001840191612497565b506040805160008152602081019182905251611a57916002840191612497565b5060020180546001810182556000918252602082200155505050565b611a7e838383611dab565b816001600160a01b0316836001600160a01b03161415611a9d5761093e565b6001600160a01b03831615611ae9576000611ac182611abb86610943565b90611ba7565b9050611ae760cd600080516020612664833981519152836001600160a01b038816611e25565b505b6001600160a01b0382161561093e576000611b0d82611b0785610943565b90611240565b9050611b3360cd600080516020612664833981519152836001600160a01b038716611e25565b50505050565b60655490565b60665490565b6000838383611b52612109565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b03168152602001955050505050506040516020818303038152906040528051906020012090509392505050565b600082821115611bfe576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b3b151590565b600054610100900460ff1680611c235750611c23611818565b80611c31575060005460ff16155b611c6c5760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff16158015611c97576000805460ff1961ff0019909116610100171660011790555b611c9f61210d565b611ca983836121af565b801561093e576000805461ff0019169055505050565b600054610100900460ff1680611cd85750611cd8611818565b80611ce6575060005460ff16155b611d215760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff16158015611d4c576000805460ff1961ff0019909116610100171660011790555b611d5461210d565b611d7782604051806040016040528060018152602001603160f81b815250612287565b611d8082612347565b8015610869576000805461ff00191690555050565b6038805460ff191660ff92909216919091179055565b60cc5460408051637cbab1c760e01b81526001600160a01b03868116600483015285811660248301526044820185905291519190921691637cbab1c791606480830192600092919082900301818387803b158015611e0857600080fd5b505af1158015611e1c573d6000803e3d6000fd5b50505050505050565b600083815260208581526040808320848452600381019092529091205480611fbc578315611fb7576001820154611f23575060028101805460018082018355600092835260209092208101859055908114801590611e8f57508154600019820181611e8c57fe5b06155b15611f1e5781546000908281611ea157fe5b0460008181526004850160205260409020546002850180549293509091600185019190819085908110611ed057fe5b60009182526020808320909101548354600181018555938352818320909301929092559384526004860180825260408086208690558486526003880183528086208490559285529052909120555b611f84565b6001820180546000198101908110611f3757fe5b9060005260206000200154905081600101805480611f5157fe5b6001900381819060005260206000200160009055905583826002018281548110611f7757fe5b6000918252602090912001555b60008381526003830160209081526040808320849055838352600485019091529020839055611fb786868360018861240d565b612101565b8361204d576000826002018281548110611fd257fe5b906000526020600020015490506000836002018381548110611ff057fe5b6000918252602080832090910192909255600180860180549182018155825282822001849055858152600385018252604080822082905584825260048601909252908120819055612047908890889085908561240d565b50612101565b81600201818154811061205c57fe5b906000526020600020015484146121015760008483600201838154811061207f57fe5b9060005260206000200154111590506000816120b657858460020184815481106120a557fe5b9060005260206000200154036120d3565b8360020183815481106120c557fe5b906000526020600020015486035b9050858460020184815481106120e557fe5b6000918252602090912001556120fe888885858561240d565b50505b505050505050565b4690565b600054610100900460ff16806121265750612126611818565b80612134575060005460ff16155b61216f5760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff1615801561219a576000805460ff1961ff0019909116610100171660011790555b80156121ac576000805461ff00191690555b50565b600054610100900460ff16806121c857506121c8611818565b806121d6575060005460ff16155b6122115760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff1615801561223c576000805460ff1961ff0019909116610100171660011790555b825161224f9060369060208601906124e2565b5081516122639060379060208501906124e2565b506038805460ff19166012179055801561093e576000805461ff0019169055505050565b600054610100900460ff16806122a057506122a0611818565b806122ae575060005460ff16155b6122e95760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff16158015612314576000805460ff1961ff0019909116610100171660011790555b8251602080850191909120835191840191909120606591909155606655801561093e576000805461ff0019169055505050565b600054610100900460ff16806123605750612360611818565b8061236e575060005460ff16155b6123a95760405162461bcd60e51b815260040180806020018281038252602e815260200180612614602e913960400191505060405180910390fd5b600054610100900460ff161580156123d4576000805460ff1961ff0019909116610100171660011790555b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9609a558015610869576000805461ff00191690555050565b6000848152602086905260409020835b8015611e1c57815460001982018161243157fe5b0490508361245a578282600201828154811061244957fe5b906000526020600020015403612477565b8282600201828154811061246a57fe5b9060005260206000200154015b82600201828154811061248657fe5b60009182526020909120015561241d565b8280548282559060005260206000209081019282156124d2579160200282015b828111156124d25782518255916020019190600101906124b7565b506124de92915061254f565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061252357805160ff19168380011785556124d2565b828001600101855582156124d257918201828111156124d25782518255916020019190600101906124b7565b5b808211156124de576000815560010161255056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545434453413a20696e76616c6964207369676e6174757265202773272076616c7565496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656445434453413a20696e76616c6964207369676e6174757265202776272076616c7565af45c4fb9ef70911e5444b8eedce607366e494224d52e6feab07fbd62a53b26f45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365436f6e74726f6c6c6564546f6b656e2f657863656564732d616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373436f6e74726f6c6c6564546f6b656e2f636f6e74726f6c6c65722d6e6f742d7a65726f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220249ea71f3d53c945962821ae2787942e0997b146abdb205938e3ea4d4543472864736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x1D SWAP1 PUSH2 0x5F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x39 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x6C JUMP JUMPDEST PUSH2 0x27D4 DUP1 PUSH2 0x3B2 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH2 0x337 DUP1 PUSH2 0x7B PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x22EC095 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x6A JUMPI DUP1 PUSH4 0xEFC81A8C EQ PUSH2 0x120 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x128 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x137 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x4E PUSH2 0x2B3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x265 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x26A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2DE PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE DUP3 DUP2 MSTORE PUSH2 0x2D8 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x137 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 GAS 0xE3 COINBASE 0x2C 0xEC DUP13 0x2D 0xB0 EXTCODEHASH PUSH13 0x7EC02AAC9A02672E7D53A07498 0xE9 PUSH1 0xDA LOG4 0x2C LOG4 LOG3 PUSH27 0x2564736F6C634300060C0033608060405234801561001057600080 REVERT JUMPDEST POP PUSH2 0x27B4 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x137 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x70A08231 GT PUSH2 0xB8 JUMPI DUP1 PUSH4 0xA457C2D7 GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x3DE JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x40A JUMPI DUP1 PUSH4 0xD505ACCF EQ PUSH2 0x436 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x487 JUMPI DUP1 PUSH4 0xDE7EA79D EQ PUSH2 0x4B5 JUMPI DUP1 PUSH4 0xF77C4791 EQ PUSH2 0x5F3 JUMPI PUSH2 0x137 JUMP JUMPDEST DUP1 PUSH4 0x70A08231 EQ PUSH2 0x338 JUMPI DUP1 PUSH4 0x7ECEBE00 EQ PUSH2 0x35E JUMPI DUP1 PUSH4 0x885D194D EQ PUSH2 0x384 JUMPI DUP1 PUSH4 0x90596DD1 EQ PUSH2 0x3AA JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x3D6 JUMPI PUSH2 0x137 JUMP JUMPDEST DUP1 PUSH4 0x3644E515 GT PUSH2 0xFF JUMPI DUP1 PUSH4 0x3644E515 EQ PUSH2 0x267 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x26F JUMPI DUP1 PUSH4 0x3B304147 EQ PUSH2 0x29B JUMPI DUP1 PUSH4 0x5D7B0758 EQ PUSH2 0x2D4 JUMPI DUP1 PUSH4 0x631B5DFB EQ PUSH2 0x302 JUMPI PUSH2 0x137 JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x13C JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x1B9 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x1F9 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x213 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x249 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x144 PUSH2 0x5FB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x17E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x166 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1AB JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1E5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x691 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x201 PUSH2 0x6AE JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x1E5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x229 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x6B4 JUMP JUMPDEST PUSH2 0x251 PUSH2 0x73B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x201 PUSH2 0x744 JUMP JUMPDEST PUSH2 0x1E5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x285 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x753 JUMP JUMPDEST PUSH2 0x2B8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x7A1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x300 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x2EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x7F0 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x300 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x318 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 ADD CALLDATALOAD PUSH2 0x86D JUMP JUMPDEST PUSH2 0x201 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x34E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x943 JUMP JUMPDEST PUSH2 0x201 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x374 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x95E JUMP JUMPDEST PUSH2 0x201 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x39A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x985 JUMP JUMPDEST PUSH2 0x300 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x9AA JUMP JUMPDEST PUSH2 0x144 PUSH2 0xA23 JUMP JUMPDEST PUSH2 0x1E5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0xA84 JUMP JUMPDEST PUSH2 0x1E5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x420 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0xAEC JUMP JUMPDEST PUSH2 0x300 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0xE0 DUP2 LT ISZERO PUSH2 0x44C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 SWAP2 AND SWAP1 PUSH1 0x40 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0xFF PUSH1 0x80 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0xA0 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0xC0 ADD CALLDATALOAD PUSH2 0xB00 JUMP JUMPDEST PUSH2 0x201 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x49D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 CALLDATALOAD DUP2 AND SWAP2 PUSH1 0x20 ADD CALLDATALOAD AND PUSH2 0xCA3 JUMP JUMPDEST PUSH2 0x300 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x4CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x4E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x4F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x51A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 SWAP5 SWAP4 PUSH1 0x20 DUP2 ADD SWAP4 POP CALLDATALOAD SWAP2 POP POP PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x56D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x57F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x5A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP POP DUP2 CALLDATALOAD PUSH1 0xFF AND SWAP3 POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xCCE JUMP JUMPDEST PUSH2 0x2B8 PUSH2 0xF12 JUMP JUMPDEST PUSH1 0x36 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x687 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x65C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x687 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x66A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6A5 PUSH2 0x69E PUSH2 0xF21 JUMP JUMPDEST DUP5 DUP5 PUSH2 0xF25 JUMP JUMPDEST POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x35 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6C1 DUP5 DUP5 DUP5 PUSH2 0x1011 JUMP JUMPDEST PUSH2 0x731 DUP5 PUSH2 0x6CD PUSH2 0xF21 JUMP JUMPDEST PUSH2 0x72C DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2684 PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP1 PUSH2 0x70B PUSH2 0xF21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x116E JUMP JUMPDEST PUSH2 0xF25 JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x38 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x74E PUSH2 0x1205 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6A5 PUSH2 0x760 PUSH2 0xF21 JUMP JUMPDEST DUP5 PUSH2 0x72C DUP6 PUSH1 0x34 PUSH1 0x0 PUSH2 0x771 PUSH2 0xF21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP13 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP1 PUSH2 0x1240 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x7AC PUSH2 0x6AE JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 PUSH2 0x7BD JUMPI POP PUSH1 0x0 PUSH2 0x7E9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7C9 DUP6 DUP5 PUSH2 0x129A JUMP JUMPDEST SWAP1 POP PUSH2 0x7E5 PUSH1 0xCD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x2664 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE DUP4 PUSH2 0x1340 JUMP JUMPDEST SWAP2 POP POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x804 PUSH2 0xF21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x85F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6E74726F6C6C6564546F6B656E2F6F6E6C792D636F6E74726F6C6C657200 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x869 DUP3 DUP3 PUSH2 0x1403 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x881 PUSH2 0xF21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x8DC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6E74726F6C6C6564546F6B656E2F6F6E6C792D636F6E74726F6C6C657200 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x934 JUMPI PUSH1 0x0 PUSH2 0x925 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x26AC PUSH1 0x21 SWAP2 CODECOPY PUSH2 0x91E DUP7 DUP9 PUSH2 0xCA3 JUMP JUMPDEST SWAP2 SWAP1 PUSH2 0x116E JUMP JUMPDEST SWAP1 POP PUSH2 0x932 DUP4 DUP6 DUP4 PUSH2 0xF25 JUMP JUMPDEST POP JUMPDEST PUSH2 0x93E DUP3 DUP3 PUSH2 0x14F5 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x99 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x97F SWAP1 PUSH2 0x15F1 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x97F PUSH1 0xCD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x2664 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH2 0x15F5 JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x9BE PUSH2 0xF21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xA19 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x436F6E74726F6C6C6564546F6B656E2F6F6E6C792D636F6E74726F6C6C657200 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x869 DUP3 DUP3 PUSH2 0x14F5 JUMP JUMPDEST PUSH1 0x37 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x687 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x65C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x687 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6A5 PUSH2 0xA91 PUSH2 0xF21 JUMP JUMPDEST DUP5 PUSH2 0x72C DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x275A PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x34 PUSH1 0x0 PUSH2 0xABB PUSH2 0xF21 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP14 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x116E JUMP JUMPDEST PUSH1 0x0 PUSH2 0x6A5 PUSH2 0xAF9 PUSH2 0xF21 JUMP JUMPDEST DUP5 DUP5 PUSH2 0x1011 JUMP JUMPDEST DUP4 TIMESTAMP GT ISZERO PUSH2 0xB55 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305065726D69743A206578706972656420646561646C696E65000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x9A SLOAD DUP9 DUP9 DUP9 PUSH2 0xB8A PUSH1 0x99 PUSH1 0x0 DUP15 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH2 0x15F1 JUMP JUMPDEST DUP10 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x0 PUSH2 0xBF3 DUP3 PUSH2 0x1645 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xC03 DUP3 DUP8 DUP8 DUP8 PUSH2 0x1691 JUMP JUMPDEST SWAP1 POP DUP10 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0xC6B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305065726D69743A20696E76616C6964207369676E61747572650000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x99 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0xC8C SWAP1 PUSH2 0x180F JUMP JUMPDEST PUSH2 0xC97 DUP11 DUP11 DUP11 PUSH2 0xF25 JUMP JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0xCE7 JUMPI POP PUSH2 0xCE7 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0xCF5 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0xD30 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0xD5B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xDB6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5469636B65742F636F6E74726F6C6C65722D6E6F742D7A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xDC2 DUP6 DUP6 DUP6 DUP6 PUSH2 0x1829 JUMP JUMPDEST PUSH2 0xDDD PUSH1 0xCD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x2664 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE PUSH1 0x5 PUSH2 0x1967 JUMP JUMPDEST PUSH32 0x41BC1176D7B9B7BC036F385A7E5B08B0662A7AFA0844AF8A599AD431150227E1 DUP6 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP8 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xE5B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xE43 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xE88 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP4 DUP2 SUB DUP3 MSTORE DUP7 MLOAD DUP2 MSTORE DUP7 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP9 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xEBB JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xEA3 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xEE8 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP1 ISZERO PUSH2 0xF0B JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0xF6A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2713 PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xFAF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x25AA PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x34 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE DUP2 MLOAD DUP6 DUP2 MSTORE SWAP2 MLOAD PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x1056 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x26EE PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x109B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2565 PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x10A6 DUP4 DUP4 DUP4 PUSH2 0x1A73 JUMP JUMPDEST PUSH2 0x10E3 DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x25CC PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x116E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP5 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x1112 SWAP1 DUP3 PUSH2 0x1240 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP4 SWAP3 DUP8 AND SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP5 DUP5 GT ISZERO PUSH2 0x11FD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x11C2 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x11AA JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x11EF JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x74E PUSH32 0x8B73C3C69BB8FE3D512ECC4CF759CC79239F7B179B0FFACAA9A75D522B39400F PUSH2 0x1233 PUSH2 0x1B39 JUMP JUMPDEST PUSH2 0x123B PUSH2 0x1B3F JUMP JUMPDEST PUSH2 0x1B45 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x7E9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x12E8 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH21 0x155B9A599BDC9B54985B990BDB5A5B8B589BDD5B99 PUSH1 0x5A SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP4 PUSH1 0x0 SUB DUP2 PUSH2 0x12F6 JUMPI INVALID JUMPDEST MOD SWAP1 POP DUP4 JUMPDEST DUP2 DUP2 LT PUSH2 0x1307 JUMPI PUSH2 0x132D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 ADD SWAP4 SWAP1 SWAP4 MSTORE DUP2 MLOAD DUP1 DUP3 SUB DUP5 ADD DUP2 MSTORE SWAP1 DUP3 ADD SWAP1 SWAP2 MSTORE DUP1 MLOAD SWAP2 ADD KECCAK256 PUSH2 0x12FB JUMP JUMPDEST DUP4 DUP2 DUP2 PUSH2 0x1336 JUMPI INVALID JUMPDEST MOD SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP5 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x2 DUP2 ADD DUP1 SLOAD DUP4 SWAP2 DUP3 SWAP2 DUP3 SWAP1 PUSH2 0x1360 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD DUP6 DUP2 PUSH2 0x1373 JUMPI INVALID JUMPDEST MOD SWAP1 POP JUMPDEST PUSH1 0x2 DUP4 ADD SLOAD DUP4 SLOAD DUP4 MUL PUSH1 0x1 ADD LT ISZERO PUSH2 0x13E8 JUMPI PUSH1 0x1 JUMPDEST DUP4 SLOAD DUP2 GT PUSH2 0x13E2 JUMPI PUSH1 0x0 DUP2 DUP5 DUP7 PUSH1 0x0 ADD SLOAD MUL ADD SWAP1 POP PUSH1 0x0 DUP6 PUSH1 0x2 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x13B2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP DUP1 DUP5 LT PUSH2 0x13D0 JUMPI DUP1 DUP5 SUB SWAP4 POP PUSH2 0x13D8 JUMP JUMPDEST POP SWAP3 POP PUSH2 0x13E2 JUMP JUMPDEST POP POP PUSH1 0x1 ADD PUSH2 0x138C JUMP JUMPDEST POP PUSH2 0x1377 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 SWAP1 SWAP2 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x145E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x146A PUSH1 0x0 DUP4 DUP4 PUSH2 0x1A73 JUMP JUMPDEST PUSH1 0x35 SLOAD PUSH2 0x1477 SWAP1 DUP3 PUSH2 0x1240 JUMP JUMPDEST PUSH1 0x35 SSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x149D SWAP1 DUP3 PUSH2 0x1240 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP4 MLOAD DUP6 DUP2 MSTORE SWAP4 MLOAD SWAP3 SWAP4 SWAP2 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x153A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x26CD PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1546 DUP3 PUSH1 0x0 DUP4 PUSH2 0x1A73 JUMP JUMPDEST PUSH2 0x1583 DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x2588 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP2 SWAP1 PUSH2 0x116E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x33 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x35 SLOAD PUSH2 0x15A9 SWAP1 DUP3 PUSH2 0x1BA7 JUMP JUMPDEST PUSH1 0x35 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP5 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 DUP5 MSTORE PUSH1 0x3 DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 KECCAK256 SLOAD DUP1 PUSH2 0x161F JUMPI PUSH1 0x0 SWAP3 POP PUSH2 0x163C JUMP JUMPDEST DUP2 PUSH1 0x2 ADD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x162E JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP3 POP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x164F PUSH2 0x1205 JUMP JUMPDEST DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH2 0x1901 PUSH1 0xF0 SHL DUP2 MSTORE POP PUSH1 0x2 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP3 GT ISZERO PUSH2 0x16F2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x25F2 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP4 PUSH1 0xFF AND PUSH1 0x1B EQ DUP1 PUSH2 0x1707 JUMPI POP DUP4 PUSH1 0xFF AND PUSH1 0x1C EQ JUMPDEST PUSH2 0x1742 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2642 PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x179E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH1 0x1F NOT ADD MLOAD SWAP2 POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1806 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x18 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45434453413A20696E76616C6964207369676E61747572650000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1823 ADDRESS PUSH2 0x1C04 JUMP JUMPDEST ISZERO SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1842 JUMPI POP PUSH2 0x1842 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0x1850 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x188B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x18B6 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x18FB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2737 PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x1905 DUP6 DUP6 PUSH2 0x1C0A JUMP JUMPDEST PUSH2 0x1943 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x506F6F6C546F67657468657220436F6E74726F6C6C6564546F6B656E00000000 DUP2 MSTORE POP PUSH2 0x1CBF JUMP JUMPDEST PUSH1 0xCC DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND OR SWAP1 SSTORE PUSH2 0xDDD DUP4 PUSH2 0x1D95 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP5 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD ISZERO PUSH2 0x19C0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x14 PUSH1 0x24 DUP3 ADD MSTORE PUSH20 0x2A3932B29030B63932B0B23C9032BC34B9BA3997 PUSH1 0x61 SHL PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 DUP3 GT PUSH2 0x1A15 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4B206D7573742062652067726561746572207468616E206F6E652E0000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP2 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 DUP3 SWAP1 MSTORE MLOAD PUSH2 0x1A37 SWAP2 PUSH1 0x1 DUP5 ADD SWAP2 PUSH2 0x2497 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 DUP3 SWAP1 MSTORE MLOAD PUSH2 0x1A57 SWAP2 PUSH1 0x2 DUP5 ADD SWAP2 PUSH2 0x2497 JUMP JUMPDEST POP PUSH1 0x2 ADD DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD SSTORE POP POP POP JUMP JUMPDEST PUSH2 0x1A7E DUP4 DUP4 DUP4 PUSH2 0x1DAB JUMP JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ ISZERO PUSH2 0x1A9D JUMPI PUSH2 0x93E JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO PUSH2 0x1AE9 JUMPI PUSH1 0x0 PUSH2 0x1AC1 DUP3 PUSH2 0x1ABB DUP7 PUSH2 0x943 JUMP JUMPDEST SWAP1 PUSH2 0x1BA7 JUMP JUMPDEST SWAP1 POP PUSH2 0x1AE7 PUSH1 0xCD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x2664 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP9 AND PUSH2 0x1E25 JUMP JUMPDEST POP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND ISZERO PUSH2 0x93E JUMPI PUSH1 0x0 PUSH2 0x1B0D DUP3 PUSH2 0x1B07 DUP6 PUSH2 0x943 JUMP JUMPDEST SWAP1 PUSH2 0x1240 JUMP JUMPDEST SWAP1 POP PUSH2 0x1B33 PUSH1 0xCD PUSH1 0x0 DUP1 MLOAD PUSH1 0x20 PUSH2 0x2664 DUP4 CODECOPY DUP2 MLOAD SWAP2 MSTORE DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND PUSH2 0x1E25 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x65 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x66 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP4 DUP4 PUSH2 0x1B52 PUSH2 0x2109 JUMP JUMPDEST ADDRESS PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1BFE JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST EXTCODESIZE ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1C23 JUMPI POP PUSH2 0x1C23 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0x1C31 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1C6C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1C97 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x1C9F PUSH2 0x210D JUMP JUMPDEST PUSH2 0x1CA9 DUP4 DUP4 PUSH2 0x21AF JUMP JUMPDEST DUP1 ISZERO PUSH2 0x93E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x1CD8 JUMPI POP PUSH2 0x1CD8 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0x1CE6 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x1D21 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x1D4C JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH2 0x1D54 PUSH2 0x210D JUMP JUMPDEST PUSH2 0x1D77 DUP3 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x31 PUSH1 0xF8 SHL DUP2 MSTORE POP PUSH2 0x2287 JUMP JUMPDEST PUSH2 0x1D80 DUP3 PUSH2 0x2347 JUMP JUMPDEST DUP1 ISZERO PUSH2 0x869 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x38 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0xCC SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x7CBAB1C7 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP7 DUP2 AND PUSH1 0x4 DUP4 ADD MSTORE DUP6 DUP2 AND PUSH1 0x24 DUP4 ADD MSTORE PUSH1 0x44 DUP3 ADD DUP6 SWAP1 MSTORE SWAP2 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x7CBAB1C7 SWAP2 PUSH1 0x64 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E08 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E1C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 DUP6 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 DUP5 MSTORE PUSH1 0x3 DUP2 ADD SWAP1 SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD DUP1 PUSH2 0x1FBC JUMPI DUP4 ISZERO PUSH2 0x1FB7 JUMPI PUSH1 0x1 DUP3 ADD SLOAD PUSH2 0x1F23 JUMPI POP PUSH1 0x2 DUP2 ADD DUP1 SLOAD PUSH1 0x1 DUP1 DUP3 ADD DUP4 SSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x20 SWAP1 SWAP3 KECCAK256 DUP2 ADD DUP6 SWAP1 SSTORE SWAP1 DUP2 EQ DUP1 ISZERO SWAP1 PUSH2 0x1E8F JUMPI POP DUP2 SLOAD PUSH1 0x0 NOT DUP3 ADD DUP2 PUSH2 0x1E8C JUMPI INVALID JUMPDEST MOD ISZERO JUMPDEST ISZERO PUSH2 0x1F1E JUMPI DUP2 SLOAD PUSH1 0x0 SWAP1 DUP3 DUP2 PUSH2 0x1EA1 JUMPI INVALID JUMPDEST DIV PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 DUP6 ADD PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x2 DUP6 ADD DUP1 SLOAD SWAP3 SWAP4 POP SWAP1 SWAP2 PUSH1 0x1 DUP6 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP6 SWAP1 DUP2 LT PUSH2 0x1ED0 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD DUP4 SLOAD PUSH1 0x1 DUP2 ADD DUP6 SSTORE SWAP4 DUP4 MSTORE DUP2 DUP4 KECCAK256 SWAP1 SWAP4 ADD SWAP3 SWAP1 SWAP3 SSTORE SWAP4 DUP5 MSTORE PUSH1 0x4 DUP7 ADD DUP1 DUP3 MSTORE PUSH1 0x40 DUP1 DUP7 KECCAK256 DUP7 SWAP1 SSTORE DUP5 DUP7 MSTORE PUSH1 0x3 DUP9 ADD DUP4 MSTORE DUP1 DUP7 KECCAK256 DUP5 SWAP1 SSTORE SWAP3 DUP6 MSTORE SWAP1 MSTORE SWAP1 SWAP2 KECCAK256 SSTORE JUMPDEST PUSH2 0x1F84 JUMP JUMPDEST PUSH1 0x1 DUP3 ADD DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x1F37 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP DUP2 PUSH1 0x1 ADD DUP1 SLOAD DUP1 PUSH2 0x1F51 JUMPI INVALID JUMPDEST PUSH1 0x1 SWAP1 SUB DUP2 DUP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SSTORE SWAP1 SSTORE DUP4 DUP3 PUSH1 0x2 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x1F77 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SSTORE JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x3 DUP4 ADD PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP5 SWAP1 SSTORE DUP4 DUP4 MSTORE PUSH1 0x4 DUP6 ADD SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 DUP4 SWAP1 SSTORE PUSH2 0x1FB7 DUP7 DUP7 DUP4 PUSH1 0x1 DUP9 PUSH2 0x240D JUMP JUMPDEST PUSH2 0x2101 JUMP JUMPDEST DUP4 PUSH2 0x204D JUMPI PUSH1 0x0 DUP3 PUSH1 0x2 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x1FD2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP PUSH1 0x0 DUP4 PUSH1 0x2 ADD DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x1FF0 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SWAP3 SWAP1 SWAP3 SSTORE PUSH1 0x1 DUP1 DUP7 ADD DUP1 SLOAD SWAP2 DUP3 ADD DUP2 SSTORE DUP3 MSTORE DUP3 DUP3 KECCAK256 ADD DUP5 SWAP1 SSTORE DUP6 DUP2 MSTORE PUSH1 0x3 DUP6 ADD DUP3 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP3 SWAP1 SSTORE DUP5 DUP3 MSTORE PUSH1 0x4 DUP7 ADD SWAP1 SWAP3 MSTORE SWAP1 DUP2 KECCAK256 DUP2 SWAP1 SSTORE PUSH2 0x2047 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP6 SWAP1 DUP6 PUSH2 0x240D JUMP JUMPDEST POP PUSH2 0x2101 JUMP JUMPDEST DUP2 PUSH1 0x2 ADD DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x205C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD DUP5 EQ PUSH2 0x2101 JUMPI PUSH1 0x0 DUP5 DUP4 PUSH1 0x2 ADD DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x207F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD GT ISZERO SWAP1 POP PUSH1 0x0 DUP2 PUSH2 0x20B6 JUMPI DUP6 DUP5 PUSH1 0x2 ADD DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x20A5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SUB PUSH2 0x20D3 JUMP JUMPDEST DUP4 PUSH1 0x2 ADD DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x20C5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD DUP7 SUB JUMPDEST SWAP1 POP DUP6 DUP5 PUSH1 0x2 ADD DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x20E5 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SSTORE PUSH2 0x20FE DUP9 DUP9 DUP6 DUP6 DUP6 PUSH2 0x240D JUMP JUMPDEST POP POP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST CHAINID SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2126 JUMPI POP PUSH2 0x2126 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0x2134 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x216F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x219A JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP1 ISZERO PUSH2 0x21AC JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x21C8 JUMPI POP PUSH2 0x21C8 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0x21D6 JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x2211 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x223C JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP3 MLOAD PUSH2 0x224F SWAP1 PUSH1 0x36 SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x24E2 JUMP JUMPDEST POP DUP2 MLOAD PUSH2 0x2263 SWAP1 PUSH1 0x37 SWAP1 PUSH1 0x20 DUP6 ADD SWAP1 PUSH2 0x24E2 JUMP JUMPDEST POP PUSH1 0x38 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x12 OR SWAP1 SSTORE DUP1 ISZERO PUSH2 0x93E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x22A0 JUMPI POP PUSH2 0x22A0 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0x22AE JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x22E9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x2314 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST DUP3 MLOAD PUSH1 0x20 DUP1 DUP6 ADD SWAP2 SWAP1 SWAP2 KECCAK256 DUP4 MLOAD SWAP2 DUP5 ADD SWAP2 SWAP1 SWAP2 KECCAK256 PUSH1 0x65 SWAP2 SWAP1 SWAP2 SSTORE PUSH1 0x66 SSTORE DUP1 ISZERO PUSH2 0x93E JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH2 0x2360 JUMPI POP PUSH2 0x2360 PUSH2 0x1818 JUMP JUMPDEST DUP1 PUSH2 0x236E JUMPI POP PUSH1 0x0 SLOAD PUSH1 0xFF AND ISZERO JUMPDEST PUSH2 0x23A9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2614 PUSH1 0x2E SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND ISZERO DUP1 ISZERO PUSH2 0x23D4 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH1 0xFF NOT PUSH2 0xFF00 NOT SWAP1 SWAP2 AND PUSH2 0x100 OR AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH32 0x6E71EDAE12B1B97F4D1F60370FEF10105FA2FAAE0126114A169C64845D6126C9 PUSH1 0x9A SSTORE DUP1 ISZERO PUSH2 0x869 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP7 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP4 JUMPDEST DUP1 ISZERO PUSH2 0x1E1C JUMPI DUP2 SLOAD PUSH1 0x0 NOT DUP3 ADD DUP2 PUSH2 0x2431 JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP4 PUSH2 0x245A JUMPI DUP3 DUP3 PUSH1 0x2 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x2449 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SUB PUSH2 0x2477 JUMP JUMPDEST DUP3 DUP3 PUSH1 0x2 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x246A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD ADD JUMPDEST DUP3 PUSH1 0x2 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x2486 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SSTORE PUSH2 0x241D JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x24D2 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x24D2 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x24B7 JUMP JUMPDEST POP PUSH2 0x24DE SWAP3 SWAP2 POP PUSH2 0x254F JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x2523 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x24D2 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x24D2 JUMPI SWAP2 DUP3 ADD DUP3 DUP2 GT ISZERO PUSH2 0x24D2 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x24B7 JUMP JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x24DE JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2550 JUMP INVALID GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220746F20746865207A65726F2061 PUSH5 0x6472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH3 0x75726E KECCAK256 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545524332 ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F766520746F20746865207A65726F20616464 PUSH19 0x65737345524332303A207472616E7366657220 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545434453 COINBASE GASPRICE KECCAK256 PUSH10 0x6E76616C696420736967 PUSH15 0x6174757265202773272076616C7565 0x49 PUSH15 0x697469616C697A61626C653A20636F PUSH15 0x747261637420697320616C72656164 PUSH26 0x20696E697469616C697A656445434453413A20696E76616C6964 KECCAK256 PUSH20 0x69676E6174757265202776272076616C7565AF45 0xC4 0xFB SWAP15 0xF7 MULMOD GT 0xE5 DIFFICULTY 0x4B DUP15 0xED 0xCE PUSH1 0x73 PUSH7 0xE494224D52E6FE 0xAB SMOD 0xFB 0xD6 0x2A MSTORE8 0xB2 PUSH16 0x45524332303A207472616E7366657220 PUSH2 0x6D6F PUSH22 0x6E74206578636565647320616C6C6F77616E6365436F PUSH15 0x74726F6C6C6564546F6B656E2F6578 PUSH4 0x65656473 0x2D PUSH2 0x6C6C PUSH16 0x77616E636545524332303A206275726E KECCAK256 PUSH7 0x726F6D20746865 KECCAK256 PUSH27 0x65726F206164647265737345524332303A207472616E7366657220 PUSH7 0x726F6D20746865 KECCAK256 PUSH27 0x65726F206164647265737345524332303A20617070726F76652066 PUSH19 0x6F6D20746865207A65726F2061646472657373 NUMBER PUSH16 0x6E74726F6C6C6564546F6B656E2F636F PUSH15 0x74726F6C6C65722D6E6F742D7A6572 PUSH16 0x45524332303A20646563726561736564 KECCAK256 PUSH2 0x6C6C PUSH16 0x77616E63652062656C6F77207A65726F LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x24 SWAP15 0xA7 0x1F RETURNDATASIZE MSTORE8 0xC9 GASLIMIT SWAP7 0x28 0x21 0xAE 0x27 DUP8 SWAP5 0x2E MULMOD SWAP8 0xB1 CHAINID 0xAB 0xDB KECCAK256 MSIZE CODESIZE 0xE3 0xEA 0x4D GASLIMIT NUMBER SELFBALANCE 0x28 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "326:545:93:-:0;;;548:56;;;;;;;;;;587:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;576:8:93;:23;;-1:-1:-1;;;;;;576:23:93;-1:-1:-1;;;;;576:23:93;;;;;;;;;;326:545;;;;;;;;;;:::o;:::-;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106100415760003560e01c8063022ec09514610046578063b3eeb5e21461006a578063efc81a8c14610120575b600080fd5b61004e610128565b604080516001600160a01b039092168252519081900360200190f35b61004e6004803603604081101561008057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100ab57600080fd5b8201836020820111156100bd57600080fd5b803590602001918460018302840111640100000000831117156100df57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610137945050505050565b61004e6102b3565b6000546001600160a01b031681565b6000808360601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f0604080516001600160a01b038316815290519194507efffc2da0b561cae30d9826d37709e9421c4725faebc226cbbb7ef5fc5e7349925081900360200190a18251156102ac576000826001600160a01b0316846040518082805190602001908083835b602083106102035780518252601f1990920191602091820191016101e4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610265576040519150601f19603f3d011682016040523d82523d6000602084013e61026a565b606091505b50509050806102aa5760405162461bcd60e51b81526004018080602001828103825260248152602001806102de6024913960400191505060405180910390fd5b505b5092915050565b6000805460408051602081019091528281526102d8916001600160a01b031690610137565b90509056fe50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564a26469706673582212205ae3412cec8c2db03f6c7ec02aac9a02672e7d53a07498e960daa42ca4a37a2564736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x22EC095 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0xB3EEB5E2 EQ PUSH2 0x6A JUMPI DUP1 PUSH4 0xEFC81A8C EQ PUSH2 0x120 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x128 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 CALLDATALOAD AND SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xDF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x137 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x4E PUSH2 0x2B3 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x60 SHL SWAP1 POP PUSH1 0x40 MLOAD PUSH20 0x3D602D80600A3D3981F3363D3D373D3D3D363D73 PUSH1 0x60 SHL DUP2 MSTORE DUP2 PUSH1 0x14 DUP3 ADD MSTORE PUSH15 0x5AF43D82803E903D91602B57FD5BF3 PUSH1 0x88 SHL PUSH1 0x28 DUP3 ADD MSTORE PUSH1 0x37 DUP2 PUSH1 0x0 CREATE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP5 POP PUSH31 0xFFFC2DA0B561CAE30D9826D37709E9421C4725FAEBC226CBBB7EF5FC5E7349 SWAP3 POP DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 DUP3 MLOAD ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x265 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x26A JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP POP SWAP1 POP DUP1 PUSH2 0x2AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x2DE PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE DUP3 DUP2 MSTORE PUSH2 0x2D8 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH2 0x137 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP INVALID POP PUSH19 0x6F7879466163746F72792F636F6E7374727563 PUSH21 0x6F722D63616C6C2D6661696C6564A2646970667358 0x22 SLT KECCAK256 GAS 0xE3 COINBASE 0x2C 0xEC DUP13 0x2D 0xB0 EXTCODEHASH PUSH13 0x7EC02AAC9A02672E7D53A07498 0xE9 PUSH1 0xDA LOG4 0x2C LOG4 LOG3 PUSH27 0x2564736F6C634300060C0033000000000000000000000000000000 ",
              "sourceMap": "326:545:93:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;436:22;;;:::i;:::-;;;;-1:-1:-1;;;;;436:22:93;;;;;;;;;;;;;;182:778:38;;;;;;;;;;;;;;;;-1:-1:-1;;;;;182:778:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;182:778:38;;-1:-1:-1;182:778:38;;-1:-1:-1;;;;;182:778:38:i;763:106:93:-;;;:::i;436:22::-;;;-1:-1:-1;;;;;436:22:93;;:::o;182:778:38:-;257:13;416:19;446:6;438:15;;416:37;;495:4;489:11;-1:-1:-1;;;514:5:38;507:81;620:11;613:4;606:5;602:16;595:37;-1:-1:-1;;;657:4:38;650:5;646:16;639:92;764:4;757:5;754:1;747:22;786:28;;;-1:-1:-1;;;;;786:28:38;;;;;;738:31;;-1:-1:-1;786:28:38;;-1:-1:-1;786:28:38;;;;;;;824:12;;:16;821:135;;851:12;868:5;-1:-1:-1;;;;;868:10:38;879:5;868:17;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;868:17:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;850:35;;;901:7;893:56;;;;-1:-1:-1;;;893:56:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;821:135;;182:778;;;;;:::o;763:106:93:-;799:6;849:8;;827:36;;;;;;;;;;;;;;-1:-1:-1;;;;;849:8:93;;827:13;:36::i;:::-;813:51;;763:106;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "164600",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "create()": "infinite",
                "deployMinimal(address,bytes)": "infinite",
                "instance()": "1015"
              }
            },
            "methodIdentifiers": {
              "create()": "efc81a8c",
              "deployMinimal(address,bytes)": "b3eeb5e2",
              "instance()": "022ec095"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"name\":\"ProxyCreated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"create\",\"outputs\":[{\"internalType\":\"contract Ticket\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"deployMinimal\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"instance\",\"outputs\":[{\"internalType\":\"contract Ticket\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"create()\":{\"returns\":{\"_0\":\"A reference to the new proxied Controlled ERC20 Token\"}}},\"title\":\"Controlled ERC20 Token Factory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":\"Initializes the Factory with an instance of the Controlled ERC20 Token\",\"create()\":{\"notice\":\"Creates a new Controlled ERC20 Token as a proxy of the template instance\"},\"instance()\":{\"notice\":\"Contract template for deploying proxied tokens\"}},\"notice\":\"Minimal proxy pattern for creating new Controlled ERC20 Tokens\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/TicketProxyFactory.sol\":\"TicketProxyFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSAUpgradeable {\\n    /**\\n     * @dev Returns the address that signed a hashed message (`hash`) with\\n     * `signature`. This address can then be used for verification purposes.\\n     *\\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n     * this function rejects them by requiring the `s` value to be in the lower\\n     * half order, and the `v` value to be either 27 or 28.\\n     *\\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n     * verification to be secure: it is possible to craft signatures that\\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n     * this is by receiving a hash of the original message (which may otherwise\\n     * be too long), and then calling {toEthSignedMessageHash} on it.\\n     */\\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n        // Check the signature length\\n        if (signature.length != 65) {\\n            revert(\\\"ECDSA: invalid signature length\\\");\\n        }\\n\\n        // Divide the signature in r, s and v variables\\n        bytes32 r;\\n        bytes32 s;\\n        uint8 v;\\n\\n        // ecrecover takes the signature parameters, and the only way to get them\\n        // currently is to use assembly.\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            r := mload(add(signature, 0x20))\\n            s := mload(add(signature, 0x40))\\n            v := byte(0, mload(add(signature, 0x60)))\\n        }\\n\\n        return recover(hash, v, r, s);\\n    }\\n\\n    /**\\n     * @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\\n     * `r` and `s` signature fields separately.\\n     */\\n    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n        // the valid range for s in (281): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (282): v \\u2208 {27, 28}. Most\\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n        //\\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n        // these malleable signatures as well.\\n        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, \\\"ECDSA: invalid signature 's' value\\\");\\n        require(v == 27 || v == 28, \\\"ECDSA: invalid signature 'v' value\\\");\\n\\n        // If the signature is valid (and not malleable), return the signer address\\n        address signer = ecrecover(hash, v, r, s);\\n        require(signer != address(0), \\\"ECDSA: invalid signature\\\");\\n\\n        return signer;\\n    }\\n\\n    /**\\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n     * replicates the behavior of the\\n     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\\n     * JSON-RPC method.\\n     *\\n     * See {recover}.\\n     */\\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n        // 32 is the length in bytes of hash,\\n        // enforced by the type signature above\\n        return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n    }\\n}\\n\",\"keccak256\":\"0xe348c45df01e0705c50ede5063d77111a996722ffb83f0a22979338a32b06887\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\\n *\\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\\n *\\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\\n * ({_hashTypedDataV4}).\\n *\\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\\n * the chain id to protect against replay attacks on an eventual fork of the chain.\\n *\\n * NOTE: This contract implements the version of the encoding known as \\\"v4\\\", as implemented by the JSON RPC method\\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\\n *\\n * _Available since v3.4._\\n */\\nabstract contract EIP712Upgradeable is Initializable {\\n    /* solhint-disable var-name-mixedcase */\\n    bytes32 private _HASHED_NAME;\\n    bytes32 private _HASHED_VERSION;\\n    bytes32 private constant _TYPE_HASH = keccak256(\\\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\\\");\\n    /* solhint-enable var-name-mixedcase */\\n\\n    /**\\n     * @dev Initializes the domain separator and parameter caches.\\n     *\\n     * The meaning of `name` and `version` is specified in\\n     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\\n     *\\n     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\\n     * - `version`: the current major version of the signing domain.\\n     *\\n     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\\n     * contract upgrade].\\n     */\\n    function __EIP712_init(string memory name, string memory version) internal initializer {\\n        __EIP712_init_unchained(name, version);\\n    }\\n\\n    function __EIP712_init_unchained(string memory name, string memory version) internal initializer {\\n        bytes32 hashedName = keccak256(bytes(name));\\n        bytes32 hashedVersion = keccak256(bytes(version));\\n        _HASHED_NAME = hashedName;\\n        _HASHED_VERSION = hashedVersion;\\n    }\\n\\n    /**\\n     * @dev Returns the domain separator for the current chain.\\n     */\\n    function _domainSeparatorV4() internal view returns (bytes32) {\\n        return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());\\n    }\\n\\n    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {\\n        return keccak256(\\n            abi.encode(\\n                typeHash,\\n                name,\\n                version,\\n                _getChainId(),\\n                address(this)\\n            )\\n        );\\n    }\\n\\n    /**\\n     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\\n     * function returns the hash of the fully encoded EIP712 message for this domain.\\n     *\\n     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\\n     *\\n     * ```solidity\\n     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\\n     *     keccak256(\\\"Mail(address to,string contents)\\\"),\\n     *     mailTo,\\n     *     keccak256(bytes(mailContents))\\n     * )));\\n     * address signer = ECDSA.recover(digest, signature);\\n     * ```\\n     */\\n    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\\n        return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", _domainSeparatorV4(), structHash));\\n    }\\n\\n    function _getChainId() private view returns (uint256 chainId) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly {\\n            chainId := chainid()\\n        }\\n    }\\n\\n    /**\\n     * @dev The hash of the name parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712NameHash() internal virtual view returns (bytes32) {\\n        return _HASHED_NAME;\\n    }\\n\\n    /**\\n     * @dev The hash of the version parameter for the EIP712 domain.\\n     *\\n     * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\\n     * are a concern.\\n     */\\n    function _EIP712VersionHash() internal virtual view returns (bytes32) {\\n        return _HASHED_VERSION;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x6cd0bc8c149150614ca3d4a3d3d21f844a0ab3032625f34fcfcf1c2c8b351638\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.5 <0.8.0;\\n\\nimport \\\"../token/ERC20/ERC20Upgradeable.sol\\\";\\nimport \\\"./IERC20PermitUpgradeable.sol\\\";\\nimport \\\"../cryptography/ECDSAUpgradeable.sol\\\";\\nimport \\\"../utils/CountersUpgradeable.sol\\\";\\nimport \\\"./EIP712Upgradeable.sol\\\";\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * _Available since v3.4._\\n */\\nabstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable {\\n    using CountersUpgradeable for CountersUpgradeable.Counter;\\n\\n    mapping (address => CountersUpgradeable.Counter) private _nonces;\\n\\n    // solhint-disable-next-line var-name-mixedcase\\n    bytes32 private _PERMIT_TYPEHASH;\\n\\n    /**\\n     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\\\"1\\\"`.\\n     *\\n     * It's a good idea to use the same `name` that is defined as the ERC20 token name.\\n     */\\n    function __ERC20Permit_init(string memory name) internal initializer {\\n        __Context_init_unchained();\\n        __EIP712_init_unchained(name, \\\"1\\\");\\n        __ERC20Permit_init_unchained(name);\\n    }\\n\\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\\n        _PERMIT_TYPEHASH = keccak256(\\\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\\\");\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-permit}.\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual override {\\n        // solhint-disable-next-line not-rely-on-time\\n        require(block.timestamp <= deadline, \\\"ERC20Permit: expired deadline\\\");\\n\\n        bytes32 structHash = keccak256(\\n            abi.encode(\\n                _PERMIT_TYPEHASH,\\n                owner,\\n                spender,\\n                value,\\n                _nonces[owner].current(),\\n                deadline\\n            )\\n        );\\n\\n        bytes32 hash = _hashTypedDataV4(structHash);\\n\\n        address signer = ECDSAUpgradeable.recover(hash, v, r, s);\\n        require(signer == owner, \\\"ERC20Permit: invalid signature\\\");\\n\\n        _nonces[owner].increment();\\n        _approve(owner, spender, value);\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-nonces}.\\n     */\\n    function nonces(address owner) public view override returns (uint256) {\\n        return _nonces[owner].current();\\n    }\\n\\n    /**\\n     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view override returns (bytes32) {\\n        return _domainSeparatorV4();\\n    }\\n    uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xb30c40eb91411e29d23c8184b19fd37e6c2447f685631b798af2871ede483157\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n */\\ninterface IERC20PermitUpgradeable {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\\n     * given `owner`'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     */\\n    function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x30c000f3a68d252b09a738c782e0fc9dbf168b81021a195de6102f8d095681ae\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"../../math/SafeMathUpgradeable.sol\\\";\\nimport \\\"../../proxy/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\n * of returning `false` on failure. This behavior is nonetheless conventional\\n * and does not conflict with the expectations of ERC20 applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    mapping (address => uint256) private _balances;\\n\\n    mapping (address => mapping (address => uint256)) private _allowances;\\n\\n    uint256 private _totalSupply;\\n\\n    string private _name;\\n    string private _symbol;\\n    uint8 private _decimals;\\n\\n    /**\\n     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with\\n     * a default value of 18.\\n     *\\n     * To select a different value for {decimals}, use {_setupDecimals}.\\n     *\\n     * All three of these values are immutable: they can only be set once during\\n     * construction.\\n     */\\n    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {\\n        __Context_init_unchained();\\n        __ERC20_init_unchained(name_, symbol_);\\n    }\\n\\n    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {\\n        _name = name_;\\n        _symbol = symbol_;\\n        _decimals = 18;\\n    }\\n\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() public view virtual returns (string memory) {\\n        return _name;\\n    }\\n\\n    /**\\n     * @dev Returns the symbol of the token, usually a shorter version of the\\n     * name.\\n     */\\n    function symbol() public view virtual returns (string memory) {\\n        return _symbol;\\n    }\\n\\n    /**\\n     * @dev Returns the number of decimals used to get its user representation.\\n     * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n     * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\n     *\\n     * Tokens usually opt for a value of 18, imitating the relationship between\\n     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\\n     * called.\\n     *\\n     * NOTE: This information is only used for _display_ purposes: it in\\n     * no way affects any of the arithmetic of the contract, including\\n     * {IERC20-balanceOf} and {IERC20-transfer}.\\n     */\\n    function decimals() public view virtual returns (uint8) {\\n        return _decimals;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-totalSupply}.\\n     */\\n    function totalSupply() public view virtual override returns (uint256) {\\n        return _totalSupply;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-balanceOf}.\\n     */\\n    function balanceOf(address account) public view virtual override returns (uint256) {\\n        return _balances[account];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transfer}.\\n     *\\n     * Requirements:\\n     *\\n     * - `recipient` cannot be the zero address.\\n     * - the caller must have a balance of at least `amount`.\\n     */\\n    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(_msgSender(), recipient, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-allowance}.\\n     */\\n    function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n        return _allowances[owner][spender];\\n    }\\n\\n    /**\\n     * @dev See {IERC20-approve}.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n        _approve(_msgSender(), spender, amount);\\n        return true;\\n    }\\n\\n    /**\\n     * @dev See {IERC20-transferFrom}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance. This is not\\n     * required by the EIP. See the note at the beginning of {ERC20}.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` and `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     * - the caller must have allowance for ``sender``'s tokens of at least\\n     * `amount`.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\\n        _transfer(sender, recipient, amount);\\n        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, \\\"ERC20: transfer amount exceeds allowance\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically increases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     */\\n    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n     *\\n     * This is an alternative to {approve} that can be used as a mitigation for\\n     * problems described in {IERC20-approve}.\\n     *\\n     * Emits an {Approval} event indicating the updated allowance.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `spender` must have allowance for the caller of at least\\n     * `subtractedValue`.\\n     */\\n    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, \\\"ERC20: decreased allowance below zero\\\"));\\n        return true;\\n    }\\n\\n    /**\\n     * @dev Moves tokens `amount` from `sender` to `recipient`.\\n     *\\n     * This is internal function is equivalent to {transfer}, and can be used to\\n     * e.g. implement automatic token fees, slashing mechanisms, etc.\\n     *\\n     * Emits a {Transfer} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `sender` cannot be the zero address.\\n     * - `recipient` cannot be the zero address.\\n     * - `sender` must have a balance of at least `amount`.\\n     */\\n    function _transfer(address sender, address recipient, uint256 amount) internal virtual {\\n        require(sender != address(0), \\\"ERC20: transfer from the zero address\\\");\\n        require(recipient != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n        _beforeTokenTransfer(sender, recipient, amount);\\n\\n        _balances[sender] = _balances[sender].sub(amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n        _balances[recipient] = _balances[recipient].add(amount);\\n        emit Transfer(sender, recipient, amount);\\n    }\\n\\n    /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n     * the total supply.\\n     *\\n     * Emits a {Transfer} event with `from` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `to` cannot be the zero address.\\n     */\\n    function _mint(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n        _beforeTokenTransfer(address(0), account, amount);\\n\\n        _totalSupply = _totalSupply.add(amount);\\n        _balances[account] = _balances[account].add(amount);\\n        emit Transfer(address(0), account, amount);\\n    }\\n\\n    /**\\n     * @dev Destroys `amount` tokens from `account`, reducing the\\n     * total supply.\\n     *\\n     * Emits a {Transfer} event with `to` set to the zero address.\\n     *\\n     * Requirements:\\n     *\\n     * - `account` cannot be the zero address.\\n     * - `account` must have at least `amount` tokens.\\n     */\\n    function _burn(address account, uint256 amount) internal virtual {\\n        require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n        _beforeTokenTransfer(account, address(0), amount);\\n\\n        _balances[account] = _balances[account].sub(amount, \\\"ERC20: burn amount exceeds balance\\\");\\n        _totalSupply = _totalSupply.sub(amount);\\n        emit Transfer(account, address(0), amount);\\n    }\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n     *\\n     * This internal function is equivalent to `approve`, and can be used to\\n     * e.g. set automatic allowances for certain subsystems, etc.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `owner` cannot be the zero address.\\n     * - `spender` cannot be the zero address.\\n     */\\n    function _approve(address owner, address spender, uint256 amount) internal virtual {\\n        require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n        require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n        _allowances[owner][spender] = amount;\\n        emit Approval(owner, spender, amount);\\n    }\\n\\n    /**\\n     * @dev Sets {decimals} to a value other than the default one of 18.\\n     *\\n     * WARNING: This function should only be called from the constructor. Most\\n     * applications that interact with token contracts will not expect\\n     * {decimals} to ever change, and may work incorrectly if it does.\\n     */\\n    function _setupDecimals(uint8 decimals_) internal virtual {\\n        _decimals = decimals_;\\n    }\\n\\n    /**\\n     * @dev Hook that is called before any transfer of tokens. This includes\\n     * minting and burning.\\n     *\\n     * Calling conditions:\\n     *\\n     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n     * will be to transferred to `to`.\\n     * - when `from` is zero, `amount` tokens will be minted for `to`.\\n     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n     * - `from` and `to` are never both zero.\\n     *\\n     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n     */\\n    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }\\n    uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x506dd0718f9ace50588c13848167df5e04ae16abb56341afb10c31ff149bc79b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\nimport \\\"../proxy/Initializable.sol\\\";\\n\\n/*\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with GSN meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n    function __Context_init() internal initializer {\\n        __Context_init_unchained();\\n    }\\n\\n    function __Context_init_unchained() internal initializer {\\n    }\\n    function _msgSender() internal view virtual returns (address payable) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes memory) {\\n        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691\\n        return msg.data;\\n    }\\n    uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0xbbf8a21b9a66c48d45ff771b8563c6df19ba451d63dfb8380a865c1e1f29d1a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"../math/SafeMathUpgradeable.sol\\\";\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\\n * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\\n * directly accessed.\\n */\\nlibrary CountersUpgradeable {\\n    using SafeMathUpgradeable for uint256;\\n\\n    struct Counter {\\n        // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n        // this feature: see https://github.com/ethereum/solidity/issues/4637\\n        uint256 _value; // default: 0\\n    }\\n\\n    function current(Counter storage counter) internal view returns (uint256) {\\n        return counter._value;\\n    }\\n\\n    function increment(Counter storage counter) internal {\\n        // The {SafeMath} overflow check can be skipped here, see the comment at the top\\n        counter._value += 1;\\n    }\\n\\n    function decrement(Counter storage counter) internal {\\n        counter._value = counter._value.sub(1);\\n    }\\n}\\n\",\"keccak256\":\"0xe0162cc9b4d619790be38ce4c184a1cd33d41698629ae6bcac00049f24f6cce8\",\"license\":\"MIT\"},\"@pooltogether/uniform-random-number/contracts/UniformRandomNumber.sol\":{\"content\":\"/**\\nCopyright 2019 PoolTogether LLC\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice A library that uses entropy to select a random number within a bound.  Compensates for modulo bias.\\n * @dev Thanks to https://medium.com/hownetworks/dont-waste-cycles-with-modulo-bias-35b6fdafcf94\\n */\\nlibrary UniformRandomNumber {\\n  /// @notice Select a random number without modulo bias using a random seed and upper bound\\n  /// @param _entropy The seed for randomness\\n  /// @param _upperBound The upper bound of the desired number\\n  /// @return A random number less than the _upperBound\\n  function uniform(uint256 _entropy, uint256 _upperBound) internal pure returns (uint256) {\\n    require(_upperBound > 0, \\\"UniformRand/min-bound\\\");\\n    uint256 min = -_upperBound % _upperBound;\\n    uint256 random = _entropy;\\n    while (true) {\\n      if (random >= min) {\\n        break;\\n      }\\n      random = uint256(keccak256(abi.encodePacked(random)));\\n    }\\n    return random % _upperBound;\\n  }\\n}\",\"keccak256\":\"0x0d86eb3349d8a9e226ff6f3328a6a79bbf872859a4afbe489051fbf3b8550df4\"},\"contracts/external/openzeppelin/ProxyFactory.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\n// solium-disable security/no-inline-assembly\\n// solium-disable security/no-low-level-calls\\ncontract ProxyFactory {\\n\\n  event ProxyCreated(address proxy);\\n\\n  function deployMinimal(address _logic, bytes memory _data) public returns (address proxy) {\\n    // Adapted from https://github.com/optionality/clone-factory/blob/32782f82dfc5a00d103a7e61a17a5dedbd1e8e9d/contracts/CloneFactory.sol\\n    bytes20 targetBytes = bytes20(_logic);\\n    assembly {\\n      let clone := mload(0x40)\\n      mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\\n      mstore(add(clone, 0x14), targetBytes)\\n      mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\\n      proxy := create(0, clone, 0x37)\\n    }\\n\\n    emit ProxyCreated(address(proxy));\\n\\n    if(_data.length > 0) {\\n      (bool success,) = proxy.call(_data);\\n      require(success, \\\"ProxyFactory/constructor-call-failed\\\");\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0xf0422303985796fdd8bdf772ac8e34331e2e63006f657989cca010fa4776d735\"},\"contracts/token/ControlledToken.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\nimport \\\"./ControlledTokenInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ncontract ControlledToken is ERC20PermitUpgradeable, ControlledTokenInterface {\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  TokenControllerInterface public override controller;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"ControlledToken/controller-not-zero\\\");\\n    __ERC20_init(_name, _symbol);\\n    __ERC20Permit_init(\\\"PoolTogether ControlledToken\\\");\\n    controller = _controller;\\n    _setupDecimals(_decimals);\\n\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external virtual override onlyController {\\n    _mint(_user, _amount);\\n  }\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external virtual override onlyController {\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external virtual override onlyController {\\n    if (_operator != _user) {\\n      uint256 decreasedAllowance = allowance(_user, _operator).sub(_amount, \\\"ControlledToken/exceeds-allowance\\\");\\n      _approve(_user, _operator, decreasedAllowance);\\n    }\\n    _burn(_user, _amount);\\n  }\\n\\n  /// @dev Function modifier to ensure that the caller is the controller contract\\n  modifier onlyController {\\n    require(_msgSender() == address(controller), \\\"ControlledToken/only-controller\\\");\\n    _;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    controller.beforeTokenTransfer(from, to, amount);\\n  }\\n}\\n\",\"keccak256\":\"0x55f2393331e58b48d9bdb40a09c41704d4e5ac59aaf7fa29dc5d17de08a9363e\",\"license\":\"GPL-3.0\"},\"contracts/token/ControlledTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"./TokenControllerInterface.sol\\\";\\n\\n/// @title Controlled ERC20 Token\\n/// @notice ERC20 Tokens with a controller for minting & burning\\ninterface ControlledTokenInterface is IERC20Upgradeable {\\n\\n  /// @notice Interface to the contract responsible for controlling mint/burn\\n  function controller() external view returns (TokenControllerInterface);\\n\\n  /// @notice Allows the controller to mint tokens for a user account\\n  /// @dev May be overridden to provide more granular control over minting\\n  /// @param _user Address of the receiver of the minted tokens\\n  /// @param _amount Amount of tokens to mint\\n  function controllerMint(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows the controller to burn tokens from a user account\\n  /// @dev May be overridden to provide more granular control over burning\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurn(address _user, uint256 _amount) external;\\n\\n  /// @notice Allows an operator via the controller to burn tokens on behalf of a user account\\n  /// @dev May be overridden to provide more granular control over operator-burning\\n  /// @param _operator Address of the operator performing the burn action via the controller contract\\n  /// @param _user Address of the holder account to burn tokens from\\n  /// @param _amount Amount of tokens to burn\\n  function controllerBurnFrom(address _operator, address _user, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0x13d454412d09227357e89355d7803149663982634aab16e3d5e35b3ebd34a851\",\"license\":\"GPL-3.0\"},\"contracts/token/Ticket.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"sortition-sum-tree-factory/contracts/SortitionSumTreeFactory.sol\\\";\\nimport \\\"@pooltogether/uniform-random-number/contracts/UniformRandomNumber.sol\\\";\\n\\nimport \\\"./ControlledToken.sol\\\";\\nimport \\\"./TicketInterface.sol\\\";\\n\\ncontract Ticket is ControlledToken, TicketInterface {\\n  using SortitionSumTreeFactory for SortitionSumTreeFactory.SortitionSumTrees;\\n\\n  bytes32 constant private TREE_KEY = keccak256(\\\"PoolTogether/Ticket\\\");\\n  uint256 constant private MAX_TREE_LEAVES = 5;\\n\\n  /// @dev Emitted when an instance is initialized\\n  event Initialized(\\n    string _name,\\n    string _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  );\\n\\n  // Ticket-weighted odds\\n  SortitionSumTreeFactory.SortitionSumTrees internal sortitionSumTrees;\\n\\n  /// @notice Initializes the Controlled Token with Token Details and the Controller\\n  /// @param _name The name of the Token\\n  /// @param _symbol The symbol for the Token\\n  /// @param _decimals The number of decimals for the Token\\n  /// @param _controller Address of the Controller contract for minting & burning\\n  function initialize(\\n    string memory _name,\\n    string memory _symbol,\\n    uint8 _decimals,\\n    TokenControllerInterface _controller\\n  )\\n    public\\n    virtual\\n    override\\n    initializer\\n  {\\n    require(address(_controller) != address(0), \\\"Ticket/controller-not-zero\\\");\\n    ControlledToken.initialize(_name, _symbol, _decimals, _controller);\\n    sortitionSumTrees.createTree(TREE_KEY, MAX_TREE_LEAVES);\\n    emit Initialized(\\n      _name,\\n      _symbol,\\n      _decimals,\\n      _controller\\n    );\\n  }\\n\\n  /// @notice Returns the user's chance of winning.\\n  function chanceOf(address user) external view returns (uint256) {\\n    return sortitionSumTrees.stakeOf(TREE_KEY, bytes32(uint256(user)));\\n  }\\n\\n  /// @notice Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\\n  /// @param randomNumber The random number to use to select a user.\\n  /// @return The winner\\n  function draw(uint256 randomNumber) external view override returns (address) {\\n    uint256 bound = totalSupply();\\n    address selected;\\n    if (bound == 0) {\\n      selected = address(0);\\n    } else {\\n      uint256 token = UniformRandomNumber.uniform(randomNumber, bound);\\n      selected = address(uint256(sortitionSumTrees.draw(TREE_KEY, token)));\\n    }\\n    return selected;\\n  }\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// May be overridden to provide more granular control over operator-burning\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {\\n    super._beforeTokenTransfer(from, to, amount);\\n\\n    // optimize: ignore transfers to self\\n    if (from == to) {\\n      return;\\n    }\\n\\n    if (from != address(0)) {\\n      uint256 fromBalance = balanceOf(from).sub(amount);\\n      sortitionSumTrees.set(TREE_KEY, fromBalance, bytes32(uint256(from)));\\n    }\\n\\n    if (to != address(0)) {\\n      uint256 toBalance = balanceOf(to).add(amount);\\n      sortitionSumTrees.set(TREE_KEY, toBalance, bytes32(uint256(to)));\\n    }\\n  }\\n\\n}\",\"keccak256\":\"0xf659dcfda626c713b7dd64525476d282e141163977edd881b647e83f505c4044\",\"license\":\"GPL-3.0\"},\"contracts/token/TicketInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Interface that allows a user to draw an address using an index\\ninterface TicketInterface {\\n  /// @notice Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\\n  /// @param randomNumber The random number to use to select a user.\\n  /// @return The winner\\n  function draw(uint256 randomNumber) external view returns (address);\\n}\",\"keccak256\":\"0x5201a9a22748781592abd2003801289224d4899292195b7de937cd5748be87dd\",\"license\":\"GPL-3.0\"},\"contracts/token/TicketProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\\\";\\n\\nimport \\\"./Ticket.sol\\\";\\nimport \\\"../external/openzeppelin/ProxyFactory.sol\\\";\\n\\n/// @title Controlled ERC20 Token Factory\\n/// @notice Minimal proxy pattern for creating new Controlled ERC20 Tokens\\ncontract TicketProxyFactory is ProxyFactory {\\n\\n  /// @notice Contract template for deploying proxied tokens\\n  Ticket public instance;\\n\\n  /// @notice Initializes the Factory with an instance of the Controlled ERC20 Token\\n  constructor () public {\\n    instance = new Ticket();\\n  }\\n\\n  /// @notice Creates a new Controlled ERC20 Token as a proxy of the template instance\\n  /// @return A reference to the new proxied Controlled ERC20 Token\\n  function create() external returns (Ticket) {\\n    return Ticket(deployMinimal(address(instance), \\\"\\\"));\\n  }\\n}\\n\",\"keccak256\":\"0xb68f1cd27e8caaab3f69d6ccd14e70ff2d7c3685c9c45733f62690087833410e\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"},\"sortition-sum-tree-factory/contracts/SortitionSumTreeFactory.sol\":{\"content\":\"/**\\n *  @reviewers: [@clesaege, @unknownunknown1, @ferittuncer]\\n *  @auditors: []\\n *  @bounties: [<14 days 10 ETH max payout>]\\n *  @deployments: []\\n */\\n\\npragma solidity ^0.6.0;\\n\\n/**\\n *  @title SortitionSumTreeFactory\\n *  @author Enrique Piqueras - <epiquerass@gmail.com>\\n *  @dev A factory of trees that keep track of staked values for sortition.\\n */\\nlibrary SortitionSumTreeFactory {\\n    /* Structs */\\n\\n    struct SortitionSumTree {\\n        uint K; // The maximum number of childs per node.\\n        // We use this to keep track of vacant positions in the tree after removing a leaf. This is for keeping the tree as balanced as possible without spending gas on moving nodes around.\\n        uint[] stack;\\n        uint[] nodes;\\n        // Two-way mapping of IDs to node indexes. Note that node index 0 is reserved for the root node, and means the ID does not have a node.\\n        mapping(bytes32 => uint) IDsToNodeIndexes;\\n        mapping(uint => bytes32) nodeIndexesToIDs;\\n    }\\n\\n    /* Storage */\\n\\n    struct SortitionSumTrees {\\n        mapping(bytes32 => SortitionSumTree) sortitionSumTrees;\\n    }\\n\\n    /* internal */\\n\\n    /**\\n     *  @dev Create a sortition sum tree at the specified key.\\n     *  @param _key The key of the new tree.\\n     *  @param _K The number of children each node in the tree should have.\\n     */\\n    function createTree(SortitionSumTrees storage self, bytes32 _key, uint _K) internal {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        require(tree.K == 0, \\\"Tree already exists.\\\");\\n        require(_K > 1, \\\"K must be greater than one.\\\");\\n        tree.K = _K;\\n        tree.stack = new uint[](0);\\n        tree.nodes = new uint[](0);\\n        tree.nodes.push(0);\\n    }\\n\\n    /**\\n     *  @dev Set a value of a tree.\\n     *  @param _key The key of the tree.\\n     *  @param _value The new value.\\n     *  @param _ID The ID of the value.\\n     *  `O(log_k(n))` where\\n     *  `k` is the maximum number of childs per node in the tree,\\n     *   and `n` is the maximum number of nodes ever appended.\\n     */\\n    function set(SortitionSumTrees storage self, bytes32 _key, uint _value, bytes32 _ID) internal {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        uint treeIndex = tree.IDsToNodeIndexes[_ID];\\n\\n        if (treeIndex == 0) { // No existing node.\\n            if (_value != 0) { // Non zero value.\\n                // Append.\\n                // Add node.\\n                if (tree.stack.length == 0) { // No vacant spots.\\n                    // Get the index and append the value.\\n                    treeIndex = tree.nodes.length;\\n                    tree.nodes.push(_value);\\n\\n                    // Potentially append a new node and make the parent a sum node.\\n                    if (treeIndex != 1 && (treeIndex - 1) % tree.K == 0) { // Is first child.\\n                        uint parentIndex = treeIndex / tree.K;\\n                        bytes32 parentID = tree.nodeIndexesToIDs[parentIndex];\\n                        uint newIndex = treeIndex + 1;\\n                        tree.nodes.push(tree.nodes[parentIndex]);\\n                        delete tree.nodeIndexesToIDs[parentIndex];\\n                        tree.IDsToNodeIndexes[parentID] = newIndex;\\n                        tree.nodeIndexesToIDs[newIndex] = parentID;\\n                    }\\n                } else { // Some vacant spot.\\n                    // Pop the stack and append the value.\\n                    treeIndex = tree.stack[tree.stack.length - 1];\\n                    tree.stack.pop();\\n                    tree.nodes[treeIndex] = _value;\\n                }\\n\\n                // Add label.\\n                tree.IDsToNodeIndexes[_ID] = treeIndex;\\n                tree.nodeIndexesToIDs[treeIndex] = _ID;\\n\\n                updateParents(self, _key, treeIndex, true, _value);\\n            }\\n        } else { // Existing node.\\n            if (_value == 0) { // Zero value.\\n                // Remove.\\n                // Remember value and set to 0.\\n                uint value = tree.nodes[treeIndex];\\n                tree.nodes[treeIndex] = 0;\\n\\n                // Push to stack.\\n                tree.stack.push(treeIndex);\\n\\n                // Clear label.\\n                delete tree.IDsToNodeIndexes[_ID];\\n                delete tree.nodeIndexesToIDs[treeIndex];\\n\\n                updateParents(self, _key, treeIndex, false, value);\\n            } else if (_value != tree.nodes[treeIndex]) { // New, non zero value.\\n                // Set.\\n                bool plusOrMinus = tree.nodes[treeIndex] <= _value;\\n                uint plusOrMinusValue = plusOrMinus ? _value - tree.nodes[treeIndex] : tree.nodes[treeIndex] - _value;\\n                tree.nodes[treeIndex] = _value;\\n\\n                updateParents(self, _key, treeIndex, plusOrMinus, plusOrMinusValue);\\n            }\\n        }\\n    }\\n\\n    /* internal Views */\\n\\n    /**\\n     *  @dev Query the leaves of a tree. Note that if `startIndex == 0`, the tree is empty and the root node will be returned.\\n     *  @param _key The key of the tree to get the leaves from.\\n     *  @param _cursor The pagination cursor.\\n     *  @param _count The number of items to return.\\n     *  @return startIndex The index at which leaves start\\n     *  @return values The values of the returned leaves\\n     *  @return hasMore Whether there are more for pagination.\\n     *  `O(n)` where\\n     *  `n` is the maximum number of nodes ever appended.\\n     */\\n    function queryLeafs(\\n        SortitionSumTrees storage self,\\n        bytes32 _key,\\n        uint _cursor,\\n        uint _count\\n    ) internal view returns(uint startIndex, uint[] memory values, bool hasMore) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n\\n        // Find the start index.\\n        for (uint i = 0; i < tree.nodes.length; i++) {\\n            if ((tree.K * i) + 1 >= tree.nodes.length) {\\n                startIndex = i;\\n                break;\\n            }\\n        }\\n\\n        // Get the values.\\n        uint loopStartIndex = startIndex + _cursor;\\n        values = new uint[](loopStartIndex + _count > tree.nodes.length ? tree.nodes.length - loopStartIndex : _count);\\n        uint valuesIndex = 0;\\n        for (uint j = loopStartIndex; j < tree.nodes.length; j++) {\\n            if (valuesIndex < _count) {\\n                values[valuesIndex] = tree.nodes[j];\\n                valuesIndex++;\\n            } else {\\n                hasMore = true;\\n                break;\\n            }\\n        }\\n    }\\n\\n    /**\\n     *  @dev Draw an ID from a tree using a number. Note that this function reverts if the sum of all values in the tree is 0.\\n     *  @param _key The key of the tree.\\n     *  @param _drawnNumber The drawn number.\\n     *  @return ID The drawn ID.\\n     *  `O(k * log_k(n))` where\\n     *  `k` is the maximum number of childs per node in the tree,\\n     *   and `n` is the maximum number of nodes ever appended.\\n     */\\n    function draw(SortitionSumTrees storage self, bytes32 _key, uint _drawnNumber) internal view returns(bytes32 ID) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        uint treeIndex = 0;\\n        uint currentDrawnNumber = _drawnNumber % tree.nodes[0];\\n\\n        while ((tree.K * treeIndex) + 1 < tree.nodes.length)  // While it still has children.\\n            for (uint i = 1; i <= tree.K; i++) { // Loop over children.\\n                uint nodeIndex = (tree.K * treeIndex) + i;\\n                uint nodeValue = tree.nodes[nodeIndex];\\n\\n                if (currentDrawnNumber >= nodeValue) currentDrawnNumber -= nodeValue; // Go to the next child.\\n                else { // Pick this child.\\n                    treeIndex = nodeIndex;\\n                    break;\\n                }\\n            }\\n        \\n        ID = tree.nodeIndexesToIDs[treeIndex];\\n    }\\n\\n    /** @dev Gets a specified ID's associated value.\\n     *  @param _key The key of the tree.\\n     *  @param _ID The ID of the value.\\n     *  @return value The associated value.\\n     */\\n    function stakeOf(SortitionSumTrees storage self, bytes32 _key, bytes32 _ID) internal view returns(uint value) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        uint treeIndex = tree.IDsToNodeIndexes[_ID];\\n\\n        if (treeIndex == 0) value = 0;\\n        else value = tree.nodes[treeIndex];\\n    }\\n\\n    function total(SortitionSumTrees storage self, bytes32 _key) internal view returns (uint) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        if (tree.nodes.length == 0) {\\n            return 0;\\n        } else {\\n            return tree.nodes[0];\\n        }\\n    }\\n\\n    /* Private */\\n\\n    /**\\n     *  @dev Update all the parents of a node.\\n     *  @param _key The key of the tree to update.\\n     *  @param _treeIndex The index of the node to start from.\\n     *  @param _plusOrMinus Wether to add (true) or substract (false).\\n     *  @param _value The value to add or substract.\\n     *  `O(log_k(n))` where\\n     *  `k` is the maximum number of childs per node in the tree,\\n     *   and `n` is the maximum number of nodes ever appended.\\n     */\\n    function updateParents(SortitionSumTrees storage self, bytes32 _key, uint _treeIndex, bool _plusOrMinus, uint _value) private {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n\\n        uint parentIndex = _treeIndex;\\n        while (parentIndex != 0) {\\n            parentIndex = (parentIndex - 1) / tree.K;\\n            tree.nodes[parentIndex] = _plusOrMinus ? tree.nodes[parentIndex] + _value : tree.nodes[parentIndex] - _value;\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa20ece2e1ddeaa6432549a7c38cd02594000b93a54b92399b89bae0dd76dbc7e\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 16163,
                "contract": "contracts/token/TicketProxyFactory.sol:TicketProxyFactory",
                "label": "instance",
                "offset": 0,
                "slot": "0",
                "type": "t_contract(Ticket)16140"
              }
            ],
            "types": {
              "t_contract(Ticket)16140": {
                "encoding": "inplace",
                "label": "contract Ticket",
                "numberOfBytes": "20"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "constructor": "Initializes the Factory with an instance of the Controlled ERC20 Token",
              "create()": {
                "notice": "Creates a new Controlled ERC20 Token as a proxy of the template instance"
              },
              "instance()": {
                "notice": "Contract template for deploying proxied tokens"
              }
            },
            "notice": "Minimal proxy pattern for creating new Controlled ERC20 Tokens",
            "version": 1
          }
        }
      },
      "contracts/token/TokenControllerInterface.sol": {
        "TokenControllerInterface": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                }
              ],
              "name": "beforeTokenTransfer",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "details": "Defines the spec required to be implemented by a Controlled ERC20 Token",
            "kind": "dev",
            "methods": {
              "beforeTokenTransfer(address,address,uint256)": {
                "details": "Controller hook to provide notifications & rule validations on token transfers to the controller. This includes minting and burning.",
                "params": {
                  "amount": "Amount of tokens being transferred",
                  "from": "Address of the account sending the tokens (address(0x0) on minting)",
                  "to": "Address of the account receiving the tokens (address(0x0) on burning)"
                }
              }
            },
            "title": "Controlled ERC20 Token Interface",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "beforeTokenTransfer(address,address,uint256)": "7cbab1c7"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"beforeTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Defines the spec required to be implemented by a Controlled ERC20 Token\",\"kind\":\"dev\",\"methods\":{\"beforeTokenTransfer(address,address,uint256)\":{\"details\":\"Controller hook to provide notifications & rule validations on token transfers to the controller. This includes minting and burning.\",\"params\":{\"amount\":\"Amount of tokens being transferred\",\"from\":\"Address of the account sending the tokens (address(0x0) on minting)\",\"to\":\"Address of the account receiving the tokens (address(0x0) on burning)\"}}},\"title\":\"Controlled ERC20 Token Interface\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Required interface for Controlled ERC20 Tokens linked to a Prize Pool\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/TokenControllerInterface.sol\":\"TokenControllerInterface\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/token/TokenControllerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\n/// @title Controlled ERC20 Token Interface\\n/// @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\\n/// @dev Defines the spec required to be implemented by a Controlled ERC20 Token\\ninterface TokenControllerInterface {\\n\\n  /// @dev Controller hook to provide notifications & rule validations on token transfers to the controller.\\n  /// This includes minting and burning.\\n  /// @param from Address of the account sending the tokens (address(0x0) on minting)\\n  /// @param to Address of the account receiving the tokens (address(0x0) on burning)\\n  /// @param amount Amount of tokens being transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount) external;\\n}\\n\",\"keccak256\":\"0x5dd2346b0d9616b15bfad6bd8dab3a34ad41aa77a5d0c5f4c1b54c0d5009b77f\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "notice": "Required interface for Controlled ERC20 Tokens linked to a Prize Pool",
            "version": 1
          }
        }
      },
      "contracts/token/TokenListener.sol": {
        "TokenListener": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "referrer",
                  "type": "address"
                }
              ],
              "name": "beforeTokenMint",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "beforeTokenTransfer",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes4",
                  "name": "interfaceId",
                  "type": "bytes4"
                }
              ],
              "name": "supportsInterface",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "beforeTokenMint(address,uint256,address,address)": {
                "params": {
                  "amount": "The amount of tokens being minted",
                  "controlledToken": "The address of the token that is being minted",
                  "referrer": "The address that referred the minting.",
                  "to": "The address of the receiver of the minted tokens."
                }
              },
              "beforeTokenTransfer(address,address,uint256,address)": {
                "params": {
                  "amount": "The amount of tokens transferred",
                  "controlledToken": "The address of the token that was transferred",
                  "from": "The address of the sender of the token transfer",
                  "to": "The address of the receiver of the token transfer.  Will be the zero address if burning."
                }
              },
              "supportsInterface(bytes4)": {
                "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."
              }
            },
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "beforeTokenMint(address,uint256,address,address)": "4d7f3db0",
              "beforeTokenTransfer(address,address,uint256,address)": "b2210957",
              "supportsInterface(bytes4)": "01ffc9a7"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"}],\"name\":\"beforeTokenMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"beforeTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"beforeTokenMint(address,uint256,address,address)\":{\"params\":{\"amount\":\"The amount of tokens being minted\",\"controlledToken\":\"The address of the token that is being minted\",\"referrer\":\"The address that referred the minting.\",\"to\":\"The address of the receiver of the minted tokens.\"}},\"beforeTokenTransfer(address,address,uint256,address)\":{\"params\":{\"amount\":\"The amount of tokens transferred\",\"controlledToken\":\"The address of the token that was transferred\",\"from\":\"The address of the sender of the token transfer\",\"to\":\"The address of the receiver of the token transfer.  Will be the zero address if burning.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"beforeTokenMint(address,uint256,address,address)\":{\"notice\":\"Called when tokens are minted.\"},\"beforeTokenTransfer(address,address,uint256,address)\":{\"notice\":\"Called when tokens are transferred or burned.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/TokenListener.sol\":\"TokenListener\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"contracts/Constants.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary Constants {\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC165 = 0x01ffc9a7;\\n  bytes4 public constant ERC165_INTERFACE_ID_ERC721 = 0x80ac58cd;\\n}\",\"keccak256\":\"0x5dc8f8bda4e9668a9ffae6a941774f849adcb368cc2275fd8a91e6ada8fad7fb\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListener.sol\":{\"content\":\"pragma solidity ^0.6.4;\\n\\nimport \\\"./TokenListenerInterface.sol\\\";\\nimport \\\"./TokenListenerLibrary.sol\\\";\\nimport \\\"../Constants.sol\\\";\\n\\nabstract contract TokenListener is TokenListenerInterface {\\n  function supportsInterface(bytes4 interfaceId) external override view returns (bool) {\\n    return (\\n      interfaceId == Constants.ERC165_INTERFACE_ID_ERC165 || \\n      interfaceId == TokenListenerLibrary.ERC165_INTERFACE_ID_TOKEN_LISTENER\\n    );\\n  }\\n}\\n\",\"keccak256\":\"0xb0e98d10b004602e1d4f4369a70e6382002dc0c0c5713698eb6a92943aef2265\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"},\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "beforeTokenMint(address,uint256,address,address)": {
                "notice": "Called when tokens are minted."
              },
              "beforeTokenTransfer(address,address,uint256,address)": {
                "notice": "Called when tokens are transferred or burned."
              }
            },
            "version": 1
          }
        }
      },
      "contracts/token/TokenListenerInterface.sol": {
        "TokenListenerInterface": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "referrer",
                  "type": "address"
                }
              ],
              "name": "beforeTokenMint",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "from",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "controlledToken",
                  "type": "address"
                }
              ],
              "name": "beforeTokenTransfer",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "bytes4",
                  "name": "interfaceId",
                  "type": "bytes4"
                }
              ],
              "name": "supportsInterface",
              "outputs": [
                {
                  "internalType": "bool",
                  "name": "",
                  "type": "bool"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {
              "beforeTokenMint(address,uint256,address,address)": {
                "params": {
                  "amount": "The amount of tokens being minted",
                  "controlledToken": "The address of the token that is being minted",
                  "referrer": "The address that referred the minting.",
                  "to": "The address of the receiver of the minted tokens."
                }
              },
              "beforeTokenTransfer(address,address,uint256,address)": {
                "params": {
                  "amount": "The amount of tokens transferred",
                  "controlledToken": "The address of the token that was transferred",
                  "from": "The address of the sender of the token transfer",
                  "to": "The address of the receiver of the token transfer.  Will be the zero address if burning."
                }
              },
              "supportsInterface(bytes4)": {
                "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."
              }
            },
            "title": "An interface that allows a contract to listen to token mint, transfer and burn events.",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "",
              "opcodes": "",
              "sourceMap": ""
            },
            "gasEstimates": null,
            "methodIdentifiers": {
              "beforeTokenMint(address,uint256,address,address)": "4d7f3db0",
              "beforeTokenTransfer(address,address,uint256,address)": "b2210957",
              "supportsInterface(bytes4)": "01ffc9a7"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"referrer\",\"type\":\"address\"}],\"name\":\"beforeTokenMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"controlledToken\",\"type\":\"address\"}],\"name\":\"beforeTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"beforeTokenMint(address,uint256,address,address)\":{\"params\":{\"amount\":\"The amount of tokens being minted\",\"controlledToken\":\"The address of the token that is being minted\",\"referrer\":\"The address that referred the minting.\",\"to\":\"The address of the receiver of the minted tokens.\"}},\"beforeTokenTransfer(address,address,uint256,address)\":{\"params\":{\"amount\":\"The amount of tokens transferred\",\"controlledToken\":\"The address of the token that was transferred\",\"from\":\"The address of the sender of the token transfer\",\"to\":\"The address of the receiver of the token transfer.  Will be the zero address if burning.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"title\":\"An interface that allows a contract to listen to token mint, transfer and burn events.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"beforeTokenMint(address,uint256,address,address)\":{\"notice\":\"Called when tokens are minted.\"},\"beforeTokenTransfer(address,address,uint256,address)\":{\"notice\":\"Called when tokens are transferred or burned.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/TokenListenerInterface.sol\":\"TokenListenerInterface\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x4784c3f8a520a739dd25d76f514833a653990902d0e21601aed45bda44c87524\",\"license\":\"MIT\"},\"contracts/token/TokenListenerInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity >=0.5.0 <0.7.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol\\\";\\n\\n/// @title An interface that allows a contract to listen to token mint, transfer and burn events.\\ninterface TokenListenerInterface is IERC165Upgradeable {\\n  /// @notice Called when tokens are minted.\\n  /// @param to The address of the receiver of the minted tokens.\\n  /// @param amount The amount of tokens being minted\\n  /// @param controlledToken The address of the token that is being minted\\n  /// @param referrer The address that referred the minting.\\n  function beforeTokenMint(address to, uint256 amount, address controlledToken, address referrer) external;\\n\\n  /// @notice Called when tokens are transferred or burned.\\n  /// @param from The address of the sender of the token transfer\\n  /// @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\\n  /// @param amount The amount of tokens transferred\\n  /// @param controlledToken The address of the token that was transferred\\n  function beforeTokenTransfer(address from, address to, uint256 amount, address controlledToken) external;\\n}\\n\",\"keccak256\":\"0x86b29792852503c80fc94e3040d1648f4c5bef59a3786582410db6d63de12a0a\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "beforeTokenMint(address,uint256,address,address)": {
                "notice": "Called when tokens are minted."
              },
              "beforeTokenTransfer(address,address,uint256,address)": {
                "notice": "Called when tokens are transferred or burned."
              }
            },
            "version": 1
          }
        }
      },
      "contracts/token/TokenListenerLibrary.sol": {
        "TokenListenerLibrary": {
          "abi": [
            {
              "inputs": [],
              "name": "ERC165_INTERFACE_ID_TOKEN_LISTENER",
              "outputs": [
                {
                  "internalType": "bytes4",
                  "name": "",
                  "type": "bytes4"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "609f610024600b82828239805160001a607314601757fe5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361060335760003560e01c8063b17b0ce3146038575b600080fd5b603e605b565b604080516001600160e01b03199092168252519081900360200190f35b600162a1cb1960e01b03198156fea264697066735822122058cdc003792b22dda48b0b84a3ec507d28c19fa7af11aedaafd0fac86f2c3d4864736f6c634300060c0033",
              "opcodes": "PUSH1 0x9F PUSH2 0x24 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x17 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH1 0x33 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xB17B0CE3 EQ PUSH1 0x38 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3E PUSH1 0x5B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT DUP2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PC 0xCD 0xC0 SUB PUSH26 0x2B22DDA48B0B84A3EC507D28C19FA7AF11AEDAAFD0FAC86F2C3D 0x48 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "25:367:97:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "730000000000000000000000000000000000000000301460806040526004361060335760003560e01c8063b17b0ce3146038575b600080fd5b603e605b565b604080516001600160e01b03199092168252519081900360200190f35b600162a1cb1960e01b03198156fea264697066735822122058cdc003792b22dda48b0b84a3ec507d28c19fa7af11aedaafd0fac86f2c3d4864736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH1 0x33 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xB17B0CE3 EQ PUSH1 0x38 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3E PUSH1 0x5B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x1 PUSH3 0xA1CB19 PUSH1 0xE0 SHL SUB NOT DUP2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PC 0xCD 0xC0 SUB PUSH26 0x2B22DDA48B0B84A3EC507D28C19FA7AF11AEDAAFD0FAC86F2C3D 0x48 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "25:367:97:-:0;;;;;;;;;;;;;;;;;;;;;;;;319:70;;;:::i;:::-;;;;-1:-1:-1;;;;;;319:70:97;;;;;;;;;;;;;;;-1:-1:-1;;;;;;319:70:97;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "31800",
                "executionCost": "109",
                "totalCost": "31909"
              },
              "external": {
                "ERC165_INTERFACE_ID_TOKEN_LISTENER()": "199"
              }
            },
            "methodIdentifiers": {
              "ERC165_INTERFACE_ID_TOKEN_LISTENER()": "b17b0ce3"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ERC165_INTERFACE_ID_TOKEN_LISTENER\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/token/TokenListenerLibrary.sol\":\"TokenListenerLibrary\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/token/TokenListenerLibrary.sol\":{\"content\":\"pragma solidity 0.6.12;\\n\\nlibrary TokenListenerLibrary {\\n  /*\\n    *     bytes4(keccak256('beforeTokenMint(address,uint256,address,address)')) == 0x4d7f3db0\\n    *     bytes4(keccak256('beforeTokenTransfer(address,address,uint256,address)')) == 0xb2210957\\n    *\\n    *     => 0x4d7f3db0 ^ 0xb2210957 == 0xff5e34e7\\n    */\\n  bytes4 public constant ERC165_INTERFACE_ID_TOKEN_LISTENER = 0xff5e34e7;\\n}\",\"keccak256\":\"0xdd8f70719d2e1c602f8371442e223c32c0178cec6fac458a1303bae4fc7ddaaa\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/utils/ExtendedSafeCast.sol": {
        "ExtendedSafeCast": {
          "abi": [],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220ea9e65311d8c87abca86ab8dd6d1ecd5cadf5075e840b729c6e9b61b0024fdf564736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xEA SWAP15 PUSH6 0x311D8C87ABCA DUP7 0xAB DUP14 0xD6 0xD1 0xEC 0xD5 0xCA 0xDF POP PUSH22 0xE840B729C6E9B61B0024FDF564736F6C634300060C00 CALLER ",
              "sourceMap": "62:706:98:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220ea9e65311d8c87abca86ab8dd6d1ecd5cadf5075e840b729c6e9b61b0024fdf564736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xEA SWAP15 PUSH6 0x311D8C87ABCA DUP7 0xAB DUP14 0xD6 0xD1 0xEC 0xD5 0xCA 0xDF POP PUSH22 0xE840B729C6E9B61B0024FDF564736F6C634300060C00 CALLER ",
              "sourceMap": "62:706:98:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "toUint112(uint256)": "infinite",
                "toUint96(uint256)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/utils/ExtendedSafeCast.sol\":\"ExtendedSafeCast\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/utils/ExtendedSafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nlibrary ExtendedSafeCast {\\n\\n  /**\\n    * @dev Converts an unsigned uint256 into a unsigned uint112.\\n    *\\n    * Requirements:\\n    *\\n    * - input must be less than or equal to maxUint112.\\n    */\\n  function toUint112(uint256 value) internal pure returns (uint112) {\\n    require(value < 2**112, \\\"SafeCast: value doesn't fit in an uint112\\\");\\n    return uint112(value);\\n  }\\n\\n  /**\\n    * @dev Converts an unsigned uint256 into a unsigned uint96.\\n    *\\n    * Requirements:\\n    *\\n    * - input must be less than or equal to maxUint96.\\n    */\\n  function toUint96(uint256 value) internal pure returns (uint96) {\\n    require(value < 2**96, \\\"SafeCast: value doesn't fit in an uint96\\\");\\n    return uint96(value);\\n  }\\n\\n}\",\"keccak256\":\"0x6c8940ba9b1789d362c550be1da5c667ad990e2ff22423ca2d11402e545d3057\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "contracts/utils/MappedSinglyLinkedList.sol": {
        "MappedSinglyLinkedList": {
          "abi": [
            {
              "inputs": [],
              "name": "SENTINEL",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            }
          ],
          "devdoc": {
            "details": "A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.",
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "6095610024600b82828239805160001a607314601757fe5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361060335760003560e01c8063f00cab43146038575b600080fd5b603e605a565b604080516001600160a01b039092168252519081900360200190f35b60018156fea26469706673582212209aa5f6b54065aa364b234030c65dd9e4d51da8477562856677fc0b81327ca52964736f6c634300060c0033",
              "opcodes": "PUSH1 0x95 PUSH2 0x24 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x17 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH1 0x33 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xF00CAB43 EQ PUSH1 0x38 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3E PUSH1 0x5A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x1 DUP2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP11 0xA5 0xF6 0xB5 BLOCKHASH PUSH6 0xAA364B234030 0xC6 0x5D 0xD9 0xE4 0xD5 SAR 0xA8 SELFBALANCE PUSH22 0x62856677FC0B81327CA52964736F6C634300060C0033 ",
              "sourceMap": "297:3971:99:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "730000000000000000000000000000000000000000301460806040526004361060335760003560e01c8063f00cab43146038575b600080fd5b603e605a565b604080516001600160a01b039092168252519081900360200190f35b60018156fea26469706673582212209aa5f6b54065aa364b234030c65dd9e4d51da8477562856677fc0b81327ca52964736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH1 0x33 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xF00CAB43 EQ PUSH1 0x38 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3E PUSH1 0x5A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x1 DUP2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP11 0xA5 0xF6 0xB5 BLOCKHASH PUSH6 0xAA364B234030 0xC6 0x5D 0xD9 0xE4 0xD5 SAR 0xA8 SELFBALANCE PUSH22 0x62856677FC0B81327CA52964736F6C634300060C0033 ",
              "sourceMap": "297:3971:99:-:0;;;;;;;;;;;;;;;;;;;;;;;;408:47;;;:::i;:::-;;;;-1:-1:-1;;;;;408:47:99;;;;;;;;;;;;;;;451:3;408:47;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "29800",
                "executionCost": "106",
                "totalCost": "29906"
              },
              "external": {
                "SENTINEL()": "181"
              },
              "internal": {
                "addAddress(struct MappedSinglyLinkedList.Mapping storage pointer,address)": "infinite",
                "addAddresses(struct MappedSinglyLinkedList.Mapping storage pointer,address[] memory)": "infinite",
                "addressArray(struct MappedSinglyLinkedList.Mapping storage pointer)": "infinite",
                "clearAll(struct MappedSinglyLinkedList.Mapping storage pointer)": "infinite",
                "contains(struct MappedSinglyLinkedList.Mapping storage pointer,address)": "infinite",
                "end(struct MappedSinglyLinkedList.Mapping storage pointer)": "infinite",
                "initialize(struct MappedSinglyLinkedList.Mapping storage pointer)": "infinite",
                "next(struct MappedSinglyLinkedList.Mapping storage pointer,address)": "infinite",
                "removeAddress(struct MappedSinglyLinkedList.Mapping storage pointer,address,address)": "infinite",
                "start(struct MappedSinglyLinkedList.Mapping storage pointer)": "infinite"
              }
            },
            "methodIdentifiers": {
              "SENTINEL()": "f00cab43"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"SENTINEL\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"SENTINEL()\":{\"notice\":\"The special value address used to denote the end of the list\"}},\"notice\":\"An efficient implementation of a singly linked list of addresses\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/utils/MappedSinglyLinkedList.sol\":\"MappedSinglyLinkedList\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/utils/MappedSinglyLinkedList.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\n/// @notice An efficient implementation of a singly linked list of addresses\\n/// @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list.\\nlibrary MappedSinglyLinkedList {\\n\\n  /// @notice The special value address used to denote the end of the list\\n  address public constant SENTINEL = address(0x1);\\n\\n  /// @notice The data structure to use for the list.\\n  struct Mapping {\\n    uint256 count;\\n\\n    mapping(address => address) addressMap;\\n  }\\n\\n  /// @notice Initializes the list.\\n  /// @dev It is important that this is called so that the SENTINEL is correctly setup.\\n  function initialize(Mapping storage self) internal {\\n    require(self.count == 0, \\\"Already init\\\");\\n    self.addressMap[SENTINEL] = SENTINEL;\\n  }\\n\\n  function start(Mapping storage self) internal view returns (address) {\\n    return self.addressMap[SENTINEL];\\n  }\\n\\n  function next(Mapping storage self, address current) internal view returns (address) {\\n    return self.addressMap[current];\\n  }\\n\\n  function end(Mapping storage) internal pure returns (address) {\\n    return SENTINEL;\\n  }\\n\\n  function addAddresses(Mapping storage self, address[] memory addresses) internal {\\n    for (uint256 i = 0; i < addresses.length; i++) {\\n      addAddress(self, addresses[i]);\\n    }\\n  }\\n\\n  /// @notice Adds an address to the front of the list.\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param newAddress The address to shift to the front of the list\\n  function addAddress(Mapping storage self, address newAddress) internal {\\n    require(newAddress != SENTINEL && newAddress != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[newAddress] == address(0), \\\"Already added\\\");\\n    self.addressMap[newAddress] = self.addressMap[SENTINEL];\\n    self.addressMap[SENTINEL] = newAddress;\\n    self.count = self.count + 1;\\n  }\\n\\n  /// @notice Removes an address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\\n  /// @param addr The address to remove from the list.\\n  function removeAddress(Mapping storage self, address prevAddress, address addr) internal {\\n    require(addr != SENTINEL && addr != address(0), \\\"Invalid address\\\");\\n    require(self.addressMap[prevAddress] == addr, \\\"Invalid prevAddress\\\");\\n    self.addressMap[prevAddress] = self.addressMap[addr];\\n    delete self.addressMap[addr];\\n    self.count = self.count - 1;\\n  }\\n\\n  /// @notice Determines whether the list contains the given address\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @param addr The address to check\\n  /// @return True if the address is contained, false otherwise.\\n  function contains(Mapping storage self, address addr) internal view returns (bool) {\\n    return addr != SENTINEL && addr != address(0) && self.addressMap[addr] != address(0);\\n  }\\n\\n  /// @notice Returns an address array of all the addresses in this list\\n  /// @dev Contains a for loop, so complexity is O(n) wrt the list size\\n  /// @param self The Mapping struct that this function is attached to\\n  /// @return An array of all the addresses\\n  function addressArray(Mapping storage self) internal view returns (address[] memory) {\\n    address[] memory array = new address[](self.count);\\n    uint256 count;\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      array[count] = currentAddress;\\n      currentAddress = self.addressMap[currentAddress];\\n      count++;\\n    }\\n    return array;\\n  }\\n\\n  /// @notice Removes every address from the list\\n  /// @param self The Mapping struct that this function is attached to\\n  function clearAll(Mapping storage self) internal {\\n    address currentAddress = self.addressMap[SENTINEL];\\n    while (currentAddress != address(0) && currentAddress != SENTINEL) {\\n      address nextAddress = self.addressMap[currentAddress];\\n      delete self.addressMap[currentAddress];\\n      currentAddress = nextAddress;\\n    }\\n    self.addressMap[SENTINEL] = SENTINEL;\\n    self.count = 0;\\n  }\\n}\\n\",\"keccak256\":\"0x890e7d3e9913af2f046bddbc91656e6a0c10796b44a5ee06409d6f81fbf2a7e2\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "SENTINEL()": {
                "notice": "The special value address used to denote the end of the list"
              }
            },
            "notice": "An efficient implementation of a singly linked list of addresses",
            "version": 1
          }
        }
      },
      "contracts/yield-source/CTokenYieldSource.sol": {
        "CTokenYieldSource": {
          "abi": [
            {
              "inputs": [
                {
                  "internalType": "contract CTokenInterface",
                  "name": "_cToken",
                  "type": "address"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "constructor"
            },
            {
              "anonymous": false,
              "inputs": [
                {
                  "indexed": true,
                  "internalType": "address",
                  "name": "cToken",
                  "type": "address"
                }
              ],
              "name": "CTokenYieldSourceInitialized",
              "type": "event"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "addr",
                  "type": "address"
                }
              ],
              "name": "balanceOfToken",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "name": "balances",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "cToken",
              "outputs": [
                {
                  "internalType": "contract CTokenInterface",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [],
              "name": "depositToken",
              "outputs": [
                {
                  "internalType": "address",
                  "name": "",
                  "type": "address"
                }
              ],
              "stateMutability": "view",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "redeemAmount",
                  "type": "uint256"
                }
              ],
              "name": "redeemToken",
              "outputs": [
                {
                  "internalType": "uint256",
                  "name": "",
                  "type": "uint256"
                }
              ],
              "stateMutability": "nonpayable",
              "type": "function"
            },
            {
              "inputs": [
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "address",
                  "name": "to",
                  "type": "address"
                }
              ],
              "name": "supplyTokenTo",
              "outputs": [],
              "stateMutability": "nonpayable",
              "type": "function"
            }
          ],
          "devdoc": {
            "details": "THIS CONTRACT IS EXPERIMENTAL!  USE AT YOUR OWN RISK",
            "kind": "dev",
            "methods": {
              "balanceOfToken(address)": {
                "returns": {
                  "_0": "The underlying balance of asset tokens"
                }
              },
              "constructor": {
                "params": {
                  "_cToken": "Address of the Compound cToken interface"
                }
              },
              "depositToken()": {
                "returns": {
                  "_0": "The ERC20 asset token"
                }
              },
              "redeemToken(uint256)": {
                "params": {
                  "redeemAmount": "The amount of yield-bearing tokens to be redeemed"
                },
                "returns": {
                  "_0": "The actual amount of tokens that were redeemed."
                }
              },
              "supplyTokenTo(uint256,address)": {
                "params": {
                  "amount": "The amount of asset tokens to be supplied"
                }
              }
            },
            "title": "Defines the functions used to interact with a yield source.  The Prize Pool inherits this contract.",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50604051610c97380380610c978339818101604052602081101561003357600080fd5b5051600180546001600160a01b0319166001600160a01b0380841691909117918290556040519116907f62a988a69bb7d6a98d15b99860212aeed699dd1c1c09f6474948e77f0d4addcb90600090a250610c05806100926000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c8063013054c21461006757806327e235e31461009657806369e527da146100bc57806387a6eeef146100e0578063b99152d01461010e578063c89039c514610134575b600080fd5b6100846004803603602081101561007d57600080fd5b503561013c565b60408051918252519081900360200190f35b610084600480360360208110156100ac57600080fd5b50356001600160a01b03166104e1565b6100c46104f3565b604080516001600160a01b039092168252519081900360200190f35b61010c600480360360408110156100f657600080fd5b50803590602001356001600160a01b0316610502565b005b6100846004803603602081101561012457600080fd5b50356001600160a01b0316610863565b6100c46109a6565b600154604080516370a0823160e01b8152306004820152905160009283926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561018c57600080fd5b505afa1580156101a0573d6000803e3d6000fd5b505050506040513d60208110156101b657600080fd5b5051905060006101c46109a6565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561021057600080fd5b505afa158015610224573d6000803e3d6000fd5b505050506040513d602081101561023a57600080fd5b50516001546040805163852a12e360e01b81526004810188905290519293506001600160a01b039091169163852a12e3916024808201926020929091908290030181600087803b15801561028d57600080fd5b505af11580156102a1573d6000803e3d6000fd5b505050506040513d60208110156102b757600080fd5b50511561030b576040805162461bcd60e51b815260206004820152601f60248201527f43546f6b656e5969656c64536f757263652f72656465656d2d6661696c656400604482015290519081900360640190fd5b600154604080516370a0823160e01b81523060048201529051600092610390926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561035d57600080fd5b505afa158015610371573d6000803e3d6000fd5b505050506040513d602081101561038757600080fd5b505184906109b5565b9050600061041e836103a06109a6565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156103ec57600080fd5b505afa158015610400573d6000803e3d6000fd5b505050506040513d602081101561041657600080fd5b5051906109b5565b3360009081526020819052604090205490915061043b90836109b5565b336000908152602081905260409020556104536109a6565b6001600160a01b031663a9059cbb33836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156104a957600080fd5b505af11580156104bd573d6000803e3d6000fd5b505050506040513d60208110156104d357600080fd5b50909450505050505b919050565b60006020819052908152604090205481565b6001546001600160a01b031681565b61050a6109a6565b604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b0392909216916323b872dd916064808201926020929091908290030181600087803b15801561056257600080fd5b505af1158015610576573d6000803e3d6000fd5b505050506040513d602081101561058c57600080fd5b505060015460408051636f307dc360e01b815290516001600160a01b0390921691636f307dc391600480820192602092909190829003018186803b1580156105d357600080fd5b505afa1580156105e7573d6000803e3d6000fd5b505050506040513d60208110156105fd57600080fd5b50516001546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018690529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561065557600080fd5b505af1158015610669573d6000803e3d6000fd5b505050506040513d602081101561067f57600080fd5b5050600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156106cc57600080fd5b505afa1580156106e0573d6000803e3d6000fd5b505050506040513d60208110156106f657600080fd5b50516001546040805163140e25ad60e31b81526004810187905290519293506001600160a01b039091169163a0712d68916024808201926020929091908290030181600087803b15801561074957600080fd5b505af115801561075d573d6000803e3d6000fd5b505050506040513d602081101561077357600080fd5b5051156107c7576040805162461bcd60e51b815260206004820152601d60248201527f43546f6b656e5969656c64536f757263652f6d696e742d6661696c6564000000604482015290519081900360640190fd5b600154604080516370a0823160e01b8152306004820152905160009261081b9285926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156103ec57600080fd5b6001600160a01b0384166000908152602081905260409020549091506108419082610a17565b6001600160a01b03909316600090815260208190526040902092909255505050565b60015460408051633af9e66960e01b8152306004820152905160009283926001600160a01b0390911691633af9e6699160248082019260209290919082900301818787803b1580156108b457600080fd5b505af11580156108c8573d6000803e3d6000fd5b505050506040513d60208110156108de57600080fd5b5051600154604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561093157600080fd5b505afa158015610945573d6000803e3d6000fd5b505050506040513d602081101561095b57600080fd5b505190508061096f576000925050506104dc565b6001600160a01b03841660009081526020819052604090205461099e9082906109989085610a78565b90610ad1565b949350505050565b60006109b0610b38565b905090565b600082821115610a0c576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b600082820183811015610a71576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600082610a8757506000610a11565b82820282848281610a9457fe5b0414610a715760405162461bcd60e51b8152600401808060200182810382526021815260200180610baf6021913960400191505060405180910390fd5b6000808211610b27576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381610b3057fe5b049392505050565b60015460408051636f307dc360e01b815290516000926001600160a01b031691636f307dc3916004808301926020929190829003018186803b158015610b7d57600080fd5b505afa158015610b91573d6000803e3d6000fd5b505050506040513d6020811015610ba757600080fd5b505190509056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212208cf12c5aa485b3e73195af2775be4b9d176294347e97c4c12be4b4c22840b50364736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0xC97 CODESIZE SUB DUP1 PUSH2 0xC97 DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x33 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 MLOAD SWAP2 AND SWAP1 PUSH32 0x62A988A69BB7D6A98D15B99860212AEED699DD1C1C09F6474948E77F0D4ADDCB SWAP1 PUSH1 0x0 SWAP1 LOG2 POP PUSH2 0xC05 DUP1 PUSH2 0x92 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x62 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x13054C2 EQ PUSH2 0x67 JUMPI DUP1 PUSH4 0x27E235E3 EQ PUSH2 0x96 JUMPI DUP1 PUSH4 0x69E527DA EQ PUSH2 0xBC JUMPI DUP1 PUSH4 0x87A6EEEF EQ PUSH2 0xE0 JUMPI DUP1 PUSH4 0xB99152D0 EQ PUSH2 0x10E JUMPI DUP1 PUSH4 0xC89039C5 EQ PUSH2 0x134 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x84 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x13C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x84 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xAC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x4E1 JUMP JUMPDEST PUSH2 0xC4 PUSH2 0x4F3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x10C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x502 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x84 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x124 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x863 JUMP JUMPDEST PUSH2 0xC4 PUSH2 0x9A6 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 DUP4 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1A0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x1C4 PUSH2 0x9A6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x210 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x224 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x23A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x852A12E3 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP9 SWAP1 MSTORE SWAP1 MLOAD SWAP3 SWAP4 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0x852A12E3 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x28D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2A1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO PUSH2 0x30B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x43546F6B656E5969656C64536F757263652F72656465656D2D6661696C656400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH2 0x390 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x35D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x371 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x387 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP5 SWAP1 PUSH2 0x9B5 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x41E DUP4 PUSH2 0x3A0 PUSH2 0x9A6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x400 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x416 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 PUSH2 0x9B5 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH2 0x43B SWAP1 DUP4 PUSH2 0x9B5 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH2 0x453 PUSH2 0x9A6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xA9059CBB CALLER DUP4 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x4BD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP5 POP POP POP POP POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x50A PUSH2 0x9A6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH4 0x23B872DD SWAP2 PUSH1 0x64 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x562 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x576 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x58C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x6F307DC3 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x6F307DC3 SWAP2 PUSH1 0x4 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x5E7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x95EA7B3 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE SWAP1 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x95EA7B3 SWAP2 PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x655 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x669 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x67F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x6E0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x140E25AD PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP8 SWAP1 MSTORE SWAP1 MLOAD SWAP3 SWAP4 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0xA0712D68 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x749 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x75D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x773 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO PUSH2 0x7C7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x43546F6B656E5969656C64536F757263652F6D696E742D6661696C6564000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH2 0x81B SWAP3 DUP6 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH2 0x841 SWAP1 DUP3 PUSH2 0xA17 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x3AF9E669 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 DUP4 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0x3AF9E669 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x8B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8C8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x8DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD SWAP3 SWAP4 POP PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x931 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x945 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x95B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x96F JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x4DC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x99E SWAP1 DUP3 SWAP1 PUSH2 0x998 SWAP1 DUP6 PUSH2 0xA78 JUMP JUMPDEST SWAP1 PUSH2 0xAD1 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9B0 PUSH2 0xB38 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xA0C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xA71 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0xA87 JUMPI POP PUSH1 0x0 PUSH2 0xA11 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0xA94 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0xA71 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xBAF PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0xB27 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0xB30 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x6F307DC3 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x6F307DC3 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xB91 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xBA7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP INVALID MSTORE8 PUSH2 0x6665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F77A26469706673582212 KECCAK256 DUP13 CALL 0x2C GAS LOG4 DUP6 0xB3 0xE7 BALANCE SWAP6 0xAF 0x27 PUSH22 0xBE4B9D176294347E97C4C12BE4B4C22840B50364736F PUSH13 0x634300060C0033000000000000 ",
              "sourceMap": "828:2846:100:-:0;;;1258:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1258:143:100;1323:6;:16;;-1:-1:-1;;;;;;1323:16:100;-1:-1:-1;;;;;1323:16:100;;;;;;;;;;;1351:45;;1388:6;;;1351:45;;-1:-1:-1;;1351:45:100;1258:143;828:2846;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "608060405234801561001057600080fd5b50600436106100625760003560e01c8063013054c21461006757806327e235e31461009657806369e527da146100bc57806387a6eeef146100e0578063b99152d01461010e578063c89039c514610134575b600080fd5b6100846004803603602081101561007d57600080fd5b503561013c565b60408051918252519081900360200190f35b610084600480360360208110156100ac57600080fd5b50356001600160a01b03166104e1565b6100c46104f3565b604080516001600160a01b039092168252519081900360200190f35b61010c600480360360408110156100f657600080fd5b50803590602001356001600160a01b0316610502565b005b6100846004803603602081101561012457600080fd5b50356001600160a01b0316610863565b6100c46109a6565b600154604080516370a0823160e01b8152306004820152905160009283926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561018c57600080fd5b505afa1580156101a0573d6000803e3d6000fd5b505050506040513d60208110156101b657600080fd5b5051905060006101c46109a6565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561021057600080fd5b505afa158015610224573d6000803e3d6000fd5b505050506040513d602081101561023a57600080fd5b50516001546040805163852a12e360e01b81526004810188905290519293506001600160a01b039091169163852a12e3916024808201926020929091908290030181600087803b15801561028d57600080fd5b505af11580156102a1573d6000803e3d6000fd5b505050506040513d60208110156102b757600080fd5b50511561030b576040805162461bcd60e51b815260206004820152601f60248201527f43546f6b656e5969656c64536f757263652f72656465656d2d6661696c656400604482015290519081900360640190fd5b600154604080516370a0823160e01b81523060048201529051600092610390926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561035d57600080fd5b505afa158015610371573d6000803e3d6000fd5b505050506040513d602081101561038757600080fd5b505184906109b5565b9050600061041e836103a06109a6565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156103ec57600080fd5b505afa158015610400573d6000803e3d6000fd5b505050506040513d602081101561041657600080fd5b5051906109b5565b3360009081526020819052604090205490915061043b90836109b5565b336000908152602081905260409020556104536109a6565b6001600160a01b031663a9059cbb33836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156104a957600080fd5b505af11580156104bd573d6000803e3d6000fd5b505050506040513d60208110156104d357600080fd5b50909450505050505b919050565b60006020819052908152604090205481565b6001546001600160a01b031681565b61050a6109a6565b604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b0392909216916323b872dd916064808201926020929091908290030181600087803b15801561056257600080fd5b505af1158015610576573d6000803e3d6000fd5b505050506040513d602081101561058c57600080fd5b505060015460408051636f307dc360e01b815290516001600160a01b0390921691636f307dc391600480820192602092909190829003018186803b1580156105d357600080fd5b505afa1580156105e7573d6000803e3d6000fd5b505050506040513d60208110156105fd57600080fd5b50516001546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018690529051919092169163095ea7b39160448083019260209291908290030181600087803b15801561065557600080fd5b505af1158015610669573d6000803e3d6000fd5b505050506040513d602081101561067f57600080fd5b5050600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156106cc57600080fd5b505afa1580156106e0573d6000803e3d6000fd5b505050506040513d60208110156106f657600080fd5b50516001546040805163140e25ad60e31b81526004810187905290519293506001600160a01b039091169163a0712d68916024808201926020929091908290030181600087803b15801561074957600080fd5b505af115801561075d573d6000803e3d6000fd5b505050506040513d602081101561077357600080fd5b5051156107c7576040805162461bcd60e51b815260206004820152601d60248201527f43546f6b656e5969656c64536f757263652f6d696e742d6661696c6564000000604482015290519081900360640190fd5b600154604080516370a0823160e01b8152306004820152905160009261081b9285926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156103ec57600080fd5b6001600160a01b0384166000908152602081905260409020549091506108419082610a17565b6001600160a01b03909316600090815260208190526040902092909255505050565b60015460408051633af9e66960e01b8152306004820152905160009283926001600160a01b0390911691633af9e6699160248082019260209290919082900301818787803b1580156108b457600080fd5b505af11580156108c8573d6000803e3d6000fd5b505050506040513d60208110156108de57600080fd5b5051600154604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561093157600080fd5b505afa158015610945573d6000803e3d6000fd5b505050506040513d602081101561095b57600080fd5b505190508061096f576000925050506104dc565b6001600160a01b03841660009081526020819052604090205461099e9082906109989085610a78565b90610ad1565b949350505050565b60006109b0610b38565b905090565b600082821115610a0c576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b600082820183811015610a71576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600082610a8757506000610a11565b82820282848281610a9457fe5b0414610a715760405162461bcd60e51b8152600401808060200182810382526021815260200180610baf6021913960400191505060405180910390fd5b6000808211610b27576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381610b3057fe5b049392505050565b60015460408051636f307dc360e01b815290516000926001600160a01b031691636f307dc3916004808301926020929190829003018186803b158015610b7d57600080fd5b505afa158015610b91573d6000803e3d6000fd5b505050506040513d6020811015610ba757600080fd5b505190509056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212208cf12c5aa485b3e73195af2775be4b9d176294347e97c4c12be4b4c22840b50364736f6c634300060c0033",
              "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x62 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x13054C2 EQ PUSH2 0x67 JUMPI DUP1 PUSH4 0x27E235E3 EQ PUSH2 0x96 JUMPI DUP1 PUSH4 0x69E527DA EQ PUSH2 0xBC JUMPI DUP1 PUSH4 0x87A6EEEF EQ PUSH2 0xE0 JUMPI DUP1 PUSH4 0xB99152D0 EQ PUSH2 0x10E JUMPI DUP1 PUSH4 0xC89039C5 EQ PUSH2 0x134 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x84 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH2 0x13C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x84 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xAC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x4E1 JUMP JUMPDEST PUSH2 0xC4 PUSH2 0x4F3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x10C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x502 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x84 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x124 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x863 JUMP JUMPDEST PUSH2 0xC4 PUSH2 0x9A6 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 DUP4 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x18C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1A0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP PUSH1 0x0 PUSH2 0x1C4 PUSH2 0x9A6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x210 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x224 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x23A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x852A12E3 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP9 SWAP1 MSTORE SWAP1 MLOAD SWAP3 SWAP4 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0x852A12E3 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x28D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2A1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO PUSH2 0x30B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x43546F6B656E5969656C64536F757263652F72656465656D2D6661696C656400 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH2 0x390 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x35D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x371 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x387 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD DUP5 SWAP1 PUSH2 0x9B5 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x41E DUP4 PUSH2 0x3A0 PUSH2 0x9A6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x400 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x416 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 PUSH2 0x9B5 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH2 0x43B SWAP1 DUP4 PUSH2 0x9B5 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH2 0x453 PUSH2 0x9A6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xA9059CBB CALLER DUP4 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x4BD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP SWAP1 SWAP5 POP POP POP POP POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x50A PUSH2 0x9A6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH4 0x23B872DD PUSH1 0xE0 SHL DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 PUSH4 0x23B872DD SWAP2 PUSH1 0x64 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x562 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x576 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x58C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x6F307DC3 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x6F307DC3 SWAP2 PUSH1 0x4 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x5E7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x95EA7B3 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 DUP4 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE SWAP1 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP2 PUSH4 0x95EA7B3 SWAP2 PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x655 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x669 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x67F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x6E0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x140E25AD PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP8 SWAP1 MSTORE SWAP1 MLOAD SWAP3 SWAP4 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0xA0712D68 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x749 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x75D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x773 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO PUSH2 0x7C7 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x43546F6B656E5969656C64536F757263652F6D696E742D6661696C6564000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH2 0x81B SWAP3 DUP6 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x3EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH2 0x841 SWAP1 DUP3 PUSH2 0xA17 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x3AF9E669 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 DUP4 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP2 PUSH4 0x3AF9E669 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP8 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x8B4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8C8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x8DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD SWAP3 SWAP4 POP PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP3 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x931 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x945 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x95B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP DUP1 PUSH2 0x96F JUMPI PUSH1 0x0 SWAP3 POP POP POP PUSH2 0x4DC JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x99E SWAP1 DUP3 SWAP1 PUSH2 0x998 SWAP1 DUP6 PUSH2 0xA78 JUMP JUMPDEST SWAP1 PUSH2 0xAD1 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9B0 PUSH2 0xB38 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xA0C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A207375627472616374696F6E206F766572666C6F770000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xA71 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0xA87 JUMPI POP PUSH1 0x0 PUSH2 0xA11 JUMP JUMPDEST DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 PUSH2 0xA94 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0xA71 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xBAF PUSH1 0x21 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP3 GT PUSH2 0xB27 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536166654D6174683A206469766973696F6E206279207A65726F000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 DUP4 DUP2 PUSH2 0xB30 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH4 0x6F307DC3 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 PUSH4 0x6F307DC3 SWAP2 PUSH1 0x4 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xB91 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xBA7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP1 POP SWAP1 JUMP INVALID MSTORE8 PUSH2 0x6665 0x4D PUSH2 0x7468 GASPRICE KECCAK256 PUSH14 0x756C7469706C69636174696F6E20 PUSH16 0x766572666C6F77A26469706673582212 KECCAK256 DUP13 CALL 0x2C GAS LOG4 DUP6 0xB3 0xE7 BALANCE SWAP6 0xAF 0x27 PUSH22 0xBE4B9D176294347E97C4C12BE4B4C22840B50364736F PUSH13 0x634300060C0033000000000000 ",
              "sourceMap": "828:2846:100:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3087:585;;;;;;;;;;;;;;;;-1:-1:-1;3087:585:100;;:::i;:::-;;;;;;;;;;;;;;;;980:43;;;;;;;;;;;;;;;;-1:-1:-1;980:43:100;-1:-1:-1;;;;;980:43:100;;:::i;1093:29::-;;;:::i;:::-;;;;-1:-1:-1;;;;;1093:29:100;;;;;;;;;;;;;;2403:484;;;;;;;;;;;;;;;;-1:-1:-1;2403:484:100;;;;;;-1:-1:-1;;;;;2403:484:100;;:::i;:::-;;1972:308;;;;;;;;;;;;;;;;-1:-1:-1;1972:308:100;-1:-1:-1;;;;;1972:308:100;;:::i;1504:96::-;;;:::i;3087:585::-;3202:6;;:31;;;-1:-1:-1;;;3202:31:100;;3227:4;3202:31;;;;;;3157:7;;;;-1:-1:-1;;;;;3202:6:100;;;;:16;;:31;;;;;;;;;;;;;;;:6;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3202:31:100;;-1:-1:-1;3239:21:100;3263:8;:6;:8::i;:::-;-1:-1:-1;;;;;3263:18:100;;3290:4;3263:33;;;;;;;;;;;;;-1:-1:-1;;;;;3263:33:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3263:33:100;3310:6;;:37;;;-1:-1:-1;;;3310:37:100;;;;;;;;;;3263:33;;-1:-1:-1;;;;;;3310:6:100;;;;:23;;:37;;;;;3263:33;;3310:37;;;;;;;;:6;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3310:37:100;:42;3302:86;;;;;-1:-1:-1;;;3302:86:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;3439:6;;:31;;;-1:-1:-1;;;3439:31:100;;3464:4;3439:31;;;;;;3394:18;;3415:56;;-1:-1:-1;;;;;3439:6:100;;;;:16;;:31;;;;;;;;;;;;;;;:6;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3439:31:100;3415:19;;:23;:56::i;:::-;3394:77;;3477:12;3492:52;3530:13;3492:8;:6;:8::i;:::-;-1:-1:-1;;;;;3492:18:100;;3519:4;3492:33;;;;;;;;;;;;;-1:-1:-1;;;;;3492:33:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3492:33:100;;:37;:52::i;:::-;3582:10;3573:8;:20;;;;;;;;;;;3477:67;;-1:-1:-1;3573:36:100;;3598:10;3573:24;:36::i;:::-;3559:10;3550:8;:20;;;;;;;;;;:59;3615:8;:6;:8::i;:::-;-1:-1:-1;;;;;3615:17:100;;3633:10;3645:4;3615:35;;;;;;;;;;;;;-1:-1:-1;;;;;3615:35:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3663:4:100;;-1:-1:-1;;;;;3087:585:100;;;;:::o;980:43::-;;;;;;;;;;;;;;:::o;1093:29::-;;;-1:-1:-1;;;;;1093:29:100;;:::o;2403:484::-;2478:8;:6;:8::i;:::-;:56;;;-1:-1:-1;;;2478:56:100;;2500:10;2478:56;;;;2520:4;2478:56;;;;;;;;;;;;-1:-1:-1;;;;;2478:21:100;;;;;;;:56;;;;;;;;;;;;;;;-1:-1:-1;2478:21:100;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2558:6:100;;:19;;;-1:-1:-1;;;2558:19:100;;;;-1:-1:-1;;;;;2558:6:100;;;;:17;;:19;;;;;2478:56;;2558:19;;;;;;;;:6;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2558:19:100;2595:6;;2540:71;;;-1:-1:-1;;;2540:71:100;;-1:-1:-1;;;;;2595:6:100;;;2540:71;;;;;;;;;;;;:46;;;;;;;:71;;;;;2558:19;;2540:71;;;;;;;2595:6;2540:46;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2647:6:100;;:31;;;-1:-1:-1;;;2647:31:100;;2672:4;2647:31;;;;;;2617:27;;-1:-1:-1;;;;;2647:6:100;;:16;;:31;;;;;2540:71;;2647:31;;;;;;;:6;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2647:31:100;2692:6;;:19;;;-1:-1:-1;;;2692:19:100;;;;;;;;;;2647:31;;-1:-1:-1;;;;;;2692:6:100;;;;:11;;:19;;;;;2647:31;;2692:19;;;;;;;;:6;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2692:19:100;:24;2684:66;;;;;-1:-1:-1;;;2684:66:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;2777:6;;:31;;;-1:-1:-1;;;2777:31:100;;2802:4;2777:31;;;;;;2756:18;;2777:56;;2813:19;;-1:-1:-1;;;;;2777:6:100;;;;:16;;:31;;;;;;;;;;;;;;;:6;:31;;;;;;;;;;:56;-1:-1:-1;;;;;2854:12:100;;:8;:12;;;;;;;;;;;2756:77;;-1:-1:-1;2854:28:100;;2756:77;2854:16;:28::i;:::-;-1:-1:-1;;;;;2839:12:100;;;:8;:12;;;;;;;;;;:43;;;;-1:-1:-1;;;2403:484:100:o;1972:308::-;2078:6;;:41;;;-1:-1:-1;;;2078:41:100;;2113:4;2078:41;;;;;;2037:7;;;;-1:-1:-1;;;;;2078:6:100;;;;:26;;:41;;;;;;;;;;;;;;;2037:7;2078:6;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2078:41:100;2141:6;;:31;;;-1:-1:-1;;;2141:31:100;;2166:4;2141:31;;;;;;2078:41;;-1:-1:-1;2125:13:100;;-1:-1:-1;;;;;2141:6:100;;;;:16;;:31;;;;;2078:41;;2141:31;;;;;;;;:6;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2141:31:100;;-1:-1:-1;2182:10:100;2178:39;;2209:1;2202:8;;;;;;2178:39;-1:-1:-1;;;;;2229:14:100;;:8;:14;;;;;;;;;;;:46;;2269:5;;2229:35;;2248:15;2229:18;:35::i;:::-;:39;;:46::i;:::-;2222:53;1972:308;-1:-1:-1;;;;1972:308:100:o;1504:96::-;1558:7;1580:15;:13;:15::i;:::-;1573:22;;1504:96;:::o;3147:155:8:-;3205:7;3237:1;3232;:6;;3224:49;;;;;-1:-1:-1;;;3224:49:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3290:5:8;;;3147:155;;;;;:::o;2701:175::-;2759:7;2790:5;;;2813:6;;;;2805:46;;;;;-1:-1:-1;;;2805:46:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;2868:1;2701:175;-1:-1:-1;;;2701:175:8:o;3549:215::-;3607:7;3630:6;3626:20;;-1:-1:-1;3645:1:8;3638:8;;3626:20;3668:5;;;3672:1;3668;:5;:1;3691:5;;;;;:10;3683:56;;;;-1:-1:-1;;;3683:56:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4228:150;4286:7;4317:1;4313;:5;4305:44;;;;;-1:-1:-1;;;4305:44:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;4370:1;4366;:5;;;;;;;4228:150;-1:-1:-1;;;4228:150:8:o;1604:94:100:-;1674:6;;:19;;;-1:-1:-1;;;1674:19:100;;;;1652:7;;-1:-1:-1;;;;;1674:6:100;;:17;;:19;;;;;;;;;;;;;;:6;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1674:19:100;;-1:-1:-1;1604:94:100;:::o"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "615400",
                "executionCost": "infinite",
                "totalCost": "infinite"
              },
              "external": {
                "balanceOfToken(address)": "infinite",
                "balances(address)": "1127",
                "cToken()": "1059",
                "depositToken()": "infinite",
                "redeemToken(uint256)": "infinite",
                "supplyTokenTo(uint256,address)": "infinite"
              },
              "internal": {
                "_token()": "infinite",
                "_tokenAddress()": "infinite"
              }
            },
            "methodIdentifiers": {
              "balanceOfToken(address)": "b99152d0",
              "balances(address)": "27e235e3",
              "cToken()": "69e527da",
              "depositToken()": "c89039c5",
              "redeemToken(uint256)": "013054c2",
              "supplyTokenTo(uint256,address)": "87a6eeef"
            }
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract CTokenInterface\",\"name\":\"_cToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"cToken\",\"type\":\"address\"}],\"name\":\"CTokenYieldSourceInitialized\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"balanceOfToken\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cToken\",\"outputs\":[{\"internalType\":\"contract CTokenInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"depositToken\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"redeemAmount\",\"type\":\"uint256\"}],\"name\":\"redeemToken\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"supplyTokenTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"THIS CONTRACT IS EXPERIMENTAL!  USE AT YOUR OWN RISK\",\"kind\":\"dev\",\"methods\":{\"balanceOfToken(address)\":{\"returns\":{\"_0\":\"The underlying balance of asset tokens\"}},\"constructor\":{\"params\":{\"_cToken\":\"Address of the Compound cToken interface\"}},\"depositToken()\":{\"returns\":{\"_0\":\"The ERC20 asset token\"}},\"redeemToken(uint256)\":{\"params\":{\"redeemAmount\":\"The amount of yield-bearing tokens to be redeemed\"},\"returns\":{\"_0\":\"The actual amount of tokens that were redeemed.\"}},\"supplyTokenTo(uint256,address)\":{\"params\":{\"amount\":\"The amount of asset tokens to be supplied\"}}},\"title\":\"Defines the functions used to interact with a yield source.  The Prize Pool inherits this contract.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"balanceOfToken(address)\":{\"notice\":\"Returns the total balance (in asset tokens).  This includes the deposits and interest.\"},\"cToken()\":{\"notice\":\"Interface for the Yield-bearing cToken by Compound\"},\"constructor\":\"Initializes the Yield Service with the Compound cToken\",\"depositToken()\":{\"notice\":\"Returns the ERC20 asset token used for deposits.\"},\"redeemToken(uint256)\":{\"notice\":\"Redeems asset tokens from the yield source.\"},\"supplyTokenTo(uint256,address)\":{\"notice\":\"Supplies asset tokens to the yield source.\"}},\"notice\":\"Prize Pools subclasses need to implement this interface so that yield can be generated.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/yield-source/CTokenYieldSource.sol\":\"CTokenYieldSource\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary SafeMathUpgradeable {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        uint256 c = a + b;\\n        if (c < a) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the substraction of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b > a) return (false, 0);\\n        return (true, a - b);\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) return (true, 0);\\n        uint256 c = a * b;\\n        if (c / a != b) return (false, 0);\\n        return (true, c);\\n    }\\n\\n    /**\\n     * @dev Returns the division of two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a / b);\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\\n        if (b == 0) return (false, 0);\\n        return (true, a % b);\\n    }\\n\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b <= a, \\\"SafeMath: subtraction overflow\\\");\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        if (a == 0) return 0;\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: division by zero\\\");\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        require(b > 0, \\\"SafeMath: modulo by zero\\\");\\n        return a % b;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {trySub}.\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        return a - b;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers, reverting with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryDiv}.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a / b;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * reverting with custom message when dividing by zero.\\n     *\\n     * CAUTION: This function is deprecated because it requires allocating memory for the error\\n     * message unnecessarily. For custom revert reasons use {tryMod}.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0x0dd1e9b19801e3e7d900fbf4182d81e1afd23ad7be39504e33df6bbcba91d724\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// solhint-disable-next-line compiler-version\\npragma solidity >=0.4.24 <0.8.0;\\n\\nimport \\\"../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n */\\nabstract contract Initializable {\\n\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        require(_initializing || _isConstructor() || !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /// @dev Returns true if and only if the function is running in the constructor\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0xd8e4eb08dcc1d1860fb347ba5ffd595242b9a1b66d49a47f2b4cb51c3f35017e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0xa1931c47a617014f858580db625aa0dcf343796f39acd4b5b51effc092a1f0a9\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.6.2 <0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        // solhint-disable-next-line no-inline-assembly\\n        assembly { size := extcodesize(account) }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value\\n        (bool success, ) = recipient.call{ value: amount }(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain`call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n      return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        // solhint-disable-next-line avoid-low-level-calls\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return _verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                // solhint-disable-next-line no-inline-assembly\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xfc5ea91fa9ceb1961023b2a6c978b902888c52b90847ac7813fe3b79524165f6\",\"license\":\"MIT\"},\"@pooltogether/fixed-point/contracts/FixedPoint.sol\":{\"content\":\"/**\\nCopyright 2020 PoolTogether Inc.\\n\\nThis file is part of PoolTogether.\\n\\nPoolTogether is free software: you can redistribute it and/or modify\\nit under the terms of the GNU General Public License as published by\\nthe Free Software Foundation under version 3 of the License.\\n\\nPoolTogether is distributed in the hope that it will be useful,\\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\\nGNU General Public License for more details.\\n\\nYou should have received a copy of the GNU General Public License\\nalong with PoolTogether.  If not, see <https://www.gnu.org/licenses/>.\\n*/\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\nimport \\\"./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\\\";\\n\\n/**\\n * @author Brendan Asselstine\\n * @notice Provides basic fixed point math calculations.\\n *\\n * This library calculates integer fractions by scaling values by 1e18 then performing standard integer math.\\n */\\nlibrary FixedPoint {\\n    using OpenZeppelinSafeMath_V3_3_0 for uint256;\\n\\n    // The scale to use for fixed point numbers.  Same as Ether for simplicity.\\n    uint256 internal constant SCALE = 1e18;\\n\\n    /**\\n        * Calculates a Fixed18 mantissa given the numerator and denominator\\n        *\\n        * The mantissa = (numerator * 1e18) / denominator\\n        *\\n        * @param numerator The mantissa numerator\\n        * @param denominator The mantissa denominator\\n        * @return The mantissa of the fraction\\n        */\\n    function calculateMantissa(uint256 numerator, uint256 denominator) internal pure returns (uint256) {\\n        uint256 mantissa = numerator.mul(SCALE);\\n        mantissa = mantissa.div(denominator);\\n        return mantissa;\\n    }\\n\\n    /**\\n        * Multiplies a Fixed18 number by an integer.\\n        *\\n        * @param b The whole integer to multiply\\n        * @param mantissa The Fixed18 number\\n        * @return An integer that is the result of multiplying the params.\\n        */\\n    function multiplyUintByMantissa(uint256 b, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = mantissa.mul(b);\\n        result = result.div(SCALE);\\n        return result;\\n    }\\n\\n    /**\\n    * Divides an integer by a fixed point 18 mantissa\\n    *\\n    * @param dividend The integer to divide\\n    * @param mantissa The fixed point 18 number to serve as the divisor\\n    * @return An integer that is the result of dividing an integer by a fixed point 18 mantissa\\n    */\\n    function divideUintByMantissa(uint256 dividend, uint256 mantissa) internal pure returns (uint256) {\\n        uint256 result = SCALE.mul(dividend);\\n        result = result.div(mantissa);\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x282e7d707b1e604481fed02d1290cde78470e288d3469940c2edf9e5b8a10d99\"},\"@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n// NOTE: Copied from OpenZeppelin Contracts version 3.3.0\\n\\npragma solidity >=0.6.0 <0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's arithmetic operations with added overflow\\n * checks.\\n *\\n * Arithmetic operations in Solidity wrap on overflow. This can easily result\\n * in bugs, because programmers usually assume that an overflow raises an\\n * error, which is the standard behavior in high level programming languages.\\n * `SafeMath` restores this intuition by reverting the transaction when an\\n * operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n */\\nlibrary OpenZeppelinSafeMath_V3_3_0 {\\n    /**\\n     * @dev Returns the addition of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `+` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Addition cannot overflow.\\n     */\\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\\n        uint256 c = a + b;\\n        require(c >= a, \\\"SafeMath: addition overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return sub(a, b, \\\"SafeMath: subtraction overflow\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on\\n     * overflow (when the result is negative).\\n     *\\n     * Counterpart to Solidity's `-` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Subtraction cannot overflow.\\n     */\\n    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b <= a, errorMessage);\\n        uint256 c = a - b;\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the multiplication of two unsigned integers, reverting on\\n     * overflow.\\n     *\\n     * Counterpart to Solidity's `*` operator.\\n     *\\n     * Requirements:\\n     *\\n     * - Multiplication cannot overflow.\\n     */\\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n        // benefit is lost if 'b' is also tested.\\n        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        uint256 c = a * b;\\n        require(c / a == b, \\\"SafeMath: multiplication overflow\\\");\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return div(a, b, \\\"SafeMath: division by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on\\n     * division by zero. The result is rounded towards zero.\\n     *\\n     * Counterpart to Solidity's `/` operator. Note: this function uses a\\n     * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n     * uses an invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b > 0, errorMessage);\\n        uint256 c = a / b;\\n        // assert(a == b * c + a % b); // There is no case in which this doesn't hold\\n\\n        return c;\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return mod(a, b, \\\"SafeMath: modulo by zero\\\");\\n    }\\n\\n    /**\\n     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\\n     * Reverts with custom message when dividing by zero.\\n     *\\n     * Counterpart to Solidity's `%` operator. This function uses a `revert`\\n     * opcode (which leaves remaining gas untouched) while Solidity uses an\\n     * invalid opcode to revert (consuming all remaining gas).\\n     *\\n     * Requirements:\\n     *\\n     * - The divisor cannot be zero.\\n     */\\n    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {\\n        require(b != 0, errorMessage);\\n        return a % b;\\n    }\\n}\\n\",\"keccak256\":\"0xd57327a27dee007aead634ed97dd9ffa42b2626eb2731368650c9cb0e50e73d4\",\"license\":\"MIT\"},\"@pooltogether/yield-source-interface/contracts/IYieldSource.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.4.0 <0.8.0;\\n\\n/// @title Defines the functions used to interact with a yield source.  The Prize Pool inherits this contract.\\n/// @notice Prize Pools subclasses need to implement this interface so that yield can be generated.\\ninterface IYieldSource {\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function depositToken() external view returns (address);\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function balanceOfToken(address addr) external returns (uint256);\\n\\n  /// @notice Supplies tokens to the yield source.  Allows assets to be supplied on other user's behalf using the `to` param.\\n  /// @param amount The amount of `token()` to be supplied\\n  /// @param to The user whose balance will receive the tokens\\n  function supplyTokenTo(uint256 amount, address to) external;\\n\\n  /// @notice Redeems tokens from the yield source.\\n  /// @param amount The amount of `token()` to withdraw.  Denominated in `token()` as above.\\n  /// @return The actual amount of tokens that were redeemed.\\n  function redeemToken(uint256 amount) external returns (uint256);\\n\\n}\\n\",\"keccak256\":\"0xee862089c29ec1f9b2a1df7c01953d88ef5dfcfb2c2198e8926f692ec76537f1\",\"license\":\"MIT\"},\"contracts/external/compound/CTokenInterface.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface CTokenInterface is IERC20Upgradeable {\\n    function decimals() external view returns (uint8);\\n    function totalSupply() external override view returns (uint256);\\n    function underlying() external view returns (address);\\n    function balanceOfUnderlying(address owner) external returns (uint256);\\n    function supplyRatePerBlock() external returns (uint256);\\n    function exchangeRateCurrent() external returns (uint256);\\n    function mint(uint256 mintAmount) external returns (uint256);\\n    function redeem(uint256 amount) external returns (uint256);\\n    function balanceOf(address user) external override view returns (uint256);\\n    function redeemUnderlying(uint256 redeemAmount) external returns (uint256);\\n}\\n\",\"keccak256\":\"0x9608049458bc017f2369e2af2a20bfa2efaff1a5b451a17bd0594a976d5bc88f\",\"license\":\"GPL-3.0\"},\"contracts/yield-source/CTokenYieldSource.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n\\npragma solidity 0.6.12;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/fixed-point/contracts/FixedPoint.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@pooltogether/yield-source-interface/contracts/IYieldSource.sol\\\";\\n\\nimport \\\"../external/compound/CTokenInterface.sol\\\";\\n\\n/// @title Defines the functions used to interact with a yield source.  The Prize Pool inherits this contract.\\n/// @dev THIS CONTRACT IS EXPERIMENTAL!  USE AT YOUR OWN RISK\\n/// @notice Prize Pools subclasses need to implement this interface so that yield can be generated.\\ncontract CTokenYieldSource is IYieldSource {\\n  using SafeMathUpgradeable for uint256;\\n\\n  event CTokenYieldSourceInitialized(address indexed cToken);\\n\\n  mapping(address => uint256) public balances;\\n\\n  /// @notice Interface for the Yield-bearing cToken by Compound\\n  CTokenInterface public cToken;\\n\\n  /// @notice Initializes the Yield Service with the Compound cToken\\n  /// @param _cToken Address of the Compound cToken interface\\n  constructor (\\n    CTokenInterface _cToken\\n  )\\n    public\\n  {\\n    cToken = _cToken;\\n\\n    emit CTokenYieldSourceInitialized(address(cToken));\\n  }\\n\\n  /// @notice Returns the ERC20 asset token used for deposits.\\n  /// @return The ERC20 asset token\\n  function depositToken() public override view returns (address) {\\n    return _tokenAddress();\\n  }\\n\\n  function _tokenAddress() internal view returns (address) {\\n    return cToken.underlying();\\n  }\\n\\n  function _token() internal view returns (IERC20Upgradeable) {\\n    return IERC20Upgradeable(_tokenAddress());\\n  }\\n\\n  /// @notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\\n  /// @return The underlying balance of asset tokens\\n  function balanceOfToken(address addr) external override returns (uint256) {\\n    uint256 totalUnderlying = cToken.balanceOfUnderlying(address(this));\\n    uint256 total = cToken.balanceOf(address(this));\\n    if (total == 0) {\\n      return 0;\\n    }\\n    return balances[addr].mul(totalUnderlying).div(total);\\n  }\\n\\n  /// @notice Supplies asset tokens to the yield source.\\n  /// @param amount The amount of asset tokens to be supplied\\n  function supplyTokenTo(uint256 amount, address to) external override {\\n    _token().transferFrom(msg.sender, address(this), amount);\\n    IERC20Upgradeable(cToken.underlying()).approve(address(cToken), amount);\\n    uint256 cTokenBalanceBefore = cToken.balanceOf(address(this));\\n    require(cToken.mint(amount) == 0, \\\"CTokenYieldSource/mint-failed\\\");\\n    uint256 cTokenDiff = cToken.balanceOf(address(this)).sub(cTokenBalanceBefore);\\n    balances[to] = balances[to].add(cTokenDiff);\\n  }\\n\\n  /// @notice Redeems asset tokens from the yield source.\\n  /// @param redeemAmount The amount of yield-bearing tokens to be redeemed\\n  /// @return The actual amount of tokens that were redeemed.\\n  function redeemToken(uint256 redeemAmount) external override returns (uint256) {\\n    uint256 cTokenBalanceBefore = cToken.balanceOf(address(this));\\n    uint256 balanceBefore = _token().balanceOf(address(this));\\n    require(cToken.redeemUnderlying(redeemAmount) == 0, \\\"CTokenYieldSource/redeem-failed\\\");\\n    uint256 cTokenDiff = cTokenBalanceBefore.sub(cToken.balanceOf(address(this)));\\n    uint256 diff = _token().balanceOf(address(this)).sub(balanceBefore);\\n    balances[msg.sender] = balances[msg.sender].sub(cTokenDiff);\\n    _token().transfer(msg.sender, diff);\\n    return diff;\\n  }\\n}\\n\",\"keccak256\":\"0x89bdc996bf8f5350dd9867e35c30c593174a4f0868df16c290b816b4b2dccc5c\",\"license\":\"GPL-3.0\"}},\"version\":1}",
          "storageLayout": {
            "storage": [
              {
                "astId": 16727,
                "contract": "contracts/yield-source/CTokenYieldSource.sol:CTokenYieldSource",
                "label": "balances",
                "offset": 0,
                "slot": "0",
                "type": "t_mapping(t_address,t_uint256)"
              },
              {
                "astId": 16730,
                "contract": "contracts/yield-source/CTokenYieldSource.sol:CTokenYieldSource",
                "label": "cToken",
                "offset": 0,
                "slot": "1",
                "type": "t_contract(CTokenInterface)6511"
              }
            ],
            "types": {
              "t_address": {
                "encoding": "inplace",
                "label": "address",
                "numberOfBytes": "20"
              },
              "t_contract(CTokenInterface)6511": {
                "encoding": "inplace",
                "label": "contract CTokenInterface",
                "numberOfBytes": "20"
              },
              "t_mapping(t_address,t_uint256)": {
                "encoding": "mapping",
                "key": "t_address",
                "label": "mapping(address => uint256)",
                "numberOfBytes": "32",
                "value": "t_uint256"
              },
              "t_uint256": {
                "encoding": "inplace",
                "label": "uint256",
                "numberOfBytes": "32"
              }
            }
          },
          "userdoc": {
            "kind": "user",
            "methods": {
              "balanceOfToken(address)": {
                "notice": "Returns the total balance (in asset tokens).  This includes the deposits and interest."
              },
              "cToken()": {
                "notice": "Interface for the Yield-bearing cToken by Compound"
              },
              "constructor": "Initializes the Yield Service with the Compound cToken",
              "depositToken()": {
                "notice": "Returns the ERC20 asset token used for deposits."
              },
              "redeemToken(uint256)": {
                "notice": "Redeems asset tokens from the yield source."
              },
              "supplyTokenTo(uint256,address)": {
                "notice": "Supplies asset tokens to the yield source."
              }
            },
            "notice": "Prize Pools subclasses need to implement this interface so that yield can be generated.",
            "version": 1
          }
        }
      },
      "hardhat/console.sol": {
        "console": {
          "abi": [],
          "devdoc": {
            "kind": "dev",
            "methods": {},
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220853a7feb3a34eec5a19add558d765ed21fc8bdec11b9da2d4deda1427a53a41d64736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP6 GASPRICE PUSH32 0xEB3A34EEC5A19ADD558D765ED21FC8BDEC11B9DA2D4DEDA1427A53A41D64736F PUSH13 0x634300060C0033000000000000 ",
              "sourceMap": "67:61980:101:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220853a7feb3a34eec5a19add558d765ed21fc8bdec11b9da2d4deda1427a53a41d64736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP6 GASPRICE PUSH32 0xEB3A34EEC5A19ADD558D765ED21FC8BDEC11B9DA2D4DEDA1427A53A41D64736F PUSH13 0x634300060C0033000000000000 ",
              "sourceMap": "67:61980:101:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "_sendLogPayload(bytes memory)": "infinite",
                "log()": "infinite",
                "log(address)": "infinite",
                "log(address,address)": "infinite",
                "log(address,address,address)": "infinite",
                "log(address,address,address,address)": "infinite",
                "log(address,address,address,bool)": "infinite",
                "log(address,address,address,string memory)": "infinite",
                "log(address,address,address,uint256)": "infinite",
                "log(address,address,bool)": "infinite",
                "log(address,address,bool,address)": "infinite",
                "log(address,address,bool,bool)": "infinite",
                "log(address,address,bool,string memory)": "infinite",
                "log(address,address,bool,uint256)": "infinite",
                "log(address,address,string memory)": "infinite",
                "log(address,address,string memory,address)": "infinite",
                "log(address,address,string memory,bool)": "infinite",
                "log(address,address,string memory,string memory)": "infinite",
                "log(address,address,string memory,uint256)": "infinite",
                "log(address,address,uint256)": "infinite",
                "log(address,address,uint256,address)": "infinite",
                "log(address,address,uint256,bool)": "infinite",
                "log(address,address,uint256,string memory)": "infinite",
                "log(address,address,uint256,uint256)": "infinite",
                "log(address,bool)": "infinite",
                "log(address,bool,address)": "infinite",
                "log(address,bool,address,address)": "infinite",
                "log(address,bool,address,bool)": "infinite",
                "log(address,bool,address,string memory)": "infinite",
                "log(address,bool,address,uint256)": "infinite",
                "log(address,bool,bool)": "infinite",
                "log(address,bool,bool,address)": "infinite",
                "log(address,bool,bool,bool)": "infinite",
                "log(address,bool,bool,string memory)": "infinite",
                "log(address,bool,bool,uint256)": "infinite",
                "log(address,bool,string memory)": "infinite",
                "log(address,bool,string memory,address)": "infinite",
                "log(address,bool,string memory,bool)": "infinite",
                "log(address,bool,string memory,string memory)": "infinite",
                "log(address,bool,string memory,uint256)": "infinite",
                "log(address,bool,uint256)": "infinite",
                "log(address,bool,uint256,address)": "infinite",
                "log(address,bool,uint256,bool)": "infinite",
                "log(address,bool,uint256,string memory)": "infinite",
                "log(address,bool,uint256,uint256)": "infinite",
                "log(address,string memory)": "infinite",
                "log(address,string memory,address)": "infinite",
                "log(address,string memory,address,address)": "infinite",
                "log(address,string memory,address,bool)": "infinite",
                "log(address,string memory,address,string memory)": "infinite",
                "log(address,string memory,address,uint256)": "infinite",
                "log(address,string memory,bool)": "infinite",
                "log(address,string memory,bool,address)": "infinite",
                "log(address,string memory,bool,bool)": "infinite",
                "log(address,string memory,bool,string memory)": "infinite",
                "log(address,string memory,bool,uint256)": "infinite",
                "log(address,string memory,string memory)": "infinite",
                "log(address,string memory,string memory,address)": "infinite",
                "log(address,string memory,string memory,bool)": "infinite",
                "log(address,string memory,string memory,string memory)": "infinite",
                "log(address,string memory,string memory,uint256)": "infinite",
                "log(address,string memory,uint256)": "infinite",
                "log(address,string memory,uint256,address)": "infinite",
                "log(address,string memory,uint256,bool)": "infinite",
                "log(address,string memory,uint256,string memory)": "infinite",
                "log(address,string memory,uint256,uint256)": "infinite",
                "log(address,uint256)": "infinite",
                "log(address,uint256,address)": "infinite",
                "log(address,uint256,address,address)": "infinite",
                "log(address,uint256,address,bool)": "infinite",
                "log(address,uint256,address,string memory)": "infinite",
                "log(address,uint256,address,uint256)": "infinite",
                "log(address,uint256,bool)": "infinite",
                "log(address,uint256,bool,address)": "infinite",
                "log(address,uint256,bool,bool)": "infinite",
                "log(address,uint256,bool,string memory)": "infinite",
                "log(address,uint256,bool,uint256)": "infinite",
                "log(address,uint256,string memory)": "infinite",
                "log(address,uint256,string memory,address)": "infinite",
                "log(address,uint256,string memory,bool)": "infinite",
                "log(address,uint256,string memory,string memory)": "infinite",
                "log(address,uint256,string memory,uint256)": "infinite",
                "log(address,uint256,uint256)": "infinite",
                "log(address,uint256,uint256,address)": "infinite",
                "log(address,uint256,uint256,bool)": "infinite",
                "log(address,uint256,uint256,string memory)": "infinite",
                "log(address,uint256,uint256,uint256)": "infinite",
                "log(bool)": "infinite",
                "log(bool,address)": "infinite",
                "log(bool,address,address)": "infinite",
                "log(bool,address,address,address)": "infinite",
                "log(bool,address,address,bool)": "infinite",
                "log(bool,address,address,string memory)": "infinite",
                "log(bool,address,address,uint256)": "infinite",
                "log(bool,address,bool)": "infinite",
                "log(bool,address,bool,address)": "infinite",
                "log(bool,address,bool,bool)": "infinite",
                "log(bool,address,bool,string memory)": "infinite",
                "log(bool,address,bool,uint256)": "infinite",
                "log(bool,address,string memory)": "infinite",
                "log(bool,address,string memory,address)": "infinite",
                "log(bool,address,string memory,bool)": "infinite",
                "log(bool,address,string memory,string memory)": "infinite",
                "log(bool,address,string memory,uint256)": "infinite",
                "log(bool,address,uint256)": "infinite",
                "log(bool,address,uint256,address)": "infinite",
                "log(bool,address,uint256,bool)": "infinite",
                "log(bool,address,uint256,string memory)": "infinite",
                "log(bool,address,uint256,uint256)": "infinite",
                "log(bool,bool)": "infinite",
                "log(bool,bool,address)": "infinite",
                "log(bool,bool,address,address)": "infinite",
                "log(bool,bool,address,bool)": "infinite",
                "log(bool,bool,address,string memory)": "infinite",
                "log(bool,bool,address,uint256)": "infinite",
                "log(bool,bool,bool)": "infinite",
                "log(bool,bool,bool,address)": "infinite",
                "log(bool,bool,bool,bool)": "infinite",
                "log(bool,bool,bool,string memory)": "infinite",
                "log(bool,bool,bool,uint256)": "infinite",
                "log(bool,bool,string memory)": "infinite",
                "log(bool,bool,string memory,address)": "infinite",
                "log(bool,bool,string memory,bool)": "infinite",
                "log(bool,bool,string memory,string memory)": "infinite",
                "log(bool,bool,string memory,uint256)": "infinite",
                "log(bool,bool,uint256)": "infinite",
                "log(bool,bool,uint256,address)": "infinite",
                "log(bool,bool,uint256,bool)": "infinite",
                "log(bool,bool,uint256,string memory)": "infinite",
                "log(bool,bool,uint256,uint256)": "infinite",
                "log(bool,string memory)": "infinite",
                "log(bool,string memory,address)": "infinite",
                "log(bool,string memory,address,address)": "infinite",
                "log(bool,string memory,address,bool)": "infinite",
                "log(bool,string memory,address,string memory)": "infinite",
                "log(bool,string memory,address,uint256)": "infinite",
                "log(bool,string memory,bool)": "infinite",
                "log(bool,string memory,bool,address)": "infinite",
                "log(bool,string memory,bool,bool)": "infinite",
                "log(bool,string memory,bool,string memory)": "infinite",
                "log(bool,string memory,bool,uint256)": "infinite",
                "log(bool,string memory,string memory)": "infinite",
                "log(bool,string memory,string memory,address)": "infinite",
                "log(bool,string memory,string memory,bool)": "infinite",
                "log(bool,string memory,string memory,string memory)": "infinite",
                "log(bool,string memory,string memory,uint256)": "infinite",
                "log(bool,string memory,uint256)": "infinite",
                "log(bool,string memory,uint256,address)": "infinite",
                "log(bool,string memory,uint256,bool)": "infinite",
                "log(bool,string memory,uint256,string memory)": "infinite",
                "log(bool,string memory,uint256,uint256)": "infinite",
                "log(bool,uint256)": "infinite",
                "log(bool,uint256,address)": "infinite",
                "log(bool,uint256,address,address)": "infinite",
                "log(bool,uint256,address,bool)": "infinite",
                "log(bool,uint256,address,string memory)": "infinite",
                "log(bool,uint256,address,uint256)": "infinite",
                "log(bool,uint256,bool)": "infinite",
                "log(bool,uint256,bool,address)": "infinite",
                "log(bool,uint256,bool,bool)": "infinite",
                "log(bool,uint256,bool,string memory)": "infinite",
                "log(bool,uint256,bool,uint256)": "infinite",
                "log(bool,uint256,string memory)": "infinite",
                "log(bool,uint256,string memory,address)": "infinite",
                "log(bool,uint256,string memory,bool)": "infinite",
                "log(bool,uint256,string memory,string memory)": "infinite",
                "log(bool,uint256,string memory,uint256)": "infinite",
                "log(bool,uint256,uint256)": "infinite",
                "log(bool,uint256,uint256,address)": "infinite",
                "log(bool,uint256,uint256,bool)": "infinite",
                "log(bool,uint256,uint256,string memory)": "infinite",
                "log(bool,uint256,uint256,uint256)": "infinite",
                "log(string memory)": "infinite",
                "log(string memory,address)": "infinite",
                "log(string memory,address,address)": "infinite",
                "log(string memory,address,address,address)": "infinite",
                "log(string memory,address,address,bool)": "infinite",
                "log(string memory,address,address,string memory)": "infinite",
                "log(string memory,address,address,uint256)": "infinite",
                "log(string memory,address,bool)": "infinite",
                "log(string memory,address,bool,address)": "infinite",
                "log(string memory,address,bool,bool)": "infinite",
                "log(string memory,address,bool,string memory)": "infinite",
                "log(string memory,address,bool,uint256)": "infinite",
                "log(string memory,address,string memory)": "infinite",
                "log(string memory,address,string memory,address)": "infinite",
                "log(string memory,address,string memory,bool)": "infinite",
                "log(string memory,address,string memory,string memory)": "infinite",
                "log(string memory,address,string memory,uint256)": "infinite",
                "log(string memory,address,uint256)": "infinite",
                "log(string memory,address,uint256,address)": "infinite",
                "log(string memory,address,uint256,bool)": "infinite",
                "log(string memory,address,uint256,string memory)": "infinite",
                "log(string memory,address,uint256,uint256)": "infinite",
                "log(string memory,bool)": "infinite",
                "log(string memory,bool,address)": "infinite",
                "log(string memory,bool,address,address)": "infinite",
                "log(string memory,bool,address,bool)": "infinite",
                "log(string memory,bool,address,string memory)": "infinite",
                "log(string memory,bool,address,uint256)": "infinite",
                "log(string memory,bool,bool)": "infinite",
                "log(string memory,bool,bool,address)": "infinite",
                "log(string memory,bool,bool,bool)": "infinite",
                "log(string memory,bool,bool,string memory)": "infinite",
                "log(string memory,bool,bool,uint256)": "infinite",
                "log(string memory,bool,string memory)": "infinite",
                "log(string memory,bool,string memory,address)": "infinite",
                "log(string memory,bool,string memory,bool)": "infinite",
                "log(string memory,bool,string memory,string memory)": "infinite",
                "log(string memory,bool,string memory,uint256)": "infinite",
                "log(string memory,bool,uint256)": "infinite",
                "log(string memory,bool,uint256,address)": "infinite",
                "log(string memory,bool,uint256,bool)": "infinite",
                "log(string memory,bool,uint256,string memory)": "infinite",
                "log(string memory,bool,uint256,uint256)": "infinite",
                "log(string memory,string memory)": "infinite",
                "log(string memory,string memory,address)": "infinite",
                "log(string memory,string memory,address,address)": "infinite",
                "log(string memory,string memory,address,bool)": "infinite",
                "log(string memory,string memory,address,string memory)": "infinite",
                "log(string memory,string memory,address,uint256)": "infinite",
                "log(string memory,string memory,bool)": "infinite",
                "log(string memory,string memory,bool,address)": "infinite",
                "log(string memory,string memory,bool,bool)": "infinite",
                "log(string memory,string memory,bool,string memory)": "infinite",
                "log(string memory,string memory,bool,uint256)": "infinite",
                "log(string memory,string memory,string memory)": "infinite",
                "log(string memory,string memory,string memory,address)": "infinite",
                "log(string memory,string memory,string memory,bool)": "infinite",
                "log(string memory,string memory,string memory,string memory)": "infinite",
                "log(string memory,string memory,string memory,uint256)": "infinite",
                "log(string memory,string memory,uint256)": "infinite",
                "log(string memory,string memory,uint256,address)": "infinite",
                "log(string memory,string memory,uint256,bool)": "infinite",
                "log(string memory,string memory,uint256,string memory)": "infinite",
                "log(string memory,string memory,uint256,uint256)": "infinite",
                "log(string memory,uint256)": "infinite",
                "log(string memory,uint256,address)": "infinite",
                "log(string memory,uint256,address,address)": "infinite",
                "log(string memory,uint256,address,bool)": "infinite",
                "log(string memory,uint256,address,string memory)": "infinite",
                "log(string memory,uint256,address,uint256)": "infinite",
                "log(string memory,uint256,bool)": "infinite",
                "log(string memory,uint256,bool,address)": "infinite",
                "log(string memory,uint256,bool,bool)": "infinite",
                "log(string memory,uint256,bool,string memory)": "infinite",
                "log(string memory,uint256,bool,uint256)": "infinite",
                "log(string memory,uint256,string memory)": "infinite",
                "log(string memory,uint256,string memory,address)": "infinite",
                "log(string memory,uint256,string memory,bool)": "infinite",
                "log(string memory,uint256,string memory,string memory)": "infinite",
                "log(string memory,uint256,string memory,uint256)": "infinite",
                "log(string memory,uint256,uint256)": "infinite",
                "log(string memory,uint256,uint256,address)": "infinite",
                "log(string memory,uint256,uint256,bool)": "infinite",
                "log(string memory,uint256,uint256,string memory)": "infinite",
                "log(string memory,uint256,uint256,uint256)": "infinite",
                "log(uint256)": "infinite",
                "log(uint256,address)": "infinite",
                "log(uint256,address,address)": "infinite",
                "log(uint256,address,address,address)": "infinite",
                "log(uint256,address,address,bool)": "infinite",
                "log(uint256,address,address,string memory)": "infinite",
                "log(uint256,address,address,uint256)": "infinite",
                "log(uint256,address,bool)": "infinite",
                "log(uint256,address,bool,address)": "infinite",
                "log(uint256,address,bool,bool)": "infinite",
                "log(uint256,address,bool,string memory)": "infinite",
                "log(uint256,address,bool,uint256)": "infinite",
                "log(uint256,address,string memory)": "infinite",
                "log(uint256,address,string memory,address)": "infinite",
                "log(uint256,address,string memory,bool)": "infinite",
                "log(uint256,address,string memory,string memory)": "infinite",
                "log(uint256,address,string memory,uint256)": "infinite",
                "log(uint256,address,uint256)": "infinite",
                "log(uint256,address,uint256,address)": "infinite",
                "log(uint256,address,uint256,bool)": "infinite",
                "log(uint256,address,uint256,string memory)": "infinite",
                "log(uint256,address,uint256,uint256)": "infinite",
                "log(uint256,bool)": "infinite",
                "log(uint256,bool,address)": "infinite",
                "log(uint256,bool,address,address)": "infinite",
                "log(uint256,bool,address,bool)": "infinite",
                "log(uint256,bool,address,string memory)": "infinite",
                "log(uint256,bool,address,uint256)": "infinite",
                "log(uint256,bool,bool)": "infinite",
                "log(uint256,bool,bool,address)": "infinite",
                "log(uint256,bool,bool,bool)": "infinite",
                "log(uint256,bool,bool,string memory)": "infinite",
                "log(uint256,bool,bool,uint256)": "infinite",
                "log(uint256,bool,string memory)": "infinite",
                "log(uint256,bool,string memory,address)": "infinite",
                "log(uint256,bool,string memory,bool)": "infinite",
                "log(uint256,bool,string memory,string memory)": "infinite",
                "log(uint256,bool,string memory,uint256)": "infinite",
                "log(uint256,bool,uint256)": "infinite",
                "log(uint256,bool,uint256,address)": "infinite",
                "log(uint256,bool,uint256,bool)": "infinite",
                "log(uint256,bool,uint256,string memory)": "infinite",
                "log(uint256,bool,uint256,uint256)": "infinite",
                "log(uint256,string memory)": "infinite",
                "log(uint256,string memory,address)": "infinite",
                "log(uint256,string memory,address,address)": "infinite",
                "log(uint256,string memory,address,bool)": "infinite",
                "log(uint256,string memory,address,string memory)": "infinite",
                "log(uint256,string memory,address,uint256)": "infinite",
                "log(uint256,string memory,bool)": "infinite",
                "log(uint256,string memory,bool,address)": "infinite",
                "log(uint256,string memory,bool,bool)": "infinite",
                "log(uint256,string memory,bool,string memory)": "infinite",
                "log(uint256,string memory,bool,uint256)": "infinite",
                "log(uint256,string memory,string memory)": "infinite",
                "log(uint256,string memory,string memory,address)": "infinite",
                "log(uint256,string memory,string memory,bool)": "infinite",
                "log(uint256,string memory,string memory,string memory)": "infinite",
                "log(uint256,string memory,string memory,uint256)": "infinite",
                "log(uint256,string memory,uint256)": "infinite",
                "log(uint256,string memory,uint256,address)": "infinite",
                "log(uint256,string memory,uint256,bool)": "infinite",
                "log(uint256,string memory,uint256,string memory)": "infinite",
                "log(uint256,string memory,uint256,uint256)": "infinite",
                "log(uint256,uint256)": "infinite",
                "log(uint256,uint256,address)": "infinite",
                "log(uint256,uint256,address,address)": "infinite",
                "log(uint256,uint256,address,bool)": "infinite",
                "log(uint256,uint256,address,string memory)": "infinite",
                "log(uint256,uint256,address,uint256)": "infinite",
                "log(uint256,uint256,bool)": "infinite",
                "log(uint256,uint256,bool,address)": "infinite",
                "log(uint256,uint256,bool,bool)": "infinite",
                "log(uint256,uint256,bool,string memory)": "infinite",
                "log(uint256,uint256,bool,uint256)": "infinite",
                "log(uint256,uint256,string memory)": "infinite",
                "log(uint256,uint256,string memory,address)": "infinite",
                "log(uint256,uint256,string memory,bool)": "infinite",
                "log(uint256,uint256,string memory,string memory)": "infinite",
                "log(uint256,uint256,string memory,uint256)": "infinite",
                "log(uint256,uint256,uint256)": "infinite",
                "log(uint256,uint256,uint256,address)": "infinite",
                "log(uint256,uint256,uint256,bool)": "infinite",
                "log(uint256,uint256,uint256,string memory)": "infinite",
                "log(uint256,uint256,uint256,uint256)": "infinite",
                "logAddress(address)": "infinite",
                "logBool(bool)": "infinite",
                "logBytes(bytes memory)": "infinite",
                "logBytes1(bytes1)": "infinite",
                "logBytes10(bytes10)": "infinite",
                "logBytes11(bytes11)": "infinite",
                "logBytes12(bytes12)": "infinite",
                "logBytes13(bytes13)": "infinite",
                "logBytes14(bytes14)": "infinite",
                "logBytes15(bytes15)": "infinite",
                "logBytes16(bytes16)": "infinite",
                "logBytes17(bytes17)": "infinite",
                "logBytes18(bytes18)": "infinite",
                "logBytes19(bytes19)": "infinite",
                "logBytes2(bytes2)": "infinite",
                "logBytes20(bytes20)": "infinite",
                "logBytes21(bytes21)": "infinite",
                "logBytes22(bytes22)": "infinite",
                "logBytes23(bytes23)": "infinite",
                "logBytes24(bytes24)": "infinite",
                "logBytes25(bytes25)": "infinite",
                "logBytes26(bytes26)": "infinite",
                "logBytes27(bytes27)": "infinite",
                "logBytes28(bytes28)": "infinite",
                "logBytes29(bytes29)": "infinite",
                "logBytes3(bytes3)": "infinite",
                "logBytes30(bytes30)": "infinite",
                "logBytes31(bytes31)": "infinite",
                "logBytes32(bytes32)": "infinite",
                "logBytes4(bytes4)": "infinite",
                "logBytes5(bytes5)": "infinite",
                "logBytes6(bytes6)": "infinite",
                "logBytes7(bytes7)": "infinite",
                "logBytes8(bytes8)": "infinite",
                "logBytes9(bytes9)": "infinite",
                "logInt(int256)": "infinite",
                "logString(string memory)": "infinite",
                "logUint(uint256)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"hardhat/console.sol\":\"console\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >= 0.4.22 <0.9.0;\\n\\nlibrary console {\\n\\taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction _sendLogPayload(bytes memory payload) private view {\\n\\t\\tuint256 payloadLength = payload.length;\\n\\t\\taddress consoleAddress = CONSOLE_ADDRESS;\\n\\t\\tassembly {\\n\\t\\t\\tlet payloadStart := add(payload, 32)\\n\\t\\t\\tlet r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)\\n\\t\\t}\\n\\t}\\n\\n\\tfunction log() internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t}\\n\\n\\tfunction logInt(int p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(int)\\\", p0));\\n\\t}\\n\\n\\tfunction logUint(uint p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint)\\\", p0));\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint)\\\", p0));\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, uint p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,uint,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(uint p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(uint,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, uint p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, uint p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, uint p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t_sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t}\\n\\n}\\n\",\"keccak256\":\"0x72b6a1d297cd3b033d7c2e4a7e7864934bb767db6453623f1c3082c6534547f4\",\"license\":\"MIT\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      },
      "sortition-sum-tree-factory/contracts/SortitionSumTreeFactory.sol": {
        "SortitionSumTreeFactory": {
          "abi": [],
          "devdoc": {
            "author": "Enrique Piqueras - <epiquerass@gmail.com>",
            "details": "A factory of trees that keep track of staked values for sortition.",
            "kind": "dev",
            "methods": {},
            "title": "SortitionSumTreeFactory",
            "version": 1
          },
          "evm": {
            "bytecode": {
              "linkReferences": {},
              "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122024e4e5ddd52b9610546fab5af5b82bc82c93ff8d7a1a3c9629484f56af048cb364736f6c634300060c0033",
              "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x24 0xE4 0xE5 0xDD 0xD5 0x2B SWAP7 LT SLOAD PUSH16 0xAB5AF5B82BC82C93FF8D7A1A3C962948 0x4F JUMP 0xAF DIV DUP13 0xB3 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "351:9158:102:-:0;;;;;;;;;;;;;;;;;;;;;;;;;"
            },
            "deployedBytecode": {
              "immutableReferences": {},
              "linkReferences": {},
              "object": "73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122024e4e5ddd52b9610546fab5af5b82bc82c93ff8d7a1a3c9629484f56af048cb364736f6c634300060c0033",
              "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x24 0xE4 0xE5 0xDD 0xD5 0x2B SWAP7 LT SLOAD PUSH16 0xAB5AF5B82BC82C93FF8D7A1A3C962948 0x4F JUMP 0xAF DIV DUP13 0xB3 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ",
              "sourceMap": "351:9158:102:-:0;;;;;;;;"
            },
            "gasEstimates": {
              "creation": {
                "codeDepositCost": "17200",
                "executionCost": "97",
                "totalCost": "17297"
              },
              "internal": {
                "createTree(struct SortitionSumTreeFactory.SortitionSumTrees storage pointer,bytes32,uint256)": "infinite",
                "draw(struct SortitionSumTreeFactory.SortitionSumTrees storage pointer,bytes32,uint256)": "infinite",
                "queryLeafs(struct SortitionSumTreeFactory.SortitionSumTrees storage pointer,bytes32,uint256,uint256)": "infinite",
                "set(struct SortitionSumTreeFactory.SortitionSumTrees storage pointer,bytes32,uint256,bytes32)": "infinite",
                "stakeOf(struct SortitionSumTreeFactory.SortitionSumTrees storage pointer,bytes32,bytes32)": "infinite",
                "total(struct SortitionSumTreeFactory.SortitionSumTrees storage pointer,bytes32)": "infinite",
                "updateParents(struct SortitionSumTreeFactory.SortitionSumTrees storage pointer,bytes32,uint256,bool,uint256)": "infinite"
              }
            },
            "methodIdentifiers": {}
          },
          "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"Enrique Piqueras - <epiquerass@gmail.com>\",\"details\":\"A factory of trees that keep track of staked values for sortition.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"SortitionSumTreeFactory\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"sortition-sum-tree-factory/contracts/SortitionSumTreeFactory.sol\":\"SortitionSumTreeFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"sortition-sum-tree-factory/contracts/SortitionSumTreeFactory.sol\":{\"content\":\"/**\\n *  @reviewers: [@clesaege, @unknownunknown1, @ferittuncer]\\n *  @auditors: []\\n *  @bounties: [<14 days 10 ETH max payout>]\\n *  @deployments: []\\n */\\n\\npragma solidity ^0.6.0;\\n\\n/**\\n *  @title SortitionSumTreeFactory\\n *  @author Enrique Piqueras - <epiquerass@gmail.com>\\n *  @dev A factory of trees that keep track of staked values for sortition.\\n */\\nlibrary SortitionSumTreeFactory {\\n    /* Structs */\\n\\n    struct SortitionSumTree {\\n        uint K; // The maximum number of childs per node.\\n        // We use this to keep track of vacant positions in the tree after removing a leaf. This is for keeping the tree as balanced as possible without spending gas on moving nodes around.\\n        uint[] stack;\\n        uint[] nodes;\\n        // Two-way mapping of IDs to node indexes. Note that node index 0 is reserved for the root node, and means the ID does not have a node.\\n        mapping(bytes32 => uint) IDsToNodeIndexes;\\n        mapping(uint => bytes32) nodeIndexesToIDs;\\n    }\\n\\n    /* Storage */\\n\\n    struct SortitionSumTrees {\\n        mapping(bytes32 => SortitionSumTree) sortitionSumTrees;\\n    }\\n\\n    /* internal */\\n\\n    /**\\n     *  @dev Create a sortition sum tree at the specified key.\\n     *  @param _key The key of the new tree.\\n     *  @param _K The number of children each node in the tree should have.\\n     */\\n    function createTree(SortitionSumTrees storage self, bytes32 _key, uint _K) internal {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        require(tree.K == 0, \\\"Tree already exists.\\\");\\n        require(_K > 1, \\\"K must be greater than one.\\\");\\n        tree.K = _K;\\n        tree.stack = new uint[](0);\\n        tree.nodes = new uint[](0);\\n        tree.nodes.push(0);\\n    }\\n\\n    /**\\n     *  @dev Set a value of a tree.\\n     *  @param _key The key of the tree.\\n     *  @param _value The new value.\\n     *  @param _ID The ID of the value.\\n     *  `O(log_k(n))` where\\n     *  `k` is the maximum number of childs per node in the tree,\\n     *   and `n` is the maximum number of nodes ever appended.\\n     */\\n    function set(SortitionSumTrees storage self, bytes32 _key, uint _value, bytes32 _ID) internal {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        uint treeIndex = tree.IDsToNodeIndexes[_ID];\\n\\n        if (treeIndex == 0) { // No existing node.\\n            if (_value != 0) { // Non zero value.\\n                // Append.\\n                // Add node.\\n                if (tree.stack.length == 0) { // No vacant spots.\\n                    // Get the index and append the value.\\n                    treeIndex = tree.nodes.length;\\n                    tree.nodes.push(_value);\\n\\n                    // Potentially append a new node and make the parent a sum node.\\n                    if (treeIndex != 1 && (treeIndex - 1) % tree.K == 0) { // Is first child.\\n                        uint parentIndex = treeIndex / tree.K;\\n                        bytes32 parentID = tree.nodeIndexesToIDs[parentIndex];\\n                        uint newIndex = treeIndex + 1;\\n                        tree.nodes.push(tree.nodes[parentIndex]);\\n                        delete tree.nodeIndexesToIDs[parentIndex];\\n                        tree.IDsToNodeIndexes[parentID] = newIndex;\\n                        tree.nodeIndexesToIDs[newIndex] = parentID;\\n                    }\\n                } else { // Some vacant spot.\\n                    // Pop the stack and append the value.\\n                    treeIndex = tree.stack[tree.stack.length - 1];\\n                    tree.stack.pop();\\n                    tree.nodes[treeIndex] = _value;\\n                }\\n\\n                // Add label.\\n                tree.IDsToNodeIndexes[_ID] = treeIndex;\\n                tree.nodeIndexesToIDs[treeIndex] = _ID;\\n\\n                updateParents(self, _key, treeIndex, true, _value);\\n            }\\n        } else { // Existing node.\\n            if (_value == 0) { // Zero value.\\n                // Remove.\\n                // Remember value and set to 0.\\n                uint value = tree.nodes[treeIndex];\\n                tree.nodes[treeIndex] = 0;\\n\\n                // Push to stack.\\n                tree.stack.push(treeIndex);\\n\\n                // Clear label.\\n                delete tree.IDsToNodeIndexes[_ID];\\n                delete tree.nodeIndexesToIDs[treeIndex];\\n\\n                updateParents(self, _key, treeIndex, false, value);\\n            } else if (_value != tree.nodes[treeIndex]) { // New, non zero value.\\n                // Set.\\n                bool plusOrMinus = tree.nodes[treeIndex] <= _value;\\n                uint plusOrMinusValue = plusOrMinus ? _value - tree.nodes[treeIndex] : tree.nodes[treeIndex] - _value;\\n                tree.nodes[treeIndex] = _value;\\n\\n                updateParents(self, _key, treeIndex, plusOrMinus, plusOrMinusValue);\\n            }\\n        }\\n    }\\n\\n    /* internal Views */\\n\\n    /**\\n     *  @dev Query the leaves of a tree. Note that if `startIndex == 0`, the tree is empty and the root node will be returned.\\n     *  @param _key The key of the tree to get the leaves from.\\n     *  @param _cursor The pagination cursor.\\n     *  @param _count The number of items to return.\\n     *  @return startIndex The index at which leaves start\\n     *  @return values The values of the returned leaves\\n     *  @return hasMore Whether there are more for pagination.\\n     *  `O(n)` where\\n     *  `n` is the maximum number of nodes ever appended.\\n     */\\n    function queryLeafs(\\n        SortitionSumTrees storage self,\\n        bytes32 _key,\\n        uint _cursor,\\n        uint _count\\n    ) internal view returns(uint startIndex, uint[] memory values, bool hasMore) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n\\n        // Find the start index.\\n        for (uint i = 0; i < tree.nodes.length; i++) {\\n            if ((tree.K * i) + 1 >= tree.nodes.length) {\\n                startIndex = i;\\n                break;\\n            }\\n        }\\n\\n        // Get the values.\\n        uint loopStartIndex = startIndex + _cursor;\\n        values = new uint[](loopStartIndex + _count > tree.nodes.length ? tree.nodes.length - loopStartIndex : _count);\\n        uint valuesIndex = 0;\\n        for (uint j = loopStartIndex; j < tree.nodes.length; j++) {\\n            if (valuesIndex < _count) {\\n                values[valuesIndex] = tree.nodes[j];\\n                valuesIndex++;\\n            } else {\\n                hasMore = true;\\n                break;\\n            }\\n        }\\n    }\\n\\n    /**\\n     *  @dev Draw an ID from a tree using a number. Note that this function reverts if the sum of all values in the tree is 0.\\n     *  @param _key The key of the tree.\\n     *  @param _drawnNumber The drawn number.\\n     *  @return ID The drawn ID.\\n     *  `O(k * log_k(n))` where\\n     *  `k` is the maximum number of childs per node in the tree,\\n     *   and `n` is the maximum number of nodes ever appended.\\n     */\\n    function draw(SortitionSumTrees storage self, bytes32 _key, uint _drawnNumber) internal view returns(bytes32 ID) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        uint treeIndex = 0;\\n        uint currentDrawnNumber = _drawnNumber % tree.nodes[0];\\n\\n        while ((tree.K * treeIndex) + 1 < tree.nodes.length)  // While it still has children.\\n            for (uint i = 1; i <= tree.K; i++) { // Loop over children.\\n                uint nodeIndex = (tree.K * treeIndex) + i;\\n                uint nodeValue = tree.nodes[nodeIndex];\\n\\n                if (currentDrawnNumber >= nodeValue) currentDrawnNumber -= nodeValue; // Go to the next child.\\n                else { // Pick this child.\\n                    treeIndex = nodeIndex;\\n                    break;\\n                }\\n            }\\n        \\n        ID = tree.nodeIndexesToIDs[treeIndex];\\n    }\\n\\n    /** @dev Gets a specified ID's associated value.\\n     *  @param _key The key of the tree.\\n     *  @param _ID The ID of the value.\\n     *  @return value The associated value.\\n     */\\n    function stakeOf(SortitionSumTrees storage self, bytes32 _key, bytes32 _ID) internal view returns(uint value) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        uint treeIndex = tree.IDsToNodeIndexes[_ID];\\n\\n        if (treeIndex == 0) value = 0;\\n        else value = tree.nodes[treeIndex];\\n    }\\n\\n    function total(SortitionSumTrees storage self, bytes32 _key) internal view returns (uint) {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n        if (tree.nodes.length == 0) {\\n            return 0;\\n        } else {\\n            return tree.nodes[0];\\n        }\\n    }\\n\\n    /* Private */\\n\\n    /**\\n     *  @dev Update all the parents of a node.\\n     *  @param _key The key of the tree to update.\\n     *  @param _treeIndex The index of the node to start from.\\n     *  @param _plusOrMinus Wether to add (true) or substract (false).\\n     *  @param _value The value to add or substract.\\n     *  `O(log_k(n))` where\\n     *  `k` is the maximum number of childs per node in the tree,\\n     *   and `n` is the maximum number of nodes ever appended.\\n     */\\n    function updateParents(SortitionSumTrees storage self, bytes32 _key, uint _treeIndex, bool _plusOrMinus, uint _value) private {\\n        SortitionSumTree storage tree = self.sortitionSumTrees[_key];\\n\\n        uint parentIndex = _treeIndex;\\n        while (parentIndex != 0) {\\n            parentIndex = (parentIndex - 1) / tree.K;\\n            tree.nodes[parentIndex] = _plusOrMinus ? tree.nodes[parentIndex] + _value : tree.nodes[parentIndex] - _value;\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xa20ece2e1ddeaa6432549a7c38cd02594000b93a54b92399b89bae0dd76dbc7e\"}},\"version\":1}",
          "storageLayout": {
            "storage": [],
            "types": null
          },
          "userdoc": {
            "kind": "user",
            "methods": {},
            "version": 1
          }
        }
      }
    },
    "errors": [
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "@pooltogether/fixed-point/contracts/FixedPoint.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "@pooltogether/fixed-point/contracts/FixedPoint.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "@pooltogether/uniform-random-number/contracts/UniformRandomNumber.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "@pooltogether/uniform-random-number/contracts/UniformRandomNumber.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "contracts/external/openzeppelin/ProxyFactory.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "contracts/external/openzeppelin/ProxyFactory.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "contracts/test/BeforeAwardListenerStub.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "contracts/test/BeforeAwardListenerStub.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "contracts/test/CTokenMock.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "contracts/test/CTokenMock.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "contracts/test/CompoundPrizePoolHarness.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "contracts/test/CompoundPrizePoolHarness.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "contracts/test/CompoundPrizePoolHarnessProxyFactory.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "contracts/test/CompoundPrizePoolHarnessProxyFactory.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "contracts/test/ERC20Mintable.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "contracts/test/ERC20Mintable.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "contracts/test/ERC721Mintable.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "contracts/test/ERC721Mintable.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "contracts/test/ExtendedSafeCastExposed.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "contracts/test/ExtendedSafeCastExposed.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "contracts/test/MappedSinglyLinkedListExposed.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "contracts/test/MappedSinglyLinkedListExposed.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "contracts/test/NFT.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "contracts/test/NFT.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "contracts/test/PeriodicPrizeStrategyDistributorInterface.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "contracts/test/PeriodicPrizeStrategyDistributorInterface.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "contracts/test/PeriodicPrizeStrategyHarness.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "contracts/test/PeriodicPrizeStrategyHarness.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "contracts/test/PeriodicPrizeStrategyListenerStub.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "contracts/test/PeriodicPrizeStrategyListenerStub.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "contracts/test/PrizePoolHarness.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "contracts/test/PrizePoolHarness.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "contracts/test/RNGServiceMock.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "contracts/test/RNGServiceMock.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "contracts/test/StakePrizePoolHarness.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "contracts/test/StakePrizePoolHarness.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "contracts/test/StakePrizePoolHarnessProxyFactory.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "contracts/test/StakePrizePoolHarnessProxyFactory.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "contracts/test/TokenFaucetHarness.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "contracts/test/TokenFaucetHarness.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "contracts/test/YieldSourcePrizePoolHarness.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "contracts/test/YieldSourcePrizePoolHarness.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "contracts/test/YieldSourcePrizePoolHarnessProxyFactory.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "contracts/test/YieldSourcePrizePoolHarnessProxyFactory.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "contracts/test/YieldSourceStub.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "contracts/test/YieldSourceStub.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "contracts/token/TokenListener.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "contracts/token/TokenListener.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "contracts/token/TokenListenerLibrary.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "contracts/token/TokenListenerLibrary.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "1878",
        "formattedMessage": "sortition-sum-tree-factory/contracts/SortitionSumTreeFactory.sol: Warning: SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.\n",
        "message": "SPDX license identifier not provided in source file. Before publishing, consider adding a comment containing \"SPDX-License-Identifier: <SPDX-License>\" to each source file. Use \"SPDX-License-Identifier: UNLICENSED\" for non-open-source code. Please see https://spdx.org for more information.",
        "severity": "warning",
        "sourceLocation": {
          "end": -1,
          "file": "sortition-sum-tree-factory/contracts/SortitionSumTreeFactory.sol",
          "start": -1
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "2519",
        "formattedMessage": "contracts/prize-pool/PrizePool.sol:850:5: Warning: This declaration shadows an existing declaration.\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD  \n    ^--------------------------------------^\ncontracts/prize-pool/PrizePool.sol:812:3: The shadowed declaration is here:\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\n  ^ (Relevant source part starts here and spans across multiple lines).\n",
        "message": "This declaration shadows an existing declaration.",
        "secondarySourceLocations": [
          {
            "end": 31162,
            "file": "contracts/prize-pool/PrizePool.sol",
            "message": "The shadowed declaration is here:",
            "start": 31052
          }
        ],
        "severity": "warning",
        "sourceLocation": {
          "end": 32744,
          "file": "contracts/prize-pool/PrizePool.sol",
          "start": 32704
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "2519",
        "formattedMessage": "contracts/prize-pool/PrizePool.sol:872:5: Warning: This declaration shadows an existing declaration.\n    ControlledTokenInterface[] memory tokens = _tokens; // SLOAD\n    ^--------------------------------------^\ncontracts/prize-pool/PrizePool.sol:812:3: The shadowed declaration is here:\n  function tokens() external override view returns (ControlledTokenInterface[] memory) {\n  ^ (Relevant source part starts here and spans across multiple lines).\n",
        "message": "This declaration shadows an existing declaration.",
        "secondarySourceLocations": [
          {
            "end": 31162,
            "file": "contracts/prize-pool/PrizePool.sol",
            "message": "The shadowed declaration is here:",
            "start": 31052
          }
        ],
        "severity": "warning",
        "sourceLocation": {
          "end": 33740,
          "file": "contracts/prize-pool/PrizePool.sol",
          "start": 33700
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "2519",
        "formattedMessage": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol:208:5: Warning: This declaration shadows an existing declaration.\n    uint256 numberOfWinners = __numberOfWinners;\n    ^---------------------^\ncontracts/prize-strategy/multiple-winners/MultipleWinners.sol:174:3: The shadowed declaration is here:\n  function numberOfWinners() external view returns (uint256) {\n  ^ (Relevant source part starts here and spans across multiple lines).\n",
        "message": "This declaration shadows an existing declaration.",
        "secondarySourceLocations": [
          {
            "end": 6708,
            "file": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol",
            "message": "The shadowed declaration is here:",
            "start": 6614
          }
        ],
        "severity": "warning",
        "sourceLocation": {
          "end": 7981,
          "file": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol",
          "start": 7958
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "5667",
        "formattedMessage": "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol:41:43: Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n    function __ERC20Permit_init_unchained(string memory name) internal initializer {\n                                          ^----------------^\n",
        "message": "Unused function parameter. Remove or comment out the variable name to silence this warning.",
        "severity": "warning",
        "sourceLocation": {
          "end": 1671,
          "file": "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol",
          "start": 1653
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "5667",
        "formattedMessage": "contracts/prize-pool/PrizePool.sol:842:29: Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\n                            ^--------------^\n",
        "message": "Unused function parameter. Remove or comment out the variable name to silence this warning.",
        "severity": "warning",
        "sourceLocation": {
          "end": 32340,
          "file": "contracts/prize-pool/PrizePool.sol",
          "start": 32324
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "5667",
        "formattedMessage": "contracts/prize-pool/PrizePool.sol:842:47: Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\n                                              ^----------^\n",
        "message": "Unused function parameter. Remove or comment out the variable name to silence this warning.",
        "severity": "warning",
        "sourceLocation": {
          "end": 32354,
          "file": "contracts/prize-pool/PrizePool.sol",
          "start": 32342
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "5667",
        "formattedMessage": "contracts/prize-pool/PrizePool.sol:842:61: Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\n                                                            ^-------------^\n",
        "message": "Unused function parameter. Remove or comment out the variable name to silence this warning.",
        "severity": "warning",
        "sourceLocation": {
          "end": 32371,
          "file": "contracts/prize-pool/PrizePool.sol",
          "start": 32356
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "5667",
        "formattedMessage": "contracts/prize-pool/PrizePool.sol:842:78: Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n  function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external override returns (bytes4){\n                                                                             ^-----------------^\n",
        "message": "Unused function parameter. Remove or comment out the variable name to silence this warning.",
        "severity": "warning",
        "sourceLocation": {
          "end": 32392,
          "file": "contracts/prize-pool/PrizePool.sol",
          "start": 32373
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "2072",
        "formattedMessage": "contracts/prize-strategy/PeriodicPrizeStrategy.sol:564:22: Warning: Unused local variable.\n    (bool succeeded, bytes memory returnValue) = address(_externalErc20).staticcall(abi.encodeWithSignature(\"totalSupply()\"));\n                     ^----------------------^\n",
        "message": "Unused local variable.",
        "severity": "warning",
        "sourceLocation": {
          "end": 22824,
          "file": "contracts/prize-strategy/PeriodicPrizeStrategy.sol",
          "start": 22800
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "5667",
        "formattedMessage": "contracts/test/BeforeAwardListenerStub.sol:10:35: Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n  function beforePrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external override {\n                                  ^------------------^\n",
        "message": "Unused function parameter. Remove or comment out the variable name to silence this warning.",
        "severity": "warning",
        "sourceLocation": {
          "end": 258,
          "file": "contracts/test/BeforeAwardListenerStub.sol",
          "start": 238
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "5667",
        "formattedMessage": "contracts/test/BeforeAwardListenerStub.sol:10:57: Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n  function beforePrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external override {\n                                                        ^--------------------------^\n",
        "message": "Unused function parameter. Remove or comment out the variable name to silence this warning.",
        "severity": "warning",
        "sourceLocation": {
          "end": 288,
          "file": "contracts/test/BeforeAwardListenerStub.sol",
          "start": 260
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "5667",
        "formattedMessage": "contracts/test/PeriodicPrizeStrategyListenerStub.sol:10:34: Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n  function afterPrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external override {\n                                 ^------------------^\n",
        "message": "Unused function parameter. Remove or comment out the variable name to silence this warning.",
        "severity": "warning",
        "sourceLocation": {
          "end": 287,
          "file": "contracts/test/PeriodicPrizeStrategyListenerStub.sol",
          "start": 267
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "5667",
        "formattedMessage": "contracts/test/PeriodicPrizeStrategyListenerStub.sol:10:56: Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n  function afterPrizePoolAwarded(uint256 randomNumber, uint256 prizePeriodStartedAt) external override {\n                                                       ^--------------------------^\n",
        "message": "Unused function parameter. Remove or comment out the variable name to silence this warning.",
        "severity": "warning",
        "sourceLocation": {
          "end": 317,
          "file": "contracts/test/PeriodicPrizeStrategyListenerStub.sol",
          "start": 289
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "5667",
        "formattedMessage": "contracts/test/PrizeSplitHarness.sol:37:32: Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n  function beforeTokenTransfer(address from, address to, uint256 amount) external {\n                               ^----------^\n",
        "message": "Unused function parameter. Remove or comment out the variable name to silence this warning.",
        "severity": "warning",
        "sourceLocation": {
          "end": 1135,
          "file": "contracts/test/PrizeSplitHarness.sol",
          "start": 1123
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "5667",
        "formattedMessage": "contracts/test/PrizeSplitHarness.sol:37:46: Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n  function beforeTokenTransfer(address from, address to, uint256 amount) external {\n                                             ^--------^\n",
        "message": "Unused function parameter. Remove or comment out the variable name to silence this warning.",
        "severity": "warning",
        "sourceLocation": {
          "end": 1147,
          "file": "contracts/test/PrizeSplitHarness.sol",
          "start": 1137
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "5667",
        "formattedMessage": "contracts/test/PrizeSplitHarness.sol:37:58: Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n  function beforeTokenTransfer(address from, address to, uint256 amount) external {\n                                                         ^------------^\n",
        "message": "Unused function parameter. Remove or comment out the variable name to silence this warning.",
        "severity": "warning",
        "sourceLocation": {
          "end": 1163,
          "file": "contracts/test/PrizeSplitHarness.sol",
          "start": 1149
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "2018",
        "formattedMessage": "contracts/test/PrizeSplitHarness.sol:37:3: Warning: Function state mutability can be restricted to pure\n  function beforeTokenTransfer(address from, address to, uint256 amount) external {\n  ^ (Relevant source part starts here and spans across multiple lines).\n",
        "message": "Function state mutability can be restricted to pure",
        "severity": "warning",
        "sourceLocation": {
          "end": 1191,
          "file": "contracts/test/PrizeSplitHarness.sol",
          "start": 1094
        },
        "type": "Warning"
      },
      {
        "component": "general",
        "errorCode": "2018",
        "formattedMessage": "contracts/test/StakePrizePoolHarness.sol:22:3: Warning: Function state mutability can be restricted to pure\n  function redeem(uint256 redeemAmount) external returns (uint256) {\n  ^ (Relevant source part starts here and spans across multiple lines).\n",
        "message": "Function state mutability can be restricted to pure",
        "severity": "warning",
        "sourceLocation": {
          "end": 577,
          "file": "contracts/test/StakePrizePoolHarness.sol",
          "start": 482
        },
        "type": "Warning"
      }
    ],
    "sources": {
      "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol",
          "exportedSymbols": {
            "OwnableUpgradeable": [
              130
            ]
          },
          "id": 131,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 1,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:0"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol",
              "file": "../utils/ContextUpgradeable.sol",
              "id": 2,
              "nodeType": "ImportDirective",
              "scope": 131,
              "sourceUnit": 3628,
              "src": "66:41:0",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol",
              "file": "../proxy/Initializable.sol",
              "id": 3,
              "nodeType": "ImportDirective",
              "scope": 131,
              "sourceUnit": 1353,
              "src": "108:36:0",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": true,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 5,
                    "name": "Initializable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1352,
                    "src": "680:13:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Initializable_$1352",
                      "typeString": "contract Initializable"
                    }
                  },
                  "id": 6,
                  "nodeType": "InheritanceSpecifier",
                  "src": "680:13:0"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 7,
                    "name": "ContextUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3627,
                    "src": "695:18:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ContextUpgradeable_$3627",
                      "typeString": "contract ContextUpgradeable"
                    }
                  },
                  "id": 8,
                  "nodeType": "InheritanceSpecifier",
                  "src": "695:18:0"
                }
              ],
              "contractDependencies": [
                1352,
                3627
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 4,
                "nodeType": "StructuredDocumentation",
                "src": "145:494:0",
                "text": " @dev Contract module which provides a basic access control mechanism, where\n there is an account (an owner) that can be granted exclusive access to\n specific functions.\n By default, the owner account will be the one that deploys the contract. This\n can later be changed with {transferOwnership}.\n This module is used through inheritance. It will make available the modifier\n `onlyOwner`, which can be applied to your functions to restrict their use to\n the owner."
              },
              "fullyImplemented": true,
              "id": 130,
              "linearizedBaseContracts": [
                130,
                3627,
                1352
              ],
              "name": "OwnableUpgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "id": 10,
                  "mutability": "mutable",
                  "name": "_owner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 130,
                  "src": "720:22:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 9,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "720:7:0",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 16,
                  "name": "OwnershipTransferred",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 15,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "previousOwner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16,
                        "src": "776:29:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 11,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "776:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 14,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "newOwner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16,
                        "src": "807:24:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "807:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "775:57:0"
                  },
                  "src": "749:84:0"
                },
                {
                  "body": {
                    "id": 28,
                    "nodeType": "Block",
                    "src": "982:79:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 22,
                            "name": "__Context_init_unchained",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3602,
                            "src": "992:24:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 23,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "992:26:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24,
                        "nodeType": "ExpressionStatement",
                        "src": "992:26:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 25,
                            "name": "__Ownable_init_unchained",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 52,
                            "src": "1028:24:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 26,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1028:26:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 27,
                        "nodeType": "ExpressionStatement",
                        "src": "1028:26:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 17,
                    "nodeType": "StructuredDocumentation",
                    "src": "839:91:0",
                    "text": " @dev Initializes the contract setting the deployer as the initial owner."
                  },
                  "id": 29,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 20,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 19,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "970:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "970:11:0"
                    }
                  ],
                  "name": "__Ownable_init",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "958:2:0"
                  },
                  "returnParameters": {
                    "id": 21,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "982:0:0"
                  },
                  "scope": 130,
                  "src": "935:126:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 51,
                    "nodeType": "Block",
                    "src": "1124:135:0",
                    "statements": [
                      {
                        "assignments": [
                          35
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 35,
                            "mutability": "mutable",
                            "name": "msgSender",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 51,
                            "src": "1134:17:0",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 34,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "1134:7:0",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 38,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 36,
                            "name": "_msgSender",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3611,
                            "src": "1154:10:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                              "typeString": "function () view returns (address payable)"
                            }
                          },
                          "id": 37,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1154:12:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1134:32:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 41,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 39,
                            "name": "_owner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10,
                            "src": "1176:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 40,
                            "name": "msgSender",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 35,
                            "src": "1185:9:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "1176:18:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 42,
                        "nodeType": "ExpressionStatement",
                        "src": "1176:18:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 46,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "1238:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 45,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "1230:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 44,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "1230:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 47,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1230:10:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 48,
                              "name": "msgSender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 35,
                              "src": "1242:9:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 43,
                            "name": "OwnershipTransferred",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 16,
                            "src": "1209:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                              "typeString": "function (address,address)"
                            }
                          },
                          "id": 49,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1209:43:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 50,
                        "nodeType": "EmitStatement",
                        "src": "1204:48:0"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 52,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 32,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 31,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "1112:11:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "1112:11:0"
                    }
                  ],
                  "name": "__Ownable_init_unchained",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 30,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1100:2:0"
                  },
                  "returnParameters": {
                    "id": 33,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1124:0:0"
                  },
                  "scope": 130,
                  "src": "1067:192:0",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 60,
                    "nodeType": "Block",
                    "src": "1390:30:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 58,
                          "name": "_owner",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10,
                          "src": "1407:6:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "functionReturnParameters": 57,
                        "id": 59,
                        "nodeType": "Return",
                        "src": "1400:13:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 53,
                    "nodeType": "StructuredDocumentation",
                    "src": "1265:65:0",
                    "text": " @dev Returns the address of the current owner."
                  },
                  "functionSelector": "8da5cb5b",
                  "id": 61,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "owner",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 54,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1349:2:0"
                  },
                  "returnParameters": {
                    "id": 57,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 56,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 61,
                        "src": "1381:7:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 55,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1381:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1380:9:0"
                  },
                  "scope": 130,
                  "src": "1335:85:0",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 74,
                    "nodeType": "Block",
                    "src": "1529:96:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 69,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "id": 65,
                                  "name": "owner",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 61,
                                  "src": "1547:5:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                                    "typeString": "function () view returns (address)"
                                  }
                                },
                                "id": 66,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "1547:7:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "id": 67,
                                  "name": "_msgSender",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3611,
                                  "src": "1558:10:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                    "typeString": "function () view returns (address payable)"
                                  }
                                },
                                "id": 68,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "1558:12:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "1547:23:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572",
                              "id": 70,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1572:34:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe",
                                "typeString": "literal_string \"Ownable: caller is not the owner\""
                              },
                              "value": "Ownable: caller is not the owner"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe",
                                "typeString": "literal_string \"Ownable: caller is not the owner\""
                              }
                            ],
                            "id": 64,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1539:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 71,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1539:68:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 72,
                        "nodeType": "ExpressionStatement",
                        "src": "1539:68:0"
                      },
                      {
                        "id": 73,
                        "nodeType": "PlaceholderStatement",
                        "src": "1617:1:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 62,
                    "nodeType": "StructuredDocumentation",
                    "src": "1426:77:0",
                    "text": " @dev Throws if called by any account other than the owner."
                  },
                  "id": 75,
                  "name": "onlyOwner",
                  "nodeType": "ModifierDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 63,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1526:2:0"
                  },
                  "src": "1508:117:0",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 96,
                    "nodeType": "Block",
                    "src": "2021:91:0",
                    "statements": [
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 82,
                              "name": "_owner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10,
                              "src": "2057:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 85,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "2073:1:0",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 84,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "2065:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 83,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "2065:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 86,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2065:10:0",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "id": 81,
                            "name": "OwnershipTransferred",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 16,
                            "src": "2036:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                              "typeString": "function (address,address)"
                            }
                          },
                          "id": 87,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2036:40:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 88,
                        "nodeType": "EmitStatement",
                        "src": "2031:45:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 94,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 89,
                            "name": "_owner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10,
                            "src": "2086:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 92,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "2103:1:0",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                }
                              ],
                              "id": 91,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "2095:7:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 90,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "2095:7:0",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 93,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "2095:10:0",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "src": "2086:19:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 95,
                        "nodeType": "ExpressionStatement",
                        "src": "2086:19:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 76,
                    "nodeType": "StructuredDocumentation",
                    "src": "1631:331:0",
                    "text": " @dev Leaves the contract without owner. It will not be possible to call\n `onlyOwner` functions anymore. Can only be called by the current owner.\n NOTE: Renouncing ownership will leave the contract without an owner,\n thereby removing any functionality that is only available to the owner."
                  },
                  "functionSelector": "715018a6",
                  "id": 97,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 79,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 78,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "2011:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "2011:9:0"
                    }
                  ],
                  "name": "renounceOwnership",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 77,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1993:2:0"
                  },
                  "returnParameters": {
                    "id": 80,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2021:0:0"
                  },
                  "scope": 130,
                  "src": "1967:145:0",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 124,
                    "nodeType": "Block",
                    "src": "2331:170:0",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 111,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 106,
                                "name": "newOwner",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 100,
                                "src": "2349:8:0",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 109,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "2369:1:0",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 108,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "2361:7:0",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 107,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2361:7:0",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 110,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "2361:10:0",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "2349:22:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373",
                              "id": 112,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2373:40:0",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe",
                                "typeString": "literal_string \"Ownable: new owner is the zero address\""
                              },
                              "value": "Ownable: new owner is the zero address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe",
                                "typeString": "literal_string \"Ownable: new owner is the zero address\""
                              }
                            ],
                            "id": 105,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2341:7:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 113,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2341:73:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 114,
                        "nodeType": "ExpressionStatement",
                        "src": "2341:73:0"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 116,
                              "name": "_owner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10,
                              "src": "2450:6:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 117,
                              "name": "newOwner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 100,
                              "src": "2458:8:0",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 115,
                            "name": "OwnershipTransferred",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 16,
                            "src": "2429:20:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                              "typeString": "function (address,address)"
                            }
                          },
                          "id": 118,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2429:38:0",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 119,
                        "nodeType": "EmitStatement",
                        "src": "2424:43:0"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 122,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 120,
                            "name": "_owner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10,
                            "src": "2477:6:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 121,
                            "name": "newOwner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 100,
                            "src": "2486:8:0",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "2477:17:0",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 123,
                        "nodeType": "ExpressionStatement",
                        "src": "2477:17:0"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 98,
                    "nodeType": "StructuredDocumentation",
                    "src": "2118:138:0",
                    "text": " @dev Transfers ownership of the contract to a new account (`newOwner`).\n Can only be called by the current owner."
                  },
                  "functionSelector": "f2fde38b",
                  "id": 125,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 103,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 102,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "2321:9:0",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "2321:9:0"
                    }
                  ],
                  "name": "transferOwnership",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 101,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 100,
                        "mutability": "mutable",
                        "name": "newOwner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 125,
                        "src": "2288:16:0",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 99,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2288:7:0",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2287:18:0"
                  },
                  "returnParameters": {
                    "id": 104,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2331:0:0"
                  },
                  "scope": 130,
                  "src": "2261:240:0",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "id": 129,
                  "mutability": "mutable",
                  "name": "__gap",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 130,
                  "src": "2506:25:0",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$49_storage",
                    "typeString": "uint256[49]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 126,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "2506:7:0",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 128,
                    "length": {
                      "argumentTypes": null,
                      "hexValue": "3439",
                      "id": 127,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "2514:2:0",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_49_by_1",
                        "typeString": "int_const 49"
                      },
                      "value": "49"
                    },
                    "nodeType": "ArrayTypeName",
                    "src": "2506:11:0",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$49_storage_ptr",
                      "typeString": "uint256[49]"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                }
              ],
              "scope": 131,
              "src": "640:1894:0"
            }
          ],
          "src": "33:2502:0"
        },
        "id": 0
      },
      "@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol",
          "exportedSymbols": {
            "ECDSAUpgradeable": [
              246
            ]
          },
          "id": 247,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 132,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:1"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 133,
                "nodeType": "StructuredDocumentation",
                "src": "66:205:1",
                "text": " @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n These functions can be used to verify that a message was signed by the holder\n of the private keys of a given address."
              },
              "fullyImplemented": true,
              "id": 246,
              "linearizedBaseContracts": [
                246
              ],
              "name": "ECDSAUpgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 170,
                    "nodeType": "Block",
                    "src": "1170:653:1",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 146,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 143,
                              "name": "signature",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 138,
                              "src": "1222:9:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            "id": 144,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "1222:16:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "3635",
                            "id": 145,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1242:2:1",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_65_by_1",
                              "typeString": "int_const 65"
                            },
                            "value": "65"
                          },
                          "src": "1222:22:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 152,
                        "nodeType": "IfStatement",
                        "src": "1218:94:1",
                        "trueBody": {
                          "id": 151,
                          "nodeType": "Block",
                          "src": "1246:66:1",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "45434453413a20696e76616c6964207369676e6174757265206c656e677468",
                                    "id": 148,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "1267:33:1",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77",
                                      "typeString": "literal_string \"ECDSA: invalid signature length\""
                                    },
                                    "value": "ECDSA: invalid signature length"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77",
                                      "typeString": "literal_string \"ECDSA: invalid signature length\""
                                    }
                                  ],
                                  "id": 147,
                                  "name": "revert",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -19,
                                    -19
                                  ],
                                  "referencedDeclaration": -19,
                                  "src": "1260:6:1",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (string memory) pure"
                                  }
                                },
                                "id": 149,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "1260:41:1",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 150,
                              "nodeType": "ExpressionStatement",
                              "src": "1260:41:1"
                            }
                          ]
                        }
                      },
                      {
                        "assignments": [
                          154
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 154,
                            "mutability": "mutable",
                            "name": "r",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 170,
                            "src": "1378:9:1",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            "typeName": {
                              "id": 153,
                              "name": "bytes32",
                              "nodeType": "ElementaryTypeName",
                              "src": "1378:7:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 155,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1378:9:1"
                      },
                      {
                        "assignments": [
                          157
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 157,
                            "mutability": "mutable",
                            "name": "s",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 170,
                            "src": "1397:9:1",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            "typeName": {
                              "id": 156,
                              "name": "bytes32",
                              "nodeType": "ElementaryTypeName",
                              "src": "1397:7:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 158,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1397:9:1"
                      },
                      {
                        "assignments": [
                          160
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 160,
                            "mutability": "mutable",
                            "name": "v",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 170,
                            "src": "1416:7:1",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            },
                            "typeName": {
                              "id": 159,
                              "name": "uint8",
                              "nodeType": "ElementaryTypeName",
                              "src": "1416:5:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 161,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1416:7:1"
                      },
                      {
                        "AST": {
                          "nodeType": "YulBlock",
                          "src": "1622:155:1",
                          "statements": [
                            {
                              "nodeType": "YulAssignment",
                              "src": "1636:32:1",
                              "value": {
                                "arguments": [
                                  {
                                    "arguments": [
                                      {
                                        "name": "signature",
                                        "nodeType": "YulIdentifier",
                                        "src": "1651:9:1"
                                      },
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "1662:4:1",
                                        "type": "",
                                        "value": "0x20"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "add",
                                      "nodeType": "YulIdentifier",
                                      "src": "1647:3:1"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "1647:20:1"
                                  }
                                ],
                                "functionName": {
                                  "name": "mload",
                                  "nodeType": "YulIdentifier",
                                  "src": "1641:5:1"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "1641:27:1"
                              },
                              "variableNames": [
                                {
                                  "name": "r",
                                  "nodeType": "YulIdentifier",
                                  "src": "1636:1:1"
                                }
                              ]
                            },
                            {
                              "nodeType": "YulAssignment",
                              "src": "1681:32:1",
                              "value": {
                                "arguments": [
                                  {
                                    "arguments": [
                                      {
                                        "name": "signature",
                                        "nodeType": "YulIdentifier",
                                        "src": "1696:9:1"
                                      },
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "1707:4:1",
                                        "type": "",
                                        "value": "0x40"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "add",
                                      "nodeType": "YulIdentifier",
                                      "src": "1692:3:1"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "1692:20:1"
                                  }
                                ],
                                "functionName": {
                                  "name": "mload",
                                  "nodeType": "YulIdentifier",
                                  "src": "1686:5:1"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "1686:27:1"
                              },
                              "variableNames": [
                                {
                                  "name": "s",
                                  "nodeType": "YulIdentifier",
                                  "src": "1681:1:1"
                                }
                              ]
                            },
                            {
                              "nodeType": "YulAssignment",
                              "src": "1726:41:1",
                              "value": {
                                "arguments": [
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "1736:1:1",
                                    "type": "",
                                    "value": "0"
                                  },
                                  {
                                    "arguments": [
                                      {
                                        "arguments": [
                                          {
                                            "name": "signature",
                                            "nodeType": "YulIdentifier",
                                            "src": "1749:9:1"
                                          },
                                          {
                                            "kind": "number",
                                            "nodeType": "YulLiteral",
                                            "src": "1760:4:1",
                                            "type": "",
                                            "value": "0x60"
                                          }
                                        ],
                                        "functionName": {
                                          "name": "add",
                                          "nodeType": "YulIdentifier",
                                          "src": "1745:3:1"
                                        },
                                        "nodeType": "YulFunctionCall",
                                        "src": "1745:20:1"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "mload",
                                      "nodeType": "YulIdentifier",
                                      "src": "1739:5:1"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "1739:27:1"
                                  }
                                ],
                                "functionName": {
                                  "name": "byte",
                                  "nodeType": "YulIdentifier",
                                  "src": "1731:4:1"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "1731:36:1"
                              },
                              "variableNames": [
                                {
                                  "name": "v",
                                  "nodeType": "YulIdentifier",
                                  "src": "1726:1:1"
                                }
                              ]
                            }
                          ]
                        },
                        "evmVersion": "istanbul",
                        "externalReferences": [
                          {
                            "declaration": 154,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "1636:1:1",
                            "valueSize": 1
                          },
                          {
                            "declaration": 157,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "1681:1:1",
                            "valueSize": 1
                          },
                          {
                            "declaration": 138,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "1651:9:1",
                            "valueSize": 1
                          },
                          {
                            "declaration": 138,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "1696:9:1",
                            "valueSize": 1
                          },
                          {
                            "declaration": 138,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "1749:9:1",
                            "valueSize": 1
                          },
                          {
                            "declaration": 160,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "1726:1:1",
                            "valueSize": 1
                          }
                        ],
                        "id": 162,
                        "nodeType": "InlineAssembly",
                        "src": "1613:164:1"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 164,
                              "name": "hash",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 136,
                              "src": "1802:4:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 165,
                              "name": "v",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 160,
                              "src": "1808:1:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 166,
                              "name": "r",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 154,
                              "src": "1811:1:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 167,
                              "name": "s",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 157,
                              "src": "1814:1:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "id": 163,
                            "name": "recover",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              171,
                              228
                            ],
                            "referencedDeclaration": 228,
                            "src": "1794:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$",
                              "typeString": "function (bytes32,uint8,bytes32,bytes32) pure returns (address)"
                            }
                          },
                          "id": 168,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1794:22:1",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "functionReturnParameters": 142,
                        "id": 169,
                        "nodeType": "Return",
                        "src": "1787:29:1"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 134,
                    "nodeType": "StructuredDocumentation",
                    "src": "303:775:1",
                    "text": " @dev Returns the address that signed a hashed message (`hash`) with\n `signature`. This address can then be used for verification purposes.\n The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n this function rejects them by requiring the `s` value to be in the lower\n half order, and the `v` value to be either 27 or 28.\n IMPORTANT: `hash` _must_ be the result of a hash operation for the\n verification to be secure: it is possible to craft signatures that\n recover to arbitrary addresses for non-hashed data. A safe way to ensure\n this is by receiving a hash of the original message (which may otherwise\n be too long), and then calling {toEthSignedMessageHash} on it."
                  },
                  "id": 171,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "recover",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 139,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 136,
                        "mutability": "mutable",
                        "name": "hash",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 171,
                        "src": "1100:12:1",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 135,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "1100:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 138,
                        "mutability": "mutable",
                        "name": "signature",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 171,
                        "src": "1114:22:1",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 137,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "1114:5:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1099:38:1"
                  },
                  "returnParameters": {
                    "id": 142,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 141,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 171,
                        "src": "1161:7:1",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 140,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1161:7:1",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1160:9:1"
                  },
                  "scope": 246,
                  "src": "1083:740:1",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 227,
                    "nodeType": "Block",
                    "src": "2065:1320:1",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 191,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 188,
                                    "name": "s",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 180,
                                    "src": "2965:1:1",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  ],
                                  "id": 187,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "2957:7:1",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_uint256_$",
                                    "typeString": "type(uint256)"
                                  },
                                  "typeName": {
                                    "id": 186,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2957:7:1",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 189,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "2957:10:1",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "307837464646464646464646464646464646464646464646464646464646464646463544353736453733353741343530314444464539324634363638314232304130",
                                "id": 190,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "2971:66:1",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_57896044618658097711785492504343953926418782139537452191302581570759080747168_by_1",
                                  "typeString": "int_const 5789...(69 digits omitted)...7168"
                                },
                                "value": "0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0"
                              },
                              "src": "2957:80:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "45434453413a20696e76616c6964207369676e6174757265202773272076616c7565",
                              "id": 192,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3039:36:1",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd",
                                "typeString": "literal_string \"ECDSA: invalid signature 's' value\""
                              },
                              "value": "ECDSA: invalid signature 's' value"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd",
                                "typeString": "literal_string \"ECDSA: invalid signature 's' value\""
                              }
                            ],
                            "id": 185,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2949:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 193,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2949:127:1",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 194,
                        "nodeType": "ExpressionStatement",
                        "src": "2949:127:1"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 202,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint8",
                                  "typeString": "uint8"
                                },
                                "id": 198,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 196,
                                  "name": "v",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 176,
                                  "src": "3094:1:1",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint8",
                                    "typeString": "uint8"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "3237",
                                  "id": 197,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "3099:2:1",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_27_by_1",
                                    "typeString": "int_const 27"
                                  },
                                  "value": "27"
                                },
                                "src": "3094:7:1",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint8",
                                  "typeString": "uint8"
                                },
                                "id": 201,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 199,
                                  "name": "v",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 176,
                                  "src": "3105:1:1",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint8",
                                    "typeString": "uint8"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "3238",
                                  "id": 200,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "3110:2:1",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_28_by_1",
                                    "typeString": "int_const 28"
                                  },
                                  "value": "28"
                                },
                                "src": "3105:7:1",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "3094:18:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "45434453413a20696e76616c6964207369676e6174757265202776272076616c7565",
                              "id": 203,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3114:36:1",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_8522ee1b53216f595394db8e80a64d9e7d9bd512c0811c18debe9f40858597e4",
                                "typeString": "literal_string \"ECDSA: invalid signature 'v' value\""
                              },
                              "value": "ECDSA: invalid signature 'v' value"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_8522ee1b53216f595394db8e80a64d9e7d9bd512c0811c18debe9f40858597e4",
                                "typeString": "literal_string \"ECDSA: invalid signature 'v' value\""
                              }
                            ],
                            "id": 195,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "3086:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 204,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3086:65:1",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 205,
                        "nodeType": "ExpressionStatement",
                        "src": "3086:65:1"
                      },
                      {
                        "assignments": [
                          207
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 207,
                            "mutability": "mutable",
                            "name": "signer",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 227,
                            "src": "3246:14:1",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 206,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "3246:7:1",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 214,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 209,
                              "name": "hash",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 174,
                              "src": "3273:4:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 210,
                              "name": "v",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 176,
                              "src": "3279:1:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 211,
                              "name": "r",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 178,
                              "src": "3282:1:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 212,
                              "name": "s",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 180,
                              "src": "3285:1:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "id": 208,
                            "name": "ecrecover",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -6,
                            "src": "3263:9:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_ecrecover_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$",
                              "typeString": "function (bytes32,uint8,bytes32,bytes32) pure returns (address)"
                            }
                          },
                          "id": 213,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3263:24:1",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3246:41:1"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 221,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 216,
                                "name": "signer",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 207,
                                "src": "3305:6:1",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 219,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "3323:1:1",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 218,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "3315:7:1",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 217,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "3315:7:1",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 220,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "3315:10:1",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "3305:20:1",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "45434453413a20696e76616c6964207369676e6174757265",
                              "id": 222,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3327:26:1",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be",
                                "typeString": "literal_string \"ECDSA: invalid signature\""
                              },
                              "value": "ECDSA: invalid signature"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be",
                                "typeString": "literal_string \"ECDSA: invalid signature\""
                              }
                            ],
                            "id": 215,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "3297:7:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 223,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3297:57:1",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 224,
                        "nodeType": "ExpressionStatement",
                        "src": "3297:57:1"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 225,
                          "name": "signer",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 207,
                          "src": "3372:6:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "functionReturnParameters": 184,
                        "id": 226,
                        "nodeType": "Return",
                        "src": "3365:13:1"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 172,
                    "nodeType": "StructuredDocumentation",
                    "src": "1829:137:1",
                    "text": " @dev Overload of {ECDSA-recover-bytes32-bytes-} that receives the `v`,\n `r` and `s` signature fields separately."
                  },
                  "id": 228,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "recover",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 181,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 174,
                        "mutability": "mutable",
                        "name": "hash",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 228,
                        "src": "1988:12:1",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 173,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "1988:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 176,
                        "mutability": "mutable",
                        "name": "v",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 228,
                        "src": "2002:7:1",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 175,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "2002:5:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 178,
                        "mutability": "mutable",
                        "name": "r",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 228,
                        "src": "2011:9:1",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 177,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "2011:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 180,
                        "mutability": "mutable",
                        "name": "s",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 228,
                        "src": "2022:9:1",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 179,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "2022:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1987:45:1"
                  },
                  "returnParameters": {
                    "id": 184,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 183,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 228,
                        "src": "2056:7:1",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 182,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2056:7:1",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2055:9:1"
                  },
                  "scope": 246,
                  "src": "1971:1414:1",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 244,
                    "nodeType": "Block",
                    "src": "3727:187:1",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "19457468657265756d205369676e6564204d6573736167653a0a3332",
                                  "id": 239,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "3865:34:1",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73",
                                    "typeString": "literal_string \"\u0019Ethereum Signed Message:\n32\""
                                  },
                                  "value": "\u0019Ethereum Signed Message:\n32"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 240,
                                  "name": "hash",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 231,
                                  "src": "3901:4:1",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73",
                                    "typeString": "literal_string \"\u0019Ethereum Signed Message:\n32\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 237,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "3848:3:1",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 238,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodePacked",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "3848:16:1",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function () pure returns (bytes memory)"
                                }
                              },
                              "id": 241,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3848:58:1",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 236,
                            "name": "keccak256",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -8,
                            "src": "3838:9:1",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                              "typeString": "function (bytes memory) pure returns (bytes32)"
                            }
                          },
                          "id": 242,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3838:69:1",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "functionReturnParameters": 235,
                        "id": 243,
                        "nodeType": "Return",
                        "src": "3831:76:1"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 229,
                    "nodeType": "StructuredDocumentation",
                    "src": "3391:253:1",
                    "text": " @dev Returns an Ethereum Signed Message, created from a `hash`. This\n replicates the behavior of the\n https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]\n JSON-RPC method.\n See {recover}."
                  },
                  "id": 245,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toEthSignedMessageHash",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 232,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 231,
                        "mutability": "mutable",
                        "name": "hash",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 245,
                        "src": "3681:12:1",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 230,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "3681:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3680:14:1"
                  },
                  "returnParameters": {
                    "id": 235,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 234,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 245,
                        "src": "3718:7:1",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 233,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "3718:7:1",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3717:9:1"
                  },
                  "scope": 246,
                  "src": "3649:265:1",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 247,
              "src": "272:3644:1"
            }
          ],
          "src": "33:3884:1"
        },
        "id": 1
      },
      "@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol",
          "exportedSymbols": {
            "EIP712Upgradeable": [
              406
            ]
          },
          "id": 407,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 248,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:2"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol",
              "file": "../proxy/Initializable.sol",
              "id": 249,
              "nodeType": "ImportDirective",
              "scope": 407,
              "sourceUnit": 1353,
              "src": "65:36:2",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": true,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 251,
                    "name": "Initializable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1352,
                    "src": "1285:13:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Initializable_$1352",
                      "typeString": "contract Initializable"
                    }
                  },
                  "id": 252,
                  "nodeType": "InheritanceSpecifier",
                  "src": "1285:13:2"
                }
              ],
              "contractDependencies": [
                1352
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 250,
                "nodeType": "StructuredDocumentation",
                "src": "103:1142:2",
                "text": " @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n they need in their contracts using a combination of `abi.encode` and `keccak256`.\n This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n ({_hashTypedDataV4}).\n The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n the chain id to protect against replay attacks on an eventual fork of the chain.\n NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n _Available since v3.4._"
              },
              "fullyImplemented": true,
              "id": 406,
              "linearizedBaseContracts": [
                406,
                1352
              ],
              "name": "EIP712Upgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "id": 254,
                  "mutability": "mutable",
                  "name": "_HASHED_NAME",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 406,
                  "src": "1350:28:2",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 253,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1350:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 256,
                  "mutability": "mutable",
                  "name": "_HASHED_VERSION",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 406,
                  "src": "1384:31:2",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 255,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1384:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 261,
                  "mutability": "constant",
                  "name": "_TYPE_HASH",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 406,
                  "src": "1421:133:2",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 257,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1421:7:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "hexValue": "454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429",
                        "id": 259,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1469:84:2",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f",
                          "typeString": "literal_string \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\""
                        },
                        "value": "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_stringliteral_8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f",
                          "typeString": "literal_string \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\""
                        }
                      ],
                      "id": 258,
                      "name": "keccak256",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": -8,
                      "src": "1459:9:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                        "typeString": "function (bytes memory) pure returns (bytes32)"
                      }
                    },
                    "id": 260,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1459:95:2",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 276,
                    "nodeType": "Block",
                    "src": "2256:55:2",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 272,
                              "name": "name",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 264,
                              "src": "2290:4:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 273,
                              "name": "version",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 266,
                              "src": "2296:7:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 271,
                            "name": "__EIP712_init_unchained",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 313,
                            "src": "2266:23:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (string memory,string memory)"
                            }
                          },
                          "id": 274,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2266:38:2",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 275,
                        "nodeType": "ExpressionStatement",
                        "src": "2266:38:2"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 262,
                    "nodeType": "StructuredDocumentation",
                    "src": "1605:559:2",
                    "text": " @dev Initializes the domain separator and parameter caches.\n The meaning of `name` and `version` is specified in\n https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n - `version`: the current major version of the signing domain.\n NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n contract upgrade]."
                  },
                  "id": 277,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 269,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 268,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "2244:11:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "2244:11:2"
                    }
                  ],
                  "name": "__EIP712_init",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 267,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 264,
                        "mutability": "mutable",
                        "name": "name",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 277,
                        "src": "2192:18:2",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 263,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "2192:6:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 266,
                        "mutability": "mutable",
                        "name": "version",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 277,
                        "src": "2212:21:2",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 265,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "2212:6:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2191:43:2"
                  },
                  "returnParameters": {
                    "id": 270,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2256:0:2"
                  },
                  "scope": 406,
                  "src": "2169:142:2",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 312,
                    "nodeType": "Block",
                    "src": "2414:195:2",
                    "statements": [
                      {
                        "assignments": [
                          287
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 287,
                            "mutability": "mutable",
                            "name": "hashedName",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 312,
                            "src": "2424:18:2",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            "typeName": {
                              "id": 286,
                              "name": "bytes32",
                              "nodeType": "ElementaryTypeName",
                              "src": "2424:7:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 294,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 291,
                                  "name": "name",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 279,
                                  "src": "2461:4:2",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "id": 290,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "2455:5:2",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                                  "typeString": "type(bytes storage pointer)"
                                },
                                "typeName": {
                                  "id": 289,
                                  "name": "bytes",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "2455:5:2",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 292,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2455:11:2",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 288,
                            "name": "keccak256",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -8,
                            "src": "2445:9:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                              "typeString": "function (bytes memory) pure returns (bytes32)"
                            }
                          },
                          "id": 293,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2445:22:2",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2424:43:2"
                      },
                      {
                        "assignments": [
                          296
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 296,
                            "mutability": "mutable",
                            "name": "hashedVersion",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 312,
                            "src": "2477:21:2",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            "typeName": {
                              "id": 295,
                              "name": "bytes32",
                              "nodeType": "ElementaryTypeName",
                              "src": "2477:7:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 303,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 300,
                                  "name": "version",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 281,
                                  "src": "2517:7:2",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "id": 299,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "2511:5:2",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                                  "typeString": "type(bytes storage pointer)"
                                },
                                "typeName": {
                                  "id": 298,
                                  "name": "bytes",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "2511:5:2",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 301,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2511:14:2",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 297,
                            "name": "keccak256",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -8,
                            "src": "2501:9:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                              "typeString": "function (bytes memory) pure returns (bytes32)"
                            }
                          },
                          "id": 302,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2501:25:2",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2477:49:2"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 306,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 304,
                            "name": "_HASHED_NAME",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 254,
                            "src": "2536:12:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 305,
                            "name": "hashedName",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 287,
                            "src": "2551:10:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "src": "2536:25:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "id": 307,
                        "nodeType": "ExpressionStatement",
                        "src": "2536:25:2"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 310,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 308,
                            "name": "_HASHED_VERSION",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 256,
                            "src": "2571:15:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 309,
                            "name": "hashedVersion",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 296,
                            "src": "2589:13:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "src": "2571:31:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "id": 311,
                        "nodeType": "ExpressionStatement",
                        "src": "2571:31:2"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 313,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 284,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 283,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "2402:11:2",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "2402:11:2"
                    }
                  ],
                  "name": "__EIP712_init_unchained",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 282,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 279,
                        "mutability": "mutable",
                        "name": "name",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 313,
                        "src": "2350:18:2",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 278,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "2350:6:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 281,
                        "mutability": "mutable",
                        "name": "version",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 313,
                        "src": "2370:21:2",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 280,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "2370:6:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2349:43:2"
                  },
                  "returnParameters": {
                    "id": 285,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2414:0:2"
                  },
                  "scope": 406,
                  "src": "2317:292:2",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 327,
                    "nodeType": "Block",
                    "src": "2757:98:2",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 320,
                              "name": "_TYPE_HASH",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 261,
                              "src": "2796:10:2",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 321,
                                "name": "_EIP712NameHash",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 392,
                                "src": "2808:15:2",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_bytes32_$",
                                  "typeString": "function () view returns (bytes32)"
                                }
                              },
                              "id": 322,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2808:17:2",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 323,
                                "name": "_EIP712VersionHash",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 401,
                                "src": "2827:18:2",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_bytes32_$",
                                  "typeString": "function () view returns (bytes32)"
                                }
                              },
                              "id": 324,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2827:20:2",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "id": 319,
                            "name": "_buildDomainSeparator",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 355,
                            "src": "2774:21:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$",
                              "typeString": "function (bytes32,bytes32,bytes32) view returns (bytes32)"
                            }
                          },
                          "id": 325,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2774:74:2",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "functionReturnParameters": 318,
                        "id": 326,
                        "nodeType": "Return",
                        "src": "2767:81:2"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 314,
                    "nodeType": "StructuredDocumentation",
                    "src": "2615:75:2",
                    "text": " @dev Returns the domain separator for the current chain."
                  },
                  "id": 328,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_domainSeparatorV4",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 315,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2722:2:2"
                  },
                  "returnParameters": {
                    "id": 318,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 317,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 328,
                        "src": "2748:7:2",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 316,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "2748:7:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2747:9:2"
                  },
                  "scope": 406,
                  "src": "2695:160:2",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 354,
                    "nodeType": "Block",
                    "src": "2972:216:2",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 342,
                                  "name": "typeHash",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 330,
                                  "src": "3040:8:2",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 343,
                                  "name": "name",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 332,
                                  "src": "3066:4:2",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 344,
                                  "name": "version",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 334,
                                  "src": "3088:7:2",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "id": 345,
                                    "name": "_getChainId",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 383,
                                    "src": "3113:11:2",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                      "typeString": "function () view returns (uint256)"
                                    }
                                  },
                                  "id": 346,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "3113:13:2",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 349,
                                      "name": "this",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -28,
                                      "src": "3152:4:2",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_EIP712Upgradeable_$406",
                                        "typeString": "contract EIP712Upgradeable"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_EIP712Upgradeable_$406",
                                        "typeString": "contract EIP712Upgradeable"
                                      }
                                    ],
                                    "id": 348,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "3144:7:2",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 347,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "3144:7:2",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 350,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "3144:13:2",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 340,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "3012:3:2",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 341,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encode",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "3012:10:2",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function () pure returns (bytes memory)"
                                }
                              },
                              "id": 351,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3012:159:2",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 339,
                            "name": "keccak256",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -8,
                            "src": "2989:9:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                              "typeString": "function (bytes memory) pure returns (bytes32)"
                            }
                          },
                          "id": 352,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2989:192:2",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "functionReturnParameters": 338,
                        "id": 353,
                        "nodeType": "Return",
                        "src": "2982:199:2"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 355,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_buildDomainSeparator",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 335,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 330,
                        "mutability": "mutable",
                        "name": "typeHash",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 355,
                        "src": "2892:16:2",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 329,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "2892:7:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 332,
                        "mutability": "mutable",
                        "name": "name",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 355,
                        "src": "2910:12:2",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 331,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "2910:7:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 334,
                        "mutability": "mutable",
                        "name": "version",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 355,
                        "src": "2924:15:2",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 333,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "2924:7:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2891:49:2"
                  },
                  "returnParameters": {
                    "id": 338,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 337,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 355,
                        "src": "2963:7:2",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 336,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "2963:7:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2962:9:2"
                  },
                  "scope": 406,
                  "src": "2861:327:2",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 373,
                    "nodeType": "Block",
                    "src": "3899:97:2",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "1901",
                                  "id": 366,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "3943:10:2",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541",
                                    "typeString": "literal_string \"\u0019\u0001\""
                                  },
                                  "value": "\u0019\u0001"
                                },
                                {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "id": 367,
                                    "name": "_domainSeparatorV4",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 328,
                                    "src": "3955:18:2",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_view$__$returns$_t_bytes32_$",
                                      "typeString": "function () view returns (bytes32)"
                                    }
                                  },
                                  "id": 368,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "3955:20:2",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 369,
                                  "name": "structHash",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 358,
                                  "src": "3977:10:2",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541",
                                    "typeString": "literal_string \"\u0019\u0001\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 364,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "3926:3:2",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 365,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodePacked",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "3926:16:2",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function () pure returns (bytes memory)"
                                }
                              },
                              "id": 370,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3926:62:2",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 363,
                            "name": "keccak256",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -8,
                            "src": "3916:9:2",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                              "typeString": "function (bytes memory) pure returns (bytes32)"
                            }
                          },
                          "id": 371,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3916:73:2",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "functionReturnParameters": 362,
                        "id": 372,
                        "nodeType": "Return",
                        "src": "3909:80:2"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 356,
                    "nodeType": "StructuredDocumentation",
                    "src": "3194:614:2",
                    "text": " @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n function returns the hash of the fully encoded EIP712 message for this domain.\n This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n ```solidity\n bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n     keccak256(\"Mail(address to,string contents)\"),\n     mailTo,\n     keccak256(bytes(mailContents))\n )));\n address signer = ECDSA.recover(digest, signature);\n ```"
                  },
                  "id": 374,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_hashTypedDataV4",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 359,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 358,
                        "mutability": "mutable",
                        "name": "structHash",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 374,
                        "src": "3839:18:2",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 357,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "3839:7:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3838:20:2"
                  },
                  "returnParameters": {
                    "id": 362,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 361,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 374,
                        "src": "3890:7:2",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 360,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "3890:7:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3889:9:2"
                  },
                  "scope": 406,
                  "src": "3813:183:2",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 382,
                    "nodeType": "Block",
                    "src": "4064:258:2",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 379,
                          "name": "this",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -28,
                          "src": "4074:4:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_EIP712Upgradeable_$406",
                            "typeString": "contract EIP712Upgradeable"
                          }
                        },
                        "id": 380,
                        "nodeType": "ExpressionStatement",
                        "src": "4074:4:2"
                      },
                      {
                        "AST": {
                          "nodeType": "YulBlock",
                          "src": "4272:44:2",
                          "statements": [
                            {
                              "nodeType": "YulAssignment",
                              "src": "4286:20:2",
                              "value": {
                                "arguments": [],
                                "functionName": {
                                  "name": "chainid",
                                  "nodeType": "YulIdentifier",
                                  "src": "4297:7:2"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "4297:9:2"
                              },
                              "variableNames": [
                                {
                                  "name": "chainId",
                                  "nodeType": "YulIdentifier",
                                  "src": "4286:7:2"
                                }
                              ]
                            }
                          ]
                        },
                        "evmVersion": "istanbul",
                        "externalReferences": [
                          {
                            "declaration": 377,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "4286:7:2",
                            "valueSize": 1
                          }
                        ],
                        "id": 381,
                        "nodeType": "InlineAssembly",
                        "src": "4263:53:2"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 383,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_getChainId",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 375,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4022:2:2"
                  },
                  "returnParameters": {
                    "id": 378,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 377,
                        "mutability": "mutable",
                        "name": "chainId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 383,
                        "src": "4047:15:2",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 376,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4047:7:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4046:17:2"
                  },
                  "scope": 406,
                  "src": "4002:320:2",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 391,
                    "nodeType": "Block",
                    "src": "4625:36:2",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 389,
                          "name": "_HASHED_NAME",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 254,
                          "src": "4642:12:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "functionReturnParameters": 388,
                        "id": 390,
                        "nodeType": "Return",
                        "src": "4635:19:2"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 384,
                    "nodeType": "StructuredDocumentation",
                    "src": "4328:225:2",
                    "text": " @dev The hash of the name parameter for the EIP712 domain.\n NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n are a concern."
                  },
                  "id": 392,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_EIP712NameHash",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 385,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4582:2:2"
                  },
                  "returnParameters": {
                    "id": 388,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 387,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 392,
                        "src": "4616:7:2",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 386,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "4616:7:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4615:9:2"
                  },
                  "scope": 406,
                  "src": "4558:103:2",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 400,
                    "nodeType": "Block",
                    "src": "4970:39:2",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 398,
                          "name": "_HASHED_VERSION",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 256,
                          "src": "4987:15:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "functionReturnParameters": 397,
                        "id": 399,
                        "nodeType": "Return",
                        "src": "4980:22:2"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 393,
                    "nodeType": "StructuredDocumentation",
                    "src": "4667:228:2",
                    "text": " @dev The hash of the version parameter for the EIP712 domain.\n NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs\n are a concern."
                  },
                  "id": 401,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_EIP712VersionHash",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 394,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4927:2:2"
                  },
                  "returnParameters": {
                    "id": 397,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 396,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 401,
                        "src": "4961:7:2",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 395,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "4961:7:2",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4960:9:2"
                  },
                  "scope": 406,
                  "src": "4900:109:2",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 405,
                  "mutability": "mutable",
                  "name": "__gap",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 406,
                  "src": "5014:25:2",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$50_storage",
                    "typeString": "uint256[50]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 402,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "5014:7:2",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 404,
                    "length": {
                      "argumentTypes": null,
                      "hexValue": "3530",
                      "id": 403,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "5022:2:2",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_50_by_1",
                        "typeString": "int_const 50"
                      },
                      "value": "50"
                    },
                    "nodeType": "ArrayTypeName",
                    "src": "5014:11:2",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$50_storage_ptr",
                      "typeString": "uint256[50]"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                }
              ],
              "scope": 407,
              "src": "1246:3796:2"
            }
          ],
          "src": "33:5010:2"
        },
        "id": 2
      },
      "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol",
          "exportedSymbols": {
            "ERC20PermitUpgradeable": [
              580
            ]
          },
          "id": 581,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 408,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".5",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:3"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol",
              "file": "../token/ERC20/ERC20Upgradeable.sol",
              "id": 409,
              "nodeType": "ImportDirective",
              "scope": 581,
              "sourceUnit": 1883,
              "src": "66:45:3",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol",
              "file": "./IERC20PermitUpgradeable.sol",
              "id": 410,
              "nodeType": "ImportDirective",
              "scope": 581,
              "sourceUnit": 617,
              "src": "112:39:3",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/cryptography/ECDSAUpgradeable.sol",
              "file": "../cryptography/ECDSAUpgradeable.sol",
              "id": 411,
              "nodeType": "ImportDirective",
              "scope": 581,
              "sourceUnit": 247,
              "src": "152:46:3",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol",
              "file": "../utils/CountersUpgradeable.sol",
              "id": 412,
              "nodeType": "ImportDirective",
              "scope": 581,
              "sourceUnit": 3678,
              "src": "199:42:3",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/drafts/EIP712Upgradeable.sol",
              "file": "./EIP712Upgradeable.sol",
              "id": 413,
              "nodeType": "ImportDirective",
              "scope": 581,
              "sourceUnit": 407,
              "src": "242:33:3",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol",
              "file": "../proxy/Initializable.sol",
              "id": 414,
              "nodeType": "ImportDirective",
              "scope": 581,
              "sourceUnit": 1353,
              "src": "276:36:3",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": true,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 416,
                    "name": "Initializable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1352,
                    "src": "876:13:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Initializable_$1352",
                      "typeString": "contract Initializable"
                    }
                  },
                  "id": 417,
                  "nodeType": "InheritanceSpecifier",
                  "src": "876:13:3"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 418,
                    "name": "ERC20Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1882,
                    "src": "891:16:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Upgradeable_$1882",
                      "typeString": "contract ERC20Upgradeable"
                    }
                  },
                  "id": 419,
                  "nodeType": "InheritanceSpecifier",
                  "src": "891:16:3"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 420,
                    "name": "IERC20PermitUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 616,
                    "src": "909:23:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20PermitUpgradeable_$616",
                      "typeString": "contract IERC20PermitUpgradeable"
                    }
                  },
                  "id": 421,
                  "nodeType": "InheritanceSpecifier",
                  "src": "909:23:3"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 422,
                    "name": "EIP712Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 406,
                    "src": "934:17:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_EIP712Upgradeable_$406",
                      "typeString": "contract EIP712Upgradeable"
                    }
                  },
                  "id": 423,
                  "nodeType": "InheritanceSpecifier",
                  "src": "934:17:3"
                }
              ],
              "contractDependencies": [
                406,
                616,
                1352,
                1882,
                1960,
                3627
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 415,
                "nodeType": "StructuredDocumentation",
                "src": "314:517:3",
                "text": " @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n need to send a transaction, and thus is not required to hold Ether at all.\n _Available since v3.4._"
              },
              "fullyImplemented": true,
              "id": 580,
              "linearizedBaseContracts": [
                580,
                406,
                616,
                1882,
                1960,
                3627,
                1352
              ],
              "name": "ERC20PermitUpgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 426,
                  "libraryName": {
                    "contractScope": null,
                    "id": 424,
                    "name": "CountersUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3677,
                    "src": "964:19:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_CountersUpgradeable_$3677",
                      "typeString": "library CountersUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "958:58:3",
                  "typeName": {
                    "contractScope": null,
                    "id": 425,
                    "name": "CountersUpgradeable.Counter",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3637,
                    "src": "988:27:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Counter_$3637_storage_ptr",
                      "typeString": "struct CountersUpgradeable.Counter"
                    }
                  }
                },
                {
                  "constant": false,
                  "id": 430,
                  "mutability": "mutable",
                  "name": "_nonces",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 580,
                  "src": "1022:64:3",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Counter_$3637_storage_$",
                    "typeString": "mapping(address => struct CountersUpgradeable.Counter)"
                  },
                  "typeName": {
                    "id": 429,
                    "keyType": {
                      "id": 427,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "1031:7:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "1022:48:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Counter_$3637_storage_$",
                      "typeString": "mapping(address => struct CountersUpgradeable.Counter)"
                    },
                    "valueType": {
                      "contractScope": null,
                      "id": 428,
                      "name": "CountersUpgradeable.Counter",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 3637,
                      "src": "1042:27:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Counter_$3637_storage_ptr",
                        "typeString": "struct CountersUpgradeable.Counter"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 432,
                  "mutability": "mutable",
                  "name": "_PERMIT_TYPEHASH",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 580,
                  "src": "1145:32:3",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 431,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "1145:7:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 452,
                    "nodeType": "Block",
                    "src": "1478:131:3",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 440,
                            "name": "__Context_init_unchained",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3602,
                            "src": "1488:24:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 441,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1488:26:3",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 442,
                        "nodeType": "ExpressionStatement",
                        "src": "1488:26:3"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 444,
                              "name": "name",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 435,
                              "src": "1548:4:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "31",
                              "id": 445,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1554:3:3",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6",
                                "typeString": "literal_string \"1\""
                              },
                              "value": "1"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6",
                                "typeString": "literal_string \"1\""
                              }
                            ],
                            "id": 443,
                            "name": "__EIP712_init_unchained",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 313,
                            "src": "1524:23:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (string memory,string memory)"
                            }
                          },
                          "id": 446,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1524:34:3",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 447,
                        "nodeType": "ExpressionStatement",
                        "src": "1524:34:3"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 449,
                              "name": "name",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 435,
                              "src": "1597:4:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 448,
                            "name": "__ERC20Permit_init_unchained",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 467,
                            "src": "1568:28:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (string memory)"
                            }
                          },
                          "id": 450,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1568:34:3",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 451,
                        "nodeType": "ExpressionStatement",
                        "src": "1568:34:3"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 433,
                    "nodeType": "StructuredDocumentation",
                    "src": "1184:220:3",
                    "text": " @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n It's a good idea to use the same `name` that is defined as the ERC20 token name."
                  },
                  "id": 453,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 438,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 437,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "1466:11:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "1466:11:3"
                    }
                  ],
                  "name": "__ERC20Permit_init",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 436,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 435,
                        "mutability": "mutable",
                        "name": "name",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 453,
                        "src": "1437:18:3",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 434,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "1437:6:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1436:20:3"
                  },
                  "returnParameters": {
                    "id": 439,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1478:0:3"
                  },
                  "scope": 580,
                  "src": "1409:200:3",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 466,
                    "nodeType": "Block",
                    "src": "1694:131:3",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 464,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 460,
                            "name": "_PERMIT_TYPEHASH",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 432,
                            "src": "1704:16:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "5065726d69742861646472657373206f776e65722c61646472657373207370656e6465722c75696e743235362076616c75652c75696e74323536206e6f6e63652c75696e7432353620646561646c696e6529",
                                "id": 462,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "string",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "1733:84:3",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_stringliteral_6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9",
                                  "typeString": "literal_string \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\""
                                },
                                "value": "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_stringliteral_6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9",
                                  "typeString": "literal_string \"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\""
                                }
                              ],
                              "id": 461,
                              "name": "keccak256",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -8,
                              "src": "1723:9:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                "typeString": "function (bytes memory) pure returns (bytes32)"
                              }
                            },
                            "id": 463,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1723:95:3",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "src": "1704:114:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "id": 465,
                        "nodeType": "ExpressionStatement",
                        "src": "1704:114:3"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 467,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 458,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 457,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "1682:11:3",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "1682:11:3"
                    }
                  ],
                  "name": "__ERC20Permit_init_unchained",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 456,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 455,
                        "mutability": "mutable",
                        "name": "name",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 467,
                        "src": "1653:18:3",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 454,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "1653:6:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1652:20:3"
                  },
                  "returnParameters": {
                    "id": 459,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1694:0:3"
                  },
                  "scope": 580,
                  "src": "1615:210:3",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    601
                  ],
                  "body": {
                    "id": 547,
                    "nodeType": "Block",
                    "src": "2022:669:3",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 490,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 487,
                                  "name": "block",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -4,
                                  "src": "2094:5:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_block",
                                    "typeString": "block"
                                  }
                                },
                                "id": 488,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "timestamp",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "2094:15:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 489,
                                "name": "deadline",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 476,
                                "src": "2113:8:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "2094:27:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "45524332305065726d69743a206578706972656420646561646c696e65",
                              "id": 491,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2123:31:3",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_3e89525a63fb9c966b61cf8f5305156de8420bc773a2b60828a2f32c3c5797bd",
                                "typeString": "literal_string \"ERC20Permit: expired deadline\""
                              },
                              "value": "ERC20Permit: expired deadline"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_3e89525a63fb9c966b61cf8f5305156de8420bc773a2b60828a2f32c3c5797bd",
                                "typeString": "literal_string \"ERC20Permit: expired deadline\""
                              }
                            ],
                            "id": 486,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2086:7:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 492,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2086:69:3",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 493,
                        "nodeType": "ExpressionStatement",
                        "src": "2086:69:3"
                      },
                      {
                        "assignments": [
                          495
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 495,
                            "mutability": "mutable",
                            "name": "structHash",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 547,
                            "src": "2166:18:3",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            "typeName": {
                              "id": 494,
                              "name": "bytes32",
                              "nodeType": "ElementaryTypeName",
                              "src": "2166:7:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 511,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 499,
                                  "name": "_PERMIT_TYPEHASH",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 432,
                                  "src": "2238:16:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 500,
                                  "name": "owner",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 470,
                                  "src": "2272:5:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 501,
                                  "name": "spender",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 472,
                                  "src": "2295:7:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 502,
                                  "name": "value",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 474,
                                  "src": "2320:5:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "expression": {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "id": 503,
                                        "name": "_nonces",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 430,
                                        "src": "2343:7:3",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Counter_$3637_storage_$",
                                          "typeString": "mapping(address => struct CountersUpgradeable.Counter storage ref)"
                                        }
                                      },
                                      "id": 505,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 504,
                                        "name": "owner",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 470,
                                        "src": "2351:5:3",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "2343:14:3",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Counter_$3637_storage",
                                        "typeString": "struct CountersUpgradeable.Counter storage ref"
                                      }
                                    },
                                    "id": 506,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "current",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 3648,
                                    "src": "2343:22:3",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_view$_t_struct$_Counter_$3637_storage_ptr_$returns$_t_uint256_$bound_to$_t_struct$_Counter_$3637_storage_ptr_$",
                                      "typeString": "function (struct CountersUpgradeable.Counter storage pointer) view returns (uint256)"
                                    }
                                  },
                                  "id": 507,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "2343:24:3",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 508,
                                  "name": "deadline",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 476,
                                  "src": "2385:8:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 497,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "2210:3:3",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 498,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encode",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "2210:10:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function () pure returns (bytes memory)"
                                }
                              },
                              "id": 509,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2210:197:3",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 496,
                            "name": "keccak256",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -8,
                            "src": "2187:9:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                              "typeString": "function (bytes memory) pure returns (bytes32)"
                            }
                          },
                          "id": 510,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2187:230:3",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2166:251:3"
                      },
                      {
                        "assignments": [
                          513
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 513,
                            "mutability": "mutable",
                            "name": "hash",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 547,
                            "src": "2428:12:3",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            "typeName": {
                              "id": 512,
                              "name": "bytes32",
                              "nodeType": "ElementaryTypeName",
                              "src": "2428:7:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 517,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 515,
                              "name": "structHash",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 495,
                              "src": "2460:10:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "id": 514,
                            "name": "_hashTypedDataV4",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 374,
                            "src": "2443:16:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$",
                              "typeString": "function (bytes32) view returns (bytes32)"
                            }
                          },
                          "id": 516,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2443:28:3",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2428:43:3"
                      },
                      {
                        "assignments": [
                          519
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 519,
                            "mutability": "mutable",
                            "name": "signer",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 547,
                            "src": "2482:14:3",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 518,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "2482:7:3",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 527,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 522,
                              "name": "hash",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 513,
                              "src": "2524:4:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 523,
                              "name": "v",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 478,
                              "src": "2530:1:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 524,
                              "name": "r",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 480,
                              "src": "2533:1:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 525,
                              "name": "s",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 482,
                              "src": "2536:1:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 520,
                              "name": "ECDSAUpgradeable",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 246,
                              "src": "2499:16:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_ECDSAUpgradeable_$246_$",
                                "typeString": "type(library ECDSAUpgradeable)"
                              }
                            },
                            "id": 521,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "recover",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 228,
                            "src": "2499:24:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$",
                              "typeString": "function (bytes32,uint8,bytes32,bytes32) pure returns (address)"
                            }
                          },
                          "id": 526,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2499:39:3",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2482:56:3"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 531,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 529,
                                "name": "signer",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 519,
                                "src": "2556:6:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 530,
                                "name": "owner",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 470,
                                "src": "2566:5:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "src": "2556:15:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "45524332305065726d69743a20696e76616c6964207369676e6174757265",
                              "id": 532,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2573:32:3",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_94ca1ab58dfda790a1782ffbb0c0a140ec51d4148dbeecc6c39e37b25ff4b124",
                                "typeString": "literal_string \"ERC20Permit: invalid signature\""
                              },
                              "value": "ERC20Permit: invalid signature"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_94ca1ab58dfda790a1782ffbb0c0a140ec51d4148dbeecc6c39e37b25ff4b124",
                                "typeString": "literal_string \"ERC20Permit: invalid signature\""
                              }
                            ],
                            "id": 528,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2548:7:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 533,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2548:58:3",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 534,
                        "nodeType": "ExpressionStatement",
                        "src": "2548:58:3"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 535,
                                "name": "_nonces",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 430,
                                "src": "2617:7:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Counter_$3637_storage_$",
                                  "typeString": "mapping(address => struct CountersUpgradeable.Counter storage ref)"
                                }
                              },
                              "id": 537,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 536,
                                "name": "owner",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 470,
                                "src": "2625:5:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "2617:14:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Counter_$3637_storage",
                                "typeString": "struct CountersUpgradeable.Counter storage ref"
                              }
                            },
                            "id": 538,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "increment",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3660,
                            "src": "2617:24:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Counter_$3637_storage_ptr_$returns$__$bound_to$_t_struct$_Counter_$3637_storage_ptr_$",
                              "typeString": "function (struct CountersUpgradeable.Counter storage pointer)"
                            }
                          },
                          "id": 539,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2617:26:3",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 540,
                        "nodeType": "ExpressionStatement",
                        "src": "2617:26:3"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 542,
                              "name": "owner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 470,
                              "src": "2662:5:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 543,
                              "name": "spender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 472,
                              "src": "2669:7:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 544,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 474,
                              "src": "2678:5:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 541,
                            "name": "_approve",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1855,
                            "src": "2653:8:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 545,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2653:31:3",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 546,
                        "nodeType": "ExpressionStatement",
                        "src": "2653:31:3"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 468,
                    "nodeType": "StructuredDocumentation",
                    "src": "1831:50:3",
                    "text": " @dev See {IERC20Permit-permit}."
                  },
                  "functionSelector": "d505accf",
                  "id": 548,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "permit",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 484,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "2013:8:3"
                  },
                  "parameters": {
                    "id": 483,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 470,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 548,
                        "src": "1902:13:3",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 469,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1902:7:3",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 472,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 548,
                        "src": "1917:15:3",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 471,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1917:7:3",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 474,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 548,
                        "src": "1934:13:3",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 473,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1934:7:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 476,
                        "mutability": "mutable",
                        "name": "deadline",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 548,
                        "src": "1949:16:3",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 475,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1949:7:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 478,
                        "mutability": "mutable",
                        "name": "v",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 548,
                        "src": "1967:7:3",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 477,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "1967:5:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 480,
                        "mutability": "mutable",
                        "name": "r",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 548,
                        "src": "1976:9:3",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 479,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "1976:7:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 482,
                        "mutability": "mutable",
                        "name": "s",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 548,
                        "src": "1987:9:3",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 481,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "1987:7:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1901:96:3"
                  },
                  "returnParameters": {
                    "id": 485,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2022:0:3"
                  },
                  "scope": 580,
                  "src": "1886:805:3",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    609
                  ],
                  "body": {
                    "id": 563,
                    "nodeType": "Block",
                    "src": "2822:48:3",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 557,
                                "name": "_nonces",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 430,
                                "src": "2839:7:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_Counter_$3637_storage_$",
                                  "typeString": "mapping(address => struct CountersUpgradeable.Counter storage ref)"
                                }
                              },
                              "id": 559,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 558,
                                "name": "owner",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 551,
                                "src": "2847:5:3",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "2839:14:3",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Counter_$3637_storage",
                                "typeString": "struct CountersUpgradeable.Counter storage ref"
                              }
                            },
                            "id": 560,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "current",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3648,
                            "src": "2839:22:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_Counter_$3637_storage_ptr_$returns$_t_uint256_$bound_to$_t_struct$_Counter_$3637_storage_ptr_$",
                              "typeString": "function (struct CountersUpgradeable.Counter storage pointer) view returns (uint256)"
                            }
                          },
                          "id": 561,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2839:24:3",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 556,
                        "id": 562,
                        "nodeType": "Return",
                        "src": "2832:31:3"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 549,
                    "nodeType": "StructuredDocumentation",
                    "src": "2697:50:3",
                    "text": " @dev See {IERC20Permit-nonces}."
                  },
                  "functionSelector": "7ecebe00",
                  "id": 564,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "nonces",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 553,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "2795:8:3"
                  },
                  "parameters": {
                    "id": 552,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 551,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 564,
                        "src": "2768:13:3",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 550,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2768:7:3",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2767:15:3"
                  },
                  "returnParameters": {
                    "id": 556,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 555,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 564,
                        "src": "2813:7:3",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 554,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2813:7:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2812:9:3"
                  },
                  "scope": 580,
                  "src": "2752:118:3",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    615
                  ],
                  "body": {
                    "id": 574,
                    "nodeType": "Block",
                    "src": "3063:44:3",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 571,
                            "name": "_domainSeparatorV4",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 328,
                            "src": "3080:18:3",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_bytes32_$",
                              "typeString": "function () view returns (bytes32)"
                            }
                          },
                          "id": 572,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3080:20:3",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "functionReturnParameters": 570,
                        "id": 573,
                        "nodeType": "Return",
                        "src": "3073:27:3"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 565,
                    "nodeType": "StructuredDocumentation",
                    "src": "2876:60:3",
                    "text": " @dev See {IERC20Permit-DOMAIN_SEPARATOR}."
                  },
                  "functionSelector": "3644e515",
                  "id": 575,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "DOMAIN_SEPARATOR",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 567,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "3036:8:3"
                  },
                  "parameters": {
                    "id": 566,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3019:2:3"
                  },
                  "returnParameters": {
                    "id": 570,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 569,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 575,
                        "src": "3054:7:3",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 568,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "3054:7:3",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3053:9:3"
                  },
                  "scope": 580,
                  "src": "2994:113:3",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "constant": false,
                  "id": 579,
                  "mutability": "mutable",
                  "name": "__gap",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 580,
                  "src": "3112:25:3",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$49_storage",
                    "typeString": "uint256[49]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 576,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "3112:7:3",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 578,
                    "length": {
                      "argumentTypes": null,
                      "hexValue": "3439",
                      "id": 577,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "3120:2:3",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_49_by_1",
                        "typeString": "int_const 49"
                      },
                      "value": "49"
                    },
                    "nodeType": "ArrayTypeName",
                    "src": "3112:11:3",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$49_storage_ptr",
                      "typeString": "uint256[49]"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                }
              ],
              "scope": 581,
              "src": "832:2308:3"
            }
          ],
          "src": "33:3108:3"
        },
        "id": 3
      },
      "@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/drafts/IERC20PermitUpgradeable.sol",
          "exportedSymbols": {
            "IERC20PermitUpgradeable": [
              616
            ]
          },
          "id": 617,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 582,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:4"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": {
                "id": 583,
                "nodeType": "StructuredDocumentation",
                "src": "66:482:4",
                "text": " @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n need to send a transaction, and thus is not required to hold Ether at all."
              },
              "fullyImplemented": false,
              "id": 616,
              "linearizedBaseContracts": [
                616
              ],
              "name": "IERC20PermitUpgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 584,
                    "nodeType": "StructuredDocumentation",
                    "src": "589:788:4",
                    "text": " @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,\n given `owner`'s signed approval.\n IMPORTANT: The same issues {IERC20-approve} has related to transaction\n ordering also apply here.\n Emits an {Approval} event.\n Requirements:\n - `spender` cannot be the zero address.\n - `deadline` must be a timestamp in the future.\n - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n over the EIP712-formatted function arguments.\n - the signature must use ``owner``'s current nonce (see {nonces}).\n For more information on the signature format, see the\n https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n section]."
                  },
                  "functionSelector": "d505accf",
                  "id": 601,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "permit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 599,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 586,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 601,
                        "src": "1398:13:4",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 585,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1398:7:4",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 588,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 601,
                        "src": "1413:15:4",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 587,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1413:7:4",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 590,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 601,
                        "src": "1430:13:4",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 589,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1430:7:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 592,
                        "mutability": "mutable",
                        "name": "deadline",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 601,
                        "src": "1445:16:4",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 591,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1445:7:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 594,
                        "mutability": "mutable",
                        "name": "v",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 601,
                        "src": "1463:7:4",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 593,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "1463:5:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 596,
                        "mutability": "mutable",
                        "name": "r",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 601,
                        "src": "1472:9:4",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 595,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "1472:7:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 598,
                        "mutability": "mutable",
                        "name": "s",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 601,
                        "src": "1483:9:4",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 597,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "1483:7:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1397:96:4"
                  },
                  "returnParameters": {
                    "id": 600,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1502:0:4"
                  },
                  "scope": 616,
                  "src": "1382:121:4",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 602,
                    "nodeType": "StructuredDocumentation",
                    "src": "1509:294:4",
                    "text": " @dev Returns the current nonce for `owner`. This value must be\n included whenever a signature is generated for {permit}.\n Every successful call to {permit} increases ``owner``'s nonce by one. This\n prevents a signature from being used multiple times."
                  },
                  "functionSelector": "7ecebe00",
                  "id": 609,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "nonces",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 605,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 604,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 609,
                        "src": "1824:13:4",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 603,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1824:7:4",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1823:15:4"
                  },
                  "returnParameters": {
                    "id": 608,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 607,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 609,
                        "src": "1862:7:4",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 606,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1862:7:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1861:9:4"
                  },
                  "scope": 616,
                  "src": "1808:63:4",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 610,
                    "nodeType": "StructuredDocumentation",
                    "src": "1877:128:4",
                    "text": " @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}."
                  },
                  "functionSelector": "3644e515",
                  "id": 615,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "DOMAIN_SEPARATOR",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 611,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2088:2:4"
                  },
                  "returnParameters": {
                    "id": 614,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 613,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 615,
                        "src": "2114:7:4",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 612,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "2114:7:4",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2113:9:4"
                  },
                  "scope": 616,
                  "src": "2063:60:4",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 617,
              "src": "549:1576:4"
            }
          ],
          "src": "33:2093:4"
        },
        "id": 4
      },
      "@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol",
          "exportedSymbols": {
            "ERC165CheckerUpgradeable": [
              844
            ]
          },
          "id": 845,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 618,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".2",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:5"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 619,
                "nodeType": "StructuredDocumentation",
                "src": "66:277:5",
                "text": " @dev Library used to query support of an interface declared via {IERC165}.\n Note that these functions return the actual result of the query: they do not\n `revert` if an interface is not supported. It is up to the caller to decide\n what to do in these cases."
              },
              "fullyImplemented": true,
              "id": 844,
              "linearizedBaseContracts": [
                844
              ],
              "name": "ERC165CheckerUpgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": true,
                  "id": 622,
                  "mutability": "constant",
                  "name": "_INTERFACE_ID_INVALID",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 844,
                  "src": "457:58:5",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 620,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "457:6:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30786666666666666666",
                    "id": 621,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "505:10:5",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_4294967295_by_1",
                      "typeString": "int_const 4294967295"
                    },
                    "value": "0xffffffff"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 625,
                  "mutability": "constant",
                  "name": "_INTERFACE_ID_ERC165",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 844,
                  "src": "605:57:5",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 623,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "605:6:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30783031666663396137",
                    "id": 624,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "652:10:5",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_33540519_by_1",
                      "typeString": "int_const 33540519"
                    },
                    "value": "0x01ffc9a7"
                  },
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 644,
                    "nodeType": "Block",
                    "src": "827:324:5",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 642,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 634,
                                "name": "account",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 628,
                                "src": "1041:7:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 635,
                                "name": "_INTERFACE_ID_ERC165",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 625,
                                "src": "1050:20:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes4",
                                  "typeString": "bytes4"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                {
                                  "typeIdentifier": "t_bytes4",
                                  "typeString": "bytes4"
                                }
                              ],
                              "id": 633,
                              "name": "_supportsERC165Interface",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 792,
                              "src": "1016:24:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes4_$returns$_t_bool_$",
                                "typeString": "function (address,bytes4) view returns (bool)"
                              }
                            },
                            "id": 636,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1016:55:5",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 641,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "!",
                            "prefix": true,
                            "src": "1087:57:5",
                            "subExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 638,
                                  "name": "account",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 628,
                                  "src": "1113:7:5",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 639,
                                  "name": "_INTERFACE_ID_INVALID",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 622,
                                  "src": "1122:21:5",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                ],
                                "id": 637,
                                "name": "_supportsERC165Interface",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 792,
                                "src": "1088:24:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes4_$returns$_t_bool_$",
                                  "typeString": "function (address,bytes4) view returns (bool)"
                                }
                              },
                              "id": 640,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1088:56:5",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "1016:128:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 632,
                        "id": 643,
                        "nodeType": "Return",
                        "src": "1009:135:5"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 626,
                    "nodeType": "StructuredDocumentation",
                    "src": "669:83:5",
                    "text": " @dev Returns true if `account` supports the {IERC165} interface,"
                  },
                  "id": 645,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "supportsERC165",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 629,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 628,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 645,
                        "src": "781:15:5",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 627,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "781:7:5",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "780:17:5"
                  },
                  "returnParameters": {
                    "id": 632,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 631,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 645,
                        "src": "821:4:5",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 630,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "821:4:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "820:6:5"
                  },
                  "scope": 844,
                  "src": "757:394:5",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 664,
                    "nodeType": "Block",
                    "src": "1462:193:5",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 662,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 656,
                                "name": "account",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 648,
                                "src": "1578:7:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "id": 655,
                              "name": "supportsERC165",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 645,
                              "src": "1563:14:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                                "typeString": "function (address) view returns (bool)"
                              }
                            },
                            "id": 657,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1563:23:5",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 659,
                                "name": "account",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 648,
                                "src": "1627:7:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 660,
                                "name": "interfaceId",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 650,
                                "src": "1636:11:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes4",
                                  "typeString": "bytes4"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                {
                                  "typeIdentifier": "t_bytes4",
                                  "typeString": "bytes4"
                                }
                              ],
                              "id": 658,
                              "name": "_supportsERC165Interface",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 792,
                              "src": "1602:24:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes4_$returns$_t_bool_$",
                                "typeString": "function (address,bytes4) view returns (bool)"
                              }
                            },
                            "id": 661,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1602:46:5",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "1563:85:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 654,
                        "id": 663,
                        "nodeType": "Return",
                        "src": "1556:92:5"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 646,
                    "nodeType": "StructuredDocumentation",
                    "src": "1157:207:5",
                    "text": " @dev Returns true if `account` supports the interface defined by\n `interfaceId`. Support for {IERC165} itself is queried automatically.\n See {IERC165-supportsInterface}."
                  },
                  "id": 665,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "supportsInterface",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 651,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 648,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 665,
                        "src": "1396:15:5",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 647,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1396:7:5",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 650,
                        "mutability": "mutable",
                        "name": "interfaceId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 665,
                        "src": "1413:18:5",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        },
                        "typeName": {
                          "id": 649,
                          "name": "bytes4",
                          "nodeType": "ElementaryTypeName",
                          "src": "1413:6:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes4",
                            "typeString": "bytes4"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1395:37:5"
                  },
                  "returnParameters": {
                    "id": 654,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 653,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 665,
                        "src": "1456:4:5",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 652,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "1456:4:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1455:6:5"
                  },
                  "scope": 844,
                  "src": "1369:286:5",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 720,
                    "nodeType": "Block",
                    "src": "2157:552:5",
                    "statements": [
                      {
                        "assignments": [
                          681
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 681,
                            "mutability": "mutable",
                            "name": "interfaceIdsSupported",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 720,
                            "src": "2266:35:5",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_bool_$dyn_memory_ptr",
                              "typeString": "bool[]"
                            },
                            "typeName": {
                              "baseType": {
                                "id": 679,
                                "name": "bool",
                                "nodeType": "ElementaryTypeName",
                                "src": "2266:4:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "id": 680,
                              "length": null,
                              "nodeType": "ArrayTypeName",
                              "src": "2266:6:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_bool_$dyn_storage_ptr",
                                "typeString": "bool[]"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 688,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 685,
                                "name": "interfaceIds",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 671,
                                "src": "2315:12:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_bytes4_$dyn_memory_ptr",
                                  "typeString": "bytes4[] memory"
                                }
                              },
                              "id": 686,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "length",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "2315:19:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 684,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "NewExpression",
                            "src": "2304:10:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_bool_$dyn_memory_ptr_$",
                              "typeString": "function (uint256) pure returns (bool[] memory)"
                            },
                            "typeName": {
                              "baseType": {
                                "id": 682,
                                "name": "bool",
                                "nodeType": "ElementaryTypeName",
                                "src": "2308:4:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "id": 683,
                              "length": null,
                              "nodeType": "ArrayTypeName",
                              "src": "2308:6:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_bool_$dyn_storage_ptr",
                                "typeString": "bool[]"
                              }
                            }
                          },
                          "id": 687,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2304:31:5",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_bool_$dyn_memory_ptr",
                            "typeString": "bool[] memory"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2266:69:5"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 690,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 668,
                              "src": "2407:7:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 689,
                            "name": "supportsERC165",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 645,
                            "src": "2392:14:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                              "typeString": "function (address) view returns (bool)"
                            }
                          },
                          "id": 691,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2392:23:5",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 717,
                        "nodeType": "IfStatement",
                        "src": "2388:276:5",
                        "trueBody": {
                          "id": 716,
                          "nodeType": "Block",
                          "src": "2417:247:5",
                          "statements": [
                            {
                              "body": {
                                "id": 714,
                                "nodeType": "Block",
                                "src": "2544:110:5",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 712,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "baseExpression": {
                                          "argumentTypes": null,
                                          "id": 703,
                                          "name": "interfaceIdsSupported",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 681,
                                          "src": "2562:21:5",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_array$_t_bool_$dyn_memory_ptr",
                                            "typeString": "bool[] memory"
                                          }
                                        },
                                        "id": 705,
                                        "indexExpression": {
                                          "argumentTypes": null,
                                          "id": 704,
                                          "name": "i",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 693,
                                          "src": "2584:1:5",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": true,
                                        "nodeType": "IndexAccess",
                                        "src": "2562:24:5",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 707,
                                            "name": "account",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 668,
                                            "src": "2614:7:5",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            }
                                          },
                                          {
                                            "argumentTypes": null,
                                            "baseExpression": {
                                              "argumentTypes": null,
                                              "id": 708,
                                              "name": "interfaceIds",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 671,
                                              "src": "2623:12:5",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_array$_t_bytes4_$dyn_memory_ptr",
                                                "typeString": "bytes4[] memory"
                                              }
                                            },
                                            "id": 710,
                                            "indexExpression": {
                                              "argumentTypes": null,
                                              "id": 709,
                                              "name": "i",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 693,
                                              "src": "2636:1:5",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "isConstant": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "nodeType": "IndexAccess",
                                            "src": "2623:15:5",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_bytes4",
                                              "typeString": "bytes4"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            },
                                            {
                                              "typeIdentifier": "t_bytes4",
                                              "typeString": "bytes4"
                                            }
                                          ],
                                          "id": 706,
                                          "name": "_supportsERC165Interface",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 792,
                                          "src": "2589:24:5",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes4_$returns$_t_bool_$",
                                            "typeString": "function (address,bytes4) view returns (bool)"
                                          }
                                        },
                                        "id": 711,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "2589:50:5",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        }
                                      },
                                      "src": "2562:77:5",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "id": 713,
                                    "nodeType": "ExpressionStatement",
                                    "src": "2562:77:5"
                                  }
                                ]
                              },
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 699,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 696,
                                  "name": "i",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 693,
                                  "src": "2514:1:5",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "<",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 697,
                                    "name": "interfaceIds",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 671,
                                    "src": "2518:12:5",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_bytes4_$dyn_memory_ptr",
                                      "typeString": "bytes4[] memory"
                                    }
                                  },
                                  "id": 698,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "length",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "2518:19:5",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "2514:23:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "id": 715,
                              "initializationExpression": {
                                "assignments": [
                                  693
                                ],
                                "declarations": [
                                  {
                                    "constant": false,
                                    "id": 693,
                                    "mutability": "mutable",
                                    "name": "i",
                                    "nodeType": "VariableDeclaration",
                                    "overrides": null,
                                    "scope": 715,
                                    "src": "2499:9:5",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "typeName": {
                                      "id": 692,
                                      "name": "uint256",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "2499:7:5",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "value": null,
                                    "visibility": "internal"
                                  }
                                ],
                                "id": 695,
                                "initialValue": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 694,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "2511:1:5",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "nodeType": "VariableDeclarationStatement",
                                "src": "2499:13:5"
                              },
                              "loopExpression": {
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 701,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "UnaryOperation",
                                  "operator": "++",
                                  "prefix": false,
                                  "src": "2539:3:5",
                                  "subExpression": {
                                    "argumentTypes": null,
                                    "id": 700,
                                    "name": "i",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 693,
                                    "src": "2539:1:5",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 702,
                                "nodeType": "ExpressionStatement",
                                "src": "2539:3:5"
                              },
                              "nodeType": "ForStatement",
                              "src": "2494:160:5"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 718,
                          "name": "interfaceIdsSupported",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 681,
                          "src": "2681:21:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_bool_$dyn_memory_ptr",
                            "typeString": "bool[] memory"
                          }
                        },
                        "functionReturnParameters": 676,
                        "id": 719,
                        "nodeType": "Return",
                        "src": "2674:28:5"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 666,
                    "nodeType": "StructuredDocumentation",
                    "src": "1661:374:5",
                    "text": " @dev Returns a boolean array where each value corresponds to the\n interfaces passed in and whether they're supported or not. This allows\n you to batch check interfaces for a contract where your expectation\n is that some interfaces may not be supported.\n See {IERC165-supportsInterface}.\n _Available since v3.4._"
                  },
                  "id": 721,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "getSupportedInterfaces",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 672,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 668,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 721,
                        "src": "2072:15:5",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 667,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2072:7:5",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 671,
                        "mutability": "mutable",
                        "name": "interfaceIds",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 721,
                        "src": "2089:28:5",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_bytes4_$dyn_memory_ptr",
                          "typeString": "bytes4[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 669,
                            "name": "bytes4",
                            "nodeType": "ElementaryTypeName",
                            "src": "2089:6:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes4",
                              "typeString": "bytes4"
                            }
                          },
                          "id": 670,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "2089:8:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_bytes4_$dyn_storage_ptr",
                            "typeString": "bytes4[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2071:47:5"
                  },
                  "returnParameters": {
                    "id": 676,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 675,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 721,
                        "src": "2142:13:5",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_bool_$dyn_memory_ptr",
                          "typeString": "bool[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 673,
                            "name": "bool",
                            "nodeType": "ElementaryTypeName",
                            "src": "2142:4:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "id": 674,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "2142:6:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_bool_$dyn_storage_ptr",
                            "typeString": "bool[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2141:15:5"
                  },
                  "scope": 844,
                  "src": "2040:669:5",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 766,
                    "nodeType": "Block",
                    "src": "3151:429:5",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 735,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "UnaryOperation",
                          "operator": "!",
                          "prefix": true,
                          "src": "3207:24:5",
                          "subExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 733,
                                "name": "account",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 724,
                                "src": "3223:7:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "id": 732,
                              "name": "supportsERC165",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 645,
                              "src": "3208:14:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                                "typeString": "function (address) view returns (bool)"
                              }
                            },
                            "id": 734,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "3208:23:5",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 739,
                        "nodeType": "IfStatement",
                        "src": "3203:67:5",
                        "trueBody": {
                          "id": 738,
                          "nodeType": "Block",
                          "src": "3233:37:5",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "66616c7365",
                                "id": 736,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "3254:5:5",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "false"
                              },
                              "functionReturnParameters": 731,
                              "id": 737,
                              "nodeType": "Return",
                              "src": "3247:12:5"
                            }
                          ]
                        }
                      },
                      {
                        "body": {
                          "id": 762,
                          "nodeType": "Block",
                          "src": "3390:126:5",
                          "statements": [
                            {
                              "condition": {
                                "argumentTypes": null,
                                "id": 757,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "UnaryOperation",
                                "operator": "!",
                                "prefix": true,
                                "src": "3408:51:5",
                                "subExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 752,
                                      "name": "account",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 724,
                                      "src": "3434:7:5",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "id": 753,
                                        "name": "interfaceIds",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 727,
                                        "src": "3443:12:5",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_array$_t_bytes4_$dyn_memory_ptr",
                                          "typeString": "bytes4[] memory"
                                        }
                                      },
                                      "id": 755,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 754,
                                        "name": "i",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 741,
                                        "src": "3456:1:5",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "3443:15:5",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bytes4",
                                        "typeString": "bytes4"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      },
                                      {
                                        "typeIdentifier": "t_bytes4",
                                        "typeString": "bytes4"
                                      }
                                    ],
                                    "id": 751,
                                    "name": "_supportsERC165Interface",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 792,
                                    "src": "3409:24:5",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes4_$returns$_t_bool_$",
                                      "typeString": "function (address,bytes4) view returns (bool)"
                                    }
                                  },
                                  "id": 756,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "3409:50:5",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 761,
                              "nodeType": "IfStatement",
                              "src": "3404:102:5",
                              "trueBody": {
                                "id": 760,
                                "nodeType": "Block",
                                "src": "3461:45:5",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "hexValue": "66616c7365",
                                      "id": 758,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "bool",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "3486:5:5",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      },
                                      "value": "false"
                                    },
                                    "functionReturnParameters": 731,
                                    "id": 759,
                                    "nodeType": "Return",
                                    "src": "3479:12:5"
                                  }
                                ]
                              }
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 747,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 744,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 741,
                            "src": "3360:1:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 745,
                              "name": "interfaceIds",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 727,
                              "src": "3364:12:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_bytes4_$dyn_memory_ptr",
                                "typeString": "bytes4[] memory"
                              }
                            },
                            "id": 746,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "3364:19:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "3360:23:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 763,
                        "initializationExpression": {
                          "assignments": [
                            741
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 741,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 763,
                              "src": "3345:9:5",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 740,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "3345:7:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 743,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 742,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "3357:1:5",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "3345:13:5"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 749,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "3385:3:5",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 748,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 741,
                              "src": "3385:1:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 750,
                          "nodeType": "ExpressionStatement",
                          "src": "3385:3:5"
                        },
                        "nodeType": "ForStatement",
                        "src": "3340:176:5"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 764,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "3569:4:5",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 731,
                        "id": 765,
                        "nodeType": "Return",
                        "src": "3562:11:5"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 722,
                    "nodeType": "StructuredDocumentation",
                    "src": "2715:324:5",
                    "text": " @dev Returns true if `account` supports all the interfaces defined in\n `interfaceIds`. Support for {IERC165} itself is queried automatically.\n Batch-querying can lead to gas savings by skipping repeated checks for\n {IERC165} support.\n See {IERC165-supportsInterface}."
                  },
                  "id": 767,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "supportsAllInterfaces",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 728,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 724,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 767,
                        "src": "3075:15:5",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 723,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3075:7:5",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 727,
                        "mutability": "mutable",
                        "name": "interfaceIds",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 767,
                        "src": "3092:28:5",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_bytes4_$dyn_memory_ptr",
                          "typeString": "bytes4[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 725,
                            "name": "bytes4",
                            "nodeType": "ElementaryTypeName",
                            "src": "3092:6:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes4",
                              "typeString": "bytes4"
                            }
                          },
                          "id": 726,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "3092:8:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_bytes4_$dyn_storage_ptr",
                            "typeString": "bytes4[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3074:47:5"
                  },
                  "returnParameters": {
                    "id": 731,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 730,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 767,
                        "src": "3145:4:5",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 729,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "3145:4:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3144:6:5"
                  },
                  "scope": 844,
                  "src": "3044:536:5",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 791,
                    "nodeType": "Block",
                    "src": "4342:296:5",
                    "statements": [
                      {
                        "assignments": [
                          778,
                          780
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 778,
                            "mutability": "mutable",
                            "name": "success",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 791,
                            "src": "4515:12:5",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 777,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "4515:4:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 780,
                            "mutability": "mutable",
                            "name": "result",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 791,
                            "src": "4529:11:5",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 779,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "4529:4:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 785,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 782,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 770,
                              "src": "4573:7:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 783,
                              "name": "interfaceId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 772,
                              "src": "4582:11:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              }
                            ],
                            "id": 781,
                            "name": "_callERC165SupportsInterface",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 843,
                            "src": "4544:28:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes4_$returns$_t_bool_$_t_bool_$",
                              "typeString": "function (address,bytes4) view returns (bool,bool)"
                            }
                          },
                          "id": 784,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4544:50:5",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bool_$",
                            "typeString": "tuple(bool,bool)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "4514:80:5"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 788,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 786,
                                "name": "success",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 778,
                                "src": "4613:7:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "&&",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 787,
                                "name": "result",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 780,
                                "src": "4624:6:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "4613:17:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "id": 789,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "4612:19:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 776,
                        "id": 790,
                        "nodeType": "Return",
                        "src": "4605:26:5"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 768,
                    "nodeType": "StructuredDocumentation",
                    "src": "3586:652:5",
                    "text": " @notice Query if a contract implements an interface, does not check ERC165 support\n @param account The address of the contract to query for support of an interface\n @param interfaceId The interface identifier, as specified in ERC-165\n @return true if the contract at account indicates support of the interface with\n identifier interfaceId, false otherwise\n @dev Assumes that account contains a contract that supports ERC165, otherwise\n the behavior of this method is undefined. This precondition can be checked\n with {supportsERC165}.\n Interface identification is specified in ERC-165."
                  },
                  "id": 792,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_supportsERC165Interface",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 773,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 770,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 792,
                        "src": "4277:15:5",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 769,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4277:7:5",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 772,
                        "mutability": "mutable",
                        "name": "interfaceId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 792,
                        "src": "4294:18:5",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        },
                        "typeName": {
                          "id": 771,
                          "name": "bytes4",
                          "nodeType": "ElementaryTypeName",
                          "src": "4294:6:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes4",
                            "typeString": "bytes4"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4276:37:5"
                  },
                  "returnParameters": {
                    "id": 776,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 775,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 792,
                        "src": "4336:4:5",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 774,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "4336:4:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4335:6:5"
                  },
                  "scope": 844,
                  "src": "4243:395:5",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 842,
                    "nodeType": "Block",
                    "src": "5292:307:5",
                    "statements": [
                      {
                        "assignments": [
                          805
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 805,
                            "mutability": "mutable",
                            "name": "encodedParams",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 842,
                            "src": "5302:26:5",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes"
                            },
                            "typeName": {
                              "id": 804,
                              "name": "bytes",
                              "nodeType": "ElementaryTypeName",
                              "src": "5302:5:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 811,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 808,
                              "name": "_INTERFACE_ID_ERC165",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 625,
                              "src": "5354:20:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 809,
                              "name": "interfaceId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 797,
                              "src": "5376:11:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              },
                              {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 806,
                              "name": "abi",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -1,
                              "src": "5331:3:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_abi",
                                "typeString": "abi"
                              }
                            },
                            "id": 807,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "memberName": "encodeWithSelector",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "5331:22:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                              "typeString": "function (bytes4) pure returns (bytes memory)"
                            }
                          },
                          "id": 810,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5331:57:5",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "5302:86:5"
                      },
                      {
                        "assignments": [
                          813,
                          815
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 813,
                            "mutability": "mutable",
                            "name": "success",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 842,
                            "src": "5399:12:5",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 812,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "5399:4:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 815,
                            "mutability": "mutable",
                            "name": "result",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 842,
                            "src": "5413:19:5",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes"
                            },
                            "typeName": {
                              "id": 814,
                              "name": "bytes",
                              "nodeType": "ElementaryTypeName",
                              "src": "5413:5:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 822,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 820,
                              "name": "encodedParams",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 805,
                              "src": "5469:13:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 816,
                                "name": "account",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 795,
                                "src": "5436:7:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 817,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "staticcall",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "5436:18:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_barestaticcall_view$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                                "typeString": "function (bytes memory) view returns (bool,bytes memory)"
                              }
                            },
                            "id": 819,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "names": [
                              "gas"
                            ],
                            "nodeType": "FunctionCallOptions",
                            "options": [
                              {
                                "argumentTypes": null,
                                "hexValue": "3330303030",
                                "id": 818,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "5461:5:5",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_30000_by_1",
                                  "typeString": "int_const 30000"
                                },
                                "value": "30000"
                              }
                            ],
                            "src": "5436:32:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_barestaticcall_view$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$gas",
                              "typeString": "function (bytes memory) view returns (bool,bytes memory)"
                            }
                          },
                          "id": 821,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5436:47:5",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(bool,bytes memory)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "5398:85:5"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 826,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 823,
                              "name": "result",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 815,
                              "src": "5497:6:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            "id": 824,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "5497:13:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "3332",
                            "id": 825,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "5513:2:5",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_32_by_1",
                              "typeString": "int_const 32"
                            },
                            "value": "32"
                          },
                          "src": "5497:18:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 831,
                        "nodeType": "IfStatement",
                        "src": "5493:45:5",
                        "trueBody": {
                          "expression": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "hexValue": "66616c7365",
                                "id": 827,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "5525:5:5",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "false"
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "66616c7365",
                                "id": 828,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "5532:5:5",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "false"
                              }
                            ],
                            "id": 829,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "5524:14:5",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_bool_$_t_bool_$",
                              "typeString": "tuple(bool,bool)"
                            }
                          },
                          "functionReturnParameters": 803,
                          "id": 830,
                          "nodeType": "Return",
                          "src": "5517:21:5"
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "id": 832,
                              "name": "success",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 813,
                              "src": "5556:7:5",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 835,
                                  "name": "result",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 815,
                                  "src": "5576:6:5",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "components": [
                                    {
                                      "argumentTypes": null,
                                      "id": 837,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "5585:4:5",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_bool_$",
                                        "typeString": "type(bool)"
                                      },
                                      "typeName": {
                                        "id": 836,
                                        "name": "bool",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5585:4:5",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    }
                                  ],
                                  "id": 838,
                                  "isConstant": false,
                                  "isInlineArray": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "TupleExpression",
                                  "src": "5584:6:5",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_bool_$",
                                    "typeString": "type(bool)"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  },
                                  {
                                    "typeIdentifier": "t_type$_t_bool_$",
                                    "typeString": "type(bool)"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 833,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "5565:3:5",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 834,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "decode",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "5565:10:5",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                  "typeString": "function () pure"
                                }
                              },
                              "id": 839,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5565:26:5",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "id": 840,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "5555:37:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bool_$",
                            "typeString": "tuple(bool,bool)"
                          }
                        },
                        "functionReturnParameters": 803,
                        "id": 841,
                        "nodeType": "Return",
                        "src": "5548:44:5"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 793,
                    "nodeType": "StructuredDocumentation",
                    "src": "4644:506:5",
                    "text": " @notice Calls the function with selector 0x01ffc9a7 (ERC165) and suppresses throw\n @param account The address of the contract to query for support of an interface\n @param interfaceId The interface identifier, as specified in ERC-165\n @return success true if the STATICCALL succeeded, false otherwise\n @return result true if the STATICCALL succeeded and the contract at account\n indicates support of the interface with identifier interfaceId, false otherwise"
                  },
                  "id": 843,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_callERC165SupportsInterface",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 798,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 795,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 843,
                        "src": "5193:15:5",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 794,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5193:7:5",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 797,
                        "mutability": "mutable",
                        "name": "interfaceId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 843,
                        "src": "5210:18:5",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        },
                        "typeName": {
                          "id": 796,
                          "name": "bytes4",
                          "nodeType": "ElementaryTypeName",
                          "src": "5210:6:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes4",
                            "typeString": "bytes4"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5192:37:5"
                  },
                  "returnParameters": {
                    "id": 803,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 800,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 843,
                        "src": "5276:4:5",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 799,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "5276:4:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 802,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 843,
                        "src": "5282:4:5",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 801,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "5282:4:5",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5275:12:5"
                  },
                  "scope": 844,
                  "src": "5155:444:5",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "private"
                }
              ],
              "scope": 845,
              "src": "344:5257:5"
            }
          ],
          "src": "33:5569:5"
        },
        "id": 5
      },
      "@openzeppelin/contracts-upgradeable/introspection/ERC165Upgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/introspection/ERC165Upgradeable.sol",
          "exportedSymbols": {
            "ERC165Upgradeable": [
              919
            ]
          },
          "id": 920,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 846,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:6"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol",
              "file": "./IERC165Upgradeable.sol",
              "id": 847,
              "nodeType": "ImportDirective",
              "scope": 920,
              "sourceUnit": 932,
              "src": "66:34:6",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol",
              "file": "../proxy/Initializable.sol",
              "id": 848,
              "nodeType": "ImportDirective",
              "scope": 920,
              "sourceUnit": 1353,
              "src": "101:36:6",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": true,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 850,
                    "name": "Initializable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1352,
                    "src": "350:13:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Initializable_$1352",
                      "typeString": "contract Initializable"
                    }
                  },
                  "id": 851,
                  "nodeType": "InheritanceSpecifier",
                  "src": "350:13:6"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 852,
                    "name": "IERC165Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 931,
                    "src": "365:18:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC165Upgradeable_$931",
                      "typeString": "contract IERC165Upgradeable"
                    }
                  },
                  "id": 853,
                  "nodeType": "InheritanceSpecifier",
                  "src": "365:18:6"
                }
              ],
              "contractDependencies": [
                931,
                1352
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 849,
                "nodeType": "StructuredDocumentation",
                "src": "139:171:6",
                "text": " @dev Implementation of the {IERC165} interface.\n Contracts may inherit from this and call {_registerInterface} to declare\n their support of an interface."
              },
              "fullyImplemented": true,
              "id": 919,
              "linearizedBaseContracts": [
                919,
                931,
                1352
              ],
              "name": "ERC165Upgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": true,
                  "id": 856,
                  "mutability": "constant",
                  "name": "_INTERFACE_ID_ERC165",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 919,
                  "src": "473:57:6",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 854,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "473:6:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30783031666663396137",
                    "id": 855,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "520:10:6",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_33540519_by_1",
                      "typeString": "int_const 33540519"
                    },
                    "value": "0x01ffc9a7"
                  },
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 857,
                    "nodeType": "StructuredDocumentation",
                    "src": "537:82:6",
                    "text": " @dev Mapping of interface ids to whether or not it's supported."
                  },
                  "id": 861,
                  "mutability": "mutable",
                  "name": "_supportedInterfaces",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 919,
                  "src": "624:52:6",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_bytes4_$_t_bool_$",
                    "typeString": "mapping(bytes4 => bool)"
                  },
                  "typeName": {
                    "id": 860,
                    "keyType": {
                      "id": 858,
                      "name": "bytes4",
                      "nodeType": "ElementaryTypeName",
                      "src": "632:6:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes4",
                        "typeString": "bytes4"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "624:23:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_bytes4_$_t_bool_$",
                      "typeString": "mapping(bytes4 => bool)"
                    },
                    "valueType": {
                      "id": 859,
                      "name": "bool",
                      "nodeType": "ElementaryTypeName",
                      "src": "642:4:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 869,
                    "nodeType": "Block",
                    "src": "729:42:6",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 866,
                            "name": "__ERC165_init_unchained",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 880,
                            "src": "739:23:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 867,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "739:25:6",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 868,
                        "nodeType": "ExpressionStatement",
                        "src": "739:25:6"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 870,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 864,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 863,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "717:11:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "717:11:6"
                    }
                  ],
                  "name": "__ERC165_init",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 862,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "705:2:6"
                  },
                  "returnParameters": {
                    "id": 865,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "729:0:6"
                  },
                  "scope": 919,
                  "src": "683:88:6",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 879,
                    "nodeType": "Block",
                    "src": "833:193:6",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 876,
                              "name": "_INTERFACE_ID_ERC165",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 856,
                              "src": "998:20:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              }
                            ],
                            "id": 875,
                            "name": "_registerInterface",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 914,
                            "src": "979:18:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_bytes4_$returns$__$",
                              "typeString": "function (bytes4)"
                            }
                          },
                          "id": 877,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "979:40:6",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 878,
                        "nodeType": "ExpressionStatement",
                        "src": "979:40:6"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 880,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 873,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 872,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "821:11:6",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "821:11:6"
                    }
                  ],
                  "name": "__ERC165_init_unchained",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 871,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "809:2:6"
                  },
                  "returnParameters": {
                    "id": 874,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "833:0:6"
                  },
                  "scope": 919,
                  "src": "777:249:6",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    930
                  ],
                  "body": {
                    "id": 893,
                    "nodeType": "Block",
                    "src": "1267:57:6",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 889,
                            "name": "_supportedInterfaces",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 861,
                            "src": "1284:20:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes4_$_t_bool_$",
                              "typeString": "mapping(bytes4 => bool)"
                            }
                          },
                          "id": 891,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 890,
                            "name": "interfaceId",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 883,
                            "src": "1305:11:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes4",
                              "typeString": "bytes4"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "1284:33:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 888,
                        "id": 892,
                        "nodeType": "Return",
                        "src": "1277:40:6"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 881,
                    "nodeType": "StructuredDocumentation",
                    "src": "1032:139:6",
                    "text": " @dev See {IERC165-supportsInterface}.\n Time complexity O(1), guaranteed to always use less than 30 000 gas."
                  },
                  "functionSelector": "01ffc9a7",
                  "id": 894,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "supportsInterface",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 885,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "1243:8:6"
                  },
                  "parameters": {
                    "id": 884,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 883,
                        "mutability": "mutable",
                        "name": "interfaceId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 894,
                        "src": "1203:18:6",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        },
                        "typeName": {
                          "id": 882,
                          "name": "bytes4",
                          "nodeType": "ElementaryTypeName",
                          "src": "1203:6:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes4",
                            "typeString": "bytes4"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1202:20:6"
                  },
                  "returnParameters": {
                    "id": 888,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 887,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 894,
                        "src": "1261:4:6",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 886,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "1261:4:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1260:6:6"
                  },
                  "scope": 919,
                  "src": "1176:148:6",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 913,
                    "nodeType": "Block",
                    "src": "1783:133:6",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              },
                              "id": 903,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 901,
                                "name": "interfaceId",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 897,
                                "src": "1801:11:6",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes4",
                                  "typeString": "bytes4"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30786666666666666666",
                                "id": 902,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "1816:10:6",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_4294967295_by_1",
                                  "typeString": "int_const 4294967295"
                                },
                                "value": "0xffffffff"
                              },
                              "src": "1801:25:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4552433136353a20696e76616c696420696e74657266616365206964",
                              "id": 904,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1828:30:6",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_282912c0dfceceb28d77d0333f496b83948f9ba5b3154358a8b140b849289dee",
                                "typeString": "literal_string \"ERC165: invalid interface id\""
                              },
                              "value": "ERC165: invalid interface id"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_282912c0dfceceb28d77d0333f496b83948f9ba5b3154358a8b140b849289dee",
                                "typeString": "literal_string \"ERC165: invalid interface id\""
                              }
                            ],
                            "id": 900,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1793:7:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 905,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1793:66:6",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 906,
                        "nodeType": "ExpressionStatement",
                        "src": "1793:66:6"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 911,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 907,
                              "name": "_supportedInterfaces",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 861,
                              "src": "1869:20:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_bytes4_$_t_bool_$",
                                "typeString": "mapping(bytes4 => bool)"
                              }
                            },
                            "id": 909,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 908,
                              "name": "interfaceId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 897,
                              "src": "1890:11:6",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "1869:33:6",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "hexValue": "74727565",
                            "id": 910,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "bool",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1905:4:6",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "value": "true"
                          },
                          "src": "1869:40:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 912,
                        "nodeType": "ExpressionStatement",
                        "src": "1869:40:6"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 895,
                    "nodeType": "StructuredDocumentation",
                    "src": "1330:383:6",
                    "text": " @dev Registers the contract as an implementer of the interface defined by\n `interfaceId`. Support of the actual ERC165 interface is automatic and\n registering its interface id is not required.\n See {IERC165-supportsInterface}.\n Requirements:\n - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`)."
                  },
                  "id": 914,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_registerInterface",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 898,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 897,
                        "mutability": "mutable",
                        "name": "interfaceId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 914,
                        "src": "1746:18:6",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        },
                        "typeName": {
                          "id": 896,
                          "name": "bytes4",
                          "nodeType": "ElementaryTypeName",
                          "src": "1746:6:6",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes4",
                            "typeString": "bytes4"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1745:20:6"
                  },
                  "returnParameters": {
                    "id": 899,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1783:0:6"
                  },
                  "scope": 919,
                  "src": "1718:198:6",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 918,
                  "mutability": "mutable",
                  "name": "__gap",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 919,
                  "src": "1921:25:6",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$49_storage",
                    "typeString": "uint256[49]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 915,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "1921:7:6",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 917,
                    "length": {
                      "argumentTypes": null,
                      "hexValue": "3439",
                      "id": 916,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "1929:2:6",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_49_by_1",
                        "typeString": "int_const 49"
                      },
                      "value": "49"
                    },
                    "nodeType": "ArrayTypeName",
                    "src": "1921:11:6",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$49_storage_ptr",
                      "typeString": "uint256[49]"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                }
              ],
              "scope": 920,
              "src": "311:1638:6"
            }
          ],
          "src": "33:1917:6"
        },
        "id": 6
      },
      "@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol",
          "exportedSymbols": {
            "IERC165Upgradeable": [
              931
            ]
          },
          "id": 932,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 921,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:7"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": {
                "id": 922,
                "nodeType": "StructuredDocumentation",
                "src": "66:279:7",
                "text": " @dev Interface of the ERC165 standard, as defined in the\n https://eips.ethereum.org/EIPS/eip-165[EIP].\n Implementers can declare support of contract interfaces, which can then be\n queried by others ({ERC165Checker}).\n For an implementation, see {ERC165}."
              },
              "fullyImplemented": false,
              "id": 931,
              "linearizedBaseContracts": [
                931
              ],
              "name": "IERC165Upgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 923,
                    "nodeType": "StructuredDocumentation",
                    "src": "381:340:7",
                    "text": " @dev Returns true if this contract implements the interface defined by\n `interfaceId`. See the corresponding\n https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n to learn more about how these ids are created.\n This function call must use less than 30 000 gas."
                  },
                  "functionSelector": "01ffc9a7",
                  "id": 930,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "supportsInterface",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 926,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 925,
                        "mutability": "mutable",
                        "name": "interfaceId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 930,
                        "src": "753:18:7",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        },
                        "typeName": {
                          "id": 924,
                          "name": "bytes4",
                          "nodeType": "ElementaryTypeName",
                          "src": "753:6:7",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes4",
                            "typeString": "bytes4"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "752:20:7"
                  },
                  "returnParameters": {
                    "id": 929,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 928,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 930,
                        "src": "796:4:7",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 927,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "796:4:7",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "795:6:7"
                  },
                  "scope": 931,
                  "src": "726:76:7",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 932,
              "src": "346:458:7"
            }
          ],
          "src": "33:772:7"
        },
        "id": 7
      },
      "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol",
          "exportedSymbols": {
            "SafeMathUpgradeable": [
              1286
            ]
          },
          "id": 1287,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 933,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:8"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 934,
                "nodeType": "StructuredDocumentation",
                "src": "66:563:8",
                "text": " @dev Wrappers over Solidity's arithmetic operations with added overflow\n checks.\n Arithmetic operations in Solidity wrap on overflow. This can easily result\n in bugs, because programmers usually assume that an overflow raises an\n error, which is the standard behavior in high level programming languages.\n `SafeMath` restores this intuition by reverting the transaction when an\n operation overflows.\n Using this library instead of the unchecked operations eliminates an entire\n class of bugs, so it's recommended to use it always."
              },
              "fullyImplemented": true,
              "id": 1286,
              "linearizedBaseContracts": [
                1286
              ],
              "name": "SafeMathUpgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 964,
                    "nodeType": "Block",
                    "src": "876:98:8",
                    "statements": [
                      {
                        "assignments": [
                          947
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 947,
                            "mutability": "mutable",
                            "name": "c",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 964,
                            "src": "886:9:8",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 946,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "886:7:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 951,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 950,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 948,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 937,
                            "src": "898:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "+",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 949,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 939,
                            "src": "902:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "898:5:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "886:17:8"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 954,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 952,
                            "name": "c",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 947,
                            "src": "917:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 953,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 937,
                            "src": "921:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "917:5:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 959,
                        "nodeType": "IfStatement",
                        "src": "913:28:8",
                        "trueBody": {
                          "expression": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "hexValue": "66616c7365",
                                "id": 955,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "932:5:8",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "false"
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 956,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "939:1:8",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "id": 957,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "931:10:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_bool_$_t_rational_0_by_1_$",
                              "typeString": "tuple(bool,int_const 0)"
                            }
                          },
                          "functionReturnParameters": 945,
                          "id": 958,
                          "nodeType": "Return",
                          "src": "924:17:8"
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "hexValue": "74727565",
                              "id": 960,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "bool",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "959:4:8",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "value": "true"
                            },
                            {
                              "argumentTypes": null,
                              "id": 961,
                              "name": "c",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 947,
                              "src": "965:1:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 962,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "958:9:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                            "typeString": "tuple(bool,uint256)"
                          }
                        },
                        "functionReturnParameters": 945,
                        "id": 963,
                        "nodeType": "Return",
                        "src": "951:16:8"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 935,
                    "nodeType": "StructuredDocumentation",
                    "src": "664:131:8",
                    "text": " @dev Returns the addition of two unsigned integers, with an overflow flag.\n _Available since v3.4._"
                  },
                  "id": 965,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "tryAdd",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 940,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 937,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 965,
                        "src": "816:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 936,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "816:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 939,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 965,
                        "src": "827:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 938,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "827:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "815:22:8"
                  },
                  "returnParameters": {
                    "id": 945,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 942,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 965,
                        "src": "861:4:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 941,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "861:4:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 944,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 965,
                        "src": "867:7:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 943,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "867:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "860:15:8"
                  },
                  "scope": 1286,
                  "src": "800:174:8",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 991,
                    "nodeType": "Block",
                    "src": "1196:75:8",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 979,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 977,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 970,
                            "src": "1210:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 978,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 968,
                            "src": "1214:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "1210:5:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 984,
                        "nodeType": "IfStatement",
                        "src": "1206:28:8",
                        "trueBody": {
                          "expression": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "hexValue": "66616c7365",
                                "id": 980,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "1225:5:8",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "false"
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 981,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "1232:1:8",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "id": 982,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "1224:10:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_bool_$_t_rational_0_by_1_$",
                              "typeString": "tuple(bool,int_const 0)"
                            }
                          },
                          "functionReturnParameters": 976,
                          "id": 983,
                          "nodeType": "Return",
                          "src": "1217:17:8"
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "hexValue": "74727565",
                              "id": 985,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "bool",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1252:4:8",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "value": "true"
                            },
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 988,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 986,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 968,
                                "src": "1258:1:8",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "-",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 987,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 970,
                                "src": "1262:1:8",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "1258:5:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 989,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "1251:13:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                            "typeString": "tuple(bool,uint256)"
                          }
                        },
                        "functionReturnParameters": 976,
                        "id": 990,
                        "nodeType": "Return",
                        "src": "1244:20:8"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 966,
                    "nodeType": "StructuredDocumentation",
                    "src": "980:135:8",
                    "text": " @dev Returns the substraction of two unsigned integers, with an overflow flag.\n _Available since v3.4._"
                  },
                  "id": 992,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "trySub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 971,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 968,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 992,
                        "src": "1136:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 967,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1136:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 970,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 992,
                        "src": "1147:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 969,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1147:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1135:22:8"
                  },
                  "returnParameters": {
                    "id": 976,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 973,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 992,
                        "src": "1181:4:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 972,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "1181:4:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 975,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 992,
                        "src": "1187:7:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 974,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1187:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1180:15:8"
                  },
                  "scope": 1286,
                  "src": "1120:151:8",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1032,
                    "nodeType": "Block",
                    "src": "1495:359:8",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1006,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 1004,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 995,
                            "src": "1727:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 1005,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1732:1:8",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "1727:6:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 1011,
                        "nodeType": "IfStatement",
                        "src": "1723:28:8",
                        "trueBody": {
                          "expression": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "hexValue": "74727565",
                                "id": 1007,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "1743:4:8",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "true"
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 1008,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "1749:1:8",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "id": 1009,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "1742:9:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_bool_$_t_rational_0_by_1_$",
                              "typeString": "tuple(bool,int_const 0)"
                            }
                          },
                          "functionReturnParameters": 1003,
                          "id": 1010,
                          "nodeType": "Return",
                          "src": "1735:16:8"
                        }
                      },
                      {
                        "assignments": [
                          1013
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1013,
                            "mutability": "mutable",
                            "name": "c",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1032,
                            "src": "1761:9:8",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 1012,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "1761:7:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1017,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1016,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 1014,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 995,
                            "src": "1773:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "*",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 1015,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 997,
                            "src": "1777:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "1773:5:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1761:17:8"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1022,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 1020,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 1018,
                              "name": "c",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1013,
                              "src": "1792:1:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "/",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 1019,
                              "name": "a",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 995,
                              "src": "1796:1:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "1792:5:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 1021,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 997,
                            "src": "1801:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "1792:10:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 1027,
                        "nodeType": "IfStatement",
                        "src": "1788:33:8",
                        "trueBody": {
                          "expression": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "hexValue": "66616c7365",
                                "id": 1023,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "1812:5:8",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "false"
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 1024,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "1819:1:8",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "id": 1025,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "1811:10:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_bool_$_t_rational_0_by_1_$",
                              "typeString": "tuple(bool,int_const 0)"
                            }
                          },
                          "functionReturnParameters": 1003,
                          "id": 1026,
                          "nodeType": "Return",
                          "src": "1804:17:8"
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "hexValue": "74727565",
                              "id": 1028,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "bool",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1839:4:8",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "value": "true"
                            },
                            {
                              "argumentTypes": null,
                              "id": 1029,
                              "name": "c",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1013,
                              "src": "1845:1:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 1030,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "1838:9:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                            "typeString": "tuple(bool,uint256)"
                          }
                        },
                        "functionReturnParameters": 1003,
                        "id": 1031,
                        "nodeType": "Return",
                        "src": "1831:16:8"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 993,
                    "nodeType": "StructuredDocumentation",
                    "src": "1277:137:8",
                    "text": " @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n _Available since v3.4._"
                  },
                  "id": 1033,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "tryMul",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 998,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 995,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1033,
                        "src": "1435:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 994,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1435:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 997,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1033,
                        "src": "1446:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 996,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1446:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1434:22:8"
                  },
                  "returnParameters": {
                    "id": 1003,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1000,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1033,
                        "src": "1480:4:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 999,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "1480:4:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1002,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1033,
                        "src": "1486:7:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1001,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1486:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1479:15:8"
                  },
                  "scope": 1286,
                  "src": "1419:435:8",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1059,
                    "nodeType": "Block",
                    "src": "2079:76:8",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1047,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 1045,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1038,
                            "src": "2093:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 1046,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "2098:1:8",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "2093:6:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 1052,
                        "nodeType": "IfStatement",
                        "src": "2089:29:8",
                        "trueBody": {
                          "expression": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "hexValue": "66616c7365",
                                "id": 1048,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "2109:5:8",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "false"
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 1049,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "2116:1:8",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "id": 1050,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "2108:10:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_bool_$_t_rational_0_by_1_$",
                              "typeString": "tuple(bool,int_const 0)"
                            }
                          },
                          "functionReturnParameters": 1044,
                          "id": 1051,
                          "nodeType": "Return",
                          "src": "2101:17:8"
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "hexValue": "74727565",
                              "id": 1053,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "bool",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2136:4:8",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "value": "true"
                            },
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 1056,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1054,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1036,
                                "src": "2142:1:8",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "/",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 1055,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1038,
                                "src": "2146:1:8",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "2142:5:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 1057,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "2135:13:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                            "typeString": "tuple(bool,uint256)"
                          }
                        },
                        "functionReturnParameters": 1044,
                        "id": 1058,
                        "nodeType": "Return",
                        "src": "2128:20:8"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1034,
                    "nodeType": "StructuredDocumentation",
                    "src": "1860:138:8",
                    "text": " @dev Returns the division of two unsigned integers, with a division by zero flag.\n _Available since v3.4._"
                  },
                  "id": 1060,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "tryDiv",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1039,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1036,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1060,
                        "src": "2019:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1035,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2019:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1038,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1060,
                        "src": "2030:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1037,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2030:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2018:22:8"
                  },
                  "returnParameters": {
                    "id": 1044,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1041,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1060,
                        "src": "2064:4:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1040,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "2064:4:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1043,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1060,
                        "src": "2070:7:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1042,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2070:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2063:15:8"
                  },
                  "scope": 1286,
                  "src": "2003:152:8",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1086,
                    "nodeType": "Block",
                    "src": "2390:76:8",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1074,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 1072,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1065,
                            "src": "2404:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 1073,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "2409:1:8",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "2404:6:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 1079,
                        "nodeType": "IfStatement",
                        "src": "2400:29:8",
                        "trueBody": {
                          "expression": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "hexValue": "66616c7365",
                                "id": 1075,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "2420:5:8",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "false"
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 1076,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "2427:1:8",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "id": 1077,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "2419:10:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_bool_$_t_rational_0_by_1_$",
                              "typeString": "tuple(bool,int_const 0)"
                            }
                          },
                          "functionReturnParameters": 1071,
                          "id": 1078,
                          "nodeType": "Return",
                          "src": "2412:17:8"
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "hexValue": "74727565",
                              "id": 1080,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "bool",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2447:4:8",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "value": "true"
                            },
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 1083,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1081,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1063,
                                "src": "2453:1:8",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "%",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 1082,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1065,
                                "src": "2457:1:8",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "2453:5:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 1084,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "2446:13:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_uint256_$",
                            "typeString": "tuple(bool,uint256)"
                          }
                        },
                        "functionReturnParameters": 1071,
                        "id": 1085,
                        "nodeType": "Return",
                        "src": "2439:20:8"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1061,
                    "nodeType": "StructuredDocumentation",
                    "src": "2161:148:8",
                    "text": " @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n _Available since v3.4._"
                  },
                  "id": 1087,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "tryMod",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1066,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1063,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1087,
                        "src": "2330:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1062,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2330:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1065,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1087,
                        "src": "2341:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1064,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2341:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2329:22:8"
                  },
                  "returnParameters": {
                    "id": 1071,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1068,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1087,
                        "src": "2375:4:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1067,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "2375:4:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1070,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1087,
                        "src": "2381:7:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1069,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2381:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2374:15:8"
                  },
                  "scope": 1286,
                  "src": "2314:152:8",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1112,
                    "nodeType": "Block",
                    "src": "2768:108:8",
                    "statements": [
                      {
                        "assignments": [
                          1098
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1098,
                            "mutability": "mutable",
                            "name": "c",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1112,
                            "src": "2778:9:8",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 1097,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "2778:7:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1102,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1101,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 1099,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1090,
                            "src": "2790:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "+",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 1100,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1092,
                            "src": "2794:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "2790:5:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2778:17:8"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 1106,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1104,
                                "name": "c",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1098,
                                "src": "2813:1:8",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 1105,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1090,
                                "src": "2818:1:8",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "2813:6:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "536166654d6174683a206164646974696f6e206f766572666c6f77",
                              "id": 1107,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2821:29:8",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_30cc447bcc13b3e22b45cef0dd9b0b514842d836dd9b6eb384e20dedfb47723a",
                                "typeString": "literal_string \"SafeMath: addition overflow\""
                              },
                              "value": "SafeMath: addition overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_30cc447bcc13b3e22b45cef0dd9b0b514842d836dd9b6eb384e20dedfb47723a",
                                "typeString": "literal_string \"SafeMath: addition overflow\""
                              }
                            ],
                            "id": 1103,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2805:7:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1108,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2805:46:8",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1109,
                        "nodeType": "ExpressionStatement",
                        "src": "2805:46:8"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1110,
                          "name": "c",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1098,
                          "src": "2868:1:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 1096,
                        "id": 1111,
                        "nodeType": "Return",
                        "src": "2861:8:8"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1088,
                    "nodeType": "StructuredDocumentation",
                    "src": "2472:224:8",
                    "text": " @dev Returns the addition of two unsigned integers, reverting on\n overflow.\n Counterpart to Solidity's `+` operator.\n Requirements:\n - Addition cannot overflow."
                  },
                  "id": 1113,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "add",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1093,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1090,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1113,
                        "src": "2714:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1089,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2714:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1092,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1113,
                        "src": "2725:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1091,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2725:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2713:22:8"
                  },
                  "returnParameters": {
                    "id": 1096,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1095,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1113,
                        "src": "2759:7:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1094,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2759:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2758:9:8"
                  },
                  "scope": 1286,
                  "src": "2701:175:8",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1134,
                    "nodeType": "Block",
                    "src": "3214:88:8",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 1126,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1124,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1118,
                                "src": "3232:1:8",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 1125,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1116,
                                "src": "3237:1:8",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "3232:6:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "536166654d6174683a207375627472616374696f6e206f766572666c6f77",
                              "id": 1127,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3240:32:8",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_50b058e9b5320e58880d88223c9801cd9eecdcf90323d5c2318bc1b6b916e862",
                                "typeString": "literal_string \"SafeMath: subtraction overflow\""
                              },
                              "value": "SafeMath: subtraction overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_50b058e9b5320e58880d88223c9801cd9eecdcf90323d5c2318bc1b6b916e862",
                                "typeString": "literal_string \"SafeMath: subtraction overflow\""
                              }
                            ],
                            "id": 1123,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "3224:7:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1128,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3224:49:8",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1129,
                        "nodeType": "ExpressionStatement",
                        "src": "3224:49:8"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1132,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 1130,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1116,
                            "src": "3290:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "-",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 1131,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1118,
                            "src": "3294:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "3290:5:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 1122,
                        "id": 1133,
                        "nodeType": "Return",
                        "src": "3283:12:8"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1114,
                    "nodeType": "StructuredDocumentation",
                    "src": "2882:260:8",
                    "text": " @dev Returns the subtraction of two unsigned integers, reverting on\n overflow (when the result is negative).\n Counterpart to Solidity's `-` operator.\n Requirements:\n - Subtraction cannot overflow."
                  },
                  "id": 1135,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1119,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1116,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1135,
                        "src": "3160:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1115,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3160:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1118,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1135,
                        "src": "3171:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1117,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3171:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3159:22:8"
                  },
                  "returnParameters": {
                    "id": 1122,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1121,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1135,
                        "src": "3205:7:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1120,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3205:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3204:9:8"
                  },
                  "scope": 1286,
                  "src": "3147:155:8",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1168,
                    "nodeType": "Block",
                    "src": "3616:148:8",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1147,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 1145,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1138,
                            "src": "3630:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 1146,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "3635:1:8",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "3630:6:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 1150,
                        "nodeType": "IfStatement",
                        "src": "3626:20:8",
                        "trueBody": {
                          "expression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 1148,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "3645:1:8",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "functionReturnParameters": 1144,
                          "id": 1149,
                          "nodeType": "Return",
                          "src": "3638:8:8"
                        }
                      },
                      {
                        "assignments": [
                          1152
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1152,
                            "mutability": "mutable",
                            "name": "c",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1168,
                            "src": "3656:9:8",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 1151,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "3656:7:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1156,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1155,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 1153,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1138,
                            "src": "3668:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "*",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 1154,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1140,
                            "src": "3672:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "3668:5:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3656:17:8"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 1162,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 1160,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 1158,
                                  "name": "c",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1152,
                                  "src": "3691:1:8",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "/",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 1159,
                                  "name": "a",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1138,
                                  "src": "3695:1:8",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "3691:5:8",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 1161,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1140,
                                "src": "3700:1:8",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "3691:10:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77",
                              "id": 1163,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3703:35:8",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_9113bb53c2876a3805b2c9242029423fc540a728243ce887ab24c82cf119fba3",
                                "typeString": "literal_string \"SafeMath: multiplication overflow\""
                              },
                              "value": "SafeMath: multiplication overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_9113bb53c2876a3805b2c9242029423fc540a728243ce887ab24c82cf119fba3",
                                "typeString": "literal_string \"SafeMath: multiplication overflow\""
                              }
                            ],
                            "id": 1157,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "3683:7:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1164,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3683:56:8",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1165,
                        "nodeType": "ExpressionStatement",
                        "src": "3683:56:8"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1166,
                          "name": "c",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1152,
                          "src": "3756:1:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 1144,
                        "id": 1167,
                        "nodeType": "Return",
                        "src": "3749:8:8"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1136,
                    "nodeType": "StructuredDocumentation",
                    "src": "3308:236:8",
                    "text": " @dev Returns the multiplication of two unsigned integers, reverting on\n overflow.\n Counterpart to Solidity's `*` operator.\n Requirements:\n - Multiplication cannot overflow."
                  },
                  "id": 1169,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "mul",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1141,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1138,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1169,
                        "src": "3562:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1137,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3562:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1140,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1169,
                        "src": "3573:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1139,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3573:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3561:22:8"
                  },
                  "returnParameters": {
                    "id": 1144,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1143,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1169,
                        "src": "3607:7:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1142,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3607:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3606:9:8"
                  },
                  "scope": 1286,
                  "src": "3549:215:8",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1190,
                    "nodeType": "Block",
                    "src": "4295:83:8",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 1182,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1180,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1174,
                                "src": "4313:1:8",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 1181,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "4317:1:8",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "4313:5:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "536166654d6174683a206469766973696f6e206279207a65726f",
                              "id": 1183,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "4320:28:8",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_5b7cc70dda4dc2143e5adb63bd5d1f349504f461dbdfd9bc76fac1f8ca6d019f",
                                "typeString": "literal_string \"SafeMath: division by zero\""
                              },
                              "value": "SafeMath: division by zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_5b7cc70dda4dc2143e5adb63bd5d1f349504f461dbdfd9bc76fac1f8ca6d019f",
                                "typeString": "literal_string \"SafeMath: division by zero\""
                              }
                            ],
                            "id": 1179,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "4305:7:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1184,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4305:44:8",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1185,
                        "nodeType": "ExpressionStatement",
                        "src": "4305:44:8"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1188,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 1186,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1172,
                            "src": "4366:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "/",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 1187,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1174,
                            "src": "4370:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "4366:5:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 1178,
                        "id": 1189,
                        "nodeType": "Return",
                        "src": "4359:12:8"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1170,
                    "nodeType": "StructuredDocumentation",
                    "src": "3770:453:8",
                    "text": " @dev Returns the integer division of two unsigned integers, reverting on\n division by zero. The result is rounded towards zero.\n Counterpart to Solidity's `/` operator. Note: this function uses a\n `revert` opcode (which leaves remaining gas untouched) while Solidity\n uses an invalid opcode to revert (consuming all remaining gas).\n Requirements:\n - The divisor cannot be zero."
                  },
                  "id": 1191,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "div",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1175,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1172,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1191,
                        "src": "4241:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1171,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4241:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1174,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1191,
                        "src": "4252:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1173,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4252:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4240:22:8"
                  },
                  "returnParameters": {
                    "id": 1178,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1177,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1191,
                        "src": "4286:7:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1176,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4286:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4285:9:8"
                  },
                  "scope": 1286,
                  "src": "4228:150:8",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1212,
                    "nodeType": "Block",
                    "src": "4898:81:8",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 1204,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1202,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1196,
                                "src": "4916:1:8",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 1203,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "4920:1:8",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "4916:5:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "536166654d6174683a206d6f64756c6f206279207a65726f",
                              "id": 1205,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "4923:26:8",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_726e51f7b81fce0a68f5f214f445e275313b20b1633f08ce954ee39abf8d7832",
                                "typeString": "literal_string \"SafeMath: modulo by zero\""
                              },
                              "value": "SafeMath: modulo by zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_726e51f7b81fce0a68f5f214f445e275313b20b1633f08ce954ee39abf8d7832",
                                "typeString": "literal_string \"SafeMath: modulo by zero\""
                              }
                            ],
                            "id": 1201,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "4908:7:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1206,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4908:42:8",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1207,
                        "nodeType": "ExpressionStatement",
                        "src": "4908:42:8"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1210,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 1208,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1194,
                            "src": "4967:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "%",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 1209,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1196,
                            "src": "4971:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "4967:5:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 1200,
                        "id": 1211,
                        "nodeType": "Return",
                        "src": "4960:12:8"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1192,
                    "nodeType": "StructuredDocumentation",
                    "src": "4384:442:8",
                    "text": " @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n reverting when dividing by zero.\n Counterpart to Solidity's `%` operator. This function uses a `revert`\n opcode (which leaves remaining gas untouched) while Solidity uses an\n invalid opcode to revert (consuming all remaining gas).\n Requirements:\n - The divisor cannot be zero."
                  },
                  "id": 1213,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "mod",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1197,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1194,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1213,
                        "src": "4844:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1193,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4844:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1196,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1213,
                        "src": "4855:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1195,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4855:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4843:22:8"
                  },
                  "returnParameters": {
                    "id": 1200,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1199,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1213,
                        "src": "4889:7:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1198,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4889:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4888:9:8"
                  },
                  "scope": 1286,
                  "src": "4831:148:8",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1236,
                    "nodeType": "Block",
                    "src": "5538:68:8",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 1228,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1226,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1218,
                                "src": "5556:1:8",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 1227,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1216,
                                "src": "5561:1:8",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "5556:6:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1229,
                              "name": "errorMessage",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1220,
                              "src": "5564:12:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 1225,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "5548:7:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1230,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5548:29:8",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1231,
                        "nodeType": "ExpressionStatement",
                        "src": "5548:29:8"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1234,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 1232,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1216,
                            "src": "5594:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "-",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 1233,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1218,
                            "src": "5598:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "5594:5:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 1224,
                        "id": 1235,
                        "nodeType": "Return",
                        "src": "5587:12:8"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1214,
                    "nodeType": "StructuredDocumentation",
                    "src": "4985:453:8",
                    "text": " @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n overflow (when the result is negative).\n CAUTION: This function is deprecated because it requires allocating memory for the error\n message unnecessarily. For custom revert reasons use {trySub}.\n Counterpart to Solidity's `-` operator.\n Requirements:\n - Subtraction cannot overflow."
                  },
                  "id": 1237,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1221,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1216,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1237,
                        "src": "5456:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1215,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5456:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1218,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1237,
                        "src": "5467:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1217,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5467:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1220,
                        "mutability": "mutable",
                        "name": "errorMessage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1237,
                        "src": "5478:26:8",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1219,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "5478:6:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5455:50:8"
                  },
                  "returnParameters": {
                    "id": 1224,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1223,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1237,
                        "src": "5529:7:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1222,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5529:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5528:9:8"
                  },
                  "scope": 1286,
                  "src": "5443:163:8",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1260,
                    "nodeType": "Block",
                    "src": "6358:67:8",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 1252,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1250,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1242,
                                "src": "6376:1:8",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 1251,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "6380:1:8",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "6376:5:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1253,
                              "name": "errorMessage",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1244,
                              "src": "6383:12:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 1249,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "6368:7:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1254,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6368:28:8",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1255,
                        "nodeType": "ExpressionStatement",
                        "src": "6368:28:8"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1258,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 1256,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1240,
                            "src": "6413:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "/",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 1257,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1242,
                            "src": "6417:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "6413:5:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 1248,
                        "id": 1259,
                        "nodeType": "Return",
                        "src": "6406:12:8"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1238,
                    "nodeType": "StructuredDocumentation",
                    "src": "5612:646:8",
                    "text": " @dev Returns the integer division of two unsigned integers, reverting with custom message on\n division by zero. The result is rounded towards zero.\n CAUTION: This function is deprecated because it requires allocating memory for the error\n message unnecessarily. For custom revert reasons use {tryDiv}.\n Counterpart to Solidity's `/` operator. Note: this function uses a\n `revert` opcode (which leaves remaining gas untouched) while Solidity\n uses an invalid opcode to revert (consuming all remaining gas).\n Requirements:\n - The divisor cannot be zero."
                  },
                  "id": 1261,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "div",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1245,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1240,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1261,
                        "src": "6276:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1239,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6276:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1242,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1261,
                        "src": "6287:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1241,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6287:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1244,
                        "mutability": "mutable",
                        "name": "errorMessage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1261,
                        "src": "6298:26:8",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1243,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "6298:6:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6275:50:8"
                  },
                  "returnParameters": {
                    "id": 1248,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1247,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1261,
                        "src": "6349:7:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1246,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6349:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6348:9:8"
                  },
                  "scope": 1286,
                  "src": "6263:162:8",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1284,
                    "nodeType": "Block",
                    "src": "7166:67:8",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 1276,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1274,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1266,
                                "src": "7184:1:8",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 1275,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "7188:1:8",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "7184:5:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1277,
                              "name": "errorMessage",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1268,
                              "src": "7191:12:8",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 1273,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "7176:7:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1278,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7176:28:8",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1279,
                        "nodeType": "ExpressionStatement",
                        "src": "7176:28:8"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 1282,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 1280,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1264,
                            "src": "7221:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "%",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 1281,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1266,
                            "src": "7225:1:8",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "7221:5:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 1272,
                        "id": 1283,
                        "nodeType": "Return",
                        "src": "7214:12:8"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1262,
                    "nodeType": "StructuredDocumentation",
                    "src": "6431:635:8",
                    "text": " @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n reverting with custom message when dividing by zero.\n CAUTION: This function is deprecated because it requires allocating memory for the error\n message unnecessarily. For custom revert reasons use {tryMod}.\n Counterpart to Solidity's `%` operator. This function uses a `revert`\n opcode (which leaves remaining gas untouched) while Solidity uses an\n invalid opcode to revert (consuming all remaining gas).\n Requirements:\n - The divisor cannot be zero."
                  },
                  "id": 1285,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "mod",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1269,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1264,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1285,
                        "src": "7084:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1263,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7084:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1266,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1285,
                        "src": "7095:9:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1265,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7095:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1268,
                        "mutability": "mutable",
                        "name": "errorMessage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1285,
                        "src": "7106:26:8",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1267,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "7106:6:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7083:50:8"
                  },
                  "returnParameters": {
                    "id": 1272,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1271,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1285,
                        "src": "7157:7:8",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1270,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7157:7:8",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7156:9:8"
                  },
                  "scope": 1286,
                  "src": "7071:162:8",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 1287,
              "src": "630:6605:8"
            }
          ],
          "src": "33:7203:8"
        },
        "id": 8
      },
      "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol",
          "exportedSymbols": {
            "Initializable": [
              1352
            ]
          },
          "id": 1353,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 1288,
              "literals": [
                "solidity",
                ">=",
                "0.4",
                ".24",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "79:32:9"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol",
              "file": "../utils/AddressUpgradeable.sol",
              "id": 1289,
              "nodeType": "ImportDirective",
              "scope": 1353,
              "sourceUnit": 3583,
              "src": "113:41:9",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": true,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "contract",
              "documentation": {
                "id": 1290,
                "nodeType": "StructuredDocumentation",
                "src": "156:938:9",
                "text": " @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\n external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.\n CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n that all initializers are idempotent. This is not verified automatically as constructors are by Solidity."
              },
              "fullyImplemented": true,
              "id": 1352,
              "linearizedBaseContracts": [
                1352
              ],
              "name": "Initializable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "documentation": {
                    "id": 1291,
                    "nodeType": "StructuredDocumentation",
                    "src": "1134:73:9",
                    "text": " @dev Indicates that the contract has been initialized."
                  },
                  "id": 1293,
                  "mutability": "mutable",
                  "name": "_initialized",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1352,
                  "src": "1212:25:9",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 1292,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "1212:4:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 1294,
                    "nodeType": "StructuredDocumentation",
                    "src": "1244:91:9",
                    "text": " @dev Indicates that the contract is in the process of being initialized."
                  },
                  "id": 1296,
                  "mutability": "mutable",
                  "name": "_initializing",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1352,
                  "src": "1340:26:9",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 1295,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "1340:4:9",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 1334,
                    "nodeType": "Block",
                    "src": "1494:368:9",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 1306,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "id": 1303,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 1300,
                                  "name": "_initializing",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1296,
                                  "src": "1512:13:9",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "||",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "id": 1301,
                                    "name": "_isConstructor",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1351,
                                    "src": "1529:14:9",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$",
                                      "typeString": "function () view returns (bool)"
                                    }
                                  },
                                  "id": 1302,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "1529:16:9",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "src": "1512:33:9",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 1305,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "UnaryOperation",
                                "operator": "!",
                                "prefix": true,
                                "src": "1549:13:9",
                                "subExpression": {
                                  "argumentTypes": null,
                                  "id": 1304,
                                  "name": "_initialized",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1293,
                                  "src": "1550:12:9",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "1512:50:9",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564",
                              "id": 1307,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1564:48:9",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759",
                                "typeString": "literal_string \"Initializable: contract is already initialized\""
                              },
                              "value": "Initializable: contract is already initialized"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_7a2a4e26842155ea933fe6eb6e3137eb5a296dcdf55721c552be7b4c3cc23759",
                                "typeString": "literal_string \"Initializable: contract is already initialized\""
                              }
                            ],
                            "id": 1299,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1504:7:9",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1308,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1504:109:9",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1309,
                        "nodeType": "ExpressionStatement",
                        "src": "1504:109:9"
                      },
                      {
                        "assignments": [
                          1311
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 1311,
                            "mutability": "mutable",
                            "name": "isTopLevelCall",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 1334,
                            "src": "1624:19:9",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 1310,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "1624:4:9",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 1314,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 1313,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "UnaryOperation",
                          "operator": "!",
                          "prefix": true,
                          "src": "1646:14:9",
                          "subExpression": {
                            "argumentTypes": null,
                            "id": 1312,
                            "name": "_initializing",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1296,
                            "src": "1647:13:9",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1624:36:9"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 1315,
                          "name": "isTopLevelCall",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1311,
                          "src": "1674:14:9",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 1325,
                        "nodeType": "IfStatement",
                        "src": "1670:98:9",
                        "trueBody": {
                          "id": 1324,
                          "nodeType": "Block",
                          "src": "1690:78:9",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 1318,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 1316,
                                  "name": "_initializing",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1296,
                                  "src": "1704:13:9",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "hexValue": "74727565",
                                  "id": 1317,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "bool",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "1720:4:9",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  "value": "true"
                                },
                                "src": "1704:20:9",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "id": 1319,
                              "nodeType": "ExpressionStatement",
                              "src": "1704:20:9"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 1322,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 1320,
                                  "name": "_initialized",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1293,
                                  "src": "1738:12:9",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "hexValue": "74727565",
                                  "id": 1321,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "bool",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "1753:4:9",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  "value": "true"
                                },
                                "src": "1738:19:9",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "id": 1323,
                              "nodeType": "ExpressionStatement",
                              "src": "1738:19:9"
                            }
                          ]
                        }
                      },
                      {
                        "id": 1326,
                        "nodeType": "PlaceholderStatement",
                        "src": "1778:1:9"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 1327,
                          "name": "isTopLevelCall",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1311,
                          "src": "1794:14:9",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 1333,
                        "nodeType": "IfStatement",
                        "src": "1790:66:9",
                        "trueBody": {
                          "id": 1332,
                          "nodeType": "Block",
                          "src": "1810:46:9",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 1330,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 1328,
                                  "name": "_initializing",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1296,
                                  "src": "1824:13:9",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "hexValue": "66616c7365",
                                  "id": 1329,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "bool",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "1840:5:9",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  "value": "false"
                                },
                                "src": "1824:21:9",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "id": 1331,
                              "nodeType": "ExpressionStatement",
                              "src": "1824:21:9"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1297,
                    "nodeType": "StructuredDocumentation",
                    "src": "1373:93:9",
                    "text": " @dev Modifier to protect an initializer function from being invoked twice."
                  },
                  "id": 1335,
                  "name": "initializer",
                  "nodeType": "ModifierDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1298,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1491:2:9"
                  },
                  "src": "1471:391:9",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1350,
                    "nodeType": "Block",
                    "src": "2006:69:9",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1348,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "UnaryOperation",
                          "operator": "!",
                          "prefix": true,
                          "src": "2023:45:9",
                          "subExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 1345,
                                    "name": "this",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -28,
                                    "src": "2062:4:9",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_Initializable_$1352",
                                      "typeString": "contract Initializable"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_Initializable_$1352",
                                      "typeString": "contract Initializable"
                                    }
                                  ],
                                  "id": 1344,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "2054:7:9",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 1343,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2054:7:9",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 1346,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "2054:13:9",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 1341,
                                "name": "AddressUpgradeable",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3582,
                                "src": "2024:18:9",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_contract$_AddressUpgradeable_$3582_$",
                                  "typeString": "type(library AddressUpgradeable)"
                                }
                              },
                              "id": 1342,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "isContract",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 3358,
                              "src": "2024:29:9",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                                "typeString": "function (address) view returns (bool)"
                              }
                            },
                            "id": 1347,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "2024:44:9",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 1340,
                        "id": 1349,
                        "nodeType": "Return",
                        "src": "2016:52:9"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1336,
                    "nodeType": "StructuredDocumentation",
                    "src": "1868:79:9",
                    "text": "@dev Returns true if and only if the function is running in the constructor"
                  },
                  "id": 1351,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_isConstructor",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1337,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1975:2:9"
                  },
                  "returnParameters": {
                    "id": 1340,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1339,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1351,
                        "src": "2000:4:9",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1338,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "2000:4:9",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1999:6:9"
                  },
                  "scope": 1352,
                  "src": "1952:123:9",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "private"
                }
              ],
              "scope": 1353,
              "src": "1095:982:9"
            }
          ],
          "src": "79:1999:9"
        },
        "id": 9
      },
      "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol",
          "exportedSymbols": {
            "ERC20Upgradeable": [
              1882
            ]
          },
          "id": 1883,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 1354,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:10"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol",
              "file": "../../utils/ContextUpgradeable.sol",
              "id": 1355,
              "nodeType": "ImportDirective",
              "scope": 1883,
              "sourceUnit": 3628,
              "src": "66:44:10",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "file": "./IERC20Upgradeable.sol",
              "id": 1356,
              "nodeType": "ImportDirective",
              "scope": 1883,
              "sourceUnit": 1961,
              "src": "111:33:10",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol",
              "file": "../../math/SafeMathUpgradeable.sol",
              "id": 1357,
              "nodeType": "ImportDirective",
              "scope": 1883,
              "sourceUnit": 1287,
              "src": "145:44:10",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol",
              "file": "../../proxy/Initializable.sol",
              "id": 1358,
              "nodeType": "ImportDirective",
              "scope": 1883,
              "sourceUnit": 1353,
              "src": "190:39:10",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 1360,
                    "name": "Initializable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1352,
                    "src": "1423:13:10",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Initializable_$1352",
                      "typeString": "contract Initializable"
                    }
                  },
                  "id": 1361,
                  "nodeType": "InheritanceSpecifier",
                  "src": "1423:13:10"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 1362,
                    "name": "ContextUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3627,
                    "src": "1438:18:10",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ContextUpgradeable_$3627",
                      "typeString": "contract ContextUpgradeable"
                    }
                  },
                  "id": 1363,
                  "nodeType": "InheritanceSpecifier",
                  "src": "1438:18:10"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 1364,
                    "name": "IERC20Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1960,
                    "src": "1458:17:10",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                      "typeString": "contract IERC20Upgradeable"
                    }
                  },
                  "id": 1365,
                  "nodeType": "InheritanceSpecifier",
                  "src": "1458:17:10"
                }
              ],
              "contractDependencies": [
                1352,
                1960,
                3627
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 1359,
                "nodeType": "StructuredDocumentation",
                "src": "231:1162:10",
                "text": " @dev Implementation of the {IERC20} interface.\n This implementation is agnostic to the way tokens are created. This means\n that a supply mechanism has to be added in a derived contract using {_mint}.\n For a generic mechanism see {ERC20PresetMinterPauser}.\n TIP: For a detailed writeup see our guide\n https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n to implement supply mechanisms].\n We have followed general OpenZeppelin guidelines: functions revert instead\n of returning `false` on failure. This behavior is nonetheless conventional\n and does not conflict with the expectations of ERC20 applications.\n Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n This allows applications to reconstruct the allowance for all accounts just\n by listening to said events. Other implementations of the EIP may not emit\n these events, as it isn't required by the specification.\n Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n functions have been added to mitigate the well-known issues around setting\n allowances. See {IERC20-approve}."
              },
              "fullyImplemented": true,
              "id": 1882,
              "linearizedBaseContracts": [
                1882,
                1960,
                3627,
                1352
              ],
              "name": "ERC20Upgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 1368,
                  "libraryName": {
                    "contractScope": null,
                    "id": 1366,
                    "name": "SafeMathUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1286,
                    "src": "1488:19:10",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeMathUpgradeable_$1286",
                      "typeString": "library SafeMathUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "1482:38:10",
                  "typeName": {
                    "id": 1367,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1512:7:10",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "constant": false,
                  "id": 1372,
                  "mutability": "mutable",
                  "name": "_balances",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1882,
                  "src": "1526:46:10",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                    "typeString": "mapping(address => uint256)"
                  },
                  "typeName": {
                    "id": 1371,
                    "keyType": {
                      "id": 1369,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "1535:7:10",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "1526:28:10",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                      "typeString": "mapping(address => uint256)"
                    },
                    "valueType": {
                      "id": 1370,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "1546:7:10",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 1378,
                  "mutability": "mutable",
                  "name": "_allowances",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1882,
                  "src": "1579:69:10",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                    "typeString": "mapping(address => mapping(address => uint256))"
                  },
                  "typeName": {
                    "id": 1377,
                    "keyType": {
                      "id": 1373,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "1588:7:10",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "1579:49:10",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                      "typeString": "mapping(address => mapping(address => uint256))"
                    },
                    "valueType": {
                      "id": 1376,
                      "keyType": {
                        "id": 1374,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "1608:7:10",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "nodeType": "Mapping",
                      "src": "1599:28:10",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                        "typeString": "mapping(address => uint256)"
                      },
                      "valueType": {
                        "id": 1375,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "1619:7:10",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 1380,
                  "mutability": "mutable",
                  "name": "_totalSupply",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1882,
                  "src": "1655:28:10",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 1379,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1655:7:10",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 1382,
                  "mutability": "mutable",
                  "name": "_name",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1882,
                  "src": "1690:20:10",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_storage",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 1381,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1690:6:10",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 1384,
                  "mutability": "mutable",
                  "name": "_symbol",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1882,
                  "src": "1716:22:10",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_storage",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 1383,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1716:6:10",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 1386,
                  "mutability": "mutable",
                  "name": "_decimals",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1882,
                  "src": "1744:23:10",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 1385,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "1744:5:10",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 1404,
                    "nodeType": "Block",
                    "src": "2177:91:10",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 1396,
                            "name": "__Context_init_unchained",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3602,
                            "src": "2187:24:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 1397,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2187:26:10",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1398,
                        "nodeType": "ExpressionStatement",
                        "src": "2187:26:10"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1400,
                              "name": "name_",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1389,
                              "src": "2246:5:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1401,
                              "name": "symbol_",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1391,
                              "src": "2253:7:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 1399,
                            "name": "__ERC20_init_unchained",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1427,
                            "src": "2223:22:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (string memory,string memory)"
                            }
                          },
                          "id": 1402,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2223:38:10",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1403,
                        "nodeType": "ExpressionStatement",
                        "src": "2223:38:10"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1387,
                    "nodeType": "StructuredDocumentation",
                    "src": "1774:311:10",
                    "text": " @dev Sets the values for {name} and {symbol}, initializes {decimals} with\n a default value of 18.\n To select a different value for {decimals}, use {_setupDecimals}.\n All three of these values are immutable: they can only be set once during\n construction."
                  },
                  "id": 1405,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 1394,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 1393,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "2165:11:10",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "2165:11:10"
                    }
                  ],
                  "name": "__ERC20_init",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1392,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1389,
                        "mutability": "mutable",
                        "name": "name_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1405,
                        "src": "2112:19:10",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1388,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "2112:6:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1391,
                        "mutability": "mutable",
                        "name": "symbol_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1405,
                        "src": "2133:21:10",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1390,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "2133:6:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2111:44:10"
                  },
                  "returnParameters": {
                    "id": 1395,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2177:0:10"
                  },
                  "scope": 1882,
                  "src": "2090:178:10",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1426,
                    "nodeType": "Block",
                    "src": "2371:81:10",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1416,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1414,
                            "name": "_name",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1382,
                            "src": "2381:5:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_storage",
                              "typeString": "string storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 1415,
                            "name": "name_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1407,
                            "src": "2389:5:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_memory_ptr",
                              "typeString": "string memory"
                            }
                          },
                          "src": "2381:13:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage",
                            "typeString": "string storage ref"
                          }
                        },
                        "id": 1417,
                        "nodeType": "ExpressionStatement",
                        "src": "2381:13:10"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1420,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1418,
                            "name": "_symbol",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1384,
                            "src": "2404:7:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_storage",
                              "typeString": "string storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 1419,
                            "name": "symbol_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1409,
                            "src": "2414:7:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_memory_ptr",
                              "typeString": "string memory"
                            }
                          },
                          "src": "2404:17:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage",
                            "typeString": "string storage ref"
                          }
                        },
                        "id": 1421,
                        "nodeType": "ExpressionStatement",
                        "src": "2404:17:10"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1424,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1422,
                            "name": "_decimals",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1386,
                            "src": "2431:9:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "hexValue": "3138",
                            "id": 1423,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "2443:2:10",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_18_by_1",
                              "typeString": "int_const 18"
                            },
                            "value": "18"
                          },
                          "src": "2431:14:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "id": 1425,
                        "nodeType": "ExpressionStatement",
                        "src": "2431:14:10"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 1427,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 1412,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 1411,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "2359:11:10",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "2359:11:10"
                    }
                  ],
                  "name": "__ERC20_init_unchained",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1410,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1407,
                        "mutability": "mutable",
                        "name": "name_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1427,
                        "src": "2306:19:10",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1406,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "2306:6:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1409,
                        "mutability": "mutable",
                        "name": "symbol_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1427,
                        "src": "2327:21:10",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1408,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "2327:6:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2305:44:10"
                  },
                  "returnParameters": {
                    "id": 1413,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2371:0:10"
                  },
                  "scope": 1882,
                  "src": "2274:178:10",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1435,
                    "nodeType": "Block",
                    "src": "2577:29:10",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1433,
                          "name": "_name",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1382,
                          "src": "2594:5:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage",
                            "typeString": "string storage ref"
                          }
                        },
                        "functionReturnParameters": 1432,
                        "id": 1434,
                        "nodeType": "Return",
                        "src": "2587:12:10"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1428,
                    "nodeType": "StructuredDocumentation",
                    "src": "2458:54:10",
                    "text": " @dev Returns the name of the token."
                  },
                  "functionSelector": "06fdde03",
                  "id": 1436,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "name",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1429,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2530:2:10"
                  },
                  "returnParameters": {
                    "id": 1432,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1431,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1436,
                        "src": "2562:13:10",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1430,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "2562:6:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2561:15:10"
                  },
                  "scope": 1882,
                  "src": "2517:89:10",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1444,
                    "nodeType": "Block",
                    "src": "2781:31:10",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1442,
                          "name": "_symbol",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1384,
                          "src": "2798:7:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage",
                            "typeString": "string storage ref"
                          }
                        },
                        "functionReturnParameters": 1441,
                        "id": 1443,
                        "nodeType": "Return",
                        "src": "2791:14:10"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1437,
                    "nodeType": "StructuredDocumentation",
                    "src": "2612:102:10",
                    "text": " @dev Returns the symbol of the token, usually a shorter version of the\n name."
                  },
                  "functionSelector": "95d89b41",
                  "id": 1445,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "symbol",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1438,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2734:2:10"
                  },
                  "returnParameters": {
                    "id": 1441,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1440,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1445,
                        "src": "2766:13:10",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 1439,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "2766:6:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2765:15:10"
                  },
                  "scope": 1882,
                  "src": "2719:93:10",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1453,
                    "nodeType": "Block",
                    "src": "3491:33:10",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1451,
                          "name": "_decimals",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1386,
                          "src": "3508:9:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "functionReturnParameters": 1450,
                        "id": 1452,
                        "nodeType": "Return",
                        "src": "3501:16:10"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1446,
                    "nodeType": "StructuredDocumentation",
                    "src": "2818:612:10",
                    "text": " @dev Returns the number of decimals used to get its user representation.\n For example, if `decimals` equals `2`, a balance of `505` tokens should\n be displayed to a user as `5,05` (`505 / 10 ** 2`).\n Tokens usually opt for a value of 18, imitating the relationship between\n Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\n called.\n NOTE: This information is only used for _display_ purposes: it in\n no way affects any of the arithmetic of the contract, including\n {IERC20-balanceOf} and {IERC20-transfer}."
                  },
                  "functionSelector": "313ce567",
                  "id": 1454,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "decimals",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1447,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3452:2:10"
                  },
                  "returnParameters": {
                    "id": 1450,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1449,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1454,
                        "src": "3484:5:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 1448,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "3484:5:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3483:7:10"
                  },
                  "scope": 1882,
                  "src": "3435:89:10",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    1891
                  ],
                  "body": {
                    "id": 1463,
                    "nodeType": "Block",
                    "src": "3654:36:10",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1461,
                          "name": "_totalSupply",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1380,
                          "src": "3671:12:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 1460,
                        "id": 1462,
                        "nodeType": "Return",
                        "src": "3664:19:10"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1455,
                    "nodeType": "StructuredDocumentation",
                    "src": "3530:49:10",
                    "text": " @dev See {IERC20-totalSupply}."
                  },
                  "functionSelector": "18160ddd",
                  "id": 1464,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "totalSupply",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 1457,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "3627:8:10"
                  },
                  "parameters": {
                    "id": 1456,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3604:2:10"
                  },
                  "returnParameters": {
                    "id": 1460,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1459,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1464,
                        "src": "3645:7:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1458,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3645:7:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3644:9:10"
                  },
                  "scope": 1882,
                  "src": "3584:106:10",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    1899
                  ],
                  "body": {
                    "id": 1477,
                    "nodeType": "Block",
                    "src": "3831:42:10",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 1473,
                            "name": "_balances",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1372,
                            "src": "3848:9:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                              "typeString": "mapping(address => uint256)"
                            }
                          },
                          "id": 1475,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 1474,
                            "name": "account",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1467,
                            "src": "3858:7:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "3848:18:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 1472,
                        "id": 1476,
                        "nodeType": "Return",
                        "src": "3841:25:10"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1465,
                    "nodeType": "StructuredDocumentation",
                    "src": "3696:47:10",
                    "text": " @dev See {IERC20-balanceOf}."
                  },
                  "functionSelector": "70a08231",
                  "id": 1478,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "balanceOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 1469,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "3804:8:10"
                  },
                  "parameters": {
                    "id": 1468,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1467,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1478,
                        "src": "3767:15:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1466,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3767:7:10",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3766:17:10"
                  },
                  "returnParameters": {
                    "id": 1472,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1471,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1478,
                        "src": "3822:7:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1470,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3822:7:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3821:9:10"
                  },
                  "scope": 1882,
                  "src": "3748:125:10",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    1909
                  ],
                  "body": {
                    "id": 1498,
                    "nodeType": "Block",
                    "src": "4168:80:10",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 1490,
                                "name": "_msgSender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3611,
                                "src": "4188:10:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                  "typeString": "function () view returns (address payable)"
                                }
                              },
                              "id": 1491,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "4188:12:10",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1492,
                              "name": "recipient",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1481,
                              "src": "4202:9:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1493,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1483,
                              "src": "4213:6:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 1489,
                            "name": "_transfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1699,
                            "src": "4178:9:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 1494,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4178:42:10",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1495,
                        "nodeType": "ExpressionStatement",
                        "src": "4178:42:10"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 1496,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "4237:4:10",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 1488,
                        "id": 1497,
                        "nodeType": "Return",
                        "src": "4230:11:10"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1479,
                    "nodeType": "StructuredDocumentation",
                    "src": "3879:192:10",
                    "text": " @dev See {IERC20-transfer}.\n Requirements:\n - `recipient` cannot be the zero address.\n - the caller must have a balance of at least `amount`."
                  },
                  "functionSelector": "a9059cbb",
                  "id": 1499,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "transfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 1485,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "4144:8:10"
                  },
                  "parameters": {
                    "id": 1484,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1481,
                        "mutability": "mutable",
                        "name": "recipient",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1499,
                        "src": "4094:17:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1480,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4094:7:10",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1483,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1499,
                        "src": "4113:14:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1482,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4113:7:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4093:35:10"
                  },
                  "returnParameters": {
                    "id": 1488,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1487,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1499,
                        "src": "4162:4:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1486,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "4162:4:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4161:6:10"
                  },
                  "scope": 1882,
                  "src": "4076:172:10",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    1919
                  ],
                  "body": {
                    "id": 1516,
                    "nodeType": "Block",
                    "src": "4404:51:10",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 1510,
                              "name": "_allowances",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1378,
                              "src": "4421:11:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                "typeString": "mapping(address => mapping(address => uint256))"
                              }
                            },
                            "id": 1512,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 1511,
                              "name": "owner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1502,
                              "src": "4433:5:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "4421:18:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                              "typeString": "mapping(address => uint256)"
                            }
                          },
                          "id": 1514,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 1513,
                            "name": "spender",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1504,
                            "src": "4440:7:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "4421:27:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 1509,
                        "id": 1515,
                        "nodeType": "Return",
                        "src": "4414:34:10"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1500,
                    "nodeType": "StructuredDocumentation",
                    "src": "4254:47:10",
                    "text": " @dev See {IERC20-allowance}."
                  },
                  "functionSelector": "dd62ed3e",
                  "id": 1517,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "allowance",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 1506,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "4377:8:10"
                  },
                  "parameters": {
                    "id": 1505,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1502,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1517,
                        "src": "4325:13:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1501,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4325:7:10",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1504,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1517,
                        "src": "4340:15:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1503,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4340:7:10",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4324:32:10"
                  },
                  "returnParameters": {
                    "id": 1509,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1508,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1517,
                        "src": "4395:7:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1507,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4395:7:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4394:9:10"
                  },
                  "scope": 1882,
                  "src": "4306:149:10",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    1929
                  ],
                  "body": {
                    "id": 1537,
                    "nodeType": "Block",
                    "src": "4682:77:10",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 1529,
                                "name": "_msgSender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3611,
                                "src": "4701:10:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                  "typeString": "function () view returns (address payable)"
                                }
                              },
                              "id": 1530,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "4701:12:10",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1531,
                              "name": "spender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1520,
                              "src": "4715:7:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1532,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1522,
                              "src": "4724:6:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 1528,
                            "name": "_approve",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1855,
                            "src": "4692:8:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 1533,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4692:39:10",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1534,
                        "nodeType": "ExpressionStatement",
                        "src": "4692:39:10"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 1535,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "4748:4:10",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 1527,
                        "id": 1536,
                        "nodeType": "Return",
                        "src": "4741:11:10"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1518,
                    "nodeType": "StructuredDocumentation",
                    "src": "4461:127:10",
                    "text": " @dev See {IERC20-approve}.\n Requirements:\n - `spender` cannot be the zero address."
                  },
                  "functionSelector": "095ea7b3",
                  "id": 1538,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "approve",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 1524,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "4658:8:10"
                  },
                  "parameters": {
                    "id": 1523,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1520,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1538,
                        "src": "4610:15:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1519,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4610:7:10",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1522,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1538,
                        "src": "4627:14:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1521,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4627:7:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4609:33:10"
                  },
                  "returnParameters": {
                    "id": 1527,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1526,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1538,
                        "src": "4676:4:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1525,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "4676:4:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4675:6:10"
                  },
                  "scope": 1882,
                  "src": "4593:166:10",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    1941
                  ],
                  "body": {
                    "id": 1575,
                    "nodeType": "Block",
                    "src": "5338:205:10",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1552,
                              "name": "sender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1541,
                              "src": "5358:6:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1553,
                              "name": "recipient",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1543,
                              "src": "5366:9:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1554,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1545,
                              "src": "5377:6:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 1551,
                            "name": "_transfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1699,
                            "src": "5348:9:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 1555,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5348:36:10",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1556,
                        "nodeType": "ExpressionStatement",
                        "src": "5348:36:10"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1558,
                              "name": "sender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1541,
                              "src": "5403:6:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 1559,
                                "name": "_msgSender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3611,
                                "src": "5411:10:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                  "typeString": "function () view returns (address payable)"
                                }
                              },
                              "id": 1560,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5411:12:10",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 1568,
                                  "name": "amount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1545,
                                  "src": "5463:6:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "hexValue": "45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365",
                                  "id": 1569,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "5471:42:10",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_974d1b4421da69cc60b481194f0dad36a5bb4e23da810da7a7fb30cdba178330",
                                    "typeString": "literal_string \"ERC20: transfer amount exceeds allowance\""
                                  },
                                  "value": "ERC20: transfer amount exceeds allowance"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_stringliteral_974d1b4421da69cc60b481194f0dad36a5bb4e23da810da7a7fb30cdba178330",
                                    "typeString": "literal_string \"ERC20: transfer amount exceeds allowance\""
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 1561,
                                      "name": "_allowances",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1378,
                                      "src": "5425:11:10",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                        "typeString": "mapping(address => mapping(address => uint256))"
                                      }
                                    },
                                    "id": 1563,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 1562,
                                      "name": "sender",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1541,
                                      "src": "5437:6:10",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "5425:19:10",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                      "typeString": "mapping(address => uint256)"
                                    }
                                  },
                                  "id": 1566,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "arguments": [],
                                    "expression": {
                                      "argumentTypes": [],
                                      "id": 1564,
                                      "name": "_msgSender",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3611,
                                      "src": "5445:10:10",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                        "typeString": "function () view returns (address payable)"
                                      }
                                    },
                                    "id": 1565,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "5445:12:10",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "5425:33:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 1567,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sub",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 1237,
                                "src": "5425:37:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_string_memory_ptr_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                  "typeString": "function (uint256,uint256,string memory) pure returns (uint256)"
                                }
                              },
                              "id": 1570,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5425:89:10",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 1557,
                            "name": "_approve",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1855,
                            "src": "5394:8:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 1571,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5394:121:10",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1572,
                        "nodeType": "ExpressionStatement",
                        "src": "5394:121:10"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 1573,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "5532:4:10",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 1550,
                        "id": 1574,
                        "nodeType": "Return",
                        "src": "5525:11:10"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1539,
                    "nodeType": "StructuredDocumentation",
                    "src": "4765:456:10",
                    "text": " @dev See {IERC20-transferFrom}.\n Emits an {Approval} event indicating the updated allowance. This is not\n required by the EIP. See the note at the beginning of {ERC20}.\n Requirements:\n - `sender` and `recipient` cannot be the zero address.\n - `sender` must have a balance of at least `amount`.\n - the caller must have allowance for ``sender``'s tokens of at least\n `amount`."
                  },
                  "functionSelector": "23b872dd",
                  "id": 1576,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "transferFrom",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 1547,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "5314:8:10"
                  },
                  "parameters": {
                    "id": 1546,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1541,
                        "mutability": "mutable",
                        "name": "sender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1576,
                        "src": "5248:14:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1540,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5248:7:10",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1543,
                        "mutability": "mutable",
                        "name": "recipient",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1576,
                        "src": "5264:17:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1542,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5264:7:10",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1545,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1576,
                        "src": "5283:14:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1544,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5283:7:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5247:51:10"
                  },
                  "returnParameters": {
                    "id": 1550,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1549,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1576,
                        "src": "5332:4:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1548,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "5332:4:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5331:6:10"
                  },
                  "scope": 1882,
                  "src": "5226:317:10",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1603,
                    "nodeType": "Block",
                    "src": "6032:121:10",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 1587,
                                "name": "_msgSender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3611,
                                "src": "6051:10:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                  "typeString": "function () view returns (address payable)"
                                }
                              },
                              "id": 1588,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6051:12:10",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1589,
                              "name": "spender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1579,
                              "src": "6065:7:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 1597,
                                  "name": "addedValue",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1581,
                                  "src": "6113:10:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 1590,
                                      "name": "_allowances",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1378,
                                      "src": "6074:11:10",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                        "typeString": "mapping(address => mapping(address => uint256))"
                                      }
                                    },
                                    "id": 1593,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "arguments": [],
                                      "expression": {
                                        "argumentTypes": [],
                                        "id": 1591,
                                        "name": "_msgSender",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 3611,
                                        "src": "6086:10:10",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                          "typeString": "function () view returns (address payable)"
                                        }
                                      },
                                      "id": 1592,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "6086:12:10",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address_payable",
                                        "typeString": "address payable"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "6074:25:10",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                      "typeString": "mapping(address => uint256)"
                                    }
                                  },
                                  "id": 1595,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 1594,
                                    "name": "spender",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1579,
                                    "src": "6100:7:10",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "6074:34:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 1596,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "add",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 1113,
                                "src": "6074:38:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                  "typeString": "function (uint256,uint256) pure returns (uint256)"
                                }
                              },
                              "id": 1598,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6074:50:10",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 1586,
                            "name": "_approve",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1855,
                            "src": "6042:8:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 1599,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6042:83:10",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1600,
                        "nodeType": "ExpressionStatement",
                        "src": "6042:83:10"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 1601,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "6142:4:10",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 1585,
                        "id": 1602,
                        "nodeType": "Return",
                        "src": "6135:11:10"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1577,
                    "nodeType": "StructuredDocumentation",
                    "src": "5549:384:10",
                    "text": " @dev Atomically increases the allowance granted to `spender` by the caller.\n This is an alternative to {approve} that can be used as a mitigation for\n problems described in {IERC20-approve}.\n Emits an {Approval} event indicating the updated allowance.\n Requirements:\n - `spender` cannot be the zero address."
                  },
                  "functionSelector": "39509351",
                  "id": 1604,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "increaseAllowance",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1582,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1579,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1604,
                        "src": "5965:15:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1578,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5965:7:10",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1581,
                        "mutability": "mutable",
                        "name": "addedValue",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1604,
                        "src": "5982:18:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1580,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5982:7:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5964:37:10"
                  },
                  "returnParameters": {
                    "id": 1585,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1584,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1604,
                        "src": "6026:4:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1583,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "6026:4:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6025:6:10"
                  },
                  "scope": 1882,
                  "src": "5938:215:10",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1632,
                    "nodeType": "Block",
                    "src": "6739:167:10",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 1615,
                                "name": "_msgSender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3611,
                                "src": "6758:10:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                  "typeString": "function () view returns (address payable)"
                                }
                              },
                              "id": 1616,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6758:12:10",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1617,
                              "name": "spender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1607,
                              "src": "6772:7:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 1625,
                                  "name": "subtractedValue",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1609,
                                  "src": "6820:15:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "hexValue": "45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f",
                                  "id": 1626,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "6837:39:10",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_f8b476f7d28209d77d4a4ac1fe36b9f8259aa1bb6bddfa6e89de7e51615cf8a8",
                                    "typeString": "literal_string \"ERC20: decreased allowance below zero\""
                                  },
                                  "value": "ERC20: decreased allowance below zero"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_stringliteral_f8b476f7d28209d77d4a4ac1fe36b9f8259aa1bb6bddfa6e89de7e51615cf8a8",
                                    "typeString": "literal_string \"ERC20: decreased allowance below zero\""
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 1618,
                                      "name": "_allowances",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1378,
                                      "src": "6781:11:10",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                        "typeString": "mapping(address => mapping(address => uint256))"
                                      }
                                    },
                                    "id": 1621,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "arguments": [],
                                      "expression": {
                                        "argumentTypes": [],
                                        "id": 1619,
                                        "name": "_msgSender",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 3611,
                                        "src": "6793:10:10",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                          "typeString": "function () view returns (address payable)"
                                        }
                                      },
                                      "id": 1620,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "6793:12:10",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address_payable",
                                        "typeString": "address payable"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "6781:25:10",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                      "typeString": "mapping(address => uint256)"
                                    }
                                  },
                                  "id": 1623,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 1622,
                                    "name": "spender",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1607,
                                    "src": "6807:7:10",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "6781:34:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 1624,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sub",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 1237,
                                "src": "6781:38:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_string_memory_ptr_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                  "typeString": "function (uint256,uint256,string memory) pure returns (uint256)"
                                }
                              },
                              "id": 1627,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6781:96:10",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 1614,
                            "name": "_approve",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1855,
                            "src": "6749:8:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 1628,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6749:129:10",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1629,
                        "nodeType": "ExpressionStatement",
                        "src": "6749:129:10"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 1630,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "6895:4:10",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 1613,
                        "id": 1631,
                        "nodeType": "Return",
                        "src": "6888:11:10"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1605,
                    "nodeType": "StructuredDocumentation",
                    "src": "6159:476:10",
                    "text": " @dev Atomically decreases the allowance granted to `spender` by the caller.\n This is an alternative to {approve} that can be used as a mitigation for\n problems described in {IERC20-approve}.\n Emits an {Approval} event indicating the updated allowance.\n Requirements:\n - `spender` cannot be the zero address.\n - `spender` must have allowance for the caller of at least\n `subtractedValue`."
                  },
                  "functionSelector": "a457c2d7",
                  "id": 1633,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "decreaseAllowance",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1610,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1607,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1633,
                        "src": "6667:15:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1606,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6667:7:10",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1609,
                        "mutability": "mutable",
                        "name": "subtractedValue",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1633,
                        "src": "6684:23:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1608,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6684:7:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6666:42:10"
                  },
                  "returnParameters": {
                    "id": 1613,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1612,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1633,
                        "src": "6733:4:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1611,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "6733:4:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6732:6:10"
                  },
                  "scope": 1882,
                  "src": "6640:266:10",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 1698,
                    "nodeType": "Block",
                    "src": "7467:443:10",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 1649,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1644,
                                "name": "sender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1636,
                                "src": "7485:6:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 1647,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "7503:1:10",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 1646,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "7495:7:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 1645,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "7495:7:10",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 1648,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "7495:10:10",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "7485:20:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "45524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373",
                              "id": 1650,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7507:39:10",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea",
                                "typeString": "literal_string \"ERC20: transfer from the zero address\""
                              },
                              "value": "ERC20: transfer from the zero address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea",
                                "typeString": "literal_string \"ERC20: transfer from the zero address\""
                              }
                            ],
                            "id": 1643,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "7477:7:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1651,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7477:70:10",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1652,
                        "nodeType": "ExpressionStatement",
                        "src": "7477:70:10"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 1659,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1654,
                                "name": "recipient",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1638,
                                "src": "7565:9:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 1657,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "7586:1:10",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 1656,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "7578:7:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 1655,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "7578:7:10",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 1658,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "7578:10:10",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "7565:23:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "45524332303a207472616e7366657220746f20746865207a65726f2061646472657373",
                              "id": 1660,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7590:37:10",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f",
                                "typeString": "literal_string \"ERC20: transfer to the zero address\""
                              },
                              "value": "ERC20: transfer to the zero address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f",
                                "typeString": "literal_string \"ERC20: transfer to the zero address\""
                              }
                            ],
                            "id": 1653,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "7557:7:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1661,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7557:71:10",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1662,
                        "nodeType": "ExpressionStatement",
                        "src": "7557:71:10"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1664,
                              "name": "sender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1636,
                              "src": "7660:6:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1665,
                              "name": "recipient",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1638,
                              "src": "7668:9:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1666,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1640,
                              "src": "7679:6:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 1663,
                            "name": "_beforeTokenTransfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1877,
                            "src": "7639:20:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 1667,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7639:47:10",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1668,
                        "nodeType": "ExpressionStatement",
                        "src": "7639:47:10"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1679,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 1669,
                              "name": "_balances",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1372,
                              "src": "7697:9:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 1671,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 1670,
                              "name": "sender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1636,
                              "src": "7707:6:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "7697:17:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1676,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1640,
                                "src": "7739:6:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365",
                                "id": 1677,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "string",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "7747:40:10",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_stringliteral_4107e8a8b9e94bf8ff83080ddec1c0bffe897ebc2241b89d44f66b3d274088b6",
                                  "typeString": "literal_string \"ERC20: transfer amount exceeds balance\""
                                },
                                "value": "ERC20: transfer amount exceeds balance"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_4107e8a8b9e94bf8ff83080ddec1c0bffe897ebc2241b89d44f66b3d274088b6",
                                  "typeString": "literal_string \"ERC20: transfer amount exceeds balance\""
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 1672,
                                  "name": "_balances",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1372,
                                  "src": "7717:9:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 1674,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 1673,
                                  "name": "sender",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1636,
                                  "src": "7727:6:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "7717:17:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 1675,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1237,
                              "src": "7717:21:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_string_memory_ptr_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256,string memory) pure returns (uint256)"
                              }
                            },
                            "id": 1678,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "7717:71:10",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "7697:91:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1680,
                        "nodeType": "ExpressionStatement",
                        "src": "7697:91:10"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1690,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 1681,
                              "name": "_balances",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1372,
                              "src": "7798:9:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 1683,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 1682,
                              "name": "recipient",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1638,
                              "src": "7808:9:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "7798:20:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1688,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1640,
                                "src": "7846:6:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 1684,
                                  "name": "_balances",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1372,
                                  "src": "7821:9:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 1686,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 1685,
                                  "name": "recipient",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1638,
                                  "src": "7831:9:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "7821:20:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 1687,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1113,
                              "src": "7821:24:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 1689,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "7821:32:10",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "7798:55:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1691,
                        "nodeType": "ExpressionStatement",
                        "src": "7798:55:10"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1693,
                              "name": "sender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1636,
                              "src": "7877:6:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1694,
                              "name": "recipient",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1638,
                              "src": "7885:9:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1695,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1640,
                              "src": "7896:6:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 1692,
                            "name": "Transfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1950,
                            "src": "7868:8:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 1696,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7868:35:10",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1697,
                        "nodeType": "EmitStatement",
                        "src": "7863:40:10"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1634,
                    "nodeType": "StructuredDocumentation",
                    "src": "6912:463:10",
                    "text": " @dev Moves tokens `amount` from `sender` to `recipient`.\n This is internal function is equivalent to {transfer}, and can be used to\n e.g. implement automatic token fees, slashing mechanisms, etc.\n Emits a {Transfer} event.\n Requirements:\n - `sender` cannot be the zero address.\n - `recipient` cannot be the zero address.\n - `sender` must have a balance of at least `amount`."
                  },
                  "id": 1699,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_transfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1641,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1636,
                        "mutability": "mutable",
                        "name": "sender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1699,
                        "src": "7399:14:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1635,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7399:7:10",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1638,
                        "mutability": "mutable",
                        "name": "recipient",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1699,
                        "src": "7415:17:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1637,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7415:7:10",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1640,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1699,
                        "src": "7434:14:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1639,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7434:7:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7398:51:10"
                  },
                  "returnParameters": {
                    "id": 1642,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "7467:0:10"
                  },
                  "scope": 1882,
                  "src": "7380:530:10",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1753,
                    "nodeType": "Block",
                    "src": "8246:305:10",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 1713,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1708,
                                "name": "account",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1702,
                                "src": "8264:7:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 1711,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "8283:1:10",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 1710,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "8275:7:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 1709,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "8275:7:10",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 1712,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "8275:10:10",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "8264:21:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "45524332303a206d696e7420746f20746865207a65726f2061646472657373",
                              "id": 1714,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "8287:33:10",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e",
                                "typeString": "literal_string \"ERC20: mint to the zero address\""
                              },
                              "value": "ERC20: mint to the zero address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e",
                                "typeString": "literal_string \"ERC20: mint to the zero address\""
                              }
                            ],
                            "id": 1707,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "8256:7:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1715,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8256:65:10",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1716,
                        "nodeType": "ExpressionStatement",
                        "src": "8256:65:10"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 1720,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "8361:1:10",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 1719,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "8353:7:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 1718,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "8353:7:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 1721,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "8353:10:10",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1722,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1702,
                              "src": "8365:7:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1723,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1704,
                              "src": "8374:6:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 1717,
                            "name": "_beforeTokenTransfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1877,
                            "src": "8332:20:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 1724,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8332:49:10",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1725,
                        "nodeType": "ExpressionStatement",
                        "src": "8332:49:10"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1731,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1726,
                            "name": "_totalSupply",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1380,
                            "src": "8392:12:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1729,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1704,
                                "src": "8424:6:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 1727,
                                "name": "_totalSupply",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1380,
                                "src": "8407:12:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 1728,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1113,
                              "src": "8407:16:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 1730,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "8407:24:10",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "8392:39:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1732,
                        "nodeType": "ExpressionStatement",
                        "src": "8392:39:10"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1742,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 1733,
                              "name": "_balances",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1372,
                              "src": "8441:9:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 1735,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 1734,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1702,
                              "src": "8451:7:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "8441:18:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1740,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1704,
                                "src": "8485:6:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 1736,
                                  "name": "_balances",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1372,
                                  "src": "8462:9:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 1738,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 1737,
                                  "name": "account",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1702,
                                  "src": "8472:7:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "8462:18:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 1739,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1113,
                              "src": "8462:22:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 1741,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "8462:30:10",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "8441:51:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1743,
                        "nodeType": "ExpressionStatement",
                        "src": "8441:51:10"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 1747,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "8524:1:10",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 1746,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "8516:7:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 1745,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "8516:7:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 1748,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "8516:10:10",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1749,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1702,
                              "src": "8528:7:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1750,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1704,
                              "src": "8537:6:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 1744,
                            "name": "Transfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1950,
                            "src": "8507:8:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 1751,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8507:37:10",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1752,
                        "nodeType": "EmitStatement",
                        "src": "8502:42:10"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1700,
                    "nodeType": "StructuredDocumentation",
                    "src": "7916:260:10",
                    "text": "@dev Creates `amount` tokens and assigns them to `account`, increasing\n the total supply.\n Emits a {Transfer} event with `from` set to the zero address.\n Requirements:\n - `to` cannot be the zero address."
                  },
                  "id": 1754,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_mint",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1705,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1702,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1754,
                        "src": "8196:15:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1701,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8196:7:10",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1704,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1754,
                        "src": "8213:14:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1703,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "8213:7:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8195:33:10"
                  },
                  "returnParameters": {
                    "id": 1706,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "8246:0:10"
                  },
                  "scope": 1882,
                  "src": "8181:370:10",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1809,
                    "nodeType": "Block",
                    "src": "8936:345:10",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 1768,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1763,
                                "name": "account",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1757,
                                "src": "8954:7:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 1766,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "8973:1:10",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 1765,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "8965:7:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 1764,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "8965:7:10",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 1767,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "8965:10:10",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "8954:21:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "45524332303a206275726e2066726f6d20746865207a65726f2061646472657373",
                              "id": 1769,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "8977:35:10",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_b16788493b576042bb52c50ed56189e0b250db113c7bfb1c3897d25cf9632d7f",
                                "typeString": "literal_string \"ERC20: burn from the zero address\""
                              },
                              "value": "ERC20: burn from the zero address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_b16788493b576042bb52c50ed56189e0b250db113c7bfb1c3897d25cf9632d7f",
                                "typeString": "literal_string \"ERC20: burn from the zero address\""
                              }
                            ],
                            "id": 1762,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "8946:7:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1770,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8946:67:10",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1771,
                        "nodeType": "ExpressionStatement",
                        "src": "8946:67:10"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1773,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1757,
                              "src": "9045:7:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 1776,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "9062:1:10",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 1775,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "9054:7:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 1774,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "9054:7:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 1777,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "9054:10:10",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1778,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1759,
                              "src": "9066:6:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 1772,
                            "name": "_beforeTokenTransfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1877,
                            "src": "9024:20:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 1779,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9024:49:10",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1780,
                        "nodeType": "ExpressionStatement",
                        "src": "9024:49:10"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1791,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 1781,
                              "name": "_balances",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1372,
                              "src": "9084:9:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 1783,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 1782,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1757,
                              "src": "9094:7:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "9084:18:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1788,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1759,
                                "src": "9128:6:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "45524332303a206275726e20616d6f756e7420657863656564732062616c616e6365",
                                "id": 1789,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "string",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "9136:36:10",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_stringliteral_149b126e7125232b4200af45303d04fba8b74653b1a295a6a561a528c33fefdd",
                                  "typeString": "literal_string \"ERC20: burn amount exceeds balance\""
                                },
                                "value": "ERC20: burn amount exceeds balance"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_149b126e7125232b4200af45303d04fba8b74653b1a295a6a561a528c33fefdd",
                                  "typeString": "literal_string \"ERC20: burn amount exceeds balance\""
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 1784,
                                  "name": "_balances",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1372,
                                  "src": "9105:9:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 1786,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 1785,
                                  "name": "account",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1757,
                                  "src": "9115:7:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "9105:18:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 1787,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1237,
                              "src": "9105:22:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_string_memory_ptr_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256,string memory) pure returns (uint256)"
                              }
                            },
                            "id": 1790,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "9105:68:10",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "9084:89:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1792,
                        "nodeType": "ExpressionStatement",
                        "src": "9084:89:10"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1798,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1793,
                            "name": "_totalSupply",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1380,
                            "src": "9183:12:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 1796,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1759,
                                "src": "9215:6:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 1794,
                                "name": "_totalSupply",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1380,
                                "src": "9198:12:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 1795,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1135,
                              "src": "9198:16:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 1797,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "9198:24:10",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "9183:39:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1799,
                        "nodeType": "ExpressionStatement",
                        "src": "9183:39:10"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1801,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1757,
                              "src": "9246:7:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 1804,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "9263:1:10",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 1803,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "9255:7:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 1802,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "9255:7:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 1805,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "9255:10:10",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1806,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1759,
                              "src": "9267:6:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 1800,
                            "name": "Transfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1950,
                            "src": "9237:8:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 1807,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9237:37:10",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1808,
                        "nodeType": "EmitStatement",
                        "src": "9232:42:10"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1755,
                    "nodeType": "StructuredDocumentation",
                    "src": "8557:309:10",
                    "text": " @dev Destroys `amount` tokens from `account`, reducing the\n total supply.\n Emits a {Transfer} event with `to` set to the zero address.\n Requirements:\n - `account` cannot be the zero address.\n - `account` must have at least `amount` tokens."
                  },
                  "id": 1810,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_burn",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1760,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1757,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1810,
                        "src": "8886:15:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1756,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8886:7:10",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1759,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1810,
                        "src": "8903:14:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1758,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "8903:7:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8885:33:10"
                  },
                  "returnParameters": {
                    "id": 1761,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "8936:0:10"
                  },
                  "scope": 1882,
                  "src": "8871:410:10",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1854,
                    "nodeType": "Block",
                    "src": "9787:257:10",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 1826,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1821,
                                "name": "owner",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1813,
                                "src": "9805:5:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 1824,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "9822:1:10",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 1823,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "9814:7:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 1822,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "9814:7:10",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 1825,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "9814:10:10",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "9805:19:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "45524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373",
                              "id": 1827,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "9826:38:10",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208",
                                "typeString": "literal_string \"ERC20: approve from the zero address\""
                              },
                              "value": "ERC20: approve from the zero address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208",
                                "typeString": "literal_string \"ERC20: approve from the zero address\""
                              }
                            ],
                            "id": 1820,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "9797:7:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1828,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9797:68:10",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1829,
                        "nodeType": "ExpressionStatement",
                        "src": "9797:68:10"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 1836,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 1831,
                                "name": "spender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1815,
                                "src": "9883:7:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 1834,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "9902:1:10",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 1833,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "9894:7:10",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 1832,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "9894:7:10",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 1835,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "9894:10:10",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "9883:21:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "45524332303a20617070726f766520746f20746865207a65726f2061646472657373",
                              "id": 1837,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "9906:36:10",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029",
                                "typeString": "literal_string \"ERC20: approve to the zero address\""
                              },
                              "value": "ERC20: approve to the zero address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029",
                                "typeString": "literal_string \"ERC20: approve to the zero address\""
                              }
                            ],
                            "id": 1830,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "9875:7:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 1838,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9875:68:10",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1839,
                        "nodeType": "ExpressionStatement",
                        "src": "9875:68:10"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1846,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 1840,
                                "name": "_allowances",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1378,
                                "src": "9954:11:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                  "typeString": "mapping(address => mapping(address => uint256))"
                                }
                              },
                              "id": 1843,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 1841,
                                "name": "owner",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1813,
                                "src": "9966:5:10",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "9954:18:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 1844,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 1842,
                              "name": "spender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1815,
                              "src": "9973:7:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "9954:27:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 1845,
                            "name": "amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1817,
                            "src": "9984:6:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "9954:36:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 1847,
                        "nodeType": "ExpressionStatement",
                        "src": "9954:36:10"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1849,
                              "name": "owner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1813,
                              "src": "10014:5:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1850,
                              "name": "spender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1815,
                              "src": "10021:7:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 1851,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1817,
                              "src": "10030:6:10",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 1848,
                            "name": "Approval",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1959,
                            "src": "10005:8:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 1852,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10005:32:10",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1853,
                        "nodeType": "EmitStatement",
                        "src": "10000:37:10"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1811,
                    "nodeType": "StructuredDocumentation",
                    "src": "9287:412:10",
                    "text": " @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n This internal function is equivalent to `approve`, and can be used to\n e.g. set automatic allowances for certain subsystems, etc.\n Emits an {Approval} event.\n Requirements:\n - `owner` cannot be the zero address.\n - `spender` cannot be the zero address."
                  },
                  "id": 1855,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_approve",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1818,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1813,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1855,
                        "src": "9722:13:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1812,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "9722:7:10",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1815,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1855,
                        "src": "9737:15:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1814,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "9737:7:10",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1817,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1855,
                        "src": "9754:14:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1816,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "9754:7:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9721:48:10"
                  },
                  "returnParameters": {
                    "id": 1819,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "9787:0:10"
                  },
                  "scope": 1882,
                  "src": "9704:340:10",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1865,
                    "nodeType": "Block",
                    "src": "10425:38:10",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 1863,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 1861,
                            "name": "_decimals",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1386,
                            "src": "10435:9:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 1862,
                            "name": "decimals_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1858,
                            "src": "10447:9:10",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            }
                          },
                          "src": "10435:21:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "id": 1864,
                        "nodeType": "ExpressionStatement",
                        "src": "10435:21:10"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 1856,
                    "nodeType": "StructuredDocumentation",
                    "src": "10050:312:10",
                    "text": " @dev Sets {decimals} to a value other than the default one of 18.\n WARNING: This function should only be called from the constructor. Most\n applications that interact with token contracts will not expect\n {decimals} to ever change, and may work incorrectly if it does."
                  },
                  "id": 1866,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_setupDecimals",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1859,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1858,
                        "mutability": "mutable",
                        "name": "decimals_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1866,
                        "src": "10391:15:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 1857,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "10391:5:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10390:17:10"
                  },
                  "returnParameters": {
                    "id": 1860,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "10425:0:10"
                  },
                  "scope": 1882,
                  "src": "10367:96:10",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 1876,
                    "nodeType": "Block",
                    "src": "11139:3:10",
                    "statements": []
                  },
                  "documentation": {
                    "id": 1867,
                    "nodeType": "StructuredDocumentation",
                    "src": "10469:576:10",
                    "text": " @dev Hook that is called before any transfer of tokens. This includes\n minting and burning.\n Calling conditions:\n - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n will be to transferred to `to`.\n - when `from` is zero, `amount` tokens will be minted for `to`.\n - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n - `from` and `to` are never both zero.\n To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]."
                  },
                  "id": 1877,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_beforeTokenTransfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1874,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1869,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1877,
                        "src": "11080:12:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1868,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "11080:7:10",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1871,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1877,
                        "src": "11094:10:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1870,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "11094:7:10",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1873,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1877,
                        "src": "11106:14:10",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1872,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11106:7:10",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11079:42:10"
                  },
                  "returnParameters": {
                    "id": 1875,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "11139:0:10"
                  },
                  "scope": 1882,
                  "src": "11050:92:10",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 1881,
                  "mutability": "mutable",
                  "name": "__gap",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 1882,
                  "src": "11147:25:10",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$44_storage",
                    "typeString": "uint256[44]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 1878,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "11147:7:10",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 1880,
                    "length": {
                      "argumentTypes": null,
                      "hexValue": "3434",
                      "id": 1879,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "11155:2:10",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_44_by_1",
                        "typeString": "int_const 44"
                      },
                      "value": "44"
                    },
                    "nodeType": "ArrayTypeName",
                    "src": "11147:11:10",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$44_storage_ptr",
                      "typeString": "uint256[44]"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                }
              ],
              "scope": 1883,
              "src": "1394:9781:10"
            }
          ],
          "src": "33:11143:10"
        },
        "id": 10
      },
      "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
          "exportedSymbols": {
            "IERC20Upgradeable": [
              1960
            ]
          },
          "id": 1961,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 1884,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:11"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": {
                "id": 1885,
                "nodeType": "StructuredDocumentation",
                "src": "66:70:11",
                "text": " @dev Interface of the ERC20 standard as defined in the EIP."
              },
              "fullyImplemented": false,
              "id": 1960,
              "linearizedBaseContracts": [
                1960
              ],
              "name": "IERC20Upgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 1886,
                    "nodeType": "StructuredDocumentation",
                    "src": "171:66:11",
                    "text": " @dev Returns the amount of tokens in existence."
                  },
                  "functionSelector": "18160ddd",
                  "id": 1891,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "totalSupply",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1887,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "262:2:11"
                  },
                  "returnParameters": {
                    "id": 1890,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1889,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1891,
                        "src": "288:7:11",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1888,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "288:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "287:9:11"
                  },
                  "scope": 1960,
                  "src": "242:55:11",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 1892,
                    "nodeType": "StructuredDocumentation",
                    "src": "303:72:11",
                    "text": " @dev Returns the amount of tokens owned by `account`."
                  },
                  "functionSelector": "70a08231",
                  "id": 1899,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "balanceOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1895,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1894,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1899,
                        "src": "399:15:11",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1893,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "399:7:11",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "398:17:11"
                  },
                  "returnParameters": {
                    "id": 1898,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1897,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1899,
                        "src": "439:7:11",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1896,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "439:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "438:9:11"
                  },
                  "scope": 1960,
                  "src": "380:68:11",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 1900,
                    "nodeType": "StructuredDocumentation",
                    "src": "454:209:11",
                    "text": " @dev Moves `amount` tokens from the caller's account to `recipient`.\n Returns a boolean value indicating whether the operation succeeded.\n Emits a {Transfer} event."
                  },
                  "functionSelector": "a9059cbb",
                  "id": 1909,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "transfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1905,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1902,
                        "mutability": "mutable",
                        "name": "recipient",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1909,
                        "src": "686:17:11",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1901,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "686:7:11",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1904,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1909,
                        "src": "705:14:11",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1903,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "705:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "685:35:11"
                  },
                  "returnParameters": {
                    "id": 1908,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1907,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1909,
                        "src": "739:4:11",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1906,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "739:4:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "738:6:11"
                  },
                  "scope": 1960,
                  "src": "668:77:11",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 1910,
                    "nodeType": "StructuredDocumentation",
                    "src": "751:264:11",
                    "text": " @dev Returns the remaining number of tokens that `spender` will be\n allowed to spend on behalf of `owner` through {transferFrom}. This is\n zero by default.\n This value changes when {approve} or {transferFrom} are called."
                  },
                  "functionSelector": "dd62ed3e",
                  "id": 1919,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "allowance",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1915,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1912,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1919,
                        "src": "1039:13:11",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1911,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1039:7:11",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1914,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1919,
                        "src": "1054:15:11",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1913,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1054:7:11",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1038:32:11"
                  },
                  "returnParameters": {
                    "id": 1918,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1917,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1919,
                        "src": "1094:7:11",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1916,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1094:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1093:9:11"
                  },
                  "scope": 1960,
                  "src": "1020:83:11",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 1920,
                    "nodeType": "StructuredDocumentation",
                    "src": "1109:642:11",
                    "text": " @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n Returns a boolean value indicating whether the operation succeeded.\n IMPORTANT: Beware that changing an allowance with this method brings the risk\n that someone may use both the old and the new allowance by unfortunate\n transaction ordering. One possible solution to mitigate this race\n condition is to first reduce the spender's allowance to 0 and set the\n desired value afterwards:\n https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n Emits an {Approval} event."
                  },
                  "functionSelector": "095ea7b3",
                  "id": 1929,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "approve",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1925,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1922,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1929,
                        "src": "1773:15:11",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1921,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1773:7:11",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1924,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1929,
                        "src": "1790:14:11",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1923,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1790:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1772:33:11"
                  },
                  "returnParameters": {
                    "id": 1928,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1927,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1929,
                        "src": "1824:4:11",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1926,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "1824:4:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1823:6:11"
                  },
                  "scope": 1960,
                  "src": "1756:74:11",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 1930,
                    "nodeType": "StructuredDocumentation",
                    "src": "1836:296:11",
                    "text": " @dev Moves `amount` tokens from `sender` to `recipient` using the\n allowance mechanism. `amount` is then deducted from the caller's\n allowance.\n Returns a boolean value indicating whether the operation succeeded.\n Emits a {Transfer} event."
                  },
                  "functionSelector": "23b872dd",
                  "id": 1941,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "transferFrom",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1937,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1932,
                        "mutability": "mutable",
                        "name": "sender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1941,
                        "src": "2159:14:11",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1931,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2159:7:11",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1934,
                        "mutability": "mutable",
                        "name": "recipient",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1941,
                        "src": "2175:17:11",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1933,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2175:7:11",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1936,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1941,
                        "src": "2194:14:11",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1935,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2194:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2158:51:11"
                  },
                  "returnParameters": {
                    "id": 1940,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1939,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1941,
                        "src": "2228:4:11",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 1938,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "2228:4:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2227:6:11"
                  },
                  "scope": 1960,
                  "src": "2137:97:11",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 1942,
                    "nodeType": "StructuredDocumentation",
                    "src": "2240:158:11",
                    "text": " @dev Emitted when `value` tokens are moved from one account (`from`) to\n another (`to`).\n Note that `value` may be zero."
                  },
                  "id": 1950,
                  "name": "Transfer",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1949,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1944,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1950,
                        "src": "2418:20:11",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1943,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2418:7:11",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1946,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1950,
                        "src": "2440:18:11",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1945,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2440:7:11",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1948,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1950,
                        "src": "2460:13:11",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1947,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2460:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2417:57:11"
                  },
                  "src": "2403:72:11"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 1951,
                    "nodeType": "StructuredDocumentation",
                    "src": "2481:148:11",
                    "text": " @dev Emitted when the allowance of a `spender` for an `owner` is set by\n a call to {approve}. `value` is the new allowance."
                  },
                  "id": 1959,
                  "name": "Approval",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 1958,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1953,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1959,
                        "src": "2649:21:11",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1952,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2649:7:11",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1955,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1959,
                        "src": "2672:23:11",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1954,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2672:7:11",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1957,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1959,
                        "src": "2697:13:11",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1956,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2697:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2648:63:11"
                  },
                  "src": "2634:78:11"
                }
              ],
              "scope": 1961,
              "src": "137:2577:11"
            }
          ],
          "src": "33:2682:11"
        },
        "id": 11
      },
      "@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol",
          "exportedSymbols": {
            "SafeERC20Upgradeable": [
              2173
            ]
          },
          "id": 2174,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 1962,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:12"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "file": "./IERC20Upgradeable.sol",
              "id": 1963,
              "nodeType": "ImportDirective",
              "scope": 2174,
              "sourceUnit": 1961,
              "src": "66:33:12",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol",
              "file": "../../math/SafeMathUpgradeable.sol",
              "id": 1964,
              "nodeType": "ImportDirective",
              "scope": 2174,
              "sourceUnit": 1287,
              "src": "100:44:12",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol",
              "file": "../../utils/AddressUpgradeable.sol",
              "id": 1965,
              "nodeType": "ImportDirective",
              "scope": 2174,
              "sourceUnit": 3583,
              "src": "145:44:12",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 1966,
                "nodeType": "StructuredDocumentation",
                "src": "191:457:12",
                "text": " @title SafeERC20\n @dev Wrappers around ERC20 operations that throw on failure (when the token\n contract returns false). Tokens that return no value (and instead revert or\n throw on failure) are also supported, non-reverting calls are assumed to be\n successful.\n To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n which allows you to call the safe operations as `token.safeTransfer(...)`, etc."
              },
              "fullyImplemented": true,
              "id": 2173,
              "linearizedBaseContracts": [
                2173
              ],
              "name": "SafeERC20Upgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 1969,
                  "libraryName": {
                    "contractScope": null,
                    "id": 1967,
                    "name": "SafeMathUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1286,
                    "src": "690:19:12",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeMathUpgradeable_$1286",
                      "typeString": "library SafeMathUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "684:38:12",
                  "typeName": {
                    "id": 1968,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "714:7:12",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "id": 1972,
                  "libraryName": {
                    "contractScope": null,
                    "id": 1970,
                    "name": "AddressUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3582,
                    "src": "733:18:12",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_AddressUpgradeable_$3582",
                      "typeString": "library AddressUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "727:37:12",
                  "typeName": {
                    "id": 1971,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "756:7:12",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  }
                },
                {
                  "body": {
                    "id": 1993,
                    "nodeType": "Block",
                    "src": "853:103:12",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 1982,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1974,
                              "src": "883:5:12",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 1985,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1974,
                                      "src": "913:5:12",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                        "typeString": "contract IERC20Upgradeable"
                                      }
                                    },
                                    "id": 1986,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "transfer",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1909,
                                    "src": "913:14:12",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                                      "typeString": "function (address,uint256) external returns (bool)"
                                    }
                                  },
                                  "id": 1987,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "selector",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "913:23:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 1988,
                                  "name": "to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1976,
                                  "src": "938:2:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 1989,
                                  "name": "value",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1978,
                                  "src": "942:5:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 1983,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "890:3:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 1984,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSelector",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "890:22:12",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (bytes4) pure returns (bytes memory)"
                                }
                              },
                              "id": 1990,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "890:58:12",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 1981,
                            "name": "_callOptionalReturn",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2172,
                            "src": "863:19:12",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20Upgradeable_$1960_$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (contract IERC20Upgradeable,bytes memory)"
                            }
                          },
                          "id": 1991,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "863:86:12",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 1992,
                        "nodeType": "ExpressionStatement",
                        "src": "863:86:12"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 1994,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "safeTransfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 1979,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1974,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1994,
                        "src": "792:23:12",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1973,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "792:17:12",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1976,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1994,
                        "src": "817:10:12",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1975,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "817:7:12",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1978,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 1994,
                        "src": "829:13:12",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 1977,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "829:7:12",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "791:52:12"
                  },
                  "returnParameters": {
                    "id": 1980,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "853:0:12"
                  },
                  "scope": 2173,
                  "src": "770:186:12",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 2018,
                    "nodeType": "Block",
                    "src": "1063:113:12",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2006,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1996,
                              "src": "1093:5:12",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2009,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1996,
                                      "src": "1123:5:12",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                        "typeString": "contract IERC20Upgradeable"
                                      }
                                    },
                                    "id": 2010,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "transferFrom",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1941,
                                    "src": "1123:18:12",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$",
                                      "typeString": "function (address,address,uint256) external returns (bool)"
                                    }
                                  },
                                  "id": 2011,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "selector",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "1123:27:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 2012,
                                  "name": "from",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1998,
                                  "src": "1152:4:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 2013,
                                  "name": "to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2000,
                                  "src": "1158:2:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 2014,
                                  "name": "value",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2002,
                                  "src": "1162:5:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2007,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "1100:3:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 2008,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSelector",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "1100:22:12",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (bytes4) pure returns (bytes memory)"
                                }
                              },
                              "id": 2015,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1100:68:12",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 2005,
                            "name": "_callOptionalReturn",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2172,
                            "src": "1073:19:12",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20Upgradeable_$1960_$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (contract IERC20Upgradeable,bytes memory)"
                            }
                          },
                          "id": 2016,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1073:96:12",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2017,
                        "nodeType": "ExpressionStatement",
                        "src": "1073:96:12"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 2019,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "safeTransferFrom",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2003,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 1996,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2019,
                        "src": "988:23:12",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 1995,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "988:17:12",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 1998,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2019,
                        "src": "1013:12:12",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1997,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1013:7:12",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2000,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2019,
                        "src": "1027:10:12",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 1999,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1027:7:12",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2002,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2019,
                        "src": "1039:13:12",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2001,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1039:7:12",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "987:66:12"
                  },
                  "returnParameters": {
                    "id": 2004,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1063:0:12"
                  },
                  "scope": 2173,
                  "src": "962:214:12",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 2061,
                    "nodeType": "Block",
                    "src": "1523:537:12",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 2045,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "id": 2032,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "id": 2030,
                                      "name": "value",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2026,
                                      "src": "1812:5:12",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "==",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "30",
                                      "id": 2031,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "1821:1:12",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      },
                                      "value": "0"
                                    },
                                    "src": "1812:10:12",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  }
                                ],
                                "id": 2033,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "1811:12:12",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "components": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "id": 2043,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "id": 2038,
                                              "name": "this",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": -28,
                                              "src": "1852:4:12",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_SafeERC20Upgradeable_$2173",
                                                "typeString": "library SafeERC20Upgradeable"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_contract$_SafeERC20Upgradeable_$2173",
                                                "typeString": "library SafeERC20Upgradeable"
                                              }
                                            ],
                                            "id": 2037,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "lValueRequested": false,
                                            "nodeType": "ElementaryTypeNameExpression",
                                            "src": "1844:7:12",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_address_$",
                                              "typeString": "type(address)"
                                            },
                                            "typeName": {
                                              "id": 2036,
                                              "name": "address",
                                              "nodeType": "ElementaryTypeName",
                                              "src": "1844:7:12",
                                              "typeDescriptions": {
                                                "typeIdentifier": null,
                                                "typeString": null
                                              }
                                            }
                                          },
                                          "id": 2039,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "typeConversion",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "1844:13:12",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 2040,
                                          "name": "spender",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2024,
                                          "src": "1859:7:12",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          },
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 2034,
                                          "name": "token",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 2022,
                                          "src": "1828:5:12",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                            "typeString": "contract IERC20Upgradeable"
                                          }
                                        },
                                        "id": 2035,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "allowance",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 1919,
                                        "src": "1828:15:12",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_uint256_$",
                                          "typeString": "function (address,address) view external returns (uint256)"
                                        }
                                      },
                                      "id": 2041,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "1828:39:12",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "==",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "30",
                                      "id": 2042,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "1871:1:12",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      },
                                      "value": "0"
                                    },
                                    "src": "1828:44:12",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  }
                                ],
                                "id": 2044,
                                "isConstant": false,
                                "isInlineArray": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "TupleExpression",
                                "src": "1827:46:12",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "1811:62:12",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365",
                              "id": 2046,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1887:56:12",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_ef945ddb1bfdc0da870feb4560d868b047642b4ac7f2fb7f8b7c51cb4a411e25",
                                "typeString": "literal_string \"SafeERC20: approve from non-zero to non-zero allowance\""
                              },
                              "value": "SafeERC20: approve from non-zero to non-zero allowance"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_ef945ddb1bfdc0da870feb4560d868b047642b4ac7f2fb7f8b7c51cb4a411e25",
                                "typeString": "literal_string \"SafeERC20: approve from non-zero to non-zero allowance\""
                              }
                            ],
                            "id": 2029,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1803:7:12",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2047,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1803:150:12",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2048,
                        "nodeType": "ExpressionStatement",
                        "src": "1803:150:12"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2050,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2022,
                              "src": "1983:5:12",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2053,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2022,
                                      "src": "2013:5:12",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                        "typeString": "contract IERC20Upgradeable"
                                      }
                                    },
                                    "id": 2054,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "approve",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1929,
                                    "src": "2013:13:12",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                                      "typeString": "function (address,uint256) external returns (bool)"
                                    }
                                  },
                                  "id": 2055,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "selector",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "2013:22:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 2056,
                                  "name": "spender",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2024,
                                  "src": "2037:7:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 2057,
                                  "name": "value",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2026,
                                  "src": "2046:5:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2051,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "1990:3:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 2052,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSelector",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "1990:22:12",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (bytes4) pure returns (bytes memory)"
                                }
                              },
                              "id": 2058,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1990:62:12",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 2049,
                            "name": "_callOptionalReturn",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2172,
                            "src": "1963:19:12",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20Upgradeable_$1960_$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (contract IERC20Upgradeable,bytes memory)"
                            }
                          },
                          "id": 2059,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1963:90:12",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2060,
                        "nodeType": "ExpressionStatement",
                        "src": "1963:90:12"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2020,
                    "nodeType": "StructuredDocumentation",
                    "src": "1182:249:12",
                    "text": " @dev Deprecated. This function has issues similar to the ones found in\n {IERC20-approve}, and its usage is discouraged.\n Whenever possible, use {safeIncreaseAllowance} and\n {safeDecreaseAllowance} instead."
                  },
                  "id": 2062,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "safeApprove",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2027,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2022,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2062,
                        "src": "1457:23:12",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2021,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "1457:17:12",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2024,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2062,
                        "src": "1482:15:12",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2023,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1482:7:12",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2026,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2062,
                        "src": "1499:13:12",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2025,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1499:7:12",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1456:57:12"
                  },
                  "returnParameters": {
                    "id": 2028,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1523:0:12"
                  },
                  "scope": 2173,
                  "src": "1436:624:12",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 2097,
                    "nodeType": "Block",
                    "src": "2163:197:12",
                    "statements": [
                      {
                        "assignments": [
                          2072
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2072,
                            "mutability": "mutable",
                            "name": "newAllowance",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2097,
                            "src": "2173:20:12",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2071,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "2173:7:12",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2084,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2082,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2068,
                              "src": "2240:5:12",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2077,
                                      "name": "this",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -28,
                                      "src": "2220:4:12",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_SafeERC20Upgradeable_$2173",
                                        "typeString": "library SafeERC20Upgradeable"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_SafeERC20Upgradeable_$2173",
                                        "typeString": "library SafeERC20Upgradeable"
                                      }
                                    ],
                                    "id": 2076,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "2212:7:12",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 2075,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "2212:7:12",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 2078,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "2212:13:12",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 2079,
                                  "name": "spender",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2066,
                                  "src": "2227:7:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2073,
                                  "name": "token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2064,
                                  "src": "2196:5:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                    "typeString": "contract IERC20Upgradeable"
                                  }
                                },
                                "id": 2074,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "allowance",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 1919,
                                "src": "2196:15:12",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_uint256_$",
                                  "typeString": "function (address,address) view external returns (uint256)"
                                }
                              },
                              "id": 2080,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2196:39:12",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 2081,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "add",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1113,
                            "src": "2196:43:12",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 2083,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2196:50:12",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2173:73:12"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2086,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2064,
                              "src": "2276:5:12",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2089,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2064,
                                      "src": "2306:5:12",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                        "typeString": "contract IERC20Upgradeable"
                                      }
                                    },
                                    "id": 2090,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "approve",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1929,
                                    "src": "2306:13:12",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                                      "typeString": "function (address,uint256) external returns (bool)"
                                    }
                                  },
                                  "id": 2091,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "selector",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "2306:22:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 2092,
                                  "name": "spender",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2066,
                                  "src": "2330:7:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 2093,
                                  "name": "newAllowance",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2072,
                                  "src": "2339:12:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2087,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "2283:3:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 2088,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSelector",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "2283:22:12",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (bytes4) pure returns (bytes memory)"
                                }
                              },
                              "id": 2094,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2283:69:12",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 2085,
                            "name": "_callOptionalReturn",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2172,
                            "src": "2256:19:12",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20Upgradeable_$1960_$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (contract IERC20Upgradeable,bytes memory)"
                            }
                          },
                          "id": 2095,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2256:97:12",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2096,
                        "nodeType": "ExpressionStatement",
                        "src": "2256:97:12"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 2098,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "safeIncreaseAllowance",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2069,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2064,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2098,
                        "src": "2097:23:12",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2063,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "2097:17:12",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2066,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2098,
                        "src": "2122:15:12",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2065,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2122:7:12",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2068,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2098,
                        "src": "2139:13:12",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2067,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2139:7:12",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2096:57:12"
                  },
                  "returnParameters": {
                    "id": 2070,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2163:0:12"
                  },
                  "scope": 2173,
                  "src": "2066:294:12",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 2134,
                    "nodeType": "Block",
                    "src": "2463:242:12",
                    "statements": [
                      {
                        "assignments": [
                          2108
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2108,
                            "mutability": "mutable",
                            "name": "newAllowance",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2134,
                            "src": "2473:20:12",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2107,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "2473:7:12",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2121,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2118,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2104,
                              "src": "2540:5:12",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5361666545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f",
                              "id": 2119,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2547:43:12",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_2c3af60974a758b7e72e108c9bf0943ecc9e4f2e8af4695da5f52fbf57a63d3a",
                                "typeString": "literal_string \"SafeERC20: decreased allowance below zero\""
                              },
                              "value": "SafeERC20: decreased allowance below zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_2c3af60974a758b7e72e108c9bf0943ecc9e4f2e8af4695da5f52fbf57a63d3a",
                                "typeString": "literal_string \"SafeERC20: decreased allowance below zero\""
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 2113,
                                      "name": "this",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -28,
                                      "src": "2520:4:12",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_SafeERC20Upgradeable_$2173",
                                        "typeString": "library SafeERC20Upgradeable"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_SafeERC20Upgradeable_$2173",
                                        "typeString": "library SafeERC20Upgradeable"
                                      }
                                    ],
                                    "id": 2112,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "2512:7:12",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 2111,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "2512:7:12",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 2114,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "2512:13:12",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 2115,
                                  "name": "spender",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2102,
                                  "src": "2527:7:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2109,
                                  "name": "token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2100,
                                  "src": "2496:5:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                    "typeString": "contract IERC20Upgradeable"
                                  }
                                },
                                "id": 2110,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "allowance",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 1919,
                                "src": "2496:15:12",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_view$_t_address_$_t_address_$returns$_t_uint256_$",
                                  "typeString": "function (address,address) view external returns (uint256)"
                                }
                              },
                              "id": 2116,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2496:39:12",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 2117,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sub",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1237,
                            "src": "2496:43:12",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_string_memory_ptr_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256,string memory) pure returns (uint256)"
                            }
                          },
                          "id": 2120,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2496:95:12",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2473:118:12"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2123,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2100,
                              "src": "2621:5:12",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2126,
                                      "name": "token",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2100,
                                      "src": "2651:5:12",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                        "typeString": "contract IERC20Upgradeable"
                                      }
                                    },
                                    "id": 2127,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "approve",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1929,
                                    "src": "2651:13:12",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                                      "typeString": "function (address,uint256) external returns (bool)"
                                    }
                                  },
                                  "id": 2128,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "selector",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "2651:22:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 2129,
                                  "name": "spender",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2102,
                                  "src": "2675:7:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 2130,
                                  "name": "newAllowance",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2108,
                                  "src": "2684:12:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2124,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "2628:3:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 2125,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSelector",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "2628:22:12",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (bytes4) pure returns (bytes memory)"
                                }
                              },
                              "id": 2131,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2628:69:12",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 2122,
                            "name": "_callOptionalReturn",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2172,
                            "src": "2601:19:12",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20Upgradeable_$1960_$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (contract IERC20Upgradeable,bytes memory)"
                            }
                          },
                          "id": 2132,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2601:97:12",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2133,
                        "nodeType": "ExpressionStatement",
                        "src": "2601:97:12"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 2135,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "safeDecreaseAllowance",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2105,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2100,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2135,
                        "src": "2397:23:12",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2099,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "2397:17:12",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2102,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2135,
                        "src": "2422:15:12",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2101,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2422:7:12",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2104,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2135,
                        "src": "2439:13:12",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2103,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2439:7:12",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2396:57:12"
                  },
                  "returnParameters": {
                    "id": 2106,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2463:0:12"
                  },
                  "scope": 2173,
                  "src": "2366:339:12",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 2171,
                    "nodeType": "Block",
                    "src": "3169:681:12",
                    "statements": [
                      {
                        "assignments": [
                          2144
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2144,
                            "mutability": "mutable",
                            "name": "returndata",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2171,
                            "src": "3518:23:12",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes"
                            },
                            "typeName": {
                              "id": 2143,
                              "name": "bytes",
                              "nodeType": "ElementaryTypeName",
                              "src": "3518:5:12",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2153,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2150,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2140,
                              "src": "3572:4:12",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564",
                              "id": 2151,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3578:34:12",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_47fb62c2c272651d2f0f342bac006756b8ba07f21cc5cb87e0fbb9d50c0c585b",
                                "typeString": "literal_string \"SafeERC20: low-level call failed\""
                              },
                              "value": "SafeERC20: low-level call failed"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_47fb62c2c272651d2f0f342bac006756b8ba07f21cc5cb87e0fbb9d50c0c585b",
                                "typeString": "literal_string \"SafeERC20: low-level call failed\""
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 2147,
                                  "name": "token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2138,
                                  "src": "3552:5:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                    "typeString": "contract IERC20Upgradeable"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                    "typeString": "contract IERC20Upgradeable"
                                  }
                                ],
                                "id": 2146,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "3544:7:12",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 2145,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "3544:7:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 2148,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3544:14:12",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "id": 2149,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "functionCall",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3429,
                            "src": "3544:27:12",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$bound_to$_t_address_$",
                              "typeString": "function (address,bytes memory,string memory) returns (bytes memory)"
                            }
                          },
                          "id": 2152,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3544:69:12",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3518:95:12"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2157,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 2154,
                              "name": "returndata",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2144,
                              "src": "3627:10:12",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            "id": 2155,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "3627:17:12",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2156,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "3647:1:12",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "3627:21:12",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 2170,
                        "nodeType": "IfStatement",
                        "src": "3623:221:12",
                        "trueBody": {
                          "id": 2169,
                          "nodeType": "Block",
                          "src": "3650:194:12",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 2161,
                                        "name": "returndata",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2144,
                                        "src": "3767:10:12",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes_memory_ptr",
                                          "typeString": "bytes memory"
                                        }
                                      },
                                      {
                                        "argumentTypes": null,
                                        "components": [
                                          {
                                            "argumentTypes": null,
                                            "id": 2163,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "lValueRequested": false,
                                            "nodeType": "ElementaryTypeNameExpression",
                                            "src": "3780:4:12",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_bool_$",
                                              "typeString": "type(bool)"
                                            },
                                            "typeName": {
                                              "id": 2162,
                                              "name": "bool",
                                              "nodeType": "ElementaryTypeName",
                                              "src": "3780:4:12",
                                              "typeDescriptions": {
                                                "typeIdentifier": null,
                                                "typeString": null
                                              }
                                            }
                                          }
                                        ],
                                        "id": 2164,
                                        "isConstant": false,
                                        "isInlineArray": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "TupleExpression",
                                        "src": "3779:6:12",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_bool_$",
                                          "typeString": "type(bool)"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_bytes_memory_ptr",
                                          "typeString": "bytes memory"
                                        },
                                        {
                                          "typeIdentifier": "t_type$_t_bool_$",
                                          "typeString": "type(bool)"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 2159,
                                        "name": "abi",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -1,
                                        "src": "3756:3:12",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_magic_abi",
                                          "typeString": "abi"
                                        }
                                      },
                                      "id": 2160,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "memberName": "decode",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": null,
                                      "src": "3756:10:12",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                                        "typeString": "function () pure"
                                      }
                                    },
                                    "id": 2165,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "3756:30:12",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564",
                                    "id": 2166,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "3788:44:12",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd",
                                      "typeString": "literal_string \"SafeERC20: ERC20 operation did not succeed\""
                                    },
                                    "value": "SafeERC20: ERC20 operation did not succeed"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_e11ad79d1e4a7f2e5f376964cb99e8e8f7904e3fc16a109f7a7ecb9aa7956dcd",
                                      "typeString": "literal_string \"SafeERC20: ERC20 operation did not succeed\""
                                    }
                                  ],
                                  "id": 2158,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "3748:7:12",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 2167,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "3748:85:12",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2168,
                              "nodeType": "ExpressionStatement",
                              "src": "3748:85:12"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2136,
                    "nodeType": "StructuredDocumentation",
                    "src": "2711:372:12",
                    "text": " @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n on the return value: the return value is optional (but if data is returned, it must not be false).\n @param token The token targeted by the call.\n @param data The call data (encoded using abi.encode or one of its variants)."
                  },
                  "id": 2172,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_callOptionalReturn",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2141,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2138,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2172,
                        "src": "3117:23:12",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 2137,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "3117:17:12",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2140,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2172,
                        "src": "3142:17:12",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 2139,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "3142:5:12",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3116:44:12"
                  },
                  "returnParameters": {
                    "id": 2142,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3169:0:12"
                  },
                  "scope": 2173,
                  "src": "3088:762:12",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "private"
                }
              ],
              "scope": 2174,
              "src": "649:3203:12"
            }
          ],
          "src": "33:3820:12"
        },
        "id": 12
      },
      "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol",
          "exportedSymbols": {
            "ERC721Upgradeable": [
              3146
            ]
          },
          "id": 3147,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 2175,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:13"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol",
              "file": "../../utils/ContextUpgradeable.sol",
              "id": 2176,
              "nodeType": "ImportDirective",
              "scope": 3147,
              "sourceUnit": 3628,
              "src": "66:44:13",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol",
              "file": "./IERC721Upgradeable.sol",
              "id": 2177,
              "nodeType": "ImportDirective",
              "scope": 3147,
              "sourceUnit": 3339,
              "src": "111:34:13",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721MetadataUpgradeable.sol",
              "file": "./IERC721MetadataUpgradeable.sol",
              "id": 2178,
              "nodeType": "ImportDirective",
              "scope": 3147,
              "sourceUnit": 3205,
              "src": "146:42:13",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721EnumerableUpgradeable.sol",
              "file": "./IERC721EnumerableUpgradeable.sol",
              "id": 2179,
              "nodeType": "ImportDirective",
              "scope": 3147,
              "sourceUnit": 3178,
              "src": "189:44:13",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol",
              "file": "./IERC721ReceiverUpgradeable.sol",
              "id": 2180,
              "nodeType": "ImportDirective",
              "scope": 3147,
              "sourceUnit": 3223,
              "src": "234:42:13",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/introspection/ERC165Upgradeable.sol",
              "file": "../../introspection/ERC165Upgradeable.sol",
              "id": 2181,
              "nodeType": "ImportDirective",
              "scope": 3147,
              "sourceUnit": 920,
              "src": "277:51:13",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol",
              "file": "../../math/SafeMathUpgradeable.sol",
              "id": 2182,
              "nodeType": "ImportDirective",
              "scope": 3147,
              "sourceUnit": 1287,
              "src": "329:44:13",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol",
              "file": "../../utils/AddressUpgradeable.sol",
              "id": 2183,
              "nodeType": "ImportDirective",
              "scope": 3147,
              "sourceUnit": 3583,
              "src": "374:44:13",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/utils/EnumerableSetUpgradeable.sol",
              "file": "../../utils/EnumerableSetUpgradeable.sol",
              "id": 2184,
              "nodeType": "ImportDirective",
              "scope": 3147,
              "sourceUnit": 4730,
              "src": "419:50:13",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/utils/EnumerableMapUpgradeable.sol",
              "file": "../../utils/EnumerableMapUpgradeable.sol",
              "id": 2185,
              "nodeType": "ImportDirective",
              "scope": 3147,
              "sourceUnit": 4238,
              "src": "470:50:13",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol",
              "file": "../../utils/StringsUpgradeable.sol",
              "id": 2186,
              "nodeType": "ImportDirective",
              "scope": 3147,
              "sourceUnit": 5188,
              "src": "521:44:13",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol",
              "file": "../../proxy/Initializable.sol",
              "id": 2187,
              "nodeType": "ImportDirective",
              "scope": 3147,
              "sourceUnit": 1353,
              "src": "566:39:13",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 2189,
                    "name": "Initializable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1352,
                    "src": "762:13:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Initializable_$1352",
                      "typeString": "contract Initializable"
                    }
                  },
                  "id": 2190,
                  "nodeType": "InheritanceSpecifier",
                  "src": "762:13:13"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 2191,
                    "name": "ContextUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3627,
                    "src": "777:18:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ContextUpgradeable_$3627",
                      "typeString": "contract ContextUpgradeable"
                    }
                  },
                  "id": 2192,
                  "nodeType": "InheritanceSpecifier",
                  "src": "777:18:13"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 2193,
                    "name": "ERC165Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 919,
                    "src": "797:17:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC165Upgradeable_$919",
                      "typeString": "contract ERC165Upgradeable"
                    }
                  },
                  "id": 2194,
                  "nodeType": "InheritanceSpecifier",
                  "src": "797:17:13"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 2195,
                    "name": "IERC721Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3338,
                    "src": "816:18:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                      "typeString": "contract IERC721Upgradeable"
                    }
                  },
                  "id": 2196,
                  "nodeType": "InheritanceSpecifier",
                  "src": "816:18:13"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 2197,
                    "name": "IERC721MetadataUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3204,
                    "src": "836:26:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC721MetadataUpgradeable_$3204",
                      "typeString": "contract IERC721MetadataUpgradeable"
                    }
                  },
                  "id": 2198,
                  "nodeType": "InheritanceSpecifier",
                  "src": "836:26:13"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 2199,
                    "name": "IERC721EnumerableUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3177,
                    "src": "864:28:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC721EnumerableUpgradeable_$3177",
                      "typeString": "contract IERC721EnumerableUpgradeable"
                    }
                  },
                  "id": 2200,
                  "nodeType": "InheritanceSpecifier",
                  "src": "864:28:13"
                }
              ],
              "contractDependencies": [
                919,
                931,
                1352,
                3177,
                3204,
                3338,
                3627
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 2188,
                "nodeType": "StructuredDocumentation",
                "src": "607:124:13",
                "text": " @title ERC721 Non-Fungible Token Standard basic implementation\n @dev see https://eips.ethereum.org/EIPS/eip-721"
              },
              "fullyImplemented": true,
              "id": 3146,
              "linearizedBaseContracts": [
                3146,
                3177,
                3204,
                3338,
                919,
                931,
                3627,
                1352
              ],
              "name": "ERC721Upgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 2203,
                  "libraryName": {
                    "contractScope": null,
                    "id": 2201,
                    "name": "SafeMathUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1286,
                    "src": "905:19:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeMathUpgradeable_$1286",
                      "typeString": "library SafeMathUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "899:38:13",
                  "typeName": {
                    "id": 2202,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "929:7:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "id": 2206,
                  "libraryName": {
                    "contractScope": null,
                    "id": 2204,
                    "name": "AddressUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3582,
                    "src": "948:18:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_AddressUpgradeable_$3582",
                      "typeString": "library AddressUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "942:37:13",
                  "typeName": {
                    "id": 2205,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "971:7:13",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  }
                },
                {
                  "id": 2209,
                  "libraryName": {
                    "contractScope": null,
                    "id": 2207,
                    "name": "EnumerableSetUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 4729,
                    "src": "990:24:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_EnumerableSetUpgradeable_$4729",
                      "typeString": "library EnumerableSetUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "984:68:13",
                  "typeName": {
                    "contractScope": null,
                    "id": 2208,
                    "name": "EnumerableSetUpgradeable.UintSet",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 4634,
                    "src": "1019:32:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_UintSet_$4634_storage_ptr",
                      "typeString": "struct EnumerableSetUpgradeable.UintSet"
                    }
                  }
                },
                {
                  "id": 2212,
                  "libraryName": {
                    "contractScope": null,
                    "id": 2210,
                    "name": "EnumerableMapUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 4237,
                    "src": "1063:24:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_EnumerableMapUpgradeable_$4237",
                      "typeString": "library EnumerableMapUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "1057:77:13",
                  "typeName": {
                    "contractScope": null,
                    "id": 2211,
                    "name": "EnumerableMapUpgradeable.UintToAddressMap",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 4011,
                    "src": "1092:41:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                      "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap"
                    }
                  }
                },
                {
                  "id": 2215,
                  "libraryName": {
                    "contractScope": null,
                    "id": 2213,
                    "name": "StringsUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 5187,
                    "src": "1145:18:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_StringsUpgradeable_$5187",
                      "typeString": "library StringsUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "1139:37:13",
                  "typeName": {
                    "id": 2214,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1168:7:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "constant": true,
                  "id": 2218,
                  "mutability": "constant",
                  "name": "_ERC721_RECEIVED",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3146,
                  "src": "1354:53:13",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 2216,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "1354:6:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30783135306237613032",
                    "id": 2217,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "1397:10:13",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_353073666_by_1",
                      "typeString": "int_const 353073666"
                    },
                    "value": "0x150b7a02"
                  },
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 2222,
                  "mutability": "mutable",
                  "name": "_holderTokens",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3146,
                  "src": "1491:75:13",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UintSet_$4634_storage_$",
                    "typeString": "mapping(address => struct EnumerableSetUpgradeable.UintSet)"
                  },
                  "typeName": {
                    "id": 2221,
                    "keyType": {
                      "id": 2219,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "1500:7:13",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "1491:53:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UintSet_$4634_storage_$",
                      "typeString": "mapping(address => struct EnumerableSetUpgradeable.UintSet)"
                    },
                    "valueType": {
                      "contractScope": null,
                      "id": 2220,
                      "name": "EnumerableSetUpgradeable.UintSet",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 4634,
                      "src": "1511:32:13",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_UintSet_$4634_storage_ptr",
                        "typeString": "struct EnumerableSetUpgradeable.UintSet"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 2224,
                  "mutability": "mutable",
                  "name": "_tokenOwners",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3146,
                  "src": "1630:62:13",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage",
                    "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2223,
                    "name": "EnumerableMapUpgradeable.UintToAddressMap",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 4011,
                    "src": "1630:41:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                      "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 2228,
                  "mutability": "mutable",
                  "name": "_tokenApprovals",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3146,
                  "src": "1748:52:13",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_uint256_$_t_address_$",
                    "typeString": "mapping(uint256 => address)"
                  },
                  "typeName": {
                    "id": 2227,
                    "keyType": {
                      "id": 2225,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "1757:7:13",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "1748:28:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_uint256_$_t_address_$",
                      "typeString": "mapping(uint256 => address)"
                    },
                    "valueType": {
                      "id": 2226,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "1768:7:13",
                      "stateMutability": "nonpayable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 2234,
                  "mutability": "mutable",
                  "name": "_operatorApprovals",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3146,
                  "src": "1855:73:13",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$",
                    "typeString": "mapping(address => mapping(address => bool))"
                  },
                  "typeName": {
                    "id": 2233,
                    "keyType": {
                      "id": 2229,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "1864:7:13",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "1855:46:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$",
                      "typeString": "mapping(address => mapping(address => bool))"
                    },
                    "valueType": {
                      "id": 2232,
                      "keyType": {
                        "id": 2230,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "1884:7:13",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "nodeType": "Mapping",
                      "src": "1875:25:13",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                        "typeString": "mapping(address => bool)"
                      },
                      "valueType": {
                        "id": 2231,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "1895:4:13",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 2236,
                  "mutability": "mutable",
                  "name": "_name",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3146,
                  "src": "1953:20:13",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_storage",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 2235,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1953:6:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 2238,
                  "mutability": "mutable",
                  "name": "_symbol",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3146,
                  "src": "2000:22:13",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_storage",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 2237,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2000:6:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 2242,
                  "mutability": "mutable",
                  "name": "_tokenURIs",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3146,
                  "src": "2068:46:13",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_uint256_$_t_string_storage_$",
                    "typeString": "mapping(uint256 => string)"
                  },
                  "typeName": {
                    "id": 2241,
                    "keyType": {
                      "id": 2239,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "2077:7:13",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "2068:27:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_uint256_$_t_string_storage_$",
                      "typeString": "mapping(uint256 => string)"
                    },
                    "valueType": {
                      "id": 2240,
                      "name": "string",
                      "nodeType": "ElementaryTypeName",
                      "src": "2088:6:13",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_storage_ptr",
                        "typeString": "string"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 2244,
                  "mutability": "mutable",
                  "name": "_baseURI",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3146,
                  "src": "2137:23:13",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_storage",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 2243,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "2137:6:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 2247,
                  "mutability": "constant",
                  "name": "_INTERFACE_ID_ERC721",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3146,
                  "src": "3036:57:13",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 2245,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "3036:6:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30783830616335386364",
                    "id": 2246,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "3083:10:13",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_2158778573_by_1",
                      "typeString": "int_const 2158778573"
                    },
                    "value": "0x80ac58cd"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 2250,
                  "mutability": "constant",
                  "name": "_INTERFACE_ID_ERC721_METADATA",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3146,
                  "src": "3359:66:13",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 2248,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "3359:6:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30783562356531333966",
                    "id": 2249,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "3415:10:13",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_1532892063_by_1",
                      "typeString": "int_const 1532892063"
                    },
                    "value": "0x5b5e139f"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 2253,
                  "mutability": "constant",
                  "name": "_INTERFACE_ID_ERC721_ENUMERABLE",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3146,
                  "src": "3730:68:13",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 2251,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "3730:6:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30783738306539643633",
                    "id": 2252,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "3788:10:13",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_2014223715_by_1",
                      "typeString": "int_const 2014223715"
                    },
                    "value": "0x780e9d63"
                  },
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 2274,
                    "nodeType": "Block",
                    "src": "4006:127:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 2263,
                            "name": "__Context_init_unchained",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3602,
                            "src": "4016:24:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 2264,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4016:26:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2265,
                        "nodeType": "ExpressionStatement",
                        "src": "4016:26:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 2266,
                            "name": "__ERC165_init_unchained",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 880,
                            "src": "4052:23:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 2267,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4052:25:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2268,
                        "nodeType": "ExpressionStatement",
                        "src": "4052:25:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2270,
                              "name": "name_",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2256,
                              "src": "4111:5:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2271,
                              "name": "symbol_",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2258,
                              "src": "4118:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 2269,
                            "name": "__ERC721_init_unchained",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2305,
                            "src": "4087:23:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (string memory,string memory)"
                            }
                          },
                          "id": 2272,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4087:39:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2273,
                        "nodeType": "ExpressionStatement",
                        "src": "4087:39:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2254,
                    "nodeType": "StructuredDocumentation",
                    "src": "3805:108:13",
                    "text": " @dev Initializes the contract by setting a `name` and a `symbol` to the token collection."
                  },
                  "id": 2275,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 2261,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 2260,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "3994:11:13",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "3994:11:13"
                    }
                  ],
                  "name": "__ERC721_init",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2259,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2256,
                        "mutability": "mutable",
                        "name": "name_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2275,
                        "src": "3941:19:13",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 2255,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "3941:6:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2258,
                        "mutability": "mutable",
                        "name": "symbol_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2275,
                        "src": "3962:21:13",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 2257,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "3962:6:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3940:44:13"
                  },
                  "returnParameters": {
                    "id": 2262,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4006:0:13"
                  },
                  "scope": 3146,
                  "src": "3918:215:13",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 2304,
                    "nodeType": "Block",
                    "src": "4237:305:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2286,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2284,
                            "name": "_name",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2236,
                            "src": "4247:5:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_storage",
                              "typeString": "string storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2285,
                            "name": "name_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2277,
                            "src": "4255:5:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_memory_ptr",
                              "typeString": "string memory"
                            }
                          },
                          "src": "4247:13:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage",
                            "typeString": "string storage ref"
                          }
                        },
                        "id": 2287,
                        "nodeType": "ExpressionStatement",
                        "src": "4247:13:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2290,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 2288,
                            "name": "_symbol",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2238,
                            "src": "4270:7:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_storage",
                              "typeString": "string storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2289,
                            "name": "symbol_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2279,
                            "src": "4280:7:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_memory_ptr",
                              "typeString": "string memory"
                            }
                          },
                          "src": "4270:17:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage",
                            "typeString": "string storage ref"
                          }
                        },
                        "id": 2291,
                        "nodeType": "ExpressionStatement",
                        "src": "4270:17:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2293,
                              "name": "_INTERFACE_ID_ERC721",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2247,
                              "src": "4394:20:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              }
                            ],
                            "id": 2292,
                            "name": "_registerInterface",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 914,
                            "src": "4375:18:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_bytes4_$returns$__$",
                              "typeString": "function (bytes4)"
                            }
                          },
                          "id": 2294,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4375:40:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2295,
                        "nodeType": "ExpressionStatement",
                        "src": "4375:40:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2297,
                              "name": "_INTERFACE_ID_ERC721_METADATA",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2250,
                              "src": "4444:29:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              }
                            ],
                            "id": 2296,
                            "name": "_registerInterface",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 914,
                            "src": "4425:18:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_bytes4_$returns$__$",
                              "typeString": "function (bytes4)"
                            }
                          },
                          "id": 2298,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4425:49:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2299,
                        "nodeType": "ExpressionStatement",
                        "src": "4425:49:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2301,
                              "name": "_INTERFACE_ID_ERC721_ENUMERABLE",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2253,
                              "src": "4503:31:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              }
                            ],
                            "id": 2300,
                            "name": "_registerInterface",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 914,
                            "src": "4484:18:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_bytes4_$returns$__$",
                              "typeString": "function (bytes4)"
                            }
                          },
                          "id": 2302,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4484:51:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2303,
                        "nodeType": "ExpressionStatement",
                        "src": "4484:51:13"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 2305,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 2282,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 2281,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "4225:11:13",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "4225:11:13"
                    }
                  ],
                  "name": "__ERC721_init_unchained",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2280,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2277,
                        "mutability": "mutable",
                        "name": "name_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2305,
                        "src": "4172:19:13",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 2276,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "4172:6:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2279,
                        "mutability": "mutable",
                        "name": "symbol_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2305,
                        "src": "4193:21:13",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 2278,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "4193:6:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4171:44:13"
                  },
                  "returnParameters": {
                    "id": 2283,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4237:0:13"
                  },
                  "scope": 3146,
                  "src": "4139:403:13",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    3263
                  ],
                  "body": {
                    "id": 2330,
                    "nodeType": "Block",
                    "src": "4682:137:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 2320,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 2315,
                                "name": "owner",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2308,
                                "src": "4700:5:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 2318,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "4717:1:13",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 2317,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "4709:7:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 2316,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "4709:7:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 2319,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "4709:10:13",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "4700:19:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4552433732313a2062616c616e636520717565727920666f7220746865207a65726f2061646472657373",
                              "id": 2321,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "4721:44:13",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_7395d4d3901c50cdfcab223d072f9aa36241df5d883e62cbf147ee1b05a9e6ba",
                                "typeString": "literal_string \"ERC721: balance query for the zero address\""
                              },
                              "value": "ERC721: balance query for the zero address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_7395d4d3901c50cdfcab223d072f9aa36241df5d883e62cbf147ee1b05a9e6ba",
                                "typeString": "literal_string \"ERC721: balance query for the zero address\""
                              }
                            ],
                            "id": 2314,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "4692:7:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2322,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4692:74:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2323,
                        "nodeType": "ExpressionStatement",
                        "src": "4692:74:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 2324,
                                "name": "_holderTokens",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2222,
                                "src": "4783:13:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UintSet_$4634_storage_$",
                                  "typeString": "mapping(address => struct EnumerableSetUpgradeable.UintSet storage ref)"
                                }
                              },
                              "id": 2326,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 2325,
                                "name": "owner",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2308,
                                "src": "4797:5:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "4783:20:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_UintSet_$4634_storage",
                                "typeString": "struct EnumerableSetUpgradeable.UintSet storage ref"
                              }
                            },
                            "id": 2327,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 4708,
                            "src": "4783:27:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_UintSet_$4634_storage_ptr_$returns$_t_uint256_$bound_to$_t_struct$_UintSet_$4634_storage_ptr_$",
                              "typeString": "function (struct EnumerableSetUpgradeable.UintSet storage pointer) view returns (uint256)"
                            }
                          },
                          "id": 2328,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4783:29:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 2313,
                        "id": 2329,
                        "nodeType": "Return",
                        "src": "4776:36:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2306,
                    "nodeType": "StructuredDocumentation",
                    "src": "4548:48:13",
                    "text": " @dev See {IERC721-balanceOf}."
                  },
                  "functionSelector": "70a08231",
                  "id": 2331,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "balanceOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 2310,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "4655:8:13"
                  },
                  "parameters": {
                    "id": 2309,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2308,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2331,
                        "src": "4620:13:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2307,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4620:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4619:15:13"
                  },
                  "returnParameters": {
                    "id": 2313,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2312,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2331,
                        "src": "4673:7:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2311,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4673:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4672:9:13"
                  },
                  "scope": 3146,
                  "src": "4601:218:13",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    3271
                  ],
                  "body": {
                    "id": 2346,
                    "nodeType": "Block",
                    "src": "4957:94:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2342,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2334,
                              "src": "4991:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e",
                              "id": 2343,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "5000:43:13",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_7481f3df2a424c0755a1ad2356614e9a5a358d461ea2eae1f89cb21cbad00397",
                                "typeString": "literal_string \"ERC721: owner query for nonexistent token\""
                              },
                              "value": "ERC721: owner query for nonexistent token"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_7481f3df2a424c0755a1ad2356614e9a5a358d461ea2eae1f89cb21cbad00397",
                                "typeString": "literal_string \"ERC721: owner query for nonexistent token\""
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2340,
                              "name": "_tokenOwners",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2224,
                              "src": "4974:12:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage",
                                "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap storage ref"
                              }
                            },
                            "id": 2341,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "get",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 4236,
                            "src": "4974:16:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_UintToAddressMap_$4011_storage_ptr_$_t_uint256_$_t_string_memory_ptr_$returns$_t_address_$bound_to$_t_struct$_UintToAddressMap_$4011_storage_ptr_$",
                              "typeString": "function (struct EnumerableMapUpgradeable.UintToAddressMap storage pointer,uint256,string memory) view returns (address)"
                            }
                          },
                          "id": 2344,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4974:70:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "functionReturnParameters": 2339,
                        "id": 2345,
                        "nodeType": "Return",
                        "src": "4967:77:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2332,
                    "nodeType": "StructuredDocumentation",
                    "src": "4825:46:13",
                    "text": " @dev See {IERC721-ownerOf}."
                  },
                  "functionSelector": "6352211e",
                  "id": 2347,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "ownerOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 2336,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "4930:8:13"
                  },
                  "parameters": {
                    "id": 2335,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2334,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2347,
                        "src": "4893:15:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2333,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4893:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4892:17:13"
                  },
                  "returnParameters": {
                    "id": 2339,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2338,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2347,
                        "src": "4948:7:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2337,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4948:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4947:9:13"
                  },
                  "scope": 3146,
                  "src": "4876:175:13",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    3189
                  ],
                  "body": {
                    "id": 2356,
                    "nodeType": "Block",
                    "src": "5182:29:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2354,
                          "name": "_name",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2236,
                          "src": "5199:5:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage",
                            "typeString": "string storage ref"
                          }
                        },
                        "functionReturnParameters": 2353,
                        "id": 2355,
                        "nodeType": "Return",
                        "src": "5192:12:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2348,
                    "nodeType": "StructuredDocumentation",
                    "src": "5057:51:13",
                    "text": " @dev See {IERC721Metadata-name}."
                  },
                  "functionSelector": "06fdde03",
                  "id": 2357,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "name",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 2350,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "5149:8:13"
                  },
                  "parameters": {
                    "id": 2349,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "5126:2:13"
                  },
                  "returnParameters": {
                    "id": 2353,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2352,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2357,
                        "src": "5167:13:13",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 2351,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "5167:6:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5166:15:13"
                  },
                  "scope": 3146,
                  "src": "5113:98:13",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    3195
                  ],
                  "body": {
                    "id": 2366,
                    "nodeType": "Block",
                    "src": "5346:31:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2364,
                          "name": "_symbol",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2238,
                          "src": "5363:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage",
                            "typeString": "string storage ref"
                          }
                        },
                        "functionReturnParameters": 2363,
                        "id": 2365,
                        "nodeType": "Return",
                        "src": "5356:14:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2358,
                    "nodeType": "StructuredDocumentation",
                    "src": "5217:53:13",
                    "text": " @dev See {IERC721Metadata-symbol}."
                  },
                  "functionSelector": "95d89b41",
                  "id": 2367,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "symbol",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 2360,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "5313:8:13"
                  },
                  "parameters": {
                    "id": 2359,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "5290:2:13"
                  },
                  "returnParameters": {
                    "id": 2363,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2362,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2367,
                        "src": "5331:13:13",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 2361,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "5331:6:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5330:15:13"
                  },
                  "scope": 3146,
                  "src": "5275:102:13",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    3203
                  ],
                  "body": {
                    "id": 2434,
                    "nodeType": "Block",
                    "src": "5531:688:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 2378,
                                  "name": "tokenId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2370,
                                  "src": "5557:7:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 2377,
                                "name": "_exists",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2730,
                                "src": "5549:7:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_bool_$",
                                  "typeString": "function (uint256) view returns (bool)"
                                }
                              },
                              "id": 2379,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5549:16:13",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e",
                              "id": 2380,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "5567:49:13",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_a2d45c0fba603d40d82d590051761ca952d1ab9d78cca6d0d464d7b6e961a9cb",
                                "typeString": "literal_string \"ERC721Metadata: URI query for nonexistent token\""
                              },
                              "value": "ERC721Metadata: URI query for nonexistent token"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_a2d45c0fba603d40d82d590051761ca952d1ab9d78cca6d0d464d7b6e961a9cb",
                                "typeString": "literal_string \"ERC721Metadata: URI query for nonexistent token\""
                              }
                            ],
                            "id": 2376,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "5541:7:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2381,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5541:76:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2382,
                        "nodeType": "ExpressionStatement",
                        "src": "5541:76:13"
                      },
                      {
                        "assignments": [
                          2384
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2384,
                            "mutability": "mutable",
                            "name": "_tokenURI",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2434,
                            "src": "5628:23:13",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_memory_ptr",
                              "typeString": "string"
                            },
                            "typeName": {
                              "id": 2383,
                              "name": "string",
                              "nodeType": "ElementaryTypeName",
                              "src": "5628:6:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_storage_ptr",
                                "typeString": "string"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2388,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 2385,
                            "name": "_tokenURIs",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2242,
                            "src": "5654:10:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_uint256_$_t_string_storage_$",
                              "typeString": "mapping(uint256 => string storage ref)"
                            }
                          },
                          "id": 2387,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 2386,
                            "name": "tokenId",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2370,
                            "src": "5665:7:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "5654:19:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage",
                            "typeString": "string storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "5628:45:13"
                      },
                      {
                        "assignments": [
                          2390
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2390,
                            "mutability": "mutable",
                            "name": "base",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2434,
                            "src": "5683:18:13",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_memory_ptr",
                              "typeString": "string"
                            },
                            "typeName": {
                              "id": 2389,
                              "name": "string",
                              "nodeType": "ElementaryTypeName",
                              "src": "5683:6:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_storage_ptr",
                                "typeString": "string"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2393,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 2391,
                            "name": "baseURI",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2444,
                            "src": "5704:7:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_string_memory_ptr_$",
                              "typeString": "function () view returns (string memory)"
                            }
                          },
                          "id": 2392,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5704:9:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "5683:30:13"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2400,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 2396,
                                  "name": "base",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2390,
                                  "src": "5792:4:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "id": 2395,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "5786:5:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                                  "typeString": "type(bytes storage pointer)"
                                },
                                "typeName": {
                                  "id": 2394,
                                  "name": "bytes",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "5786:5:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 2397,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5786:11:13",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            "id": 2398,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "5786:18:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2399,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "5808:1:13",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "5786:23:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 2404,
                        "nodeType": "IfStatement",
                        "src": "5782:70:13",
                        "trueBody": {
                          "id": 2403,
                          "nodeType": "Block",
                          "src": "5811:41:13",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2401,
                                "name": "_tokenURI",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2384,
                                "src": "5832:9:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_string_memory_ptr",
                                  "typeString": "string memory"
                                }
                              },
                              "functionReturnParameters": 2375,
                              "id": 2402,
                              "nodeType": "Return",
                              "src": "5825:16:13"
                            }
                          ]
                        }
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2411,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 2407,
                                  "name": "_tokenURI",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2384,
                                  "src": "5960:9:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "id": 2406,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "5954:5:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                                  "typeString": "type(bytes storage pointer)"
                                },
                                "typeName": {
                                  "id": 2405,
                                  "name": "bytes",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "5954:5:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 2408,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5954:16:13",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            "id": 2409,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "5954:23:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2410,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "5980:1:13",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "5954:27:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 2422,
                        "nodeType": "IfStatement",
                        "src": "5950:106:13",
                        "trueBody": {
                          "id": 2421,
                          "nodeType": "Block",
                          "src": "5983:73:13",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 2416,
                                        "name": "base",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2390,
                                        "src": "6028:4:13",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_string_memory_ptr",
                                          "typeString": "string memory"
                                        }
                                      },
                                      {
                                        "argumentTypes": null,
                                        "id": 2417,
                                        "name": "_tokenURI",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2384,
                                        "src": "6034:9:13",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_string_memory_ptr",
                                          "typeString": "string memory"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_string_memory_ptr",
                                          "typeString": "string memory"
                                        },
                                        {
                                          "typeIdentifier": "t_string_memory_ptr",
                                          "typeString": "string memory"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 2414,
                                        "name": "abi",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -1,
                                        "src": "6011:3:13",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_magic_abi",
                                          "typeString": "abi"
                                        }
                                      },
                                      "id": 2415,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "memberName": "encodePacked",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": null,
                                      "src": "6011:16:13",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                                        "typeString": "function () pure returns (bytes memory)"
                                      }
                                    },
                                    "id": 2418,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "6011:33:13",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes_memory_ptr",
                                      "typeString": "bytes memory"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes_memory_ptr",
                                      "typeString": "bytes memory"
                                    }
                                  ],
                                  "id": 2413,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "6004:6:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_string_storage_ptr_$",
                                    "typeString": "type(string storage pointer)"
                                  },
                                  "typeName": {
                                    "id": 2412,
                                    "name": "string",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "6004:6:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 2419,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "6004:41:13",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_string_memory_ptr",
                                  "typeString": "string memory"
                                }
                              },
                              "functionReturnParameters": 2375,
                              "id": 2420,
                              "nodeType": "Return",
                              "src": "5997:48:13"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 2427,
                                  "name": "base",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2390,
                                  "src": "6186:4:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 2428,
                                      "name": "tokenId",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2370,
                                      "src": "6192:7:13",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 2429,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "toString",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 5186,
                                    "src": "6192:16:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_string_memory_ptr_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256) pure returns (string memory)"
                                    }
                                  },
                                  "id": 2430,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "6192:18:13",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 2425,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "6169:3:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 2426,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodePacked",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "6169:16:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function () pure returns (bytes memory)"
                                }
                              },
                              "id": 2431,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6169:42:13",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 2424,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "6162:6:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_string_storage_ptr_$",
                              "typeString": "type(string storage pointer)"
                            },
                            "typeName": {
                              "id": 2423,
                              "name": "string",
                              "nodeType": "ElementaryTypeName",
                              "src": "6162:6:13",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 2432,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6162:50:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "functionReturnParameters": 2375,
                        "id": 2433,
                        "nodeType": "Return",
                        "src": "6155:57:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2368,
                    "nodeType": "StructuredDocumentation",
                    "src": "5383:55:13",
                    "text": " @dev See {IERC721Metadata-tokenURI}."
                  },
                  "functionSelector": "c87b56dd",
                  "id": 2435,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "tokenURI",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 2372,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "5498:8:13"
                  },
                  "parameters": {
                    "id": 2371,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2370,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2435,
                        "src": "5461:15:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2369,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5461:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5460:17:13"
                  },
                  "returnParameters": {
                    "id": 2375,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2374,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2435,
                        "src": "5516:13:13",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 2373,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "5516:6:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5515:15:13"
                  },
                  "scope": 3146,
                  "src": "5443:776:13",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2443,
                    "nodeType": "Block",
                    "src": "6514:32:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2441,
                          "name": "_baseURI",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2244,
                          "src": "6531:8:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage",
                            "typeString": "string storage ref"
                          }
                        },
                        "functionReturnParameters": 2440,
                        "id": 2442,
                        "nodeType": "Return",
                        "src": "6524:15:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2436,
                    "nodeType": "StructuredDocumentation",
                    "src": "6225:221:13",
                    "text": " @dev Returns the base URI set via {_setBaseURI}. This will be\n automatically added as a prefix in {tokenURI} to each token's URI, or\n to the token ID if no specific URI is set for that token ID."
                  },
                  "functionSelector": "6c0360eb",
                  "id": 2444,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "baseURI",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2437,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6467:2:13"
                  },
                  "returnParameters": {
                    "id": 2440,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2439,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2444,
                        "src": "6499:13:13",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 2438,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "6499:6:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6498:15:13"
                  },
                  "scope": 3146,
                  "src": "6451:95:13",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    3168
                  ],
                  "body": {
                    "id": 2462,
                    "nodeType": "Block",
                    "src": "6731:54:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2459,
                              "name": "index",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2449,
                              "src": "6772:5:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 2455,
                                "name": "_holderTokens",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2222,
                                "src": "6748:13:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UintSet_$4634_storage_$",
                                  "typeString": "mapping(address => struct EnumerableSetUpgradeable.UintSet storage ref)"
                                }
                              },
                              "id": 2457,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 2456,
                                "name": "owner",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2447,
                                "src": "6762:5:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "6748:20:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_UintSet_$4634_storage",
                                "typeString": "struct EnumerableSetUpgradeable.UintSet storage ref"
                              }
                            },
                            "id": 2458,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "at",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 4728,
                            "src": "6748:23:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_UintSet_$4634_storage_ptr_$_t_uint256_$returns$_t_uint256_$bound_to$_t_struct$_UintSet_$4634_storage_ptr_$",
                              "typeString": "function (struct EnumerableSetUpgradeable.UintSet storage pointer,uint256) view returns (uint256)"
                            }
                          },
                          "id": 2460,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6748:30:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 2454,
                        "id": 2461,
                        "nodeType": "Return",
                        "src": "6741:37:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2445,
                    "nodeType": "StructuredDocumentation",
                    "src": "6552:68:13",
                    "text": " @dev See {IERC721Enumerable-tokenOfOwnerByIndex}."
                  },
                  "functionSelector": "2f745c59",
                  "id": 2463,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "tokenOfOwnerByIndex",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 2451,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "6704:8:13"
                  },
                  "parameters": {
                    "id": 2450,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2447,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2463,
                        "src": "6654:13:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2446,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6654:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2449,
                        "mutability": "mutable",
                        "name": "index",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2463,
                        "src": "6669:13:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2448,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6669:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6653:30:13"
                  },
                  "returnParameters": {
                    "id": 2454,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2453,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2463,
                        "src": "6722:7:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2452,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6722:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6721:9:13"
                  },
                  "scope": 3146,
                  "src": "6625:160:13",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    3158
                  ],
                  "body": {
                    "id": 2474,
                    "nodeType": "Block",
                    "src": "6926:138:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2470,
                              "name": "_tokenOwners",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2224,
                              "src": "7036:12:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage",
                                "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap storage ref"
                              }
                            },
                            "id": 2471,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 4097,
                            "src": "7036:19:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_UintToAddressMap_$4011_storage_ptr_$returns$_t_uint256_$bound_to$_t_struct$_UintToAddressMap_$4011_storage_ptr_$",
                              "typeString": "function (struct EnumerableMapUpgradeable.UintToAddressMap storage pointer) view returns (uint256)"
                            }
                          },
                          "id": 2472,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7036:21:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 2469,
                        "id": 2473,
                        "nodeType": "Return",
                        "src": "7029:28:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2464,
                    "nodeType": "StructuredDocumentation",
                    "src": "6791:60:13",
                    "text": " @dev See {IERC721Enumerable-totalSupply}."
                  },
                  "functionSelector": "18160ddd",
                  "id": 2475,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "totalSupply",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 2466,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "6899:8:13"
                  },
                  "parameters": {
                    "id": 2465,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6876:2:13"
                  },
                  "returnParameters": {
                    "id": 2469,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2468,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2475,
                        "src": "6917:7:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2467,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6917:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6916:9:13"
                  },
                  "scope": 3146,
                  "src": "6856:208:13",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    3176
                  ],
                  "body": {
                    "id": 2493,
                    "nodeType": "Block",
                    "src": "7220:85:13",
                    "statements": [
                      {
                        "assignments": [
                          2485,
                          null
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2485,
                            "mutability": "mutable",
                            "name": "tokenId",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2493,
                            "src": "7231:15:13",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 2484,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "7231:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          null
                        ],
                        "id": 2490,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2488,
                              "name": "index",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2478,
                              "src": "7268:5:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2486,
                              "name": "_tokenOwners",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2224,
                              "src": "7252:12:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage",
                                "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap storage ref"
                              }
                            },
                            "id": 2487,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "at",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 4136,
                            "src": "7252:15:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_UintToAddressMap_$4011_storage_ptr_$_t_uint256_$returns$_t_uint256_$_t_address_$bound_to$_t_struct$_UintToAddressMap_$4011_storage_ptr_$",
                              "typeString": "function (struct EnumerableMapUpgradeable.UintToAddressMap storage pointer,uint256) view returns (uint256,address)"
                            }
                          },
                          "id": 2489,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7252:22:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_uint256_$_t_address_$",
                            "typeString": "tuple(uint256,address)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "7230:44:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2491,
                          "name": "tokenId",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2485,
                          "src": "7291:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 2483,
                        "id": 2492,
                        "nodeType": "Return",
                        "src": "7284:14:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2476,
                    "nodeType": "StructuredDocumentation",
                    "src": "7070:61:13",
                    "text": " @dev See {IERC721Enumerable-tokenByIndex}."
                  },
                  "functionSelector": "4f6ccce7",
                  "id": 2494,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "tokenByIndex",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 2480,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "7193:8:13"
                  },
                  "parameters": {
                    "id": 2479,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2478,
                        "mutability": "mutable",
                        "name": "index",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2494,
                        "src": "7158:13:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2477,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7158:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7157:15:13"
                  },
                  "returnParameters": {
                    "id": 2483,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2482,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2494,
                        "src": "7211:7:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2481,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7211:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7210:9:13"
                  },
                  "scope": 3146,
                  "src": "7136:169:13",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    3299
                  ],
                  "body": {
                    "id": 2537,
                    "nodeType": "Block",
                    "src": "7432:347:13",
                    "statements": [
                      {
                        "assignments": [
                          2504
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2504,
                            "mutability": "mutable",
                            "name": "owner",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2537,
                            "src": "7442:13:13",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 2503,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "7442:7:13",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2509,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2507,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2499,
                              "src": "7484:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2505,
                              "name": "ERC721Upgradeable",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3146,
                              "src": "7458:17:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_ERC721Upgradeable_$3146_$",
                                "typeString": "type(contract ERC721Upgradeable)"
                              }
                            },
                            "id": 2506,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "ownerOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 2347,
                            "src": "7458:25:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_address_$",
                              "typeString": "function (uint256) view returns (address)"
                            }
                          },
                          "id": 2508,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7458:34:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "7442:50:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 2513,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 2511,
                                "name": "to",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2497,
                                "src": "7510:2:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 2512,
                                "name": "owner",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2504,
                                "src": "7516:5:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "src": "7510:11:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4552433732313a20617070726f76616c20746f2063757272656e74206f776e6572",
                              "id": 2514,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7523:35:13",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_b51b4875eede07862961e8f9365c6749f5fe55c6ee5d7a9e42b6912ad0b15942",
                                "typeString": "literal_string \"ERC721: approval to current owner\""
                              },
                              "value": "ERC721: approval to current owner"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_b51b4875eede07862961e8f9365c6749f5fe55c6ee5d7a9e42b6912ad0b15942",
                                "typeString": "literal_string \"ERC721: approval to current owner\""
                              }
                            ],
                            "id": 2510,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "7502:7:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2515,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7502:57:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2516,
                        "nodeType": "ExpressionStatement",
                        "src": "7502:57:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 2528,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                "id": 2521,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "id": 2518,
                                    "name": "_msgSender",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3611,
                                    "src": "7578:10:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                      "typeString": "function () view returns (address payable)"
                                    }
                                  },
                                  "id": 2519,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "7578:12:13",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 2520,
                                  "name": "owner",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2504,
                                  "src": "7594:5:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "src": "7578:21:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2524,
                                    "name": "owner",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2504,
                                    "src": "7638:5:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "arguments": [],
                                    "expression": {
                                      "argumentTypes": [],
                                      "id": 2525,
                                      "name": "_msgSender",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3611,
                                      "src": "7645:10:13",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                        "typeString": "function () view returns (address payable)"
                                      }
                                    },
                                    "id": 2526,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "7645:12:13",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2522,
                                    "name": "ERC721Upgradeable",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3146,
                                    "src": "7603:17:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_ERC721Upgradeable_$3146_$",
                                      "typeString": "type(contract ERC721Upgradeable)"
                                    }
                                  },
                                  "id": 2523,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "isApprovedForAll",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 2611,
                                  "src": "7603:34:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_bool_$",
                                    "typeString": "function (address,address) view returns (bool)"
                                  }
                                },
                                "id": 2527,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "7603:55:13",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "7578:80:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c",
                              "id": 2529,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7672:58:13",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_6d83cef3e0cb19b8320a9c5feb26b56bbb08f152a8e61b12eca3302d8d68b23d",
                                "typeString": "literal_string \"ERC721: approve caller is not owner nor approved for all\""
                              },
                              "value": "ERC721: approve caller is not owner nor approved for all"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_6d83cef3e0cb19b8320a9c5feb26b56bbb08f152a8e61b12eca3302d8d68b23d",
                                "typeString": "literal_string \"ERC721: approve caller is not owner nor approved for all\""
                              }
                            ],
                            "id": 2517,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "7570:7:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2530,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7570:170:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2531,
                        "nodeType": "ExpressionStatement",
                        "src": "7570:170:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2533,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2497,
                              "src": "7760:2:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2534,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2499,
                              "src": "7764:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2532,
                            "name": "_approve",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3130,
                            "src": "7751:8:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 2535,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7751:21:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2536,
                        "nodeType": "ExpressionStatement",
                        "src": "7751:21:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2495,
                    "nodeType": "StructuredDocumentation",
                    "src": "7311:46:13",
                    "text": " @dev See {IERC721-approve}."
                  },
                  "functionSelector": "095ea7b3",
                  "id": 2538,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "approve",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 2501,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "7423:8:13"
                  },
                  "parameters": {
                    "id": 2500,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2497,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2538,
                        "src": "7379:10:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2496,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7379:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2499,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2538,
                        "src": "7391:15:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2498,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7391:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7378:29:13"
                  },
                  "returnParameters": {
                    "id": 2502,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "7432:0:13"
                  },
                  "scope": 3146,
                  "src": "7362:417:13",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    3307
                  ],
                  "body": {
                    "id": 2558,
                    "nodeType": "Block",
                    "src": "7925:132:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 2549,
                                  "name": "tokenId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2541,
                                  "src": "7951:7:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 2548,
                                "name": "_exists",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2730,
                                "src": "7943:7:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_bool_$",
                                  "typeString": "function (uint256) view returns (bool)"
                                }
                              },
                              "id": 2550,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7943:16:13",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e",
                              "id": 2551,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7961:46:13",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_9291e0f44949204f2e9b40e6be090924979d6047b2365868f4e9f027722eb89d",
                                "typeString": "literal_string \"ERC721: approved query for nonexistent token\""
                              },
                              "value": "ERC721: approved query for nonexistent token"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_9291e0f44949204f2e9b40e6be090924979d6047b2365868f4e9f027722eb89d",
                                "typeString": "literal_string \"ERC721: approved query for nonexistent token\""
                              }
                            ],
                            "id": 2547,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "7935:7:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2552,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7935:73:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2553,
                        "nodeType": "ExpressionStatement",
                        "src": "7935:73:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 2554,
                            "name": "_tokenApprovals",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2228,
                            "src": "8026:15:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_uint256_$_t_address_$",
                              "typeString": "mapping(uint256 => address)"
                            }
                          },
                          "id": 2556,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 2555,
                            "name": "tokenId",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2541,
                            "src": "8042:7:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "8026:24:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "functionReturnParameters": 2546,
                        "id": 2557,
                        "nodeType": "Return",
                        "src": "8019:31:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2539,
                    "nodeType": "StructuredDocumentation",
                    "src": "7785:50:13",
                    "text": " @dev See {IERC721-getApproved}."
                  },
                  "functionSelector": "081812fc",
                  "id": 2559,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "getApproved",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 2543,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "7898:8:13"
                  },
                  "parameters": {
                    "id": 2542,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2541,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2559,
                        "src": "7861:15:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2540,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7861:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7860:17:13"
                  },
                  "returnParameters": {
                    "id": 2546,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2545,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2559,
                        "src": "7916:7:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2544,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7916:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7915:9:13"
                  },
                  "scope": 3146,
                  "src": "7840:217:13",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    3315
                  ],
                  "body": {
                    "id": 2592,
                    "nodeType": "Block",
                    "src": "8208:206:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 2572,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 2569,
                                "name": "operator",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2562,
                                "src": "8226:8:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "id": 2570,
                                  "name": "_msgSender",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3611,
                                  "src": "8238:10:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                    "typeString": "function () view returns (address payable)"
                                  }
                                },
                                "id": 2571,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "8238:12:13",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "8226:24:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4552433732313a20617070726f766520746f2063616c6c6572",
                              "id": 2573,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "8252:27:13",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_45fe4329685be5ecd250fd0e6a25aea0ea4d0e30fb6a73c118b95749e6d70d05",
                                "typeString": "literal_string \"ERC721: approve to caller\""
                              },
                              "value": "ERC721: approve to caller"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_45fe4329685be5ecd250fd0e6a25aea0ea4d0e30fb6a73c118b95749e6d70d05",
                                "typeString": "literal_string \"ERC721: approve to caller\""
                              }
                            ],
                            "id": 2568,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "8218:7:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2574,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8218:62:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2575,
                        "nodeType": "ExpressionStatement",
                        "src": "8218:62:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 2583,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 2576,
                                "name": "_operatorApprovals",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2234,
                                "src": "8291:18:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$",
                                  "typeString": "mapping(address => mapping(address => bool))"
                                }
                              },
                              "id": 2580,
                              "indexExpression": {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "id": 2577,
                                  "name": "_msgSender",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3611,
                                  "src": "8310:10:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                    "typeString": "function () view returns (address payable)"
                                  }
                                },
                                "id": 2578,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "8310:12:13",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "8291:32:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                                "typeString": "mapping(address => bool)"
                              }
                            },
                            "id": 2581,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 2579,
                              "name": "operator",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2562,
                              "src": "8324:8:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "8291:42:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 2582,
                            "name": "approved",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2564,
                            "src": "8336:8:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "8291:53:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2584,
                        "nodeType": "ExpressionStatement",
                        "src": "8291:53:13"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 2586,
                                "name": "_msgSender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3611,
                                "src": "8374:10:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                  "typeString": "function () view returns (address payable)"
                                }
                              },
                              "id": 2587,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "8374:12:13",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2588,
                              "name": "operator",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2562,
                              "src": "8388:8:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2589,
                              "name": "approved",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2564,
                              "src": "8398:8:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            ],
                            "id": 2585,
                            "name": "ApprovalForAll",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3255,
                            "src": "8359:14:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_bool_$returns$__$",
                              "typeString": "function (address,address,bool)"
                            }
                          },
                          "id": 2590,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8359:48:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2591,
                        "nodeType": "EmitStatement",
                        "src": "8354:53:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2560,
                    "nodeType": "StructuredDocumentation",
                    "src": "8063:56:13",
                    "text": " @dev See {IERC721-setApprovalForAll}."
                  },
                  "functionSelector": "a22cb465",
                  "id": 2593,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setApprovalForAll",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 2566,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "8199:8:13"
                  },
                  "parameters": {
                    "id": 2565,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2562,
                        "mutability": "mutable",
                        "name": "operator",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2593,
                        "src": "8151:16:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2561,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8151:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2564,
                        "mutability": "mutable",
                        "name": "approved",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2593,
                        "src": "8169:13:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 2563,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "8169:4:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8150:33:13"
                  },
                  "returnParameters": {
                    "id": 2567,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "8208:0:13"
                  },
                  "scope": 3146,
                  "src": "8124:290:13",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    3325
                  ],
                  "body": {
                    "id": 2610,
                    "nodeType": "Block",
                    "src": "8583:59:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 2604,
                              "name": "_operatorApprovals",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2234,
                              "src": "8600:18:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$",
                                "typeString": "mapping(address => mapping(address => bool))"
                              }
                            },
                            "id": 2606,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 2605,
                              "name": "owner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2596,
                              "src": "8619:5:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "8600:25:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                              "typeString": "mapping(address => bool)"
                            }
                          },
                          "id": 2608,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 2607,
                            "name": "operator",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2598,
                            "src": "8626:8:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "8600:35:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 2603,
                        "id": 2609,
                        "nodeType": "Return",
                        "src": "8593:42:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2594,
                    "nodeType": "StructuredDocumentation",
                    "src": "8420:55:13",
                    "text": " @dev See {IERC721-isApprovedForAll}."
                  },
                  "functionSelector": "e985e9c5",
                  "id": 2611,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "isApprovedForAll",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 2600,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "8559:8:13"
                  },
                  "parameters": {
                    "id": 2599,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2596,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2611,
                        "src": "8506:13:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2595,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8506:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2598,
                        "mutability": "mutable",
                        "name": "operator",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2611,
                        "src": "8521:16:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2597,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8521:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8505:33:13"
                  },
                  "returnParameters": {
                    "id": 2603,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2602,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2611,
                        "src": "8577:4:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 2601,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "8577:4:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8576:6:13"
                  },
                  "scope": 3146,
                  "src": "8480:162:13",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    3291
                  ],
                  "body": {
                    "id": 2637,
                    "nodeType": "Block",
                    "src": "8793:211:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "id": 2624,
                                    "name": "_msgSender",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3611,
                                    "src": "8882:10:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                      "typeString": "function () view returns (address payable)"
                                    }
                                  },
                                  "id": 2625,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "8882:12:13",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 2626,
                                  "name": "tokenId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2618,
                                  "src": "8896:7:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 2623,
                                "name": "_isApprovedOrOwner",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2772,
                                "src": "8863:18:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_bool_$",
                                  "typeString": "function (address,uint256) view returns (bool)"
                                }
                              },
                              "id": 2627,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "8863:41:13",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564",
                              "id": 2628,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "8906:51:13",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c8682f3ad98807db59a6ec6bb812b72fed0a66e3150fa8239699ee83885247f2",
                                "typeString": "literal_string \"ERC721: transfer caller is not owner nor approved\""
                              },
                              "value": "ERC721: transfer caller is not owner nor approved"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_c8682f3ad98807db59a6ec6bb812b72fed0a66e3150fa8239699ee83885247f2",
                                "typeString": "literal_string \"ERC721: transfer caller is not owner nor approved\""
                              }
                            ],
                            "id": 2622,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "8855:7:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2629,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8855:103:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2630,
                        "nodeType": "ExpressionStatement",
                        "src": "8855:103:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2632,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2614,
                              "src": "8979:4:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2633,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2616,
                              "src": "8985:2:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2634,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2618,
                              "src": "8989:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2631,
                            "name": "_transfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3016,
                            "src": "8969:9:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 2635,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8969:28:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2636,
                        "nodeType": "ExpressionStatement",
                        "src": "8969:28:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2612,
                    "nodeType": "StructuredDocumentation",
                    "src": "8648:51:13",
                    "text": " @dev See {IERC721-transferFrom}."
                  },
                  "functionSelector": "23b872dd",
                  "id": 2638,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "transferFrom",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 2620,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "8784:8:13"
                  },
                  "parameters": {
                    "id": 2619,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2614,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2638,
                        "src": "8726:12:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2613,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8726:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2616,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2638,
                        "src": "8740:10:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2615,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8740:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2618,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2638,
                        "src": "8752:15:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2617,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "8752:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8725:43:13"
                  },
                  "returnParameters": {
                    "id": 2621,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "8793:0:13"
                  },
                  "scope": 3146,
                  "src": "8704:300:13",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    3281
                  ],
                  "body": {
                    "id": 2656,
                    "nodeType": "Block",
                    "src": "9163:56:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2650,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2641,
                              "src": "9190:4:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2651,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2643,
                              "src": "9196:2:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2652,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2645,
                              "src": "9200:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "",
                              "id": 2653,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "9209:2:13",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                "typeString": "literal_string \"\""
                              },
                              "value": ""
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                "typeString": "literal_string \"\""
                              }
                            ],
                            "id": 2649,
                            "name": "safeTransferFrom",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              2657,
                              2687
                            ],
                            "referencedDeclaration": 2687,
                            "src": "9173:16:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (address,address,uint256,bytes memory)"
                            }
                          },
                          "id": 2654,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9173:39:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2655,
                        "nodeType": "ExpressionStatement",
                        "src": "9173:39:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2639,
                    "nodeType": "StructuredDocumentation",
                    "src": "9010:55:13",
                    "text": " @dev See {IERC721-safeTransferFrom}."
                  },
                  "functionSelector": "42842e0e",
                  "id": 2657,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "safeTransferFrom",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 2647,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "9154:8:13"
                  },
                  "parameters": {
                    "id": 2646,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2641,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2657,
                        "src": "9096:12:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2640,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "9096:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2643,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2657,
                        "src": "9110:10:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2642,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "9110:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2645,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2657,
                        "src": "9122:15:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2644,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "9122:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9095:43:13"
                  },
                  "returnParameters": {
                    "id": 2648,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "9163:0:13"
                  },
                  "scope": 3146,
                  "src": "9070:149:13",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    3337
                  ],
                  "body": {
                    "id": 2686,
                    "nodeType": "Block",
                    "src": "9398:169:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "id": 2672,
                                    "name": "_msgSender",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3611,
                                    "src": "9435:10:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                      "typeString": "function () view returns (address payable)"
                                    }
                                  },
                                  "id": 2673,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "9435:12:13",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 2674,
                                  "name": "tokenId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2664,
                                  "src": "9449:7:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 2671,
                                "name": "_isApprovedOrOwner",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2772,
                                "src": "9416:18:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_bool_$",
                                  "typeString": "function (address,uint256) view returns (bool)"
                                }
                              },
                              "id": 2675,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "9416:41:13",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564",
                              "id": 2676,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "9459:51:13",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c8682f3ad98807db59a6ec6bb812b72fed0a66e3150fa8239699ee83885247f2",
                                "typeString": "literal_string \"ERC721: transfer caller is not owner nor approved\""
                              },
                              "value": "ERC721: transfer caller is not owner nor approved"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_c8682f3ad98807db59a6ec6bb812b72fed0a66e3150fa8239699ee83885247f2",
                                "typeString": "literal_string \"ERC721: transfer caller is not owner nor approved\""
                              }
                            ],
                            "id": 2670,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "9408:7:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2677,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9408:103:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2678,
                        "nodeType": "ExpressionStatement",
                        "src": "9408:103:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2680,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2660,
                              "src": "9535:4:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2681,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2662,
                              "src": "9541:2:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2682,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2664,
                              "src": "9545:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2683,
                              "name": "_data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2666,
                              "src": "9554:5:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 2679,
                            "name": "_safeTransfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2716,
                            "src": "9521:13:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (address,address,uint256,bytes memory)"
                            }
                          },
                          "id": 2684,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9521:39:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2685,
                        "nodeType": "ExpressionStatement",
                        "src": "9521:39:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2658,
                    "nodeType": "StructuredDocumentation",
                    "src": "9225:55:13",
                    "text": " @dev See {IERC721-safeTransferFrom}."
                  },
                  "functionSelector": "b88d4fde",
                  "id": 2687,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "safeTransferFrom",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 2668,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "9389:8:13"
                  },
                  "parameters": {
                    "id": 2667,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2660,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2687,
                        "src": "9311:12:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2659,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "9311:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2662,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2687,
                        "src": "9325:10:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2661,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "9325:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2664,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2687,
                        "src": "9337:15:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2663,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "9337:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2666,
                        "mutability": "mutable",
                        "name": "_data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2687,
                        "src": "9354:18:13",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 2665,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "9354:5:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9310:63:13"
                  },
                  "returnParameters": {
                    "id": 2669,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "9398:0:13"
                  },
                  "scope": 3146,
                  "src": "9285:282:13",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 2715,
                    "nodeType": "Block",
                    "src": "10532:166:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2700,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2690,
                              "src": "10552:4:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2701,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2692,
                              "src": "10558:2:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2702,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2694,
                              "src": "10562:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2699,
                            "name": "_transfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3016,
                            "src": "10542:9:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 2703,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10542:28:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2704,
                        "nodeType": "ExpressionStatement",
                        "src": "10542:28:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 2707,
                                  "name": "from",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2690,
                                  "src": "10611:4:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 2708,
                                  "name": "to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2692,
                                  "src": "10617:2:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 2709,
                                  "name": "tokenId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2694,
                                  "src": "10621:7:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 2710,
                                  "name": "_data",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2696,
                                  "src": "10630:5:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                ],
                                "id": 2706,
                                "name": "_checkOnERC721Received",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3107,
                                "src": "10588:22:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$_t_bool_$",
                                  "typeString": "function (address,address,uint256,bytes memory) returns (bool)"
                                }
                              },
                              "id": 2711,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "10588:48:13",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e746572",
                              "id": 2712,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "10638:52:13",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_1e766a06da43a53d0f4c380e06e5a342e14d5af1bf8501996c844905530ca84e",
                                "typeString": "literal_string \"ERC721: transfer to non ERC721Receiver implementer\""
                              },
                              "value": "ERC721: transfer to non ERC721Receiver implementer"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_1e766a06da43a53d0f4c380e06e5a342e14d5af1bf8501996c844905530ca84e",
                                "typeString": "literal_string \"ERC721: transfer to non ERC721Receiver implementer\""
                              }
                            ],
                            "id": 2705,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "10580:7:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2713,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10580:111:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2714,
                        "nodeType": "ExpressionStatement",
                        "src": "10580:111:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2688,
                    "nodeType": "StructuredDocumentation",
                    "src": "9573:851:13",
                    "text": " @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n are aware of the ERC721 protocol to prevent tokens from being forever locked.\n `_data` is additional data, it has no specified format and it is sent in call to `to`.\n This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\n implement alternative mechanisms to perform token transfer, such as signature-based.\n Requirements:\n - `from` cannot be the zero address.\n - `to` cannot be the zero address.\n - `tokenId` token must exist and be owned by `from`.\n - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n Emits a {Transfer} event."
                  },
                  "id": 2716,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_safeTransfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2697,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2690,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2716,
                        "src": "10452:12:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2689,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "10452:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2692,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2716,
                        "src": "10466:10:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2691,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "10466:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2694,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2716,
                        "src": "10478:15:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2693,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "10478:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2696,
                        "mutability": "mutable",
                        "name": "_data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2716,
                        "src": "10495:18:13",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 2695,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "10495:5:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10451:63:13"
                  },
                  "returnParameters": {
                    "id": 2698,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "10532:0:13"
                  },
                  "scope": 3146,
                  "src": "10429:269:13",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 2729,
                    "nodeType": "Block",
                    "src": "11072:54:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2726,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2719,
                              "src": "11111:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2724,
                              "name": "_tokenOwners",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2224,
                              "src": "11089:12:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage",
                                "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap storage ref"
                              }
                            },
                            "id": 2725,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "contains",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 4083,
                            "src": "11089:21:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_UintToAddressMap_$4011_storage_ptr_$_t_uint256_$returns$_t_bool_$bound_to$_t_struct$_UintToAddressMap_$4011_storage_ptr_$",
                              "typeString": "function (struct EnumerableMapUpgradeable.UintToAddressMap storage pointer,uint256) view returns (bool)"
                            }
                          },
                          "id": 2727,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "11089:30:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 2723,
                        "id": 2728,
                        "nodeType": "Return",
                        "src": "11082:37:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2717,
                    "nodeType": "StructuredDocumentation",
                    "src": "10704:292:13",
                    "text": " @dev Returns whether `tokenId` exists.\n Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\n Tokens start existing when they are minted (`_mint`),\n and stop existing when they are burned (`_burn`)."
                  },
                  "id": 2730,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_exists",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2720,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2719,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2730,
                        "src": "11018:15:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2718,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11018:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11017:17:13"
                  },
                  "returnParameters": {
                    "id": 2723,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2722,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2730,
                        "src": "11066:4:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 2721,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "11066:4:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11065:6:13"
                  },
                  "scope": 3146,
                  "src": "11001:125:13",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 2771,
                    "nodeType": "Block",
                    "src": "11383:274:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 2742,
                                  "name": "tokenId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2735,
                                  "src": "11409:7:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 2741,
                                "name": "_exists",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2730,
                                "src": "11401:7:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_bool_$",
                                  "typeString": "function (uint256) view returns (bool)"
                                }
                              },
                              "id": 2743,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "11401:16:13",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e",
                              "id": 2744,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "11419:46:13",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_5797d1ccb08b83980dd0c07ea40d8f6a64d35fff736a19bdd17522954cb0899c",
                                "typeString": "literal_string \"ERC721: operator query for nonexistent token\""
                              },
                              "value": "ERC721: operator query for nonexistent token"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_5797d1ccb08b83980dd0c07ea40d8f6a64d35fff736a19bdd17522954cb0899c",
                                "typeString": "literal_string \"ERC721: operator query for nonexistent token\""
                              }
                            ],
                            "id": 2740,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "11393:7:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2745,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "11393:73:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2746,
                        "nodeType": "ExpressionStatement",
                        "src": "11393:73:13"
                      },
                      {
                        "assignments": [
                          2748
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2748,
                            "mutability": "mutable",
                            "name": "owner",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2771,
                            "src": "11476:13:13",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 2747,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "11476:7:13",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2753,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2751,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2735,
                              "src": "11518:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2749,
                              "name": "ERC721Upgradeable",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3146,
                              "src": "11492:17:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_ERC721Upgradeable_$3146_$",
                                "typeString": "type(contract ERC721Upgradeable)"
                              }
                            },
                            "id": 2750,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "ownerOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 2347,
                            "src": "11492:25:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_address_$",
                              "typeString": "function (uint256) view returns (address)"
                            }
                          },
                          "id": 2752,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "11492:34:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "11476:50:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 2768,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "id": 2762,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  "id": 2756,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 2754,
                                    "name": "spender",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2733,
                                    "src": "11544:7:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "==",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 2755,
                                    "name": "owner",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2748,
                                    "src": "11555:5:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "src": "11544:16:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "||",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  "id": 2761,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 2758,
                                        "name": "tokenId",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2735,
                                        "src": "11576:7:13",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "id": 2757,
                                      "name": "getApproved",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 2559,
                                      "src": "11564:11:13",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_address_$",
                                        "typeString": "function (uint256) view returns (address)"
                                      }
                                    },
                                    "id": 2759,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "11564:20:13",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "==",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 2760,
                                    "name": "spender",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2733,
                                    "src": "11588:7:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "src": "11564:31:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "src": "11544:51:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2765,
                                    "name": "owner",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2748,
                                    "src": "11634:5:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 2766,
                                    "name": "spender",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2733,
                                    "src": "11641:7:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2763,
                                    "name": "ERC721Upgradeable",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3146,
                                    "src": "11599:17:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_ERC721Upgradeable_$3146_$",
                                      "typeString": "type(contract ERC721Upgradeable)"
                                    }
                                  },
                                  "id": 2764,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "isApprovedForAll",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 2611,
                                  "src": "11599:34:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_bool_$",
                                    "typeString": "function (address,address) view returns (bool)"
                                  }
                                },
                                "id": 2767,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "11599:50:13",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "11544:105:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "id": 2769,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "11543:107:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 2739,
                        "id": 2770,
                        "nodeType": "Return",
                        "src": "11536:114:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2731,
                    "nodeType": "StructuredDocumentation",
                    "src": "11132:147:13",
                    "text": " @dev Returns whether `spender` is allowed to manage `tokenId`.\n Requirements:\n - `tokenId` must exist."
                  },
                  "id": 2772,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_isApprovedOrOwner",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2736,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2733,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2772,
                        "src": "11312:15:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2732,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "11312:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2735,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2772,
                        "src": "11329:15:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2734,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11329:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11311:34:13"
                  },
                  "returnParameters": {
                    "id": 2739,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2738,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2772,
                        "src": "11377:4:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 2737,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "11377:4:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11376:6:13"
                  },
                  "scope": 3146,
                  "src": "11284:373:13",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 2786,
                    "nodeType": "Block",
                    "src": "12053:43:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2781,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2775,
                              "src": "12073:2:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2782,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2777,
                              "src": "12077:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "",
                              "id": 2783,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "12086:2:13",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                "typeString": "literal_string \"\""
                              },
                              "value": ""
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                "typeString": "literal_string \"\""
                              }
                            ],
                            "id": 2780,
                            "name": "_safeMint",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              2787,
                              2816
                            ],
                            "referencedDeclaration": 2816,
                            "src": "12063:9:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (address,uint256,bytes memory)"
                            }
                          },
                          "id": 2784,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12063:26:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2785,
                        "nodeType": "ExpressionStatement",
                        "src": "12063:26:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2773,
                    "nodeType": "StructuredDocumentation",
                    "src": "11663:320:13",
                    "text": " @dev Safely mints `tokenId` and transfers it to `to`.\n Requirements:\nd*\n - `tokenId` must not exist.\n - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n Emits a {Transfer} event."
                  },
                  "id": 2787,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_safeMint",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2778,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2775,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2787,
                        "src": "12007:10:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2774,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "12007:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2777,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2787,
                        "src": "12019:15:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2776,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12019:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12006:29:13"
                  },
                  "returnParameters": {
                    "id": 2779,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "12053:0:13"
                  },
                  "scope": 3146,
                  "src": "11988:108:13",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 2815,
                    "nodeType": "Block",
                    "src": "12402:162:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2798,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2790,
                              "src": "12418:2:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2799,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2792,
                              "src": "12422:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2797,
                            "name": "_mint",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2875,
                            "src": "12412:5:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 2800,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12412:18:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2801,
                        "nodeType": "ExpressionStatement",
                        "src": "12412:18:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "30",
                                      "id": 2806,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "12479:1:13",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      },
                                      "value": "0"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      }
                                    ],
                                    "id": 2805,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "12471:7:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 2804,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "12471:7:13",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 2807,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "12471:10:13",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 2808,
                                  "name": "to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2790,
                                  "src": "12483:2:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 2809,
                                  "name": "tokenId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2792,
                                  "src": "12487:7:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 2810,
                                  "name": "_data",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2794,
                                  "src": "12496:5:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                ],
                                "id": 2803,
                                "name": "_checkOnERC721Received",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3107,
                                "src": "12448:22:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$_t_bool_$",
                                  "typeString": "function (address,address,uint256,bytes memory) returns (bool)"
                                }
                              },
                              "id": 2811,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "12448:54:13",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e746572",
                              "id": 2812,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "12504:52:13",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_1e766a06da43a53d0f4c380e06e5a342e14d5af1bf8501996c844905530ca84e",
                                "typeString": "literal_string \"ERC721: transfer to non ERC721Receiver implementer\""
                              },
                              "value": "ERC721: transfer to non ERC721Receiver implementer"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_1e766a06da43a53d0f4c380e06e5a342e14d5af1bf8501996c844905530ca84e",
                                "typeString": "literal_string \"ERC721: transfer to non ERC721Receiver implementer\""
                              }
                            ],
                            "id": 2802,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "12440:7:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2813,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12440:117:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2814,
                        "nodeType": "ExpressionStatement",
                        "src": "12440:117:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2788,
                    "nodeType": "StructuredDocumentation",
                    "src": "12102:210:13",
                    "text": " @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\n forwarded in {IERC721Receiver-onERC721Received} to contract recipients."
                  },
                  "id": 2816,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_safeMint",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2795,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2790,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2816,
                        "src": "12336:10:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2789,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "12336:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2792,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2816,
                        "src": "12348:15:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2791,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12348:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2794,
                        "mutability": "mutable",
                        "name": "_data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2816,
                        "src": "12365:18:13",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 2793,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "12365:5:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12335:49:13"
                  },
                  "returnParameters": {
                    "id": 2796,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "12402:0:13"
                  },
                  "scope": 3146,
                  "src": "12317:247:13",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 2874,
                    "nodeType": "Block",
                    "src": "12947:332:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 2830,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 2825,
                                "name": "to",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2819,
                                "src": "12965:2:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 2828,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "12979:1:13",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 2827,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "12971:7:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 2826,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "12971:7:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 2829,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "12971:10:13",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "12965:16:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4552433732313a206d696e7420746f20746865207a65726f2061646472657373",
                              "id": 2831,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "12983:34:13",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_8a66f4bb6512ffbfcc3db9b42318eb65f26ac15163eaa9a1e5cfa7bee9d1c7c6",
                                "typeString": "literal_string \"ERC721: mint to the zero address\""
                              },
                              "value": "ERC721: mint to the zero address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_8a66f4bb6512ffbfcc3db9b42318eb65f26ac15163eaa9a1e5cfa7bee9d1c7c6",
                                "typeString": "literal_string \"ERC721: mint to the zero address\""
                              }
                            ],
                            "id": 2824,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "12957:7:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2832,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12957:61:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2833,
                        "nodeType": "ExpressionStatement",
                        "src": "12957:61:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2838,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "UnaryOperation",
                              "operator": "!",
                              "prefix": true,
                              "src": "13036:17:13",
                              "subExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2836,
                                    "name": "tokenId",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2821,
                                    "src": "13045:7:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 2835,
                                  "name": "_exists",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 2730,
                                  "src": "13037:7:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_bool_$",
                                    "typeString": "function (uint256) view returns (bool)"
                                  }
                                },
                                "id": 2837,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "13037:16:13",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4552433732313a20746f6b656e20616c7265616479206d696e746564",
                              "id": 2839,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "13055:30:13",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_2a63ce106ef95058ed21fd07c42a10f11dc5c32ac13a4e847923f7759f635d57",
                                "typeString": "literal_string \"ERC721: token already minted\""
                              },
                              "value": "ERC721: token already minted"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_2a63ce106ef95058ed21fd07c42a10f11dc5c32ac13a4e847923f7759f635d57",
                                "typeString": "literal_string \"ERC721: token already minted\""
                              }
                            ],
                            "id": 2834,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "13028:7:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2840,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13028:58:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2841,
                        "nodeType": "ExpressionStatement",
                        "src": "13028:58:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 2845,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "13126:1:13",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 2844,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "13118:7:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 2843,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "13118:7:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 2846,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "13118:10:13",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2847,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2819,
                              "src": "13130:2:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2848,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2821,
                              "src": "13134:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2842,
                            "name": "_beforeTokenTransfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3141,
                            "src": "13097:20:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 2849,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13097:45:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2850,
                        "nodeType": "ExpressionStatement",
                        "src": "13097:45:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2855,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2821,
                              "src": "13175:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 2851,
                                "name": "_holderTokens",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2222,
                                "src": "13153:13:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UintSet_$4634_storage_$",
                                  "typeString": "mapping(address => struct EnumerableSetUpgradeable.UintSet storage ref)"
                                }
                              },
                              "id": 2853,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 2852,
                                "name": "to",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2819,
                                "src": "13167:2:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "13153:17:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_UintSet_$4634_storage",
                                "typeString": "struct EnumerableSetUpgradeable.UintSet storage ref"
                              }
                            },
                            "id": 2854,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "add",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 4654,
                            "src": "13153:21:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_UintSet_$4634_storage_ptr_$_t_uint256_$returns$_t_bool_$bound_to$_t_struct$_UintSet_$4634_storage_ptr_$",
                              "typeString": "function (struct EnumerableSetUpgradeable.UintSet storage pointer,uint256) returns (bool)"
                            }
                          },
                          "id": 2856,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13153:30:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2857,
                        "nodeType": "ExpressionStatement",
                        "src": "13153:30:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2861,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2821,
                              "src": "13211:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2862,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2819,
                              "src": "13220:2:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2858,
                              "name": "_tokenOwners",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2224,
                              "src": "13194:12:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage",
                                "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap storage ref"
                              }
                            },
                            "id": 2860,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "set",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 4043,
                            "src": "13194:16:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_UintToAddressMap_$4011_storage_ptr_$_t_uint256_$_t_address_$returns$_t_bool_$bound_to$_t_struct$_UintToAddressMap_$4011_storage_ptr_$",
                              "typeString": "function (struct EnumerableMapUpgradeable.UintToAddressMap storage pointer,uint256,address) returns (bool)"
                            }
                          },
                          "id": 2863,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13194:29:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2864,
                        "nodeType": "ExpressionStatement",
                        "src": "13194:29:13"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 2868,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "13256:1:13",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 2867,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "13248:7:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 2866,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "13248:7:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 2869,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "13248:10:13",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2870,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2819,
                              "src": "13260:2:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2871,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2821,
                              "src": "13264:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2865,
                            "name": "Transfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3237,
                            "src": "13239:8:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 2872,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13239:33:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2873,
                        "nodeType": "EmitStatement",
                        "src": "13234:38:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2817,
                    "nodeType": "StructuredDocumentation",
                    "src": "12570:311:13",
                    "text": " @dev Mints `tokenId` and transfers it to `to`.\n WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\n Requirements:\n - `tokenId` must not exist.\n - `to` cannot be the zero address.\n Emits a {Transfer} event."
                  },
                  "id": 2875,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_mint",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2822,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2819,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2875,
                        "src": "12901:10:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2818,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "12901:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2821,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2875,
                        "src": "12913:15:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2820,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12913:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12900:29:13"
                  },
                  "returnParameters": {
                    "id": 2823,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "12947:0:13"
                  },
                  "scope": 3146,
                  "src": "12886:393:13",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 2943,
                    "nodeType": "Block",
                    "src": "13545:489:13",
                    "statements": [
                      {
                        "assignments": [
                          2882
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 2882,
                            "mutability": "mutable",
                            "name": "owner",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 2943,
                            "src": "13555:13:13",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 2881,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "13555:7:13",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 2887,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2885,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2878,
                              "src": "13597:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2883,
                              "name": "ERC721Upgradeable",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3146,
                              "src": "13571:17:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_ERC721Upgradeable_$3146_$",
                                "typeString": "type(contract ERC721Upgradeable)"
                              }
                            },
                            "id": 2884,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "ownerOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 2347,
                            "src": "13571:25:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_address_$",
                              "typeString": "function (uint256) view returns (address)"
                            }
                          },
                          "id": 2886,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13571:34:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "13555:50:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2889,
                              "name": "owner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2882,
                              "src": "13655:5:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 2892,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "13670:1:13",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 2891,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "13662:7:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 2890,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "13662:7:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 2893,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "13662:10:13",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2894,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2878,
                              "src": "13674:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2888,
                            "name": "_beforeTokenTransfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3141,
                            "src": "13634:20:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 2895,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13634:48:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2896,
                        "nodeType": "ExpressionStatement",
                        "src": "13634:48:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 2900,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "13737:1:13",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 2899,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "13729:7:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 2898,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "13729:7:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 2901,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "13729:10:13",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2902,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2878,
                              "src": "13741:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2897,
                            "name": "_approve",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3130,
                            "src": "13720:8:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 2903,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13720:29:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2904,
                        "nodeType": "ExpressionStatement",
                        "src": "13720:29:13"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 2913,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 2907,
                                    "name": "_tokenURIs",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2242,
                                    "src": "13805:10:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_uint256_$_t_string_storage_$",
                                      "typeString": "mapping(uint256 => string storage ref)"
                                    }
                                  },
                                  "id": 2909,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 2908,
                                    "name": "tokenId",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2878,
                                    "src": "13816:7:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "13805:19:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_storage",
                                    "typeString": "string storage ref"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_string_storage",
                                    "typeString": "string storage ref"
                                  }
                                ],
                                "id": 2906,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "13799:5:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                                  "typeString": "type(bytes storage pointer)"
                                },
                                "typeName": {
                                  "id": 2905,
                                  "name": "bytes",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "13799:5:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 2910,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "13799:26:13",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes storage pointer"
                              }
                            },
                            "id": 2911,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "13799:33:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 2912,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "13836:1:13",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "13799:38:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 2920,
                        "nodeType": "IfStatement",
                        "src": "13795:95:13",
                        "trueBody": {
                          "id": 2919,
                          "nodeType": "Block",
                          "src": "13839:51:13",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 2917,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "UnaryOperation",
                                "operator": "delete",
                                "prefix": true,
                                "src": "13853:26:13",
                                "subExpression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 2914,
                                    "name": "_tokenURIs",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2242,
                                    "src": "13860:10:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_uint256_$_t_string_storage_$",
                                      "typeString": "mapping(uint256 => string storage ref)"
                                    }
                                  },
                                  "id": 2916,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 2915,
                                    "name": "tokenId",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2878,
                                    "src": "13871:7:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "13860:19:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_storage",
                                    "typeString": "string storage ref"
                                  }
                                },
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 2918,
                              "nodeType": "ExpressionStatement",
                              "src": "13853:26:13"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2925,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2878,
                              "src": "13928:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 2921,
                                "name": "_holderTokens",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2222,
                                "src": "13900:13:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UintSet_$4634_storage_$",
                                  "typeString": "mapping(address => struct EnumerableSetUpgradeable.UintSet storage ref)"
                                }
                              },
                              "id": 2923,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 2922,
                                "name": "owner",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2882,
                                "src": "13914:5:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "13900:20:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_UintSet_$4634_storage",
                                "typeString": "struct EnumerableSetUpgradeable.UintSet storage ref"
                              }
                            },
                            "id": 2924,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "remove",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 4674,
                            "src": "13900:27:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_UintSet_$4634_storage_ptr_$_t_uint256_$returns$_t_bool_$bound_to$_t_struct$_UintSet_$4634_storage_ptr_$",
                              "typeString": "function (struct EnumerableSetUpgradeable.UintSet storage pointer,uint256) returns (bool)"
                            }
                          },
                          "id": 2926,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13900:36:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2927,
                        "nodeType": "ExpressionStatement",
                        "src": "13900:36:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2931,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2878,
                              "src": "13967:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2928,
                              "name": "_tokenOwners",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2224,
                              "src": "13947:12:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage",
                                "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap storage ref"
                              }
                            },
                            "id": 2930,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "remove",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 4063,
                            "src": "13947:19:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_UintToAddressMap_$4011_storage_ptr_$_t_uint256_$returns$_t_bool_$bound_to$_t_struct$_UintToAddressMap_$4011_storage_ptr_$",
                              "typeString": "function (struct EnumerableMapUpgradeable.UintToAddressMap storage pointer,uint256) returns (bool)"
                            }
                          },
                          "id": 2932,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13947:28:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2933,
                        "nodeType": "ExpressionStatement",
                        "src": "13947:28:13"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2935,
                              "name": "owner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2882,
                              "src": "14000:5:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 2938,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "14015:1:13",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 2937,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "14007:7:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 2936,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "14007:7:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 2939,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "14007:10:13",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2940,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2878,
                              "src": "14019:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2934,
                            "name": "Transfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3237,
                            "src": "13991:8:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 2941,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13991:36:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2942,
                        "nodeType": "EmitStatement",
                        "src": "13986:41:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2876,
                    "nodeType": "StructuredDocumentation",
                    "src": "13285:206:13",
                    "text": " @dev Destroys `tokenId`.\n The approval is cleared when the token is burned.\n Requirements:\n - `tokenId` must exist.\n Emits a {Transfer} event."
                  },
                  "id": 2944,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_burn",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2879,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2878,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 2944,
                        "src": "13511:15:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2877,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "13511:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "13510:17:13"
                  },
                  "returnParameters": {
                    "id": 2880,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "13545:0:13"
                  },
                  "scope": 3146,
                  "src": "13496:538:13",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3015,
                    "nodeType": "Block",
                    "src": "14437:516:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 2960,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 2957,
                                    "name": "tokenId",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2951,
                                    "src": "14481:7:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2955,
                                    "name": "ERC721Upgradeable",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3146,
                                    "src": "14455:17:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_ERC721Upgradeable_$3146_$",
                                      "typeString": "type(contract ERC721Upgradeable)"
                                    }
                                  },
                                  "id": 2956,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "ownerOf",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 2347,
                                  "src": "14455:25:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_address_$",
                                    "typeString": "function (uint256) view returns (address)"
                                  }
                                },
                                "id": 2958,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "14455:34:13",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 2959,
                                "name": "from",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2947,
                                "src": "14493:4:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "src": "14455:42:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e",
                              "id": 2961,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "14499:43:13",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_a01073130a885d6c1c1af6ac75fc3b1c4f9403c235362962bbf528e2bd87d950",
                                "typeString": "literal_string \"ERC721: transfer of token that is not own\""
                              },
                              "value": "ERC721: transfer of token that is not own"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_a01073130a885d6c1c1af6ac75fc3b1c4f9403c235362962bbf528e2bd87d950",
                                "typeString": "literal_string \"ERC721: transfer of token that is not own\""
                              }
                            ],
                            "id": 2954,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "14447:7:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2962,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14447:96:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2963,
                        "nodeType": "ExpressionStatement",
                        "src": "14447:96:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 2970,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 2965,
                                "name": "to",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2949,
                                "src": "14579:2:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 2968,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "14593:1:13",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 2967,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "14585:7:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 2966,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "14585:7:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 2969,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "14585:10:13",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "14579:16:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4552433732313a207472616e7366657220746f20746865207a65726f2061646472657373",
                              "id": 2971,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "14597:38:13",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_455fea98ea03c32d7dd1a6f1426917d80529bf47b3ccbde74e7206e889e709f4",
                                "typeString": "literal_string \"ERC721: transfer to the zero address\""
                              },
                              "value": "ERC721: transfer to the zero address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_455fea98ea03c32d7dd1a6f1426917d80529bf47b3ccbde74e7206e889e709f4",
                                "typeString": "literal_string \"ERC721: transfer to the zero address\""
                              }
                            ],
                            "id": 2964,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "14571:7:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 2972,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14571:65:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2973,
                        "nodeType": "ExpressionStatement",
                        "src": "14571:65:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2975,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2947,
                              "src": "14668:4:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2976,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2949,
                              "src": "14674:2:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2977,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2951,
                              "src": "14678:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2974,
                            "name": "_beforeTokenTransfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3141,
                            "src": "14647:20:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 2978,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14647:39:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2979,
                        "nodeType": "ExpressionStatement",
                        "src": "14647:39:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 2983,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "14765:1:13",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 2982,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "14757:7:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 2981,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "14757:7:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 2984,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "14757:10:13",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 2985,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2951,
                              "src": "14769:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 2980,
                            "name": "_approve",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3130,
                            "src": "14748:8:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 2986,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14748:29:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 2987,
                        "nodeType": "ExpressionStatement",
                        "src": "14748:29:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2992,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2951,
                              "src": "14815:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 2988,
                                "name": "_holderTokens",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2222,
                                "src": "14788:13:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UintSet_$4634_storage_$",
                                  "typeString": "mapping(address => struct EnumerableSetUpgradeable.UintSet storage ref)"
                                }
                              },
                              "id": 2990,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 2989,
                                "name": "from",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2947,
                                "src": "14802:4:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "14788:19:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_UintSet_$4634_storage",
                                "typeString": "struct EnumerableSetUpgradeable.UintSet storage ref"
                              }
                            },
                            "id": 2991,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "remove",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 4674,
                            "src": "14788:26:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_UintSet_$4634_storage_ptr_$_t_uint256_$returns$_t_bool_$bound_to$_t_struct$_UintSet_$4634_storage_ptr_$",
                              "typeString": "function (struct EnumerableSetUpgradeable.UintSet storage pointer,uint256) returns (bool)"
                            }
                          },
                          "id": 2993,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14788:35:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 2994,
                        "nodeType": "ExpressionStatement",
                        "src": "14788:35:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2999,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2951,
                              "src": "14855:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 2995,
                                "name": "_holderTokens",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2222,
                                "src": "14833:13:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UintSet_$4634_storage_$",
                                  "typeString": "mapping(address => struct EnumerableSetUpgradeable.UintSet storage ref)"
                                }
                              },
                              "id": 2997,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 2996,
                                "name": "to",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2949,
                                "src": "14847:2:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "14833:17:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_UintSet_$4634_storage",
                                "typeString": "struct EnumerableSetUpgradeable.UintSet storage ref"
                              }
                            },
                            "id": 2998,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "add",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 4654,
                            "src": "14833:21:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_UintSet_$4634_storage_ptr_$_t_uint256_$returns$_t_bool_$bound_to$_t_struct$_UintSet_$4634_storage_ptr_$",
                              "typeString": "function (struct EnumerableSetUpgradeable.UintSet storage pointer,uint256) returns (bool)"
                            }
                          },
                          "id": 3000,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14833:30:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 3001,
                        "nodeType": "ExpressionStatement",
                        "src": "14833:30:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3005,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2951,
                              "src": "14891:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3006,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2949,
                              "src": "14900:2:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 3002,
                              "name": "_tokenOwners",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2224,
                              "src": "14874:12:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage",
                                "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap storage ref"
                              }
                            },
                            "id": 3004,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "set",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 4043,
                            "src": "14874:16:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_UintToAddressMap_$4011_storage_ptr_$_t_uint256_$_t_address_$returns$_t_bool_$bound_to$_t_struct$_UintToAddressMap_$4011_storage_ptr_$",
                              "typeString": "function (struct EnumerableMapUpgradeable.UintToAddressMap storage pointer,uint256,address) returns (bool)"
                            }
                          },
                          "id": 3007,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14874:29:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 3008,
                        "nodeType": "ExpressionStatement",
                        "src": "14874:29:13"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3010,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2947,
                              "src": "14928:4:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3011,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2949,
                              "src": "14934:2:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3012,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2951,
                              "src": "14938:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 3009,
                            "name": "Transfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3237,
                            "src": "14919:8:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 3013,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14919:27:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3014,
                        "nodeType": "EmitStatement",
                        "src": "14914:32:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 2945,
                    "nodeType": "StructuredDocumentation",
                    "src": "14040:313:13",
                    "text": " @dev Transfers `tokenId` from `from` to `to`.\n  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\n Requirements:\n - `to` cannot be the zero address.\n - `tokenId` token must be owned by `from`.\n Emits a {Transfer} event."
                  },
                  "id": 3016,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_transfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 2952,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 2947,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3016,
                        "src": "14377:12:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2946,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "14377:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2949,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3016,
                        "src": "14391:10:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 2948,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "14391:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 2951,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3016,
                        "src": "14403:15:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 2950,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "14403:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "14376:43:13"
                  },
                  "returnParameters": {
                    "id": 2953,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "14437:0:13"
                  },
                  "scope": 3146,
                  "src": "14358:595:13",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3037,
                    "nodeType": "Block",
                    "src": "15181:131:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 3026,
                                  "name": "tokenId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3019,
                                  "src": "15207:7:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 3025,
                                "name": "_exists",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2730,
                                "src": "15199:7:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_bool_$",
                                  "typeString": "function (uint256) view returns (bool)"
                                }
                              },
                              "id": 3027,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "15199:16:13",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4552433732314d657461646174613a2055524920736574206f66206e6f6e6578697374656e7420746f6b656e",
                              "id": 3028,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "15217:46:13",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_94be4a260caaeac1b145f03ffa2e70bc612b64982d04f24073aaf3a5f9009978",
                                "typeString": "literal_string \"ERC721Metadata: URI set of nonexistent token\""
                              },
                              "value": "ERC721Metadata: URI set of nonexistent token"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_94be4a260caaeac1b145f03ffa2e70bc612b64982d04f24073aaf3a5f9009978",
                                "typeString": "literal_string \"ERC721Metadata: URI set of nonexistent token\""
                              }
                            ],
                            "id": 3024,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "15191:7:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 3029,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "15191:73:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3030,
                        "nodeType": "ExpressionStatement",
                        "src": "15191:73:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3035,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 3031,
                              "name": "_tokenURIs",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2242,
                              "src": "15274:10:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_uint256_$_t_string_storage_$",
                                "typeString": "mapping(uint256 => string storage ref)"
                              }
                            },
                            "id": 3033,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3032,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3019,
                              "src": "15285:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "15274:19:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_storage",
                              "typeString": "string storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 3034,
                            "name": "_tokenURI",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3021,
                            "src": "15296:9:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_memory_ptr",
                              "typeString": "string memory"
                            }
                          },
                          "src": "15274:31:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage",
                            "typeString": "string storage ref"
                          }
                        },
                        "id": 3036,
                        "nodeType": "ExpressionStatement",
                        "src": "15274:31:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3017,
                    "nodeType": "StructuredDocumentation",
                    "src": "14959:136:13",
                    "text": " @dev Sets `_tokenURI` as the tokenURI of `tokenId`.\n Requirements:\n - `tokenId` must exist."
                  },
                  "id": 3038,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_setTokenURI",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3022,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3019,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3038,
                        "src": "15122:15:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3018,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "15122:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3021,
                        "mutability": "mutable",
                        "name": "_tokenURI",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3038,
                        "src": "15139:23:13",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 3020,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "15139:6:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15121:42:13"
                  },
                  "returnParameters": {
                    "id": 3023,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "15181:0:13"
                  },
                  "scope": 3146,
                  "src": "15100:212:13",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3048,
                    "nodeType": "Block",
                    "src": "15597:36:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3046,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 3044,
                            "name": "_baseURI",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2244,
                            "src": "15607:8:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_storage",
                              "typeString": "string storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 3045,
                            "name": "baseURI_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3041,
                            "src": "15618:8:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_memory_ptr",
                              "typeString": "string memory"
                            }
                          },
                          "src": "15607:19:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage",
                            "typeString": "string storage ref"
                          }
                        },
                        "id": 3047,
                        "nodeType": "ExpressionStatement",
                        "src": "15607:19:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3039,
                    "nodeType": "StructuredDocumentation",
                    "src": "15318:212:13",
                    "text": " @dev Internal function to set the base URI for all token IDs. It is\n automatically added as a prefix to the value returned in {tokenURI},\n or to the token ID if {tokenURI} is empty."
                  },
                  "id": 3049,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_setBaseURI",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3042,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3041,
                        "mutability": "mutable",
                        "name": "baseURI_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3049,
                        "src": "15556:22:13",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 3040,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "15556:6:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15555:24:13"
                  },
                  "returnParameters": {
                    "id": 3043,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "15597:0:13"
                  },
                  "scope": 3146,
                  "src": "15535:98:13",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3106,
                    "nodeType": "Block",
                    "src": "16316:470:13",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 3066,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "UnaryOperation",
                          "operator": "!",
                          "prefix": true,
                          "src": "16330:16:13",
                          "subExpression": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "expression": {
                                "argumentTypes": null,
                                "id": 3063,
                                "name": "to",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3054,
                                "src": "16331:2:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 3064,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "isContract",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 3358,
                              "src": "16331:13:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$bound_to$_t_address_$",
                                "typeString": "function (address) view returns (bool)"
                              }
                            },
                            "id": 3065,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "16331:15:13",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 3070,
                        "nodeType": "IfStatement",
                        "src": "16326:58:13",
                        "trueBody": {
                          "id": 3069,
                          "nodeType": "Block",
                          "src": "16348:36:13",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "74727565",
                                "id": 3067,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "16369:4:13",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "true"
                              },
                              "functionReturnParameters": 3062,
                              "id": 3068,
                              "nodeType": "Return",
                              "src": "16362:11:13"
                            }
                          ]
                        }
                      },
                      {
                        "assignments": [
                          3072
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 3072,
                            "mutability": "mutable",
                            "name": "returndata",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3106,
                            "src": "16393:23:13",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes"
                            },
                            "typeName": {
                              "id": 3071,
                              "name": "bytes",
                              "nodeType": "ElementaryTypeName",
                              "src": "16393:5:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 3090,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 3078,
                                          "name": "to",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 3054,
                                          "src": "16498:2:13",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        ],
                                        "id": 3077,
                                        "name": "IERC721ReceiverUpgradeable",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 3222,
                                        "src": "16471:26:13",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_contract$_IERC721ReceiverUpgradeable_$3222_$",
                                          "typeString": "type(contract IERC721ReceiverUpgradeable)"
                                        }
                                      },
                                      "id": 3079,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "16471:30:13",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC721ReceiverUpgradeable_$3222",
                                        "typeString": "contract IERC721ReceiverUpgradeable"
                                      }
                                    },
                                    "id": 3080,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "onERC721Received",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 3221,
                                    "src": "16471:47:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_memory_ptr_$returns$_t_bytes4_$",
                                      "typeString": "function (address,address,uint256,bytes memory) external returns (bytes4)"
                                    }
                                  },
                                  "id": 3081,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "selector",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "16471:56:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "id": 3082,
                                    "name": "_msgSender",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3611,
                                    "src": "16541:10:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                      "typeString": "function () view returns (address payable)"
                                    }
                                  },
                                  "id": 3083,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "16541:12:13",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 3084,
                                  "name": "from",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3052,
                                  "src": "16567:4:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 3085,
                                  "name": "tokenId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3056,
                                  "src": "16585:7:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 3086,
                                  "name": "_data",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3058,
                                  "src": "16606:5:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  },
                                  {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 3075,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "16435:3:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 3076,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSelector",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "16435:22:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (bytes4) pure returns (bytes memory)"
                                }
                              },
                              "id": 3087,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "16435:186:13",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e746572",
                              "id": 3088,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "16623:52:13",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_1e766a06da43a53d0f4c380e06e5a342e14d5af1bf8501996c844905530ca84e",
                                "typeString": "literal_string \"ERC721: transfer to non ERC721Receiver implementer\""
                              },
                              "value": "ERC721: transfer to non ERC721Receiver implementer"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_1e766a06da43a53d0f4c380e06e5a342e14d5af1bf8501996c844905530ca84e",
                                "typeString": "literal_string \"ERC721: transfer to non ERC721Receiver implementer\""
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 3073,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3054,
                              "src": "16419:2:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "id": 3074,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "functionCall",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3429,
                            "src": "16419:15:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$bound_to$_t_address_$",
                              "typeString": "function (address,bytes memory,string memory) returns (bytes memory)"
                            }
                          },
                          "id": 3089,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16419:257:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "16393:283:13"
                      },
                      {
                        "assignments": [
                          3092
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 3092,
                            "mutability": "mutable",
                            "name": "retval",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3106,
                            "src": "16686:13:13",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes4",
                              "typeString": "bytes4"
                            },
                            "typeName": {
                              "id": 3091,
                              "name": "bytes4",
                              "nodeType": "ElementaryTypeName",
                              "src": "16686:6:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 3100,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3095,
                              "name": "returndata",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3072,
                              "src": "16713:10:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "components": [
                                {
                                  "argumentTypes": null,
                                  "id": 3097,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "16726:6:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_bytes4_$",
                                    "typeString": "type(bytes4)"
                                  },
                                  "typeName": {
                                    "id": 3096,
                                    "name": "bytes4",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "16726:6:13",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                }
                              ],
                              "id": 3098,
                              "isConstant": false,
                              "isInlineArray": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "TupleExpression",
                              "src": "16725:8:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_bytes4_$",
                                "typeString": "type(bytes4)"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_type$_t_bytes4_$",
                                "typeString": "type(bytes4)"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 3093,
                              "name": "abi",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -1,
                              "src": "16702:3:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_abi",
                                "typeString": "abi"
                              }
                            },
                            "id": 3094,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "memberName": "decode",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "16702:10:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_abidecode_pure$__$returns$__$",
                              "typeString": "function () pure"
                            }
                          },
                          "id": 3099,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16702:32:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes4",
                            "typeString": "bytes4"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "16686:48:13"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bytes4",
                                "typeString": "bytes4"
                              },
                              "id": 3103,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 3101,
                                "name": "retval",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3092,
                                "src": "16752:6:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes4",
                                  "typeString": "bytes4"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 3102,
                                "name": "_ERC721_RECEIVED",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2218,
                                "src": "16762:16:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes4",
                                  "typeString": "bytes4"
                                }
                              },
                              "src": "16752:26:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "id": 3104,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "16751:28:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 3062,
                        "id": 3105,
                        "nodeType": "Return",
                        "src": "16744:35:13"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3050,
                    "nodeType": "StructuredDocumentation",
                    "src": "15639:542:13",
                    "text": " @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\n The call is not executed if the target address is not a contract.\n @param from address representing the previous owner of the given token ID\n @param to target address that will receive the tokens\n @param tokenId uint256 ID of the token to be transferred\n @param _data bytes optional data to send along with the call\n @return bool whether the call correctly returned the expected magic value"
                  },
                  "id": 3107,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_checkOnERC721Received",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3059,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3052,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3107,
                        "src": "16218:12:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3051,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "16218:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3054,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3107,
                        "src": "16232:10:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3053,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "16232:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3056,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3107,
                        "src": "16244:15:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3055,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "16244:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3058,
                        "mutability": "mutable",
                        "name": "_data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3107,
                        "src": "16261:18:13",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 3057,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "16261:5:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "16217:63:13"
                  },
                  "returnParameters": {
                    "id": 3062,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3061,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3107,
                        "src": "16306:4:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 3060,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "16306:4:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "16305:6:13"
                  },
                  "scope": 3146,
                  "src": "16186:600:13",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 3129,
                    "nodeType": "Block",
                    "src": "16847:136:13",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3118,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 3114,
                              "name": "_tokenApprovals",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2228,
                              "src": "16857:15:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_uint256_$_t_address_$",
                                "typeString": "mapping(uint256 => address)"
                              }
                            },
                            "id": 3116,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3115,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3111,
                              "src": "16873:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "16857:24:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 3117,
                            "name": "to",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3109,
                            "src": "16884:2:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "16857:29:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 3119,
                        "nodeType": "ExpressionStatement",
                        "src": "16857:29:13"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 3123,
                                  "name": "tokenId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3111,
                                  "src": "16936:7:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 3121,
                                  "name": "ERC721Upgradeable",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3146,
                                  "src": "16910:17:13",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_contract$_ERC721Upgradeable_$3146_$",
                                    "typeString": "type(contract ERC721Upgradeable)"
                                  }
                                },
                                "id": 3122,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "ownerOf",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 2347,
                                "src": "16910:25:13",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_address_$",
                                  "typeString": "function (uint256) view returns (address)"
                                }
                              },
                              "id": 3124,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "16910:34:13",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3125,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3109,
                              "src": "16946:2:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3126,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3111,
                              "src": "16950:7:13",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 3120,
                            "name": "Approval",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3246,
                            "src": "16901:8:13",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 3127,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16901:57:13",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3128,
                        "nodeType": "EmitStatement",
                        "src": "16896:62:13"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 3130,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_approve",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3112,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3109,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3130,
                        "src": "16810:10:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3108,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "16810:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3111,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3130,
                        "src": "16822:15:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3110,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "16822:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "16809:29:13"
                  },
                  "returnParameters": {
                    "id": 3113,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "16847:0:13"
                  },
                  "scope": 3146,
                  "src": "16792:191:13",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 3140,
                    "nodeType": "Block",
                    "src": "17669:3:13",
                    "statements": []
                  },
                  "documentation": {
                    "id": 3131,
                    "nodeType": "StructuredDocumentation",
                    "src": "16989:585:13",
                    "text": " @dev Hook that is called before any token transfer. This includes minting\n and burning.\n Calling conditions:\n - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be\n transferred to `to`.\n - When `from` is zero, `tokenId` will be minted for `to`.\n - When `to` is zero, ``from``'s `tokenId` will be burned.\n - `from` cannot be the zero address.\n - `to` cannot be the zero address.\n To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]."
                  },
                  "id": 3141,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_beforeTokenTransfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3138,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3133,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3141,
                        "src": "17609:12:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3132,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "17609:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3135,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3141,
                        "src": "17623:10:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3134,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "17623:7:13",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3137,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3141,
                        "src": "17635:15:13",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3136,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "17635:7:13",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "17608:43:13"
                  },
                  "returnParameters": {
                    "id": 3139,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "17669:0:13"
                  },
                  "scope": 3146,
                  "src": "17579:93:13",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3145,
                  "mutability": "mutable",
                  "name": "__gap",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3146,
                  "src": "17677:25:13",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$41_storage",
                    "typeString": "uint256[41]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 3142,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "17677:7:13",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 3144,
                    "length": {
                      "argumentTypes": null,
                      "hexValue": "3431",
                      "id": 3143,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "17685:2:13",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_41_by_1",
                        "typeString": "int_const 41"
                      },
                      "value": "41"
                    },
                    "nodeType": "ArrayTypeName",
                    "src": "17677:11:13",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$41_storage_ptr",
                      "typeString": "uint256[41]"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                }
              ],
              "scope": 3147,
              "src": "732:16973:13"
            }
          ],
          "src": "33:17673:13"
        },
        "id": 13
      },
      "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721EnumerableUpgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721EnumerableUpgradeable.sol",
          "exportedSymbols": {
            "IERC721EnumerableUpgradeable": [
              3177
            ]
          },
          "id": 3178,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 3148,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".2",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:14"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol",
              "file": "./IERC721Upgradeable.sol",
              "id": 3149,
              "nodeType": "ImportDirective",
              "scope": 3178,
              "sourceUnit": 3339,
              "src": "66:34:14",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 3151,
                    "name": "IERC721Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3338,
                    "src": "281:18:14",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                      "typeString": "contract IERC721Upgradeable"
                    }
                  },
                  "id": 3152,
                  "nodeType": "InheritanceSpecifier",
                  "src": "281:18:14"
                }
              ],
              "contractDependencies": [
                931,
                3338
              ],
              "contractKind": "interface",
              "documentation": {
                "id": 3150,
                "nodeType": "StructuredDocumentation",
                "src": "102:136:14",
                "text": " @title ERC-721 Non-Fungible Token Standard, optional enumeration extension\n @dev See https://eips.ethereum.org/EIPS/eip-721"
              },
              "fullyImplemented": false,
              "id": 3177,
              "linearizedBaseContracts": [
                3177,
                3338,
                931
              ],
              "name": "IERC721EnumerableUpgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 3153,
                    "nodeType": "StructuredDocumentation",
                    "src": "307:82:14",
                    "text": " @dev Returns the total amount of tokens stored by the contract."
                  },
                  "functionSelector": "18160ddd",
                  "id": 3158,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "totalSupply",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3154,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "414:2:14"
                  },
                  "returnParameters": {
                    "id": 3157,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3156,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3158,
                        "src": "440:7:14",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3155,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "440:7:14",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "439:9:14"
                  },
                  "scope": 3177,
                  "src": "394:55:14",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 3159,
                    "nodeType": "StructuredDocumentation",
                    "src": "455:171:14",
                    "text": " @dev Returns a token ID owned by `owner` at a given `index` of its token list.\n Use along with {balanceOf} to enumerate all of ``owner``'s tokens."
                  },
                  "functionSelector": "2f745c59",
                  "id": 3168,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "tokenOfOwnerByIndex",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3164,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3161,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3168,
                        "src": "660:13:14",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3160,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "660:7:14",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3163,
                        "mutability": "mutable",
                        "name": "index",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3168,
                        "src": "675:13:14",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3162,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "675:7:14",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "659:30:14"
                  },
                  "returnParameters": {
                    "id": 3167,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3166,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3168,
                        "src": "713:15:14",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3165,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "713:7:14",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "712:17:14"
                  },
                  "scope": 3177,
                  "src": "631:99:14",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 3169,
                    "nodeType": "StructuredDocumentation",
                    "src": "736:164:14",
                    "text": " @dev Returns a token ID at a given `index` of all the tokens stored by the contract.\n Use along with {totalSupply} to enumerate all tokens."
                  },
                  "functionSelector": "4f6ccce7",
                  "id": 3176,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "tokenByIndex",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3172,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3171,
                        "mutability": "mutable",
                        "name": "index",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3176,
                        "src": "927:13:14",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3170,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "927:7:14",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "926:15:14"
                  },
                  "returnParameters": {
                    "id": 3175,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3174,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3176,
                        "src": "965:7:14",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3173,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "965:7:14",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "964:9:14"
                  },
                  "scope": 3177,
                  "src": "905:69:14",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 3178,
              "src": "239:737:14"
            }
          ],
          "src": "33:944:14"
        },
        "id": 14
      },
      "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721MetadataUpgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721MetadataUpgradeable.sol",
          "exportedSymbols": {
            "IERC721MetadataUpgradeable": [
              3204
            ]
          },
          "id": 3205,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 3179,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".2",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:15"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol",
              "file": "./IERC721Upgradeable.sol",
              "id": 3180,
              "nodeType": "ImportDirective",
              "scope": 3205,
              "sourceUnit": 3339,
              "src": "66:34:15",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 3182,
                    "name": "IERC721Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3338,
                    "src": "276:18:15",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                      "typeString": "contract IERC721Upgradeable"
                    }
                  },
                  "id": 3183,
                  "nodeType": "InheritanceSpecifier",
                  "src": "276:18:15"
                }
              ],
              "contractDependencies": [
                931,
                3338
              ],
              "contractKind": "interface",
              "documentation": {
                "id": 3181,
                "nodeType": "StructuredDocumentation",
                "src": "102:133:15",
                "text": " @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n @dev See https://eips.ethereum.org/EIPS/eip-721"
              },
              "fullyImplemented": false,
              "id": 3204,
              "linearizedBaseContracts": [
                3204,
                3338,
                931
              ],
              "name": "IERC721MetadataUpgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 3184,
                    "nodeType": "StructuredDocumentation",
                    "src": "302:58:15",
                    "text": " @dev Returns the token collection name."
                  },
                  "functionSelector": "06fdde03",
                  "id": 3189,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "name",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3185,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "378:2:15"
                  },
                  "returnParameters": {
                    "id": 3188,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3187,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3189,
                        "src": "404:13:15",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 3186,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "404:6:15",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "403:15:15"
                  },
                  "scope": 3204,
                  "src": "365:54:15",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 3190,
                    "nodeType": "StructuredDocumentation",
                    "src": "425:60:15",
                    "text": " @dev Returns the token collection symbol."
                  },
                  "functionSelector": "95d89b41",
                  "id": 3195,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "symbol",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3191,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "505:2:15"
                  },
                  "returnParameters": {
                    "id": 3194,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3193,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3195,
                        "src": "531:13:15",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 3192,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "531:6:15",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "530:15:15"
                  },
                  "scope": 3204,
                  "src": "490:56:15",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 3196,
                    "nodeType": "StructuredDocumentation",
                    "src": "552:90:15",
                    "text": " @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token."
                  },
                  "functionSelector": "c87b56dd",
                  "id": 3203,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "tokenURI",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3199,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3198,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3203,
                        "src": "665:15:15",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3197,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "665:7:15",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "664:17:15"
                  },
                  "returnParameters": {
                    "id": 3202,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3201,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3203,
                        "src": "705:13:15",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 3200,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "705:6:15",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "704:15:15"
                  },
                  "scope": 3204,
                  "src": "647:73:15",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 3205,
              "src": "236:486:15"
            }
          ],
          "src": "33:690:15"
        },
        "id": 15
      },
      "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol",
          "exportedSymbols": {
            "IERC721ReceiverUpgradeable": [
              3222
            ]
          },
          "id": 3223,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 3206,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:16"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": {
                "id": 3207,
                "nodeType": "StructuredDocumentation",
                "src": "66:152:16",
                "text": " @title ERC721 token receiver interface\n @dev Interface for any contract that wants to support safeTransfers\n from ERC721 asset contracts."
              },
              "fullyImplemented": false,
              "id": 3222,
              "linearizedBaseContracts": [
                3222
              ],
              "name": "IERC721ReceiverUpgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 3208,
                    "nodeType": "StructuredDocumentation",
                    "src": "262:485:16",
                    "text": " @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n by `operator` from `from`, this function is called.\n It must return its Solidity selector to confirm the token transfer.\n If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`."
                  },
                  "functionSelector": "150b7a02",
                  "id": 3221,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "onERC721Received",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3217,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3210,
                        "mutability": "mutable",
                        "name": "operator",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3221,
                        "src": "778:16:16",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3209,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "778:7:16",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3212,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3221,
                        "src": "796:12:16",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3211,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "796:7:16",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3214,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3221,
                        "src": "810:15:16",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3213,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "810:7:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3216,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3221,
                        "src": "827:19:16",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 3215,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "827:5:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "777:70:16"
                  },
                  "returnParameters": {
                    "id": 3220,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3219,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3221,
                        "src": "866:6:16",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        },
                        "typeName": {
                          "id": 3218,
                          "name": "bytes4",
                          "nodeType": "ElementaryTypeName",
                          "src": "866:6:16",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes4",
                            "typeString": "bytes4"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "865:8:16"
                  },
                  "scope": 3222,
                  "src": "752:122:16",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 3223,
              "src": "219:657:16"
            }
          ],
          "src": "33:844:16"
        },
        "id": 16
      },
      "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol",
          "exportedSymbols": {
            "IERC721Upgradeable": [
              3338
            ]
          },
          "id": 3339,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 3224,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".2",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:17"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol",
              "file": "../../introspection/IERC165Upgradeable.sol",
              "id": 3225,
              "nodeType": "ImportDirective",
              "scope": 3339,
              "sourceUnit": 932,
              "src": "66:52:17",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 3227,
                    "name": "IERC165Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 931,
                    "src": "220:18:17",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC165Upgradeable_$931",
                      "typeString": "contract IERC165Upgradeable"
                    }
                  },
                  "id": 3228,
                  "nodeType": "InheritanceSpecifier",
                  "src": "220:18:17"
                }
              ],
              "contractDependencies": [
                931
              ],
              "contractKind": "interface",
              "documentation": {
                "id": 3226,
                "nodeType": "StructuredDocumentation",
                "src": "120:67:17",
                "text": " @dev Required interface of an ERC721 compliant contract."
              },
              "fullyImplemented": false,
              "id": 3338,
              "linearizedBaseContracts": [
                3338,
                931
              ],
              "name": "IERC721Upgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 3229,
                    "nodeType": "StructuredDocumentation",
                    "src": "245:88:17",
                    "text": " @dev Emitted when `tokenId` token is transferred from `from` to `to`."
                  },
                  "id": 3237,
                  "name": "Transfer",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 3236,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3231,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3237,
                        "src": "353:20:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3230,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "353:7:17",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3233,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3237,
                        "src": "375:18:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3232,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "375:7:17",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3235,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3237,
                        "src": "395:23:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3234,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "395:7:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "352:67:17"
                  },
                  "src": "338:82:17"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 3238,
                    "nodeType": "StructuredDocumentation",
                    "src": "426:94:17",
                    "text": " @dev Emitted when `owner` enables `approved` to manage the `tokenId` token."
                  },
                  "id": 3246,
                  "name": "Approval",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 3245,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3240,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3246,
                        "src": "540:21:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3239,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "540:7:17",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3242,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "approved",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3246,
                        "src": "563:24:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3241,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "563:7:17",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3244,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3246,
                        "src": "589:23:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3243,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "589:7:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "539:74:17"
                  },
                  "src": "525:89:17"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 3247,
                    "nodeType": "StructuredDocumentation",
                    "src": "620:117:17",
                    "text": " @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets."
                  },
                  "id": 3255,
                  "name": "ApprovalForAll",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 3254,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3249,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3255,
                        "src": "763:21:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3248,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "763:7:17",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3251,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "operator",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3255,
                        "src": "786:24:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3250,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "786:7:17",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3253,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "approved",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3255,
                        "src": "812:13:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 3252,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "812:4:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "762:64:17"
                  },
                  "src": "742:85:17"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 3256,
                    "nodeType": "StructuredDocumentation",
                    "src": "833:76:17",
                    "text": " @dev Returns the number of tokens in ``owner``'s account."
                  },
                  "functionSelector": "70a08231",
                  "id": 3263,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "balanceOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3259,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3258,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3263,
                        "src": "933:13:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3257,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "933:7:17",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "932:15:17"
                  },
                  "returnParameters": {
                    "id": 3262,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3261,
                        "mutability": "mutable",
                        "name": "balance",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3263,
                        "src": "971:15:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3260,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "971:7:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "970:17:17"
                  },
                  "scope": 3338,
                  "src": "914:74:17",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 3264,
                    "nodeType": "StructuredDocumentation",
                    "src": "994:131:17",
                    "text": " @dev Returns the owner of the `tokenId` token.\n Requirements:\n - `tokenId` must exist."
                  },
                  "functionSelector": "6352211e",
                  "id": 3271,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "ownerOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3267,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3266,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3271,
                        "src": "1147:15:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3265,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1147:7:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1146:17:17"
                  },
                  "returnParameters": {
                    "id": 3270,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3269,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3271,
                        "src": "1187:13:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3268,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1187:7:17",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1186:15:17"
                  },
                  "scope": 3338,
                  "src": "1130:72:17",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 3272,
                    "nodeType": "StructuredDocumentation",
                    "src": "1208:690:17",
                    "text": " @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n are aware of the ERC721 protocol to prevent tokens from being forever locked.\n Requirements:\n - `from` cannot be the zero address.\n - `to` cannot be the zero address.\n - `tokenId` token must exist and be owned by `from`.\n - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\n - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n Emits a {Transfer} event."
                  },
                  "functionSelector": "42842e0e",
                  "id": 3281,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "safeTransferFrom",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3279,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3274,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3281,
                        "src": "1929:12:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3273,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1929:7:17",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3276,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3281,
                        "src": "1943:10:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3275,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1943:7:17",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3278,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3281,
                        "src": "1955:15:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3277,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1955:7:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1928:43:17"
                  },
                  "returnParameters": {
                    "id": 3280,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1980:0:17"
                  },
                  "scope": 3338,
                  "src": "1903:78:17",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 3282,
                    "nodeType": "StructuredDocumentation",
                    "src": "1987:504:17",
                    "text": " @dev Transfers `tokenId` token from `from` to `to`.\n WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\n Requirements:\n - `from` cannot be the zero address.\n - `to` cannot be the zero address.\n - `tokenId` token must be owned by `from`.\n - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n Emits a {Transfer} event."
                  },
                  "functionSelector": "23b872dd",
                  "id": 3291,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "transferFrom",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3289,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3284,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3291,
                        "src": "2518:12:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3283,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2518:7:17",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3286,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3291,
                        "src": "2532:10:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3285,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2532:7:17",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3288,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3291,
                        "src": "2544:15:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3287,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2544:7:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2517:43:17"
                  },
                  "returnParameters": {
                    "id": 3290,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2569:0:17"
                  },
                  "scope": 3338,
                  "src": "2496:74:17",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 3292,
                    "nodeType": "StructuredDocumentation",
                    "src": "2576:452:17",
                    "text": " @dev Gives permission to `to` to transfer `tokenId` token to another account.\n The approval is cleared when the token is transferred.\n Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n Requirements:\n - The caller must own the token or be an approved operator.\n - `tokenId` must exist.\n Emits an {Approval} event."
                  },
                  "functionSelector": "095ea7b3",
                  "id": 3299,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "approve",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3297,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3294,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3299,
                        "src": "3050:10:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3293,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3050:7:17",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3296,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3299,
                        "src": "3062:15:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3295,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3062:7:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3049:29:17"
                  },
                  "returnParameters": {
                    "id": 3298,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3087:0:17"
                  },
                  "scope": 3338,
                  "src": "3033:55:17",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 3300,
                    "nodeType": "StructuredDocumentation",
                    "src": "3094:139:17",
                    "text": " @dev Returns the account approved for `tokenId` token.\n Requirements:\n - `tokenId` must exist."
                  },
                  "functionSelector": "081812fc",
                  "id": 3307,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "getApproved",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3303,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3302,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3307,
                        "src": "3259:15:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3301,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3259:7:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3258:17:17"
                  },
                  "returnParameters": {
                    "id": 3306,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3305,
                        "mutability": "mutable",
                        "name": "operator",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3307,
                        "src": "3299:16:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3304,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3299:7:17",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3298:18:17"
                  },
                  "scope": 3338,
                  "src": "3238:79:17",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 3308,
                    "nodeType": "StructuredDocumentation",
                    "src": "3323:309:17",
                    "text": " @dev Approve or remove `operator` as an operator for the caller.\n Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n Requirements:\n - The `operator` cannot be the caller.\n Emits an {ApprovalForAll} event."
                  },
                  "functionSelector": "a22cb465",
                  "id": 3315,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setApprovalForAll",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3313,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3310,
                        "mutability": "mutable",
                        "name": "operator",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3315,
                        "src": "3664:16:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3309,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3664:7:17",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3312,
                        "mutability": "mutable",
                        "name": "_approved",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3315,
                        "src": "3682:14:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 3311,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "3682:4:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3663:34:17"
                  },
                  "returnParameters": {
                    "id": 3314,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3706:0:17"
                  },
                  "scope": 3338,
                  "src": "3637:70:17",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 3316,
                    "nodeType": "StructuredDocumentation",
                    "src": "3713:138:17",
                    "text": " @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n See {setApprovalForAll}"
                  },
                  "functionSelector": "e985e9c5",
                  "id": 3325,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "isApprovedForAll",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3321,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3318,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3325,
                        "src": "3882:13:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3317,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3882:7:17",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3320,
                        "mutability": "mutable",
                        "name": "operator",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3325,
                        "src": "3897:16:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3319,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3897:7:17",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3881:33:17"
                  },
                  "returnParameters": {
                    "id": 3324,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3323,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3325,
                        "src": "3938:4:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 3322,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "3938:4:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3937:6:17"
                  },
                  "scope": 3338,
                  "src": "3856:88:17",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 3326,
                    "nodeType": "StructuredDocumentation",
                    "src": "3950:568:17",
                    "text": " @dev Safely transfers `tokenId` token from `from` to `to`.\n Requirements:\n - `from` cannot be the zero address.\n - `to` cannot be the zero address.\n - `tokenId` token must exist and be owned by `from`.\n - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n Emits a {Transfer} event."
                  },
                  "functionSelector": "b88d4fde",
                  "id": 3337,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "safeTransferFrom",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3335,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3328,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3337,
                        "src": "4549:12:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3327,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4549:7:17",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3330,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3337,
                        "src": "4563:10:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3329,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4563:7:17",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3332,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3337,
                        "src": "4575:15:17",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3331,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4575:7:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3334,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3337,
                        "src": "4592:19:17",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 3333,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "4592:5:17",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4548:64:17"
                  },
                  "returnParameters": {
                    "id": 3336,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4621:0:17"
                  },
                  "scope": 3338,
                  "src": "4523:99:17",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 3339,
              "src": "188:4436:17"
            }
          ],
          "src": "33:4592:17"
        },
        "id": 17
      },
      "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol",
          "exportedSymbols": {
            "AddressUpgradeable": [
              3582
            ]
          },
          "id": 3583,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 3340,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".2",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:18"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 3341,
                "nodeType": "StructuredDocumentation",
                "src": "66:67:18",
                "text": " @dev Collection of functions related to the address type"
              },
              "fullyImplemented": true,
              "id": 3582,
              "linearizedBaseContracts": [
                3582
              ],
              "name": "AddressUpgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 3357,
                    "nodeType": "Block",
                    "src": "803:347:18",
                    "statements": [
                      {
                        "assignments": [
                          3350
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 3350,
                            "mutability": "mutable",
                            "name": "size",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3357,
                            "src": "1000:12:18",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 3349,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "1000:7:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 3351,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1000:12:18"
                      },
                      {
                        "AST": {
                          "nodeType": "YulBlock",
                          "src": "1087:32:18",
                          "statements": [
                            {
                              "nodeType": "YulAssignment",
                              "src": "1089:28:18",
                              "value": {
                                "arguments": [
                                  {
                                    "name": "account",
                                    "nodeType": "YulIdentifier",
                                    "src": "1109:7:18"
                                  }
                                ],
                                "functionName": {
                                  "name": "extcodesize",
                                  "nodeType": "YulIdentifier",
                                  "src": "1097:11:18"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "1097:20:18"
                              },
                              "variableNames": [
                                {
                                  "name": "size",
                                  "nodeType": "YulIdentifier",
                                  "src": "1089:4:18"
                                }
                              ]
                            }
                          ]
                        },
                        "evmVersion": "istanbul",
                        "externalReferences": [
                          {
                            "declaration": 3344,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "1109:7:18",
                            "valueSize": 1
                          },
                          {
                            "declaration": 3350,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "1089:4:18",
                            "valueSize": 1
                          }
                        ],
                        "id": 3352,
                        "nodeType": "InlineAssembly",
                        "src": "1078:41:18"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 3355,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 3353,
                            "name": "size",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3350,
                            "src": "1135:4:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 3354,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1142:1:18",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "1135:8:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 3348,
                        "id": 3356,
                        "nodeType": "Return",
                        "src": "1128:15:18"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3342,
                    "nodeType": "StructuredDocumentation",
                    "src": "167:565:18",
                    "text": " @dev Returns true if `account` is a contract.\n [IMPORTANT]\n ====\n It is unsafe to assume that an address for which this function returns\n false is an externally-owned account (EOA) and not a contract.\n Among others, `isContract` will return false for the following\n types of addresses:\n  - an externally-owned account\n  - a contract in construction\n  - an address where a contract will be created\n  - an address where a contract lived, but was destroyed\n ===="
                  },
                  "id": 3358,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "isContract",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3345,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3344,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3358,
                        "src": "757:15:18",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3343,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "757:7:18",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "756:17:18"
                  },
                  "returnParameters": {
                    "id": 3348,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3347,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3358,
                        "src": "797:4:18",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 3346,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "797:4:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "796:6:18"
                  },
                  "scope": 3582,
                  "src": "737:413:18",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3391,
                    "nodeType": "Block",
                    "src": "2138:320:18",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 3373,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 3369,
                                      "name": "this",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -28,
                                      "src": "2164:4:18",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_AddressUpgradeable_$3582",
                                        "typeString": "library AddressUpgradeable"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_AddressUpgradeable_$3582",
                                        "typeString": "library AddressUpgradeable"
                                      }
                                    ],
                                    "id": 3368,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "2156:7:18",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 3367,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "2156:7:18",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 3370,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "2156:13:18",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "id": 3371,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "balance",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "2156:21:18",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 3372,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3363,
                                "src": "2181:6:18",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "2156:31:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "416464726573733a20696e73756666696369656e742062616c616e6365",
                              "id": 3374,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2189:31:18",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_5597a22abd0ef5332f8053862eb236db7590f17e2b93a53f63a103becfb561f9",
                                "typeString": "literal_string \"Address: insufficient balance\""
                              },
                              "value": "Address: insufficient balance"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_5597a22abd0ef5332f8053862eb236db7590f17e2b93a53f63a103becfb561f9",
                                "typeString": "literal_string \"Address: insufficient balance\""
                              }
                            ],
                            "id": 3366,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2148:7:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 3375,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2148:73:18",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3376,
                        "nodeType": "ExpressionStatement",
                        "src": "2148:73:18"
                      },
                      {
                        "assignments": [
                          3378,
                          null
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 3378,
                            "mutability": "mutable",
                            "name": "success",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3391,
                            "src": "2310:12:18",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 3377,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "2310:4:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          null
                        ],
                        "id": 3385,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "",
                              "id": 3383,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2360:2:18",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                "typeString": "literal_string \"\""
                              },
                              "value": ""
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                "typeString": "literal_string \"\""
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                  "typeString": "literal_string \"\""
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 3379,
                                "name": "recipient",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3361,
                                "src": "2328:9:18",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "id": 3380,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "call",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "2328:14:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                                "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                              }
                            },
                            "id": 3382,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "names": [
                              "value"
                            ],
                            "nodeType": "FunctionCallOptions",
                            "options": [
                              {
                                "argumentTypes": null,
                                "id": 3381,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3363,
                                "src": "2351:6:18",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "src": "2328:31:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value",
                              "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                            }
                          },
                          "id": 3384,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2328:35:18",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(bool,bytes memory)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2309:54:18"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3387,
                              "name": "success",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3378,
                              "src": "2381:7:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d61792068617665207265766572746564",
                              "id": 3388,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2390:60:18",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_51ddaa38748c0a1144620fb5bfe8edab31ea437571ad591a7734bbfd0429aeae",
                                "typeString": "literal_string \"Address: unable to send value, recipient may have reverted\""
                              },
                              "value": "Address: unable to send value, recipient may have reverted"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_51ddaa38748c0a1144620fb5bfe8edab31ea437571ad591a7734bbfd0429aeae",
                                "typeString": "literal_string \"Address: unable to send value, recipient may have reverted\""
                              }
                            ],
                            "id": 3386,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2373:7:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 3389,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2373:78:18",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3390,
                        "nodeType": "ExpressionStatement",
                        "src": "2373:78:18"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3359,
                    "nodeType": "StructuredDocumentation",
                    "src": "1156:906:18",
                    "text": " @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n `recipient`, forwarding all available gas and reverting on errors.\n https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n of certain opcodes, possibly making contracts go over the 2300 gas limit\n imposed by `transfer`, making them unable to receive funds via\n `transfer`. {sendValue} removes this limitation.\n https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n IMPORTANT: because control is transferred to `recipient`, care must be\n taken to not create reentrancy vulnerabilities. Consider using\n {ReentrancyGuard} or the\n https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]."
                  },
                  "id": 3392,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sendValue",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3364,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3361,
                        "mutability": "mutable",
                        "name": "recipient",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3392,
                        "src": "2086:25:18",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        "typeName": {
                          "id": 3360,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2086:15:18",
                          "stateMutability": "payable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3363,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3392,
                        "src": "2113:14:18",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3362,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2113:7:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2085:43:18"
                  },
                  "returnParameters": {
                    "id": 3365,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2138:0:18"
                  },
                  "scope": 3582,
                  "src": "2067:391:18",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3408,
                    "nodeType": "Block",
                    "src": "3288:82:18",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3403,
                              "name": "target",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3395,
                              "src": "3316:6:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3404,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3397,
                              "src": "3324:4:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "416464726573733a206c6f772d6c6576656c2063616c6c206661696c6564",
                              "id": 3405,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3330:32:18",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_24d7ab5d382116e64324f19950ca9340b8af1ddeb09a8d026e0a3c6a01dcc9df",
                                "typeString": "literal_string \"Address: low-level call failed\""
                              },
                              "value": "Address: low-level call failed"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_24d7ab5d382116e64324f19950ca9340b8af1ddeb09a8d026e0a3c6a01dcc9df",
                                "typeString": "literal_string \"Address: low-level call failed\""
                              }
                            ],
                            "id": 3402,
                            "name": "functionCall",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              3409,
                              3429
                            ],
                            "referencedDeclaration": 3429,
                            "src": "3303:12:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                              "typeString": "function (address,bytes memory,string memory) returns (bytes memory)"
                            }
                          },
                          "id": 3406,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3303:60:18",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "functionReturnParameters": 3401,
                        "id": 3407,
                        "nodeType": "Return",
                        "src": "3296:67:18"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3393,
                    "nodeType": "StructuredDocumentation",
                    "src": "2464:730:18",
                    "text": " @dev Performs a Solidity function call using a low level `call`. A\n plain`call` is an unsafe replacement for a function call: use this\n function instead.\n If `target` reverts with a revert reason, it is bubbled up by this\n function (like regular Solidity function calls).\n Returns the raw returned data. To convert to the expected return value,\n use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n Requirements:\n - `target` must be a contract.\n - calling `target` with `data` must not revert.\n _Available since v3.1._"
                  },
                  "id": 3409,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "functionCall",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3398,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3395,
                        "mutability": "mutable",
                        "name": "target",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3409,
                        "src": "3221:14:18",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3394,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3221:7:18",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3397,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3409,
                        "src": "3237:17:18",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 3396,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "3237:5:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3220:35:18"
                  },
                  "returnParameters": {
                    "id": 3401,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3400,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3409,
                        "src": "3274:12:18",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 3399,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "3274:5:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3273:14:18"
                  },
                  "scope": 3582,
                  "src": "3199:171:18",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3428,
                    "nodeType": "Block",
                    "src": "3709:76:18",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3422,
                              "name": "target",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3412,
                              "src": "3748:6:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3423,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3414,
                              "src": "3756:4:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 3424,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3762:1:18",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            },
                            {
                              "argumentTypes": null,
                              "id": 3425,
                              "name": "errorMessage",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3416,
                              "src": "3765:12:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 3421,
                            "name": "functionCallWithValue",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              3449,
                              3499
                            ],
                            "referencedDeclaration": 3499,
                            "src": "3726:21:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                              "typeString": "function (address,bytes memory,uint256,string memory) returns (bytes memory)"
                            }
                          },
                          "id": 3426,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3726:52:18",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "functionReturnParameters": 3420,
                        "id": 3427,
                        "nodeType": "Return",
                        "src": "3719:59:18"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3410,
                    "nodeType": "StructuredDocumentation",
                    "src": "3376:211:18",
                    "text": " @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n `errorMessage` as a fallback revert reason when `target` reverts.\n _Available since v3.1._"
                  },
                  "id": 3429,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "functionCall",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3417,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3412,
                        "mutability": "mutable",
                        "name": "target",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3429,
                        "src": "3614:14:18",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3411,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3614:7:18",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3414,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3429,
                        "src": "3630:17:18",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 3413,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "3630:5:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3416,
                        "mutability": "mutable",
                        "name": "errorMessage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3429,
                        "src": "3649:26:18",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 3415,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "3649:6:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3613:63:18"
                  },
                  "returnParameters": {
                    "id": 3420,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3419,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3429,
                        "src": "3695:12:18",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 3418,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "3695:5:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3694:14:18"
                  },
                  "scope": 3582,
                  "src": "3592:193:18",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3448,
                    "nodeType": "Block",
                    "src": "4260:111:18",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3442,
                              "name": "target",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3432,
                              "src": "4299:6:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3443,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3434,
                              "src": "4307:4:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3444,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3436,
                              "src": "4313:5:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564",
                              "id": 3445,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "4320:43:18",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_88a4a0b5e975840320a0475d4027005235904fdb5ece94df156f3d717cb2dbfc",
                                "typeString": "literal_string \"Address: low-level call with value failed\""
                              },
                              "value": "Address: low-level call with value failed"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_88a4a0b5e975840320a0475d4027005235904fdb5ece94df156f3d717cb2dbfc",
                                "typeString": "literal_string \"Address: low-level call with value failed\""
                              }
                            ],
                            "id": 3441,
                            "name": "functionCallWithValue",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              3449,
                              3499
                            ],
                            "referencedDeclaration": 3499,
                            "src": "4277:21:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$_t_uint256_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                              "typeString": "function (address,bytes memory,uint256,string memory) returns (bytes memory)"
                            }
                          },
                          "id": 3446,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4277:87:18",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "functionReturnParameters": 3440,
                        "id": 3447,
                        "nodeType": "Return",
                        "src": "4270:94:18"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3430,
                    "nodeType": "StructuredDocumentation",
                    "src": "3791:351:18",
                    "text": " @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n but also transferring `value` wei to `target`.\n Requirements:\n - the calling contract must have an ETH balance of at least `value`.\n - the called Solidity function must be `payable`.\n _Available since v3.1._"
                  },
                  "id": 3449,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "functionCallWithValue",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3437,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3432,
                        "mutability": "mutable",
                        "name": "target",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3449,
                        "src": "4178:14:18",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3431,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4178:7:18",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3434,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3449,
                        "src": "4194:17:18",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 3433,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "4194:5:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3436,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3449,
                        "src": "4213:13:18",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3435,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4213:7:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4177:50:18"
                  },
                  "returnParameters": {
                    "id": 3440,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3439,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3449,
                        "src": "4246:12:18",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 3438,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "4246:5:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4245:14:18"
                  },
                  "scope": 3582,
                  "src": "4147:224:18",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3498,
                    "nodeType": "Block",
                    "src": "4760:382:18",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 3470,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 3466,
                                      "name": "this",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -28,
                                      "src": "4786:4:18",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_AddressUpgradeable_$3582",
                                        "typeString": "library AddressUpgradeable"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_AddressUpgradeable_$3582",
                                        "typeString": "library AddressUpgradeable"
                                      }
                                    ],
                                    "id": 3465,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "4778:7:18",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 3464,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "4778:7:18",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 3467,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "4778:13:18",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "id": 3468,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "balance",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "4778:21:18",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 3469,
                                "name": "value",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3456,
                                "src": "4803:5:18",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "4778:30:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c",
                              "id": 3471,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "4810:40:18",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c",
                                "typeString": "literal_string \"Address: insufficient balance for call\""
                              },
                              "value": "Address: insufficient balance for call"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_565f1a77334fc4792800921178c71e4521acffab18ff9e7885b49377ee80ab4c",
                                "typeString": "literal_string \"Address: insufficient balance for call\""
                              }
                            ],
                            "id": 3463,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "4770:7:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 3472,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4770:81:18",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3473,
                        "nodeType": "ExpressionStatement",
                        "src": "4770:81:18"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 3476,
                                  "name": "target",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3452,
                                  "src": "4880:6:18",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 3475,
                                "name": "isContract",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3358,
                                "src": "4869:10:18",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                                  "typeString": "function (address) view returns (bool)"
                                }
                              },
                              "id": 3477,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "4869:18:18",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374",
                              "id": 3478,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "4889:31:18",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad",
                                "typeString": "literal_string \"Address: call to non-contract\""
                              },
                              "value": "Address: call to non-contract"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_cc2e4e38850b7c0a3e942cfed89b71c77302df25bcb2ec297a0c4ff9ff6b90ad",
                                "typeString": "literal_string \"Address: call to non-contract\""
                              }
                            ],
                            "id": 3474,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "4861:7:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 3479,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4861:60:18",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3480,
                        "nodeType": "ExpressionStatement",
                        "src": "4861:60:18"
                      },
                      {
                        "assignments": [
                          3482,
                          3484
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 3482,
                            "mutability": "mutable",
                            "name": "success",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3498,
                            "src": "4992:12:18",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 3481,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "4992:4:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 3484,
                            "mutability": "mutable",
                            "name": "returndata",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3498,
                            "src": "5006:23:18",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes"
                            },
                            "typeName": {
                              "id": 3483,
                              "name": "bytes",
                              "nodeType": "ElementaryTypeName",
                              "src": "5006:5:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 3491,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3489,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3454,
                              "src": "5061:4:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 3485,
                                "name": "target",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3452,
                                "src": "5033:6:18",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 3486,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "call",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "5033:11:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                                "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                              }
                            },
                            "id": 3488,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "names": [
                              "value"
                            ],
                            "nodeType": "FunctionCallOptions",
                            "options": [
                              {
                                "argumentTypes": null,
                                "id": 3487,
                                "name": "value",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3456,
                                "src": "5053:5:18",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "src": "5033:27:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value",
                              "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                            }
                          },
                          "id": 3490,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5033:33:18",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(bool,bytes memory)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "4991:75:18"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3493,
                              "name": "success",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3482,
                              "src": "5101:7:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3494,
                              "name": "returndata",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3484,
                              "src": "5110:10:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3495,
                              "name": "errorMessage",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3458,
                              "src": "5122:12:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 3492,
                            "name": "_verifyCallResult",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3581,
                            "src": "5083:17:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_bool_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                              "typeString": "function (bool,bytes memory,string memory) pure returns (bytes memory)"
                            }
                          },
                          "id": 3496,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5083:52:18",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "functionReturnParameters": 3462,
                        "id": 3497,
                        "nodeType": "Return",
                        "src": "5076:59:18"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3450,
                    "nodeType": "StructuredDocumentation",
                    "src": "4377:237:18",
                    "text": " @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n with `errorMessage` as a fallback revert reason when `target` reverts.\n _Available since v3.1._"
                  },
                  "id": 3499,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "functionCallWithValue",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3459,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3452,
                        "mutability": "mutable",
                        "name": "target",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3499,
                        "src": "4650:14:18",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3451,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4650:7:18",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3454,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3499,
                        "src": "4666:17:18",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 3453,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "4666:5:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3456,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3499,
                        "src": "4685:13:18",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3455,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4685:7:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3458,
                        "mutability": "mutable",
                        "name": "errorMessage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3499,
                        "src": "4700:26:18",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 3457,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "4700:6:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4649:78:18"
                  },
                  "returnParameters": {
                    "id": 3462,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3461,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3499,
                        "src": "4746:12:18",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 3460,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "4746:5:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4745:14:18"
                  },
                  "scope": 3582,
                  "src": "4619:523:18",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3515,
                    "nodeType": "Block",
                    "src": "5419:97:18",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3510,
                              "name": "target",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3502,
                              "src": "5455:6:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3511,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3504,
                              "src": "5463:4:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "416464726573733a206c6f772d6c6576656c207374617469632063616c6c206661696c6564",
                              "id": 3512,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "5469:39:18",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_90ec82aa826a536a4cbfae44ecfa384680faa9a4b77344bce96aa761ad904df0",
                                "typeString": "literal_string \"Address: low-level static call failed\""
                              },
                              "value": "Address: low-level static call failed"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_90ec82aa826a536a4cbfae44ecfa384680faa9a4b77344bce96aa761ad904df0",
                                "typeString": "literal_string \"Address: low-level static call failed\""
                              }
                            ],
                            "id": 3509,
                            "name": "functionStaticCall",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              3516,
                              3551
                            ],
                            "referencedDeclaration": 3551,
                            "src": "5436:18:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                              "typeString": "function (address,bytes memory,string memory) view returns (bytes memory)"
                            }
                          },
                          "id": 3513,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5436:73:18",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "functionReturnParameters": 3508,
                        "id": 3514,
                        "nodeType": "Return",
                        "src": "5429:80:18"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3500,
                    "nodeType": "StructuredDocumentation",
                    "src": "5148:166:18",
                    "text": " @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n but performing a static call.\n _Available since v3.3._"
                  },
                  "id": 3516,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "functionStaticCall",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3505,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3502,
                        "mutability": "mutable",
                        "name": "target",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3516,
                        "src": "5347:14:18",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3501,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5347:7:18",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3504,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3516,
                        "src": "5363:17:18",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 3503,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "5363:5:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5346:35:18"
                  },
                  "returnParameters": {
                    "id": 3508,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3507,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3516,
                        "src": "5405:12:18",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 3506,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "5405:5:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5404:14:18"
                  },
                  "scope": 3582,
                  "src": "5319:197:18",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3550,
                    "nodeType": "Block",
                    "src": "5828:288:18",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 3530,
                                  "name": "target",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3519,
                                  "src": "5857:6:18",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 3529,
                                "name": "isContract",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3358,
                                "src": "5846:10:18",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                                  "typeString": "function (address) view returns (bool)"
                                }
                              },
                              "id": 3531,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5846:18:18",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "416464726573733a207374617469632063616c6c20746f206e6f6e2d636f6e7472616374",
                              "id": 3532,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "5866:38:18",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c79cc78e4f16ce3933a42b84c73868f93bb4a59c031a0acf576679de98c608a9",
                                "typeString": "literal_string \"Address: static call to non-contract\""
                              },
                              "value": "Address: static call to non-contract"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_c79cc78e4f16ce3933a42b84c73868f93bb4a59c031a0acf576679de98c608a9",
                                "typeString": "literal_string \"Address: static call to non-contract\""
                              }
                            ],
                            "id": 3528,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "5838:7:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 3533,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5838:67:18",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3534,
                        "nodeType": "ExpressionStatement",
                        "src": "5838:67:18"
                      },
                      {
                        "assignments": [
                          3536,
                          3538
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 3536,
                            "mutability": "mutable",
                            "name": "success",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3550,
                            "src": "5976:12:18",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 3535,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "5976:4:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 3538,
                            "mutability": "mutable",
                            "name": "returndata",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3550,
                            "src": "5990:23:18",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes"
                            },
                            "typeName": {
                              "id": 3537,
                              "name": "bytes",
                              "nodeType": "ElementaryTypeName",
                              "src": "5990:5:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 3543,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3541,
                              "name": "data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3521,
                              "src": "6035:4:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 3539,
                              "name": "target",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3519,
                              "src": "6017:6:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "id": 3540,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "staticcall",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "6017:17:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_barestaticcall_view$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                              "typeString": "function (bytes memory) view returns (bool,bytes memory)"
                            }
                          },
                          "id": 3542,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6017:23:18",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(bool,bytes memory)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "5975:65:18"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 3545,
                              "name": "success",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3536,
                              "src": "6075:7:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3546,
                              "name": "returndata",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3538,
                              "src": "6084:10:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3547,
                              "name": "errorMessage",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3523,
                              "src": "6096:12:18",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 3544,
                            "name": "_verifyCallResult",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3581,
                            "src": "6057:17:18",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_bool_$_t_bytes_memory_ptr_$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                              "typeString": "function (bool,bytes memory,string memory) pure returns (bytes memory)"
                            }
                          },
                          "id": 3548,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6057:52:18",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "functionReturnParameters": 3527,
                        "id": 3549,
                        "nodeType": "Return",
                        "src": "6050:59:18"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3517,
                    "nodeType": "StructuredDocumentation",
                    "src": "5522:173:18",
                    "text": " @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n but performing a static call.\n _Available since v3.3._"
                  },
                  "id": 3551,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "functionStaticCall",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3524,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3519,
                        "mutability": "mutable",
                        "name": "target",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3551,
                        "src": "5728:14:18",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 3518,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5728:7:18",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3521,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3551,
                        "src": "5744:17:18",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 3520,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "5744:5:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3523,
                        "mutability": "mutable",
                        "name": "errorMessage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3551,
                        "src": "5763:26:18",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 3522,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "5763:6:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5727:63:18"
                  },
                  "returnParameters": {
                    "id": 3527,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3526,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3551,
                        "src": "5814:12:18",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 3525,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "5814:5:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5813:14:18"
                  },
                  "scope": 3582,
                  "src": "5700:416:18",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3580,
                    "nodeType": "Block",
                    "src": "6251:596:18",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 3562,
                          "name": "success",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 3553,
                          "src": "6265:7:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 3578,
                          "nodeType": "Block",
                          "src": "6322:519:18",
                          "statements": [
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 3569,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 3566,
                                    "name": "returndata",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3555,
                                    "src": "6406:10:18",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes_memory_ptr",
                                      "typeString": "bytes memory"
                                    }
                                  },
                                  "id": 3567,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "length",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "6406:17:18",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": ">",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 3568,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "6426:1:18",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "6406:21:18",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": {
                                "id": 3576,
                                "nodeType": "Block",
                                "src": "6778:53:18",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 3573,
                                          "name": "errorMessage",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 3557,
                                          "src": "6803:12:18",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_string_memory_ptr",
                                            "typeString": "string memory"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_string_memory_ptr",
                                            "typeString": "string memory"
                                          }
                                        ],
                                        "id": 3572,
                                        "name": "revert",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [
                                          -19,
                                          -19
                                        ],
                                        "referencedDeclaration": -19,
                                        "src": "6796:6:18",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$",
                                          "typeString": "function (string memory) pure"
                                        }
                                      },
                                      "id": 3574,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "6796:20:18",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 3575,
                                    "nodeType": "ExpressionStatement",
                                    "src": "6796:20:18"
                                  }
                                ]
                              },
                              "id": 3577,
                              "nodeType": "IfStatement",
                              "src": "6402:429:18",
                              "trueBody": {
                                "id": 3571,
                                "nodeType": "Block",
                                "src": "6429:343:18",
                                "statements": [
                                  {
                                    "AST": {
                                      "nodeType": "YulBlock",
                                      "src": "6613:145:18",
                                      "statements": [
                                        {
                                          "nodeType": "YulVariableDeclaration",
                                          "src": "6635:40:18",
                                          "value": {
                                            "arguments": [
                                              {
                                                "name": "returndata",
                                                "nodeType": "YulIdentifier",
                                                "src": "6664:10:18"
                                              }
                                            ],
                                            "functionName": {
                                              "name": "mload",
                                              "nodeType": "YulIdentifier",
                                              "src": "6658:5:18"
                                            },
                                            "nodeType": "YulFunctionCall",
                                            "src": "6658:17:18"
                                          },
                                          "variables": [
                                            {
                                              "name": "returndata_size",
                                              "nodeType": "YulTypedName",
                                              "src": "6639:15:18",
                                              "type": ""
                                            }
                                          ]
                                        },
                                        {
                                          "expression": {
                                            "arguments": [
                                              {
                                                "arguments": [
                                                  {
                                                    "kind": "number",
                                                    "nodeType": "YulLiteral",
                                                    "src": "6707:2:18",
                                                    "type": "",
                                                    "value": "32"
                                                  },
                                                  {
                                                    "name": "returndata",
                                                    "nodeType": "YulIdentifier",
                                                    "src": "6711:10:18"
                                                  }
                                                ],
                                                "functionName": {
                                                  "name": "add",
                                                  "nodeType": "YulIdentifier",
                                                  "src": "6703:3:18"
                                                },
                                                "nodeType": "YulFunctionCall",
                                                "src": "6703:19:18"
                                              },
                                              {
                                                "name": "returndata_size",
                                                "nodeType": "YulIdentifier",
                                                "src": "6724:15:18"
                                              }
                                            ],
                                            "functionName": {
                                              "name": "revert",
                                              "nodeType": "YulIdentifier",
                                              "src": "6696:6:18"
                                            },
                                            "nodeType": "YulFunctionCall",
                                            "src": "6696:44:18"
                                          },
                                          "nodeType": "YulExpressionStatement",
                                          "src": "6696:44:18"
                                        }
                                      ]
                                    },
                                    "evmVersion": "istanbul",
                                    "externalReferences": [
                                      {
                                        "declaration": 3555,
                                        "isOffset": false,
                                        "isSlot": false,
                                        "src": "6664:10:18",
                                        "valueSize": 1
                                      },
                                      {
                                        "declaration": 3555,
                                        "isOffset": false,
                                        "isSlot": false,
                                        "src": "6711:10:18",
                                        "valueSize": 1
                                      }
                                    ],
                                    "id": 3570,
                                    "nodeType": "InlineAssembly",
                                    "src": "6604:154:18"
                                  }
                                ]
                              }
                            }
                          ]
                        },
                        "id": 3579,
                        "nodeType": "IfStatement",
                        "src": "6261:580:18",
                        "trueBody": {
                          "id": 3565,
                          "nodeType": "Block",
                          "src": "6274:42:18",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 3563,
                                "name": "returndata",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3555,
                                "src": "6295:10:18",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              },
                              "functionReturnParameters": 3561,
                              "id": 3564,
                              "nodeType": "Return",
                              "src": "6288:17:18"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 3581,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_verifyCallResult",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3558,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3553,
                        "mutability": "mutable",
                        "name": "success",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3581,
                        "src": "6149:12:18",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 3552,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "6149:4:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3555,
                        "mutability": "mutable",
                        "name": "returndata",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3581,
                        "src": "6163:23:18",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 3554,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "6163:5:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3557,
                        "mutability": "mutable",
                        "name": "errorMessage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3581,
                        "src": "6188:26:18",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 3556,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "6188:6:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6148:67:18"
                  },
                  "returnParameters": {
                    "id": 3561,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3560,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3581,
                        "src": "6237:12:18",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 3559,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "6237:5:18",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6236:14:18"
                  },
                  "scope": 3582,
                  "src": "6122:725:18",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "private"
                }
              ],
              "scope": 3583,
              "src": "134:6715:18"
            }
          ],
          "src": "33:6817:18"
        },
        "id": 18
      },
      "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol",
          "exportedSymbols": {
            "ContextUpgradeable": [
              3627
            ]
          },
          "id": 3628,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 3584,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:19"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol",
              "file": "../proxy/Initializable.sol",
              "id": 3585,
              "nodeType": "ImportDirective",
              "scope": 3628,
              "sourceUnit": 1353,
              "src": "65:36:19",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": true,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 3586,
                    "name": "Initializable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1352,
                    "src": "643:13:19",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Initializable_$1352",
                      "typeString": "contract Initializable"
                    }
                  },
                  "id": 3587,
                  "nodeType": "InheritanceSpecifier",
                  "src": "643:13:19"
                }
              ],
              "contractDependencies": [
                1352
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 3627,
              "linearizedBaseContracts": [
                3627,
                1352
              ],
              "name": "ContextUpgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 3595,
                    "nodeType": "Block",
                    "src": "710:43:19",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 3592,
                            "name": "__Context_init_unchained",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3602,
                            "src": "720:24:19",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 3593,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "720:26:19",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3594,
                        "nodeType": "ExpressionStatement",
                        "src": "720:26:19"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 3596,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 3590,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 3589,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "698:11:19",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "698:11:19"
                    }
                  ],
                  "name": "__Context_init",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3588,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "686:2:19"
                  },
                  "returnParameters": {
                    "id": 3591,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "710:0:19"
                  },
                  "scope": 3627,
                  "src": "663:90:19",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3601,
                    "nodeType": "Block",
                    "src": "816:7:19",
                    "statements": []
                  },
                  "documentation": null,
                  "id": 3602,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 3599,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 3598,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "804:11:19",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "804:11:19"
                    }
                  ],
                  "name": "__Context_init_unchained",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3597,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "792:2:19"
                  },
                  "returnParameters": {
                    "id": 3600,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "816:0:19"
                  },
                  "scope": 3627,
                  "src": "759:64:19",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3610,
                    "nodeType": "Block",
                    "src": "898:34:19",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 3607,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "915:3:19",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 3608,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "915:10:19",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "functionReturnParameters": 3606,
                        "id": 3609,
                        "nodeType": "Return",
                        "src": "908:17:19"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 3611,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_msgSender",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3603,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "847:2:19"
                  },
                  "returnParameters": {
                    "id": 3606,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3605,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3611,
                        "src": "881:15:19",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        "typeName": {
                          "id": 3604,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "881:15:19",
                          "stateMutability": "payable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "880:17:19"
                  },
                  "scope": 3627,
                  "src": "828:104:19",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3621,
                    "nodeType": "Block",
                    "src": "1003:165:19",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3616,
                          "name": "this",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -28,
                          "src": "1013:4:19",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ContextUpgradeable_$3627",
                            "typeString": "contract ContextUpgradeable"
                          }
                        },
                        "id": 3617,
                        "nodeType": "ExpressionStatement",
                        "src": "1013:4:19"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 3618,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "1153:3:19",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 3619,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "data",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "1153:8:19",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_calldata_ptr",
                            "typeString": "bytes calldata"
                          }
                        },
                        "functionReturnParameters": 3615,
                        "id": 3620,
                        "nodeType": "Return",
                        "src": "1146:15:19"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 3622,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_msgData",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3612,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "955:2:19"
                  },
                  "returnParameters": {
                    "id": 3615,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3614,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3622,
                        "src": "989:12:19",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 3613,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "989:5:19",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "988:14:19"
                  },
                  "scope": 3627,
                  "src": "938:230:19",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3626,
                  "mutability": "mutable",
                  "name": "__gap",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 3627,
                  "src": "1173:25:19",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$50_storage",
                    "typeString": "uint256[50]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 3623,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "1173:7:19",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 3625,
                    "length": {
                      "argumentTypes": null,
                      "hexValue": "3530",
                      "id": 3624,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "1181:2:19",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_50_by_1",
                        "typeString": "int_const 50"
                      },
                      "value": "50"
                    },
                    "nodeType": "ArrayTypeName",
                    "src": "1173:11:19",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$50_storage_ptr",
                      "typeString": "uint256[50]"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                }
              ],
              "scope": 3628,
              "src": "603:598:19"
            }
          ],
          "src": "33:1169:19"
        },
        "id": 19
      },
      "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol",
          "exportedSymbols": {
            "CountersUpgradeable": [
              3677
            ]
          },
          "id": 3678,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 3629,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:20"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol",
              "file": "../math/SafeMathUpgradeable.sol",
              "id": 3630,
              "nodeType": "ImportDirective",
              "scope": 3678,
              "sourceUnit": 1287,
              "src": "66:41:20",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 3631,
                "nodeType": "StructuredDocumentation",
                "src": "109:571:20",
                "text": " @title Counters\n @author Matt Condon (@shrugs)\n @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number\n of elements in a mapping, issuing ERC721 ids, or counting request ids.\n Include with `using Counters for Counters.Counter;`\n Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}\n overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never\n directly accessed."
              },
              "fullyImplemented": true,
              "id": 3677,
              "linearizedBaseContracts": [
                3677
              ],
              "name": "CountersUpgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 3634,
                  "libraryName": {
                    "contractScope": null,
                    "id": 3632,
                    "name": "SafeMathUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1286,
                    "src": "721:19:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeMathUpgradeable_$1286",
                      "typeString": "library SafeMathUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "715:38:20",
                  "typeName": {
                    "id": 3633,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "745:7:20",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "canonicalName": "CountersUpgradeable.Counter",
                  "id": 3637,
                  "members": [
                    {
                      "constant": false,
                      "id": 3636,
                      "mutability": "mutable",
                      "name": "_value",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 3637,
                      "src": "1098:14:20",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 3635,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "1098:7:20",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "Counter",
                  "nodeType": "StructDefinition",
                  "scope": 3677,
                  "src": "759:374:20",
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 3647,
                    "nodeType": "Block",
                    "src": "1213:38:20",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 3644,
                            "name": "counter",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3639,
                            "src": "1230:7:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_Counter_$3637_storage_ptr",
                              "typeString": "struct CountersUpgradeable.Counter storage pointer"
                            }
                          },
                          "id": 3645,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "_value",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 3636,
                          "src": "1230:14:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 3643,
                        "id": 3646,
                        "nodeType": "Return",
                        "src": "1223:21:20"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 3648,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "current",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3640,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3639,
                        "mutability": "mutable",
                        "name": "counter",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3648,
                        "src": "1156:23:20",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Counter_$3637_storage_ptr",
                          "typeString": "struct CountersUpgradeable.Counter"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 3638,
                          "name": "Counter",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 3637,
                          "src": "1156:7:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Counter_$3637_storage_ptr",
                            "typeString": "struct CountersUpgradeable.Counter"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1155:25:20"
                  },
                  "returnParameters": {
                    "id": 3643,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3642,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3648,
                        "src": "1204:7:20",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3641,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1204:7:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1203:9:20"
                  },
                  "scope": 3677,
                  "src": "1139:112:20",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3659,
                    "nodeType": "Block",
                    "src": "1310:125:20",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3657,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3653,
                              "name": "counter",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3650,
                              "src": "1409:7:20",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Counter_$3637_storage_ptr",
                                "typeString": "struct CountersUpgradeable.Counter storage pointer"
                              }
                            },
                            "id": 3655,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "_value",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3636,
                            "src": "1409:14:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "+=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "hexValue": "31",
                            "id": 3656,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1427:1:20",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_1_by_1",
                              "typeString": "int_const 1"
                            },
                            "value": "1"
                          },
                          "src": "1409:19:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 3658,
                        "nodeType": "ExpressionStatement",
                        "src": "1409:19:20"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 3660,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "increment",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3651,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3650,
                        "mutability": "mutable",
                        "name": "counter",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3660,
                        "src": "1276:23:20",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Counter_$3637_storage_ptr",
                          "typeString": "struct CountersUpgradeable.Counter"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 3649,
                          "name": "Counter",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 3637,
                          "src": "1276:7:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Counter_$3637_storage_ptr",
                            "typeString": "struct CountersUpgradeable.Counter"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1275:25:20"
                  },
                  "returnParameters": {
                    "id": 3652,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1310:0:20"
                  },
                  "scope": 3677,
                  "src": "1257:178:20",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 3675,
                    "nodeType": "Block",
                    "src": "1494:55:20",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 3673,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3665,
                              "name": "counter",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3662,
                              "src": "1504:7:20",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Counter_$3637_storage_ptr",
                                "typeString": "struct CountersUpgradeable.Counter storage pointer"
                              }
                            },
                            "id": 3667,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "_value",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3636,
                            "src": "1504:14:20",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "31",
                                "id": 3671,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "1540:1:20",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_1_by_1",
                                  "typeString": "int_const 1"
                                },
                                "value": "1"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_1_by_1",
                                  "typeString": "int_const 1"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 3668,
                                  "name": "counter",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3662,
                                  "src": "1521:7:20",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Counter_$3637_storage_ptr",
                                    "typeString": "struct CountersUpgradeable.Counter storage pointer"
                                  }
                                },
                                "id": 3669,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "_value",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 3636,
                                "src": "1521:14:20",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 3670,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1135,
                              "src": "1521:18:20",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 3672,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1521:21:20",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "1504:38:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 3674,
                        "nodeType": "ExpressionStatement",
                        "src": "1504:38:20"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 3676,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "decrement",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3663,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3662,
                        "mutability": "mutable",
                        "name": "counter",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3676,
                        "src": "1460:23:20",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Counter_$3637_storage_ptr",
                          "typeString": "struct CountersUpgradeable.Counter"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 3661,
                          "name": "Counter",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 3637,
                          "src": "1460:7:20",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Counter_$3637_storage_ptr",
                            "typeString": "struct CountersUpgradeable.Counter"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1459:25:20"
                  },
                  "returnParameters": {
                    "id": 3664,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1494:0:20"
                  },
                  "scope": 3677,
                  "src": "1441:108:20",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 3678,
              "src": "681:870:20"
            }
          ],
          "src": "33:1519:20"
        },
        "id": 20
      },
      "@openzeppelin/contracts-upgradeable/utils/EnumerableMapUpgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/utils/EnumerableMapUpgradeable.sol",
          "exportedSymbols": {
            "EnumerableMapUpgradeable": [
              4237
            ]
          },
          "id": 4238,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 3679,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:21"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 3680,
                "nodeType": "StructuredDocumentation",
                "src": "66:705:21",
                "text": " @dev Library for managing an enumerable variant of Solidity's\n https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]\n type.\n Maps have the following properties:\n - Entries are added, removed, and checked for existence in constant time\n (O(1)).\n - Entries are enumerated in O(n). No guarantees are made on the ordering.\n ```\n contract Example {\n     // Add the library methods\n     using EnumerableMap for EnumerableMap.UintToAddressMap;\n     // Declare a set state variable\n     EnumerableMap.UintToAddressMap private myMap;\n }\n ```\n As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are\n supported."
              },
              "fullyImplemented": true,
              "id": 4237,
              "linearizedBaseContracts": [
                4237
              ],
              "name": "EnumerableMapUpgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "canonicalName": "EnumerableMapUpgradeable.MapEntry",
                  "id": 3685,
                  "members": [
                    {
                      "constant": false,
                      "id": 3682,
                      "mutability": "mutable",
                      "name": "_key",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 3685,
                      "src": "1295:12:21",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      },
                      "typeName": {
                        "id": 3681,
                        "name": "bytes32",
                        "nodeType": "ElementaryTypeName",
                        "src": "1295:7:21",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 3684,
                      "mutability": "mutable",
                      "name": "_value",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 3685,
                      "src": "1317:14:21",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      },
                      "typeName": {
                        "id": 3683,
                        "name": "bytes32",
                        "nodeType": "ElementaryTypeName",
                        "src": "1317:7:21",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "MapEntry",
                  "nodeType": "StructDefinition",
                  "scope": 4237,
                  "src": "1269:69:21",
                  "visibility": "public"
                },
                {
                  "canonicalName": "EnumerableMapUpgradeable.Map",
                  "id": 3693,
                  "members": [
                    {
                      "constant": false,
                      "id": 3688,
                      "mutability": "mutable",
                      "name": "_entries",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 3693,
                      "src": "1407:19:21",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_array$_t_struct$_MapEntry_$3685_storage_$dyn_storage_ptr",
                        "typeString": "struct EnumerableMapUpgradeable.MapEntry[]"
                      },
                      "typeName": {
                        "baseType": {
                          "contractScope": null,
                          "id": 3686,
                          "name": "MapEntry",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 3685,
                          "src": "1407:8:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_MapEntry_$3685_storage_ptr",
                            "typeString": "struct EnumerableMapUpgradeable.MapEntry"
                          }
                        },
                        "id": 3687,
                        "length": null,
                        "nodeType": "ArrayTypeName",
                        "src": "1407:10:21",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_MapEntry_$3685_storage_$dyn_storage_ptr",
                          "typeString": "struct EnumerableMapUpgradeable.MapEntry[]"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 3692,
                      "mutability": "mutable",
                      "name": "_indexes",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 3693,
                      "src": "1576:37:21",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                        "typeString": "mapping(bytes32 => uint256)"
                      },
                      "typeName": {
                        "id": 3691,
                        "keyType": {
                          "id": 3689,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "1585:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "nodeType": "Mapping",
                        "src": "1576:28:21",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                          "typeString": "mapping(bytes32 => uint256)"
                        },
                        "valueType": {
                          "id": 3690,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1596:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "Map",
                  "nodeType": "StructDefinition",
                  "scope": 4237,
                  "src": "1344:276:21",
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 3754,
                    "nodeType": "Block",
                    "src": "1929:596:21",
                    "statements": [
                      {
                        "assignments": [
                          3706
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 3706,
                            "mutability": "mutable",
                            "name": "keyIndex",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3754,
                            "src": "2037:16:21",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 3705,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "2037:7:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 3711,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3707,
                              "name": "map",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3696,
                              "src": "2056:3:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                                "typeString": "struct EnumerableMapUpgradeable.Map storage pointer"
                              }
                            },
                            "id": 3708,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "_indexes",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3692,
                            "src": "2056:12:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                              "typeString": "mapping(bytes32 => uint256)"
                            }
                          },
                          "id": 3710,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 3709,
                            "name": "key",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3698,
                            "src": "2069:3:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "2056:17:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2037:36:21"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 3714,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 3712,
                            "name": "keyIndex",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3706,
                            "src": "2088:8:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 3713,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "2100:1:21",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "2088:13:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 3752,
                          "nodeType": "Block",
                          "src": "2427:92:21",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 3748,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 3739,
                                        "name": "map",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 3696,
                                        "src": "2441:3:21",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                                          "typeString": "struct EnumerableMapUpgradeable.Map storage pointer"
                                        }
                                      },
                                      "id": 3744,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "_entries",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 3688,
                                      "src": "2441:12:21",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_struct$_MapEntry_$3685_storage_$dyn_storage",
                                        "typeString": "struct EnumerableMapUpgradeable.MapEntry storage ref[] storage ref"
                                      }
                                    },
                                    "id": 3745,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "id": 3743,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 3741,
                                        "name": "keyIndex",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 3706,
                                        "src": "2454:8:21",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "-",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "hexValue": "31",
                                        "id": 3742,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "number",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "2465:1:21",
                                        "subdenomination": null,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_rational_1_by_1",
                                          "typeString": "int_const 1"
                                        },
                                        "value": "1"
                                      },
                                      "src": "2454:12:21",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "2441:26:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_MapEntry_$3685_storage",
                                      "typeString": "struct EnumerableMapUpgradeable.MapEntry storage ref"
                                    }
                                  },
                                  "id": 3746,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "memberName": "_value",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 3684,
                                  "src": "2441:33:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 3747,
                                  "name": "value",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3700,
                                  "src": "2477:5:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                "src": "2441:41:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "id": 3749,
                              "nodeType": "ExpressionStatement",
                              "src": "2441:41:21"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "66616c7365",
                                "id": 3750,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "2503:5:21",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "false"
                              },
                              "functionReturnParameters": 3704,
                              "id": 3751,
                              "nodeType": "Return",
                              "src": "2496:12:21"
                            }
                          ]
                        },
                        "id": 3753,
                        "nodeType": "IfStatement",
                        "src": "2084:435:21",
                        "trueBody": {
                          "id": 3738,
                          "nodeType": "Block",
                          "src": "2103:318:21",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 3721,
                                        "name": "key",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 3698,
                                        "src": "2189:3:21",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        }
                                      },
                                      {
                                        "argumentTypes": null,
                                        "id": 3722,
                                        "name": "value",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 3700,
                                        "src": "2202:5:21",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        },
                                        {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        }
                                      ],
                                      "id": 3720,
                                      "name": "MapEntry",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3685,
                                      "src": "2172:8:21",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_struct$_MapEntry_$3685_storage_ptr_$",
                                        "typeString": "type(struct EnumerableMapUpgradeable.MapEntry storage pointer)"
                                      }
                                    },
                                    "id": 3723,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "structConstructorCall",
                                    "lValueRequested": false,
                                    "names": [
                                      "_key",
                                      "_value"
                                    ],
                                    "nodeType": "FunctionCall",
                                    "src": "2172:38:21",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_MapEntry_$3685_memory_ptr",
                                      "typeString": "struct EnumerableMapUpgradeable.MapEntry memory"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_struct$_MapEntry_$3685_memory_ptr",
                                      "typeString": "struct EnumerableMapUpgradeable.MapEntry memory"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 3715,
                                      "name": "map",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3696,
                                      "src": "2154:3:21",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                                        "typeString": "struct EnumerableMapUpgradeable.Map storage pointer"
                                      }
                                    },
                                    "id": 3718,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "_entries",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 3688,
                                    "src": "2154:12:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_struct$_MapEntry_$3685_storage_$dyn_storage",
                                      "typeString": "struct EnumerableMapUpgradeable.MapEntry storage ref[] storage ref"
                                    }
                                  },
                                  "id": 3719,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "push",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "2154:17:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_arraypush_nonpayable$_t_struct$_MapEntry_$3685_storage_$returns$__$",
                                    "typeString": "function (struct EnumerableMapUpgradeable.MapEntry storage ref)"
                                  }
                                },
                                "id": 3724,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "2154:57:21",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 3725,
                              "nodeType": "ExpressionStatement",
                              "src": "2154:57:21"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 3734,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 3726,
                                      "name": "map",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3696,
                                      "src": "2346:3:21",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                                        "typeString": "struct EnumerableMapUpgradeable.Map storage pointer"
                                      }
                                    },
                                    "id": 3729,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "_indexes",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 3692,
                                    "src": "2346:12:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                                      "typeString": "mapping(bytes32 => uint256)"
                                    }
                                  },
                                  "id": 3730,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 3728,
                                    "name": "key",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3698,
                                    "src": "2359:3:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "2346:17:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 3731,
                                      "name": "map",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3696,
                                      "src": "2366:3:21",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                                        "typeString": "struct EnumerableMapUpgradeable.Map storage pointer"
                                      }
                                    },
                                    "id": 3732,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "_entries",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 3688,
                                    "src": "2366:12:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_struct$_MapEntry_$3685_storage_$dyn_storage",
                                      "typeString": "struct EnumerableMapUpgradeable.MapEntry storage ref[] storage ref"
                                    }
                                  },
                                  "id": 3733,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "length",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "2366:19:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "2346:39:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 3735,
                              "nodeType": "ExpressionStatement",
                              "src": "2346:39:21"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "74727565",
                                "id": 3736,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "2406:4:21",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "true"
                              },
                              "functionReturnParameters": 3704,
                              "id": 3737,
                              "nodeType": "Return",
                              "src": "2399:11:21"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3694,
                    "nodeType": "StructuredDocumentation",
                    "src": "1626:216:21",
                    "text": " @dev Adds a key-value pair to a map, or updates the value for an existing\n key. O(1).\n Returns true if the key was added to the map, that is if it was not\n already present."
                  },
                  "id": 3755,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_set",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3701,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3696,
                        "mutability": "mutable",
                        "name": "map",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3755,
                        "src": "1861:15:21",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                          "typeString": "struct EnumerableMapUpgradeable.Map"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 3695,
                          "name": "Map",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 3693,
                          "src": "1861:3:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                            "typeString": "struct EnumerableMapUpgradeable.Map"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3698,
                        "mutability": "mutable",
                        "name": "key",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3755,
                        "src": "1878:11:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 3697,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "1878:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3700,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3755,
                        "src": "1891:13:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 3699,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "1891:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1860:45:21"
                  },
                  "returnParameters": {
                    "id": 3704,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3703,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3755,
                        "src": "1923:4:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 3702,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "1923:4:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1922:6:21"
                  },
                  "scope": 4237,
                  "src": "1847:678:21",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 3835,
                    "nodeType": "Block",
                    "src": "2763:1447:21",
                    "statements": [
                      {
                        "assignments": [
                          3766
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 3766,
                            "mutability": "mutable",
                            "name": "keyIndex",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3835,
                            "src": "2871:16:21",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 3765,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "2871:7:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 3771,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3767,
                              "name": "map",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3758,
                              "src": "2890:3:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                                "typeString": "struct EnumerableMapUpgradeable.Map storage pointer"
                              }
                            },
                            "id": 3768,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "_indexes",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3692,
                            "src": "2890:12:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                              "typeString": "mapping(bytes32 => uint256)"
                            }
                          },
                          "id": 3770,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 3769,
                            "name": "key",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3760,
                            "src": "2903:3:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "2890:17:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2871:36:21"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 3774,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 3772,
                            "name": "keyIndex",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3766,
                            "src": "2922:8:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 3773,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "2934:1:21",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "2922:13:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 3833,
                          "nodeType": "Block",
                          "src": "4167:37:21",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "66616c7365",
                                "id": 3831,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "4188:5:21",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "false"
                              },
                              "functionReturnParameters": 3764,
                              "id": 3832,
                              "nodeType": "Return",
                              "src": "4181:12:21"
                            }
                          ]
                        },
                        "id": 3834,
                        "nodeType": "IfStatement",
                        "src": "2918:1286:21",
                        "trueBody": {
                          "id": 3830,
                          "nodeType": "Block",
                          "src": "2937:1224:21",
                          "statements": [
                            {
                              "assignments": [
                                3776
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 3776,
                                  "mutability": "mutable",
                                  "name": "toDeleteIndex",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 3830,
                                  "src": "3278:21:21",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 3775,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "3278:7:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 3780,
                              "initialValue": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 3779,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 3777,
                                  "name": "keyIndex",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3766,
                                  "src": "3302:8:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "-",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "31",
                                  "id": 3778,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "3313:1:21",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_1_by_1",
                                    "typeString": "int_const 1"
                                  },
                                  "value": "1"
                                },
                                "src": "3302:12:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "3278:36:21"
                            },
                            {
                              "assignments": [
                                3782
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 3782,
                                  "mutability": "mutable",
                                  "name": "lastIndex",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 3830,
                                  "src": "3328:17:21",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 3781,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "3328:7:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 3788,
                              "initialValue": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 3787,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 3783,
                                      "name": "map",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3758,
                                      "src": "3348:3:21",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                                        "typeString": "struct EnumerableMapUpgradeable.Map storage pointer"
                                      }
                                    },
                                    "id": 3784,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "_entries",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 3688,
                                    "src": "3348:12:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_struct$_MapEntry_$3685_storage_$dyn_storage",
                                      "typeString": "struct EnumerableMapUpgradeable.MapEntry storage ref[] storage ref"
                                    }
                                  },
                                  "id": 3785,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "length",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "3348:19:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "-",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "31",
                                  "id": 3786,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "3370:1:21",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_1_by_1",
                                    "typeString": "int_const 1"
                                  },
                                  "value": "1"
                                },
                                "src": "3348:23:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "3328:43:21"
                            },
                            {
                              "assignments": [
                                3790
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 3790,
                                  "mutability": "mutable",
                                  "name": "lastEntry",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 3830,
                                  "src": "3611:26:21",
                                  "stateVariable": false,
                                  "storageLocation": "storage",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_MapEntry_$3685_storage_ptr",
                                    "typeString": "struct EnumerableMapUpgradeable.MapEntry"
                                  },
                                  "typeName": {
                                    "contractScope": null,
                                    "id": 3789,
                                    "name": "MapEntry",
                                    "nodeType": "UserDefinedTypeName",
                                    "referencedDeclaration": 3685,
                                    "src": "3611:8:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_MapEntry_$3685_storage_ptr",
                                      "typeString": "struct EnumerableMapUpgradeable.MapEntry"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 3795,
                              "initialValue": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 3791,
                                    "name": "map",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3758,
                                    "src": "3640:3:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                                      "typeString": "struct EnumerableMapUpgradeable.Map storage pointer"
                                    }
                                  },
                                  "id": 3792,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "_entries",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 3688,
                                  "src": "3640:12:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_struct$_MapEntry_$3685_storage_$dyn_storage",
                                    "typeString": "struct EnumerableMapUpgradeable.MapEntry storage ref[] storage ref"
                                  }
                                },
                                "id": 3794,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 3793,
                                  "name": "lastIndex",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3782,
                                  "src": "3653:9:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "3640:23:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_MapEntry_$3685_storage",
                                  "typeString": "struct EnumerableMapUpgradeable.MapEntry storage ref"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "3611:52:21"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 3802,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 3796,
                                      "name": "map",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3758,
                                      "src": "3755:3:21",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                                        "typeString": "struct EnumerableMapUpgradeable.Map storage pointer"
                                      }
                                    },
                                    "id": 3799,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "_entries",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 3688,
                                    "src": "3755:12:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_struct$_MapEntry_$3685_storage_$dyn_storage",
                                      "typeString": "struct EnumerableMapUpgradeable.MapEntry storage ref[] storage ref"
                                    }
                                  },
                                  "id": 3800,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 3798,
                                    "name": "toDeleteIndex",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3776,
                                    "src": "3768:13:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "3755:27:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_MapEntry_$3685_storage",
                                    "typeString": "struct EnumerableMapUpgradeable.MapEntry storage ref"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 3801,
                                  "name": "lastEntry",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3790,
                                  "src": "3785:9:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_MapEntry_$3685_storage_ptr",
                                    "typeString": "struct EnumerableMapUpgradeable.MapEntry storage pointer"
                                  }
                                },
                                "src": "3755:39:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_MapEntry_$3685_storage",
                                  "typeString": "struct EnumerableMapUpgradeable.MapEntry storage ref"
                                }
                              },
                              "id": 3803,
                              "nodeType": "ExpressionStatement",
                              "src": "3755:39:21"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 3813,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 3804,
                                      "name": "map",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3758,
                                      "src": "3860:3:21",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                                        "typeString": "struct EnumerableMapUpgradeable.Map storage pointer"
                                      }
                                    },
                                    "id": 3808,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "_indexes",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 3692,
                                    "src": "3860:12:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                                      "typeString": "mapping(bytes32 => uint256)"
                                    }
                                  },
                                  "id": 3809,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 3806,
                                      "name": "lastEntry",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3790,
                                      "src": "3873:9:21",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_MapEntry_$3685_storage_ptr",
                                        "typeString": "struct EnumerableMapUpgradeable.MapEntry storage pointer"
                                      }
                                    },
                                    "id": 3807,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "_key",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 3682,
                                    "src": "3873:14:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "3860:28:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 3812,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 3810,
                                    "name": "toDeleteIndex",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3776,
                                    "src": "3891:13:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "+",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "31",
                                    "id": 3811,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "3907:1:21",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_1_by_1",
                                      "typeString": "int_const 1"
                                    },
                                    "value": "1"
                                  },
                                  "src": "3891:17:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "3860:48:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 3814,
                              "nodeType": "ExpressionStatement",
                              "src": "3860:48:21"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 3815,
                                      "name": "map",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3758,
                                      "src": "4014:3:21",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                                        "typeString": "struct EnumerableMapUpgradeable.Map storage pointer"
                                      }
                                    },
                                    "id": 3818,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "_entries",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 3688,
                                    "src": "4014:12:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_struct$_MapEntry_$3685_storage_$dyn_storage",
                                      "typeString": "struct EnumerableMapUpgradeable.MapEntry storage ref[] storage ref"
                                    }
                                  },
                                  "id": 3819,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "pop",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "4014:16:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_arraypop_nonpayable$__$returns$__$",
                                    "typeString": "function ()"
                                  }
                                },
                                "id": 3820,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "4014:18:21",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 3821,
                              "nodeType": "ExpressionStatement",
                              "src": "4014:18:21"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 3826,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "UnaryOperation",
                                "operator": "delete",
                                "prefix": true,
                                "src": "4100:24:21",
                                "subExpression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 3822,
                                      "name": "map",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3758,
                                      "src": "4107:3:21",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                                        "typeString": "struct EnumerableMapUpgradeable.Map storage pointer"
                                      }
                                    },
                                    "id": 3823,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "_indexes",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 3692,
                                    "src": "4107:12:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                                      "typeString": "mapping(bytes32 => uint256)"
                                    }
                                  },
                                  "id": 3825,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 3824,
                                    "name": "key",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3760,
                                    "src": "4120:3:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "4107:17:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 3827,
                              "nodeType": "ExpressionStatement",
                              "src": "4100:24:21"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "74727565",
                                "id": 3828,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "4146:4:21",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "true"
                              },
                              "functionReturnParameters": 3764,
                              "id": 3829,
                              "nodeType": "Return",
                              "src": "4139:11:21"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3756,
                    "nodeType": "StructuredDocumentation",
                    "src": "2531:157:21",
                    "text": " @dev Removes a key-value pair from a map. O(1).\n Returns true if the key was removed from the map, that is if it was present."
                  },
                  "id": 3836,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_remove",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3761,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3758,
                        "mutability": "mutable",
                        "name": "map",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3836,
                        "src": "2710:15:21",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                          "typeString": "struct EnumerableMapUpgradeable.Map"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 3757,
                          "name": "Map",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 3693,
                          "src": "2710:3:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                            "typeString": "struct EnumerableMapUpgradeable.Map"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3760,
                        "mutability": "mutable",
                        "name": "key",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3836,
                        "src": "2727:11:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 3759,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "2727:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2709:30:21"
                  },
                  "returnParameters": {
                    "id": 3764,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3763,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3836,
                        "src": "2757:4:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 3762,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "2757:4:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2756:6:21"
                  },
                  "scope": 4237,
                  "src": "2693:1517:21",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 3853,
                    "nodeType": "Block",
                    "src": "4366:46:21",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 3851,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 3846,
                                "name": "map",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3839,
                                "src": "4383:3:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                                  "typeString": "struct EnumerableMapUpgradeable.Map storage pointer"
                                }
                              },
                              "id": 3847,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_indexes",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 3692,
                              "src": "4383:12:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                                "typeString": "mapping(bytes32 => uint256)"
                              }
                            },
                            "id": 3849,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 3848,
                              "name": "key",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3841,
                              "src": "4396:3:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "4383:17:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 3850,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "4404:1:21",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "4383:22:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 3845,
                        "id": 3852,
                        "nodeType": "Return",
                        "src": "4376:29:21"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3837,
                    "nodeType": "StructuredDocumentation",
                    "src": "4216:68:21",
                    "text": " @dev Returns true if the key is in the map. O(1)."
                  },
                  "id": 3854,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_contains",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3842,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3839,
                        "mutability": "mutable",
                        "name": "map",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3854,
                        "src": "4308:15:21",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                          "typeString": "struct EnumerableMapUpgradeable.Map"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 3838,
                          "name": "Map",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 3693,
                          "src": "4308:3:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                            "typeString": "struct EnumerableMapUpgradeable.Map"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3841,
                        "mutability": "mutable",
                        "name": "key",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3854,
                        "src": "4325:11:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 3840,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "4325:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4307:30:21"
                  },
                  "returnParameters": {
                    "id": 3845,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3844,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3854,
                        "src": "4360:4:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 3843,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "4360:4:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4359:6:21"
                  },
                  "scope": 4237,
                  "src": "4289:123:21",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 3866,
                    "nodeType": "Block",
                    "src": "4567:43:21",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3862,
                              "name": "map",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3857,
                              "src": "4584:3:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                                "typeString": "struct EnumerableMapUpgradeable.Map storage pointer"
                              }
                            },
                            "id": 3863,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "_entries",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3688,
                            "src": "4584:12:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_struct$_MapEntry_$3685_storage_$dyn_storage",
                              "typeString": "struct EnumerableMapUpgradeable.MapEntry storage ref[] storage ref"
                            }
                          },
                          "id": 3864,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "4584:19:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 3861,
                        "id": 3865,
                        "nodeType": "Return",
                        "src": "4577:26:21"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3855,
                    "nodeType": "StructuredDocumentation",
                    "src": "4418:79:21",
                    "text": " @dev Returns the number of key-value pairs in the map. O(1)."
                  },
                  "id": 3867,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_length",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3858,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3857,
                        "mutability": "mutable",
                        "name": "map",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3867,
                        "src": "4519:15:21",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                          "typeString": "struct EnumerableMapUpgradeable.Map"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 3856,
                          "name": "Map",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 3693,
                          "src": "4519:3:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                            "typeString": "struct EnumerableMapUpgradeable.Map"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4518:17:21"
                  },
                  "returnParameters": {
                    "id": 3861,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3860,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3867,
                        "src": "4558:7:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3859,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4558:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4557:9:21"
                  },
                  "scope": 4237,
                  "src": "4502:108:21",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 3901,
                    "nodeType": "Block",
                    "src": "5038:189:21",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 3884,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 3880,
                                    "name": "map",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3870,
                                    "src": "5056:3:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                                      "typeString": "struct EnumerableMapUpgradeable.Map storage pointer"
                                    }
                                  },
                                  "id": 3881,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "_entries",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 3688,
                                  "src": "5056:12:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_struct$_MapEntry_$3685_storage_$dyn_storage",
                                    "typeString": "struct EnumerableMapUpgradeable.MapEntry storage ref[] storage ref"
                                  }
                                },
                                "id": 3882,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "length",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "5056:19:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 3883,
                                "name": "index",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3872,
                                "src": "5078:5:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "5056:27:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e6473",
                              "id": 3885,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "5085:36:21",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_86631030b9066a18616a068fc09fce83d18af4765cb1d2166fa475228f4db155",
                                "typeString": "literal_string \"EnumerableMap: index out of bounds\""
                              },
                              "value": "EnumerableMap: index out of bounds"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_86631030b9066a18616a068fc09fce83d18af4765cb1d2166fa475228f4db155",
                                "typeString": "literal_string \"EnumerableMap: index out of bounds\""
                              }
                            ],
                            "id": 3879,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "5048:7:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 3886,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5048:74:21",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3887,
                        "nodeType": "ExpressionStatement",
                        "src": "5048:74:21"
                      },
                      {
                        "assignments": [
                          3889
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 3889,
                            "mutability": "mutable",
                            "name": "entry",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3901,
                            "src": "5133:22:21",
                            "stateVariable": false,
                            "storageLocation": "storage",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_MapEntry_$3685_storage_ptr",
                              "typeString": "struct EnumerableMapUpgradeable.MapEntry"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 3888,
                              "name": "MapEntry",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 3685,
                              "src": "5133:8:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_MapEntry_$3685_storage_ptr",
                                "typeString": "struct EnumerableMapUpgradeable.MapEntry"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 3894,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3890,
                              "name": "map",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3870,
                              "src": "5158:3:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                                "typeString": "struct EnumerableMapUpgradeable.Map storage pointer"
                              }
                            },
                            "id": 3891,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "_entries",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3688,
                            "src": "5158:12:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_struct$_MapEntry_$3685_storage_$dyn_storage",
                              "typeString": "struct EnumerableMapUpgradeable.MapEntry storage ref[] storage ref"
                            }
                          },
                          "id": 3893,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 3892,
                            "name": "index",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3872,
                            "src": "5171:5:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "5158:19:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_MapEntry_$3685_storage",
                            "typeString": "struct EnumerableMapUpgradeable.MapEntry storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "5133:44:21"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 3895,
                                "name": "entry",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3889,
                                "src": "5195:5:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_MapEntry_$3685_storage_ptr",
                                  "typeString": "struct EnumerableMapUpgradeable.MapEntry storage pointer"
                                }
                              },
                              "id": 3896,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_key",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 3682,
                              "src": "5195:10:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 3897,
                                "name": "entry",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3889,
                                "src": "5207:5:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_MapEntry_$3685_storage_ptr",
                                  "typeString": "struct EnumerableMapUpgradeable.MapEntry storage pointer"
                                }
                              },
                              "id": 3898,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_value",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 3684,
                              "src": "5207:12:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "id": 3899,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "5194:26:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bytes32_$_t_bytes32_$",
                            "typeString": "tuple(bytes32,bytes32)"
                          }
                        },
                        "functionReturnParameters": 3878,
                        "id": 3900,
                        "nodeType": "Return",
                        "src": "5187:33:21"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3868,
                    "nodeType": "StructuredDocumentation",
                    "src": "4615:333:21",
                    "text": " @dev Returns the key-value pair stored at position `index` in the map. O(1).\n Note that there are no guarantees on the ordering of entries inside the\n array, and it may change when more entries are added or removed.\n Requirements:\n - `index` must be strictly less than {length}."
                  },
                  "id": 3902,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_at",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3873,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3870,
                        "mutability": "mutable",
                        "name": "map",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3902,
                        "src": "4966:15:21",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                          "typeString": "struct EnumerableMapUpgradeable.Map"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 3869,
                          "name": "Map",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 3693,
                          "src": "4966:3:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                            "typeString": "struct EnumerableMapUpgradeable.Map"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3872,
                        "mutability": "mutable",
                        "name": "index",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3902,
                        "src": "4983:13:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 3871,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4983:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4965:32:21"
                  },
                  "returnParameters": {
                    "id": 3878,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3875,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3902,
                        "src": "5020:7:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 3874,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "5020:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3877,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3902,
                        "src": "5029:7:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 3876,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "5029:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5019:18:21"
                  },
                  "scope": 4237,
                  "src": "4953:274:21",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 3939,
                    "nodeType": "Block",
                    "src": "5453:220:21",
                    "statements": [
                      {
                        "assignments": [
                          3915
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 3915,
                            "mutability": "mutable",
                            "name": "keyIndex",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3939,
                            "src": "5463:16:21",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 3914,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "5463:7:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 3920,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3916,
                              "name": "map",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3905,
                              "src": "5482:3:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                                "typeString": "struct EnumerableMapUpgradeable.Map storage pointer"
                              }
                            },
                            "id": 3917,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "_indexes",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3692,
                            "src": "5482:12:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                              "typeString": "mapping(bytes32 => uint256)"
                            }
                          },
                          "id": 3919,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 3918,
                            "name": "key",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3907,
                            "src": "5495:3:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "5482:17:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "5463:36:21"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 3923,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 3921,
                            "name": "keyIndex",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3915,
                            "src": "5513:8:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 3922,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "5525:1:21",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "5513:13:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 3928,
                        "nodeType": "IfStatement",
                        "src": "5509:36:21",
                        "trueBody": {
                          "expression": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "hexValue": "66616c7365",
                                "id": 3924,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "5536:5:21",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "false"
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 3925,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "5543:1:21",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "id": 3926,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "5535:10:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_bool_$_t_rational_0_by_1_$",
                              "typeString": "tuple(bool,int_const 0)"
                            }
                          },
                          "functionReturnParameters": 3913,
                          "id": 3927,
                          "nodeType": "Return",
                          "src": "5528:17:21"
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "hexValue": "74727565",
                              "id": 3929,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "bool",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "5599:4:21",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "value": "true"
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 3930,
                                    "name": "map",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3905,
                                    "src": "5605:3:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                                      "typeString": "struct EnumerableMapUpgradeable.Map storage pointer"
                                    }
                                  },
                                  "id": 3931,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "_entries",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 3688,
                                  "src": "5605:12:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_struct$_MapEntry_$3685_storage_$dyn_storage",
                                    "typeString": "struct EnumerableMapUpgradeable.MapEntry storage ref[] storage ref"
                                  }
                                },
                                "id": 3935,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 3934,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 3932,
                                    "name": "keyIndex",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3915,
                                    "src": "5618:8:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "-",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "31",
                                    "id": 3933,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "5629:1:21",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_1_by_1",
                                      "typeString": "int_const 1"
                                    },
                                    "value": "1"
                                  },
                                  "src": "5618:12:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "5605:26:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_MapEntry_$3685_storage",
                                  "typeString": "struct EnumerableMapUpgradeable.MapEntry storage ref"
                                }
                              },
                              "id": 3936,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_value",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 3684,
                              "src": "5605:33:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "id": 3937,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "5598:41:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes32_$",
                            "typeString": "tuple(bool,bytes32)"
                          }
                        },
                        "functionReturnParameters": 3913,
                        "id": 3938,
                        "nodeType": "Return",
                        "src": "5591:48:21"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3903,
                    "nodeType": "StructuredDocumentation",
                    "src": "5233:131:21",
                    "text": " @dev Tries to returns the value associated with `key`.  O(1).\n Does not revert if `key` is not in the map."
                  },
                  "id": 3940,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_tryGet",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3908,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3905,
                        "mutability": "mutable",
                        "name": "map",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3940,
                        "src": "5386:15:21",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                          "typeString": "struct EnumerableMapUpgradeable.Map"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 3904,
                          "name": "Map",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 3693,
                          "src": "5386:3:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                            "typeString": "struct EnumerableMapUpgradeable.Map"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3907,
                        "mutability": "mutable",
                        "name": "key",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3940,
                        "src": "5403:11:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 3906,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "5403:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5385:30:21"
                  },
                  "returnParameters": {
                    "id": 3913,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3910,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3940,
                        "src": "5438:4:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 3909,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "5438:4:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3912,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3940,
                        "src": "5444:7:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 3911,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "5444:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5437:15:21"
                  },
                  "scope": 4237,
                  "src": "5369:304:21",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 3972,
                    "nodeType": "Block",
                    "src": "5900:232:21",
                    "statements": [
                      {
                        "assignments": [
                          3951
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 3951,
                            "mutability": "mutable",
                            "name": "keyIndex",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 3972,
                            "src": "5910:16:21",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 3950,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "5910:7:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 3956,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3952,
                              "name": "map",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3943,
                              "src": "5929:3:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                                "typeString": "struct EnumerableMapUpgradeable.Map storage pointer"
                              }
                            },
                            "id": 3953,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "_indexes",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3692,
                            "src": "5929:12:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                              "typeString": "mapping(bytes32 => uint256)"
                            }
                          },
                          "id": 3955,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 3954,
                            "name": "key",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3945,
                            "src": "5942:3:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "5929:17:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "5910:36:21"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 3960,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 3958,
                                "name": "keyIndex",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3951,
                                "src": "5964:8:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 3959,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "5976:1:21",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "5964:13:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579",
                              "id": 3961,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "5979:32:21",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_d3551e30d3095fd81287b88f7139bb09818e34280e85ee821994ebaebbed7072",
                                "typeString": "literal_string \"EnumerableMap: nonexistent key\""
                              },
                              "value": "EnumerableMap: nonexistent key"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_d3551e30d3095fd81287b88f7139bb09818e34280e85ee821994ebaebbed7072",
                                "typeString": "literal_string \"EnumerableMap: nonexistent key\""
                              }
                            ],
                            "id": 3957,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "5956:7:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 3962,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5956:56:21",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3963,
                        "nodeType": "ExpressionStatement",
                        "src": "5956:56:21"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 3964,
                                "name": "map",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3943,
                                "src": "6065:3:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                                  "typeString": "struct EnumerableMapUpgradeable.Map storage pointer"
                                }
                              },
                              "id": 3965,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_entries",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 3688,
                              "src": "6065:12:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_struct$_MapEntry_$3685_storage_$dyn_storage",
                                "typeString": "struct EnumerableMapUpgradeable.MapEntry storage ref[] storage ref"
                              }
                            },
                            "id": 3969,
                            "indexExpression": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 3968,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 3966,
                                "name": "keyIndex",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3951,
                                "src": "6078:8:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "-",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "31",
                                "id": 3967,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "6089:1:21",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_1_by_1",
                                  "typeString": "int_const 1"
                                },
                                "value": "1"
                              },
                              "src": "6078:12:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "6065:26:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_MapEntry_$3685_storage",
                              "typeString": "struct EnumerableMapUpgradeable.MapEntry storage ref"
                            }
                          },
                          "id": 3970,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "_value",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 3684,
                          "src": "6065:33:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "functionReturnParameters": 3949,
                        "id": 3971,
                        "nodeType": "Return",
                        "src": "6058:40:21"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3941,
                    "nodeType": "StructuredDocumentation",
                    "src": "5679:141:21",
                    "text": " @dev Returns the value associated with `key`.  O(1).\n Requirements:\n - `key` must be in the map."
                  },
                  "id": 3973,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_get",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3946,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3943,
                        "mutability": "mutable",
                        "name": "map",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3973,
                        "src": "5839:15:21",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                          "typeString": "struct EnumerableMapUpgradeable.Map"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 3942,
                          "name": "Map",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 3693,
                          "src": "5839:3:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                            "typeString": "struct EnumerableMapUpgradeable.Map"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3945,
                        "mutability": "mutable",
                        "name": "key",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3973,
                        "src": "5856:11:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 3944,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "5856:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5838:30:21"
                  },
                  "returnParameters": {
                    "id": 3949,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3948,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 3973,
                        "src": "5891:7:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 3947,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "5891:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5890:9:21"
                  },
                  "scope": 4237,
                  "src": "5825:307:21",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 4007,
                    "nodeType": "Block",
                    "src": "6517:212:21",
                    "statements": [
                      {
                        "assignments": [
                          3986
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 3986,
                            "mutability": "mutable",
                            "name": "keyIndex",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 4007,
                            "src": "6527:16:21",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 3985,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "6527:7:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 3991,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 3987,
                              "name": "map",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3976,
                              "src": "6546:3:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                                "typeString": "struct EnumerableMapUpgradeable.Map storage pointer"
                              }
                            },
                            "id": 3988,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "_indexes",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3692,
                            "src": "6546:12:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                              "typeString": "mapping(bytes32 => uint256)"
                            }
                          },
                          "id": 3990,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 3989,
                            "name": "key",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3978,
                            "src": "6559:3:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "6546:17:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "6527:36:21"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 3995,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 3993,
                                "name": "keyIndex",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3986,
                                "src": "6581:8:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 3994,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "6593:1:21",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "6581:13:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 3996,
                              "name": "errorMessage",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3980,
                              "src": "6596:12:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 3992,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "6573:7:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 3997,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6573:36:21",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 3998,
                        "nodeType": "ExpressionStatement",
                        "src": "6573:36:21"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 3999,
                                "name": "map",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3976,
                                "src": "6662:3:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                                  "typeString": "struct EnumerableMapUpgradeable.Map storage pointer"
                                }
                              },
                              "id": 4000,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_entries",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 3688,
                              "src": "6662:12:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_struct$_MapEntry_$3685_storage_$dyn_storage",
                                "typeString": "struct EnumerableMapUpgradeable.MapEntry storage ref[] storage ref"
                              }
                            },
                            "id": 4004,
                            "indexExpression": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 4003,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 4001,
                                "name": "keyIndex",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3986,
                                "src": "6675:8:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "-",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "31",
                                "id": 4002,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "6686:1:21",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_1_by_1",
                                  "typeString": "int_const 1"
                                },
                                "value": "1"
                              },
                              "src": "6675:12:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "6662:26:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_MapEntry_$3685_storage",
                              "typeString": "struct EnumerableMapUpgradeable.MapEntry storage ref"
                            }
                          },
                          "id": 4005,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "_value",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 3684,
                          "src": "6662:33:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "functionReturnParameters": 3984,
                        "id": 4006,
                        "nodeType": "Return",
                        "src": "6655:40:21"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 3974,
                    "nodeType": "StructuredDocumentation",
                    "src": "6138:271:21",
                    "text": " @dev Same as {_get}, with a custom error message when `key` is not in the map.\n CAUTION: This function is deprecated because it requires allocating memory for the error\n message unnecessarily. For custom revert reasons use {_tryGet}."
                  },
                  "id": 4008,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_get",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 3981,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3976,
                        "mutability": "mutable",
                        "name": "map",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4008,
                        "src": "6428:15:21",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                          "typeString": "struct EnumerableMapUpgradeable.Map"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 3975,
                          "name": "Map",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 3693,
                          "src": "6428:3:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                            "typeString": "struct EnumerableMapUpgradeable.Map"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3978,
                        "mutability": "mutable",
                        "name": "key",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4008,
                        "src": "6445:11:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 3977,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "6445:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 3980,
                        "mutability": "mutable",
                        "name": "errorMessage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4008,
                        "src": "6458:26:21",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 3979,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "6458:6:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6427:58:21"
                  },
                  "returnParameters": {
                    "id": 3984,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 3983,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4008,
                        "src": "6508:7:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 3982,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "6508:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6507:9:21"
                  },
                  "scope": 4237,
                  "src": "6414:315:21",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "private"
                },
                {
                  "canonicalName": "EnumerableMapUpgradeable.UintToAddressMap",
                  "id": 4011,
                  "members": [
                    {
                      "constant": false,
                      "id": 4010,
                      "mutability": "mutable",
                      "name": "_inner",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 4011,
                      "src": "6794:10:21",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                        "typeString": "struct EnumerableMapUpgradeable.Map"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 4009,
                        "name": "Map",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 3693,
                        "src": "6794:3:21",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Map_$3693_storage_ptr",
                          "typeString": "struct EnumerableMapUpgradeable.Map"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "UintToAddressMap",
                  "nodeType": "StructDefinition",
                  "scope": 4237,
                  "src": "6760:51:21",
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 4042,
                    "nodeType": "Block",
                    "src": "7133:88:21",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 4024,
                                "name": "map",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4014,
                                "src": "7155:3:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                                  "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap storage pointer"
                                }
                              },
                              "id": 4025,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_inner",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4010,
                              "src": "7155:10:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Map_$3693_storage",
                                "typeString": "struct EnumerableMapUpgradeable.Map storage ref"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 4028,
                                  "name": "key",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4016,
                                  "src": "7175:3:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 4027,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "7167:7:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_bytes32_$",
                                  "typeString": "type(bytes32)"
                                },
                                "typeName": {
                                  "id": 4026,
                                  "name": "bytes32",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "7167:7:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 4029,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7167:12:21",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 4036,
                                          "name": "value",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 4018,
                                          "src": "7205:5:21",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        ],
                                        "id": 4035,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "7197:7:21",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_uint160_$",
                                          "typeString": "type(uint160)"
                                        },
                                        "typeName": {
                                          "id": 4034,
                                          "name": "uint160",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "7197:7:21",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      },
                                      "id": 4037,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "7197:14:21",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint160",
                                        "typeString": "uint160"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint160",
                                        "typeString": "uint160"
                                      }
                                    ],
                                    "id": 4033,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "7189:7:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_uint256_$",
                                      "typeString": "type(uint256)"
                                    },
                                    "typeName": {
                                      "id": 4032,
                                      "name": "uint256",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "7189:7:21",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 4038,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "7189:23:21",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 4031,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "7181:7:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_bytes32_$",
                                  "typeString": "type(bytes32)"
                                },
                                "typeName": {
                                  "id": 4030,
                                  "name": "bytes32",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "7181:7:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 4039,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7181:32:21",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_Map_$3693_storage",
                                "typeString": "struct EnumerableMapUpgradeable.Map storage ref"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "id": 4023,
                            "name": "_set",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3755,
                            "src": "7150:4:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Map_$3693_storage_ptr_$_t_bytes32_$_t_bytes32_$returns$_t_bool_$",
                              "typeString": "function (struct EnumerableMapUpgradeable.Map storage pointer,bytes32,bytes32) returns (bool)"
                            }
                          },
                          "id": 4040,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7150:64:21",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 4022,
                        "id": 4041,
                        "nodeType": "Return",
                        "src": "7143:71:21"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4012,
                    "nodeType": "StructuredDocumentation",
                    "src": "6817:216:21",
                    "text": " @dev Adds a key-value pair to a map, or updates the value for an existing\n key. O(1).\n Returns true if the key was added to the map, that is if it was not\n already present."
                  },
                  "id": 4043,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "set",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4019,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4014,
                        "mutability": "mutable",
                        "name": "map",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4043,
                        "src": "7051:28:21",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                          "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4013,
                          "name": "UintToAddressMap",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4011,
                          "src": "7051:16:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                            "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4016,
                        "mutability": "mutable",
                        "name": "key",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4043,
                        "src": "7081:11:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4015,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7081:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4018,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4043,
                        "src": "7094:13:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 4017,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7094:7:21",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7050:58:21"
                  },
                  "returnParameters": {
                    "id": 4022,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4021,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4043,
                        "src": "7127:4:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 4020,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "7127:4:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7126:6:21"
                  },
                  "scope": 4237,
                  "src": "7038:183:21",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4062,
                    "nodeType": "Block",
                    "src": "7463:57:21",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 4054,
                                "name": "map",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4046,
                                "src": "7488:3:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                                  "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap storage pointer"
                                }
                              },
                              "id": 4055,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_inner",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4010,
                              "src": "7488:10:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Map_$3693_storage",
                                "typeString": "struct EnumerableMapUpgradeable.Map storage ref"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 4058,
                                  "name": "key",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4048,
                                  "src": "7508:3:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 4057,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "7500:7:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_bytes32_$",
                                  "typeString": "type(bytes32)"
                                },
                                "typeName": {
                                  "id": 4056,
                                  "name": "bytes32",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "7500:7:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 4059,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7500:12:21",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_Map_$3693_storage",
                                "typeString": "struct EnumerableMapUpgradeable.Map storage ref"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "id": 4053,
                            "name": "_remove",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3836,
                            "src": "7480:7:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Map_$3693_storage_ptr_$_t_bytes32_$returns$_t_bool_$",
                              "typeString": "function (struct EnumerableMapUpgradeable.Map storage pointer,bytes32) returns (bool)"
                            }
                          },
                          "id": 4060,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7480:33:21",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 4052,
                        "id": 4061,
                        "nodeType": "Return",
                        "src": "7473:40:21"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4044,
                    "nodeType": "StructuredDocumentation",
                    "src": "7227:148:21",
                    "text": " @dev Removes a value from a set. O(1).\n Returns true if the key was removed from the map, that is if it was present."
                  },
                  "id": 4063,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "remove",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4049,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4046,
                        "mutability": "mutable",
                        "name": "map",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4063,
                        "src": "7396:28:21",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                          "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4045,
                          "name": "UintToAddressMap",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4011,
                          "src": "7396:16:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                            "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4048,
                        "mutability": "mutable",
                        "name": "key",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4063,
                        "src": "7426:11:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4047,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7426:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7395:43:21"
                  },
                  "returnParameters": {
                    "id": 4052,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4051,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4063,
                        "src": "7457:4:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 4050,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "7457:4:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7456:6:21"
                  },
                  "scope": 4237,
                  "src": "7380:140:21",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4082,
                    "nodeType": "Block",
                    "src": "7689:59:21",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 4074,
                                "name": "map",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4066,
                                "src": "7716:3:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                                  "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap storage pointer"
                                }
                              },
                              "id": 4075,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_inner",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4010,
                              "src": "7716:10:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Map_$3693_storage",
                                "typeString": "struct EnumerableMapUpgradeable.Map storage ref"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 4078,
                                  "name": "key",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4068,
                                  "src": "7736:3:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 4077,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "7728:7:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_bytes32_$",
                                  "typeString": "type(bytes32)"
                                },
                                "typeName": {
                                  "id": 4076,
                                  "name": "bytes32",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "7728:7:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 4079,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7728:12:21",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_Map_$3693_storage",
                                "typeString": "struct EnumerableMapUpgradeable.Map storage ref"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "id": 4073,
                            "name": "_contains",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3854,
                            "src": "7706:9:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_Map_$3693_storage_ptr_$_t_bytes32_$returns$_t_bool_$",
                              "typeString": "function (struct EnumerableMapUpgradeable.Map storage pointer,bytes32) view returns (bool)"
                            }
                          },
                          "id": 4080,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7706:35:21",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 4072,
                        "id": 4081,
                        "nodeType": "Return",
                        "src": "7699:42:21"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4064,
                    "nodeType": "StructuredDocumentation",
                    "src": "7526:68:21",
                    "text": " @dev Returns true if the key is in the map. O(1)."
                  },
                  "id": 4083,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "contains",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4069,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4066,
                        "mutability": "mutable",
                        "name": "map",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4083,
                        "src": "7617:28:21",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                          "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4065,
                          "name": "UintToAddressMap",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4011,
                          "src": "7617:16:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                            "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4068,
                        "mutability": "mutable",
                        "name": "key",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4083,
                        "src": "7647:11:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4067,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7647:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7616:43:21"
                  },
                  "returnParameters": {
                    "id": 4072,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4071,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4083,
                        "src": "7683:4:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 4070,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "7683:4:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7682:6:21"
                  },
                  "scope": 4237,
                  "src": "7599:149:21",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4096,
                    "nodeType": "Block",
                    "src": "7909:43:21",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 4092,
                                "name": "map",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4086,
                                "src": "7934:3:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                                  "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap storage pointer"
                                }
                              },
                              "id": 4093,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_inner",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4010,
                              "src": "7934:10:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Map_$3693_storage",
                                "typeString": "struct EnumerableMapUpgradeable.Map storage ref"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_Map_$3693_storage",
                                "typeString": "struct EnumerableMapUpgradeable.Map storage ref"
                              }
                            ],
                            "id": 4091,
                            "name": "_length",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3867,
                            "src": "7926:7:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_Map_$3693_storage_ptr_$returns$_t_uint256_$",
                              "typeString": "function (struct EnumerableMapUpgradeable.Map storage pointer) view returns (uint256)"
                            }
                          },
                          "id": 4094,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7926:19:21",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 4090,
                        "id": 4095,
                        "nodeType": "Return",
                        "src": "7919:26:21"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4084,
                    "nodeType": "StructuredDocumentation",
                    "src": "7754:72:21",
                    "text": " @dev Returns the number of elements in the map. O(1)."
                  },
                  "id": 4097,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "length",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4087,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4086,
                        "mutability": "mutable",
                        "name": "map",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4097,
                        "src": "7847:28:21",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                          "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4085,
                          "name": "UintToAddressMap",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4011,
                          "src": "7847:16:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                            "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7846:30:21"
                  },
                  "returnParameters": {
                    "id": 4090,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4089,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4097,
                        "src": "7900:7:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4088,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7900:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7899:9:21"
                  },
                  "scope": 4237,
                  "src": "7831:121:21",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4135,
                    "nodeType": "Block",
                    "src": "8378:135:21",
                    "statements": [
                      {
                        "assignments": [
                          4110,
                          4112
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 4110,
                            "mutability": "mutable",
                            "name": "key",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 4135,
                            "src": "8389:11:21",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            "typeName": {
                              "id": 4109,
                              "name": "bytes32",
                              "nodeType": "ElementaryTypeName",
                              "src": "8389:7:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 4112,
                            "mutability": "mutable",
                            "name": "value",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 4135,
                            "src": "8402:13:21",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            "typeName": {
                              "id": 4111,
                              "name": "bytes32",
                              "nodeType": "ElementaryTypeName",
                              "src": "8402:7:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 4118,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 4114,
                                "name": "map",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4100,
                                "src": "8423:3:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                                  "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap storage pointer"
                                }
                              },
                              "id": 4115,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_inner",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4010,
                              "src": "8423:10:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Map_$3693_storage",
                                "typeString": "struct EnumerableMapUpgradeable.Map storage ref"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 4116,
                              "name": "index",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4102,
                              "src": "8435:5:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_Map_$3693_storage",
                                "typeString": "struct EnumerableMapUpgradeable.Map storage ref"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 4113,
                            "name": "_at",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3902,
                            "src": "8419:3:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_Map_$3693_storage_ptr_$_t_uint256_$returns$_t_bytes32_$_t_bytes32_$",
                              "typeString": "function (struct EnumerableMapUpgradeable.Map storage pointer,uint256) view returns (bytes32,bytes32)"
                            }
                          },
                          "id": 4117,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8419:22:21",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bytes32_$_t_bytes32_$",
                            "typeString": "tuple(bytes32,bytes32)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "8388:53:21"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 4121,
                                  "name": "key",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4110,
                                  "src": "8467:3:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                ],
                                "id": 4120,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "8459:7:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_uint256_$",
                                  "typeString": "type(uint256)"
                                },
                                "typeName": {
                                  "id": 4119,
                                  "name": "uint256",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "8459:7:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 4122,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "8459:12:21",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 4129,
                                          "name": "value",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 4112,
                                          "src": "8497:5:21",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                          }
                                        ],
                                        "id": 4128,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "8489:7:21",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_uint256_$",
                                          "typeString": "type(uint256)"
                                        },
                                        "typeName": {
                                          "id": 4127,
                                          "name": "uint256",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "8489:7:21",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      },
                                      "id": 4130,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "8489:14:21",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "id": 4126,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "8481:7:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_uint160_$",
                                      "typeString": "type(uint160)"
                                    },
                                    "typeName": {
                                      "id": 4125,
                                      "name": "uint160",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "8481:7:21",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 4131,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "8481:23:21",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint160",
                                    "typeString": "uint160"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint160",
                                    "typeString": "uint160"
                                  }
                                ],
                                "id": 4124,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "8473:7:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 4123,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "8473:7:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 4132,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "8473:32:21",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "id": 4133,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "8458:48:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_uint256_$_t_address_payable_$",
                            "typeString": "tuple(uint256,address payable)"
                          }
                        },
                        "functionReturnParameters": 4108,
                        "id": 4134,
                        "nodeType": "Return",
                        "src": "8451:55:21"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4098,
                    "nodeType": "StructuredDocumentation",
                    "src": "7957:318:21",
                    "text": " @dev Returns the element stored at position `index` in the set. O(1).\n Note that there are no guarantees on the ordering of values inside the\n array, and it may change when more values are added or removed.\n Requirements:\n - `index` must be strictly less than {length}."
                  },
                  "id": 4136,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "at",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4103,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4100,
                        "mutability": "mutable",
                        "name": "map",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4136,
                        "src": "8292:28:21",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                          "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4099,
                          "name": "UintToAddressMap",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4011,
                          "src": "8292:16:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                            "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4102,
                        "mutability": "mutable",
                        "name": "index",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4136,
                        "src": "8322:13:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4101,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "8322:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8291:45:21"
                  },
                  "returnParameters": {
                    "id": 4108,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4105,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4136,
                        "src": "8360:7:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4104,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "8360:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4107,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4136,
                        "src": "8369:7:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 4106,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8369:7:21",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8359:18:21"
                  },
                  "scope": 4237,
                  "src": "8280:233:21",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4174,
                    "nodeType": "Block",
                    "src": "8790:142:21",
                    "statements": [
                      {
                        "assignments": [
                          4149,
                          4151
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 4149,
                            "mutability": "mutable",
                            "name": "success",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 4174,
                            "src": "8801:12:21",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 4148,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "8801:4:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 4151,
                            "mutability": "mutable",
                            "name": "value",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 4174,
                            "src": "8815:13:21",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            "typeName": {
                              "id": 4150,
                              "name": "bytes32",
                              "nodeType": "ElementaryTypeName",
                              "src": "8815:7:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 4160,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 4153,
                                "name": "map",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4139,
                                "src": "8840:3:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                                  "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap storage pointer"
                                }
                              },
                              "id": 4154,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_inner",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4010,
                              "src": "8840:10:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Map_$3693_storage",
                                "typeString": "struct EnumerableMapUpgradeable.Map storage ref"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 4157,
                                  "name": "key",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4141,
                                  "src": "8860:3:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 4156,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "8852:7:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_bytes32_$",
                                  "typeString": "type(bytes32)"
                                },
                                "typeName": {
                                  "id": 4155,
                                  "name": "bytes32",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "8852:7:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 4158,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "8852:12:21",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_Map_$3693_storage",
                                "typeString": "struct EnumerableMapUpgradeable.Map storage ref"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "id": 4152,
                            "name": "_tryGet",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3940,
                            "src": "8832:7:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_Map_$3693_storage_ptr_$_t_bytes32_$returns$_t_bool_$_t_bytes32_$",
                              "typeString": "function (struct EnumerableMapUpgradeable.Map storage pointer,bytes32) view returns (bool,bytes32)"
                            }
                          },
                          "id": 4159,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8832:33:21",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes32_$",
                            "typeString": "tuple(bool,bytes32)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "8800:65:21"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "id": 4161,
                              "name": "success",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4149,
                              "src": "8883:7:21",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 4168,
                                          "name": "value",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 4151,
                                          "src": "8916:5:21",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                          }
                                        ],
                                        "id": 4167,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "8908:7:21",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_uint256_$",
                                          "typeString": "type(uint256)"
                                        },
                                        "typeName": {
                                          "id": 4166,
                                          "name": "uint256",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "8908:7:21",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      },
                                      "id": 4169,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "8908:14:21",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "id": 4165,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "8900:7:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_uint160_$",
                                      "typeString": "type(uint160)"
                                    },
                                    "typeName": {
                                      "id": 4164,
                                      "name": "uint160",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "8900:7:21",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 4170,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "8900:23:21",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint160",
                                    "typeString": "uint160"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint160",
                                    "typeString": "uint160"
                                  }
                                ],
                                "id": 4163,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "8892:7:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 4162,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "8892:7:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 4171,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "8892:32:21",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "id": 4172,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "8882:43:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_address_payable_$",
                            "typeString": "tuple(bool,address payable)"
                          }
                        },
                        "functionReturnParameters": 4147,
                        "id": 4173,
                        "nodeType": "Return",
                        "src": "8875:50:21"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4137,
                    "nodeType": "StructuredDocumentation",
                    "src": "8519:169:21",
                    "text": " @dev Tries to returns the value associated with `key`.  O(1).\n Does not revert if `key` is not in the map.\n _Available since v3.4._"
                  },
                  "id": 4175,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "tryGet",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4142,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4139,
                        "mutability": "mutable",
                        "name": "map",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4175,
                        "src": "8709:28:21",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                          "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4138,
                          "name": "UintToAddressMap",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4011,
                          "src": "8709:16:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                            "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4141,
                        "mutability": "mutable",
                        "name": "key",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4175,
                        "src": "8739:11:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4140,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "8739:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8708:43:21"
                  },
                  "returnParameters": {
                    "id": 4147,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4144,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4175,
                        "src": "8775:4:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 4143,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "8775:4:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4146,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4175,
                        "src": "8781:7:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 4145,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8781:7:21",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8774:15:21"
                  },
                  "scope": 4237,
                  "src": "8693:239:21",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4203,
                    "nodeType": "Block",
                    "src": "9172:81:21",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 4192,
                                            "name": "map",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 4178,
                                            "src": "9218:3:21",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                                              "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap storage pointer"
                                            }
                                          },
                                          "id": 4193,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "_inner",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 4010,
                                          "src": "9218:10:21",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_Map_$3693_storage",
                                            "typeString": "struct EnumerableMapUpgradeable.Map storage ref"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "id": 4196,
                                              "name": "key",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 4180,
                                              "src": "9238:3:21",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            ],
                                            "id": 4195,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "lValueRequested": false,
                                            "nodeType": "ElementaryTypeNameExpression",
                                            "src": "9230:7:21",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_bytes32_$",
                                              "typeString": "type(bytes32)"
                                            },
                                            "typeName": {
                                              "id": 4194,
                                              "name": "bytes32",
                                              "nodeType": "ElementaryTypeName",
                                              "src": "9230:7:21",
                                              "typeDescriptions": {
                                                "typeIdentifier": null,
                                                "typeString": null
                                              }
                                            }
                                          },
                                          "id": 4197,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "typeConversion",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "9230:12:21",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_struct$_Map_$3693_storage",
                                            "typeString": "struct EnumerableMapUpgradeable.Map storage ref"
                                          },
                                          {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                          }
                                        ],
                                        "id": 4191,
                                        "name": "_get",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [
                                          3973,
                                          4008
                                        ],
                                        "referencedDeclaration": 3973,
                                        "src": "9213:4:21",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_view$_t_struct$_Map_$3693_storage_ptr_$_t_bytes32_$returns$_t_bytes32_$",
                                          "typeString": "function (struct EnumerableMapUpgradeable.Map storage pointer,bytes32) view returns (bytes32)"
                                        }
                                      },
                                      "id": 4198,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "9213:30:21",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                      }
                                    ],
                                    "id": 4190,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "9205:7:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_uint256_$",
                                      "typeString": "type(uint256)"
                                    },
                                    "typeName": {
                                      "id": 4189,
                                      "name": "uint256",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "9205:7:21",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 4199,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "9205:39:21",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 4188,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "9197:7:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_uint160_$",
                                  "typeString": "type(uint160)"
                                },
                                "typeName": {
                                  "id": 4187,
                                  "name": "uint160",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "9197:7:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 4200,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "9197:48:21",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint160",
                                "typeString": "uint160"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint160",
                                "typeString": "uint160"
                              }
                            ],
                            "id": 4186,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "9189:7:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 4185,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "9189:7:21",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 4201,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9189:57:21",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "functionReturnParameters": 4184,
                        "id": 4202,
                        "nodeType": "Return",
                        "src": "9182:64:21"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4176,
                    "nodeType": "StructuredDocumentation",
                    "src": "8938:141:21",
                    "text": " @dev Returns the value associated with `key`.  O(1).\n Requirements:\n - `key` must be in the map."
                  },
                  "id": 4204,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "get",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4181,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4178,
                        "mutability": "mutable",
                        "name": "map",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4204,
                        "src": "9097:28:21",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                          "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4177,
                          "name": "UintToAddressMap",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4011,
                          "src": "9097:16:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                            "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4180,
                        "mutability": "mutable",
                        "name": "key",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4204,
                        "src": "9127:11:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4179,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "9127:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9096:43:21"
                  },
                  "returnParameters": {
                    "id": 4184,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4183,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4204,
                        "src": "9163:7:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 4182,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "9163:7:21",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9162:9:21"
                  },
                  "scope": 4237,
                  "src": "9084:169:21",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4235,
                    "nodeType": "Block",
                    "src": "9649:95:21",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 4223,
                                            "name": "map",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 4207,
                                            "src": "9695:3:21",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                                              "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap storage pointer"
                                            }
                                          },
                                          "id": 4224,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "_inner",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 4010,
                                          "src": "9695:10:21",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_Map_$3693_storage",
                                            "typeString": "struct EnumerableMapUpgradeable.Map storage ref"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "id": 4227,
                                              "name": "key",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 4209,
                                              "src": "9715:3:21",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            ],
                                            "id": 4226,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "lValueRequested": false,
                                            "nodeType": "ElementaryTypeNameExpression",
                                            "src": "9707:7:21",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_bytes32_$",
                                              "typeString": "type(bytes32)"
                                            },
                                            "typeName": {
                                              "id": 4225,
                                              "name": "bytes32",
                                              "nodeType": "ElementaryTypeName",
                                              "src": "9707:7:21",
                                              "typeDescriptions": {
                                                "typeIdentifier": null,
                                                "typeString": null
                                              }
                                            }
                                          },
                                          "id": 4228,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "typeConversion",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "9707:12:21",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 4229,
                                          "name": "errorMessage",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 4211,
                                          "src": "9721:12:21",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_string_memory_ptr",
                                            "typeString": "string memory"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_struct$_Map_$3693_storage",
                                            "typeString": "struct EnumerableMapUpgradeable.Map storage ref"
                                          },
                                          {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                          },
                                          {
                                            "typeIdentifier": "t_string_memory_ptr",
                                            "typeString": "string memory"
                                          }
                                        ],
                                        "id": 4222,
                                        "name": "_get",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [
                                          3973,
                                          4008
                                        ],
                                        "referencedDeclaration": 4008,
                                        "src": "9690:4:21",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_view$_t_struct$_Map_$3693_storage_ptr_$_t_bytes32_$_t_string_memory_ptr_$returns$_t_bytes32_$",
                                          "typeString": "function (struct EnumerableMapUpgradeable.Map storage pointer,bytes32,string memory) view returns (bytes32)"
                                        }
                                      },
                                      "id": 4230,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "9690:44:21",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                      }
                                    ],
                                    "id": 4221,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "9682:7:21",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_uint256_$",
                                      "typeString": "type(uint256)"
                                    },
                                    "typeName": {
                                      "id": 4220,
                                      "name": "uint256",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "9682:7:21",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 4231,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "9682:53:21",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 4219,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "9674:7:21",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_uint160_$",
                                  "typeString": "type(uint160)"
                                },
                                "typeName": {
                                  "id": 4218,
                                  "name": "uint160",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "9674:7:21",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 4232,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "9674:62:21",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint160",
                                "typeString": "uint160"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint160",
                                "typeString": "uint160"
                              }
                            ],
                            "id": 4217,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "9666:7:21",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 4216,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "9666:7:21",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 4233,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9666:71:21",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "functionReturnParameters": 4215,
                        "id": 4234,
                        "nodeType": "Return",
                        "src": "9659:78:21"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4205,
                    "nodeType": "StructuredDocumentation",
                    "src": "9259:269:21",
                    "text": " @dev Same as {get}, with a custom error message when `key` is not in the map.\n CAUTION: This function is deprecated because it requires allocating memory for the error\n message unnecessarily. For custom revert reasons use {tryGet}."
                  },
                  "id": 4236,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "get",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4212,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4207,
                        "mutability": "mutable",
                        "name": "map",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4236,
                        "src": "9546:28:21",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                          "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4206,
                          "name": "UintToAddressMap",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4011,
                          "src": "9546:16:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_UintToAddressMap_$4011_storage_ptr",
                            "typeString": "struct EnumerableMapUpgradeable.UintToAddressMap"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4209,
                        "mutability": "mutable",
                        "name": "key",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4236,
                        "src": "9576:11:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4208,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "9576:7:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4211,
                        "mutability": "mutable",
                        "name": "errorMessage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4236,
                        "src": "9589:26:21",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 4210,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "9589:6:21",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9545:71:21"
                  },
                  "returnParameters": {
                    "id": 4215,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4214,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4236,
                        "src": "9640:7:21",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 4213,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "9640:7:21",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9639:9:21"
                  },
                  "scope": 4237,
                  "src": "9533:211:21",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 4238,
              "src": "772:8974:21"
            }
          ],
          "src": "33:9714:21"
        },
        "id": 21
      },
      "@openzeppelin/contracts-upgradeable/utils/EnumerableSetUpgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/utils/EnumerableSetUpgradeable.sol",
          "exportedSymbols": {
            "EnumerableSetUpgradeable": [
              4729
            ]
          },
          "id": 4730,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 4239,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:22"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 4240,
                "nodeType": "StructuredDocumentation",
                "src": "66:686:22",
                "text": " @dev Library for managing\n https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\n types.\n Sets have the following properties:\n - Elements are added, removed, and checked for existence in constant time\n (O(1)).\n - Elements are enumerated in O(n). No guarantees are made on the ordering.\n ```\n contract Example {\n     // Add the library methods\n     using EnumerableSet for EnumerableSet.AddressSet;\n     // Declare a set state variable\n     EnumerableSet.AddressSet private mySet;\n }\n ```\n As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\n and `uint256` (`UintSet`) are supported."
              },
              "fullyImplemented": true,
              "id": 4729,
              "linearizedBaseContracts": [
                4729
              ],
              "name": "EnumerableSetUpgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "canonicalName": "EnumerableSetUpgradeable.Set",
                  "id": 4248,
                  "members": [
                    {
                      "constant": false,
                      "id": 4243,
                      "mutability": "mutable",
                      "name": "_values",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 4248,
                      "src": "1286:17:22",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_array$_t_bytes32_$dyn_storage_ptr",
                        "typeString": "bytes32[]"
                      },
                      "typeName": {
                        "baseType": {
                          "id": 4241,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "1286:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "id": 4242,
                        "length": null,
                        "nodeType": "ArrayTypeName",
                        "src": "1286:9:22",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_bytes32_$dyn_storage_ptr",
                          "typeString": "bytes32[]"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 4247,
                      "mutability": "mutable",
                      "name": "_indexes",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 4248,
                      "src": "1437:37:22",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                        "typeString": "mapping(bytes32 => uint256)"
                      },
                      "typeName": {
                        "id": 4246,
                        "keyType": {
                          "id": 4244,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "1446:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "nodeType": "Mapping",
                        "src": "1437:28:22",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                          "typeString": "mapping(bytes32 => uint256)"
                        },
                        "valueType": {
                          "id": 4245,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1457:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "Set",
                  "nodeType": "StructDefinition",
                  "scope": 4729,
                  "src": "1232:249:22",
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 4288,
                    "nodeType": "Block",
                    "src": "1720:335:22",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 4262,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "UnaryOperation",
                          "operator": "!",
                          "prefix": true,
                          "src": "1734:22:22",
                          "subExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 4259,
                                "name": "set",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4251,
                                "src": "1745:3:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                                  "typeString": "struct EnumerableSetUpgradeable.Set storage pointer"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 4260,
                                "name": "value",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4253,
                                "src": "1750:5:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                                  "typeString": "struct EnumerableSetUpgradeable.Set storage pointer"
                                },
                                {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              ],
                              "id": 4258,
                              "name": "_contains",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4387,
                              "src": "1735:9:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$_t_struct$_Set_$4248_storage_ptr_$_t_bytes32_$returns$_t_bool_$",
                                "typeString": "function (struct EnumerableSetUpgradeable.Set storage pointer,bytes32) view returns (bool)"
                              }
                            },
                            "id": 4261,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1735:21:22",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 4286,
                          "nodeType": "Block",
                          "src": "2012:37:22",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "66616c7365",
                                "id": 4284,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "2033:5:22",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "false"
                              },
                              "functionReturnParameters": 4257,
                              "id": 4285,
                              "nodeType": "Return",
                              "src": "2026:12:22"
                            }
                          ]
                        },
                        "id": 4287,
                        "nodeType": "IfStatement",
                        "src": "1730:319:22",
                        "trueBody": {
                          "id": 4283,
                          "nodeType": "Block",
                          "src": "1758:248:22",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 4268,
                                    "name": "value",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4253,
                                    "src": "1789:5:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 4263,
                                      "name": "set",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 4251,
                                      "src": "1772:3:22",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                                        "typeString": "struct EnumerableSetUpgradeable.Set storage pointer"
                                      }
                                    },
                                    "id": 4266,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "_values",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 4243,
                                    "src": "1772:11:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_bytes32_$dyn_storage",
                                      "typeString": "bytes32[] storage ref"
                                    }
                                  },
                                  "id": 4267,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "push",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "1772:16:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_arraypush_nonpayable$_t_bytes32_$returns$__$",
                                    "typeString": "function (bytes32)"
                                  }
                                },
                                "id": 4269,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "1772:23:22",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 4270,
                              "nodeType": "ExpressionStatement",
                              "src": "1772:23:22"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 4279,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 4271,
                                      "name": "set",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 4251,
                                      "src": "1930:3:22",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                                        "typeString": "struct EnumerableSetUpgradeable.Set storage pointer"
                                      }
                                    },
                                    "id": 4274,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "_indexes",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 4247,
                                    "src": "1930:12:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                                      "typeString": "mapping(bytes32 => uint256)"
                                    }
                                  },
                                  "id": 4275,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 4273,
                                    "name": "value",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4253,
                                    "src": "1943:5:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "1930:19:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 4276,
                                      "name": "set",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 4251,
                                      "src": "1952:3:22",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                                        "typeString": "struct EnumerableSetUpgradeable.Set storage pointer"
                                      }
                                    },
                                    "id": 4277,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "_values",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 4243,
                                    "src": "1952:11:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_bytes32_$dyn_storage",
                                      "typeString": "bytes32[] storage ref"
                                    }
                                  },
                                  "id": 4278,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "length",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "1952:18:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "1930:40:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 4280,
                              "nodeType": "ExpressionStatement",
                              "src": "1930:40:22"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "74727565",
                                "id": 4281,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "1991:4:22",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "true"
                              },
                              "functionReturnParameters": 4257,
                              "id": 4282,
                              "nodeType": "Return",
                              "src": "1984:11:22"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4249,
                    "nodeType": "StructuredDocumentation",
                    "src": "1487:159:22",
                    "text": " @dev Add a value to a set. O(1).\n Returns true if the value was added to the set, that is if it was not\n already present."
                  },
                  "id": 4289,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_add",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4254,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4251,
                        "mutability": "mutable",
                        "name": "set",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4289,
                        "src": "1665:15:22",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                          "typeString": "struct EnumerableSetUpgradeable.Set"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4250,
                          "name": "Set",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4248,
                          "src": "1665:3:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                            "typeString": "struct EnumerableSetUpgradeable.Set"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4253,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4289,
                        "src": "1682:13:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 4252,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "1682:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1664:32:22"
                  },
                  "returnParameters": {
                    "id": 4257,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4256,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4289,
                        "src": "1714:4:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 4255,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "1714:4:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1713:6:22"
                  },
                  "scope": 4729,
                  "src": "1651:404:22",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 4368,
                    "nodeType": "Block",
                    "src": "2295:1440:22",
                    "statements": [
                      {
                        "assignments": [
                          4300
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 4300,
                            "mutability": "mutable",
                            "name": "valueIndex",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 4368,
                            "src": "2405:18:22",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 4299,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "2405:7:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 4305,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 4301,
                              "name": "set",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4292,
                              "src": "2426:3:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage pointer"
                              }
                            },
                            "id": 4302,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "_indexes",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 4247,
                            "src": "2426:12:22",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                              "typeString": "mapping(bytes32 => uint256)"
                            }
                          },
                          "id": 4304,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 4303,
                            "name": "value",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4294,
                            "src": "2439:5:22",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "2426:19:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2405:40:22"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 4308,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 4306,
                            "name": "valueIndex",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4300,
                            "src": "2460:10:22",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 4307,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "2474:1:22",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "2460:15:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 4366,
                          "nodeType": "Block",
                          "src": "3692:37:22",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "66616c7365",
                                "id": 4364,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "3713:5:22",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "false"
                              },
                              "functionReturnParameters": 4298,
                              "id": 4365,
                              "nodeType": "Return",
                              "src": "3706:12:22"
                            }
                          ]
                        },
                        "id": 4367,
                        "nodeType": "IfStatement",
                        "src": "2456:1273:22",
                        "trueBody": {
                          "id": 4363,
                          "nodeType": "Block",
                          "src": "2477:1209:22",
                          "statements": [
                            {
                              "assignments": [
                                4310
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 4310,
                                  "mutability": "mutable",
                                  "name": "toDeleteIndex",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 4363,
                                  "src": "2817:21:22",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 4309,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2817:7:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 4314,
                              "initialValue": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 4313,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 4311,
                                  "name": "valueIndex",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4300,
                                  "src": "2841:10:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "-",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "31",
                                  "id": 4312,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "2854:1:22",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_1_by_1",
                                    "typeString": "int_const 1"
                                  },
                                  "value": "1"
                                },
                                "src": "2841:14:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "2817:38:22"
                            },
                            {
                              "assignments": [
                                4316
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 4316,
                                  "mutability": "mutable",
                                  "name": "lastIndex",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 4363,
                                  "src": "2869:17:22",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 4315,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2869:7:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 4322,
                              "initialValue": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 4321,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 4317,
                                      "name": "set",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 4292,
                                      "src": "2889:3:22",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                                        "typeString": "struct EnumerableSetUpgradeable.Set storage pointer"
                                      }
                                    },
                                    "id": 4318,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "_values",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 4243,
                                    "src": "2889:11:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_bytes32_$dyn_storage",
                                      "typeString": "bytes32[] storage ref"
                                    }
                                  },
                                  "id": 4319,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "length",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "2889:18:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "-",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "31",
                                  "id": 4320,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "2910:1:22",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_1_by_1",
                                    "typeString": "int_const 1"
                                  },
                                  "value": "1"
                                },
                                "src": "2889:22:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "2869:42:22"
                            },
                            {
                              "assignments": [
                                4324
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 4324,
                                  "mutability": "mutable",
                                  "name": "lastvalue",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 4363,
                                  "src": "3151:17:22",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  "typeName": {
                                    "id": 4323,
                                    "name": "bytes32",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "3151:7:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 4329,
                              "initialValue": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 4325,
                                    "name": "set",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4292,
                                    "src": "3171:3:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                                      "typeString": "struct EnumerableSetUpgradeable.Set storage pointer"
                                    }
                                  },
                                  "id": 4326,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "_values",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 4243,
                                  "src": "3171:11:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_bytes32_$dyn_storage",
                                    "typeString": "bytes32[] storage ref"
                                  }
                                },
                                "id": 4328,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 4327,
                                  "name": "lastIndex",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4316,
                                  "src": "3183:9:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "3171:22:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "3151:42:22"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 4336,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 4330,
                                      "name": "set",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 4292,
                                      "src": "3285:3:22",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                                        "typeString": "struct EnumerableSetUpgradeable.Set storage pointer"
                                      }
                                    },
                                    "id": 4333,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "_values",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 4243,
                                    "src": "3285:11:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_bytes32_$dyn_storage",
                                      "typeString": "bytes32[] storage ref"
                                    }
                                  },
                                  "id": 4334,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 4332,
                                    "name": "toDeleteIndex",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4310,
                                    "src": "3297:13:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "3285:26:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 4335,
                                  "name": "lastvalue",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4324,
                                  "src": "3314:9:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                "src": "3285:38:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "id": 4337,
                              "nodeType": "ExpressionStatement",
                              "src": "3285:38:22"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 4346,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 4338,
                                      "name": "set",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 4292,
                                      "src": "3389:3:22",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                                        "typeString": "struct EnumerableSetUpgradeable.Set storage pointer"
                                      }
                                    },
                                    "id": 4341,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "_indexes",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 4247,
                                    "src": "3389:12:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                                      "typeString": "mapping(bytes32 => uint256)"
                                    }
                                  },
                                  "id": 4342,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 4340,
                                    "name": "lastvalue",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4324,
                                    "src": "3402:9:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "3389:23:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 4345,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 4343,
                                    "name": "toDeleteIndex",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4310,
                                    "src": "3415:13:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "+",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "31",
                                    "id": 4344,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "3431:1:22",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_1_by_1",
                                      "typeString": "int_const 1"
                                    },
                                    "value": "1"
                                  },
                                  "src": "3415:17:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "3389:43:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 4347,
                              "nodeType": "ExpressionStatement",
                              "src": "3389:43:22"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 4348,
                                      "name": "set",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 4292,
                                      "src": "3538:3:22",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                                        "typeString": "struct EnumerableSetUpgradeable.Set storage pointer"
                                      }
                                    },
                                    "id": 4351,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "_values",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 4243,
                                    "src": "3538:11:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_bytes32_$dyn_storage",
                                      "typeString": "bytes32[] storage ref"
                                    }
                                  },
                                  "id": 4352,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "pop",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "3538:15:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_arraypop_nonpayable$__$returns$__$",
                                    "typeString": "function ()"
                                  }
                                },
                                "id": 4353,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "3538:17:22",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 4354,
                              "nodeType": "ExpressionStatement",
                              "src": "3538:17:22"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 4359,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "UnaryOperation",
                                "operator": "delete",
                                "prefix": true,
                                "src": "3623:26:22",
                                "subExpression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 4355,
                                      "name": "set",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 4292,
                                      "src": "3630:3:22",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                                        "typeString": "struct EnumerableSetUpgradeable.Set storage pointer"
                                      }
                                    },
                                    "id": 4356,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "_indexes",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 4247,
                                    "src": "3630:12:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                                      "typeString": "mapping(bytes32 => uint256)"
                                    }
                                  },
                                  "id": 4358,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 4357,
                                    "name": "value",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4294,
                                    "src": "3643:5:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "3630:19:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 4360,
                              "nodeType": "ExpressionStatement",
                              "src": "3623:26:22"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "74727565",
                                "id": 4361,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "3671:4:22",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "true"
                              },
                              "functionReturnParameters": 4298,
                              "id": 4362,
                              "nodeType": "Return",
                              "src": "3664:11:22"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4290,
                    "nodeType": "StructuredDocumentation",
                    "src": "2061:157:22",
                    "text": " @dev Removes a value from a set. O(1).\n Returns true if the value was removed from the set, that is if it was\n present."
                  },
                  "id": 4369,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_remove",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4295,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4292,
                        "mutability": "mutable",
                        "name": "set",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4369,
                        "src": "2240:15:22",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                          "typeString": "struct EnumerableSetUpgradeable.Set"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4291,
                          "name": "Set",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4248,
                          "src": "2240:3:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                            "typeString": "struct EnumerableSetUpgradeable.Set"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4294,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4369,
                        "src": "2257:13:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 4293,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "2257:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2239:32:22"
                  },
                  "returnParameters": {
                    "id": 4298,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4297,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4369,
                        "src": "2289:4:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 4296,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "2289:4:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2288:6:22"
                  },
                  "scope": 4729,
                  "src": "2223:1512:22",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 4386,
                    "nodeType": "Block",
                    "src": "3895:48:22",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 4384,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 4379,
                                "name": "set",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4372,
                                "src": "3912:3:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                                  "typeString": "struct EnumerableSetUpgradeable.Set storage pointer"
                                }
                              },
                              "id": 4380,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_indexes",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4247,
                              "src": "3912:12:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                                "typeString": "mapping(bytes32 => uint256)"
                              }
                            },
                            "id": 4382,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 4381,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4374,
                              "src": "3925:5:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "3912:19:22",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 4383,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "3935:1:22",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "3912:24:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 4378,
                        "id": 4385,
                        "nodeType": "Return",
                        "src": "3905:31:22"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4370,
                    "nodeType": "StructuredDocumentation",
                    "src": "3741:70:22",
                    "text": " @dev Returns true if the value is in the set. O(1)."
                  },
                  "id": 4387,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_contains",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4375,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4372,
                        "mutability": "mutable",
                        "name": "set",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4387,
                        "src": "3835:15:22",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                          "typeString": "struct EnumerableSetUpgradeable.Set"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4371,
                          "name": "Set",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4248,
                          "src": "3835:3:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                            "typeString": "struct EnumerableSetUpgradeable.Set"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4374,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4387,
                        "src": "3852:13:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 4373,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "3852:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3834:32:22"
                  },
                  "returnParameters": {
                    "id": 4378,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4377,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4387,
                        "src": "3889:4:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 4376,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "3889:4:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3888:6:22"
                  },
                  "scope": 4729,
                  "src": "3816:127:22",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 4399,
                    "nodeType": "Block",
                    "src": "4089:42:22",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 4395,
                              "name": "set",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4390,
                              "src": "4106:3:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage pointer"
                              }
                            },
                            "id": 4396,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "_values",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 4243,
                            "src": "4106:11:22",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_bytes32_$dyn_storage",
                              "typeString": "bytes32[] storage ref"
                            }
                          },
                          "id": 4397,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "4106:18:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 4394,
                        "id": 4398,
                        "nodeType": "Return",
                        "src": "4099:25:22"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4388,
                    "nodeType": "StructuredDocumentation",
                    "src": "3949:70:22",
                    "text": " @dev Returns the number of values on the set. O(1)."
                  },
                  "id": 4400,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_length",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4391,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4390,
                        "mutability": "mutable",
                        "name": "set",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4400,
                        "src": "4041:15:22",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                          "typeString": "struct EnumerableSetUpgradeable.Set"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4389,
                          "name": "Set",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4248,
                          "src": "4041:3:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                            "typeString": "struct EnumerableSetUpgradeable.Set"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4040:17:22"
                  },
                  "returnParameters": {
                    "id": 4394,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4393,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4400,
                        "src": "4080:7:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4392,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4080:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4079:9:22"
                  },
                  "scope": 4729,
                  "src": "4024:107:22",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 4424,
                    "nodeType": "Block",
                    "src": "4539:125:22",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 4415,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 4411,
                                    "name": "set",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4403,
                                    "src": "4557:3:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                                      "typeString": "struct EnumerableSetUpgradeable.Set storage pointer"
                                    }
                                  },
                                  "id": 4412,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "_values",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 4243,
                                  "src": "4557:11:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_bytes32_$dyn_storage",
                                    "typeString": "bytes32[] storage ref"
                                  }
                                },
                                "id": 4413,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "length",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "4557:18:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 4414,
                                "name": "index",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4405,
                                "src": "4578:5:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "4557:26:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473",
                              "id": 4416,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "4585:36:22",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_045d6834e6193a687012a3ad777f612279e549b6945364d9d2324f48610d3cbb",
                                "typeString": "literal_string \"EnumerableSet: index out of bounds\""
                              },
                              "value": "EnumerableSet: index out of bounds"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_045d6834e6193a687012a3ad777f612279e549b6945364d9d2324f48610d3cbb",
                                "typeString": "literal_string \"EnumerableSet: index out of bounds\""
                              }
                            ],
                            "id": 4410,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "4549:7:22",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 4417,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4549:73:22",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 4418,
                        "nodeType": "ExpressionStatement",
                        "src": "4549:73:22"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 4419,
                              "name": "set",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4403,
                              "src": "4639:3:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage pointer"
                              }
                            },
                            "id": 4420,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "_values",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 4243,
                            "src": "4639:11:22",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_bytes32_$dyn_storage",
                              "typeString": "bytes32[] storage ref"
                            }
                          },
                          "id": 4422,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 4421,
                            "name": "index",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4405,
                            "src": "4651:5:22",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "4639:18:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "functionReturnParameters": 4409,
                        "id": 4423,
                        "nodeType": "Return",
                        "src": "4632:25:22"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4401,
                    "nodeType": "StructuredDocumentation",
                    "src": "4136:322:22",
                    "text": " @dev Returns the value stored at position `index` in the set. O(1).\n Note that there are no guarantees on the ordering of values inside the\n array, and it may change when more values are added or removed.\n Requirements:\n - `index` must be strictly less than {length}."
                  },
                  "id": 4425,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_at",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4406,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4403,
                        "mutability": "mutable",
                        "name": "set",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4425,
                        "src": "4476:15:22",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                          "typeString": "struct EnumerableSetUpgradeable.Set"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4402,
                          "name": "Set",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4248,
                          "src": "4476:3:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                            "typeString": "struct EnumerableSetUpgradeable.Set"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4405,
                        "mutability": "mutable",
                        "name": "index",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4425,
                        "src": "4493:13:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4404,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4493:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4475:32:22"
                  },
                  "returnParameters": {
                    "id": 4409,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4408,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4425,
                        "src": "4530:7:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 4407,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "4530:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4529:9:22"
                  },
                  "scope": 4729,
                  "src": "4463:201:22",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "private"
                },
                {
                  "canonicalName": "EnumerableSetUpgradeable.Bytes32Set",
                  "id": 4428,
                  "members": [
                    {
                      "constant": false,
                      "id": 4427,
                      "mutability": "mutable",
                      "name": "_inner",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 4428,
                      "src": "4717:10:22",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                        "typeString": "struct EnumerableSetUpgradeable.Set"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 4426,
                        "name": "Set",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 4248,
                        "src": "4717:3:22",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                          "typeString": "struct EnumerableSetUpgradeable.Set"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "Bytes32Set",
                  "nodeType": "StructDefinition",
                  "scope": 4729,
                  "src": "4689:45:22",
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 4444,
                    "nodeType": "Block",
                    "src": "4980:47:22",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 4439,
                                "name": "set",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4431,
                                "src": "5002:3:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Bytes32Set_$4428_storage_ptr",
                                  "typeString": "struct EnumerableSetUpgradeable.Bytes32Set storage pointer"
                                }
                              },
                              "id": 4440,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_inner",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4427,
                              "src": "5002:10:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 4441,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4433,
                              "src": "5014:5:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "id": 4438,
                            "name": "_add",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4289,
                            "src": "4997:4:22",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Set_$4248_storage_ptr_$_t_bytes32_$returns$_t_bool_$",
                              "typeString": "function (struct EnumerableSetUpgradeable.Set storage pointer,bytes32) returns (bool)"
                            }
                          },
                          "id": 4442,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4997:23:22",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 4437,
                        "id": 4443,
                        "nodeType": "Return",
                        "src": "4990:30:22"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4429,
                    "nodeType": "StructuredDocumentation",
                    "src": "4740:159:22",
                    "text": " @dev Add a value to a set. O(1).\n Returns true if the value was added to the set, that is if it was not\n already present."
                  },
                  "id": 4445,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "add",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4434,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4431,
                        "mutability": "mutable",
                        "name": "set",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4445,
                        "src": "4917:22:22",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Bytes32Set_$4428_storage_ptr",
                          "typeString": "struct EnumerableSetUpgradeable.Bytes32Set"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4430,
                          "name": "Bytes32Set",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4428,
                          "src": "4917:10:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Bytes32Set_$4428_storage_ptr",
                            "typeString": "struct EnumerableSetUpgradeable.Bytes32Set"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4433,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4445,
                        "src": "4941:13:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 4432,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "4941:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4916:39:22"
                  },
                  "returnParameters": {
                    "id": 4437,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4436,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4445,
                        "src": "4974:4:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 4435,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "4974:4:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4973:6:22"
                  },
                  "scope": 4729,
                  "src": "4904:123:22",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4461,
                    "nodeType": "Block",
                    "src": "5274:50:22",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 4456,
                                "name": "set",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4448,
                                "src": "5299:3:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Bytes32Set_$4428_storage_ptr",
                                  "typeString": "struct EnumerableSetUpgradeable.Bytes32Set storage pointer"
                                }
                              },
                              "id": 4457,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_inner",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4427,
                              "src": "5299:10:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 4458,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4450,
                              "src": "5311:5:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "id": 4455,
                            "name": "_remove",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4369,
                            "src": "5291:7:22",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Set_$4248_storage_ptr_$_t_bytes32_$returns$_t_bool_$",
                              "typeString": "function (struct EnumerableSetUpgradeable.Set storage pointer,bytes32) returns (bool)"
                            }
                          },
                          "id": 4459,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5291:26:22",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 4454,
                        "id": 4460,
                        "nodeType": "Return",
                        "src": "5284:33:22"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4446,
                    "nodeType": "StructuredDocumentation",
                    "src": "5033:157:22",
                    "text": " @dev Removes a value from a set. O(1).\n Returns true if the value was removed from the set, that is if it was\n present."
                  },
                  "id": 4462,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "remove",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4451,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4448,
                        "mutability": "mutable",
                        "name": "set",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4462,
                        "src": "5211:22:22",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Bytes32Set_$4428_storage_ptr",
                          "typeString": "struct EnumerableSetUpgradeable.Bytes32Set"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4447,
                          "name": "Bytes32Set",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4428,
                          "src": "5211:10:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Bytes32Set_$4428_storage_ptr",
                            "typeString": "struct EnumerableSetUpgradeable.Bytes32Set"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4450,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4462,
                        "src": "5235:13:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 4449,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "5235:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5210:39:22"
                  },
                  "returnParameters": {
                    "id": 4454,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4453,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4462,
                        "src": "5268:4:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 4452,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "5268:4:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5267:6:22"
                  },
                  "scope": 4729,
                  "src": "5195:129:22",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4478,
                    "nodeType": "Block",
                    "src": "5491:52:22",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 4473,
                                "name": "set",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4465,
                                "src": "5518:3:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Bytes32Set_$4428_storage_ptr",
                                  "typeString": "struct EnumerableSetUpgradeable.Bytes32Set storage pointer"
                                }
                              },
                              "id": 4474,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_inner",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4427,
                              "src": "5518:10:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 4475,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4467,
                              "src": "5530:5:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "id": 4472,
                            "name": "_contains",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4387,
                            "src": "5508:9:22",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_Set_$4248_storage_ptr_$_t_bytes32_$returns$_t_bool_$",
                              "typeString": "function (struct EnumerableSetUpgradeable.Set storage pointer,bytes32) view returns (bool)"
                            }
                          },
                          "id": 4476,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5508:28:22",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 4471,
                        "id": 4477,
                        "nodeType": "Return",
                        "src": "5501:35:22"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4463,
                    "nodeType": "StructuredDocumentation",
                    "src": "5330:70:22",
                    "text": " @dev Returns true if the value is in the set. O(1)."
                  },
                  "id": 4479,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "contains",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4468,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4465,
                        "mutability": "mutable",
                        "name": "set",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4479,
                        "src": "5423:22:22",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Bytes32Set_$4428_storage_ptr",
                          "typeString": "struct EnumerableSetUpgradeable.Bytes32Set"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4464,
                          "name": "Bytes32Set",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4428,
                          "src": "5423:10:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Bytes32Set_$4428_storage_ptr",
                            "typeString": "struct EnumerableSetUpgradeable.Bytes32Set"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4467,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4479,
                        "src": "5447:13:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 4466,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "5447:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5422:39:22"
                  },
                  "returnParameters": {
                    "id": 4471,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4470,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4479,
                        "src": "5485:4:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 4469,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "5485:4:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5484:6:22"
                  },
                  "scope": 4729,
                  "src": "5405:138:22",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4492,
                    "nodeType": "Block",
                    "src": "5696:43:22",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 4488,
                                "name": "set",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4482,
                                "src": "5721:3:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Bytes32Set_$4428_storage_ptr",
                                  "typeString": "struct EnumerableSetUpgradeable.Bytes32Set storage pointer"
                                }
                              },
                              "id": 4489,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_inner",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4427,
                              "src": "5721:10:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              }
                            ],
                            "id": 4487,
                            "name": "_length",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4400,
                            "src": "5713:7:22",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_Set_$4248_storage_ptr_$returns$_t_uint256_$",
                              "typeString": "function (struct EnumerableSetUpgradeable.Set storage pointer) view returns (uint256)"
                            }
                          },
                          "id": 4490,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5713:19:22",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 4486,
                        "id": 4491,
                        "nodeType": "Return",
                        "src": "5706:26:22"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4480,
                    "nodeType": "StructuredDocumentation",
                    "src": "5549:70:22",
                    "text": " @dev Returns the number of values in the set. O(1)."
                  },
                  "id": 4493,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "length",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4483,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4482,
                        "mutability": "mutable",
                        "name": "set",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4493,
                        "src": "5640:22:22",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Bytes32Set_$4428_storage_ptr",
                          "typeString": "struct EnumerableSetUpgradeable.Bytes32Set"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4481,
                          "name": "Bytes32Set",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4428,
                          "src": "5640:10:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Bytes32Set_$4428_storage_ptr",
                            "typeString": "struct EnumerableSetUpgradeable.Bytes32Set"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5639:24:22"
                  },
                  "returnParameters": {
                    "id": 4486,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4485,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4493,
                        "src": "5687:7:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4484,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5687:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5686:9:22"
                  },
                  "scope": 4729,
                  "src": "5624:115:22",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4509,
                    "nodeType": "Block",
                    "src": "6154:46:22",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 4504,
                                "name": "set",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4496,
                                "src": "6175:3:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Bytes32Set_$4428_storage_ptr",
                                  "typeString": "struct EnumerableSetUpgradeable.Bytes32Set storage pointer"
                                }
                              },
                              "id": 4505,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_inner",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4427,
                              "src": "6175:10:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 4506,
                              "name": "index",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4498,
                              "src": "6187:5:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 4503,
                            "name": "_at",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4425,
                            "src": "6171:3:22",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_Set_$4248_storage_ptr_$_t_uint256_$returns$_t_bytes32_$",
                              "typeString": "function (struct EnumerableSetUpgradeable.Set storage pointer,uint256) view returns (bytes32)"
                            }
                          },
                          "id": 4507,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6171:22:22",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "functionReturnParameters": 4502,
                        "id": 4508,
                        "nodeType": "Return",
                        "src": "6164:29:22"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4494,
                    "nodeType": "StructuredDocumentation",
                    "src": "5744:322:22",
                    "text": " @dev Returns the value stored at position `index` in the set. O(1).\n Note that there are no guarantees on the ordering of values inside the\n array, and it may change when more values are added or removed.\n Requirements:\n - `index` must be strictly less than {length}."
                  },
                  "id": 4510,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "at",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4499,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4496,
                        "mutability": "mutable",
                        "name": "set",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4510,
                        "src": "6083:22:22",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Bytes32Set_$4428_storage_ptr",
                          "typeString": "struct EnumerableSetUpgradeable.Bytes32Set"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4495,
                          "name": "Bytes32Set",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4428,
                          "src": "6083:10:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Bytes32Set_$4428_storage_ptr",
                            "typeString": "struct EnumerableSetUpgradeable.Bytes32Set"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4498,
                        "mutability": "mutable",
                        "name": "index",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4510,
                        "src": "6107:13:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4497,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6107:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6082:39:22"
                  },
                  "returnParameters": {
                    "id": 4502,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4501,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4510,
                        "src": "6145:7:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 4500,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "6145:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6144:9:22"
                  },
                  "scope": 4729,
                  "src": "6071:129:22",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "canonicalName": "EnumerableSetUpgradeable.AddressSet",
                  "id": 4513,
                  "members": [
                    {
                      "constant": false,
                      "id": 4512,
                      "mutability": "mutable",
                      "name": "_inner",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 4513,
                      "src": "6253:10:22",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                        "typeString": "struct EnumerableSetUpgradeable.Set"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 4511,
                        "name": "Set",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 4248,
                        "src": "6253:3:22",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                          "typeString": "struct EnumerableSetUpgradeable.Set"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "AddressSet",
                  "nodeType": "StructDefinition",
                  "scope": 4729,
                  "src": "6225:45:22",
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 4538,
                    "nodeType": "Block",
                    "src": "6516:74:22",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 4524,
                                "name": "set",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4516,
                                "src": "6538:3:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_AddressSet_$4513_storage_ptr",
                                  "typeString": "struct EnumerableSetUpgradeable.AddressSet storage pointer"
                                }
                              },
                              "id": 4525,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_inner",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4512,
                              "src": "6538:10:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 4532,
                                          "name": "value",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 4518,
                                          "src": "6574:5:22",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        ],
                                        "id": 4531,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "6566:7:22",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_uint160_$",
                                          "typeString": "type(uint160)"
                                        },
                                        "typeName": {
                                          "id": 4530,
                                          "name": "uint160",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "6566:7:22",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      },
                                      "id": 4533,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "6566:14:22",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint160",
                                        "typeString": "uint160"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint160",
                                        "typeString": "uint160"
                                      }
                                    ],
                                    "id": 4529,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "6558:7:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_uint256_$",
                                      "typeString": "type(uint256)"
                                    },
                                    "typeName": {
                                      "id": 4528,
                                      "name": "uint256",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "6558:7:22",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 4534,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "6558:23:22",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 4527,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "6550:7:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_bytes32_$",
                                  "typeString": "type(bytes32)"
                                },
                                "typeName": {
                                  "id": 4526,
                                  "name": "bytes32",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "6550:7:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 4535,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6550:32:22",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "id": 4523,
                            "name": "_add",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4289,
                            "src": "6533:4:22",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Set_$4248_storage_ptr_$_t_bytes32_$returns$_t_bool_$",
                              "typeString": "function (struct EnumerableSetUpgradeable.Set storage pointer,bytes32) returns (bool)"
                            }
                          },
                          "id": 4536,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6533:50:22",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 4522,
                        "id": 4537,
                        "nodeType": "Return",
                        "src": "6526:57:22"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4514,
                    "nodeType": "StructuredDocumentation",
                    "src": "6276:159:22",
                    "text": " @dev Add a value to a set. O(1).\n Returns true if the value was added to the set, that is if it was not\n already present."
                  },
                  "id": 4539,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "add",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4519,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4516,
                        "mutability": "mutable",
                        "name": "set",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4539,
                        "src": "6453:22:22",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_AddressSet_$4513_storage_ptr",
                          "typeString": "struct EnumerableSetUpgradeable.AddressSet"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4515,
                          "name": "AddressSet",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4513,
                          "src": "6453:10:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_AddressSet_$4513_storage_ptr",
                            "typeString": "struct EnumerableSetUpgradeable.AddressSet"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4518,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4539,
                        "src": "6477:13:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 4517,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6477:7:22",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6452:39:22"
                  },
                  "returnParameters": {
                    "id": 4522,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4521,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4539,
                        "src": "6510:4:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 4520,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "6510:4:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6509:6:22"
                  },
                  "scope": 4729,
                  "src": "6440:150:22",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4564,
                    "nodeType": "Block",
                    "src": "6837:77:22",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 4550,
                                "name": "set",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4542,
                                "src": "6862:3:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_AddressSet_$4513_storage_ptr",
                                  "typeString": "struct EnumerableSetUpgradeable.AddressSet storage pointer"
                                }
                              },
                              "id": 4551,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_inner",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4512,
                              "src": "6862:10:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 4558,
                                          "name": "value",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 4544,
                                          "src": "6898:5:22",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        ],
                                        "id": 4557,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "6890:7:22",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_uint160_$",
                                          "typeString": "type(uint160)"
                                        },
                                        "typeName": {
                                          "id": 4556,
                                          "name": "uint160",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "6890:7:22",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      },
                                      "id": 4559,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "6890:14:22",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint160",
                                        "typeString": "uint160"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint160",
                                        "typeString": "uint160"
                                      }
                                    ],
                                    "id": 4555,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "6882:7:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_uint256_$",
                                      "typeString": "type(uint256)"
                                    },
                                    "typeName": {
                                      "id": 4554,
                                      "name": "uint256",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "6882:7:22",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 4560,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "6882:23:22",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 4553,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "6874:7:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_bytes32_$",
                                  "typeString": "type(bytes32)"
                                },
                                "typeName": {
                                  "id": 4552,
                                  "name": "bytes32",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "6874:7:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 4561,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6874:32:22",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "id": 4549,
                            "name": "_remove",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4369,
                            "src": "6854:7:22",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Set_$4248_storage_ptr_$_t_bytes32_$returns$_t_bool_$",
                              "typeString": "function (struct EnumerableSetUpgradeable.Set storage pointer,bytes32) returns (bool)"
                            }
                          },
                          "id": 4562,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6854:53:22",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 4548,
                        "id": 4563,
                        "nodeType": "Return",
                        "src": "6847:60:22"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4540,
                    "nodeType": "StructuredDocumentation",
                    "src": "6596:157:22",
                    "text": " @dev Removes a value from a set. O(1).\n Returns true if the value was removed from the set, that is if it was\n present."
                  },
                  "id": 4565,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "remove",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4545,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4542,
                        "mutability": "mutable",
                        "name": "set",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4565,
                        "src": "6774:22:22",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_AddressSet_$4513_storage_ptr",
                          "typeString": "struct EnumerableSetUpgradeable.AddressSet"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4541,
                          "name": "AddressSet",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4513,
                          "src": "6774:10:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_AddressSet_$4513_storage_ptr",
                            "typeString": "struct EnumerableSetUpgradeable.AddressSet"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4544,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4565,
                        "src": "6798:13:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 4543,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6798:7:22",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6773:39:22"
                  },
                  "returnParameters": {
                    "id": 4548,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4547,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4565,
                        "src": "6831:4:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 4546,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "6831:4:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6830:6:22"
                  },
                  "scope": 4729,
                  "src": "6758:156:22",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4590,
                    "nodeType": "Block",
                    "src": "7081:79:22",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 4576,
                                "name": "set",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4568,
                                "src": "7108:3:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_AddressSet_$4513_storage_ptr",
                                  "typeString": "struct EnumerableSetUpgradeable.AddressSet storage pointer"
                                }
                              },
                              "id": 4577,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_inner",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4512,
                              "src": "7108:10:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 4584,
                                          "name": "value",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 4570,
                                          "src": "7144:5:22",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        ],
                                        "id": 4583,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "7136:7:22",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_uint160_$",
                                          "typeString": "type(uint160)"
                                        },
                                        "typeName": {
                                          "id": 4582,
                                          "name": "uint160",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "7136:7:22",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      },
                                      "id": 4585,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "7136:14:22",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint160",
                                        "typeString": "uint160"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint160",
                                        "typeString": "uint160"
                                      }
                                    ],
                                    "id": 4581,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "7128:7:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_uint256_$",
                                      "typeString": "type(uint256)"
                                    },
                                    "typeName": {
                                      "id": 4580,
                                      "name": "uint256",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "7128:7:22",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 4586,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "7128:23:22",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 4579,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "7120:7:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_bytes32_$",
                                  "typeString": "type(bytes32)"
                                },
                                "typeName": {
                                  "id": 4578,
                                  "name": "bytes32",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "7120:7:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 4587,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7120:32:22",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "id": 4575,
                            "name": "_contains",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4387,
                            "src": "7098:9:22",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_Set_$4248_storage_ptr_$_t_bytes32_$returns$_t_bool_$",
                              "typeString": "function (struct EnumerableSetUpgradeable.Set storage pointer,bytes32) view returns (bool)"
                            }
                          },
                          "id": 4588,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7098:55:22",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 4574,
                        "id": 4589,
                        "nodeType": "Return",
                        "src": "7091:62:22"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4566,
                    "nodeType": "StructuredDocumentation",
                    "src": "6920:70:22",
                    "text": " @dev Returns true if the value is in the set. O(1)."
                  },
                  "id": 4591,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "contains",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4571,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4568,
                        "mutability": "mutable",
                        "name": "set",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4591,
                        "src": "7013:22:22",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_AddressSet_$4513_storage_ptr",
                          "typeString": "struct EnumerableSetUpgradeable.AddressSet"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4567,
                          "name": "AddressSet",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4513,
                          "src": "7013:10:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_AddressSet_$4513_storage_ptr",
                            "typeString": "struct EnumerableSetUpgradeable.AddressSet"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4570,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4591,
                        "src": "7037:13:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 4569,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7037:7:22",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7012:39:22"
                  },
                  "returnParameters": {
                    "id": 4574,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4573,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4591,
                        "src": "7075:4:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 4572,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "7075:4:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7074:6:22"
                  },
                  "scope": 4729,
                  "src": "6995:165:22",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4604,
                    "nodeType": "Block",
                    "src": "7313:43:22",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 4600,
                                "name": "set",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4594,
                                "src": "7338:3:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_AddressSet_$4513_storage_ptr",
                                  "typeString": "struct EnumerableSetUpgradeable.AddressSet storage pointer"
                                }
                              },
                              "id": 4601,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_inner",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4512,
                              "src": "7338:10:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              }
                            ],
                            "id": 4599,
                            "name": "_length",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4400,
                            "src": "7330:7:22",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_Set_$4248_storage_ptr_$returns$_t_uint256_$",
                              "typeString": "function (struct EnumerableSetUpgradeable.Set storage pointer) view returns (uint256)"
                            }
                          },
                          "id": 4602,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7330:19:22",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 4598,
                        "id": 4603,
                        "nodeType": "Return",
                        "src": "7323:26:22"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4592,
                    "nodeType": "StructuredDocumentation",
                    "src": "7166:70:22",
                    "text": " @dev Returns the number of values in the set. O(1)."
                  },
                  "id": 4605,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "length",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4595,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4594,
                        "mutability": "mutable",
                        "name": "set",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4605,
                        "src": "7257:22:22",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_AddressSet_$4513_storage_ptr",
                          "typeString": "struct EnumerableSetUpgradeable.AddressSet"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4593,
                          "name": "AddressSet",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4513,
                          "src": "7257:10:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_AddressSet_$4513_storage_ptr",
                            "typeString": "struct EnumerableSetUpgradeable.AddressSet"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7256:24:22"
                  },
                  "returnParameters": {
                    "id": 4598,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4597,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4605,
                        "src": "7304:7:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4596,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7304:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7303:9:22"
                  },
                  "scope": 4729,
                  "src": "7241:115:22",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4630,
                    "nodeType": "Block",
                    "src": "7771:73:22",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 4622,
                                            "name": "set",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 4608,
                                            "src": "7816:3:22",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_AddressSet_$4513_storage_ptr",
                                              "typeString": "struct EnumerableSetUpgradeable.AddressSet storage pointer"
                                            }
                                          },
                                          "id": 4623,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "_inner",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 4512,
                                          "src": "7816:10:22",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_Set_$4248_storage",
                                            "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 4624,
                                          "name": "index",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 4610,
                                          "src": "7828:5:22",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_struct$_Set_$4248_storage",
                                            "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                                          },
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "id": 4621,
                                        "name": "_at",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 4425,
                                        "src": "7812:3:22",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_view$_t_struct$_Set_$4248_storage_ptr_$_t_uint256_$returns$_t_bytes32_$",
                                          "typeString": "function (struct EnumerableSetUpgradeable.Set storage pointer,uint256) view returns (bytes32)"
                                        }
                                      },
                                      "id": 4625,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "7812:22:22",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                      }
                                    ],
                                    "id": 4620,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "7804:7:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_uint256_$",
                                      "typeString": "type(uint256)"
                                    },
                                    "typeName": {
                                      "id": 4619,
                                      "name": "uint256",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "7804:7:22",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 4626,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "7804:31:22",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 4618,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "7796:7:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_uint160_$",
                                  "typeString": "type(uint160)"
                                },
                                "typeName": {
                                  "id": 4617,
                                  "name": "uint160",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "7796:7:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 4627,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7796:40:22",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint160",
                                "typeString": "uint160"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint160",
                                "typeString": "uint160"
                              }
                            ],
                            "id": 4616,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "7788:7:22",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 4615,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "7788:7:22",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 4628,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7788:49:22",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "functionReturnParameters": 4614,
                        "id": 4629,
                        "nodeType": "Return",
                        "src": "7781:56:22"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4606,
                    "nodeType": "StructuredDocumentation",
                    "src": "7361:322:22",
                    "text": " @dev Returns the value stored at position `index` in the set. O(1).\n Note that there are no guarantees on the ordering of values inside the\n array, and it may change when more values are added or removed.\n Requirements:\n - `index` must be strictly less than {length}."
                  },
                  "id": 4631,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "at",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4611,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4608,
                        "mutability": "mutable",
                        "name": "set",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4631,
                        "src": "7700:22:22",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_AddressSet_$4513_storage_ptr",
                          "typeString": "struct EnumerableSetUpgradeable.AddressSet"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4607,
                          "name": "AddressSet",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4513,
                          "src": "7700:10:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_AddressSet_$4513_storage_ptr",
                            "typeString": "struct EnumerableSetUpgradeable.AddressSet"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4610,
                        "mutability": "mutable",
                        "name": "index",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4631,
                        "src": "7724:13:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4609,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7724:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7699:39:22"
                  },
                  "returnParameters": {
                    "id": 4614,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4613,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4631,
                        "src": "7762:7:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 4612,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7762:7:22",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7761:9:22"
                  },
                  "scope": 4729,
                  "src": "7688:156:22",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "canonicalName": "EnumerableSetUpgradeable.UintSet",
                  "id": 4634,
                  "members": [
                    {
                      "constant": false,
                      "id": 4633,
                      "mutability": "mutable",
                      "name": "_inner",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 4634,
                      "src": "7892:10:22",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                        "typeString": "struct EnumerableSetUpgradeable.Set"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 4632,
                        "name": "Set",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 4248,
                        "src": "7892:3:22",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Set_$4248_storage_ptr",
                          "typeString": "struct EnumerableSetUpgradeable.Set"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "UintSet",
                  "nodeType": "StructDefinition",
                  "scope": 4729,
                  "src": "7867:42:22",
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 4653,
                    "nodeType": "Block",
                    "src": "8152:56:22",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 4645,
                                "name": "set",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4637,
                                "src": "8174:3:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_UintSet_$4634_storage_ptr",
                                  "typeString": "struct EnumerableSetUpgradeable.UintSet storage pointer"
                                }
                              },
                              "id": 4646,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_inner",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4633,
                              "src": "8174:10:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 4649,
                                  "name": "value",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4639,
                                  "src": "8194:5:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 4648,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "8186:7:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_bytes32_$",
                                  "typeString": "type(bytes32)"
                                },
                                "typeName": {
                                  "id": 4647,
                                  "name": "bytes32",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "8186:7:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 4650,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "8186:14:22",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "id": 4644,
                            "name": "_add",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4289,
                            "src": "8169:4:22",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Set_$4248_storage_ptr_$_t_bytes32_$returns$_t_bool_$",
                              "typeString": "function (struct EnumerableSetUpgradeable.Set storage pointer,bytes32) returns (bool)"
                            }
                          },
                          "id": 4651,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8169:32:22",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 4643,
                        "id": 4652,
                        "nodeType": "Return",
                        "src": "8162:39:22"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4635,
                    "nodeType": "StructuredDocumentation",
                    "src": "7915:159:22",
                    "text": " @dev Add a value to a set. O(1).\n Returns true if the value was added to the set, that is if it was not\n already present."
                  },
                  "id": 4654,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "add",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4640,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4637,
                        "mutability": "mutable",
                        "name": "set",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4654,
                        "src": "8092:19:22",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_UintSet_$4634_storage_ptr",
                          "typeString": "struct EnumerableSetUpgradeable.UintSet"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4636,
                          "name": "UintSet",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4634,
                          "src": "8092:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_UintSet_$4634_storage_ptr",
                            "typeString": "struct EnumerableSetUpgradeable.UintSet"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4639,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4654,
                        "src": "8113:13:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4638,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "8113:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8091:36:22"
                  },
                  "returnParameters": {
                    "id": 4643,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4642,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4654,
                        "src": "8146:4:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 4641,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "8146:4:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8145:6:22"
                  },
                  "scope": 4729,
                  "src": "8079:129:22",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4673,
                    "nodeType": "Block",
                    "src": "8452:59:22",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 4665,
                                "name": "set",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4657,
                                "src": "8477:3:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_UintSet_$4634_storage_ptr",
                                  "typeString": "struct EnumerableSetUpgradeable.UintSet storage pointer"
                                }
                              },
                              "id": 4666,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_inner",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4633,
                              "src": "8477:10:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 4669,
                                  "name": "value",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4659,
                                  "src": "8497:5:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 4668,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "8489:7:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_bytes32_$",
                                  "typeString": "type(bytes32)"
                                },
                                "typeName": {
                                  "id": 4667,
                                  "name": "bytes32",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "8489:7:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 4670,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "8489:14:22",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "id": 4664,
                            "name": "_remove",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4369,
                            "src": "8469:7:22",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Set_$4248_storage_ptr_$_t_bytes32_$returns$_t_bool_$",
                              "typeString": "function (struct EnumerableSetUpgradeable.Set storage pointer,bytes32) returns (bool)"
                            }
                          },
                          "id": 4671,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8469:35:22",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 4663,
                        "id": 4672,
                        "nodeType": "Return",
                        "src": "8462:42:22"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4655,
                    "nodeType": "StructuredDocumentation",
                    "src": "8214:157:22",
                    "text": " @dev Removes a value from a set. O(1).\n Returns true if the value was removed from the set, that is if it was\n present."
                  },
                  "id": 4674,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "remove",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4660,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4657,
                        "mutability": "mutable",
                        "name": "set",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4674,
                        "src": "8392:19:22",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_UintSet_$4634_storage_ptr",
                          "typeString": "struct EnumerableSetUpgradeable.UintSet"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4656,
                          "name": "UintSet",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4634,
                          "src": "8392:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_UintSet_$4634_storage_ptr",
                            "typeString": "struct EnumerableSetUpgradeable.UintSet"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4659,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4674,
                        "src": "8413:13:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4658,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "8413:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8391:36:22"
                  },
                  "returnParameters": {
                    "id": 4663,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4662,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4674,
                        "src": "8446:4:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 4661,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "8446:4:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8445:6:22"
                  },
                  "scope": 4729,
                  "src": "8376:135:22",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4693,
                    "nodeType": "Block",
                    "src": "8675:61:22",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 4685,
                                "name": "set",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4677,
                                "src": "8702:3:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_UintSet_$4634_storage_ptr",
                                  "typeString": "struct EnumerableSetUpgradeable.UintSet storage pointer"
                                }
                              },
                              "id": 4686,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_inner",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4633,
                              "src": "8702:10:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 4689,
                                  "name": "value",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4679,
                                  "src": "8722:5:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 4688,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "8714:7:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_bytes32_$",
                                  "typeString": "type(bytes32)"
                                },
                                "typeName": {
                                  "id": 4687,
                                  "name": "bytes32",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "8714:7:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 4690,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "8714:14:22",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "id": 4684,
                            "name": "_contains",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4387,
                            "src": "8692:9:22",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_Set_$4248_storage_ptr_$_t_bytes32_$returns$_t_bool_$",
                              "typeString": "function (struct EnumerableSetUpgradeable.Set storage pointer,bytes32) view returns (bool)"
                            }
                          },
                          "id": 4691,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8692:37:22",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 4683,
                        "id": 4692,
                        "nodeType": "Return",
                        "src": "8685:44:22"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4675,
                    "nodeType": "StructuredDocumentation",
                    "src": "8517:70:22",
                    "text": " @dev Returns true if the value is in the set. O(1)."
                  },
                  "id": 4694,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "contains",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4680,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4677,
                        "mutability": "mutable",
                        "name": "set",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4694,
                        "src": "8610:19:22",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_UintSet_$4634_storage_ptr",
                          "typeString": "struct EnumerableSetUpgradeable.UintSet"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4676,
                          "name": "UintSet",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4634,
                          "src": "8610:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_UintSet_$4634_storage_ptr",
                            "typeString": "struct EnumerableSetUpgradeable.UintSet"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4679,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4694,
                        "src": "8631:13:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4678,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "8631:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8609:36:22"
                  },
                  "returnParameters": {
                    "id": 4683,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4682,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4694,
                        "src": "8669:4:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 4681,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "8669:4:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8668:6:22"
                  },
                  "scope": 4729,
                  "src": "8592:144:22",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4707,
                    "nodeType": "Block",
                    "src": "8886:43:22",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 4703,
                                "name": "set",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4697,
                                "src": "8911:3:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_UintSet_$4634_storage_ptr",
                                  "typeString": "struct EnumerableSetUpgradeable.UintSet storage pointer"
                                }
                              },
                              "id": 4704,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "_inner",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4633,
                              "src": "8911:10:22",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_Set_$4248_storage",
                                "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                              }
                            ],
                            "id": 4702,
                            "name": "_length",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4400,
                            "src": "8903:7:22",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_Set_$4248_storage_ptr_$returns$_t_uint256_$",
                              "typeString": "function (struct EnumerableSetUpgradeable.Set storage pointer) view returns (uint256)"
                            }
                          },
                          "id": 4705,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8903:19:22",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 4701,
                        "id": 4706,
                        "nodeType": "Return",
                        "src": "8896:26:22"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4695,
                    "nodeType": "StructuredDocumentation",
                    "src": "8742:70:22",
                    "text": " @dev Returns the number of values on the set. O(1)."
                  },
                  "id": 4708,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "length",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4698,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4697,
                        "mutability": "mutable",
                        "name": "set",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4708,
                        "src": "8833:19:22",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_UintSet_$4634_storage_ptr",
                          "typeString": "struct EnumerableSetUpgradeable.UintSet"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4696,
                          "name": "UintSet",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4634,
                          "src": "8833:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_UintSet_$4634_storage_ptr",
                            "typeString": "struct EnumerableSetUpgradeable.UintSet"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8832:21:22"
                  },
                  "returnParameters": {
                    "id": 4701,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4700,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4708,
                        "src": "8877:7:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4699,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "8877:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8876:9:22"
                  },
                  "scope": 4729,
                  "src": "8817:112:22",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4727,
                    "nodeType": "Block",
                    "src": "9341:55:22",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 4721,
                                    "name": "set",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 4711,
                                    "src": "9370:3:22",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_UintSet_$4634_storage_ptr",
                                      "typeString": "struct EnumerableSetUpgradeable.UintSet storage pointer"
                                    }
                                  },
                                  "id": 4722,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "_inner",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 4633,
                                  "src": "9370:10:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Set_$4248_storage",
                                    "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 4723,
                                  "name": "index",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4713,
                                  "src": "9382:5:22",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_struct$_Set_$4248_storage",
                                    "typeString": "struct EnumerableSetUpgradeable.Set storage ref"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 4720,
                                "name": "_at",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4425,
                                "src": "9366:3:22",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_struct$_Set_$4248_storage_ptr_$_t_uint256_$returns$_t_bytes32_$",
                                  "typeString": "function (struct EnumerableSetUpgradeable.Set storage pointer,uint256) view returns (bytes32)"
                                }
                              },
                              "id": 4724,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "9366:22:22",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "id": 4719,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "9358:7:22",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint256_$",
                              "typeString": "type(uint256)"
                            },
                            "typeName": {
                              "id": 4718,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "9358:7:22",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 4725,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9358:31:22",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 4717,
                        "id": 4726,
                        "nodeType": "Return",
                        "src": "9351:38:22"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4709,
                    "nodeType": "StructuredDocumentation",
                    "src": "8934:322:22",
                    "text": " @dev Returns the value stored at position `index` in the set. O(1).\n Note that there are no guarantees on the ordering of values inside the\n array, and it may change when more values are added or removed.\n Requirements:\n - `index` must be strictly less than {length}."
                  },
                  "id": 4728,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "at",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4714,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4711,
                        "mutability": "mutable",
                        "name": "set",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4728,
                        "src": "9273:19:22",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_UintSet_$4634_storage_ptr",
                          "typeString": "struct EnumerableSetUpgradeable.UintSet"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 4710,
                          "name": "UintSet",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 4634,
                          "src": "9273:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_UintSet_$4634_storage_ptr",
                            "typeString": "struct EnumerableSetUpgradeable.UintSet"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 4713,
                        "mutability": "mutable",
                        "name": "index",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4728,
                        "src": "9294:13:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4712,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "9294:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9272:36:22"
                  },
                  "returnParameters": {
                    "id": 4717,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4716,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4728,
                        "src": "9332:7:22",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4715,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "9332:7:22",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9331:9:22"
                  },
                  "scope": 4729,
                  "src": "9261:135:22",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 4730,
              "src": "753:8645:22"
            }
          ],
          "src": "33:9366:22"
        },
        "id": 22
      },
      "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol",
          "exportedSymbols": {
            "ReentrancyGuardUpgradeable": [
              4787
            ]
          },
          "id": 4788,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 4731,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:23"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol",
              "file": "../proxy/Initializable.sol",
              "id": 4732,
              "nodeType": "ImportDirective",
              "scope": 4788,
              "sourceUnit": 1353,
              "src": "65:36:23",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": true,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 4734,
                    "name": "Initializable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1352,
                    "src": "902:13:23",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Initializable_$1352",
                      "typeString": "contract Initializable"
                    }
                  },
                  "id": 4735,
                  "nodeType": "InheritanceSpecifier",
                  "src": "902:13:23"
                }
              ],
              "contractDependencies": [
                1352
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 4733,
                "nodeType": "StructuredDocumentation",
                "src": "103:750:23",
                "text": " @dev Contract module that helps prevent reentrant calls to a function.\n Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n available, which can be applied to functions to make sure there are no nested\n (reentrant) calls to them.\n Note that because there is a single `nonReentrant` guard, functions marked as\n `nonReentrant` may not call one another. This can be worked around by making\n those functions `private`, and then adding `external` `nonReentrant` entry\n points to them.\n TIP: If you would like to learn more about reentrancy and alternative ways\n to protect against it, check out our blog post\n https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]."
              },
              "fullyImplemented": true,
              "id": 4787,
              "linearizedBaseContracts": [
                4787,
                1352
              ],
              "name": "ReentrancyGuardUpgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": true,
                  "id": 4738,
                  "mutability": "constant",
                  "name": "_NOT_ENTERED",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4787,
                  "src": "1670:41:23",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4736,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1670:7:23",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "31",
                    "id": 4737,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "1710:1:23",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_1_by_1",
                      "typeString": "int_const 1"
                    },
                    "value": "1"
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 4741,
                  "mutability": "constant",
                  "name": "_ENTERED",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4787,
                  "src": "1717:37:23",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4739,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1717:7:23",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "32",
                    "id": 4740,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "1753:1:23",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_2_by_1",
                      "typeString": "int_const 2"
                    },
                    "value": "2"
                  },
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 4743,
                  "mutability": "mutable",
                  "name": "_status",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4787,
                  "src": "1761:23:23",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 4742,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1761:7:23",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 4751,
                    "nodeType": "Block",
                    "src": "1846:51:23",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 4748,
                            "name": "__ReentrancyGuard_init_unchained",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4762,
                            "src": "1856:32:23",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 4749,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1856:34:23",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 4750,
                        "nodeType": "ExpressionStatement",
                        "src": "1856:34:23"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 4752,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 4746,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 4745,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "1834:11:23",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "1834:11:23"
                    }
                  ],
                  "name": "__ReentrancyGuard_init",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4744,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1822:2:23"
                  },
                  "returnParameters": {
                    "id": 4747,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1846:0:23"
                  },
                  "scope": 4787,
                  "src": "1791:106:23",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4761,
                    "nodeType": "Block",
                    "src": "1968:39:23",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 4759,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 4757,
                            "name": "_status",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4743,
                            "src": "1978:7:23",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 4758,
                            "name": "_NOT_ENTERED",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4738,
                            "src": "1988:12:23",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "1978:22:23",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 4760,
                        "nodeType": "ExpressionStatement",
                        "src": "1978:22:23"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 4762,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 4755,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 4754,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "1956:11:23",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "1956:11:23"
                    }
                  ],
                  "name": "__ReentrancyGuard_init_unchained",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4753,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1944:2:23"
                  },
                  "returnParameters": {
                    "id": 4756,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1968:0:23"
                  },
                  "scope": 4787,
                  "src": "1903:104:23",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4781,
                    "nodeType": "Block",
                    "src": "2406:421:23",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 4768,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 4766,
                                "name": "_status",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4743,
                                "src": "2495:7:23",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 4767,
                                "name": "_ENTERED",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4741,
                                "src": "2506:8:23",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "2495:19:23",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5265656e7472616e637947756172643a207265656e7472616e742063616c6c",
                              "id": 4769,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2516:33:23",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_ebf73bba305590e4764d5cb53b69bffd6d4d092d1a67551cb346f8cfcdab8619",
                                "typeString": "literal_string \"ReentrancyGuard: reentrant call\""
                              },
                              "value": "ReentrancyGuard: reentrant call"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_ebf73bba305590e4764d5cb53b69bffd6d4d092d1a67551cb346f8cfcdab8619",
                                "typeString": "literal_string \"ReentrancyGuard: reentrant call\""
                              }
                            ],
                            "id": 4765,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2487:7:23",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 4770,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2487:63:23",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 4771,
                        "nodeType": "ExpressionStatement",
                        "src": "2487:63:23"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 4774,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 4772,
                            "name": "_status",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4743,
                            "src": "2625:7:23",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 4773,
                            "name": "_ENTERED",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4741,
                            "src": "2635:8:23",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "2625:18:23",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 4775,
                        "nodeType": "ExpressionStatement",
                        "src": "2625:18:23"
                      },
                      {
                        "id": 4776,
                        "nodeType": "PlaceholderStatement",
                        "src": "2654:1:23"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 4779,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 4777,
                            "name": "_status",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4743,
                            "src": "2798:7:23",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 4778,
                            "name": "_NOT_ENTERED",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4738,
                            "src": "2808:12:23",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "2798:22:23",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 4780,
                        "nodeType": "ExpressionStatement",
                        "src": "2798:22:23"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4763,
                    "nodeType": "StructuredDocumentation",
                    "src": "2013:364:23",
                    "text": " @dev Prevents a contract from calling itself, directly or indirectly.\n Calling a `nonReentrant` function from another `nonReentrant`\n function is not supported. It is possible to prevent this from happening\n by making the `nonReentrant` function external, and make it call a\n `private` function that does the actual work."
                  },
                  "id": 4782,
                  "name": "nonReentrant",
                  "nodeType": "ModifierDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4764,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2403:2:23"
                  },
                  "src": "2382:445:23",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4786,
                  "mutability": "mutable",
                  "name": "__gap",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 4787,
                  "src": "2832:25:23",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_uint256_$49_storage",
                    "typeString": "uint256[49]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 4783,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "2832:7:23",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 4785,
                    "length": {
                      "argumentTypes": null,
                      "hexValue": "3439",
                      "id": 4784,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "2840:2:23",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_49_by_1",
                        "typeString": "int_const 49"
                      },
                      "value": "49"
                    },
                    "nodeType": "ArrayTypeName",
                    "src": "2832:11:23",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_uint256_$49_storage_ptr",
                      "typeString": "uint256[49]"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                }
              ],
              "scope": 4788,
              "src": "854:2006:23"
            }
          ],
          "src": "33:2828:23"
        },
        "id": 23
      },
      "@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol",
          "exportedSymbols": {
            "SafeCastUpgradeable": [
              5100
            ]
          },
          "id": 5101,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 4789,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:24"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 4790,
                "nodeType": "StructuredDocumentation",
                "src": "67:709:24",
                "text": " @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n checks.\n Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n easily result in undesired exploitation or bugs, since developers usually\n assume that overflows raise errors. `SafeCast` restores this intuition by\n reverting the transaction when such an operation overflows.\n Using this library instead of the unchecked operations eliminates an entire\n class of bugs, so it's recommended to use it always.\n Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n all math on `uint256` and `int256` and then downcasting."
              },
              "fullyImplemented": true,
              "id": 5100,
              "linearizedBaseContracts": [
                5100
              ],
              "name": "SafeCastUpgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 4812,
                    "nodeType": "Block",
                    "src": "1163:115:24",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 4803,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 4799,
                                "name": "value",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4793,
                                "src": "1181:5:24",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_rational_340282366920938463463374607431768211456_by_1",
                                  "typeString": "int_const 3402...(31 digits omitted)...1456"
                                },
                                "id": 4802,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "32",
                                  "id": 4800,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "1189:1:24",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_2_by_1",
                                    "typeString": "int_const 2"
                                  },
                                  "value": "2"
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "**",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "313238",
                                  "id": 4801,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "1192:3:24",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_128_by_1",
                                    "typeString": "int_const 128"
                                  },
                                  "value": "128"
                                },
                                "src": "1189:6:24",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_340282366920938463463374607431768211456_by_1",
                                  "typeString": "int_const 3402...(31 digits omitted)...1456"
                                }
                              },
                              "src": "1181:14:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "53616665436173743a2076616c756520646f65736e27742066697420696e203132382062697473",
                              "id": 4804,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1197:42:24",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_47a1e201974f94d3d1a31c8b08ae18c6966c758bdcd4400020012b98cc55426c",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in 128 bits\""
                              },
                              "value": "SafeCast: value doesn't fit in 128 bits"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_47a1e201974f94d3d1a31c8b08ae18c6966c758bdcd4400020012b98cc55426c",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in 128 bits\""
                              }
                            ],
                            "id": 4798,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1173:7:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 4805,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1173:67:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 4806,
                        "nodeType": "ExpressionStatement",
                        "src": "1173:67:24"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 4809,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4793,
                              "src": "1265:5:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 4808,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "1257:7:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint128_$",
                              "typeString": "type(uint128)"
                            },
                            "typeName": {
                              "id": 4807,
                              "name": "uint128",
                              "nodeType": "ElementaryTypeName",
                              "src": "1257:7:24",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 4810,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1257:14:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "functionReturnParameters": 4797,
                        "id": 4811,
                        "nodeType": "Return",
                        "src": "1250:21:24"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4791,
                    "nodeType": "StructuredDocumentation",
                    "src": "812:280:24",
                    "text": " @dev Returns the downcasted uint128 from uint256, reverting on\n overflow (when the input is greater than largest uint128).\n Counterpart to Solidity's `uint128` operator.\n Requirements:\n - input must fit into 128 bits"
                  },
                  "id": 4813,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toUint128",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4794,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4793,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4813,
                        "src": "1116:13:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4792,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1116:7:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1115:15:24"
                  },
                  "returnParameters": {
                    "id": 4797,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4796,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4813,
                        "src": "1154:7:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 4795,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "1154:7:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1153:9:24"
                  },
                  "scope": 5100,
                  "src": "1097:181:24",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4835,
                    "nodeType": "Block",
                    "src": "1629:112:24",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 4826,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 4822,
                                "name": "value",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4816,
                                "src": "1647:5:24",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_rational_18446744073709551616_by_1",
                                  "typeString": "int_const 18446744073709551616"
                                },
                                "id": 4825,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "32",
                                  "id": 4823,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "1655:1:24",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_2_by_1",
                                    "typeString": "int_const 2"
                                  },
                                  "value": "2"
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "**",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "3634",
                                  "id": 4824,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "1658:2:24",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_64_by_1",
                                    "typeString": "int_const 64"
                                  },
                                  "value": "64"
                                },
                                "src": "1655:5:24",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_18446744073709551616_by_1",
                                  "typeString": "int_const 18446744073709551616"
                                }
                              },
                              "src": "1647:13:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "53616665436173743a2076616c756520646f65736e27742066697420696e2036342062697473",
                              "id": 4827,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1662:41:24",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_93ae0c6bf6ffaece591a770b1865daa9f65157e541970aa9d8dc5f89a9490939",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in 64 bits\""
                              },
                              "value": "SafeCast: value doesn't fit in 64 bits"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_93ae0c6bf6ffaece591a770b1865daa9f65157e541970aa9d8dc5f89a9490939",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in 64 bits\""
                              }
                            ],
                            "id": 4821,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1639:7:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 4828,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1639:65:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 4829,
                        "nodeType": "ExpressionStatement",
                        "src": "1639:65:24"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 4832,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4816,
                              "src": "1728:5:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 4831,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "1721:6:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint64_$",
                              "typeString": "type(uint64)"
                            },
                            "typeName": {
                              "id": 4830,
                              "name": "uint64",
                              "nodeType": "ElementaryTypeName",
                              "src": "1721:6:24",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 4833,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1721:13:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "functionReturnParameters": 4820,
                        "id": 4834,
                        "nodeType": "Return",
                        "src": "1714:20:24"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4814,
                    "nodeType": "StructuredDocumentation",
                    "src": "1284:276:24",
                    "text": " @dev Returns the downcasted uint64 from uint256, reverting on\n overflow (when the input is greater than largest uint64).\n Counterpart to Solidity's `uint64` operator.\n Requirements:\n - input must fit into 64 bits"
                  },
                  "id": 4836,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toUint64",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4817,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4816,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4836,
                        "src": "1583:13:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4815,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1583:7:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1582:15:24"
                  },
                  "returnParameters": {
                    "id": 4820,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4819,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4836,
                        "src": "1621:6:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint64",
                          "typeString": "uint64"
                        },
                        "typeName": {
                          "id": 4818,
                          "name": "uint64",
                          "nodeType": "ElementaryTypeName",
                          "src": "1621:6:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint64",
                            "typeString": "uint64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1620:8:24"
                  },
                  "scope": 5100,
                  "src": "1565:176:24",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4858,
                    "nodeType": "Block",
                    "src": "2092:112:24",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 4849,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 4845,
                                "name": "value",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4839,
                                "src": "2110:5:24",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_rational_4294967296_by_1",
                                  "typeString": "int_const 4294967296"
                                },
                                "id": 4848,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "32",
                                  "id": 4846,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "2118:1:24",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_2_by_1",
                                    "typeString": "int_const 2"
                                  },
                                  "value": "2"
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "**",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "3332",
                                  "id": 4847,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "2121:2:24",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_32_by_1",
                                    "typeString": "int_const 32"
                                  },
                                  "value": "32"
                                },
                                "src": "2118:5:24",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_4294967296_by_1",
                                  "typeString": "int_const 4294967296"
                                }
                              },
                              "src": "2110:13:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "53616665436173743a2076616c756520646f65736e27742066697420696e2033322062697473",
                              "id": 4850,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2125:41:24",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c907489dafcfb622d3b83f2657a14d6da2f59e0de3116af0d6a80554c1a7cb19",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in 32 bits\""
                              },
                              "value": "SafeCast: value doesn't fit in 32 bits"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_c907489dafcfb622d3b83f2657a14d6da2f59e0de3116af0d6a80554c1a7cb19",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in 32 bits\""
                              }
                            ],
                            "id": 4844,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2102:7:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 4851,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2102:65:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 4852,
                        "nodeType": "ExpressionStatement",
                        "src": "2102:65:24"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 4855,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4839,
                              "src": "2191:5:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 4854,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "2184:6:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint32_$",
                              "typeString": "type(uint32)"
                            },
                            "typeName": {
                              "id": 4853,
                              "name": "uint32",
                              "nodeType": "ElementaryTypeName",
                              "src": "2184:6:24",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 4856,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2184:13:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "functionReturnParameters": 4843,
                        "id": 4857,
                        "nodeType": "Return",
                        "src": "2177:20:24"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4837,
                    "nodeType": "StructuredDocumentation",
                    "src": "1747:276:24",
                    "text": " @dev Returns the downcasted uint32 from uint256, reverting on\n overflow (when the input is greater than largest uint32).\n Counterpart to Solidity's `uint32` operator.\n Requirements:\n - input must fit into 32 bits"
                  },
                  "id": 4859,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toUint32",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4840,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4839,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4859,
                        "src": "2046:13:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4838,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2046:7:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2045:15:24"
                  },
                  "returnParameters": {
                    "id": 4843,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4842,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4859,
                        "src": "2084:6:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 4841,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "2084:6:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2083:8:24"
                  },
                  "scope": 5100,
                  "src": "2028:176:24",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4881,
                    "nodeType": "Block",
                    "src": "2555:112:24",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 4872,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 4868,
                                "name": "value",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4862,
                                "src": "2573:5:24",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_rational_65536_by_1",
                                  "typeString": "int_const 65536"
                                },
                                "id": 4871,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "32",
                                  "id": 4869,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "2581:1:24",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_2_by_1",
                                    "typeString": "int_const 2"
                                  },
                                  "value": "2"
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "**",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "3136",
                                  "id": 4870,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "2584:2:24",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_16_by_1",
                                    "typeString": "int_const 16"
                                  },
                                  "value": "16"
                                },
                                "src": "2581:5:24",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_65536_by_1",
                                  "typeString": "int_const 65536"
                                }
                              },
                              "src": "2573:13:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "53616665436173743a2076616c756520646f65736e27742066697420696e2031362062697473",
                              "id": 4873,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2588:41:24",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_13d3a66f9e0e5c92bbe7743bcd3bdb4695009d5f3a96e5ff49718d715b484033",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in 16 bits\""
                              },
                              "value": "SafeCast: value doesn't fit in 16 bits"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_13d3a66f9e0e5c92bbe7743bcd3bdb4695009d5f3a96e5ff49718d715b484033",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in 16 bits\""
                              }
                            ],
                            "id": 4867,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2565:7:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 4874,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2565:65:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 4875,
                        "nodeType": "ExpressionStatement",
                        "src": "2565:65:24"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 4878,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4862,
                              "src": "2654:5:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 4877,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "2647:6:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint16_$",
                              "typeString": "type(uint16)"
                            },
                            "typeName": {
                              "id": 4876,
                              "name": "uint16",
                              "nodeType": "ElementaryTypeName",
                              "src": "2647:6:24",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 4879,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2647:13:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint16",
                            "typeString": "uint16"
                          }
                        },
                        "functionReturnParameters": 4866,
                        "id": 4880,
                        "nodeType": "Return",
                        "src": "2640:20:24"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4860,
                    "nodeType": "StructuredDocumentation",
                    "src": "2210:276:24",
                    "text": " @dev Returns the downcasted uint16 from uint256, reverting on\n overflow (when the input is greater than largest uint16).\n Counterpart to Solidity's `uint16` operator.\n Requirements:\n - input must fit into 16 bits"
                  },
                  "id": 4882,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toUint16",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4863,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4862,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4882,
                        "src": "2509:13:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4861,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2509:7:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2508:15:24"
                  },
                  "returnParameters": {
                    "id": 4866,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4865,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4882,
                        "src": "2547:6:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint16",
                          "typeString": "uint16"
                        },
                        "typeName": {
                          "id": 4864,
                          "name": "uint16",
                          "nodeType": "ElementaryTypeName",
                          "src": "2547:6:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint16",
                            "typeString": "uint16"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2546:8:24"
                  },
                  "scope": 5100,
                  "src": "2491:176:24",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4904,
                    "nodeType": "Block",
                    "src": "3013:109:24",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 4895,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 4891,
                                "name": "value",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4885,
                                "src": "3031:5:24",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_rational_256_by_1",
                                  "typeString": "int_const 256"
                                },
                                "id": 4894,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "32",
                                  "id": 4892,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "3039:1:24",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_2_by_1",
                                    "typeString": "int_const 2"
                                  },
                                  "value": "2"
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "**",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "38",
                                  "id": 4893,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "3042:1:24",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_8_by_1",
                                    "typeString": "int_const 8"
                                  },
                                  "value": "8"
                                },
                                "src": "3039:4:24",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_256_by_1",
                                  "typeString": "int_const 256"
                                }
                              },
                              "src": "3031:12:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "53616665436173743a2076616c756520646f65736e27742066697420696e20382062697473",
                              "id": 4896,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3045:40:24",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_2610961ba53259047cd57c60366c5ad0b8aabf5eb4132487619b736715a740d1",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in 8 bits\""
                              },
                              "value": "SafeCast: value doesn't fit in 8 bits"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_2610961ba53259047cd57c60366c5ad0b8aabf5eb4132487619b736715a740d1",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in 8 bits\""
                              }
                            ],
                            "id": 4890,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "3023:7:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 4897,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3023:63:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 4898,
                        "nodeType": "ExpressionStatement",
                        "src": "3023:63:24"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 4901,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4885,
                              "src": "3109:5:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 4900,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "3103:5:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint8_$",
                              "typeString": "type(uint8)"
                            },
                            "typeName": {
                              "id": 4899,
                              "name": "uint8",
                              "nodeType": "ElementaryTypeName",
                              "src": "3103:5:24",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 4902,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3103:12:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "functionReturnParameters": 4889,
                        "id": 4903,
                        "nodeType": "Return",
                        "src": "3096:19:24"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4883,
                    "nodeType": "StructuredDocumentation",
                    "src": "2673:273:24",
                    "text": " @dev Returns the downcasted uint8 from uint256, reverting on\n overflow (when the input is greater than largest uint8).\n Counterpart to Solidity's `uint8` operator.\n Requirements:\n - input must fit into 8 bits."
                  },
                  "id": 4905,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toUint8",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4886,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4885,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4905,
                        "src": "2968:13:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4884,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2968:7:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2967:15:24"
                  },
                  "returnParameters": {
                    "id": 4889,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4888,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4905,
                        "src": "3006:5:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 4887,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "3006:5:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3005:7:24"
                  },
                  "scope": 5100,
                  "src": "2951:171:24",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4925,
                    "nodeType": "Block",
                    "src": "3358:103:24",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              },
                              "id": 4916,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 4914,
                                "name": "value",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 4908,
                                "src": "3376:5:24",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_int256",
                                  "typeString": "int256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 4915,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "3385:1:24",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "3376:10:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "53616665436173743a2076616c7565206d75737420626520706f736974697665",
                              "id": 4917,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3388:34:24",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_74e6d3a4204092bea305532ded31d3763fc378e46be3884a93ceff08a0761807",
                                "typeString": "literal_string \"SafeCast: value must be positive\""
                              },
                              "value": "SafeCast: value must be positive"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_74e6d3a4204092bea305532ded31d3763fc378e46be3884a93ceff08a0761807",
                                "typeString": "literal_string \"SafeCast: value must be positive\""
                              }
                            ],
                            "id": 4913,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "3368:7:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 4918,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3368:55:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 4919,
                        "nodeType": "ExpressionStatement",
                        "src": "3368:55:24"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 4922,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4908,
                              "src": "3448:5:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              }
                            ],
                            "id": 4921,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "3440:7:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint256_$",
                              "typeString": "type(uint256)"
                            },
                            "typeName": {
                              "id": 4920,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "3440:7:24",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 4923,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3440:14:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 4912,
                        "id": 4924,
                        "nodeType": "Return",
                        "src": "3433:21:24"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4906,
                    "nodeType": "StructuredDocumentation",
                    "src": "3128:160:24",
                    "text": " @dev Converts a signed int256 into an unsigned uint256.\n Requirements:\n - input must be greater than or equal to 0."
                  },
                  "id": 4926,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toUint256",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4909,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4908,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4926,
                        "src": "3312:12:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        },
                        "typeName": {
                          "id": 4907,
                          "name": "int256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3312:6:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_int256",
                            "typeString": "int256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3311:14:24"
                  },
                  "returnParameters": {
                    "id": 4912,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4911,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4926,
                        "src": "3349:7:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 4910,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3349:7:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3348:9:24"
                  },
                  "scope": 5100,
                  "src": "3293:168:24",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4955,
                    "nodeType": "Block",
                    "src": "3885:134:24",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 4946,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_int256",
                                  "typeString": "int256"
                                },
                                "id": 4940,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 4935,
                                  "name": "value",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4929,
                                  "src": "3903:5:24",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": ">=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_rational_minus_170141183460469231731687303715884105728_by_1",
                                    "typeString": "int_const -170...(32 digits omitted)...5728"
                                  },
                                  "id": 4939,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 4937,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "UnaryOperation",
                                    "operator": "-",
                                    "prefix": true,
                                    "src": "3912:2:24",
                                    "subExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "32",
                                      "id": 4936,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "3913:1:24",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_2_by_1",
                                        "typeString": "int_const 2"
                                      },
                                      "value": "2"
                                    },
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_minus_2_by_1",
                                      "typeString": "int_const -2"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "**",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "313237",
                                    "id": 4938,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "3916:3:24",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_127_by_1",
                                      "typeString": "int_const 127"
                                    },
                                    "value": "127"
                                  },
                                  "src": "3912:7:24",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_minus_170141183460469231731687303715884105728_by_1",
                                    "typeString": "int_const -170...(32 digits omitted)...5728"
                                  }
                                },
                                "src": "3903:16:24",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "&&",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_int256",
                                  "typeString": "int256"
                                },
                                "id": 4945,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 4941,
                                  "name": "value",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4929,
                                  "src": "3923:5:24",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "<",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_rational_170141183460469231731687303715884105728_by_1",
                                    "typeString": "int_const 1701...(31 digits omitted)...5728"
                                  },
                                  "id": 4944,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "32",
                                    "id": 4942,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "3931:1:24",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_2_by_1",
                                      "typeString": "int_const 2"
                                    },
                                    "value": "2"
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "**",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "313237",
                                    "id": 4943,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "3934:3:24",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_127_by_1",
                                      "typeString": "int_const 127"
                                    },
                                    "value": "127"
                                  },
                                  "src": "3931:6:24",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_170141183460469231731687303715884105728_by_1",
                                    "typeString": "int_const 1701...(31 digits omitted)...5728"
                                  }
                                },
                                "src": "3923:14:24",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "3903:34:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "53616665436173743a2076616c756520646f65736e27742066697420696e203132382062697473",
                              "id": 4947,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3939:42:24",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_47a1e201974f94d3d1a31c8b08ae18c6966c758bdcd4400020012b98cc55426c",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in 128 bits\""
                              },
                              "value": "SafeCast: value doesn't fit in 128 bits"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_47a1e201974f94d3d1a31c8b08ae18c6966c758bdcd4400020012b98cc55426c",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in 128 bits\""
                              }
                            ],
                            "id": 4934,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "3895:7:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 4948,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3895:87:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 4949,
                        "nodeType": "ExpressionStatement",
                        "src": "3895:87:24"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 4952,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4929,
                              "src": "4006:5:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              }
                            ],
                            "id": 4951,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "3999:6:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_int128_$",
                              "typeString": "type(int128)"
                            },
                            "typeName": {
                              "id": 4950,
                              "name": "int128",
                              "nodeType": "ElementaryTypeName",
                              "src": "3999:6:24",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 4953,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3999:13:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_int128",
                            "typeString": "int128"
                          }
                        },
                        "functionReturnParameters": 4933,
                        "id": 4954,
                        "nodeType": "Return",
                        "src": "3992:20:24"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4927,
                    "nodeType": "StructuredDocumentation",
                    "src": "3467:350:24",
                    "text": " @dev Returns the downcasted int128 from int256, reverting on\n overflow (when the input is less than smallest int128 or\n greater than largest int128).\n Counterpart to Solidity's `int128` operator.\n Requirements:\n - input must fit into 128 bits\n _Available since v3.1._"
                  },
                  "id": 4956,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toInt128",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4930,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4929,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4956,
                        "src": "3840:12:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        },
                        "typeName": {
                          "id": 4928,
                          "name": "int256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3840:6:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_int256",
                            "typeString": "int256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3839:14:24"
                  },
                  "returnParameters": {
                    "id": 4933,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4932,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4956,
                        "src": "3877:6:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int128",
                          "typeString": "int128"
                        },
                        "typeName": {
                          "id": 4931,
                          "name": "int128",
                          "nodeType": "ElementaryTypeName",
                          "src": "3877:6:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_int128",
                            "typeString": "int128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3876:8:24"
                  },
                  "scope": 5100,
                  "src": "3822:197:24",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 4985,
                    "nodeType": "Block",
                    "src": "4436:130:24",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 4976,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_int256",
                                  "typeString": "int256"
                                },
                                "id": 4970,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 4965,
                                  "name": "value",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4959,
                                  "src": "4454:5:24",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": ">=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_rational_minus_9223372036854775808_by_1",
                                    "typeString": "int_const -9223372036854775808"
                                  },
                                  "id": 4969,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 4967,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "UnaryOperation",
                                    "operator": "-",
                                    "prefix": true,
                                    "src": "4463:2:24",
                                    "subExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "32",
                                      "id": 4966,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "4464:1:24",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_2_by_1",
                                        "typeString": "int_const 2"
                                      },
                                      "value": "2"
                                    },
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_minus_2_by_1",
                                      "typeString": "int_const -2"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "**",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "3633",
                                    "id": 4968,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "4467:2:24",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_63_by_1",
                                      "typeString": "int_const 63"
                                    },
                                    "value": "63"
                                  },
                                  "src": "4463:6:24",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_minus_9223372036854775808_by_1",
                                    "typeString": "int_const -9223372036854775808"
                                  }
                                },
                                "src": "4454:15:24",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "&&",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_int256",
                                  "typeString": "int256"
                                },
                                "id": 4975,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 4971,
                                  "name": "value",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4959,
                                  "src": "4473:5:24",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "<",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_rational_9223372036854775808_by_1",
                                    "typeString": "int_const 9223372036854775808"
                                  },
                                  "id": 4974,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "32",
                                    "id": 4972,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "4481:1:24",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_2_by_1",
                                      "typeString": "int_const 2"
                                    },
                                    "value": "2"
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "**",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "3633",
                                    "id": 4973,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "4484:2:24",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_63_by_1",
                                      "typeString": "int_const 63"
                                    },
                                    "value": "63"
                                  },
                                  "src": "4481:5:24",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_9223372036854775808_by_1",
                                    "typeString": "int_const 9223372036854775808"
                                  }
                                },
                                "src": "4473:13:24",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "4454:32:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "53616665436173743a2076616c756520646f65736e27742066697420696e2036342062697473",
                              "id": 4977,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "4488:41:24",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_93ae0c6bf6ffaece591a770b1865daa9f65157e541970aa9d8dc5f89a9490939",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in 64 bits\""
                              },
                              "value": "SafeCast: value doesn't fit in 64 bits"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_93ae0c6bf6ffaece591a770b1865daa9f65157e541970aa9d8dc5f89a9490939",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in 64 bits\""
                              }
                            ],
                            "id": 4964,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "4446:7:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 4978,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4446:84:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 4979,
                        "nodeType": "ExpressionStatement",
                        "src": "4446:84:24"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 4982,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4959,
                              "src": "4553:5:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              }
                            ],
                            "id": 4981,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "4547:5:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_int64_$",
                              "typeString": "type(int64)"
                            },
                            "typeName": {
                              "id": 4980,
                              "name": "int64",
                              "nodeType": "ElementaryTypeName",
                              "src": "4547:5:24",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 4983,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4547:12:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_int64",
                            "typeString": "int64"
                          }
                        },
                        "functionReturnParameters": 4963,
                        "id": 4984,
                        "nodeType": "Return",
                        "src": "4540:19:24"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4957,
                    "nodeType": "StructuredDocumentation",
                    "src": "4025:345:24",
                    "text": " @dev Returns the downcasted int64 from int256, reverting on\n overflow (when the input is less than smallest int64 or\n greater than largest int64).\n Counterpart to Solidity's `int64` operator.\n Requirements:\n - input must fit into 64 bits\n _Available since v3.1._"
                  },
                  "id": 4986,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toInt64",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4960,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4959,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4986,
                        "src": "4392:12:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        },
                        "typeName": {
                          "id": 4958,
                          "name": "int256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4392:6:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_int256",
                            "typeString": "int256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4391:14:24"
                  },
                  "returnParameters": {
                    "id": 4963,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4962,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 4986,
                        "src": "4429:5:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int64",
                          "typeString": "int64"
                        },
                        "typeName": {
                          "id": 4961,
                          "name": "int64",
                          "nodeType": "ElementaryTypeName",
                          "src": "4429:5:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_int64",
                            "typeString": "int64"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4428:7:24"
                  },
                  "scope": 5100,
                  "src": "4375:191:24",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 5015,
                    "nodeType": "Block",
                    "src": "4983:130:24",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 5006,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_int256",
                                  "typeString": "int256"
                                },
                                "id": 5000,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 4995,
                                  "name": "value",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4989,
                                  "src": "5001:5:24",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": ">=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_rational_minus_2147483648_by_1",
                                    "typeString": "int_const -2147483648"
                                  },
                                  "id": 4999,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 4997,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "UnaryOperation",
                                    "operator": "-",
                                    "prefix": true,
                                    "src": "5010:2:24",
                                    "subExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "32",
                                      "id": 4996,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "5011:1:24",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_2_by_1",
                                        "typeString": "int_const 2"
                                      },
                                      "value": "2"
                                    },
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_minus_2_by_1",
                                      "typeString": "int_const -2"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "**",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "3331",
                                    "id": 4998,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "5014:2:24",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_31_by_1",
                                      "typeString": "int_const 31"
                                    },
                                    "value": "31"
                                  },
                                  "src": "5010:6:24",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_minus_2147483648_by_1",
                                    "typeString": "int_const -2147483648"
                                  }
                                },
                                "src": "5001:15:24",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "&&",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_int256",
                                  "typeString": "int256"
                                },
                                "id": 5005,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 5001,
                                  "name": "value",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 4989,
                                  "src": "5020:5:24",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "<",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_rational_2147483648_by_1",
                                    "typeString": "int_const 2147483648"
                                  },
                                  "id": 5004,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "32",
                                    "id": 5002,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "5028:1:24",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_2_by_1",
                                      "typeString": "int_const 2"
                                    },
                                    "value": "2"
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "**",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "3331",
                                    "id": 5003,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "5031:2:24",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_31_by_1",
                                      "typeString": "int_const 31"
                                    },
                                    "value": "31"
                                  },
                                  "src": "5028:5:24",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_2147483648_by_1",
                                    "typeString": "int_const 2147483648"
                                  }
                                },
                                "src": "5020:13:24",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "5001:32:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "53616665436173743a2076616c756520646f65736e27742066697420696e2033322062697473",
                              "id": 5007,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "5035:41:24",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c907489dafcfb622d3b83f2657a14d6da2f59e0de3116af0d6a80554c1a7cb19",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in 32 bits\""
                              },
                              "value": "SafeCast: value doesn't fit in 32 bits"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_c907489dafcfb622d3b83f2657a14d6da2f59e0de3116af0d6a80554c1a7cb19",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in 32 bits\""
                              }
                            ],
                            "id": 4994,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "4993:7:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 5008,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4993:84:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 5009,
                        "nodeType": "ExpressionStatement",
                        "src": "4993:84:24"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 5012,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 4989,
                              "src": "5100:5:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              }
                            ],
                            "id": 5011,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "5094:5:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_int32_$",
                              "typeString": "type(int32)"
                            },
                            "typeName": {
                              "id": 5010,
                              "name": "int32",
                              "nodeType": "ElementaryTypeName",
                              "src": "5094:5:24",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 5013,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5094:12:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_int32",
                            "typeString": "int32"
                          }
                        },
                        "functionReturnParameters": 4993,
                        "id": 5014,
                        "nodeType": "Return",
                        "src": "5087:19:24"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 4987,
                    "nodeType": "StructuredDocumentation",
                    "src": "4572:345:24",
                    "text": " @dev Returns the downcasted int32 from int256, reverting on\n overflow (when the input is less than smallest int32 or\n greater than largest int32).\n Counterpart to Solidity's `int32` operator.\n Requirements:\n - input must fit into 32 bits\n _Available since v3.1._"
                  },
                  "id": 5016,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toInt32",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 4990,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4989,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5016,
                        "src": "4939:12:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        },
                        "typeName": {
                          "id": 4988,
                          "name": "int256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4939:6:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_int256",
                            "typeString": "int256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4938:14:24"
                  },
                  "returnParameters": {
                    "id": 4993,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 4992,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5016,
                        "src": "4976:5:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int32",
                          "typeString": "int32"
                        },
                        "typeName": {
                          "id": 4991,
                          "name": "int32",
                          "nodeType": "ElementaryTypeName",
                          "src": "4976:5:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_int32",
                            "typeString": "int32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4975:7:24"
                  },
                  "scope": 5100,
                  "src": "4922:191:24",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 5045,
                    "nodeType": "Block",
                    "src": "5530:130:24",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 5036,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_int256",
                                  "typeString": "int256"
                                },
                                "id": 5030,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 5025,
                                  "name": "value",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5019,
                                  "src": "5548:5:24",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": ">=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_rational_minus_32768_by_1",
                                    "typeString": "int_const -32768"
                                  },
                                  "id": 5029,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 5027,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "UnaryOperation",
                                    "operator": "-",
                                    "prefix": true,
                                    "src": "5557:2:24",
                                    "subExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "32",
                                      "id": 5026,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "5558:1:24",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_2_by_1",
                                        "typeString": "int_const 2"
                                      },
                                      "value": "2"
                                    },
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_minus_2_by_1",
                                      "typeString": "int_const -2"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "**",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "3135",
                                    "id": 5028,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "5561:2:24",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_15_by_1",
                                      "typeString": "int_const 15"
                                    },
                                    "value": "15"
                                  },
                                  "src": "5557:6:24",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_minus_32768_by_1",
                                    "typeString": "int_const -32768"
                                  }
                                },
                                "src": "5548:15:24",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "&&",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_int256",
                                  "typeString": "int256"
                                },
                                "id": 5035,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 5031,
                                  "name": "value",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5019,
                                  "src": "5567:5:24",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "<",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_rational_32768_by_1",
                                    "typeString": "int_const 32768"
                                  },
                                  "id": 5034,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "32",
                                    "id": 5032,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "5575:1:24",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_2_by_1",
                                      "typeString": "int_const 2"
                                    },
                                    "value": "2"
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "**",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "3135",
                                    "id": 5033,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "5578:2:24",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_15_by_1",
                                      "typeString": "int_const 15"
                                    },
                                    "value": "15"
                                  },
                                  "src": "5575:5:24",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_32768_by_1",
                                    "typeString": "int_const 32768"
                                  }
                                },
                                "src": "5567:13:24",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "5548:32:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "53616665436173743a2076616c756520646f65736e27742066697420696e2031362062697473",
                              "id": 5037,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "5582:41:24",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_13d3a66f9e0e5c92bbe7743bcd3bdb4695009d5f3a96e5ff49718d715b484033",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in 16 bits\""
                              },
                              "value": "SafeCast: value doesn't fit in 16 bits"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_13d3a66f9e0e5c92bbe7743bcd3bdb4695009d5f3a96e5ff49718d715b484033",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in 16 bits\""
                              }
                            ],
                            "id": 5024,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "5540:7:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 5038,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5540:84:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 5039,
                        "nodeType": "ExpressionStatement",
                        "src": "5540:84:24"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 5042,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5019,
                              "src": "5647:5:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              }
                            ],
                            "id": 5041,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "5641:5:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_int16_$",
                              "typeString": "type(int16)"
                            },
                            "typeName": {
                              "id": 5040,
                              "name": "int16",
                              "nodeType": "ElementaryTypeName",
                              "src": "5641:5:24",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 5043,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5641:12:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_int16",
                            "typeString": "int16"
                          }
                        },
                        "functionReturnParameters": 5023,
                        "id": 5044,
                        "nodeType": "Return",
                        "src": "5634:19:24"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 5017,
                    "nodeType": "StructuredDocumentation",
                    "src": "5119:345:24",
                    "text": " @dev Returns the downcasted int16 from int256, reverting on\n overflow (when the input is less than smallest int16 or\n greater than largest int16).\n Counterpart to Solidity's `int16` operator.\n Requirements:\n - input must fit into 16 bits\n _Available since v3.1._"
                  },
                  "id": 5046,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toInt16",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5020,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5019,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5046,
                        "src": "5486:12:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        },
                        "typeName": {
                          "id": 5018,
                          "name": "int256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5486:6:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_int256",
                            "typeString": "int256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5485:14:24"
                  },
                  "returnParameters": {
                    "id": 5023,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5022,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5046,
                        "src": "5523:5:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int16",
                          "typeString": "int16"
                        },
                        "typeName": {
                          "id": 5021,
                          "name": "int16",
                          "nodeType": "ElementaryTypeName",
                          "src": "5523:5:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_int16",
                            "typeString": "int16"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5522:7:24"
                  },
                  "scope": 5100,
                  "src": "5469:191:24",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 5075,
                    "nodeType": "Block",
                    "src": "6071:126:24",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 5066,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_int256",
                                  "typeString": "int256"
                                },
                                "id": 5060,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 5055,
                                  "name": "value",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5049,
                                  "src": "6089:5:24",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": ">=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_rational_minus_128_by_1",
                                    "typeString": "int_const -128"
                                  },
                                  "id": 5059,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 5057,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "UnaryOperation",
                                    "operator": "-",
                                    "prefix": true,
                                    "src": "6098:2:24",
                                    "subExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "32",
                                      "id": 5056,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "6099:1:24",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_2_by_1",
                                        "typeString": "int_const 2"
                                      },
                                      "value": "2"
                                    },
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_minus_2_by_1",
                                      "typeString": "int_const -2"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "**",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "37",
                                    "id": 5058,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "6102:1:24",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_7_by_1",
                                      "typeString": "int_const 7"
                                    },
                                    "value": "7"
                                  },
                                  "src": "6098:5:24",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_minus_128_by_1",
                                    "typeString": "int_const -128"
                                  }
                                },
                                "src": "6089:14:24",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "&&",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_int256",
                                  "typeString": "int256"
                                },
                                "id": 5065,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 5061,
                                  "name": "value",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5049,
                                  "src": "6107:5:24",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "<",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_rational_128_by_1",
                                    "typeString": "int_const 128"
                                  },
                                  "id": 5064,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "32",
                                    "id": 5062,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "6115:1:24",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_2_by_1",
                                      "typeString": "int_const 2"
                                    },
                                    "value": "2"
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "**",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "37",
                                    "id": 5063,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "6118:1:24",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_7_by_1",
                                      "typeString": "int_const 7"
                                    },
                                    "value": "7"
                                  },
                                  "src": "6115:4:24",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_128_by_1",
                                    "typeString": "int_const 128"
                                  }
                                },
                                "src": "6107:12:24",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "6089:30:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "53616665436173743a2076616c756520646f65736e27742066697420696e20382062697473",
                              "id": 5067,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "6121:40:24",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_2610961ba53259047cd57c60366c5ad0b8aabf5eb4132487619b736715a740d1",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in 8 bits\""
                              },
                              "value": "SafeCast: value doesn't fit in 8 bits"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_2610961ba53259047cd57c60366c5ad0b8aabf5eb4132487619b736715a740d1",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in 8 bits\""
                              }
                            ],
                            "id": 5054,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "6081:7:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 5068,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6081:81:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 5069,
                        "nodeType": "ExpressionStatement",
                        "src": "6081:81:24"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 5072,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5049,
                              "src": "6184:5:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_int256",
                                "typeString": "int256"
                              }
                            ],
                            "id": 5071,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "6179:4:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_int8_$",
                              "typeString": "type(int8)"
                            },
                            "typeName": {
                              "id": 5070,
                              "name": "int8",
                              "nodeType": "ElementaryTypeName",
                              "src": "6179:4:24",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 5073,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6179:11:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_int8",
                            "typeString": "int8"
                          }
                        },
                        "functionReturnParameters": 5053,
                        "id": 5074,
                        "nodeType": "Return",
                        "src": "6172:18:24"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 5047,
                    "nodeType": "StructuredDocumentation",
                    "src": "5666:341:24",
                    "text": " @dev Returns the downcasted int8 from int256, reverting on\n overflow (when the input is less than smallest int8 or\n greater than largest int8).\n Counterpart to Solidity's `int8` operator.\n Requirements:\n - input must fit into 8 bits.\n _Available since v3.1._"
                  },
                  "id": 5076,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toInt8",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5050,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5049,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5076,
                        "src": "6028:12:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        },
                        "typeName": {
                          "id": 5048,
                          "name": "int256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6028:6:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_int256",
                            "typeString": "int256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6027:14:24"
                  },
                  "returnParameters": {
                    "id": 5053,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5052,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5076,
                        "src": "6065:4:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int8",
                          "typeString": "int8"
                        },
                        "typeName": {
                          "id": 5051,
                          "name": "int8",
                          "nodeType": "ElementaryTypeName",
                          "src": "6065:4:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_int8",
                            "typeString": "int8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6064:6:24"
                  },
                  "scope": 5100,
                  "src": "6012:185:24",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 5098,
                    "nodeType": "Block",
                    "src": "6437:114:24",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 5089,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 5085,
                                "name": "value",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5079,
                                "src": "6455:5:24",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_rational_57896044618658097711785492504343953926634992332820282019728792003956564819968_by_1",
                                  "typeString": "int_const 5789...(69 digits omitted)...9968"
                                },
                                "id": 5088,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "32",
                                  "id": 5086,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "6463:1:24",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_2_by_1",
                                    "typeString": "int_const 2"
                                  },
                                  "value": "2"
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "**",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "323535",
                                  "id": 5087,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "6466:3:24",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_255_by_1",
                                    "typeString": "int_const 255"
                                  },
                                  "value": "255"
                                },
                                "src": "6463:6:24",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_57896044618658097711785492504343953926634992332820282019728792003956564819968_by_1",
                                  "typeString": "int_const 5789...(69 digits omitted)...9968"
                                }
                              },
                              "src": "6455:14:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "53616665436173743a2076616c756520646f65736e27742066697420696e20616e20696e74323536",
                              "id": 5090,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "6471:42:24",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_d70dcf21692b3c91b4c5fbb89ed57f464aa42efbe5b0ea96c4acb7c080144227",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in an int256\""
                              },
                              "value": "SafeCast: value doesn't fit in an int256"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_d70dcf21692b3c91b4c5fbb89ed57f464aa42efbe5b0ea96c4acb7c080144227",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in an int256\""
                              }
                            ],
                            "id": 5084,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "6447:7:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 5091,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6447:67:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 5092,
                        "nodeType": "ExpressionStatement",
                        "src": "6447:67:24"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 5095,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5079,
                              "src": "6538:5:24",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 5094,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "6531:6:24",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_int256_$",
                              "typeString": "type(int256)"
                            },
                            "typeName": {
                              "id": 5093,
                              "name": "int256",
                              "nodeType": "ElementaryTypeName",
                              "src": "6531:6:24",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 5096,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6531:13:24",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_int256",
                            "typeString": "int256"
                          }
                        },
                        "functionReturnParameters": 5083,
                        "id": 5097,
                        "nodeType": "Return",
                        "src": "6524:20:24"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 5077,
                    "nodeType": "StructuredDocumentation",
                    "src": "6203:165:24",
                    "text": " @dev Converts an unsigned uint256 into a signed int256.\n Requirements:\n - input must be less than or equal to maxInt256."
                  },
                  "id": 5099,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toInt256",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5080,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5079,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5099,
                        "src": "6391:13:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5078,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6391:7:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6390:15:24"
                  },
                  "returnParameters": {
                    "id": 5083,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5082,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5099,
                        "src": "6429:6:24",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        },
                        "typeName": {
                          "id": 5081,
                          "name": "int256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6429:6:24",
                          "typeDescriptions": {
                            "typeIdentifier": "t_int256",
                            "typeString": "int256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6428:8:24"
                  },
                  "scope": 5100,
                  "src": "6373:178:24",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 5101,
              "src": "777:5776:24"
            }
          ],
          "src": "33:6521:24"
        },
        "id": 24
      },
      "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol": {
        "ast": {
          "absolutePath": "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol",
          "exportedSymbols": {
            "StringsUpgradeable": [
              5187
            ]
          },
          "id": 5188,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 5102,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:25"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 5103,
                "nodeType": "StructuredDocumentation",
                "src": "66:34:25",
                "text": " @dev String operations."
              },
              "fullyImplemented": true,
              "id": 5187,
              "linearizedBaseContracts": [
                5187
              ],
              "name": "StringsUpgradeable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 5185,
                    "nodeType": "Block",
                    "src": "292:654:25",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 5113,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 5111,
                            "name": "value",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5106,
                            "src": "494:5:25",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 5112,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "503:1:25",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "494:10:25",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 5117,
                        "nodeType": "IfStatement",
                        "src": "490:51:25",
                        "trueBody": {
                          "id": 5116,
                          "nodeType": "Block",
                          "src": "506:35:25",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 5114,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "string",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "527:3:25",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_stringliteral_044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d",
                                  "typeString": "literal_string \"0\""
                                },
                                "value": "0"
                              },
                              "functionReturnParameters": 5110,
                              "id": 5115,
                              "nodeType": "Return",
                              "src": "520:10:25"
                            }
                          ]
                        }
                      },
                      {
                        "assignments": [
                          5119
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5119,
                            "mutability": "mutable",
                            "name": "temp",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 5185,
                            "src": "550:12:25",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 5118,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "550:7:25",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 5121,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 5120,
                          "name": "value",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5106,
                          "src": "565:5:25",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "550:20:25"
                      },
                      {
                        "assignments": [
                          5123
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5123,
                            "mutability": "mutable",
                            "name": "digits",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 5185,
                            "src": "580:14:25",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 5122,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "580:7:25",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 5124,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "580:14:25"
                      },
                      {
                        "body": {
                          "id": 5135,
                          "nodeType": "Block",
                          "src": "622:57:25",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 5129,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "UnaryOperation",
                                "operator": "++",
                                "prefix": false,
                                "src": "636:8:25",
                                "subExpression": {
                                  "argumentTypes": null,
                                  "id": 5128,
                                  "name": "digits",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5123,
                                  "src": "636:6:25",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 5130,
                              "nodeType": "ExpressionStatement",
                              "src": "636:8:25"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 5133,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 5131,
                                  "name": "temp",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5119,
                                  "src": "658:4:25",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "/=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "hexValue": "3130",
                                  "id": 5132,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "666:2:25",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_10_by_1",
                                    "typeString": "int_const 10"
                                  },
                                  "value": "10"
                                },
                                "src": "658:10:25",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 5134,
                              "nodeType": "ExpressionStatement",
                              "src": "658:10:25"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 5127,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 5125,
                            "name": "temp",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5119,
                            "src": "611:4:25",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 5126,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "619:1:25",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "611:9:25",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 5136,
                        "nodeType": "WhileStatement",
                        "src": "604:75:25"
                      },
                      {
                        "assignments": [
                          5138
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5138,
                            "mutability": "mutable",
                            "name": "buffer",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 5185,
                            "src": "688:19:25",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes"
                            },
                            "typeName": {
                              "id": 5137,
                              "name": "bytes",
                              "nodeType": "ElementaryTypeName",
                              "src": "688:5:25",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 5143,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 5141,
                              "name": "digits",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5123,
                              "src": "720:6:25",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 5140,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "NewExpression",
                            "src": "710:9:25",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_bytes_memory_ptr_$",
                              "typeString": "function (uint256) pure returns (bytes memory)"
                            },
                            "typeName": {
                              "id": 5139,
                              "name": "bytes",
                              "nodeType": "ElementaryTypeName",
                              "src": "714:5:25",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                              }
                            }
                          },
                          "id": 5142,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "710:17:25",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "688:39:25"
                      },
                      {
                        "assignments": [
                          5145
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5145,
                            "mutability": "mutable",
                            "name": "index",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 5185,
                            "src": "737:13:25",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 5144,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "737:7:25",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 5149,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 5148,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 5146,
                            "name": "digits",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5123,
                            "src": "753:6:25",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "-",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "31",
                            "id": 5147,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "762:1:25",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_1_by_1",
                              "typeString": "int_const 1"
                            },
                            "value": "1"
                          },
                          "src": "753:10:25",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "737:26:25"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 5152,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 5150,
                            "name": "temp",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5119,
                            "src": "773:4:25",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 5151,
                            "name": "value",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5106,
                            "src": "780:5:25",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "773:12:25",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 5153,
                        "nodeType": "ExpressionStatement",
                        "src": "773:12:25"
                      },
                      {
                        "body": {
                          "id": 5178,
                          "nodeType": "Block",
                          "src": "813:96:25",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 5172,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 5157,
                                    "name": "buffer",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 5138,
                                    "src": "827:6:25",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes_memory_ptr",
                                      "typeString": "bytes memory"
                                    }
                                  },
                                  "id": 5160,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 5159,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "UnaryOperation",
                                    "operator": "--",
                                    "prefix": false,
                                    "src": "834:7:25",
                                    "subExpression": {
                                      "argumentTypes": null,
                                      "id": 5158,
                                      "name": "index",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 5145,
                                      "src": "834:5:25",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "827:15:25",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes1",
                                    "typeString": "bytes1"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "commonType": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          "id": 5169,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftExpression": {
                                            "argumentTypes": null,
                                            "hexValue": "3438",
                                            "id": 5165,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "kind": "number",
                                            "lValueRequested": false,
                                            "nodeType": "Literal",
                                            "src": "858:2:25",
                                            "subdenomination": null,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_rational_48_by_1",
                                              "typeString": "int_const 48"
                                            },
                                            "value": "48"
                                          },
                                          "nodeType": "BinaryOperation",
                                          "operator": "+",
                                          "rightExpression": {
                                            "argumentTypes": null,
                                            "commonType": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            },
                                            "id": 5168,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftExpression": {
                                              "argumentTypes": null,
                                              "id": 5166,
                                              "name": "temp",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 5119,
                                              "src": "863:4:25",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "nodeType": "BinaryOperation",
                                            "operator": "%",
                                            "rightExpression": {
                                              "argumentTypes": null,
                                              "hexValue": "3130",
                                              "id": 5167,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "kind": "number",
                                              "lValueRequested": false,
                                              "nodeType": "Literal",
                                              "src": "870:2:25",
                                              "subdenomination": null,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_rational_10_by_1",
                                                "typeString": "int_const 10"
                                              },
                                              "value": "10"
                                            },
                                            "src": "863:9:25",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "src": "858:14:25",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "id": 5164,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "852:5:25",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_uint8_$",
                                          "typeString": "type(uint8)"
                                        },
                                        "typeName": {
                                          "id": 5163,
                                          "name": "uint8",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "852:5:25",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      },
                                      "id": 5170,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "852:21:25",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint8",
                                        "typeString": "uint8"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint8",
                                        "typeString": "uint8"
                                      }
                                    ],
                                    "id": 5162,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "845:6:25",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_bytes1_$",
                                      "typeString": "type(bytes1)"
                                    },
                                    "typeName": {
                                      "id": 5161,
                                      "name": "bytes1",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "845:6:25",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 5171,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "845:29:25",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes1",
                                    "typeString": "bytes1"
                                  }
                                },
                                "src": "827:47:25",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes1",
                                  "typeString": "bytes1"
                                }
                              },
                              "id": 5173,
                              "nodeType": "ExpressionStatement",
                              "src": "827:47:25"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 5176,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 5174,
                                  "name": "temp",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5119,
                                  "src": "888:4:25",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "/=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "hexValue": "3130",
                                  "id": 5175,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "896:2:25",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_10_by_1",
                                    "typeString": "int_const 10"
                                  },
                                  "value": "10"
                                },
                                "src": "888:10:25",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 5177,
                              "nodeType": "ExpressionStatement",
                              "src": "888:10:25"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 5156,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 5154,
                            "name": "temp",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5119,
                            "src": "802:4:25",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 5155,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "810:1:25",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "802:9:25",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 5179,
                        "nodeType": "WhileStatement",
                        "src": "795:114:25"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 5182,
                              "name": "buffer",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5138,
                              "src": "932:6:25",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 5181,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "925:6:25",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_string_storage_ptr_$",
                              "typeString": "type(string storage pointer)"
                            },
                            "typeName": {
                              "id": 5180,
                              "name": "string",
                              "nodeType": "ElementaryTypeName",
                              "src": "925:6:25",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 5183,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "925:14:25",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "functionReturnParameters": 5110,
                        "id": 5184,
                        "nodeType": "Return",
                        "src": "918:21:25"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 5104,
                    "nodeType": "StructuredDocumentation",
                    "src": "134:82:25",
                    "text": " @dev Converts a `uint256` to its ASCII `string` representation."
                  },
                  "id": 5186,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toString",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5107,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5106,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5186,
                        "src": "239:13:25",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5105,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "239:7:25",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "238:15:25"
                  },
                  "returnParameters": {
                    "id": 5110,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5109,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5186,
                        "src": "277:13:25",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 5108,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "277:6:25",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "276:15:25"
                  },
                  "scope": 5187,
                  "src": "221:725:25",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 5188,
              "src": "101:847:25"
            }
          ],
          "src": "33:916:25"
        },
        "id": 25
      },
      "@pooltogether/fixed-point/contracts/FixedPoint.sol": {
        "ast": {
          "absolutePath": "@pooltogether/fixed-point/contracts/FixedPoint.sol",
          "exportedSymbols": {
            "FixedPoint": [
              5279
            ]
          },
          "id": 5280,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 5189,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "650:31:26"
            },
            {
              "absolutePath": "@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol",
              "file": "./external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol",
              "id": 5190,
              "nodeType": "ImportDirective",
              "scope": 5280,
              "sourceUnit": 5476,
              "src": "683:65:26",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 5191,
                "nodeType": "StructuredDocumentation",
                "src": "750:207:26",
                "text": " @author Brendan Asselstine\n @notice Provides basic fixed point math calculations.\n This library calculates integer fractions by scaling values by 1e18 then performing standard integer math."
              },
              "fullyImplemented": true,
              "id": 5279,
              "linearizedBaseContracts": [
                5279
              ],
              "name": "FixedPoint",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 5194,
                  "libraryName": {
                    "contractScope": null,
                    "id": 5192,
                    "name": "OpenZeppelinSafeMath_V3_3_0",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 5475,
                    "src": "989:27:26",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_OpenZeppelinSafeMath_V3_3_0_$5475",
                      "typeString": "library OpenZeppelinSafeMath_V3_3_0"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "983:46:26",
                  "typeName": {
                    "id": 5193,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1021:7:26",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "constant": true,
                  "id": 5197,
                  "mutability": "constant",
                  "name": "SCALE",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 5279,
                  "src": "1115:38:26",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 5195,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1115:7:26",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "31653138",
                    "id": 5196,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "1149:4:26",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_1000000000000000000_by_1",
                      "typeString": "int_const 1000000000000000000"
                    },
                    "value": "1e18"
                  },
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 5223,
                    "nodeType": "Block",
                    "src": "1583:127:26",
                    "statements": [
                      {
                        "assignments": [
                          5208
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5208,
                            "mutability": "mutable",
                            "name": "mantissa",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 5223,
                            "src": "1593:16:26",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 5207,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "1593:7:26",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 5213,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 5211,
                              "name": "SCALE",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5197,
                              "src": "1626:5:26",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 5209,
                              "name": "numerator",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5200,
                              "src": "1612:9:26",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 5210,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "mul",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5388,
                            "src": "1612:13:26",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 5212,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1612:20:26",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1593:39:26"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 5219,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 5214,
                            "name": "mantissa",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5208,
                            "src": "1642:8:26",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 5217,
                                "name": "denominator",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5202,
                                "src": "1666:11:26",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 5215,
                                "name": "mantissa",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5208,
                                "src": "1653:8:26",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 5216,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "div",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5405,
                              "src": "1653:12:26",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 5218,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1653:25:26",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "1642:36:26",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 5220,
                        "nodeType": "ExpressionStatement",
                        "src": "1642:36:26"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 5221,
                          "name": "mantissa",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5208,
                          "src": "1695:8:26",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 5206,
                        "id": 5222,
                        "nodeType": "Return",
                        "src": "1688:15:26"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 5198,
                    "nodeType": "StructuredDocumentation",
                    "src": "1160:319:26",
                    "text": " Calculates a Fixed18 mantissa given the numerator and denominator\n The mantissa = (numerator * 1e18) / denominator\n @param numerator The mantissa numerator\n @param denominator The mantissa denominator\n @return The mantissa of the fraction"
                  },
                  "id": 5224,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "calculateMantissa",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5203,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5200,
                        "mutability": "mutable",
                        "name": "numerator",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5224,
                        "src": "1511:17:26",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5199,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1511:7:26",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5202,
                        "mutability": "mutable",
                        "name": "denominator",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5224,
                        "src": "1530:19:26",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5201,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1530:7:26",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1510:40:26"
                  },
                  "returnParameters": {
                    "id": 5206,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5205,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5224,
                        "src": "1574:7:26",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5204,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1574:7:26",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1573:9:26"
                  },
                  "scope": 5279,
                  "src": "1484:226:26",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 5250,
                    "nodeType": "Block",
                    "src": "2060:108:26",
                    "statements": [
                      {
                        "assignments": [
                          5235
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5235,
                            "mutability": "mutable",
                            "name": "result",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 5250,
                            "src": "2070:14:26",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 5234,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "2070:7:26",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 5240,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 5238,
                              "name": "b",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5227,
                              "src": "2100:1:26",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 5236,
                              "name": "mantissa",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5229,
                              "src": "2087:8:26",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 5237,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "mul",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5388,
                            "src": "2087:12:26",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 5239,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2087:15:26",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2070:32:26"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 5246,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 5241,
                            "name": "result",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5235,
                            "src": "2112:6:26",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 5244,
                                "name": "SCALE",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5197,
                                "src": "2132:5:26",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 5242,
                                "name": "result",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5235,
                                "src": "2121:6:26",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 5243,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "div",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5405,
                              "src": "2121:10:26",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 5245,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "2121:17:26",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "2112:26:26",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 5247,
                        "nodeType": "ExpressionStatement",
                        "src": "2112:26:26"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 5248,
                          "name": "result",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5235,
                          "src": "2155:6:26",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 5233,
                        "id": 5249,
                        "nodeType": "Return",
                        "src": "2148:13:26"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 5225,
                    "nodeType": "StructuredDocumentation",
                    "src": "1716:246:26",
                    "text": " Multiplies a Fixed18 number by an integer.\n @param b The whole integer to multiply\n @param mantissa The Fixed18 number\n @return An integer that is the result of multiplying the params."
                  },
                  "id": 5251,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "multiplyUintByMantissa",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5230,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5227,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5251,
                        "src": "1999:9:26",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5226,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1999:7:26",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5229,
                        "mutability": "mutable",
                        "name": "mantissa",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5251,
                        "src": "2010:16:26",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5228,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2010:7:26",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1998:29:26"
                  },
                  "returnParameters": {
                    "id": 5233,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5232,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5251,
                        "src": "2051:7:26",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5231,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2051:7:26",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2050:9:26"
                  },
                  "scope": 5279,
                  "src": "1967:201:26",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 5277,
                    "nodeType": "Block",
                    "src": "2559:115:26",
                    "statements": [
                      {
                        "assignments": [
                          5262
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5262,
                            "mutability": "mutable",
                            "name": "result",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 5277,
                            "src": "2569:14:26",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 5261,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "2569:7:26",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 5267,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 5265,
                              "name": "dividend",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5254,
                              "src": "2596:8:26",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 5263,
                              "name": "SCALE",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5197,
                              "src": "2586:5:26",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 5264,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "mul",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5388,
                            "src": "2586:9:26",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 5266,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2586:19:26",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2569:36:26"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 5273,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 5268,
                            "name": "result",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5262,
                            "src": "2615:6:26",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 5271,
                                "name": "mantissa",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5256,
                                "src": "2635:8:26",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 5269,
                                "name": "result",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5262,
                                "src": "2624:6:26",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 5270,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "div",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5405,
                              "src": "2624:10:26",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 5272,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "2624:20:26",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "2615:29:26",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 5274,
                        "nodeType": "ExpressionStatement",
                        "src": "2615:29:26"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 5275,
                          "name": "result",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5262,
                          "src": "2661:6:26",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 5260,
                        "id": 5276,
                        "nodeType": "Return",
                        "src": "2654:13:26"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 5252,
                    "nodeType": "StructuredDocumentation",
                    "src": "2174:282:26",
                    "text": " Divides an integer by a fixed point 18 mantissa\n @param dividend The integer to divide\n @param mantissa The fixed point 18 number to serve as the divisor\n @return An integer that is the result of dividing an integer by a fixed point 18 mantissa"
                  },
                  "id": 5278,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "divideUintByMantissa",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5257,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5254,
                        "mutability": "mutable",
                        "name": "dividend",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5278,
                        "src": "2491:16:26",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5253,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2491:7:26",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5256,
                        "mutability": "mutable",
                        "name": "mantissa",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5278,
                        "src": "2509:16:26",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5255,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2509:7:26",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2490:36:26"
                  },
                  "returnParameters": {
                    "id": 5260,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5259,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5278,
                        "src": "2550:7:26",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5258,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2550:7:26",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2549:9:26"
                  },
                  "scope": 5279,
                  "src": "2461:213:26",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 5280,
              "src": "958:1718:26"
            }
          ],
          "src": "650:2027:26"
        },
        "id": 26
      },
      "@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol": {
        "ast": {
          "absolutePath": "@pooltogether/fixed-point/contracts/external/openzeppelin/OpenZeppelinSafeMath_V3_3_0.sol",
          "exportedSymbols": {
            "OpenZeppelinSafeMath_V3_3_0": [
              5475
            ]
          },
          "id": 5476,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 5281,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "92:31:27"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 5282,
                "nodeType": "StructuredDocumentation",
                "src": "125:563:27",
                "text": " @dev Wrappers over Solidity's arithmetic operations with added overflow\n checks.\n Arithmetic operations in Solidity wrap on overflow. This can easily result\n in bugs, because programmers usually assume that an overflow raises an\n error, which is the standard behavior in high level programming languages.\n `SafeMath` restores this intuition by reverting the transaction when an\n operation overflows.\n Using this library instead of the unchecked operations eliminates an entire\n class of bugs, so it's recommended to use it always."
              },
              "fullyImplemented": true,
              "id": 5475,
              "linearizedBaseContracts": [
                5475
              ],
              "name": "OpenZeppelinSafeMath_V3_3_0",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 5307,
                    "nodeType": "Block",
                    "src": "1027:109:27",
                    "statements": [
                      {
                        "assignments": [
                          5293
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5293,
                            "mutability": "mutable",
                            "name": "c",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 5307,
                            "src": "1037:9:27",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 5292,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "1037:7:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 5297,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 5296,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 5294,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5285,
                            "src": "1049:1:27",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "+",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 5295,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5287,
                            "src": "1053:1:27",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "1049:5:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1037:17:27"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 5301,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 5299,
                                "name": "c",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5293,
                                "src": "1072:1:27",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 5300,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5285,
                                "src": "1077:1:27",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "1072:6:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "536166654d6174683a206164646974696f6e206f766572666c6f77",
                              "id": 5302,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1080:29:27",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_30cc447bcc13b3e22b45cef0dd9b0b514842d836dd9b6eb384e20dedfb47723a",
                                "typeString": "literal_string \"SafeMath: addition overflow\""
                              },
                              "value": "SafeMath: addition overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_30cc447bcc13b3e22b45cef0dd9b0b514842d836dd9b6eb384e20dedfb47723a",
                                "typeString": "literal_string \"SafeMath: addition overflow\""
                              }
                            ],
                            "id": 5298,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1064:7:27",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 5303,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1064:46:27",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 5304,
                        "nodeType": "ExpressionStatement",
                        "src": "1064:46:27"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 5305,
                          "name": "c",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5293,
                          "src": "1128:1:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 5291,
                        "id": 5306,
                        "nodeType": "Return",
                        "src": "1121:8:27"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 5283,
                    "nodeType": "StructuredDocumentation",
                    "src": "731:224:27",
                    "text": " @dev Returns the addition of two unsigned integers, reverting on\n overflow.\n Counterpart to Solidity's `+` operator.\n Requirements:\n - Addition cannot overflow."
                  },
                  "id": 5308,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "add",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5288,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5285,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5308,
                        "src": "973:9:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5284,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "973:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5287,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5308,
                        "src": "984:9:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5286,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "984:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "972:22:27"
                  },
                  "returnParameters": {
                    "id": 5291,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5290,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5308,
                        "src": "1018:7:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5289,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1018:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1017:9:27"
                  },
                  "scope": 5475,
                  "src": "960:176:27",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 5324,
                    "nodeType": "Block",
                    "src": "1474:67:27",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 5319,
                              "name": "a",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5311,
                              "src": "1495:1:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 5320,
                              "name": "b",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5313,
                              "src": "1498:1:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "536166654d6174683a207375627472616374696f6e206f766572666c6f77",
                              "id": 5321,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1501:32:27",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_50b058e9b5320e58880d88223c9801cd9eecdcf90323d5c2318bc1b6b916e862",
                                "typeString": "literal_string \"SafeMath: subtraction overflow\""
                              },
                              "value": "SafeMath: subtraction overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_50b058e9b5320e58880d88223c9801cd9eecdcf90323d5c2318bc1b6b916e862",
                                "typeString": "literal_string \"SafeMath: subtraction overflow\""
                              }
                            ],
                            "id": 5318,
                            "name": "sub",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              5325,
                              5353
                            ],
                            "referencedDeclaration": 5353,
                            "src": "1491:3:27",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_string_memory_ptr_$returns$_t_uint256_$",
                              "typeString": "function (uint256,uint256,string memory) pure returns (uint256)"
                            }
                          },
                          "id": 5322,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1491:43:27",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 5317,
                        "id": 5323,
                        "nodeType": "Return",
                        "src": "1484:50:27"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 5309,
                    "nodeType": "StructuredDocumentation",
                    "src": "1142:260:27",
                    "text": " @dev Returns the subtraction of two unsigned integers, reverting on\n overflow (when the result is negative).\n Counterpart to Solidity's `-` operator.\n Requirements:\n - Subtraction cannot overflow."
                  },
                  "id": 5325,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5314,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5311,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5325,
                        "src": "1420:9:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5310,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1420:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5313,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5325,
                        "src": "1431:9:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5312,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1431:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1419:22:27"
                  },
                  "returnParameters": {
                    "id": 5317,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5316,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5325,
                        "src": "1465:7:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5315,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1465:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1464:9:27"
                  },
                  "scope": 5475,
                  "src": "1407:134:27",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 5352,
                    "nodeType": "Block",
                    "src": "1927:92:27",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 5340,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 5338,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5330,
                                "src": "1945:1:27",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 5339,
                                "name": "a",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5328,
                                "src": "1950:1:27",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "1945:6:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 5341,
                              "name": "errorMessage",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5332,
                              "src": "1953:12:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 5337,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1937:7:27",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 5342,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1937:29:27",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 5343,
                        "nodeType": "ExpressionStatement",
                        "src": "1937:29:27"
                      },
                      {
                        "assignments": [
                          5345
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5345,
                            "mutability": "mutable",
                            "name": "c",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 5352,
                            "src": "1976:9:27",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 5344,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "1976:7:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 5349,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 5348,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 5346,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5328,
                            "src": "1988:1:27",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "-",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 5347,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5330,
                            "src": "1992:1:27",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "1988:5:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1976:17:27"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 5350,
                          "name": "c",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5345,
                          "src": "2011:1:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 5336,
                        "id": 5351,
                        "nodeType": "Return",
                        "src": "2004:8:27"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 5326,
                    "nodeType": "StructuredDocumentation",
                    "src": "1547:280:27",
                    "text": " @dev Returns the subtraction of two unsigned integers, reverting with custom message on\n overflow (when the result is negative).\n Counterpart to Solidity's `-` operator.\n Requirements:\n - Subtraction cannot overflow."
                  },
                  "id": 5353,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "sub",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5333,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5328,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5353,
                        "src": "1845:9:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5327,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1845:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5330,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5353,
                        "src": "1856:9:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5329,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1856:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5332,
                        "mutability": "mutable",
                        "name": "errorMessage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5353,
                        "src": "1867:26:27",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 5331,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "1867:6:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1844:50:27"
                  },
                  "returnParameters": {
                    "id": 5336,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5335,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5353,
                        "src": "1918:7:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5334,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1918:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1917:9:27"
                  },
                  "scope": 5475,
                  "src": "1832:187:27",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 5387,
                    "nodeType": "Block",
                    "src": "2333:392:27",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 5365,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 5363,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5356,
                            "src": "2565:1:27",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 5364,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "2570:1:27",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "2565:6:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 5369,
                        "nodeType": "IfStatement",
                        "src": "2561:45:27",
                        "trueBody": {
                          "id": 5368,
                          "nodeType": "Block",
                          "src": "2573:33:27",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 5366,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "2594:1:27",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "functionReturnParameters": 5362,
                              "id": 5367,
                              "nodeType": "Return",
                              "src": "2587:8:27"
                            }
                          ]
                        }
                      },
                      {
                        "assignments": [
                          5371
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5371,
                            "mutability": "mutable",
                            "name": "c",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 5387,
                            "src": "2616:9:27",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 5370,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "2616:7:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 5375,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 5374,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 5372,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5356,
                            "src": "2628:1:27",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "*",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 5373,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5358,
                            "src": "2632:1:27",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "2628:5:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2616:17:27"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 5381,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 5379,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 5377,
                                  "name": "c",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5371,
                                  "src": "2651:1:27",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "/",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 5378,
                                  "name": "a",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5356,
                                  "src": "2655:1:27",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "2651:5:27",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 5380,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5358,
                                "src": "2660:1:27",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "2651:10:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77",
                              "id": 5382,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2663:35:27",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_9113bb53c2876a3805b2c9242029423fc540a728243ce887ab24c82cf119fba3",
                                "typeString": "literal_string \"SafeMath: multiplication overflow\""
                              },
                              "value": "SafeMath: multiplication overflow"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_9113bb53c2876a3805b2c9242029423fc540a728243ce887ab24c82cf119fba3",
                                "typeString": "literal_string \"SafeMath: multiplication overflow\""
                              }
                            ],
                            "id": 5376,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2643:7:27",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 5383,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2643:56:27",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 5384,
                        "nodeType": "ExpressionStatement",
                        "src": "2643:56:27"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 5385,
                          "name": "c",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5371,
                          "src": "2717:1:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 5362,
                        "id": 5386,
                        "nodeType": "Return",
                        "src": "2710:8:27"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 5354,
                    "nodeType": "StructuredDocumentation",
                    "src": "2025:236:27",
                    "text": " @dev Returns the multiplication of two unsigned integers, reverting on\n overflow.\n Counterpart to Solidity's `*` operator.\n Requirements:\n - Multiplication cannot overflow."
                  },
                  "id": 5388,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "mul",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5359,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5356,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5388,
                        "src": "2279:9:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5355,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2279:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5358,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5388,
                        "src": "2290:9:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5357,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2290:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2278:22:27"
                  },
                  "returnParameters": {
                    "id": 5362,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5361,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5388,
                        "src": "2324:7:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5360,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2324:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2323:9:27"
                  },
                  "scope": 5475,
                  "src": "2266:459:27",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 5404,
                    "nodeType": "Block",
                    "src": "3254:63:27",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 5399,
                              "name": "a",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5391,
                              "src": "3275:1:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 5400,
                              "name": "b",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5393,
                              "src": "3278:1:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "536166654d6174683a206469766973696f6e206279207a65726f",
                              "id": 5401,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3281:28:27",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_5b7cc70dda4dc2143e5adb63bd5d1f349504f461dbdfd9bc76fac1f8ca6d019f",
                                "typeString": "literal_string \"SafeMath: division by zero\""
                              },
                              "value": "SafeMath: division by zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_5b7cc70dda4dc2143e5adb63bd5d1f349504f461dbdfd9bc76fac1f8ca6d019f",
                                "typeString": "literal_string \"SafeMath: division by zero\""
                              }
                            ],
                            "id": 5398,
                            "name": "div",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              5405,
                              5433
                            ],
                            "referencedDeclaration": 5433,
                            "src": "3271:3:27",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_string_memory_ptr_$returns$_t_uint256_$",
                              "typeString": "function (uint256,uint256,string memory) pure returns (uint256)"
                            }
                          },
                          "id": 5402,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3271:39:27",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 5397,
                        "id": 5403,
                        "nodeType": "Return",
                        "src": "3264:46:27"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 5389,
                    "nodeType": "StructuredDocumentation",
                    "src": "2731:451:27",
                    "text": " @dev Returns the integer division of two unsigned integers. Reverts on\n division by zero. The result is rounded towards zero.\n Counterpart to Solidity's `/` operator. Note: this function uses a\n `revert` opcode (which leaves remaining gas untouched) while Solidity\n uses an invalid opcode to revert (consuming all remaining gas).\n Requirements:\n - The divisor cannot be zero."
                  },
                  "id": 5405,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "div",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5394,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5391,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5405,
                        "src": "3200:9:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5390,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3200:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5393,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5405,
                        "src": "3211:9:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5392,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3211:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3199:22:27"
                  },
                  "returnParameters": {
                    "id": 5397,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5396,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5405,
                        "src": "3245:7:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5395,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3245:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3244:9:27"
                  },
                  "scope": 5475,
                  "src": "3187:130:27",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 5432,
                    "nodeType": "Block",
                    "src": "3894:177:27",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 5420,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 5418,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5410,
                                "src": "3912:1:27",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 5419,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "3916:1:27",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "3912:5:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 5421,
                              "name": "errorMessage",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5412,
                              "src": "3919:12:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 5417,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "3904:7:27",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 5422,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3904:28:27",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 5423,
                        "nodeType": "ExpressionStatement",
                        "src": "3904:28:27"
                      },
                      {
                        "assignments": [
                          5425
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5425,
                            "mutability": "mutable",
                            "name": "c",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 5432,
                            "src": "3942:9:27",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 5424,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "3942:7:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 5429,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 5428,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 5426,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5408,
                            "src": "3954:1:27",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "/",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 5427,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5410,
                            "src": "3958:1:27",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "3954:5:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3942:17:27"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 5430,
                          "name": "c",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5425,
                          "src": "4063:1:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 5416,
                        "id": 5431,
                        "nodeType": "Return",
                        "src": "4056:8:27"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 5406,
                    "nodeType": "StructuredDocumentation",
                    "src": "3323:471:27",
                    "text": " @dev Returns the integer division of two unsigned integers. Reverts with custom message on\n division by zero. The result is rounded towards zero.\n Counterpart to Solidity's `/` operator. Note: this function uses a\n `revert` opcode (which leaves remaining gas untouched) while Solidity\n uses an invalid opcode to revert (consuming all remaining gas).\n Requirements:\n - The divisor cannot be zero."
                  },
                  "id": 5433,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "div",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5413,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5408,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5433,
                        "src": "3812:9:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5407,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3812:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5410,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5433,
                        "src": "3823:9:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5409,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3823:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5412,
                        "mutability": "mutable",
                        "name": "errorMessage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5433,
                        "src": "3834:26:27",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 5411,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "3834:6:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3811:50:27"
                  },
                  "returnParameters": {
                    "id": 5416,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5415,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5433,
                        "src": "3885:7:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5414,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3885:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3884:9:27"
                  },
                  "scope": 5475,
                  "src": "3799:272:27",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 5449,
                    "nodeType": "Block",
                    "src": "4589:61:27",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 5444,
                              "name": "a",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5436,
                              "src": "4610:1:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 5445,
                              "name": "b",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5438,
                              "src": "4613:1:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "536166654d6174683a206d6f64756c6f206279207a65726f",
                              "id": 5446,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "4616:26:27",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_726e51f7b81fce0a68f5f214f445e275313b20b1633f08ce954ee39abf8d7832",
                                "typeString": "literal_string \"SafeMath: modulo by zero\""
                              },
                              "value": "SafeMath: modulo by zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_726e51f7b81fce0a68f5f214f445e275313b20b1633f08ce954ee39abf8d7832",
                                "typeString": "literal_string \"SafeMath: modulo by zero\""
                              }
                            ],
                            "id": 5443,
                            "name": "mod",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              5450,
                              5474
                            ],
                            "referencedDeclaration": 5474,
                            "src": "4606:3:27",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_string_memory_ptr_$returns$_t_uint256_$",
                              "typeString": "function (uint256,uint256,string memory) pure returns (uint256)"
                            }
                          },
                          "id": 5447,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4606:37:27",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 5442,
                        "id": 5448,
                        "nodeType": "Return",
                        "src": "4599:44:27"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 5434,
                    "nodeType": "StructuredDocumentation",
                    "src": "4077:440:27",
                    "text": " @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n Reverts when dividing by zero.\n Counterpart to Solidity's `%` operator. This function uses a `revert`\n opcode (which leaves remaining gas untouched) while Solidity uses an\n invalid opcode to revert (consuming all remaining gas).\n Requirements:\n - The divisor cannot be zero."
                  },
                  "id": 5450,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "mod",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5439,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5436,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5450,
                        "src": "4535:9:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5435,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4535:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5438,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5450,
                        "src": "4546:9:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5437,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4546:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4534:22:27"
                  },
                  "returnParameters": {
                    "id": 5442,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5441,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5450,
                        "src": "4580:7:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5440,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4580:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4579:9:27"
                  },
                  "scope": 5475,
                  "src": "4522:128:27",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 5473,
                    "nodeType": "Block",
                    "src": "5216:68:27",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 5465,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 5463,
                                "name": "b",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5455,
                                "src": "5234:1:27",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 5464,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "5239:1:27",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "5234:6:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 5466,
                              "name": "errorMessage",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5457,
                              "src": "5242:12:27",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 5462,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "5226:7:27",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 5467,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5226:29:27",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 5468,
                        "nodeType": "ExpressionStatement",
                        "src": "5226:29:27"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 5471,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 5469,
                            "name": "a",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5453,
                            "src": "5272:1:27",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "%",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 5470,
                            "name": "b",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5455,
                            "src": "5276:1:27",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "5272:5:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 5461,
                        "id": 5472,
                        "nodeType": "Return",
                        "src": "5265:12:27"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 5451,
                    "nodeType": "StructuredDocumentation",
                    "src": "4656:460:27",
                    "text": " @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),\n Reverts with custom message when dividing by zero.\n Counterpart to Solidity's `%` operator. This function uses a `revert`\n opcode (which leaves remaining gas untouched) while Solidity uses an\n invalid opcode to revert (consuming all remaining gas).\n Requirements:\n - The divisor cannot be zero."
                  },
                  "id": 5474,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "mod",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5458,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5453,
                        "mutability": "mutable",
                        "name": "a",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5474,
                        "src": "5134:9:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5452,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5134:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5455,
                        "mutability": "mutable",
                        "name": "b",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5474,
                        "src": "5145:9:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5454,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5145:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5457,
                        "mutability": "mutable",
                        "name": "errorMessage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5474,
                        "src": "5156:26:27",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 5456,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "5156:6:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5133:50:27"
                  },
                  "returnParameters": {
                    "id": 5461,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5460,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5474,
                        "src": "5207:7:27",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5459,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5207:7:27",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5206:9:27"
                  },
                  "scope": 5475,
                  "src": "5121:163:27",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 5476,
              "src": "689:4597:27"
            }
          ],
          "src": "92:5195:27"
        },
        "id": 27
      },
      "@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol": {
        "ast": {
          "absolutePath": "@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol",
          "exportedSymbols": {
            "RNGInterface": [
              5531
            ]
          },
          "id": 5532,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 5477,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:24:28"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": {
                "id": 5478,
                "nodeType": "StructuredDocumentation",
                "src": "63:175:28",
                "text": "@title Random Number Generator Interface\n @notice Provides an interface for requesting random numbers from 3rd-party RNG services (Chainlink VRF, Starkware VDF, etc..)"
              },
              "fullyImplemented": false,
              "id": 5531,
              "linearizedBaseContracts": [
                5531
              ],
              "name": "RNGInterface",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 5479,
                    "nodeType": "StructuredDocumentation",
                    "src": "266:242:28",
                    "text": "@notice Emitted when a new request for a random number has been submitted\n @param requestId The indexed ID of the request used to get the results of the RNG service\n @param sender The indexed address of the sender of the request"
                  },
                  "id": 5485,
                  "name": "RandomNumberRequested",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 5484,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5481,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "requestId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5485,
                        "src": "539:24:28",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 5480,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "539:6:28",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5483,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "sender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5485,
                        "src": "565:22:28",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 5482,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "565:7:28",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "538:50:28"
                  },
                  "src": "511:78:28"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 5486,
                    "nodeType": "StructuredDocumentation",
                    "src": "593:257:28",
                    "text": "@notice Emitted when an existing request for a random number has been completed\n @param requestId The indexed ID of the request used to get the results of the RNG service\n @param randomNumber The random number produced by the 3rd-party service"
                  },
                  "id": 5492,
                  "name": "RandomNumberCompleted",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 5491,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5488,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "requestId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5492,
                        "src": "881:24:28",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 5487,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "881:6:28",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5490,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "randomNumber",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5492,
                        "src": "907:20:28",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5489,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "907:7:28",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "880:48:28"
                  },
                  "src": "853:76:28"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 5493,
                    "nodeType": "StructuredDocumentation",
                    "src": "933:129:28",
                    "text": "@notice Gets the last request id used by the RNG service\n @return requestId The last request id used in the last request"
                  },
                  "functionSelector": "19c2b4c3",
                  "id": 5498,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "getLastRequestId",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5494,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1090:2:28"
                  },
                  "returnParameters": {
                    "id": 5497,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5496,
                        "mutability": "mutable",
                        "name": "requestId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5498,
                        "src": "1116:16:28",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 5495,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "1116:6:28",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1115:18:28"
                  },
                  "scope": 5531,
                  "src": "1065:69:28",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 5499,
                    "nodeType": "StructuredDocumentation",
                    "src": "1138:212:28",
                    "text": "@notice Gets the Fee for making a Request against an RNG service\n @return feeToken The address of the token that is used to pay fees\n @return requestFee The fee required to be paid to make a request"
                  },
                  "functionSelector": "0d37b537",
                  "id": 5506,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "getRequestFee",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5500,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1375:2:28"
                  },
                  "returnParameters": {
                    "id": 5505,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5502,
                        "mutability": "mutable",
                        "name": "feeToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5506,
                        "src": "1401:16:28",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 5501,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1401:7:28",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5504,
                        "mutability": "mutable",
                        "name": "requestFee",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5506,
                        "src": "1419:18:28",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5503,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1419:7:28",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1400:38:28"
                  },
                  "scope": 5531,
                  "src": "1353:86:28",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 5507,
                    "nodeType": "StructuredDocumentation",
                    "src": "1443:569:28",
                    "text": "@notice Sends a request for a random number to the 3rd-party service\n @dev Some services will complete the request immediately, others may have a time-delay\n @dev Some services require payment in the form of a token, such as $LINK for Chainlink VRF\n @return requestId The ID of the request used to get the results of the RNG service\n @return lockBlock The block number at which the RNG service will start generating time-delayed randomness.  The calling contract\n should \"lock\" all activity until the result is available via the `requestId`"
                  },
                  "functionSelector": "8678a7b2",
                  "id": 5514,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "requestRandomNumber",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5508,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2043:2:28"
                  },
                  "returnParameters": {
                    "id": 5513,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5510,
                        "mutability": "mutable",
                        "name": "requestId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5514,
                        "src": "2064:16:28",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 5509,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "2064:6:28",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5512,
                        "mutability": "mutable",
                        "name": "lockBlock",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5514,
                        "src": "2082:16:28",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 5511,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "2082:6:28",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2063:36:28"
                  },
                  "scope": 5531,
                  "src": "2015:85:28",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 5515,
                    "nodeType": "StructuredDocumentation",
                    "src": "2104:375:28",
                    "text": "@notice Checks if the request for randomness from the 3rd-party service has completed\n @dev For time-delayed requests, this function is used to check/confirm completion\n @param requestId The ID of the request used to get the results of the RNG service\n @return isCompleted True if the request has completed and a random number is available, false otherwise"
                  },
                  "functionSelector": "3a19b9bc",
                  "id": 5522,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "isRequestComplete",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5518,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5517,
                        "mutability": "mutable",
                        "name": "requestId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5522,
                        "src": "2509:16:28",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 5516,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "2509:6:28",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2508:18:28"
                  },
                  "returnParameters": {
                    "id": 5521,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5520,
                        "mutability": "mutable",
                        "name": "isCompleted",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5522,
                        "src": "2550:16:28",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 5519,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "2550:4:28",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2549:18:28"
                  },
                  "scope": 5531,
                  "src": "2482:86:28",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 5523,
                    "nodeType": "StructuredDocumentation",
                    "src": "2572:198:28",
                    "text": "@notice Gets the random number produced by the 3rd-party service\n @param requestId The ID of the request used to get the results of the RNG service\n @return randomNum The random number"
                  },
                  "functionSelector": "9d2a5f98",
                  "id": 5530,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "randomNumber",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5526,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5525,
                        "mutability": "mutable",
                        "name": "requestId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5530,
                        "src": "2795:16:28",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 5524,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "2795:6:28",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2794:18:28"
                  },
                  "returnParameters": {
                    "id": 5529,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5528,
                        "mutability": "mutable",
                        "name": "randomNum",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5530,
                        "src": "2831:17:28",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5527,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2831:7:28",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2830:19:28"
                  },
                  "scope": 5531,
                  "src": "2773:77:28",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 5532,
              "src": "238:2614:28"
            }
          ],
          "src": "37:2816:28"
        },
        "id": 28
      },
      "@pooltogether/uniform-random-number/contracts/UniformRandomNumber.sol": {
        "ast": {
          "absolutePath": "@pooltogether/uniform-random-number/contracts/UniformRandomNumber.sol",
          "exportedSymbols": {
            "UniformRandomNumber": [
              5589
            ]
          },
          "id": 5590,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 5533,
              "literals": [
                "solidity",
                ">=",
                "0.6",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "649:31:29"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 5534,
                "nodeType": "StructuredDocumentation",
                "src": "682:245:29",
                "text": " @author Brendan Asselstine\n @notice A library that uses entropy to select a random number within a bound.  Compensates for modulo bias.\n @dev Thanks to https://medium.com/hownetworks/dont-waste-cycles-with-modulo-bias-35b6fdafcf94"
              },
              "fullyImplemented": true,
              "id": 5589,
              "linearizedBaseContracts": [
                5589
              ],
              "name": "UniformRandomNumber",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 5587,
                    "nodeType": "Block",
                    "src": "1306:306:29",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 5547,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 5545,
                                "name": "_upperBound",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5539,
                                "src": "1320:11:29",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 5546,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "1334:1:29",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "1320:15:29",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "556e69666f726d52616e642f6d696e2d626f756e64",
                              "id": 5548,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1337:23:29",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_2d58afe5eedf02d0de17e438c035422325e154e0baaf9a75dd1e89749c2374f3",
                                "typeString": "literal_string \"UniformRand/min-bound\""
                              },
                              "value": "UniformRand/min-bound"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_2d58afe5eedf02d0de17e438c035422325e154e0baaf9a75dd1e89749c2374f3",
                                "typeString": "literal_string \"UniformRand/min-bound\""
                              }
                            ],
                            "id": 5544,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1312:7:29",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 5549,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1312:49:29",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 5550,
                        "nodeType": "ExpressionStatement",
                        "src": "1312:49:29"
                      },
                      {
                        "assignments": [
                          5552
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5552,
                            "mutability": "mutable",
                            "name": "min",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 5587,
                            "src": "1367:11:29",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 5551,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "1367:7:29",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 5557,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 5556,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 5554,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "-",
                            "prefix": true,
                            "src": "1381:12:29",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 5553,
                              "name": "_upperBound",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5539,
                              "src": "1382:11:29",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "%",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 5555,
                            "name": "_upperBound",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5539,
                            "src": "1396:11:29",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "1381:26:29",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1367:40:29"
                      },
                      {
                        "assignments": [
                          5559
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5559,
                            "mutability": "mutable",
                            "name": "random",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 5587,
                            "src": "1413:14:29",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 5558,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "1413:7:29",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 5561,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 5560,
                          "name": "_entropy",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5537,
                          "src": "1430:8:29",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1413:25:29"
                      },
                      {
                        "body": {
                          "id": 5581,
                          "nodeType": "Block",
                          "src": "1457:118:29",
                          "statements": [
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 5565,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 5563,
                                  "name": "random",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5559,
                                  "src": "1469:6:29",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": ">=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 5564,
                                  "name": "min",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5552,
                                  "src": "1479:3:29",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "1469:13:29",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 5568,
                              "nodeType": "IfStatement",
                              "src": "1465:43:29",
                              "trueBody": {
                                "id": 5567,
                                "nodeType": "Block",
                                "src": "1484:24:29",
                                "statements": [
                                  {
                                    "id": 5566,
                                    "nodeType": "Break",
                                    "src": "1494:5:29"
                                  }
                                ]
                              }
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 5579,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 5569,
                                  "name": "random",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5559,
                                  "src": "1515:6:29",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "id": 5575,
                                              "name": "random",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 5559,
                                              "src": "1559:6:29",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 5573,
                                              "name": "abi",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": -1,
                                              "src": "1542:3:29",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_magic_abi",
                                                "typeString": "abi"
                                              }
                                            },
                                            "id": 5574,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "lValueRequested": false,
                                            "memberName": "encodePacked",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": null,
                                            "src": "1542:16:29",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                                              "typeString": "function () pure returns (bytes memory)"
                                            }
                                          },
                                          "id": 5576,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "functionCall",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "1542:24:29",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_bytes_memory_ptr",
                                            "typeString": "bytes memory"
                                          }
                                        ],
                                        "id": 5572,
                                        "name": "keccak256",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -8,
                                        "src": "1532:9:29",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                          "typeString": "function (bytes memory) pure returns (bytes32)"
                                        }
                                      },
                                      "id": 5577,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "1532:35:29",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                      }
                                    ],
                                    "id": 5571,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "1524:7:29",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_uint256_$",
                                      "typeString": "type(uint256)"
                                    },
                                    "typeName": {
                                      "id": 5570,
                                      "name": "uint256",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "1524:7:29",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 5578,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "1524:44:29",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "1515:53:29",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 5580,
                              "nodeType": "ExpressionStatement",
                              "src": "1515:53:29"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 5562,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "1451:4:29",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "id": 5582,
                        "nodeType": "WhileStatement",
                        "src": "1444:131:29"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 5585,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 5583,
                            "name": "random",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5559,
                            "src": "1587:6:29",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "%",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 5584,
                            "name": "_upperBound",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5539,
                            "src": "1596:11:29",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "1587:20:29",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 5543,
                        "id": 5586,
                        "nodeType": "Return",
                        "src": "1580:27:29"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 5535,
                    "nodeType": "StructuredDocumentation",
                    "src": "960:255:29",
                    "text": "@notice Select a random number without modulo bias using a random seed and upper bound\n @param _entropy The seed for randomness\n @param _upperBound The upper bound of the desired number\n @return A random number less than the _upperBound"
                  },
                  "id": 5588,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "uniform",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5540,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5537,
                        "mutability": "mutable",
                        "name": "_entropy",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5588,
                        "src": "1235:16:29",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5536,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1235:7:29",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5539,
                        "mutability": "mutable",
                        "name": "_upperBound",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5588,
                        "src": "1253:19:29",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5538,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1253:7:29",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1234:39:29"
                  },
                  "returnParameters": {
                    "id": 5543,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5542,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5588,
                        "src": "1297:7:29",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5541,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1297:7:29",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1296:9:29"
                  },
                  "scope": 5589,
                  "src": "1218:394:29",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 5590,
              "src": "928:686:29"
            }
          ],
          "src": "649:965:29"
        },
        "id": 29
      },
      "@pooltogether/yield-source-interface/contracts/IYieldSource.sol": {
        "ast": {
          "absolutePath": "@pooltogether/yield-source-interface/contracts/IYieldSource.sol",
          "exportedSymbols": {
            "IYieldSource": [
              5623
            ]
          },
          "id": 5624,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 5591,
              "literals": [
                "solidity",
                ">=",
                "0.4",
                ".0",
                "<",
                "0.8",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:31:30"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": {
                "id": 5592,
                "nodeType": "StructuredDocumentation",
                "src": "66:211:30",
                "text": "@title Defines the functions used to interact with a yield source.  The Prize Pool inherits this contract.\n @notice Prize Pools subclasses need to implement this interface so that yield can be generated."
              },
              "fullyImplemented": false,
              "id": 5623,
              "linearizedBaseContracts": [
                5623
              ],
              "name": "IYieldSource",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 5593,
                    "nodeType": "StructuredDocumentation",
                    "src": "305:96:30",
                    "text": "@notice Returns the ERC20 asset token used for deposits.\n @return The ERC20 asset token"
                  },
                  "functionSelector": "c89039c5",
                  "id": 5598,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "depositToken",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5594,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "425:2:30"
                  },
                  "returnParameters": {
                    "id": 5597,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5596,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5598,
                        "src": "451:7:30",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 5595,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "451:7:30",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "450:9:30"
                  },
                  "scope": 5623,
                  "src": "404:56:30",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 5599,
                    "nodeType": "StructuredDocumentation",
                    "src": "464:151:30",
                    "text": "@notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\n @return The underlying balance of asset tokens"
                  },
                  "functionSelector": "b99152d0",
                  "id": 5606,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "balanceOfToken",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5602,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5601,
                        "mutability": "mutable",
                        "name": "addr",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5606,
                        "src": "642:12:30",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 5600,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "642:7:30",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "641:14:30"
                  },
                  "returnParameters": {
                    "id": 5605,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5604,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5606,
                        "src": "674:7:30",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5603,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "674:7:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "673:9:30"
                  },
                  "scope": 5623,
                  "src": "618:65:30",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 5607,
                    "nodeType": "StructuredDocumentation",
                    "src": "687:245:30",
                    "text": "@notice Supplies tokens to the yield source.  Allows assets to be supplied on other user's behalf using the `to` param.\n @param amount The amount of `token()` to be supplied\n @param to The user whose balance will receive the tokens"
                  },
                  "functionSelector": "87a6eeef",
                  "id": 5614,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "supplyTokenTo",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5612,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5609,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5614,
                        "src": "958:14:30",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5608,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "958:7:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5611,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5614,
                        "src": "974:10:30",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 5610,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "974:7:30",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "957:28:30"
                  },
                  "returnParameters": {
                    "id": 5613,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "994:0:30"
                  },
                  "scope": 5623,
                  "src": "935:60:30",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 5615,
                    "nodeType": "StructuredDocumentation",
                    "src": "999:204:30",
                    "text": "@notice Redeems tokens from the yield source.\n @param amount The amount of `token()` to withdraw.  Denominated in `token()` as above.\n @return The actual amount of tokens that were redeemed."
                  },
                  "functionSelector": "013054c2",
                  "id": 5622,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "redeemToken",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5618,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5617,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5622,
                        "src": "1227:14:30",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5616,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1227:7:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1226:16:30"
                  },
                  "returnParameters": {
                    "id": 5621,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5620,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5622,
                        "src": "1261:7:30",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 5619,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1261:7:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1260:9:30"
                  },
                  "scope": 5623,
                  "src": "1206:64:30",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 5624,
              "src": "277:996:30"
            }
          ],
          "src": "33:1241:30"
        },
        "id": 30
      },
      "contracts/Constants.sol": {
        "ast": {
          "absolutePath": "contracts/Constants.sol",
          "exportedSymbols": {
            "Constants": [
              5632
            ]
          },
          "id": 5633,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 5625,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:31"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": null,
              "fullyImplemented": true,
              "id": 5632,
              "linearizedBaseContracts": [
                5632
              ],
              "name": "Constants",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": true,
                  "functionSelector": "a5ab436d",
                  "id": 5628,
                  "mutability": "constant",
                  "name": "ERC165_INTERFACE_ID_ERC165",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 5632,
                  "src": "84:62:31",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 5626,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "84:6:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30783031666663396137",
                    "id": 5627,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "136:10:31",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_33540519_by_1",
                      "typeString": "int_const 33540519"
                    },
                    "value": "0x01ffc9a7"
                  },
                  "visibility": "public"
                },
                {
                  "constant": true,
                  "functionSelector": "c92669ed",
                  "id": 5631,
                  "mutability": "constant",
                  "name": "ERC165_INTERFACE_ID_ERC721",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 5632,
                  "src": "150:62:31",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 5629,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "150:6:31",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30783830616335386364",
                    "id": 5630,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "202:10:31",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_2158778573_by_1",
                      "typeString": "int_const 2158778573"
                    },
                    "value": "0x80ac58cd"
                  },
                  "visibility": "public"
                }
              ],
              "scope": 5633,
              "src": "62:153:31"
            }
          ],
          "src": "37:178:31"
        },
        "id": 31
      },
      "contracts/builders/ControlledTokenBuilder.sol": {
        "ast": {
          "absolutePath": "contracts/builders/ControlledTokenBuilder.sol",
          "exportedSymbols": {
            "ControlledTokenBuilder": [
              5773
            ]
          },
          "id": 5774,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 5634,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:32"
            },
            {
              "id": 5635,
              "literals": [
                "experimental",
                "ABIEncoderV2"
              ],
              "nodeType": "PragmaDirective",
              "src": "61:33:32"
            },
            {
              "absolutePath": "contracts/token/ControlledTokenProxyFactory.sol",
              "file": "../token/ControlledTokenProxyFactory.sol",
              "id": 5636,
              "nodeType": "ImportDirective",
              "scope": 5774,
              "sourceUnit": 15890,
              "src": "96:50:32",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/token/TicketProxyFactory.sol",
              "file": "../token/TicketProxyFactory.sol",
              "id": 5637,
              "nodeType": "ImportDirective",
              "scope": 5774,
              "sourceUnit": 16193,
              "src": "147:41:32",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 5773,
              "linearizedBaseContracts": [
                5773
              ],
              "name": "ControlledTokenBuilder",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 5641,
                  "name": "CreatedControlledToken",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 5640,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5639,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5641,
                        "src": "303:21:32",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 5638,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "303:7:32",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "302:23:32"
                  },
                  "src": "274:52:32"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 5645,
                  "name": "CreatedTicket",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 5644,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5643,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5645,
                        "src": "349:21:32",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 5642,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "349:7:32",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "348:23:32"
                  },
                  "src": "329:43:32"
                },
                {
                  "constant": false,
                  "functionSelector": "6a81d8bd",
                  "id": 5647,
                  "mutability": "mutable",
                  "name": "controlledTokenProxyFactory",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 5773,
                  "src": "376:62:32",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ControlledTokenProxyFactory_$15889",
                    "typeString": "contract ControlledTokenProxyFactory"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 5646,
                    "name": "ControlledTokenProxyFactory",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 15889,
                    "src": "376:27:32",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ControlledTokenProxyFactory_$15889",
                      "typeString": "contract ControlledTokenProxyFactory"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "aa3b296c",
                  "id": 5649,
                  "mutability": "mutable",
                  "name": "ticketProxyFactory",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 5773,
                  "src": "442:44:32",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_TicketProxyFactory_$16192",
                    "typeString": "contract TicketProxyFactory"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 5648,
                    "name": "TicketProxyFactory",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 16192,
                    "src": "442:18:32",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TicketProxyFactory_$16192",
                      "typeString": "contract TicketProxyFactory"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "canonicalName": "ControlledTokenBuilder.ControlledTokenConfig",
                  "id": 5658,
                  "members": [
                    {
                      "constant": false,
                      "id": 5651,
                      "mutability": "mutable",
                      "name": "name",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 5658,
                      "src": "526:11:32",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_storage_ptr",
                        "typeString": "string"
                      },
                      "typeName": {
                        "id": 5650,
                        "name": "string",
                        "nodeType": "ElementaryTypeName",
                        "src": "526:6:32",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_storage_ptr",
                          "typeString": "string"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 5653,
                      "mutability": "mutable",
                      "name": "symbol",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 5658,
                      "src": "543:13:32",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_storage_ptr",
                        "typeString": "string"
                      },
                      "typeName": {
                        "id": 5652,
                        "name": "string",
                        "nodeType": "ElementaryTypeName",
                        "src": "543:6:32",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_storage_ptr",
                          "typeString": "string"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 5655,
                      "mutability": "mutable",
                      "name": "decimals",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 5658,
                      "src": "562:14:32",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 5654,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "562:5:32",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 5657,
                      "mutability": "mutable",
                      "name": "controller",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 5658,
                      "src": "582:35:32",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                        "typeString": "contract TokenControllerInterface"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 5656,
                        "name": "TokenControllerInterface",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 16206,
                        "src": "582:24:32",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                          "typeString": "contract TokenControllerInterface"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "ControlledTokenConfig",
                  "nodeType": "StructDefinition",
                  "scope": 5773,
                  "src": "491:131:32",
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 5699,
                    "nodeType": "Block",
                    "src": "756:355:32",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 5674,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 5668,
                                    "name": "_controlledTokenProxyFactory",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 5660,
                                    "src": "778:28:32",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_ControlledTokenProxyFactory_$15889",
                                      "typeString": "contract ControlledTokenProxyFactory"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_ControlledTokenProxyFactory_$15889",
                                      "typeString": "contract ControlledTokenProxyFactory"
                                    }
                                  ],
                                  "id": 5667,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "770:7:32",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 5666,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "770:7:32",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 5669,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "770:37:32",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 5672,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "819:1:32",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 5671,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "811:7:32",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 5670,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "811:7:32",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 5673,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "811:10:32",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "770:51:32",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "436f6e74726f6c6c6564546f6b656e4275696c6465722f636f6e74726f6c6c6564546f6b656e50726f7879466163746f72792d6e6f742d7a65726f",
                              "id": 5675,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "823:61:32",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_f7b4d0fe854c1187cba2a1107a4e1bc5e83f3ee0f3775fef8dcf16b0f6a7522f",
                                "typeString": "literal_string \"ControlledTokenBuilder/controlledTokenProxyFactory-not-zero\""
                              },
                              "value": "ControlledTokenBuilder/controlledTokenProxyFactory-not-zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_f7b4d0fe854c1187cba2a1107a4e1bc5e83f3ee0f3775fef8dcf16b0f6a7522f",
                                "typeString": "literal_string \"ControlledTokenBuilder/controlledTokenProxyFactory-not-zero\""
                              }
                            ],
                            "id": 5665,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "762:7:32",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 5676,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "762:123:32",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 5677,
                        "nodeType": "ExpressionStatement",
                        "src": "762:123:32"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 5687,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 5681,
                                    "name": "_ticketProxyFactory",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 5662,
                                    "src": "907:19:32",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_TicketProxyFactory_$16192",
                                      "typeString": "contract TicketProxyFactory"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_TicketProxyFactory_$16192",
                                      "typeString": "contract TicketProxyFactory"
                                    }
                                  ],
                                  "id": 5680,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "899:7:32",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 5679,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "899:7:32",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 5682,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "899:28:32",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 5685,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "939:1:32",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 5684,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "931:7:32",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 5683,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "931:7:32",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 5686,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "931:10:32",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "899:42:32",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "436f6e74726f6c6c6564546f6b656e4275696c6465722f7469636b657450726f7879466163746f72792d6e6f742d7a65726f",
                              "id": 5688,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "943:52:32",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_2fbb922a4f33ce4401373da743d34920bccb1df607d80554bfd25fc7cd29f7f8",
                                "typeString": "literal_string \"ControlledTokenBuilder/ticketProxyFactory-not-zero\""
                              },
                              "value": "ControlledTokenBuilder/ticketProxyFactory-not-zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_2fbb922a4f33ce4401373da743d34920bccb1df607d80554bfd25fc7cd29f7f8",
                                "typeString": "literal_string \"ControlledTokenBuilder/ticketProxyFactory-not-zero\""
                              }
                            ],
                            "id": 5678,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "891:7:32",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 5689,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "891:105:32",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 5690,
                        "nodeType": "ExpressionStatement",
                        "src": "891:105:32"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 5693,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 5691,
                            "name": "controlledTokenProxyFactory",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5647,
                            "src": "1002:27:32",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledTokenProxyFactory_$15889",
                              "typeString": "contract ControlledTokenProxyFactory"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 5692,
                            "name": "_controlledTokenProxyFactory",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5660,
                            "src": "1032:28:32",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledTokenProxyFactory_$15889",
                              "typeString": "contract ControlledTokenProxyFactory"
                            }
                          },
                          "src": "1002:58:32",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ControlledTokenProxyFactory_$15889",
                            "typeString": "contract ControlledTokenProxyFactory"
                          }
                        },
                        "id": 5694,
                        "nodeType": "ExpressionStatement",
                        "src": "1002:58:32"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 5697,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 5695,
                            "name": "ticketProxyFactory",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5649,
                            "src": "1066:18:32",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TicketProxyFactory_$16192",
                              "typeString": "contract TicketProxyFactory"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 5696,
                            "name": "_ticketProxyFactory",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5662,
                            "src": "1087:19:32",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TicketProxyFactory_$16192",
                              "typeString": "contract TicketProxyFactory"
                            }
                          },
                          "src": "1066:40:32",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TicketProxyFactory_$16192",
                            "typeString": "contract TicketProxyFactory"
                          }
                        },
                        "id": 5698,
                        "nodeType": "ExpressionStatement",
                        "src": "1066:40:32"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 5700,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5663,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5660,
                        "mutability": "mutable",
                        "name": "_controlledTokenProxyFactory",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5700,
                        "src": "644:56:32",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ControlledTokenProxyFactory_$15889",
                          "typeString": "contract ControlledTokenProxyFactory"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 5659,
                          "name": "ControlledTokenProxyFactory",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 15889,
                          "src": "644:27:32",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ControlledTokenProxyFactory_$15889",
                            "typeString": "contract ControlledTokenProxyFactory"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5662,
                        "mutability": "mutable",
                        "name": "_ticketProxyFactory",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5700,
                        "src": "706:38:32",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TicketProxyFactory_$16192",
                          "typeString": "contract TicketProxyFactory"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 5661,
                          "name": "TicketProxyFactory",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16192,
                          "src": "706:18:32",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TicketProxyFactory_$16192",
                            "typeString": "contract TicketProxyFactory"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "638:110:32"
                  },
                  "returnParameters": {
                    "id": 5664,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "756:0:32"
                  },
                  "scope": 5773,
                  "src": "626:485:32",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 5735,
                    "nodeType": "Block",
                    "src": "1228:257:32",
                    "statements": [
                      {
                        "assignments": [
                          5708
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5708,
                            "mutability": "mutable",
                            "name": "token",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 5735,
                            "src": "1234:21:32",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledToken_$15810",
                              "typeString": "contract ControlledToken"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 5707,
                              "name": "ControlledToken",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 15810,
                              "src": "1234:15:32",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ControlledToken_$15810",
                                "typeString": "contract ControlledToken"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 5712,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 5709,
                              "name": "controlledTokenProxyFactory",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5647,
                              "src": "1258:27:32",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ControlledTokenProxyFactory_$15889",
                                "typeString": "contract ControlledTokenProxyFactory"
                              }
                            },
                            "id": 5710,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "create",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 15888,
                            "src": "1258:34:32",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$__$returns$_t_contract$_ControlledToken_$15810_$",
                              "typeString": "function () external returns (contract ControlledToken)"
                            }
                          },
                          "id": 5711,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1258:36:32",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ControlledToken_$15810",
                            "typeString": "contract ControlledToken"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1234:60:32"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 5716,
                                "name": "config",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5702,
                                "src": "1325:6:32",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_ControlledTokenConfig_$5658_calldata_ptr",
                                  "typeString": "struct ControlledTokenBuilder.ControlledTokenConfig calldata"
                                }
                              },
                              "id": 5717,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "name",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5651,
                              "src": "1325:11:32",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_calldata_ptr",
                                "typeString": "string calldata"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 5718,
                                "name": "config",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5702,
                                "src": "1344:6:32",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_ControlledTokenConfig_$5658_calldata_ptr",
                                  "typeString": "struct ControlledTokenBuilder.ControlledTokenConfig calldata"
                                }
                              },
                              "id": 5719,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "symbol",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5653,
                              "src": "1344:13:32",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_calldata_ptr",
                                "typeString": "string calldata"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 5720,
                                "name": "config",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5702,
                                "src": "1365:6:32",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_ControlledTokenConfig_$5658_calldata_ptr",
                                  "typeString": "struct ControlledTokenBuilder.ControlledTokenConfig calldata"
                                }
                              },
                              "id": 5721,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "decimals",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5655,
                              "src": "1365:15:32",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 5722,
                                "name": "config",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5702,
                                "src": "1388:6:32",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_ControlledTokenConfig_$5658_calldata_ptr",
                                  "typeString": "struct ControlledTokenBuilder.ControlledTokenConfig calldata"
                                }
                              },
                              "id": 5723,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "controller",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5657,
                              "src": "1388:17:32",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                                "typeString": "contract TokenControllerInterface"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_string_calldata_ptr",
                                "typeString": "string calldata"
                              },
                              {
                                "typeIdentifier": "t_string_calldata_ptr",
                                "typeString": "string calldata"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              {
                                "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                                "typeString": "contract TokenControllerInterface"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 5713,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5708,
                              "src": "1301:5:32",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ControlledToken_$15810",
                                "typeString": "contract ControlledToken"
                              }
                            },
                            "id": 5715,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "initialize",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 15698,
                            "src": "1301:16:32",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_uint8_$_t_contract$_TokenControllerInterface_$16206_$returns$__$",
                              "typeString": "function (string memory,string memory,uint8,contract TokenControllerInterface) external"
                            }
                          },
                          "id": 5724,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1301:110:32",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 5725,
                        "nodeType": "ExpressionStatement",
                        "src": "1301:110:32"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 5729,
                                  "name": "token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5708,
                                  "src": "1454:5:32",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ControlledToken_$15810",
                                    "typeString": "contract ControlledToken"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_ControlledToken_$15810",
                                    "typeString": "contract ControlledToken"
                                  }
                                ],
                                "id": 5728,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "1446:7:32",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 5727,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "1446:7:32",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 5730,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1446:14:32",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 5726,
                            "name": "CreatedControlledToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5641,
                            "src": "1423:22:32",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 5731,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1423:38:32",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 5732,
                        "nodeType": "EmitStatement",
                        "src": "1418:43:32"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 5733,
                          "name": "token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5708,
                          "src": "1475:5:32",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ControlledToken_$15810",
                            "typeString": "contract ControlledToken"
                          }
                        },
                        "functionReturnParameters": 5706,
                        "id": 5734,
                        "nodeType": "Return",
                        "src": "1468:12:32"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "8c0cd38d",
                  "id": 5736,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "createControlledToken",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5703,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5702,
                        "mutability": "mutable",
                        "name": "config",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5736,
                        "src": "1151:37:32",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_ControlledTokenConfig_$5658_calldata_ptr",
                          "typeString": "struct ControlledTokenBuilder.ControlledTokenConfig"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 5701,
                          "name": "ControlledTokenConfig",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 5658,
                          "src": "1151:21:32",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_ControlledTokenConfig_$5658_storage_ptr",
                            "typeString": "struct ControlledTokenBuilder.ControlledTokenConfig"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1145:47:32"
                  },
                  "returnParameters": {
                    "id": 5706,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5705,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5736,
                        "src": "1211:15:32",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ControlledToken_$15810",
                          "typeString": "contract ControlledToken"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 5704,
                          "name": "ControlledToken",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 15810,
                          "src": "1211:15:32",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ControlledToken_$15810",
                            "typeString": "contract ControlledToken"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1210:17:32"
                  },
                  "scope": 5773,
                  "src": "1115:370:32",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 5771,
                    "nodeType": "Block",
                    "src": "1584:230:32",
                    "statements": [
                      {
                        "assignments": [
                          5744
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5744,
                            "mutability": "mutable",
                            "name": "token",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 5771,
                            "src": "1590:12:32",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_Ticket_$16140",
                              "typeString": "contract Ticket"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 5743,
                              "name": "Ticket",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 16140,
                              "src": "1590:6:32",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_Ticket_$16140",
                                "typeString": "contract Ticket"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 5748,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 5745,
                              "name": "ticketProxyFactory",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5649,
                              "src": "1605:18:32",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_TicketProxyFactory_$16192",
                                "typeString": "contract TicketProxyFactory"
                              }
                            },
                            "id": 5746,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "create",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16191,
                            "src": "1605:25:32",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$__$returns$_t_contract$_Ticket_$16140_$",
                              "typeString": "function () external returns (contract Ticket)"
                            }
                          },
                          "id": 5747,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1605:27:32",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_Ticket_$16140",
                            "typeString": "contract Ticket"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1590:42:32"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 5752,
                                "name": "config",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5738,
                                "src": "1663:6:32",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_ControlledTokenConfig_$5658_calldata_ptr",
                                  "typeString": "struct ControlledTokenBuilder.ControlledTokenConfig calldata"
                                }
                              },
                              "id": 5753,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "name",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5651,
                              "src": "1663:11:32",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_calldata_ptr",
                                "typeString": "string calldata"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 5754,
                                "name": "config",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5738,
                                "src": "1682:6:32",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_ControlledTokenConfig_$5658_calldata_ptr",
                                  "typeString": "struct ControlledTokenBuilder.ControlledTokenConfig calldata"
                                }
                              },
                              "id": 5755,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "symbol",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5653,
                              "src": "1682:13:32",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_calldata_ptr",
                                "typeString": "string calldata"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 5756,
                                "name": "config",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5738,
                                "src": "1703:6:32",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_ControlledTokenConfig_$5658_calldata_ptr",
                                  "typeString": "struct ControlledTokenBuilder.ControlledTokenConfig calldata"
                                }
                              },
                              "id": 5757,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "decimals",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5655,
                              "src": "1703:15:32",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 5758,
                                "name": "config",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5738,
                                "src": "1726:6:32",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_ControlledTokenConfig_$5658_calldata_ptr",
                                  "typeString": "struct ControlledTokenBuilder.ControlledTokenConfig calldata"
                                }
                              },
                              "id": 5759,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "controller",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5657,
                              "src": "1726:17:32",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                                "typeString": "contract TokenControllerInterface"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_string_calldata_ptr",
                                "typeString": "string calldata"
                              },
                              {
                                "typeIdentifier": "t_string_calldata_ptr",
                                "typeString": "string calldata"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              {
                                "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                                "typeString": "contract TokenControllerInterface"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 5749,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5744,
                              "src": "1639:5:32",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_Ticket_$16140",
                                "typeString": "contract Ticket"
                              }
                            },
                            "id": 5751,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "initialize",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 15975,
                            "src": "1639:16:32",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_uint8_$_t_contract$_TokenControllerInterface_$16206_$returns$__$",
                              "typeString": "function (string memory,string memory,uint8,contract TokenControllerInterface) external"
                            }
                          },
                          "id": 5760,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1639:110:32",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 5761,
                        "nodeType": "ExpressionStatement",
                        "src": "1639:110:32"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 5765,
                                  "name": "token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5744,
                                  "src": "1783:5:32",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_Ticket_$16140",
                                    "typeString": "contract Ticket"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_Ticket_$16140",
                                    "typeString": "contract Ticket"
                                  }
                                ],
                                "id": 5764,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "1775:7:32",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 5763,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "1775:7:32",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 5766,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1775:14:32",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 5762,
                            "name": "CreatedTicket",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5645,
                            "src": "1761:13:32",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 5767,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1761:29:32",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 5768,
                        "nodeType": "EmitStatement",
                        "src": "1756:34:32"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 5769,
                          "name": "token",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5744,
                          "src": "1804:5:32",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_Ticket_$16140",
                            "typeString": "contract Ticket"
                          }
                        },
                        "functionReturnParameters": 5742,
                        "id": 5770,
                        "nodeType": "Return",
                        "src": "1797:12:32"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "8e22585d",
                  "id": 5772,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "createTicket",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5739,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5738,
                        "mutability": "mutable",
                        "name": "config",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5772,
                        "src": "1516:37:32",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_ControlledTokenConfig_$5658_calldata_ptr",
                          "typeString": "struct ControlledTokenBuilder.ControlledTokenConfig"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 5737,
                          "name": "ControlledTokenConfig",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 5658,
                          "src": "1516:21:32",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_ControlledTokenConfig_$5658_storage_ptr",
                            "typeString": "struct ControlledTokenBuilder.ControlledTokenConfig"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1510:47:32"
                  },
                  "returnParameters": {
                    "id": 5742,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5741,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5772,
                        "src": "1576:6:32",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_Ticket_$16140",
                          "typeString": "contract Ticket"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 5740,
                          "name": "Ticket",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16140,
                          "src": "1576:6:32",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_Ticket_$16140",
                            "typeString": "contract Ticket"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1575:8:32"
                  },
                  "scope": 5773,
                  "src": "1489:325:32",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 5774,
              "src": "237:1579:32"
            }
          ],
          "src": "37:1780:32"
        },
        "id": 32
      },
      "contracts/builders/MultipleWinnersBuilder.sol": {
        "ast": {
          "absolutePath": "contracts/builders/MultipleWinnersBuilder.sol",
          "exportedSymbols": {
            "MultipleWinnersBuilder": [
              5995
            ]
          },
          "id": 5996,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 5775,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:33"
            },
            {
              "id": 5776,
              "literals": [
                "experimental",
                "ABIEncoderV2"
              ],
              "nodeType": "PragmaDirective",
              "src": "61:33:33"
            },
            {
              "absolutePath": "contracts/builders/ControlledTokenBuilder.sol",
              "file": "./ControlledTokenBuilder.sol",
              "id": 5777,
              "nodeType": "ImportDirective",
              "scope": 5996,
              "sourceUnit": 5774,
              "src": "96:38:33",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/prize-strategy/multiple-winners/MultipleWinnersProxyFactory.sol",
              "file": "../prize-strategy/multiple-winners/MultipleWinnersProxyFactory.sol",
              "id": 5778,
              "nodeType": "ImportDirective",
              "scope": 5996,
              "sourceUnit": 12402,
              "src": "135:76:33",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 5995,
              "linearizedBaseContracts": [
                5995
              ],
              "name": "MultipleWinnersBuilder",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 5782,
                  "name": "MultipleWinnersCreated",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 5781,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5780,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "prizeStrategy",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5782,
                        "src": "326:29:33",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 5779,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "326:7:33",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "325:31:33"
                  },
                  "src": "297:60:33"
                },
                {
                  "canonicalName": "MultipleWinnersBuilder.MultipleWinnersConfig",
                  "id": 5808,
                  "members": [
                    {
                      "constant": false,
                      "id": 5784,
                      "mutability": "mutable",
                      "name": "rngService",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 5808,
                      "src": "396:23:33",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_RNGInterface_$5531",
                        "typeString": "contract RNGInterface"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 5783,
                        "name": "RNGInterface",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 5531,
                        "src": "396:12:33",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_RNGInterface_$5531",
                          "typeString": "contract RNGInterface"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 5786,
                      "mutability": "mutable",
                      "name": "prizePeriodStart",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 5808,
                      "src": "425:24:33",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 5785,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "425:7:33",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 5788,
                      "mutability": "mutable",
                      "name": "prizePeriodSeconds",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 5808,
                      "src": "455:26:33",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 5787,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "455:7:33",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 5790,
                      "mutability": "mutable",
                      "name": "ticketName",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 5808,
                      "src": "487:17:33",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_storage_ptr",
                        "typeString": "string"
                      },
                      "typeName": {
                        "id": 5789,
                        "name": "string",
                        "nodeType": "ElementaryTypeName",
                        "src": "487:6:33",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_storage_ptr",
                          "typeString": "string"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 5792,
                      "mutability": "mutable",
                      "name": "ticketSymbol",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 5808,
                      "src": "510:19:33",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_storage_ptr",
                        "typeString": "string"
                      },
                      "typeName": {
                        "id": 5791,
                        "name": "string",
                        "nodeType": "ElementaryTypeName",
                        "src": "510:6:33",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_storage_ptr",
                          "typeString": "string"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 5794,
                      "mutability": "mutable",
                      "name": "sponsorshipName",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 5808,
                      "src": "535:22:33",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_storage_ptr",
                        "typeString": "string"
                      },
                      "typeName": {
                        "id": 5793,
                        "name": "string",
                        "nodeType": "ElementaryTypeName",
                        "src": "535:6:33",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_storage_ptr",
                          "typeString": "string"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 5796,
                      "mutability": "mutable",
                      "name": "sponsorshipSymbol",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 5808,
                      "src": "563:24:33",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_string_storage_ptr",
                        "typeString": "string"
                      },
                      "typeName": {
                        "id": 5795,
                        "name": "string",
                        "nodeType": "ElementaryTypeName",
                        "src": "563:6:33",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_storage_ptr",
                          "typeString": "string"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 5798,
                      "mutability": "mutable",
                      "name": "ticketCreditLimitMantissa",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 5808,
                      "src": "593:33:33",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 5797,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "593:7:33",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 5800,
                      "mutability": "mutable",
                      "name": "ticketCreditRateMantissa",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 5808,
                      "src": "632:32:33",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 5799,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "632:7:33",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 5802,
                      "mutability": "mutable",
                      "name": "numberOfWinners",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 5808,
                      "src": "670:23:33",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 5801,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "670:7:33",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 5805,
                      "mutability": "mutable",
                      "name": "prizeSplits",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 5808,
                      "src": "699:46:33",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_storage_$dyn_storage_ptr",
                        "typeString": "struct PrizeSplit.PrizeSplitConfig[]"
                      },
                      "typeName": {
                        "baseType": {
                          "contractScope": null,
                          "id": 5803,
                          "name": "MultipleWinners.PrizeSplitConfig",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 11459,
                          "src": "699:32:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_storage_ptr",
                            "typeString": "struct PrizeSplit.PrizeSplitConfig"
                          }
                        },
                        "id": 5804,
                        "length": null,
                        "nodeType": "ArrayTypeName",
                        "src": "699:34:33",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_storage_$dyn_storage_ptr",
                          "typeString": "struct PrizeSplit.PrizeSplitConfig[]"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 5807,
                      "mutability": "mutable",
                      "name": "splitExternalErc20Awards",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 5808,
                      "src": "751:29:33",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 5806,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "751:4:33",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "MultipleWinnersConfig",
                  "nodeType": "StructDefinition",
                  "scope": 5995,
                  "src": "361:424:33",
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "013da420",
                  "id": 5810,
                  "mutability": "mutable",
                  "name": "multipleWinnersProxyFactory",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 5995,
                  "src": "789:62:33",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_MultipleWinnersProxyFactory_$12401",
                    "typeString": "contract MultipleWinnersProxyFactory"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 5809,
                    "name": "MultipleWinnersProxyFactory",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 12401,
                    "src": "789:27:33",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_MultipleWinnersProxyFactory_$12401",
                      "typeString": "contract MultipleWinnersProxyFactory"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "14d9dcd0",
                  "id": 5812,
                  "mutability": "mutable",
                  "name": "controlledTokenBuilder",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 5995,
                  "src": "855:52:33",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ControlledTokenBuilder_$5773",
                    "typeString": "contract ControlledTokenBuilder"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 5811,
                    "name": "ControlledTokenBuilder",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 5773,
                    "src": "855:22:33",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ControlledTokenBuilder_$5773",
                      "typeString": "contract ControlledTokenBuilder"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 5853,
                    "nodeType": "Block",
                    "src": "1050:362:33",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 5828,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 5822,
                                    "name": "_multipleWinnersProxyFactory",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 5814,
                                    "src": "1072:28:33",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_MultipleWinnersProxyFactory_$12401",
                                      "typeString": "contract MultipleWinnersProxyFactory"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_MultipleWinnersProxyFactory_$12401",
                                      "typeString": "contract MultipleWinnersProxyFactory"
                                    }
                                  ],
                                  "id": 5821,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "1064:7:33",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 5820,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1064:7:33",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 5823,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "1064:37:33",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 5826,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "1113:1:33",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 5825,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "1105:7:33",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 5824,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1105:7:33",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 5827,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "1105:10:33",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "1064:51:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4d756c7469706c6557696e6e6572734275696c6465722f6d756c7469706c6557696e6e65727350726f7879466163746f72792d6e6f742d7a65726f",
                              "id": 5829,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1117:61:33",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_5326b2daf86277293fbd1e5b07f0e1200071f3edd83005bb8c0cdff11cfd0473",
                                "typeString": "literal_string \"MultipleWinnersBuilder/multipleWinnersProxyFactory-not-zero\""
                              },
                              "value": "MultipleWinnersBuilder/multipleWinnersProxyFactory-not-zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_5326b2daf86277293fbd1e5b07f0e1200071f3edd83005bb8c0cdff11cfd0473",
                                "typeString": "literal_string \"MultipleWinnersBuilder/multipleWinnersProxyFactory-not-zero\""
                              }
                            ],
                            "id": 5819,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1056:7:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 5830,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1056:123:33",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 5831,
                        "nodeType": "ExpressionStatement",
                        "src": "1056:123:33"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 5841,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 5835,
                                    "name": "_controlledTokenBuilder",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 5816,
                                    "src": "1201:23:33",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_ControlledTokenBuilder_$5773",
                                      "typeString": "contract ControlledTokenBuilder"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_ControlledTokenBuilder_$5773",
                                      "typeString": "contract ControlledTokenBuilder"
                                    }
                                  ],
                                  "id": 5834,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "1193:7:33",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 5833,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1193:7:33",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 5836,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "1193:32:33",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 5839,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "1237:1:33",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 5838,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "1229:7:33",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 5837,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1229:7:33",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 5840,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "1229:10:33",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "1193:46:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4d756c7469706c6557696e6e6572734275696c6465722f746f6b656e2d6275696c6465722d6e6f742d7a65726f",
                              "id": 5842,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1241:47:33",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_ee45213779948f351da4734598f7aacbe59f0b80027c6758fe7fd951e41404fe",
                                "typeString": "literal_string \"MultipleWinnersBuilder/token-builder-not-zero\""
                              },
                              "value": "MultipleWinnersBuilder/token-builder-not-zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_ee45213779948f351da4734598f7aacbe59f0b80027c6758fe7fd951e41404fe",
                                "typeString": "literal_string \"MultipleWinnersBuilder/token-builder-not-zero\""
                              }
                            ],
                            "id": 5832,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1185:7:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 5843,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1185:104:33",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 5844,
                        "nodeType": "ExpressionStatement",
                        "src": "1185:104:33"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 5847,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 5845,
                            "name": "multipleWinnersProxyFactory",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5810,
                            "src": "1295:27:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_MultipleWinnersProxyFactory_$12401",
                              "typeString": "contract MultipleWinnersProxyFactory"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 5846,
                            "name": "_multipleWinnersProxyFactory",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5814,
                            "src": "1325:28:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_MultipleWinnersProxyFactory_$12401",
                              "typeString": "contract MultipleWinnersProxyFactory"
                            }
                          },
                          "src": "1295:58:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_MultipleWinnersProxyFactory_$12401",
                            "typeString": "contract MultipleWinnersProxyFactory"
                          }
                        },
                        "id": 5848,
                        "nodeType": "ExpressionStatement",
                        "src": "1295:58:33"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 5851,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 5849,
                            "name": "controlledTokenBuilder",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5812,
                            "src": "1359:22:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledTokenBuilder_$5773",
                              "typeString": "contract ControlledTokenBuilder"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 5850,
                            "name": "_controlledTokenBuilder",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5816,
                            "src": "1384:23:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledTokenBuilder_$5773",
                              "typeString": "contract ControlledTokenBuilder"
                            }
                          },
                          "src": "1359:48:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ControlledTokenBuilder_$5773",
                            "typeString": "contract ControlledTokenBuilder"
                          }
                        },
                        "id": 5852,
                        "nodeType": "ExpressionStatement",
                        "src": "1359:48:33"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 5854,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5817,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5814,
                        "mutability": "mutable",
                        "name": "_multipleWinnersProxyFactory",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5854,
                        "src": "930:56:33",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_MultipleWinnersProxyFactory_$12401",
                          "typeString": "contract MultipleWinnersProxyFactory"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 5813,
                          "name": "MultipleWinnersProxyFactory",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 12401,
                          "src": "930:27:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_MultipleWinnersProxyFactory_$12401",
                            "typeString": "contract MultipleWinnersProxyFactory"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5816,
                        "mutability": "mutable",
                        "name": "_controlledTokenBuilder",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5854,
                        "src": "992:46:33",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ControlledTokenBuilder_$5773",
                          "typeString": "contract ControlledTokenBuilder"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 5815,
                          "name": "ControlledTokenBuilder",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 5773,
                          "src": "992:22:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ControlledTokenBuilder_$5773",
                            "typeString": "contract ControlledTokenBuilder"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "924:118:33"
                  },
                  "returnParameters": {
                    "id": 5818,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1050:0:33"
                  },
                  "scope": 5995,
                  "src": "912:500:33",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 5943,
                    "nodeType": "Block",
                    "src": "1604:926:33",
                    "statements": [
                      {
                        "assignments": [
                          5868
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5868,
                            "mutability": "mutable",
                            "name": "mw",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 5943,
                            "src": "1610:18:33",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                              "typeString": "contract MultipleWinners"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 5867,
                              "name": "MultipleWinners",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 12365,
                              "src": "1610:15:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                "typeString": "contract MultipleWinners"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 5872,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 5869,
                              "name": "multipleWinnersProxyFactory",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5810,
                              "src": "1631:27:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_MultipleWinnersProxyFactory_$12401",
                                "typeString": "contract MultipleWinnersProxyFactory"
                              }
                            },
                            "id": 5870,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "create",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 12400,
                            "src": "1631:34:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$__$returns$_t_contract$_MultipleWinners_$12365_$",
                              "typeString": "function () external returns (contract MultipleWinners)"
                            }
                          },
                          "id": 5871,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1631:36:33",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                            "typeString": "contract MultipleWinners"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1610:57:33"
                      },
                      {
                        "assignments": [
                          5874
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5874,
                            "mutability": "mutable",
                            "name": "ticket",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 5943,
                            "src": "1674:13:33",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_Ticket_$16140",
                              "typeString": "contract Ticket"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 5873,
                              "name": "Ticket",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 16140,
                              "src": "1674:6:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_Ticket_$16140",
                                "typeString": "contract Ticket"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 5883,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 5876,
                                "name": "prizeStrategyConfig",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5858,
                                "src": "1711:19:33",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                                  "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig memory"
                                }
                              },
                              "id": 5877,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "ticketName",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5790,
                              "src": "1711:30:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 5878,
                                "name": "prizeStrategyConfig",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5858,
                                "src": "1749:19:33",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                                  "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig memory"
                                }
                              },
                              "id": 5879,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "ticketSymbol",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5792,
                              "src": "1749:32:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 5880,
                              "name": "decimals",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5860,
                              "src": "1789:8:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 5881,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5856,
                              "src": "1805:9:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_PrizePool_$8751",
                                "typeString": "contract PrizePool"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              {
                                "typeIdentifier": "t_contract$_PrizePool_$8751",
                                "typeString": "contract PrizePool"
                              }
                            ],
                            "id": 5875,
                            "name": "_createTicket",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5969,
                            "src": "1690:13:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_uint8_$_t_contract$_PrizePool_$8751_$returns$_t_contract$_Ticket_$16140_$",
                              "typeString": "function (string memory,string memory,uint8,contract PrizePool) returns (contract Ticket)"
                            }
                          },
                          "id": 5882,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1690:130:33",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_Ticket_$16140",
                            "typeString": "contract Ticket"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1674:146:33"
                      },
                      {
                        "assignments": [
                          5885
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5885,
                            "mutability": "mutable",
                            "name": "sponsorship",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 5943,
                            "src": "1827:27:33",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledToken_$15810",
                              "typeString": "contract ControlledToken"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 5884,
                              "name": "ControlledToken",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 15810,
                              "src": "1827:15:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ControlledToken_$15810",
                                "typeString": "contract ControlledToken"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 5894,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 5887,
                                "name": "prizeStrategyConfig",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5858,
                                "src": "1883:19:33",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                                  "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig memory"
                                }
                              },
                              "id": 5888,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sponsorshipName",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5794,
                              "src": "1883:35:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 5889,
                                "name": "prizeStrategyConfig",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5858,
                                "src": "1926:19:33",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                                  "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig memory"
                                }
                              },
                              "id": 5890,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sponsorshipSymbol",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5796,
                              "src": "1926:37:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 5891,
                              "name": "decimals",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5860,
                              "src": "1971:8:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 5892,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5856,
                              "src": "1987:9:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_PrizePool_$8751",
                                "typeString": "contract PrizePool"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              {
                                "typeIdentifier": "t_contract$_PrizePool_$8751",
                                "typeString": "contract PrizePool"
                              }
                            ],
                            "id": 5886,
                            "name": "_createSponsorship",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5994,
                            "src": "1857:18:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_uint8_$_t_contract$_PrizePool_$8751_$returns$_t_contract$_ControlledToken_$15810_$",
                              "typeString": "function (string memory,string memory,uint8,contract PrizePool) returns (contract ControlledToken)"
                            }
                          },
                          "id": 5893,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1857:145:33",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ControlledToken_$15810",
                            "typeString": "contract ControlledToken"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1827:175:33"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 5898,
                                "name": "prizeStrategyConfig",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5858,
                                "src": "2045:19:33",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                                  "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig memory"
                                }
                              },
                              "id": 5899,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "prizePeriodStart",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5786,
                              "src": "2045:36:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 5900,
                                "name": "prizeStrategyConfig",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5858,
                                "src": "2089:19:33",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                                  "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig memory"
                                }
                              },
                              "id": 5901,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "prizePeriodSeconds",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5788,
                              "src": "2089:38:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 5902,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5856,
                              "src": "2135:9:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_PrizePool_$8751",
                                "typeString": "contract PrizePool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 5903,
                              "name": "ticket",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5874,
                              "src": "2152:6:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_Ticket_$16140",
                                "typeString": "contract Ticket"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 5904,
                              "name": "sponsorship",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5885,
                              "src": "2166:11:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ControlledToken_$15810",
                                "typeString": "contract ControlledToken"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 5905,
                                "name": "prizeStrategyConfig",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5858,
                                "src": "2185:19:33",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                                  "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig memory"
                                }
                              },
                              "id": 5906,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "rngService",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5784,
                              "src": "2185:30:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_RNGInterface_$5531",
                                "typeString": "contract RNGInterface"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 5907,
                                "name": "prizeStrategyConfig",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5858,
                                "src": "2223:19:33",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                                  "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig memory"
                                }
                              },
                              "id": 5908,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "numberOfWinners",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5802,
                              "src": "2223:35:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_contract$_PrizePool_$8751",
                                "typeString": "contract PrizePool"
                              },
                              {
                                "typeIdentifier": "t_contract$_Ticket_$16140",
                                "typeString": "contract Ticket"
                              },
                              {
                                "typeIdentifier": "t_contract$_ControlledToken_$15810",
                                "typeString": "contract ControlledToken"
                              },
                              {
                                "typeIdentifier": "t_contract$_RNGInterface_$5531",
                                "typeString": "contract RNGInterface"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 5895,
                              "name": "mw",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5868,
                              "src": "2009:2:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                "typeString": "contract MultipleWinners"
                              }
                            },
                            "id": 5897,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "initializeMultipleWinners",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 11938,
                            "src": "2009:28:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$_t_uint256_$_t_contract$_PrizePool_$8751_$_t_contract$_TicketInterface_$16152_$_t_contract$_IERC20Upgradeable_$1960_$_t_contract$_RNGInterface_$5531_$_t_uint256_$returns$__$",
                              "typeString": "function (uint256,uint256,contract PrizePool,contract TicketInterface,contract IERC20Upgradeable,contract RNGInterface,uint256) external"
                            }
                          },
                          "id": 5909,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2009:255:33",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 5910,
                        "nodeType": "ExpressionStatement",
                        "src": "2009:255:33"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 5914,
                                "name": "prizeStrategyConfig",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5858,
                                "src": "2289:19:33",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                                  "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig memory"
                                }
                              },
                              "id": 5915,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "prizeSplits",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5805,
                              "src": "2289:31:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_memory_ptr_$dyn_memory_ptr",
                                "typeString": "struct PrizeSplit.PrizeSplitConfig memory[] memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_memory_ptr_$dyn_memory_ptr",
                                "typeString": "struct PrizeSplit.PrizeSplitConfig memory[] memory"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 5911,
                              "name": "mw",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5868,
                              "src": "2271:2:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                "typeString": "contract MultipleWinners"
                              }
                            },
                            "id": 5913,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "setPrizeSplits",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 11651,
                            "src": "2271:17:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_array$_t_struct$_PrizeSplitConfig_$11459_memory_ptr_$dyn_memory_ptr_$returns$__$",
                              "typeString": "function (struct PrizeSplit.PrizeSplitConfig memory[] memory) external"
                            }
                          },
                          "id": 5916,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2271:50:33",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 5917,
                        "nodeType": "ExpressionStatement",
                        "src": "2271:50:33"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 5918,
                            "name": "prizeStrategyConfig",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5858,
                            "src": "2332:19:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                              "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig memory"
                            }
                          },
                          "id": 5919,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "splitExternalErc20Awards",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 5807,
                          "src": "2332:44:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 5927,
                        "nodeType": "IfStatement",
                        "src": "2328:101:33",
                        "trueBody": {
                          "id": 5926,
                          "nodeType": "Block",
                          "src": "2378:51:33",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "74727565",
                                    "id": 5923,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "bool",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "2417:4:33",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    "value": "true"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 5920,
                                    "name": "mw",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 5868,
                                    "src": "2386:2:33",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                      "typeString": "contract MultipleWinners"
                                    }
                                  },
                                  "id": 5922,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "setSplitExternalErc20Awards",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 12031,
                                  "src": "2386:30:33",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_bool_$returns$__$",
                                    "typeString": "function (bool) external"
                                  }
                                },
                                "id": 5924,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "2386:36:33",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 5925,
                              "nodeType": "ExpressionStatement",
                              "src": "2386:36:33"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 5931,
                              "name": "owner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5862,
                              "src": "2456:5:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 5928,
                              "name": "mw",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5868,
                              "src": "2435:2:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                "typeString": "contract MultipleWinners"
                              }
                            },
                            "id": 5930,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "transferOwnership",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 125,
                            "src": "2435:20:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address) external"
                            }
                          },
                          "id": 5932,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2435:27:33",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 5933,
                        "nodeType": "ExpressionStatement",
                        "src": "2435:27:33"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 5937,
                                  "name": "mw",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5868,
                                  "src": "2505:2:33",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                    "typeString": "contract MultipleWinners"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                    "typeString": "contract MultipleWinners"
                                  }
                                ],
                                "id": 5936,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "2497:7:33",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 5935,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "2497:7:33",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 5938,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2497:11:33",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 5934,
                            "name": "MultipleWinnersCreated",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5782,
                            "src": "2474:22:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 5939,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2474:35:33",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 5940,
                        "nodeType": "EmitStatement",
                        "src": "2469:40:33"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 5941,
                          "name": "mw",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5868,
                          "src": "2523:2:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                            "typeString": "contract MultipleWinners"
                          }
                        },
                        "functionReturnParameters": 5866,
                        "id": 5942,
                        "nodeType": "Return",
                        "src": "2516:9:33"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "b77f3bcb",
                  "id": 5944,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "createMultipleWinners",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5863,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5856,
                        "mutability": "mutable",
                        "name": "prizePool",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5944,
                        "src": "1452:19:33",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_PrizePool_$8751",
                          "typeString": "contract PrizePool"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 5855,
                          "name": "PrizePool",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 8751,
                          "src": "1452:9:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_PrizePool_$8751",
                            "typeString": "contract PrizePool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5858,
                        "mutability": "mutable",
                        "name": "prizeStrategyConfig",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5944,
                        "src": "1477:48:33",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                          "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 5857,
                          "name": "MultipleWinnersConfig",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 5808,
                          "src": "1477:21:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_storage_ptr",
                            "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5860,
                        "mutability": "mutable",
                        "name": "decimals",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5944,
                        "src": "1531:14:33",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 5859,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "1531:5:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5862,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5944,
                        "src": "1551:13:33",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 5861,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1551:7:33",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1446:122:33"
                  },
                  "returnParameters": {
                    "id": 5866,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5865,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5944,
                        "src": "1587:15:33",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                          "typeString": "contract MultipleWinners"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 5864,
                          "name": "MultipleWinners",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 12365,
                          "src": "1587:15:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                            "typeString": "contract MultipleWinners"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1586:17:33"
                  },
                  "scope": 5995,
                  "src": "1416:1114:33",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 5968,
                    "nodeType": "Block",
                    "src": "2681:185:33",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 5961,
                                  "name": "name",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5946,
                                  "src": "2791:4:33",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 5962,
                                  "name": "token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5948,
                                  "src": "2805:5:33",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 5963,
                                  "name": "decimals",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5950,
                                  "src": "2820:8:33",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint8",
                                    "typeString": "uint8"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 5964,
                                  "name": "prizePool",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5952,
                                  "src": "2838:9:33",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_PrizePool_$8751",
                                    "typeString": "contract PrizePool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint8",
                                    "typeString": "uint8"
                                  },
                                  {
                                    "typeIdentifier": "t_contract$_PrizePool_$8751",
                                    "typeString": "contract PrizePool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 5959,
                                  "name": "ControlledTokenBuilder",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5773,
                                  "src": "2737:22:33",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_contract$_ControlledTokenBuilder_$5773_$",
                                    "typeString": "type(contract ControlledTokenBuilder)"
                                  }
                                },
                                "id": 5960,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "ControlledTokenConfig",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 5658,
                                "src": "2737:44:33",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_struct$_ControlledTokenConfig_$5658_storage_ptr_$",
                                  "typeString": "type(struct ControlledTokenBuilder.ControlledTokenConfig storage pointer)"
                                }
                              },
                              "id": 5965,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "structConstructorCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2737:118:33",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_ControlledTokenConfig_$5658_memory_ptr",
                                "typeString": "struct ControlledTokenBuilder.ControlledTokenConfig memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_ControlledTokenConfig_$5658_memory_ptr",
                                "typeString": "struct ControlledTokenBuilder.ControlledTokenConfig memory"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 5957,
                              "name": "controlledTokenBuilder",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5812,
                              "src": "2694:22:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ControlledTokenBuilder_$5773",
                                "typeString": "contract ControlledTokenBuilder"
                              }
                            },
                            "id": 5958,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "createTicket",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5772,
                            "src": "2694:35:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_struct$_ControlledTokenConfig_$5658_memory_ptr_$returns$_t_contract$_Ticket_$16140_$",
                              "typeString": "function (struct ControlledTokenBuilder.ControlledTokenConfig memory) external returns (contract Ticket)"
                            }
                          },
                          "id": 5966,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2694:167:33",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_Ticket_$16140",
                            "typeString": "contract Ticket"
                          }
                        },
                        "functionReturnParameters": 5956,
                        "id": 5967,
                        "nodeType": "Return",
                        "src": "2687:174:33"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 5969,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_createTicket",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5953,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5946,
                        "mutability": "mutable",
                        "name": "name",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5969,
                        "src": "2562:18:33",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 5945,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "2562:6:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5948,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5969,
                        "src": "2586:19:33",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 5947,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "2586:6:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5950,
                        "mutability": "mutable",
                        "name": "decimals",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5969,
                        "src": "2611:14:33",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 5949,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "2611:5:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5952,
                        "mutability": "mutable",
                        "name": "prizePool",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5969,
                        "src": "2631:19:33",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_PrizePool_$8751",
                          "typeString": "contract PrizePool"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 5951,
                          "name": "PrizePool",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 8751,
                          "src": "2631:9:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_PrizePool_$8751",
                            "typeString": "contract PrizePool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2556:98:33"
                  },
                  "returnParameters": {
                    "id": 5956,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5955,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5969,
                        "src": "2673:6:33",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_Ticket_$16140",
                          "typeString": "contract Ticket"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 5954,
                          "name": "Ticket",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16140,
                          "src": "2673:6:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_Ticket_$16140",
                            "typeString": "contract Ticket"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2672:8:33"
                  },
                  "scope": 5995,
                  "src": "2534:332:33",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 5993,
                    "nodeType": "Block",
                    "src": "3031:194:33",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 5986,
                                  "name": "name",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5971,
                                  "src": "3150:4:33",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 5987,
                                  "name": "token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5973,
                                  "src": "3164:5:33",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 5988,
                                  "name": "decimals",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5975,
                                  "src": "3179:8:33",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint8",
                                    "typeString": "uint8"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 5989,
                                  "name": "prizePool",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5977,
                                  "src": "3197:9:33",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_PrizePool_$8751",
                                    "typeString": "contract PrizePool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint8",
                                    "typeString": "uint8"
                                  },
                                  {
                                    "typeIdentifier": "t_contract$_PrizePool_$8751",
                                    "typeString": "contract PrizePool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 5984,
                                  "name": "ControlledTokenBuilder",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5773,
                                  "src": "3096:22:33",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_contract$_ControlledTokenBuilder_$5773_$",
                                    "typeString": "type(contract ControlledTokenBuilder)"
                                  }
                                },
                                "id": 5985,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "ControlledTokenConfig",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 5658,
                                "src": "3096:44:33",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_struct$_ControlledTokenConfig_$5658_storage_ptr_$",
                                  "typeString": "type(struct ControlledTokenBuilder.ControlledTokenConfig storage pointer)"
                                }
                              },
                              "id": 5990,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "structConstructorCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3096:118:33",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_ControlledTokenConfig_$5658_memory_ptr",
                                "typeString": "struct ControlledTokenBuilder.ControlledTokenConfig memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_ControlledTokenConfig_$5658_memory_ptr",
                                "typeString": "struct ControlledTokenBuilder.ControlledTokenConfig memory"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 5982,
                              "name": "controlledTokenBuilder",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5812,
                              "src": "3044:22:33",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ControlledTokenBuilder_$5773",
                                "typeString": "contract ControlledTokenBuilder"
                              }
                            },
                            "id": 5983,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "createControlledToken",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5736,
                            "src": "3044:44:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_struct$_ControlledTokenConfig_$5658_memory_ptr_$returns$_t_contract$_ControlledToken_$15810_$",
                              "typeString": "function (struct ControlledTokenBuilder.ControlledTokenConfig memory) external returns (contract ControlledToken)"
                            }
                          },
                          "id": 5991,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3044:176:33",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ControlledToken_$15810",
                            "typeString": "contract ControlledToken"
                          }
                        },
                        "functionReturnParameters": 5981,
                        "id": 5992,
                        "nodeType": "Return",
                        "src": "3037:183:33"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 5994,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_createSponsorship",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 5978,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5971,
                        "mutability": "mutable",
                        "name": "name",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5994,
                        "src": "2903:18:33",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 5970,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "2903:6:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5973,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5994,
                        "src": "2927:19:33",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 5972,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "2927:6:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5975,
                        "mutability": "mutable",
                        "name": "decimals",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5994,
                        "src": "2952:14:33",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 5974,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "2952:5:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 5977,
                        "mutability": "mutable",
                        "name": "prizePool",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5994,
                        "src": "2972:19:33",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_PrizePool_$8751",
                          "typeString": "contract PrizePool"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 5976,
                          "name": "PrizePool",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 8751,
                          "src": "2972:9:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_PrizePool_$8751",
                            "typeString": "contract PrizePool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2897:98:33"
                  },
                  "returnParameters": {
                    "id": 5981,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 5980,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 5994,
                        "src": "3014:15:33",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ControlledToken_$15810",
                          "typeString": "contract ControlledToken"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 5979,
                          "name": "ControlledToken",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 15810,
                          "src": "3014:15:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ControlledToken_$15810",
                            "typeString": "contract ControlledToken"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3013:17:33"
                  },
                  "scope": 5995,
                  "src": "2870:355:33",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 5996,
              "src": "260:2967:33"
            }
          ],
          "src": "37:3191:33"
        },
        "id": 33
      },
      "contracts/builders/PoolWithMultipleWinnersBuilder.sol": {
        "ast": {
          "absolutePath": "contracts/builders/PoolWithMultipleWinnersBuilder.sol",
          "exportedSymbols": {
            "PoolWithMultipleWinnersBuilder": [
              6443
            ]
          },
          "id": 6444,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 5997,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:34"
            },
            {
              "id": 5998,
              "literals": [
                "experimental",
                "ABIEncoderV2"
              ],
              "nodeType": "PragmaDirective",
              "src": "61:33:34"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol",
              "id": 5999,
              "nodeType": "ImportDirective",
              "scope": 6444,
              "sourceUnit": 5101,
              "src": "96:75:34",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@pooltogether/yield-source-interface/contracts/IYieldSource.sol",
              "file": "@pooltogether/yield-source-interface/contracts/IYieldSource.sol",
              "id": 6000,
              "nodeType": "ImportDirective",
              "scope": 6444,
              "sourceUnit": 5624,
              "src": "172:73:34",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/registry/RegistryInterface.sol",
              "file": "../registry/RegistryInterface.sol",
              "id": 6001,
              "nodeType": "ImportDirective",
              "scope": 6444,
              "sourceUnit": 12459,
              "src": "247:43:34",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/prize-pool/compound/CompoundPrizePoolProxyFactory.sol",
              "file": "../prize-pool/compound/CompoundPrizePoolProxyFactory.sol",
              "id": 6002,
              "nodeType": "ImportDirective",
              "scope": 6444,
              "sourceUnit": 9156,
              "src": "291:66:34",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/prize-pool/yield-source/YieldSourcePrizePoolProxyFactory.sol",
              "file": "../prize-pool/yield-source/YieldSourcePrizePoolProxyFactory.sol",
              "id": 6003,
              "nodeType": "ImportDirective",
              "scope": 6444,
              "sourceUnit": 9533,
              "src": "358:73:34",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/prize-pool/stake/StakePrizePoolProxyFactory.sol",
              "file": "../prize-pool/stake/StakePrizePoolProxyFactory.sol",
              "id": 6004,
              "nodeType": "ImportDirective",
              "scope": 6444,
              "sourceUnit": 9318,
              "src": "432:60:34",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/builders/MultipleWinnersBuilder.sol",
              "file": "./MultipleWinnersBuilder.sol",
              "id": 6005,
              "nodeType": "ImportDirective",
              "scope": 6444,
              "sourceUnit": 5996,
              "src": "493:38:34",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 6443,
              "linearizedBaseContracts": [
                6443
              ],
              "name": "PoolWithMultipleWinnersBuilder",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 6008,
                  "libraryName": {
                    "contractScope": null,
                    "id": 6006,
                    "name": "SafeCastUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 5100,
                    "src": "583:19:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeCastUpgradeable_$5100",
                      "typeString": "library SafeCastUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "577:38:34",
                  "typeName": {
                    "id": 6007,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "607:7:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 6014,
                  "name": "CompoundPrizePoolWithMultipleWinnersCreated",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 6013,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6010,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "prizePool",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6014,
                        "src": "674:35:34",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                          "typeString": "contract CompoundPrizePool"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6009,
                          "name": "CompoundPrizePool",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 9116,
                          "src": "674:17:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                            "typeString": "contract CompoundPrizePool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6012,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "prizeStrategy",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6014,
                        "src": "715:37:34",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                          "typeString": "contract MultipleWinners"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6011,
                          "name": "MultipleWinners",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 12365,
                          "src": "715:15:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                            "typeString": "contract MultipleWinners"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "668:88:34"
                  },
                  "src": "619:138:34"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 6020,
                  "name": "YieldSourcePrizePoolWithMultipleWinnersCreated",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 6019,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6016,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "prizePool",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6020,
                        "src": "819:38:34",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                          "typeString": "contract YieldSourcePrizePool"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6015,
                          "name": "YieldSourcePrizePool",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 9493,
                          "src": "819:20:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                            "typeString": "contract YieldSourcePrizePool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6018,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "prizeStrategy",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6020,
                        "src": "863:37:34",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                          "typeString": "contract MultipleWinners"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6017,
                          "name": "MultipleWinners",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 12365,
                          "src": "863:15:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                            "typeString": "contract MultipleWinners"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "813:91:34"
                  },
                  "src": "761:144:34"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 6026,
                  "name": "StakePrizePoolWithMultipleWinnersCreated",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 6025,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6022,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "prizePool",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6026,
                        "src": "961:32:34",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                          "typeString": "contract StakePrizePool"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6021,
                          "name": "StakePrizePool",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 9278,
                          "src": "961:14:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                            "typeString": "contract StakePrizePool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6024,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "prizeStrategy",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6026,
                        "src": "999:37:34",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                          "typeString": "contract MultipleWinners"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6023,
                          "name": "MultipleWinners",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 12365,
                          "src": "999:15:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                            "typeString": "contract MultipleWinners"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "955:85:34"
                  },
                  "src": "909:132:34"
                },
                {
                  "canonicalName": "PoolWithMultipleWinnersBuilder.CompoundPrizePoolConfig",
                  "id": 6031,
                  "members": [
                    {
                      "constant": false,
                      "id": 6028,
                      "mutability": "mutable",
                      "name": "cToken",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 6031,
                      "src": "1157:22:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                        "typeString": "contract CTokenInterface"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 6027,
                        "name": "CTokenInterface",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 6511,
                        "src": "1157:15:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                          "typeString": "contract CTokenInterface"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 6030,
                      "mutability": "mutable",
                      "name": "maxExitFeeMantissa",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 6031,
                      "src": "1185:26:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 6029,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "1185:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "CompoundPrizePoolConfig",
                  "nodeType": "StructDefinition",
                  "scope": 6443,
                  "src": "1120:96:34",
                  "visibility": "public"
                },
                {
                  "canonicalName": "PoolWithMultipleWinnersBuilder.YieldSourcePrizePoolConfig",
                  "id": 6036,
                  "members": [
                    {
                      "constant": false,
                      "id": 6033,
                      "mutability": "mutable",
                      "name": "yieldSource",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 6036,
                      "src": "1335:24:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IYieldSource_$5623",
                        "typeString": "contract IYieldSource"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 6032,
                        "name": "IYieldSource",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 5623,
                        "src": "1335:12:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IYieldSource_$5623",
                          "typeString": "contract IYieldSource"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 6035,
                      "mutability": "mutable",
                      "name": "maxExitFeeMantissa",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 6036,
                      "src": "1365:26:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 6034,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "1365:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "YieldSourcePrizePoolConfig",
                  "nodeType": "StructDefinition",
                  "scope": 6443,
                  "src": "1295:101:34",
                  "visibility": "public"
                },
                {
                  "canonicalName": "PoolWithMultipleWinnersBuilder.StakePrizePoolConfig",
                  "id": 6041,
                  "members": [
                    {
                      "constant": false,
                      "id": 6038,
                      "mutability": "mutable",
                      "name": "token",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 6041,
                      "src": "1434:23:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                        "typeString": "contract IERC20Upgradeable"
                      },
                      "typeName": {
                        "contractScope": null,
                        "id": 6037,
                        "name": "IERC20Upgradeable",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 1960,
                        "src": "1434:17:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 6040,
                      "mutability": "mutable",
                      "name": "maxExitFeeMantissa",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 6041,
                      "src": "1463:26:34",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 6039,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "1463:7:34",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "StakePrizePoolConfig",
                  "nodeType": "StructDefinition",
                  "scope": 6443,
                  "src": "1400:94:34",
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "8e71c1f6",
                  "id": 6043,
                  "mutability": "mutable",
                  "name": "reserveRegistry",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 6443,
                  "src": "1498:40:34",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                    "typeString": "contract RegistryInterface"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 6042,
                    "name": "RegistryInterface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 12458,
                    "src": "1498:17:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                      "typeString": "contract RegistryInterface"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "802125f5",
                  "id": 6045,
                  "mutability": "mutable",
                  "name": "compoundPrizePoolProxyFactory",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 6443,
                  "src": "1542:66:34",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_CompoundPrizePoolProxyFactory_$9155",
                    "typeString": "contract CompoundPrizePoolProxyFactory"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 6044,
                    "name": "CompoundPrizePoolProxyFactory",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9155,
                    "src": "1542:29:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_CompoundPrizePoolProxyFactory_$9155",
                      "typeString": "contract CompoundPrizePoolProxyFactory"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "8f0a6b36",
                  "id": 6047,
                  "mutability": "mutable",
                  "name": "yieldSourcePrizePoolProxyFactory",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 6443,
                  "src": "1612:72:34",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_YieldSourcePrizePoolProxyFactory_$9532",
                    "typeString": "contract YieldSourcePrizePoolProxyFactory"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 6046,
                    "name": "YieldSourcePrizePoolProxyFactory",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9532,
                    "src": "1612:32:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_YieldSourcePrizePoolProxyFactory_$9532",
                      "typeString": "contract YieldSourcePrizePoolProxyFactory"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "3327717d",
                  "id": 6049,
                  "mutability": "mutable",
                  "name": "stakePrizePoolProxyFactory",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 6443,
                  "src": "1688:60:34",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_StakePrizePoolProxyFactory_$9317",
                    "typeString": "contract StakePrizePoolProxyFactory"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 6048,
                    "name": "StakePrizePoolProxyFactory",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9317,
                    "src": "1688:26:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_StakePrizePoolProxyFactory_$9317",
                      "typeString": "contract StakePrizePoolProxyFactory"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "b77b59d0",
                  "id": 6051,
                  "mutability": "mutable",
                  "name": "multipleWinnersBuilder",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 6443,
                  "src": "1752:52:34",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_MultipleWinnersBuilder_$5995",
                    "typeString": "contract MultipleWinnersBuilder"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 6050,
                    "name": "MultipleWinnersBuilder",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 5995,
                    "src": "1752:22:34",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_MultipleWinnersBuilder_$5995",
                      "typeString": "contract MultipleWinnersBuilder"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 6149,
                    "nodeType": "Block",
                    "src": "2123:881:34",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 6073,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 6067,
                                    "name": "_reserveRegistry",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 6053,
                                    "src": "2145:16:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                                      "typeString": "contract RegistryInterface"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                                      "typeString": "contract RegistryInterface"
                                    }
                                  ],
                                  "id": 6066,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "2137:7:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 6065,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2137:7:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 6068,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "2137:25:34",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 6071,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "2174:1:34",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 6070,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "2166:7:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 6069,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2166:7:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 6072,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "2166:10:34",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "2137:39:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "476c6f62616c4275696c6465722f7265736572766552656769737472792d6e6f742d7a65726f",
                              "id": 6074,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2178:40:34",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_6baa1b8d727b7bf74eae4422c0081ced58845e5d3fcaeea50aa9e08319d491ed",
                                "typeString": "literal_string \"GlobalBuilder/reserveRegistry-not-zero\""
                              },
                              "value": "GlobalBuilder/reserveRegistry-not-zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_6baa1b8d727b7bf74eae4422c0081ced58845e5d3fcaeea50aa9e08319d491ed",
                                "typeString": "literal_string \"GlobalBuilder/reserveRegistry-not-zero\""
                              }
                            ],
                            "id": 6064,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2129:7:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 6075,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2129:90:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6076,
                        "nodeType": "ExpressionStatement",
                        "src": "2129:90:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 6086,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 6080,
                                    "name": "_compoundPrizePoolProxyFactory",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 6055,
                                    "src": "2241:30:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_CompoundPrizePoolProxyFactory_$9155",
                                      "typeString": "contract CompoundPrizePoolProxyFactory"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_CompoundPrizePoolProxyFactory_$9155",
                                      "typeString": "contract CompoundPrizePoolProxyFactory"
                                    }
                                  ],
                                  "id": 6079,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "2233:7:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 6078,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2233:7:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 6081,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "2233:39:34",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 6084,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "2284:1:34",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 6083,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "2276:7:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 6082,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2276:7:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 6085,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "2276:10:34",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "2233:53:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "476c6f62616c4275696c6465722f636f6d706f756e645072697a65506f6f6c50726f7879466163746f72792d6e6f742d7a65726f",
                              "id": 6087,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2288:54:34",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_7c44350a383595ee03225fc72558d0c20710b871d7551d6c4ddcade9e5c8c650",
                                "typeString": "literal_string \"GlobalBuilder/compoundPrizePoolProxyFactory-not-zero\""
                              },
                              "value": "GlobalBuilder/compoundPrizePoolProxyFactory-not-zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_7c44350a383595ee03225fc72558d0c20710b871d7551d6c4ddcade9e5c8c650",
                                "typeString": "literal_string \"GlobalBuilder/compoundPrizePoolProxyFactory-not-zero\""
                              }
                            ],
                            "id": 6077,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2225:7:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 6088,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2225:118:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6089,
                        "nodeType": "ExpressionStatement",
                        "src": "2225:118:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 6099,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 6093,
                                    "name": "_yieldSourcePrizePoolProxyFactory",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 6057,
                                    "src": "2365:33:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_YieldSourcePrizePoolProxyFactory_$9532",
                                      "typeString": "contract YieldSourcePrizePoolProxyFactory"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_YieldSourcePrizePoolProxyFactory_$9532",
                                      "typeString": "contract YieldSourcePrizePoolProxyFactory"
                                    }
                                  ],
                                  "id": 6092,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "2357:7:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 6091,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2357:7:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 6094,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "2357:42:34",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 6097,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "2411:1:34",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 6096,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "2403:7:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 6095,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2403:7:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 6098,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "2403:10:34",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "2357:56:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "476c6f62616c4275696c6465722f7969656c64536f757263655072697a65506f6f6c50726f7879466163746f72792d6e6f742d7a65726f",
                              "id": 6100,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2415:57:34",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_430f6e253b14fb6b3c9b60e35b95971b87a8eaefb6756a01055ff7ce05955ac3",
                                "typeString": "literal_string \"GlobalBuilder/yieldSourcePrizePoolProxyFactory-not-zero\""
                              },
                              "value": "GlobalBuilder/yieldSourcePrizePoolProxyFactory-not-zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_430f6e253b14fb6b3c9b60e35b95971b87a8eaefb6756a01055ff7ce05955ac3",
                                "typeString": "literal_string \"GlobalBuilder/yieldSourcePrizePoolProxyFactory-not-zero\""
                              }
                            ],
                            "id": 6090,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2349:7:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 6101,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2349:124:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6102,
                        "nodeType": "ExpressionStatement",
                        "src": "2349:124:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 6112,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 6106,
                                    "name": "_stakePrizePoolProxyFactory",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 6059,
                                    "src": "2495:27:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_StakePrizePoolProxyFactory_$9317",
                                      "typeString": "contract StakePrizePoolProxyFactory"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_StakePrizePoolProxyFactory_$9317",
                                      "typeString": "contract StakePrizePoolProxyFactory"
                                    }
                                  ],
                                  "id": 6105,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "2487:7:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 6104,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2487:7:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 6107,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "2487:36:34",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 6110,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "2535:1:34",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 6109,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "2527:7:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 6108,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2527:7:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 6111,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "2527:10:34",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "2487:50:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "476c6f62616c4275696c6465722f7374616b655072697a65506f6f6c50726f7879466163746f72792d6e6f742d7a65726f",
                              "id": 6113,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2539:51:34",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_a1c0a1be6f46ad4e04c0b8c5d7f6f11cbc913b89a9cecfc27d98fd9d3b1afef3",
                                "typeString": "literal_string \"GlobalBuilder/stakePrizePoolProxyFactory-not-zero\""
                              },
                              "value": "GlobalBuilder/stakePrizePoolProxyFactory-not-zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_a1c0a1be6f46ad4e04c0b8c5d7f6f11cbc913b89a9cecfc27d98fd9d3b1afef3",
                                "typeString": "literal_string \"GlobalBuilder/stakePrizePoolProxyFactory-not-zero\""
                              }
                            ],
                            "id": 6103,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2479:7:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 6114,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2479:112:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6115,
                        "nodeType": "ExpressionStatement",
                        "src": "2479:112:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 6125,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 6119,
                                    "name": "_multipleWinnersBuilder",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 6061,
                                    "src": "2613:23:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_MultipleWinnersBuilder_$5995",
                                      "typeString": "contract MultipleWinnersBuilder"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_MultipleWinnersBuilder_$5995",
                                      "typeString": "contract MultipleWinnersBuilder"
                                    }
                                  ],
                                  "id": 6118,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "2605:7:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 6117,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2605:7:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 6120,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "2605:32:34",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 6123,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "2649:1:34",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 6122,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "2641:7:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 6121,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2641:7:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 6124,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "2641:10:34",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "2605:46:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "476c6f62616c4275696c6465722f6d756c7469706c6557696e6e6572734275696c6465722d6e6f742d7a65726f",
                              "id": 6126,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2653:47:34",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_681d44831c1132655b1af6bad60a0288a3a04aef9d45fafdb7db101db2707708",
                                "typeString": "literal_string \"GlobalBuilder/multipleWinnersBuilder-not-zero\""
                              },
                              "value": "GlobalBuilder/multipleWinnersBuilder-not-zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_681d44831c1132655b1af6bad60a0288a3a04aef9d45fafdb7db101db2707708",
                                "typeString": "literal_string \"GlobalBuilder/multipleWinnersBuilder-not-zero\""
                              }
                            ],
                            "id": 6116,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2597:7:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 6127,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2597:104:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6128,
                        "nodeType": "ExpressionStatement",
                        "src": "2597:104:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 6131,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 6129,
                            "name": "reserveRegistry",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6043,
                            "src": "2707:15:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                              "typeString": "contract RegistryInterface"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 6130,
                            "name": "_reserveRegistry",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6053,
                            "src": "2725:16:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                              "typeString": "contract RegistryInterface"
                            }
                          },
                          "src": "2707:34:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                            "typeString": "contract RegistryInterface"
                          }
                        },
                        "id": 6132,
                        "nodeType": "ExpressionStatement",
                        "src": "2707:34:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 6135,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 6133,
                            "name": "compoundPrizePoolProxyFactory",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6045,
                            "src": "2747:29:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_CompoundPrizePoolProxyFactory_$9155",
                              "typeString": "contract CompoundPrizePoolProxyFactory"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 6134,
                            "name": "_compoundPrizePoolProxyFactory",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6055,
                            "src": "2779:30:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_CompoundPrizePoolProxyFactory_$9155",
                              "typeString": "contract CompoundPrizePoolProxyFactory"
                            }
                          },
                          "src": "2747:62:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_CompoundPrizePoolProxyFactory_$9155",
                            "typeString": "contract CompoundPrizePoolProxyFactory"
                          }
                        },
                        "id": 6136,
                        "nodeType": "ExpressionStatement",
                        "src": "2747:62:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 6139,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 6137,
                            "name": "yieldSourcePrizePoolProxyFactory",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6047,
                            "src": "2815:32:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_YieldSourcePrizePoolProxyFactory_$9532",
                              "typeString": "contract YieldSourcePrizePoolProxyFactory"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 6138,
                            "name": "_yieldSourcePrizePoolProxyFactory",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6057,
                            "src": "2850:33:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_YieldSourcePrizePoolProxyFactory_$9532",
                              "typeString": "contract YieldSourcePrizePoolProxyFactory"
                            }
                          },
                          "src": "2815:68:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_YieldSourcePrizePoolProxyFactory_$9532",
                            "typeString": "contract YieldSourcePrizePoolProxyFactory"
                          }
                        },
                        "id": 6140,
                        "nodeType": "ExpressionStatement",
                        "src": "2815:68:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 6143,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 6141,
                            "name": "stakePrizePoolProxyFactory",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6049,
                            "src": "2889:26:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_StakePrizePoolProxyFactory_$9317",
                              "typeString": "contract StakePrizePoolProxyFactory"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 6142,
                            "name": "_stakePrizePoolProxyFactory",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6059,
                            "src": "2918:27:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_StakePrizePoolProxyFactory_$9317",
                              "typeString": "contract StakePrizePoolProxyFactory"
                            }
                          },
                          "src": "2889:56:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_StakePrizePoolProxyFactory_$9317",
                            "typeString": "contract StakePrizePoolProxyFactory"
                          }
                        },
                        "id": 6144,
                        "nodeType": "ExpressionStatement",
                        "src": "2889:56:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 6147,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 6145,
                            "name": "multipleWinnersBuilder",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6051,
                            "src": "2951:22:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_MultipleWinnersBuilder_$5995",
                              "typeString": "contract MultipleWinnersBuilder"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 6146,
                            "name": "_multipleWinnersBuilder",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6061,
                            "src": "2976:23:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_MultipleWinnersBuilder_$5995",
                              "typeString": "contract MultipleWinnersBuilder"
                            }
                          },
                          "src": "2951:48:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_MultipleWinnersBuilder_$5995",
                            "typeString": "contract MultipleWinnersBuilder"
                          }
                        },
                        "id": 6148,
                        "nodeType": "ExpressionStatement",
                        "src": "2951:48:34"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 6150,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 6062,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6053,
                        "mutability": "mutable",
                        "name": "_reserveRegistry",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6150,
                        "src": "1827:34:34",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                          "typeString": "contract RegistryInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6052,
                          "name": "RegistryInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 12458,
                          "src": "1827:17:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                            "typeString": "contract RegistryInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6055,
                        "mutability": "mutable",
                        "name": "_compoundPrizePoolProxyFactory",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6150,
                        "src": "1867:60:34",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_CompoundPrizePoolProxyFactory_$9155",
                          "typeString": "contract CompoundPrizePoolProxyFactory"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6054,
                          "name": "CompoundPrizePoolProxyFactory",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 9155,
                          "src": "1867:29:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_CompoundPrizePoolProxyFactory_$9155",
                            "typeString": "contract CompoundPrizePoolProxyFactory"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6057,
                        "mutability": "mutable",
                        "name": "_yieldSourcePrizePoolProxyFactory",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6150,
                        "src": "1933:66:34",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_YieldSourcePrizePoolProxyFactory_$9532",
                          "typeString": "contract YieldSourcePrizePoolProxyFactory"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6056,
                          "name": "YieldSourcePrizePoolProxyFactory",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 9532,
                          "src": "1933:32:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_YieldSourcePrizePoolProxyFactory_$9532",
                            "typeString": "contract YieldSourcePrizePoolProxyFactory"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6059,
                        "mutability": "mutable",
                        "name": "_stakePrizePoolProxyFactory",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6150,
                        "src": "2005:54:34",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_StakePrizePoolProxyFactory_$9317",
                          "typeString": "contract StakePrizePoolProxyFactory"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6058,
                          "name": "StakePrizePoolProxyFactory",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 9317,
                          "src": "2005:26:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_StakePrizePoolProxyFactory_$9317",
                            "typeString": "contract StakePrizePoolProxyFactory"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6061,
                        "mutability": "mutable",
                        "name": "_multipleWinnersBuilder",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6150,
                        "src": "2065:46:34",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_MultipleWinnersBuilder_$5995",
                          "typeString": "contract MultipleWinnersBuilder"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6060,
                          "name": "MultipleWinnersBuilder",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 5995,
                          "src": "2065:22:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_MultipleWinnersBuilder_$5995",
                            "typeString": "contract MultipleWinnersBuilder"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1821:294:34"
                  },
                  "returnParameters": {
                    "id": 6063,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2123:0:34"
                  },
                  "scope": 6443,
                  "src": "1809:1195:34",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 6232,
                    "nodeType": "Block",
                    "src": "3237:818:34",
                    "statements": [
                      {
                        "assignments": [
                          6162
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 6162,
                            "mutability": "mutable",
                            "name": "prizePool",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 6232,
                            "src": "3243:27:34",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                              "typeString": "contract CompoundPrizePool"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 6161,
                              "name": "CompoundPrizePool",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 9116,
                              "src": "3243:17:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                                "typeString": "contract CompoundPrizePool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 6166,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 6163,
                              "name": "compoundPrizePoolProxyFactory",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6045,
                              "src": "3273:29:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CompoundPrizePoolProxyFactory_$9155",
                                "typeString": "contract CompoundPrizePoolProxyFactory"
                              }
                            },
                            "id": 6164,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "create",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 9154,
                            "src": "3273:36:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$__$returns$_t_contract$_CompoundPrizePool_$9116_$",
                              "typeString": "function () external returns (contract CompoundPrizePool)"
                            }
                          },
                          "id": 6165,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3273:38:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                            "typeString": "contract CompoundPrizePool"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3243:68:34"
                      },
                      {
                        "assignments": [
                          6168
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 6168,
                            "mutability": "mutable",
                            "name": "prizeStrategy",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 6232,
                            "src": "3317:29:34",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                              "typeString": "contract MultipleWinners"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 6167,
                              "name": "MultipleWinners",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 12365,
                              "src": "3317:15:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                "typeString": "contract MultipleWinners"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 6177,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 6171,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6162,
                              "src": "3401:9:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                                "typeString": "contract CompoundPrizePool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 6172,
                              "name": "prizeStrategyConfig",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6154,
                              "src": "3418:19:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                                "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 6173,
                              "name": "decimals",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6156,
                              "src": "3445:8:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 6174,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "3461:3:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 6175,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "3461:10:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                                "typeString": "contract CompoundPrizePool"
                              },
                              {
                                "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                                "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig memory"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 6169,
                              "name": "multipleWinnersBuilder",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6051,
                              "src": "3349:22:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_MultipleWinnersBuilder_$5995",
                                "typeString": "contract MultipleWinnersBuilder"
                              }
                            },
                            "id": 6170,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "createMultipleWinners",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5944,
                            "src": "3349:44:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_contract$_PrizePool_$8751_$_t_struct$_MultipleWinnersConfig_$5808_memory_ptr_$_t_uint8_$_t_address_$returns$_t_contract$_MultipleWinners_$12365_$",
                              "typeString": "function (contract PrizePool,struct MultipleWinnersBuilder.MultipleWinnersConfig memory,uint8,address) external returns (contract MultipleWinners)"
                            }
                          },
                          "id": 6176,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3349:128:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                            "typeString": "contract MultipleWinners"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3317:160:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 6181,
                              "name": "reserveRegistry",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6043,
                              "src": "3511:15:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                                "typeString": "contract RegistryInterface"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 6183,
                                  "name": "prizeStrategy",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 6168,
                                  "src": "3542:13:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                    "typeString": "contract MultipleWinners"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                    "typeString": "contract MultipleWinners"
                                  }
                                ],
                                "id": 6182,
                                "name": "_tokens",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6442,
                                "src": "3534:7:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_contract$_MultipleWinners_$12365_$returns$_t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr_$",
                                  "typeString": "function (contract MultipleWinners) view returns (contract ControlledTokenInterface[] memory)"
                                }
                              },
                              "id": 6184,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3534:22:34",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                                "typeString": "contract ControlledTokenInterface[] memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 6185,
                                "name": "prizePoolConfig",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6152,
                                "src": "3564:15:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_CompoundPrizePoolConfig_$6031_memory_ptr",
                                  "typeString": "struct PoolWithMultipleWinnersBuilder.CompoundPrizePoolConfig memory"
                                }
                              },
                              "id": 6186,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "maxExitFeeMantissa",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 6030,
                              "src": "3564:34:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 6188,
                                    "name": "prizePoolConfig",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 6152,
                                    "src": "3622:15:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_CompoundPrizePoolConfig_$6031_memory_ptr",
                                      "typeString": "struct PoolWithMultipleWinnersBuilder.CompoundPrizePoolConfig memory"
                                    }
                                  },
                                  "id": 6189,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "cToken",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 6028,
                                  "src": "3622:22:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                    "typeString": "contract CTokenInterface"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                    "typeString": "contract CTokenInterface"
                                  }
                                ],
                                "id": 6187,
                                "name": "CTokenInterface",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6511,
                                "src": "3606:15:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_contract$_CTokenInterface_$6511_$",
                                  "typeString": "type(contract CTokenInterface)"
                                }
                              },
                              "id": 6190,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3606:39:34",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                "typeString": "contract CTokenInterface"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                                "typeString": "contract RegistryInterface"
                              },
                              {
                                "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                                "typeString": "contract ControlledTokenInterface[] memory"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                "typeString": "contract CTokenInterface"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 6178,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6162,
                              "src": "3483:9:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                                "typeString": "contract CompoundPrizePool"
                              }
                            },
                            "id": 6180,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "initialize",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 8990,
                            "src": "3483:20:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_contract$_RegistryInterface_$12458_$_t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr_$_t_uint256_$_t_contract$_CTokenInterface_$6511_$returns$__$",
                              "typeString": "function (contract RegistryInterface,contract ControlledTokenInterface[] memory,uint256,contract CTokenInterface) external"
                            }
                          },
                          "id": 6191,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3483:168:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6192,
                        "nodeType": "ExpressionStatement",
                        "src": "3483:168:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 6196,
                              "name": "prizeStrategy",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6168,
                              "src": "3684:13:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                "typeString": "contract MultipleWinners"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                "typeString": "contract MultipleWinners"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 6193,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6162,
                              "src": "3657:9:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                                "typeString": "contract CompoundPrizePool"
                              }
                            },
                            "id": 6195,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "setPrizeStrategy",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 8398,
                            "src": "3657:26:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_contract$_TokenListenerInterface_$16265_$returns$__$",
                              "typeString": "function (contract TokenListenerInterface) external"
                            }
                          },
                          "id": 6197,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3657:41:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6198,
                        "nodeType": "ExpressionStatement",
                        "src": "3657:41:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 6204,
                                      "name": "prizeStrategy",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 6168,
                                      "src": "3745:13:34",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                        "typeString": "contract MultipleWinners"
                                      }
                                    },
                                    "id": 6205,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "ticket",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 9742,
                                    "src": "3745:20:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_view$__$returns$_t_contract$_TicketInterface_$16152_$",
                                      "typeString": "function () view external returns (contract TicketInterface)"
                                    }
                                  },
                                  "id": 6206,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "3745:22:34",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_TicketInterface_$16152",
                                    "typeString": "contract TicketInterface"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_TicketInterface_$16152",
                                    "typeString": "contract TicketInterface"
                                  }
                                ],
                                "id": 6203,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "3737:7:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 6202,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "3737:7:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 6207,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3737:31:34",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "expression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 6208,
                                    "name": "prizeStrategyConfig",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 6154,
                                    "src": "3776:19:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                                      "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig memory"
                                    }
                                  },
                                  "id": 6209,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "ticketCreditRateMantissa",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 5800,
                                  "src": "3776:44:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 6210,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "toUint128",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 4813,
                                "src": "3776:54:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                  "typeString": "function (uint256) pure returns (uint128)"
                                }
                              },
                              "id": 6211,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3776:56:34",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "expression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 6212,
                                    "name": "prizeStrategyConfig",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 6154,
                                    "src": "3840:19:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                                      "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig memory"
                                    }
                                  },
                                  "id": 6213,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "ticketCreditLimitMantissa",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 5798,
                                  "src": "3840:45:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 6214,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "toUint128",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 4813,
                                "src": "3840:55:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                  "typeString": "function (uint256) pure returns (uint128)"
                                }
                              },
                              "id": 6215,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3840:57:34",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              },
                              {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 6199,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6162,
                              "src": "3704:9:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                                "typeString": "contract CompoundPrizePool"
                              }
                            },
                            "id": 6201,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "setCreditPlanOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 8202,
                            "src": "3704:25:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint128_$_t_uint128_$returns$__$",
                              "typeString": "function (address,uint128,uint128) external"
                            }
                          },
                          "id": 6216,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3704:199:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6217,
                        "nodeType": "ExpressionStatement",
                        "src": "3704:199:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 6221,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "3937:3:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 6222,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "3937:10:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 6218,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6162,
                              "src": "3909:9:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                                "typeString": "contract CompoundPrizePool"
                              }
                            },
                            "id": 6220,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "transferOwnership",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 125,
                            "src": "3909:27:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address) external"
                            }
                          },
                          "id": 6223,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3909:39:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6224,
                        "nodeType": "ExpressionStatement",
                        "src": "3909:39:34"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 6226,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6162,
                              "src": "4003:9:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                                "typeString": "contract CompoundPrizePool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 6227,
                              "name": "prizeStrategy",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6168,
                              "src": "4014:13:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                "typeString": "contract MultipleWinners"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                                "typeString": "contract CompoundPrizePool"
                              },
                              {
                                "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                "typeString": "contract MultipleWinners"
                              }
                            ],
                            "id": 6225,
                            "name": "CompoundPrizePoolWithMultipleWinnersCreated",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6014,
                            "src": "3959:43:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_contract$_CompoundPrizePool_$9116_$_t_contract$_MultipleWinners_$12365_$returns$__$",
                              "typeString": "function (contract CompoundPrizePool,contract MultipleWinners)"
                            }
                          },
                          "id": 6228,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3959:69:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6229,
                        "nodeType": "EmitStatement",
                        "src": "3954:74:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 6230,
                          "name": "prizePool",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 6162,
                          "src": "4041:9:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                            "typeString": "contract CompoundPrizePool"
                          }
                        },
                        "functionReturnParameters": 6160,
                        "id": 6231,
                        "nodeType": "Return",
                        "src": "4034:16:34"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "083d9144",
                  "id": 6233,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "createCompoundMultipleWinners",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 6157,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6152,
                        "mutability": "mutable",
                        "name": "prizePoolConfig",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6233,
                        "src": "3052:46:34",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CompoundPrizePoolConfig_$6031_memory_ptr",
                          "typeString": "struct PoolWithMultipleWinnersBuilder.CompoundPrizePoolConfig"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6151,
                          "name": "CompoundPrizePoolConfig",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 6031,
                          "src": "3052:23:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_CompoundPrizePoolConfig_$6031_storage_ptr",
                            "typeString": "struct PoolWithMultipleWinnersBuilder.CompoundPrizePoolConfig"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6154,
                        "mutability": "mutable",
                        "name": "prizeStrategyConfig",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6233,
                        "src": "3104:71:34",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                          "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6153,
                          "name": "MultipleWinnersBuilder.MultipleWinnersConfig",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 5808,
                          "src": "3104:44:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_storage_ptr",
                            "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6156,
                        "mutability": "mutable",
                        "name": "decimals",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6233,
                        "src": "3181:14:34",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 6155,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "3181:5:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3046:153:34"
                  },
                  "returnParameters": {
                    "id": 6160,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6159,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6233,
                        "src": "3218:17:34",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                          "typeString": "contract CompoundPrizePool"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6158,
                          "name": "CompoundPrizePool",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 9116,
                          "src": "3218:17:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                            "typeString": "contract CompoundPrizePool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3217:19:34"
                  },
                  "scope": 6443,
                  "src": "3008:1047:34",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 6313,
                    "nodeType": "Block",
                    "src": "4297:835:34",
                    "statements": [
                      {
                        "assignments": [
                          6245
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 6245,
                            "mutability": "mutable",
                            "name": "prizePool",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 6313,
                            "src": "4303:30:34",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                              "typeString": "contract YieldSourcePrizePool"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 6244,
                              "name": "YieldSourcePrizePool",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 9493,
                              "src": "4303:20:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                                "typeString": "contract YieldSourcePrizePool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 6249,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 6246,
                              "name": "yieldSourcePrizePoolProxyFactory",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6047,
                              "src": "4336:32:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_YieldSourcePrizePoolProxyFactory_$9532",
                                "typeString": "contract YieldSourcePrizePoolProxyFactory"
                              }
                            },
                            "id": 6247,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "create",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 9531,
                            "src": "4336:39:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$__$returns$_t_contract$_YieldSourcePrizePool_$9493_$",
                              "typeString": "function () external returns (contract YieldSourcePrizePool)"
                            }
                          },
                          "id": 6248,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4336:41:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                            "typeString": "contract YieldSourcePrizePool"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "4303:74:34"
                      },
                      {
                        "assignments": [
                          6251
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 6251,
                            "mutability": "mutable",
                            "name": "prizeStrategy",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 6313,
                            "src": "4383:29:34",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                              "typeString": "contract MultipleWinners"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 6250,
                              "name": "MultipleWinners",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 12365,
                              "src": "4383:15:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                "typeString": "contract MultipleWinners"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 6260,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 6254,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6245,
                              "src": "4467:9:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                                "typeString": "contract YieldSourcePrizePool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 6255,
                              "name": "prizeStrategyConfig",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6237,
                              "src": "4484:19:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                                "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 6256,
                              "name": "decimals",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6239,
                              "src": "4511:8:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 6257,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "4527:3:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 6258,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "4527:10:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                                "typeString": "contract YieldSourcePrizePool"
                              },
                              {
                                "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                                "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig memory"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 6252,
                              "name": "multipleWinnersBuilder",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6051,
                              "src": "4415:22:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_MultipleWinnersBuilder_$5995",
                                "typeString": "contract MultipleWinnersBuilder"
                              }
                            },
                            "id": 6253,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "createMultipleWinners",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5944,
                            "src": "4415:44:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_contract$_PrizePool_$8751_$_t_struct$_MultipleWinnersConfig_$5808_memory_ptr_$_t_uint8_$_t_address_$returns$_t_contract$_MultipleWinners_$12365_$",
                              "typeString": "function (contract PrizePool,struct MultipleWinnersBuilder.MultipleWinnersConfig memory,uint8,address) external returns (contract MultipleWinners)"
                            }
                          },
                          "id": 6259,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4415:128:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                            "typeString": "contract MultipleWinners"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "4383:160:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 6264,
                              "name": "reserveRegistry",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6043,
                              "src": "4597:15:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                                "typeString": "contract RegistryInterface"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 6266,
                                  "name": "prizeStrategy",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 6251,
                                  "src": "4628:13:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                    "typeString": "contract MultipleWinners"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                    "typeString": "contract MultipleWinners"
                                  }
                                ],
                                "id": 6265,
                                "name": "_tokens",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6442,
                                "src": "4620:7:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_contract$_MultipleWinners_$12365_$returns$_t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr_$",
                                  "typeString": "function (contract MultipleWinners) view returns (contract ControlledTokenInterface[] memory)"
                                }
                              },
                              "id": 6267,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "4620:22:34",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                                "typeString": "contract ControlledTokenInterface[] memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 6268,
                                "name": "prizePoolConfig",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6235,
                                "src": "4650:15:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_YieldSourcePrizePoolConfig_$6036_memory_ptr",
                                  "typeString": "struct PoolWithMultipleWinnersBuilder.YieldSourcePrizePoolConfig memory"
                                }
                              },
                              "id": 6269,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "maxExitFeeMantissa",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 6035,
                              "src": "4650:34:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 6270,
                                "name": "prizePoolConfig",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6235,
                                "src": "4692:15:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_YieldSourcePrizePoolConfig_$6036_memory_ptr",
                                  "typeString": "struct PoolWithMultipleWinnersBuilder.YieldSourcePrizePoolConfig memory"
                                }
                              },
                              "id": 6271,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "yieldSource",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 6033,
                              "src": "4692:27:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IYieldSource_$5623",
                                "typeString": "contract IYieldSource"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                                "typeString": "contract RegistryInterface"
                              },
                              {
                                "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                                "typeString": "contract ControlledTokenInterface[] memory"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_contract$_IYieldSource_$5623",
                                "typeString": "contract IYieldSource"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 6261,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6245,
                              "src": "4549:9:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                                "typeString": "contract YieldSourcePrizePool"
                              }
                            },
                            "id": 6263,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "initializeYieldSourcePrizePool",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 9403,
                            "src": "4549:40:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_contract$_RegistryInterface_$12458_$_t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr_$_t_uint256_$_t_contract$_IYieldSource_$5623_$returns$__$",
                              "typeString": "function (contract RegistryInterface,contract ControlledTokenInterface[] memory,uint256,contract IYieldSource) external"
                            }
                          },
                          "id": 6272,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4549:176:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6273,
                        "nodeType": "ExpressionStatement",
                        "src": "4549:176:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 6277,
                              "name": "prizeStrategy",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6251,
                              "src": "4758:13:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                "typeString": "contract MultipleWinners"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                "typeString": "contract MultipleWinners"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 6274,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6245,
                              "src": "4731:9:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                                "typeString": "contract YieldSourcePrizePool"
                              }
                            },
                            "id": 6276,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "setPrizeStrategy",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 8398,
                            "src": "4731:26:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_contract$_TokenListenerInterface_$16265_$returns$__$",
                              "typeString": "function (contract TokenListenerInterface) external"
                            }
                          },
                          "id": 6278,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4731:41:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6279,
                        "nodeType": "ExpressionStatement",
                        "src": "4731:41:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 6285,
                                      "name": "prizeStrategy",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 6251,
                                      "src": "4819:13:34",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                        "typeString": "contract MultipleWinners"
                                      }
                                    },
                                    "id": 6286,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "ticket",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 9742,
                                    "src": "4819:20:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_view$__$returns$_t_contract$_TicketInterface_$16152_$",
                                      "typeString": "function () view external returns (contract TicketInterface)"
                                    }
                                  },
                                  "id": 6287,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "4819:22:34",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_TicketInterface_$16152",
                                    "typeString": "contract TicketInterface"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_TicketInterface_$16152",
                                    "typeString": "contract TicketInterface"
                                  }
                                ],
                                "id": 6284,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "4811:7:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 6283,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "4811:7:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 6288,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "4811:31:34",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "expression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 6289,
                                    "name": "prizeStrategyConfig",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 6237,
                                    "src": "4850:19:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                                      "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig memory"
                                    }
                                  },
                                  "id": 6290,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "ticketCreditRateMantissa",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 5800,
                                  "src": "4850:44:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 6291,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "toUint128",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 4813,
                                "src": "4850:54:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                  "typeString": "function (uint256) pure returns (uint128)"
                                }
                              },
                              "id": 6292,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "4850:56:34",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "expression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 6293,
                                    "name": "prizeStrategyConfig",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 6237,
                                    "src": "4914:19:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                                      "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig memory"
                                    }
                                  },
                                  "id": 6294,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "ticketCreditLimitMantissa",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 5798,
                                  "src": "4914:45:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 6295,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "toUint128",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 4813,
                                "src": "4914:55:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                  "typeString": "function (uint256) pure returns (uint128)"
                                }
                              },
                              "id": 6296,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "4914:57:34",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              },
                              {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 6280,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6245,
                              "src": "4778:9:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                                "typeString": "contract YieldSourcePrizePool"
                              }
                            },
                            "id": 6282,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "setCreditPlanOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 8202,
                            "src": "4778:25:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint128_$_t_uint128_$returns$__$",
                              "typeString": "function (address,uint128,uint128) external"
                            }
                          },
                          "id": 6297,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4778:199:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6298,
                        "nodeType": "ExpressionStatement",
                        "src": "4778:199:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 6302,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "5011:3:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 6303,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "5011:10:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 6299,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6245,
                              "src": "4983:9:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                                "typeString": "contract YieldSourcePrizePool"
                              }
                            },
                            "id": 6301,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "transferOwnership",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 125,
                            "src": "4983:27:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address) external"
                            }
                          },
                          "id": 6304,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4983:39:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6305,
                        "nodeType": "ExpressionStatement",
                        "src": "4983:39:34"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 6307,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6245,
                              "src": "5080:9:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                                "typeString": "contract YieldSourcePrizePool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 6308,
                              "name": "prizeStrategy",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6251,
                              "src": "5091:13:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                "typeString": "contract MultipleWinners"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                                "typeString": "contract YieldSourcePrizePool"
                              },
                              {
                                "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                "typeString": "contract MultipleWinners"
                              }
                            ],
                            "id": 6306,
                            "name": "YieldSourcePrizePoolWithMultipleWinnersCreated",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6020,
                            "src": "5033:46:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_contract$_YieldSourcePrizePool_$9493_$_t_contract$_MultipleWinners_$12365_$returns$__$",
                              "typeString": "function (contract YieldSourcePrizePool,contract MultipleWinners)"
                            }
                          },
                          "id": 6309,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5033:72:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6310,
                        "nodeType": "EmitStatement",
                        "src": "5028:77:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 6311,
                          "name": "prizePool",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 6245,
                          "src": "5118:9:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                            "typeString": "contract YieldSourcePrizePool"
                          }
                        },
                        "functionReturnParameters": 6243,
                        "id": 6312,
                        "nodeType": "Return",
                        "src": "5111:16:34"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "dc71362b",
                  "id": 6314,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "createYieldSourceMultipleWinners",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 6240,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6235,
                        "mutability": "mutable",
                        "name": "prizePoolConfig",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6314,
                        "src": "4106:49:34",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_YieldSourcePrizePoolConfig_$6036_memory_ptr",
                          "typeString": "struct PoolWithMultipleWinnersBuilder.YieldSourcePrizePoolConfig"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6234,
                          "name": "YieldSourcePrizePoolConfig",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 6036,
                          "src": "4106:26:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_YieldSourcePrizePoolConfig_$6036_storage_ptr",
                            "typeString": "struct PoolWithMultipleWinnersBuilder.YieldSourcePrizePoolConfig"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6237,
                        "mutability": "mutable",
                        "name": "prizeStrategyConfig",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6314,
                        "src": "4161:71:34",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                          "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6236,
                          "name": "MultipleWinnersBuilder.MultipleWinnersConfig",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 5808,
                          "src": "4161:44:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_storage_ptr",
                            "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6239,
                        "mutability": "mutable",
                        "name": "decimals",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6314,
                        "src": "4238:14:34",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 6238,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "4238:5:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4100:156:34"
                  },
                  "returnParameters": {
                    "id": 6243,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6242,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6314,
                        "src": "4275:20:34",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                          "typeString": "contract YieldSourcePrizePool"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6241,
                          "name": "YieldSourcePrizePool",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 9493,
                          "src": "4275:20:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                            "typeString": "contract YieldSourcePrizePool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4274:22:34"
                  },
                  "scope": 6443,
                  "src": "4059:1073:34",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 6394,
                    "nodeType": "Block",
                    "src": "5356:791:34",
                    "statements": [
                      {
                        "assignments": [
                          6326
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 6326,
                            "mutability": "mutable",
                            "name": "prizePool",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 6394,
                            "src": "5362:24:34",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                              "typeString": "contract StakePrizePool"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 6325,
                              "name": "StakePrizePool",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 9278,
                              "src": "5362:14:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                                "typeString": "contract StakePrizePool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 6330,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 6327,
                              "name": "stakePrizePoolProxyFactory",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6049,
                              "src": "5389:26:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_StakePrizePoolProxyFactory_$9317",
                                "typeString": "contract StakePrizePoolProxyFactory"
                              }
                            },
                            "id": 6328,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "create",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 9316,
                            "src": "5389:33:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$__$returns$_t_contract$_StakePrizePool_$9278_$",
                              "typeString": "function () external returns (contract StakePrizePool)"
                            }
                          },
                          "id": 6329,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5389:35:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                            "typeString": "contract StakePrizePool"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "5362:62:34"
                      },
                      {
                        "assignments": [
                          6332
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 6332,
                            "mutability": "mutable",
                            "name": "prizeStrategy",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 6394,
                            "src": "5430:29:34",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                              "typeString": "contract MultipleWinners"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 6331,
                              "name": "MultipleWinners",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 12365,
                              "src": "5430:15:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                "typeString": "contract MultipleWinners"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 6341,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 6335,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6326,
                              "src": "5514:9:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                                "typeString": "contract StakePrizePool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 6336,
                              "name": "prizeStrategyConfig",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6318,
                              "src": "5531:19:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                                "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 6337,
                              "name": "decimals",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6320,
                              "src": "5558:8:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 6338,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "5574:3:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 6339,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "5574:10:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                                "typeString": "contract StakePrizePool"
                              },
                              {
                                "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                                "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig memory"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 6333,
                              "name": "multipleWinnersBuilder",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6051,
                              "src": "5462:22:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_MultipleWinnersBuilder_$5995",
                                "typeString": "contract MultipleWinnersBuilder"
                              }
                            },
                            "id": 6334,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "createMultipleWinners",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5944,
                            "src": "5462:44:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_contract$_PrizePool_$8751_$_t_struct$_MultipleWinnersConfig_$5808_memory_ptr_$_t_uint8_$_t_address_$returns$_t_contract$_MultipleWinners_$12365_$",
                              "typeString": "function (contract PrizePool,struct MultipleWinnersBuilder.MultipleWinnersConfig memory,uint8,address) external returns (contract MultipleWinners)"
                            }
                          },
                          "id": 6340,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5462:128:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                            "typeString": "contract MultipleWinners"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "5430:160:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 6345,
                              "name": "reserveRegistry",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6043,
                              "src": "5624:15:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                                "typeString": "contract RegistryInterface"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 6347,
                                  "name": "prizeStrategy",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 6332,
                                  "src": "5655:13:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                    "typeString": "contract MultipleWinners"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                    "typeString": "contract MultipleWinners"
                                  }
                                ],
                                "id": 6346,
                                "name": "_tokens",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6442,
                                "src": "5647:7:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_contract$_MultipleWinners_$12365_$returns$_t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr_$",
                                  "typeString": "function (contract MultipleWinners) view returns (contract ControlledTokenInterface[] memory)"
                                }
                              },
                              "id": 6348,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5647:22:34",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                                "typeString": "contract ControlledTokenInterface[] memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 6349,
                                "name": "prizePoolConfig",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6316,
                                "src": "5677:15:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_StakePrizePoolConfig_$6041_memory_ptr",
                                  "typeString": "struct PoolWithMultipleWinnersBuilder.StakePrizePoolConfig memory"
                                }
                              },
                              "id": 6350,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "maxExitFeeMantissa",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 6040,
                              "src": "5677:34:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 6351,
                                "name": "prizePoolConfig",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6316,
                                "src": "5719:15:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_StakePrizePoolConfig_$6041_memory_ptr",
                                  "typeString": "struct PoolWithMultipleWinnersBuilder.StakePrizePoolConfig memory"
                                }
                              },
                              "id": 6352,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "token",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 6038,
                              "src": "5719:21:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                                "typeString": "contract RegistryInterface"
                              },
                              {
                                "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                                "typeString": "contract ControlledTokenInterface[] memory"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 6342,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6326,
                              "src": "5596:9:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                                "typeString": "contract StakePrizePool"
                              }
                            },
                            "id": 6344,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "initialize",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 9215,
                            "src": "5596:20:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_contract$_RegistryInterface_$12458_$_t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr_$_t_uint256_$_t_contract$_IERC20Upgradeable_$1960_$returns$__$",
                              "typeString": "function (contract RegistryInterface,contract ControlledTokenInterface[] memory,uint256,contract IERC20Upgradeable) external"
                            }
                          },
                          "id": 6353,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5596:150:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6354,
                        "nodeType": "ExpressionStatement",
                        "src": "5596:150:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 6358,
                              "name": "prizeStrategy",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6332,
                              "src": "5779:13:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                "typeString": "contract MultipleWinners"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                "typeString": "contract MultipleWinners"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 6355,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6326,
                              "src": "5752:9:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                                "typeString": "contract StakePrizePool"
                              }
                            },
                            "id": 6357,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "setPrizeStrategy",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 8398,
                            "src": "5752:26:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_contract$_TokenListenerInterface_$16265_$returns$__$",
                              "typeString": "function (contract TokenListenerInterface) external"
                            }
                          },
                          "id": 6359,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5752:41:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6360,
                        "nodeType": "ExpressionStatement",
                        "src": "5752:41:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 6366,
                                      "name": "prizeStrategy",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 6332,
                                      "src": "5840:13:34",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                        "typeString": "contract MultipleWinners"
                                      }
                                    },
                                    "id": 6367,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "ticket",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 9742,
                                    "src": "5840:20:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_view$__$returns$_t_contract$_TicketInterface_$16152_$",
                                      "typeString": "function () view external returns (contract TicketInterface)"
                                    }
                                  },
                                  "id": 6368,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "5840:22:34",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_TicketInterface_$16152",
                                    "typeString": "contract TicketInterface"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_TicketInterface_$16152",
                                    "typeString": "contract TicketInterface"
                                  }
                                ],
                                "id": 6365,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "5832:7:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 6364,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "5832:7:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 6369,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5832:31:34",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "expression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 6370,
                                    "name": "prizeStrategyConfig",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 6318,
                                    "src": "5871:19:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                                      "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig memory"
                                    }
                                  },
                                  "id": 6371,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "ticketCreditRateMantissa",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 5800,
                                  "src": "5871:44:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 6372,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "toUint128",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 4813,
                                "src": "5871:54:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                  "typeString": "function (uint256) pure returns (uint128)"
                                }
                              },
                              "id": 6373,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5871:56:34",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "expression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 6374,
                                    "name": "prizeStrategyConfig",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 6318,
                                    "src": "5935:19:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                                      "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig memory"
                                    }
                                  },
                                  "id": 6375,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "ticketCreditLimitMantissa",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 5798,
                                  "src": "5935:45:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 6376,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "toUint128",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 4813,
                                "src": "5935:55:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                  "typeString": "function (uint256) pure returns (uint128)"
                                }
                              },
                              "id": 6377,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5935:57:34",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              },
                              {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 6361,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6326,
                              "src": "5799:9:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                                "typeString": "contract StakePrizePool"
                              }
                            },
                            "id": 6363,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "setCreditPlanOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 8202,
                            "src": "5799:25:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint128_$_t_uint128_$returns$__$",
                              "typeString": "function (address,uint128,uint128) external"
                            }
                          },
                          "id": 6378,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5799:199:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6379,
                        "nodeType": "ExpressionStatement",
                        "src": "5799:199:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 6383,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "6032:3:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 6384,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "6032:10:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 6380,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6326,
                              "src": "6004:9:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                                "typeString": "contract StakePrizePool"
                              }
                            },
                            "id": 6382,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "transferOwnership",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 125,
                            "src": "6004:27:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address) external"
                            }
                          },
                          "id": 6385,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6004:39:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6386,
                        "nodeType": "ExpressionStatement",
                        "src": "6004:39:34"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 6388,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6326,
                              "src": "6095:9:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                                "typeString": "contract StakePrizePool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 6389,
                              "name": "prizeStrategy",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6332,
                              "src": "6106:13:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                "typeString": "contract MultipleWinners"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                                "typeString": "contract StakePrizePool"
                              },
                              {
                                "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                "typeString": "contract MultipleWinners"
                              }
                            ],
                            "id": 6387,
                            "name": "StakePrizePoolWithMultipleWinnersCreated",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6026,
                            "src": "6054:40:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_contract$_StakePrizePool_$9278_$_t_contract$_MultipleWinners_$12365_$returns$__$",
                              "typeString": "function (contract StakePrizePool,contract MultipleWinners)"
                            }
                          },
                          "id": 6390,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6054:66:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6391,
                        "nodeType": "EmitStatement",
                        "src": "6049:71:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 6392,
                          "name": "prizePool",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 6326,
                          "src": "6133:9:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                            "typeString": "contract StakePrizePool"
                          }
                        },
                        "functionReturnParameters": 6324,
                        "id": 6393,
                        "nodeType": "Return",
                        "src": "6126:16:34"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "c4844272",
                  "id": 6395,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "createStakeMultipleWinners",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 6321,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6316,
                        "mutability": "mutable",
                        "name": "prizePoolConfig",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6395,
                        "src": "5177:43:34",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_StakePrizePoolConfig_$6041_memory_ptr",
                          "typeString": "struct PoolWithMultipleWinnersBuilder.StakePrizePoolConfig"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6315,
                          "name": "StakePrizePoolConfig",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 6041,
                          "src": "5177:20:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_StakePrizePoolConfig_$6041_storage_ptr",
                            "typeString": "struct PoolWithMultipleWinnersBuilder.StakePrizePoolConfig"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6318,
                        "mutability": "mutable",
                        "name": "prizeStrategyConfig",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6395,
                        "src": "5226:71:34",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_memory_ptr",
                          "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6317,
                          "name": "MultipleWinnersBuilder.MultipleWinnersConfig",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 5808,
                          "src": "5226:44:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_MultipleWinnersConfig_$5808_storage_ptr",
                            "typeString": "struct MultipleWinnersBuilder.MultipleWinnersConfig"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6320,
                        "mutability": "mutable",
                        "name": "decimals",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6395,
                        "src": "5303:14:34",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 6319,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "5303:5:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5171:150:34"
                  },
                  "returnParameters": {
                    "id": 6324,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6323,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6395,
                        "src": "5340:14:34",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                          "typeString": "contract StakePrizePool"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6322,
                          "name": "StakePrizePool",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 9278,
                          "src": "5340:14:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                            "typeString": "contract StakePrizePool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5339:16:34"
                  },
                  "scope": 6443,
                  "src": "5136:1011:34",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 6441,
                    "nodeType": "Block",
                    "src": "6260:267:34",
                    "statements": [
                      {
                        "assignments": [
                          6406
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 6406,
                            "mutability": "mutable",
                            "name": "tokens",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 6441,
                            "src": "6266:40:34",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                              "typeString": "contract ControlledTokenInterface[]"
                            },
                            "typeName": {
                              "baseType": {
                                "contractScope": null,
                                "id": 6404,
                                "name": "ControlledTokenInterface",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 15850,
                                "src": "6266:24:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                  "typeString": "contract ControlledTokenInterface"
                                }
                              },
                              "id": 6405,
                              "length": null,
                              "nodeType": "ArrayTypeName",
                              "src": "6266:26:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_storage_ptr",
                                "typeString": "contract ControlledTokenInterface[]"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 6412,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "32",
                              "id": 6410,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "6340:1:34",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_2_by_1",
                                "typeString": "int_const 2"
                              },
                              "value": "2"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_2_by_1",
                                "typeString": "int_const 2"
                              }
                            ],
                            "id": 6409,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "NewExpression",
                            "src": "6309:30:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr_$",
                              "typeString": "function (uint256) pure returns (contract ControlledTokenInterface[] memory)"
                            },
                            "typeName": {
                              "baseType": {
                                "contractScope": null,
                                "id": 6407,
                                "name": "ControlledTokenInterface",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 15850,
                                "src": "6313:24:34",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                  "typeString": "contract ControlledTokenInterface"
                                }
                              },
                              "id": 6408,
                              "length": null,
                              "nodeType": "ArrayTypeName",
                              "src": "6313:26:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_storage_ptr",
                                "typeString": "contract ControlledTokenInterface[]"
                              }
                            }
                          },
                          "id": 6411,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6309:33:34",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                            "typeString": "contract ControlledTokenInterface[] memory"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "6266:76:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 6424,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 6413,
                              "name": "tokens",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6406,
                              "src": "6348:6:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                                "typeString": "contract ControlledTokenInterface[] memory"
                              }
                            },
                            "id": 6415,
                            "indexExpression": {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 6414,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "6355:1:34",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "6348:9:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                              "typeString": "contract ControlledTokenInterface"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [],
                                    "expression": {
                                      "argumentTypes": [],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 6419,
                                        "name": "_multipleWinners",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 6397,
                                        "src": "6393:16:34",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                          "typeString": "contract MultipleWinners"
                                        }
                                      },
                                      "id": 6420,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "ticket",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 9742,
                                      "src": "6393:23:34",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_external_view$__$returns$_t_contract$_TicketInterface_$16152_$",
                                        "typeString": "function () view external returns (contract TicketInterface)"
                                      }
                                    },
                                    "id": 6421,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "6393:25:34",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_TicketInterface_$16152",
                                      "typeString": "contract TicketInterface"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_TicketInterface_$16152",
                                      "typeString": "contract TicketInterface"
                                    }
                                  ],
                                  "id": 6418,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "6385:7:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 6417,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "6385:7:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 6422,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "6385:34:34",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "id": 6416,
                              "name": "ControlledTokenInterface",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15850,
                              "src": "6360:24:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_ControlledTokenInterface_$15850_$",
                                "typeString": "type(contract ControlledTokenInterface)"
                              }
                            },
                            "id": 6423,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "6360:60:34",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                              "typeString": "contract ControlledTokenInterface"
                            }
                          },
                          "src": "6348:72:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                            "typeString": "contract ControlledTokenInterface"
                          }
                        },
                        "id": 6425,
                        "nodeType": "ExpressionStatement",
                        "src": "6348:72:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 6437,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 6426,
                              "name": "tokens",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6406,
                              "src": "6426:6:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                                "typeString": "contract ControlledTokenInterface[] memory"
                              }
                            },
                            "id": 6428,
                            "indexExpression": {
                              "argumentTypes": null,
                              "hexValue": "31",
                              "id": 6427,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "6433:1:34",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_1_by_1",
                                "typeString": "int_const 1"
                              },
                              "value": "1"
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "6426:9:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                              "typeString": "contract ControlledTokenInterface"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [],
                                    "expression": {
                                      "argumentTypes": [],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 6432,
                                        "name": "_multipleWinners",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 6397,
                                        "src": "6471:16:34",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                          "typeString": "contract MultipleWinners"
                                        }
                                      },
                                      "id": 6433,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "sponsorship",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 9744,
                                      "src": "6471:28:34",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_external_view$__$returns$_t_contract$_IERC20Upgradeable_$1960_$",
                                        "typeString": "function () view external returns (contract IERC20Upgradeable)"
                                      }
                                    },
                                    "id": 6434,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "6471:30:34",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                      "typeString": "contract IERC20Upgradeable"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                      "typeString": "contract IERC20Upgradeable"
                                    }
                                  ],
                                  "id": 6431,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "6463:7:34",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 6430,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "6463:7:34",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 6435,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "6463:39:34",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "id": 6429,
                              "name": "ControlledTokenInterface",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15850,
                              "src": "6438:24:34",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_ControlledTokenInterface_$15850_$",
                                "typeString": "type(contract ControlledTokenInterface)"
                              }
                            },
                            "id": 6436,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "6438:65:34",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                              "typeString": "contract ControlledTokenInterface"
                            }
                          },
                          "src": "6426:77:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                            "typeString": "contract ControlledTokenInterface"
                          }
                        },
                        "id": 6438,
                        "nodeType": "ExpressionStatement",
                        "src": "6426:77:34"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 6439,
                          "name": "tokens",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 6406,
                          "src": "6516:6:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                            "typeString": "contract ControlledTokenInterface[] memory"
                          }
                        },
                        "functionReturnParameters": 6402,
                        "id": 6440,
                        "nodeType": "Return",
                        "src": "6509:13:34"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 6442,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_tokens",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 6398,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6397,
                        "mutability": "mutable",
                        "name": "_multipleWinners",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6442,
                        "src": "6168:32:34",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                          "typeString": "contract MultipleWinners"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6396,
                          "name": "MultipleWinners",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 12365,
                          "src": "6168:15:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                            "typeString": "contract MultipleWinners"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6167:34:34"
                  },
                  "returnParameters": {
                    "id": 6402,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6401,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6442,
                        "src": "6225:33:34",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                          "typeString": "contract ControlledTokenInterface[]"
                        },
                        "typeName": {
                          "baseType": {
                            "contractScope": null,
                            "id": 6399,
                            "name": "ControlledTokenInterface",
                            "nodeType": "UserDefinedTypeName",
                            "referencedDeclaration": 15850,
                            "src": "6225:24:34",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                              "typeString": "contract ControlledTokenInterface"
                            }
                          },
                          "id": 6400,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "6225:26:34",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_storage_ptr",
                            "typeString": "contract ControlledTokenInterface[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6224:35:34"
                  },
                  "scope": 6443,
                  "src": "6151:376:34",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 6444,
              "src": "533:5997:34"
            }
          ],
          "src": "37:6494:34"
        },
        "id": 34
      },
      "contracts/external/compound/CTokenInterface.sol": {
        "ast": {
          "absolutePath": "contracts/external/compound/CTokenInterface.sol",
          "exportedSymbols": {
            "CTokenInterface": [
              6511
            ]
          },
          "id": 6512,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 6445,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:35"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "id": 6446,
              "nodeType": "ImportDirective",
              "scope": 6512,
              "sourceUnit": 1961,
              "src": "62:79:35",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 6447,
                    "name": "IERC20Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1960,
                    "src": "172:17:35",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                      "typeString": "contract IERC20Upgradeable"
                    }
                  },
                  "id": 6448,
                  "nodeType": "InheritanceSpecifier",
                  "src": "172:17:35"
                }
              ],
              "contractDependencies": [
                1960
              ],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 6511,
              "linearizedBaseContracts": [
                6511,
                1960
              ],
              "name": "CTokenInterface",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "313ce567",
                  "id": 6453,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "decimals",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 6449,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "213:2:35"
                  },
                  "returnParameters": {
                    "id": 6452,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6451,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6453,
                        "src": "239:5:35",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 6450,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "239:5:35",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "238:7:35"
                  },
                  "scope": 6511,
                  "src": "196:50:35",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    1891
                  ],
                  "body": null,
                  "documentation": null,
                  "functionSelector": "18160ddd",
                  "id": 6459,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "totalSupply",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 6455,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "283:8:35"
                  },
                  "parameters": {
                    "id": 6454,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "271:2:35"
                  },
                  "returnParameters": {
                    "id": 6458,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6457,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6459,
                        "src": "306:7:35",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6456,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "306:7:35",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "305:9:35"
                  },
                  "scope": 6511,
                  "src": "251:64:35",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "6f307dc3",
                  "id": 6464,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "underlying",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 6460,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "339:2:35"
                  },
                  "returnParameters": {
                    "id": 6463,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6462,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6464,
                        "src": "365:7:35",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6461,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "365:7:35",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "364:9:35"
                  },
                  "scope": 6511,
                  "src": "320:54:35",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "3af9e669",
                  "id": 6471,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "balanceOfUnderlying",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 6467,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6466,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6471,
                        "src": "408:13:35",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6465,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "408:7:35",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "407:15:35"
                  },
                  "returnParameters": {
                    "id": 6470,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6469,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6471,
                        "src": "441:7:35",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6468,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "441:7:35",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "440:9:35"
                  },
                  "scope": 6511,
                  "src": "379:71:35",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "ae9d70b0",
                  "id": 6476,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "supplyRatePerBlock",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 6472,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "482:2:35"
                  },
                  "returnParameters": {
                    "id": 6475,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6474,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6476,
                        "src": "503:7:35",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6473,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "503:7:35",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "502:9:35"
                  },
                  "scope": 6511,
                  "src": "455:57:35",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "bd6d894d",
                  "id": 6481,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "exchangeRateCurrent",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 6477,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "545:2:35"
                  },
                  "returnParameters": {
                    "id": 6480,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6479,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6481,
                        "src": "566:7:35",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6478,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "566:7:35",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "565:9:35"
                  },
                  "scope": 6511,
                  "src": "517:58:35",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "a0712d68",
                  "id": 6488,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "mint",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 6484,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6483,
                        "mutability": "mutable",
                        "name": "mintAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6488,
                        "src": "594:18:35",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6482,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "594:7:35",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "593:20:35"
                  },
                  "returnParameters": {
                    "id": 6487,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6486,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6488,
                        "src": "632:7:35",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6485,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "632:7:35",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "631:9:35"
                  },
                  "scope": 6511,
                  "src": "580:61:35",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "db006a75",
                  "id": 6495,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "redeem",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 6491,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6490,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6495,
                        "src": "662:14:35",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6489,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "662:7:35",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "661:16:35"
                  },
                  "returnParameters": {
                    "id": 6494,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6493,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6495,
                        "src": "696:7:35",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6492,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "696:7:35",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "695:9:35"
                  },
                  "scope": 6511,
                  "src": "646:59:35",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    1899
                  ],
                  "body": null,
                  "documentation": null,
                  "functionSelector": "70a08231",
                  "id": 6503,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "balanceOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 6499,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "752:8:35"
                  },
                  "parameters": {
                    "id": 6498,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6497,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6503,
                        "src": "729:12:35",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6496,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "729:7:35",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "728:14:35"
                  },
                  "returnParameters": {
                    "id": 6502,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6501,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6503,
                        "src": "775:7:35",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6500,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "775:7:35",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "774:9:35"
                  },
                  "scope": 6511,
                  "src": "710:74:35",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "852a12e3",
                  "id": 6510,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "redeemUnderlying",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 6506,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6505,
                        "mutability": "mutable",
                        "name": "redeemAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6510,
                        "src": "815:20:35",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6504,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "815:7:35",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "814:22:35"
                  },
                  "returnParameters": {
                    "id": 6509,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6508,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6510,
                        "src": "855:7:35",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6507,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "855:7:35",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "854:9:35"
                  },
                  "scope": 6511,
                  "src": "789:75:35",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 6512,
              "src": "143:723:35"
            }
          ],
          "src": "37:830:35"
        },
        "id": 35
      },
      "contracts/external/compound/ICompLike.sol": {
        "ast": {
          "absolutePath": "contracts/external/compound/ICompLike.sol",
          "exportedSymbols": {
            "ICompLike": [
              6529
            ]
          },
          "id": 6530,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 6513,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:36"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "id": 6514,
              "nodeType": "ImportDirective",
              "scope": 6530,
              "sourceUnit": 1961,
              "src": "62:79:36",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 6515,
                    "name": "IERC20Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1960,
                    "src": "166:17:36",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                      "typeString": "contract IERC20Upgradeable"
                    }
                  },
                  "id": 6516,
                  "nodeType": "InheritanceSpecifier",
                  "src": "166:17:36"
                }
              ],
              "contractDependencies": [
                1960
              ],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 6529,
              "linearizedBaseContracts": [
                6529,
                1960
              ],
              "name": "ICompLike",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "b4b5ea57",
                  "id": 6523,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "getCurrentVotes",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 6519,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6518,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6523,
                        "src": "213:15:36",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6517,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "213:7:36",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "212:17:36"
                  },
                  "returnParameters": {
                    "id": 6522,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6521,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6523,
                        "src": "253:6:36",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint96",
                          "typeString": "uint96"
                        },
                        "typeName": {
                          "id": 6520,
                          "name": "uint96",
                          "nodeType": "ElementaryTypeName",
                          "src": "253:6:36",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint96",
                            "typeString": "uint96"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "252:8:36"
                  },
                  "scope": 6529,
                  "src": "188:73:36",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "5c19a95c",
                  "id": 6528,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "delegate",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 6526,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6525,
                        "mutability": "mutable",
                        "name": "delegatee",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6528,
                        "src": "282:17:36",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6524,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "282:7:36",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "281:19:36"
                  },
                  "returnParameters": {
                    "id": 6527,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "309:0:36"
                  },
                  "scope": 6529,
                  "src": "264:46:36",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 6530,
              "src": "143:169:36"
            }
          ],
          "src": "37:276:36"
        },
        "id": 36
      },
      "contracts/external/maker/DaiInterface.sol": {
        "ast": {
          "absolutePath": "contracts/external/maker/DaiInterface.sol",
          "exportedSymbols": {
            "DaiInterface": [
              6566
            ]
          },
          "id": 6567,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 6531,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:37"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "id": 6532,
              "nodeType": "ImportDirective",
              "scope": 6567,
              "sourceUnit": 1961,
              "src": "62:79:37",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 6533,
                    "name": "IERC20Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1960,
                    "src": "169:17:37",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                      "typeString": "contract IERC20Upgradeable"
                    }
                  },
                  "id": 6534,
                  "nodeType": "InheritanceSpecifier",
                  "src": "169:17:37"
                }
              ],
              "contractDependencies": [
                1960
              ],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 6566,
              "linearizedBaseContracts": [
                6566,
                1960
              ],
              "name": "DaiInterface",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "8fcbaf0c",
                  "id": 6553,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "permit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 6551,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6536,
                        "mutability": "mutable",
                        "name": "holder",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6553,
                        "src": "243:14:37",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6535,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "243:7:37",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6538,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6553,
                        "src": "259:15:37",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6537,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "259:7:37",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6540,
                        "mutability": "mutable",
                        "name": "nonce",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6553,
                        "src": "276:13:37",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6539,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "276:7:37",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6542,
                        "mutability": "mutable",
                        "name": "expiry",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6553,
                        "src": "291:14:37",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6541,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "291:7:37",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6544,
                        "mutability": "mutable",
                        "name": "allowed",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6553,
                        "src": "307:12:37",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 6543,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "307:4:37",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6546,
                        "mutability": "mutable",
                        "name": "v",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6553,
                        "src": "321:7:37",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 6545,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "321:5:37",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6548,
                        "mutability": "mutable",
                        "name": "r",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6553,
                        "src": "330:9:37",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 6547,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "330:7:37",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6550,
                        "mutability": "mutable",
                        "name": "s",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6553,
                        "src": "341:9:37",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 6549,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "341:7:37",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "242:109:37"
                  },
                  "returnParameters": {
                    "id": 6552,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "360:0:37"
                  },
                  "scope": 6566,
                  "src": "227:134:37",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    1941
                  ],
                  "body": null,
                  "documentation": null,
                  "functionSelector": "23b872dd",
                  "id": 6565,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "transferFrom",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 6561,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "431:8:37"
                  },
                  "parameters": {
                    "id": 6560,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6555,
                        "mutability": "mutable",
                        "name": "src",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6565,
                        "src": "386:11:37",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6554,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "386:7:37",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6557,
                        "mutability": "mutable",
                        "name": "dst",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6565,
                        "src": "399:11:37",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6556,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "399:7:37",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6559,
                        "mutability": "mutable",
                        "name": "wad",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6565,
                        "src": "412:8:37",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6558,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "412:4:37",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "385:36:37"
                  },
                  "returnParameters": {
                    "id": 6564,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6563,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6565,
                        "src": "449:4:37",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 6562,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "449:4:37",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "448:6:37"
                  },
                  "scope": 6566,
                  "src": "364:91:37",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 6567,
              "src": "143:314:37"
            }
          ],
          "src": "37:421:37"
        },
        "id": 37
      },
      "contracts/external/openzeppelin/ProxyFactory.sol": {
        "ast": {
          "absolutePath": "contracts/external/openzeppelin/ProxyFactory.sol",
          "exportedSymbols": {
            "ProxyFactory": [
              6616
            ]
          },
          "id": 6617,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 6568,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "0:23:38"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 6616,
              "linearizedBaseContracts": [
                6616
              ],
              "name": "ProxyFactory",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 6572,
                  "name": "ProxyCreated",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 6571,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6570,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "proxy",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6572,
                        "src": "163:13:38",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6569,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "163:7:38",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "162:15:38"
                  },
                  "src": "144:34:38"
                },
                {
                  "body": {
                    "id": 6614,
                    "nodeType": "Block",
                    "src": "272:688:38",
                    "statements": [
                      {
                        "assignments": [
                          6582
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 6582,
                            "mutability": "mutable",
                            "name": "targetBytes",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 6614,
                            "src": "416:19:38",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes20",
                              "typeString": "bytes20"
                            },
                            "typeName": {
                              "id": 6581,
                              "name": "bytes20",
                              "nodeType": "ElementaryTypeName",
                              "src": "416:7:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes20",
                                "typeString": "bytes20"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 6587,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 6585,
                              "name": "_logic",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6574,
                              "src": "446:6:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 6584,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "438:7:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_bytes20_$",
                              "typeString": "type(bytes20)"
                            },
                            "typeName": {
                              "id": 6583,
                              "name": "bytes20",
                              "nodeType": "ElementaryTypeName",
                              "src": "438:7:38",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 6586,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "438:15:38",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes20",
                            "typeString": "bytes20"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "416:37:38"
                      },
                      {
                        "AST": {
                          "nodeType": "YulBlock",
                          "src": "468:307:38",
                          "statements": [
                            {
                              "nodeType": "YulVariableDeclaration",
                              "src": "476:24:38",
                              "value": {
                                "arguments": [
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "495:4:38",
                                    "type": "",
                                    "value": "0x40"
                                  }
                                ],
                                "functionName": {
                                  "name": "mload",
                                  "nodeType": "YulIdentifier",
                                  "src": "489:5:38"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "489:11:38"
                              },
                              "variables": [
                                {
                                  "name": "clone",
                                  "nodeType": "YulTypedName",
                                  "src": "480:5:38",
                                  "type": ""
                                }
                              ]
                            },
                            {
                              "expression": {
                                "arguments": [
                                  {
                                    "name": "clone",
                                    "nodeType": "YulIdentifier",
                                    "src": "514:5:38"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "521:66:38",
                                    "type": "",
                                    "value": "0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000"
                                  }
                                ],
                                "functionName": {
                                  "name": "mstore",
                                  "nodeType": "YulIdentifier",
                                  "src": "507:6:38"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "507:81:38"
                              },
                              "nodeType": "YulExpressionStatement",
                              "src": "507:81:38"
                            },
                            {
                              "expression": {
                                "arguments": [
                                  {
                                    "arguments": [
                                      {
                                        "name": "clone",
                                        "nodeType": "YulIdentifier",
                                        "src": "606:5:38"
                                      },
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "613:4:38",
                                        "type": "",
                                        "value": "0x14"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "add",
                                      "nodeType": "YulIdentifier",
                                      "src": "602:3:38"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "602:16:38"
                                  },
                                  {
                                    "name": "targetBytes",
                                    "nodeType": "YulIdentifier",
                                    "src": "620:11:38"
                                  }
                                ],
                                "functionName": {
                                  "name": "mstore",
                                  "nodeType": "YulIdentifier",
                                  "src": "595:6:38"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "595:37:38"
                              },
                              "nodeType": "YulExpressionStatement",
                              "src": "595:37:38"
                            },
                            {
                              "expression": {
                                "arguments": [
                                  {
                                    "arguments": [
                                      {
                                        "name": "clone",
                                        "nodeType": "YulIdentifier",
                                        "src": "650:5:38"
                                      },
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "657:4:38",
                                        "type": "",
                                        "value": "0x28"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "add",
                                      "nodeType": "YulIdentifier",
                                      "src": "646:3:38"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "646:16:38"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "664:66:38",
                                    "type": "",
                                    "value": "0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000"
                                  }
                                ],
                                "functionName": {
                                  "name": "mstore",
                                  "nodeType": "YulIdentifier",
                                  "src": "639:6:38"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "639:92:38"
                              },
                              "nodeType": "YulExpressionStatement",
                              "src": "639:92:38"
                            },
                            {
                              "nodeType": "YulAssignment",
                              "src": "738:31:38",
                              "value": {
                                "arguments": [
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "754:1:38",
                                    "type": "",
                                    "value": "0"
                                  },
                                  {
                                    "name": "clone",
                                    "nodeType": "YulIdentifier",
                                    "src": "757:5:38"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "764:4:38",
                                    "type": "",
                                    "value": "0x37"
                                  }
                                ],
                                "functionName": {
                                  "name": "create",
                                  "nodeType": "YulIdentifier",
                                  "src": "747:6:38"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "747:22:38"
                              },
                              "variableNames": [
                                {
                                  "name": "proxy",
                                  "nodeType": "YulIdentifier",
                                  "src": "738:5:38"
                                }
                              ]
                            }
                          ]
                        },
                        "evmVersion": "istanbul",
                        "externalReferences": [
                          {
                            "declaration": 6579,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "738:5:38",
                            "valueSize": 1
                          },
                          {
                            "declaration": 6582,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "620:11:38",
                            "valueSize": 1
                          }
                        ],
                        "id": 6588,
                        "nodeType": "InlineAssembly",
                        "src": "459:316:38"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 6592,
                                  "name": "proxy",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 6579,
                                  "src": "807:5:38",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 6591,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "799:7:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 6590,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "799:7:38",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 6593,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "799:14:38",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 6589,
                            "name": "ProxyCreated",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6572,
                            "src": "786:12:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 6594,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "786:28:38",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6595,
                        "nodeType": "EmitStatement",
                        "src": "781:33:38"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 6599,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 6596,
                              "name": "_data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6576,
                              "src": "824:5:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            },
                            "id": 6597,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "824:12:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 6598,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "839:1:38",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "824:16:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 6613,
                        "nodeType": "IfStatement",
                        "src": "821:135:38",
                        "trueBody": {
                          "id": 6612,
                          "nodeType": "Block",
                          "src": "842:114:38",
                          "statements": [
                            {
                              "assignments": [
                                6601,
                                null
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 6601,
                                  "mutability": "mutable",
                                  "name": "success",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 6612,
                                  "src": "851:12:38",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  "typeName": {
                                    "id": 6600,
                                    "name": "bool",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "851:4:38",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                },
                                null
                              ],
                              "id": 6606,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 6604,
                                    "name": "_data",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 6576,
                                    "src": "879:5:38",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes_memory_ptr",
                                      "typeString": "bytes memory"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes_memory_ptr",
                                      "typeString": "bytes memory"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 6602,
                                    "name": "proxy",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 6579,
                                    "src": "868:5:38",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "id": 6603,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "call",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "868:10:38",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                                    "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                                  }
                                },
                                "id": 6605,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "868:17:38",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                                  "typeString": "tuple(bool,bytes memory)"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "850:35:38"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 6608,
                                    "name": "success",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 6601,
                                    "src": "901:7:38",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "50726f7879466163746f72792f636f6e7374727563746f722d63616c6c2d6661696c6564",
                                    "id": 6609,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "910:38:38",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_9d184a125bfd982ba6ca6dbe62fbd27e66f79d76ba3364ae32efae786fb3012d",
                                      "typeString": "literal_string \"ProxyFactory/constructor-call-failed\""
                                    },
                                    "value": "ProxyFactory/constructor-call-failed"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_9d184a125bfd982ba6ca6dbe62fbd27e66f79d76ba3364ae32efae786fb3012d",
                                      "typeString": "literal_string \"ProxyFactory/constructor-call-failed\""
                                    }
                                  ],
                                  "id": 6607,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "893:7:38",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 6610,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "893:56:38",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 6611,
                              "nodeType": "ExpressionStatement",
                              "src": "893:56:38"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "b3eeb5e2",
                  "id": 6615,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "deployMinimal",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 6577,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6574,
                        "mutability": "mutable",
                        "name": "_logic",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6615,
                        "src": "205:14:38",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6573,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "205:7:38",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6576,
                        "mutability": "mutable",
                        "name": "_data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6615,
                        "src": "221:18:38",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 6575,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "221:5:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "204:36:38"
                  },
                  "returnParameters": {
                    "id": 6580,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6579,
                        "mutability": "mutable",
                        "name": "proxy",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6615,
                        "src": "257:13:38",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6578,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "257:7:38",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "256:15:38"
                  },
                  "scope": 6616,
                  "src": "182:778:38",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                }
              ],
              "scope": 6617,
              "src": "117:845:38"
            }
          ],
          "src": "0:963:38"
        },
        "id": 38
      },
      "contracts/prize-pool/PrizePool.sol": {
        "ast": {
          "absolutePath": "contracts/prize-pool/PrizePool.sol",
          "exportedSymbols": {
            "PrizePool": [
              8751
            ]
          },
          "id": 8752,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 6618,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:39"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol",
              "id": 6619,
              "nodeType": "ImportDirective",
              "scope": 8752,
              "sourceUnit": 131,
              "src": "62:75:39",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol",
              "id": 6620,
              "nodeType": "ImportDirective",
              "scope": 8752,
              "sourceUnit": 5101,
              "src": "138:75:39",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol",
              "id": 6621,
              "nodeType": "ImportDirective",
              "scope": 8752,
              "sourceUnit": 4788,
              "src": "214:82:39",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol",
              "id": 6622,
              "nodeType": "ImportDirective",
              "scope": 8752,
              "sourceUnit": 3339,
              "src": "297:81:39",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol",
              "id": 6623,
              "nodeType": "ImportDirective",
              "scope": 8752,
              "sourceUnit": 3223,
              "src": "379:89:39",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol",
              "id": 6624,
              "nodeType": "ImportDirective",
              "scope": 8752,
              "sourceUnit": 845,
              "src": "469:88:39",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol",
              "id": 6625,
              "nodeType": "ImportDirective",
              "scope": 8752,
              "sourceUnit": 2174,
              "src": "558:82:39",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@pooltogether/fixed-point/contracts/FixedPoint.sol",
              "file": "@pooltogether/fixed-point/contracts/FixedPoint.sol",
              "id": 6626,
              "nodeType": "ImportDirective",
              "scope": 8752,
              "sourceUnit": 5280,
              "src": "641:60:39",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/external/compound/ICompLike.sol",
              "file": "../external/compound/ICompLike.sol",
              "id": 6627,
              "nodeType": "ImportDirective",
              "scope": 8752,
              "sourceUnit": 6530,
              "src": "703:44:39",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/registry/RegistryInterface.sol",
              "file": "../registry/RegistryInterface.sol",
              "id": 6628,
              "nodeType": "ImportDirective",
              "scope": 8752,
              "sourceUnit": 12459,
              "src": "748:43:39",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/reserve/ReserveInterface.sol",
              "file": "../reserve/ReserveInterface.sol",
              "id": 6629,
              "nodeType": "ImportDirective",
              "scope": 8752,
              "sourceUnit": 12540,
              "src": "792:41:39",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/token/TokenListenerInterface.sol",
              "file": "../token/TokenListenerInterface.sol",
              "id": 6630,
              "nodeType": "ImportDirective",
              "scope": 8752,
              "sourceUnit": 16266,
              "src": "834:45:39",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/token/TokenListenerLibrary.sol",
              "file": "../token/TokenListenerLibrary.sol",
              "id": 6631,
              "nodeType": "ImportDirective",
              "scope": 8752,
              "sourceUnit": 16272,
              "src": "880:43:39",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/token/ControlledToken.sol",
              "file": "../token/ControlledToken.sol",
              "id": 6632,
              "nodeType": "ImportDirective",
              "scope": 8752,
              "sourceUnit": 15811,
              "src": "924:38:39",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/token/TokenControllerInterface.sol",
              "file": "../token/TokenControllerInterface.sol",
              "id": 6633,
              "nodeType": "ImportDirective",
              "scope": 8752,
              "sourceUnit": 16207,
              "src": "963:47:39",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/utils/MappedSinglyLinkedList.sol",
              "file": "../utils/MappedSinglyLinkedList.sol",
              "id": 6634,
              "nodeType": "ImportDirective",
              "scope": 8752,
              "sourceUnit": 16705,
              "src": "1011:45:39",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/prize-pool/PrizePoolInterface.sol",
              "file": "./PrizePoolInterface.sol",
              "id": 6635,
              "nodeType": "ImportDirective",
              "scope": 8752,
              "sourceUnit": 8931,
              "src": "1057:34:39",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": true,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 6637,
                    "name": "PrizePoolInterface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 8930,
                    "src": "1530:18:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_PrizePoolInterface_$8930",
                      "typeString": "contract PrizePoolInterface"
                    }
                  },
                  "id": 6638,
                  "nodeType": "InheritanceSpecifier",
                  "src": "1530:18:39"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 6639,
                    "name": "OwnableUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 130,
                    "src": "1550:18:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_OwnableUpgradeable_$130",
                      "typeString": "contract OwnableUpgradeable"
                    }
                  },
                  "id": 6640,
                  "nodeType": "InheritanceSpecifier",
                  "src": "1550:18:39"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 6641,
                    "name": "ReentrancyGuardUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 4787,
                    "src": "1570:26:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ReentrancyGuardUpgradeable_$4787",
                      "typeString": "contract ReentrancyGuardUpgradeable"
                    }
                  },
                  "id": 6642,
                  "nodeType": "InheritanceSpecifier",
                  "src": "1570:26:39"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 6643,
                    "name": "TokenControllerInterface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 16206,
                    "src": "1598:24:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                      "typeString": "contract TokenControllerInterface"
                    }
                  },
                  "id": 6644,
                  "nodeType": "InheritanceSpecifier",
                  "src": "1598:24:39"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 6645,
                    "name": "IERC721ReceiverUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3222,
                    "src": "1624:26:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC721ReceiverUpgradeable_$3222",
                      "typeString": "contract IERC721ReceiverUpgradeable"
                    }
                  },
                  "id": 6646,
                  "nodeType": "InheritanceSpecifier",
                  "src": "1624:26:39"
                }
              ],
              "contractDependencies": [
                130,
                1352,
                3222,
                3627,
                4787,
                8930,
                16206
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 6636,
                "nodeType": "StructuredDocumentation",
                "src": "1093:406:39",
                "text": "@title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\n @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\n @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens"
              },
              "fullyImplemented": false,
              "id": 8751,
              "linearizedBaseContracts": [
                8751,
                3222,
                16206,
                4787,
                130,
                3627,
                1352,
                8930
              ],
              "name": "PrizePool",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 6649,
                  "libraryName": {
                    "contractScope": null,
                    "id": 6647,
                    "name": "SafeMathUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1286,
                    "src": "1661:19:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeMathUpgradeable_$1286",
                      "typeString": "library SafeMathUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "1655:38:39",
                  "typeName": {
                    "id": 6648,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1685:7:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "id": 6652,
                  "libraryName": {
                    "contractScope": null,
                    "id": 6650,
                    "name": "SafeCastUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 5100,
                    "src": "1702:19:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeCastUpgradeable_$5100",
                      "typeString": "library SafeCastUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "1696:38:39",
                  "typeName": {
                    "id": 6651,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1726:7:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "id": 6655,
                  "libraryName": {
                    "contractScope": null,
                    "id": 6653,
                    "name": "SafeERC20Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 2173,
                    "src": "1743:20:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeERC20Upgradeable_$2173",
                      "typeString": "library SafeERC20Upgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "1737:49:39",
                  "typeName": {
                    "contractScope": null,
                    "id": 6654,
                    "name": "IERC20Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1960,
                    "src": "1768:17:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                      "typeString": "contract IERC20Upgradeable"
                    }
                  }
                },
                {
                  "id": 6658,
                  "libraryName": {
                    "contractScope": null,
                    "id": 6656,
                    "name": "SafeERC20Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 2173,
                    "src": "1795:20:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeERC20Upgradeable_$2173",
                      "typeString": "library SafeERC20Upgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "1789:50:39",
                  "typeName": {
                    "contractScope": null,
                    "id": 6657,
                    "name": "IERC721Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3338,
                    "src": "1820:18:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                      "typeString": "contract IERC721Upgradeable"
                    }
                  }
                },
                {
                  "id": 6661,
                  "libraryName": {
                    "contractScope": null,
                    "id": 6659,
                    "name": "MappedSinglyLinkedList",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 16704,
                    "src": "1848:22:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_MappedSinglyLinkedList_$16704",
                      "typeString": "library MappedSinglyLinkedList"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "1842:64:39",
                  "typeName": {
                    "contractScope": null,
                    "id": 6660,
                    "name": "MappedSinglyLinkedList.Mapping",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 16337,
                    "src": "1875:30:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                      "typeString": "struct MappedSinglyLinkedList.Mapping"
                    }
                  }
                },
                {
                  "id": 6664,
                  "libraryName": {
                    "contractScope": null,
                    "id": 6662,
                    "name": "ERC165CheckerUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 844,
                    "src": "1915:24:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC165CheckerUpgradeable_$844",
                      "typeString": "library ERC165CheckerUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "1909:43:39",
                  "typeName": {
                    "id": 6663,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1944:7:39",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  }
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 6665,
                    "nodeType": "StructuredDocumentation",
                    "src": "1956:48:39",
                    "text": "@dev Emitted when an instance is initialized"
                  },
                  "id": 6671,
                  "name": "Initialized",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 6670,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6667,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "reserveRegistry",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6671,
                        "src": "2030:23:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6666,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2030:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6669,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "maxExitFeeMantissa",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6671,
                        "src": "2059:26:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6668,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2059:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2024:65:39"
                  },
                  "src": "2007:83:39"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 6672,
                    "nodeType": "StructuredDocumentation",
                    "src": "2094:53:39",
                    "text": "@dev Event emitted when controlled token is added"
                  },
                  "id": 6676,
                  "name": "ControlledTokenAdded",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 6675,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6674,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6676,
                        "src": "2182:38:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                          "typeString": "contract ControlledTokenInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6673,
                          "name": "ControlledTokenInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 15850,
                          "src": "2182:24:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                            "typeString": "contract ControlledTokenInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2176:48:39"
                  },
                  "src": "2150:75:39"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 6677,
                    "nodeType": "StructuredDocumentation",
                    "src": "2229:42:39",
                    "text": "@dev Emitted when reserve is captured."
                  },
                  "id": 6681,
                  "name": "ReserveFeeCaptured",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 6680,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6679,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6681,
                        "src": "2304:14:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6678,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2304:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2298:24:39"
                  },
                  "src": "2274:49:39"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 6685,
                  "name": "AwardCaptured",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 6684,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6683,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6685,
                        "src": "2352:14:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6682,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2352:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2346:24:39"
                  },
                  "src": "2327:44:39"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 6686,
                    "nodeType": "StructuredDocumentation",
                    "src": "2375:48:39",
                    "text": "@dev Event emitted when assets are deposited"
                  },
                  "id": 6698,
                  "name": "Deposited",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 6697,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6688,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "operator",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6698,
                        "src": "2447:24:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6687,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2447:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6690,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6698,
                        "src": "2477:18:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6689,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2477:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6692,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6698,
                        "src": "2501:21:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6691,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2501:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6694,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6698,
                        "src": "2528:14:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6693,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2528:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6696,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "referrer",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6698,
                        "src": "2548:16:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6695,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2548:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2441:127:39"
                  },
                  "src": "2426:143:39"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 6699,
                    "nodeType": "StructuredDocumentation",
                    "src": "2573:59:39",
                    "text": "@dev Event emitted when interest is awarded to a winner"
                  },
                  "id": 6707,
                  "name": "Awarded",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 6706,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6701,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "winner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6707,
                        "src": "2654:22:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6700,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2654:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6703,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6707,
                        "src": "2682:21:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6702,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2682:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6705,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6707,
                        "src": "2709:14:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6704,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2709:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2648:79:39"
                  },
                  "src": "2635:93:39"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 6708,
                    "nodeType": "StructuredDocumentation",
                    "src": "2732:67:39",
                    "text": "@dev Event emitted when external ERC20s are awarded to a winner"
                  },
                  "id": 6716,
                  "name": "AwardedExternalERC20",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 6715,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6710,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "winner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6716,
                        "src": "2834:22:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6709,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2834:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6712,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6716,
                        "src": "2862:21:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6711,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2862:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6714,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6716,
                        "src": "2889:14:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6713,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2889:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2828:79:39"
                  },
                  "src": "2802:106:39"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 6717,
                    "nodeType": "StructuredDocumentation",
                    "src": "2912:63:39",
                    "text": "@dev Event emitted when external ERC20s are transferred out"
                  },
                  "id": 6725,
                  "name": "TransferredExternalERC20",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 6724,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6719,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6725,
                        "src": "3014:18:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6718,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3014:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6721,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6725,
                        "src": "3038:21:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6720,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3038:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6723,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6725,
                        "src": "3065:14:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6722,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3065:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3008:75:39"
                  },
                  "src": "2978:106:39"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 6726,
                    "nodeType": "StructuredDocumentation",
                    "src": "3088:68:39",
                    "text": "@dev Event emitted when external ERC721s are awarded to a winner"
                  },
                  "id": 6735,
                  "name": "AwardedExternalERC721",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 6734,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6728,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "winner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6735,
                        "src": "3192:22:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6727,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3192:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6730,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6735,
                        "src": "3220:21:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6729,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3220:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6733,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "tokenIds",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6735,
                        "src": "3247:18:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 6731,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "3247:7:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 6732,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "3247:9:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3186:83:39"
                  },
                  "src": "3159:111:39"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 6736,
                    "nodeType": "StructuredDocumentation",
                    "src": "3274:58:39",
                    "text": "@dev Event emitted when assets are withdrawn instantly"
                  },
                  "id": 6750,
                  "name": "InstantWithdrawal",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 6749,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6738,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "operator",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6750,
                        "src": "3364:24:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6737,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3364:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6740,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6750,
                        "src": "3394:20:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6739,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3394:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6742,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6750,
                        "src": "3420:21:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6741,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3420:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6744,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6750,
                        "src": "3447:14:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6743,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3447:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6746,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "redeemed",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6750,
                        "src": "3467:16:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6745,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3467:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6748,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "exitFee",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6750,
                        "src": "3489:15:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6747,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3489:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3358:150:39"
                  },
                  "src": "3335:174:39"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 6756,
                  "name": "ReserveWithdrawal",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 6755,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6752,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6756,
                        "src": "3542:18:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6751,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3542:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6754,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6756,
                        "src": "3566:14:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6753,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3566:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3536:48:39"
                  },
                  "src": "3513:72:39"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 6757,
                    "nodeType": "StructuredDocumentation",
                    "src": "3589:52:39",
                    "text": "@dev Event emitted when the Liquidity Cap is set"
                  },
                  "id": 6761,
                  "name": "LiquidityCapSet",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 6760,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6759,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "liquidityCap",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6761,
                        "src": "3671:20:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6758,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3671:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3665:30:39"
                  },
                  "src": "3644:52:39"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 6762,
                    "nodeType": "StructuredDocumentation",
                    "src": "3700:50:39",
                    "text": "@dev Event emitted when the Credit plan is set"
                  },
                  "id": 6770,
                  "name": "CreditPlanSet",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 6769,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6764,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6770,
                        "src": "3778:13:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6763,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3778:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6766,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "creditLimitMantissa",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6770,
                        "src": "3797:27:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 6765,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "3797:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6768,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "creditRateMantissa",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6770,
                        "src": "3830:26:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 6767,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "3830:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3772:88:39"
                  },
                  "src": "3753:108:39"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 6771,
                    "nodeType": "StructuredDocumentation",
                    "src": "3865:53:39",
                    "text": "@dev Event emitted when the Prize Strategy is set"
                  },
                  "id": 6775,
                  "name": "PrizeStrategySet",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 6774,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6773,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "prizeStrategy",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6775,
                        "src": "3949:29:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6772,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3949:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3943:39:39"
                  },
                  "src": "3921:62:39"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 6776,
                    "nodeType": "StructuredDocumentation",
                    "src": "3987:38:39",
                    "text": "@dev Emitted when credit is minted"
                  },
                  "id": 6784,
                  "name": "CreditMinted",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 6783,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6778,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6784,
                        "src": "4052:20:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6777,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4052:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6780,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6784,
                        "src": "4078:21:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6779,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4078:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6782,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6784,
                        "src": "4105:14:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6781,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4105:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4046:77:39"
                  },
                  "src": "4028:96:39"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 6785,
                    "nodeType": "StructuredDocumentation",
                    "src": "4128:38:39",
                    "text": "@dev Emitted when credit is burned"
                  },
                  "id": 6793,
                  "name": "CreditBurned",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 6792,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6787,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6793,
                        "src": "4193:20:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6786,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4193:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6789,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6793,
                        "src": "4219:21:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6788,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4219:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6791,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6793,
                        "src": "4246:14:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6790,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4246:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4187:77:39"
                  },
                  "src": "4169:96:39"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 6794,
                    "nodeType": "StructuredDocumentation",
                    "src": "4269:75:39",
                    "text": "@dev Emitted when there was an error thrown awarding an External ERC721"
                  },
                  "id": 6798,
                  "name": "ErrorAwardingExternalERC721",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 6797,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6796,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "error",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6798,
                        "src": "4381:11:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 6795,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "4381:5:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4380:13:39"
                  },
                  "src": "4347:47:39"
                },
                {
                  "canonicalName": "PrizePool.CreditPlan",
                  "id": 6803,
                  "members": [
                    {
                      "constant": false,
                      "id": 6800,
                      "mutability": "mutable",
                      "name": "creditLimitMantissa",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 6803,
                      "src": "4423:27:39",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint128",
                        "typeString": "uint128"
                      },
                      "typeName": {
                        "id": 6799,
                        "name": "uint128",
                        "nodeType": "ElementaryTypeName",
                        "src": "4423:7:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 6802,
                      "mutability": "mutable",
                      "name": "creditRateMantissa",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 6803,
                      "src": "4456:26:39",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint128",
                        "typeString": "uint128"
                      },
                      "typeName": {
                        "id": 6801,
                        "name": "uint128",
                        "nodeType": "ElementaryTypeName",
                        "src": "4456:7:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "CreditPlan",
                  "nodeType": "StructDefinition",
                  "scope": 8751,
                  "src": "4399:88:39",
                  "visibility": "public"
                },
                {
                  "canonicalName": "PrizePool.CreditBalance",
                  "id": 6810,
                  "members": [
                    {
                      "constant": false,
                      "id": 6805,
                      "mutability": "mutable",
                      "name": "balance",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 6810,
                      "src": "4518:15:39",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint192",
                        "typeString": "uint192"
                      },
                      "typeName": {
                        "id": 6804,
                        "name": "uint192",
                        "nodeType": "ElementaryTypeName",
                        "src": "4518:7:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint192",
                          "typeString": "uint192"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 6807,
                      "mutability": "mutable",
                      "name": "timestamp",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 6810,
                      "src": "4539:16:39",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      },
                      "typeName": {
                        "id": 6806,
                        "name": "uint32",
                        "nodeType": "ElementaryTypeName",
                        "src": "4539:6:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 6809,
                      "mutability": "mutable",
                      "name": "initialized",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 6810,
                      "src": "4561:16:39",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 6808,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "4561:4:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "CreditBalance",
                  "nodeType": "StructDefinition",
                  "scope": 8751,
                  "src": "4491:91:39",
                  "visibility": "public"
                },
                {
                  "constant": true,
                  "documentation": {
                    "id": 6811,
                    "nodeType": "StructuredDocumentation",
                    "src": "4586:26:39",
                    "text": "@notice Semver Version"
                  },
                  "functionSelector": "ffa1ad74",
                  "id": 6814,
                  "mutability": "constant",
                  "name": "VERSION",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 8751,
                  "src": "4615:40:39",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 6812,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "4615:6:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "332e342e35",
                    "id": 6813,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "string",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "4648:7:39",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_stringliteral_59e19615ccbd44681a647c94186a0d0ab8573dc3d1cf1c3da845ed8f0142be18",
                      "typeString": "literal_string \"3.4.5\""
                    },
                    "value": "3.4.5"
                  },
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 6815,
                    "nodeType": "StructuredDocumentation",
                    "src": "4660:47:39",
                    "text": "@dev Reserve to which reserve fees are sent"
                  },
                  "functionSelector": "8e71c1f6",
                  "id": 6817,
                  "mutability": "mutable",
                  "name": "reserveRegistry",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 8751,
                  "src": "4710:40:39",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                    "typeString": "contract RegistryInterface"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 6816,
                    "name": "RegistryInterface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 12458,
                    "src": "4710:17:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                      "typeString": "contract RegistryInterface"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 6818,
                    "nodeType": "StructuredDocumentation",
                    "src": "4755:46:39",
                    "text": "@dev An array of all the controlled tokens"
                  },
                  "id": 6821,
                  "mutability": "mutable",
                  "name": "_tokens",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 8751,
                  "src": "4804:43:39",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_storage",
                    "typeString": "contract ControlledTokenInterface[]"
                  },
                  "typeName": {
                    "baseType": {
                      "contractScope": null,
                      "id": 6819,
                      "name": "ControlledTokenInterface",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 15850,
                      "src": "4804:24:39",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                        "typeString": "contract ControlledTokenInterface"
                      }
                    },
                    "id": 6820,
                    "length": null,
                    "nodeType": "ArrayTypeName",
                    "src": "4804:26:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_storage_ptr",
                      "typeString": "contract ControlledTokenInterface[]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 6822,
                    "nodeType": "StructuredDocumentation",
                    "src": "4852:61:39",
                    "text": "@dev The Prize Strategy that this Prize Pool is bound to."
                  },
                  "functionSelector": "98bf3eb6",
                  "id": 6824,
                  "mutability": "mutable",
                  "name": "prizeStrategy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 8751,
                  "src": "4916:43:39",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                    "typeString": "contract TokenListenerInterface"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 6823,
                    "name": "TokenListenerInterface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 16265,
                    "src": "4916:22:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                      "typeString": "contract TokenListenerInterface"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 6825,
                    "nodeType": "StructuredDocumentation",
                    "src": "4964:205:39",
                    "text": "@dev The maximum possible exit fee fraction as a fixed point 18 number.\n For example, if the maxExitFeeMantissa is \"0.1 ether\", then the maximum exit fee for a withdrawal of 100 Dai will be 10 Dai"
                  },
                  "functionSelector": "9e167519",
                  "id": 6827,
                  "mutability": "mutable",
                  "name": "maxExitFeeMantissa",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 8751,
                  "src": "5172:33:39",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6826,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5172:7:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 6828,
                    "nodeType": "StructuredDocumentation",
                    "src": "5210:64:39",
                    "text": "@dev The total funds that have been allocated to the reserve"
                  },
                  "functionSelector": "edb4e1cf",
                  "id": 6830,
                  "mutability": "mutable",
                  "name": "reserveTotalSupply",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 8751,
                  "src": "5277:33:39",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6829,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5277:7:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 6831,
                    "nodeType": "StructuredDocumentation",
                    "src": "5315:64:39",
                    "text": "@dev The total amount of funds that the prize pool can hold."
                  },
                  "functionSelector": "76687d3d",
                  "id": 6833,
                  "mutability": "mutable",
                  "name": "liquidityCap",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 8751,
                  "src": "5382:27:39",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6832,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5382:7:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 6834,
                    "nodeType": "StructuredDocumentation",
                    "src": "5414:34:39",
                    "text": "@dev the The awardable balance"
                  },
                  "id": 6836,
                  "mutability": "mutable",
                  "name": "_currentAwardBalance",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 8751,
                  "src": "5451:37:39",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 6835,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5451:7:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 6837,
                    "nodeType": "StructuredDocumentation",
                    "src": "5493:47:39",
                    "text": "@dev Stores the credit plan for each token."
                  },
                  "id": 6841,
                  "mutability": "mutable",
                  "name": "_tokenCreditPlans",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 8751,
                  "src": "5543:57:39",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_struct$_CreditPlan_$6803_storage_$",
                    "typeString": "mapping(address => struct PrizePool.CreditPlan)"
                  },
                  "typeName": {
                    "id": 6840,
                    "keyType": {
                      "id": 6838,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "5551:7:39",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "5543:30:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_struct$_CreditPlan_$6803_storage_$",
                      "typeString": "mapping(address => struct PrizePool.CreditPlan)"
                    },
                    "valueType": {
                      "contractScope": null,
                      "id": 6839,
                      "name": "CreditPlan",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 6803,
                      "src": "5562:10:39",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_CreditPlan_$6803_storage_ptr",
                        "typeString": "struct PrizePool.CreditPlan"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 6842,
                    "nodeType": "StructuredDocumentation",
                    "src": "5605:55:39",
                    "text": "@dev Stores each users balance of credit per token."
                  },
                  "id": 6848,
                  "mutability": "mutable",
                  "name": "_tokenCreditBalances",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 8751,
                  "src": "5663:83:39",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_CreditBalance_$6810_storage_$_$",
                    "typeString": "mapping(address => mapping(address => struct PrizePool.CreditBalance))"
                  },
                  "typeName": {
                    "id": 6847,
                    "keyType": {
                      "id": 6843,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "5671:7:39",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "5663:53:39",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_CreditBalance_$6810_storage_$_$",
                      "typeString": "mapping(address => mapping(address => struct PrizePool.CreditBalance))"
                    },
                    "valueType": {
                      "id": 6846,
                      "keyType": {
                        "id": 6844,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "5690:7:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "nodeType": "Mapping",
                      "src": "5682:33:39",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_CreditBalance_$6810_storage_$",
                        "typeString": "mapping(address => struct PrizePool.CreditBalance)"
                      },
                      "valueType": {
                        "contractScope": null,
                        "id": 6845,
                        "name": "CreditBalance",
                        "nodeType": "UserDefinedTypeName",
                        "referencedDeclaration": 6810,
                        "src": "5701:13:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CreditBalance_$6810_storage_ptr",
                          "typeString": "struct PrizePool.CreditBalance"
                        }
                      }
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 6940,
                    "nodeType": "Block",
                    "src": "6132:676:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 6870,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 6864,
                                    "name": "_reserveRegistry",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 6851,
                                    "src": "6154:16:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                                      "typeString": "contract RegistryInterface"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                                      "typeString": "contract RegistryInterface"
                                    }
                                  ],
                                  "id": 6863,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "6146:7:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 6862,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "6146:7:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 6865,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "6146:25:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 6868,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "6183:1:39",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 6867,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "6175:7:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 6866,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "6175:7:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 6869,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "6175:10:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "6146:39:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5072697a65506f6f6c2f7265736572766552656769737472792d6e6f742d7a65726f",
                              "id": 6871,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "6187:36:39",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_50c598360c54392251f46c300830b0f17eb9a8b58b490ce16e24ec1934652a5a",
                                "typeString": "literal_string \"PrizePool/reserveRegistry-not-zero\""
                              },
                              "value": "PrizePool/reserveRegistry-not-zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_50c598360c54392251f46c300830b0f17eb9a8b58b490ce16e24ec1934652a5a",
                                "typeString": "literal_string \"PrizePool/reserveRegistry-not-zero\""
                              }
                            ],
                            "id": 6861,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "6138:7:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 6872,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6138:86:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6873,
                        "nodeType": "ExpressionStatement",
                        "src": "6138:86:39"
                      },
                      {
                        "assignments": [
                          6875
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 6875,
                            "mutability": "mutable",
                            "name": "controlledTokensLength",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 6940,
                            "src": "6230:30:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 6874,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "6230:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 6878,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 6876,
                            "name": "_controlledTokens",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6854,
                            "src": "6263:17:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                              "typeString": "contract ControlledTokenInterface[] memory"
                            }
                          },
                          "id": 6877,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "6263:24:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "6230:57:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 6885,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 6879,
                            "name": "_tokens",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6821,
                            "src": "6293:7:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_storage",
                              "typeString": "contract ControlledTokenInterface[] storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 6883,
                                "name": "controlledTokensLength",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6875,
                                "src": "6334:22:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 6882,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "6303:30:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr_$",
                                "typeString": "function (uint256) pure returns (contract ControlledTokenInterface[] memory)"
                              },
                              "typeName": {
                                "baseType": {
                                  "contractScope": null,
                                  "id": 6880,
                                  "name": "ControlledTokenInterface",
                                  "nodeType": "UserDefinedTypeName",
                                  "referencedDeclaration": 15850,
                                  "src": "6307:24:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                    "typeString": "contract ControlledTokenInterface"
                                  }
                                },
                                "id": 6881,
                                "length": null,
                                "nodeType": "ArrayTypeName",
                                "src": "6307:26:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_storage_ptr",
                                  "typeString": "contract ControlledTokenInterface[]"
                                }
                              }
                            },
                            "id": 6884,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "6303:54:39",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                              "typeString": "contract ControlledTokenInterface[] memory"
                            }
                          },
                          "src": "6293:64:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_storage",
                            "typeString": "contract ControlledTokenInterface[] storage ref"
                          }
                        },
                        "id": 6886,
                        "nodeType": "ExpressionStatement",
                        "src": "6293:64:39"
                      },
                      {
                        "body": {
                          "id": 6908,
                          "nodeType": "Block",
                          "src": "6417:125:39",
                          "statements": [
                            {
                              "assignments": [
                                6898
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 6898,
                                  "mutability": "mutable",
                                  "name": "controlledToken",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 6908,
                                  "src": "6425:40:39",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                    "typeString": "contract ControlledTokenInterface"
                                  },
                                  "typeName": {
                                    "contractScope": null,
                                    "id": 6897,
                                    "name": "ControlledTokenInterface",
                                    "nodeType": "UserDefinedTypeName",
                                    "referencedDeclaration": 15850,
                                    "src": "6425:24:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                      "typeString": "contract ControlledTokenInterface"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 6902,
                              "initialValue": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 6899,
                                  "name": "_controlledTokens",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 6854,
                                  "src": "6468:17:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                                    "typeString": "contract ControlledTokenInterface[] memory"
                                  }
                                },
                                "id": 6901,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 6900,
                                  "name": "i",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 6888,
                                  "src": "6486:1:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "6468:20:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                  "typeString": "contract ControlledTokenInterface"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "6425:63:39"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 6904,
                                    "name": "controlledToken",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 6898,
                                    "src": "6516:15:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                      "typeString": "contract ControlledTokenInterface"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 6905,
                                    "name": "i",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 6888,
                                    "src": "6533:1:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                      "typeString": "contract ControlledTokenInterface"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 6903,
                                  "name": "_addControlledToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 8384,
                                  "src": "6496:19:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_ControlledTokenInterface_$15850_$_t_uint256_$returns$__$",
                                    "typeString": "function (contract ControlledTokenInterface,uint256)"
                                  }
                                },
                                "id": 6906,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "6496:39:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 6907,
                              "nodeType": "ExpressionStatement",
                              "src": "6496:39:39"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 6893,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 6891,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6888,
                            "src": "6384:1:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 6892,
                            "name": "controlledTokensLength",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6875,
                            "src": "6388:22:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "6384:26:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 6909,
                        "initializationExpression": {
                          "assignments": [
                            6888
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 6888,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 6909,
                              "src": "6369:9:39",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 6887,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "6369:7:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 6890,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 6889,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "6381:1:39",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "6369:13:39"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 6895,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "6412:3:39",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 6894,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6888,
                              "src": "6412:1:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 6896,
                          "nodeType": "ExpressionStatement",
                          "src": "6412:3:39"
                        },
                        "nodeType": "ForStatement",
                        "src": "6364:178:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 6910,
                            "name": "__Ownable_init",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 29,
                            "src": "6547:14:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 6911,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6547:16:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6912,
                        "nodeType": "ExpressionStatement",
                        "src": "6547:16:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 6913,
                            "name": "__ReentrancyGuard_init",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4752,
                            "src": "6569:22:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 6914,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6569:24:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6915,
                        "nodeType": "ExpressionStatement",
                        "src": "6569:24:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 6920,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "UnaryOperation",
                                  "operator": "-",
                                  "prefix": true,
                                  "src": "6624:2:39",
                                  "subExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "31",
                                    "id": 6919,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "6625:1:39",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_1_by_1",
                                      "typeString": "int_const 1"
                                    },
                                    "value": "1"
                                  },
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_minus_1_by_1",
                                    "typeString": "int_const -1"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_minus_1_by_1",
                                    "typeString": "int_const -1"
                                  }
                                ],
                                "id": 6918,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "6616:7:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_uint256_$",
                                  "typeString": "type(uint256)"
                                },
                                "typeName": {
                                  "id": 6917,
                                  "name": "uint256",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "6616:7:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 6921,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6616:11:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 6916,
                            "name": "_setLiquidityCap",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8356,
                            "src": "6599:16:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 6922,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6599:29:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6923,
                        "nodeType": "ExpressionStatement",
                        "src": "6599:29:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 6926,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 6924,
                            "name": "reserveRegistry",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6817,
                            "src": "6635:15:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                              "typeString": "contract RegistryInterface"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 6925,
                            "name": "_reserveRegistry",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6851,
                            "src": "6653:16:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                              "typeString": "contract RegistryInterface"
                            }
                          },
                          "src": "6635:34:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                            "typeString": "contract RegistryInterface"
                          }
                        },
                        "id": 6927,
                        "nodeType": "ExpressionStatement",
                        "src": "6635:34:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 6930,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 6928,
                            "name": "maxExitFeeMantissa",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6827,
                            "src": "6675:18:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 6929,
                            "name": "_maxExitFeeMantissa",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6856,
                            "src": "6696:19:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "6675:40:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 6931,
                        "nodeType": "ExpressionStatement",
                        "src": "6675:40:39"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 6935,
                                  "name": "_reserveRegistry",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 6851,
                                  "src": "6754:16:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                                    "typeString": "contract RegistryInterface"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                                    "typeString": "contract RegistryInterface"
                                  }
                                ],
                                "id": 6934,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "6746:7:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 6933,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "6746:7:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 6936,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6746:25:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 6937,
                              "name": "maxExitFeeMantissa",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6827,
                              "src": "6779:18:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 6932,
                            "name": "Initialized",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6671,
                            "src": "6727:11:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 6938,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6727:76:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 6939,
                        "nodeType": "EmitStatement",
                        "src": "6722:81:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 6849,
                    "nodeType": "StructuredDocumentation",
                    "src": "5751:194:39",
                    "text": "@notice Initializes the Prize Pool\n @param _controlledTokens Array of ControlledTokens that are controlled by this Prize Pool.\n @param _maxExitFeeMantissa The maximum exit fee size"
                  },
                  "functionSelector": "3ede50c6",
                  "id": 6941,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 6859,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 6858,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "6118:11:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "6118:11:39"
                    }
                  ],
                  "name": "initialize",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 6857,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6851,
                        "mutability": "mutable",
                        "name": "_reserveRegistry",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6941,
                        "src": "5974:34:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                          "typeString": "contract RegistryInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 6850,
                          "name": "RegistryInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 12458,
                          "src": "5974:17:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                            "typeString": "contract RegistryInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6854,
                        "mutability": "mutable",
                        "name": "_controlledTokens",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6941,
                        "src": "6014:51:39",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                          "typeString": "contract ControlledTokenInterface[]"
                        },
                        "typeName": {
                          "baseType": {
                            "contractScope": null,
                            "id": 6852,
                            "name": "ControlledTokenInterface",
                            "nodeType": "UserDefinedTypeName",
                            "referencedDeclaration": 15850,
                            "src": "6014:24:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                              "typeString": "contract ControlledTokenInterface"
                            }
                          },
                          "id": 6853,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "6014:26:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_storage_ptr",
                            "typeString": "contract ControlledTokenInterface[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6856,
                        "mutability": "mutable",
                        "name": "_maxExitFeeMantissa",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6941,
                        "src": "6071:27:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6855,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6071:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5968:134:39"
                  },
                  "returnParameters": {
                    "id": 6860,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6132:0:39"
                  },
                  "scope": 8751,
                  "src": "5948:860:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    8916
                  ],
                  "body": {
                    "id": 6954,
                    "nodeType": "Block",
                    "src": "6970:35:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 6950,
                                "name": "_token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8661,
                                "src": "6991:6:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IERC20Upgradeable_$1960_$",
                                  "typeString": "function () view returns (contract IERC20Upgradeable)"
                                }
                              },
                              "id": 6951,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6991:8:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            ],
                            "id": 6949,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "6983:7:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 6948,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "6983:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 6952,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6983:17:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "functionReturnParameters": 6947,
                        "id": 6953,
                        "nodeType": "Return",
                        "src": "6976:24:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 6942,
                    "nodeType": "StructuredDocumentation",
                    "src": "6812:97:39",
                    "text": "@dev Returns the address of the underlying ERC20 asset\n @return The address of the asset"
                  },
                  "functionSelector": "fc0c546a",
                  "id": 6955,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "token",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 6944,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "6938:8:39"
                  },
                  "parameters": {
                    "id": 6943,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6926:2:39"
                  },
                  "returnParameters": {
                    "id": 6947,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6946,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6955,
                        "src": "6961:7:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6945,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6961:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6960:9:39"
                  },
                  "scope": 8751,
                  "src": "6912:93:39",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 6964,
                    "nodeType": "Block",
                    "src": "7208:28:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 6961,
                            "name": "_balance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8667,
                            "src": "7221:8:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_uint256_$",
                              "typeString": "function () returns (uint256)"
                            }
                          },
                          "id": 6962,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7221:10:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 6960,
                        "id": 6963,
                        "nodeType": "Return",
                        "src": "7214:17:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 6956,
                    "nodeType": "StructuredDocumentation",
                    "src": "7009:150:39",
                    "text": "@dev Returns the total underlying balance of all assets. This includes both principal and interest.\n @return The underlying balance of assets"
                  },
                  "functionSelector": "b69ef8a8",
                  "id": 6965,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "balance",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 6957,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "7178:2:39"
                  },
                  "returnParameters": {
                    "id": 6960,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6959,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6965,
                        "src": "7199:7:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6958,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7199:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7198:9:39"
                  },
                  "scope": 8751,
                  "src": "7162:74:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 6977,
                    "nodeType": "Block",
                    "src": "7544:51:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 6974,
                              "name": "_externalToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6968,
                              "src": "7575:14:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 6973,
                            "name": "_canAwardExternal",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8655,
                            "src": "7557:17:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                              "typeString": "function (address) view returns (bool)"
                            }
                          },
                          "id": 6975,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7557:33:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 6972,
                        "id": 6976,
                        "nodeType": "Return",
                        "src": "7550:40:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 6966,
                    "nodeType": "StructuredDocumentation",
                    "src": "7240:222:39",
                    "text": "@dev Checks with the Prize Pool if a specific token type may be awarded as an external prize\n @param _externalToken The address of the token to check\n @return True if the token may be awarded, false otherwise"
                  },
                  "functionSelector": "6a3fd4f9",
                  "id": 6978,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "canAwardExternal",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 6969,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6968,
                        "mutability": "mutable",
                        "name": "_externalToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6978,
                        "src": "7491:22:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6967,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7491:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7490:24:39"
                  },
                  "returnParameters": {
                    "id": 6972,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6971,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 6978,
                        "src": "7538:4:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 6970,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "7538:4:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7537:6:39"
                  },
                  "scope": 8751,
                  "src": "7465:130:39",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    8768
                  ],
                  "body": {
                    "id": 7034,
                    "nodeType": "Block",
                    "src": "8137:249:39",
                    "statements": [
                      {
                        "assignments": [
                          7000
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 7000,
                            "mutability": "mutable",
                            "name": "operator",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 7034,
                            "src": "8143:16:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 6999,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "8143:7:39",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 7003,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 7001,
                            "name": "_msgSender",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 3611,
                            "src": "8162:10:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                              "typeString": "function () view returns (address payable)"
                            }
                          },
                          "id": 7002,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8162:12:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "8143:31:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7005,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6981,
                              "src": "8187:2:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7006,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6983,
                              "src": "8191:6:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7007,
                              "name": "controlledToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6985,
                              "src": "8199:15:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7008,
                              "name": "referrer",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6987,
                              "src": "8216:8:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 7004,
                            "name": "_mint",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7621,
                            "src": "8181:5:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_address_$_t_address_$returns$__$",
                              "typeString": "function (address,uint256,address,address)"
                            }
                          },
                          "id": 7009,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8181:44:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 7010,
                        "nodeType": "ExpressionStatement",
                        "src": "8181:44:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7014,
                              "name": "operator",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7000,
                              "src": "8258:8:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 7017,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "8276:4:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_PrizePool_$8751",
                                    "typeString": "contract PrizePool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_PrizePool_$8751",
                                    "typeString": "contract PrizePool"
                                  }
                                ],
                                "id": 7016,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "8268:7:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 7015,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "8268:7:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 7018,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "8268:13:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7019,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6983,
                              "src": "8283:6:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 7011,
                                "name": "_token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8661,
                                "src": "8232:6:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IERC20Upgradeable_$1960_$",
                                  "typeString": "function () view returns (contract IERC20Upgradeable)"
                                }
                              },
                              "id": 7012,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "8232:8:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            "id": 7013,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "safeTransferFrom",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 2019,
                            "src": "8232:25:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20Upgradeable_$1960_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20Upgradeable_$1960_$",
                              "typeString": "function (contract IERC20Upgradeable,address,address,uint256)"
                            }
                          },
                          "id": 7020,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8232:58:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 7021,
                        "nodeType": "ExpressionStatement",
                        "src": "8232:58:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7023,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6983,
                              "src": "8304:6:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 7022,
                            "name": "_supply",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8673,
                            "src": "8296:7:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 7024,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8296:15:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 7025,
                        "nodeType": "ExpressionStatement",
                        "src": "8296:15:39"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7027,
                              "name": "operator",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7000,
                              "src": "8333:8:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7028,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6981,
                              "src": "8343:2:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7029,
                              "name": "controlledToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6985,
                              "src": "8347:15:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7030,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6983,
                              "src": "8364:6:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7031,
                              "name": "referrer",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6987,
                              "src": "8372:8:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 7026,
                            "name": "Deposited",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6698,
                            "src": "8323:9:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_address_$returns$__$",
                              "typeString": "function (address,address,address,uint256,address)"
                            }
                          },
                          "id": 7032,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8323:58:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 7033,
                        "nodeType": "EmitStatement",
                        "src": "8318:63:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 6979,
                    "nodeType": "StructuredDocumentation",
                    "src": "7599:315:39",
                    "text": "@notice Deposit assets into the Prize Pool in exchange for tokens\n @param to The address receiving the newly minted tokens\n @param amount The amount of assets to deposit\n @param controlledToken The address of the type of token the user is minting\n @param referrer The referrer of the deposit"
                  },
                  "functionSelector": "e323f825",
                  "id": 7035,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 6991,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 6990,
                        "name": "nonReentrant",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4782,
                        "src": "8053:12:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "8053:12:39"
                    },
                    {
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 6993,
                          "name": "controlledToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 6985,
                          "src": "8090:15:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "id": 6994,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 6992,
                        "name": "onlyControlledToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 8697,
                        "src": "8070:19:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$_t_address_$",
                          "typeString": "modifier (address)"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "8070:36:39"
                    },
                    {
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 6996,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 6983,
                          "src": "8127:6:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "id": 6997,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 6995,
                        "name": "canAddLiquidity",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 8727,
                        "src": "8111:15:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$_t_uint256_$",
                          "typeString": "modifier (uint256)"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "8111:23:39"
                    }
                  ],
                  "name": "depositTo",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 6989,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "8040:8:39"
                  },
                  "parameters": {
                    "id": 6988,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 6981,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7035,
                        "src": "7941:10:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6980,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7941:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6983,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7035,
                        "src": "7957:14:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 6982,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7957:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6985,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7035,
                        "src": "7977:23:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6984,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7977:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 6987,
                        "mutability": "mutable",
                        "name": "referrer",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7035,
                        "src": "8006:16:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 6986,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8006:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7935:91:39"
                  },
                  "returnParameters": {
                    "id": 6998,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "8137:0:39"
                  },
                  "scope": 8751,
                  "src": "7917:469:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    8782
                  ],
                  "body": {
                    "id": 7120,
                    "nodeType": "Block",
                    "src": "9124:687:39",
                    "statements": [
                      {
                        "assignments": [
                          7056,
                          7058
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 7056,
                            "mutability": "mutable",
                            "name": "exitFee",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 7120,
                            "src": "9131:15:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 7055,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "9131:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 7058,
                            "mutability": "mutable",
                            "name": "burnedCredit",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 7120,
                            "src": "9148:20:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 7057,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "9148:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 7064,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7060,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7038,
                              "src": "9211:4:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7061,
                              "name": "controlledToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7042,
                              "src": "9217:15:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7062,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7040,
                              "src": "9234:6:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 7059,
                            "name": "_calculateEarlyExitFeeLessBurnedCredit",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8328,
                            "src": "9172:38:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_uint256_$_t_uint256_$",
                              "typeString": "function (address,address,uint256) returns (uint256,uint256)"
                            }
                          },
                          "id": 7063,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9172:69:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                            "typeString": "tuple(uint256,uint256)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "9130:111:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 7068,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 7066,
                                "name": "exitFee",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 7056,
                                "src": "9255:7:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 7067,
                                "name": "maximumExitFee",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 7044,
                                "src": "9266:14:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "9255:25:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5072697a65506f6f6c2f657869742d6665652d657863656564732d757365722d6d6178696d756d",
                              "id": 7069,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "9282:41:39",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_b1cbcac2508c9f1bd42b79ab3468cd6283bf44e8ee22399cbff7f2f054d07889",
                                "typeString": "literal_string \"PrizePool/exit-fee-exceeds-user-maximum\""
                              },
                              "value": "PrizePool/exit-fee-exceeds-user-maximum"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_b1cbcac2508c9f1bd42b79ab3468cd6283bf44e8ee22399cbff7f2f054d07889",
                                "typeString": "literal_string \"PrizePool/exit-fee-exceeds-user-maximum\""
                              }
                            ],
                            "id": 7065,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "9247:7:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 7070,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9247:77:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 7071,
                        "nodeType": "ExpressionStatement",
                        "src": "9247:77:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7073,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7038,
                              "src": "9366:4:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7074,
                              "name": "controlledToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7042,
                              "src": "9372:15:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7075,
                              "name": "burnedCredit",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7058,
                              "src": "9389:12:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 7072,
                            "name": "_burnCredit",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7893,
                            "src": "9354:11:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 7076,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9354:48:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 7077,
                        "nodeType": "ExpressionStatement",
                        "src": "9354:48:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 7082,
                                "name": "_msgSender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3611,
                                "src": "9485:10:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                  "typeString": "function () view returns (address payable)"
                                }
                              },
                              "id": 7083,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "9485:12:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7084,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7038,
                              "src": "9499:4:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7085,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7040,
                              "src": "9505:6:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 7079,
                                  "name": "controlledToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7042,
                                  "src": "9449:15:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 7078,
                                "name": "ControlledToken",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 15810,
                                "src": "9433:15:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_contract$_ControlledToken_$15810_$",
                                  "typeString": "type(contract ControlledToken)"
                                }
                              },
                              "id": 7080,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "9433:32:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ControlledToken_$15810",
                                "typeString": "contract ControlledToken"
                              }
                            },
                            "id": 7081,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "controllerBurnFrom",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 15773,
                            "src": "9433:51:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256) external"
                            }
                          },
                          "id": 7086,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9433:79:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 7087,
                        "nodeType": "ExpressionStatement",
                        "src": "9433:79:39"
                      },
                      {
                        "assignments": [
                          7089
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 7089,
                            "mutability": "mutable",
                            "name": "amountLessFee",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 7120,
                            "src": "9558:21:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 7088,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "9558:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 7094,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7092,
                              "name": "exitFee",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7056,
                              "src": "9593:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 7090,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7040,
                              "src": "9582:6:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 7091,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sub",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1135,
                            "src": "9582:10:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 7093,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9582:19:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "9558:43:39"
                      },
                      {
                        "assignments": [
                          7096
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 7096,
                            "mutability": "mutable",
                            "name": "redeemed",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 7120,
                            "src": "9607:16:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 7095,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "9607:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 7100,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7098,
                              "name": "amountLessFee",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7089,
                              "src": "9634:13:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 7097,
                            "name": "_redeem",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8681,
                            "src": "9626:7:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256) returns (uint256)"
                            }
                          },
                          "id": 7099,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9626:22:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "9607:41:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7104,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7038,
                              "src": "9677:4:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7105,
                              "name": "redeemed",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7096,
                              "src": "9683:8:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 7101,
                                "name": "_token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8661,
                                "src": "9655:6:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IERC20Upgradeable_$1960_$",
                                  "typeString": "function () view returns (contract IERC20Upgradeable)"
                                }
                              },
                              "id": 7102,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "9655:8:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            "id": 7103,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "safeTransfer",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1994,
                            "src": "9655:21:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20Upgradeable_$1960_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20Upgradeable_$1960_$",
                              "typeString": "function (contract IERC20Upgradeable,address,uint256)"
                            }
                          },
                          "id": 7106,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9655:37:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 7107,
                        "nodeType": "ExpressionStatement",
                        "src": "9655:37:39"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 7109,
                                "name": "_msgSender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3611,
                                "src": "9722:10:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                  "typeString": "function () view returns (address payable)"
                                }
                              },
                              "id": 7110,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "9722:12:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7111,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7038,
                              "src": "9736:4:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7112,
                              "name": "controlledToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7042,
                              "src": "9742:15:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7113,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7040,
                              "src": "9759:6:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7114,
                              "name": "redeemed",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7096,
                              "src": "9767:8:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7115,
                              "name": "exitFee",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7056,
                              "src": "9777:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 7108,
                            "name": "InstantWithdrawal",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6750,
                            "src": "9704:17:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,address,uint256,uint256,uint256)"
                            }
                          },
                          "id": 7116,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9704:81:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 7117,
                        "nodeType": "EmitStatement",
                        "src": "9699:86:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 7118,
                          "name": "exitFee",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 7056,
                          "src": "9799:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 7054,
                        "id": 7119,
                        "nodeType": "Return",
                        "src": "9792:14:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 7036,
                    "nodeType": "StructuredDocumentation",
                    "src": "8390:497:39",
                    "text": "@notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\n @param from The address to redeem tokens from.\n @param amount The amount of tokens to redeem for assets.\n @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\n @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\n @return The actual exit fee paid"
                  },
                  "functionSelector": "a016240b",
                  "id": 7121,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 7048,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 7047,
                        "name": "nonReentrant",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4782,
                        "src": "9046:12:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "9046:12:39"
                    },
                    {
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 7050,
                          "name": "controlledToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 7042,
                          "src": "9083:15:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "id": 7051,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 7049,
                        "name": "onlyControlledToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 8697,
                        "src": "9063:19:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$_t_address_$",
                          "typeString": "modifier (address)"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "9063:36:39"
                    }
                  ],
                  "name": "withdrawInstantlyFrom",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 7046,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "9033:8:39"
                  },
                  "parameters": {
                    "id": 7045,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7038,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7121,
                        "src": "8926:12:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7037,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8926:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7040,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7121,
                        "src": "8944:14:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7039,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "8944:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7042,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7121,
                        "src": "8964:23:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7041,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8964:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7044,
                        "mutability": "mutable",
                        "name": "maximumExitFee",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7121,
                        "src": "8993:22:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7043,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "8993:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8920:99:39"
                  },
                  "returnParameters": {
                    "id": 7054,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7053,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7121,
                        "src": "9113:7:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7052,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "9113:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9112:9:39"
                  },
                  "scope": 8751,
                  "src": "8890:921:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 7150,
                    "nodeType": "Block",
                    "src": "10236:177:39",
                    "statements": [
                      {
                        "assignments": [
                          7132
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 7132,
                            "mutability": "mutable",
                            "name": "maxFee",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 7150,
                            "src": "10242:14:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 7131,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "10242:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 7138,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7135,
                              "name": "withdrawalAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7124,
                              "src": "10293:16:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7136,
                              "name": "maxExitFeeMantissa",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6827,
                              "src": "10311:18:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 7133,
                              "name": "FixedPoint",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5279,
                              "src": "10259:10:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_FixedPoint_$5279_$",
                                "typeString": "type(library FixedPoint)"
                              }
                            },
                            "id": 7134,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "multiplyUintByMantissa",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5251,
                            "src": "10259:33:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 7137,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10259:71:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "10242:88:39"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 7141,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 7139,
                            "name": "exitFee",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7126,
                            "src": "10340:7:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 7140,
                            "name": "maxFee",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7132,
                            "src": "10350:6:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "10340:16:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 7147,
                        "nodeType": "IfStatement",
                        "src": "10336:53:39",
                        "trueBody": {
                          "id": 7146,
                          "nodeType": "Block",
                          "src": "10358:31:39",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 7144,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 7142,
                                  "name": "exitFee",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7126,
                                  "src": "10366:7:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 7143,
                                  "name": "maxFee",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7132,
                                  "src": "10376:6:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "10366:16:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 7145,
                              "nodeType": "ExpressionStatement",
                              "src": "10366:16:39"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 7148,
                          "name": "exitFee",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 7126,
                          "src": "10401:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 7130,
                        "id": 7149,
                        "nodeType": "Return",
                        "src": "10394:14:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 7122,
                    "nodeType": "StructuredDocumentation",
                    "src": "9815:320:39",
                    "text": "@notice Limits the exit fee to the maximum as hard-coded into the contract\n @param withdrawalAmount The amount that is attempting to be withdrawn\n @param exitFee The exit fee to check against the limit\n @return The passed exit fee if it is less than the maximum, otherwise the maximum fee is returned."
                  },
                  "id": 7151,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_limitExitFee",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 7127,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7124,
                        "mutability": "mutable",
                        "name": "withdrawalAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7151,
                        "src": "10161:24:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7123,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "10161:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7126,
                        "mutability": "mutable",
                        "name": "exitFee",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7151,
                        "src": "10187:15:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7125,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "10187:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10160:43:39"
                  },
                  "returnParameters": {
                    "id": 7130,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7129,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7151,
                        "src": "10227:7:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7128,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "10227:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10226:9:39"
                  },
                  "scope": 8751,
                  "src": "10138:275:39",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    16205
                  ],
                  "body": {
                    "id": 7272,
                    "nodeType": "Block",
                    "src": "10844:897:39",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 7171,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 7166,
                            "name": "from",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7154,
                            "src": "10854:4:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 7169,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "10870:1:39",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                }
                              ],
                              "id": 7168,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "10862:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 7167,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "10862:7:39",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 7170,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "10862:10:39",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "src": "10854:18:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 7217,
                        "nodeType": "IfStatement",
                        "src": "10850:579:39",
                        "trueBody": {
                          "id": 7216,
                          "nodeType": "Block",
                          "src": "10874:555:39",
                          "statements": [
                            {
                              "assignments": [
                                7173
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 7173,
                                  "mutability": "mutable",
                                  "name": "fromBeforeBalance",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 7216,
                                  "src": "10882:25:39",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 7172,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "10882:7:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 7181,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 7179,
                                    "name": "from",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7154,
                                    "src": "10950:4:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 7175,
                                          "name": "msg",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": -15,
                                          "src": "10928:3:39",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_magic_message",
                                            "typeString": "msg"
                                          }
                                        },
                                        "id": 7176,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "sender",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": null,
                                        "src": "10928:10:39",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address_payable",
                                          "typeString": "address payable"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address_payable",
                                          "typeString": "address payable"
                                        }
                                      ],
                                      "id": 7174,
                                      "name": "IERC20Upgradeable",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1960,
                                      "src": "10910:17:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_contract$_IERC20Upgradeable_$1960_$",
                                        "typeString": "type(contract IERC20Upgradeable)"
                                      }
                                    },
                                    "id": 7177,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "10910:29:39",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                      "typeString": "contract IERC20Upgradeable"
                                    }
                                  },
                                  "id": 7178,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "balanceOf",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1899,
                                  "src": "10910:39:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                    "typeString": "function (address) view external returns (uint256)"
                                  }
                                },
                                "id": 7180,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "10910:45:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "10882:73:39"
                            },
                            {
                              "assignments": [
                                7183
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 7183,
                                  "mutability": "mutable",
                                  "name": "newCreditBalance",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 7216,
                                  "src": "11014:24:39",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 7182,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "11014:7:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 7191,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 7185,
                                    "name": "from",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7154,
                                    "src": "11065:4:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 7186,
                                      "name": "msg",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -15,
                                      "src": "11071:3:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_magic_message",
                                        "typeString": "msg"
                                      }
                                    },
                                    "id": 7187,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "sender",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": null,
                                    "src": "11071:10:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 7188,
                                    "name": "fromBeforeBalance",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7173,
                                    "src": "11083:17:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 7189,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "11102:1:39",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 7184,
                                  "name": "_calculateCreditBalance",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7980,
                                  "src": "11041:23:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                    "typeString": "function (address,address,uint256,uint256) view returns (uint256)"
                                  }
                                },
                                "id": 7190,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "11041:63:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "11014:90:39"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                "id": 7194,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 7192,
                                  "name": "from",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7154,
                                  "src": "11117:4:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "!=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 7193,
                                  "name": "to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7156,
                                  "src": "11125:2:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "src": "11117:10:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 7208,
                              "nodeType": "IfStatement",
                              "src": "11113:245:39",
                              "trueBody": {
                                "id": 7207,
                                "nodeType": "Block",
                                "src": "11129:229:39",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 7205,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "id": 7195,
                                        "name": "newCreditBalance",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 7183,
                                        "src": "11252:16:39",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 7197,
                                              "name": "msg",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": -15,
                                              "src": "11289:3:39",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_magic_message",
                                                "typeString": "msg"
                                              }
                                            },
                                            "id": 7198,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "sender",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": null,
                                            "src": "11289:10:39",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address_payable",
                                              "typeString": "address payable"
                                            }
                                          },
                                          {
                                            "argumentTypes": null,
                                            "arguments": [
                                              {
                                                "argumentTypes": null,
                                                "id": 7201,
                                                "name": "amount",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 7158,
                                                "src": "11323:6:39",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": [
                                                {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": null,
                                                "id": 7199,
                                                "name": "fromBeforeBalance",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 7173,
                                                "src": "11301:17:39",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "id": 7200,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "memberName": "sub",
                                              "nodeType": "MemberAccess",
                                              "referencedDeclaration": 1135,
                                              "src": "11301:21:39",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                                              }
                                            },
                                            "id": 7202,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "11301:29:39",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          {
                                            "argumentTypes": null,
                                            "id": 7203,
                                            "name": "newCreditBalance",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 7183,
                                            "src": "11332:16:39",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_address_payable",
                                              "typeString": "address payable"
                                            },
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            },
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          ],
                                          "id": 7196,
                                          "name": "_applyCreditLimit",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 8079,
                                          "src": "11271:17:39",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                            "typeString": "function (address,uint256,uint256) view returns (uint256)"
                                          }
                                        },
                                        "id": 7204,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "11271:78:39",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "11252:97:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 7206,
                                    "nodeType": "ExpressionStatement",
                                    "src": "11252:97:39"
                                  }
                                ]
                              }
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 7210,
                                    "name": "from",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7154,
                                    "src": "11387:4:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 7211,
                                      "name": "msg",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -15,
                                      "src": "11393:3:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_magic_message",
                                        "typeString": "msg"
                                      }
                                    },
                                    "id": 7212,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "sender",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": null,
                                    "src": "11393:10:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 7213,
                                    "name": "newCreditBalance",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7183,
                                    "src": "11405:16:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 7209,
                                  "name": "_updateCreditBalance",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 8044,
                                  "src": "11366:20:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                                    "typeString": "function (address,address,uint256)"
                                  }
                                },
                                "id": 7214,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "11366:56:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 7215,
                              "nodeType": "ExpressionStatement",
                              "src": "11366:56:39"
                            }
                          ]
                        }
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 7227,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 7223,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 7218,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7156,
                              "src": "11438:2:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 7221,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "11452:1:39",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 7220,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "11444:7:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 7219,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "11444:7:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 7222,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "11444:10:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "src": "11438:16:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 7226,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 7224,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7156,
                              "src": "11458:2:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 7225,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7154,
                              "src": "11464:4:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "src": "11458:10:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "11438:30:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 7243,
                        "nodeType": "IfStatement",
                        "src": "11434:128:39",
                        "trueBody": {
                          "id": 7242,
                          "nodeType": "Block",
                          "src": "11470:92:39",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 7229,
                                    "name": "to",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7156,
                                    "src": "11492:2:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 7230,
                                      "name": "msg",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -15,
                                      "src": "11496:3:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_magic_message",
                                        "typeString": "msg"
                                      }
                                    },
                                    "id": 7231,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "sender",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": null,
                                    "src": "11496:10:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 7237,
                                        "name": "to",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 7156,
                                        "src": "11548:2:39",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 7233,
                                              "name": "msg",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": -15,
                                              "src": "11526:3:39",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_magic_message",
                                                "typeString": "msg"
                                              }
                                            },
                                            "id": 7234,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "sender",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": null,
                                            "src": "11526:10:39",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address_payable",
                                              "typeString": "address payable"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_address_payable",
                                              "typeString": "address payable"
                                            }
                                          ],
                                          "id": 7232,
                                          "name": "IERC20Upgradeable",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 1960,
                                          "src": "11508:17:39",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_type$_t_contract$_IERC20Upgradeable_$1960_$",
                                            "typeString": "type(contract IERC20Upgradeable)"
                                          }
                                        },
                                        "id": 7235,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "typeConversion",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "11508:29:39",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                          "typeString": "contract IERC20Upgradeable"
                                        }
                                      },
                                      "id": 7236,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "balanceOf",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 1899,
                                      "src": "11508:39:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                        "typeString": "function (address) view external returns (uint256)"
                                      }
                                    },
                                    "id": 7238,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "11508:43:39",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 7239,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "11553:1:39",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 7228,
                                  "name": "_accrueCredit",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7917,
                                  "src": "11478:13:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$",
                                    "typeString": "function (address,address,uint256,uint256)"
                                  }
                                },
                                "id": 7240,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "11478:77:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 7241,
                              "nodeType": "ExpressionStatement",
                              "src": "11478:77:39"
                            }
                          ]
                        }
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 7259,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 7249,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 7244,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7154,
                              "src": "11599:4:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 7247,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "11615:1:39",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 7246,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "11607:7:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 7245,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "11607:7:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 7248,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "11607:10:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "src": "11599:18:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 7258,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 7252,
                                  "name": "prizeStrategy",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 6824,
                                  "src": "11629:13:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                    "typeString": "contract TokenListenerInterface"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                    "typeString": "contract TokenListenerInterface"
                                  }
                                ],
                                "id": 7251,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "11621:7:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 7250,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "11621:7:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 7253,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "11621:22:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 7256,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "11655:1:39",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 7255,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "11647:7:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 7254,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "11647:7:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 7257,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "11647:10:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "src": "11621:36:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "11599:58:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 7271,
                        "nodeType": "IfStatement",
                        "src": "11595:142:39",
                        "trueBody": {
                          "id": 7270,
                          "nodeType": "Block",
                          "src": "11659:78:39",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 7263,
                                    "name": "from",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7154,
                                    "src": "11701:4:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 7264,
                                    "name": "to",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7156,
                                    "src": "11707:2:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 7265,
                                    "name": "amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7158,
                                    "src": "11711:6:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 7266,
                                      "name": "msg",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -15,
                                      "src": "11719:3:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_magic_message",
                                        "typeString": "msg"
                                      }
                                    },
                                    "id": 7267,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "sender",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": null,
                                    "src": "11719:10:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 7260,
                                    "name": "prizeStrategy",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 6824,
                                    "src": "11667:13:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                      "typeString": "contract TokenListenerInterface"
                                    }
                                  },
                                  "id": 7262,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "beforeTokenTransfer",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 16264,
                                  "src": "11667:33:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_address_$returns$__$",
                                    "typeString": "function (address,address,uint256,address) external"
                                  }
                                },
                                "id": 7268,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "11667:63:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 7269,
                              "nodeType": "ExpressionStatement",
                              "src": "11667:63:39"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 7152,
                    "nodeType": "StructuredDocumentation",
                    "src": "10417:303:39",
                    "text": "@notice Updates the Prize Strategy when tokens are transferred between holders.\n @param from The address the tokens are being transferred from (0 if minting)\n @param to The address the tokens are being transferred to (0 if burning)\n @param amount The amount of tokens being trasferred"
                  },
                  "functionSelector": "7cbab1c7",
                  "id": 7273,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 7162,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "10832:3:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 7163,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "10832:10:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        }
                      ],
                      "id": 7164,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 7161,
                        "name": "onlyControlledToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 8697,
                        "src": "10812:19:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$_t_address_$",
                          "typeString": "modifier (address)"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "10812:31:39"
                    }
                  ],
                  "name": "beforeTokenTransfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 7160,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "10803:8:39"
                  },
                  "parameters": {
                    "id": 7159,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7154,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7273,
                        "src": "10752:12:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7153,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "10752:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7156,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7273,
                        "src": "10766:10:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7155,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "10766:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7158,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7273,
                        "src": "10778:14:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7157,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "10778:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10751:42:39"
                  },
                  "returnParameters": {
                    "id": 7165,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "10844:0:39"
                  },
                  "scope": 8751,
                  "src": "10723:1018:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    8795
                  ],
                  "body": {
                    "id": 7282,
                    "nodeType": "Block",
                    "src": "12005:38:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 7280,
                          "name": "_currentAwardBalance",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 6836,
                          "src": "12018:20:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 7279,
                        "id": 7281,
                        "nodeType": "Return",
                        "src": "12011:27:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 7274,
                    "nodeType": "StructuredDocumentation",
                    "src": "11745:192:39",
                    "text": "@notice Returns the balance that is available to award.\n @dev captureAwardBalance() should be called first\n @return The total amount of assets to be awarded for the current prize"
                  },
                  "functionSelector": "630665b4",
                  "id": 7283,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "awardBalance",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 7276,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "11973:8:39"
                  },
                  "parameters": {
                    "id": 7275,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "11961:2:39"
                  },
                  "returnParameters": {
                    "id": 7279,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7278,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7283,
                        "src": "11996:7:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7277,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "11996:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11995:9:39"
                  },
                  "scope": 8751,
                  "src": "11940:103:39",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    8801
                  ],
                  "body": {
                    "id": 7375,
                    "nodeType": "Block",
                    "src": "12325:948:39",
                    "statements": [
                      {
                        "assignments": [
                          7293
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 7293,
                            "mutability": "mutable",
                            "name": "tokenTotalSupply",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 7375,
                            "src": "12331:24:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 7292,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "12331:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 7296,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 7294,
                            "name": "_tokenTotalSupply",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8570,
                            "src": "12358:17:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                              "typeString": "function () view returns (uint256)"
                            }
                          },
                          "id": 7295,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12358:19:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "12331:46:39"
                      },
                      {
                        "assignments": [
                          7298
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 7298,
                            "mutability": "mutable",
                            "name": "currentBalance",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 7375,
                            "src": "12495:22:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 7297,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "12495:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 7301,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 7299,
                            "name": "_balance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8667,
                            "src": "12520:8:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_uint256_$",
                              "typeString": "function () returns (uint256)"
                            }
                          },
                          "id": 7300,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12520:10:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "12495:35:39"
                      },
                      {
                        "assignments": [
                          7303
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 7303,
                            "mutability": "mutable",
                            "name": "totalInterest",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 7375,
                            "src": "12536:21:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 7302,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "12536:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 7314,
                        "initialValue": {
                          "argumentTypes": null,
                          "condition": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 7306,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 7304,
                                  "name": "currentBalance",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7298,
                                  "src": "12561:14:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": ">",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 7305,
                                  "name": "tokenTotalSupply",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7293,
                                  "src": "12578:16:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "12561:33:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              }
                            ],
                            "id": 7307,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "12560:35:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 7312,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "12637:1:39",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "id": 7313,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "Conditional",
                          "src": "12560:78:39",
                          "trueExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 7310,
                                "name": "tokenTotalSupply",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 7293,
                                "src": "12617:16:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 7308,
                                "name": "currentBalance",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 7298,
                                "src": "12598:14:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 7309,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1135,
                              "src": "12598:18:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 7311,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "12598:36:39",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "12536:102:39"
                      },
                      {
                        "assignments": [
                          7316
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 7316,
                            "mutability": "mutable",
                            "name": "unaccountedPrizeBalance",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 7375,
                            "src": "12644:31:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 7315,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "12644:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 7327,
                        "initialValue": {
                          "argumentTypes": null,
                          "condition": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 7319,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 7317,
                                  "name": "totalInterest",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7303,
                                  "src": "12679:13:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": ">",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 7318,
                                  "name": "_currentAwardBalance",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 6836,
                                  "src": "12695:20:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "12679:36:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              }
                            ],
                            "id": 7320,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "12678:38:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 7325,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "12761:1:39",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "id": 7326,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "Conditional",
                          "src": "12678:84:39",
                          "trueExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 7323,
                                "name": "_currentAwardBalance",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6836,
                                "src": "12737:20:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 7321,
                                "name": "totalInterest",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 7303,
                                "src": "12719:13:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 7322,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1135,
                              "src": "12719:17:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 7324,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "12719:39:39",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "12644:118:39"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 7330,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 7328,
                            "name": "unaccountedPrizeBalance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7316,
                            "src": "12773:23:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 7329,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "12799:1:39",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "12773:27:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 7372,
                        "nodeType": "IfStatement",
                        "src": "12769:466:39",
                        "trueBody": {
                          "id": 7371,
                          "nodeType": "Block",
                          "src": "12802:433:39",
                          "statements": [
                            {
                              "assignments": [
                                7332
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 7332,
                                  "mutability": "mutable",
                                  "name": "reserveFee",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 7371,
                                  "src": "12810:18:39",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 7331,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "12810:7:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 7336,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 7334,
                                    "name": "unaccountedPrizeBalance",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7316,
                                    "src": "12851:23:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 7333,
                                  "name": "calculateReserveFee",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7747,
                                  "src": "12831:19:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_uint256_$",
                                    "typeString": "function (uint256) view returns (uint256)"
                                  }
                                },
                                "id": 7335,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "12831:44:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "12810:65:39"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 7339,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 7337,
                                  "name": "reserveFee",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7332,
                                  "src": "12887:10:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": ">",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 7338,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "12900:1:39",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "12887:14:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 7359,
                              "nodeType": "IfStatement",
                              "src": "12883:214:39",
                              "trueBody": {
                                "id": 7358,
                                "nodeType": "Block",
                                "src": "12903:194:39",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 7345,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "id": 7340,
                                        "name": "reserveTotalSupply",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 6830,
                                        "src": "12913:18:39",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 7343,
                                            "name": "reserveFee",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 7332,
                                            "src": "12957:10:39",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 7341,
                                            "name": "reserveTotalSupply",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 6830,
                                            "src": "12934:18:39",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 7342,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "add",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 1113,
                                          "src": "12934:22:39",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                            "typeString": "function (uint256,uint256) pure returns (uint256)"
                                          }
                                        },
                                        "id": 7344,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "12934:34:39",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "12913:55:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 7346,
                                    "nodeType": "ExpressionStatement",
                                    "src": "12913:55:39"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 7352,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "id": 7347,
                                        "name": "unaccountedPrizeBalance",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 7316,
                                        "src": "12978:23:39",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 7350,
                                            "name": "reserveFee",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 7332,
                                            "src": "13032:10:39",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 7348,
                                            "name": "unaccountedPrizeBalance",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 7316,
                                            "src": "13004:23:39",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 7349,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "sub",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 1135,
                                          "src": "13004:27:39",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                            "typeString": "function (uint256,uint256) pure returns (uint256)"
                                          }
                                        },
                                        "id": 7351,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "13004:39:39",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "12978:65:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 7353,
                                    "nodeType": "ExpressionStatement",
                                    "src": "12978:65:39"
                                  },
                                  {
                                    "eventCall": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 7355,
                                          "name": "reserveFee",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 7332,
                                          "src": "13077:10:39",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "id": 7354,
                                        "name": "ReserveFeeCaptured",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 6681,
                                        "src": "13058:18:39",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$",
                                          "typeString": "function (uint256)"
                                        }
                                      },
                                      "id": 7356,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "13058:30:39",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 7357,
                                    "nodeType": "EmitStatement",
                                    "src": "13053:35:39"
                                  }
                                ]
                              }
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 7365,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 7360,
                                  "name": "_currentAwardBalance",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 6836,
                                  "src": "13104:20:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 7363,
                                      "name": "unaccountedPrizeBalance",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 7316,
                                      "src": "13152:23:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 7361,
                                      "name": "_currentAwardBalance",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 6836,
                                      "src": "13127:20:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 7362,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "add",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1113,
                                    "src": "13127:24:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 7364,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "13127:49:39",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "13104:72:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 7366,
                              "nodeType": "ExpressionStatement",
                              "src": "13104:72:39"
                            },
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 7368,
                                    "name": "unaccountedPrizeBalance",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7316,
                                    "src": "13204:23:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 7367,
                                  "name": "AwardCaptured",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 6685,
                                  "src": "13190:13:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$",
                                    "typeString": "function (uint256)"
                                  }
                                },
                                "id": 7369,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "13190:38:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 7370,
                              "nodeType": "EmitStatement",
                              "src": "13185:43:39"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 7373,
                          "name": "_currentAwardBalance",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 6836,
                          "src": "13248:20:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 7291,
                        "id": 7374,
                        "nodeType": "Return",
                        "src": "13241:27:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 7284,
                    "nodeType": "StructuredDocumentation",
                    "src": "12047:195:39",
                    "text": "@notice Captures any available interest as award balance.\n @dev This function also captures the reserve fees.\n @return The total amount of assets to be awarded for the current prize"
                  },
                  "functionSelector": "e6d8a94b",
                  "id": 7376,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 7288,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 7287,
                        "name": "nonReentrant",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4782,
                        "src": "12294:12:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "12294:12:39"
                    }
                  ],
                  "name": "captureAwardBalance",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 7286,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "12285:8:39"
                  },
                  "parameters": {
                    "id": 7285,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "12273:2:39"
                  },
                  "returnParameters": {
                    "id": 7291,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7290,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7376,
                        "src": "12316:7:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7289,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12316:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12315:9:39"
                  },
                  "scope": 8751,
                  "src": "12245:1028:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    8789
                  ],
                  "body": {
                    "id": 7417,
                    "nodeType": "Block",
                    "src": "13362:229:39",
                    "statements": [
                      {
                        "assignments": [
                          7387
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 7387,
                            "mutability": "mutable",
                            "name": "amount",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 7417,
                            "src": "13369:14:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 7386,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "13369:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 7389,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 7388,
                          "name": "reserveTotalSupply",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 6830,
                          "src": "13386:18:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "13369:35:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 7392,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 7390,
                            "name": "reserveTotalSupply",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6830,
                            "src": "13410:18:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 7391,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "13431:1:39",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "13410:22:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 7393,
                        "nodeType": "ExpressionStatement",
                        "src": "13410:22:39"
                      },
                      {
                        "assignments": [
                          7395
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 7395,
                            "mutability": "mutable",
                            "name": "redeemed",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 7417,
                            "src": "13438:16:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 7394,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "13438:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 7399,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7397,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7387,
                              "src": "13465:6:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 7396,
                            "name": "_redeem",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8681,
                            "src": "13457:7:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256) returns (uint256)"
                            }
                          },
                          "id": 7398,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13457:15:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "13438:34:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 7405,
                                  "name": "to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7378,
                                  "src": "13509:2:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 7404,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "13501:7:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 7403,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "13501:7:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 7406,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "13501:11:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7407,
                              "name": "redeemed",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7395,
                              "src": "13514:8:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 7400,
                                "name": "_token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8661,
                                "src": "13479:6:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IERC20Upgradeable_$1960_$",
                                  "typeString": "function () view returns (contract IERC20Upgradeable)"
                                }
                              },
                              "id": 7401,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "13479:8:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            "id": 7402,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "safeTransfer",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1994,
                            "src": "13479:21:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20Upgradeable_$1960_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20Upgradeable_$1960_$",
                              "typeString": "function (contract IERC20Upgradeable,address,uint256)"
                            }
                          },
                          "id": 7408,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13479:44:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 7409,
                        "nodeType": "ExpressionStatement",
                        "src": "13479:44:39"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7411,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7378,
                              "src": "13553:2:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7412,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7387,
                              "src": "13557:6:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 7410,
                            "name": "ReserveWithdrawal",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6756,
                            "src": "13535:17:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 7413,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13535:29:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 7414,
                        "nodeType": "EmitStatement",
                        "src": "13530:34:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 7415,
                          "name": "redeemed",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 7395,
                          "src": "13578:8:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 7385,
                        "id": 7416,
                        "nodeType": "Return",
                        "src": "13571:15:39"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "52a387ab",
                  "id": 7418,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 7382,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 7381,
                        "name": "onlyReserve",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 8750,
                        "src": "13332:11:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "13332:11:39"
                    }
                  ],
                  "name": "withdrawReserve",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 7380,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "13323:8:39"
                  },
                  "parameters": {
                    "id": 7379,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7378,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7418,
                        "src": "13302:10:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7377,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "13302:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "13301:12:39"
                  },
                  "returnParameters": {
                    "id": 7385,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7384,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7418,
                        "src": "13353:7:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7383,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "13353:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "13352:9:39"
                  },
                  "scope": 8751,
                  "src": "13277:314:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    8811
                  ],
                  "body": {
                    "id": 7489,
                    "nodeType": "Block",
                    "src": "14088:476:39",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 7436,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 7434,
                            "name": "amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7423,
                            "src": "14098:6:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 7435,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "14108:1:39",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "14098:11:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 7439,
                        "nodeType": "IfStatement",
                        "src": "14094:38:39",
                        "trueBody": {
                          "id": 7438,
                          "nodeType": "Block",
                          "src": "14111:21:39",
                          "statements": [
                            {
                              "expression": null,
                              "functionReturnParameters": 7433,
                              "id": 7437,
                              "nodeType": "Return",
                              "src": "14119:7:39"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 7443,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 7441,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 7423,
                                "src": "14146:6:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 7442,
                                "name": "_currentAwardBalance",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6836,
                                "src": "14156:20:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "14146:30:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5072697a65506f6f6c2f61776172642d657863656564732d617661696c",
                              "id": 7444,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "14178:31:39",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_b318e53c70e443990590a11dbdc3502c73f947c1cb24069cc99314336e041bc4",
                                "typeString": "literal_string \"PrizePool/award-exceeds-avail\""
                              },
                              "value": "PrizePool/award-exceeds-avail"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_b318e53c70e443990590a11dbdc3502c73f947c1cb24069cc99314336e041bc4",
                                "typeString": "literal_string \"PrizePool/award-exceeds-avail\""
                              }
                            ],
                            "id": 7440,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "14138:7:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 7445,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14138:72:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 7446,
                        "nodeType": "ExpressionStatement",
                        "src": "14138:72:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 7452,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 7447,
                            "name": "_currentAwardBalance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6836,
                            "src": "14216:20:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 7450,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 7423,
                                "src": "14264:6:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 7448,
                                "name": "_currentAwardBalance",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6836,
                                "src": "14239:20:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 7449,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1135,
                              "src": "14239:24:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 7451,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "14239:32:39",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "14216:55:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 7453,
                        "nodeType": "ExpressionStatement",
                        "src": "14216:55:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7455,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7421,
                              "src": "14284:2:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7456,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7423,
                              "src": "14288:6:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7457,
                              "name": "controlledToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7425,
                              "src": "14296:15:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 7460,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "14321:1:39",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 7459,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "14313:7:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 7458,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "14313:7:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 7461,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "14313:10:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "id": 7454,
                            "name": "_mint",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7621,
                            "src": "14278:5:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_address_$_t_address_$returns$__$",
                              "typeString": "function (address,uint256,address,address)"
                            }
                          },
                          "id": 7462,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14278:46:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 7463,
                        "nodeType": "ExpressionStatement",
                        "src": "14278:46:39"
                      },
                      {
                        "assignments": [
                          7465
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 7465,
                            "mutability": "mutable",
                            "name": "extraCredit",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 7489,
                            "src": "14331:19:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 7464,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "14331:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 7470,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7467,
                              "name": "controlledToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7425,
                              "src": "14384:15:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7468,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7423,
                              "src": "14401:6:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 7466,
                            "name": "_calculateEarlyExitFeeNoCredit",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7796,
                            "src": "14353:30:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (address,uint256) view returns (uint256)"
                            }
                          },
                          "id": 7469,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14353:55:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "14331:77:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7472,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7421,
                              "src": "14428:2:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7473,
                              "name": "controlledToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7425,
                              "src": "14432:15:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 7478,
                                  "name": "to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7421,
                                  "src": "14494:2:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 7475,
                                      "name": "controlledToken",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 7425,
                                      "src": "14467:15:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    ],
                                    "id": 7474,
                                    "name": "IERC20Upgradeable",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1960,
                                    "src": "14449:17:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_IERC20Upgradeable_$1960_$",
                                      "typeString": "type(contract IERC20Upgradeable)"
                                    }
                                  },
                                  "id": 7476,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "14449:34:39",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                    "typeString": "contract IERC20Upgradeable"
                                  }
                                },
                                "id": 7477,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "balanceOf",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 1899,
                                "src": "14449:44:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                  "typeString": "function (address) view external returns (uint256)"
                                }
                              },
                              "id": 7479,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "14449:48:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7480,
                              "name": "extraCredit",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7465,
                              "src": "14499:11:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 7471,
                            "name": "_accrueCredit",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7917,
                            "src": "14414:13:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256,uint256)"
                            }
                          },
                          "id": 7481,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14414:97:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 7482,
                        "nodeType": "ExpressionStatement",
                        "src": "14414:97:39"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7484,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7421,
                              "src": "14531:2:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7485,
                              "name": "controlledToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7425,
                              "src": "14535:15:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7486,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7423,
                              "src": "14552:6:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 7483,
                            "name": "Awarded",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6707,
                            "src": "14523:7:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 7487,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14523:36:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 7488,
                        "nodeType": "EmitStatement",
                        "src": "14518:41:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 7419,
                    "nodeType": "StructuredDocumentation",
                    "src": "13595:319:39",
                    "text": "@notice Called by the prize strategy to award prizes.\n @dev The amount awarded must be less than the awardBalance()\n @param to The address of the winner that receives the award\n @param amount The amount of assets to be awarded\n @param controlledToken The address of the asset token being awarded"
                  },
                  "functionSelector": "6b1b863a",
                  "id": 7490,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 7429,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 7428,
                        "name": "onlyPrizeStrategy",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 8713,
                        "src": "14027:17:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "14027:17:39"
                    },
                    {
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 7431,
                          "name": "controlledToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 7425,
                          "src": "14069:15:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "id": 7432,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 7430,
                        "name": "onlyControlledToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 8697,
                        "src": "14049:19:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$_t_address_$",
                          "typeString": "modifier (address)"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "14049:36:39"
                    }
                  ],
                  "name": "award",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 7427,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "14014:8:39"
                  },
                  "parameters": {
                    "id": 7426,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7421,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7490,
                        "src": "13937:10:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7420,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "13937:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7423,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7490,
                        "src": "13953:14:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7422,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "13953:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7425,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7490,
                        "src": "13973:23:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7424,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "13973:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "13931:69:39"
                  },
                  "returnParameters": {
                    "id": 7433,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "14088:0:39"
                  },
                  "scope": 8751,
                  "src": "13917:647:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    8821
                  ],
                  "body": {
                    "id": 7516,
                    "nodeType": "Block",
                    "src": "15102:126:39",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7504,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7493,
                              "src": "15125:2:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7505,
                              "name": "externalToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7495,
                              "src": "15129:13:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7506,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7497,
                              "src": "15144:6:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 7503,
                            "name": "_transferOut",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7580,
                            "src": "15112:12:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,address,uint256) returns (bool)"
                            }
                          },
                          "id": 7507,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "15112:39:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 7515,
                        "nodeType": "IfStatement",
                        "src": "15108:116:39",
                        "trueBody": {
                          "id": 7514,
                          "nodeType": "Block",
                          "src": "15153:71:39",
                          "statements": [
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 7509,
                                    "name": "to",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7493,
                                    "src": "15191:2:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 7510,
                                    "name": "externalToken",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7495,
                                    "src": "15195:13:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 7511,
                                    "name": "amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7497,
                                    "src": "15210:6:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 7508,
                                  "name": "TransferredExternalERC20",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 6725,
                                  "src": "15166:24:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                                    "typeString": "function (address,address,uint256)"
                                  }
                                },
                                "id": 7512,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "15166:51:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 7513,
                              "nodeType": "EmitStatement",
                              "src": "15161:56:39"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 7491,
                    "nodeType": "StructuredDocumentation",
                    "src": "14568:387:39",
                    "text": "@notice Called by the Prize-Strategy to transfer out external ERC20 tokens\n @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\n @param to The address of the winner that receives the award\n @param amount The amount of external assets to be awarded\n @param externalToken The address of the external asset token being awarded"
                  },
                  "functionSelector": "13f55e39",
                  "id": 7517,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 7501,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 7500,
                        "name": "onlyPrizeStrategy",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 8713,
                        "src": "15082:17:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "15082:17:39"
                    }
                  ],
                  "name": "transferExternalERC20",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 7499,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "15069:8:39"
                  },
                  "parameters": {
                    "id": 7498,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7493,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7517,
                        "src": "14994:10:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7492,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "14994:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7495,
                        "mutability": "mutable",
                        "name": "externalToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7517,
                        "src": "15010:21:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7494,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15010:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7497,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7517,
                        "src": "15037:14:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7496,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "15037:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "14988:67:39"
                  },
                  "returnParameters": {
                    "id": 7502,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "15102:0:39"
                  },
                  "scope": 8751,
                  "src": "14958:270:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    8831
                  ],
                  "body": {
                    "id": 7543,
                    "nodeType": "Block",
                    "src": "15727:122:39",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7531,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7520,
                              "src": "15750:2:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7532,
                              "name": "externalToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7522,
                              "src": "15754:13:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7533,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7524,
                              "src": "15769:6:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 7530,
                            "name": "_transferOut",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7580,
                            "src": "15737:12:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,address,uint256) returns (bool)"
                            }
                          },
                          "id": 7534,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "15737:39:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 7542,
                        "nodeType": "IfStatement",
                        "src": "15733:112:39",
                        "trueBody": {
                          "id": 7541,
                          "nodeType": "Block",
                          "src": "15778:67:39",
                          "statements": [
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 7536,
                                    "name": "to",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7520,
                                    "src": "15812:2:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 7537,
                                    "name": "externalToken",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7522,
                                    "src": "15816:13:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 7538,
                                    "name": "amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7524,
                                    "src": "15831:6:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 7535,
                                  "name": "AwardedExternalERC20",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 6716,
                                  "src": "15791:20:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                                    "typeString": "function (address,address,uint256)"
                                  }
                                },
                                "id": 7539,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "15791:47:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 7540,
                              "nodeType": "EmitStatement",
                              "src": "15786:52:39"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 7518,
                    "nodeType": "StructuredDocumentation",
                    "src": "15232:351:39",
                    "text": "@notice Called by the Prize-Strategy to award external ERC20 prizes\n @dev Used to award any arbitrary tokens held by the Prize Pool\n @param to The address of the winner that receives the award\n @param amount The amount of external assets to be awarded\n @param externalToken The address of the external asset token being awarded"
                  },
                  "functionSelector": "2b0ab144",
                  "id": 7544,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 7528,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 7527,
                        "name": "onlyPrizeStrategy",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 8713,
                        "src": "15707:17:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "15707:17:39"
                    }
                  ],
                  "name": "awardExternalERC20",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 7526,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "15694:8:39"
                  },
                  "parameters": {
                    "id": 7525,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7520,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7544,
                        "src": "15619:10:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7519,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15619:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7522,
                        "mutability": "mutable",
                        "name": "externalToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7544,
                        "src": "15635:21:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7521,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15635:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7524,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7544,
                        "src": "15662:14:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7523,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "15662:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15613:67:39"
                  },
                  "returnParameters": {
                    "id": 7529,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "15727:0:39"
                  },
                  "scope": 8751,
                  "src": "15586:263:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 7579,
                    "nodeType": "Block",
                    "src": "15976:220:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 7557,
                                  "name": "externalToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7548,
                                  "src": "16008:13:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 7556,
                                "name": "_canAwardExternal",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8655,
                                "src": "15990:17:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                                  "typeString": "function (address) view returns (bool)"
                                }
                              },
                              "id": 7558,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "15990:32:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e",
                              "id": 7559,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "16024:34:39",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_70015170bd0ff7647e8b415974bb2cd3deaef75f675ffd0943fc2b2e59f78c17",
                                "typeString": "literal_string \"PrizePool/invalid-external-token\""
                              },
                              "value": "PrizePool/invalid-external-token"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_70015170bd0ff7647e8b415974bb2cd3deaef75f675ffd0943fc2b2e59f78c17",
                                "typeString": "literal_string \"PrizePool/invalid-external-token\""
                              }
                            ],
                            "id": 7555,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "15982:7:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 7560,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "15982:77:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 7561,
                        "nodeType": "ExpressionStatement",
                        "src": "15982:77:39"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 7564,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 7562,
                            "name": "amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7550,
                            "src": "16070:6:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 7563,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "16080:1:39",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "16070:11:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 7568,
                        "nodeType": "IfStatement",
                        "src": "16066:44:39",
                        "trueBody": {
                          "id": 7567,
                          "nodeType": "Block",
                          "src": "16083:27:39",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "66616c7365",
                                "id": 7565,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "16098:5:39",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "false"
                              },
                              "functionReturnParameters": 7554,
                              "id": 7566,
                              "nodeType": "Return",
                              "src": "16091:12:39"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7573,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7546,
                              "src": "16162:2:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7574,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7550,
                              "src": "16166:6:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 7570,
                                  "name": "externalToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7548,
                                  "src": "16134:13:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 7569,
                                "name": "IERC20Upgradeable",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1960,
                                "src": "16116:17:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_contract$_IERC20Upgradeable_$1960_$",
                                  "typeString": "type(contract IERC20Upgradeable)"
                                }
                              },
                              "id": 7571,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "16116:32:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            "id": 7572,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "safeTransfer",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1994,
                            "src": "16116:45:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20Upgradeable_$1960_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20Upgradeable_$1960_$",
                              "typeString": "function (contract IERC20Upgradeable,address,uint256)"
                            }
                          },
                          "id": 7575,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16116:57:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 7576,
                        "nodeType": "ExpressionStatement",
                        "src": "16116:57:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 7577,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "16187:4:39",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 7554,
                        "id": 7578,
                        "nodeType": "Return",
                        "src": "16180:11:39"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 7580,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_transferOut",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 7551,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7546,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7580,
                        "src": "15880:10:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7545,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15880:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7548,
                        "mutability": "mutable",
                        "name": "externalToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7580,
                        "src": "15896:21:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7547,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15896:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7550,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7580,
                        "src": "15923:14:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7549,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "15923:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15874:67:39"
                  },
                  "returnParameters": {
                    "id": 7554,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7553,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7580,
                        "src": "15968:4:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 7552,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "15968:4:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15967:6:39"
                  },
                  "scope": 8751,
                  "src": "15853:343:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 7620,
                    "nodeType": "Block",
                    "src": "16628:200:39",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 7600,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 7594,
                                "name": "prizeStrategy",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6824,
                                "src": "16646:13:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                  "typeString": "contract TokenListenerInterface"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                  "typeString": "contract TokenListenerInterface"
                                }
                              ],
                              "id": 7593,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "16638:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 7592,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "16638:7:39",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 7595,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "16638:22:39",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 7598,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "16672:1:39",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                }
                              ],
                              "id": 7597,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "16664:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 7596,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "16664:7:39",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 7599,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "16664:10:39",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "src": "16638:36:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 7611,
                        "nodeType": "IfStatement",
                        "src": "16634:125:39",
                        "trueBody": {
                          "id": 7610,
                          "nodeType": "Block",
                          "src": "16676:83:39",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 7604,
                                    "name": "to",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7583,
                                    "src": "16714:2:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 7605,
                                    "name": "amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7585,
                                    "src": "16718:6:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 7606,
                                    "name": "controlledToken",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7587,
                                    "src": "16726:15:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 7607,
                                    "name": "referrer",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7589,
                                    "src": "16743:8:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 7601,
                                    "name": "prizeStrategy",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 6824,
                                    "src": "16684:13:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                      "typeString": "contract TokenListenerInterface"
                                    }
                                  },
                                  "id": 7603,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "beforeTokenMint",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 16252,
                                  "src": "16684:29:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$_t_address_$_t_address_$returns$__$",
                                    "typeString": "function (address,uint256,address,address) external"
                                  }
                                },
                                "id": 7608,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "16684:68:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 7609,
                              "nodeType": "ExpressionStatement",
                              "src": "16684:68:39"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7616,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7583,
                              "src": "16812:2:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7617,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7585,
                              "src": "16816:6:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 7613,
                                  "name": "controlledToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7587,
                                  "src": "16780:15:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 7612,
                                "name": "ControlledToken",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 15810,
                                "src": "16764:15:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_contract$_ControlledToken_$15810_$",
                                  "typeString": "type(contract ControlledToken)"
                                }
                              },
                              "id": 7614,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "16764:32:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ControlledToken_$15810",
                                "typeString": "contract ControlledToken"
                              }
                            },
                            "id": 7615,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "controllerMint",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 15715,
                            "src": "16764:47:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256) external"
                            }
                          },
                          "id": 7618,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16764:59:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 7619,
                        "nodeType": "ExpressionStatement",
                        "src": "16764:59:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 7581,
                    "nodeType": "StructuredDocumentation",
                    "src": "16200:330:39",
                    "text": "@notice Called to mint controlled tokens.  Ensures that token listener callbacks are fired.\n @param to The user who is receiving the tokens\n @param amount The amount of tokens they are receiving\n @param controlledToken The token that is going to be minted\n @param referrer The user who referred the minting"
                  },
                  "id": 7621,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_mint",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 7590,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7583,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7621,
                        "src": "16548:10:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7582,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "16548:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7585,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7621,
                        "src": "16560:14:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7584,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "16560:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7587,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7621,
                        "src": "16576:23:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7586,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "16576:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7589,
                        "mutability": "mutable",
                        "name": "referrer",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7621,
                        "src": "16601:16:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7588,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "16601:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "16547:71:39"
                  },
                  "returnParameters": {
                    "id": 7591,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "16628:0:39"
                  },
                  "scope": 8751,
                  "src": "16533:295:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8842
                  ],
                  "body": {
                    "id": 7693,
                    "nodeType": "Block",
                    "src": "17340:462:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 7637,
                                  "name": "externalToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7626,
                                  "src": "17372:13:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 7636,
                                "name": "_canAwardExternal",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8655,
                                "src": "17354:17:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                                  "typeString": "function (address) view returns (bool)"
                                }
                              },
                              "id": 7638,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "17354:32:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5072697a65506f6f6c2f696e76616c69642d65787465726e616c2d746f6b656e",
                              "id": 7639,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "17388:34:39",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_70015170bd0ff7647e8b415974bb2cd3deaef75f675ffd0943fc2b2e59f78c17",
                                "typeString": "literal_string \"PrizePool/invalid-external-token\""
                              },
                              "value": "PrizePool/invalid-external-token"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_70015170bd0ff7647e8b415974bb2cd3deaef75f675ffd0943fc2b2e59f78c17",
                                "typeString": "literal_string \"PrizePool/invalid-external-token\""
                              }
                            ],
                            "id": 7635,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "17346:7:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 7640,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "17346:77:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 7641,
                        "nodeType": "ExpressionStatement",
                        "src": "17346:77:39"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 7645,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 7642,
                              "name": "tokenIds",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7629,
                              "src": "17434:8:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                "typeString": "uint256[] calldata"
                              }
                            },
                            "id": 7643,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "17434:15:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 7644,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "17453:1:39",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "17434:20:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 7648,
                        "nodeType": "IfStatement",
                        "src": "17430:47:39",
                        "trueBody": {
                          "id": 7647,
                          "nodeType": "Block",
                          "src": "17456:21:39",
                          "statements": [
                            {
                              "expression": null,
                              "functionReturnParameters": 7634,
                              "id": 7646,
                              "nodeType": "Return",
                              "src": "17464:7:39"
                            }
                          ]
                        }
                      },
                      {
                        "body": {
                          "id": 7685,
                          "nodeType": "Block",
                          "src": "17529:207:39",
                          "statements": [
                            {
                              "clauses": [
                                {
                                  "block": {
                                    "id": 7673,
                                    "nodeType": "Block",
                                    "src": "17623:10:39",
                                    "statements": []
                                  },
                                  "errorName": "",
                                  "id": 7674,
                                  "nodeType": "TryCatchClause",
                                  "parameters": null,
                                  "src": "17623:10:39"
                                },
                                {
                                  "block": {
                                    "id": 7682,
                                    "nodeType": "Block",
                                    "src": "17665:58:39",
                                    "statements": [
                                      {
                                        "eventCall": {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "id": 7679,
                                              "name": "error",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 7676,
                                              "src": "17708:5:39",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                "typeString": "bytes memory"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_bytes_memory_ptr",
                                                "typeString": "bytes memory"
                                              }
                                            ],
                                            "id": 7678,
                                            "name": "ErrorAwardingExternalERC721",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 6798,
                                            "src": "17680:27:39",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_function_event_nonpayable$_t_bytes_memory_ptr_$returns$__$",
                                              "typeString": "function (bytes memory)"
                                            }
                                          },
                                          "id": 7680,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "functionCall",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "17680:34:39",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_tuple$__$",
                                            "typeString": "tuple()"
                                          }
                                        },
                                        "id": 7681,
                                        "nodeType": "EmitStatement",
                                        "src": "17675:39:39"
                                      }
                                    ]
                                  },
                                  "errorName": "",
                                  "id": 7683,
                                  "nodeType": "TryCatchClause",
                                  "parameters": {
                                    "id": 7677,
                                    "nodeType": "ParameterList",
                                    "parameters": [
                                      {
                                        "constant": false,
                                        "id": 7676,
                                        "mutability": "mutable",
                                        "name": "error",
                                        "nodeType": "VariableDeclaration",
                                        "overrides": null,
                                        "scope": 7683,
                                        "src": "17646:18:39",
                                        "stateVariable": false,
                                        "storageLocation": "memory",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes_memory_ptr",
                                          "typeString": "bytes"
                                        },
                                        "typeName": {
                                          "id": 7675,
                                          "name": "bytes",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "17646:5:39",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                          }
                                        },
                                        "value": null,
                                        "visibility": "internal"
                                      }
                                    ],
                                    "src": "17645:20:39"
                                  },
                                  "src": "17640:83:39"
                                }
                              ],
                              "externalCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 7666,
                                        "name": "this",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -28,
                                        "src": "17600:4:39",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_PrizePool_$8751",
                                          "typeString": "contract PrizePool"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_PrizePool_$8751",
                                          "typeString": "contract PrizePool"
                                        }
                                      ],
                                      "id": 7665,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "17592:7:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 7664,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "17592:7:39",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 7667,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "17592:13:39",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 7668,
                                    "name": "to",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7624,
                                    "src": "17607:2:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 7669,
                                      "name": "tokenIds",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 7629,
                                      "src": "17611:8:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                        "typeString": "uint256[] calldata"
                                      }
                                    },
                                    "id": 7671,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 7670,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 7650,
                                      "src": "17620:1:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "17611:11:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 7661,
                                        "name": "externalToken",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 7626,
                                        "src": "17560:13:39",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "id": 7660,
                                      "name": "IERC721Upgradeable",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3338,
                                      "src": "17541:18:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_contract$_IERC721Upgradeable_$3338_$",
                                        "typeString": "type(contract IERC721Upgradeable)"
                                      }
                                    },
                                    "id": 7662,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "17541:33:39",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                      "typeString": "contract IERC721Upgradeable"
                                    }
                                  },
                                  "id": 7663,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "safeTransferFrom",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 3281,
                                  "src": "17541:50:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                                    "typeString": "function (address,address,uint256) external"
                                  }
                                },
                                "id": 7672,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "17541:82:39",
                                "tryCall": true,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 7684,
                              "nodeType": "TryStatement",
                              "src": "17537:186:39"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 7656,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 7653,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7650,
                            "src": "17503:1:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 7654,
                              "name": "tokenIds",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7629,
                              "src": "17507:8:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                "typeString": "uint256[] calldata"
                              }
                            },
                            "id": 7655,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "17507:15:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "17503:19:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 7686,
                        "initializationExpression": {
                          "assignments": [
                            7650
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 7650,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 7686,
                              "src": "17488:9:39",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 7649,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "17488:7:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 7652,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 7651,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "17500:1:39",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "17488:13:39"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 7658,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "17524:3:39",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 7657,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7650,
                              "src": "17524:1:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 7659,
                          "nodeType": "ExpressionStatement",
                          "src": "17524:3:39"
                        },
                        "nodeType": "ForStatement",
                        "src": "17483:253:39"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7688,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7624,
                              "src": "17769:2:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7689,
                              "name": "externalToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7626,
                              "src": "17773:13:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7690,
                              "name": "tokenIds",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7629,
                              "src": "17788:8:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                "typeString": "uint256[] calldata"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                "typeString": "uint256[] calldata"
                              }
                            ],
                            "id": 7687,
                            "name": "AwardedExternalERC721",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6735,
                            "src": "17747:21:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_array$_t_uint256_$dyn_memory_ptr_$returns$__$",
                              "typeString": "function (address,address,uint256[] memory)"
                            }
                          },
                          "id": 7691,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "17747:50:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 7692,
                        "nodeType": "EmitStatement",
                        "src": "17742:55:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 7622,
                    "nodeType": "StructuredDocumentation",
                    "src": "16832:350:39",
                    "text": "@notice Called by the prize strategy to award external ERC721 prizes\n @dev Used to award any arbitrary NFTs held by the Prize Pool\n @param to The address of the winner that receives the award\n @param externalToken The address of the external NFT token being awarded\n @param tokenIds An array of NFT Token IDs to be transferred"
                  },
                  "functionSelector": "16960d55",
                  "id": 7694,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 7633,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 7632,
                        "name": "onlyPrizeStrategy",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 8713,
                        "src": "17320:17:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "17320:17:39"
                    }
                  ],
                  "name": "awardExternalERC721",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 7631,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "17307:8:39"
                  },
                  "parameters": {
                    "id": 7630,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7624,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7694,
                        "src": "17219:10:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7623,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "17219:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7626,
                        "mutability": "mutable",
                        "name": "externalToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7694,
                        "src": "17235:21:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7625,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "17235:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7629,
                        "mutability": "mutable",
                        "name": "tokenIds",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7694,
                        "src": "17262:27:39",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 7627,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "17262:7:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 7628,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "17262:9:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "17213:80:39"
                  },
                  "returnParameters": {
                    "id": 7634,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "17340:0:39"
                  },
                  "scope": 8751,
                  "src": "17185:617:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 7746,
                    "nodeType": "Block",
                    "src": "18111:355:39",
                    "statements": [
                      {
                        "assignments": [
                          7703
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 7703,
                            "mutability": "mutable",
                            "name": "reserve",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 7746,
                            "src": "18117:24:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ReserveInterface_$12539",
                              "typeString": "contract ReserveInterface"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 7702,
                              "name": "ReserveInterface",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 12539,
                              "src": "18117:16:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ReserveInterface_$12539",
                                "typeString": "contract ReserveInterface"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 7709,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 7705,
                                  "name": "reserveRegistry",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 6817,
                                  "src": "18161:15:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                                    "typeString": "contract RegistryInterface"
                                  }
                                },
                                "id": 7706,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "lookup",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 12457,
                                "src": "18161:22:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_view$__$returns$_t_address_$",
                                  "typeString": "function () view external returns (address)"
                                }
                              },
                              "id": 7707,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "18161:24:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 7704,
                            "name": "ReserveInterface",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12539,
                            "src": "18144:16:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_ReserveInterface_$12539_$",
                              "typeString": "type(contract ReserveInterface)"
                            }
                          },
                          "id": 7708,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "18144:42:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ReserveInterface_$12539",
                            "typeString": "contract ReserveInterface"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "18117:69:39"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 7718,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 7712,
                                "name": "reserve",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 7703,
                                "src": "18204:7:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_ReserveInterface_$12539",
                                  "typeString": "contract ReserveInterface"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_ReserveInterface_$12539",
                                  "typeString": "contract ReserveInterface"
                                }
                              ],
                              "id": 7711,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "18196:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 7710,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "18196:7:39",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 7713,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "18196:16:39",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 7716,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "18224:1:39",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                }
                              ],
                              "id": 7715,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "18216:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 7714,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "18216:7:39",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 7717,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "18216:10:39",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "src": "18196:30:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 7722,
                        "nodeType": "IfStatement",
                        "src": "18192:59:39",
                        "trueBody": {
                          "id": 7721,
                          "nodeType": "Block",
                          "src": "18228:23:39",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 7719,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "18243:1:39",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "functionReturnParameters": 7701,
                              "id": 7720,
                              "nodeType": "Return",
                              "src": "18236:8:39"
                            }
                          ]
                        }
                      },
                      {
                        "assignments": [
                          7724
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 7724,
                            "mutability": "mutable",
                            "name": "reserveRateMantissa",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 7746,
                            "src": "18256:27:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 7723,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "18256:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 7732,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 7729,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "18322:4:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_PrizePool_$8751",
                                    "typeString": "contract PrizePool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_PrizePool_$8751",
                                    "typeString": "contract PrizePool"
                                  }
                                ],
                                "id": 7728,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "18314:7:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 7727,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "18314:7:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 7730,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "18314:13:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 7725,
                              "name": "reserve",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7703,
                              "src": "18286:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ReserveInterface_$12539",
                                "typeString": "contract ReserveInterface"
                              }
                            },
                            "id": 7726,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "reserveRateMantissa",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 12538,
                            "src": "18286:27:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) view external returns (uint256)"
                            }
                          },
                          "id": 7731,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "18286:42:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "18256:72:39"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 7735,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 7733,
                            "name": "reserveRateMantissa",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7724,
                            "src": "18338:19:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 7734,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "18361:1:39",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "18338:24:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 7739,
                        "nodeType": "IfStatement",
                        "src": "18334:53:39",
                        "trueBody": {
                          "id": 7738,
                          "nodeType": "Block",
                          "src": "18364:23:39",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 7736,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "18379:1:39",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "functionReturnParameters": 7701,
                              "id": 7737,
                              "nodeType": "Return",
                              "src": "18372:8:39"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7742,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7697,
                              "src": "18433:6:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7743,
                              "name": "reserveRateMantissa",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7724,
                              "src": "18441:19:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 7740,
                              "name": "FixedPoint",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5279,
                              "src": "18399:10:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_FixedPoint_$5279_$",
                                "typeString": "type(library FixedPoint)"
                              }
                            },
                            "id": 7741,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "multiplyUintByMantissa",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5251,
                            "src": "18399:33:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 7744,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "18399:62:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 7701,
                        "id": 7745,
                        "nodeType": "Return",
                        "src": "18392:69:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 7695,
                    "nodeType": "StructuredDocumentation",
                    "src": "17806:227:39",
                    "text": "@notice Calculates the reserve portion of the given amount of funds.  If there is no reserve address, the portion will be zero.\n @param amount The prize amount\n @return The size of the reserve portion of the prize"
                  },
                  "functionSelector": "9fe32a91",
                  "id": 7747,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "calculateReserveFee",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 7698,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7697,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7747,
                        "src": "18065:14:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7696,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "18065:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18064:16:39"
                  },
                  "returnParameters": {
                    "id": 7701,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7700,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7747,
                        "src": "18102:7:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7699,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "18102:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18101:9:39"
                  },
                  "scope": 8751,
                  "src": "18036:430:39",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    8856
                  ],
                  "body": {
                    "id": 7772,
                    "nodeType": "Block",
                    "src": "19002:106:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 7770,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "id": 7762,
                                "name": "exitFee",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 7758,
                                "src": "19009:7:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 7763,
                                "name": "burnedCredit",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 7760,
                                "src": "19018:12:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "id": 7764,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "TupleExpression",
                            "src": "19008:23:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                              "typeString": "tuple(uint256,uint256)"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 7766,
                                "name": "from",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 7750,
                                "src": "19073:4:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 7767,
                                "name": "controlledToken",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 7752,
                                "src": "19079:15:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 7768,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 7754,
                                "src": "19096:6:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 7765,
                              "name": "_calculateEarlyExitFeeLessBurnedCredit",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8328,
                              "src": "19034:38:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_uint256_$_t_uint256_$",
                                "typeString": "function (address,address,uint256) returns (uint256,uint256)"
                              }
                            },
                            "id": 7769,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "19034:69:39",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                              "typeString": "tuple(uint256,uint256)"
                            }
                          },
                          "src": "19008:95:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 7771,
                        "nodeType": "ExpressionStatement",
                        "src": "19008:95:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 7748,
                    "nodeType": "StructuredDocumentation",
                    "src": "18470:333:39",
                    "text": "@notice Calculates the early exit fee for the given amount\n @param from The user who is withdrawing\n @param controlledToken The type of collateral being withdrawn\n @param amount The amount of collateral to be withdrawn\n @return exitFee The exit fee\n @return burnedCredit The user's credit that was burned"
                  },
                  "functionSelector": "888c2b6f",
                  "id": 7773,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "calculateEarlyExitFee",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 7756,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "18921:8:39"
                  },
                  "parameters": {
                    "id": 7755,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7750,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7773,
                        "src": "18842:12:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7749,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "18842:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7752,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7773,
                        "src": "18860:23:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7751,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "18860:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7754,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7773,
                        "src": "18889:14:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7753,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "18889:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18836:71:39"
                  },
                  "returnParameters": {
                    "id": 7761,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7758,
                        "mutability": "mutable",
                        "name": "exitFee",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7773,
                        "src": "18950:15:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7757,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "18950:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7760,
                        "mutability": "mutable",
                        "name": "burnedCredit",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7773,
                        "src": "18973:20:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7759,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "18973:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18942:57:39"
                  },
                  "scope": 8751,
                  "src": "18806:302:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 7795,
                    "nodeType": "Block",
                    "src": "19371:156:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7784,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7778,
                              "src": "19405:6:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 7787,
                                  "name": "amount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7778,
                                  "src": "19453:6:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 7788,
                                      "name": "_tokenCreditPlans",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 6841,
                                      "src": "19461:17:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_CreditPlan_$6803_storage_$",
                                        "typeString": "mapping(address => struct PrizePool.CreditPlan storage ref)"
                                      }
                                    },
                                    "id": 7790,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 7789,
                                      "name": "controlledToken",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 7776,
                                      "src": "19479:15:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "19461:34:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_CreditPlan_$6803_storage",
                                      "typeString": "struct PrizePool.CreditPlan storage ref"
                                    }
                                  },
                                  "id": 7791,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "creditLimitMantissa",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 6800,
                                  "src": "19461:54:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint128",
                                    "typeString": "uint128"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 7785,
                                  "name": "FixedPoint",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5279,
                                  "src": "19419:10:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_contract$_FixedPoint_$5279_$",
                                    "typeString": "type(library FixedPoint)"
                                  }
                                },
                                "id": 7786,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "multiplyUintByMantissa",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 5251,
                                "src": "19419:33:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                  "typeString": "function (uint256,uint256) pure returns (uint256)"
                                }
                              },
                              "id": 7792,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "19419:97:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 7783,
                            "name": "_limitExitFee",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7151,
                            "src": "19384:13:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256,uint256) view returns (uint256)"
                            }
                          },
                          "id": 7793,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "19384:138:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 7782,
                        "id": 7794,
                        "nodeType": "Return",
                        "src": "19377:145:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 7774,
                    "nodeType": "StructuredDocumentation",
                    "src": "19112:143:39",
                    "text": "@dev Calculates the early exit fee for the given amount\n @param amount The amount of collateral to be withdrawn\n @return Exit fee"
                  },
                  "id": 7796,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_calculateEarlyExitFeeNoCredit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 7779,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7776,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7796,
                        "src": "19298:23:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7775,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "19298:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7778,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7796,
                        "src": "19323:14:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7777,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "19323:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19297:41:39"
                  },
                  "returnParameters": {
                    "id": 7782,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7781,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7796,
                        "src": "19362:7:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7780,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "19362:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19361:9:39"
                  },
                  "scope": 8751,
                  "src": "19258:269:39",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8868
                  ],
                  "body": {
                    "id": 7817,
                    "nodeType": "Block",
                    "src": "20094:119:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 7815,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 7809,
                            "name": "durationSeconds",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7807,
                            "src": "20100:15:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 7811,
                                "name": "_controlledToken",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 7799,
                                "src": "20151:16:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 7812,
                                "name": "_principal",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 7801,
                                "src": "20175:10:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 7813,
                                "name": "_interest",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 7803,
                                "src": "20193:9:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 7810,
                              "name": "_estimateCreditAccrualTime",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7854,
                              "src": "20117:26:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                "typeString": "function (address,uint256,uint256) view returns (uint256)"
                              }
                            },
                            "id": 7814,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "20117:91:39",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "20100:108:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 7816,
                        "nodeType": "ExpressionStatement",
                        "src": "20100:108:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 7797,
                    "nodeType": "StructuredDocumentation",
                    "src": "19531:373:39",
                    "text": "@notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\n @param _principal The principal amount on which interest is accruing\n @param _interest The amount of interest that must accrue\n @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds."
                  },
                  "functionSelector": "79cb8563",
                  "id": 7818,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "estimateCreditAccrualTime",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 7805,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "20036:8:39"
                  },
                  "parameters": {
                    "id": 7804,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7799,
                        "mutability": "mutable",
                        "name": "_controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7818,
                        "src": "19947:24:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7798,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "19947:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7801,
                        "mutability": "mutable",
                        "name": "_principal",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7818,
                        "src": "19977:18:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7800,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "19977:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7803,
                        "mutability": "mutable",
                        "name": "_interest",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7818,
                        "src": "20001:17:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7802,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "20001:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19941:81:39"
                  },
                  "returnParameters": {
                    "id": 7808,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7807,
                        "mutability": "mutable",
                        "name": "durationSeconds",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7818,
                        "src": "20067:23:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7806,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "20067:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20066:25:39"
                  },
                  "scope": 8751,
                  "src": "19907:306:39",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 7853,
                    "nodeType": "Block",
                    "src": "20771:341:39",
                    "statements": [
                      {
                        "assignments": [
                          7831
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 7831,
                            "mutability": "mutable",
                            "name": "accruedPerSecond",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 7853,
                            "src": "20880:24:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 7830,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "20880:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 7840,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7834,
                              "name": "_principal",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7823,
                              "src": "20941:10:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 7835,
                                  "name": "_tokenCreditPlans",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 6841,
                                  "src": "20953:17:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_struct$_CreditPlan_$6803_storage_$",
                                    "typeString": "mapping(address => struct PrizePool.CreditPlan storage ref)"
                                  }
                                },
                                "id": 7837,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 7836,
                                  "name": "_controlledToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7821,
                                  "src": "20971:16:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "20953:35:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_CreditPlan_$6803_storage",
                                  "typeString": "struct PrizePool.CreditPlan storage ref"
                                }
                              },
                              "id": 7838,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "creditRateMantissa",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 6802,
                              "src": "20953:54:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 7832,
                              "name": "FixedPoint",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5279,
                              "src": "20907:10:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_FixedPoint_$5279_$",
                                "typeString": "type(library FixedPoint)"
                              }
                            },
                            "id": 7833,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "multiplyUintByMantissa",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5251,
                            "src": "20907:33:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 7839,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "20907:101:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "20880:128:39"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 7843,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 7841,
                            "name": "accruedPerSecond",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7831,
                            "src": "21018:16:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 7842,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "21038:1:39",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "21018:21:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 7847,
                        "nodeType": "IfStatement",
                        "src": "21014:50:39",
                        "trueBody": {
                          "id": 7846,
                          "nodeType": "Block",
                          "src": "21041:23:39",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 7844,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "21056:1:39",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "functionReturnParameters": 7829,
                              "id": 7845,
                              "nodeType": "Return",
                              "src": "21049:8:39"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7850,
                              "name": "accruedPerSecond",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7831,
                              "src": "21090:16:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 7848,
                              "name": "_interest",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7825,
                              "src": "21076:9:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 7849,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "div",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1191,
                            "src": "21076:13:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 7851,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21076:31:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 7829,
                        "id": 7852,
                        "nodeType": "Return",
                        "src": "21069:38:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 7819,
                    "nodeType": "StructuredDocumentation",
                    "src": "20217:372:39",
                    "text": "@notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit\n @param _principal The principal amount on which interest is accruing\n @param _interest The amount of interest that must accrue\n @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds."
                  },
                  "id": 7854,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_estimateCreditAccrualTime",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 7826,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7821,
                        "mutability": "mutable",
                        "name": "_controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7854,
                        "src": "20633:24:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7820,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20633:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7823,
                        "mutability": "mutable",
                        "name": "_principal",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7854,
                        "src": "20663:18:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7822,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "20663:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7825,
                        "mutability": "mutable",
                        "name": "_interest",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7854,
                        "src": "20687:17:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7824,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "20687:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20627:81:39"
                  },
                  "returnParameters": {
                    "id": 7829,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7828,
                        "mutability": "mutable",
                        "name": "durationSeconds",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7854,
                        "src": "20744:23:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7827,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "20744:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20743:25:39"
                  },
                  "scope": 8751,
                  "src": "20592:520:39",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 7892,
                    "nodeType": "Block",
                    "src": "21343:204:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 7884,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 7864,
                                  "name": "_tokenCreditBalances",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 6848,
                                  "src": "21349:20:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_CreditBalance_$6810_storage_$_$",
                                    "typeString": "mapping(address => mapping(address => struct PrizePool.CreditBalance storage ref))"
                                  }
                                },
                                "id": 7867,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 7865,
                                  "name": "controlledToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7859,
                                  "src": "21370:15:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "21349:37:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_CreditBalance_$6810_storage_$",
                                  "typeString": "mapping(address => struct PrizePool.CreditBalance storage ref)"
                                }
                              },
                              "id": 7868,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 7866,
                                "name": "user",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 7857,
                                "src": "21387:4:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "21349:43:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_CreditBalance_$6810_storage",
                                "typeString": "struct PrizePool.CreditBalance storage ref"
                              }
                            },
                            "id": 7869,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "balance",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 6805,
                            "src": "21349:51:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint192",
                              "typeString": "uint192"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 7880,
                                    "name": "credit",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7861,
                                    "src": "21468:6:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "baseExpression": {
                                            "argumentTypes": null,
                                            "baseExpression": {
                                              "argumentTypes": null,
                                              "id": 7872,
                                              "name": "_tokenCreditBalances",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 6848,
                                              "src": "21411:20:39",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_CreditBalance_$6810_storage_$_$",
                                                "typeString": "mapping(address => mapping(address => struct PrizePool.CreditBalance storage ref))"
                                              }
                                            },
                                            "id": 7874,
                                            "indexExpression": {
                                              "argumentTypes": null,
                                              "id": 7873,
                                              "name": "controlledToken",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 7859,
                                              "src": "21432:15:39",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            },
                                            "isConstant": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "nodeType": "IndexAccess",
                                            "src": "21411:37:39",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_CreditBalance_$6810_storage_$",
                                              "typeString": "mapping(address => struct PrizePool.CreditBalance storage ref)"
                                            }
                                          },
                                          "id": 7876,
                                          "indexExpression": {
                                            "argumentTypes": null,
                                            "id": 7875,
                                            "name": "user",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 7857,
                                            "src": "21449:4:39",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            }
                                          },
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "nodeType": "IndexAccess",
                                          "src": "21411:43:39",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_CreditBalance_$6810_storage",
                                            "typeString": "struct PrizePool.CreditBalance storage ref"
                                          }
                                        },
                                        "id": 7877,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "balance",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 6805,
                                        "src": "21411:51:39",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint192",
                                          "typeString": "uint192"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint192",
                                          "typeString": "uint192"
                                        }
                                      ],
                                      "id": 7871,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "21403:7:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_uint256_$",
                                        "typeString": "type(uint256)"
                                      },
                                      "typeName": {
                                        "id": 7870,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "21403:7:39",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 7878,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "21403:60:39",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 7879,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sub",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1135,
                                  "src": "21403:64:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256,uint256) pure returns (uint256)"
                                  }
                                },
                                "id": 7881,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "21403:72:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 7882,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "toUint128",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4813,
                              "src": "21403:82:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256) pure returns (uint128)"
                              }
                            },
                            "id": 7883,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "21403:84:39",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "21349:138:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint192",
                            "typeString": "uint192"
                          }
                        },
                        "id": 7885,
                        "nodeType": "ExpressionStatement",
                        "src": "21349:138:39"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7887,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7857,
                              "src": "21512:4:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7888,
                              "name": "controlledToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7859,
                              "src": "21518:15:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7889,
                              "name": "credit",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7861,
                              "src": "21535:6:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 7886,
                            "name": "CreditBurned",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6793,
                            "src": "21499:12:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 7890,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21499:43:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 7891,
                        "nodeType": "EmitStatement",
                        "src": "21494:48:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 7855,
                    "nodeType": "StructuredDocumentation",
                    "src": "21116:139:39",
                    "text": "@notice Burns a users credit.\n @param user The user whose credit should be burned\n @param credit The amount of credit to burn"
                  },
                  "id": 7893,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_burnCredit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 7862,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7857,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7893,
                        "src": "21279:12:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7856,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "21279:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7859,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7893,
                        "src": "21293:23:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7858,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "21293:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7861,
                        "mutability": "mutable",
                        "name": "credit",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7893,
                        "src": "21318:14:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7860,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "21318:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21278:55:39"
                  },
                  "returnParameters": {
                    "id": 7863,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "21343:0:39"
                  },
                  "scope": 8751,
                  "src": "21258:289:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 7916,
                    "nodeType": "Block",
                    "src": "22065:157:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 7906,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7896,
                              "src": "22099:4:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 7907,
                              "name": "controlledToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7898,
                              "src": "22111:15:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 7909,
                                  "name": "user",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7896,
                                  "src": "22158:4:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 7910,
                                  "name": "controlledToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7898,
                                  "src": "22164:15:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 7911,
                                  "name": "controlledTokenBalance",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7900,
                                  "src": "22181:22:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 7912,
                                  "name": "extra",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7902,
                                  "src": "22205:5:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 7908,
                                "name": "_calculateCreditBalance",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 7980,
                                "src": "22134:23:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                  "typeString": "function (address,address,uint256,uint256) view returns (uint256)"
                                }
                              },
                              "id": 7913,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "22134:77:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 7905,
                            "name": "_updateCreditBalance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8044,
                            "src": "22071:20:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 7914,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22071:146:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 7915,
                        "nodeType": "ExpressionStatement",
                        "src": "22071:146:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 7894,
                    "nodeType": "StructuredDocumentation",
                    "src": "21551:393:39",
                    "text": "@notice Accrues ticket credit for a user assuming their current balance is the passed balance.  May burn credit if they exceed their limit.\n @param user The user for whom to accrue credit\n @param controlledToken The controlled token whose balance we are checking\n @param controlledTokenBalance The balance to use for the user\n @param extra Additional credit to be added"
                  },
                  "id": 7917,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_accrueCredit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 7903,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7896,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7917,
                        "src": "21970:12:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7895,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "21970:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7898,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7917,
                        "src": "21984:23:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7897,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "21984:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7900,
                        "mutability": "mutable",
                        "name": "controlledTokenBalance",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7917,
                        "src": "22009:30:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7899,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "22009:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7902,
                        "mutability": "mutable",
                        "name": "extra",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7917,
                        "src": "22041:13:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7901,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "22041:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21969:86:39"
                  },
                  "returnParameters": {
                    "id": 7904,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "22065:0:39"
                  },
                  "scope": 8751,
                  "src": "21947:275:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 7979,
                    "nodeType": "Block",
                    "src": "22377:447:39",
                    "statements": [
                      {
                        "assignments": [
                          7931
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 7931,
                            "mutability": "mutable",
                            "name": "newBalance",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 7979,
                            "src": "22383:18:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 7930,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "22383:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 7932,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "22383:18:39"
                      },
                      {
                        "assignments": [
                          7934
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 7934,
                            "mutability": "mutable",
                            "name": "creditBalance",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 7979,
                            "src": "22407:35:39",
                            "stateVariable": false,
                            "storageLocation": "storage",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_CreditBalance_$6810_storage_ptr",
                              "typeString": "struct PrizePool.CreditBalance"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 7933,
                              "name": "CreditBalance",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 6810,
                              "src": "22407:13:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_CreditBalance_$6810_storage_ptr",
                                "typeString": "struct PrizePool.CreditBalance"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 7940,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 7935,
                              "name": "_tokenCreditBalances",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6848,
                              "src": "22445:20:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_CreditBalance_$6810_storage_$_$",
                                "typeString": "mapping(address => mapping(address => struct PrizePool.CreditBalance storage ref))"
                              }
                            },
                            "id": 7937,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 7936,
                              "name": "controlledToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7921,
                              "src": "22466:15:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "22445:37:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_CreditBalance_$6810_storage_$",
                              "typeString": "mapping(address => struct PrizePool.CreditBalance storage ref)"
                            }
                          },
                          "id": 7939,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 7938,
                            "name": "user",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7919,
                            "src": "22483:4:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "22445:43:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_CreditBalance_$6810_storage",
                            "typeString": "struct PrizePool.CreditBalance storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "22407:81:39"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 7943,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "UnaryOperation",
                          "operator": "!",
                          "prefix": true,
                          "src": "22498:26:39",
                          "subExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 7941,
                              "name": "creditBalance",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7934,
                              "src": "22499:13:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_CreditBalance_$6810_storage_ptr",
                                "typeString": "struct PrizePool.CreditBalance storage pointer"
                              }
                            },
                            "id": 7942,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "initialized",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 6809,
                            "src": "22499:25:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 7975,
                          "nodeType": "Block",
                          "src": "22561:236:39",
                          "statements": [
                            {
                              "assignments": [
                                7950
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 7950,
                                  "mutability": "mutable",
                                  "name": "credit",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 7975,
                                  "src": "22569:14:39",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 7949,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "22569:7:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 7956,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 7952,
                                    "name": "user",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7919,
                                    "src": "22610:4:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 7953,
                                    "name": "controlledToken",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7921,
                                    "src": "22616:15:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 7954,
                                    "name": "controlledTokenBalance",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7923,
                                    "src": "22633:22:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 7951,
                                  "name": "_calculateAccruedCredit",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 8136,
                                  "src": "22586:23:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$_t_uint256_$returns$_t_uint256_$",
                                    "typeString": "function (address,address,uint256) view returns (uint256)"
                                  }
                                },
                                "id": 7955,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "22586:70:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "22569:87:39"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 7973,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 7957,
                                  "name": "newBalance",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7931,
                                  "src": "22664:10:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 7959,
                                      "name": "controlledToken",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 7921,
                                      "src": "22695:15:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    {
                                      "argumentTypes": null,
                                      "id": 7960,
                                      "name": "controlledTokenBalance",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 7923,
                                      "src": "22712:22:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 7970,
                                          "name": "extra",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 7925,
                                          "src": "22783:5:39",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "id": 7967,
                                              "name": "credit",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 7950,
                                              "src": "22771:6:39",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": null,
                                              "arguments": [
                                                {
                                                  "argumentTypes": null,
                                                  "expression": {
                                                    "argumentTypes": null,
                                                    "id": 7963,
                                                    "name": "creditBalance",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 7934,
                                                    "src": "22744:13:39",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_struct$_CreditBalance_$6810_storage_ptr",
                                                      "typeString": "struct PrizePool.CreditBalance storage pointer"
                                                    }
                                                  },
                                                  "id": 7964,
                                                  "isConstant": false,
                                                  "isLValue": true,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "memberName": "balance",
                                                  "nodeType": "MemberAccess",
                                                  "referencedDeclaration": 6805,
                                                  "src": "22744:21:39",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint192",
                                                    "typeString": "uint192"
                                                  }
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": [
                                                  {
                                                    "typeIdentifier": "t_uint192",
                                                    "typeString": "uint192"
                                                  }
                                                ],
                                                "id": 7962,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "lValueRequested": false,
                                                "nodeType": "ElementaryTypeNameExpression",
                                                "src": "22736:7:39",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_type$_t_uint256_$",
                                                  "typeString": "type(uint256)"
                                                },
                                                "typeName": {
                                                  "id": 7961,
                                                  "name": "uint256",
                                                  "nodeType": "ElementaryTypeName",
                                                  "src": "22736:7:39",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": null,
                                                    "typeString": null
                                                  }
                                                }
                                              },
                                              "id": 7965,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "kind": "typeConversion",
                                              "lValueRequested": false,
                                              "names": [],
                                              "nodeType": "FunctionCall",
                                              "src": "22736:30:39",
                                              "tryCall": false,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "id": 7966,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "add",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 1113,
                                            "src": "22736:34:39",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                                            }
                                          },
                                          "id": 7968,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "functionCall",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "22736:42:39",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 7969,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "add",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 1113,
                                        "src": "22736:46:39",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                                        }
                                      },
                                      "id": 7971,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "22736:53:39",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      },
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "id": 7958,
                                    "name": "_applyCreditLimit",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8079,
                                    "src": "22677:17:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                      "typeString": "function (address,uint256,uint256) view returns (uint256)"
                                    }
                                  },
                                  "id": 7972,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "22677:113:39",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "22664:126:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 7974,
                              "nodeType": "ExpressionStatement",
                              "src": "22664:126:39"
                            }
                          ]
                        },
                        "id": 7976,
                        "nodeType": "IfStatement",
                        "src": "22494:303:39",
                        "trueBody": {
                          "id": 7948,
                          "nodeType": "Block",
                          "src": "22526:29:39",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 7946,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 7944,
                                  "name": "newBalance",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 7931,
                                  "src": "22534:10:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 7945,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "22547:1:39",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "22534:14:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 7947,
                              "nodeType": "ExpressionStatement",
                              "src": "22534:14:39"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 7977,
                          "name": "newBalance",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 7931,
                          "src": "22809:10:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 7929,
                        "id": 7978,
                        "nodeType": "Return",
                        "src": "22802:17:39"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 7980,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_calculateCreditBalance",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 7926,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7919,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7980,
                        "src": "22259:12:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7918,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22259:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7921,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7980,
                        "src": "22273:23:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7920,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22273:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7923,
                        "mutability": "mutable",
                        "name": "controlledTokenBalance",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7980,
                        "src": "22298:30:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7922,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "22298:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7925,
                        "mutability": "mutable",
                        "name": "extra",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7980,
                        "src": "22330:13:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7924,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "22330:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22258:86:39"
                  },
                  "returnParameters": {
                    "id": 7929,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7928,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 7980,
                        "src": "22368:7:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7927,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "22368:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22367:9:39"
                  },
                  "scope": 8751,
                  "src": "22226:598:39",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 8043,
                    "nodeType": "Block",
                    "src": "22926:506:39",
                    "statements": [
                      {
                        "assignments": [
                          7990
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 7990,
                            "mutability": "mutable",
                            "name": "oldBalance",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 8043,
                            "src": "22932:18:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 7989,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "22932:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 7997,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 7991,
                                "name": "_tokenCreditBalances",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6848,
                                "src": "22953:20:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_CreditBalance_$6810_storage_$_$",
                                  "typeString": "mapping(address => mapping(address => struct PrizePool.CreditBalance storage ref))"
                                }
                              },
                              "id": 7993,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 7992,
                                "name": "controlledToken",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 7984,
                                "src": "22974:15:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "22953:37:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_CreditBalance_$6810_storage_$",
                                "typeString": "mapping(address => struct PrizePool.CreditBalance storage ref)"
                              }
                            },
                            "id": 7995,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 7994,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7982,
                              "src": "22991:4:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "22953:43:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_CreditBalance_$6810_storage",
                              "typeString": "struct PrizePool.CreditBalance storage ref"
                            }
                          },
                          "id": 7996,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "balance",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 6805,
                          "src": "22953:51:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint192",
                            "typeString": "uint192"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "22932:72:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 8013,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 7998,
                                "name": "_tokenCreditBalances",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6848,
                                "src": "23011:20:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_CreditBalance_$6810_storage_$_$",
                                  "typeString": "mapping(address => mapping(address => struct PrizePool.CreditBalance storage ref))"
                                }
                              },
                              "id": 8001,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 7999,
                                "name": "controlledToken",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 7984,
                                "src": "23032:15:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "23011:37:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_CreditBalance_$6810_storage_$",
                                "typeString": "mapping(address => struct PrizePool.CreditBalance storage ref)"
                              }
                            },
                            "id": 8002,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 8000,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7982,
                              "src": "23049:4:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "23011:43:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_CreditBalance_$6810_storage",
                              "typeString": "struct PrizePool.CreditBalance storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 8004,
                                    "name": "newBalance",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7986,
                                    "src": "23088:10:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 8005,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "toUint128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 4813,
                                  "src": "23088:20:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 8006,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "23088:22:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [],
                                    "expression": {
                                      "argumentTypes": [],
                                      "id": 8007,
                                      "name": "_currentTime",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 8462,
                                      "src": "23129:12:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                        "typeString": "function () view returns (uint256)"
                                      }
                                    },
                                    "id": 8008,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "23129:14:39",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 8009,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "toUint32",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 4859,
                                  "src": "23129:23:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint32_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint32)"
                                  }
                                },
                                "id": 8010,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "23129:25:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint32",
                                  "typeString": "uint32"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "74727565",
                                "id": 8011,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "23175:4:39",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "true"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                },
                                {
                                  "typeIdentifier": "t_uint32",
                                  "typeString": "uint32"
                                },
                                {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              ],
                              "id": 8003,
                              "name": "CreditBalance",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6810,
                              "src": "23057:13:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_struct$_CreditBalance_$6810_storage_ptr_$",
                                "typeString": "type(struct PrizePool.CreditBalance storage pointer)"
                              }
                            },
                            "id": 8012,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "structConstructorCall",
                            "lValueRequested": false,
                            "names": [
                              "balance",
                              "timestamp",
                              "initialized"
                            ],
                            "nodeType": "FunctionCall",
                            "src": "23057:129:39",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_CreditBalance_$6810_memory_ptr",
                              "typeString": "struct PrizePool.CreditBalance memory"
                            }
                          },
                          "src": "23011:175:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_CreditBalance_$6810_storage",
                            "typeString": "struct PrizePool.CreditBalance storage ref"
                          }
                        },
                        "id": 8014,
                        "nodeType": "ExpressionStatement",
                        "src": "23011:175:39"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 8017,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 8015,
                            "name": "oldBalance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7990,
                            "src": "23197:10:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 8016,
                            "name": "newBalance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7986,
                            "src": "23210:10:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "23197:23:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "condition": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 8030,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 8028,
                              "name": "newBalance",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7986,
                              "src": "23320:10:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "<",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 8029,
                              "name": "oldBalance",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 7990,
                              "src": "23333:10:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "23320:23:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseBody": null,
                          "id": 8041,
                          "nodeType": "IfStatement",
                          "src": "23316:112:39",
                          "trueBody": {
                            "id": 8040,
                            "nodeType": "Block",
                            "src": "23345:83:39",
                            "statements": [
                              {
                                "eventCall": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 8032,
                                      "name": "user",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 7982,
                                      "src": "23371:4:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    {
                                      "argumentTypes": null,
                                      "id": 8033,
                                      "name": "controlledToken",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 7984,
                                      "src": "23377:15:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 8036,
                                          "name": "newBalance",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 7986,
                                          "src": "23409:10:39",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 8034,
                                          "name": "oldBalance",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 7990,
                                          "src": "23394:10:39",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 8035,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "sub",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 1135,
                                        "src": "23394:14:39",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                                        }
                                      },
                                      "id": 8037,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "23394:26:39",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      },
                                      {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      },
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "id": 8031,
                                    "name": "CreditBurned",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 6793,
                                    "src": "23358:12:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                                      "typeString": "function (address,address,uint256)"
                                    }
                                  },
                                  "id": 8038,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "23358:63:39",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_tuple$__$",
                                    "typeString": "tuple()"
                                  }
                                },
                                "id": 8039,
                                "nodeType": "EmitStatement",
                                "src": "23353:68:39"
                              }
                            ]
                          }
                        },
                        "id": 8042,
                        "nodeType": "IfStatement",
                        "src": "23193:235:39",
                        "trueBody": {
                          "id": 8027,
                          "nodeType": "Block",
                          "src": "23222:83:39",
                          "statements": [
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 8019,
                                    "name": "user",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7982,
                                    "src": "23248:4:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 8020,
                                    "name": "controlledToken",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 7984,
                                    "src": "23254:15:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 8023,
                                        "name": "oldBalance",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 7990,
                                        "src": "23286:10:39",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 8021,
                                        "name": "newBalance",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 7986,
                                        "src": "23271:10:39",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 8022,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "sub",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 1135,
                                      "src": "23271:14:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                        "typeString": "function (uint256,uint256) pure returns (uint256)"
                                      }
                                    },
                                    "id": 8024,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "23271:26:39",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 8018,
                                  "name": "CreditMinted",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 6784,
                                  "src": "23235:12:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                                    "typeString": "function (address,address,uint256)"
                                  }
                                },
                                "id": 8025,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "23235:63:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 8026,
                              "nodeType": "EmitStatement",
                              "src": "23230:68:39"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 8044,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_updateCreditBalance",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 7987,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 7982,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8044,
                        "src": "22858:12:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7981,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22858:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7984,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8044,
                        "src": "22872:23:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 7983,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22872:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 7986,
                        "mutability": "mutable",
                        "name": "newBalance",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8044,
                        "src": "22897:18:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 7985,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "22897:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22857:59:39"
                  },
                  "returnParameters": {
                    "id": 7988,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "22926:0:39"
                  },
                  "scope": 8751,
                  "src": "22828:604:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 8078,
                    "nodeType": "Block",
                    "src": "23987:271:39",
                    "statements": [
                      {
                        "assignments": [
                          8057
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 8057,
                            "mutability": "mutable",
                            "name": "creditLimit",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 8078,
                            "src": "23993:19:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 8056,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "23993:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 8066,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 8060,
                              "name": "controlledTokenBalance",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8049,
                              "src": "24056:22:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 8061,
                                  "name": "_tokenCreditPlans",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 6841,
                                  "src": "24086:17:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_struct$_CreditPlan_$6803_storage_$",
                                    "typeString": "mapping(address => struct PrizePool.CreditPlan storage ref)"
                                  }
                                },
                                "id": 8063,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 8062,
                                  "name": "controlledToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 8047,
                                  "src": "24104:15:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "24086:34:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_CreditPlan_$6803_storage",
                                  "typeString": "struct PrizePool.CreditPlan storage ref"
                                }
                              },
                              "id": 8064,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "creditLimitMantissa",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 6800,
                              "src": "24086:54:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 8058,
                              "name": "FixedPoint",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5279,
                              "src": "24015:10:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_FixedPoint_$5279_$",
                                "typeString": "type(library FixedPoint)"
                              }
                            },
                            "id": 8059,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "multiplyUintByMantissa",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5251,
                            "src": "24015:33:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 8065,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "24015:131:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "23993:153:39"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 8069,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 8067,
                            "name": "creditBalance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8051,
                            "src": "24156:13:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 8068,
                            "name": "creditLimit",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8057,
                            "src": "24172:11:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "24156:27:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 8075,
                        "nodeType": "IfStatement",
                        "src": "24152:75:39",
                        "trueBody": {
                          "id": 8074,
                          "nodeType": "Block",
                          "src": "24185:42:39",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 8072,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 8070,
                                  "name": "creditBalance",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 8051,
                                  "src": "24193:13:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 8071,
                                  "name": "creditLimit",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 8057,
                                  "src": "24209:11:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "24193:27:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 8073,
                              "nodeType": "ExpressionStatement",
                              "src": "24193:27:39"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 8076,
                          "name": "creditBalance",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 8051,
                          "src": "24240:13:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 8055,
                        "id": 8077,
                        "nodeType": "Return",
                        "src": "24233:20:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8045,
                    "nodeType": "StructuredDocumentation",
                    "src": "23436:409:39",
                    "text": "@notice Applies the credit limit to a credit balance.  The balance cannot exceed the credit limit.\n @param controlledToken The controlled token that the user holds\n @param controlledTokenBalance The users ticket balance (used to calculate credit limit)\n @param creditBalance The new credit balance to be checked\n @return The users new credit balance.  Will not exceed the credit limit."
                  },
                  "id": 8079,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_applyCreditLimit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8052,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8047,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8079,
                        "src": "23875:23:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8046,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "23875:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8049,
                        "mutability": "mutable",
                        "name": "controlledTokenBalance",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8079,
                        "src": "23900:30:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8048,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "23900:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8051,
                        "mutability": "mutable",
                        "name": "creditBalance",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8079,
                        "src": "23932:21:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8050,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "23932:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23874:80:39"
                  },
                  "returnParameters": {
                    "id": 8055,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8054,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8079,
                        "src": "23978:7:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8053,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "23978:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23977:9:39"
                  },
                  "scope": 8751,
                  "src": "23848:410:39",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 8135,
                    "nodeType": "Block",
                    "src": "24748:422:39",
                    "statements": [
                      {
                        "assignments": [
                          8092
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 8092,
                            "mutability": "mutable",
                            "name": "userTimestamp",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 8135,
                            "src": "24754:21:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 8091,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "24754:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 8099,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 8093,
                                "name": "_tokenCreditBalances",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6848,
                                "src": "24778:20:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_CreditBalance_$6810_storage_$_$",
                                  "typeString": "mapping(address => mapping(address => struct PrizePool.CreditBalance storage ref))"
                                }
                              },
                              "id": 8095,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 8094,
                                "name": "controlledToken",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8084,
                                "src": "24799:15:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "24778:37:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_CreditBalance_$6810_storage_$",
                                "typeString": "mapping(address => struct PrizePool.CreditBalance storage ref)"
                              }
                            },
                            "id": 8097,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 8096,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8082,
                              "src": "24816:4:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "24778:43:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_CreditBalance_$6810_storage",
                              "typeString": "struct PrizePool.CreditBalance storage ref"
                            }
                          },
                          "id": 8098,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "timestamp",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 6807,
                          "src": "24778:53:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "24754:77:39"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 8106,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "UnaryOperation",
                          "operator": "!",
                          "prefix": true,
                          "src": "24842:56:39",
                          "subExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 8100,
                                  "name": "_tokenCreditBalances",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 6848,
                                  "src": "24843:20:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_CreditBalance_$6810_storage_$_$",
                                    "typeString": "mapping(address => mapping(address => struct PrizePool.CreditBalance storage ref))"
                                  }
                                },
                                "id": 8102,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 8101,
                                  "name": "controlledToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 8084,
                                  "src": "24864:15:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "24843:37:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_CreditBalance_$6810_storage_$",
                                  "typeString": "mapping(address => struct PrizePool.CreditBalance storage ref)"
                                }
                              },
                              "id": 8104,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 8103,
                                "name": "user",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8082,
                                "src": "24881:4:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "24843:43:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_CreditBalance_$6810_storage",
                                "typeString": "struct PrizePool.CreditBalance storage ref"
                              }
                            },
                            "id": 8105,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "initialized",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 6809,
                            "src": "24843:55:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 8110,
                        "nodeType": "IfStatement",
                        "src": "24838:85:39",
                        "trueBody": {
                          "id": 8109,
                          "nodeType": "Block",
                          "src": "24900:23:39",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 8107,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "24915:1:39",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "functionReturnParameters": 8090,
                              "id": 8108,
                              "nodeType": "Return",
                              "src": "24908:8:39"
                            }
                          ]
                        }
                      },
                      {
                        "assignments": [
                          8112
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 8112,
                            "mutability": "mutable",
                            "name": "deltaTime",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 8135,
                            "src": "24929:17:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 8111,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "24929:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 8118,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 8116,
                              "name": "userTimestamp",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8092,
                              "src": "24968:13:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 8113,
                                "name": "_currentTime",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8462,
                                "src": "24949:12:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                  "typeString": "function () view returns (uint256)"
                                }
                              },
                              "id": 8114,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "24949:14:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 8115,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sub",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1135,
                            "src": "24949:18:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 8117,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "24949:33:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "24929:53:39"
                      },
                      {
                        "assignments": [
                          8120
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 8120,
                            "mutability": "mutable",
                            "name": "deltaMantissa",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 8135,
                            "src": "24988:21:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 8119,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "24988:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 8128,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 8123,
                                  "name": "_tokenCreditPlans",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 6841,
                                  "src": "25026:17:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_struct$_CreditPlan_$6803_storage_$",
                                    "typeString": "mapping(address => struct PrizePool.CreditPlan storage ref)"
                                  }
                                },
                                "id": 8125,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 8124,
                                  "name": "controlledToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 8084,
                                  "src": "25044:15:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "25026:34:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_CreditPlan_$6803_storage",
                                  "typeString": "struct PrizePool.CreditPlan storage ref"
                                }
                              },
                              "id": 8126,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "creditRateMantissa",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 6802,
                              "src": "25026:53:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 8121,
                              "name": "deltaTime",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8112,
                              "src": "25012:9:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 8122,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "mul",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1169,
                            "src": "25012:13:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 8127,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "25012:68:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "24988:92:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 8131,
                              "name": "controlledTokenBalance",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8086,
                              "src": "25127:22:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 8132,
                              "name": "deltaMantissa",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8120,
                              "src": "25151:13:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 8129,
                              "name": "FixedPoint",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5279,
                              "src": "25093:10:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_FixedPoint_$5279_$",
                                "typeString": "type(library FixedPoint)"
                              }
                            },
                            "id": 8130,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "multiplyUintByMantissa",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5251,
                            "src": "25093:33:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 8133,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "25093:72:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 8090,
                        "id": 8134,
                        "nodeType": "Return",
                        "src": "25086:79:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8080,
                    "nodeType": "StructuredDocumentation",
                    "src": "24262:347:39",
                    "text": "@notice Calculates the accrued interest for a user\n @param user The user whose credit should be calculated.\n @param controlledToken The controlled token that the user holds\n @param controlledTokenBalance The user's current balance of the controlled tokens.\n @return The credit that has accrued since the last credit update."
                  },
                  "id": 8136,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_calculateAccruedCredit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8087,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8082,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8136,
                        "src": "24645:12:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8081,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "24645:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8084,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8136,
                        "src": "24659:23:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8083,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "24659:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8086,
                        "mutability": "mutable",
                        "name": "controlledTokenBalance",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8136,
                        "src": "24684:30:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8085,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "24684:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24644:71:39"
                  },
                  "returnParameters": {
                    "id": 8090,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8089,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8136,
                        "src": "24739:7:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8088,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "24739:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24738:9:39"
                  },
                  "scope": 8751,
                  "src": "24612:558:39",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8878
                  ],
                  "body": {
                    "id": 8169,
                    "nodeType": "Block",
                    "src": "25546:166:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 8151,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8139,
                              "src": "25566:4:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 8152,
                              "name": "controlledToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8141,
                              "src": "25572:15:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 8157,
                                  "name": "user",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 8139,
                                  "src": "25634:4:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 8154,
                                      "name": "controlledToken",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 8141,
                                      "src": "25607:15:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    ],
                                    "id": 8153,
                                    "name": "IERC20Upgradeable",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 1960,
                                    "src": "25589:17:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_IERC20Upgradeable_$1960_$",
                                      "typeString": "type(contract IERC20Upgradeable)"
                                    }
                                  },
                                  "id": 8155,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "25589:34:39",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                    "typeString": "contract IERC20Upgradeable"
                                  }
                                },
                                "id": 8156,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "balanceOf",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 1899,
                                "src": "25589:44:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                  "typeString": "function (address) view external returns (uint256)"
                                }
                              },
                              "id": 8158,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "25589:50:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 8159,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "25641:1:39",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 8150,
                            "name": "_accrueCredit",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7917,
                            "src": "25552:13:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256,uint256)"
                            }
                          },
                          "id": 8160,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "25552:91:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 8161,
                        "nodeType": "ExpressionStatement",
                        "src": "25552:91:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 8162,
                                "name": "_tokenCreditBalances",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6848,
                                "src": "25656:20:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_CreditBalance_$6810_storage_$_$",
                                  "typeString": "mapping(address => mapping(address => struct PrizePool.CreditBalance storage ref))"
                                }
                              },
                              "id": 8164,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 8163,
                                "name": "controlledToken",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8141,
                                "src": "25677:15:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "25656:37:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_CreditBalance_$6810_storage_$",
                                "typeString": "mapping(address => struct PrizePool.CreditBalance storage ref)"
                              }
                            },
                            "id": 8166,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 8165,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8139,
                              "src": "25694:4:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "25656:43:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_CreditBalance_$6810_storage",
                              "typeString": "struct PrizePool.CreditBalance storage ref"
                            }
                          },
                          "id": 8167,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "balance",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 6805,
                          "src": "25656:51:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint192",
                            "typeString": "uint192"
                          }
                        },
                        "functionReturnParameters": 8149,
                        "id": 8168,
                        "nodeType": "Return",
                        "src": "25649:58:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8137,
                    "nodeType": "StructuredDocumentation",
                    "src": "25174:232:39",
                    "text": "@notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\n @param user The user whose credit balance should be returned\n @return The balance of the users credit"
                  },
                  "functionSelector": "494de9f7",
                  "id": 8170,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 8145,
                          "name": "controlledToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 8141,
                          "src": "25511:15:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "id": 8146,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 8144,
                        "name": "onlyControlledToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 8697,
                        "src": "25491:19:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$_t_address_$",
                          "typeString": "modifier (address)"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "25491:36:39"
                    }
                  ],
                  "name": "balanceOfCredit",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 8143,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "25482:8:39"
                  },
                  "parameters": {
                    "id": 8142,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8139,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8170,
                        "src": "25434:12:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8138,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "25434:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8141,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8170,
                        "src": "25448:23:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8140,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "25448:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "25433:39:39"
                  },
                  "returnParameters": {
                    "id": 8149,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8148,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8170,
                        "src": "25537:7:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8147,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "25537:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "25536:9:39"
                  },
                  "scope": 8751,
                  "src": "25409:303:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    8888
                  ],
                  "body": {
                    "id": 8201,
                    "nodeType": "Block",
                    "src": "26329:249:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 8193,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 8186,
                              "name": "_tokenCreditPlans",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6841,
                              "src": "26335:17:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_CreditPlan_$6803_storage_$",
                                "typeString": "mapping(address => struct PrizePool.CreditPlan storage ref)"
                              }
                            },
                            "id": 8188,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 8187,
                              "name": "_controlledToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8173,
                              "src": "26353:16:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "26335:35:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_CreditPlan_$6803_storage",
                              "typeString": "struct PrizePool.CreditPlan storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 8190,
                                "name": "_creditLimitMantissa",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8177,
                                "src": "26413:20:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "id": 8191,
                                "name": "_creditRateMantissa",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8175,
                                "src": "26461:19:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                },
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "id": 8189,
                              "name": "CreditPlan",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6803,
                              "src": "26373:10:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_struct$_CreditPlan_$6803_storage_ptr_$",
                                "typeString": "type(struct PrizePool.CreditPlan storage pointer)"
                              }
                            },
                            "id": 8192,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "structConstructorCall",
                            "lValueRequested": false,
                            "names": [
                              "creditLimitMantissa",
                              "creditRateMantissa"
                            ],
                            "nodeType": "FunctionCall",
                            "src": "26373:114:39",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_CreditPlan_$6803_memory_ptr",
                              "typeString": "struct PrizePool.CreditPlan memory"
                            }
                          },
                          "src": "26335:152:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_CreditPlan_$6803_storage",
                            "typeString": "struct PrizePool.CreditPlan storage ref"
                          }
                        },
                        "id": 8194,
                        "nodeType": "ExpressionStatement",
                        "src": "26335:152:39"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 8196,
                              "name": "_controlledToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8173,
                              "src": "26513:16:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 8197,
                              "name": "_creditLimitMantissa",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8177,
                              "src": "26531:20:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 8198,
                              "name": "_creditRateMantissa",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8175,
                              "src": "26553:19:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              },
                              {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            ],
                            "id": 8195,
                            "name": "CreditPlanSet",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6770,
                            "src": "26499:13:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint128_$_t_uint128_$returns$__$",
                              "typeString": "function (address,uint128,uint128)"
                            }
                          },
                          "id": 8199,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "26499:74:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 8200,
                        "nodeType": "EmitStatement",
                        "src": "26494:79:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8171,
                    "nodeType": "StructuredDocumentation",
                    "src": "25716:404:39",
                    "text": "@notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\n @param _controlledToken The controlled token for whom to set the credit plan\n @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\n @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether)."
                  },
                  "functionSelector": "a7b2cc31",
                  "id": 8202,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 8181,
                          "name": "_controlledToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 8173,
                          "src": "26295:16:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "id": 8182,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 8180,
                        "name": "onlyControlledToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 8697,
                        "src": "26275:19:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$_t_address_$",
                          "typeString": "modifier (address)"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "26275:37:39"
                    },
                    {
                      "arguments": null,
                      "id": 8184,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 8183,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "26317:9:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "26317:9:39"
                    }
                  ],
                  "name": "setCreditPlanOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 8179,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "26262:8:39"
                  },
                  "parameters": {
                    "id": 8178,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8173,
                        "mutability": "mutable",
                        "name": "_controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8202,
                        "src": "26153:24:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8172,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "26153:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8175,
                        "mutability": "mutable",
                        "name": "_creditRateMantissa",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8202,
                        "src": "26183:27:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 8174,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "26183:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8177,
                        "mutability": "mutable",
                        "name": "_creditLimitMantissa",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8202,
                        "src": "26216:28:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 8176,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "26216:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "26147:101:39"
                  },
                  "returnParameters": {
                    "id": 8185,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "26329:0:39"
                  },
                  "scope": 8751,
                  "src": "26123:455:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    8898
                  ],
                  "body": {
                    "id": 8227,
                    "nodeType": "Block",
                    "src": "27141:167:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 8218,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 8213,
                            "name": "creditLimitMantissa",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8209,
                            "src": "27147:19:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 8214,
                                "name": "_tokenCreditPlans",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6841,
                                "src": "27169:17:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_CreditPlan_$6803_storage_$",
                                  "typeString": "mapping(address => struct PrizePool.CreditPlan storage ref)"
                                }
                              },
                              "id": 8216,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 8215,
                                "name": "controlledToken",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8205,
                                "src": "27187:15:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "27169:34:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_CreditPlan_$6803_storage",
                                "typeString": "struct PrizePool.CreditPlan storage ref"
                              }
                            },
                            "id": 8217,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "creditLimitMantissa",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 6800,
                            "src": "27169:54:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "27147:76:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 8219,
                        "nodeType": "ExpressionStatement",
                        "src": "27147:76:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 8225,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 8220,
                            "name": "creditRateMantissa",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8211,
                            "src": "27229:18:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 8221,
                                "name": "_tokenCreditPlans",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6841,
                                "src": "27250:17:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_CreditPlan_$6803_storage_$",
                                  "typeString": "mapping(address => struct PrizePool.CreditPlan storage ref)"
                                }
                              },
                              "id": 8223,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 8222,
                                "name": "controlledToken",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8205,
                                "src": "27268:15:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "27250:34:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_CreditPlan_$6803_storage",
                                "typeString": "struct PrizePool.CreditPlan storage ref"
                              }
                            },
                            "id": 8224,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "creditRateMantissa",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 6802,
                            "src": "27250:53:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "27229:74:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 8226,
                        "nodeType": "ExpressionStatement",
                        "src": "27229:74:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8203,
                    "nodeType": "StructuredDocumentation",
                    "src": "26582:380:39",
                    "text": "@notice Returns the credit rate of a controlled token\n @param controlledToken The controlled token to retrieve the credit rates for\n @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\n @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second."
                  },
                  "functionSelector": "d4a1361d",
                  "id": 8228,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "creditPlanOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 8207,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "27033:8:39"
                  },
                  "parameters": {
                    "id": 8206,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8205,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8228,
                        "src": "26992:23:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8204,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "26992:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "26986:33:39"
                  },
                  "returnParameters": {
                    "id": 8212,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8209,
                        "mutability": "mutable",
                        "name": "creditLimitMantissa",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8228,
                        "src": "27071:27:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 8208,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "27071:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8211,
                        "mutability": "mutable",
                        "name": "creditRateMantissa",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8228,
                        "src": "27106:26:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 8210,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "27106:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "27063:75:39"
                  },
                  "scope": 8751,
                  "src": "26965:343:39",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 8327,
                    "nodeType": "Block",
                    "src": "27950:1259:39",
                    "statements": [
                      {
                        "assignments": [
                          8243
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 8243,
                            "mutability": "mutable",
                            "name": "controlledTokenBalance",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 8327,
                            "src": "27956:30:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 8242,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "27956:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 8250,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 8248,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8231,
                              "src": "28034:4:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 8245,
                                  "name": "controlledToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 8233,
                                  "src": "28007:15:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 8244,
                                "name": "IERC20Upgradeable",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1960,
                                "src": "27989:17:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_contract$_IERC20Upgradeable_$1960_$",
                                  "typeString": "type(contract IERC20Upgradeable)"
                                }
                              },
                              "id": 8246,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "27989:34:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            "id": 8247,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balanceOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1899,
                            "src": "27989:44:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) view external returns (uint256)"
                            }
                          },
                          "id": 8249,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "27989:50:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "27956:83:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 8254,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 8252,
                                "name": "controlledTokenBalance",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8243,
                                "src": "28053:22:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 8253,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8235,
                                "src": "28079:6:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "28053:32:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5072697a65506f6f6c2f696e737566662d66756e6473",
                              "id": 8255,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "28087:24:39",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_fb2849d129e19db4172656fe6d11b91abfab7faf2f5c6eb600f64638fdb67f0c",
                                "typeString": "literal_string \"PrizePool/insuff-funds\""
                              },
                              "value": "PrizePool/insuff-funds"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_fb2849d129e19db4172656fe6d11b91abfab7faf2f5c6eb600f64638fdb67f0c",
                                "typeString": "literal_string \"PrizePool/insuff-funds\""
                              }
                            ],
                            "id": 8251,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "28045:7:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 8256,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "28045:67:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 8257,
                        "nodeType": "ExpressionStatement",
                        "src": "28045:67:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 8259,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8231,
                              "src": "28132:4:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 8260,
                              "name": "controlledToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8233,
                              "src": "28138:15:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 8261,
                              "name": "controlledTokenBalance",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8243,
                              "src": "28155:22:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 8262,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "28179:1:39",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 8258,
                            "name": "_accrueCredit",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7917,
                            "src": "28118:13:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256,uint256)"
                            }
                          },
                          "id": 8263,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "28118:63:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 8264,
                        "nodeType": "ExpressionStatement",
                        "src": "28118:63:39"
                      },
                      {
                        "assignments": [
                          8266
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 8266,
                            "mutability": "mutable",
                            "name": "remainingExitFee",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 8327,
                            "src": "28575:24:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 8265,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "28575:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 8274,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 8268,
                              "name": "controlledToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8233,
                              "src": "28633:15:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 8271,
                                  "name": "amount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 8235,
                                  "src": "28677:6:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 8269,
                                  "name": "controlledTokenBalance",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 8243,
                                  "src": "28650:22:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 8270,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sub",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 1135,
                                "src": "28650:26:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                  "typeString": "function (uint256,uint256) pure returns (uint256)"
                                }
                              },
                              "id": 8272,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "28650:34:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 8267,
                            "name": "_calculateEarlyExitFeeNoCredit",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7796,
                            "src": "28602:30:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (address,uint256) view returns (uint256)"
                            }
                          },
                          "id": 8273,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "28602:83:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "28575:110:39"
                      },
                      {
                        "assignments": [
                          8276
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 8276,
                            "mutability": "mutable",
                            "name": "availableCredit",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 8327,
                            "src": "28692:23:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 8275,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "28692:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 8277,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "28692:23:39"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 8285,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 8278,
                                  "name": "_tokenCreditBalances",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 6848,
                                  "src": "28725:20:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_CreditBalance_$6810_storage_$_$",
                                    "typeString": "mapping(address => mapping(address => struct PrizePool.CreditBalance storage ref))"
                                  }
                                },
                                "id": 8280,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 8279,
                                  "name": "controlledToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 8233,
                                  "src": "28746:15:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "28725:37:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_CreditBalance_$6810_storage_$",
                                  "typeString": "mapping(address => struct PrizePool.CreditBalance storage ref)"
                                }
                              },
                              "id": 8282,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 8281,
                                "name": "from",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8231,
                                "src": "28763:4:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "28725:43:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_CreditBalance_$6810_storage",
                                "typeString": "struct PrizePool.CreditBalance storage ref"
                              }
                            },
                            "id": 8283,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balance",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 6805,
                            "src": "28725:51:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint192",
                              "typeString": "uint192"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 8284,
                            "name": "remainingExitFee",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8266,
                            "src": "28780:16:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "28725:71:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 8302,
                        "nodeType": "IfStatement",
                        "src": "28721:192:39",
                        "trueBody": {
                          "id": 8301,
                          "nodeType": "Block",
                          "src": "28798:115:39",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 8299,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 8286,
                                  "name": "availableCredit",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 8276,
                                  "src": "28806:15:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 8297,
                                      "name": "remainingExitFee",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 8266,
                                      "src": "28889:16:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "baseExpression": {
                                              "argumentTypes": null,
                                              "baseExpression": {
                                                "argumentTypes": null,
                                                "id": 8289,
                                                "name": "_tokenCreditBalances",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 6848,
                                                "src": "28832:20:39",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_struct$_CreditBalance_$6810_storage_$_$",
                                                  "typeString": "mapping(address => mapping(address => struct PrizePool.CreditBalance storage ref))"
                                                }
                                              },
                                              "id": 8291,
                                              "indexExpression": {
                                                "argumentTypes": null,
                                                "id": 8290,
                                                "name": "controlledToken",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8233,
                                                "src": "28853:15:39",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_address",
                                                  "typeString": "address"
                                                }
                                              },
                                              "isConstant": false,
                                              "isLValue": true,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "nodeType": "IndexAccess",
                                              "src": "28832:37:39",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_CreditBalance_$6810_storage_$",
                                                "typeString": "mapping(address => struct PrizePool.CreditBalance storage ref)"
                                              }
                                            },
                                            "id": 8293,
                                            "indexExpression": {
                                              "argumentTypes": null,
                                              "id": 8292,
                                              "name": "from",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 8231,
                                              "src": "28870:4:39",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            },
                                            "isConstant": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "nodeType": "IndexAccess",
                                            "src": "28832:43:39",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_CreditBalance_$6810_storage",
                                              "typeString": "struct PrizePool.CreditBalance storage ref"
                                            }
                                          },
                                          "id": 8294,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "balance",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 6805,
                                          "src": "28832:51:39",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint192",
                                            "typeString": "uint192"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint192",
                                            "typeString": "uint192"
                                          }
                                        ],
                                        "id": 8288,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "28824:7:39",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_uint256_$",
                                          "typeString": "type(uint256)"
                                        },
                                        "typeName": {
                                          "id": 8287,
                                          "name": "uint256",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "28824:7:39",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      },
                                      "id": 8295,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "28824:60:39",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 8296,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "sub",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1135,
                                    "src": "28824:64:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 8298,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "28824:82:39",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "28806:100:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 8300,
                              "nodeType": "ExpressionStatement",
                              "src": "28806:100:39"
                            }
                          ]
                        }
                      },
                      {
                        "assignments": [
                          8304
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 8304,
                            "mutability": "mutable",
                            "name": "totalExitFee",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 8327,
                            "src": "28989:20:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 8303,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "28989:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 8309,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 8306,
                              "name": "controlledToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8233,
                              "src": "29043:15:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 8307,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8235,
                              "src": "29060:6:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 8305,
                            "name": "_calculateEarlyExitFeeNoCredit",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 7796,
                            "src": "29012:30:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_address_$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (address,uint256) view returns (uint256)"
                            }
                          },
                          "id": 8308,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "29012:55:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "28989:78:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 8318,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 8310,
                            "name": "creditBurned",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8240,
                            "src": "29073:12:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "condition": {
                              "argumentTypes": null,
                              "components": [
                                {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 8313,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 8311,
                                    "name": "availableCredit",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8276,
                                    "src": "29089:15:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": ">",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 8312,
                                    "name": "totalExitFee",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8304,
                                    "src": "29107:12:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "29089:30:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "id": 8314,
                              "isConstant": false,
                              "isInlineArray": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "TupleExpression",
                              "src": "29088:32:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "falseExpression": {
                              "argumentTypes": null,
                              "id": 8316,
                              "name": "availableCredit",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8276,
                              "src": "29138:15:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 8317,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "Conditional",
                            "src": "29088:65:39",
                            "trueExpression": {
                              "argumentTypes": null,
                              "id": 8315,
                              "name": "totalExitFee",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8304,
                              "src": "29123:12:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "29073:80:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 8319,
                        "nodeType": "ExpressionStatement",
                        "src": "29073:80:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 8325,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 8320,
                            "name": "earlyExitFee",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8238,
                            "src": "29159:12:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 8323,
                                "name": "creditBurned",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8240,
                                "src": "29191:12:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 8321,
                                "name": "totalExitFee",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8304,
                                "src": "29174:12:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 8322,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1135,
                              "src": "29174:16:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 8324,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "29174:30:39",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "29159:45:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 8326,
                        "nodeType": "ExpressionStatement",
                        "src": "29159:45:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8229,
                    "nodeType": "StructuredDocumentation",
                    "src": "27312:426:39",
                    "text": "@notice Calculate the early exit for a user given a withdrawal amount.  The user's credit is taken into account.\n @param from The user who is withdrawing\n @param controlledToken The token they are withdrawing\n @param amount The amount of funds they are withdrawing\n @return earlyExitFee The additional exit fee that should be charged.\n @return creditBurned The amount of credit that will be burned"
                  },
                  "id": 8328,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_calculateEarlyExitFeeLessBurnedCredit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8236,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8231,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8328,
                        "src": "27794:12:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8230,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "27794:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8233,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8328,
                        "src": "27812:23:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8232,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "27812:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8235,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8328,
                        "src": "27841:14:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8234,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "27841:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "27788:71:39"
                  },
                  "returnParameters": {
                    "id": 8241,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8238,
                        "mutability": "mutable",
                        "name": "earlyExitFee",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8328,
                        "src": "27893:20:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8237,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "27893:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8240,
                        "mutability": "mutable",
                        "name": "creditBurned",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8328,
                        "src": "27921:20:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8239,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "27921:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "27885:62:39"
                  },
                  "scope": 8751,
                  "src": "27741:1468:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8904
                  ],
                  "body": {
                    "id": 8341,
                    "nodeType": "Block",
                    "src": "29453:42:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 8338,
                              "name": "_liquidityCap",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8331,
                              "src": "29476:13:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 8337,
                            "name": "_setLiquidityCap",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8356,
                            "src": "29459:16:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 8339,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "29459:31:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 8340,
                        "nodeType": "ExpressionStatement",
                        "src": "29459:31:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8329,
                    "nodeType": "StructuredDocumentation",
                    "src": "29213:161:39",
                    "text": "@notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\n @param _liquidityCap The new liquidity cap for the prize pool"
                  },
                  "functionSelector": "7b99adb1",
                  "id": 8342,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 8335,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 8334,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "29443:9:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "29443:9:39"
                    }
                  ],
                  "name": "setLiquidityCap",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 8333,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "29434:8:39"
                  },
                  "parameters": {
                    "id": 8332,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8331,
                        "mutability": "mutable",
                        "name": "_liquidityCap",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8342,
                        "src": "29402:21:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8330,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "29402:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "29401:23:39"
                  },
                  "returnParameters": {
                    "id": 8336,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "29453:0:39"
                  },
                  "scope": 8751,
                  "src": "29377:118:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 8355,
                    "nodeType": "Block",
                    "src": "29557:80:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 8349,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 8347,
                            "name": "liquidityCap",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6833,
                            "src": "29563:12:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 8348,
                            "name": "_liquidityCap",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8344,
                            "src": "29578:13:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "29563:28:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 8350,
                        "nodeType": "ExpressionStatement",
                        "src": "29563:28:39"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 8352,
                              "name": "_liquidityCap",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8344,
                              "src": "29618:13:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 8351,
                            "name": "LiquidityCapSet",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6761,
                            "src": "29602:15:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 8353,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "29602:30:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 8354,
                        "nodeType": "EmitStatement",
                        "src": "29597:35:39"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 8356,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_setLiquidityCap",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8345,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8344,
                        "mutability": "mutable",
                        "name": "_liquidityCap",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8356,
                        "src": "29525:21:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8343,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "29525:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "29524:23:39"
                  },
                  "returnParameters": {
                    "id": 8346,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "29557:0:39"
                  },
                  "scope": 8751,
                  "src": "29499:138:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 8383,
                    "nodeType": "Block",
                    "src": "29894:184:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                                "typeString": "contract TokenControllerInterface"
                              },
                              "id": 8369,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 8365,
                                    "name": "_controlledToken",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8359,
                                    "src": "29908:16:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                      "typeString": "contract ControlledTokenInterface"
                                    }
                                  },
                                  "id": 8366,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "controller",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 15823,
                                  "src": "29908:27:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_view$__$returns$_t_contract$_TokenControllerInterface_$16206_$",
                                    "typeString": "function () view external returns (contract TokenControllerInterface)"
                                  }
                                },
                                "id": 8367,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "29908:29:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                                  "typeString": "contract TokenControllerInterface"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 8368,
                                "name": "this",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -28,
                                "src": "29941:4:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_PrizePool_$8751",
                                  "typeString": "contract PrizePool"
                                }
                              },
                              "src": "29908:37:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5072697a65506f6f6c2f746f6b656e2d6374726c722d6d69736d61746368",
                              "id": 8370,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "29947:32:39",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_bd05bd21faf575ecdcdc9def072b7c62261dcad5fb5b2a6ba8ae541bff376745",
                                "typeString": "literal_string \"PrizePool/token-ctrlr-mismatch\""
                              },
                              "value": "PrizePool/token-ctrlr-mismatch"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_bd05bd21faf575ecdcdc9def072b7c62261dcad5fb5b2a6ba8ae541bff376745",
                                "typeString": "literal_string \"PrizePool/token-ctrlr-mismatch\""
                              }
                            ],
                            "id": 8364,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "29900:7:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 8371,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "29900:80:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 8372,
                        "nodeType": "ExpressionStatement",
                        "src": "29900:80:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 8377,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 8373,
                              "name": "_tokens",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 6821,
                              "src": "29991:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_storage",
                                "typeString": "contract ControlledTokenInterface[] storage ref"
                              }
                            },
                            "id": 8375,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 8374,
                              "name": "index",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8361,
                              "src": "29999:5:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "29991:14:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                              "typeString": "contract ControlledTokenInterface"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 8376,
                            "name": "_controlledToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8359,
                            "src": "30008:16:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                              "typeString": "contract ControlledTokenInterface"
                            }
                          },
                          "src": "29991:33:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                            "typeString": "contract ControlledTokenInterface"
                          }
                        },
                        "id": 8378,
                        "nodeType": "ExpressionStatement",
                        "src": "29991:33:39"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 8380,
                              "name": "_controlledToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8359,
                              "src": "30056:16:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                "typeString": "contract ControlledTokenInterface"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                "typeString": "contract ControlledTokenInterface"
                              }
                            ],
                            "id": 8379,
                            "name": "ControlledTokenAdded",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6676,
                            "src": "30035:20:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_contract$_ControlledTokenInterface_$15850_$returns$__$",
                              "typeString": "function (contract ControlledTokenInterface)"
                            }
                          },
                          "id": 8381,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "30035:38:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 8382,
                        "nodeType": "EmitStatement",
                        "src": "30030:43:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8357,
                    "nodeType": "StructuredDocumentation",
                    "src": "29641:154:39",
                    "text": "@notice Adds a new controlled token\n @param _controlledToken The controlled token to add.\n @param index The index to add the controlledToken"
                  },
                  "id": 8384,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_addControlledToken",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8362,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8359,
                        "mutability": "mutable",
                        "name": "_controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8384,
                        "src": "29827:41:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                          "typeString": "contract ControlledTokenInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 8358,
                          "name": "ControlledTokenInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 15850,
                          "src": "29827:24:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                            "typeString": "contract ControlledTokenInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8361,
                        "mutability": "mutable",
                        "name": "index",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8384,
                        "src": "29870:13:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8360,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "29870:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "29826:58:39"
                  },
                  "returnParameters": {
                    "id": 8363,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "29894:0:39"
                  },
                  "scope": 8751,
                  "src": "29798:280:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8910
                  ],
                  "body": {
                    "id": 8397,
                    "nodeType": "Block",
                    "src": "30312:44:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 8394,
                              "name": "_prizeStrategy",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8387,
                              "src": "30336:14:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                "typeString": "contract TokenListenerInterface"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                "typeString": "contract TokenListenerInterface"
                              }
                            ],
                            "id": 8393,
                            "name": "_setPrizeStrategy",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8441,
                            "src": "30318:17:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_TokenListenerInterface_$16265_$returns$__$",
                              "typeString": "function (contract TokenListenerInterface)"
                            }
                          },
                          "id": 8395,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "30318:33:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 8396,
                        "nodeType": "ExpressionStatement",
                        "src": "30318:33:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8385,
                    "nodeType": "StructuredDocumentation",
                    "src": "30082:134:39",
                    "text": "@notice Sets the prize strategy of the prize pool.  Only callable by the owner.\n @param _prizeStrategy The new prize strategy"
                  },
                  "functionSelector": "91ca480e",
                  "id": 8398,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 8391,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 8390,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "30302:9:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "30302:9:39"
                    }
                  ],
                  "name": "setPrizeStrategy",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 8389,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "30293:8:39"
                  },
                  "parameters": {
                    "id": 8388,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8387,
                        "mutability": "mutable",
                        "name": "_prizeStrategy",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8398,
                        "src": "30245:37:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                          "typeString": "contract TokenListenerInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 8386,
                          "name": "TokenListenerInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16265,
                          "src": "30245:22:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                            "typeString": "contract TokenListenerInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30244:39:39"
                  },
                  "returnParameters": {
                    "id": 8392,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "30312:0:39"
                  },
                  "scope": 8751,
                  "src": "30219:137:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 8440,
                    "nodeType": "Block",
                    "src": "30572:330:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 8413,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 8407,
                                    "name": "_prizeStrategy",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8401,
                                    "src": "30594:14:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                      "typeString": "contract TokenListenerInterface"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                      "typeString": "contract TokenListenerInterface"
                                    }
                                  ],
                                  "id": 8406,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "30586:7:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 8405,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "30586:7:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 8408,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "30586:23:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 8411,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "30621:1:39",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 8410,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "30613:7:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 8409,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "30613:7:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 8412,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "30613:10:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "30586:37:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5072697a65506f6f6c2f7072697a6553747261746567792d6e6f742d7a65726f",
                              "id": 8414,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "30625:34:39",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_26382493735482afb64e2730b659f83ec825a39efdf1dab6c392861c6866a708",
                                "typeString": "literal_string \"PrizePool/prizeStrategy-not-zero\""
                              },
                              "value": "PrizePool/prizeStrategy-not-zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_26382493735482afb64e2730b659f83ec825a39efdf1dab6c392861c6866a708",
                                "typeString": "literal_string \"PrizePool/prizeStrategy-not-zero\""
                              }
                            ],
                            "id": 8404,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "30578:7:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 8415,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "30578:82:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 8416,
                        "nodeType": "ExpressionStatement",
                        "src": "30578:82:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 8423,
                                    "name": "TokenListenerLibrary",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 16271,
                                    "src": "30716:20:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_TokenListenerLibrary_$16271_$",
                                      "typeString": "type(library TokenListenerLibrary)"
                                    }
                                  },
                                  "id": 8424,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "ERC165_INTERFACE_ID_TOKEN_LISTENER",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 16270,
                                  "src": "30716:55:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 8420,
                                      "name": "_prizeStrategy",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 8401,
                                      "src": "30682:14:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                        "typeString": "contract TokenListenerInterface"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                        "typeString": "contract TokenListenerInterface"
                                      }
                                    ],
                                    "id": 8419,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "30674:7:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 8418,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "30674:7:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 8421,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "30674:23:39",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "id": 8422,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "supportsInterface",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 665,
                                "src": "30674:41:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes4_$returns$_t_bool_$bound_to$_t_address_$",
                                  "typeString": "function (address,bytes4) view returns (bool)"
                                }
                              },
                              "id": 8425,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "30674:98:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5072697a65506f6f6c2f7072697a6553747261746567792d696e76616c6964",
                              "id": 8426,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "30774:33:39",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_696e5b5c3894dc257a5d1728751aa4c8efa3d9ec09a16756fab023077d5a4647",
                                "typeString": "literal_string \"PrizePool/prizeStrategy-invalid\""
                              },
                              "value": "PrizePool/prizeStrategy-invalid"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_696e5b5c3894dc257a5d1728751aa4c8efa3d9ec09a16756fab023077d5a4647",
                                "typeString": "literal_string \"PrizePool/prizeStrategy-invalid\""
                              }
                            ],
                            "id": 8417,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "30666:7:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 8427,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "30666:142:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 8428,
                        "nodeType": "ExpressionStatement",
                        "src": "30666:142:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 8431,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 8429,
                            "name": "prizeStrategy",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6824,
                            "src": "30814:13:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                              "typeString": "contract TokenListenerInterface"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 8430,
                            "name": "_prizeStrategy",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8401,
                            "src": "30830:14:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                              "typeString": "contract TokenListenerInterface"
                            }
                          },
                          "src": "30814:30:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                            "typeString": "contract TokenListenerInterface"
                          }
                        },
                        "id": 8432,
                        "nodeType": "ExpressionStatement",
                        "src": "30814:30:39"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 8436,
                                  "name": "_prizeStrategy",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 8401,
                                  "src": "30881:14:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                    "typeString": "contract TokenListenerInterface"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                    "typeString": "contract TokenListenerInterface"
                                  }
                                ],
                                "id": 8435,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "30873:7:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 8434,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "30873:7:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 8437,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "30873:23:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 8433,
                            "name": "PrizeStrategySet",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6775,
                            "src": "30856:16:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 8438,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "30856:41:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 8439,
                        "nodeType": "EmitStatement",
                        "src": "30851:46:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8399,
                    "nodeType": "StructuredDocumentation",
                    "src": "30360:134:39",
                    "text": "@notice Sets the prize strategy of the prize pool.  Only callable by the owner.\n @param _prizeStrategy The new prize strategy"
                  },
                  "id": 8441,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_setPrizeStrategy",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8402,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8401,
                        "mutability": "mutable",
                        "name": "_prizeStrategy",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8441,
                        "src": "30524:37:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                          "typeString": "contract TokenListenerInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 8400,
                          "name": "TokenListenerInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16265,
                          "src": "30524:22:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                            "typeString": "contract TokenListenerInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30523:39:39"
                  },
                  "returnParameters": {
                    "id": 8403,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "30572:0:39"
                  },
                  "scope": 8751,
                  "src": "30497:405:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8923
                  ],
                  "body": {
                    "id": 8451,
                    "nodeType": "Block",
                    "src": "31137:25:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 8449,
                          "name": "_tokens",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 6821,
                          "src": "31150:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_storage",
                            "typeString": "contract ControlledTokenInterface[] storage ref"
                          }
                        },
                        "functionReturnParameters": 8448,
                        "id": 8450,
                        "nodeType": "Return",
                        "src": "31143:14:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8442,
                    "nodeType": "StructuredDocumentation",
                    "src": "30906:143:39",
                    "text": "@notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\n @return An array of controlled token addresses"
                  },
                  "functionSelector": "9d63848a",
                  "id": 8452,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "tokens",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 8444,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "31079:8:39"
                  },
                  "parameters": {
                    "id": 8443,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "31067:2:39"
                  },
                  "returnParameters": {
                    "id": 8448,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8447,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8452,
                        "src": "31102:33:39",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                          "typeString": "contract ControlledTokenInterface[]"
                        },
                        "typeName": {
                          "baseType": {
                            "contractScope": null,
                            "id": 8445,
                            "name": "ControlledTokenInterface",
                            "nodeType": "UserDefinedTypeName",
                            "referencedDeclaration": 15850,
                            "src": "31102:24:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                              "typeString": "contract ControlledTokenInterface"
                            }
                          },
                          "id": 8446,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "31102:26:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_storage_ptr",
                            "typeString": "contract ControlledTokenInterface[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "31101:35:39"
                  },
                  "scope": 8751,
                  "src": "31052:110:39",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 8461,
                    "nodeType": "Block",
                    "src": "31348:33:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 8458,
                            "name": "block",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -4,
                            "src": "31361:5:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_block",
                              "typeString": "block"
                            }
                          },
                          "id": 8459,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "timestamp",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "31361:15:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 8457,
                        "id": 8460,
                        "nodeType": "Return",
                        "src": "31354:22:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8453,
                    "nodeType": "StructuredDocumentation",
                    "src": "31166:115:39",
                    "text": "@dev Gets the current time as represented by the current block\n @return The timestamp of the current block"
                  },
                  "id": 8462,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_currentTime",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8454,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "31305:2:39"
                  },
                  "returnParameters": {
                    "id": 8457,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8456,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8462,
                        "src": "31339:7:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8455,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "31339:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "31338:9:39"
                  },
                  "scope": 8751,
                  "src": "31284:97:39",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8929
                  ],
                  "body": {
                    "id": 8472,
                    "nodeType": "Block",
                    "src": "31549:37:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 8469,
                            "name": "_tokenTotalSupply",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8570,
                            "src": "31562:17:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                              "typeString": "function () view returns (uint256)"
                            }
                          },
                          "id": 8470,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "31562:19:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 8468,
                        "id": 8471,
                        "nodeType": "Return",
                        "src": "31555:26:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8463,
                    "nodeType": "StructuredDocumentation",
                    "src": "31385:92:39",
                    "text": "@notice The total of all controlled tokens\n @return The current total of all tokens"
                  },
                  "functionSelector": "0937eb54",
                  "id": 8473,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "accountedBalance",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 8465,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "31517:8:39"
                  },
                  "parameters": {
                    "id": 8464,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "31505:2:39"
                  },
                  "returnParameters": {
                    "id": 8468,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8467,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8473,
                        "src": "31540:7:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8466,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "31540:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "31539:9:39"
                  },
                  "scope": 8751,
                  "src": "31480:106:39",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 8500,
                    "nodeType": "Block",
                    "src": "31888:89:39",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 8491,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 8487,
                                    "name": "this",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -28,
                                    "src": "31925:4:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_PrizePool_$8751",
                                      "typeString": "contract PrizePool"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_PrizePool_$8751",
                                      "typeString": "contract PrizePool"
                                    }
                                  ],
                                  "id": 8486,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "31917:7:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 8485,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "31917:7:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 8488,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "31917:13:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 8483,
                                "name": "compLike",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8476,
                                "src": "31898:8:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_ICompLike_$6529",
                                  "typeString": "contract ICompLike"
                                }
                              },
                              "id": 8484,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "balanceOf",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1899,
                              "src": "31898:18:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                "typeString": "function (address) view external returns (uint256)"
                              }
                            },
                            "id": 8489,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "31898:33:39",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 8490,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "31934:1:39",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "31898:37:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 8499,
                        "nodeType": "IfStatement",
                        "src": "31894:79:39",
                        "trueBody": {
                          "id": 8498,
                          "nodeType": "Block",
                          "src": "31937:36:39",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 8495,
                                    "name": "to",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8478,
                                    "src": "31963:2:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 8492,
                                    "name": "compLike",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8476,
                                    "src": "31945:8:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_ICompLike_$6529",
                                      "typeString": "contract ICompLike"
                                    }
                                  },
                                  "id": 8494,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "delegate",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 6528,
                                  "src": "31945:17:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_address_$returns$__$",
                                    "typeString": "function (address) external"
                                  }
                                },
                                "id": 8496,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "31945:21:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 8497,
                              "nodeType": "ExpressionStatement",
                              "src": "31945:21:39"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8474,
                    "nodeType": "StructuredDocumentation",
                    "src": "31590:218:39",
                    "text": "@notice Delegate the votes for a Compound COMP-like token held by the prize pool\n @param compLike The COMP-like token held by the prize pool that should be delegated\n @param to The address to delegate to "
                  },
                  "functionSelector": "2f7627e3",
                  "id": 8501,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 8481,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 8480,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "31878:9:39",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "31878:9:39"
                    }
                  ],
                  "name": "compLikeDelegate",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8479,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8476,
                        "mutability": "mutable",
                        "name": "compLike",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8501,
                        "src": "31837:18:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ICompLike_$6529",
                          "typeString": "contract ICompLike"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 8475,
                          "name": "ICompLike",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 6529,
                          "src": "31837:9:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ICompLike_$6529",
                            "typeString": "contract ICompLike"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8478,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8501,
                        "src": "31857:10:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8477,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "31857:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "31836:32:39"
                  },
                  "returnParameters": {
                    "id": 8482,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "31888:0:39"
                  },
                  "scope": 8751,
                  "src": "31811:166:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    3221
                  ],
                  "body": {
                    "id": 8520,
                    "nodeType": "Block",
                    "src": "32428:70:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 8516,
                              "name": "IERC721ReceiverUpgradeable",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3222,
                              "src": "32441:26:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_IERC721ReceiverUpgradeable_$3222_$",
                                "typeString": "type(contract IERC721ReceiverUpgradeable)"
                              }
                            },
                            "id": 8517,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "memberName": "onERC721Received",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 3221,
                            "src": "32441:43:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_declaration_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_bytes_calldata_ptr_$returns$_t_bytes4_$",
                              "typeString": "function IERC721ReceiverUpgradeable.onERC721Received(address,address,uint256,bytes calldata) returns (bytes4)"
                            }
                          },
                          "id": 8518,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "memberName": "selector",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "32441:52:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes4",
                            "typeString": "bytes4"
                          }
                        },
                        "functionReturnParameters": 8515,
                        "id": 8519,
                        "nodeType": "Return",
                        "src": "32434:59:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8502,
                    "nodeType": "StructuredDocumentation",
                    "src": "31983:312:39",
                    "text": "@notice Required for ERC721 safe token transfers from smart contracts.\n @param operator The address that acts on behalf of the owner\n @param from The current owner of the NFT\n @param tokenId The NFT to transfer\n @param data Additional data with no specified format, sent in call to `_to`."
                  },
                  "functionSelector": "150b7a02",
                  "id": 8521,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "onERC721Received",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 8512,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "32403:8:39"
                  },
                  "parameters": {
                    "id": 8511,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8504,
                        "mutability": "mutable",
                        "name": "operator",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8521,
                        "src": "32324:16:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8503,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "32324:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8506,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8521,
                        "src": "32342:12:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8505,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "32342:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8508,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8521,
                        "src": "32356:15:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8507,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "32356:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8510,
                        "mutability": "mutable",
                        "name": "data",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8521,
                        "src": "32373:19:39",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 8509,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "32373:5:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "32323:70:39"
                  },
                  "returnParameters": {
                    "id": 8515,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8514,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8521,
                        "src": "32421:6:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        },
                        "typeName": {
                          "id": 8513,
                          "name": "bytes4",
                          "nodeType": "ElementaryTypeName",
                          "src": "32421:6:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes4",
                            "typeString": "bytes4"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "32420:8:39"
                  },
                  "scope": 8751,
                  "src": "32298:200:39",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 8569,
                    "nodeType": "Block",
                    "src": "32658:300:39",
                    "statements": [
                      {
                        "assignments": [
                          8528
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 8528,
                            "mutability": "mutable",
                            "name": "total",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 8569,
                            "src": "32664:13:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 8527,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "32664:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 8530,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 8529,
                          "name": "reserveTotalSupply",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 6830,
                          "src": "32680:18:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "32664:34:39"
                      },
                      {
                        "assignments": [
                          8534
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 8534,
                            "mutability": "mutable",
                            "name": "tokens",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 8569,
                            "src": "32704:40:39",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                              "typeString": "contract ControlledTokenInterface[]"
                            },
                            "typeName": {
                              "baseType": {
                                "contractScope": null,
                                "id": 8532,
                                "name": "ControlledTokenInterface",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 15850,
                                "src": "32704:24:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                  "typeString": "contract ControlledTokenInterface"
                                }
                              },
                              "id": 8533,
                              "length": null,
                              "nodeType": "ArrayTypeName",
                              "src": "32704:26:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_storage_ptr",
                                "typeString": "contract ControlledTokenInterface[]"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 8536,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 8535,
                          "name": "_tokens",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 6821,
                          "src": "32747:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_storage",
                            "typeString": "contract ControlledTokenInterface[] storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "32704:50:39"
                      },
                      {
                        "assignments": [
                          8538
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 8538,
                            "mutability": "mutable",
                            "name": "tokensLength",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 8569,
                            "src": "32771:20:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 8537,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "32771:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 8541,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 8539,
                            "name": "tokens",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8534,
                            "src": "32794:6:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                              "typeString": "contract ControlledTokenInterface[] memory"
                            }
                          },
                          "id": 8540,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "32794:13:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "32771:36:39"
                      },
                      {
                        "body": {
                          "id": 8565,
                          "nodeType": "Block",
                          "src": "32859:76:39",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 8563,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 8552,
                                  "name": "total",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 8528,
                                  "src": "32867:5:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [],
                                      "expression": {
                                        "argumentTypes": [],
                                        "expression": {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "baseExpression": {
                                                "argumentTypes": null,
                                                "id": 8556,
                                                "name": "tokens",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8534,
                                                "src": "32903:6:39",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                                                  "typeString": "contract ControlledTokenInterface[] memory"
                                                }
                                              },
                                              "id": 8558,
                                              "indexExpression": {
                                                "argumentTypes": null,
                                                "id": 8557,
                                                "name": "i",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 8543,
                                                "src": "32910:1:39",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "isConstant": false,
                                              "isLValue": true,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "nodeType": "IndexAccess",
                                              "src": "32903:9:39",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                                "typeString": "contract ControlledTokenInterface"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                                "typeString": "contract ControlledTokenInterface"
                                              }
                                            ],
                                            "id": 8555,
                                            "name": "IERC20Upgradeable",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 1960,
                                            "src": "32885:17:39",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_contract$_IERC20Upgradeable_$1960_$",
                                              "typeString": "type(contract IERC20Upgradeable)"
                                            }
                                          },
                                          "id": 8559,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "typeConversion",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "32885:28:39",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                            "typeString": "contract IERC20Upgradeable"
                                          }
                                        },
                                        "id": 8560,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "totalSupply",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 1891,
                                        "src": "32885:40:39",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
                                          "typeString": "function () view external returns (uint256)"
                                        }
                                      },
                                      "id": 8561,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "32885:42:39",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 8553,
                                      "name": "total",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 8528,
                                      "src": "32875:5:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 8554,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "add",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1113,
                                    "src": "32875:9:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 8562,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "32875:53:39",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "32867:61:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 8564,
                              "nodeType": "ExpressionStatement",
                              "src": "32867:61:39"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 8548,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 8546,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8543,
                            "src": "32837:1:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 8547,
                            "name": "tokensLength",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8538,
                            "src": "32841:12:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "32837:16:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 8566,
                        "initializationExpression": {
                          "assignments": [
                            8543
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 8543,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 8566,
                              "src": "32822:9:39",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 8542,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "32822:7:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 8545,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 8544,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "32834:1:39",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "32822:13:39"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 8550,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "32855:3:39",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 8549,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8543,
                              "src": "32855:1:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 8551,
                          "nodeType": "ExpressionStatement",
                          "src": "32855:3:39"
                        },
                        "nodeType": "ForStatement",
                        "src": "32818:117:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 8567,
                          "name": "total",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 8528,
                          "src": "32948:5:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 8526,
                        "id": 8568,
                        "nodeType": "Return",
                        "src": "32941:12:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8522,
                    "nodeType": "StructuredDocumentation",
                    "src": "32502:92:39",
                    "text": "@notice The total of all controlled tokens\n @return The current total of all tokens"
                  },
                  "id": 8570,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_tokenTotalSupply",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8523,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "32623:2:39"
                  },
                  "returnParameters": {
                    "id": 8526,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8525,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8570,
                        "src": "32649:7:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8524,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "32649:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "32648:9:39"
                  },
                  "scope": 8751,
                  "src": "32597:361:39",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 8591,
                    "nodeType": "Block",
                    "src": "33275:117:39",
                    "statements": [
                      {
                        "assignments": [
                          8579
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 8579,
                            "mutability": "mutable",
                            "name": "tokenTotalSupply",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 8591,
                            "src": "33281:24:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 8578,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "33281:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 8582,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 8580,
                            "name": "_tokenTotalSupply",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8570,
                            "src": "33308:17:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                              "typeString": "function () view returns (uint256)"
                            }
                          },
                          "id": 8581,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "33308:19:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "33281:46:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 8588,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 8585,
                                    "name": "_amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8573,
                                    "src": "33362:7:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 8583,
                                    "name": "tokenTotalSupply",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8579,
                                    "src": "33341:16:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 8584,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "add",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1113,
                                  "src": "33341:20:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256,uint256) pure returns (uint256)"
                                  }
                                },
                                "id": 8586,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "33341:29:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 8587,
                                "name": "liquidityCap",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6833,
                                "src": "33374:12:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "33341:45:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "id": 8589,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "33340:47:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 8577,
                        "id": 8590,
                        "nodeType": "Return",
                        "src": "33333:54:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8571,
                    "nodeType": "StructuredDocumentation",
                    "src": "32962:238:39",
                    "text": "@dev Checks if the Prize Pool can receive liquidity based on the current cap\n @param _amount The amount of liquidity to be added to the Prize Pool\n @return True if the Prize Pool can receive the specified amount of liquidity"
                  },
                  "id": 8592,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_canAddLiquidity",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8574,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8573,
                        "mutability": "mutable",
                        "name": "_amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8592,
                        "src": "33229:15:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8572,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "33229:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33228:17:39"
                  },
                  "returnParameters": {
                    "id": 8577,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8576,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8592,
                        "src": "33269:4:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 8575,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "33269:4:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33268:6:39"
                  },
                  "scope": 8751,
                  "src": "33203:189:39",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 8633,
                    "nodeType": "Block",
                    "src": "33694:237:39",
                    "statements": [
                      {
                        "assignments": [
                          8603
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 8603,
                            "mutability": "mutable",
                            "name": "tokens",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 8633,
                            "src": "33700:40:39",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                              "typeString": "contract ControlledTokenInterface[]"
                            },
                            "typeName": {
                              "baseType": {
                                "contractScope": null,
                                "id": 8601,
                                "name": "ControlledTokenInterface",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 15850,
                                "src": "33700:24:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                  "typeString": "contract ControlledTokenInterface"
                                }
                              },
                              "id": 8602,
                              "length": null,
                              "nodeType": "ArrayTypeName",
                              "src": "33700:26:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_storage_ptr",
                                "typeString": "contract ControlledTokenInterface[]"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 8605,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 8604,
                          "name": "_tokens",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 6821,
                          "src": "33743:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_storage",
                            "typeString": "contract ControlledTokenInterface[] storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "33700:50:39"
                      },
                      {
                        "assignments": [
                          8607
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 8607,
                            "mutability": "mutable",
                            "name": "tokensLength",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 8633,
                            "src": "33765:20:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 8606,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "33765:7:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 8610,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 8608,
                            "name": "tokens",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8603,
                            "src": "33788:6:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                              "typeString": "contract ControlledTokenInterface[] memory"
                            }
                          },
                          "id": 8609,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "33788:13:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "33765:36:39"
                      },
                      {
                        "body": {
                          "id": 8629,
                          "nodeType": "Block",
                          "src": "33850:59:39",
                          "statements": [
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                  "typeString": "contract ControlledTokenInterface"
                                },
                                "id": 8625,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 8621,
                                    "name": "tokens",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8603,
                                    "src": "33861:6:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                                      "typeString": "contract ControlledTokenInterface[] memory"
                                    }
                                  },
                                  "id": 8623,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 8622,
                                    "name": "i",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8612,
                                    "src": "33868:1:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "33861:9:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                    "typeString": "contract ControlledTokenInterface"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 8624,
                                  "name": "controlledToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 8595,
                                  "src": "33874:15:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                    "typeString": "contract ControlledTokenInterface"
                                  }
                                },
                                "src": "33861:28:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 8628,
                              "nodeType": "IfStatement",
                              "src": "33858:44:39",
                              "trueBody": {
                                "expression": {
                                  "argumentTypes": null,
                                  "hexValue": "74727565",
                                  "id": 8626,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "bool",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "33898:4:39",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  "value": "true"
                                },
                                "functionReturnParameters": 8599,
                                "id": 8627,
                                "nodeType": "Return",
                                "src": "33891:11:39"
                              }
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 8617,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 8615,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8612,
                            "src": "33827:1:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 8616,
                            "name": "tokensLength",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8607,
                            "src": "33831:12:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "33827:16:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 8630,
                        "initializationExpression": {
                          "assignments": [
                            8612
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 8612,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 8630,
                              "src": "33812:9:39",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 8611,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "33812:7:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 8614,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 8613,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "33824:1:39",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "33812:13:39"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 8619,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "33845:3:39",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 8618,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8612,
                              "src": "33845:1:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 8620,
                          "nodeType": "ExpressionStatement",
                          "src": "33845:3:39"
                        },
                        "nodeType": "ForStatement",
                        "src": "33808:101:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "66616c7365",
                          "id": 8631,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "33921:5:39",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "false"
                        },
                        "functionReturnParameters": 8599,
                        "id": 8632,
                        "nodeType": "Return",
                        "src": "33914:12:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8593,
                    "nodeType": "StructuredDocumentation",
                    "src": "33396:201:39",
                    "text": "@dev Checks if a specific token is controlled by the Prize Pool\n @param controlledToken The address of the token to check\n @return True if the token is a controlled token, false otherwise"
                  },
                  "id": 8634,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_isControlled",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8596,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8595,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8634,
                        "src": "33623:40:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                          "typeString": "contract ControlledTokenInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 8594,
                          "name": "ControlledTokenInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 15850,
                          "src": "33623:24:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                            "typeString": "contract ControlledTokenInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33622:42:39"
                  },
                  "returnParameters": {
                    "id": 8599,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8598,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8634,
                        "src": "33688:4:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 8597,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "33688:4:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33687:6:39"
                  },
                  "scope": 8751,
                  "src": "33600:331:39",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 8646,
                    "nodeType": "Block",
                    "src": "34234:48:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 8643,
                              "name": "controlledToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8637,
                              "src": "34261:15:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                "typeString": "contract ControlledTokenInterface"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                "typeString": "contract ControlledTokenInterface"
                              }
                            ],
                            "id": 8642,
                            "name": "_isControlled",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8634,
                            "src": "34247:13:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_contract$_ControlledTokenInterface_$15850_$returns$_t_bool_$",
                              "typeString": "function (contract ControlledTokenInterface) view returns (bool)"
                            }
                          },
                          "id": 8644,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "34247:30:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 8641,
                        "id": 8645,
                        "nodeType": "Return",
                        "src": "34240:37:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8635,
                    "nodeType": "StructuredDocumentation",
                    "src": "33937:201:39",
                    "text": "@dev Checks if a specific token is controlled by the Prize Pool\n @param controlledToken The address of the token to check\n @return True if the token is a controlled token, false otherwise"
                  },
                  "functionSelector": "78b3d327",
                  "id": 8647,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "isControlled",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8638,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8637,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8647,
                        "src": "34163:40:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                          "typeString": "contract ControlledTokenInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 8636,
                          "name": "ControlledTokenInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 15850,
                          "src": "34163:24:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                            "typeString": "contract ControlledTokenInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "34162:42:39"
                  },
                  "returnParameters": {
                    "id": 8641,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8640,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8647,
                        "src": "34228:4:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 8639,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "34228:4:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "34227:6:39"
                  },
                  "scope": 8751,
                  "src": "34141:141:39",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 8648,
                    "nodeType": "StructuredDocumentation",
                    "src": "34286:398:39",
                    "text": "@notice Determines whether the passed token can be transferred out as an external award.\n @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\n prize strategy should not be allowed to move those tokens.\n @param _externalToken The address of the token to check\n @return True if the token may be awarded, false otherwise"
                  },
                  "id": 8655,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_canAwardExternal",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8651,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8650,
                        "mutability": "mutable",
                        "name": "_externalToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8655,
                        "src": "34714:22:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8649,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "34714:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "34713:24:39"
                  },
                  "returnParameters": {
                    "id": 8654,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8653,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8655,
                        "src": "34769:4:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 8652,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "34769:4:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "34768:6:39"
                  },
                  "scope": 8751,
                  "src": "34687:88:39",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 8656,
                    "nodeType": "StructuredDocumentation",
                    "src": "34779:96:39",
                    "text": "@notice Returns the ERC20 asset token used for deposits.\n @return The ERC20 asset token"
                  },
                  "id": 8661,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_token",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8657,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "34893:2:39"
                  },
                  "returnParameters": {
                    "id": 8660,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8659,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8661,
                        "src": "34927:17:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 8658,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "34927:17:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "34926:19:39"
                  },
                  "scope": 8751,
                  "src": "34878:68:39",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 8662,
                    "nodeType": "StructuredDocumentation",
                    "src": "34950:151:39",
                    "text": "@notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\n @return The underlying balance of asset tokens"
                  },
                  "id": 8667,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_balance",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8663,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "35121:2:39"
                  },
                  "returnParameters": {
                    "id": 8666,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8665,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8667,
                        "src": "35150:7:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8664,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "35150:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "35149:9:39"
                  },
                  "scope": 8751,
                  "src": "35104:55:39",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 8668,
                    "nodeType": "StructuredDocumentation",
                    "src": "35163:120:39",
                    "text": "@notice Supplies asset tokens to the yield source.\n @param mintAmount The amount of asset tokens to be supplied"
                  },
                  "id": 8673,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_supply",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8671,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8670,
                        "mutability": "mutable",
                        "name": "mintAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8673,
                        "src": "35303:18:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8669,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "35303:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "35302:20:39"
                  },
                  "returnParameters": {
                    "id": 8672,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "35339:0:39"
                  },
                  "scope": 8751,
                  "src": "35286:54:39",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 8674,
                    "nodeType": "StructuredDocumentation",
                    "src": "35344:193:39",
                    "text": "@notice Redeems asset tokens from the yield source.\n @param redeemAmount The amount of yield-bearing tokens to be redeemed\n @return The actual amount of tokens that were redeemed."
                  },
                  "id": 8681,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_redeem",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8677,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8676,
                        "mutability": "mutable",
                        "name": "redeemAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8681,
                        "src": "35557:20:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8675,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "35557:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "35556:22:39"
                  },
                  "returnParameters": {
                    "id": 8680,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8679,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8681,
                        "src": "35605:7:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8678,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "35605:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "35604:9:39"
                  },
                  "scope": 8751,
                  "src": "35540:74:39",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 8696,
                    "nodeType": "Block",
                    "src": "35819:110:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 8689,
                                      "name": "controlledToken",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 8684,
                                      "src": "35872:15:39",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    ],
                                    "id": 8688,
                                    "name": "ControlledTokenInterface",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 15850,
                                    "src": "35847:24:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_ControlledTokenInterface_$15850_$",
                                      "typeString": "type(contract ControlledTokenInterface)"
                                    }
                                  },
                                  "id": 8690,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "35847:41:39",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                    "typeString": "contract ControlledTokenInterface"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                    "typeString": "contract ControlledTokenInterface"
                                  }
                                ],
                                "id": 8687,
                                "name": "_isControlled",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8634,
                                "src": "35833:13:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_contract$_ControlledTokenInterface_$15850_$returns$_t_bool_$",
                                  "typeString": "function (contract ControlledTokenInterface) view returns (bool)"
                                }
                              },
                              "id": 8691,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "35833:56:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5072697a65506f6f6c2f756e6b6e6f776e2d746f6b656e",
                              "id": 8692,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "35891:25:39",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_7c5b8b64fb4f5ce2b72aad0bd734868d94aa87f7d990295d759e84051da2e9b5",
                                "typeString": "literal_string \"PrizePool/unknown-token\""
                              },
                              "value": "PrizePool/unknown-token"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_7c5b8b64fb4f5ce2b72aad0bd734868d94aa87f7d990295d759e84051da2e9b5",
                                "typeString": "literal_string \"PrizePool/unknown-token\""
                              }
                            ],
                            "id": 8686,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "35825:7:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 8693,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "35825:92:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 8694,
                        "nodeType": "ExpressionStatement",
                        "src": "35825:92:39"
                      },
                      {
                        "id": 8695,
                        "nodeType": "PlaceholderStatement",
                        "src": "35923:1:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8682,
                    "nodeType": "StructuredDocumentation",
                    "src": "35618:144:39",
                    "text": "@dev Function modifier to ensure usage of tokens controlled by the Prize Pool\n @param controlledToken The address of the token to check"
                  },
                  "id": 8697,
                  "name": "onlyControlledToken",
                  "nodeType": "ModifierDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8685,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8684,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8697,
                        "src": "35794:23:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8683,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "35794:7:39",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "35793:25:39"
                  },
                  "src": "35765:164:39",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 8712,
                    "nodeType": "Block",
                    "src": "36030:97:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 8707,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "id": 8701,
                                  "name": "_msgSender",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3611,
                                  "src": "36044:10:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                    "typeString": "function () view returns (address payable)"
                                  }
                                },
                                "id": 8702,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "36044:12:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 8705,
                                    "name": "prizeStrategy",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 6824,
                                    "src": "36068:13:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                      "typeString": "contract TokenListenerInterface"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                      "typeString": "contract TokenListenerInterface"
                                    }
                                  ],
                                  "id": 8704,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "36060:7:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 8703,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "36060:7:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 8706,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "36060:22:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "src": "36044:38:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5072697a65506f6f6c2f6f6e6c792d7072697a655374726174656779",
                              "id": 8708,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "36084:30:39",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_2fbc253d0606e293128a98dd182d0059517715f8bf709aa69f3e693de4f6b3e8",
                                "typeString": "literal_string \"PrizePool/only-prizeStrategy\""
                              },
                              "value": "PrizePool/only-prizeStrategy"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_2fbc253d0606e293128a98dd182d0059517715f8bf709aa69f3e693de4f6b3e8",
                                "typeString": "literal_string \"PrizePool/only-prizeStrategy\""
                              }
                            ],
                            "id": 8700,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "36036:7:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 8709,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "36036:79:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 8710,
                        "nodeType": "ExpressionStatement",
                        "src": "36036:79:39"
                      },
                      {
                        "id": 8711,
                        "nodeType": "PlaceholderStatement",
                        "src": "36121:1:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8698,
                    "nodeType": "StructuredDocumentation",
                    "src": "35933:65:39",
                    "text": "@dev Function modifier to ensure caller is the prize-strategy"
                  },
                  "id": 8713,
                  "name": "onlyPrizeStrategy",
                  "nodeType": "ModifierDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8699,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "36027:2:39"
                  },
                  "src": "36001:126:39",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 8726,
                    "nodeType": "Block",
                    "src": "36274:87:39",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 8720,
                                  "name": "_amount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 8716,
                                  "src": "36305:7:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 8719,
                                "name": "_canAddLiquidity",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8592,
                                "src": "36288:16:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_bool_$",
                                  "typeString": "function (uint256) view returns (bool)"
                                }
                              },
                              "id": 8721,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "36288:25:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5072697a65506f6f6c2f657863656564732d6c69717569646974792d636170",
                              "id": 8722,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "36315:33:39",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_f5408887fc5db7609075b1b033c7b9771809273c478e7d6375044008d48f0752",
                                "typeString": "literal_string \"PrizePool/exceeds-liquidity-cap\""
                              },
                              "value": "PrizePool/exceeds-liquidity-cap"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_f5408887fc5db7609075b1b033c7b9771809273c478e7d6375044008d48f0752",
                                "typeString": "literal_string \"PrizePool/exceeds-liquidity-cap\""
                              }
                            ],
                            "id": 8718,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "36280:7:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 8723,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "36280:69:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 8724,
                        "nodeType": "ExpressionStatement",
                        "src": "36280:69:39"
                      },
                      {
                        "id": 8725,
                        "nodeType": "PlaceholderStatement",
                        "src": "36355:1:39"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8714,
                    "nodeType": "StructuredDocumentation",
                    "src": "36131:98:39",
                    "text": "@dev Function modifier to ensure the deposit amount does not exceed the liquidity cap (if set)"
                  },
                  "id": 8727,
                  "name": "canAddLiquidity",
                  "nodeType": "ModifierDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8717,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8716,
                        "mutability": "mutable",
                        "name": "_amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8727,
                        "src": "36257:15:39",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8715,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "36257:7:39",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "36256:17:39"
                  },
                  "src": "36232:129:39",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 8749,
                    "nodeType": "Block",
                    "src": "36388:158:39",
                    "statements": [
                      {
                        "assignments": [
                          8730
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 8730,
                            "mutability": "mutable",
                            "name": "reserve",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 8749,
                            "src": "36394:24:39",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ReserveInterface_$12539",
                              "typeString": "contract ReserveInterface"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 8729,
                              "name": "ReserveInterface",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 12539,
                              "src": "36394:16:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ReserveInterface_$12539",
                                "typeString": "contract ReserveInterface"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 8736,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 8732,
                                  "name": "reserveRegistry",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 6817,
                                  "src": "36438:15:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                                    "typeString": "contract RegistryInterface"
                                  }
                                },
                                "id": 8733,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "lookup",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 12457,
                                "src": "36438:22:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_view$__$returns$_t_address_$",
                                  "typeString": "function () view external returns (address)"
                                }
                              },
                              "id": 8734,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "36438:24:39",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 8731,
                            "name": "ReserveInterface",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12539,
                            "src": "36421:16:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_ReserveInterface_$12539_$",
                              "typeString": "type(contract ReserveInterface)"
                            }
                          },
                          "id": 8735,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "36421:42:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ReserveInterface_$12539",
                            "typeString": "contract ReserveInterface"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "36394:69:39"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 8744,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 8740,
                                    "name": "reserve",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8730,
                                    "src": "36485:7:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_ReserveInterface_$12539",
                                      "typeString": "contract ReserveInterface"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_ReserveInterface_$12539",
                                      "typeString": "contract ReserveInterface"
                                    }
                                  ],
                                  "id": 8739,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "36477:7:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 8738,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "36477:7:39",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 8741,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "36477:16:39",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 8742,
                                  "name": "msg",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -15,
                                  "src": "36497:3:39",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_message",
                                    "typeString": "msg"
                                  }
                                },
                                "id": 8743,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sender",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "36497:10:39",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "36477:30:39",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5072697a65506f6f6c2f6f6e6c792d72657365727665",
                              "id": 8745,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "36509:24:39",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_f43906361d235c646f1c98ade3e3054b347f5e2c03f33ee5254624b739ce180f",
                                "typeString": "literal_string \"PrizePool/only-reserve\""
                              },
                              "value": "PrizePool/only-reserve"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_f43906361d235c646f1c98ade3e3054b347f5e2c03f33ee5254624b739ce180f",
                                "typeString": "literal_string \"PrizePool/only-reserve\""
                              }
                            ],
                            "id": 8737,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "36469:7:39",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 8746,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "36469:65:39",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 8747,
                        "nodeType": "ExpressionStatement",
                        "src": "36469:65:39"
                      },
                      {
                        "id": 8748,
                        "nodeType": "PlaceholderStatement",
                        "src": "36540:1:39"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 8750,
                  "name": "onlyReserve",
                  "nodeType": "ModifierDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8728,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "36385:2:39"
                  },
                  "src": "36365:181:39",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 8752,
              "src": "1499:35049:39"
            }
          ],
          "src": "37:36512:39"
        },
        "id": 39
      },
      "contracts/prize-pool/PrizePoolInterface.sol": {
        "ast": {
          "absolutePath": "contracts/prize-pool/PrizePoolInterface.sol",
          "exportedSymbols": {
            "PrizePoolInterface": [
              8930
            ]
          },
          "id": 8931,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 8753,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:40"
            },
            {
              "absolutePath": "contracts/token/TokenListenerInterface.sol",
              "file": "../token/TokenListenerInterface.sol",
              "id": 8754,
              "nodeType": "ImportDirective",
              "scope": 8931,
              "sourceUnit": 16266,
              "src": "62:45:40",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/token/ControlledTokenInterface.sol",
              "file": "../token/ControlledTokenInterface.sol",
              "id": 8755,
              "nodeType": "ImportDirective",
              "scope": 8931,
              "sourceUnit": 15851,
              "src": "108:47:40",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": {
                "id": 8756,
                "nodeType": "StructuredDocumentation",
                "src": "157:406:40",
                "text": "@title Escrows assets and deposits them into a yield source.  Exposes interest to Prize Strategy.  Users deposit and withdraw from this contract to participate in Prize Pool.\n @notice Accounting is managed using Controlled Tokens, whose mint and burn functions can only be called by this contract.\n @dev Must be inherited to provide specific yield-bearing asset control, such as Compound cTokens"
              },
              "fullyImplemented": false,
              "id": 8930,
              "linearizedBaseContracts": [
                8930
              ],
              "name": "PrizePoolInterface",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 8757,
                    "nodeType": "StructuredDocumentation",
                    "src": "597:315:40",
                    "text": "@notice Deposit assets into the Prize Pool in exchange for tokens\n @param to The address receiving the newly minted tokens\n @param amount The amount of assets to deposit\n @param controlledToken The address of the type of token the user is minting\n @param referrer The referrer of the deposit"
                  },
                  "functionSelector": "e323f825",
                  "id": 8768,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "depositTo",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8766,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8759,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8768,
                        "src": "939:10:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8758,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "939:7:40",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8761,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8768,
                        "src": "955:14:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8760,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "955:7:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8763,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8768,
                        "src": "975:23:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8762,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "975:7:40",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8765,
                        "mutability": "mutable",
                        "name": "referrer",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8768,
                        "src": "1004:16:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8764,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1004:7:40",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "933:91:40"
                  },
                  "returnParameters": {
                    "id": 8767,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1037:0:40"
                  },
                  "scope": 8930,
                  "src": "915:123:40",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 8769,
                    "nodeType": "StructuredDocumentation",
                    "src": "1042:497:40",
                    "text": "@notice Withdraw assets from the Prize Pool instantly.  A fairness fee may be charged for an early exit.\n @param from The address to redeem tokens from.\n @param amount The amount of tokens to redeem for assets.\n @param controlledToken The address of the token to redeem (i.e. ticket or sponsorship)\n @param maximumExitFee The maximum exit fee the caller is willing to pay.  This should be pre-calculated by the calculateExitFee() fxn.\n @return The actual exit fee paid"
                  },
                  "functionSelector": "a016240b",
                  "id": 8782,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "withdrawInstantlyFrom",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8778,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8771,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8782,
                        "src": "1578:12:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8770,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1578:7:40",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8773,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8782,
                        "src": "1596:14:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8772,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1596:7:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8775,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8782,
                        "src": "1616:23:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8774,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1616:7:40",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8777,
                        "mutability": "mutable",
                        "name": "maximumExitFee",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8782,
                        "src": "1645:22:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8776,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1645:7:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1572:99:40"
                  },
                  "returnParameters": {
                    "id": 8781,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8780,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8782,
                        "src": "1690:7:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8779,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1690:7:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1689:9:40"
                  },
                  "scope": 8930,
                  "src": "1542:157:40",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "52a387ab",
                  "id": 8789,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "withdrawReserve",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8785,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8784,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8789,
                        "src": "1729:10:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8783,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1729:7:40",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1728:12:40"
                  },
                  "returnParameters": {
                    "id": 8788,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8787,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8789,
                        "src": "1759:7:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8786,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1759:7:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1758:9:40"
                  },
                  "scope": 8930,
                  "src": "1704:64:40",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 8790,
                    "nodeType": "StructuredDocumentation",
                    "src": "1772:192:40",
                    "text": "@notice Returns the balance that is available to award.\n @dev captureAwardBalance() should be called first\n @return The total amount of assets to be awarded for the current prize"
                  },
                  "functionSelector": "630665b4",
                  "id": 8795,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "awardBalance",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8791,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1988:2:40"
                  },
                  "returnParameters": {
                    "id": 8794,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8793,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8795,
                        "src": "2014:7:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8792,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2014:7:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2013:9:40"
                  },
                  "scope": 8930,
                  "src": "1967:56:40",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 8796,
                    "nodeType": "StructuredDocumentation",
                    "src": "2027:195:40",
                    "text": "@notice Captures any available interest as award balance.\n @dev This function also captures the reserve fees.\n @return The total amount of assets to be awarded for the current prize"
                  },
                  "functionSelector": "e6d8a94b",
                  "id": 8801,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "captureAwardBalance",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8797,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2253:2:40"
                  },
                  "returnParameters": {
                    "id": 8800,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8799,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8801,
                        "src": "2274:7:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8798,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2274:7:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2273:9:40"
                  },
                  "scope": 8930,
                  "src": "2225:58:40",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 8802,
                    "nodeType": "StructuredDocumentation",
                    "src": "2287:319:40",
                    "text": "@notice Called by the prize strategy to award prizes.\n @dev The amount awarded must be less than the awardBalance()\n @param to The address of the winner that receives the award\n @param amount The amount of assets to be awarded\n @param controlledToken The address of the asset token being awarded"
                  },
                  "functionSelector": "6b1b863a",
                  "id": 8811,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "award",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8809,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8804,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8811,
                        "src": "2629:10:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8803,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2629:7:40",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8806,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8811,
                        "src": "2645:14:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8805,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2645:7:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8808,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8811,
                        "src": "2665:23:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8807,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2665:7:40",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2623:69:40"
                  },
                  "returnParameters": {
                    "id": 8810,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2705:0:40"
                  },
                  "scope": 8930,
                  "src": "2609:97:40",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 8812,
                    "nodeType": "StructuredDocumentation",
                    "src": "2710:387:40",
                    "text": "@notice Called by the Prize-Strategy to transfer out external ERC20 tokens\n @dev Used to transfer out tokens held by the Prize Pool.  Could be liquidated, or anything.\n @param to The address of the winner that receives the award\n @param amount The amount of external assets to be awarded\n @param externalToken The address of the external asset token being awarded"
                  },
                  "functionSelector": "13f55e39",
                  "id": 8821,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "transferExternalERC20",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8819,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8814,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8821,
                        "src": "3136:10:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8813,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3136:7:40",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8816,
                        "mutability": "mutable",
                        "name": "externalToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8821,
                        "src": "3152:21:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8815,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3152:7:40",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8818,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8821,
                        "src": "3179:14:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8817,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3179:7:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3130:67:40"
                  },
                  "returnParameters": {
                    "id": 8820,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3210:0:40"
                  },
                  "scope": 8930,
                  "src": "3100:111:40",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 8822,
                    "nodeType": "StructuredDocumentation",
                    "src": "3215:351:40",
                    "text": "@notice Called by the Prize-Strategy to award external ERC20 prizes\n @dev Used to award any arbitrary tokens held by the Prize Pool\n @param to The address of the winner that receives the award\n @param amount The amount of external assets to be awarded\n @param externalToken The address of the external asset token being awarded"
                  },
                  "functionSelector": "2b0ab144",
                  "id": 8831,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "awardExternalERC20",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8829,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8824,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8831,
                        "src": "3602:10:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8823,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3602:7:40",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8826,
                        "mutability": "mutable",
                        "name": "externalToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8831,
                        "src": "3618:21:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8825,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3618:7:40",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8828,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8831,
                        "src": "3645:14:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8827,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3645:7:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3596:67:40"
                  },
                  "returnParameters": {
                    "id": 8830,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3676:0:40"
                  },
                  "scope": 8930,
                  "src": "3569:108:40",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 8832,
                    "nodeType": "StructuredDocumentation",
                    "src": "3681:350:40",
                    "text": "@notice Called by the prize strategy to award external ERC721 prizes\n @dev Used to award any arbitrary NFTs held by the Prize Pool\n @param to The address of the winner that receives the award\n @param externalToken The address of the external NFT token being awarded\n @param tokenIds An array of NFT Token IDs to be transferred"
                  },
                  "functionSelector": "16960d55",
                  "id": 8842,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "awardExternalERC721",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8840,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8834,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8842,
                        "src": "4068:10:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8833,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4068:7:40",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8836,
                        "mutability": "mutable",
                        "name": "externalToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8842,
                        "src": "4084:21:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8835,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4084:7:40",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8839,
                        "mutability": "mutable",
                        "name": "tokenIds",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8842,
                        "src": "4111:27:40",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 8837,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "4111:7:40",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 8838,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "4111:9:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4062:80:40"
                  },
                  "returnParameters": {
                    "id": 8841,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4155:0:40"
                  },
                  "scope": 8930,
                  "src": "4034:122:40",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 8843,
                    "nodeType": "StructuredDocumentation",
                    "src": "4160:333:40",
                    "text": "@notice Calculates the early exit fee for the given amount\n @param from The user who is withdrawing\n @param controlledToken The type of collateral being withdrawn\n @param amount The amount of collateral to be withdrawn\n @return exitFee The exit fee\n @return burnedCredit The user's credit that was burned"
                  },
                  "functionSelector": "888c2b6f",
                  "id": 8856,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "calculateEarlyExitFee",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8850,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8845,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8856,
                        "src": "4532:12:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8844,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4532:7:40",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8847,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8856,
                        "src": "4550:23:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8846,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4550:7:40",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8849,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8856,
                        "src": "4579:14:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8848,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4579:7:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4526:71:40"
                  },
                  "returnParameters": {
                    "id": 8855,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8852,
                        "mutability": "mutable",
                        "name": "exitFee",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8856,
                        "src": "4631:15:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8851,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4631:7:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8854,
                        "mutability": "mutable",
                        "name": "burnedCredit",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8856,
                        "src": "4654:20:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8853,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4654:7:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4623:57:40"
                  },
                  "scope": 8930,
                  "src": "4496:185:40",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 8857,
                    "nodeType": "StructuredDocumentation",
                    "src": "4685:373:40",
                    "text": "@notice Estimates the amount of time it will take for a given amount of funds to accrue the given amount of credit.\n @param _principal The principal amount on which interest is accruing\n @param _interest The amount of interest that must accrue\n @return durationSeconds The duration of time it will take to accrue the given amount of interest, in seconds."
                  },
                  "functionSelector": "79cb8563",
                  "id": 8868,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "estimateCreditAccrualTime",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8864,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8859,
                        "mutability": "mutable",
                        "name": "_controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8868,
                        "src": "5101:24:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8858,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5101:7:40",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8861,
                        "mutability": "mutable",
                        "name": "_principal",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8868,
                        "src": "5131:18:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8860,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5131:7:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8863,
                        "mutability": "mutable",
                        "name": "_interest",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8868,
                        "src": "5155:17:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8862,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5155:7:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5095:81:40"
                  },
                  "returnParameters": {
                    "id": 8867,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8866,
                        "mutability": "mutable",
                        "name": "durationSeconds",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8868,
                        "src": "5212:23:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8865,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5212:7:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5211:25:40"
                  },
                  "scope": 8930,
                  "src": "5061:176:40",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 8869,
                    "nodeType": "StructuredDocumentation",
                    "src": "5241:232:40",
                    "text": "@notice Returns the credit balance for a given user.  Not that this includes both minted credit and pending credit.\n @param user The user whose credit balance should be returned\n @return The balance of the users credit"
                  },
                  "functionSelector": "494de9f7",
                  "id": 8878,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "balanceOfCredit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8874,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8871,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8878,
                        "src": "5501:12:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8870,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5501:7:40",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8873,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8878,
                        "src": "5515:23:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8872,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5515:7:40",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5500:39:40"
                  },
                  "returnParameters": {
                    "id": 8877,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8876,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8878,
                        "src": "5558:7:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8875,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5558:7:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5557:9:40"
                  },
                  "scope": 8930,
                  "src": "5476:91:40",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 8879,
                    "nodeType": "StructuredDocumentation",
                    "src": "5571:404:40",
                    "text": "@notice Sets the rate at which credit accrues per second.  The credit rate is a fixed point 18 number (like Ether).\n @param _controlledToken The controlled token for whom to set the credit plan\n @param _creditRateMantissa The credit rate to set.  Is a fixed point 18 decimal (like Ether).\n @param _creditLimitMantissa The credit limit to set.  Is a fixed point 18 decimal (like Ether)."
                  },
                  "functionSelector": "a7b2cc31",
                  "id": 8888,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setCreditPlanOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8886,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8881,
                        "mutability": "mutable",
                        "name": "_controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8888,
                        "src": "6008:24:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8880,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6008:7:40",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8883,
                        "mutability": "mutable",
                        "name": "_creditRateMantissa",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8888,
                        "src": "6038:27:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 8882,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "6038:7:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8885,
                        "mutability": "mutable",
                        "name": "_creditLimitMantissa",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8888,
                        "src": "6071:28:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 8884,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "6071:7:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6002:101:40"
                  },
                  "returnParameters": {
                    "id": 8887,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6116:0:40"
                  },
                  "scope": 8930,
                  "src": "5978:139:40",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 8889,
                    "nodeType": "StructuredDocumentation",
                    "src": "6121:380:40",
                    "text": "@notice Returns the credit rate of a controlled token\n @param controlledToken The controlled token to retrieve the credit rates for\n @return creditLimitMantissa The credit limit fraction.  This number is used to calculate both the credit limit and early exit fee.\n @return creditRateMantissa The credit rate. This is the amount of tokens that accrue per second."
                  },
                  "functionSelector": "d4a1361d",
                  "id": 8898,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "creditPlanOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8892,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8891,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8898,
                        "src": "6531:23:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8890,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6531:7:40",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6525:33:40"
                  },
                  "returnParameters": {
                    "id": 8897,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8894,
                        "mutability": "mutable",
                        "name": "creditLimitMantissa",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8898,
                        "src": "6601:27:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 8893,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "6601:7:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8896,
                        "mutability": "mutable",
                        "name": "creditRateMantissa",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8898,
                        "src": "6636:26:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 8895,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "6636:7:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6593:75:40"
                  },
                  "scope": 8930,
                  "src": "6504:165:40",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 8899,
                    "nodeType": "StructuredDocumentation",
                    "src": "6673:161:40",
                    "text": "@notice Allows the Governor to set a cap on the amount of liquidity that he pool can hold\n @param _liquidityCap The new liquidity cap for the prize pool"
                  },
                  "functionSelector": "7b99adb1",
                  "id": 8904,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setLiquidityCap",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8902,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8901,
                        "mutability": "mutable",
                        "name": "_liquidityCap",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8904,
                        "src": "6862:21:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8900,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6862:7:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6861:23:40"
                  },
                  "returnParameters": {
                    "id": 8903,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6893:0:40"
                  },
                  "scope": 8930,
                  "src": "6837:57:40",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 8905,
                    "nodeType": "StructuredDocumentation",
                    "src": "6898:174:40",
                    "text": "@notice Sets the prize strategy of the prize pool.  Only callable by the owner.\n @param _prizeStrategy The new prize strategy.  Must implement TokenListenerInterface"
                  },
                  "functionSelector": "91ca480e",
                  "id": 8910,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setPrizeStrategy",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8908,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8907,
                        "mutability": "mutable",
                        "name": "_prizeStrategy",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8910,
                        "src": "7101:37:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                          "typeString": "contract TokenListenerInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 8906,
                          "name": "TokenListenerInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16265,
                          "src": "7101:22:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                            "typeString": "contract TokenListenerInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7100:39:40"
                  },
                  "returnParameters": {
                    "id": 8909,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "7148:0:40"
                  },
                  "scope": 8930,
                  "src": "7075:74:40",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 8911,
                    "nodeType": "StructuredDocumentation",
                    "src": "7153:97:40",
                    "text": "@dev Returns the address of the underlying ERC20 asset\n @return The address of the asset"
                  },
                  "functionSelector": "fc0c546a",
                  "id": 8916,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "token",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8912,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "7267:2:40"
                  },
                  "returnParameters": {
                    "id": 8915,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8914,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8916,
                        "src": "7293:7:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8913,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7293:7:40",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7292:9:40"
                  },
                  "scope": 8930,
                  "src": "7253:49:40",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 8917,
                    "nodeType": "StructuredDocumentation",
                    "src": "7306:143:40",
                    "text": "@notice An array of the Tokens controlled by the Prize Pool (ie. Tickets, Sponsorship)\n @return An array of controlled token addresses"
                  },
                  "functionSelector": "9d63848a",
                  "id": 8923,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "tokens",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8918,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "7467:2:40"
                  },
                  "returnParameters": {
                    "id": 8922,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8921,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8923,
                        "src": "7493:33:40",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                          "typeString": "contract ControlledTokenInterface[]"
                        },
                        "typeName": {
                          "baseType": {
                            "contractScope": null,
                            "id": 8919,
                            "name": "ControlledTokenInterface",
                            "nodeType": "UserDefinedTypeName",
                            "referencedDeclaration": 15850,
                            "src": "7493:24:40",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                              "typeString": "contract ControlledTokenInterface"
                            }
                          },
                          "id": 8920,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "7493:26:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_storage_ptr",
                            "typeString": "contract ControlledTokenInterface[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7492:35:40"
                  },
                  "scope": 8930,
                  "src": "7452:76:40",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 8924,
                    "nodeType": "StructuredDocumentation",
                    "src": "7532:92:40",
                    "text": "@notice The total of all controlled tokens\n @return The current total of all tokens"
                  },
                  "functionSelector": "0937eb54",
                  "id": 8929,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "accountedBalance",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8925,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "7652:2:40"
                  },
                  "returnParameters": {
                    "id": 8928,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8927,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8929,
                        "src": "7678:7:40",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8926,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7678:7:40",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7677:9:40"
                  },
                  "scope": 8930,
                  "src": "7627:60:40",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 8931,
              "src": "563:7126:40"
            }
          ],
          "src": "37:7653:40"
        },
        "id": 40
      },
      "contracts/prize-pool/compound/CompoundPrizePool.sol": {
        "ast": {
          "absolutePath": "contracts/prize-pool/compound/CompoundPrizePool.sol",
          "exportedSymbols": {
            "CompoundPrizePool": [
              9116
            ]
          },
          "id": 9117,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 8932,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:41"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol",
              "file": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol",
              "id": 8933,
              "nodeType": "ImportDirective",
              "scope": 9117,
              "sourceUnit": 1353,
              "src": "62:69:41",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol",
              "id": 8934,
              "nodeType": "ImportDirective",
              "scope": 9117,
              "sourceUnit": 1287,
              "src": "132:74:41",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "id": 8935,
              "nodeType": "ImportDirective",
              "scope": 9117,
              "sourceUnit": 1961,
              "src": "207:79:41",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol",
              "id": 8936,
              "nodeType": "ImportDirective",
              "scope": 9117,
              "sourceUnit": 2174,
              "src": "287:82:41",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@pooltogether/fixed-point/contracts/FixedPoint.sol",
              "file": "@pooltogether/fixed-point/contracts/FixedPoint.sol",
              "id": 8937,
              "nodeType": "ImportDirective",
              "scope": 9117,
              "sourceUnit": 5280,
              "src": "370:60:41",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/external/compound/CTokenInterface.sol",
              "file": "../../external/compound/CTokenInterface.sol",
              "id": 8938,
              "nodeType": "ImportDirective",
              "scope": 9117,
              "sourceUnit": 6512,
              "src": "432:53:41",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/prize-pool/PrizePool.sol",
              "file": "../PrizePool.sol",
              "id": 8939,
              "nodeType": "ImportDirective",
              "scope": 9117,
              "sourceUnit": 8752,
              "src": "486:26:41",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 8941,
                    "name": "PrizePool",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 8751,
                    "src": "663:9:41",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_PrizePool_$8751",
                      "typeString": "contract PrizePool"
                    }
                  },
                  "id": 8942,
                  "nodeType": "InheritanceSpecifier",
                  "src": "663:9:41"
                }
              ],
              "contractDependencies": [
                130,
                1352,
                3222,
                3627,
                4787,
                8751,
                8930,
                16206
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 8940,
                "nodeType": "StructuredDocumentation",
                "src": "514:119:41",
                "text": "@title Prize Pool with Compound's cToken\n @notice Manages depositing and withdrawing assets from the Prize Pool"
              },
              "fullyImplemented": true,
              "id": 9116,
              "linearizedBaseContracts": [
                9116,
                8751,
                3222,
                16206,
                4787,
                130,
                3627,
                1352,
                8930
              ],
              "name": "CompoundPrizePool",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 8945,
                  "libraryName": {
                    "contractScope": null,
                    "id": 8943,
                    "name": "SafeMathUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1286,
                    "src": "683:19:41",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeMathUpgradeable_$1286",
                      "typeString": "library SafeMathUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "677:38:41",
                  "typeName": {
                    "id": 8944,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "707:7:41",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "id": 8948,
                  "libraryName": {
                    "contractScope": null,
                    "id": 8946,
                    "name": "SafeERC20Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 2173,
                    "src": "724:20:41",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeERC20Upgradeable_$2173",
                      "typeString": "library SafeERC20Upgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "718:49:41",
                  "typeName": {
                    "contractScope": null,
                    "id": 8947,
                    "name": "IERC20Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1960,
                    "src": "749:17:41",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                      "typeString": "contract IERC20Upgradeable"
                    }
                  }
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 8952,
                  "name": "CompoundPrizePoolInitialized",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 8951,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8950,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "cToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8952,
                        "src": "806:22:41",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 8949,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "806:7:41",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "805:24:41"
                  },
                  "src": "771:59:41"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 8953,
                    "nodeType": "StructuredDocumentation",
                    "src": "834:62:41",
                    "text": "@notice Interface for the Yield-bearing cToken by Compound"
                  },
                  "functionSelector": "69e527da",
                  "id": 8955,
                  "mutability": "mutable",
                  "name": "cToken",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9116,
                  "src": "899:29:41",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                    "typeString": "contract CTokenInterface"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 8954,
                    "name": "CTokenInterface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 6511,
                    "src": "899:15:41",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                      "typeString": "contract CTokenInterface"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 8989,
                    "nodeType": "Block",
                    "src": "1517:192:41",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 8973,
                              "name": "_reserveRegistry",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8958,
                              "src": "1551:16:41",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                                "typeString": "contract RegistryInterface"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 8974,
                              "name": "_controlledTokens",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8961,
                              "src": "1575:17:41",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                                "typeString": "contract ControlledTokenInterface[] memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 8975,
                              "name": "_maxExitFeeMantissa",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8963,
                              "src": "1600:19:41",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                                "typeString": "contract RegistryInterface"
                              },
                              {
                                "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                                "typeString": "contract ControlledTokenInterface[] memory"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 8970,
                              "name": "PrizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8751,
                              "src": "1523:9:41",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_PrizePool_$8751_$",
                                "typeString": "type(contract PrizePool)"
                              }
                            },
                            "id": 8972,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "initialize",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 6941,
                            "src": "1523:20:41",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_RegistryInterface_$12458_$_t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr_$_t_uint256_$returns$__$",
                              "typeString": "function (contract RegistryInterface,contract ControlledTokenInterface[] memory,uint256)"
                            }
                          },
                          "id": 8976,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1523:102:41",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 8977,
                        "nodeType": "ExpressionStatement",
                        "src": "1523:102:41"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 8980,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 8978,
                            "name": "cToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8955,
                            "src": "1631:6:41",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                              "typeString": "contract CTokenInterface"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 8979,
                            "name": "_cToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8965,
                            "src": "1640:7:41",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                              "typeString": "contract CTokenInterface"
                            }
                          },
                          "src": "1631:16:41",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                            "typeString": "contract CTokenInterface"
                          }
                        },
                        "id": 8981,
                        "nodeType": "ExpressionStatement",
                        "src": "1631:16:41"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 8985,
                                  "name": "cToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 8955,
                                  "src": "1696:6:41",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                    "typeString": "contract CTokenInterface"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                    "typeString": "contract CTokenInterface"
                                  }
                                ],
                                "id": 8984,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "1688:7:41",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 8983,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "1688:7:41",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 8986,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1688:15:41",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 8982,
                            "name": "CompoundPrizePoolInitialized",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 8952,
                            "src": "1659:28:41",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 8987,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1659:45:41",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 8988,
                        "nodeType": "EmitStatement",
                        "src": "1654:50:41"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8956,
                    "nodeType": "StructuredDocumentation",
                    "src": "933:368:41",
                    "text": "@notice Initializes the Prize Pool and Yield Service with the required contract connections\n @param _controlledTokens Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\n @param _maxExitFeeMantissa The maximum exit fee size, relative to the withdrawal amount\n @param _cToken Address of the Compound cToken interface"
                  },
                  "functionSelector": "c5871485",
                  "id": 8990,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 8968,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 8967,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "1503:11:41",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "1503:11:41"
                    }
                  ],
                  "name": "initialize",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 8966,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8958,
                        "mutability": "mutable",
                        "name": "_reserveRegistry",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8990,
                        "src": "1330:34:41",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                          "typeString": "contract RegistryInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 8957,
                          "name": "RegistryInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 12458,
                          "src": "1330:17:41",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                            "typeString": "contract RegistryInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8961,
                        "mutability": "mutable",
                        "name": "_controlledTokens",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8990,
                        "src": "1370:51:41",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                          "typeString": "contract ControlledTokenInterface[]"
                        },
                        "typeName": {
                          "baseType": {
                            "contractScope": null,
                            "id": 8959,
                            "name": "ControlledTokenInterface",
                            "nodeType": "UserDefinedTypeName",
                            "referencedDeclaration": 15850,
                            "src": "1370:24:41",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                              "typeString": "contract ControlledTokenInterface"
                            }
                          },
                          "id": 8960,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "1370:26:41",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_storage_ptr",
                            "typeString": "contract ControlledTokenInterface[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8963,
                        "mutability": "mutable",
                        "name": "_maxExitFeeMantissa",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8990,
                        "src": "1427:27:41",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8962,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1427:7:41",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 8965,
                        "mutability": "mutable",
                        "name": "_cToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 8990,
                        "src": "1460:23:41",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                          "typeString": "contract CTokenInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 8964,
                          "name": "CTokenInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 6511,
                          "src": "1460:15:41",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                            "typeString": "contract CTokenInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1324:163:41"
                  },
                  "returnParameters": {
                    "id": 8969,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1517:0:41"
                  },
                  "scope": 9116,
                  "src": "1304:405:41",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    8667
                  ],
                  "body": {
                    "id": 9005,
                    "nodeType": "Block",
                    "src": "1901:59:41",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 9001,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "1949:4:41",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                                    "typeString": "contract CompoundPrizePool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                                    "typeString": "contract CompoundPrizePool"
                                  }
                                ],
                                "id": 9000,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "1941:7:41",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 8999,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "1941:7:41",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 9002,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1941:13:41",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 8997,
                              "name": "cToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8955,
                              "src": "1914:6:41",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                "typeString": "contract CTokenInterface"
                              }
                            },
                            "id": 8998,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balanceOfUnderlying",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 6471,
                            "src": "1914:26:41",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) external returns (uint256)"
                            }
                          },
                          "id": 9003,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1914:41:41",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 8996,
                        "id": 9004,
                        "nodeType": "Return",
                        "src": "1907:48:41"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 8991,
                    "nodeType": "StructuredDocumentation",
                    "src": "1713:129:41",
                    "text": "@dev Gets the balance of the underlying assets held by the Yield Service\n @return The underlying balance of asset tokens"
                  },
                  "id": 9006,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_balance",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 8993,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "1874:8:41"
                  },
                  "parameters": {
                    "id": 8992,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1862:2:41"
                  },
                  "returnParameters": {
                    "id": 8996,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 8995,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9006,
                        "src": "1892:7:41",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 8994,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1892:7:41",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1891:9:41"
                  },
                  "scope": 9116,
                  "src": "1845:115:41",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8673
                  ],
                  "body": {
                    "id": 9033,
                    "nodeType": "Block",
                    "src": "2210:128:41",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 9018,
                                  "name": "cToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 8955,
                                  "src": "2245:6:41",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                    "typeString": "contract CTokenInterface"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                    "typeString": "contract CTokenInterface"
                                  }
                                ],
                                "id": 9017,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "2237:7:41",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 9016,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "2237:7:41",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 9019,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2237:15:41",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 9020,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9009,
                              "src": "2254:6:41",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 9013,
                                "name": "_token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [
                                  9115
                                ],
                                "referencedDeclaration": 9115,
                                "src": "2216:6:41",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IERC20Upgradeable_$1960_$",
                                  "typeString": "function () view returns (contract IERC20Upgradeable)"
                                }
                              },
                              "id": 9014,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2216:8:41",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            "id": 9015,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "safeApprove",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 2062,
                            "src": "2216:20:41",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20Upgradeable_$1960_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20Upgradeable_$1960_$",
                              "typeString": "function (contract IERC20Upgradeable,address,uint256)"
                            }
                          },
                          "id": 9021,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2216:45:41",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9022,
                        "nodeType": "ExpressionStatement",
                        "src": "2216:45:41"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 9029,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 9026,
                                    "name": "amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 9009,
                                    "src": "2287:6:41",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 9024,
                                    "name": "cToken",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8955,
                                    "src": "2275:6:41",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                      "typeString": "contract CTokenInterface"
                                    }
                                  },
                                  "id": 9025,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "mint",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 6488,
                                  "src": "2275:11:41",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$_t_uint256_$",
                                    "typeString": "function (uint256) external returns (uint256)"
                                  }
                                },
                                "id": 9027,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "2275:19:41",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 9028,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "2298:1:41",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "2275:24:41",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "436f6d706f756e645072697a65506f6f6c2f6d696e742d6661696c6564",
                              "id": 9030,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2301:31:41",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_e4aae8977a5a67d4d3b327b65a2a5845bad62cd739b1402797a31e24a6436157",
                                "typeString": "literal_string \"CompoundPrizePool/mint-failed\""
                              },
                              "value": "CompoundPrizePool/mint-failed"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_e4aae8977a5a67d4d3b327b65a2a5845bad62cd739b1402797a31e24a6436157",
                                "typeString": "literal_string \"CompoundPrizePool/mint-failed\""
                              }
                            ],
                            "id": 9023,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2267:7:41",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 9031,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2267:66:41",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9032,
                        "nodeType": "ExpressionStatement",
                        "src": "2267:66:41"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9007,
                    "nodeType": "StructuredDocumentation",
                    "src": "1964:192:41",
                    "text": "@dev Allows a user to supply asset tokens in exchange for yield-bearing tokens\n to be held in escrow by the Yield Service\n @param amount The amount of asset tokens to be supplied"
                  },
                  "id": 9034,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_supply",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 9011,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "2201:8:41"
                  },
                  "parameters": {
                    "id": 9010,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9009,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9034,
                        "src": "2176:14:41",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9008,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2176:7:41",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2175:16:41"
                  },
                  "returnParameters": {
                    "id": 9012,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2210:0:41"
                  },
                  "scope": 9116,
                  "src": "2159:179:41",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8655
                  ],
                  "body": {
                    "id": 9050,
                    "nodeType": "Block",
                    "src": "2658:51:41",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 9048,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 9043,
                            "name": "_externalToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9037,
                            "src": "2671:14:41",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 9046,
                                "name": "cToken",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8955,
                                "src": "2697:6:41",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                  "typeString": "contract CTokenInterface"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                  "typeString": "contract CTokenInterface"
                                }
                              ],
                              "id": 9045,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "2689:7:41",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 9044,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "2689:7:41",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 9047,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "2689:15:41",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "2671:33:41",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 9042,
                        "id": 9049,
                        "nodeType": "Return",
                        "src": "2664:40:41"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9035,
                    "nodeType": "StructuredDocumentation",
                    "src": "2342:224:41",
                    "text": "@dev Checks with the Prize Pool if a specific token type may be awarded as a prize enhancement\n @param _externalToken The address of the token to check\n @return True if the token may be awarded, false otherwise"
                  },
                  "id": 9051,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_canAwardExternal",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 9039,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "2629:8:41"
                  },
                  "parameters": {
                    "id": 9038,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9037,
                        "mutability": "mutable",
                        "name": "_externalToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9051,
                        "src": "2596:22:41",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 9036,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2596:7:41",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2595:24:41"
                  },
                  "returnParameters": {
                    "id": 9042,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9041,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9051,
                        "src": "2652:4:41",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 9040,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "2652:4:41",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2651:6:41"
                  },
                  "scope": 9116,
                  "src": "2569:140:41",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8681
                  ],
                  "body": {
                    "id": 9100,
                    "nodeType": "Block",
                    "src": "3045:279:41",
                    "statements": [
                      {
                        "assignments": [
                          9061
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 9061,
                            "mutability": "mutable",
                            "name": "assetToken",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 9100,
                            "src": "3051:28:41",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                              "typeString": "contract IERC20Upgradeable"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 9060,
                              "name": "IERC20Upgradeable",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 1960,
                              "src": "3051:17:41",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 9064,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 9062,
                            "name": "_token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              9115
                            ],
                            "referencedDeclaration": 9115,
                            "src": "3082:6:41",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IERC20Upgradeable_$1960_$",
                              "typeString": "function () view returns (contract IERC20Upgradeable)"
                            }
                          },
                          "id": 9063,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3082:8:41",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3051:39:41"
                      },
                      {
                        "assignments": [
                          9066
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 9066,
                            "mutability": "mutable",
                            "name": "before",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 9100,
                            "src": "3096:14:41",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 9065,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "3096:7:41",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 9074,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 9071,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "3142:4:41",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                                    "typeString": "contract CompoundPrizePool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                                    "typeString": "contract CompoundPrizePool"
                                  }
                                ],
                                "id": 9070,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "3134:7:41",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 9069,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "3134:7:41",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 9072,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3134:13:41",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 9067,
                              "name": "assetToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9061,
                              "src": "3113:10:41",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            "id": 9068,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balanceOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1899,
                            "src": "3113:20:41",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) view external returns (uint256)"
                            }
                          },
                          "id": 9073,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3113:35:41",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3096:52:41"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 9081,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 9078,
                                    "name": "amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 9054,
                                    "src": "3186:6:41",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 9076,
                                    "name": "cToken",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 8955,
                                    "src": "3162:6:41",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                      "typeString": "contract CTokenInterface"
                                    }
                                  },
                                  "id": 9077,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "redeemUnderlying",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 6510,
                                  "src": "3162:23:41",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$_t_uint256_$",
                                    "typeString": "function (uint256) external returns (uint256)"
                                  }
                                },
                                "id": 9079,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "3162:31:41",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 9080,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "3197:1:41",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "3162:36:41",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "436f6d706f756e645072697a65506f6f6c2f72656465656d2d6661696c6564",
                              "id": 9082,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3200:33:41",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_53f790f2f206d6cb0c3f865e135a44cb7165eb538bdabe69f67f53ef56deec0c",
                                "typeString": "literal_string \"CompoundPrizePool/redeem-failed\""
                              },
                              "value": "CompoundPrizePool/redeem-failed"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_53f790f2f206d6cb0c3f865e135a44cb7165eb538bdabe69f67f53ef56deec0c",
                                "typeString": "literal_string \"CompoundPrizePool/redeem-failed\""
                              }
                            ],
                            "id": 9075,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "3154:7:41",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 9083,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3154:80:41",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9084,
                        "nodeType": "ExpressionStatement",
                        "src": "3154:80:41"
                      },
                      {
                        "assignments": [
                          9086
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 9086,
                            "mutability": "mutable",
                            "name": "diff",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 9100,
                            "src": "3240:12:41",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 9085,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "3240:7:41",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 9097,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 9095,
                              "name": "before",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9066,
                              "src": "3295:6:41",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 9091,
                                      "name": "this",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -28,
                                      "src": "3284:4:41",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                                        "typeString": "contract CompoundPrizePool"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                                        "typeString": "contract CompoundPrizePool"
                                      }
                                    ],
                                    "id": 9090,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "3276:7:41",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 9089,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "3276:7:41",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 9092,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "3276:13:41",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 9087,
                                  "name": "assetToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 9061,
                                  "src": "3255:10:41",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                    "typeString": "contract IERC20Upgradeable"
                                  }
                                },
                                "id": 9088,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "balanceOf",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 1899,
                                "src": "3255:20:41",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                  "typeString": "function (address) view external returns (uint256)"
                                }
                              },
                              "id": 9093,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3255:35:41",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 9094,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sub",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1135,
                            "src": "3255:39:41",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 9096,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3255:47:41",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3240:62:41"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 9098,
                          "name": "diff",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 9086,
                          "src": "3315:4:41",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 9059,
                        "id": 9099,
                        "nodeType": "Return",
                        "src": "3308:11:41"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9052,
                    "nodeType": "StructuredDocumentation",
                    "src": "2713:260:41",
                    "text": "@dev Allows a user to redeem yield-bearing tokens in exchange for the underlying\n asset tokens held in escrow by the Yield Service\n @param amount The amount of underlying tokens to be redeemed\n @return The actual amount of tokens transferred"
                  },
                  "id": 9101,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_redeem",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 9056,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "3018:8:41"
                  },
                  "parameters": {
                    "id": 9055,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9054,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9101,
                        "src": "2993:14:41",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9053,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2993:7:41",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2992:16:41"
                  },
                  "returnParameters": {
                    "id": 9059,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9058,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9101,
                        "src": "3036:7:41",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9057,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3036:7:41",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3035:9:41"
                  },
                  "scope": 9116,
                  "src": "2976:348:41",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8661
                  ],
                  "body": {
                    "id": 9114,
                    "nodeType": "Block",
                    "src": "3538:56:41",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 9109,
                                  "name": "cToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 8955,
                                  "src": "3569:6:41",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                    "typeString": "contract CTokenInterface"
                                  }
                                },
                                "id": 9110,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "underlying",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 6464,
                                "src": "3569:17:41",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_view$__$returns$_t_address_$",
                                  "typeString": "function () view external returns (address)"
                                }
                              },
                              "id": 9111,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3569:19:41",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 9108,
                            "name": "IERC20Upgradeable",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1960,
                            "src": "3551:17:41",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_IERC20Upgradeable_$1960_$",
                              "typeString": "type(contract IERC20Upgradeable)"
                            }
                          },
                          "id": 9112,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3551:38:41",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "functionReturnParameters": 9107,
                        "id": 9113,
                        "nodeType": "Return",
                        "src": "3544:45:41"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9102,
                    "nodeType": "StructuredDocumentation",
                    "src": "3328:138:41",
                    "text": "@dev Gets the underlying asset token used by the Yield Service\n @return A reference to the interface of the underling asset token"
                  },
                  "id": 9115,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_token",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 9104,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "3496:8:41"
                  },
                  "parameters": {
                    "id": 9103,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3484:2:41"
                  },
                  "returnParameters": {
                    "id": 9107,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9106,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9115,
                        "src": "3519:17:41",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9105,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "3519:17:41",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3518:19:41"
                  },
                  "scope": 9116,
                  "src": "3469:125:41",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 9117,
              "src": "633:2963:41"
            }
          ],
          "src": "37:3560:41"
        },
        "id": 41
      },
      "contracts/prize-pool/compound/CompoundPrizePoolProxyFactory.sol": {
        "ast": {
          "absolutePath": "contracts/prize-pool/compound/CompoundPrizePoolProxyFactory.sol",
          "exportedSymbols": {
            "CompoundPrizePoolProxyFactory": [
              9155
            ]
          },
          "id": 9156,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 9118,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:42"
            },
            {
              "absolutePath": "contracts/prize-pool/compound/CompoundPrizePool.sol",
              "file": "./CompoundPrizePool.sol",
              "id": 9119,
              "nodeType": "ImportDirective",
              "scope": 9156,
              "sourceUnit": 9117,
              "src": "62:33:42",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/external/openzeppelin/ProxyFactory.sol",
              "file": "../../external/openzeppelin/ProxyFactory.sol",
              "id": 9120,
              "nodeType": "ImportDirective",
              "scope": 9156,
              "sourceUnit": 6617,
              "src": "96:54:42",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 9122,
                    "name": "ProxyFactory",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 6616,
                    "src": "311:12:42",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ProxyFactory_$6616",
                      "typeString": "contract ProxyFactory"
                    }
                  },
                  "id": 9123,
                  "nodeType": "InheritanceSpecifier",
                  "src": "311:12:42"
                }
              ],
              "contractDependencies": [
                6616,
                9116
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 9121,
                "nodeType": "StructuredDocumentation",
                "src": "152:117:42",
                "text": "@title Compound Prize Pool Proxy Factory\n @notice Minimal proxy pattern for creating new Compound Prize Pools"
              },
              "fullyImplemented": true,
              "id": 9155,
              "linearizedBaseContracts": [
                9155,
                6616
              ],
              "name": "CompoundPrizePoolProxyFactory",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "documentation": {
                    "id": 9124,
                    "nodeType": "StructuredDocumentation",
                    "src": "329:63:42",
                    "text": "@notice Contract template for deploying proxied Prize Pools"
                  },
                  "functionSelector": "022ec095",
                  "id": 9126,
                  "mutability": "mutable",
                  "name": "instance",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9155,
                  "src": "395:33:42",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                    "typeString": "contract CompoundPrizePool"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 9125,
                    "name": "CompoundPrizePool",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9116,
                    "src": "395:17:42",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                      "typeString": "contract CompoundPrizePool"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 9136,
                    "nodeType": "Block",
                    "src": "537:45:42",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 9134,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 9130,
                            "name": "instance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9126,
                            "src": "543:8:42",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                              "typeString": "contract CompoundPrizePool"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 9132,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "554:21:42",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_creation_nonpayable$__$returns$_t_contract$_CompoundPrizePool_$9116_$",
                                "typeString": "function () returns (contract CompoundPrizePool)"
                              },
                              "typeName": {
                                "contractScope": null,
                                "id": 9131,
                                "name": "CompoundPrizePool",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 9116,
                                "src": "558:17:42",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                                  "typeString": "contract CompoundPrizePool"
                                }
                              }
                            },
                            "id": 9133,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "554:23:42",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                              "typeString": "contract CompoundPrizePool"
                            }
                          },
                          "src": "543:34:42",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                            "typeString": "contract CompoundPrizePool"
                          }
                        },
                        "id": 9135,
                        "nodeType": "ExpressionStatement",
                        "src": "543:34:42"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9127,
                    "nodeType": "StructuredDocumentation",
                    "src": "433:79:42",
                    "text": "@notice Initializes the Factory with an instance of the Compound Prize Pool"
                  },
                  "id": 9137,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 9128,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "527:2:42"
                  },
                  "returnParameters": {
                    "id": 9129,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "537:0:42"
                  },
                  "scope": 9155,
                  "src": "515:67:42",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 9153,
                    "nodeType": "Block",
                    "src": "790:73:42",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 9147,
                                      "name": "instance",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 9126,
                                      "src": "843:8:42",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                                        "typeString": "contract CompoundPrizePool"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                                        "typeString": "contract CompoundPrizePool"
                                      }
                                    ],
                                    "id": 9146,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "835:7:42",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 9145,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "835:7:42",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 9148,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "835:17:42",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "hexValue": "",
                                  "id": 9149,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "854:2:42",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                    "typeString": "literal_string \"\""
                                  },
                                  "value": ""
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                    "typeString": "literal_string \"\""
                                  }
                                ],
                                "id": 9144,
                                "name": "deployMinimal",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6615,
                                "src": "821:13:42",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_address_$",
                                  "typeString": "function (address,bytes memory) returns (address)"
                                }
                              },
                              "id": 9150,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "821:36:42",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 9143,
                            "name": "CompoundPrizePool",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9116,
                            "src": "803:17:42",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_CompoundPrizePool_$9116_$",
                              "typeString": "type(contract CompoundPrizePool)"
                            }
                          },
                          "id": 9151,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "803:55:42",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                            "typeString": "contract CompoundPrizePool"
                          }
                        },
                        "functionReturnParameters": 9142,
                        "id": 9152,
                        "nodeType": "Return",
                        "src": "796:62:42"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9138,
                    "nodeType": "StructuredDocumentation",
                    "src": "586:146:42",
                    "text": "@notice Creates a new Compound Prize Pool as a proxy of the template instance\n @return A reference to the new proxied Compound Prize Pool"
                  },
                  "functionSelector": "efc81a8c",
                  "id": 9154,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "create",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 9139,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "750:2:42"
                  },
                  "returnParameters": {
                    "id": 9142,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9141,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9154,
                        "src": "771:17:42",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                          "typeString": "contract CompoundPrizePool"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9140,
                          "name": "CompoundPrizePool",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 9116,
                          "src": "771:17:42",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                            "typeString": "contract CompoundPrizePool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "770:19:42"
                  },
                  "scope": 9155,
                  "src": "735:128:42",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 9156,
              "src": "269:596:42"
            }
          ],
          "src": "37:829:42"
        },
        "id": 42
      },
      "contracts/prize-pool/stake/StakePrizePool.sol": {
        "ast": {
          "absolutePath": "contracts/prize-pool/stake/StakePrizePool.sol",
          "exportedSymbols": {
            "StakePrizePool": [
              9278
            ]
          },
          "id": 9279,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 9157,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:43"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "id": 9158,
              "nodeType": "ImportDirective",
              "scope": 9279,
              "sourceUnit": 1961,
              "src": "62:79:43",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/prize-pool/PrizePool.sol",
              "file": "../PrizePool.sol",
              "id": 9159,
              "nodeType": "ImportDirective",
              "scope": 9279,
              "sourceUnit": 8752,
              "src": "143:26:43",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 9160,
                    "name": "PrizePool",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 8751,
                    "src": "198:9:43",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_PrizePool_$8751",
                      "typeString": "contract PrizePool"
                    }
                  },
                  "id": 9161,
                  "nodeType": "InheritanceSpecifier",
                  "src": "198:9:43"
                }
              ],
              "contractDependencies": [
                130,
                1352,
                3222,
                3627,
                4787,
                8751,
                8930,
                16206
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 9278,
              "linearizedBaseContracts": [
                9278,
                8751,
                3222,
                16206,
                4787,
                130,
                3627,
                1352,
                8930
              ],
              "name": "StakePrizePool",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "id": 9163,
                  "mutability": "mutable",
                  "name": "stakeToken",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9278,
                  "src": "213:36:43",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                    "typeString": "contract IERC20Upgradeable"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 9162,
                    "name": "IERC20Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1960,
                    "src": "213:17:43",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                      "typeString": "contract IERC20Upgradeable"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 9167,
                  "name": "StakePrizePoolInitialized",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 9166,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9165,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "stakeToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9167,
                        "src": "286:26:43",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 9164,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "286:7:43",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "285:28:43"
                  },
                  "src": "254:60:43"
                },
                {
                  "body": {
                    "id": 9214,
                    "nodeType": "Block",
                    "src": "898:298:43",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 9185,
                              "name": "_reserveRegistry",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9170,
                              "src": "932:16:43",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                                "typeString": "contract RegistryInterface"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 9186,
                              "name": "_controlledTokens",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9173,
                              "src": "956:17:43",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                                "typeString": "contract ControlledTokenInterface[] memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 9187,
                              "name": "_maxExitFeeMantissa",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9175,
                              "src": "981:19:43",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                                "typeString": "contract RegistryInterface"
                              },
                              {
                                "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                                "typeString": "contract ControlledTokenInterface[] memory"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 9182,
                              "name": "PrizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8751,
                              "src": "904:9:43",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_PrizePool_$8751_$",
                                "typeString": "type(contract PrizePool)"
                              }
                            },
                            "id": 9184,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "initialize",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 6941,
                            "src": "904:20:43",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_RegistryInterface_$12458_$_t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr_$_t_uint256_$returns$__$",
                              "typeString": "function (contract RegistryInterface,contract ControlledTokenInterface[] memory,uint256)"
                            }
                          },
                          "id": 9188,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "904:102:43",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9189,
                        "nodeType": "ExpressionStatement",
                        "src": "904:102:43"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 9199,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 9193,
                                    "name": "_stakeToken",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 9177,
                                    "src": "1029:11:43",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                      "typeString": "contract IERC20Upgradeable"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                      "typeString": "contract IERC20Upgradeable"
                                    }
                                  ],
                                  "id": 9192,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "1021:7:43",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 9191,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1021:7:43",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 9194,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "1021:20:43",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 9197,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "1053:1:43",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 9196,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "1045:7:43",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 9195,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1045:7:43",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 9198,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "1045:10:43",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "1021:34:43",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5374616b655072697a65506f6f6c2f7374616b652d746f6b656e2d6e6f742d7a65726f2d61646472657373",
                              "id": 9200,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1057:45:43",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_f1ff3ac5776bf3a9ba71032559232613105ede74d206130def2b107a45468a3c",
                                "typeString": "literal_string \"StakePrizePool/stake-token-not-zero-address\""
                              },
                              "value": "StakePrizePool/stake-token-not-zero-address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_f1ff3ac5776bf3a9ba71032559232613105ede74d206130def2b107a45468a3c",
                                "typeString": "literal_string \"StakePrizePool/stake-token-not-zero-address\""
                              }
                            ],
                            "id": 9190,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1013:7:43",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 9201,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1013:90:43",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9202,
                        "nodeType": "ExpressionStatement",
                        "src": "1013:90:43"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 9205,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 9203,
                            "name": "stakeToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9163,
                            "src": "1109:10:43",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                              "typeString": "contract IERC20Upgradeable"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 9204,
                            "name": "_stakeToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9177,
                            "src": "1122:11:43",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                              "typeString": "contract IERC20Upgradeable"
                            }
                          },
                          "src": "1109:24:43",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "id": 9206,
                        "nodeType": "ExpressionStatement",
                        "src": "1109:24:43"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 9210,
                                  "name": "stakeToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 9163,
                                  "src": "1179:10:43",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                    "typeString": "contract IERC20Upgradeable"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                    "typeString": "contract IERC20Upgradeable"
                                  }
                                ],
                                "id": 9209,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "1171:7:43",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 9208,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "1171:7:43",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 9211,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1171:19:43",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 9207,
                            "name": "StakePrizePoolInitialized",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9167,
                            "src": "1145:25:43",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 9212,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1145:46:43",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9213,
                        "nodeType": "EmitStatement",
                        "src": "1140:51:43"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9168,
                    "nodeType": "StructuredDocumentation",
                    "src": "318:358:43",
                    "text": "@notice Initializes the Prize Pool and Yield Service with the required contract connections\n @param _controlledTokens Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\n @param _maxExitFeeMantissa The maximum exit fee size, relative to the withdrawal amount\n @param _stakeToken Address of the stake token"
                  },
                  "functionSelector": "c5871485",
                  "id": 9215,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 9180,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 9179,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "884:11:43",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "884:11:43"
                    }
                  ],
                  "name": "initialize",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 9178,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9170,
                        "mutability": "mutable",
                        "name": "_reserveRegistry",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9215,
                        "src": "705:34:43",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                          "typeString": "contract RegistryInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9169,
                          "name": "RegistryInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 12458,
                          "src": "705:17:43",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                            "typeString": "contract RegistryInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9173,
                        "mutability": "mutable",
                        "name": "_controlledTokens",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9215,
                        "src": "745:51:43",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                          "typeString": "contract ControlledTokenInterface[]"
                        },
                        "typeName": {
                          "baseType": {
                            "contractScope": null,
                            "id": 9171,
                            "name": "ControlledTokenInterface",
                            "nodeType": "UserDefinedTypeName",
                            "referencedDeclaration": 15850,
                            "src": "745:24:43",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                              "typeString": "contract ControlledTokenInterface"
                            }
                          },
                          "id": 9172,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "745:26:43",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_storage_ptr",
                            "typeString": "contract ControlledTokenInterface[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9175,
                        "mutability": "mutable",
                        "name": "_maxExitFeeMantissa",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9215,
                        "src": "802:27:43",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9174,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "802:7:43",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9177,
                        "mutability": "mutable",
                        "name": "_stakeToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9215,
                        "src": "835:29:43",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9176,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "835:17:43",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "699:169:43"
                  },
                  "returnParameters": {
                    "id": 9181,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "898:0:43"
                  },
                  "scope": 9278,
                  "src": "679:517:43",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    8655
                  ],
                  "body": {
                    "id": 9231,
                    "nodeType": "Block",
                    "src": "1690:55:43",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 9229,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 9226,
                                "name": "stakeToken",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 9163,
                                "src": "1711:10:43",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                  "typeString": "contract IERC20Upgradeable"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                  "typeString": "contract IERC20Upgradeable"
                                }
                              ],
                              "id": 9225,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "1703:7:43",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 9224,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "1703:7:43",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 9227,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1703:19:43",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 9228,
                            "name": "_externalToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9218,
                            "src": "1726:14:43",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "1703:37:43",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 9223,
                        "id": 9230,
                        "nodeType": "Return",
                        "src": "1696:44:43"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9216,
                    "nodeType": "StructuredDocumentation",
                    "src": "1200:398:43",
                    "text": "@notice Determines whether the passed token can be transferred out as an external award.\n @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\n prize strategy should not be allowed to move those tokens.\n @param _externalToken The address of the token to check\n @return True if the token may be awarded, false otherwise"
                  },
                  "id": 9232,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_canAwardExternal",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 9220,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "1661:8:43"
                  },
                  "parameters": {
                    "id": 9219,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9218,
                        "mutability": "mutable",
                        "name": "_externalToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9232,
                        "src": "1628:22:43",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 9217,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1628:7:43",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1627:24:43"
                  },
                  "returnParameters": {
                    "id": 9223,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9222,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9232,
                        "src": "1684:4:43",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 9221,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "1684:4:43",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1683:6:43"
                  },
                  "scope": 9278,
                  "src": "1601:144:43",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8667
                  ],
                  "body": {
                    "id": 9247,
                    "nodeType": "Block",
                    "src": "1959:53:43",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 9243,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "2001:4:43",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                                    "typeString": "contract StakePrizePool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                                    "typeString": "contract StakePrizePool"
                                  }
                                ],
                                "id": 9242,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "1993:7:43",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 9241,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "1993:7:43",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 9244,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1993:13:43",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 9239,
                              "name": "stakeToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9163,
                              "src": "1972:10:43",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            "id": 9240,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balanceOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1899,
                            "src": "1972:20:43",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) view external returns (uint256)"
                            }
                          },
                          "id": 9245,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1972:35:43",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 9238,
                        "id": 9246,
                        "nodeType": "Return",
                        "src": "1965:42:43"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9233,
                    "nodeType": "StructuredDocumentation",
                    "src": "1749:151:43",
                    "text": "@notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\n @return The underlying balance of asset tokens"
                  },
                  "id": 9248,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_balance",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 9235,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "1932:8:43"
                  },
                  "parameters": {
                    "id": 9234,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1920:2:43"
                  },
                  "returnParameters": {
                    "id": 9238,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9237,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9248,
                        "src": "1950:7:43",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9236,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1950:7:43",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1949:9:43"
                  },
                  "scope": 9278,
                  "src": "1903:109:43",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8661
                  ],
                  "body": {
                    "id": 9256,
                    "nodeType": "Block",
                    "src": "2085:28:43",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 9254,
                          "name": "stakeToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 9163,
                          "src": "2098:10:43",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "functionReturnParameters": 9253,
                        "id": 9255,
                        "nodeType": "Return",
                        "src": "2091:17:43"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 9257,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_token",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 9250,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "2043:8:43"
                  },
                  "parameters": {
                    "id": 9249,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2031:2:43"
                  },
                  "returnParameters": {
                    "id": 9253,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9252,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9257,
                        "src": "2066:17:43",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9251,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "2066:17:43",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2065:19:43"
                  },
                  "scope": 9278,
                  "src": "2016:97:43",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8673
                  ],
                  "body": {
                    "id": 9264,
                    "nodeType": "Block",
                    "src": "2295:56:43",
                    "statements": []
                  },
                  "documentation": {
                    "id": 9258,
                    "nodeType": "StructuredDocumentation",
                    "src": "2117:120:43",
                    "text": "@notice Supplies asset tokens to the yield source.\n @param mintAmount The amount of asset tokens to be supplied"
                  },
                  "id": 9265,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_supply",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 9262,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "2286:8:43"
                  },
                  "parameters": {
                    "id": 9261,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9260,
                        "mutability": "mutable",
                        "name": "mintAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9265,
                        "src": "2257:18:43",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9259,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2257:7:43",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2256:20:43"
                  },
                  "returnParameters": {
                    "id": 9263,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2295:0:43"
                  },
                  "scope": 9278,
                  "src": "2240:111:43",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8681
                  ],
                  "body": {
                    "id": 9276,
                    "nodeType": "Block",
                    "src": "2626:30:43",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 9274,
                          "name": "redeemAmount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 9268,
                          "src": "2639:12:43",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 9273,
                        "id": 9275,
                        "nodeType": "Return",
                        "src": "2632:19:43"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9266,
                    "nodeType": "StructuredDocumentation",
                    "src": "2355:193:43",
                    "text": "@notice Redeems asset tokens from the yield source.\n @param redeemAmount The amount of yield-bearing tokens to be redeemed\n @return The actual amount of tokens that were redeemed."
                  },
                  "id": 9277,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_redeem",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 9270,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "2599:8:43"
                  },
                  "parameters": {
                    "id": 9269,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9268,
                        "mutability": "mutable",
                        "name": "redeemAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9277,
                        "src": "2568:20:43",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9267,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2568:7:43",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2567:22:43"
                  },
                  "returnParameters": {
                    "id": 9273,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9272,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9277,
                        "src": "2617:7:43",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9271,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2617:7:43",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2616:9:43"
                  },
                  "scope": 9278,
                  "src": "2551:105:43",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 9279,
              "src": "171:2487:43"
            }
          ],
          "src": "37:2622:43"
        },
        "id": 43
      },
      "contracts/prize-pool/stake/StakePrizePoolProxyFactory.sol": {
        "ast": {
          "absolutePath": "contracts/prize-pool/stake/StakePrizePoolProxyFactory.sol",
          "exportedSymbols": {
            "StakePrizePoolProxyFactory": [
              9317
            ]
          },
          "id": 9318,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 9280,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:44"
            },
            {
              "absolutePath": "contracts/prize-pool/stake/StakePrizePool.sol",
              "file": "./StakePrizePool.sol",
              "id": 9281,
              "nodeType": "ImportDirective",
              "scope": 9318,
              "sourceUnit": 9279,
              "src": "62:30:44",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/external/openzeppelin/ProxyFactory.sol",
              "file": "../../external/openzeppelin/ProxyFactory.sol",
              "id": 9282,
              "nodeType": "ImportDirective",
              "scope": 9318,
              "sourceUnit": 6617,
              "src": "93:54:44",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 9284,
                    "name": "ProxyFactory",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 6616,
                    "src": "299:12:44",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ProxyFactory_$6616",
                      "typeString": "contract ProxyFactory"
                    }
                  },
                  "id": 9285,
                  "nodeType": "InheritanceSpecifier",
                  "src": "299:12:44"
                }
              ],
              "contractDependencies": [
                6616,
                9278
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 9283,
                "nodeType": "StructuredDocumentation",
                "src": "149:111:44",
                "text": "@title Stake Prize Pool Proxy Factory\n @notice Minimal proxy pattern for creating new Stake Prize Pools"
              },
              "fullyImplemented": true,
              "id": 9317,
              "linearizedBaseContracts": [
                9317,
                6616
              ],
              "name": "StakePrizePoolProxyFactory",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "documentation": {
                    "id": 9286,
                    "nodeType": "StructuredDocumentation",
                    "src": "317:63:44",
                    "text": "@notice Contract template for deploying proxied Prize Pools"
                  },
                  "functionSelector": "022ec095",
                  "id": 9288,
                  "mutability": "mutable",
                  "name": "instance",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9317,
                  "src": "383:30:44",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                    "typeString": "contract StakePrizePool"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 9287,
                    "name": "StakePrizePool",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9278,
                    "src": "383:14:44",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                      "typeString": "contract StakePrizePool"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 9298,
                    "nodeType": "Block",
                    "src": "519:42:44",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 9296,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 9292,
                            "name": "instance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9288,
                            "src": "525:8:44",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                              "typeString": "contract StakePrizePool"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 9294,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "536:18:44",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_creation_nonpayable$__$returns$_t_contract$_StakePrizePool_$9278_$",
                                "typeString": "function () returns (contract StakePrizePool)"
                              },
                              "typeName": {
                                "contractScope": null,
                                "id": 9293,
                                "name": "StakePrizePool",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 9278,
                                "src": "540:14:44",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                                  "typeString": "contract StakePrizePool"
                                }
                              }
                            },
                            "id": 9295,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "536:20:44",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                              "typeString": "contract StakePrizePool"
                            }
                          },
                          "src": "525:31:44",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                            "typeString": "contract StakePrizePool"
                          }
                        },
                        "id": 9297,
                        "nodeType": "ExpressionStatement",
                        "src": "525:31:44"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9289,
                    "nodeType": "StructuredDocumentation",
                    "src": "418:76:44",
                    "text": "@notice Initializes the Factory with an instance of the Stake Prize Pool"
                  },
                  "id": 9299,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 9290,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "509:2:44"
                  },
                  "returnParameters": {
                    "id": 9291,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "519:0:44"
                  },
                  "scope": 9317,
                  "src": "497:64:44",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 9315,
                    "nodeType": "Block",
                    "src": "760:70:44",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 9309,
                                      "name": "instance",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 9288,
                                      "src": "810:8:44",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                                        "typeString": "contract StakePrizePool"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                                        "typeString": "contract StakePrizePool"
                                      }
                                    ],
                                    "id": 9308,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "802:7:44",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 9307,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "802:7:44",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 9310,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "802:17:44",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "hexValue": "",
                                  "id": 9311,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "821:2:44",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                    "typeString": "literal_string \"\""
                                  },
                                  "value": ""
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                    "typeString": "literal_string \"\""
                                  }
                                ],
                                "id": 9306,
                                "name": "deployMinimal",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6615,
                                "src": "788:13:44",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_address_$",
                                  "typeString": "function (address,bytes memory) returns (address)"
                                }
                              },
                              "id": 9312,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "788:36:44",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 9305,
                            "name": "StakePrizePool",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9278,
                            "src": "773:14:44",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_StakePrizePool_$9278_$",
                              "typeString": "type(contract StakePrizePool)"
                            }
                          },
                          "id": 9313,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "773:52:44",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                            "typeString": "contract StakePrizePool"
                          }
                        },
                        "functionReturnParameters": 9304,
                        "id": 9314,
                        "nodeType": "Return",
                        "src": "766:59:44"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9300,
                    "nodeType": "StructuredDocumentation",
                    "src": "565:140:44",
                    "text": "@notice Creates a new Stake Prize Pool as a proxy of the template instance\n @return A reference to the new proxied Stake Prize Pool"
                  },
                  "functionSelector": "efc81a8c",
                  "id": 9316,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "create",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 9301,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "723:2:44"
                  },
                  "returnParameters": {
                    "id": 9304,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9303,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9316,
                        "src": "744:14:44",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                          "typeString": "contract StakePrizePool"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9302,
                          "name": "StakePrizePool",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 9278,
                          "src": "744:14:44",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                            "typeString": "contract StakePrizePool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "743:16:44"
                  },
                  "scope": 9317,
                  "src": "708:122:44",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 9318,
              "src": "260:572:44"
            }
          ],
          "src": "37:796:44"
        },
        "id": 44
      },
      "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol": {
        "ast": {
          "absolutePath": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol",
          "exportedSymbols": {
            "YieldSourcePrizePool": [
              9493
            ]
          },
          "id": 9494,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 9319,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:45"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "id": 9320,
              "nodeType": "ImportDirective",
              "scope": 9494,
              "sourceUnit": 1961,
              "src": "62:79:45",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol",
              "id": 9321,
              "nodeType": "ImportDirective",
              "scope": 9494,
              "sourceUnit": 2174,
              "src": "142:82:45",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol",
              "id": 9322,
              "nodeType": "ImportDirective",
              "scope": 9494,
              "sourceUnit": 3583,
              "src": "225:74:45",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@pooltogether/yield-source-interface/contracts/IYieldSource.sol",
              "file": "@pooltogether/yield-source-interface/contracts/IYieldSource.sol",
              "id": 9323,
              "nodeType": "ImportDirective",
              "scope": 9494,
              "sourceUnit": 5624,
              "src": "301:73:45",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/prize-pool/PrizePool.sol",
              "file": "../PrizePool.sol",
              "id": 9324,
              "nodeType": "ImportDirective",
              "scope": 9494,
              "sourceUnit": 8752,
              "src": "376:26:45",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 9325,
                    "name": "PrizePool",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 8751,
                    "src": "437:9:45",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_PrizePool_$8751",
                      "typeString": "contract PrizePool"
                    }
                  },
                  "id": 9326,
                  "nodeType": "InheritanceSpecifier",
                  "src": "437:9:45"
                }
              ],
              "contractDependencies": [
                130,
                1352,
                3222,
                3627,
                4787,
                8751,
                8930,
                16206
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 9493,
              "linearizedBaseContracts": [
                9493,
                8751,
                3222,
                16206,
                4787,
                130,
                3627,
                1352,
                8930
              ],
              "name": "YieldSourcePrizePool",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 9329,
                  "libraryName": {
                    "contractScope": null,
                    "id": 9327,
                    "name": "SafeERC20Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 2173,
                    "src": "458:20:45",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeERC20Upgradeable_$2173",
                      "typeString": "library SafeERC20Upgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "452:49:45",
                  "typeName": {
                    "contractScope": null,
                    "id": 9328,
                    "name": "IERC20Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1960,
                    "src": "483:17:45",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                      "typeString": "contract IERC20Upgradeable"
                    }
                  }
                },
                {
                  "id": 9332,
                  "libraryName": {
                    "contractScope": null,
                    "id": 9330,
                    "name": "AddressUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3582,
                    "src": "510:18:45",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_AddressUpgradeable_$3582",
                      "typeString": "library AddressUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "504:37:45",
                  "typeName": {
                    "id": 9331,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "533:7:45",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  }
                },
                {
                  "constant": false,
                  "functionSelector": "b2470e5c",
                  "id": 9334,
                  "mutability": "mutable",
                  "name": "yieldSource",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9493,
                  "src": "545:31:45",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IYieldSource_$5623",
                    "typeString": "contract IYieldSource"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 9333,
                    "name": "IYieldSource",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 5623,
                    "src": "545:12:45",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IYieldSource_$5623",
                      "typeString": "contract IYieldSource"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 9338,
                  "name": "YieldSourcePrizePoolInitialized",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 9337,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9336,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "yieldSource",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9338,
                        "src": "619:27:45",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 9335,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "619:7:45",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "618:29:45"
                  },
                  "src": "581:67:45"
                },
                {
                  "body": {
                    "id": 9402,
                    "nodeType": "Block",
                    "src": "1250:557:45",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "expression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 9356,
                                      "name": "_yieldSource",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 9348,
                                      "src": "1272:12:45",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IYieldSource_$5623",
                                        "typeString": "contract IYieldSource"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_IYieldSource_$5623",
                                        "typeString": "contract IYieldSource"
                                      }
                                    ],
                                    "id": 9355,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "1264:7:45",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 9354,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "1264:7:45",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 9357,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "1264:21:45",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "id": 9358,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "isContract",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 3358,
                                "src": "1264:32:45",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$bound_to$_t_address_$",
                                  "typeString": "function (address) view returns (bool)"
                                }
                              },
                              "id": 9359,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1264:34:45",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5969656c64536f757263655072697a65506f6f6c2f7969656c642d736f757263652d6e6f742d636f6e74726163742d61646472657373",
                              "id": 9360,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1300:56:45",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_e49353bf8abfb4c1ce8835e659189363f13f10acee2b3102e75e96cda794c6c2",
                                "typeString": "literal_string \"YieldSourcePrizePool/yield-source-not-contract-address\""
                              },
                              "value": "YieldSourcePrizePool/yield-source-not-contract-address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_e49353bf8abfb4c1ce8835e659189363f13f10acee2b3102e75e96cda794c6c2",
                                "typeString": "literal_string \"YieldSourcePrizePool/yield-source-not-contract-address\""
                              }
                            ],
                            "id": 9353,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1256:7:45",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 9361,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1256:101:45",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9362,
                        "nodeType": "ExpressionStatement",
                        "src": "1256:101:45"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 9366,
                              "name": "_reserveRegistry",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9341,
                              "src": "1391:16:45",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                                "typeString": "contract RegistryInterface"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 9367,
                              "name": "_controlledTokens",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9344,
                              "src": "1415:17:45",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                                "typeString": "contract ControlledTokenInterface[] memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 9368,
                              "name": "_maxExitFeeMantissa",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9346,
                              "src": "1440:19:45",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                                "typeString": "contract RegistryInterface"
                              },
                              {
                                "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                                "typeString": "contract ControlledTokenInterface[] memory"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 9363,
                              "name": "PrizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8751,
                              "src": "1363:9:45",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_PrizePool_$8751_$",
                                "typeString": "type(contract PrizePool)"
                              }
                            },
                            "id": 9365,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "initialize",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 6941,
                            "src": "1363:20:45",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_RegistryInterface_$12458_$_t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr_$_t_uint256_$returns$__$",
                              "typeString": "function (contract RegistryInterface,contract ControlledTokenInterface[] memory,uint256)"
                            }
                          },
                          "id": 9369,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1363:102:45",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9370,
                        "nodeType": "ExpressionStatement",
                        "src": "1363:102:45"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 9373,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 9371,
                            "name": "yieldSource",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9334,
                            "src": "1471:11:45",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IYieldSource_$5623",
                              "typeString": "contract IYieldSource"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 9372,
                            "name": "_yieldSource",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9348,
                            "src": "1485:12:45",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IYieldSource_$5623",
                              "typeString": "contract IYieldSource"
                            }
                          },
                          "src": "1471:26:45",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IYieldSource_$5623",
                            "typeString": "contract IYieldSource"
                          }
                        },
                        "id": 9374,
                        "nodeType": "ExpressionStatement",
                        "src": "1471:26:45"
                      },
                      {
                        "assignments": [
                          9376,
                          null
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 9376,
                            "mutability": "mutable",
                            "name": "succeeded",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 9402,
                            "src": "1568:14:45",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 9375,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "1568:4:45",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          null
                        ],
                        "id": 9389,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 9384,
                                      "name": "_yieldSource",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 9348,
                                      "src": "1631:12:45",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IYieldSource_$5623",
                                        "typeString": "contract IYieldSource"
                                      }
                                    },
                                    "id": 9385,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "depositToken",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 5598,
                                    "src": "1631:25:45",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_view$__$returns$_t_address_$",
                                      "typeString": "function () view external returns (address)"
                                    }
                                  },
                                  "id": 9386,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "selector",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "1631:34:45",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 9382,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "1620:3:45",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 9383,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encode",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "1620:10:45",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function () pure returns (bytes memory)"
                                }
                              },
                              "id": 9387,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1620:46:45",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 9379,
                                  "name": "_yieldSource",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 9348,
                                  "src": "1595:12:45",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IYieldSource_$5623",
                                    "typeString": "contract IYieldSource"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_IYieldSource_$5623",
                                    "typeString": "contract IYieldSource"
                                  }
                                ],
                                "id": 9378,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "1587:7:45",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 9377,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "1587:7:45",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 9380,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1587:21:45",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "id": 9381,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "staticcall",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "1587:32:45",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_barestaticcall_view$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                              "typeString": "function (bytes memory) view returns (bool,bytes memory)"
                            }
                          },
                          "id": 9388,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1587:80:45",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(bool,bytes memory)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1567:100:45"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 9391,
                              "name": "succeeded",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9376,
                              "src": "1681:9:45",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5969656c64536f757263655072697a65506f6f6c2f696e76616c69642d7969656c642d736f75726365",
                              "id": 9392,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1692:43:45",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_11a209ccfa541311d13853078244f17ddd8fdab4bc6a8bba4b0700d66b1422e4",
                                "typeString": "literal_string \"YieldSourcePrizePool/invalid-yield-source\""
                              },
                              "value": "YieldSourcePrizePool/invalid-yield-source"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_11a209ccfa541311d13853078244f17ddd8fdab4bc6a8bba4b0700d66b1422e4",
                                "typeString": "literal_string \"YieldSourcePrizePool/invalid-yield-source\""
                              }
                            ],
                            "id": 9390,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1673:7:45",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 9393,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1673:63:45",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9394,
                        "nodeType": "ExpressionStatement",
                        "src": "1673:63:45"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 9398,
                                  "name": "_yieldSource",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 9348,
                                  "src": "1788:12:45",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IYieldSource_$5623",
                                    "typeString": "contract IYieldSource"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_IYieldSource_$5623",
                                    "typeString": "contract IYieldSource"
                                  }
                                ],
                                "id": 9397,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "1780:7:45",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 9396,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "1780:7:45",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 9399,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1780:21:45",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 9395,
                            "name": "YieldSourcePrizePoolInitialized",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9338,
                            "src": "1748:31:45",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 9400,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1748:54:45",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9401,
                        "nodeType": "EmitStatement",
                        "src": "1743:59:45"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9339,
                    "nodeType": "StructuredDocumentation",
                    "src": "652:360:45",
                    "text": "@notice Initializes the Prize Pool and Yield Service with the required contract connections\n @param _controlledTokens Array of addresses for the Ticket and Sponsorship Tokens controlled by the Prize Pool\n @param _maxExitFeeMantissa The maximum exit fee size, relative to the withdrawal amount\n @param _yieldSource Address of the yield source"
                  },
                  "functionSelector": "cfa24007",
                  "id": 9403,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 9351,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 9350,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "1236:11:45",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "1236:11:45"
                    }
                  ],
                  "name": "initializeYieldSourcePrizePool",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 9349,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9341,
                        "mutability": "mutable",
                        "name": "_reserveRegistry",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9403,
                        "src": "1061:34:45",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                          "typeString": "contract RegistryInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9340,
                          "name": "RegistryInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 12458,
                          "src": "1061:17:45",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                            "typeString": "contract RegistryInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9344,
                        "mutability": "mutable",
                        "name": "_controlledTokens",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9403,
                        "src": "1101:51:45",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                          "typeString": "contract ControlledTokenInterface[]"
                        },
                        "typeName": {
                          "baseType": {
                            "contractScope": null,
                            "id": 9342,
                            "name": "ControlledTokenInterface",
                            "nodeType": "UserDefinedTypeName",
                            "referencedDeclaration": 15850,
                            "src": "1101:24:45",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                              "typeString": "contract ControlledTokenInterface"
                            }
                          },
                          "id": 9343,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "1101:26:45",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_storage_ptr",
                            "typeString": "contract ControlledTokenInterface[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9346,
                        "mutability": "mutable",
                        "name": "_maxExitFeeMantissa",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9403,
                        "src": "1158:27:45",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9345,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1158:7:45",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9348,
                        "mutability": "mutable",
                        "name": "_yieldSource",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9403,
                        "src": "1191:25:45",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IYieldSource_$5623",
                          "typeString": "contract IYieldSource"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9347,
                          "name": "IYieldSource",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 5623,
                          "src": "1191:12:45",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IYieldSource_$5623",
                            "typeString": "contract IYieldSource"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1055:165:45"
                  },
                  "returnParameters": {
                    "id": 9352,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1250:0:45"
                  },
                  "scope": 9493,
                  "src": "1015:792:45",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    8655
                  ],
                  "body": {
                    "id": 9419,
                    "nodeType": "Block",
                    "src": "2301:56:45",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 9417,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 9412,
                            "name": "_externalToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9406,
                            "src": "2314:14:45",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 9415,
                                "name": "yieldSource",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 9334,
                                "src": "2340:11:45",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IYieldSource_$5623",
                                  "typeString": "contract IYieldSource"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_IYieldSource_$5623",
                                  "typeString": "contract IYieldSource"
                                }
                              ],
                              "id": 9414,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "2332:7:45",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 9413,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "2332:7:45",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 9416,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "2332:20:45",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "2314:38:45",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 9411,
                        "id": 9418,
                        "nodeType": "Return",
                        "src": "2307:45:45"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9404,
                    "nodeType": "StructuredDocumentation",
                    "src": "1811:398:45",
                    "text": "@notice Determines whether the passed token can be transferred out as an external award.\n @dev Different yield sources will hold the deposits as another kind of token: such a Compound's cToken.  The\n prize strategy should not be allowed to move those tokens.\n @param _externalToken The address of the token to check\n @return True if the token may be awarded, false otherwise"
                  },
                  "id": 9420,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_canAwardExternal",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 9408,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "2272:8:45"
                  },
                  "parameters": {
                    "id": 9407,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9406,
                        "mutability": "mutable",
                        "name": "_externalToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9420,
                        "src": "2239:22:45",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 9405,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2239:7:45",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2238:24:45"
                  },
                  "returnParameters": {
                    "id": 9411,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9410,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9420,
                        "src": "2295:4:45",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 9409,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "2295:4:45",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2294:6:45"
                  },
                  "scope": 9493,
                  "src": "2212:145:45",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8667
                  ],
                  "body": {
                    "id": 9435,
                    "nodeType": "Block",
                    "src": "2571:59:45",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 9431,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "2619:4:45",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                                    "typeString": "contract YieldSourcePrizePool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                                    "typeString": "contract YieldSourcePrizePool"
                                  }
                                ],
                                "id": 9430,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "2611:7:45",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 9429,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "2611:7:45",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 9432,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2611:13:45",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 9427,
                              "name": "yieldSource",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9334,
                              "src": "2584:11:45",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IYieldSource_$5623",
                                "typeString": "contract IYieldSource"
                              }
                            },
                            "id": 9428,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balanceOfToken",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5606,
                            "src": "2584:26:45",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) external returns (uint256)"
                            }
                          },
                          "id": 9433,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2584:41:45",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 9426,
                        "id": 9434,
                        "nodeType": "Return",
                        "src": "2577:48:45"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9421,
                    "nodeType": "StructuredDocumentation",
                    "src": "2361:151:45",
                    "text": "@notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\n @return The underlying balance of asset tokens"
                  },
                  "id": 9436,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_balance",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 9423,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "2544:8:45"
                  },
                  "parameters": {
                    "id": 9422,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2532:2:45"
                  },
                  "returnParameters": {
                    "id": 9426,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9425,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9436,
                        "src": "2562:7:45",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9424,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2562:7:45",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2561:9:45"
                  },
                  "scope": 9493,
                  "src": "2515:115:45",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8661
                  ],
                  "body": {
                    "id": 9448,
                    "nodeType": "Block",
                    "src": "2703:63:45",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 9443,
                                  "name": "yieldSource",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 9334,
                                  "src": "2734:11:45",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IYieldSource_$5623",
                                    "typeString": "contract IYieldSource"
                                  }
                                },
                                "id": 9444,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "depositToken",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 5598,
                                "src": "2734:24:45",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_view$__$returns$_t_address_$",
                                  "typeString": "function () view external returns (address)"
                                }
                              },
                              "id": 9445,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2734:26:45",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 9442,
                            "name": "IERC20Upgradeable",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1960,
                            "src": "2716:17:45",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_IERC20Upgradeable_$1960_$",
                              "typeString": "type(contract IERC20Upgradeable)"
                            }
                          },
                          "id": 9446,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2716:45:45",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "functionReturnParameters": 9441,
                        "id": 9447,
                        "nodeType": "Return",
                        "src": "2709:52:45"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 9449,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_token",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 9438,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "2661:8:45"
                  },
                  "parameters": {
                    "id": 9437,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2649:2:45"
                  },
                  "returnParameters": {
                    "id": 9441,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9440,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9449,
                        "src": "2684:17:45",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9439,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "2684:17:45",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2683:19:45"
                  },
                  "scope": 9493,
                  "src": "2634:132:45",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8673
                  ],
                  "body": {
                    "id": 9476,
                    "nodeType": "Block",
                    "src": "2948:123:45",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 9461,
                                  "name": "yieldSource",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 9334,
                                  "src": "2983:11:45",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IYieldSource_$5623",
                                    "typeString": "contract IYieldSource"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_IYieldSource_$5623",
                                    "typeString": "contract IYieldSource"
                                  }
                                ],
                                "id": 9460,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "2975:7:45",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 9459,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "2975:7:45",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 9462,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2975:20:45",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 9463,
                              "name": "mintAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9452,
                              "src": "2997:10:45",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 9456,
                                "name": "_token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [
                                  9449
                                ],
                                "referencedDeclaration": 9449,
                                "src": "2954:6:45",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IERC20Upgradeable_$1960_$",
                                  "typeString": "function () view returns (contract IERC20Upgradeable)"
                                }
                              },
                              "id": 9457,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2954:8:45",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            "id": 9458,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "safeApprove",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 2062,
                            "src": "2954:20:45",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20Upgradeable_$1960_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20Upgradeable_$1960_$",
                              "typeString": "function (contract IERC20Upgradeable,address,uint256)"
                            }
                          },
                          "id": 9464,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2954:54:45",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9465,
                        "nodeType": "ExpressionStatement",
                        "src": "2954:54:45"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 9469,
                              "name": "mintAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9452,
                              "src": "3040:10:45",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 9472,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "3060:4:45",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                                    "typeString": "contract YieldSourcePrizePool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                                    "typeString": "contract YieldSourcePrizePool"
                                  }
                                ],
                                "id": 9471,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "3052:7:45",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 9470,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "3052:7:45",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 9473,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3052:13:45",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 9466,
                              "name": "yieldSource",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9334,
                              "src": "3014:11:45",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IYieldSource_$5623",
                                "typeString": "contract IYieldSource"
                              }
                            },
                            "id": 9468,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "supplyTokenTo",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5614,
                            "src": "3014:25:45",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$_t_address_$returns$__$",
                              "typeString": "function (uint256,address) external"
                            }
                          },
                          "id": 9474,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3014:52:45",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9475,
                        "nodeType": "ExpressionStatement",
                        "src": "3014:52:45"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9450,
                    "nodeType": "StructuredDocumentation",
                    "src": "2770:120:45",
                    "text": "@notice Supplies asset tokens to the yield source.\n @param mintAmount The amount of asset tokens to be supplied"
                  },
                  "id": 9477,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_supply",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 9454,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "2939:8:45"
                  },
                  "parameters": {
                    "id": 9453,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9452,
                        "mutability": "mutable",
                        "name": "mintAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9477,
                        "src": "2910:18:45",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9451,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2910:7:45",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2909:20:45"
                  },
                  "returnParameters": {
                    "id": 9455,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2948:0:45"
                  },
                  "scope": 9493,
                  "src": "2893:178:45",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8681
                  ],
                  "body": {
                    "id": 9491,
                    "nodeType": "Block",
                    "src": "3346:55:45",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 9488,
                              "name": "redeemAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9480,
                              "src": "3383:12:45",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 9486,
                              "name": "yieldSource",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9334,
                              "src": "3359:11:45",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IYieldSource_$5623",
                                "typeString": "contract IYieldSource"
                              }
                            },
                            "id": 9487,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "redeemToken",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5622,
                            "src": "3359:23:45",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256) external returns (uint256)"
                            }
                          },
                          "id": 9489,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3359:37:45",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 9485,
                        "id": 9490,
                        "nodeType": "Return",
                        "src": "3352:44:45"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9478,
                    "nodeType": "StructuredDocumentation",
                    "src": "3075:193:45",
                    "text": "@notice Redeems asset tokens from the yield source.\n @param redeemAmount The amount of yield-bearing tokens to be redeemed\n @return The actual amount of tokens that were redeemed."
                  },
                  "id": 9492,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_redeem",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 9482,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "3319:8:45"
                  },
                  "parameters": {
                    "id": 9481,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9480,
                        "mutability": "mutable",
                        "name": "redeemAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9492,
                        "src": "3288:20:45",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9479,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3288:7:45",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3287:22:45"
                  },
                  "returnParameters": {
                    "id": 9485,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9484,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9492,
                        "src": "3337:7:45",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9483,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3337:7:45",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3336:9:45"
                  },
                  "scope": 9493,
                  "src": "3271:130:45",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 9494,
              "src": "404:2999:45"
            }
          ],
          "src": "37:3366:45"
        },
        "id": 45
      },
      "contracts/prize-pool/yield-source/YieldSourcePrizePoolProxyFactory.sol": {
        "ast": {
          "absolutePath": "contracts/prize-pool/yield-source/YieldSourcePrizePoolProxyFactory.sol",
          "exportedSymbols": {
            "YieldSourcePrizePoolProxyFactory": [
              9532
            ]
          },
          "id": 9533,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 9495,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:46"
            },
            {
              "absolutePath": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol",
              "file": "./YieldSourcePrizePool.sol",
              "id": 9496,
              "nodeType": "ImportDirective",
              "scope": 9533,
              "sourceUnit": 9494,
              "src": "62:36:46",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/external/openzeppelin/ProxyFactory.sol",
              "file": "../../external/openzeppelin/ProxyFactory.sol",
              "id": 9497,
              "nodeType": "ImportDirective",
              "scope": 9533,
              "sourceUnit": 6617,
              "src": "99:54:46",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 9499,
                    "name": "ProxyFactory",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 6616,
                    "src": "325:12:46",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ProxyFactory_$6616",
                      "typeString": "contract ProxyFactory"
                    }
                  },
                  "id": 9500,
                  "nodeType": "InheritanceSpecifier",
                  "src": "325:12:46"
                }
              ],
              "contractDependencies": [
                6616,
                9493
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 9498,
                "nodeType": "StructuredDocumentation",
                "src": "155:125:46",
                "text": "@title Yield Source Prize Pool Proxy Factory\n @notice Minimal proxy pattern for creating new Yield Source Prize Pools"
              },
              "fullyImplemented": true,
              "id": 9532,
              "linearizedBaseContracts": [
                9532,
                6616
              ],
              "name": "YieldSourcePrizePoolProxyFactory",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "documentation": {
                    "id": 9501,
                    "nodeType": "StructuredDocumentation",
                    "src": "343:63:46",
                    "text": "@notice Contract template for deploying proxied Prize Pools"
                  },
                  "functionSelector": "022ec095",
                  "id": 9503,
                  "mutability": "mutable",
                  "name": "instance",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9532,
                  "src": "409:36:46",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                    "typeString": "contract YieldSourcePrizePool"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 9502,
                    "name": "YieldSourcePrizePool",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9493,
                    "src": "409:20:46",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                      "typeString": "contract YieldSourcePrizePool"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 9513,
                    "nodeType": "Block",
                    "src": "558:48:46",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 9511,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 9507,
                            "name": "instance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9503,
                            "src": "564:8:46",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                              "typeString": "contract YieldSourcePrizePool"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 9509,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "575:24:46",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_creation_nonpayable$__$returns$_t_contract$_YieldSourcePrizePool_$9493_$",
                                "typeString": "function () returns (contract YieldSourcePrizePool)"
                              },
                              "typeName": {
                                "contractScope": null,
                                "id": 9508,
                                "name": "YieldSourcePrizePool",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 9493,
                                "src": "579:20:46",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                                  "typeString": "contract YieldSourcePrizePool"
                                }
                              }
                            },
                            "id": 9510,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "575:26:46",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                              "typeString": "contract YieldSourcePrizePool"
                            }
                          },
                          "src": "564:37:46",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                            "typeString": "contract YieldSourcePrizePool"
                          }
                        },
                        "id": 9512,
                        "nodeType": "ExpressionStatement",
                        "src": "564:37:46"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9504,
                    "nodeType": "StructuredDocumentation",
                    "src": "450:83:46",
                    "text": "@notice Initializes the Factory with an instance of the Yield Source Prize Pool"
                  },
                  "id": 9514,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 9505,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "548:2:46"
                  },
                  "returnParameters": {
                    "id": 9506,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "558:0:46"
                  },
                  "scope": 9532,
                  "src": "536:70:46",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 9530,
                    "nodeType": "Block",
                    "src": "825:76:46",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 9524,
                                      "name": "instance",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 9503,
                                      "src": "881:8:46",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                                        "typeString": "contract YieldSourcePrizePool"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                                        "typeString": "contract YieldSourcePrizePool"
                                      }
                                    ],
                                    "id": 9523,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "873:7:46",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 9522,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "873:7:46",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 9525,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "873:17:46",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "hexValue": "",
                                  "id": 9526,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "892:2:46",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                    "typeString": "literal_string \"\""
                                  },
                                  "value": ""
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                    "typeString": "literal_string \"\""
                                  }
                                ],
                                "id": 9521,
                                "name": "deployMinimal",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6615,
                                "src": "859:13:46",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_address_$",
                                  "typeString": "function (address,bytes memory) returns (address)"
                                }
                              },
                              "id": 9527,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "859:36:46",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 9520,
                            "name": "YieldSourcePrizePool",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9493,
                            "src": "838:20:46",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_YieldSourcePrizePool_$9493_$",
                              "typeString": "type(contract YieldSourcePrizePool)"
                            }
                          },
                          "id": 9528,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "838:58:46",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                            "typeString": "contract YieldSourcePrizePool"
                          }
                        },
                        "functionReturnParameters": 9519,
                        "id": 9529,
                        "nodeType": "Return",
                        "src": "831:65:46"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9515,
                    "nodeType": "StructuredDocumentation",
                    "src": "610:154:46",
                    "text": "@notice Creates a new Yield Source Prize Pool as a proxy of the template instance\n @return A reference to the new proxied Yield Source Prize Pool"
                  },
                  "functionSelector": "efc81a8c",
                  "id": 9531,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "create",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 9516,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "782:2:46"
                  },
                  "returnParameters": {
                    "id": 9519,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9518,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9531,
                        "src": "803:20:46",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                          "typeString": "contract YieldSourcePrizePool"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9517,
                          "name": "YieldSourcePrizePool",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 9493,
                          "src": "803:20:46",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                            "typeString": "contract YieldSourcePrizePool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "802:22:46"
                  },
                  "scope": 9532,
                  "src": "767:134:46",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 9533,
              "src": "280:623:46"
            }
          ],
          "src": "37:867:46"
        },
        "id": 46
      },
      "contracts/prize-strategy/BeforeAwardListener.sol": {
        "ast": {
          "absolutePath": "contracts/prize-strategy/BeforeAwardListener.sol",
          "exportedSymbols": {
            "BeforeAwardListener": [
              9560
            ]
          },
          "id": 9561,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 9534,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:47"
            },
            {
              "absolutePath": "contracts/prize-strategy/BeforeAwardListenerInterface.sol",
              "file": "./BeforeAwardListenerInterface.sol",
              "id": 9535,
              "nodeType": "ImportDirective",
              "scope": 9561,
              "sourceUnit": 9576,
              "src": "62:44:47",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/Constants.sol",
              "file": "../Constants.sol",
              "id": 9536,
              "nodeType": "ImportDirective",
              "scope": 9561,
              "sourceUnit": 5633,
              "src": "107:26:47",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/prize-strategy/BeforeAwardListenerLibrary.sol",
              "file": "./BeforeAwardListenerLibrary.sol",
              "id": 9537,
              "nodeType": "ImportDirective",
              "scope": 9561,
              "sourceUnit": 9582,
              "src": "134:42:47",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": true,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 9538,
                    "name": "BeforeAwardListenerInterface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9575,
                    "src": "219:28:47",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                      "typeString": "contract BeforeAwardListenerInterface"
                    }
                  },
                  "id": 9539,
                  "nodeType": "InheritanceSpecifier",
                  "src": "219:28:47"
                }
              ],
              "contractDependencies": [
                931,
                9575
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": false,
              "id": 9560,
              "linearizedBaseContracts": [
                9560,
                9575,
                931
              ],
              "name": "BeforeAwardListener",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "baseFunctions": [
                    930
                  ],
                  "body": {
                    "id": 9558,
                    "nodeType": "Block",
                    "src": "337:177:47",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 9555,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_bytes4",
                                  "typeString": "bytes4"
                                },
                                "id": 9550,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 9547,
                                  "name": "interfaceId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 9541,
                                  "src": "358:11:47",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 9548,
                                    "name": "Constants",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 5632,
                                    "src": "373:9:47",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_Constants_$5632_$",
                                      "typeString": "type(library Constants)"
                                    }
                                  },
                                  "id": 9549,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "ERC165_INTERFACE_ID_ERC165",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 5628,
                                  "src": "373:36:47",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                "src": "358:51:47",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_bytes4",
                                  "typeString": "bytes4"
                                },
                                "id": 9554,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 9551,
                                  "name": "interfaceId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 9541,
                                  "src": "420:11:47",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 9552,
                                    "name": "BeforeAwardListenerLibrary",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 9581,
                                    "src": "435:26:47",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_BeforeAwardListenerLibrary_$9581_$",
                                      "typeString": "type(library BeforeAwardListenerLibrary)"
                                    }
                                  },
                                  "id": 9553,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 9580,
                                  "src": "435:68:47",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                "src": "420:83:47",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "358:145:47",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "id": 9556,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "350:159:47",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 9546,
                        "id": 9557,
                        "nodeType": "Return",
                        "src": "343:166:47"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "01ffc9a7",
                  "id": 9559,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "supportsInterface",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 9543,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "308:8:47"
                  },
                  "parameters": {
                    "id": 9542,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9541,
                        "mutability": "mutable",
                        "name": "interfaceId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9559,
                        "src": "279:18:47",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        },
                        "typeName": {
                          "id": 9540,
                          "name": "bytes4",
                          "nodeType": "ElementaryTypeName",
                          "src": "279:6:47",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes4",
                            "typeString": "bytes4"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "278:20:47"
                  },
                  "returnParameters": {
                    "id": 9546,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9545,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9559,
                        "src": "331:4:47",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 9544,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "331:4:47",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "330:6:47"
                  },
                  "scope": 9560,
                  "src": "252:262:47",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 9561,
              "src": "178:338:47"
            }
          ],
          "src": "37:479:47"
        },
        "id": 47
      },
      "contracts/prize-strategy/BeforeAwardListenerInterface.sol": {
        "ast": {
          "absolutePath": "contracts/prize-strategy/BeforeAwardListenerInterface.sol",
          "exportedSymbols": {
            "BeforeAwardListenerInterface": [
              9575
            ]
          },
          "id": 9576,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 9562,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:48"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol",
              "id": 9563,
              "nodeType": "ImportDirective",
              "scope": 9576,
              "sourceUnit": 932,
              "src": "62:82:48",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 9565,
                    "name": "IERC165Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 931,
                    "src": "344:18:48",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC165Upgradeable_$931",
                      "typeString": "contract IERC165Upgradeable"
                    }
                  },
                  "id": 9566,
                  "nodeType": "InheritanceSpecifier",
                  "src": "344:18:48"
                }
              ],
              "contractDependencies": [
                931
              ],
              "contractKind": "interface",
              "documentation": {
                "id": 9564,
                "nodeType": "StructuredDocumentation",
                "src": "146:156:48",
                "text": "@notice The interface for the Periodic Prize Strategy before award listener.  This listener will be called immediately before the award is distributed."
              },
              "fullyImplemented": false,
              "id": 9575,
              "linearizedBaseContracts": [
                9575,
                931
              ],
              "name": "BeforeAwardListenerInterface",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 9567,
                    "nodeType": "StructuredDocumentation",
                    "src": "367:62:48",
                    "text": "@notice Called immediately before the award is distributed"
                  },
                  "functionSelector": "4cdf9c3e",
                  "id": 9574,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "beforePrizePoolAwarded",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 9572,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9569,
                        "mutability": "mutable",
                        "name": "randomNumber",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9574,
                        "src": "464:20:48",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9568,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "464:7:48",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9571,
                        "mutability": "mutable",
                        "name": "prizePeriodStartedAt",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9574,
                        "src": "486:28:48",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9570,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "486:7:48",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "463:52:48"
                  },
                  "returnParameters": {
                    "id": 9573,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "524:0:48"
                  },
                  "scope": 9575,
                  "src": "432:93:48",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 9576,
              "src": "302:225:48"
            }
          ],
          "src": "37:491:48"
        },
        "id": 48
      },
      "contracts/prize-strategy/BeforeAwardListenerLibrary.sol": {
        "ast": {
          "absolutePath": "contracts/prize-strategy/BeforeAwardListenerLibrary.sol",
          "exportedSymbols": {
            "BeforeAwardListenerLibrary": [
              9581
            ]
          },
          "id": 9582,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 9577,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:49"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": null,
              "fullyImplemented": true,
              "id": 9581,
              "linearizedBaseContracts": [
                9581
              ],
              "name": "BeforeAwardListenerLibrary",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": true,
                  "functionSelector": "8a741914",
                  "id": 9580,
                  "mutability": "constant",
                  "name": "ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 9581,
                  "src": "198:77:49",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 9578,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "198:6:49",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30783463646639633365",
                    "id": 9579,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "265:10:49",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_1289722942_by_1",
                      "typeString": "int_const 1289722942"
                    },
                    "value": "0x4cdf9c3e"
                  },
                  "visibility": "public"
                }
              ],
              "scope": 9582,
              "src": "62:216:49"
            }
          ],
          "src": "37:241:49"
        },
        "id": 49
      },
      "contracts/prize-strategy/PeriodicPrizeStrategy.sol": {
        "ast": {
          "absolutePath": "contracts/prize-strategy/PeriodicPrizeStrategy.sol",
          "exportedSymbols": {
            "PeriodicPrizeStrategy": [
              11391
            ]
          },
          "id": 11392,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 9583,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:50"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol",
              "id": 9584,
              "nodeType": "ImportDirective",
              "scope": 11392,
              "sourceUnit": 131,
              "src": "62:75:50",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol",
              "id": 9585,
              "nodeType": "ImportDirective",
              "scope": 11392,
              "sourceUnit": 1287,
              "src": "138:74:50",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol",
              "id": 9586,
              "nodeType": "ImportDirective",
              "scope": 11392,
              "sourceUnit": 5101,
              "src": "213:75:50",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/introspection/ERC165CheckerUpgradeable.sol",
              "id": 9587,
              "nodeType": "ImportDirective",
              "scope": 11392,
              "sourceUnit": 845,
              "src": "289:88:50",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "id": 9588,
              "nodeType": "ImportDirective",
              "scope": 11392,
              "sourceUnit": 1961,
              "src": "378:79:50",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol",
              "id": 9589,
              "nodeType": "ImportDirective",
              "scope": 11392,
              "sourceUnit": 2174,
              "src": "458:82:50",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol",
              "id": 9590,
              "nodeType": "ImportDirective",
              "scope": 11392,
              "sourceUnit": 3583,
              "src": "541:74:50",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol",
              "file": "@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol",
              "id": 9591,
              "nodeType": "ImportDirective",
              "scope": 11392,
              "sourceUnit": 5532,
              "src": "616:77:50",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@pooltogether/fixed-point/contracts/FixedPoint.sol",
              "file": "@pooltogether/fixed-point/contracts/FixedPoint.sol",
              "id": 9592,
              "nodeType": "ImportDirective",
              "scope": 11392,
              "sourceUnit": 5280,
              "src": "694:60:50",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/token/TokenListener.sol",
              "file": "../token/TokenListener.sol",
              "id": 9593,
              "nodeType": "ImportDirective",
              "scope": 11392,
              "sourceUnit": 16235,
              "src": "756:36:50",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/token/TokenControllerInterface.sol",
              "file": "../token/TokenControllerInterface.sol",
              "id": 9594,
              "nodeType": "ImportDirective",
              "scope": 11392,
              "sourceUnit": 16207,
              "src": "793:47:50",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/token/ControlledToken.sol",
              "file": "../token/ControlledToken.sol",
              "id": 9595,
              "nodeType": "ImportDirective",
              "scope": 11392,
              "sourceUnit": 15811,
              "src": "841:38:50",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/token/TicketInterface.sol",
              "file": "../token/TicketInterface.sol",
              "id": 9596,
              "nodeType": "ImportDirective",
              "scope": 11392,
              "sourceUnit": 16153,
              "src": "880:38:50",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/prize-pool/PrizePool.sol",
              "file": "../prize-pool/PrizePool.sol",
              "id": 9597,
              "nodeType": "ImportDirective",
              "scope": 11392,
              "sourceUnit": 8752,
              "src": "919:37:50",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/Constants.sol",
              "file": "../Constants.sol",
              "id": 9598,
              "nodeType": "ImportDirective",
              "scope": 11392,
              "sourceUnit": 5633,
              "src": "957:26:50",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/prize-strategy/PeriodicPrizeStrategyListenerInterface.sol",
              "file": "./PeriodicPrizeStrategyListenerInterface.sol",
              "id": 9599,
              "nodeType": "ImportDirective",
              "scope": 11392,
              "sourceUnit": 11433,
              "src": "984:54:50",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/prize-strategy/PeriodicPrizeStrategyListenerLibrary.sol",
              "file": "./PeriodicPrizeStrategyListenerLibrary.sol",
              "id": 9600,
              "nodeType": "ImportDirective",
              "scope": 11392,
              "sourceUnit": 11439,
              "src": "1039:52:50",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/prize-strategy/BeforeAwardListener.sol",
              "file": "./BeforeAwardListener.sol",
              "id": 9601,
              "nodeType": "ImportDirective",
              "scope": 11392,
              "sourceUnit": 9561,
              "src": "1092:35:50",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": true,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 9602,
                    "name": "Initializable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1352,
                    "src": "1219:13:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Initializable_$1352",
                      "typeString": "contract Initializable"
                    }
                  },
                  "id": 9603,
                  "nodeType": "InheritanceSpecifier",
                  "src": "1219:13:50"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 9604,
                    "name": "OwnableUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 130,
                    "src": "1277:18:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_OwnableUpgradeable_$130",
                      "typeString": "contract OwnableUpgradeable"
                    }
                  },
                  "id": 9605,
                  "nodeType": "InheritanceSpecifier",
                  "src": "1277:18:50"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 9606,
                    "name": "TokenListener",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 16234,
                    "src": "1340:13:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TokenListener_$16234",
                      "typeString": "contract TokenListener"
                    }
                  },
                  "id": 9607,
                  "nodeType": "InheritanceSpecifier",
                  "src": "1340:13:50"
                }
              ],
              "contractDependencies": [
                130,
                931,
                1352,
                3627,
                16234,
                16265
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": false,
              "id": 11391,
              "linearizedBaseContracts": [
                11391,
                16234,
                16265,
                931,
                130,
                3627,
                1352
              ],
              "name": "PeriodicPrizeStrategy",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 9610,
                  "libraryName": {
                    "contractScope": null,
                    "id": 9608,
                    "name": "SafeMathUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1286,
                    "src": "1365:19:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeMathUpgradeable_$1286",
                      "typeString": "library SafeMathUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "1359:38:50",
                  "typeName": {
                    "id": 9609,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1389:7:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "id": 9613,
                  "libraryName": {
                    "contractScope": null,
                    "id": 9611,
                    "name": "SafeMathUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1286,
                    "src": "1406:19:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeMathUpgradeable_$1286",
                      "typeString": "library SafeMathUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "1400:37:50",
                  "typeName": {
                    "id": 9612,
                    "name": "uint16",
                    "nodeType": "ElementaryTypeName",
                    "src": "1430:6:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint16",
                      "typeString": "uint16"
                    }
                  }
                },
                {
                  "id": 9616,
                  "libraryName": {
                    "contractScope": null,
                    "id": 9614,
                    "name": "SafeCastUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 5100,
                    "src": "1446:19:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeCastUpgradeable_$5100",
                      "typeString": "library SafeCastUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "1440:38:50",
                  "typeName": {
                    "id": 9615,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1470:7:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "id": 9619,
                  "libraryName": {
                    "contractScope": null,
                    "id": 9617,
                    "name": "SafeERC20Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 2173,
                    "src": "1487:20:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeERC20Upgradeable_$2173",
                      "typeString": "library SafeERC20Upgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "1481:49:50",
                  "typeName": {
                    "contractScope": null,
                    "id": 9618,
                    "name": "IERC20Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1960,
                    "src": "1512:17:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                      "typeString": "contract IERC20Upgradeable"
                    }
                  }
                },
                {
                  "id": 9622,
                  "libraryName": {
                    "contractScope": null,
                    "id": 9620,
                    "name": "MappedSinglyLinkedList",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 16704,
                    "src": "1539:22:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_MappedSinglyLinkedList_$16704",
                      "typeString": "library MappedSinglyLinkedList"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "1533:64:50",
                  "typeName": {
                    "contractScope": null,
                    "id": 9621,
                    "name": "MappedSinglyLinkedList.Mapping",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 16337,
                    "src": "1566:30:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                      "typeString": "struct MappedSinglyLinkedList.Mapping"
                    }
                  }
                },
                {
                  "id": 9625,
                  "libraryName": {
                    "contractScope": null,
                    "id": 9623,
                    "name": "AddressUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3582,
                    "src": "1606:18:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_AddressUpgradeable_$3582",
                      "typeString": "library AddressUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "1600:37:50",
                  "typeName": {
                    "id": 9624,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1629:7:50",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  }
                },
                {
                  "id": 9628,
                  "libraryName": {
                    "contractScope": null,
                    "id": 9626,
                    "name": "ERC165CheckerUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 844,
                    "src": "1646:24:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC165CheckerUpgradeable_$844",
                      "typeString": "library ERC165CheckerUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "1640:43:50",
                  "typeName": {
                    "id": 9627,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1675:7:50",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  }
                },
                {
                  "constant": true,
                  "id": 9631,
                  "mutability": "constant",
                  "name": "ETHEREUM_BLOCK_TIME_ESTIMATE_MANTISSA",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 11391,
                  "src": "1687:76:50",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 9629,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1687:7:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "31332e34",
                    "id": 9630,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "1753:10:50",
                    "subdenomination": "ether",
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_13400000000000000000_by_1",
                      "typeString": "int_const 13400000000000000000"
                    },
                    "value": "13.4"
                  },
                  "visibility": "internal"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 9637,
                  "name": "PrizePoolOpened",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 9636,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9633,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "operator",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9637,
                        "src": "1795:24:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 9632,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1795:7:50",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9635,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "prizePeriodStartedAt",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9637,
                        "src": "1825:36:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9634,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1825:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1789:76:50"
                  },
                  "src": "1768:98:50"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 9639,
                  "name": "RngRequestFailed",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 9638,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1892:2:50"
                  },
                  "src": "1870:25:50"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 9649,
                  "name": "PrizePoolAwardStarted",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 9648,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9641,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "operator",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9649,
                        "src": "1932:24:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 9640,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1932:7:50",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9643,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "prizePool",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9649,
                        "src": "1962:25:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 9642,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1962:7:50",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9645,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "rngRequestId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9649,
                        "src": "1993:27:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 9644,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "1993:6:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9647,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "rngLockBlock",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9649,
                        "src": "2026:19:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 9646,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "2026:6:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1926:123:50"
                  },
                  "src": "1899:151:50"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 9659,
                  "name": "PrizePoolAwardCancelled",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 9658,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9651,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "operator",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9659,
                        "src": "2089:24:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 9650,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2089:7:50",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9653,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "prizePool",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9659,
                        "src": "2119:25:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 9652,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2119:7:50",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9655,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "rngRequestId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9659,
                        "src": "2150:27:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 9654,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "2150:6:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9657,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "rngLockBlock",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9659,
                        "src": "2183:19:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 9656,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "2183:6:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2083:123:50"
                  },
                  "src": "2054:153:50"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 9665,
                  "name": "PrizePoolAwarded",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 9664,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9661,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "operator",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9665,
                        "src": "2239:24:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 9660,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2239:7:50",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9663,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "randomNumber",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9665,
                        "src": "2269:20:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9662,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2269:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2233:60:50"
                  },
                  "src": "2211:83:50"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 9669,
                  "name": "RngServiceUpdated",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 9668,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9667,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "rngService",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9669,
                        "src": "2327:31:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_RNGInterface_$5531",
                          "typeString": "contract RNGInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9666,
                          "name": "RNGInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 5531,
                          "src": "2327:12:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_RNGInterface_$5531",
                            "typeString": "contract RNGInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2321:41:50"
                  },
                  "src": "2298:65:50"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 9673,
                  "name": "TokenListenerUpdated",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 9672,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9671,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "tokenListener",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9673,
                        "src": "2399:44:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                          "typeString": "contract TokenListenerInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9670,
                          "name": "TokenListenerInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16265,
                          "src": "2399:22:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                            "typeString": "contract TokenListenerInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2393:54:50"
                  },
                  "src": "2367:81:50"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 9677,
                  "name": "RngRequestTimeoutSet",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 9676,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9675,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "rngRequestTimeout",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9677,
                        "src": "2484:24:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 9674,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "2484:6:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2478:34:50"
                  },
                  "src": "2452:61:50"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 9681,
                  "name": "PrizePeriodSecondsUpdated",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 9680,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9679,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "prizePeriodSeconds",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9681,
                        "src": "2554:26:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9678,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2554:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2548:36:50"
                  },
                  "src": "2517:68:50"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 9685,
                  "name": "BeforeAwardListenerSet",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 9684,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9683,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "beforeAwardListener",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9685,
                        "src": "2623:56:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                          "typeString": "contract BeforeAwardListenerInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9682,
                          "name": "BeforeAwardListenerInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 9575,
                          "src": "2623:28:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                            "typeString": "contract BeforeAwardListenerInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2617:66:50"
                  },
                  "src": "2589:95:50"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 9689,
                  "name": "PeriodicPrizeStrategyListenerSet",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 9688,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9687,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "periodicPrizeStrategyListener",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9689,
                        "src": "2732:76:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_PeriodicPrizeStrategyListenerInterface_$11432",
                          "typeString": "contract PeriodicPrizeStrategyListenerInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9686,
                          "name": "PeriodicPrizeStrategyListenerInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 11432,
                          "src": "2732:38:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_PeriodicPrizeStrategyListenerInterface_$11432",
                            "typeString": "contract PeriodicPrizeStrategyListenerInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2726:86:50"
                  },
                  "src": "2688:125:50"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 9696,
                  "name": "ExternalErc721AwardAdded",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 9695,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9691,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "externalErc721",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9696,
                        "src": "2853:41:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                          "typeString": "contract IERC721Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9690,
                          "name": "IERC721Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 3338,
                          "src": "2853:18:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                            "typeString": "contract IERC721Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9694,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "tokenIds",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9696,
                        "src": "2900:18:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 9692,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "2900:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 9693,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "2900:9:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2847:75:50"
                  },
                  "src": "2817:106:50"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 9700,
                  "name": "ExternalErc20AwardAdded",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 9699,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9698,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "externalErc20",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9700,
                        "src": "2962:39:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9697,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "2962:17:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2956:49:50"
                  },
                  "src": "2927:79:50"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 9704,
                  "name": "ExternalErc721AwardRemoved",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 9703,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9702,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "externalErc721Award",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9704,
                        "src": "3048:46:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                          "typeString": "contract IERC721Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9701,
                          "name": "IERC721Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 3338,
                          "src": "3048:18:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                            "typeString": "contract IERC721Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3042:56:50"
                  },
                  "src": "3010:89:50"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 9708,
                  "name": "ExternalErc20AwardRemoved",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 9707,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9706,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "externalErc20Award",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9708,
                        "src": "3140:44:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9705,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "3140:17:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3134:54:50"
                  },
                  "src": "3103:86:50"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 9725,
                  "name": "Initialized",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 9724,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9710,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "prizePeriodStart",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9725,
                        "src": "3216:24:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9709,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3216:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9712,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "prizePeriodSeconds",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9725,
                        "src": "3246:26:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9711,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3246:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9714,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "prizePool",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9725,
                        "src": "3278:27:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_PrizePool_$8751",
                          "typeString": "contract PrizePool"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9713,
                          "name": "PrizePool",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 8751,
                          "src": "3278:9:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_PrizePool_$8751",
                            "typeString": "contract PrizePool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9716,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "ticket",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9725,
                        "src": "3311:22:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TicketInterface_$16152",
                          "typeString": "contract TicketInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9715,
                          "name": "TicketInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16152,
                          "src": "3311:15:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TicketInterface_$16152",
                            "typeString": "contract TicketInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9718,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "sponsorship",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9725,
                        "src": "3339:29:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9717,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "3339:17:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9720,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "rng",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9725,
                        "src": "3374:16:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_RNGInterface_$5531",
                          "typeString": "contract RNGInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9719,
                          "name": "RNGInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 5531,
                          "src": "3374:12:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_RNGInterface_$5531",
                            "typeString": "contract RNGInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9723,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "externalErc20Awards",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9725,
                        "src": "3396:39:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_IERC20Upgradeable_$1960_$dyn_memory_ptr",
                          "typeString": "contract IERC20Upgradeable[]"
                        },
                        "typeName": {
                          "baseType": {
                            "contractScope": null,
                            "id": 9721,
                            "name": "IERC20Upgradeable",
                            "nodeType": "UserDefinedTypeName",
                            "referencedDeclaration": 1960,
                            "src": "3396:17:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                              "typeString": "contract IERC20Upgradeable"
                            }
                          },
                          "id": 9722,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "3396:19:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_IERC20Upgradeable_$1960_$dyn_storage_ptr",
                            "typeString": "contract IERC20Upgradeable[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3210:229:50"
                  },
                  "src": "3193:247:50"
                },
                {
                  "canonicalName": "PeriodicPrizeStrategy.RngRequest",
                  "id": 9732,
                  "members": [
                    {
                      "constant": false,
                      "id": 9727,
                      "mutability": "mutable",
                      "name": "id",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 9732,
                      "src": "3468:9:50",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      },
                      "typeName": {
                        "id": 9726,
                        "name": "uint32",
                        "nodeType": "ElementaryTypeName",
                        "src": "3468:6:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 9729,
                      "mutability": "mutable",
                      "name": "lockBlock",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 9732,
                      "src": "3483:16:50",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      },
                      "typeName": {
                        "id": 9728,
                        "name": "uint32",
                        "nodeType": "ElementaryTypeName",
                        "src": "3483:6:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 9731,
                      "mutability": "mutable",
                      "name": "requestedAt",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 9732,
                      "src": "3505:18:50",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint32",
                        "typeString": "uint32"
                      },
                      "typeName": {
                        "id": 9730,
                        "name": "uint32",
                        "nodeType": "ElementaryTypeName",
                        "src": "3505:6:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "RngRequest",
                  "nodeType": "StructDefinition",
                  "scope": 11391,
                  "src": "3444:84:50",
                  "visibility": "public"
                },
                {
                  "constant": true,
                  "documentation": {
                    "id": 9733,
                    "nodeType": "StructuredDocumentation",
                    "src": "3532:26:50",
                    "text": "@notice Semver Version"
                  },
                  "functionSelector": "ffa1ad74",
                  "id": 9736,
                  "mutability": "constant",
                  "name": "VERSION",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 11391,
                  "src": "3561:40:50",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 9734,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "3561:6:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "332e342e35",
                    "id": 9735,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "string",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "3594:7:50",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_stringliteral_59e19615ccbd44681a647c94186a0d0ab8573dc3d1cf1c3da845ed8f0142be18",
                      "typeString": "literal_string \"3.4.5\""
                    },
                    "value": "3.4.5"
                  },
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "6be51c4f",
                  "id": 9738,
                  "mutability": "mutable",
                  "name": "tokenListener",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 11391,
                  "src": "3623:43:50",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                    "typeString": "contract TokenListenerInterface"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 9737,
                    "name": "TokenListenerInterface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 16265,
                    "src": "3623:22:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                      "typeString": "contract TokenListenerInterface"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "719ce73e",
                  "id": 9740,
                  "mutability": "mutable",
                  "name": "prizePool",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 11391,
                  "src": "3696:26:50",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_PrizePool_$8751",
                    "typeString": "contract PrizePool"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 9739,
                    "name": "PrizePool",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 8751,
                    "src": "3696:9:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_PrizePool_$8751",
                      "typeString": "contract PrizePool"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "6cc25db7",
                  "id": 9742,
                  "mutability": "mutable",
                  "name": "ticket",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 11391,
                  "src": "3726:29:50",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_TicketInterface_$16152",
                    "typeString": "contract TicketInterface"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 9741,
                    "name": "TicketInterface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 16152,
                    "src": "3726:15:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TicketInterface_$16152",
                      "typeString": "contract TicketInterface"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "500db70d",
                  "id": 9744,
                  "mutability": "mutable",
                  "name": "sponsorship",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 11391,
                  "src": "3759:36:50",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                    "typeString": "contract IERC20Upgradeable"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 9743,
                    "name": "IERC20Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1960,
                    "src": "3759:17:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                      "typeString": "contract IERC20Upgradeable"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "d605787b",
                  "id": 9746,
                  "mutability": "mutable",
                  "name": "rng",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 11391,
                  "src": "3799:23:50",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_RNGInterface_$5531",
                    "typeString": "contract RNGInterface"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 9745,
                    "name": "RNGInterface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 5531,
                    "src": "3799:12:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_RNGInterface_$5531",
                      "typeString": "contract RNGInterface"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "id": 9748,
                  "mutability": "mutable",
                  "name": "rngRequest",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 11391,
                  "src": "3852:30:50",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_RngRequest_$9732_storage",
                    "typeString": "struct PeriodicPrizeStrategy.RngRequest"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 9747,
                    "name": "RngRequest",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9732,
                    "src": "3852:10:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_RngRequest_$9732_storage_ptr",
                      "typeString": "struct PeriodicPrizeStrategy.RngRequest"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 9749,
                    "nodeType": "StructuredDocumentation",
                    "src": "3887:146:50",
                    "text": "@notice RNG Request Timeout.  In fact, this is really a \"complete award\" timeout.\n If the rng completes the award can still be cancelled."
                  },
                  "functionSelector": "acca5b95",
                  "id": 9751,
                  "mutability": "mutable",
                  "name": "rngRequestTimeout",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 11391,
                  "src": "4036:31:50",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 9750,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "4036:6:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "94144c6b",
                  "id": 9753,
                  "mutability": "mutable",
                  "name": "prizePeriodSeconds",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 11391,
                  "src": "4090:33:50",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 9752,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4090:7:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "72f33ea9",
                  "id": 9755,
                  "mutability": "mutable",
                  "name": "prizePeriodStartedAt",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 11391,
                  "src": "4127:35:50",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 9754,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4127:7:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "id": 9757,
                  "mutability": "mutable",
                  "name": "externalErc20s",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 11391,
                  "src": "4213:54:50",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                    "typeString": "struct MappedSinglyLinkedList.Mapping"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 9756,
                    "name": "MappedSinglyLinkedList.Mapping",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 16337,
                    "src": "4213:30:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                      "typeString": "struct MappedSinglyLinkedList.Mapping"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 9759,
                  "mutability": "mutable",
                  "name": "externalErc721s",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 11391,
                  "src": "4271:55:50",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                    "typeString": "struct MappedSinglyLinkedList.Mapping"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 9758,
                    "name": "MappedSinglyLinkedList.Mapping",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 16337,
                    "src": "4271:30:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                      "typeString": "struct MappedSinglyLinkedList.Mapping"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 9764,
                  "mutability": "mutable",
                  "name": "externalErc721TokenIds",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 11391,
                  "src": "4404:73:50",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_contract$_IERC721Upgradeable_$3338_$_t_array$_t_uint256_$dyn_storage_$",
                    "typeString": "mapping(contract IERC721Upgradeable => uint256[])"
                  },
                  "typeName": {
                    "id": 9763,
                    "keyType": {
                      "contractScope": null,
                      "id": 9760,
                      "name": "IERC721Upgradeable",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 3338,
                      "src": "4413:18:50",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                        "typeString": "contract IERC721Upgradeable"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "4404:41:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_contract$_IERC721Upgradeable_$3338_$_t_array$_t_uint256_$dyn_storage_$",
                      "typeString": "mapping(contract IERC721Upgradeable => uint256[])"
                    },
                    "valueType": {
                      "baseType": {
                        "id": 9761,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "4435:7:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "id": 9762,
                      "length": null,
                      "nodeType": "ArrayTypeName",
                      "src": "4435:9:50",
                      "typeDescriptions": {
                        "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                        "typeString": "uint256[]"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 9765,
                    "nodeType": "StructuredDocumentation",
                    "src": "4482:65:50",
                    "text": "@notice A listener that is called before the prize is awarded"
                  },
                  "functionSelector": "0d847fc4",
                  "id": 9767,
                  "mutability": "mutable",
                  "name": "beforeAwardListener",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 11391,
                  "src": "4550:55:50",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                    "typeString": "contract BeforeAwardListenerInterface"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 9766,
                    "name": "BeforeAwardListenerInterface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9575,
                    "src": "4550:28:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                      "typeString": "contract BeforeAwardListenerInterface"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 9768,
                    "nodeType": "StructuredDocumentation",
                    "src": "4610:64:50",
                    "text": "@notice A listener that is called after the prize is awarded"
                  },
                  "functionSelector": "c2f19ee8",
                  "id": 9770,
                  "mutability": "mutable",
                  "name": "periodicPrizeStrategyListener",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 11391,
                  "src": "4677:75:50",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_PeriodicPrizeStrategyListenerInterface_$11432",
                    "typeString": "contract PeriodicPrizeStrategyListenerInterface"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 9769,
                    "name": "PeriodicPrizeStrategyListenerInterface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 11432,
                    "src": "4677:38:50",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_PeriodicPrizeStrategyListenerInterface_$11432",
                      "typeString": "contract PeriodicPrizeStrategyListenerInterface"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 9923,
                    "nodeType": "Block",
                    "src": "5416:1106:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 9800,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 9794,
                                    "name": "_prizePool",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 9777,
                                    "src": "5438:10:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_PrizePool_$8751",
                                      "typeString": "contract PrizePool"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_PrizePool_$8751",
                                      "typeString": "contract PrizePool"
                                    }
                                  ],
                                  "id": 9793,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "5430:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 9792,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "5430:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 9795,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "5430:19:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 9798,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "5461:1:50",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 9797,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "5453:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 9796,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "5453:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 9799,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "5453:10:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "5430:33:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f7072697a652d706f6f6c2d6e6f742d7a65726f",
                              "id": 9801,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "5465:43:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_5251673ea70b20031c4b16e59be626aaa02f6d233e26ae433f24e501e1a7b85d",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/prize-pool-not-zero\""
                              },
                              "value": "PeriodicPrizeStrategy/prize-pool-not-zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_5251673ea70b20031c4b16e59be626aaa02f6d233e26ae433f24e501e1a7b85d",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/prize-pool-not-zero\""
                              }
                            ],
                            "id": 9791,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "5422:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 9802,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5422:87:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9803,
                        "nodeType": "ExpressionStatement",
                        "src": "5422:87:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 9813,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 9807,
                                    "name": "_ticket",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 9779,
                                    "src": "5531:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_TicketInterface_$16152",
                                      "typeString": "contract TicketInterface"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_TicketInterface_$16152",
                                      "typeString": "contract TicketInterface"
                                    }
                                  ],
                                  "id": 9806,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "5523:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 9805,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "5523:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 9808,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "5523:16:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 9811,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "5551:1:50",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 9810,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "5543:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 9809,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "5543:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 9812,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "5543:10:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "5523:30:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f7469636b65742d6e6f742d7a65726f",
                              "id": 9814,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "5555:39:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_ddf70851f831bc74a80b9723dcb48c30ed32f7dcf991c86d781a08dacd282dec",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/ticket-not-zero\""
                              },
                              "value": "PeriodicPrizeStrategy/ticket-not-zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_ddf70851f831bc74a80b9723dcb48c30ed32f7dcf991c86d781a08dacd282dec",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/ticket-not-zero\""
                              }
                            ],
                            "id": 9804,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "5515:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 9815,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5515:80:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9816,
                        "nodeType": "ExpressionStatement",
                        "src": "5515:80:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 9826,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 9820,
                                    "name": "_sponsorship",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 9781,
                                    "src": "5617:12:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                      "typeString": "contract IERC20Upgradeable"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                      "typeString": "contract IERC20Upgradeable"
                                    }
                                  ],
                                  "id": 9819,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "5609:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 9818,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "5609:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 9821,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "5609:21:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 9824,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "5642:1:50",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 9823,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "5634:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 9822,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "5634:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 9825,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "5634:10:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "5609:35:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f73706f6e736f72736869702d6e6f742d7a65726f",
                              "id": 9827,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "5646:44:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_3d57c054aa6b607e4214f27977c1d29b9e994c6c5a722883aec835a6dc38fba3",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/sponsorship-not-zero\""
                              },
                              "value": "PeriodicPrizeStrategy/sponsorship-not-zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_3d57c054aa6b607e4214f27977c1d29b9e994c6c5a722883aec835a6dc38fba3",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/sponsorship-not-zero\""
                              }
                            ],
                            "id": 9817,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "5601:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 9828,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5601:90:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9829,
                        "nodeType": "ExpressionStatement",
                        "src": "5601:90:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 9839,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 9833,
                                    "name": "_rng",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 9783,
                                    "src": "5713:4:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_RNGInterface_$5531",
                                      "typeString": "contract RNGInterface"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_RNGInterface_$5531",
                                      "typeString": "contract RNGInterface"
                                    }
                                  ],
                                  "id": 9832,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "5705:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 9831,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "5705:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 9834,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "5705:13:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 9837,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "5730:1:50",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 9836,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "5722:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 9835,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "5722:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 9838,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "5722:10:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "5705:27:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f726e672d6e6f742d7a65726f",
                              "id": 9840,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "5734:36:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_57a44ef3aab821e4f987d92484116c81ff2a7d92a097f56a4fc184d6e3565374",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/rng-not-zero\""
                              },
                              "value": "PeriodicPrizeStrategy/rng-not-zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_57a44ef3aab821e4f987d92484116c81ff2a7d92a097f56a4fc184d6e3565374",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/rng-not-zero\""
                              }
                            ],
                            "id": 9830,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "5697:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 9841,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5697:74:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9842,
                        "nodeType": "ExpressionStatement",
                        "src": "5697:74:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 9845,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 9843,
                            "name": "prizePool",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9740,
                            "src": "5777:9:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_PrizePool_$8751",
                              "typeString": "contract PrizePool"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 9844,
                            "name": "_prizePool",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9777,
                            "src": "5789:10:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_PrizePool_$8751",
                              "typeString": "contract PrizePool"
                            }
                          },
                          "src": "5777:22:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_PrizePool_$8751",
                            "typeString": "contract PrizePool"
                          }
                        },
                        "id": 9846,
                        "nodeType": "ExpressionStatement",
                        "src": "5777:22:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 9849,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 9847,
                            "name": "ticket",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9742,
                            "src": "5805:6:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TicketInterface_$16152",
                              "typeString": "contract TicketInterface"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 9848,
                            "name": "_ticket",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9779,
                            "src": "5814:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TicketInterface_$16152",
                              "typeString": "contract TicketInterface"
                            }
                          },
                          "src": "5805:16:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TicketInterface_$16152",
                            "typeString": "contract TicketInterface"
                          }
                        },
                        "id": 9850,
                        "nodeType": "ExpressionStatement",
                        "src": "5805:16:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 9853,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 9851,
                            "name": "rng",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9746,
                            "src": "5827:3:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_RNGInterface_$5531",
                              "typeString": "contract RNGInterface"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 9852,
                            "name": "_rng",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9783,
                            "src": "5833:4:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_RNGInterface_$5531",
                              "typeString": "contract RNGInterface"
                            }
                          },
                          "src": "5827:10:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_RNGInterface_$5531",
                            "typeString": "contract RNGInterface"
                          }
                        },
                        "id": 9854,
                        "nodeType": "ExpressionStatement",
                        "src": "5827:10:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 9857,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 9855,
                            "name": "sponsorship",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9744,
                            "src": "5843:11:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                              "typeString": "contract IERC20Upgradeable"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 9856,
                            "name": "_sponsorship",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9781,
                            "src": "5857:12:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                              "typeString": "contract IERC20Upgradeable"
                            }
                          },
                          "src": "5843:26:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "id": 9858,
                        "nodeType": "ExpressionStatement",
                        "src": "5843:26:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 9860,
                              "name": "_prizePeriodSeconds",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9775,
                              "src": "5898:19:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 9859,
                            "name": "_setPrizePeriodSeconds",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10900,
                            "src": "5875:22:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 9861,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5875:43:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9862,
                        "nodeType": "ExpressionStatement",
                        "src": "5875:43:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 9863,
                            "name": "__Ownable_init",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 29,
                            "src": "5925:14:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 9864,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5925:16:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9865,
                        "nodeType": "ExpressionStatement",
                        "src": "5925:16:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 9866,
                              "name": "externalErc20s",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9757,
                              "src": "5948:14:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                              }
                            },
                            "id": 9868,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "initialize",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16360,
                            "src": "5948:25:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Mapping_$16337_storage_ptr_$returns$__$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                              "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer)"
                            }
                          },
                          "id": 9869,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5948:27:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9870,
                        "nodeType": "ExpressionStatement",
                        "src": "5948:27:50"
                      },
                      {
                        "body": {
                          "id": 9888,
                          "nodeType": "Block",
                          "src": "6038:61:50",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 9883,
                                      "name": "externalErc20Awards",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 9786,
                                      "src": "6069:19:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_contract$_IERC20Upgradeable_$1960_$dyn_memory_ptr",
                                        "typeString": "contract IERC20Upgradeable[] memory"
                                      }
                                    },
                                    "id": 9885,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 9884,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 9872,
                                      "src": "6089:1:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "6069:22:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                      "typeString": "contract IERC20Upgradeable"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                      "typeString": "contract IERC20Upgradeable"
                                    }
                                  ],
                                  "id": 9882,
                                  "name": "_addExternalErc20Award",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 10987,
                                  "src": "6046:22:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20Upgradeable_$1960_$returns$__$",
                                    "typeString": "function (contract IERC20Upgradeable)"
                                  }
                                },
                                "id": 9886,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "6046:46:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 9887,
                              "nodeType": "ExpressionStatement",
                              "src": "6046:46:50"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 9878,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 9875,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9872,
                            "src": "6001:1:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 9876,
                              "name": "externalErc20Awards",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9786,
                              "src": "6005:19:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_IERC20Upgradeable_$1960_$dyn_memory_ptr",
                                "typeString": "contract IERC20Upgradeable[] memory"
                              }
                            },
                            "id": 9877,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "6005:26:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "6001:30:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 9889,
                        "initializationExpression": {
                          "assignments": [
                            9872
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 9872,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 9889,
                              "src": "5986:9:50",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 9871,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "5986:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 9874,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 9873,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "5998:1:50",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "5986:13:50"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 9880,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "6033:3:50",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 9879,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9872,
                              "src": "6033:1:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 9881,
                          "nodeType": "ExpressionStatement",
                          "src": "6033:3:50"
                        },
                        "nodeType": "ForStatement",
                        "src": "5981:118:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 9892,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 9890,
                            "name": "prizePeriodSeconds",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9753,
                            "src": "6105:18:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 9891,
                            "name": "_prizePeriodSeconds",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9775,
                            "src": "6126:19:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "6105:40:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 9893,
                        "nodeType": "ExpressionStatement",
                        "src": "6105:40:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 9896,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 9894,
                            "name": "prizePeriodStartedAt",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9755,
                            "src": "6151:20:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 9895,
                            "name": "_prizePeriodStart",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9773,
                            "src": "6174:17:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "6151:40:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 9897,
                        "nodeType": "ExpressionStatement",
                        "src": "6151:40:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 9898,
                              "name": "externalErc721s",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9759,
                              "src": "6198:15:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                              }
                            },
                            "id": 9900,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "initialize",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16360,
                            "src": "6198:26:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Mapping_$16337_storage_ptr_$returns$__$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                              "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer)"
                            }
                          },
                          "id": 9901,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6198:28:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9902,
                        "nodeType": "ExpressionStatement",
                        "src": "6198:28:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "31383030",
                              "id": 9904,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "6277:4:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_1800_by_1",
                                "typeString": "int_const 1800"
                              },
                              "value": "1800"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_1800_by_1",
                                "typeString": "int_const 1800"
                              }
                            ],
                            "id": 9903,
                            "name": "_setRngRequestTimeout",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10863,
                            "src": "6255:21:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint32_$returns$__$",
                              "typeString": "function (uint32)"
                            }
                          },
                          "id": 9905,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6255:27:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9906,
                        "nodeType": "ExpressionStatement",
                        "src": "6255:27:50"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 9908,
                              "name": "_prizePeriodStart",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9773,
                              "src": "6313:17:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 9909,
                              "name": "_prizePeriodSeconds",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9775,
                              "src": "6338:19:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 9910,
                              "name": "_prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9777,
                              "src": "6365:10:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_PrizePool_$8751",
                                "typeString": "contract PrizePool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 9911,
                              "name": "_ticket",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9779,
                              "src": "6383:7:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_TicketInterface_$16152",
                                "typeString": "contract TicketInterface"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 9912,
                              "name": "_sponsorship",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9781,
                              "src": "6398:12:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 9913,
                              "name": "_rng",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9783,
                              "src": "6418:4:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_RNGInterface_$5531",
                                "typeString": "contract RNGInterface"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 9914,
                              "name": "externalErc20Awards",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9786,
                              "src": "6430:19:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_IERC20Upgradeable_$1960_$dyn_memory_ptr",
                                "typeString": "contract IERC20Upgradeable[] memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_contract$_PrizePool_$8751",
                                "typeString": "contract PrizePool"
                              },
                              {
                                "typeIdentifier": "t_contract$_TicketInterface_$16152",
                                "typeString": "contract TicketInterface"
                              },
                              {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              },
                              {
                                "typeIdentifier": "t_contract$_RNGInterface_$5531",
                                "typeString": "contract RNGInterface"
                              },
                              {
                                "typeIdentifier": "t_array$_t_contract$_IERC20Upgradeable_$1960_$dyn_memory_ptr",
                                "typeString": "contract IERC20Upgradeable[] memory"
                              }
                            ],
                            "id": 9907,
                            "name": "Initialized",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9725,
                            "src": "6294:11:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$_t_uint256_$_t_contract$_PrizePool_$8751_$_t_contract$_TicketInterface_$16152_$_t_contract$_IERC20Upgradeable_$1960_$_t_contract$_RNGInterface_$5531_$_t_array$_t_contract$_IERC20Upgradeable_$1960_$dyn_memory_ptr_$returns$__$",
                              "typeString": "function (uint256,uint256,contract PrizePool,contract TicketInterface,contract IERC20Upgradeable,contract RNGInterface,contract IERC20Upgradeable[] memory)"
                            }
                          },
                          "id": 9915,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6294:161:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9916,
                        "nodeType": "EmitStatement",
                        "src": "6289:166:50"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 9918,
                                "name": "_msgSender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3611,
                                "src": "6482:10:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                  "typeString": "function () view returns (address payable)"
                                }
                              },
                              "id": 9919,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6482:12:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 9920,
                              "name": "prizePeriodStartedAt",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9755,
                              "src": "6496:20:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 9917,
                            "name": "PrizePoolOpened",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9637,
                            "src": "6466:15:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 9921,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6466:51:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9922,
                        "nodeType": "EmitStatement",
                        "src": "6461:56:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9771,
                    "nodeType": "StructuredDocumentation",
                    "src": "4757:382:50",
                    "text": "@notice Initializes a new strategy\n @param _prizePeriodStart The starting timestamp of the prize period.\n @param _prizePeriodSeconds The duration of the prize period in seconds\n @param _prizePool The prize pool to award\n @param _ticket The ticket to use to draw winners\n @param _sponsorship The sponsorship token\n @param _rng The RNG service to use"
                  },
                  "functionSelector": "f97700e2",
                  "id": 9924,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 9789,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 9788,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "5404:11:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "5404:11:50"
                    }
                  ],
                  "name": "initialize",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 9787,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9773,
                        "mutability": "mutable",
                        "name": "_prizePeriodStart",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9924,
                        "src": "5168:25:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9772,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5168:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9775,
                        "mutability": "mutable",
                        "name": "_prizePeriodSeconds",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9924,
                        "src": "5199:27:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9774,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5199:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9777,
                        "mutability": "mutable",
                        "name": "_prizePool",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9924,
                        "src": "5232:20:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_PrizePool_$8751",
                          "typeString": "contract PrizePool"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9776,
                          "name": "PrizePool",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 8751,
                          "src": "5232:9:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_PrizePool_$8751",
                            "typeString": "contract PrizePool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9779,
                        "mutability": "mutable",
                        "name": "_ticket",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9924,
                        "src": "5258:23:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TicketInterface_$16152",
                          "typeString": "contract TicketInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9778,
                          "name": "TicketInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16152,
                          "src": "5258:15:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TicketInterface_$16152",
                            "typeString": "contract TicketInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9781,
                        "mutability": "mutable",
                        "name": "_sponsorship",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9924,
                        "src": "5287:30:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9780,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "5287:17:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9783,
                        "mutability": "mutable",
                        "name": "_rng",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9924,
                        "src": "5323:17:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_RNGInterface_$5531",
                          "typeString": "contract RNGInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9782,
                          "name": "RNGInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 5531,
                          "src": "5323:12:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_RNGInterface_$5531",
                            "typeString": "contract RNGInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 9786,
                        "mutability": "mutable",
                        "name": "externalErc20Awards",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9924,
                        "src": "5346:46:50",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_IERC20Upgradeable_$1960_$dyn_memory_ptr",
                          "typeString": "contract IERC20Upgradeable[]"
                        },
                        "typeName": {
                          "baseType": {
                            "contractScope": null,
                            "id": 9784,
                            "name": "IERC20Upgradeable",
                            "nodeType": "UserDefinedTypeName",
                            "referencedDeclaration": 1960,
                            "src": "5346:17:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                              "typeString": "contract IERC20Upgradeable"
                            }
                          },
                          "id": 9785,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "5346:19:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_IERC20Upgradeable_$1960_$dyn_storage_ptr",
                            "typeString": "contract IERC20Upgradeable[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5162:234:50"
                  },
                  "returnParameters": {
                    "id": 9790,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "5416:0:50"
                  },
                  "scope": 11391,
                  "src": "5142:1380:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": null,
                  "documentation": null,
                  "id": 9929,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_distribute",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 9927,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9926,
                        "mutability": "mutable",
                        "name": "randomNumber",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9929,
                        "src": "6547:20:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9925,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6547:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6546:22:50"
                  },
                  "returnParameters": {
                    "id": 9928,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6585:0:50"
                  },
                  "scope": 11391,
                  "src": "6526:60:50",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 9939,
                    "nodeType": "Block",
                    "src": "6746:42:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 9935,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9740,
                              "src": "6759:9:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_PrizePool_$8751",
                                "typeString": "contract PrizePool"
                              }
                            },
                            "id": 9936,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "awardBalance",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 7283,
                            "src": "6759:22:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
                              "typeString": "function () view external returns (uint256)"
                            }
                          },
                          "id": 9937,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6759:24:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 9934,
                        "id": 9938,
                        "nodeType": "Return",
                        "src": "6752:31:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9930,
                    "nodeType": "StructuredDocumentation",
                    "src": "6590:99:50",
                    "text": "@notice Calculates and returns the currently accrued prize\n @return The current prize size"
                  },
                  "functionSelector": "c42b42a0",
                  "id": 9940,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "currentPrize",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 9931,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6713:2:50"
                  },
                  "returnParameters": {
                    "id": 9934,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9933,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9940,
                        "src": "6737:7:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9932,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6737:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6736:9:50"
                  },
                  "scope": 11391,
                  "src": "6692:96:50",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 9980,
                    "nodeType": "Block",
                    "src": "7044:291:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 9968,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                "id": 9959,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "30",
                                      "id": 9953,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "7066:1:50",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      },
                                      "value": "0"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      }
                                    ],
                                    "id": 9952,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "7058:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 9951,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "7058:7:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 9954,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "7058:10:50",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 9957,
                                      "name": "_tokenListener",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 9943,
                                      "src": "7080:14:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                        "typeString": "contract TokenListenerInterface"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                        "typeString": "contract TokenListenerInterface"
                                      }
                                    ],
                                    "id": 9956,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "7072:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 9955,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "7072:7:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 9958,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "7072:23:50",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "src": "7058:37:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 9965,
                                      "name": "TokenListenerLibrary",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 16271,
                                      "src": "7141:20:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_contract$_TokenListenerLibrary_$16271_$",
                                        "typeString": "type(library TokenListenerLibrary)"
                                      }
                                    },
                                    "id": 9966,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "ERC165_INTERFACE_ID_TOKEN_LISTENER",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 16270,
                                    "src": "7141:55:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes4",
                                      "typeString": "bytes4"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes4",
                                      "typeString": "bytes4"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 9962,
                                        "name": "_tokenListener",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 9943,
                                        "src": "7107:14:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                          "typeString": "contract TokenListenerInterface"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                          "typeString": "contract TokenListenerInterface"
                                        }
                                      ],
                                      "id": 9961,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "7099:7:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 9960,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "7099:7:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 9963,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "7099:23:50",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "id": 9964,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "supportsInterface",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 665,
                                  "src": "7099:41:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes4_$returns$_t_bool_$bound_to$_t_address_$",
                                    "typeString": "function (address,bytes4) view returns (bool)"
                                  }
                                },
                                "id": 9967,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "7099:98:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "7058:139:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f746f6b656e2d6c697374656e65722d696e76616c6964",
                              "id": 9969,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7199:46:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_13854244d89da4c28016f68ec10fbfbe395170e3659bc97a7cd32ce69d3da39e",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/token-listener-invalid\""
                              },
                              "value": "PeriodicPrizeStrategy/token-listener-invalid"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_13854244d89da4c28016f68ec10fbfbe395170e3659bc97a7cd32ce69d3da39e",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/token-listener-invalid\""
                              }
                            ],
                            "id": 9950,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "7050:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 9970,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7050:196:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9971,
                        "nodeType": "ExpressionStatement",
                        "src": "7050:196:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 9974,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 9972,
                            "name": "tokenListener",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9738,
                            "src": "7253:13:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                              "typeString": "contract TokenListenerInterface"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 9973,
                            "name": "_tokenListener",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9943,
                            "src": "7269:14:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                              "typeString": "contract TokenListenerInterface"
                            }
                          },
                          "src": "7253:30:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                            "typeString": "contract TokenListenerInterface"
                          }
                        },
                        "id": 9975,
                        "nodeType": "ExpressionStatement",
                        "src": "7253:30:50"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 9977,
                              "name": "tokenListener",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9738,
                              "src": "7316:13:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                "typeString": "contract TokenListenerInterface"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                "typeString": "contract TokenListenerInterface"
                              }
                            ],
                            "id": 9976,
                            "name": "TokenListenerUpdated",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9673,
                            "src": "7295:20:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_contract$_TokenListenerInterface_$16265_$returns$__$",
                              "typeString": "function (contract TokenListenerInterface)"
                            }
                          },
                          "id": 9978,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7295:35:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 9979,
                        "nodeType": "EmitStatement",
                        "src": "7290:40:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9941,
                    "nodeType": "StructuredDocumentation",
                    "src": "6792:139:50",
                    "text": "@notice Allows the owner to set the token listener\n @param _tokenListener A contract that implements the token listener interface."
                  },
                  "functionSelector": "605e25ac",
                  "id": 9981,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 9946,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 9945,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "7008:9:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "7008:9:50"
                    },
                    {
                      "arguments": null,
                      "id": 9948,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 9947,
                        "name": "requireAwardNotInProgress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11342,
                        "src": "7018:25:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "7018:25:50"
                    }
                  ],
                  "name": "setTokenListener",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 9944,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9943,
                        "mutability": "mutable",
                        "name": "_tokenListener",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9981,
                        "src": "6960:37:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                          "typeString": "contract TokenListenerInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 9942,
                          "name": "TokenListenerInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16265,
                          "src": "6960:22:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                            "typeString": "contract TokenListenerInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6959:39:50"
                  },
                  "returnParameters": {
                    "id": 9949,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "7044:0:50"
                  },
                  "scope": 11391,
                  "src": "6934:401:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 9996,
                    "nodeType": "Block",
                    "src": "7770:124:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 9991,
                                "name": "_prizePeriodRemainingSeconds",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 10036,
                                "src": "7822:28:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                  "typeString": "function () view returns (uint256)"
                                }
                              },
                              "id": 9992,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7822:30:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 9993,
                              "name": "secondsPerBlockMantissa",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9984,
                              "src": "7860:23:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 9989,
                              "name": "FixedPoint",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5279,
                              "src": "7783:10:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_FixedPoint_$5279_$",
                                "typeString": "type(library FixedPoint)"
                              }
                            },
                            "id": 9990,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "divideUintByMantissa",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5278,
                            "src": "7783:31:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 9994,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7783:106:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 9988,
                        "id": 9995,
                        "nodeType": "Return",
                        "src": "7776:113:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9982,
                    "nodeType": "StructuredDocumentation",
                    "src": "7339:325:50",
                    "text": "@notice Estimates the remaining blocks until the prize given a number of seconds per block\n @param secondsPerBlockMantissa The number of seconds per block to use for the calculation.  Should be a fixed point 18 number like Ether.\n @return The estimated number of blocks remaining until the prize can be awarded."
                  },
                  "functionSelector": "01b48e34",
                  "id": 9997,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "estimateRemainingBlocksToPrize",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 9985,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9984,
                        "mutability": "mutable",
                        "name": "secondsPerBlockMantissa",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9997,
                        "src": "7707:31:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9983,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7707:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7706:33:50"
                  },
                  "returnParameters": {
                    "id": 9988,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 9987,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 9997,
                        "src": "7761:7:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 9986,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7761:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7760:9:50"
                  },
                  "scope": 11391,
                  "src": "7667:227:50",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 10006,
                    "nodeType": "Block",
                    "src": "8133:48:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 10003,
                            "name": "_prizePeriodRemainingSeconds",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10036,
                            "src": "8146:28:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                              "typeString": "function () view returns (uint256)"
                            }
                          },
                          "id": 10004,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8146:30:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 10002,
                        "id": 10005,
                        "nodeType": "Return",
                        "src": "8139:37:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 9998,
                    "nodeType": "StructuredDocumentation",
                    "src": "7898:161:50",
                    "text": "@notice Returns the number of seconds remaining until the prize can be awarded.\n @return The number of seconds remaining until the prize can be awarded."
                  },
                  "functionSelector": "d5ad6bf6",
                  "id": 10007,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "prizePeriodRemainingSeconds",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 9999,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "8098:2:50"
                  },
                  "returnParameters": {
                    "id": 10002,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10001,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10007,
                        "src": "8124:7:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 10000,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "8124:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8123:9:50"
                  },
                  "scope": 11391,
                  "src": "8062:119:50",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 10035,
                    "nodeType": "Block",
                    "src": "8421:155:50",
                    "statements": [
                      {
                        "assignments": [
                          10014
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 10014,
                            "mutability": "mutable",
                            "name": "endAt",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 10035,
                            "src": "8427:13:50",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 10013,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "8427:7:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 10017,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 10015,
                            "name": "_prizePeriodEndAt",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10293,
                            "src": "8443:17:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                              "typeString": "function () view returns (uint256)"
                            }
                          },
                          "id": 10016,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8443:19:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "8427:35:50"
                      },
                      {
                        "assignments": [
                          10019
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 10019,
                            "mutability": "mutable",
                            "name": "time",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 10035,
                            "src": "8468:12:50",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 10018,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "8468:7:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 10022,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 10020,
                            "name": "_currentTime",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10404,
                            "src": "8483:12:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                              "typeString": "function () view returns (uint256)"
                            }
                          },
                          "id": 10021,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8483:14:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "8468:29:50"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 10025,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 10023,
                            "name": "time",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10019,
                            "src": "8507:4:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 10024,
                            "name": "endAt",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10014,
                            "src": "8514:5:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "8507:12:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 10029,
                        "nodeType": "IfStatement",
                        "src": "8503:41:50",
                        "trueBody": {
                          "id": 10028,
                          "nodeType": "Block",
                          "src": "8521:23:50",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 10026,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "8536:1:50",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "functionReturnParameters": 10012,
                              "id": 10027,
                              "nodeType": "Return",
                              "src": "8529:8:50"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10032,
                              "name": "time",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10019,
                              "src": "8566:4:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 10030,
                              "name": "endAt",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10014,
                              "src": "8556:5:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 10031,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sub",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1135,
                            "src": "8556:9:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 10033,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8556:15:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 10012,
                        "id": 10034,
                        "nodeType": "Return",
                        "src": "8549:22:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10008,
                    "nodeType": "StructuredDocumentation",
                    "src": "8185:161:50",
                    "text": "@notice Returns the number of seconds remaining until the prize can be awarded.\n @return The number of seconds remaining until the prize can be awarded."
                  },
                  "id": 10036,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_prizePeriodRemainingSeconds",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10009,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "8386:2:50"
                  },
                  "returnParameters": {
                    "id": 10012,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10011,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10036,
                        "src": "8412:7:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 10010,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "8412:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8411:9:50"
                  },
                  "scope": 11391,
                  "src": "8349:227:50",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 10045,
                    "nodeType": "Block",
                    "src": "8757:38:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 10042,
                            "name": "_isPrizePeriodOver",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10059,
                            "src": "8770:18:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$",
                              "typeString": "function () view returns (bool)"
                            }
                          },
                          "id": 10043,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8770:20:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 10041,
                        "id": 10044,
                        "nodeType": "Return",
                        "src": "8763:27:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10037,
                    "nodeType": "StructuredDocumentation",
                    "src": "8580:116:50",
                    "text": "@notice Returns whether the prize period is over\n @return True if the prize period is over, false otherwise"
                  },
                  "functionSelector": "95e5f9ee",
                  "id": 10046,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "isPrizePeriodOver",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10038,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "8725:2:50"
                  },
                  "returnParameters": {
                    "id": 10041,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10040,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10046,
                        "src": "8751:4:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 10039,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "8751:4:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8750:6:50"
                  },
                  "scope": 11391,
                  "src": "8699:96:50",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 10058,
                    "nodeType": "Block",
                    "src": "8977:55:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 10056,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 10052,
                              "name": "_currentTime",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10404,
                              "src": "8990:12:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                "typeString": "function () view returns (uint256)"
                              }
                            },
                            "id": 10053,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "8990:14:50",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 10054,
                              "name": "_prizePeriodEndAt",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10293,
                              "src": "9008:17:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                "typeString": "function () view returns (uint256)"
                              }
                            },
                            "id": 10055,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "9008:19:50",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "8990:37:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 10051,
                        "id": 10057,
                        "nodeType": "Return",
                        "src": "8983:44:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10047,
                    "nodeType": "StructuredDocumentation",
                    "src": "8799:116:50",
                    "text": "@notice Returns whether the prize period is over\n @return True if the prize period is over, false otherwise"
                  },
                  "id": 10059,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_isPrizePeriodOver",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10048,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "8945:2:50"
                  },
                  "returnParameters": {
                    "id": 10051,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10050,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10059,
                        "src": "8971:4:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 10049,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "8971:4:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8970:6:50"
                  },
                  "scope": 11391,
                  "src": "8918:114:50",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 10078,
                    "nodeType": "Block",
                    "src": "9240:57:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10070,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10062,
                              "src": "9262:4:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 10071,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10064,
                              "src": "9268:6:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 10074,
                                  "name": "ticket",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 9742,
                                  "src": "9284:6:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_TicketInterface_$16152",
                                    "typeString": "contract TicketInterface"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_TicketInterface_$16152",
                                    "typeString": "contract TicketInterface"
                                  }
                                ],
                                "id": 10073,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "9276:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 10072,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "9276:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 10075,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "9276:15:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 10067,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9740,
                              "src": "9246:9:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_PrizePool_$8751",
                                "typeString": "contract PrizePool"
                              }
                            },
                            "id": 10069,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "award",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 7490,
                            "src": "9246:15:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$_t_address_$returns$__$",
                              "typeString": "function (address,uint256,address) external"
                            }
                          },
                          "id": 10076,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9246:46:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10077,
                        "nodeType": "ExpressionStatement",
                        "src": "9246:46:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10060,
                    "nodeType": "StructuredDocumentation",
                    "src": "9036:139:50",
                    "text": "@notice Awards collateral as tickets to a user\n @param user Recipient of minted tokens\n @param amount Amount of minted tokens"
                  },
                  "id": 10079,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_awardTickets",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10065,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10062,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10079,
                        "src": "9201:12:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 10061,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "9201:7:50",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 10064,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10079,
                        "src": "9215:14:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 10063,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "9215:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9200:30:50"
                  },
                  "returnParameters": {
                    "id": 10066,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "9240:0:50"
                  },
                  "scope": 11391,
                  "src": "9178:119:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 10122,
                    "nodeType": "Block",
                    "src": "9717:308:50",
                    "statements": [
                      {
                        "assignments": [
                          10092
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 10092,
                            "mutability": "mutable",
                            "name": "_controlledTokens",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 10122,
                            "src": "9723:51:50",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                              "typeString": "contract ControlledTokenInterface[]"
                            },
                            "typeName": {
                              "baseType": {
                                "contractScope": null,
                                "id": 10090,
                                "name": "ControlledTokenInterface",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 15850,
                                "src": "9723:24:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                  "typeString": "contract ControlledTokenInterface"
                                }
                              },
                              "id": 10091,
                              "length": null,
                              "nodeType": "ArrayTypeName",
                              "src": "9723:26:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_storage_ptr",
                                "typeString": "contract ControlledTokenInterface[]"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 10096,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 10093,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9740,
                              "src": "9777:9:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_PrizePool_$8751",
                                "typeString": "contract PrizePool"
                              }
                            },
                            "id": 10094,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "tokens",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 8452,
                            "src": "9777:16:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$__$returns$_t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr_$",
                              "typeString": "function () view external returns (contract ControlledTokenInterface[] memory)"
                            }
                          },
                          "id": 10095,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9777:18:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                            "typeString": "contract ControlledTokenInterface[] memory"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "9723:72:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 10101,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 10098,
                                "name": "tokenIndex",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 10086,
                                "src": "9809:10:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint8",
                                  "typeString": "uint8"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 10099,
                                  "name": "_controlledTokens",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 10092,
                                  "src": "9823:17:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                                    "typeString": "contract ControlledTokenInterface[] memory"
                                  }
                                },
                                "id": 10100,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "length",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "9823:24:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "9809:38:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f61776172642d696e76616c69642d746f6b656e2d696e646578",
                              "id": 10102,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "9849:49:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_da89c79276366d7b517daaf1a1b6f294fb3e6df515010db6edf91c02268e6e26",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/award-invalid-token-index\""
                              },
                              "value": "PeriodicPrizeStrategy/award-invalid-token-index"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_da89c79276366d7b517daaf1a1b6f294fb3e6df515010db6edf91c02268e6e26",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/award-invalid-token-index\""
                              }
                            ],
                            "id": 10097,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "9801:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 10103,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9801:98:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10104,
                        "nodeType": "ExpressionStatement",
                        "src": "9801:98:50"
                      },
                      {
                        "assignments": [
                          10106
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 10106,
                            "mutability": "mutable",
                            "name": "_token",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 10122,
                            "src": "9905:31:50",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                              "typeString": "contract ControlledTokenInterface"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 10105,
                              "name": "ControlledTokenInterface",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 15850,
                              "src": "9905:24:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                "typeString": "contract ControlledTokenInterface"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 10110,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 10107,
                            "name": "_controlledTokens",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10092,
                            "src": "9939:17:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                              "typeString": "contract ControlledTokenInterface[] memory"
                            }
                          },
                          "id": 10109,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 10108,
                            "name": "tokenIndex",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10086,
                            "src": "9957:10:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "9939:29:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                            "typeString": "contract ControlledTokenInterface"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "9905:63:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10114,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10082,
                              "src": "9990:4:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 10115,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10084,
                              "src": "9996:6:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 10118,
                                  "name": "_token",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 10106,
                                  "src": "10012:6:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                    "typeString": "contract ControlledTokenInterface"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                                    "typeString": "contract ControlledTokenInterface"
                                  }
                                ],
                                "id": 10117,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "10004:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 10116,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "10004:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 10119,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "10004:15:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 10111,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9740,
                              "src": "9974:9:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_PrizePool_$8751",
                                "typeString": "contract PrizePool"
                              }
                            },
                            "id": 10113,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "award",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 7490,
                            "src": "9974:15:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$_t_address_$returns$__$",
                              "typeString": "function (address,uint256,address) external"
                            }
                          },
                          "id": 10120,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9974:46:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10121,
                        "nodeType": "ExpressionStatement",
                        "src": "9974:46:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10080,
                    "nodeType": "StructuredDocumentation",
                    "src": "9303:333:50",
                    "text": "@notice Mints ticket or sponsorship tokens for user.\n @dev Mints ticket or sponsorship tokens by looking up the address in the prizePool.tokens mapping. \n @param user Recipient of minted tokens\n @param amount Amount of minted tokens\n @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping"
                  },
                  "id": 10123,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_awardToken",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10087,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10082,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10123,
                        "src": "9660:12:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 10081,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "9660:7:50",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 10084,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10123,
                        "src": "9674:14:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 10083,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "9674:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 10086,
                        "mutability": "mutable",
                        "name": "tokenIndex",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10123,
                        "src": "9690:16:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 10085,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "9690:5:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9659:48:50"
                  },
                  "returnParameters": {
                    "id": 10088,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "9717:0:50"
                  },
                  "scope": 11391,
                  "src": "9639:386:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 10137,
                    "nodeType": "Block",
                    "src": "10286:74:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10130,
                              "name": "winner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10126,
                              "src": "10313:6:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 10129,
                            "name": "_awardExternalErc20s",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10197,
                            "src": "10292:20:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 10131,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10292:28:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10132,
                        "nodeType": "ExpressionStatement",
                        "src": "10292:28:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10134,
                              "name": "winner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10126,
                              "src": "10348:6:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 10133,
                            "name": "_awardExternalErc721s",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10271,
                            "src": "10326:21:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 10135,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10326:29:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10136,
                        "nodeType": "ExpressionStatement",
                        "src": "10326:29:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10124,
                    "nodeType": "StructuredDocumentation",
                    "src": "10029:196:50",
                    "text": "@notice Awards all external tokens with non-zero balances to the given user.  The external tokens must be held by the PrizePool contract.\n @param winner The user to transfer the tokens to"
                  },
                  "id": 10138,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_awardAllExternalTokens",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10127,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10126,
                        "mutability": "mutable",
                        "name": "winner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10138,
                        "src": "10261:14:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 10125,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "10261:7:50",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10260:16:50"
                  },
                  "returnParameters": {
                    "id": 10128,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "10286:0:50"
                  },
                  "scope": 11391,
                  "src": "10228:132:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 10196,
                    "nodeType": "Block",
                    "src": "10629:388:50",
                    "statements": [
                      {
                        "assignments": [
                          10145
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 10145,
                            "mutability": "mutable",
                            "name": "currentToken",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 10196,
                            "src": "10635:20:50",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 10144,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "10635:7:50",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 10149,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 10146,
                              "name": "externalErc20s",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9757,
                              "src": "10658:14:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                              }
                            },
                            "id": 10147,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "start",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16373,
                            "src": "10658:20:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_Mapping_$16337_storage_ptr_$returns$_t_address_$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                              "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer) view returns (address)"
                            }
                          },
                          "id": 10148,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10658:22:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "10635:45:50"
                      },
                      {
                        "body": {
                          "id": 10194,
                          "nodeType": "Block",
                          "src": "10761:252:50",
                          "statements": [
                            {
                              "assignments": [
                                10163
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 10163,
                                  "mutability": "mutable",
                                  "name": "balance",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 10194,
                                  "src": "10769:15:50",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 10162,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "10769:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 10173,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 10170,
                                        "name": "prizePool",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 9740,
                                        "src": "10837:9:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_PrizePool_$8751",
                                          "typeString": "contract PrizePool"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_PrizePool_$8751",
                                          "typeString": "contract PrizePool"
                                        }
                                      ],
                                      "id": 10169,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "10829:7:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 10168,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "10829:7:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 10171,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "10829:18:50",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 10165,
                                        "name": "currentToken",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 10145,
                                        "src": "10805:12:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "id": 10164,
                                      "name": "IERC20Upgradeable",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1960,
                                      "src": "10787:17:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_contract$_IERC20Upgradeable_$1960_$",
                                        "typeString": "type(contract IERC20Upgradeable)"
                                      }
                                    },
                                    "id": 10166,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "10787:31:50",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                      "typeString": "contract IERC20Upgradeable"
                                    }
                                  },
                                  "id": 10167,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "balanceOf",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1899,
                                  "src": "10787:41:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                    "typeString": "function (address) view external returns (uint256)"
                                  }
                                },
                                "id": 10172,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "10787:61:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "10769:79:50"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 10176,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 10174,
                                  "name": "balance",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 10163,
                                  "src": "10860:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": ">",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 10175,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "10870:1:50",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "10860:11:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 10186,
                              "nodeType": "IfStatement",
                              "src": "10856:95:50",
                              "trueBody": {
                                "id": 10185,
                                "nodeType": "Block",
                                "src": "10873:78:50",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 10180,
                                          "name": "winner",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 10141,
                                          "src": "10912:6:50",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 10181,
                                          "name": "currentToken",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 10145,
                                          "src": "10920:12:50",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 10182,
                                          "name": "balance",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 10163,
                                          "src": "10934:7:50",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          },
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          },
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 10177,
                                          "name": "prizePool",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 9740,
                                          "src": "10883:9:50",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_PrizePool_$8751",
                                            "typeString": "contract PrizePool"
                                          }
                                        },
                                        "id": 10179,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "awardExternalERC20",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 7544,
                                        "src": "10883:28:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                                          "typeString": "function (address,address,uint256) external"
                                        }
                                      },
                                      "id": 10183,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "10883:59:50",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 10184,
                                    "nodeType": "ExpressionStatement",
                                    "src": "10883:59:50"
                                  }
                                ]
                              }
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 10192,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 10187,
                                  "name": "currentToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 10145,
                                  "src": "10958:12:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 10190,
                                      "name": "currentToken",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 10145,
                                      "src": "10993:12:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 10188,
                                      "name": "externalErc20s",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 9757,
                                      "src": "10973:14:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                        "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                                      }
                                    },
                                    "id": 10189,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "next",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 16388,
                                    "src": "10973:19:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_view$_t_struct$_Mapping_$16337_storage_ptr_$_t_address_$returns$_t_address_$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                                      "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer,address) view returns (address)"
                                    }
                                  },
                                  "id": 10191,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "10973:33:50",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "src": "10958:48:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 10193,
                              "nodeType": "ExpressionStatement",
                              "src": "10958:48:50"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 10161,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 10155,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 10150,
                              "name": "currentToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10145,
                              "src": "10693:12:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 10153,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "10717:1:50",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 10152,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "10709:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 10151,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "10709:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 10154,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "10709:10:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "src": "10693:26:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 10160,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 10156,
                              "name": "currentToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10145,
                              "src": "10723:12:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 10157,
                                  "name": "externalErc20s",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 9757,
                                  "src": "10739:14:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                    "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                                  }
                                },
                                "id": 10158,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "end",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 16398,
                                "src": "10739:18:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_struct$_Mapping_$16337_storage_ptr_$returns$_t_address_$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                                  "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer) pure returns (address)"
                                }
                              },
                              "id": 10159,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "10739:20:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "src": "10723:36:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "10693:66:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 10195,
                        "nodeType": "WhileStatement",
                        "src": "10686:327:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10139,
                    "nodeType": "StructuredDocumentation",
                    "src": "10364:207:50",
                    "text": "@notice Awards all external ERC20 tokens with non-zero balances to the given user.\n The external tokens must be held by the PrizePool contract.\n @param winner The user to transfer the tokens to"
                  },
                  "id": 10197,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_awardExternalErc20s",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10142,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10141,
                        "mutability": "mutable",
                        "name": "winner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10197,
                        "src": "10604:14:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 10140,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "10604:7:50",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10603:16:50"
                  },
                  "returnParameters": {
                    "id": 10143,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "10629:0:50"
                  },
                  "scope": 11391,
                  "src": "10574:443:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 10270,
                    "nodeType": "Block",
                    "src": "11323:550:50",
                    "statements": [
                      {
                        "assignments": [
                          10204
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 10204,
                            "mutability": "mutable",
                            "name": "currentToken",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 10270,
                            "src": "11329:20:50",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 10203,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "11329:7:50",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 10208,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 10205,
                              "name": "externalErc721s",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9759,
                              "src": "11352:15:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                              }
                            },
                            "id": 10206,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "start",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16373,
                            "src": "11352:21:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_Mapping_$16337_storage_ptr_$returns$_t_address_$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                              "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer) view returns (address)"
                            }
                          },
                          "id": 10207,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "11352:23:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "11329:46:50"
                      },
                      {
                        "body": {
                          "id": 10263,
                          "nodeType": "Block",
                          "src": "11457:380:50",
                          "statements": [
                            {
                              "assignments": [
                                10222
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 10222,
                                  "mutability": "mutable",
                                  "name": "balance",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 10263,
                                  "src": "11465:15:50",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 10221,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "11465:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 10232,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 10229,
                                        "name": "prizePool",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 9740,
                                        "src": "11534:9:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_PrizePool_$8751",
                                          "typeString": "contract PrizePool"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_PrizePool_$8751",
                                          "typeString": "contract PrizePool"
                                        }
                                      ],
                                      "id": 10228,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "11526:7:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 10227,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "11526:7:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 10230,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "11526:18:50",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 10224,
                                        "name": "currentToken",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 10204,
                                        "src": "11502:12:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "id": 10223,
                                      "name": "IERC721Upgradeable",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3338,
                                      "src": "11483:18:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_contract$_IERC721Upgradeable_$3338_$",
                                        "typeString": "type(contract IERC721Upgradeable)"
                                      }
                                    },
                                    "id": 10225,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "11483:32:50",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                      "typeString": "contract IERC721Upgradeable"
                                    }
                                  },
                                  "id": 10226,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "balanceOf",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 3263,
                                  "src": "11483:42:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                    "typeString": "function (address) view external returns (uint256)"
                                  }
                                },
                                "id": 10231,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "11483:62:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "11465:80:50"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 10235,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 10233,
                                  "name": "balance",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 10222,
                                  "src": "11557:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": ">",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 10234,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "11567:1:50",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "11557:11:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 10255,
                              "nodeType": "IfStatement",
                              "src": "11553:221:50",
                              "trueBody": {
                                "id": 10254,
                                "nodeType": "Block",
                                "src": "11570:204:50",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 10239,
                                          "name": "winner",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 10200,
                                          "src": "11610:6:50",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 10240,
                                          "name": "currentToken",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 10204,
                                          "src": "11618:12:50",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "baseExpression": {
                                            "argumentTypes": null,
                                            "id": 10241,
                                            "name": "externalErc721TokenIds",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 9764,
                                            "src": "11632:22:50",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_mapping$_t_contract$_IERC721Upgradeable_$3338_$_t_array$_t_uint256_$dyn_storage_$",
                                              "typeString": "mapping(contract IERC721Upgradeable => uint256[] storage ref)"
                                            }
                                          },
                                          "id": 10245,
                                          "indexExpression": {
                                            "argumentTypes": null,
                                            "arguments": [
                                              {
                                                "argumentTypes": null,
                                                "id": 10243,
                                                "name": "currentToken",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 10204,
                                                "src": "11674:12:50",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_address",
                                                  "typeString": "address"
                                                }
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": [
                                                {
                                                  "typeIdentifier": "t_address",
                                                  "typeString": "address"
                                                }
                                              ],
                                              "id": 10242,
                                              "name": "IERC721Upgradeable",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 3338,
                                              "src": "11655:18:50",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_type$_t_contract$_IERC721Upgradeable_$3338_$",
                                                "typeString": "type(contract IERC721Upgradeable)"
                                              }
                                            },
                                            "id": 10244,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "typeConversion",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "11655:32:50",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                              "typeString": "contract IERC721Upgradeable"
                                            }
                                          },
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "nodeType": "IndexAccess",
                                          "src": "11632:56:50",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                            "typeString": "uint256[] storage ref"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          },
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          },
                                          {
                                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                            "typeString": "uint256[] storage ref"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 10236,
                                          "name": "prizePool",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 9740,
                                          "src": "11580:9:50",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_PrizePool_$8751",
                                            "typeString": "contract PrizePool"
                                          }
                                        },
                                        "id": 10238,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "awardExternalERC721",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 7694,
                                        "src": "11580:29:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_array$_t_uint256_$dyn_memory_ptr_$returns$__$",
                                          "typeString": "function (address,address,uint256[] memory) external"
                                        }
                                      },
                                      "id": 10246,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "11580:109:50",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 10247,
                                    "nodeType": "ExpressionStatement",
                                    "src": "11580:109:50"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "id": 10250,
                                              "name": "currentToken",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 10204,
                                              "src": "11751:12:50",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            ],
                                            "id": 10249,
                                            "name": "IERC721Upgradeable",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 3338,
                                            "src": "11732:18:50",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_contract$_IERC721Upgradeable_$3338_$",
                                              "typeString": "type(contract IERC721Upgradeable)"
                                            }
                                          },
                                          "id": 10251,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "typeConversion",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "11732:32:50",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                            "typeString": "contract IERC721Upgradeable"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                            "typeString": "contract IERC721Upgradeable"
                                          }
                                        ],
                                        "id": 10248,
                                        "name": "_removeExternalErc721AwardTokens",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 11257,
                                        "src": "11699:32:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC721Upgradeable_$3338_$returns$__$",
                                          "typeString": "function (contract IERC721Upgradeable)"
                                        }
                                      },
                                      "id": 10252,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "11699:66:50",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 10253,
                                    "nodeType": "ExpressionStatement",
                                    "src": "11699:66:50"
                                  }
                                ]
                              }
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 10261,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 10256,
                                  "name": "currentToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 10204,
                                  "src": "11781:12:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 10259,
                                      "name": "currentToken",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 10204,
                                      "src": "11817:12:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 10257,
                                      "name": "externalErc721s",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 9759,
                                      "src": "11796:15:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                        "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                                      }
                                    },
                                    "id": 10258,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "next",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 16388,
                                    "src": "11796:20:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_view$_t_struct$_Mapping_$16337_storage_ptr_$_t_address_$returns$_t_address_$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                                      "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer,address) view returns (address)"
                                    }
                                  },
                                  "id": 10260,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "11796:34:50",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "src": "11781:49:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 10262,
                              "nodeType": "ExpressionStatement",
                              "src": "11781:49:50"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 10220,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 10214,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 10209,
                              "name": "currentToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10204,
                              "src": "11388:12:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 10212,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "11412:1:50",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 10211,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "11404:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 10210,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "11404:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 10213,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "11404:10:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "src": "11388:26:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 10219,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 10215,
                              "name": "currentToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10204,
                              "src": "11418:12:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 10216,
                                  "name": "externalErc721s",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 9759,
                                  "src": "11434:15:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                    "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                                  }
                                },
                                "id": 10217,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "end",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 16398,
                                "src": "11434:19:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_struct$_Mapping_$16337_storage_ptr_$returns$_t_address_$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                                  "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer) pure returns (address)"
                                }
                              },
                              "id": 10218,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "11434:21:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "src": "11418:37:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "11388:67:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 10264,
                        "nodeType": "WhileStatement",
                        "src": "11381:456:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 10265,
                              "name": "externalErc721s",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9759,
                              "src": "11842:15:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                              }
                            },
                            "id": 10267,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "clearAll",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16703,
                            "src": "11842:24:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Mapping_$16337_storage_ptr_$returns$__$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                              "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer)"
                            }
                          },
                          "id": 10268,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "11842:26:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10269,
                        "nodeType": "ExpressionStatement",
                        "src": "11842:26:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10198,
                    "nodeType": "StructuredDocumentation",
                    "src": "11021:243:50",
                    "text": "@notice Awards all external ERC721 tokens to the given user.\n The external tokens must be held by the PrizePool contract.\n @dev The list of ERC721s is reset after every award\n @param winner The user to transfer the tokens to"
                  },
                  "id": 10271,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_awardExternalErc721s",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10201,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10200,
                        "mutability": "mutable",
                        "name": "winner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10271,
                        "src": "11298:14:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 10199,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "11298:7:50",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11297:16:50"
                  },
                  "returnParameters": {
                    "id": 10202,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "11323:0:50"
                  },
                  "scope": 11391,
                  "src": "11267:606:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 10280,
                    "nodeType": "Block",
                    "src": "12064:98:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 10277,
                            "name": "_prizePeriodEndAt",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10293,
                            "src": "12138:17:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                              "typeString": "function () view returns (uint256)"
                            }
                          },
                          "id": 10278,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12138:19:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 10276,
                        "id": 10279,
                        "nodeType": "Return",
                        "src": "12131:26:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10272,
                    "nodeType": "StructuredDocumentation",
                    "src": "11877:124:50",
                    "text": "@notice Returns the timestamp at which the prize period ends\n @return The timestamp at which the prize period ends."
                  },
                  "functionSelector": "2c8fe73d",
                  "id": 10281,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "prizePeriodEndAt",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10273,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "12029:2:50"
                  },
                  "returnParameters": {
                    "id": 10276,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10275,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10281,
                        "src": "12055:7:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 10274,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12055:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12054:9:50"
                  },
                  "scope": 11391,
                  "src": "12004:158:50",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 10292,
                    "nodeType": "Block",
                    "src": "12354:123:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10289,
                              "name": "prizePeriodSeconds",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9753,
                              "src": "12453:18:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 10287,
                              "name": "prizePeriodStartedAt",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9755,
                              "src": "12428:20:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 10288,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "add",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1113,
                            "src": "12428:24:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 10290,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12428:44:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 10286,
                        "id": 10291,
                        "nodeType": "Return",
                        "src": "12421:51:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10282,
                    "nodeType": "StructuredDocumentation",
                    "src": "12166:124:50",
                    "text": "@notice Returns the timestamp at which the prize period ends\n @return The timestamp at which the prize period ends."
                  },
                  "id": 10293,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_prizePeriodEndAt",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10283,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "12319:2:50"
                  },
                  "returnParameters": {
                    "id": 10286,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10285,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10293,
                        "src": "12345:7:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 10284,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12345:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12344:9:50"
                  },
                  "scope": 11391,
                  "src": "12293:184:50",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    16264
                  ],
                  "body": {
                    "id": 10346,
                    "nodeType": "Block",
                    "src": "12823:292:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 10311,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 10309,
                                "name": "from",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 10296,
                                "src": "12837:4:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 10310,
                                "name": "to",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 10298,
                                "src": "12845:2:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "src": "12837:10:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f7472616e736665722d746f2d73656c66",
                              "id": 10312,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "12849:40:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_4f88eed59d7c156de90e082313fda39c45908f0e83d04899e499e5b6e90a4478",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/transfer-to-self\""
                              },
                              "value": "PeriodicPrizeStrategy/transfer-to-self"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_4f88eed59d7c156de90e082313fda39c45908f0e83d04899e499e5b6e90a4478",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/transfer-to-self\""
                              }
                            ],
                            "id": 10308,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "12829:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 10313,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12829:61:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10314,
                        "nodeType": "ExpressionStatement",
                        "src": "12829:61:50"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 10320,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 10315,
                            "name": "controlledToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10302,
                            "src": "12901:15:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 10318,
                                "name": "ticket",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 9742,
                                "src": "12928:6:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_TicketInterface_$16152",
                                  "typeString": "contract TicketInterface"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_TicketInterface_$16152",
                                  "typeString": "contract TicketInterface"
                                }
                              ],
                              "id": 10317,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "12920:7:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 10316,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "12920:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 10319,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "12920:15:50",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "12901:34:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 10325,
                        "nodeType": "IfStatement",
                        "src": "12897:83:50",
                        "trueBody": {
                          "id": 10324,
                          "nodeType": "Block",
                          "src": "12937:43:50",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "id": 10321,
                                  "name": "_requireAwardNotInProgress",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11279,
                                  "src": "12945:26:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$__$returns$__$",
                                    "typeString": "function () view"
                                  }
                                },
                                "id": 10322,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "12945:28:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 10323,
                              "nodeType": "ExpressionStatement",
                              "src": "12945:28:50"
                            }
                          ]
                        }
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 10334,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 10328,
                                "name": "tokenListener",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 9738,
                                "src": "12998:13:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                  "typeString": "contract TokenListenerInterface"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                  "typeString": "contract TokenListenerInterface"
                                }
                              ],
                              "id": 10327,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "12990:7:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 10326,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "12990:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 10329,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "12990:22:50",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 10332,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "13024:1:50",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                }
                              ],
                              "id": 10331,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "13016:7:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 10330,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "13016:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 10333,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "13016:10:50",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "src": "12990:36:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 10345,
                        "nodeType": "IfStatement",
                        "src": "12986:125:50",
                        "trueBody": {
                          "id": 10344,
                          "nodeType": "Block",
                          "src": "13028:83:50",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 10338,
                                    "name": "from",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 10296,
                                    "src": "13070:4:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 10339,
                                    "name": "to",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 10298,
                                    "src": "13076:2:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 10340,
                                    "name": "amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 10300,
                                    "src": "13080:6:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 10341,
                                    "name": "controlledToken",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 10302,
                                    "src": "13088:15:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 10335,
                                    "name": "tokenListener",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 9738,
                                    "src": "13036:13:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                      "typeString": "contract TokenListenerInterface"
                                    }
                                  },
                                  "id": 10337,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "beforeTokenTransfer",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 16264,
                                  "src": "13036:33:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_address_$returns$__$",
                                    "typeString": "function (address,address,uint256,address) external"
                                  }
                                },
                                "id": 10342,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "13036:68:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 10343,
                              "nodeType": "ExpressionStatement",
                              "src": "13036:68:50"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10294,
                    "nodeType": "StructuredDocumentation",
                    "src": "12481:211:50",
                    "text": "@notice Called by the PrizePool for transfers of controlled tokens\n @dev Note that this is only for *transfers*, not mints or burns\n @param controlledToken The type of collateral that is being sent"
                  },
                  "functionSelector": "b2210957",
                  "id": 10347,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 10306,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 10305,
                        "name": "onlyPrizePool",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11390,
                        "src": "12809:13:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "12809:13:50"
                    }
                  ],
                  "name": "beforeTokenTransfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 10304,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "12800:8:50"
                  },
                  "parameters": {
                    "id": 10303,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10296,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10347,
                        "src": "12724:12:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 10295,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "12724:7:50",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 10298,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10347,
                        "src": "12738:10:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 10297,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "12738:7:50",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 10300,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10347,
                        "src": "12750:14:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 10299,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12750:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 10302,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10347,
                        "src": "12766:23:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 10301,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "12766:7:50",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12723:67:50"
                  },
                  "returnParameters": {
                    "id": 10307,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "12823:0:50"
                  },
                  "scope": 11391,
                  "src": "12695:420:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    16252
                  ],
                  "body": {
                    "id": 10393,
                    "nodeType": "Block",
                    "src": "13423:223:50",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 10367,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 10362,
                            "name": "controlledToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10354,
                            "src": "13433:15:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 10365,
                                "name": "ticket",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 9742,
                                "src": "13460:6:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_TicketInterface_$16152",
                                  "typeString": "contract TicketInterface"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_TicketInterface_$16152",
                                  "typeString": "contract TicketInterface"
                                }
                              ],
                              "id": 10364,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "13452:7:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 10363,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "13452:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 10366,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "13452:15:50",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "13433:34:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 10372,
                        "nodeType": "IfStatement",
                        "src": "13429:83:50",
                        "trueBody": {
                          "id": 10371,
                          "nodeType": "Block",
                          "src": "13469:43:50",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "id": 10368,
                                  "name": "_requireAwardNotInProgress",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11279,
                                  "src": "13477:26:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$__$returns$__$",
                                    "typeString": "function () view"
                                  }
                                },
                                "id": 10369,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "13477:28:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 10370,
                              "nodeType": "ExpressionStatement",
                              "src": "13477:28:50"
                            }
                          ]
                        }
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 10381,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 10375,
                                "name": "tokenListener",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 9738,
                                "src": "13529:13:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                  "typeString": "contract TokenListenerInterface"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                  "typeString": "contract TokenListenerInterface"
                                }
                              ],
                              "id": 10374,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "13521:7:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 10373,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "13521:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 10376,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "13521:22:50",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 10379,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "13555:1:50",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                }
                              ],
                              "id": 10378,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "13547:7:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 10377,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "13547:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 10380,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "13547:10:50",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "src": "13521:36:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 10392,
                        "nodeType": "IfStatement",
                        "src": "13517:125:50",
                        "trueBody": {
                          "id": 10391,
                          "nodeType": "Block",
                          "src": "13559:83:50",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 10385,
                                    "name": "to",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 10350,
                                    "src": "13597:2:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 10386,
                                    "name": "amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 10352,
                                    "src": "13601:6:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 10387,
                                    "name": "controlledToken",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 10354,
                                    "src": "13609:15:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 10388,
                                    "name": "referrer",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 10356,
                                    "src": "13626:8:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 10382,
                                    "name": "tokenListener",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 9738,
                                    "src": "13567:13:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                                      "typeString": "contract TokenListenerInterface"
                                    }
                                  },
                                  "id": 10384,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "beforeTokenMint",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 16252,
                                  "src": "13567:29:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$_t_address_$_t_address_$returns$__$",
                                    "typeString": "function (address,uint256,address,address) external"
                                  }
                                },
                                "id": 10389,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "13567:68:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 10390,
                              "nodeType": "ExpressionStatement",
                              "src": "13567:68:50"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10348,
                    "nodeType": "StructuredDocumentation",
                    "src": "13119:139:50",
                    "text": "@notice Called by the PrizePool when minting controlled tokens\n @param controlledToken The type of collateral that is being minted"
                  },
                  "functionSelector": "4d7f3db0",
                  "id": 10394,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 10360,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 10359,
                        "name": "onlyPrizePool",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11390,
                        "src": "13407:13:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "13407:13:50"
                    }
                  ],
                  "name": "beforeTokenMint",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 10358,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "13394:8:50"
                  },
                  "parameters": {
                    "id": 10357,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10350,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10394,
                        "src": "13291:10:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 10349,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "13291:7:50",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 10352,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10394,
                        "src": "13307:14:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 10351,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "13307:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 10354,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10394,
                        "src": "13327:23:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 10353,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "13327:7:50",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 10356,
                        "mutability": "mutable",
                        "name": "referrer",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10394,
                        "src": "13356:16:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 10355,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "13356:7:50",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "13285:91:50"
                  },
                  "returnParameters": {
                    "id": 10361,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "13423:0:50"
                  },
                  "scope": 11391,
                  "src": "13261:385:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 10403,
                    "nodeType": "Block",
                    "src": "13822:33:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 10400,
                            "name": "block",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -4,
                            "src": "13835:5:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_block",
                              "typeString": "block"
                            }
                          },
                          "id": 10401,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "timestamp",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "13835:15:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 10399,
                        "id": 10402,
                        "nodeType": "Return",
                        "src": "13828:22:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10395,
                    "nodeType": "StructuredDocumentation",
                    "src": "13650:105:50",
                    "text": "@notice returns the current time.  Used for testing.\n @return The current time (block.timestamp)"
                  },
                  "id": 10404,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_currentTime",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10396,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "13779:2:50"
                  },
                  "returnParameters": {
                    "id": 10399,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10398,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10404,
                        "src": "13813:7:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 10397,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "13813:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "13812:9:50"
                  },
                  "scope": 11391,
                  "src": "13758:97:50",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 10413,
                    "nodeType": "Block",
                    "src": "14032:30:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 10410,
                            "name": "block",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -4,
                            "src": "14045:5:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_block",
                              "typeString": "block"
                            }
                          },
                          "id": 10411,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "number",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "14045:12:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 10409,
                        "id": 10412,
                        "nodeType": "Return",
                        "src": "14038:19:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10405,
                    "nodeType": "StructuredDocumentation",
                    "src": "13859:105:50",
                    "text": "@notice returns the current time.  Used for testing.\n @return The current time (block.timestamp)"
                  },
                  "id": 10414,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_currentBlock",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10406,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "13989:2:50"
                  },
                  "returnParameters": {
                    "id": 10409,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10408,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10414,
                        "src": "14023:7:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 10407,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "14023:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "14022:9:50"
                  },
                  "scope": 11391,
                  "src": "13967:95:50",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 10491,
                    "nodeType": "Block",
                    "src": "14331:487:50",
                    "statements": [
                      {
                        "assignments": [
                          10421,
                          10423
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 10421,
                            "mutability": "mutable",
                            "name": "feeToken",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 10491,
                            "src": "14338:16:50",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 10420,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "14338:7:50",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 10423,
                            "mutability": "mutable",
                            "name": "requestFee",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 10491,
                            "src": "14356:18:50",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 10422,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "14356:7:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 10427,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 10424,
                              "name": "rng",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9746,
                              "src": "14378:3:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_RNGInterface_$5531",
                                "typeString": "contract RNGInterface"
                              }
                            },
                            "id": 10425,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "getRequestFee",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5506,
                            "src": "14378:17:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$__$returns$_t_address_$_t_uint256_$",
                              "typeString": "function () view external returns (address,uint256)"
                            }
                          },
                          "id": 10426,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14378:19:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_address_$_t_uint256_$",
                            "typeString": "tuple(address,uint256)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "14337:60:50"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 10437,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 10433,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 10428,
                              "name": "feeToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10421,
                              "src": "14407:8:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 10431,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "14427:1:50",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 10430,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "14419:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 10429,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "14419:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 10432,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "14419:10:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "src": "14407:22:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 10436,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 10434,
                              "name": "requestFee",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10423,
                              "src": "14433:10:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": ">",
                            "rightExpression": {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 10435,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "14446:1:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            },
                            "src": "14433:14:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "14407:40:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 10450,
                        "nodeType": "IfStatement",
                        "src": "14403:126:50",
                        "trueBody": {
                          "id": 10449,
                          "nodeType": "Block",
                          "src": "14449:80:50",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 10444,
                                        "name": "rng",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 9746,
                                        "src": "14505:3:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_RNGInterface_$5531",
                                          "typeString": "contract RNGInterface"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_RNGInterface_$5531",
                                          "typeString": "contract RNGInterface"
                                        }
                                      ],
                                      "id": 10443,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "14497:7:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 10442,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "14497:7:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 10445,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "14497:12:50",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 10446,
                                    "name": "requestFee",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 10423,
                                    "src": "14511:10:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 10439,
                                        "name": "feeToken",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 10421,
                                        "src": "14475:8:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "id": 10438,
                                      "name": "IERC20Upgradeable",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1960,
                                      "src": "14457:17:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_contract$_IERC20Upgradeable_$1960_$",
                                        "typeString": "type(contract IERC20Upgradeable)"
                                      }
                                    },
                                    "id": 10440,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "14457:27:50",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                      "typeString": "contract IERC20Upgradeable"
                                    }
                                  },
                                  "id": 10441,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "safeApprove",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 2062,
                                  "src": "14457:39:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20Upgradeable_$1960_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20Upgradeable_$1960_$",
                                    "typeString": "function (contract IERC20Upgradeable,address,uint256)"
                                  }
                                },
                                "id": 10447,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "14457:65:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 10448,
                              "nodeType": "ExpressionStatement",
                              "src": "14457:65:50"
                            }
                          ]
                        }
                      },
                      {
                        "assignments": [
                          10452,
                          10454
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 10452,
                            "mutability": "mutable",
                            "name": "requestId",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 10491,
                            "src": "14536:16:50",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            },
                            "typeName": {
                              "id": 10451,
                              "name": "uint32",
                              "nodeType": "ElementaryTypeName",
                              "src": "14536:6:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 10454,
                            "mutability": "mutable",
                            "name": "lockBlock",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 10491,
                            "src": "14554:16:50",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            },
                            "typeName": {
                              "id": 10453,
                              "name": "uint32",
                              "nodeType": "ElementaryTypeName",
                              "src": "14554:6:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 10458,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 10455,
                              "name": "rng",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9746,
                              "src": "14574:3:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_RNGInterface_$5531",
                                "typeString": "contract RNGInterface"
                              }
                            },
                            "id": 10456,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "requestRandomNumber",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5514,
                            "src": "14574:23:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$__$returns$_t_uint32_$_t_uint32_$",
                              "typeString": "function () external returns (uint32,uint32)"
                            }
                          },
                          "id": 10457,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14574:25:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_uint32_$_t_uint32_$",
                            "typeString": "tuple(uint32,uint32)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "14535:64:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 10463,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 10459,
                              "name": "rngRequest",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9748,
                              "src": "14605:10:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_RngRequest_$9732_storage",
                                "typeString": "struct PeriodicPrizeStrategy.RngRequest storage ref"
                              }
                            },
                            "id": 10461,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "id",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 9727,
                            "src": "14605:13:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 10462,
                            "name": "requestId",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10452,
                            "src": "14621:9:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "src": "14605:25:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "id": 10464,
                        "nodeType": "ExpressionStatement",
                        "src": "14605:25:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 10469,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 10465,
                              "name": "rngRequest",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9748,
                              "src": "14636:10:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_RngRequest_$9732_storage",
                                "typeString": "struct PeriodicPrizeStrategy.RngRequest storage ref"
                              }
                            },
                            "id": 10467,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "lockBlock",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 9729,
                            "src": "14636:20:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 10468,
                            "name": "lockBlock",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10454,
                            "src": "14659:9:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "src": "14636:32:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "id": 10470,
                        "nodeType": "ExpressionStatement",
                        "src": "14636:32:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 10478,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 10471,
                              "name": "rngRequest",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9748,
                              "src": "14674:10:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_RngRequest_$9732_storage",
                                "typeString": "struct PeriodicPrizeStrategy.RngRequest storage ref"
                              }
                            },
                            "id": 10473,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "requestedAt",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 9731,
                            "src": "14674:22:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "id": 10474,
                                  "name": "_currentTime",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 10404,
                                  "src": "14699:12:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                    "typeString": "function () view returns (uint256)"
                                  }
                                },
                                "id": 10475,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "14699:14:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 10476,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "toUint32",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4859,
                              "src": "14699:23:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint32_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256) pure returns (uint32)"
                              }
                            },
                            "id": 10477,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "14699:25:50",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "src": "14674:50:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "id": 10479,
                        "nodeType": "ExpressionStatement",
                        "src": "14674:50:50"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 10481,
                                "name": "_msgSender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3611,
                                "src": "14758:10:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                  "typeString": "function () view returns (address payable)"
                                }
                              },
                              "id": 10482,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "14758:12:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 10485,
                                  "name": "prizePool",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 9740,
                                  "src": "14780:9:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_PrizePool_$8751",
                                    "typeString": "contract PrizePool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_PrizePool_$8751",
                                    "typeString": "contract PrizePool"
                                  }
                                ],
                                "id": 10484,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "14772:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 10483,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "14772:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 10486,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "14772:18:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 10487,
                              "name": "requestId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10452,
                              "src": "14792:9:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 10488,
                              "name": "lockBlock",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10454,
                              "src": "14803:9:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              },
                              {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              }
                            ],
                            "id": 10480,
                            "name": "PrizePoolAwardStarted",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9649,
                            "src": "14736:21:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint32_$_t_uint32_$returns$__$",
                              "typeString": "function (address,address,uint32,uint32)"
                            }
                          },
                          "id": 10489,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14736:77:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10490,
                        "nodeType": "EmitStatement",
                        "src": "14731:82:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10415,
                    "nodeType": "StructuredDocumentation",
                    "src": "14066:210:50",
                    "text": "@notice Starts the award process by starting random number request.  The prize period must have ended.\n @dev The RNG-Request-Fee is expected to be held within this contract before calling this function"
                  },
                  "functionSelector": "b9ee1e05",
                  "id": 10492,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 10418,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 10417,
                        "name": "requireCanStartAward",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11359,
                        "src": "14310:20:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "14310:20:50"
                    }
                  ],
                  "name": "startAward",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10416,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "14298:2:50"
                  },
                  "returnParameters": {
                    "id": 10419,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "14331:0:50"
                  },
                  "scope": 11391,
                  "src": "14279:539:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 10529,
                    "nodeType": "Block",
                    "src": "14938:300:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 10497,
                                "name": "isRngTimedOut",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 11306,
                                "src": "14952:13:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$",
                                  "typeString": "function () view returns (bool)"
                                }
                              },
                              "id": 10498,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "14952:15:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f726e672d6e6f742d74696d65646f7574",
                              "id": 10499,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "14969:40:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_f5ce9bd7e5944ef04ba5c365849e9d2c36be5df391802caf173222989a3dfc9c",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/rng-not-timedout\""
                              },
                              "value": "PeriodicPrizeStrategy/rng-not-timedout"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_f5ce9bd7e5944ef04ba5c365849e9d2c36be5df391802caf173222989a3dfc9c",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/rng-not-timedout\""
                              }
                            ],
                            "id": 10496,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "14944:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 10500,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14944:66:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10501,
                        "nodeType": "ExpressionStatement",
                        "src": "14944:66:50"
                      },
                      {
                        "assignments": [
                          10503
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 10503,
                            "mutability": "mutable",
                            "name": "requestId",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 10529,
                            "src": "15016:16:50",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            },
                            "typeName": {
                              "id": 10502,
                              "name": "uint32",
                              "nodeType": "ElementaryTypeName",
                              "src": "15016:6:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 10506,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 10504,
                            "name": "rngRequest",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9748,
                            "src": "15035:10:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_RngRequest_$9732_storage",
                              "typeString": "struct PeriodicPrizeStrategy.RngRequest storage ref"
                            }
                          },
                          "id": 10505,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "id",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 9727,
                          "src": "15035:13:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "15016:32:50"
                      },
                      {
                        "assignments": [
                          10508
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 10508,
                            "mutability": "mutable",
                            "name": "lockBlock",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 10529,
                            "src": "15054:16:50",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            },
                            "typeName": {
                              "id": 10507,
                              "name": "uint32",
                              "nodeType": "ElementaryTypeName",
                              "src": "15054:6:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 10511,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 10509,
                            "name": "rngRequest",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9748,
                            "src": "15073:10:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_RngRequest_$9732_storage",
                              "typeString": "struct PeriodicPrizeStrategy.RngRequest storage ref"
                            }
                          },
                          "id": 10510,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "lockBlock",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 9729,
                          "src": "15073:20:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "15054:39:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 10513,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "UnaryOperation",
                          "operator": "delete",
                          "prefix": true,
                          "src": "15099:17:50",
                          "subExpression": {
                            "argumentTypes": null,
                            "id": 10512,
                            "name": "rngRequest",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9748,
                            "src": "15106:10:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_RngRequest_$9732_storage",
                              "typeString": "struct PeriodicPrizeStrategy.RngRequest storage ref"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10514,
                        "nodeType": "ExpressionStatement",
                        "src": "15099:17:50"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 10515,
                            "name": "RngRequestFailed",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9639,
                            "src": "15127:16:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 10516,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "15127:18:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10517,
                        "nodeType": "EmitStatement",
                        "src": "15122:23:50"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 10519,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "15180:3:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 10520,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "15180:10:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 10523,
                                  "name": "prizePool",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 9740,
                                  "src": "15200:9:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_PrizePool_$8751",
                                    "typeString": "contract PrizePool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_PrizePool_$8751",
                                    "typeString": "contract PrizePool"
                                  }
                                ],
                                "id": 10522,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "15192:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 10521,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "15192:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 10524,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "15192:18:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 10525,
                              "name": "requestId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10503,
                              "src": "15212:9:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 10526,
                              "name": "lockBlock",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10508,
                              "src": "15223:9:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              },
                              {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              }
                            ],
                            "id": 10518,
                            "name": "PrizePoolAwardCancelled",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9659,
                            "src": "15156:23:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint32_$_t_uint32_$returns$__$",
                              "typeString": "function (address,address,uint32,uint32)"
                            }
                          },
                          "id": 10527,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "15156:77:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10528,
                        "nodeType": "EmitStatement",
                        "src": "15151:82:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10493,
                    "nodeType": "StructuredDocumentation",
                    "src": "14822:83:50",
                    "text": "@notice Can be called by anyone to unlock the tickets if the RNG has timed out."
                  },
                  "functionSelector": "4c169f4f",
                  "id": 10530,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "cancelAward",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10494,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "14928:2:50"
                  },
                  "returnParameters": {
                    "id": 10495,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "14938:0:50"
                  },
                  "scope": 11391,
                  "src": "14908:330:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 10606,
                    "nodeType": "Block",
                    "src": "15432:734:50",
                    "statements": [
                      {
                        "assignments": [
                          10537
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 10537,
                            "mutability": "mutable",
                            "name": "randomNumber",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 10606,
                            "src": "15438:20:50",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 10536,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "15438:7:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 10543,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 10540,
                                "name": "rngRequest",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 9748,
                                "src": "15478:10:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_RngRequest_$9732_storage",
                                  "typeString": "struct PeriodicPrizeStrategy.RngRequest storage ref"
                                }
                              },
                              "id": 10541,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "id",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 9727,
                              "src": "15478:13:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 10538,
                              "name": "rng",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9746,
                              "src": "15461:3:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_RNGInterface_$5531",
                                "typeString": "contract RNGInterface"
                              }
                            },
                            "id": 10539,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "randomNumber",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5530,
                            "src": "15461:16:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_uint32_$returns$_t_uint256_$",
                              "typeString": "function (uint32) external returns (uint256)"
                            }
                          },
                          "id": 10542,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "15461:31:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "15438:54:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 10545,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "UnaryOperation",
                          "operator": "delete",
                          "prefix": true,
                          "src": "15498:17:50",
                          "subExpression": {
                            "argumentTypes": null,
                            "id": 10544,
                            "name": "rngRequest",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9748,
                            "src": "15505:10:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_RngRequest_$9732_storage",
                              "typeString": "struct PeriodicPrizeStrategy.RngRequest storage ref"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10546,
                        "nodeType": "ExpressionStatement",
                        "src": "15498:17:50"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 10555,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 10549,
                                "name": "beforeAwardListener",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 9767,
                                "src": "15534:19:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                                  "typeString": "contract BeforeAwardListenerInterface"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                                  "typeString": "contract BeforeAwardListenerInterface"
                                }
                              ],
                              "id": 10548,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "15526:7:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 10547,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "15526:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 10550,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "15526:28:50",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 10553,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "15566:1:50",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                }
                              ],
                              "id": 10552,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "15558:7:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 10551,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "15558:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 10554,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "15558:10:50",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "src": "15526:42:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 10564,
                        "nodeType": "IfStatement",
                        "src": "15522:141:50",
                        "trueBody": {
                          "id": 10563,
                          "nodeType": "Block",
                          "src": "15570:93:50",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 10559,
                                    "name": "randomNumber",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 10537,
                                    "src": "15621:12:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 10560,
                                    "name": "prizePeriodStartedAt",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 9755,
                                    "src": "15635:20:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 10556,
                                    "name": "beforeAwardListener",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 9767,
                                    "src": "15578:19:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                                      "typeString": "contract BeforeAwardListenerInterface"
                                    }
                                  },
                                  "id": 10558,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "beforePrizePoolAwarded",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 9574,
                                  "src": "15578:42:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$_t_uint256_$returns$__$",
                                    "typeString": "function (uint256,uint256) external"
                                  }
                                },
                                "id": 10561,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "15578:78:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 10562,
                              "nodeType": "ExpressionStatement",
                              "src": "15578:78:50"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10566,
                              "name": "randomNumber",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10537,
                              "src": "15680:12:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 10565,
                            "name": "_distribute",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9929,
                            "src": "15668:11:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 10567,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "15668:25:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10568,
                        "nodeType": "ExpressionStatement",
                        "src": "15668:25:50"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 10577,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 10571,
                                "name": "periodicPrizeStrategyListener",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 9770,
                                "src": "15711:29:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_PeriodicPrizeStrategyListenerInterface_$11432",
                                  "typeString": "contract PeriodicPrizeStrategyListenerInterface"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_PeriodicPrizeStrategyListenerInterface_$11432",
                                  "typeString": "contract PeriodicPrizeStrategyListenerInterface"
                                }
                              ],
                              "id": 10570,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "15703:7:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 10569,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "15703:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 10572,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "15703:38:50",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 10575,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "15753:1:50",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                }
                              ],
                              "id": 10574,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "15745:7:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 10573,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "15745:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 10576,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "15745:10:50",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "src": "15703:52:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 10586,
                        "nodeType": "IfStatement",
                        "src": "15699:160:50",
                        "trueBody": {
                          "id": 10585,
                          "nodeType": "Block",
                          "src": "15757:102:50",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 10581,
                                    "name": "randomNumber",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 10537,
                                    "src": "15817:12:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 10582,
                                    "name": "prizePeriodStartedAt",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 9755,
                                    "src": "15831:20:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 10578,
                                    "name": "periodicPrizeStrategyListener",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 9770,
                                    "src": "15765:29:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_PeriodicPrizeStrategyListenerInterface_$11432",
                                      "typeString": "contract PeriodicPrizeStrategyListenerInterface"
                                    }
                                  },
                                  "id": 10580,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "afterPrizePoolAwarded",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 11431,
                                  "src": "15765:51:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$_t_uint256_$returns$__$",
                                    "typeString": "function (uint256,uint256) external"
                                  }
                                },
                                "id": 10583,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "15765:87:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 10584,
                              "nodeType": "ExpressionStatement",
                              "src": "15765:87:50"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 10592,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 10587,
                            "name": "prizePeriodStartedAt",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9755,
                            "src": "15970:20:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "id": 10589,
                                  "name": "_currentTime",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 10404,
                                  "src": "16028:12:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                    "typeString": "function () view returns (uint256)"
                                  }
                                },
                                "id": 10590,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "16028:14:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 10588,
                              "name": "_calculateNextPrizePeriodStartTime",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10715,
                              "src": "15993:34:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_uint256_$",
                                "typeString": "function (uint256) view returns (uint256)"
                              }
                            },
                            "id": 10591,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "15993:50:50",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "15970:73:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 10593,
                        "nodeType": "ExpressionStatement",
                        "src": "15970:73:50"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 10595,
                                "name": "_msgSender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3611,
                                "src": "16072:10:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                  "typeString": "function () view returns (address payable)"
                                }
                              },
                              "id": 10596,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "16072:12:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 10597,
                              "name": "randomNumber",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10537,
                              "src": "16086:12:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 10594,
                            "name": "PrizePoolAwarded",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9665,
                            "src": "16055:16:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 10598,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16055:44:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10599,
                        "nodeType": "EmitStatement",
                        "src": "16050:49:50"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 10601,
                                "name": "_msgSender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 3611,
                                "src": "16126:10:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                  "typeString": "function () view returns (address payable)"
                                }
                              },
                              "id": 10602,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "16126:12:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 10603,
                              "name": "prizePeriodStartedAt",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9755,
                              "src": "16140:20:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 10600,
                            "name": "PrizePoolOpened",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9637,
                            "src": "16110:15:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 10604,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16110:51:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10605,
                        "nodeType": "EmitStatement",
                        "src": "16105:56:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10531,
                    "nodeType": "StructuredDocumentation",
                    "src": "15242:129:50",
                    "text": "@notice Completes the award process and awards the winners.  The random number must have been requested and is now available."
                  },
                  "functionSelector": "dfb2f13b",
                  "id": 10607,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 10534,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 10533,
                        "name": "requireCanCompleteAward",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11375,
                        "src": "15408:23:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "15408:23:50"
                    }
                  ],
                  "name": "completeAward",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10532,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "15396:2:50"
                  },
                  "returnParameters": {
                    "id": 10535,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "15432:0:50"
                  },
                  "scope": 11391,
                  "src": "15374:792:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 10647,
                    "nodeType": "Block",
                    "src": "16563:360:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 10635,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                "id": 10626,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "30",
                                      "id": 10620,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "16592:1:50",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      },
                                      "value": "0"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      }
                                    ],
                                    "id": 10619,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "16584:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 10618,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "16584:7:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 10621,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "16584:10:50",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 10624,
                                      "name": "_beforeAwardListener",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 10610,
                                      "src": "16606:20:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                                        "typeString": "contract BeforeAwardListenerInterface"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                                        "typeString": "contract BeforeAwardListenerInterface"
                                      }
                                    ],
                                    "id": 10623,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "16598:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 10622,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "16598:7:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 10625,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "16598:29:50",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "src": "16584:43:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 10632,
                                      "name": "BeforeAwardListenerLibrary",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 9581,
                                      "src": "16679:26:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_contract$_BeforeAwardListenerLibrary_$9581_$",
                                        "typeString": "type(library BeforeAwardListenerLibrary)"
                                      }
                                    },
                                    "id": 10633,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "ERC165_INTERFACE_ID_BEFORE_AWARD_LISTENER",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 9580,
                                    "src": "16679:68:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes4",
                                      "typeString": "bytes4"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes4",
                                      "typeString": "bytes4"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 10629,
                                        "name": "_beforeAwardListener",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 10610,
                                        "src": "16639:20:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                                          "typeString": "contract BeforeAwardListenerInterface"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                                          "typeString": "contract BeforeAwardListenerInterface"
                                        }
                                      ],
                                      "id": 10628,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "16631:7:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 10627,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "16631:7:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 10630,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "16631:29:50",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "id": 10631,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "supportsInterface",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 665,
                                  "src": "16631:47:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes4_$returns$_t_bool_$bound_to$_t_address_$",
                                    "typeString": "function (address,bytes4) view returns (bool)"
                                  }
                                },
                                "id": 10634,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "16631:117:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "16584:164:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f6265666f726541776172644c697374656e65722d696e76616c6964",
                              "id": 10636,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "16756:51:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_9ee34943a6f81b784c06e81be8f345385f454a60a2e1f320c035be0852b86f3d",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/beforeAwardListener-invalid\""
                              },
                              "value": "PeriodicPrizeStrategy/beforeAwardListener-invalid"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_9ee34943a6f81b784c06e81be8f345385f454a60a2e1f320c035be0852b86f3d",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/beforeAwardListener-invalid\""
                              }
                            ],
                            "id": 10617,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "16569:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 10637,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16569:244:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10638,
                        "nodeType": "ExpressionStatement",
                        "src": "16569:244:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 10641,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 10639,
                            "name": "beforeAwardListener",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9767,
                            "src": "16820:19:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                              "typeString": "contract BeforeAwardListenerInterface"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 10640,
                            "name": "_beforeAwardListener",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10610,
                            "src": "16842:20:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                              "typeString": "contract BeforeAwardListenerInterface"
                            }
                          },
                          "src": "16820:42:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                            "typeString": "contract BeforeAwardListenerInterface"
                          }
                        },
                        "id": 10642,
                        "nodeType": "ExpressionStatement",
                        "src": "16820:42:50"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10644,
                              "name": "_beforeAwardListener",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10610,
                              "src": "16897:20:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                                "typeString": "contract BeforeAwardListenerInterface"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                                "typeString": "contract BeforeAwardListenerInterface"
                              }
                            ],
                            "id": 10643,
                            "name": "BeforeAwardListenerSet",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9685,
                            "src": "16874:22:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_contract$_BeforeAwardListenerInterface_$9575_$returns$__$",
                              "typeString": "function (contract BeforeAwardListenerInterface)"
                            }
                          },
                          "id": 10645,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16874:44:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10646,
                        "nodeType": "EmitStatement",
                        "src": "16869:49:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10608,
                    "nodeType": "StructuredDocumentation",
                    "src": "16170:262:50",
                    "text": "@notice Allows the owner to set a listener that is triggered immediately before the award is distributed\n @dev The listener must implement ERC165 and the BeforeAwardListenerInterface\n @param _beforeAwardListener The address of the listener contract"
                  },
                  "functionSelector": "30fcdf41",
                  "id": 10648,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 10613,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 10612,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "16527:9:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "16527:9:50"
                    },
                    {
                      "arguments": null,
                      "id": 10615,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 10614,
                        "name": "requireAwardNotInProgress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11342,
                        "src": "16537:25:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "16537:25:50"
                    }
                  ],
                  "name": "setBeforeAwardListener",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10611,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10610,
                        "mutability": "mutable",
                        "name": "_beforeAwardListener",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10648,
                        "src": "16467:49:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                          "typeString": "contract BeforeAwardListenerInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 10609,
                          "name": "BeforeAwardListenerInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 9575,
                          "src": "16467:28:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                            "typeString": "contract BeforeAwardListenerInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "16466:51:50"
                  },
                  "returnParameters": {
                    "id": 10616,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "16563:0:50"
                  },
                  "scope": 11391,
                  "src": "16435:488:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 10688,
                    "nodeType": "Block",
                    "src": "17245:443:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 10676,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                "id": 10667,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "30",
                                      "id": 10661,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "17274:1:50",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      },
                                      "value": "0"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      }
                                    ],
                                    "id": 10660,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "17266:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 10659,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "17266:7:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 10662,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "17266:10:50",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 10665,
                                      "name": "_periodicPrizeStrategyListener",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 10651,
                                      "src": "17288:30:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_PeriodicPrizeStrategyListenerInterface_$11432",
                                        "typeString": "contract PeriodicPrizeStrategyListenerInterface"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_PeriodicPrizeStrategyListenerInterface_$11432",
                                        "typeString": "contract PeriodicPrizeStrategyListenerInterface"
                                      }
                                    ],
                                    "id": 10664,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "17280:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 10663,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "17280:7:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 10666,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "17280:39:50",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "src": "17266:53:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 10673,
                                      "name": "PeriodicPrizeStrategyListenerLibrary",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 11438,
                                      "src": "17381:36:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_contract$_PeriodicPrizeStrategyListenerLibrary_$11438_$",
                                        "typeString": "type(library PeriodicPrizeStrategyListenerLibrary)"
                                      }
                                    },
                                    "id": 10674,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 11437,
                                    "src": "17381:89:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes4",
                                      "typeString": "bytes4"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes4",
                                      "typeString": "bytes4"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 10670,
                                        "name": "_periodicPrizeStrategyListener",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 10651,
                                        "src": "17331:30:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_PeriodicPrizeStrategyListenerInterface_$11432",
                                          "typeString": "contract PeriodicPrizeStrategyListenerInterface"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_PeriodicPrizeStrategyListenerInterface_$11432",
                                          "typeString": "contract PeriodicPrizeStrategyListenerInterface"
                                        }
                                      ],
                                      "id": 10669,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "17323:7:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 10668,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "17323:7:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 10671,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "17323:39:50",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "id": 10672,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "supportsInterface",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 665,
                                  "src": "17323:57:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes4_$returns$_t_bool_$bound_to$_t_address_$",
                                    "typeString": "function (address,bytes4) view returns (bool)"
                                  }
                                },
                                "id": 10675,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "17323:148:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "17266:205:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f7072697a6553747261746567794c697374656e65722d696e76616c6964",
                              "id": 10677,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "17479:53:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_e6794b9a51ab1877f64dcc8f9b670fd4fcefddeed627a85d99f9c04d1e5b5f44",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/prizeStrategyListener-invalid\""
                              },
                              "value": "PeriodicPrizeStrategy/prizeStrategyListener-invalid"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_e6794b9a51ab1877f64dcc8f9b670fd4fcefddeed627a85d99f9c04d1e5b5f44",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/prizeStrategyListener-invalid\""
                              }
                            ],
                            "id": 10658,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "17251:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 10678,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "17251:287:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10679,
                        "nodeType": "ExpressionStatement",
                        "src": "17251:287:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 10682,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 10680,
                            "name": "periodicPrizeStrategyListener",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9770,
                            "src": "17545:29:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_PeriodicPrizeStrategyListenerInterface_$11432",
                              "typeString": "contract PeriodicPrizeStrategyListenerInterface"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 10681,
                            "name": "_periodicPrizeStrategyListener",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10651,
                            "src": "17577:30:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_PeriodicPrizeStrategyListenerInterface_$11432",
                              "typeString": "contract PeriodicPrizeStrategyListenerInterface"
                            }
                          },
                          "src": "17545:62:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_PeriodicPrizeStrategyListenerInterface_$11432",
                            "typeString": "contract PeriodicPrizeStrategyListenerInterface"
                          }
                        },
                        "id": 10683,
                        "nodeType": "ExpressionStatement",
                        "src": "17545:62:50"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10685,
                              "name": "_periodicPrizeStrategyListener",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10651,
                              "src": "17652:30:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_PeriodicPrizeStrategyListenerInterface_$11432",
                                "typeString": "contract PeriodicPrizeStrategyListenerInterface"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_PeriodicPrizeStrategyListenerInterface_$11432",
                                "typeString": "contract PeriodicPrizeStrategyListenerInterface"
                              }
                            ],
                            "id": 10684,
                            "name": "PeriodicPrizeStrategyListenerSet",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9689,
                            "src": "17619:32:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_contract$_PeriodicPrizeStrategyListenerInterface_$11432_$returns$__$",
                              "typeString": "function (contract PeriodicPrizeStrategyListenerInterface)"
                            }
                          },
                          "id": 10686,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "17619:64:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10687,
                        "nodeType": "EmitStatement",
                        "src": "17614:69:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10649,
                    "nodeType": "StructuredDocumentation",
                    "src": "16927:157:50",
                    "text": "@notice Allows the owner to set a listener for prize strategy callbacks.\n @param _periodicPrizeStrategyListener The address of the listener contract"
                  },
                  "functionSelector": "8aa3ec6f",
                  "id": 10689,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 10654,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 10653,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "17209:9:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "17209:9:50"
                    },
                    {
                      "arguments": null,
                      "id": 10656,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 10655,
                        "name": "requireAwardNotInProgress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11342,
                        "src": "17219:25:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "17219:25:50"
                    }
                  ],
                  "name": "setPeriodicPrizeStrategyListener",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10652,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10651,
                        "mutability": "mutable",
                        "name": "_periodicPrizeStrategyListener",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10689,
                        "src": "17129:69:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_PeriodicPrizeStrategyListenerInterface_$11432",
                          "typeString": "contract PeriodicPrizeStrategyListenerInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 10650,
                          "name": "PeriodicPrizeStrategyListenerInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 11432,
                          "src": "17129:38:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_PeriodicPrizeStrategyListenerInterface_$11432",
                            "typeString": "contract PeriodicPrizeStrategyListenerInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "17128:71:50"
                  },
                  "returnParameters": {
                    "id": 10657,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "17245:0:50"
                  },
                  "scope": 11391,
                  "src": "17087:601:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 10714,
                    "nodeType": "Block",
                    "src": "17789:174:50",
                    "statements": [
                      {
                        "assignments": [
                          10697
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 10697,
                            "mutability": "mutable",
                            "name": "elapsedPeriods",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 10714,
                            "src": "17795:22:50",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 10696,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "17795:7:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 10705,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10703,
                              "name": "prizePeriodSeconds",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9753,
                              "src": "17862:18:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 10700,
                                  "name": "prizePeriodStartedAt",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 9755,
                                  "src": "17836:20:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 10698,
                                  "name": "currentTime",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 10691,
                                  "src": "17820:11:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 10699,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sub",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 1135,
                                "src": "17820:15:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                  "typeString": "function (uint256,uint256) pure returns (uint256)"
                                }
                              },
                              "id": 10701,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "17820:37:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 10702,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "div",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1191,
                            "src": "17820:41:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 10704,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "17820:61:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "17795:86:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 10710,
                                  "name": "prizePeriodSeconds",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 9753,
                                  "src": "17938:18:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 10708,
                                  "name": "elapsedPeriods",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 10697,
                                  "src": "17919:14:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 10709,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "mul",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 1169,
                                "src": "17919:18:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                  "typeString": "function (uint256,uint256) pure returns (uint256)"
                                }
                              },
                              "id": 10711,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "17919:38:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 10706,
                              "name": "prizePeriodStartedAt",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9755,
                              "src": "17894:20:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 10707,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "add",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1113,
                            "src": "17894:24:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 10712,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "17894:64:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 10695,
                        "id": 10713,
                        "nodeType": "Return",
                        "src": "17887:71:50"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 10715,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_calculateNextPrizePeriodStartTime",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10692,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10691,
                        "mutability": "mutable",
                        "name": "currentTime",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10715,
                        "src": "17736:19:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 10690,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "17736:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "17735:21:50"
                  },
                  "returnParameters": {
                    "id": 10695,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10694,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10715,
                        "src": "17780:7:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 10693,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "17780:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "17779:9:50"
                  },
                  "scope": 11391,
                  "src": "17692:271:50",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 10727,
                    "nodeType": "Block",
                    "src": "18263:65:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10724,
                              "name": "currentTime",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10718,
                              "src": "18311:11:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 10723,
                            "name": "_calculateNextPrizePeriodStartTime",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10715,
                            "src": "18276:34:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256) view returns (uint256)"
                            }
                          },
                          "id": 10725,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "18276:47:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 10722,
                        "id": 10726,
                        "nodeType": "Return",
                        "src": "18269:54:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10716,
                    "nodeType": "StructuredDocumentation",
                    "src": "17967:197:50",
                    "text": "@notice Calculates when the next prize period will start\n @param currentTime The timestamp to use as the current time\n @return The timestamp at which the next prize period would start"
                  },
                  "functionSelector": "47bed998",
                  "id": 10728,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "calculateNextPrizePeriodStartTime",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10719,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10718,
                        "mutability": "mutable",
                        "name": "currentTime",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10728,
                        "src": "18210:19:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 10717,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "18210:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18209:21:50"
                  },
                  "returnParameters": {
                    "id": 10722,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10721,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10728,
                        "src": "18254:7:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 10720,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "18254:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18253:9:50"
                  },
                  "scope": 11391,
                  "src": "18167:161:50",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 10741,
                    "nodeType": "Block",
                    "src": "18512:59:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 10739,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 10734,
                              "name": "_isPrizePeriodOver",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10059,
                              "src": "18525:18:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$",
                                "typeString": "function () view returns (bool)"
                              }
                            },
                            "id": 10735,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "18525:20:50",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 10738,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "!",
                            "prefix": true,
                            "src": "18549:17:50",
                            "subExpression": {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 10736,
                                "name": "isRngRequested",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 10767,
                                "src": "18550:14:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$",
                                  "typeString": "function () view returns (bool)"
                                }
                              },
                              "id": 10737,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "18550:16:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "18525:41:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 10733,
                        "id": 10740,
                        "nodeType": "Return",
                        "src": "18518:48:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10729,
                    "nodeType": "StructuredDocumentation",
                    "src": "18332:123:50",
                    "text": "@notice Returns whether an award process can be started\n @return True if an award can be started, false otherwise."
                  },
                  "functionSelector": "876f5c7e",
                  "id": 10742,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "canStartAward",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10730,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "18480:2:50"
                  },
                  "returnParameters": {
                    "id": 10733,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10732,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10742,
                        "src": "18506:4:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 10731,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "18506:4:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18505:6:50"
                  },
                  "scope": 11391,
                  "src": "18458:113:50",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 10754,
                    "nodeType": "Block",
                    "src": "18762:54:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 10752,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 10748,
                              "name": "isRngRequested",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10767,
                              "src": "18775:14:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$",
                                "typeString": "function () view returns (bool)"
                              }
                            },
                            "id": 10749,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "18775:16:50",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 10750,
                              "name": "isRngCompleted",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10780,
                              "src": "18795:14:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$",
                                "typeString": "function () view returns (bool)"
                              }
                            },
                            "id": 10751,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "18795:16:50",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "18775:36:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 10747,
                        "id": 10753,
                        "nodeType": "Return",
                        "src": "18768:43:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10743,
                    "nodeType": "StructuredDocumentation",
                    "src": "18575:127:50",
                    "text": "@notice Returns whether an award process can be completed\n @return True if an award can be completed, false otherwise."
                  },
                  "functionSelector": "6a74f107",
                  "id": 10755,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "canCompleteAward",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10744,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "18730:2:50"
                  },
                  "returnParameters": {
                    "id": 10747,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10746,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10755,
                        "src": "18756:4:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 10745,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "18756:4:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18755:6:50"
                  },
                  "scope": 11391,
                  "src": "18705:111:50",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 10766,
                    "nodeType": "Block",
                    "src": "19013:36:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          },
                          "id": 10764,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 10761,
                              "name": "rngRequest",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9748,
                              "src": "19026:10:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_RngRequest_$9732_storage",
                                "typeString": "struct PeriodicPrizeStrategy.RngRequest storage ref"
                              }
                            },
                            "id": 10762,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "id",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 9727,
                            "src": "19026:13:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 10763,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "19043:1:50",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "19026:18:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 10760,
                        "id": 10765,
                        "nodeType": "Return",
                        "src": "19019:25:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10756,
                    "nodeType": "StructuredDocumentation",
                    "src": "18820:137:50",
                    "text": "@notice Returns whether a random number has been requested\n @return True if a random number has been requested, false otherwise."
                  },
                  "functionSelector": "111070e4",
                  "id": 10767,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "isRngRequested",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10757,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "18983:2:50"
                  },
                  "returnParameters": {
                    "id": 10760,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10759,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10767,
                        "src": "19007:4:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 10758,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "19007:4:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19006:6:50"
                  },
                  "scope": 11391,
                  "src": "18960:89:50",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 10779,
                    "nodeType": "Block",
                    "src": "19255:54:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 10775,
                                "name": "rngRequest",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 9748,
                                "src": "19290:10:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_RngRequest_$9732_storage",
                                  "typeString": "struct PeriodicPrizeStrategy.RngRequest storage ref"
                                }
                              },
                              "id": 10776,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "id",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 9727,
                              "src": "19290:13:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 10773,
                              "name": "rng",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9746,
                              "src": "19268:3:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_RNGInterface_$5531",
                                "typeString": "contract RNGInterface"
                              }
                            },
                            "id": 10774,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "isRequestComplete",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5522,
                            "src": "19268:21:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_uint32_$returns$_t_bool_$",
                              "typeString": "function (uint32) view external returns (bool)"
                            }
                          },
                          "id": 10777,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "19268:36:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 10772,
                        "id": 10778,
                        "nodeType": "Return",
                        "src": "19261:43:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10768,
                    "nodeType": "StructuredDocumentation",
                    "src": "19053:146:50",
                    "text": "@notice Returns whether the random number request has completed.\n @return True if a random number request has completed, false otherwise."
                  },
                  "functionSelector": "4aba4f6b",
                  "id": 10780,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "isRngCompleted",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10769,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "19225:2:50"
                  },
                  "returnParameters": {
                    "id": 10772,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10771,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10780,
                        "src": "19249:4:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 10770,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "19249:4:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19248:6:50"
                  },
                  "scope": 11391,
                  "src": "19202:107:50",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 10789,
                    "nodeType": "Block",
                    "src": "19527:38:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 10786,
                            "name": "rngRequest",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9748,
                            "src": "19540:10:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_RngRequest_$9732_storage",
                              "typeString": "struct PeriodicPrizeStrategy.RngRequest storage ref"
                            }
                          },
                          "id": 10787,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "lockBlock",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 9729,
                          "src": "19540:20:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "functionReturnParameters": 10785,
                        "id": 10788,
                        "nodeType": "Return",
                        "src": "19533:27:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10781,
                    "nodeType": "StructuredDocumentation",
                    "src": "19313:149:50",
                    "text": "@notice Returns the block number that the current RNG request has been locked to\n @return The block number that the RNG request is locked to"
                  },
                  "functionSelector": "6bea5344",
                  "id": 10790,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "getLastRngLockBlock",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10782,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "19493:2:50"
                  },
                  "returnParameters": {
                    "id": 10785,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10784,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10790,
                        "src": "19519:6:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 10783,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "19519:6:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19518:8:50"
                  },
                  "scope": 11391,
                  "src": "19465:100:50",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 10799,
                    "nodeType": "Block",
                    "src": "19717:31:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 10796,
                            "name": "rngRequest",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9748,
                            "src": "19730:10:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_RngRequest_$9732_storage",
                              "typeString": "struct PeriodicPrizeStrategy.RngRequest storage ref"
                            }
                          },
                          "id": 10797,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "id",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 9727,
                          "src": "19730:13:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "functionReturnParameters": 10795,
                        "id": 10798,
                        "nodeType": "Return",
                        "src": "19723:20:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10791,
                    "nodeType": "StructuredDocumentation",
                    "src": "19569:83:50",
                    "text": "@notice Returns the current RNG Request ID\n @return The current Request ID"
                  },
                  "functionSelector": "2a7ad609",
                  "id": 10800,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "getLastRngRequestId",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10792,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "19683:2:50"
                  },
                  "returnParameters": {
                    "id": 10795,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10794,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10800,
                        "src": "19709:6:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 10793,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "19709:6:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19708:8:50"
                  },
                  "scope": 11391,
                  "src": "19655:93:50",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 10825,
                    "nodeType": "Block",
                    "src": "19989:139:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10813,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "UnaryOperation",
                              "operator": "!",
                              "prefix": true,
                              "src": "20003:17:50",
                              "subExpression": {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "id": 10811,
                                  "name": "isRngRequested",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 10767,
                                  "src": "20004:14:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$",
                                    "typeString": "function () view returns (bool)"
                                  }
                                },
                                "id": 10812,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "20004:16:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f726e672d696e2d666c69676874",
                              "id": 10814,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "20022:37:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_f4381939666e828bee0ec0af4933dfc4131d700b8543b1d831867f1469c633f8",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/rng-in-flight\""
                              },
                              "value": "PeriodicPrizeStrategy/rng-in-flight"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_f4381939666e828bee0ec0af4933dfc4131d700b8543b1d831867f1469c633f8",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/rng-in-flight\""
                              }
                            ],
                            "id": 10810,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "19995:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 10815,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "19995:65:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10816,
                        "nodeType": "ExpressionStatement",
                        "src": "19995:65:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 10819,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 10817,
                            "name": "rng",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9746,
                            "src": "20067:3:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_RNGInterface_$5531",
                              "typeString": "contract RNGInterface"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 10818,
                            "name": "rngService",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10803,
                            "src": "20073:10:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_RNGInterface_$5531",
                              "typeString": "contract RNGInterface"
                            }
                          },
                          "src": "20067:16:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_RNGInterface_$5531",
                            "typeString": "contract RNGInterface"
                          }
                        },
                        "id": 10820,
                        "nodeType": "ExpressionStatement",
                        "src": "20067:16:50"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10822,
                              "name": "rngService",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10803,
                              "src": "20112:10:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_RNGInterface_$5531",
                                "typeString": "contract RNGInterface"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_RNGInterface_$5531",
                                "typeString": "contract RNGInterface"
                              }
                            ],
                            "id": 10821,
                            "name": "RngServiceUpdated",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9669,
                            "src": "20094:17:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_contract$_RNGInterface_$5531_$returns$__$",
                              "typeString": "function (contract RNGInterface)"
                            }
                          },
                          "id": 10823,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "20094:29:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10824,
                        "nodeType": "EmitStatement",
                        "src": "20089:34:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10801,
                    "nodeType": "StructuredDocumentation",
                    "src": "19752:141:50",
                    "text": "@notice Sets the RNG service that the Prize Strategy is connected to\n @param rngService The address of the new RNG service interface"
                  },
                  "functionSelector": "7f4296d7",
                  "id": 10826,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 10806,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 10805,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "19953:9:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "19953:9:50"
                    },
                    {
                      "arguments": null,
                      "id": 10808,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 10807,
                        "name": "requireAwardNotInProgress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11342,
                        "src": "19963:25:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "19963:25:50"
                    }
                  ],
                  "name": "setRngService",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10804,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10803,
                        "mutability": "mutable",
                        "name": "rngService",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10826,
                        "src": "19919:23:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_RNGInterface_$5531",
                          "typeString": "contract RNGInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 10802,
                          "name": "RNGInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 5531,
                          "src": "19919:12:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_RNGInterface_$5531",
                            "typeString": "contract RNGInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19918:25:50"
                  },
                  "returnParameters": {
                    "id": 10809,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "19989:0:50"
                  },
                  "scope": 11391,
                  "src": "19896:232:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 10840,
                    "nodeType": "Block",
                    "src": "20475:52:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10837,
                              "name": "_rngRequestTimeout",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10829,
                              "src": "20503:18:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              }
                            ],
                            "id": 10836,
                            "name": "_setRngRequestTimeout",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10863,
                            "src": "20481:21:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint32_$returns$__$",
                              "typeString": "function (uint32)"
                            }
                          },
                          "id": 10838,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "20481:41:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10839,
                        "nodeType": "ExpressionStatement",
                        "src": "20481:41:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10827,
                    "nodeType": "StructuredDocumentation",
                    "src": "20132:238:50",
                    "text": "@notice Allows the owner to set the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\n @param _rngRequestTimeout The RNG request timeout in seconds."
                  },
                  "functionSelector": "c6853270",
                  "id": 10841,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 10832,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 10831,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "20439:9:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "20439:9:50"
                    },
                    {
                      "arguments": null,
                      "id": 10834,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 10833,
                        "name": "requireAwardNotInProgress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11342,
                        "src": "20449:25:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "20449:25:50"
                    }
                  ],
                  "name": "setRngRequestTimeout",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10830,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10829,
                        "mutability": "mutable",
                        "name": "_rngRequestTimeout",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10841,
                        "src": "20403:25:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 10828,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "20403:6:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20402:27:50"
                  },
                  "returnParameters": {
                    "id": 10835,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "20475:0:50"
                  },
                  "scope": 11391,
                  "src": "20373:154:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 10862,
                    "nodeType": "Block",
                    "src": "20820:185:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              },
                              "id": 10850,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 10848,
                                "name": "_rngRequestTimeout",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 10844,
                                "src": "20834:18:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint32",
                                  "typeString": "uint32"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "3630",
                                "id": 10849,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "20855:2:50",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_60_by_1",
                                  "typeString": "int_const 60"
                                },
                                "value": "60"
                              },
                              "src": "20834:23:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f726e672d74696d656f75742d67742d36302d73656373",
                              "id": 10851,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "20859:46:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_f82961c978772f634fb2dca4068020d6cd922ea0fdf69901bc112c102430917c",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/rng-timeout-gt-60-secs\""
                              },
                              "value": "PeriodicPrizeStrategy/rng-timeout-gt-60-secs"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_f82961c978772f634fb2dca4068020d6cd922ea0fdf69901bc112c102430917c",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/rng-timeout-gt-60-secs\""
                              }
                            ],
                            "id": 10847,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "20826:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 10852,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "20826:80:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10853,
                        "nodeType": "ExpressionStatement",
                        "src": "20826:80:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 10856,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 10854,
                            "name": "rngRequestTimeout",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9751,
                            "src": "20912:17:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 10855,
                            "name": "_rngRequestTimeout",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10844,
                            "src": "20932:18:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "src": "20912:38:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "id": 10857,
                        "nodeType": "ExpressionStatement",
                        "src": "20912:38:50"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10859,
                              "name": "rngRequestTimeout",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9751,
                              "src": "20982:17:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              }
                            ],
                            "id": 10858,
                            "name": "RngRequestTimeoutSet",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9677,
                            "src": "20961:20:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_uint32_$returns$__$",
                              "typeString": "function (uint32)"
                            }
                          },
                          "id": 10860,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "20961:39:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10861,
                        "nodeType": "EmitStatement",
                        "src": "20956:44:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10842,
                    "nodeType": "StructuredDocumentation",
                    "src": "20531:219:50",
                    "text": "@notice Sets the RNG request timeout in seconds.  This is the time that must elapsed before the RNG request can be cancelled and the pool unlocked.\n @param _rngRequestTimeout The RNG request timeout in seconds."
                  },
                  "id": 10863,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_setRngRequestTimeout",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10845,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10844,
                        "mutability": "mutable",
                        "name": "_rngRequestTimeout",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10863,
                        "src": "20784:25:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 10843,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "20784:6:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20783:27:50"
                  },
                  "returnParameters": {
                    "id": 10846,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "20820:0:50"
                  },
                  "scope": 11391,
                  "src": "20753:252:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 10877,
                    "nodeType": "Block",
                    "src": "21275:54:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10874,
                              "name": "_prizePeriodSeconds",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10866,
                              "src": "21304:19:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 10873,
                            "name": "_setPrizePeriodSeconds",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10900,
                            "src": "21281:22:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 10875,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21281:43:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10876,
                        "nodeType": "ExpressionStatement",
                        "src": "21281:43:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10864,
                    "nodeType": "StructuredDocumentation",
                    "src": "21009:158:50",
                    "text": "@notice Allows the owner to set the prize period in seconds.\n @param _prizePeriodSeconds The new prize period in seconds.  Must be greater than zero."
                  },
                  "functionSelector": "884a4448",
                  "id": 10878,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 10869,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 10868,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "21239:9:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "21239:9:50"
                    },
                    {
                      "arguments": null,
                      "id": 10871,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 10870,
                        "name": "requireAwardNotInProgress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11342,
                        "src": "21249:25:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "21249:25:50"
                    }
                  ],
                  "name": "setPrizePeriodSeconds",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10867,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10866,
                        "mutability": "mutable",
                        "name": "_prizePeriodSeconds",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10878,
                        "src": "21201:27:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 10865,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "21201:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21200:29:50"
                  },
                  "returnParameters": {
                    "id": 10872,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "21275:0:50"
                  },
                  "scope": 11391,
                  "src": "21170:159:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 10899,
                    "nodeType": "Block",
                    "src": "21545:202:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 10887,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 10885,
                                "name": "_prizePeriodSeconds",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 10881,
                                "src": "21559:19:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 10886,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "21581:1:50",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "21559:23:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f7072697a652d706572696f642d677265617465722d7468616e2d7a65726f",
                              "id": 10888,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "21584:54:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_454c9813cab55e632f85d2df40867fdc191a28ae08148658f23a6d13985fd654",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/prize-period-greater-than-zero\""
                              },
                              "value": "PeriodicPrizeStrategy/prize-period-greater-than-zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_454c9813cab55e632f85d2df40867fdc191a28ae08148658f23a6d13985fd654",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/prize-period-greater-than-zero\""
                              }
                            ],
                            "id": 10884,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "21551:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 10889,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21551:88:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10890,
                        "nodeType": "ExpressionStatement",
                        "src": "21551:88:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 10893,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 10891,
                            "name": "prizePeriodSeconds",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9753,
                            "src": "21645:18:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 10892,
                            "name": "_prizePeriodSeconds",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10881,
                            "src": "21666:19:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "21645:40:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 10894,
                        "nodeType": "ExpressionStatement",
                        "src": "21645:40:50"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10896,
                              "name": "prizePeriodSeconds",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9753,
                              "src": "21723:18:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 10895,
                            "name": "PrizePeriodSecondsUpdated",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9681,
                            "src": "21697:25:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 10897,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21697:45:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10898,
                        "nodeType": "EmitStatement",
                        "src": "21692:50:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10879,
                    "nodeType": "StructuredDocumentation",
                    "src": "21333:139:50",
                    "text": "@notice Sets the prize period in seconds.\n @param _prizePeriodSeconds The new prize period in seconds.  Must be greater than zero."
                  },
                  "id": 10900,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_setPrizePeriodSeconds",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10882,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10881,
                        "mutability": "mutable",
                        "name": "_prizePeriodSeconds",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10900,
                        "src": "21507:27:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 10880,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "21507:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21506:29:50"
                  },
                  "returnParameters": {
                    "id": 10883,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "21545:0:50"
                  },
                  "scope": 11391,
                  "src": "21475:272:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 10911,
                    "nodeType": "Block",
                    "src": "21988:47:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 10907,
                              "name": "externalErc20s",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9757,
                              "src": "22001:14:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                              }
                            },
                            "id": 10908,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "addressArray",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16646,
                            "src": "22001:27:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_Mapping_$16337_storage_ptr_$returns$_t_array$_t_address_$dyn_memory_ptr_$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                              "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer) view returns (address[] memory)"
                            }
                          },
                          "id": 10909,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22001:29:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                            "typeString": "address[] memory"
                          }
                        },
                        "functionReturnParameters": 10906,
                        "id": 10910,
                        "nodeType": "Return",
                        "src": "21994:36:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10901,
                    "nodeType": "StructuredDocumentation",
                    "src": "21751:159:50",
                    "text": "@notice Gets the current list of External ERC20 tokens that will be awarded with the current prize\n @return An array of External ERC20 token addresses"
                  },
                  "functionSelector": "62c77a61",
                  "id": 10912,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "getExternalErc20Awards",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10902,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "21944:2:50"
                  },
                  "returnParameters": {
                    "id": 10906,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10905,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10912,
                        "src": "21970:16:50",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                          "typeString": "address[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 10903,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "21970:7:50",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "id": 10904,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "21970:9:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                            "typeString": "address[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21969:18:50"
                  },
                  "scope": 11391,
                  "src": "21913:122:50",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 10926,
                    "nodeType": "Block",
                    "src": "22449:49:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10923,
                              "name": "_externalErc20",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10915,
                              "src": "22478:14:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            ],
                            "id": 10922,
                            "name": "_addExternalErc20Award",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10987,
                            "src": "22455:22:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20Upgradeable_$1960_$returns$__$",
                              "typeString": "function (contract IERC20Upgradeable)"
                            }
                          },
                          "id": 10924,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22455:38:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10925,
                        "nodeType": "ExpressionStatement",
                        "src": "22455:38:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 10913,
                    "nodeType": "StructuredDocumentation",
                    "src": "22039:287:50",
                    "text": "@notice Adds an external ERC20 token type as an additional prize that can be awarded\n @dev Only the Prize-Strategy owner/creator can assign external tokens,\n and they must be approved by the Prize-Pool\n @param _externalErc20 The address of an ERC20 token to be awarded"
                  },
                  "functionSelector": "4e5d08e0",
                  "id": 10927,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 10918,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 10917,
                        "name": "onlyOwnerOrListener",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11335,
                        "src": "22403:19:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "22403:19:50"
                    },
                    {
                      "arguments": null,
                      "id": 10920,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 10919,
                        "name": "requireAwardNotInProgress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11342,
                        "src": "22423:25:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "22423:25:50"
                    }
                  ],
                  "name": "addExternalErc20Award",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10916,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10915,
                        "mutability": "mutable",
                        "name": "_externalErc20",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10927,
                        "src": "22360:32:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 10914,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "22360:17:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22359:34:50"
                  },
                  "returnParameters": {
                    "id": 10921,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "22449:0:50"
                  },
                  "scope": 11391,
                  "src": "22329:169:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 10986,
                    "nodeType": "Block",
                    "src": "22577:501:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "expression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 10935,
                                      "name": "_externalErc20",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 10929,
                                      "src": "22599:14:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                        "typeString": "contract IERC20Upgradeable"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                        "typeString": "contract IERC20Upgradeable"
                                      }
                                    ],
                                    "id": 10934,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "22591:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 10933,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "22591:7:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 10936,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "22591:23:50",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "id": 10937,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "isContract",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 3358,
                                "src": "22591:34:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$bound_to$_t_address_$",
                                  "typeString": "function (address) view returns (bool)"
                                }
                              },
                              "id": 10938,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "22591:36:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f65726332302d6e756c6c",
                              "id": 10939,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "22629:34:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_7f07afe6ab41aa55b0803935507fd930a0a7b892000ab0793da60091164ddec8",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/erc20-null\""
                              },
                              "value": "PeriodicPrizeStrategy/erc20-null"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_7f07afe6ab41aa55b0803935507fd930a0a7b892000ab0793da60091164ddec8",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/erc20-null\""
                              }
                            ],
                            "id": 10932,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "22583:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 10940,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22583:81:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10941,
                        "nodeType": "ExpressionStatement",
                        "src": "22583:81:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 10947,
                                      "name": "_externalErc20",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 10929,
                                      "src": "22713:14:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                        "typeString": "contract IERC20Upgradeable"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                        "typeString": "contract IERC20Upgradeable"
                                      }
                                    ],
                                    "id": 10946,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "22705:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 10945,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "22705:7:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 10948,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "22705:23:50",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 10943,
                                  "name": "prizePool",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 9740,
                                  "src": "22678:9:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_PrizePool_$8751",
                                    "typeString": "contract PrizePool"
                                  }
                                },
                                "id": 10944,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "canAwardExternal",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 6978,
                                "src": "22678:26:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_bool_$",
                                  "typeString": "function (address) view external returns (bool)"
                                }
                              },
                              "id": 10949,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "22678:51:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f63616e6e6f742d61776172642d65787465726e616c",
                              "id": 10950,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "22731:45:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_a9d5552f770b24de6b5e8ec08383171d830989b91c74b17684265477d0d85b53",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/cannot-award-external\""
                              },
                              "value": "PeriodicPrizeStrategy/cannot-award-external"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_a9d5552f770b24de6b5e8ec08383171d830989b91c74b17684265477d0d85b53",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/cannot-award-external\""
                              }
                            ],
                            "id": 10942,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "22670:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 10951,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22670:107:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10952,
                        "nodeType": "ExpressionStatement",
                        "src": "22670:107:50"
                      },
                      {
                        "assignments": [
                          10954,
                          10956
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 10954,
                            "mutability": "mutable",
                            "name": "succeeded",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 10986,
                            "src": "22784:14:50",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 10953,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "22784:4:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          },
                          {
                            "constant": false,
                            "id": 10956,
                            "mutability": "mutable",
                            "name": "returnValue",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 10986,
                            "src": "22800:24:50",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes"
                            },
                            "typeName": {
                              "id": 10955,
                              "name": "bytes",
                              "nodeType": "ElementaryTypeName",
                              "src": "22800:5:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_storage_ptr",
                                "typeString": "bytes"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 10967,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "746f74616c537570706c792829",
                                  "id": 10964,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "22887:15:50",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_18160ddd7f15c72528c2f94fd8dfe3c8d5aa26e2c50c7d81f4bc7bee8d4b7932",
                                    "typeString": "literal_string \"totalSupply()\""
                                  },
                                  "value": "totalSupply()"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_18160ddd7f15c72528c2f94fd8dfe3c8d5aa26e2c50c7d81f4bc7bee8d4b7932",
                                    "typeString": "literal_string \"totalSupply()\""
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 10962,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "22863:3:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 10963,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "22863:23:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 10965,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "22863:40:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 10959,
                                  "name": "_externalErc20",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 10929,
                                  "src": "22836:14:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                    "typeString": "contract IERC20Upgradeable"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                    "typeString": "contract IERC20Upgradeable"
                                  }
                                ],
                                "id": 10958,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "22828:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 10957,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "22828:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 10960,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "22828:23:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "id": 10961,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "staticcall",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "22828:34:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_barestaticcall_view$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                              "typeString": "function (bytes memory) view returns (bool,bytes memory)"
                            }
                          },
                          "id": 10966,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22828:76:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                            "typeString": "tuple(bool,bytes memory)"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "22783:121:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10969,
                              "name": "succeeded",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10954,
                              "src": "22918:9:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f65726332302d696e76616c6964",
                              "id": 10970,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "22929:37:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_71fb3b32f1a5251472b1e5cc9737824edc1805e18aec055fbb46cc73b4542b57",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/erc20-invalid\""
                              },
                              "value": "PeriodicPrizeStrategy/erc20-invalid"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_71fb3b32f1a5251472b1e5cc9737824edc1805e18aec055fbb46cc73b4542b57",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/erc20-invalid\""
                              }
                            ],
                            "id": 10968,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "22910:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 10971,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22910:57:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10972,
                        "nodeType": "ExpressionStatement",
                        "src": "22910:57:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 10978,
                                  "name": "_externalErc20",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 10929,
                                  "src": "23007:14:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                    "typeString": "contract IERC20Upgradeable"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                    "typeString": "contract IERC20Upgradeable"
                                  }
                                ],
                                "id": 10977,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "22999:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 10976,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "22999:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 10979,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "22999:23:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 10973,
                              "name": "externalErc20s",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9757,
                              "src": "22973:14:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                              }
                            },
                            "id": 10975,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "addAddress",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16491,
                            "src": "22973:25:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Mapping_$16337_storage_ptr_$_t_address_$returns$__$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                              "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer,address)"
                            }
                          },
                          "id": 10980,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22973:50:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10981,
                        "nodeType": "ExpressionStatement",
                        "src": "22973:50:50"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 10983,
                              "name": "_externalErc20",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10929,
                              "src": "23058:14:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            ],
                            "id": 10982,
                            "name": "ExternalErc20AwardAdded",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9700,
                            "src": "23034:23:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20Upgradeable_$1960_$returns$__$",
                              "typeString": "function (contract IERC20Upgradeable)"
                            }
                          },
                          "id": 10984,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "23034:39:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 10985,
                        "nodeType": "EmitStatement",
                        "src": "23029:44:50"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 10987,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_addExternalErc20Award",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10930,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10929,
                        "mutability": "mutable",
                        "name": "_externalErc20",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 10987,
                        "src": "22534:32:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 10928,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "22534:17:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22533:34:50"
                  },
                  "returnParameters": {
                    "id": 10931,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "22577:0:50"
                  },
                  "scope": 11391,
                  "src": "22502:576:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 11016,
                    "nodeType": "Block",
                    "src": "23215:120:50",
                    "statements": [
                      {
                        "body": {
                          "id": 11014,
                          "nodeType": "Block",
                          "src": "23274:57:50",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 11009,
                                      "name": "_externalErc20s",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 10990,
                                      "src": "23305:15:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_contract$_IERC20Upgradeable_$1960_$dyn_calldata_ptr",
                                        "typeString": "contract IERC20Upgradeable[] calldata"
                                      }
                                    },
                                    "id": 11011,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 11010,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 10998,
                                      "src": "23321:1:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "23305:18:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                      "typeString": "contract IERC20Upgradeable"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                      "typeString": "contract IERC20Upgradeable"
                                    }
                                  ],
                                  "id": 11008,
                                  "name": "_addExternalErc20Award",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 10987,
                                  "src": "23282:22:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20Upgradeable_$1960_$returns$__$",
                                    "typeString": "function (contract IERC20Upgradeable)"
                                  }
                                },
                                "id": 11012,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "23282:42:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 11013,
                              "nodeType": "ExpressionStatement",
                              "src": "23282:42:50"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 11004,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 11001,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10998,
                            "src": "23241:1:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 11002,
                              "name": "_externalErc20s",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10990,
                              "src": "23245:15:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_IERC20Upgradeable_$1960_$dyn_calldata_ptr",
                                "typeString": "contract IERC20Upgradeable[] calldata"
                              }
                            },
                            "id": 11003,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "23245:22:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "23241:26:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 11015,
                        "initializationExpression": {
                          "assignments": [
                            10998
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 10998,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 11015,
                              "src": "23226:9:50",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 10997,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "23226:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 11000,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 10999,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "23238:1:50",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "23226:13:50"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 11006,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "23269:3:50",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 11005,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 10998,
                              "src": "23269:1:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 11007,
                          "nodeType": "ExpressionStatement",
                          "src": "23269:3:50"
                        },
                        "nodeType": "ForStatement",
                        "src": "23221:110:50"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "66968221",
                  "id": 11017,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 10993,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 10992,
                        "name": "onlyOwnerOrListener",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11335,
                        "src": "23169:19:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "23169:19:50"
                    },
                    {
                      "arguments": null,
                      "id": 10995,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 10994,
                        "name": "requireAwardNotInProgress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11342,
                        "src": "23189:25:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "23189:25:50"
                    }
                  ],
                  "name": "addExternalErc20Awards",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 10991,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 10990,
                        "mutability": "mutable",
                        "name": "_externalErc20s",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11017,
                        "src": "23114:44:50",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_IERC20Upgradeable_$1960_$dyn_calldata_ptr",
                          "typeString": "contract IERC20Upgradeable[]"
                        },
                        "typeName": {
                          "baseType": {
                            "contractScope": null,
                            "id": 10988,
                            "name": "IERC20Upgradeable",
                            "nodeType": "UserDefinedTypeName",
                            "referencedDeclaration": 1960,
                            "src": "23114:17:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                              "typeString": "contract IERC20Upgradeable"
                            }
                          },
                          "id": 10989,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "23114:19:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_IERC20Upgradeable_$1960_$dyn_storage_ptr",
                            "typeString": "contract IERC20Upgradeable[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23113:46:50"
                  },
                  "returnParameters": {
                    "id": 10996,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "23215:0:50"
                  },
                  "scope": 11391,
                  "src": "23082:253:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 11046,
                    "nodeType": "Block",
                    "src": "23969:145:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 11034,
                                  "name": "_prevExternalErc20",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11022,
                                  "src": "24012:18:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                    "typeString": "contract IERC20Upgradeable"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                    "typeString": "contract IERC20Upgradeable"
                                  }
                                ],
                                "id": 11033,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "24004:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 11032,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "24004:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 11035,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "24004:27:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 11038,
                                  "name": "_externalErc20",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11020,
                                  "src": "24041:14:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                    "typeString": "contract IERC20Upgradeable"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                    "typeString": "contract IERC20Upgradeable"
                                  }
                                ],
                                "id": 11037,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "24033:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 11036,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "24033:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 11039,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "24033:23:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 11029,
                              "name": "externalErc20s",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9757,
                              "src": "23975:14:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                              }
                            },
                            "id": 11031,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "removeAddress",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16552,
                            "src": "23975:28:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Mapping_$16337_storage_ptr_$_t_address_$_t_address_$returns$__$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                              "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer,address,address)"
                            }
                          },
                          "id": 11040,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "23975:82:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11041,
                        "nodeType": "ExpressionStatement",
                        "src": "23975:82:50"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 11043,
                              "name": "_externalErc20",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11020,
                              "src": "24094:14:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            ],
                            "id": 11042,
                            "name": "ExternalErc20AwardRemoved",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9708,
                            "src": "24068:25:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20Upgradeable_$1960_$returns$__$",
                              "typeString": "function (contract IERC20Upgradeable)"
                            }
                          },
                          "id": 11044,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "24068:41:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11045,
                        "nodeType": "EmitStatement",
                        "src": "24063:46:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 11018,
                    "nodeType": "StructuredDocumentation",
                    "src": "23339:476:50",
                    "text": "@notice Removes an external ERC20 token type as an additional prize that can be awarded\n @dev Only the Prize-Strategy owner/creator can remove external tokens\n @param _externalErc20 The address of an ERC20 token to be removed\n @param _prevExternalErc20 The address of the previous ERC20 token in the `externalErc20s` list.\n If the ERC20 is the first address, then the previous address is the SENTINEL address: 0x0000000000000000000000000000000000000001"
                  },
                  "functionSelector": "b0244682",
                  "id": 11047,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 11025,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 11024,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "23933:9:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "23933:9:50"
                    },
                    {
                      "arguments": null,
                      "id": 11027,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 11026,
                        "name": "requireAwardNotInProgress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11342,
                        "src": "23943:25:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "23943:25:50"
                    }
                  ],
                  "name": "removeExternalErc20Award",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11023,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11020,
                        "mutability": "mutable",
                        "name": "_externalErc20",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11047,
                        "src": "23852:32:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 11019,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "23852:17:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 11022,
                        "mutability": "mutable",
                        "name": "_prevExternalErc20",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11047,
                        "src": "23886:36:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 11021,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "23886:17:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23851:72:50"
                  },
                  "returnParameters": {
                    "id": 11028,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "23969:0:50"
                  },
                  "scope": 11391,
                  "src": "23818:296:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 11058,
                    "nodeType": "Block",
                    "src": "24358:48:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 11054,
                              "name": "externalErc721s",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9759,
                              "src": "24371:15:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                              }
                            },
                            "id": 11055,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "addressArray",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16646,
                            "src": "24371:28:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_Mapping_$16337_storage_ptr_$returns$_t_array$_t_address_$dyn_memory_ptr_$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                              "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer) view returns (address[] memory)"
                            }
                          },
                          "id": 11056,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "24371:30:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                            "typeString": "address[] memory"
                          }
                        },
                        "functionReturnParameters": 11053,
                        "id": 11057,
                        "nodeType": "Return",
                        "src": "24364:37:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 11048,
                    "nodeType": "StructuredDocumentation",
                    "src": "24118:161:50",
                    "text": "@notice Gets the current list of External ERC721 tokens that will be awarded with the current prize\n @return An array of External ERC721 token addresses"
                  },
                  "functionSelector": "42d09209",
                  "id": 11059,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "getExternalErc721Awards",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11049,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "24314:2:50"
                  },
                  "returnParameters": {
                    "id": 11053,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11052,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11059,
                        "src": "24340:16:50",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                          "typeString": "address[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 11050,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "24340:7:50",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "id": 11051,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "24340:9:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                            "typeString": "address[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24339:18:50"
                  },
                  "scope": 11391,
                  "src": "24282:124:50",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 11072,
                    "nodeType": "Block",
                    "src": "24691:57:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 11068,
                            "name": "externalErc721TokenIds",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9764,
                            "src": "24704:22:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_contract$_IERC721Upgradeable_$3338_$_t_array$_t_uint256_$dyn_storage_$",
                              "typeString": "mapping(contract IERC721Upgradeable => uint256[] storage ref)"
                            }
                          },
                          "id": 11070,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 11069,
                            "name": "_externalErc721",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11062,
                            "src": "24727:15:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                              "typeString": "contract IERC721Upgradeable"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "24704:39:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                            "typeString": "uint256[] storage ref"
                          }
                        },
                        "functionReturnParameters": 11067,
                        "id": 11071,
                        "nodeType": "Return",
                        "src": "24697:46:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 11060,
                    "nodeType": "StructuredDocumentation",
                    "src": "24410:161:50",
                    "text": "@notice Gets the current list of External ERC721 tokens that will be awarded with the current prize\n @return An array of External ERC721 token addresses"
                  },
                  "functionSelector": "9417783f",
                  "id": 11073,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "getExternalErc721AwardTokenIds",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11063,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11062,
                        "mutability": "mutable",
                        "name": "_externalErc721",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11073,
                        "src": "24614:34:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                          "typeString": "contract IERC721Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 11061,
                          "name": "IERC721Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 3338,
                          "src": "24614:18:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                            "typeString": "contract IERC721Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24613:36:50"
                  },
                  "returnParameters": {
                    "id": 11067,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11066,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11073,
                        "src": "24673:16:50",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 11064,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "24673:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 11065,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "24673:9:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24672:18:50"
                  },
                  "scope": 11391,
                  "src": "24574:174:50",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 11153,
                    "nodeType": "Block",
                    "src": "25326:574:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 11091,
                                      "name": "_externalErc721",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 11076,
                                      "src": "25375:15:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                        "typeString": "contract IERC721Upgradeable"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                        "typeString": "contract IERC721Upgradeable"
                                      }
                                    ],
                                    "id": 11090,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "25367:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 11089,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "25367:7:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 11092,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "25367:24:50",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 11087,
                                  "name": "prizePool",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 9740,
                                  "src": "25340:9:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_PrizePool_$8751",
                                    "typeString": "contract PrizePool"
                                  }
                                },
                                "id": 11088,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "canAwardExternal",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 6978,
                                "src": "25340:26:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_bool_$",
                                  "typeString": "function (address) view external returns (bool)"
                                }
                              },
                              "id": 11093,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "25340:52:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f63616e6e6f742d61776172642d65787465726e616c",
                              "id": 11094,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "25394:45:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_a9d5552f770b24de6b5e8ec08383171d830989b91c74b17684265477d0d85b53",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/cannot-award-external\""
                              },
                              "value": "PeriodicPrizeStrategy/cannot-award-external"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_a9d5552f770b24de6b5e8ec08383171d830989b91c74b17684265477d0d85b53",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/cannot-award-external\""
                              }
                            ],
                            "id": 11086,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "25332:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 11095,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "25332:108:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11096,
                        "nodeType": "ExpressionStatement",
                        "src": "25332:108:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 11103,
                                    "name": "Constants",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 5632,
                                    "src": "25497:9:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_Constants_$5632_$",
                                      "typeString": "type(library Constants)"
                                    }
                                  },
                                  "id": 11104,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "ERC165_INTERFACE_ID_ERC721",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 5631,
                                  "src": "25497:36:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 11100,
                                      "name": "_externalErc721",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 11076,
                                      "src": "25462:15:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                        "typeString": "contract IERC721Upgradeable"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                        "typeString": "contract IERC721Upgradeable"
                                      }
                                    ],
                                    "id": 11099,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "25454:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 11098,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "25454:7:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 11101,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "25454:24:50",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "id": 11102,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "supportsInterface",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 665,
                                "src": "25454:42:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_address_$_t_bytes4_$returns$_t_bool_$bound_to$_t_address_$",
                                  "typeString": "function (address,bytes4) view returns (bool)"
                                }
                              },
                              "id": 11105,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "25454:80:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f6572633732312d696e76616c6964",
                              "id": 11106,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "25536:38:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_01ceb07aa9b38610010f8be269ba7772e784492631be6fd32ed21d262fe51f0d",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/erc721-invalid\""
                              },
                              "value": "PeriodicPrizeStrategy/erc721-invalid"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_01ceb07aa9b38610010f8be269ba7772e784492631be6fd32ed21d262fe51f0d",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/erc721-invalid\""
                              }
                            ],
                            "id": 11097,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "25446:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 11107,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "25446:129:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11108,
                        "nodeType": "ExpressionStatement",
                        "src": "25446:129:50"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 11116,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "UnaryOperation",
                          "operator": "!",
                          "prefix": true,
                          "src": "25590:51:50",
                          "subExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 11113,
                                    "name": "_externalErc721",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 11076,
                                    "src": "25624:15:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                      "typeString": "contract IERC721Upgradeable"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                      "typeString": "contract IERC721Upgradeable"
                                    }
                                  ],
                                  "id": 11112,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "25616:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 11111,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "25616:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 11114,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "25616:24:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 11109,
                                "name": "externalErc721s",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 9759,
                                "src": "25591:15:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                  "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                                }
                              },
                              "id": 11110,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "contains",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 16584,
                              "src": "25591:24:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$_t_struct$_Mapping_$16337_storage_ptr_$_t_address_$returns$_t_bool_$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                                "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer,address) view returns (bool)"
                              }
                            },
                            "id": 11115,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "25591:50:50",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 11127,
                        "nodeType": "IfStatement",
                        "src": "25586:124:50",
                        "trueBody": {
                          "id": 11126,
                          "nodeType": "Block",
                          "src": "25643:67:50",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 11122,
                                        "name": "_externalErc721",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 11076,
                                        "src": "25686:15:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                          "typeString": "contract IERC721Upgradeable"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                          "typeString": "contract IERC721Upgradeable"
                                        }
                                      ],
                                      "id": 11121,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "25678:7:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 11120,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "25678:7:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 11123,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "25678:24:50",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 11117,
                                    "name": "externalErc721s",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 9759,
                                    "src": "25651:15:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                      "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                                    }
                                  },
                                  "id": 11119,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "addAddress",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 16491,
                                  "src": "25651:26:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Mapping_$16337_storage_ptr_$_t_address_$returns$__$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                                    "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer,address)"
                                  }
                                },
                                "id": 11124,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "25651:52:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 11125,
                              "nodeType": "ExpressionStatement",
                              "src": "25651:52:50"
                            }
                          ]
                        }
                      },
                      {
                        "body": {
                          "id": 11146,
                          "nodeType": "Block",
                          "src": "25763:69:50",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 11140,
                                    "name": "_externalErc721",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 11076,
                                    "src": "25795:15:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                      "typeString": "contract IERC721Upgradeable"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 11141,
                                      "name": "_tokenIds",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 11079,
                                      "src": "25812:9:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                        "typeString": "uint256[] calldata"
                                      }
                                    },
                                    "id": 11143,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 11142,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 11129,
                                      "src": "25822:1:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "25812:12:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                      "typeString": "contract IERC721Upgradeable"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 11139,
                                  "name": "_addExternalErc721Award",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11212,
                                  "src": "25771:23:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC721Upgradeable_$3338_$_t_uint256_$returns$__$",
                                    "typeString": "function (contract IERC721Upgradeable,uint256)"
                                  }
                                },
                                "id": 11144,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "25771:54:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 11145,
                              "nodeType": "ExpressionStatement",
                              "src": "25771:54:50"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 11135,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 11132,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11129,
                            "src": "25736:1:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 11133,
                              "name": "_tokenIds",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11079,
                              "src": "25740:9:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                "typeString": "uint256[] calldata"
                              }
                            },
                            "id": 11134,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "25740:16:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "25736:20:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 11147,
                        "initializationExpression": {
                          "assignments": [
                            11129
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 11129,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 11147,
                              "src": "25721:9:50",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 11128,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "25721:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 11131,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 11130,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "25733:1:50",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "25721:13:50"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 11137,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "25758:3:50",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 11136,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11129,
                              "src": "25758:1:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 11138,
                          "nodeType": "ExpressionStatement",
                          "src": "25758:3:50"
                        },
                        "nodeType": "ForStatement",
                        "src": "25716:116:50"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 11149,
                              "name": "_externalErc721",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11076,
                              "src": "25868:15:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                "typeString": "contract IERC721Upgradeable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 11150,
                              "name": "_tokenIds",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11079,
                              "src": "25885:9:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                "typeString": "uint256[] calldata"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                "typeString": "contract IERC721Upgradeable"
                              },
                              {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                                "typeString": "uint256[] calldata"
                              }
                            ],
                            "id": 11148,
                            "name": "ExternalErc721AwardAdded",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9696,
                            "src": "25843:24:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC721Upgradeable_$3338_$_t_array$_t_uint256_$dyn_memory_ptr_$returns$__$",
                              "typeString": "function (contract IERC721Upgradeable,uint256[] memory)"
                            }
                          },
                          "id": 11151,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "25843:52:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11152,
                        "nodeType": "EmitStatement",
                        "src": "25838:57:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 11074,
                    "nodeType": "StructuredDocumentation",
                    "src": "24752:418:50",
                    "text": "@notice Adds an external ERC721 token as an additional prize that can be awarded\n @dev Only the Prize-Strategy owner/creator can assign external tokens,\n and they must be approved by the Prize-Pool\n NOTE: The NFT must already be owned by the Prize-Pool\n @param _externalErc721 The address of an ERC721 token to be awarded\n @param _tokenIds An array of token IDs of the ERC721 to be awarded"
                  },
                  "functionSelector": "c48ddbcb",
                  "id": 11154,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 11082,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 11081,
                        "name": "onlyOwnerOrListener",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11335,
                        "src": "25280:19:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "25280:19:50"
                    },
                    {
                      "arguments": null,
                      "id": 11084,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 11083,
                        "name": "requireAwardNotInProgress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11342,
                        "src": "25300:25:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "25300:25:50"
                    }
                  ],
                  "name": "addExternalErc721Award",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11080,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11076,
                        "mutability": "mutable",
                        "name": "_externalErc721",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11154,
                        "src": "25205:34:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                          "typeString": "contract IERC721Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 11075,
                          "name": "IERC721Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 3338,
                          "src": "25205:18:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                            "typeString": "contract IERC721Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 11079,
                        "mutability": "mutable",
                        "name": "_tokenIds",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11154,
                        "src": "25241:28:50",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 11077,
                            "name": "uint256",
                            "nodeType": "ElementaryTypeName",
                            "src": "25241:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 11078,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "25241:9:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "25204:66:50"
                  },
                  "returnParameters": {
                    "id": 11085,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "25326:0:50"
                  },
                  "scope": 11391,
                  "src": "25173:727:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 11211,
                    "nodeType": "Block",
                    "src": "26000:421:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 11172,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 11166,
                                    "name": "_tokenId",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 11158,
                                    "src": "26058:8:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 11163,
                                        "name": "_externalErc721",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 11156,
                                        "src": "26033:15:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                          "typeString": "contract IERC721Upgradeable"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                          "typeString": "contract IERC721Upgradeable"
                                        }
                                      ],
                                      "id": 11162,
                                      "name": "IERC721Upgradeable",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3338,
                                      "src": "26014:18:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_contract$_IERC721Upgradeable_$3338_$",
                                        "typeString": "type(contract IERC721Upgradeable)"
                                      }
                                    },
                                    "id": 11164,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "26014:35:50",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                      "typeString": "contract IERC721Upgradeable"
                                    }
                                  },
                                  "id": 11165,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "ownerOf",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 3271,
                                  "src": "26014:43:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_view$_t_uint256_$returns$_t_address_$",
                                    "typeString": "function (uint256) view external returns (address)"
                                  }
                                },
                                "id": 11167,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "26014:53:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 11170,
                                    "name": "prizePool",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 9740,
                                    "src": "26079:9:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_PrizePool_$8751",
                                      "typeString": "contract PrizePool"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_PrizePool_$8751",
                                      "typeString": "contract PrizePool"
                                    }
                                  ],
                                  "id": 11169,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "26071:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 11168,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "26071:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 11171,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "26071:18:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "src": "26014:75:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f756e617661696c61626c652d746f6b656e",
                              "id": 11173,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "26091:41:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_fcf48b848d5565c17f7cfc4185acbfad7646c0275c8dd8878dfe89fb0a494f76",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/unavailable-token\""
                              },
                              "value": "PeriodicPrizeStrategy/unavailable-token"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_fcf48b848d5565c17f7cfc4185acbfad7646c0275c8dd8878dfe89fb0a494f76",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/unavailable-token\""
                              }
                            ],
                            "id": 11161,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "26006:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 11174,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "26006:127:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11175,
                        "nodeType": "ExpressionStatement",
                        "src": "26006:127:50"
                      },
                      {
                        "body": {
                          "id": 11202,
                          "nodeType": "Block",
                          "src": "26216:141:50",
                          "statements": [
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 11195,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 11189,
                                      "name": "externalErc721TokenIds",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 9764,
                                      "src": "26228:22:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_contract$_IERC721Upgradeable_$3338_$_t_array$_t_uint256_$dyn_storage_$",
                                        "typeString": "mapping(contract IERC721Upgradeable => uint256[] storage ref)"
                                      }
                                    },
                                    "id": 11191,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 11190,
                                      "name": "_externalErc721",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 11156,
                                      "src": "26251:15:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                        "typeString": "contract IERC721Upgradeable"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "26228:39:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                      "typeString": "uint256[] storage ref"
                                    }
                                  },
                                  "id": 11193,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 11192,
                                    "name": "i",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 11177,
                                    "src": "26268:1:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "26228:42:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 11194,
                                  "name": "_tokenId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11158,
                                  "src": "26274:8:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "26228:54:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 11201,
                              "nodeType": "IfStatement",
                              "src": "26224:127:50",
                              "trueBody": {
                                "id": 11200,
                                "nodeType": "Block",
                                "src": "26284:67:50",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "hexValue": "506572696f6469635072697a6553747261746567792f6572633732312d6475706c6963617465",
                                          "id": 11197,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "string",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "26301:40:50",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_stringliteral_efb7d269524a34bf17a4b914887af52f0e012ad20ffa2f37077272447a4faa50",
                                            "typeString": "literal_string \"PeriodicPrizeStrategy/erc721-duplicate\""
                                          },
                                          "value": "PeriodicPrizeStrategy/erc721-duplicate"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_stringliteral_efb7d269524a34bf17a4b914887af52f0e012ad20ffa2f37077272447a4faa50",
                                            "typeString": "literal_string \"PeriodicPrizeStrategy/erc721-duplicate\""
                                          }
                                        ],
                                        "id": 11196,
                                        "name": "revert",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [
                                          -19,
                                          -19
                                        ],
                                        "referencedDeclaration": -19,
                                        "src": "26294:6:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$",
                                          "typeString": "function (string memory) pure"
                                        }
                                      },
                                      "id": 11198,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "26294:48:50",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 11199,
                                    "nodeType": "ExpressionStatement",
                                    "src": "26294:48:50"
                                  }
                                ]
                              }
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 11185,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 11180,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11177,
                            "src": "26159:1:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 11181,
                                "name": "externalErc721TokenIds",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 9764,
                                "src": "26163:22:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_contract$_IERC721Upgradeable_$3338_$_t_array$_t_uint256_$dyn_storage_$",
                                  "typeString": "mapping(contract IERC721Upgradeable => uint256[] storage ref)"
                                }
                              },
                              "id": 11183,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 11182,
                                "name": "_externalErc721",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 11156,
                                "src": "26186:15:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                  "typeString": "contract IERC721Upgradeable"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "26163:39:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                "typeString": "uint256[] storage ref"
                              }
                            },
                            "id": 11184,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "26163:46:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "26159:50:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 11203,
                        "initializationExpression": {
                          "assignments": [
                            11177
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 11177,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 11203,
                              "src": "26144:9:50",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 11176,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "26144:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 11179,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 11178,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "26156:1:50",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "26144:13:50"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 11187,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "26211:3:50",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 11186,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11177,
                              "src": "26211:1:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 11188,
                          "nodeType": "ExpressionStatement",
                          "src": "26211:3:50"
                        },
                        "nodeType": "ForStatement",
                        "src": "26139:218:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 11208,
                              "name": "_tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11158,
                              "src": "26407:8:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 11204,
                                "name": "externalErc721TokenIds",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 9764,
                                "src": "26362:22:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_contract$_IERC721Upgradeable_$3338_$_t_array$_t_uint256_$dyn_storage_$",
                                  "typeString": "mapping(contract IERC721Upgradeable => uint256[] storage ref)"
                                }
                              },
                              "id": 11206,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 11205,
                                "name": "_externalErc721",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 11156,
                                "src": "26385:15:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                  "typeString": "contract IERC721Upgradeable"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "26362:39:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                "typeString": "uint256[] storage ref"
                              }
                            },
                            "id": 11207,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "push",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "26362:44:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_arraypush_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 11209,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "26362:54:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11210,
                        "nodeType": "ExpressionStatement",
                        "src": "26362:54:50"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 11212,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_addExternalErc721Award",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11159,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11156,
                        "mutability": "mutable",
                        "name": "_externalErc721",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11212,
                        "src": "25937:34:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                          "typeString": "contract IERC721Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 11155,
                          "name": "IERC721Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 3338,
                          "src": "25937:18:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                            "typeString": "contract IERC721Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 11158,
                        "mutability": "mutable",
                        "name": "_tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11212,
                        "src": "25973:16:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 11157,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "25973:7:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "25936:54:50"
                  },
                  "returnParameters": {
                    "id": 11160,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "26000:0:50"
                  },
                  "scope": 11391,
                  "src": "25904:517:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 11241,
                    "nodeType": "Block",
                    "src": "27031:151:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 11229,
                                  "name": "_prevExternalErc721",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11217,
                                  "src": "27075:19:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                    "typeString": "contract IERC721Upgradeable"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                    "typeString": "contract IERC721Upgradeable"
                                  }
                                ],
                                "id": 11228,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "27067:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 11227,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "27067:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 11230,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "27067:28:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 11233,
                                  "name": "_externalErc721",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11215,
                                  "src": "27105:15:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                    "typeString": "contract IERC721Upgradeable"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                    "typeString": "contract IERC721Upgradeable"
                                  }
                                ],
                                "id": 11232,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "27097:7:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 11231,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "27097:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 11234,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "27097:24:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 11224,
                              "name": "externalErc721s",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9759,
                              "src": "27037:15:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                              }
                            },
                            "id": 11226,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "removeAddress",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16552,
                            "src": "27037:29:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Mapping_$16337_storage_ptr_$_t_address_$_t_address_$returns$__$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                              "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer,address,address)"
                            }
                          },
                          "id": 11235,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "27037:85:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11236,
                        "nodeType": "ExpressionStatement",
                        "src": "27037:85:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 11238,
                              "name": "_externalErc721",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11215,
                              "src": "27161:15:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                "typeString": "contract IERC721Upgradeable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                "typeString": "contract IERC721Upgradeable"
                              }
                            ],
                            "id": 11237,
                            "name": "_removeExternalErc721AwardTokens",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11257,
                            "src": "27128:32:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC721Upgradeable_$3338_$returns$__$",
                              "typeString": "function (contract IERC721Upgradeable)"
                            }
                          },
                          "id": 11239,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "27128:49:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11240,
                        "nodeType": "ExpressionStatement",
                        "src": "27128:49:50"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 11213,
                    "nodeType": "StructuredDocumentation",
                    "src": "26425:421:50",
                    "text": "@notice Removes an external ERC721 token as an additional prize that can be awarded\n @dev Only the Prize-Strategy owner/creator can remove external tokens\n @param _externalErc721 The address of an ERC721 token to be removed\n @param _prevExternalErc721 The address of the previous ERC721 token in the list.\n If no previous, then pass the SENTINEL address: 0x0000000000000000000000000000000000000001"
                  },
                  "functionSelector": "671137c4",
                  "id": 11242,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 11220,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 11219,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "26989:9:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "26989:9:50"
                    },
                    {
                      "arguments": null,
                      "id": 11222,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 11221,
                        "name": "requireAwardNotInProgress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11342,
                        "src": "27003:25:50",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "27003:25:50"
                    }
                  ],
                  "name": "removeExternalErc721Award",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11218,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11215,
                        "mutability": "mutable",
                        "name": "_externalErc721",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11242,
                        "src": "26889:34:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                          "typeString": "contract IERC721Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 11214,
                          "name": "IERC721Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 3338,
                          "src": "26889:18:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                            "typeString": "contract IERC721Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 11217,
                        "mutability": "mutable",
                        "name": "_prevExternalErc721",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11242,
                        "src": "26929:38:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                          "typeString": "contract IERC721Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 11216,
                          "name": "IERC721Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 3338,
                          "src": "26929:18:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                            "typeString": "contract IERC721Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "26883:88:50"
                  },
                  "returnParameters": {
                    "id": 11223,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "27031:0:50"
                  },
                  "scope": 11391,
                  "src": "26849:333:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 11256,
                    "nodeType": "Block",
                    "src": "27287:111:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 11250,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "UnaryOperation",
                          "operator": "delete",
                          "prefix": true,
                          "src": "27293:46:50",
                          "subExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 11247,
                              "name": "externalErc721TokenIds",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9764,
                              "src": "27300:22:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_contract$_IERC721Upgradeable_$3338_$_t_array$_t_uint256_$dyn_storage_$",
                                "typeString": "mapping(contract IERC721Upgradeable => uint256[] storage ref)"
                              }
                            },
                            "id": 11249,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 11248,
                              "name": "_externalErc721",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11244,
                              "src": "27323:15:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                "typeString": "contract IERC721Upgradeable"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "27300:39:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                              "typeString": "uint256[] storage ref"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11251,
                        "nodeType": "ExpressionStatement",
                        "src": "27293:46:50"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 11253,
                              "name": "_externalErc721",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11244,
                              "src": "27377:15:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                "typeString": "contract IERC721Upgradeable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                                "typeString": "contract IERC721Upgradeable"
                              }
                            ],
                            "id": 11252,
                            "name": "ExternalErc721AwardRemoved",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9704,
                            "src": "27350:26:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC721Upgradeable_$3338_$returns$__$",
                              "typeString": "function (contract IERC721Upgradeable)"
                            }
                          },
                          "id": 11254,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "27350:43:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11255,
                        "nodeType": "EmitStatement",
                        "src": "27345:48:50"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 11257,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_removeExternalErc721AwardTokens",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11245,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11244,
                        "mutability": "mutable",
                        "name": "_externalErc721",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11257,
                        "src": "27233:34:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                          "typeString": "contract IERC721Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 11243,
                          "name": "IERC721Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 3338,
                          "src": "27233:18:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC721Upgradeable_$3338",
                            "typeString": "contract IERC721Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "27227:44:50"
                  },
                  "returnParameters": {
                    "id": 11246,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "27287:0:50"
                  },
                  "scope": 11391,
                  "src": "27186:212:50",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 11278,
                    "nodeType": "Block",
                    "src": "27454:167:50",
                    "statements": [
                      {
                        "assignments": [
                          11261
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 11261,
                            "mutability": "mutable",
                            "name": "currentBlock",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 11278,
                            "src": "27460:20:50",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 11260,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "27460:7:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 11264,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 11262,
                            "name": "_currentBlock",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10414,
                            "src": "27483:13:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                              "typeString": "function () view returns (uint256)"
                            }
                          },
                          "id": 11263,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "27483:15:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "27460:38:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 11274,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint32",
                                  "typeString": "uint32"
                                },
                                "id": 11269,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 11266,
                                    "name": "rngRequest",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 9748,
                                    "src": "27512:10:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_RngRequest_$9732_storage",
                                      "typeString": "struct PeriodicPrizeStrategy.RngRequest storage ref"
                                    }
                                  },
                                  "id": 11267,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "lockBlock",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 9729,
                                  "src": "27512:20:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint32",
                                    "typeString": "uint32"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 11268,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "27536:1:50",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "27512:25:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 11273,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 11270,
                                  "name": "currentBlock",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11261,
                                  "src": "27541:12:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "<",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 11271,
                                    "name": "rngRequest",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 9748,
                                    "src": "27556:10:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_RngRequest_$9732_storage",
                                      "typeString": "struct PeriodicPrizeStrategy.RngRequest storage ref"
                                    }
                                  },
                                  "id": 11272,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "lockBlock",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 9729,
                                  "src": "27556:20:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint32",
                                    "typeString": "uint32"
                                  }
                                },
                                "src": "27541:35:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "27512:64:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f726e672d696e2d666c69676874",
                              "id": 11275,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "27578:37:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_f4381939666e828bee0ec0af4933dfc4131d700b8543b1d831867f1469c633f8",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/rng-in-flight\""
                              },
                              "value": "PeriodicPrizeStrategy/rng-in-flight"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_f4381939666e828bee0ec0af4933dfc4131d700b8543b1d831867f1469c633f8",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/rng-in-flight\""
                              }
                            ],
                            "id": 11265,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "27504:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 11276,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "27504:112:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11277,
                        "nodeType": "ExpressionStatement",
                        "src": "27504:112:50"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 11279,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_requireAwardNotInProgress",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11258,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "27437:2:50"
                  },
                  "returnParameters": {
                    "id": 11259,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "27454:0:50"
                  },
                  "scope": 11391,
                  "src": "27402:219:50",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 11305,
                    "nodeType": "Block",
                    "src": "27677:169:50",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          },
                          "id": 11287,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 11284,
                              "name": "rngRequest",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9748,
                              "src": "27687:10:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_RngRequest_$9732_storage",
                                "typeString": "struct PeriodicPrizeStrategy.RngRequest storage ref"
                              }
                            },
                            "id": 11285,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "requestedAt",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 9731,
                            "src": "27687:22:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 11286,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "27713:1:50",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "27687:27:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 11303,
                          "nodeType": "Block",
                          "src": "27749:93:50",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 11301,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "id": 11291,
                                    "name": "_currentTime",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 10404,
                                    "src": "27764:12:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                      "typeString": "function () view returns (uint256)"
                                    }
                                  },
                                  "id": 11292,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "27764:14:50",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": ">",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 11298,
                                        "name": "rngRequest",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 9748,
                                        "src": "27812:10:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_RngRequest_$9732_storage",
                                          "typeString": "struct PeriodicPrizeStrategy.RngRequest storage ref"
                                        }
                                      },
                                      "id": 11299,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "requestedAt",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 9731,
                                      "src": "27812:22:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint32",
                                        "typeString": "uint32"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint32",
                                        "typeString": "uint32"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 11295,
                                          "name": "rngRequestTimeout",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 9751,
                                          "src": "27789:17:50",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint32",
                                            "typeString": "uint32"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint32",
                                            "typeString": "uint32"
                                          }
                                        ],
                                        "id": 11294,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "27781:7:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_uint256_$",
                                          "typeString": "type(uint256)"
                                        },
                                        "typeName": {
                                          "id": 11293,
                                          "name": "uint256",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "27781:7:50",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      },
                                      "id": 11296,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "27781:26:50",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 11297,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "add",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1113,
                                    "src": "27781:30:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 11300,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "27781:54:50",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "27764:71:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "functionReturnParameters": 11283,
                              "id": 11302,
                              "nodeType": "Return",
                              "src": "27757:78:50"
                            }
                          ]
                        },
                        "id": 11304,
                        "nodeType": "IfStatement",
                        "src": "27683:159:50",
                        "trueBody": {
                          "id": 11290,
                          "nodeType": "Block",
                          "src": "27716:27:50",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "66616c7365",
                                "id": 11288,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "bool",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "27731:5:50",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "value": "false"
                              },
                              "functionReturnParameters": 11283,
                              "id": 11289,
                              "nodeType": "Return",
                              "src": "27724:12:50"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "738bbea8",
                  "id": 11306,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "isRngTimedOut",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11280,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "27647:2:50"
                  },
                  "returnParameters": {
                    "id": 11283,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11282,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11306,
                        "src": "27671:4:50",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 11281,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "27671:4:50",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "27670:6:50"
                  },
                  "scope": 11391,
                  "src": "27625:221:50",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 11334,
                    "nodeType": "Block",
                    "src": "27881:240:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 11329,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "id": 11321,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  "id": 11313,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "arguments": [],
                                    "expression": {
                                      "argumentTypes": [],
                                      "id": 11309,
                                      "name": "_msgSender",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3611,
                                      "src": "27895:10:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                        "typeString": "function () view returns (address payable)"
                                      }
                                    },
                                    "id": 11310,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "27895:12:50",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "==",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "arguments": [],
                                    "expression": {
                                      "argumentTypes": [],
                                      "id": 11311,
                                      "name": "owner",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 61,
                                      "src": "27911:5:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                                        "typeString": "function () view returns (address)"
                                      }
                                    },
                                    "id": 11312,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "27911:7:50",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "src": "27895:23:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "||",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  "id": 11320,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "arguments": [],
                                    "expression": {
                                      "argumentTypes": [],
                                      "id": 11314,
                                      "name": "_msgSender",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 3611,
                                      "src": "27934:10:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                        "typeString": "function () view returns (address payable)"
                                      }
                                    },
                                    "id": 11315,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "27934:12:50",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "==",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 11318,
                                        "name": "periodicPrizeStrategyListener",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 9770,
                                        "src": "27958:29:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_PeriodicPrizeStrategyListenerInterface_$11432",
                                          "typeString": "contract PeriodicPrizeStrategyListenerInterface"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_PeriodicPrizeStrategyListenerInterface_$11432",
                                          "typeString": "contract PeriodicPrizeStrategyListenerInterface"
                                        }
                                      ],
                                      "id": 11317,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "27950:7:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 11316,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "27950:7:50",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 11319,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "27950:38:50",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "src": "27934:54:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "src": "27895:93:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                "id": 11328,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "id": 11322,
                                    "name": "_msgSender",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 3611,
                                    "src": "28004:10:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                      "typeString": "function () view returns (address payable)"
                                    }
                                  },
                                  "id": 11323,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "28004:12:50",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 11326,
                                      "name": "beforeAwardListener",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 9767,
                                      "src": "28028:19:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                                        "typeString": "contract BeforeAwardListenerInterface"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                                        "typeString": "contract BeforeAwardListenerInterface"
                                      }
                                    ],
                                    "id": 11325,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "28020:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 11324,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "28020:7:50",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 11327,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "28020:28:50",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "src": "28004:44:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "27895:153:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f6f6e6c792d6f776e65722d6f722d6c697374656e6572",
                              "id": 11330,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "28062:46:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_2d18a5ef8735583b91da524107ae9aac7eab7bbbe6482c12fd9f80f96e06c4a6",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/only-owner-or-listener\""
                              },
                              "value": "PeriodicPrizeStrategy/only-owner-or-listener"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_2d18a5ef8735583b91da524107ae9aac7eab7bbbe6482c12fd9f80f96e06c4a6",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/only-owner-or-listener\""
                              }
                            ],
                            "id": 11308,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "27887:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 11331,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "27887:222:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11332,
                        "nodeType": "ExpressionStatement",
                        "src": "27887:222:50"
                      },
                      {
                        "id": 11333,
                        "nodeType": "PlaceholderStatement",
                        "src": "28115:1:50"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 11335,
                  "name": "onlyOwnerOrListener",
                  "nodeType": "ModifierDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11307,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "27878:2:50"
                  },
                  "src": "27850:271:50",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 11341,
                    "nodeType": "Block",
                    "src": "28162:46:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 11337,
                            "name": "_requireAwardNotInProgress",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11279,
                            "src": "28168:26:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$__$",
                              "typeString": "function () view"
                            }
                          },
                          "id": 11338,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "28168:28:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11339,
                        "nodeType": "ExpressionStatement",
                        "src": "28168:28:50"
                      },
                      {
                        "id": 11340,
                        "nodeType": "PlaceholderStatement",
                        "src": "28202:1:50"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 11342,
                  "name": "requireAwardNotInProgress",
                  "nodeType": "ModifierDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11336,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "28159:2:50"
                  },
                  "src": "28125:83:50",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 11358,
                    "nodeType": "Block",
                    "src": "28244:173:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 11345,
                                "name": "_isPrizePeriodOver",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 10059,
                                "src": "28258:18:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$",
                                  "typeString": "function () view returns (bool)"
                                }
                              },
                              "id": 11346,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "28258:20:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f7072697a652d706572696f642d6e6f742d6f766572",
                              "id": 11347,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "28280:45:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_1fcce3d3a816fce8215a9696b305ad33c6a421587f01bc9681a1ce64509b8a1f",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/prize-period-not-over\""
                              },
                              "value": "PeriodicPrizeStrategy/prize-period-not-over"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_1fcce3d3a816fce8215a9696b305ad33c6a421587f01bc9681a1ce64509b8a1f",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/prize-period-not-over\""
                              }
                            ],
                            "id": 11344,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "28250:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 11348,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "28250:76:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11349,
                        "nodeType": "ExpressionStatement",
                        "src": "28250:76:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 11353,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "UnaryOperation",
                              "operator": "!",
                              "prefix": true,
                              "src": "28340:17:50",
                              "subExpression": {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "id": 11351,
                                  "name": "isRngRequested",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 10767,
                                  "src": "28341:14:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$",
                                    "typeString": "function () view returns (bool)"
                                  }
                                },
                                "id": 11352,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "28341:16:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f726e672d616c72656164792d726571756573746564",
                              "id": 11354,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "28359:45:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_81dab2434a8fdc28936d6eee981826eb8495d800fb780c597a402075827fd04f",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/rng-already-requested\""
                              },
                              "value": "PeriodicPrizeStrategy/rng-already-requested"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_81dab2434a8fdc28936d6eee981826eb8495d800fb780c597a402075827fd04f",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/rng-already-requested\""
                              }
                            ],
                            "id": 11350,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "28332:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 11355,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "28332:73:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11356,
                        "nodeType": "ExpressionStatement",
                        "src": "28332:73:50"
                      },
                      {
                        "id": 11357,
                        "nodeType": "PlaceholderStatement",
                        "src": "28411:1:50"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 11359,
                  "name": "requireCanStartAward",
                  "nodeType": "ModifierDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11343,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "28241:2:50"
                  },
                  "src": "28212:205:50",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 11374,
                    "nodeType": "Block",
                    "src": "28456:159:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 11362,
                                "name": "isRngRequested",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 10767,
                                "src": "28470:14:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$",
                                  "typeString": "function () view returns (bool)"
                                }
                              },
                              "id": 11363,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "28470:16:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f726e672d6e6f742d726571756573746564",
                              "id": 11364,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "28488:41:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_f9164c8788486732b5416a9690197d0c2267e93b763b1f4d631dfc93233b639d",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/rng-not-requested\""
                              },
                              "value": "PeriodicPrizeStrategy/rng-not-requested"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_f9164c8788486732b5416a9690197d0c2267e93b763b1f4d631dfc93233b639d",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/rng-not-requested\""
                              }
                            ],
                            "id": 11361,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "28462:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 11365,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "28462:68:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11366,
                        "nodeType": "ExpressionStatement",
                        "src": "28462:68:50"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 11368,
                                "name": "isRngCompleted",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 10780,
                                "src": "28544:14:50",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$",
                                  "typeString": "function () view returns (bool)"
                                }
                              },
                              "id": 11369,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "28544:16:50",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f726e672d6e6f742d636f6d706c657465",
                              "id": 11370,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "28562:40:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_69d584a7f7a354cb84db572f9f6d0ae7842c37d551669194078caab5ef603576",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/rng-not-complete\""
                              },
                              "value": "PeriodicPrizeStrategy/rng-not-complete"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_69d584a7f7a354cb84db572f9f6d0ae7842c37d551669194078caab5ef603576",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/rng-not-complete\""
                              }
                            ],
                            "id": 11367,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "28536:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 11371,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "28536:67:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11372,
                        "nodeType": "ExpressionStatement",
                        "src": "28536:67:50"
                      },
                      {
                        "id": 11373,
                        "nodeType": "PlaceholderStatement",
                        "src": "28609:1:50"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 11375,
                  "name": "requireCanCompleteAward",
                  "nodeType": "ModifierDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11360,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "28453:2:50"
                  },
                  "src": "28421:194:50",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 11389,
                    "nodeType": "Block",
                    "src": "28644:102:50",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 11384,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "id": 11378,
                                  "name": "_msgSender",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3611,
                                  "src": "28658:10:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                    "typeString": "function () view returns (address payable)"
                                  }
                                },
                                "id": 11379,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "28658:12:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 11382,
                                    "name": "prizePool",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 9740,
                                    "src": "28682:9:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_PrizePool_$8751",
                                      "typeString": "contract PrizePool"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_PrizePool_$8751",
                                      "typeString": "contract PrizePool"
                                    }
                                  ],
                                  "id": 11381,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "28674:7:50",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 11380,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "28674:7:50",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 11383,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "28674:18:50",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "src": "28658:34:50",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "506572696f6469635072697a6553747261746567792f6f6e6c792d7072697a652d706f6f6c",
                              "id": 11385,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "28694:39:50",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_4eb32499a3969982a460b57735bfc77ae492264f1736f49cf472bd578adbf283",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/only-prize-pool\""
                              },
                              "value": "PeriodicPrizeStrategy/only-prize-pool"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_4eb32499a3969982a460b57735bfc77ae492264f1736f49cf472bd578adbf283",
                                "typeString": "literal_string \"PeriodicPrizeStrategy/only-prize-pool\""
                              }
                            ],
                            "id": 11377,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "28650:7:50",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 11386,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "28650:84:50",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11387,
                        "nodeType": "ExpressionStatement",
                        "src": "28650:84:50"
                      },
                      {
                        "id": 11388,
                        "nodeType": "PlaceholderStatement",
                        "src": "28740:1:50"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 11390,
                  "name": "onlyPrizePool",
                  "nodeType": "ModifierDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11376,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "28641:2:50"
                  },
                  "src": "28619:127:50",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 11392,
              "src": "1176:27572:50"
            }
          ],
          "src": "37:28712:50"
        },
        "id": 50
      },
      "contracts/prize-strategy/PeriodicPrizeStrategyListener.sol": {
        "ast": {
          "absolutePath": "contracts/prize-strategy/PeriodicPrizeStrategyListener.sol",
          "exportedSymbols": {
            "PeriodicPrizeStrategyListener": [
              11419
            ]
          },
          "id": 11420,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 11393,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:51"
            },
            {
              "absolutePath": "contracts/prize-strategy/PeriodicPrizeStrategyListenerInterface.sol",
              "file": "./PeriodicPrizeStrategyListenerInterface.sol",
              "id": 11394,
              "nodeType": "ImportDirective",
              "scope": 11420,
              "sourceUnit": 11433,
              "src": "62:54:51",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/prize-strategy/PeriodicPrizeStrategyListenerLibrary.sol",
              "file": "./PeriodicPrizeStrategyListenerLibrary.sol",
              "id": 11395,
              "nodeType": "ImportDirective",
              "scope": 11420,
              "sourceUnit": 11439,
              "src": "117:52:51",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/Constants.sol",
              "file": "../Constants.sol",
              "id": 11396,
              "nodeType": "ImportDirective",
              "scope": 11420,
              "sourceUnit": 5633,
              "src": "170:26:51",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": true,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 11397,
                    "name": "PeriodicPrizeStrategyListenerInterface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 11432,
                    "src": "249:38:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_PeriodicPrizeStrategyListenerInterface_$11432",
                      "typeString": "contract PeriodicPrizeStrategyListenerInterface"
                    }
                  },
                  "id": 11398,
                  "nodeType": "InheritanceSpecifier",
                  "src": "249:38:51"
                }
              ],
              "contractDependencies": [
                931,
                11432
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": false,
              "id": 11419,
              "linearizedBaseContracts": [
                11419,
                11432,
                931
              ],
              "name": "PeriodicPrizeStrategyListener",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "baseFunctions": [
                    930
                  ],
                  "body": {
                    "id": 11417,
                    "nodeType": "Block",
                    "src": "377:198:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 11414,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_bytes4",
                                  "typeString": "bytes4"
                                },
                                "id": 11409,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 11406,
                                  "name": "interfaceId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11400,
                                  "src": "398:11:51",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 11407,
                                    "name": "Constants",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 5632,
                                    "src": "413:9:51",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_Constants_$5632_$",
                                      "typeString": "type(library Constants)"
                                    }
                                  },
                                  "id": 11408,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "ERC165_INTERFACE_ID_ERC165",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 5628,
                                  "src": "413:36:51",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                "src": "398:51:51",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_bytes4",
                                  "typeString": "bytes4"
                                },
                                "id": 11413,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 11410,
                                  "name": "interfaceId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11400,
                                  "src": "460:11:51",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 11411,
                                    "name": "PeriodicPrizeStrategyListenerLibrary",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 11438,
                                    "src": "475:36:51",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_PeriodicPrizeStrategyListenerLibrary_$11438_$",
                                      "typeString": "type(library PeriodicPrizeStrategyListenerLibrary)"
                                    }
                                  },
                                  "id": 11412,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 11437,
                                  "src": "475:89:51",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                "src": "460:104:51",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "398:166:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "id": 11415,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "390:180:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 11405,
                        "id": 11416,
                        "nodeType": "Return",
                        "src": "383:187:51"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "01ffc9a7",
                  "id": 11418,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "supportsInterface",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 11402,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "348:8:51"
                  },
                  "parameters": {
                    "id": 11401,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11400,
                        "mutability": "mutable",
                        "name": "interfaceId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11418,
                        "src": "319:18:51",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        },
                        "typeName": {
                          "id": 11399,
                          "name": "bytes4",
                          "nodeType": "ElementaryTypeName",
                          "src": "319:6:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes4",
                            "typeString": "bytes4"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "318:20:51"
                  },
                  "returnParameters": {
                    "id": 11405,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11404,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11418,
                        "src": "371:4:51",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 11403,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "371:4:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "370:6:51"
                  },
                  "scope": 11419,
                  "src": "292:283:51",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 11420,
              "src": "198:379:51"
            }
          ],
          "src": "37:540:51"
        },
        "id": 51
      },
      "contracts/prize-strategy/PeriodicPrizeStrategyListenerInterface.sol": {
        "ast": {
          "absolutePath": "contracts/prize-strategy/PeriodicPrizeStrategyListenerInterface.sol",
          "exportedSymbols": {
            "PeriodicPrizeStrategyListenerInterface": [
              11432
            ]
          },
          "id": 11433,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 11421,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:52"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol",
              "id": 11422,
              "nodeType": "ImportDirective",
              "scope": 11433,
              "sourceUnit": 932,
              "src": "62:82:52",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 11423,
                    "name": "IERC165Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 931,
                    "src": "245:18:52",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC165Upgradeable_$931",
                      "typeString": "contract IERC165Upgradeable"
                    }
                  },
                  "id": 11424,
                  "nodeType": "InheritanceSpecifier",
                  "src": "245:18:52"
                }
              ],
              "contractDependencies": [
                931
              ],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 11432,
              "linearizedBaseContracts": [
                11432,
                931
              ],
              "name": "PeriodicPrizeStrategyListenerInterface",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "575072c6",
                  "id": 11431,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "afterPrizePoolAwarded",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11429,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11426,
                        "mutability": "mutable",
                        "name": "randomNumber",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11431,
                        "src": "299:20:52",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 11425,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "299:7:52",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 11428,
                        "mutability": "mutable",
                        "name": "prizePeriodStartedAt",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11431,
                        "src": "321:28:52",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 11427,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "321:7:52",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "298:52:52"
                  },
                  "returnParameters": {
                    "id": 11430,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "359:0:52"
                  },
                  "scope": 11432,
                  "src": "268:92:52",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 11433,
              "src": "193:169:52"
            }
          ],
          "src": "37:326:52"
        },
        "id": 52
      },
      "contracts/prize-strategy/PeriodicPrizeStrategyListenerLibrary.sol": {
        "ast": {
          "absolutePath": "contracts/prize-strategy/PeriodicPrizeStrategyListenerLibrary.sol",
          "exportedSymbols": {
            "PeriodicPrizeStrategyListenerLibrary": [
              11438
            ]
          },
          "id": 11439,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 11434,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:53"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": null,
              "fullyImplemented": true,
              "id": 11438,
              "linearizedBaseContracts": [
                11438
              ],
              "name": "PeriodicPrizeStrategyListenerLibrary",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": true,
                  "functionSelector": "1511e54f",
                  "id": 11437,
                  "mutability": "constant",
                  "name": "ERC165_INTERFACE_ID_PERIODIC_PRIZE_STRATEGY_LISTENER",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 11438,
                  "src": "207:88:53",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 11435,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "207:6:53",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30783537353037326336",
                    "id": 11436,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "285:10:53",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_1464890054_by_1",
                      "typeString": "int_const 1464890054"
                    },
                    "value": "0x575072c6"
                  },
                  "visibility": "public"
                }
              ],
              "scope": 11439,
              "src": "62:236:53"
            }
          ],
          "src": "37:262:53"
        },
        "id": 53
      },
      "contracts/prize-strategy/PrizeSplit.sol": {
        "ast": {
          "absolutePath": "contracts/prize-strategy/PrizeSplit.sol",
          "exportedSymbols": {
            "PrizeSplit": [
              11841
            ]
          },
          "id": 11842,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 11440,
              "literals": [
                "solidity",
                "^",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "32:24:54"
            },
            {
              "id": 11441,
              "literals": [
                "experimental",
                "ABIEncoderV2"
              ],
              "nodeType": "PragmaDirective",
              "src": "57:33:54"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol",
              "id": 11442,
              "nodeType": "ImportDirective",
              "scope": 11842,
              "sourceUnit": 1287,
              "src": "92:74:54",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol",
              "id": 11443,
              "nodeType": "ImportDirective",
              "scope": 11842,
              "sourceUnit": 131,
              "src": "167:75:54",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": true,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 11445,
                    "name": "OwnableUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 130,
                    "src": "429:18:54",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_OwnableUpgradeable_$130",
                      "typeString": "contract OwnableUpgradeable"
                    }
                  },
                  "id": 11446,
                  "nodeType": "InheritanceSpecifier",
                  "src": "429:18:54"
                }
              ],
              "contractDependencies": [
                130,
                1352,
                3627
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 11444,
                "nodeType": "StructuredDocumentation",
                "src": "244:152:54",
                "text": " @title Abstract prize split contract for adding unique award distribution to static addresses. \n @author Kames Geraghty (PoolTogether Inc)"
              },
              "fullyImplemented": false,
              "id": 11841,
              "linearizedBaseContracts": [
                11841,
                130,
                3627,
                1352
              ],
              "name": "PrizeSplit",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 11449,
                  "libraryName": {
                    "contractScope": null,
                    "id": 11447,
                    "name": "SafeMathUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1286,
                    "src": "458:19:54",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeMathUpgradeable_$1286",
                      "typeString": "library SafeMathUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "452:38:54",
                  "typeName": {
                    "id": 11448,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "482:7:54",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "constant": false,
                  "id": 11452,
                  "mutability": "mutable",
                  "name": "_prizeSplits",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 11841,
                  "src": "496:40:54",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_storage_$dyn_storage",
                    "typeString": "struct PrizeSplit.PrizeSplitConfig[]"
                  },
                  "typeName": {
                    "baseType": {
                      "contractScope": null,
                      "id": 11450,
                      "name": "PrizeSplitConfig",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 11459,
                      "src": "496:16:54",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_storage_ptr",
                        "typeString": "struct PrizeSplit.PrizeSplitConfig"
                      }
                    },
                    "id": 11451,
                    "length": null,
                    "nodeType": "ArrayTypeName",
                    "src": "496:18:54",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_storage_$dyn_storage_ptr",
                      "typeString": "struct PrizeSplit.PrizeSplitConfig[]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "canonicalName": "PrizeSplit.PrizeSplitConfig",
                  "id": 11459,
                  "members": [
                    {
                      "constant": false,
                      "id": 11454,
                      "mutability": "mutable",
                      "name": "target",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 11459,
                      "src": "1026:14:54",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 11453,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "1026:7:54",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 11456,
                      "mutability": "mutable",
                      "name": "percentage",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 11459,
                      "src": "1048:17:54",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint16",
                        "typeString": "uint16"
                      },
                      "typeName": {
                        "id": 11455,
                        "name": "uint16",
                        "nodeType": "ElementaryTypeName",
                        "src": "1048:6:54",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint16",
                          "typeString": "uint16"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 11458,
                      "mutability": "mutable",
                      "name": "token",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 11459,
                      "src": "1073:11:54",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 11457,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "1073:5:54",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "PrizeSplitConfig",
                  "nodeType": "StructDefinition",
                  "scope": 11841,
                  "src": "994:95:54",
                  "visibility": "public"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 11460,
                    "nodeType": "StructuredDocumentation",
                    "src": "1093:486:54",
                    "text": " @notice Emitted when a PrizeSplitConfig config is added or updated.\n @dev Emitted when aPrizeSplitConfig config is added or updated in setPrizeSplits or setPrizeSplit.\n @param target Address of prize split recipient\n @param percentage Percentage of prize split. Must be between 0 and 1000 for single decimal precision\n @param token Index (0 or 1) of token in the prizePool.tokens mapping\n @param index Index of prize split in the prizeSplts array"
                  },
                  "id": 11470,
                  "name": "PrizeSplitSet",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 11469,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11462,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "target",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11470,
                        "src": "1602:22:54",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 11461,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1602:7:54",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 11464,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "percentage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11470,
                        "src": "1626:17:54",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint16",
                          "typeString": "uint16"
                        },
                        "typeName": {
                          "id": 11463,
                          "name": "uint16",
                          "nodeType": "ElementaryTypeName",
                          "src": "1626:6:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint16",
                            "typeString": "uint16"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 11466,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11470,
                        "src": "1645:11:54",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 11465,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "1645:5:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 11468,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "index",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11470,
                        "src": "1658:13:54",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 11467,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1658:7:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1601:71:54"
                  },
                  "src": "1582:91:54"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 11471,
                    "nodeType": "StructuredDocumentation",
                    "src": "1677:231:54",
                    "text": " @notice Emitted when a PrizeSplitConfig config is removed.\n @dev Emitted when a PrizeSplitConfig config is removed from the _prizeSplits array.\n @param target Index of a previously active prize split config"
                  },
                  "id": 11475,
                  "name": "PrizeSplitRemoved",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 11474,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11473,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "target",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11475,
                        "src": "1935:22:54",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 11472,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1935:7:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1934:24:54"
                  },
                  "src": "1911:48:54"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 11476,
                    "nodeType": "StructuredDocumentation",
                    "src": "1963:362:54",
                    "text": " @notice Mints ticket or sponsorship tokens to prize split recipient.\n @dev Mints ticket or sponsorship tokens to prize split recipient via the linked PrizePool contract.\n @param target Recipient of minted tokens\n @param amount Amount of minted tokens\n @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping"
                  },
                  "id": 11485,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_awardPrizeSplitAmount",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11483,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11478,
                        "mutability": "mutable",
                        "name": "target",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11485,
                        "src": "2360:14:54",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 11477,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2360:7:54",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 11480,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11485,
                        "src": "2376:14:54",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 11479,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2376:7:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 11482,
                        "mutability": "mutable",
                        "name": "tokenIndex",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11485,
                        "src": "2392:16:54",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 11481,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "2392:5:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2359:50:54"
                  },
                  "returnParameters": {
                    "id": 11484,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2426:0:54"
                  },
                  "scope": 11841,
                  "src": "2328:99:54",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 11494,
                    "nodeType": "Block",
                    "src": "2690:30:54",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 11492,
                          "name": "_prizeSplits",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 11452,
                          "src": "2703:12:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_storage_$dyn_storage",
                            "typeString": "struct PrizeSplit.PrizeSplitConfig storage ref[] storage ref"
                          }
                        },
                        "functionReturnParameters": 11491,
                        "id": 11493,
                        "nodeType": "Return",
                        "src": "2696:19:54"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 11486,
                    "nodeType": "StructuredDocumentation",
                    "src": "2431:183:54",
                    "text": " @notice Read all prize splits configs.\n @dev Read all PrizeSplitConfig structs stored in _prizeSplits.\n @return _prizeSplits Array of PrizeSplitConfig structs"
                  },
                  "functionSelector": "8d5f10c4",
                  "id": 11495,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "prizeSplits",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11487,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2637:2:54"
                  },
                  "returnParameters": {
                    "id": 11491,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11490,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11495,
                        "src": "2663:25:54",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_memory_ptr_$dyn_memory_ptr",
                          "typeString": "struct PrizeSplit.PrizeSplitConfig[]"
                        },
                        "typeName": {
                          "baseType": {
                            "contractScope": null,
                            "id": 11488,
                            "name": "PrizeSplitConfig",
                            "nodeType": "UserDefinedTypeName",
                            "referencedDeclaration": 11459,
                            "src": "2663:16:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_storage_ptr",
                              "typeString": "struct PrizeSplit.PrizeSplitConfig"
                            }
                          },
                          "id": 11489,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "2663:18:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_storage_$dyn_storage_ptr",
                            "typeString": "struct PrizeSplit.PrizeSplitConfig[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2662:27:54"
                  },
                  "scope": 11841,
                  "src": "2617:103:54",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 11507,
                    "nodeType": "Block",
                    "src": "3077:47:54",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 11503,
                            "name": "_prizeSplits",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11452,
                            "src": "3090:12:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_storage_$dyn_storage",
                              "typeString": "struct PrizeSplit.PrizeSplitConfig storage ref[] storage ref"
                            }
                          },
                          "id": 11505,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 11504,
                            "name": "prizeSplitIndex",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11498,
                            "src": "3103:15:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "3090:29:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_storage",
                            "typeString": "struct PrizeSplit.PrizeSplitConfig storage ref"
                          }
                        },
                        "functionReturnParameters": 11502,
                        "id": 11506,
                        "nodeType": "Return",
                        "src": "3083:36:54"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 11496,
                    "nodeType": "StructuredDocumentation",
                    "src": "2724:257:54",
                    "text": " @notice Read prize split config from active PrizeSplits.\n @dev Read PrizeSplitConfig struct from _prizeSplits array.\n @param prizeSplitIndex Index position of PrizeSplitConfig\n @return PrizeSplitConfig Single prize split config"
                  },
                  "functionSelector": "eefc8ad1",
                  "id": 11508,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "prizeSplit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11499,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11498,
                        "mutability": "mutable",
                        "name": "prizeSplitIndex",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11508,
                        "src": "3004:23:54",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 11497,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3004:7:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3003:25:54"
                  },
                  "returnParameters": {
                    "id": 11502,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11501,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11508,
                        "src": "3052:23:54",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                          "typeString": "struct PrizeSplit.PrizeSplitConfig"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 11500,
                          "name": "PrizeSplitConfig",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 11459,
                          "src": "3052:16:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_storage_ptr",
                            "typeString": "struct PrizeSplit.PrizeSplitConfig"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3051:25:54"
                  },
                  "scope": 11841,
                  "src": "2984:140:54",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 11650,
                    "nodeType": "Block",
                    "src": "3543:1485:54",
                    "statements": [
                      {
                        "assignments": [
                          11518
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 11518,
                            "mutability": "mutable",
                            "name": "newPrizeSplitsLength",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 11650,
                            "src": "3549:28:54",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 11517,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "3549:7:54",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 11521,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 11519,
                            "name": "newPrizeSplits",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11512,
                            "src": "3580:14:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_calldata_ptr_$dyn_calldata_ptr",
                              "typeString": "struct PrizeSplit.PrizeSplitConfig calldata[] calldata"
                            }
                          },
                          "id": 11520,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "3580:21:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3549:52:54"
                      },
                      {
                        "body": {
                          "id": 11613,
                          "nodeType": "Block",
                          "src": "3769:759:54",
                          "statements": [
                            {
                              "assignments": [
                                11533
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 11533,
                                  "mutability": "mutable",
                                  "name": "split",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 11613,
                                  "src": "3777:29:54",
                                  "stateVariable": false,
                                  "storageLocation": "memory",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                    "typeString": "struct PrizeSplit.PrizeSplitConfig"
                                  },
                                  "typeName": {
                                    "contractScope": null,
                                    "id": 11532,
                                    "name": "PrizeSplitConfig",
                                    "nodeType": "UserDefinedTypeName",
                                    "referencedDeclaration": 11459,
                                    "src": "3777:16:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_storage_ptr",
                                      "typeString": "struct PrizeSplit.PrizeSplitConfig"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 11537,
                              "initialValue": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 11534,
                                  "name": "newPrizeSplits",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11512,
                                  "src": "3809:14:54",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_calldata_ptr_$dyn_calldata_ptr",
                                    "typeString": "struct PrizeSplit.PrizeSplitConfig calldata[] calldata"
                                  }
                                },
                                "id": 11536,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 11535,
                                  "name": "index",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11523,
                                  "src": "3824:5:54",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "3809:21:54",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_calldata_ptr",
                                  "typeString": "struct PrizeSplit.PrizeSplitConfig calldata"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "3777:53:54"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint8",
                                      "typeString": "uint8"
                                    },
                                    "id": 11542,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 11539,
                                        "name": "split",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 11533,
                                        "src": "3846:5:54",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                          "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                                        }
                                      },
                                      "id": 11540,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "token",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 11458,
                                      "src": "3846:11:54",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint8",
                                        "typeString": "uint8"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "<=",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "31",
                                      "id": 11541,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "3861:1:54",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_1_by_1",
                                        "typeString": "int_const 1"
                                      },
                                      "value": "1"
                                    },
                                    "src": "3846:16:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c69742d746f6b656e",
                                    "id": 11543,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "3864:42:54",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_3f55ade9922f3cb87d9113b08053a4cfa7995d953faa91fe6f300454da79a7f7",
                                      "typeString": "literal_string \"MultipleWinners/invalid-prizesplit-token\""
                                    },
                                    "value": "MultipleWinners/invalid-prizesplit-token"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_3f55ade9922f3cb87d9113b08053a4cfa7995d953faa91fe6f300454da79a7f7",
                                      "typeString": "literal_string \"MultipleWinners/invalid-prizesplit-token\""
                                    }
                                  ],
                                  "id": 11538,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "3838:7:54",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 11544,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "3838:69:54",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 11545,
                              "nodeType": "ExpressionStatement",
                              "src": "3838:69:54"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    "id": 11553,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 11547,
                                        "name": "split",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 11533,
                                        "src": "3923:5:54",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                          "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                                        }
                                      },
                                      "id": 11548,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "target",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 11454,
                                      "src": "3923:12:54",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "!=",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "hexValue": "30",
                                          "id": 11551,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "number",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "3947:1:54",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          },
                                          "value": "0"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          }
                                        ],
                                        "id": 11550,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "3939:7:54",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_address_$",
                                          "typeString": "type(address)"
                                        },
                                        "typeName": {
                                          "id": 11549,
                                          "name": "address",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "3939:7:54",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      },
                                      "id": 11552,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "3939:10:54",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address_payable",
                                        "typeString": "address payable"
                                      }
                                    },
                                    "src": "3923:26:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c69742d746172676574",
                                    "id": 11554,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "3951:43:54",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_6a2d4ca270d30091e0985450d188d9b6629dc56a1c4c18029420d579a71bd37c",
                                      "typeString": "literal_string \"MultipleWinners/invalid-prizesplit-target\""
                                    },
                                    "value": "MultipleWinners/invalid-prizesplit-target"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_6a2d4ca270d30091e0985450d188d9b6629dc56a1c4c18029420d579a71bd37c",
                                      "typeString": "literal_string \"MultipleWinners/invalid-prizesplit-target\""
                                    }
                                  ],
                                  "id": 11546,
                                  "name": "require",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    -18,
                                    -18
                                  ],
                                  "referencedDeclaration": -18,
                                  "src": "3915:7:54",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (bool,string memory) pure"
                                  }
                                },
                                "id": 11555,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "3915:80:54",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 11556,
                              "nodeType": "ExpressionStatement",
                              "src": "3915:80:54"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 11560,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 11557,
                                    "name": "_prizeSplits",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 11452,
                                    "src": "4014:12:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_storage_$dyn_storage",
                                      "typeString": "struct PrizeSplit.PrizeSplitConfig storage ref[] storage ref"
                                    }
                                  },
                                  "id": 11558,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "length",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "4014:19:54",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "<=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 11559,
                                  "name": "index",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11523,
                                  "src": "4037:5:54",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "4014:28:54",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": {
                                "id": 11601,
                                "nodeType": "Block",
                                "src": "4093:298:54",
                                "statements": [
                                  {
                                    "assignments": [
                                      11569
                                    ],
                                    "declarations": [
                                      {
                                        "constant": false,
                                        "id": 11569,
                                        "mutability": "mutable",
                                        "name": "currentSplit",
                                        "nodeType": "VariableDeclaration",
                                        "overrides": null,
                                        "scope": 11601,
                                        "src": "4103:36:54",
                                        "stateVariable": false,
                                        "storageLocation": "memory",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                          "typeString": "struct PrizeSplit.PrizeSplitConfig"
                                        },
                                        "typeName": {
                                          "contractScope": null,
                                          "id": 11568,
                                          "name": "PrizeSplitConfig",
                                          "nodeType": "UserDefinedTypeName",
                                          "referencedDeclaration": 11459,
                                          "src": "4103:16:54",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_storage_ptr",
                                            "typeString": "struct PrizeSplit.PrizeSplitConfig"
                                          }
                                        },
                                        "value": null,
                                        "visibility": "internal"
                                      }
                                    ],
                                    "id": 11573,
                                    "initialValue": {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "id": 11570,
                                        "name": "_prizeSplits",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 11452,
                                        "src": "4142:12:54",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_storage_$dyn_storage",
                                          "typeString": "struct PrizeSplit.PrizeSplitConfig storage ref[] storage ref"
                                        }
                                      },
                                      "id": 11572,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 11571,
                                        "name": "index",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 11523,
                                        "src": "4155:5:54",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "4142:19:54",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_storage",
                                        "typeString": "struct PrizeSplit.PrizeSplitConfig storage ref"
                                      }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "4103:58:54"
                                  },
                                  {
                                    "condition": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      },
                                      "id": 11590,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        },
                                        "id": 11584,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "commonType": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          },
                                          "id": 11578,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftExpression": {
                                            "argumentTypes": null,
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 11574,
                                              "name": "split",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 11533,
                                              "src": "4175:5:54",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                                "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                                              }
                                            },
                                            "id": 11575,
                                            "isConstant": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "target",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 11454,
                                            "src": "4175:12:54",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            }
                                          },
                                          "nodeType": "BinaryOperation",
                                          "operator": "!=",
                                          "rightExpression": {
                                            "argumentTypes": null,
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 11576,
                                              "name": "currentSplit",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 11569,
                                              "src": "4191:12:54",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                                "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                                              }
                                            },
                                            "id": 11577,
                                            "isConstant": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "target",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 11454,
                                            "src": "4191:19:54",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            }
                                          },
                                          "src": "4175:35:54",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "||",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "commonType": {
                                            "typeIdentifier": "t_uint16",
                                            "typeString": "uint16"
                                          },
                                          "id": 11583,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftExpression": {
                                            "argumentTypes": null,
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 11579,
                                              "name": "split",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 11533,
                                              "src": "4214:5:54",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                                "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                                              }
                                            },
                                            "id": 11580,
                                            "isConstant": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "percentage",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 11456,
                                            "src": "4214:16:54",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint16",
                                              "typeString": "uint16"
                                            }
                                          },
                                          "nodeType": "BinaryOperation",
                                          "operator": "!=",
                                          "rightExpression": {
                                            "argumentTypes": null,
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 11581,
                                              "name": "currentSplit",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 11569,
                                              "src": "4234:12:54",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                                "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                                              }
                                            },
                                            "id": 11582,
                                            "isConstant": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "percentage",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 11456,
                                            "src": "4234:23:54",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint16",
                                              "typeString": "uint16"
                                            }
                                          },
                                          "src": "4214:43:54",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                          }
                                        },
                                        "src": "4175:82:54",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "||",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_uint8",
                                          "typeString": "uint8"
                                        },
                                        "id": 11589,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 11585,
                                            "name": "split",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 11533,
                                            "src": "4261:5:54",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                              "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                                            }
                                          },
                                          "id": 11586,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "token",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 11458,
                                          "src": "4261:11:54",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint8",
                                            "typeString": "uint8"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "!=",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 11587,
                                            "name": "currentSplit",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 11569,
                                            "src": "4276:12:54",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                              "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                                            }
                                          },
                                          "id": 11588,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "token",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 11458,
                                          "src": "4276:18:54",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint8",
                                            "typeString": "uint8"
                                          }
                                        },
                                        "src": "4261:33:54",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        }
                                      },
                                      "src": "4175:119:54",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "falseBody": {
                                      "id": 11599,
                                      "nodeType": "Block",
                                      "src": "4352:31:54",
                                      "statements": [
                                        {
                                          "id": 11598,
                                          "nodeType": "Continue",
                                          "src": "4364:8:54"
                                        }
                                      ]
                                    },
                                    "id": 11600,
                                    "nodeType": "IfStatement",
                                    "src": "4171:212:54",
                                    "trueBody": {
                                      "id": 11597,
                                      "nodeType": "Block",
                                      "src": "4296:50:54",
                                      "statements": [
                                        {
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 11595,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftHandSide": {
                                              "argumentTypes": null,
                                              "baseExpression": {
                                                "argumentTypes": null,
                                                "id": 11591,
                                                "name": "_prizeSplits",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 11452,
                                                "src": "4308:12:54",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_storage_$dyn_storage",
                                                  "typeString": "struct PrizeSplit.PrizeSplitConfig storage ref[] storage ref"
                                                }
                                              },
                                              "id": 11593,
                                              "indexExpression": {
                                                "argumentTypes": null,
                                                "id": 11592,
                                                "name": "index",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 11523,
                                                "src": "4321:5:54",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "isConstant": false,
                                              "isLValue": true,
                                              "isPure": false,
                                              "lValueRequested": true,
                                              "nodeType": "IndexAccess",
                                              "src": "4308:19:54",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_storage",
                                                "typeString": "struct PrizeSplit.PrizeSplitConfig storage ref"
                                              }
                                            },
                                            "nodeType": "Assignment",
                                            "operator": "=",
                                            "rightHandSide": {
                                              "argumentTypes": null,
                                              "id": 11594,
                                              "name": "split",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 11533,
                                              "src": "4330:5:54",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                                "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                                              }
                                            },
                                            "src": "4308:27:54",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_storage",
                                              "typeString": "struct PrizeSplit.PrizeSplitConfig storage ref"
                                            }
                                          },
                                          "id": 11596,
                                          "nodeType": "ExpressionStatement",
                                          "src": "4308:27:54"
                                        }
                                      ]
                                    }
                                  }
                                ]
                              },
                              "id": 11602,
                              "nodeType": "IfStatement",
                              "src": "4010:381:54",
                              "trueBody": {
                                "id": 11567,
                                "nodeType": "Block",
                                "src": "4044:43:54",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 11564,
                                          "name": "split",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 11533,
                                          "src": "4072:5:54",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                            "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                            "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 11561,
                                          "name": "_prizeSplits",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 11452,
                                          "src": "4054:12:54",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_storage_$dyn_storage",
                                            "typeString": "struct PrizeSplit.PrizeSplitConfig storage ref[] storage ref"
                                          }
                                        },
                                        "id": 11563,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "push",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": null,
                                        "src": "4054:17:54",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_arraypush_nonpayable$_t_struct$_PrizeSplitConfig_$11459_storage_$returns$__$",
                                          "typeString": "function (struct PrizeSplit.PrizeSplitConfig storage ref)"
                                        }
                                      },
                                      "id": 11565,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "4054:24:54",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 11566,
                                    "nodeType": "ExpressionStatement",
                                    "src": "4054:24:54"
                                  }
                                ]
                              }
                            },
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 11604,
                                      "name": "split",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 11533,
                                      "src": "4470:5:54",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                        "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                                      }
                                    },
                                    "id": 11605,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "target",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 11454,
                                    "src": "4470:12:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 11606,
                                      "name": "split",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 11533,
                                      "src": "4484:5:54",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                        "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                                      }
                                    },
                                    "id": 11607,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "percentage",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 11456,
                                    "src": "4484:16:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint16",
                                      "typeString": "uint16"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 11608,
                                      "name": "split",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 11533,
                                      "src": "4502:5:54",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                        "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                                      }
                                    },
                                    "id": 11609,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "token",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 11458,
                                    "src": "4502:11:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint8",
                                      "typeString": "uint8"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 11610,
                                    "name": "index",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 11523,
                                    "src": "4515:5:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint16",
                                      "typeString": "uint16"
                                    },
                                    {
                                      "typeIdentifier": "t_uint8",
                                      "typeString": "uint8"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 11603,
                                  "name": "PrizeSplitSet",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11470,
                                  "src": "4456:13:54",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint16_$_t_uint8_$_t_uint256_$returns$__$",
                                    "typeString": "function (address,uint16,uint8,uint256)"
                                  }
                                },
                                "id": 11611,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "4456:65:54",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 11612,
                              "nodeType": "EmitStatement",
                              "src": "4451:70:54"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 11528,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 11526,
                            "name": "index",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11523,
                            "src": "3730:5:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 11527,
                            "name": "newPrizeSplitsLength",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11518,
                            "src": "3738:20:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "3730:28:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 11614,
                        "initializationExpression": {
                          "assignments": [
                            11523
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 11523,
                              "mutability": "mutable",
                              "name": "index",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 11614,
                              "src": "3711:13:54",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 11522,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "3711:7:54",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 11525,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 11524,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "3727:1:54",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "3711:17:54"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 11530,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "3760:7:54",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 11529,
                              "name": "index",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11523,
                              "src": "3760:5:54",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 11531,
                          "nodeType": "ExpressionStatement",
                          "src": "3760:7:54"
                        },
                        "nodeType": "ForStatement",
                        "src": "3706:822:54"
                      },
                      {
                        "body": {
                          "id": 11636,
                          "nodeType": "Block",
                          "src": "4698:122:54",
                          "statements": [
                            {
                              "assignments": [
                                11620
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 11620,
                                  "mutability": "mutable",
                                  "name": "_index",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 11636,
                                  "src": "4706:14:54",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 11619,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "4706:7:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 11626,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "31",
                                    "id": 11624,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "4747:1:54",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_1_by_1",
                                      "typeString": "int_const 1"
                                    },
                                    "value": "1"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_1_by_1",
                                      "typeString": "int_const 1"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 11621,
                                      "name": "_prizeSplits",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 11452,
                                      "src": "4723:12:54",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_storage_$dyn_storage",
                                        "typeString": "struct PrizeSplit.PrizeSplitConfig storage ref[] storage ref"
                                      }
                                    },
                                    "id": 11622,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "length",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": null,
                                    "src": "4723:19:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 11623,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sub",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1135,
                                  "src": "4723:23:54",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256,uint256) pure returns (uint256)"
                                  }
                                },
                                "id": 11625,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "4723:26:54",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "4706:43:54"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 11627,
                                    "name": "_prizeSplits",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 11452,
                                    "src": "4757:12:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_storage_$dyn_storage",
                                      "typeString": "struct PrizeSplit.PrizeSplitConfig storage ref[] storage ref"
                                    }
                                  },
                                  "id": 11629,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "pop",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "4757:16:54",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_arraypop_nonpayable$__$returns$__$",
                                    "typeString": "function ()"
                                  }
                                },
                                "id": 11630,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "4757:18:54",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 11631,
                              "nodeType": "ExpressionStatement",
                              "src": "4757:18:54"
                            },
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 11633,
                                    "name": "_index",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 11620,
                                    "src": "4806:6:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 11632,
                                  "name": "PrizeSplitRemoved",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11475,
                                  "src": "4788:17:54",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$",
                                    "typeString": "function (uint256)"
                                  }
                                },
                                "id": 11634,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "4788:25:54",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 11635,
                              "nodeType": "EmitStatement",
                              "src": "4783:30:54"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 11618,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 11615,
                              "name": "_prizeSplits",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11452,
                              "src": "4654:12:54",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_storage_$dyn_storage",
                                "typeString": "struct PrizeSplit.PrizeSplitConfig storage ref[] storage ref"
                              }
                            },
                            "id": 11616,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "4654:19:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 11617,
                            "name": "newPrizeSplitsLength",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11518,
                            "src": "4676:20:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "4654:42:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 11637,
                        "nodeType": "WhileStatement",
                        "src": "4647:173:54"
                      },
                      {
                        "assignments": [
                          11639
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 11639,
                            "mutability": "mutable",
                            "name": "totalPercentage",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 11650,
                            "src": "4870:23:54",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 11638,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "4870:7:54",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 11642,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 11640,
                            "name": "_totalPrizeSplitPercentageAmount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11779,
                            "src": "4896:32:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                              "typeString": "function () view returns (uint256)"
                            }
                          },
                          "id": 11641,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4896:34:54",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "4870:60:54"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 11646,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 11644,
                                "name": "totalPercentage",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 11639,
                                "src": "4944:15:54",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "31303030",
                                "id": 11645,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "4963:4:54",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_1000_by_1",
                                  "typeString": "int_const 1000"
                                },
                                "value": "1000"
                              },
                              "src": "4944:23:54",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c69742d70657263656e746167652d746f74616c",
                              "id": 11647,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "4969:53:54",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_9d2b3b1e20ab9c9a1dca0c01474e3151a90c001983d7bab0c3f99b9e4afa79ed",
                                "typeString": "literal_string \"MultipleWinners/invalid-prizesplit-percentage-total\""
                              },
                              "value": "MultipleWinners/invalid-prizesplit-percentage-total"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_9d2b3b1e20ab9c9a1dca0c01474e3151a90c001983d7bab0c3f99b9e4afa79ed",
                                "typeString": "literal_string \"MultipleWinners/invalid-prizesplit-percentage-total\""
                              }
                            ],
                            "id": 11643,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "4936:7:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 11648,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4936:87:54",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11649,
                        "nodeType": "ExpressionStatement",
                        "src": "4936:87:54"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 11509,
                    "nodeType": "StructuredDocumentation",
                    "src": "3128:325:54",
                    "text": " @notice Set and remove prize split(s) configs.\n @dev Set and remove prize split configs by passing a new PrizeSplitConfig structs array. Will remove existing PrizeSplitConfig(s) if passed array length is less than existing _prizeSplits length.\n @param newPrizeSplits Array of PrizeSplitConfig structs"
                  },
                  "functionSelector": "c25a9c32",
                  "id": 11651,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 11515,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 11514,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "3533:9:54",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "3533:9:54"
                    }
                  ],
                  "name": "setPrizeSplits",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11513,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11512,
                        "mutability": "mutable",
                        "name": "newPrizeSplits",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11651,
                        "src": "3480:42:54",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_calldata_ptr_$dyn_calldata_ptr",
                          "typeString": "struct PrizeSplit.PrizeSplitConfig[]"
                        },
                        "typeName": {
                          "baseType": {
                            "contractScope": null,
                            "id": 11510,
                            "name": "PrizeSplitConfig",
                            "nodeType": "UserDefinedTypeName",
                            "referencedDeclaration": 11459,
                            "src": "3480:16:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_storage_ptr",
                              "typeString": "struct PrizeSplit.PrizeSplitConfig"
                            }
                          },
                          "id": 11511,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "3480:18:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_storage_$dyn_storage_ptr",
                            "typeString": "struct PrizeSplit.PrizeSplitConfig[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3479:44:54"
                  },
                  "returnParameters": {
                    "id": 11516,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3543:0:54"
                  },
                  "scope": 11841,
                  "src": "3456:1572:54",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 11716,
                    "nodeType": "Block",
                    "src": "5484:753:54",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 11665,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 11662,
                                "name": "prizeSplitIndex",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 11656,
                                "src": "5498:15:54",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint8",
                                  "typeString": "uint8"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<",
                              "rightExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 11663,
                                  "name": "_prizeSplits",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11452,
                                  "src": "5516:12:54",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_storage_$dyn_storage",
                                    "typeString": "struct PrizeSplit.PrizeSplitConfig storage ref[] storage ref"
                                  }
                                },
                                "id": 11664,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "length",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "5516:19:54",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "5498:37:54",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4d756c7469706c6557696e6e6572732f6e6f6e6578697374656e742d7072697a6573706c6974",
                              "id": 11666,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "5537:40:54",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_7c2c2587b863f3a7ea298cf704efd703156474591c18227a915212eb93ab6f25",
                                "typeString": "literal_string \"MultipleWinners/nonexistent-prizesplit\""
                              },
                              "value": "MultipleWinners/nonexistent-prizesplit"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_7c2c2587b863f3a7ea298cf704efd703156474591c18227a915212eb93ab6f25",
                                "typeString": "literal_string \"MultipleWinners/nonexistent-prizesplit\""
                              }
                            ],
                            "id": 11661,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "5490:7:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 11667,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5490:88:54",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11668,
                        "nodeType": "ExpressionStatement",
                        "src": "5490:88:54"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              "id": 11673,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 11670,
                                  "name": "prizeStrategySplit",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11654,
                                  "src": "5592:18:54",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                    "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                                  }
                                },
                                "id": 11671,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "token",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 11458,
                                "src": "5592:24:54",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint8",
                                  "typeString": "uint8"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "31",
                                "id": 11672,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "5620:1:54",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_1_by_1",
                                  "typeString": "int_const 1"
                                },
                                "value": "1"
                              },
                              "src": "5592:29:54",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c69742d746f6b656e",
                              "id": 11674,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "5623:42:54",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_3f55ade9922f3cb87d9113b08053a4cfa7995d953faa91fe6f300454da79a7f7",
                                "typeString": "literal_string \"MultipleWinners/invalid-prizesplit-token\""
                              },
                              "value": "MultipleWinners/invalid-prizesplit-token"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_3f55ade9922f3cb87d9113b08053a4cfa7995d953faa91fe6f300454da79a7f7",
                                "typeString": "literal_string \"MultipleWinners/invalid-prizesplit-token\""
                              }
                            ],
                            "id": 11669,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "5584:7:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 11675,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5584:82:54",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11676,
                        "nodeType": "ExpressionStatement",
                        "src": "5584:82:54"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 11684,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 11678,
                                  "name": "prizeStrategySplit",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11654,
                                  "src": "5680:18:54",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                    "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                                  }
                                },
                                "id": 11679,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "target",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 11454,
                                "src": "5680:25:54",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 11682,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "5717:1:54",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 11681,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "5709:7:54",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 11680,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "5709:7:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 11683,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "5709:10:54",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "5680:39:54",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c69742d746172676574",
                              "id": 11685,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "5721:43:54",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_6a2d4ca270d30091e0985450d188d9b6629dc56a1c4c18029420d579a71bd37c",
                                "typeString": "literal_string \"MultipleWinners/invalid-prizesplit-target\""
                              },
                              "value": "MultipleWinners/invalid-prizesplit-target"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_6a2d4ca270d30091e0985450d188d9b6629dc56a1c4c18029420d579a71bd37c",
                                "typeString": "literal_string \"MultipleWinners/invalid-prizesplit-target\""
                              }
                            ],
                            "id": 11677,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "5672:7:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 11686,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5672:93:54",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11687,
                        "nodeType": "ExpressionStatement",
                        "src": "5672:93:54"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 11692,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 11688,
                              "name": "_prizeSplits",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11452,
                              "src": "5813:12:54",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_storage_$dyn_storage",
                                "typeString": "struct PrizeSplit.PrizeSplitConfig storage ref[] storage ref"
                              }
                            },
                            "id": 11690,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 11689,
                              "name": "prizeSplitIndex",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11656,
                              "src": "5826:15:54",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "5813:29:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_storage",
                              "typeString": "struct PrizeSplit.PrizeSplitConfig storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 11691,
                            "name": "prizeStrategySplit",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11654,
                            "src": "5845:18:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                              "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                            }
                          },
                          "src": "5813:50:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_storage",
                            "typeString": "struct PrizeSplit.PrizeSplitConfig storage ref"
                          }
                        },
                        "id": 11693,
                        "nodeType": "ExpressionStatement",
                        "src": "5813:50:54"
                      },
                      {
                        "assignments": [
                          11695
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 11695,
                            "mutability": "mutable",
                            "name": "totalPercentage",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 11716,
                            "src": "5914:23:54",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 11694,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "5914:7:54",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 11698,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 11696,
                            "name": "_totalPrizeSplitPercentageAmount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11779,
                            "src": "5940:32:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                              "typeString": "function () view returns (uint256)"
                            }
                          },
                          "id": 11697,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5940:34:54",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "5914:60:54"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 11702,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 11700,
                                "name": "totalPercentage",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 11695,
                                "src": "5988:15:54",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "31303030",
                                "id": 11701,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "6007:4:54",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_1000_by_1",
                                  "typeString": "int_const 1000"
                                },
                                "value": "1000"
                              },
                              "src": "5988:23:54",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4d756c7469706c6557696e6e6572732f696e76616c69642d7072697a6573706c69742d70657263656e746167652d746f74616c",
                              "id": 11703,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "6013:53:54",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_9d2b3b1e20ab9c9a1dca0c01474e3151a90c001983d7bab0c3f99b9e4afa79ed",
                                "typeString": "literal_string \"MultipleWinners/invalid-prizesplit-percentage-total\""
                              },
                              "value": "MultipleWinners/invalid-prizesplit-percentage-total"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_9d2b3b1e20ab9c9a1dca0c01474e3151a90c001983d7bab0c3f99b9e4afa79ed",
                                "typeString": "literal_string \"MultipleWinners/invalid-prizesplit-percentage-total\""
                              }
                            ],
                            "id": 11699,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "5980:7:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 11704,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5980:87:54",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11705,
                        "nodeType": "ExpressionStatement",
                        "src": "5980:87:54"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 11707,
                                "name": "prizeStrategySplit",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 11654,
                                "src": "6132:18:54",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                  "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                                }
                              },
                              "id": 11708,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "target",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 11454,
                              "src": "6132:25:54",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 11709,
                                "name": "prizeStrategySplit",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 11654,
                                "src": "6159:18:54",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                  "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                                }
                              },
                              "id": 11710,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "percentage",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 11456,
                              "src": "6159:29:54",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint16",
                                "typeString": "uint16"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 11711,
                                "name": "prizeStrategySplit",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 11654,
                                "src": "6190:18:54",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                  "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                                }
                              },
                              "id": 11712,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "token",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 11458,
                              "src": "6190:24:54",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 11713,
                              "name": "prizeSplitIndex",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11656,
                              "src": "6216:15:54",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint16",
                                "typeString": "uint16"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            ],
                            "id": 11706,
                            "name": "PrizeSplitSet",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11470,
                            "src": "6118:13:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint16_$_t_uint8_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint16,uint8,uint256)"
                            }
                          },
                          "id": 11714,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6118:114:54",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11715,
                        "nodeType": "EmitStatement",
                        "src": "6113:119:54"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 11652,
                    "nodeType": "StructuredDocumentation",
                    "src": "5032:340:54",
                    "text": " @notice Updates a previously set prize split config.\n @dev Updates a prize split config by passing a new PrizeSplitConfig struct and current index position. Limited to contract owner.\n @param prizeStrategySplit PrizeSplitConfig config struct\n @param prizeSplitIndex Index position of PrizeSplitConfig to update"
                  },
                  "functionSelector": "fbf0953e",
                  "id": 11717,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 11659,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 11658,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "5474:9:54",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "5474:9:54"
                    }
                  ],
                  "name": "setPrizeSplit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11657,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11654,
                        "mutability": "mutable",
                        "name": "prizeStrategySplit",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11717,
                        "src": "5398:42:54",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                          "typeString": "struct PrizeSplit.PrizeSplitConfig"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 11653,
                          "name": "PrizeSplitConfig",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 11459,
                          "src": "5398:16:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_storage_ptr",
                            "typeString": "struct PrizeSplit.PrizeSplitConfig"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 11656,
                        "mutability": "mutable",
                        "name": "prizeSplitIndex",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11717,
                        "src": "5442:21:54",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 11655,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "5442:5:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5397:67:54"
                  },
                  "returnParameters": {
                    "id": 11660,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "5484:0:54"
                  },
                  "scope": 11841,
                  "src": "5375:862:54",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 11735,
                    "nodeType": "Block",
                    "src": "6665:49:54",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "31303030",
                              "id": 11732,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "6704:4:54",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_1000_by_1",
                                "typeString": "int_const 1000"
                              },
                              "value": "1000"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_1000_by_1",
                                "typeString": "int_const 1000"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "components": [
                                {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 11729,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 11727,
                                    "name": "amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 11720,
                                    "src": "6679:6:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "*",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 11728,
                                    "name": "percentage",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 11722,
                                    "src": "6688:10:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint16",
                                      "typeString": "uint16"
                                    }
                                  },
                                  "src": "6679:19:54",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "id": 11730,
                              "isConstant": false,
                              "isInlineArray": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "TupleExpression",
                              "src": "6678:21:54",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 11731,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "div",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1191,
                            "src": "6678:25:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 11733,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6678:31:54",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 11726,
                        "id": 11734,
                        "nodeType": "Return",
                        "src": "6671:38:54"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 11718,
                    "nodeType": "StructuredDocumentation",
                    "src": "6241:324:54",
                    "text": " @notice Calculate single prize split distribution amount.\n @dev Calculate single prize split distribution amount using the total prize amount and prize split percentage.\n @param amount Total prize award distribution amount\n @param percentage Percentage with single decimal precision using 0-1000 ranges"
                  },
                  "id": 11736,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_getPrizeSplitAmount",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11723,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11720,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11736,
                        "src": "6598:14:54",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 11719,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6598:7:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 11722,
                        "mutability": "mutable",
                        "name": "percentage",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11736,
                        "src": "6614:17:54",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint16",
                          "typeString": "uint16"
                        },
                        "typeName": {
                          "id": 11721,
                          "name": "uint16",
                          "nodeType": "ElementaryTypeName",
                          "src": "6614:6:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint16",
                            "typeString": "uint16"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6597:35:54"
                  },
                  "returnParameters": {
                    "id": 11726,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11725,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11736,
                        "src": "6656:7:54",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 11724,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6656:7:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6655:9:54"
                  },
                  "scope": 11841,
                  "src": "6568:146:54",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 11778,
                    "nodeType": "Block",
                    "src": "7049:327:54",
                    "statements": [
                      {
                        "assignments": [
                          11743
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 11743,
                            "mutability": "mutable",
                            "name": "_tempTotalPercentage",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 11778,
                            "src": "7055:28:54",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 11742,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "7055:7:54",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 11744,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "7055:28:54"
                      },
                      {
                        "assignments": [
                          11746
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 11746,
                            "mutability": "mutable",
                            "name": "prizeSplitsLength",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 11778,
                            "src": "7089:25:54",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 11745,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "7089:7:54",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 11749,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 11747,
                            "name": "_prizeSplits",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11452,
                            "src": "7117:12:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_storage_$dyn_storage",
                              "typeString": "struct PrizeSplit.PrizeSplitConfig storage ref[] storage ref"
                            }
                          },
                          "id": 11748,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "7117:19:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "7089:47:54"
                      },
                      {
                        "body": {
                          "id": 11774,
                          "nodeType": "Block",
                          "src": "7200:139:54",
                          "statements": [
                            {
                              "assignments": [
                                11761
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 11761,
                                  "mutability": "mutable",
                                  "name": "split",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 11774,
                                  "src": "7208:29:54",
                                  "stateVariable": false,
                                  "storageLocation": "memory",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                    "typeString": "struct PrizeSplit.PrizeSplitConfig"
                                  },
                                  "typeName": {
                                    "contractScope": null,
                                    "id": 11760,
                                    "name": "PrizeSplitConfig",
                                    "nodeType": "UserDefinedTypeName",
                                    "referencedDeclaration": 11459,
                                    "src": "7208:16:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_storage_ptr",
                                      "typeString": "struct PrizeSplit.PrizeSplitConfig"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 11765,
                              "initialValue": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 11762,
                                  "name": "_prizeSplits",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11452,
                                  "src": "7240:12:54",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_storage_$dyn_storage",
                                    "typeString": "struct PrizeSplit.PrizeSplitConfig storage ref[] storage ref"
                                  }
                                },
                                "id": 11764,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 11763,
                                  "name": "index",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11751,
                                  "src": "7253:5:54",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint8",
                                    "typeString": "uint8"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "7240:19:54",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_storage",
                                  "typeString": "struct PrizeSplit.PrizeSplitConfig storage ref"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "7208:51:54"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 11772,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 11766,
                                  "name": "_tempTotalPercentage",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11743,
                                  "src": "7267:20:54",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 11769,
                                        "name": "split",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 11761,
                                        "src": "7315:5:54",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                          "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                                        }
                                      },
                                      "id": 11770,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "percentage",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 11456,
                                      "src": "7315:16:54",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint16",
                                        "typeString": "uint16"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint16",
                                        "typeString": "uint16"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 11767,
                                      "name": "_tempTotalPercentage",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 11743,
                                      "src": "7290:20:54",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 11768,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "add",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1113,
                                    "src": "7290:24:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 11771,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "7290:42:54",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "7267:65:54",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 11773,
                              "nodeType": "ExpressionStatement",
                              "src": "7267:65:54"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 11756,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 11754,
                            "name": "index",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11751,
                            "src": "7164:5:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 11755,
                            "name": "prizeSplitsLength",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11746,
                            "src": "7172:17:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "7164:25:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 11775,
                        "initializationExpression": {
                          "assignments": [
                            11751
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 11751,
                              "mutability": "mutable",
                              "name": "index",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 11775,
                              "src": "7147:11:54",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              "typeName": {
                                "id": 11750,
                                "name": "uint8",
                                "nodeType": "ElementaryTypeName",
                                "src": "7147:5:54",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint8",
                                  "typeString": "uint8"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 11753,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 11752,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "7161:1:54",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "7147:15:54"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 11758,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "7191:7:54",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 11757,
                              "name": "index",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11751,
                              "src": "7191:5:54",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            }
                          },
                          "id": 11759,
                          "nodeType": "ExpressionStatement",
                          "src": "7191:7:54"
                        },
                        "nodeType": "ForStatement",
                        "src": "7142:197:54"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 11776,
                          "name": "_tempTotalPercentage",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 11743,
                          "src": "7351:20:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 11741,
                        "id": 11777,
                        "nodeType": "Return",
                        "src": "7344:27:54"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 11737,
                    "nodeType": "StructuredDocumentation",
                    "src": "6718:252:54",
                    "text": " @notice Calculates total prize split percentage amount.\n @dev Calculates total PrizeSplitConfig percentage(s) amount. Used to check the total does not exceed 100% of award distribution.\n @return Total prize split(s) percentage amount"
                  },
                  "id": 11779,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_totalPrizeSplitPercentageAmount",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11738,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "7014:2:54"
                  },
                  "returnParameters": {
                    "id": 11741,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11740,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11779,
                        "src": "7040:7:54",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 11739,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7040:7:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7039:9:54"
                  },
                  "scope": 11841,
                  "src": "6973:403:54",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 11839,
                    "nodeType": "Block",
                    "src": "7715:671:54",
                    "statements": [
                      {
                        "assignments": [
                          11788
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 11788,
                            "mutability": "mutable",
                            "name": "_prizeTemp",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 11839,
                            "src": "7817:18:54",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 11787,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "7817:7:54",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 11790,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 11789,
                          "name": "prize",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 11782,
                          "src": "7838:5:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "7817:26:54"
                      },
                      {
                        "assignments": [
                          11792
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 11792,
                            "mutability": "mutable",
                            "name": "prizeSplitsLength",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 11839,
                            "src": "7849:25:54",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 11791,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "7849:7:54",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 11795,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 11793,
                            "name": "_prizeSplits",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11452,
                            "src": "7877:12:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_storage_$dyn_storage",
                              "typeString": "struct PrizeSplit.PrizeSplitConfig storage ref[] storage ref"
                            }
                          },
                          "id": 11794,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "7877:19:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "7849:47:54"
                      },
                      {
                        "body": {
                          "id": 11835,
                          "nodeType": "Block",
                          "src": "7962:401:54",
                          "statements": [
                            {
                              "assignments": [
                                11807
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 11807,
                                  "mutability": "mutable",
                                  "name": "split",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 11835,
                                  "src": "7970:29:54",
                                  "stateVariable": false,
                                  "storageLocation": "memory",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                    "typeString": "struct PrizeSplit.PrizeSplitConfig"
                                  },
                                  "typeName": {
                                    "contractScope": null,
                                    "id": 11806,
                                    "name": "PrizeSplitConfig",
                                    "nodeType": "UserDefinedTypeName",
                                    "referencedDeclaration": 11459,
                                    "src": "7970:16:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_storage_ptr",
                                      "typeString": "struct PrizeSplit.PrizeSplitConfig"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 11811,
                              "initialValue": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 11808,
                                  "name": "_prizeSplits",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11452,
                                  "src": "8002:12:54",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_struct$_PrizeSplitConfig_$11459_storage_$dyn_storage",
                                    "typeString": "struct PrizeSplit.PrizeSplitConfig storage ref[] storage ref"
                                  }
                                },
                                "id": 11810,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 11809,
                                  "name": "index",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11797,
                                  "src": "8015:5:54",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "8002:19:54",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_storage",
                                  "typeString": "struct PrizeSplit.PrizeSplitConfig storage ref"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "7970:51:54"
                            },
                            {
                              "assignments": [
                                11813
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 11813,
                                  "mutability": "mutable",
                                  "name": "_splitAmount",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 11835,
                                  "src": "8029:20:54",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 11812,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "8029:7:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 11819,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 11815,
                                    "name": "_prizeTemp",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 11788,
                                    "src": "8073:10:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 11816,
                                      "name": "split",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 11807,
                                      "src": "8085:5:54",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                        "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                                      }
                                    },
                                    "id": 11817,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "percentage",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 11456,
                                    "src": "8085:16:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint16",
                                      "typeString": "uint16"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_uint16",
                                      "typeString": "uint16"
                                    }
                                  ],
                                  "id": 11814,
                                  "name": "_getPrizeSplitAmount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11736,
                                  "src": "8052:20:54",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint16_$returns$_t_uint256_$",
                                    "typeString": "function (uint256,uint16) pure returns (uint256)"
                                  }
                                },
                                "id": 11818,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "8052:50:54",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "8029:73:54"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 11821,
                                      "name": "split",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 11807,
                                      "src": "8186:5:54",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                        "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                                      }
                                    },
                                    "id": 11822,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "target",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 11454,
                                    "src": "8186:12:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 11823,
                                    "name": "_splitAmount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 11813,
                                    "src": "8200:12:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 11824,
                                      "name": "split",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 11807,
                                      "src": "8214:5:54",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_PrizeSplitConfig_$11459_memory_ptr",
                                        "typeString": "struct PrizeSplit.PrizeSplitConfig memory"
                                      }
                                    },
                                    "id": 11825,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "token",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 11458,
                                    "src": "8214:11:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint8",
                                      "typeString": "uint8"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_uint8",
                                      "typeString": "uint8"
                                    }
                                  ],
                                  "id": 11820,
                                  "name": "_awardPrizeSplitAmount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11485,
                                  "src": "8163:22:54",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_uint8_$returns$__$",
                                    "typeString": "function (address,uint256,uint8)"
                                  }
                                },
                                "id": 11826,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "8163:63:54",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 11827,
                              "nodeType": "ExpressionStatement",
                              "src": "8163:63:54"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 11833,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 11828,
                                  "name": "prize",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11782,
                                  "src": "8325:5:54",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 11831,
                                      "name": "_splitAmount",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 11813,
                                      "src": "8343:12:54",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 11829,
                                      "name": "prize",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 11782,
                                      "src": "8333:5:54",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 11830,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "sub",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1135,
                                    "src": "8333:9:54",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 11832,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "8333:23:54",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "8325:31:54",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 11834,
                              "nodeType": "ExpressionStatement",
                              "src": "8325:31:54"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 11802,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 11800,
                            "name": "index",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11797,
                            "src": "7926:5:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 11801,
                            "name": "prizeSplitsLength",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11792,
                            "src": "7934:17:54",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "7926:25:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 11836,
                        "initializationExpression": {
                          "assignments": [
                            11797
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 11797,
                              "mutability": "mutable",
                              "name": "index",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 11836,
                              "src": "7907:13:54",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 11796,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "7907:7:54",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 11799,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 11798,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "7923:1:54",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "7907:17:54"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 11804,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "7953:7:54",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 11803,
                              "name": "index",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11797,
                              "src": "7953:5:54",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 11805,
                          "nodeType": "ExpressionStatement",
                          "src": "7953:7:54"
                        },
                        "nodeType": "ForStatement",
                        "src": "7902:461:54"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 11837,
                          "name": "prize",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 11782,
                          "src": "8376:5:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 11786,
                        "id": 11838,
                        "nodeType": "Return",
                        "src": "8369:12:54"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 11780,
                    "nodeType": "StructuredDocumentation",
                    "src": "7380:258:54",
                    "text": " @notice Distributes prize split(s).\n @dev Distributes prize split(s) by awarding ticket or sponsorship tokens.\n @param prize Starting prize award amount\n @return Total prize award distribution amount exlcuding the awarded prize split(s)"
                  },
                  "id": 11840,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_distributePrizeSplits",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11783,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11782,
                        "mutability": "mutable",
                        "name": "prize",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11840,
                        "src": "7673:13:54",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 11781,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7673:7:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7672:15:54"
                  },
                  "returnParameters": {
                    "id": 11786,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11785,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11840,
                        "src": "7706:7:54",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 11784,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7706:7:54",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7705:9:54"
                  },
                  "scope": 11841,
                  "src": "7641:745:54",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 11842,
              "src": "397:7992:54"
            }
          ],
          "src": "32:8357:54"
        },
        "id": 54
      },
      "contracts/prize-strategy/multiple-winners/MultipleWinners.sol": {
        "ast": {
          "absolutePath": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol",
          "exportedSymbols": {
            "MultipleWinners": [
              12365
            ]
          },
          "id": 12366,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 11843,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "33:23:55"
            },
            {
              "id": 11844,
              "literals": [
                "experimental",
                "ABIEncoderV2"
              ],
              "nodeType": "PragmaDirective",
              "src": "57:33:55"
            },
            {
              "absolutePath": "contracts/prize-strategy/PrizeSplit.sol",
              "file": "../PrizeSplit.sol",
              "id": 11845,
              "nodeType": "ImportDirective",
              "scope": 12366,
              "sourceUnit": 11842,
              "src": "92:27:55",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/prize-strategy/PeriodicPrizeStrategy.sol",
              "file": "../PeriodicPrizeStrategy.sol",
              "id": 11846,
              "nodeType": "ImportDirective",
              "scope": 12366,
              "sourceUnit": 11392,
              "src": "120:38:55",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 11847,
                    "name": "PeriodicPrizeStrategy",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 11391,
                    "src": "188:21:55",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_PeriodicPrizeStrategy_$11391",
                      "typeString": "contract PeriodicPrizeStrategy"
                    }
                  },
                  "id": 11848,
                  "nodeType": "InheritanceSpecifier",
                  "src": "188:21:55"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 11849,
                    "name": "PrizeSplit",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 11841,
                    "src": "211:10:55",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_PrizeSplit_$11841",
                      "typeString": "contract PrizeSplit"
                    }
                  },
                  "id": 11850,
                  "nodeType": "InheritanceSpecifier",
                  "src": "211:10:55"
                }
              ],
              "contractDependencies": [
                130,
                931,
                1352,
                3627,
                11391,
                11841,
                16234,
                16265
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 12365,
              "linearizedBaseContracts": [
                12365,
                11841,
                11391,
                16234,
                16265,
                931,
                130,
                3627,
                1352
              ],
              "name": "MultipleWinners",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "id": 11852,
                  "mutability": "mutable",
                  "name": "__numberOfWinners",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 12365,
                  "src": "295:34:55",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 11851,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "295:7:55",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "functionSelector": "9dafafb0",
                  "id": 11854,
                  "mutability": "mutable",
                  "name": "splitExternalErc20Awards",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 12365,
                  "src": "403:36:55",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 11853,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "403:4:55",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "8e204c43",
                  "id": 11858,
                  "mutability": "mutable",
                  "name": "isBlocklisted",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 12365,
                  "src": "551:45:55",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                    "typeString": "mapping(address => bool)"
                  },
                  "typeName": {
                    "id": 11857,
                    "keyType": {
                      "id": 11855,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "559:7:55",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "551:24:55",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                      "typeString": "mapping(address => bool)"
                    },
                    "valueType": {
                      "id": 11856,
                      "name": "bool",
                      "nodeType": "ElementaryTypeName",
                      "src": "570:4:55",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "6f46f221",
                  "id": 11860,
                  "mutability": "mutable",
                  "name": "carryOverBlocklist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 12365,
                  "src": "709:30:55",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 11859,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "709:4:55",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "0faf125f",
                  "id": 11862,
                  "mutability": "mutable",
                  "name": "blocklistRetryCount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 12365,
                  "src": "835:34:55",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 11861,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "835:7:55",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 11863,
                    "nodeType": "StructuredDocumentation",
                    "src": "874:188:55",
                    "text": " @notice Emitted when splitExternalErc20Awards is toggled.\n @dev Emitted when splitExternalErc20Awards is toggled between awarding external ERC20 to main or all winners."
                  },
                  "id": 11867,
                  "name": "SplitExternalErc20AwardsSet",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 11866,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11865,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "splitExternalErc20Awards",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11867,
                        "src": "1099:29:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 11864,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "1099:4:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1098:31:55"
                  },
                  "src": "1065:65:55"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 11868,
                    "nodeType": "StructuredDocumentation",
                    "src": "1134:238:55",
                    "text": " @notice Emitted when numberOfWinners is set.\n @dev Emitted when numberOfWinners is set, which limits the maximum number of potentially selected winners.\n @param numberOfWinners Maximum potentially selected winners"
                  },
                  "id": 11872,
                  "name": "NumberOfWinnersSet",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 11871,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11870,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "numberOfWinners",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11872,
                        "src": "1400:23:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 11869,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1400:7:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1399:25:55"
                  },
                  "src": "1375:50:55"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 11873,
                    "nodeType": "StructuredDocumentation",
                    "src": "1429:225:55",
                    "text": " @notice Emitted when carryOverBlocklist is toggled.\n @dev Emitted when carryOverBlocklist is toggled for distribution of the primary and secondary prizes.\n @param carry Awarded prize carry over status"
                  },
                  "id": 11877,
                  "name": "BlocklistCarrySet",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 11876,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11875,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "carry",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11877,
                        "src": "1681:10:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 11874,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "1681:4:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1680:12:55"
                  },
                  "src": "1657:36:55"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 11878,
                    "nodeType": "StructuredDocumentation",
                    "src": "1697:289:55",
                    "text": " @notice Emitted when a user is blocked/unblocked from receiving a prize award.\n @dev Emitted when a contract owner blocks/unblocks user from award selection in _distribute.\n @param user Address of user to block or unblock\n @param isBlocked User blocked status"
                  },
                  "id": 11884,
                  "name": "BlocklistSet",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 11883,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11880,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11884,
                        "src": "2008:20:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 11879,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2008:7:55",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 11882,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "isBlocked",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11884,
                        "src": "2030:14:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 11881,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "2030:4:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2007:38:55"
                  },
                  "src": "1989:57:55"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 11885,
                    "nodeType": "StructuredDocumentation",
                    "src": "2050:266:55",
                    "text": " @notice Emitted when a new draw retry limit is set.\n @dev Emitted when a new draw retry limit is set. Retry limit is set to limit gas spendings if a blocked user continues to be drawn.\n @param count Number of winner selection retry attempts "
                  },
                  "id": 11889,
                  "name": "BlocklistRetryCountSet",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 11888,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11887,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "count",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11889,
                        "src": "2348:13:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 11886,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2348:7:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2347:15:55"
                  },
                  "src": "2319:44:55"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 11890,
                    "nodeType": "StructuredDocumentation",
                    "src": "2367:327:55",
                    "text": " @notice Emitted when the winner selection retry limit is reached during award distribution.\n @dev Emitted when the maximum number of users has not been selected after the blocklistRetryCount is reached.\n @param numberOfWinners Total number of winners selected before the blocklistRetryCount is reached."
                  },
                  "id": 11894,
                  "name": "RetryMaxLimitReached",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 11893,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11892,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "numberOfWinners",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11894,
                        "src": "2724:23:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 11891,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2724:7:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2723:25:55"
                  },
                  "src": "2697:52:55"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 11895,
                    "nodeType": "StructuredDocumentation",
                    "src": "2753:201:55",
                    "text": " @notice Emitted when no winner can be selected during the prize distribution. \n @dev Emitted when no winner can be selected in _distribute due to ticket.totalSupply() equaling zero."
                  },
                  "id": 11897,
                  "name": "NoWinners",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 11896,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2972:2:55"
                  },
                  "src": "2957:18:55"
                },
                {
                  "body": {
                    "id": 11937,
                    "nodeType": "Block",
                    "src": "3246:292:55",
                    "statements": [
                      {
                        "assignments": [
                          11919
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 11919,
                            "mutability": "mutable",
                            "name": "_externalErc20Awards",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 11937,
                            "src": "3252:47:55",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_contract$_IERC20Upgradeable_$1960_$dyn_memory_ptr",
                              "typeString": "contract IERC20Upgradeable[]"
                            },
                            "typeName": {
                              "baseType": {
                                "contractScope": null,
                                "id": 11917,
                                "name": "IERC20Upgradeable",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 1960,
                                "src": "3252:17:55",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                  "typeString": "contract IERC20Upgradeable"
                                }
                              },
                              "id": 11918,
                              "length": null,
                              "nodeType": "ArrayTypeName",
                              "src": "3252:19:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_IERC20Upgradeable_$1960_$dyn_storage_ptr",
                                "typeString": "contract IERC20Upgradeable[]"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 11920,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3252:47:55"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 11924,
                              "name": "_prizePeriodStart",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11899,
                              "src": "3346:17:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 11925,
                              "name": "_prizePeriodSeconds",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11901,
                              "src": "3371:19:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 11926,
                              "name": "_prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11903,
                              "src": "3398:10:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_PrizePool_$8751",
                                "typeString": "contract PrizePool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 11927,
                              "name": "_ticket",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11905,
                              "src": "3416:7:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_TicketInterface_$16152",
                                "typeString": "contract TicketInterface"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 11928,
                              "name": "_sponsorship",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11907,
                              "src": "3431:12:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 11929,
                              "name": "_rng",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11909,
                              "src": "3451:4:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_RNGInterface_$5531",
                                "typeString": "contract RNGInterface"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 11930,
                              "name": "_externalErc20Awards",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11919,
                              "src": "3463:20:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_IERC20Upgradeable_$1960_$dyn_memory_ptr",
                                "typeString": "contract IERC20Upgradeable[] memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_contract$_PrizePool_$8751",
                                "typeString": "contract PrizePool"
                              },
                              {
                                "typeIdentifier": "t_contract$_TicketInterface_$16152",
                                "typeString": "contract TicketInterface"
                              },
                              {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              },
                              {
                                "typeIdentifier": "t_contract$_RNGInterface_$5531",
                                "typeString": "contract RNGInterface"
                              },
                              {
                                "typeIdentifier": "t_array$_t_contract$_IERC20Upgradeable_$1960_$dyn_memory_ptr",
                                "typeString": "contract IERC20Upgradeable[] memory"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 11921,
                              "name": "PeriodicPrizeStrategy",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11391,
                              "src": "3306:21:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_PeriodicPrizeStrategy_$11391_$",
                                "typeString": "type(contract PeriodicPrizeStrategy)"
                              }
                            },
                            "id": 11923,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "initialize",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 9924,
                            "src": "3306:32:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$_t_uint256_$_t_contract$_PrizePool_$8751_$_t_contract$_TicketInterface_$16152_$_t_contract$_IERC20Upgradeable_$1960_$_t_contract$_RNGInterface_$5531_$_t_array$_t_contract$_IERC20Upgradeable_$1960_$dyn_memory_ptr_$returns$__$",
                              "typeString": "function (uint256,uint256,contract PrizePool,contract TicketInterface,contract IERC20Upgradeable,contract RNGInterface,contract IERC20Upgradeable[] memory)"
                            }
                          },
                          "id": 11931,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3306:183:55",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11932,
                        "nodeType": "ExpressionStatement",
                        "src": "3306:183:55"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 11934,
                              "name": "_numberOfWinners",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11911,
                              "src": "3516:16:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 11933,
                            "name": "_setNumberOfWinners",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12068,
                            "src": "3496:19:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 11935,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3496:37:55",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11936,
                        "nodeType": "ExpressionStatement",
                        "src": "3496:37:55"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "7f2be9fc",
                  "id": 11938,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 11914,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 11913,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "3234:11:55",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "3234:11:55"
                    }
                  ],
                  "name": "initializeMultipleWinners",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11912,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11899,
                        "mutability": "mutable",
                        "name": "_prizePeriodStart",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11938,
                        "src": "3020:25:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 11898,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3020:7:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 11901,
                        "mutability": "mutable",
                        "name": "_prizePeriodSeconds",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11938,
                        "src": "3051:27:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 11900,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3051:7:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 11903,
                        "mutability": "mutable",
                        "name": "_prizePool",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11938,
                        "src": "3084:20:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_PrizePool_$8751",
                          "typeString": "contract PrizePool"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 11902,
                          "name": "PrizePool",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 8751,
                          "src": "3084:9:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_PrizePool_$8751",
                            "typeString": "contract PrizePool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 11905,
                        "mutability": "mutable",
                        "name": "_ticket",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11938,
                        "src": "3110:23:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TicketInterface_$16152",
                          "typeString": "contract TicketInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 11904,
                          "name": "TicketInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16152,
                          "src": "3110:15:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TicketInterface_$16152",
                            "typeString": "contract TicketInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 11907,
                        "mutability": "mutable",
                        "name": "_sponsorship",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11938,
                        "src": "3139:30:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 11906,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "3139:17:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 11909,
                        "mutability": "mutable",
                        "name": "_rng",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11938,
                        "src": "3175:17:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_RNGInterface_$5531",
                          "typeString": "contract RNGInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 11908,
                          "name": "RNGInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 5531,
                          "src": "3175:12:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_RNGInterface_$5531",
                            "typeString": "contract RNGInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 11911,
                        "mutability": "mutable",
                        "name": "_numberOfWinners",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11938,
                        "src": "3198:24:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 11910,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3198:7:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3014:212:55"
                  },
                  "returnParameters": {
                    "id": 11915,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3246:0:55"
                  },
                  "scope": 12365,
                  "src": "2979:559:55",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 11965,
                    "nodeType": "Block",
                    "src": "3962:105:55",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 11956,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 11952,
                              "name": "isBlocklisted",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11858,
                              "src": "3968:13:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                                "typeString": "mapping(address => bool)"
                              }
                            },
                            "id": 11954,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 11953,
                              "name": "_user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11941,
                              "src": "3982:5:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "3968:20:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 11955,
                            "name": "_isBlocked",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11943,
                            "src": "3991:10:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "3968:33:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 11957,
                        "nodeType": "ExpressionStatement",
                        "src": "3968:33:55"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 11959,
                              "name": "_user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11941,
                              "src": "4026:5:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 11960,
                              "name": "_isBlocked",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11943,
                              "src": "4033:10:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            ],
                            "id": 11958,
                            "name": "BlocklistSet",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11884,
                            "src": "4013:12:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_bool_$returns$__$",
                              "typeString": "function (address,bool)"
                            }
                          },
                          "id": 11961,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4013:31:55",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11962,
                        "nodeType": "EmitStatement",
                        "src": "4008:36:55"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 11963,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "4058:4:55",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 11951,
                        "id": 11964,
                        "nodeType": "Return",
                        "src": "4051:11:55"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 11939,
                    "nodeType": "StructuredDocumentation",
                    "src": "3542:301:55",
                    "text": " @notice Block/unblock a user from winning during prize distribution.\n @dev Block/unblock a user from winning award in prize distribution by updating the isBlocklisted mapping.\n @param _user Address of blocked user\n @param _isBlocked Blocked Status (true or false) of user"
                  },
                  "functionSelector": "152d308c",
                  "id": 11966,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 11946,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 11945,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "3911:9:55",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "3911:9:55"
                    },
                    {
                      "arguments": null,
                      "id": 11948,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 11947,
                        "name": "requireAwardNotInProgress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11342,
                        "src": "3921:25:55",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "3921:25:55"
                    }
                  ],
                  "name": "setBlocklisted",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11944,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11941,
                        "mutability": "mutable",
                        "name": "_user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11966,
                        "src": "3870:13:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 11940,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3870:7:55",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 11943,
                        "mutability": "mutable",
                        "name": "_isBlocked",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11966,
                        "src": "3885:15:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 11942,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "3885:4:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3869:32:55"
                  },
                  "returnParameters": {
                    "id": 11951,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11950,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11966,
                        "src": "3956:4:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 11949,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "3956:4:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3955:6:55"
                  },
                  "scope": 12365,
                  "src": "3846:221:55",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 11988,
                    "nodeType": "Block",
                    "src": "4569:93:55",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 11980,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 11978,
                            "name": "carryOverBlocklist",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11860,
                            "src": "4575:18:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 11979,
                            "name": "_carry",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11969,
                            "src": "4596:6:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "4575:27:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 11981,
                        "nodeType": "ExpressionStatement",
                        "src": "4575:27:55"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 11983,
                              "name": "_carry",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11969,
                              "src": "4632:6:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            ],
                            "id": 11982,
                            "name": "BlocklistCarrySet",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11877,
                            "src": "4614:17:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_bool_$returns$__$",
                              "typeString": "function (bool)"
                            }
                          },
                          "id": 11984,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4614:25:55",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 11985,
                        "nodeType": "EmitStatement",
                        "src": "4609:30:55"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 11986,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "4653:4:55",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 11977,
                        "id": 11987,
                        "nodeType": "Return",
                        "src": "4646:11:55"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 11967,
                    "nodeType": "StructuredDocumentation",
                    "src": "4071:395:55",
                    "text": " @notice Toggle if an unawarded prize amount should be kept for the next draw or evenly distrubted to selected winners. \n @dev Toggles if the main prize (prizePool.captureAwardBalance) and secondary prizes (LootBox) should be kept for the next draw or evenly distrubted if maximum number of winners is not selected. \n @param _carry Award carry over status (true or false)"
                  },
                  "functionSelector": "a4e075ca",
                  "id": 11989,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 11972,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 11971,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "4518:9:55",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "4518:9:55"
                    },
                    {
                      "arguments": null,
                      "id": 11974,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 11973,
                        "name": "requireAwardNotInProgress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11342,
                        "src": "4528:25:55",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "4528:25:55"
                    }
                  ],
                  "name": "setCarryBlocklist",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11970,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11969,
                        "mutability": "mutable",
                        "name": "_carry",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11989,
                        "src": "4496:11:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 11968,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "4496:4:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4495:13:55"
                  },
                  "returnParameters": {
                    "id": 11977,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11976,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 11989,
                        "src": "4563:4:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 11975,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "4563:4:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4562:6:55"
                  },
                  "scope": 12365,
                  "src": "4469:193:55",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 12011,
                    "nodeType": "Block",
                    "src": "5103:99:55",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 12003,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 12001,
                            "name": "blocklistRetryCount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11862,
                            "src": "5109:19:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 12002,
                            "name": "_count",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11992,
                            "src": "5131:6:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "5109:28:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 12004,
                        "nodeType": "ExpressionStatement",
                        "src": "5109:28:55"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 12006,
                              "name": "_count",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11992,
                              "src": "5172:6:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 12005,
                            "name": "BlocklistRetryCountSet",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11889,
                            "src": "5149:22:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 12007,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5149:30:55",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 12008,
                        "nodeType": "EmitStatement",
                        "src": "5144:35:55"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 12009,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "5193:4:55",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 12000,
                        "id": 12010,
                        "nodeType": "Return",
                        "src": "5186:11:55"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 11990,
                    "nodeType": "StructuredDocumentation",
                    "src": "4666:326:55",
                    "text": " @notice Sets the number of attempts for winner selection if a blocked address is chosen.\n @dev Limits winner selection (ticket.draw) retries to avoid to gas limit reached errors. Increases the probability of not reaching the maximum number of winners if to low.\n @param _count Number of retry attempts"
                  },
                  "functionSelector": "52a30109",
                  "id": 12012,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 11995,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 11994,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "5052:9:55",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "5052:9:55"
                    },
                    {
                      "arguments": null,
                      "id": 11997,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 11996,
                        "name": "requireAwardNotInProgress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11342,
                        "src": "5062:25:55",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "5062:25:55"
                    }
                  ],
                  "name": "setBlocklistRetryCount",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 11993,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11992,
                        "mutability": "mutable",
                        "name": "_count",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12012,
                        "src": "5027:14:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 11991,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5027:7:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5026:16:55"
                  },
                  "returnParameters": {
                    "id": 12000,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 11999,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12012,
                        "src": "5097:4:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 11998,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "5097:4:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5096:6:55"
                  },
                  "scope": 12365,
                  "src": "4995:207:55",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 12030,
                    "nodeType": "Block",
                    "src": "5604:128:55",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 12024,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 12022,
                            "name": "splitExternalErc20Awards",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11854,
                            "src": "5610:24:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 12023,
                            "name": "_splitExternalErc20Awards",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12015,
                            "src": "5637:25:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "5610:52:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 12025,
                        "nodeType": "ExpressionStatement",
                        "src": "5610:52:55"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 12027,
                              "name": "splitExternalErc20Awards",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11854,
                              "src": "5702:24:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            ],
                            "id": 12026,
                            "name": "SplitExternalErc20AwardsSet",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11867,
                            "src": "5674:27:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_bool_$returns$__$",
                              "typeString": "function (bool)"
                            }
                          },
                          "id": 12028,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5674:53:55",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 12029,
                        "nodeType": "EmitStatement",
                        "src": "5669:58:55"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 12013,
                    "nodeType": "StructuredDocumentation",
                    "src": "5208:279:55",
                    "text": " @notice Toggle external ERC20 awards for all prize winners.\n @dev Toggle external ERC20 awards for all prize winners. If unset will distribute external ERC20 awards to main winner.\n @param _splitExternalErc20Awards Toggle splitting external ERC20 awards."
                  },
                  "functionSelector": "38a9b4b6",
                  "id": 12031,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 12018,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 12017,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "5568:9:55",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "5568:9:55"
                    },
                    {
                      "arguments": null,
                      "id": 12020,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 12019,
                        "name": "requireAwardNotInProgress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11342,
                        "src": "5578:25:55",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "5578:25:55"
                    }
                  ],
                  "name": "setSplitExternalErc20Awards",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12016,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12015,
                        "mutability": "mutable",
                        "name": "_splitExternalErc20Awards",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12031,
                        "src": "5527:30:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 12014,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "5527:4:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5526:32:55"
                  },
                  "returnParameters": {
                    "id": 12021,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "5604:0:55"
                  },
                  "scope": 12365,
                  "src": "5490:242:55",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 12045,
                    "nodeType": "Block",
                    "src": "5992:37:55",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 12042,
                              "name": "count",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12034,
                              "src": "6018:5:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 12041,
                            "name": "_setNumberOfWinners",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12068,
                            "src": "5998:19:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 12043,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5998:26:55",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 12044,
                        "nodeType": "ExpressionStatement",
                        "src": "5998:26:55"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 12032,
                    "nodeType": "StructuredDocumentation",
                    "src": "5736:165:55",
                    "text": " @notice Sets maximum number of winners.\n @dev Sets maximum number of winners per award distribution period.\n @param count Number of winners."
                  },
                  "functionSelector": "6dfb0386",
                  "id": 12046,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 12037,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 12036,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "5956:9:55",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "5956:9:55"
                    },
                    {
                      "arguments": null,
                      "id": 12039,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 12038,
                        "name": "requireAwardNotInProgress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 11342,
                        "src": "5966:25:55",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "5966:25:55"
                    }
                  ],
                  "name": "setNumberOfWinners",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12035,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12034,
                        "mutability": "mutable",
                        "name": "count",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12046,
                        "src": "5932:13:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12033,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5932:7:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5931:15:55"
                  },
                  "returnParameters": {
                    "id": 12040,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "5992:0:55"
                  },
                  "scope": 12365,
                  "src": "5904:125:55",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 12067,
                    "nodeType": "Block",
                    "src": "6206:132:55",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 12055,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 12053,
                                "name": "count",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 12049,
                                "src": "6220:5:55",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 12054,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "6228:1:55",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "6220:9:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4d756c7469706c6557696e6e6572732f77696e6e6572732d6774652d6f6e65",
                              "id": 12056,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "6231:33:55",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_87240c8dd0243cfc85fffc0710f016bfbab2b70a8a7ca46d48d53b2cd36e488d",
                                "typeString": "literal_string \"MultipleWinners/winners-gte-one\""
                              },
                              "value": "MultipleWinners/winners-gte-one"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_87240c8dd0243cfc85fffc0710f016bfbab2b70a8a7ca46d48d53b2cd36e488d",
                                "typeString": "literal_string \"MultipleWinners/winners-gte-one\""
                              }
                            ],
                            "id": 12052,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "6212:7:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 12057,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6212:53:55",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 12058,
                        "nodeType": "ExpressionStatement",
                        "src": "6212:53:55"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 12061,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 12059,
                            "name": "__numberOfWinners",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11852,
                            "src": "6272:17:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 12060,
                            "name": "count",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12049,
                            "src": "6292:5:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "6272:25:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 12062,
                        "nodeType": "ExpressionStatement",
                        "src": "6272:25:55"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 12064,
                              "name": "count",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12049,
                              "src": "6327:5:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 12063,
                            "name": "NumberOfWinnersSet",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 11872,
                            "src": "6308:18:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 12065,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6308:25:55",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 12066,
                        "nodeType": "EmitStatement",
                        "src": "6303:30:55"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 12047,
                    "nodeType": "StructuredDocumentation",
                    "src": "6034:116:55",
                    "text": " @dev Set the maximum number of winners. Must be greater than 0.\n @param count Number of winners."
                  },
                  "id": 12068,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_setNumberOfWinners",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12050,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12049,
                        "mutability": "mutable",
                        "name": "count",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12068,
                        "src": "6182:13:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12048,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6182:7:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6181:15:55"
                  },
                  "returnParameters": {
                    "id": 12051,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6206:0:55"
                  },
                  "scope": 12365,
                  "src": "6153:185:55",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 12076,
                    "nodeType": "Block",
                    "src": "6673:35:55",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 12074,
                          "name": "__numberOfWinners",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 11852,
                          "src": "6686:17:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 12073,
                        "id": 12075,
                        "nodeType": "Return",
                        "src": "6679:24:55"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 12069,
                    "nodeType": "StructuredDocumentation",
                    "src": "6342:269:55",
                    "text": " @notice Maximum number of winners per award distribution period\n @dev Read maximum number of winners per award distribution period from internal __numberOfWinners variable.\n @return __numberOfWinners The total number of winners per prize award."
                  },
                  "functionSelector": "8acfaca9",
                  "id": 12077,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "numberOfWinners",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12070,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6638:2:55"
                  },
                  "returnParameters": {
                    "id": 12073,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12072,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12077,
                        "src": "6664:7:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12071,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6664:7:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6663:9:55"
                  },
                  "scope": 12365,
                  "src": "6614:94:55",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    11485
                  ],
                  "body": {
                    "id": 12094,
                    "nodeType": "Block",
                    "src": "7177:50:55",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 12089,
                              "name": "target",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12080,
                              "src": "7195:6:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 12090,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12082,
                              "src": "7203:6:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 12091,
                              "name": "tokenIndex",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12084,
                              "src": "7211:10:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            ],
                            "id": 12088,
                            "name": "_awardToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10123,
                            "src": "7183:11:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_uint8_$returns$__$",
                              "typeString": "function (address,uint256,uint8)"
                            }
                          },
                          "id": 12092,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7183:39:55",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 12093,
                        "nodeType": "ExpressionStatement",
                        "src": "7183:39:55"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 12078,
                    "nodeType": "StructuredDocumentation",
                    "src": "6712:362:55",
                    "text": " @notice Award ticket or sponsorship tokens to prize split recipient.\n @dev Award ticket or sponsorship tokens to prize split recipient via the linked PrizePool contract.\n @param target Recipient of minted tokens\n @param amount Amount of minted tokens\n @param tokenIndex Index (0 or 1) of a token in the prizePool.tokens mapping"
                  },
                  "id": 12095,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_awardPrizeSplitAmount",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 12086,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "7159:8:55"
                  },
                  "parameters": {
                    "id": 12085,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12080,
                        "mutability": "mutable",
                        "name": "target",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12095,
                        "src": "7109:14:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 12079,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7109:7:55",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 12082,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12095,
                        "src": "7125:14:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12081,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7125:7:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 12084,
                        "mutability": "mutable",
                        "name": "tokenIndex",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12095,
                        "src": "7141:16:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 12083,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "7141:5:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7108:50:55"
                  },
                  "returnParameters": {
                    "id": 12087,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "7177:0:55"
                  },
                  "scope": 12365,
                  "src": "7077:150:55",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    9929
                  ],
                  "body": {
                    "id": 12363,
                    "nodeType": "Block",
                    "src": "7559:2325:55",
                    "statements": [
                      {
                        "assignments": [
                          12103
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 12103,
                            "mutability": "mutable",
                            "name": "prize",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 12363,
                            "src": "7565:13:55",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 12102,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "7565:7:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 12107,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 12104,
                              "name": "prizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9740,
                              "src": "7581:9:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_PrizePool_$8751",
                                "typeString": "contract PrizePool"
                              }
                            },
                            "id": 12105,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "captureAwardBalance",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 7376,
                            "src": "7581:29:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$__$returns$_t_uint256_$",
                              "typeString": "function () external returns (uint256)"
                            }
                          },
                          "id": 12106,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7581:31:55",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "7565:47:55"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 12112,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 12108,
                            "name": "prize",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12103,
                            "src": "7693:5:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 12110,
                                "name": "prize",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 12103,
                                "src": "7724:5:55",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 12109,
                              "name": "_distributePrizeSplits",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11840,
                              "src": "7701:22:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$_t_uint256_$",
                                "typeString": "function (uint256) returns (uint256)"
                              }
                            },
                            "id": 12111,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "7701:29:55",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "7693:37:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 12113,
                        "nodeType": "ExpressionStatement",
                        "src": "7693:37:55"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 12123,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 12117,
                                        "name": "ticket",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 9742,
                                        "src": "7767:6:55",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_TicketInterface_$16152",
                                          "typeString": "contract TicketInterface"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_TicketInterface_$16152",
                                          "typeString": "contract TicketInterface"
                                        }
                                      ],
                                      "id": 12116,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "7759:7:55",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 12115,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "7759:7:55",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 12118,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "7759:15:55",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "id": 12114,
                                  "name": "IERC20Upgradeable",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1960,
                                  "src": "7741:17:55",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_contract$_IERC20Upgradeable_$1960_$",
                                    "typeString": "type(contract IERC20Upgradeable)"
                                  }
                                },
                                "id": 12119,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "7741:34:55",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                  "typeString": "contract IERC20Upgradeable"
                                }
                              },
                              "id": 12120,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "totalSupply",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1891,
                              "src": "7741:46:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
                                "typeString": "function () view external returns (uint256)"
                              }
                            },
                            "id": 12121,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "7741:48:55",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 12122,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "7793:1:55",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "7741:53:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 12129,
                        "nodeType": "IfStatement",
                        "src": "7737:104:55",
                        "trueBody": {
                          "id": 12128,
                          "nodeType": "Block",
                          "src": "7796:45:55",
                          "statements": [
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "id": 12124,
                                  "name": "NoWinners",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 11897,
                                  "src": "7809:9:55",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$__$returns$__$",
                                    "typeString": "function ()"
                                  }
                                },
                                "id": 12125,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "7809:11:55",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 12126,
                              "nodeType": "EmitStatement",
                              "src": "7804:16:55"
                            },
                            {
                              "expression": null,
                              "functionReturnParameters": 12101,
                              "id": 12127,
                              "nodeType": "Return",
                              "src": "7828:7:55"
                            }
                          ]
                        }
                      },
                      {
                        "assignments": [
                          12131
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 12131,
                            "mutability": "mutable",
                            "name": "_carryOverBlocklistPrizes",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 12363,
                            "src": "7847:30:55",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "typeName": {
                              "id": 12130,
                              "name": "bool",
                              "nodeType": "ElementaryTypeName",
                              "src": "7847:4:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 12133,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 12132,
                          "name": "carryOverBlocklist",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 11860,
                          "src": "7880:18:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "7847:51:55"
                      },
                      {
                        "assignments": [
                          12135
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 12135,
                            "mutability": "mutable",
                            "name": "numberOfWinners",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 12363,
                            "src": "7958:23:55",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 12134,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "7958:7:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 12137,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 12136,
                          "name": "__numberOfWinners",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 11852,
                          "src": "7984:17:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "7958:43:55"
                      },
                      {
                        "assignments": [
                          12142
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 12142,
                            "mutability": "mutable",
                            "name": "winners",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 12363,
                            "src": "8007:24:55",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                              "typeString": "address[]"
                            },
                            "typeName": {
                              "baseType": {
                                "id": 12140,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "8007:7:55",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 12141,
                              "length": null,
                              "nodeType": "ArrayTypeName",
                              "src": "8007:9:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                                "typeString": "address[]"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 12148,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 12146,
                              "name": "numberOfWinners",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12135,
                              "src": "8048:15:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 12145,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "NewExpression",
                            "src": "8034:13:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_address_$dyn_memory_ptr_$",
                              "typeString": "function (uint256) pure returns (address[] memory)"
                            },
                            "typeName": {
                              "baseType": {
                                "id": 12143,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "8038:7:55",
                                "stateMutability": "nonpayable",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 12144,
                              "length": null,
                              "nodeType": "ArrayTypeName",
                              "src": "8038:9:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                                "typeString": "address[]"
                              }
                            }
                          },
                          "id": 12147,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8034:30:55",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                            "typeString": "address[] memory"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "8007:57:55"
                      },
                      {
                        "assignments": [
                          12150
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 12150,
                            "mutability": "mutable",
                            "name": "nextRandom",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 12363,
                            "src": "8070:18:55",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 12149,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "8070:7:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 12152,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 12151,
                          "name": "randomNumber",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 12098,
                          "src": "8091:12:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "8070:33:55"
                      },
                      {
                        "assignments": [
                          12154
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 12154,
                            "mutability": "mutable",
                            "name": "winnerCount",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 12363,
                            "src": "8109:19:55",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 12153,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "8109:7:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 12156,
                        "initialValue": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 12155,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "8131:1:55",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "8109:23:55"
                      },
                      {
                        "assignments": [
                          12158
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 12158,
                            "mutability": "mutable",
                            "name": "retries",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 12363,
                            "src": "8138:15:55",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 12157,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "8138:7:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 12160,
                        "initialValue": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 12159,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "8156:1:55",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "8138:19:55"
                      },
                      {
                        "assignments": [
                          12162
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 12162,
                            "mutability": "mutable",
                            "name": "_retryCount",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 12363,
                            "src": "8163:19:55",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 12161,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "8163:7:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 12164,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 12163,
                          "name": "blocklistRetryCount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 11862,
                          "src": "8185:19:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "8163:41:55"
                      },
                      {
                        "body": {
                          "id": 12229,
                          "nodeType": "Block",
                          "src": "8248:579:55",
                          "statements": [
                            {
                              "assignments": [
                                12169
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 12169,
                                  "mutability": "mutable",
                                  "name": "winner",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 12229,
                                  "src": "8256:14:55",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  "typeName": {
                                    "id": 12168,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "8256:7:55",
                                    "stateMutability": "nonpayable",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 12174,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 12172,
                                    "name": "nextRandom",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 12150,
                                    "src": "8285:10:55",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 12170,
                                    "name": "ticket",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 9742,
                                    "src": "8273:6:55",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_TicketInterface_$16152",
                                      "typeString": "contract TicketInterface"
                                    }
                                  },
                                  "id": 12171,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "draw",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 16151,
                                  "src": "8273:11:55",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_view$_t_uint256_$returns$_t_address_$",
                                    "typeString": "function (uint256) view external returns (address)"
                                  }
                                },
                                "id": 12173,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "8273:23:55",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "8256:40:55"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "id": 12178,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "UnaryOperation",
                                "operator": "!",
                                "prefix": true,
                                "src": "8309:22:55",
                                "subExpression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 12175,
                                    "name": "isBlocklisted",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 11858,
                                    "src": "8310:13:55",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                                      "typeString": "mapping(address => bool)"
                                    }
                                  },
                                  "id": 12177,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 12176,
                                    "name": "winner",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 12169,
                                    "src": "8324:6:55",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "8310:21:55",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": {
                                "condition": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 12190,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 12188,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "UnaryOperation",
                                    "operator": "++",
                                    "prefix": true,
                                    "src": "8393:9:55",
                                    "subExpression": {
                                      "argumentTypes": null,
                                      "id": 12187,
                                      "name": "retries",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 12158,
                                      "src": "8395:7:55",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": ">=",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 12189,
                                    "name": "_retryCount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 12162,
                                    "src": "8406:11:55",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "8393:24:55",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "falseBody": null,
                                "id": 12205,
                                "nodeType": "IfStatement",
                                "src": "8389:171:55",
                                "trueBody": {
                                  "id": 12204,
                                  "nodeType": "Block",
                                  "src": "8419:141:55",
                                  "statements": [
                                    {
                                      "eventCall": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 12192,
                                            "name": "winnerCount",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 12154,
                                            "src": "8455:11:55",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          ],
                                          "id": 12191,
                                          "name": "RetryMaxLimitReached",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 11894,
                                          "src": "8434:20:55",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$",
                                            "typeString": "function (uint256)"
                                          }
                                        },
                                        "id": 12193,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "8434:33:55",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_tuple$__$",
                                          "typeString": "tuple()"
                                        }
                                      },
                                      "id": 12194,
                                      "nodeType": "EmitStatement",
                                      "src": "8429:38:55"
                                    },
                                    {
                                      "condition": {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "id": 12197,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "id": 12195,
                                          "name": "winnerCount",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 12154,
                                          "src": "8480:11:55",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "==",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "hexValue": "30",
                                          "id": 12196,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "number",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "8495:1:55",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_rational_0_by_1",
                                            "typeString": "int_const 0"
                                          },
                                          "value": "0"
                                        },
                                        "src": "8480:16:55",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        }
                                      },
                                      "falseBody": null,
                                      "id": 12202,
                                      "nodeType": "IfStatement",
                                      "src": "8477:60:55",
                                      "trueBody": {
                                        "id": 12201,
                                        "nodeType": "Block",
                                        "src": "8498:39:55",
                                        "statements": [
                                          {
                                            "eventCall": {
                                              "argumentTypes": null,
                                              "arguments": [],
                                              "expression": {
                                                "argumentTypes": [],
                                                "id": 12198,
                                                "name": "NoWinners",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 11897,
                                                "src": "8515:9:55",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_function_event_nonpayable$__$returns$__$",
                                                  "typeString": "function ()"
                                                }
                                              },
                                              "id": 12199,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "kind": "functionCall",
                                              "lValueRequested": false,
                                              "names": [],
                                              "nodeType": "FunctionCall",
                                              "src": "8515:11:55",
                                              "tryCall": false,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_tuple$__$",
                                                "typeString": "tuple()"
                                              }
                                            },
                                            "id": 12200,
                                            "nodeType": "EmitStatement",
                                            "src": "8510:16:55"
                                          }
                                        ]
                                      }
                                    },
                                    {
                                      "id": 12203,
                                      "nodeType": "Break",
                                      "src": "8546:5:55"
                                    }
                                  ]
                                }
                              },
                              "id": 12206,
                              "nodeType": "IfStatement",
                              "src": "8305:255:55",
                              "trueBody": {
                                "id": 12186,
                                "nodeType": "Block",
                                "src": "8333:50:55",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 12184,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "baseExpression": {
                                          "argumentTypes": null,
                                          "id": 12179,
                                          "name": "winners",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 12142,
                                          "src": "8343:7:55",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                            "typeString": "address[] memory"
                                          }
                                        },
                                        "id": 12182,
                                        "indexExpression": {
                                          "argumentTypes": null,
                                          "id": 12181,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "nodeType": "UnaryOperation",
                                          "operator": "++",
                                          "prefix": false,
                                          "src": "8351:13:55",
                                          "subExpression": {
                                            "argumentTypes": null,
                                            "id": 12180,
                                            "name": "winnerCount",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 12154,
                                            "src": "8351:11:55",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": true,
                                        "nodeType": "IndexAccess",
                                        "src": "8343:22:55",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "id": 12183,
                                        "name": "winner",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 12169,
                                        "src": "8368:6:55",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      },
                                      "src": "8343:31:55",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "id": 12185,
                                    "nodeType": "ExpressionStatement",
                                    "src": "8343:31:55"
                                  }
                                ]
                              }
                            },
                            {
                              "assignments": [
                                12208
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 12208,
                                  "mutability": "mutable",
                                  "name": "nextRandomHash",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 12229,
                                  "src": "8688:22:55",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  "typeName": {
                                    "id": 12207,
                                    "name": "bytes32",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "8688:7:55",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 12221,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "id": 12218,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "commonType": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          "id": 12214,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftExpression": {
                                            "argumentTypes": null,
                                            "id": 12212,
                                            "name": "nextRandom",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 12150,
                                            "src": "8740:10:55",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "nodeType": "BinaryOperation",
                                          "operator": "+",
                                          "rightExpression": {
                                            "argumentTypes": null,
                                            "hexValue": "343939",
                                            "id": 12213,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "kind": "number",
                                            "lValueRequested": false,
                                            "nodeType": "Literal",
                                            "src": "8753:3:55",
                                            "subdenomination": null,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_rational_499_by_1",
                                              "typeString": "int_const 499"
                                            },
                                            "value": "499"
                                          },
                                          "src": "8740:16:55",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "+",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "commonType": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          "id": 12217,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftExpression": {
                                            "argumentTypes": null,
                                            "id": 12215,
                                            "name": "winnerCount",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 12154,
                                            "src": "8759:11:55",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "nodeType": "BinaryOperation",
                                          "operator": "*",
                                          "rightExpression": {
                                            "argumentTypes": null,
                                            "hexValue": "353231",
                                            "id": 12216,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "kind": "number",
                                            "lValueRequested": false,
                                            "nodeType": "Literal",
                                            "src": "8771:3:55",
                                            "subdenomination": null,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_rational_521_by_1",
                                              "typeString": "int_const 521"
                                            },
                                            "value": "521"
                                          },
                                          "src": "8759:15:55",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "src": "8740:34:55",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 12210,
                                        "name": "abi",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -1,
                                        "src": "8723:3:55",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_magic_abi",
                                          "typeString": "abi"
                                        }
                                      },
                                      "id": 12211,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "memberName": "encodePacked",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": null,
                                      "src": "8723:16:55",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                                        "typeString": "function () pure returns (bytes memory)"
                                      }
                                    },
                                    "id": 12219,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "8723:52:55",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes_memory_ptr",
                                      "typeString": "bytes memory"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes_memory_ptr",
                                      "typeString": "bytes memory"
                                    }
                                  ],
                                  "id": 12209,
                                  "name": "keccak256",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -8,
                                  "src": "8713:9:55",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                    "typeString": "function (bytes memory) pure returns (bytes32)"
                                  }
                                },
                                "id": 12220,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "8713:63:55",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "8688:88:55"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 12227,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 12222,
                                  "name": "nextRandom",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 12150,
                                  "src": "8784:10:55",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 12225,
                                      "name": "nextRandomHash",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 12208,
                                      "src": "8805:14:55",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                      }
                                    ],
                                    "id": 12224,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "8797:7:55",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_uint256_$",
                                      "typeString": "type(uint256)"
                                    },
                                    "typeName": {
                                      "id": 12223,
                                      "name": "uint256",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "8797:7:55",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 12226,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "8797:23:55",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "8784:36:55",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 12228,
                              "nodeType": "ExpressionStatement",
                              "src": "8784:36:55"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 12167,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 12165,
                            "name": "winnerCount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12154,
                            "src": "8217:11:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 12166,
                            "name": "numberOfWinners",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12135,
                            "src": "8231:15:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "8217:29:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 12230,
                        "nodeType": "WhileStatement",
                        "src": "8210:617:55"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 12232,
                                "name": "winners",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 12142,
                                "src": "8906:7:55",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                  "typeString": "address[] memory"
                                }
                              },
                              "id": 12234,
                              "indexExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 12233,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "8914:1:55",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "8906:10:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 12231,
                            "name": "_awardExternalErc721s",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 10271,
                            "src": "8884:21:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 12235,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8884:33:55",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 12236,
                        "nodeType": "ExpressionStatement",
                        "src": "8884:33:55"
                      },
                      {
                        "assignments": [
                          12238
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 12238,
                            "mutability": "mutable",
                            "name": "prizeShare",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 12363,
                            "src": "8973:18:55",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 12237,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "8973:7:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 12249,
                        "initialValue": {
                          "argumentTypes": null,
                          "condition": {
                            "argumentTypes": null,
                            "id": 12239,
                            "name": "_carryOverBlocklistPrizes",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12131,
                            "src": "8994:25:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 12246,
                                "name": "winnerCount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 12154,
                                "src": "9061:11:55",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 12244,
                                "name": "prize",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 12103,
                                "src": "9051:5:55",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 12245,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "div",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1191,
                              "src": "9051:9:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 12247,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "9051:22:55",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 12248,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "Conditional",
                          "src": "8994:79:55",
                          "trueExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 12242,
                                "name": "numberOfWinners",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 12135,
                                "src": "9032:15:55",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 12240,
                                "name": "prize",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 12103,
                                "src": "9022:5:55",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 12241,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "div",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1191,
                              "src": "9022:9:55",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 12243,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "9022:26:55",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "8973:100:55"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 12252,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 12250,
                            "name": "prizeShare",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12238,
                            "src": "9083:10:55",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": ">",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 12251,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "9096:1:55",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "9083:14:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 12273,
                        "nodeType": "IfStatement",
                        "src": "9079:129:55",
                        "trueBody": {
                          "id": 12272,
                          "nodeType": "Block",
                          "src": "9099:109:55",
                          "statements": [
                            {
                              "body": {
                                "id": 12270,
                                "nodeType": "Block",
                                "src": "9146:56:55",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "baseExpression": {
                                            "argumentTypes": null,
                                            "id": 12264,
                                            "name": "winners",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 12142,
                                            "src": "9170:7:55",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                              "typeString": "address[] memory"
                                            }
                                          },
                                          "id": 12266,
                                          "indexExpression": {
                                            "argumentTypes": null,
                                            "id": 12265,
                                            "name": "i",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 12254,
                                            "src": "9178:1:55",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "nodeType": "IndexAccess",
                                          "src": "9170:10:55",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 12267,
                                          "name": "prizeShare",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 12238,
                                          "src": "9182:10:55",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          },
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "id": 12263,
                                        "name": "_awardTickets",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 10079,
                                        "src": "9156:13:55",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                                          "typeString": "function (address,uint256)"
                                        }
                                      },
                                      "id": 12268,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "9156:37:55",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 12269,
                                    "nodeType": "ExpressionStatement",
                                    "src": "9156:37:55"
                                  }
                                ]
                              },
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 12259,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 12257,
                                  "name": "i",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 12254,
                                  "src": "9124:1:55",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "<",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 12258,
                                  "name": "winnerCount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 12154,
                                  "src": "9128:11:55",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "9124:15:55",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "id": 12271,
                              "initializationExpression": {
                                "assignments": [
                                  12254
                                ],
                                "declarations": [
                                  {
                                    "constant": false,
                                    "id": 12254,
                                    "mutability": "mutable",
                                    "name": "i",
                                    "nodeType": "VariableDeclaration",
                                    "overrides": null,
                                    "scope": 12271,
                                    "src": "9112:6:55",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "typeName": {
                                      "id": 12253,
                                      "name": "uint",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "9112:4:55",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "value": null,
                                    "visibility": "internal"
                                  }
                                ],
                                "id": 12256,
                                "initialValue": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 12255,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "9121:1:55",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "nodeType": "VariableDeclarationStatement",
                                "src": "9112:10:55"
                              },
                              "loopExpression": {
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 12261,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "UnaryOperation",
                                  "operator": "++",
                                  "prefix": false,
                                  "src": "9141:3:55",
                                  "subExpression": {
                                    "argumentTypes": null,
                                    "id": 12260,
                                    "name": "i",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 12254,
                                    "src": "9141:1:55",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 12262,
                                "nodeType": "ExpressionStatement",
                                "src": "9141:3:55"
                              },
                              "nodeType": "ForStatement",
                              "src": "9107:95:55"
                            }
                          ]
                        }
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "id": 12274,
                          "name": "splitExternalErc20Awards",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 11854,
                          "src": "9218:24:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 12361,
                          "nodeType": "Block",
                          "src": "9833:47:55",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 12356,
                                      "name": "winners",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 12142,
                                      "src": "9862:7:55",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                        "typeString": "address[] memory"
                                      }
                                    },
                                    "id": 12358,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "hexValue": "30",
                                      "id": 12357,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "9870:1:55",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      },
                                      "value": "0"
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "9862:10:55",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "id": 12355,
                                  "name": "_awardExternalErc20s",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 10197,
                                  "src": "9841:20:55",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                                    "typeString": "function (address)"
                                  }
                                },
                                "id": 12359,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "9841:32:55",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 12360,
                              "nodeType": "ExpressionStatement",
                              "src": "9841:32:55"
                            }
                          ]
                        },
                        "id": 12362,
                        "nodeType": "IfStatement",
                        "src": "9214:666:55",
                        "trueBody": {
                          "id": 12354,
                          "nodeType": "Block",
                          "src": "9244:583:55",
                          "statements": [
                            {
                              "assignments": [
                                12276
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 12276,
                                  "mutability": "mutable",
                                  "name": "currentToken",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 12354,
                                  "src": "9252:20:55",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  "typeName": {
                                    "id": 12275,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "9252:7:55",
                                    "stateMutability": "nonpayable",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 12280,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 12277,
                                    "name": "externalErc20s",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 9757,
                                    "src": "9275:14:55",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                      "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                                    }
                                  },
                                  "id": 12278,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "start",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 16373,
                                  "src": "9275:20:55",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$_t_struct$_Mapping_$16337_storage_ptr_$returns$_t_address_$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                                    "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer) view returns (address)"
                                  }
                                },
                                "id": 12279,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "9275:22:55",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "9252:45:55"
                            },
                            {
                              "body": {
                                "id": 12352,
                                "nodeType": "Block",
                                "src": "9380:441:55",
                                "statements": [
                                  {
                                    "assignments": [
                                      12294
                                    ],
                                    "declarations": [
                                      {
                                        "constant": false,
                                        "id": 12294,
                                        "mutability": "mutable",
                                        "name": "balance",
                                        "nodeType": "VariableDeclaration",
                                        "overrides": null,
                                        "scope": 12352,
                                        "src": "9390:15:55",
                                        "stateVariable": false,
                                        "storageLocation": "default",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "typeName": {
                                          "id": 12293,
                                          "name": "uint256",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "9390:7:55",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "value": null,
                                        "visibility": "internal"
                                      }
                                    ],
                                    "id": 12304,
                                    "initialValue": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "id": 12301,
                                              "name": "prizePool",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 9740,
                                              "src": "9458:9:55",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_contract$_PrizePool_$8751",
                                                "typeString": "contract PrizePool"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_contract$_PrizePool_$8751",
                                                "typeString": "contract PrizePool"
                                              }
                                            ],
                                            "id": 12300,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": true,
                                            "lValueRequested": false,
                                            "nodeType": "ElementaryTypeNameExpression",
                                            "src": "9450:7:55",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_address_$",
                                              "typeString": "type(address)"
                                            },
                                            "typeName": {
                                              "id": 12299,
                                              "name": "address",
                                              "nodeType": "ElementaryTypeName",
                                              "src": "9450:7:55",
                                              "typeDescriptions": {
                                                "typeIdentifier": null,
                                                "typeString": null
                                              }
                                            }
                                          },
                                          "id": 12302,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "typeConversion",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "9450:18:55",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "id": 12296,
                                              "name": "currentToken",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 12276,
                                              "src": "9426:12:55",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                              }
                                            ],
                                            "id": 12295,
                                            "name": "IERC20Upgradeable",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 1960,
                                            "src": "9408:17:55",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_type$_t_contract$_IERC20Upgradeable_$1960_$",
                                              "typeString": "type(contract IERC20Upgradeable)"
                                            }
                                          },
                                          "id": 12297,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "typeConversion",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "9408:31:55",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                            "typeString": "contract IERC20Upgradeable"
                                          }
                                        },
                                        "id": 12298,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "balanceOf",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 1899,
                                        "src": "9408:41:55",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                          "typeString": "function (address) view external returns (uint256)"
                                        }
                                      },
                                      "id": 12303,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "9408:61:55",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "9390:79:55"
                                  },
                                  {
                                    "assignments": [
                                      12306
                                    ],
                                    "declarations": [
                                      {
                                        "constant": false,
                                        "id": 12306,
                                        "mutability": "mutable",
                                        "name": "split",
                                        "nodeType": "VariableDeclaration",
                                        "overrides": null,
                                        "scope": 12352,
                                        "src": "9479:13:55",
                                        "stateVariable": false,
                                        "storageLocation": "default",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "typeName": {
                                          "id": 12305,
                                          "name": "uint256",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "9479:7:55",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "value": null,
                                        "visibility": "internal"
                                      }
                                    ],
                                    "id": 12317,
                                    "initialValue": {
                                      "argumentTypes": null,
                                      "condition": {
                                        "argumentTypes": null,
                                        "id": 12307,
                                        "name": "_carryOverBlocklistPrizes",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 12131,
                                        "src": "9495:25:55",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        }
                                      },
                                      "falseExpression": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 12314,
                                            "name": "winnerCount",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 12154,
                                            "src": "9566:11:55",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 12312,
                                            "name": "balance",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 12294,
                                            "src": "9554:7:55",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 12313,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "div",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 1191,
                                          "src": "9554:11:55",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                            "typeString": "function (uint256,uint256) pure returns (uint256)"
                                          }
                                        },
                                        "id": 12315,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "9554:24:55",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 12316,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "Conditional",
                                      "src": "9495:83:55",
                                      "trueExpression": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 12310,
                                            "name": "numberOfWinners",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 12135,
                                            "src": "9535:15:55",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 12308,
                                            "name": "balance",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 12294,
                                            "src": "9523:7:55",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 12309,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "div",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 1191,
                                          "src": "9523:11:55",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                            "typeString": "function (uint256,uint256) pure returns (uint256)"
                                          }
                                        },
                                        "id": 12311,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "9523:28:55",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "9479:99:55"
                                  },
                                  {
                                    "condition": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "id": 12320,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "id": 12318,
                                        "name": "split",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 12306,
                                        "src": "9592:5:55",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": ">",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "hexValue": "30",
                                        "id": 12319,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "number",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "9600:1:55",
                                        "subdenomination": null,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_rational_0_by_1",
                                          "typeString": "int_const 0"
                                        },
                                        "value": "0"
                                      },
                                      "src": "9592:9:55",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "falseBody": null,
                                    "id": 12344,
                                    "nodeType": "IfStatement",
                                    "src": "9588:167:55",
                                    "trueBody": {
                                      "id": 12343,
                                      "nodeType": "Block",
                                      "src": "9603:152:55",
                                      "statements": [
                                        {
                                          "body": {
                                            "id": 12341,
                                            "nodeType": "Block",
                                            "src": "9657:88:55",
                                            "statements": [
                                              {
                                                "expression": {
                                                  "argumentTypes": null,
                                                  "arguments": [
                                                    {
                                                      "argumentTypes": null,
                                                      "baseExpression": {
                                                        "argumentTypes": null,
                                                        "id": 12334,
                                                        "name": "winners",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 12142,
                                                        "src": "9700:7:55",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                                          "typeString": "address[] memory"
                                                        }
                                                      },
                                                      "id": 12336,
                                                      "indexExpression": {
                                                        "argumentTypes": null,
                                                        "id": 12335,
                                                        "name": "i",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 12322,
                                                        "src": "9708:1:55",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_uint256",
                                                          "typeString": "uint256"
                                                        }
                                                      },
                                                      "isConstant": false,
                                                      "isLValue": true,
                                                      "isPure": false,
                                                      "lValueRequested": false,
                                                      "nodeType": "IndexAccess",
                                                      "src": "9700:10:55",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                      }
                                                    },
                                                    {
                                                      "argumentTypes": null,
                                                      "id": 12337,
                                                      "name": "currentToken",
                                                      "nodeType": "Identifier",
                                                      "overloadedDeclarations": [],
                                                      "referencedDeclaration": 12276,
                                                      "src": "9712:12:55",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                      }
                                                    },
                                                    {
                                                      "argumentTypes": null,
                                                      "id": 12338,
                                                      "name": "split",
                                                      "nodeType": "Identifier",
                                                      "overloadedDeclarations": [],
                                                      "referencedDeclaration": 12306,
                                                      "src": "9726:5:55",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      }
                                                    }
                                                  ],
                                                  "expression": {
                                                    "argumentTypes": [
                                                      {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                      },
                                                      {
                                                        "typeIdentifier": "t_address",
                                                        "typeString": "address"
                                                      },
                                                      {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      }
                                                    ],
                                                    "expression": {
                                                      "argumentTypes": null,
                                                      "id": 12331,
                                                      "name": "prizePool",
                                                      "nodeType": "Identifier",
                                                      "overloadedDeclarations": [],
                                                      "referencedDeclaration": 9740,
                                                      "src": "9671:9:55",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_contract$_PrizePool_$8751",
                                                        "typeString": "contract PrizePool"
                                                      }
                                                    },
                                                    "id": 12333,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "awardExternalERC20",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": 7544,
                                                    "src": "9671:28:55",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                                                      "typeString": "function (address,address,uint256) external"
                                                    }
                                                  },
                                                  "id": 12339,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "kind": "functionCall",
                                                  "lValueRequested": false,
                                                  "names": [],
                                                  "nodeType": "FunctionCall",
                                                  "src": "9671:61:55",
                                                  "tryCall": false,
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_tuple$__$",
                                                    "typeString": "tuple()"
                                                  }
                                                },
                                                "id": 12340,
                                                "nodeType": "ExpressionStatement",
                                                "src": "9671:61:55"
                                              }
                                            ]
                                          },
                                          "condition": {
                                            "argumentTypes": null,
                                            "commonType": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            },
                                            "id": 12327,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftExpression": {
                                              "argumentTypes": null,
                                              "id": 12325,
                                              "name": "i",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 12322,
                                              "src": "9635:1:55",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "nodeType": "BinaryOperation",
                                            "operator": "<",
                                            "rightExpression": {
                                              "argumentTypes": null,
                                              "id": 12326,
                                              "name": "winnerCount",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 12154,
                                              "src": "9639:11:55",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "src": "9635:15:55",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_bool",
                                              "typeString": "bool"
                                            }
                                          },
                                          "id": 12342,
                                          "initializationExpression": {
                                            "assignments": [
                                              12322
                                            ],
                                            "declarations": [
                                              {
                                                "constant": false,
                                                "id": 12322,
                                                "mutability": "mutable",
                                                "name": "i",
                                                "nodeType": "VariableDeclaration",
                                                "overrides": null,
                                                "scope": 12342,
                                                "src": "9620:9:55",
                                                "stateVariable": false,
                                                "storageLocation": "default",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                },
                                                "typeName": {
                                                  "id": 12321,
                                                  "name": "uint256",
                                                  "nodeType": "ElementaryTypeName",
                                                  "src": "9620:7:55",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                },
                                                "value": null,
                                                "visibility": "internal"
                                              }
                                            ],
                                            "id": 12324,
                                            "initialValue": {
                                              "argumentTypes": null,
                                              "hexValue": "30",
                                              "id": 12323,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": true,
                                              "kind": "number",
                                              "lValueRequested": false,
                                              "nodeType": "Literal",
                                              "src": "9632:1:55",
                                              "subdenomination": null,
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_rational_0_by_1",
                                                "typeString": "int_const 0"
                                              },
                                              "value": "0"
                                            },
                                            "nodeType": "VariableDeclarationStatement",
                                            "src": "9620:13:55"
                                          },
                                          "loopExpression": {
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 12329,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "nodeType": "UnaryOperation",
                                              "operator": "++",
                                              "prefix": false,
                                              "src": "9652:3:55",
                                              "subExpression": {
                                                "argumentTypes": null,
                                                "id": 12328,
                                                "name": "i",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 12322,
                                                "src": "9652:1:55",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "id": 12330,
                                            "nodeType": "ExpressionStatement",
                                            "src": "9652:3:55"
                                          },
                                          "nodeType": "ForStatement",
                                          "src": "9615:130:55"
                                        }
                                      ]
                                    }
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 12350,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "id": 12345,
                                        "name": "currentToken",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 12276,
                                        "src": "9764:12:55",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 12348,
                                            "name": "currentToken",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 12276,
                                            "src": "9799:12:55",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 12346,
                                            "name": "externalErc20s",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 9757,
                                            "src": "9779:14:55",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                              "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                                            }
                                          },
                                          "id": 12347,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "next",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 16388,
                                          "src": "9779:19:55",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_internal_view$_t_struct$_Mapping_$16337_storage_ptr_$_t_address_$returns$_t_address_$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                                            "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer,address) view returns (address)"
                                          }
                                        },
                                        "id": 12349,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "9779:33:55",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      },
                                      "src": "9764:48:55",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "id": 12351,
                                    "nodeType": "ExpressionStatement",
                                    "src": "9764:48:55"
                                  }
                                ]
                              },
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                },
                                "id": 12292,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  "id": 12286,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 12281,
                                    "name": "currentToken",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 12276,
                                    "src": "9312:12:55",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "!=",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "hexValue": "30",
                                        "id": 12284,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "number",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "9336:1:55",
                                        "subdenomination": null,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_rational_0_by_1",
                                          "typeString": "int_const 0"
                                        },
                                        "value": "0"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_rational_0_by_1",
                                          "typeString": "int_const 0"
                                        }
                                      ],
                                      "id": 12283,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "9328:7:55",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 12282,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "9328:7:55",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 12285,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "9328:10:55",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  },
                                  "src": "9312:26:55",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "&&",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  "id": 12291,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 12287,
                                    "name": "currentToken",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 12276,
                                    "src": "9342:12:55",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "!=",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "arguments": [],
                                    "expression": {
                                      "argumentTypes": [],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 12288,
                                        "name": "externalErc20s",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 9757,
                                        "src": "9358:14:55",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                          "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                                        }
                                      },
                                      "id": 12289,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "end",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 16398,
                                      "src": "9358:18:55",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_pure$_t_struct$_Mapping_$16337_storage_ptr_$returns$_t_address_$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                                        "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer) pure returns (address)"
                                      }
                                    },
                                    "id": 12290,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "9358:20:55",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "src": "9342:36:55",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "src": "9312:66:55",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "id": 12353,
                              "nodeType": "WhileStatement",
                              "src": "9305:516:55"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 12096,
                    "nodeType": "StructuredDocumentation",
                    "src": "7231:264:55",
                    "text": " @notice Distributes captured award balance to winners\n @dev Distributes the captured award balance to the main winner and secondary winners if __numberOfWinners greater than 1.\n @param randomNumber Random number seed used to select winners"
                  },
                  "id": 12364,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_distribute",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 12100,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "7550:8:55"
                  },
                  "parameters": {
                    "id": 12099,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12098,
                        "mutability": "mutable",
                        "name": "randomNumber",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12364,
                        "src": "7519:20:55",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12097,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7519:7:55",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7518:22:55"
                  },
                  "returnParameters": {
                    "id": 12101,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "7559:0:55"
                  },
                  "scope": 12365,
                  "src": "7498:2386:55",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 12366,
              "src": "160:9726:55"
            }
          ],
          "src": "33:9854:55"
        },
        "id": 55
      },
      "contracts/prize-strategy/multiple-winners/MultipleWinnersProxyFactory.sol": {
        "ast": {
          "absolutePath": "contracts/prize-strategy/multiple-winners/MultipleWinnersProxyFactory.sol",
          "exportedSymbols": {
            "MultipleWinnersProxyFactory": [
              12401
            ]
          },
          "id": 12402,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 12367,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:56"
            },
            {
              "absolutePath": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol",
              "file": "./MultipleWinners.sol",
              "id": 12368,
              "nodeType": "ImportDirective",
              "scope": 12402,
              "sourceUnit": 12366,
              "src": "62:31:56",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/external/openzeppelin/ProxyFactory.sol",
              "file": "../../external/openzeppelin/ProxyFactory.sol",
              "id": 12369,
              "nodeType": "ImportDirective",
              "scope": 12402,
              "sourceUnit": 6617,
              "src": "94:54:56",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 12371,
                    "name": "ProxyFactory",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 6616,
                    "src": "287:12:56",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ProxyFactory_$6616",
                      "typeString": "contract ProxyFactory"
                    }
                  },
                  "id": 12372,
                  "nodeType": "InheritanceSpecifier",
                  "src": "287:12:56"
                }
              ],
              "contractDependencies": [
                6616,
                12365
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 12370,
                "nodeType": "StructuredDocumentation",
                "src": "150:97:56",
                "text": "@title Creates a minimal proxy to the MultipleWinners prize strategy.  Very cheap to deploy."
              },
              "fullyImplemented": true,
              "id": 12401,
              "linearizedBaseContracts": [
                12401,
                6616
              ],
              "name": "MultipleWinnersProxyFactory",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "functionSelector": "022ec095",
                  "id": 12374,
                  "mutability": "mutable",
                  "name": "instance",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 12401,
                  "src": "305:31:56",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                    "typeString": "contract MultipleWinners"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 12373,
                    "name": "MultipleWinners",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 12365,
                    "src": "305:15:56",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                      "typeString": "contract MultipleWinners"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 12383,
                    "nodeType": "Block",
                    "src": "363:43:56",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 12381,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 12377,
                            "name": "instance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12374,
                            "src": "369:8:56",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                              "typeString": "contract MultipleWinners"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 12379,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "380:19:56",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_creation_nonpayable$__$returns$_t_contract$_MultipleWinners_$12365_$",
                                "typeString": "function () returns (contract MultipleWinners)"
                              },
                              "typeName": {
                                "contractScope": null,
                                "id": 12378,
                                "name": "MultipleWinners",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 12365,
                                "src": "384:15:56",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                  "typeString": "contract MultipleWinners"
                                }
                              }
                            },
                            "id": 12380,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "380:21:56",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                              "typeString": "contract MultipleWinners"
                            }
                          },
                          "src": "369:32:56",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                            "typeString": "contract MultipleWinners"
                          }
                        },
                        "id": 12382,
                        "nodeType": "ExpressionStatement",
                        "src": "369:32:56"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 12384,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12375,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "353:2:56"
                  },
                  "returnParameters": {
                    "id": 12376,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "363:0:56"
                  },
                  "scope": 12401,
                  "src": "341:65:56",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 12399,
                    "nodeType": "Block",
                    "src": "463:71:56",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 12393,
                                      "name": "instance",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 12374,
                                      "src": "514:8:56",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                        "typeString": "contract MultipleWinners"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                                        "typeString": "contract MultipleWinners"
                                      }
                                    ],
                                    "id": 12392,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "506:7:56",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 12391,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "506:7:56",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 12394,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "506:17:56",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "hexValue": "",
                                  "id": 12395,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "525:2:56",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                    "typeString": "literal_string \"\""
                                  },
                                  "value": ""
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                    "typeString": "literal_string \"\""
                                  }
                                ],
                                "id": 12390,
                                "name": "deployMinimal",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6615,
                                "src": "492:13:56",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_address_$",
                                  "typeString": "function (address,bytes memory) returns (address)"
                                }
                              },
                              "id": 12396,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "492:36:56",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 12389,
                            "name": "MultipleWinners",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12365,
                            "src": "476:15:56",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_MultipleWinners_$12365_$",
                              "typeString": "type(contract MultipleWinners)"
                            }
                          },
                          "id": 12397,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "476:53:56",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                            "typeString": "contract MultipleWinners"
                          }
                        },
                        "functionReturnParameters": 12388,
                        "id": 12398,
                        "nodeType": "Return",
                        "src": "469:60:56"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "efc81a8c",
                  "id": 12400,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "create",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12385,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "425:2:56"
                  },
                  "returnParameters": {
                    "id": 12388,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12387,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12400,
                        "src": "446:15:56",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                          "typeString": "contract MultipleWinners"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 12386,
                          "name": "MultipleWinners",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 12365,
                          "src": "446:15:56",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                            "typeString": "contract MultipleWinners"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "445:17:56"
                  },
                  "scope": 12401,
                  "src": "410:124:56",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 12402,
              "src": "247:290:56"
            }
          ],
          "src": "37:500:56"
        },
        "id": 56
      },
      "contracts/registry/Registry.sol": {
        "ast": {
          "absolutePath": "contracts/registry/Registry.sol",
          "exportedSymbols": {
            "Registry": [
              12449
            ]
          },
          "id": 12450,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 12403,
              "literals": [
                "solidity",
                ">=",
                "0.5",
                ".0",
                "<",
                "0.7",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:31:57"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol",
              "id": 12404,
              "nodeType": "ImportDirective",
              "scope": 12450,
              "sourceUnit": 131,
              "src": "70:75:57",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/registry/RegistryInterface.sol",
              "file": "./RegistryInterface.sol",
              "id": 12405,
              "nodeType": "ImportDirective",
              "scope": 12450,
              "sourceUnit": 12459,
              "src": "147:33:57",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 12407,
                    "name": "OwnableUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 130,
                    "src": "277:18:57",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_OwnableUpgradeable_$130",
                      "typeString": "contract OwnableUpgradeable"
                    }
                  },
                  "id": 12408,
                  "nodeType": "InheritanceSpecifier",
                  "src": "277:18:57"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 12409,
                    "name": "RegistryInterface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 12458,
                    "src": "297:17:57",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                      "typeString": "contract RegistryInterface"
                    }
                  },
                  "id": 12410,
                  "nodeType": "InheritanceSpecifier",
                  "src": "297:17:57"
                }
              ],
              "contractDependencies": [
                130,
                1352,
                3627,
                12458
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 12406,
                "nodeType": "StructuredDocumentation",
                "src": "182:74:57",
                "text": "@title Interface that allows a user to draw an address using an index"
              },
              "fullyImplemented": true,
              "id": 12449,
              "linearizedBaseContracts": [
                12449,
                12458,
                130,
                3627,
                1352
              ],
              "name": "Registry",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "id": 12412,
                  "mutability": "mutable",
                  "name": "pointer",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 12449,
                  "src": "319:23:57",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 12411,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "319:7:57",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 12416,
                  "name": "Registered",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 12415,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12414,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "pointer",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12416,
                        "src": "364:23:57",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 12413,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "364:7:57",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "363:25:57"
                  },
                  "src": "347:42:57"
                },
                {
                  "body": {
                    "id": 12422,
                    "nodeType": "Block",
                    "src": "415:27:57",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 12419,
                            "name": "__Ownable_init",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 29,
                            "src": "421:14:57",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 12420,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "421:16:57",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 12421,
                        "nodeType": "ExpressionStatement",
                        "src": "421:16:57"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 12423,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12417,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "405:2:57"
                  },
                  "returnParameters": {
                    "id": 12418,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "415:0:57"
                  },
                  "scope": 12449,
                  "src": "393:49:57",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 12438,
                    "nodeType": "Block",
                    "src": "501:60:57",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 12432,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 12430,
                            "name": "pointer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12412,
                            "src": "507:7:57",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 12431,
                            "name": "_pointer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12425,
                            "src": "517:8:57",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "507:18:57",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 12433,
                        "nodeType": "ExpressionStatement",
                        "src": "507:18:57"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 12435,
                              "name": "pointer",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12412,
                              "src": "548:7:57",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 12434,
                            "name": "Registered",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12416,
                            "src": "537:10:57",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 12436,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "537:19:57",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 12437,
                        "nodeType": "EmitStatement",
                        "src": "532:24:57"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "4420e486",
                  "id": 12439,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 12428,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 12427,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "491:9:57",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "491:9:57"
                    }
                  ],
                  "name": "register",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12426,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12425,
                        "mutability": "mutable",
                        "name": "_pointer",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12439,
                        "src": "464:16:57",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 12424,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "464:7:57",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "463:18:57"
                  },
                  "returnParameters": {
                    "id": 12429,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "501:0:57"
                  },
                  "scope": 12449,
                  "src": "446:115:57",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    12457
                  ],
                  "body": {
                    "id": 12447,
                    "nodeType": "Block",
                    "src": "624:25:57",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 12445,
                          "name": "pointer",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 12412,
                          "src": "637:7:57",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "functionReturnParameters": 12444,
                        "id": 12446,
                        "nodeType": "Return",
                        "src": "630:14:57"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "f5e3542b",
                  "id": 12448,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "lookup",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 12441,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "592:8:57"
                  },
                  "parameters": {
                    "id": 12440,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "580:2:57"
                  },
                  "returnParameters": {
                    "id": 12444,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12443,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12448,
                        "src": "615:7:57",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 12442,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "615:7:57",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "614:9:57"
                  },
                  "scope": 12449,
                  "src": "565:84:57",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 12450,
              "src": "256:395:57"
            }
          ],
          "src": "37:615:57"
        },
        "id": 57
      },
      "contracts/registry/RegistryInterface.sol": {
        "ast": {
          "absolutePath": "contracts/registry/RegistryInterface.sol",
          "exportedSymbols": {
            "RegistryInterface": [
              12458
            ]
          },
          "id": 12459,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 12451,
              "literals": [
                "solidity",
                ">=",
                "0.5",
                ".0",
                "<",
                "0.7",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:31:58"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": {
                "id": 12452,
                "nodeType": "StructuredDocumentation",
                "src": "70:74:58",
                "text": "@title Interface that allows a user to draw an address using an index"
              },
              "fullyImplemented": false,
              "id": 12458,
              "linearizedBaseContracts": [
                12458
              ],
              "name": "RegistryInterface",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "f5e3542b",
                  "id": 12457,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "lookup",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12453,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "191:2:58"
                  },
                  "returnParameters": {
                    "id": 12456,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12455,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12457,
                        "src": "217:7:58",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 12454,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "217:7:58",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "216:9:58"
                  },
                  "scope": 12458,
                  "src": "176:50:58",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 12459,
              "src": "144:84:58"
            }
          ],
          "src": "37:192:58"
        },
        "id": 58
      },
      "contracts/reserve/Reserve.sol": {
        "ast": {
          "absolutePath": "contracts/reserve/Reserve.sol",
          "exportedSymbols": {
            "Reserve": [
              12528
            ]
          },
          "id": 12529,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 12460,
              "literals": [
                "solidity",
                ">=",
                "0.5",
                ".0",
                "<",
                "0.7",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:31:59"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol",
              "id": 12461,
              "nodeType": "ImportDirective",
              "scope": 12529,
              "sourceUnit": 131,
              "src": "70:75:59",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/reserve/ReserveInterface.sol",
              "file": "./ReserveInterface.sol",
              "id": 12462,
              "nodeType": "ImportDirective",
              "scope": 12529,
              "sourceUnit": 12540,
              "src": "147:32:59",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/prize-pool/PrizePoolInterface.sol",
              "file": "../prize-pool/PrizePoolInterface.sol",
              "id": 12463,
              "nodeType": "ImportDirective",
              "scope": 12529,
              "sourceUnit": 8931,
              "src": "180:46:59",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 12465,
                    "name": "OwnableUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 130,
                    "src": "322:18:59",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_OwnableUpgradeable_$130",
                      "typeString": "contract OwnableUpgradeable"
                    }
                  },
                  "id": 12466,
                  "nodeType": "InheritanceSpecifier",
                  "src": "322:18:59"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 12467,
                    "name": "ReserveInterface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 12539,
                    "src": "342:16:59",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ReserveInterface_$12539",
                      "typeString": "contract ReserveInterface"
                    }
                  },
                  "id": 12468,
                  "nodeType": "InheritanceSpecifier",
                  "src": "342:16:59"
                }
              ],
              "contractDependencies": [
                130,
                1352,
                3627,
                12539
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 12464,
                "nodeType": "StructuredDocumentation",
                "src": "228:74:59",
                "text": "@title Interface that allows a user to draw an address using an index"
              },
              "fullyImplemented": true,
              "id": 12528,
              "linearizedBaseContracts": [
                12528,
                12539,
                130,
                3627,
                1352
              ],
              "name": "Reserve",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 12472,
                  "name": "ReserveRateMantissaSet",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 12471,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12470,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "rateMantissa",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12472,
                        "src": "393:20:59",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12469,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "393:7:59",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "392:22:59"
                  },
                  "src": "364:51:59"
                },
                {
                  "constant": false,
                  "functionSelector": "3e0b06db",
                  "id": 12474,
                  "mutability": "mutable",
                  "name": "rateMantissa",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 12528,
                  "src": "419:27:59",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 12473,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "419:7:59",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 12480,
                    "nodeType": "Block",
                    "src": "473:27:59",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 12477,
                            "name": "__Ownable_init",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 29,
                            "src": "479:14:59",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 12478,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "479:16:59",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 12479,
                        "nodeType": "ExpressionStatement",
                        "src": "479:16:59"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 12481,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12475,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "463:2:59"
                  },
                  "returnParameters": {
                    "id": 12476,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "473:0:59"
                  },
                  "scope": 12528,
                  "src": "451:49:59",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 12496,
                    "nodeType": "Block",
                    "src": "589:87:59",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 12490,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 12488,
                            "name": "rateMantissa",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12474,
                            "src": "595:12:59",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 12489,
                            "name": "_rateMantissa",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12483,
                            "src": "610:13:59",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "595:28:59",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 12491,
                        "nodeType": "ExpressionStatement",
                        "src": "595:28:59"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 12493,
                              "name": "rateMantissa",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12474,
                              "src": "658:12:59",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 12492,
                            "name": "ReserveRateMantissaSet",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12472,
                            "src": "635:22:59",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 12494,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "635:36:59",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 12495,
                        "nodeType": "EmitStatement",
                        "src": "630:41:59"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "81b659d2",
                  "id": 12497,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 12486,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 12485,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "577:9:59",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "577:9:59"
                    }
                  ],
                  "name": "setRateMantissa",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12484,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12483,
                        "mutability": "mutable",
                        "name": "_rateMantissa",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12497,
                        "src": "534:21:59",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12482,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "534:7:59",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "528:31:59"
                  },
                  "returnParameters": {
                    "id": 12487,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "589:0:59"
                  },
                  "scope": 12528,
                  "src": "504:172:59",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 12515,
                    "nodeType": "Block",
                    "src": "773:67:59",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 12512,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12501,
                              "src": "832:2:59",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 12509,
                                  "name": "prizePool",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 12499,
                                  "src": "805:9:59",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 12508,
                                "name": "PrizePoolInterface",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 8930,
                                "src": "786:18:59",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_contract$_PrizePoolInterface_$8930_$",
                                  "typeString": "type(contract PrizePoolInterface)"
                                }
                              },
                              "id": 12510,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "786:29:59",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_PrizePoolInterface_$8930",
                                "typeString": "contract PrizePoolInterface"
                              }
                            },
                            "id": 12511,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "withdrawReserve",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 8789,
                            "src": "786:45:59",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) external returns (uint256)"
                            }
                          },
                          "id": 12513,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "786:49:59",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 12507,
                        "id": 12514,
                        "nodeType": "Return",
                        "src": "779:56:59"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "61853b42",
                  "id": 12516,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 12504,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 12503,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "745:9:59",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "745:9:59"
                    }
                  ],
                  "name": "withdrawReserve",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12502,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12499,
                        "mutability": "mutable",
                        "name": "prizePool",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12516,
                        "src": "705:17:59",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 12498,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "705:7:59",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 12501,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12516,
                        "src": "724:10:59",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 12500,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "724:7:59",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "704:31:59"
                  },
                  "returnParameters": {
                    "id": 12507,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12506,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12516,
                        "src": "764:7:59",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12505,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "764:7:59",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "763:9:59"
                  },
                  "scope": 12528,
                  "src": "680:160:59",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    12538
                  ],
                  "body": {
                    "id": 12526,
                    "nodeType": "Block",
                    "src": "923:30:59",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 12524,
                          "name": "rateMantissa",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 12474,
                          "src": "936:12:59",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 12523,
                        "id": 12525,
                        "nodeType": "Return",
                        "src": "929:19:59"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "010dfa58",
                  "id": 12527,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "reserveRateMantissa",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 12520,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "896:8:59"
                  },
                  "parameters": {
                    "id": 12519,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12518,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12527,
                        "src": "873:7:59",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 12517,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "873:7:59",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "872:9:59"
                  },
                  "returnParameters": {
                    "id": 12523,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12522,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12527,
                        "src": "914:7:59",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12521,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "914:7:59",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "913:9:59"
                  },
                  "scope": 12528,
                  "src": "844:109:59",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 12529,
              "src": "302:653:59"
            }
          ],
          "src": "37:919:59"
        },
        "id": 59
      },
      "contracts/reserve/ReserveInterface.sol": {
        "ast": {
          "absolutePath": "contracts/reserve/ReserveInterface.sol",
          "exportedSymbols": {
            "ReserveInterface": [
              12539
            ]
          },
          "id": 12540,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 12530,
              "literals": [
                "solidity",
                ">=",
                "0.5",
                ".0",
                "<",
                "0.7",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:31:60"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": {
                "id": 12531,
                "nodeType": "StructuredDocumentation",
                "src": "70:74:60",
                "text": "@title Interface that allows a user to draw an address using an index"
              },
              "fullyImplemented": false,
              "id": 12539,
              "linearizedBaseContracts": [
                12539
              ],
              "name": "ReserveInterface",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "010dfa58",
                  "id": 12538,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "reserveRateMantissa",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12534,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12533,
                        "mutability": "mutable",
                        "name": "prizePool",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12538,
                        "src": "204:17:60",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 12532,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "204:7:60",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "203:19:60"
                  },
                  "returnParameters": {
                    "id": 12537,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12536,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12538,
                        "src": "246:7:60",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12535,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "246:7:60",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "245:9:60"
                  },
                  "scope": 12539,
                  "src": "175:80:60",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 12540,
              "src": "144:113:60"
            }
          ],
          "src": "37:221:60"
        },
        "id": 60
      },
      "contracts/test/BeforeAwardListenerStub.sol": {
        "ast": {
          "absolutePath": "contracts/test/BeforeAwardListenerStub.sol",
          "exportedSymbols": {
            "BeforeAwardListenerStub": [
              12559
            ]
          },
          "id": 12560,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 12541,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "0:23:61"
            },
            {
              "absolutePath": "contracts/prize-strategy/BeforeAwardListener.sol",
              "file": "../prize-strategy/BeforeAwardListener.sol",
              "id": 12542,
              "nodeType": "ImportDirective",
              "scope": 12560,
              "sourceUnit": 9561,
              "src": "25:51:61",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 12543,
                    "name": "BeforeAwardListener",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9560,
                    "src": "161:19:61",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_BeforeAwardListener_$9560",
                      "typeString": "contract BeforeAwardListener"
                    }
                  },
                  "id": 12544,
                  "nodeType": "InheritanceSpecifier",
                  "src": "161:19:61"
                }
              ],
              "contractDependencies": [
                931,
                9560,
                9575
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 12559,
              "linearizedBaseContracts": [
                12559,
                9560,
                9575,
                931
              ],
              "name": "BeforeAwardListenerStub",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 12546,
                  "name": "Awarded",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 12545,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "199:2:61"
                  },
                  "src": "186:16:61"
                },
                {
                  "baseFunctions": [
                    9574
                  ],
                  "body": {
                    "id": 12557,
                    "nodeType": "Block",
                    "src": "308:25:61",
                    "statements": [
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 12554,
                            "name": "Awarded",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12546,
                            "src": "319:7:61",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 12555,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "319:9:61",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 12556,
                        "nodeType": "EmitStatement",
                        "src": "314:14:61"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "4cdf9c3e",
                  "id": 12558,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "beforePrizePoolAwarded",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 12552,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "299:8:61"
                  },
                  "parameters": {
                    "id": 12551,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12548,
                        "mutability": "mutable",
                        "name": "randomNumber",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12558,
                        "src": "238:20:61",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12547,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "238:7:61",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 12550,
                        "mutability": "mutable",
                        "name": "prizePeriodStartedAt",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12558,
                        "src": "260:28:61",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12549,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "260:7:61",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "237:52:61"
                  },
                  "returnParameters": {
                    "id": 12553,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "308:0:61"
                  },
                  "scope": 12559,
                  "src": "206:127:61",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 12560,
              "src": "125:210:61"
            }
          ],
          "src": "0:335:61"
        },
        "id": 61
      },
      "contracts/test/CTokenMock.sol": {
        "ast": {
          "absolutePath": "contracts/test/CTokenMock.sol",
          "exportedSymbols": {
            "CTokenMock": [
              12856
            ]
          },
          "id": 12857,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 12561,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "649:23:62"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol",
              "id": 12562,
              "nodeType": "ImportDirective",
              "scope": 12857,
              "sourceUnit": 1883,
              "src": "674:78:62",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@pooltogether/fixed-point/contracts/FixedPoint.sol",
              "file": "@pooltogether/fixed-point/contracts/FixedPoint.sol",
              "id": 12563,
              "nodeType": "ImportDirective",
              "scope": 12857,
              "sourceUnit": 5280,
              "src": "753:60:62",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "hardhat/console.sol",
              "file": "hardhat/console.sol",
              "id": 12564,
              "nodeType": "ImportDirective",
              "scope": 12857,
              "sourceUnit": 25063,
              "src": "814:29:62",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/test/ERC20Mintable.sol",
              "file": "./ERC20Mintable.sol",
              "id": 12565,
              "nodeType": "ImportDirective",
              "scope": 12857,
              "sourceUnit": 13681,
              "src": "845:29:62",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 12566,
                    "name": "ERC20Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1882,
                    "src": "899:16:62",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Upgradeable_$1882",
                      "typeString": "contract ERC20Upgradeable"
                    }
                  },
                  "id": 12567,
                  "nodeType": "InheritanceSpecifier",
                  "src": "899:16:62"
                }
              ],
              "contractDependencies": [
                1352,
                1882,
                1960,
                3627
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 12856,
              "linearizedBaseContracts": [
                12856,
                1882,
                1960,
                3627,
                1352
              ],
              "name": "CTokenMock",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "id": 12571,
                  "mutability": "mutable",
                  "name": "ownerTokenAmounts",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 12856,
                  "src": "920:54:62",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                    "typeString": "mapping(address => uint256)"
                  },
                  "typeName": {
                    "id": 12570,
                    "keyType": {
                      "id": 12568,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "928:7:62",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "920:27:62",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                      "typeString": "mapping(address => uint256)"
                    },
                    "valueType": {
                      "id": 12569,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "939:7:62",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "functionSelector": "6f307dc3",
                  "id": 12573,
                  "mutability": "mutable",
                  "name": "underlying",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 12856,
                  "src": "978:31:62",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                    "typeString": "contract ERC20Mintable"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 12572,
                    "name": "ERC20Mintable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 13680,
                    "src": "978:13:62",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                      "typeString": "contract ERC20Mintable"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "id": 12575,
                  "mutability": "mutable",
                  "name": "__supplyRatePerBlock",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 12856,
                  "src": "1014:37:62",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 12574,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1014:7:62",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 12603,
                    "nodeType": "Block",
                    "src": "1139:146:62",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 12591,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 12585,
                                    "name": "_token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 12577,
                                    "src": "1161:6:62",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                      "typeString": "contract ERC20Mintable"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                      "typeString": "contract ERC20Mintable"
                                    }
                                  ],
                                  "id": 12584,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "1153:7:62",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 12583,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1153:7:62",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 12586,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "1153:15:62",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 12589,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "1180:1:62",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 12588,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "1172:7:62",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 12587,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1172:7:62",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 12590,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "1172:10:62",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "1153:29:62",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "746f6b656e206973206e6f7420646566696e6564",
                              "id": 12592,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1184:22:62",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c01e68095c6f7190ccc141edcb5944c2fa1e15f614daef70a5ad9c9c3eea29a0",
                                "typeString": "literal_string \"token is not defined\""
                              },
                              "value": "token is not defined"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_c01e68095c6f7190ccc141edcb5944c2fa1e15f614daef70a5ad9c9c3eea29a0",
                                "typeString": "literal_string \"token is not defined\""
                              }
                            ],
                            "id": 12582,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1145:7:62",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 12593,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1145:62:62",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 12594,
                        "nodeType": "ExpressionStatement",
                        "src": "1145:62:62"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 12597,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 12595,
                            "name": "underlying",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12573,
                            "src": "1213:10:62",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                              "typeString": "contract ERC20Mintable"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 12596,
                            "name": "_token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12577,
                            "src": "1226:6:62",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                              "typeString": "contract ERC20Mintable"
                            }
                          },
                          "src": "1213:19:62",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                            "typeString": "contract ERC20Mintable"
                          }
                        },
                        "id": 12598,
                        "nodeType": "ExpressionStatement",
                        "src": "1213:19:62"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 12601,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 12599,
                            "name": "__supplyRatePerBlock",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12575,
                            "src": "1238:20:62",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 12600,
                            "name": "_supplyRatePerBlock",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12579,
                            "src": "1261:19:62",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "1238:42:62",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 12602,
                        "nodeType": "ExpressionStatement",
                        "src": "1238:42:62"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 12604,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12580,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12577,
                        "mutability": "mutable",
                        "name": "_token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12604,
                        "src": "1074:20:62",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                          "typeString": "contract ERC20Mintable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 12576,
                          "name": "ERC20Mintable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 13680,
                          "src": "1074:13:62",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                            "typeString": "contract ERC20Mintable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 12579,
                        "mutability": "mutable",
                        "name": "_supplyRatePerBlock",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12604,
                        "src": "1100:27:62",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12578,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1100:7:62",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1068:63:62"
                  },
                  "returnParameters": {
                    "id": 12581,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1139:0:62"
                  },
                  "scope": 12856,
                  "src": "1056:229:62",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 12670,
                    "nodeType": "Block",
                    "src": "1343:558:62",
                    "statements": [
                      {
                        "assignments": [
                          12612
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 12612,
                            "mutability": "mutable",
                            "name": "newCTokens",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 12670,
                            "src": "1349:18:62",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 12611,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "1349:7:62",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 12613,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1349:18:62"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 12617,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 12614,
                              "name": "totalSupply",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1464,
                              "src": "1377:11:62",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                "typeString": "function () view returns (uint256)"
                              }
                            },
                            "id": 12615,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1377:13:62",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 12616,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1394:1:62",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "1377:18:62",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 12646,
                          "nodeType": "Block",
                          "src": "1437:309:62",
                          "statements": [
                            {
                              "assignments": [
                                12624
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 12624,
                                  "mutability": "mutable",
                                  "name": "fractionOfCredit",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 12646,
                                  "src": "1552:24:62",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 12623,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1552:7:62",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 12636,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 12627,
                                    "name": "amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 12606,
                                    "src": "1608:6:62",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 12632,
                                            "name": "this",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": -28,
                                            "src": "1645:4:62",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_contract$_CTokenMock_$12856",
                                              "typeString": "contract CTokenMock"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_contract$_CTokenMock_$12856",
                                              "typeString": "contract CTokenMock"
                                            }
                                          ],
                                          "id": 12631,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "nodeType": "ElementaryTypeNameExpression",
                                          "src": "1637:7:62",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_type$_t_address_$",
                                            "typeString": "type(address)"
                                          },
                                          "typeName": {
                                            "id": 12630,
                                            "name": "address",
                                            "nodeType": "ElementaryTypeName",
                                            "src": "1637:7:62",
                                            "typeDescriptions": {
                                              "typeIdentifier": null,
                                              "typeString": null
                                            }
                                          }
                                        },
                                        "id": 12633,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "typeConversion",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "1637:13:62",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 12628,
                                        "name": "underlying",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 12573,
                                        "src": "1616:10:62",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                          "typeString": "contract ERC20Mintable"
                                        }
                                      },
                                      "id": 12629,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "balanceOf",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 1478,
                                      "src": "1616:20:62",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                        "typeString": "function (address) view external returns (uint256)"
                                      }
                                    },
                                    "id": 12634,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "1616:35:62",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 12625,
                                    "name": "FixedPoint",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 5279,
                                    "src": "1579:10:62",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_FixedPoint_$5279_$",
                                      "typeString": "type(library FixedPoint)"
                                    }
                                  },
                                  "id": 12626,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "calculateMantissa",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 5224,
                                  "src": "1579:28:62",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                    "typeString": "function (uint256,uint256) pure returns (uint256)"
                                  }
                                },
                                "id": 12635,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "1579:73:62",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "1552:100:62"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 12644,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 12637,
                                  "name": "newCTokens",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 12612,
                                  "src": "1660:10:62",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [],
                                      "expression": {
                                        "argumentTypes": [],
                                        "id": 12640,
                                        "name": "totalSupply",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 1464,
                                        "src": "1707:11:62",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                          "typeString": "function () view returns (uint256)"
                                        }
                                      },
                                      "id": 12641,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "1707:13:62",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    {
                                      "argumentTypes": null,
                                      "id": 12642,
                                      "name": "fractionOfCredit",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 12624,
                                      "src": "1722:16:62",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 12638,
                                      "name": "FixedPoint",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 5279,
                                      "src": "1673:10:62",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_contract$_FixedPoint_$5279_$",
                                        "typeString": "type(library FixedPoint)"
                                      }
                                    },
                                    "id": 12639,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "multiplyUintByMantissa",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 5251,
                                    "src": "1673:33:62",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 12643,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "1673:66:62",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "1660:79:62",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 12645,
                              "nodeType": "ExpressionStatement",
                              "src": "1660:79:62"
                            }
                          ]
                        },
                        "id": 12647,
                        "nodeType": "IfStatement",
                        "src": "1373:373:62",
                        "trueBody": {
                          "id": 12622,
                          "nodeType": "Block",
                          "src": "1397:34:62",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 12620,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 12618,
                                  "name": "newCTokens",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 12612,
                                  "src": "1405:10:62",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 12619,
                                  "name": "amount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 12606,
                                  "src": "1418:6:62",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "1405:19:62",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 12621,
                              "nodeType": "ExpressionStatement",
                              "src": "1405:19:62"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 12649,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "1757:3:62",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 12650,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "1757:10:62",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 12651,
                              "name": "newCTokens",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12612,
                              "src": "1769:10:62",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 12648,
                            "name": "_mint",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1754,
                            "src": "1751:5:62",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 12652,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1751:29:62",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 12653,
                        "nodeType": "ExpressionStatement",
                        "src": "1751:29:62"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 12657,
                                    "name": "msg",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -15,
                                    "src": "1818:3:62",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_message",
                                      "typeString": "msg"
                                    }
                                  },
                                  "id": 12658,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sender",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "1818:10:62",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 12661,
                                      "name": "this",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -28,
                                      "src": "1838:4:62",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_CTokenMock_$12856",
                                        "typeString": "contract CTokenMock"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_CTokenMock_$12856",
                                        "typeString": "contract CTokenMock"
                                      }
                                    ],
                                    "id": 12660,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "1830:7:62",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 12659,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "1830:7:62",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 12662,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "1830:13:62",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 12663,
                                  "name": "amount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 12606,
                                  "src": "1845:6:62",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 12655,
                                  "name": "underlying",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 12573,
                                  "src": "1794:10:62",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                    "typeString": "contract ERC20Mintable"
                                  }
                                },
                                "id": 12656,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "transferFrom",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 1576,
                                "src": "1794:23:62",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$",
                                  "typeString": "function (address,address,uint256) external returns (bool)"
                                }
                              },
                              "id": 12664,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1794:58:62",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "636f756c64206e6f74207472616e7366657220746f6b656e73",
                              "id": 12665,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1854:27:62",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_2a45739dd1a77c8877264ede7435e7c5dae203ff84e907560f502870c0fb192f",
                                "typeString": "literal_string \"could not transfer tokens\""
                              },
                              "value": "could not transfer tokens"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_2a45739dd1a77c8877264ede7435e7c5dae203ff84e907560f502870c0fb192f",
                                "typeString": "literal_string \"could not transfer tokens\""
                              }
                            ],
                            "id": 12654,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1786:7:62",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 12666,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1786:96:62",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 12667,
                        "nodeType": "ExpressionStatement",
                        "src": "1786:96:62"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 12668,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "1895:1:62",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "functionReturnParameters": 12610,
                        "id": 12669,
                        "nodeType": "Return",
                        "src": "1888:8:62"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "a0712d68",
                  "id": 12671,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "mint",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12607,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12606,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12671,
                        "src": "1303:14:62",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12605,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1303:7:62",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1302:16:62"
                  },
                  "returnParameters": {
                    "id": 12610,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12609,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12671,
                        "src": "1337:4:62",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12608,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "1337:4:62",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1336:6:62"
                  },
                  "scope": 12856,
                  "src": "1289:612:62",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 12684,
                    "nodeType": "Block",
                    "src": "1953:53:62",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 12680,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "1995:4:62",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_CTokenMock_$12856",
                                    "typeString": "contract CTokenMock"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_CTokenMock_$12856",
                                    "typeString": "contract CTokenMock"
                                  }
                                ],
                                "id": 12679,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "1987:7:62",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 12678,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "1987:7:62",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 12681,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1987:13:62",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 12676,
                              "name": "underlying",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12573,
                              "src": "1966:10:62",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                "typeString": "contract ERC20Mintable"
                              }
                            },
                            "id": 12677,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balanceOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1478,
                            "src": "1966:20:62",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) view external returns (uint256)"
                            }
                          },
                          "id": 12682,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1966:35:62",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 12675,
                        "id": 12683,
                        "nodeType": "Return",
                        "src": "1959:42:62"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "3b1d21a2",
                  "id": 12685,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "getCash",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12672,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1921:2:62"
                  },
                  "returnParameters": {
                    "id": 12675,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12674,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12685,
                        "src": "1947:4:62",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12673,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "1947:4:62",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1946:6:62"
                  },
                  "scope": 12856,
                  "src": "1905:101:62",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 12714,
                    "nodeType": "Block",
                    "src": "2085:183:62",
                    "statements": [
                      {
                        "assignments": [
                          12693
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 12693,
                            "mutability": "mutable",
                            "name": "cTokens",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 12714,
                            "src": "2091:15:62",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 12692,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "2091:7:62",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 12697,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 12695,
                              "name": "requestedAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12687,
                              "src": "2123:15:62",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 12694,
                            "name": "cTokenValueOf",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12791,
                            "src": "2109:13:62",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256) view returns (uint256)"
                            }
                          },
                          "id": 12696,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2109:30:62",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2091:48:62"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 12699,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "2151:3:62",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 12700,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "2151:10:62",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 12701,
                              "name": "cTokens",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12693,
                              "src": "2163:7:62",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 12698,
                            "name": "_burn",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1810,
                            "src": "2145:5:62",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 12702,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2145:26:62",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 12703,
                        "nodeType": "ExpressionStatement",
                        "src": "2145:26:62"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 12707,
                                    "name": "msg",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -15,
                                    "src": "2205:3:62",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_message",
                                      "typeString": "msg"
                                    }
                                  },
                                  "id": 12708,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sender",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "2205:10:62",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 12709,
                                  "name": "requestedAmount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 12687,
                                  "src": "2217:15:62",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 12705,
                                  "name": "underlying",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 12573,
                                  "src": "2185:10:62",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                    "typeString": "contract ERC20Mintable"
                                  }
                                },
                                "id": 12706,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "transfer",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 1499,
                                "src": "2185:19:62",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                                  "typeString": "function (address,uint256) external returns (bool)"
                                }
                              },
                              "id": 12710,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2185:48:62",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "636f756c64206e6f74207472616e7366657220746f6b656e73",
                              "id": 12711,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2235:27:62",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_2a45739dd1a77c8877264ede7435e7c5dae203ff84e907560f502870c0fb192f",
                                "typeString": "literal_string \"could not transfer tokens\""
                              },
                              "value": "could not transfer tokens"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_2a45739dd1a77c8877264ede7435e7c5dae203ff84e907560f502870c0fb192f",
                                "typeString": "literal_string \"could not transfer tokens\""
                              }
                            ],
                            "id": 12704,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2177:7:62",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 12712,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2177:86:62",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 12713,
                        "nodeType": "ExpressionStatement",
                        "src": "2177:86:62"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "852a12e3",
                  "id": 12715,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "redeemUnderlying",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12688,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12687,
                        "mutability": "mutable",
                        "name": "requestedAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12715,
                        "src": "2036:23:62",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12686,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2036:7:62",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2035:25:62"
                  },
                  "returnParameters": {
                    "id": 12691,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12690,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12715,
                        "src": "2079:4:62",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12689,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "2079:4:62",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2078:6:62"
                  },
                  "scope": 12856,
                  "src": "2010:258:62",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 12743,
                    "nodeType": "Block",
                    "src": "2299:127:62",
                    "statements": [
                      {
                        "assignments": [
                          12719
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 12719,
                            "mutability": "mutable",
                            "name": "newTokens",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 12743,
                            "src": "2305:17:62",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 12718,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "2305:7:62",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 12732,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 12731,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 12728,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 12724,
                                          "name": "this",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": -28,
                                          "src": "2355:4:62",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_CTokenMock_$12856",
                                            "typeString": "contract CTokenMock"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_contract$_CTokenMock_$12856",
                                            "typeString": "contract CTokenMock"
                                          }
                                        ],
                                        "id": 12723,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "2347:7:62",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_address_$",
                                          "typeString": "type(address)"
                                        },
                                        "typeName": {
                                          "id": 12722,
                                          "name": "address",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "2347:7:62",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      },
                                      "id": 12725,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "2347:13:62",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 12720,
                                      "name": "underlying",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 12573,
                                      "src": "2326:10:62",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                        "typeString": "contract ERC20Mintable"
                                      }
                                    },
                                    "id": 12721,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "balanceOf",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1478,
                                    "src": "2326:20:62",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                      "typeString": "function (address) view external returns (uint256)"
                                    }
                                  },
                                  "id": 12726,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "2326:35:62",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "*",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "313230",
                                  "id": 12727,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "2364:3:62",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_120_by_1",
                                    "typeString": "int_const 120"
                                  },
                                  "value": "120"
                                },
                                "src": "2326:41:62",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "id": 12729,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "2325:43:62",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "/",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "313030",
                            "id": 12730,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "2371:3:62",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_100_by_1",
                              "typeString": "int_const 100"
                            },
                            "value": "100"
                          },
                          "src": "2325:49:62",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2305:69:62"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 12738,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "2404:4:62",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_CTokenMock_$12856",
                                    "typeString": "contract CTokenMock"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_CTokenMock_$12856",
                                    "typeString": "contract CTokenMock"
                                  }
                                ],
                                "id": 12737,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "2396:7:62",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 12736,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "2396:7:62",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 12739,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2396:13:62",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 12740,
                              "name": "newTokens",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12719,
                              "src": "2411:9:62",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 12733,
                              "name": "underlying",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12573,
                              "src": "2380:10:62",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                "typeString": "contract ERC20Mintable"
                              }
                            },
                            "id": 12735,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "mint",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 13646,
                            "src": "2380:15:62",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,uint256) external returns (bool)"
                            }
                          },
                          "id": 12741,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2380:41:62",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 12742,
                        "nodeType": "ExpressionStatement",
                        "src": "2380:41:62"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "f8ba4cff",
                  "id": 12744,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "accrue",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12716,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2287:2:62"
                  },
                  "returnParameters": {
                    "id": 12717,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2299:0:62"
                  },
                  "scope": 12856,
                  "src": "2272:154:62",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 12759,
                    "nodeType": "Block",
                    "src": "2477:49:62",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 12754,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "2507:4:62",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_CTokenMock_$12856",
                                    "typeString": "contract CTokenMock"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_CTokenMock_$12856",
                                    "typeString": "contract CTokenMock"
                                  }
                                ],
                                "id": 12753,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "2499:7:62",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 12752,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "2499:7:62",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 12755,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2499:13:62",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 12756,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12746,
                              "src": "2514:6:62",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 12749,
                              "name": "underlying",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12573,
                              "src": "2483:10:62",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                "typeString": "contract ERC20Mintable"
                              }
                            },
                            "id": 12751,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "mint",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 13646,
                            "src": "2483:15:62",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,uint256) external returns (bool)"
                            }
                          },
                          "id": 12757,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2483:38:62",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 12758,
                        "nodeType": "ExpressionStatement",
                        "src": "2483:38:62"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "4c1fb633",
                  "id": 12760,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "accrueCustom",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12747,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12746,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12760,
                        "src": "2452:14:62",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12745,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2452:7:62",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2451:16:62"
                  },
                  "returnParameters": {
                    "id": 12748,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2477:0:62"
                  },
                  "scope": 12856,
                  "src": "2430:96:62",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 12775,
                    "nodeType": "Block",
                    "src": "2569:49:62",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 12770,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "2599:4:62",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_CTokenMock_$12856",
                                    "typeString": "contract CTokenMock"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_CTokenMock_$12856",
                                    "typeString": "contract CTokenMock"
                                  }
                                ],
                                "id": 12769,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "2591:7:62",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 12768,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "2591:7:62",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 12771,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2591:13:62",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 12772,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12762,
                              "src": "2606:6:62",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 12765,
                              "name": "underlying",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12573,
                              "src": "2575:10:62",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                "typeString": "contract ERC20Mintable"
                              }
                            },
                            "id": 12767,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "burn",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 13663,
                            "src": "2575:15:62",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,uint256) external returns (bool)"
                            }
                          },
                          "id": 12773,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2575:38:62",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 12774,
                        "nodeType": "ExpressionStatement",
                        "src": "2575:38:62"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "42966c68",
                  "id": 12776,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "burn",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12763,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12762,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12776,
                        "src": "2544:14:62",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12761,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2544:7:62",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2543:16:62"
                  },
                  "returnParameters": {
                    "id": 12764,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2569:0:62"
                  },
                  "scope": 12856,
                  "src": "2530:88:62",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 12790,
                    "nodeType": "Block",
                    "src": "2691:80:62",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 12785,
                              "name": "tokens",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12778,
                              "src": "2736:6:62",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 12786,
                                "name": "exchangeRateCurrent",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 12837,
                                "src": "2744:19:62",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                  "typeString": "function () view returns (uint256)"
                                }
                              },
                              "id": 12787,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2744:21:62",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 12783,
                              "name": "FixedPoint",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5279,
                              "src": "2704:10:62",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_FixedPoint_$5279_$",
                                "typeString": "type(library FixedPoint)"
                              }
                            },
                            "id": 12784,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "divideUintByMantissa",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5278,
                            "src": "2704:31:62",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 12788,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2704:62:62",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 12782,
                        "id": 12789,
                        "nodeType": "Return",
                        "src": "2697:69:62"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "7dabc3ce",
                  "id": 12791,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "cTokenValueOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12779,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12778,
                        "mutability": "mutable",
                        "name": "tokens",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12791,
                        "src": "2645:14:62",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12777,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2645:7:62",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2644:16:62"
                  },
                  "returnParameters": {
                    "id": 12782,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12781,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12791,
                        "src": "2682:7:62",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12780,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2682:7:62",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2681:9:62"
                  },
                  "scope": 12856,
                  "src": "2622:149:62",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 12807,
                    "nodeType": "Block",
                    "src": "2848:94:62",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 12801,
                                  "name": "account",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 12793,
                                  "src": "2905:7:62",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 12800,
                                "name": "balanceOf",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1478,
                                "src": "2895:9:62",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_uint256_$",
                                  "typeString": "function (address) view returns (uint256)"
                                }
                              },
                              "id": 12802,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2895:18:62",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 12803,
                                "name": "exchangeRateCurrent",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 12837,
                                "src": "2915:19:62",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                  "typeString": "function () view returns (uint256)"
                                }
                              },
                              "id": 12804,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2915:21:62",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 12798,
                              "name": "FixedPoint",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5279,
                              "src": "2861:10:62",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_FixedPoint_$5279_$",
                                "typeString": "type(library FixedPoint)"
                              }
                            },
                            "id": 12799,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "multiplyUintByMantissa",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5251,
                            "src": "2861:33:62",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 12805,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2861:76:62",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 12797,
                        "id": 12806,
                        "nodeType": "Return",
                        "src": "2854:83:62"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "3af9e669",
                  "id": 12808,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "balanceOfUnderlying",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12794,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12793,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12808,
                        "src": "2804:15:62",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 12792,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2804:7:62",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2803:17:62"
                  },
                  "returnParameters": {
                    "id": 12797,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12796,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12808,
                        "src": "2842:4:62",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12795,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "2842:4:62",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2841:6:62"
                  },
                  "scope": 12856,
                  "src": "2775:167:62",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 12836,
                    "nodeType": "Block",
                    "src": "3007:180:62",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 12816,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 12813,
                              "name": "totalSupply",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 1464,
                              "src": "3017:11:62",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                "typeString": "function () view returns (uint256)"
                              }
                            },
                            "id": 12814,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "3017:13:62",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 12815,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "3034:1:62",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "3017:18:62",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 12834,
                          "nodeType": "Block",
                          "src": "3081:102:62",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 12827,
                                            "name": "this",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": -28,
                                            "src": "3154:4:62",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_contract$_CTokenMock_$12856",
                                              "typeString": "contract CTokenMock"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_contract$_CTokenMock_$12856",
                                              "typeString": "contract CTokenMock"
                                            }
                                          ],
                                          "id": 12826,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "nodeType": "ElementaryTypeNameExpression",
                                          "src": "3146:7:62",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_type$_t_address_$",
                                            "typeString": "type(address)"
                                          },
                                          "typeName": {
                                            "id": 12825,
                                            "name": "address",
                                            "nodeType": "ElementaryTypeName",
                                            "src": "3146:7:62",
                                            "typeDescriptions": {
                                              "typeIdentifier": null,
                                              "typeString": null
                                            }
                                          }
                                        },
                                        "id": 12828,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "typeConversion",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "3146:13:62",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 12823,
                                        "name": "underlying",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 12573,
                                        "src": "3125:10:62",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                          "typeString": "contract ERC20Mintable"
                                        }
                                      },
                                      "id": 12824,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "balanceOf",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 1478,
                                      "src": "3125:20:62",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                        "typeString": "function (address) view external returns (uint256)"
                                      }
                                    },
                                    "id": 12829,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "3125:35:62",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "arguments": [],
                                    "expression": {
                                      "argumentTypes": [],
                                      "id": 12830,
                                      "name": "totalSupply",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1464,
                                      "src": "3162:11:62",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                                        "typeString": "function () view returns (uint256)"
                                      }
                                    },
                                    "id": 12831,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "3162:13:62",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 12821,
                                    "name": "FixedPoint",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 5279,
                                    "src": "3096:10:62",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_FixedPoint_$5279_$",
                                      "typeString": "type(library FixedPoint)"
                                    }
                                  },
                                  "id": 12822,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "calculateMantissa",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 5224,
                                  "src": "3096:28:62",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                    "typeString": "function (uint256,uint256) pure returns (uint256)"
                                  }
                                },
                                "id": 12832,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "3096:80:62",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "functionReturnParameters": 12812,
                              "id": 12833,
                              "nodeType": "Return",
                              "src": "3089:87:62"
                            }
                          ]
                        },
                        "id": 12835,
                        "nodeType": "IfStatement",
                        "src": "3013:170:62",
                        "trueBody": {
                          "id": 12820,
                          "nodeType": "Block",
                          "src": "3037:38:62",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 12817,
                                  "name": "FixedPoint",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5279,
                                  "src": "3052:10:62",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_contract$_FixedPoint_$5279_$",
                                    "typeString": "type(library FixedPoint)"
                                  }
                                },
                                "id": 12818,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "SCALE",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 5197,
                                "src": "3052:16:62",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "functionReturnParameters": 12812,
                              "id": 12819,
                              "nodeType": "Return",
                              "src": "3045:23:62"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "bd6d894d",
                  "id": 12837,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "exchangeRateCurrent",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12809,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2974:2:62"
                  },
                  "returnParameters": {
                    "id": 12812,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12811,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12837,
                        "src": "2998:7:62",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12810,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2998:7:62",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2997:9:62"
                  },
                  "scope": 12856,
                  "src": "2946:241:62",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 12844,
                    "nodeType": "Block",
                    "src": "3250:38:62",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 12842,
                          "name": "__supplyRatePerBlock",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 12575,
                          "src": "3263:20:62",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 12841,
                        "id": 12843,
                        "nodeType": "Return",
                        "src": "3256:27:62"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "ae9d70b0",
                  "id": 12845,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "supplyRatePerBlock",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12838,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3218:2:62"
                  },
                  "returnParameters": {
                    "id": 12841,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12840,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12845,
                        "src": "3244:4:62",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12839,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "3244:4:62",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3243:6:62"
                  },
                  "scope": 12856,
                  "src": "3191:97:62",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 12854,
                    "nodeType": "Block",
                    "src": "3361:53:62",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 12852,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 12850,
                            "name": "__supplyRatePerBlock",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12575,
                            "src": "3367:20:62",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 12851,
                            "name": "_supplyRatePerBlock",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12847,
                            "src": "3390:19:62",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "3367:42:62",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 12853,
                        "nodeType": "ExpressionStatement",
                        "src": "3367:42:62"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "5a2c37ca",
                  "id": 12855,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setSupplyRateMantissa",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12848,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12847,
                        "mutability": "mutable",
                        "name": "_supplyRatePerBlock",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12855,
                        "src": "3323:27:62",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12846,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3323:7:62",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3322:29:62"
                  },
                  "returnParameters": {
                    "id": 12849,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3361:0:62"
                  },
                  "scope": 12856,
                  "src": "3292:122:62",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 12857,
              "src": "876:2540:62"
            }
          ],
          "src": "649:2768:62"
        },
        "id": 62
      },
      "contracts/test/CompoundPrizePoolHarness.sol": {
        "ast": {
          "absolutePath": "contracts/test/CompoundPrizePoolHarness.sol",
          "exportedSymbols": {
            "CompoundPrizePoolHarness": [
              12905
            ]
          },
          "id": 12906,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 12858,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "0:23:63"
            },
            {
              "absolutePath": "contracts/prize-pool/compound/CompoundPrizePool.sol",
              "file": "../prize-pool/compound/CompoundPrizePool.sol",
              "id": 12859,
              "nodeType": "ImportDirective",
              "scope": 12906,
              "sourceUnit": 9117,
              "src": "25:54:63",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 12860,
                    "name": "CompoundPrizePool",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9116,
                    "src": "165:17:63",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_CompoundPrizePool_$9116",
                      "typeString": "contract CompoundPrizePool"
                    }
                  },
                  "id": 12861,
                  "nodeType": "InheritanceSpecifier",
                  "src": "165:17:63"
                }
              ],
              "contractDependencies": [
                130,
                1352,
                3222,
                3627,
                4787,
                8751,
                8930,
                9116,
                16206
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 12905,
              "linearizedBaseContracts": [
                12905,
                9116,
                8751,
                3222,
                16206,
                4787,
                130,
                3627,
                1352,
                8930
              ],
              "name": "CompoundPrizePoolHarness",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "functionSelector": "d18e81b3",
                  "id": 12863,
                  "mutability": "mutable",
                  "name": "currentTime",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 12905,
                  "src": "188:26:63",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 12862,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "188:7:63",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 12872,
                    "nodeType": "Block",
                    "src": "274:37:63",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 12870,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 12868,
                            "name": "currentTime",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12863,
                            "src": "280:11:63",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 12869,
                            "name": "_currentTime",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12865,
                            "src": "294:12:63",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "280:26:63",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 12871,
                        "nodeType": "ExpressionStatement",
                        "src": "280:26:63"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "22f8e566",
                  "id": 12873,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setCurrentTime",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12866,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12865,
                        "mutability": "mutable",
                        "name": "_currentTime",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12873,
                        "src": "243:20:63",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12864,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "243:7:63",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "242:22:63"
                  },
                  "returnParameters": {
                    "id": 12867,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "274:0:63"
                  },
                  "scope": 12905,
                  "src": "219:92:63",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    8462
                  ],
                  "body": {
                    "id": 12881,
                    "nodeType": "Block",
                    "src": "380:29:63",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 12879,
                          "name": "currentTime",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 12863,
                          "src": "393:11:63",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 12878,
                        "id": 12880,
                        "nodeType": "Return",
                        "src": "386:18:63"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 12882,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_currentTime",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 12875,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "348:8:63"
                  },
                  "parameters": {
                    "id": 12874,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "336:2:63"
                  },
                  "returnParameters": {
                    "id": 12878,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12877,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12882,
                        "src": "371:7:63",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12876,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "371:7:63",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "370:9:63"
                  },
                  "scope": 12905,
                  "src": "315:94:63",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 12891,
                    "nodeType": "Block",
                    "src": "458:30:63",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 12888,
                              "name": "mintAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12884,
                              "src": "472:10:63",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 12887,
                            "name": "_supply",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              9034
                            ],
                            "referencedDeclaration": 9034,
                            "src": "464:7:63",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 12889,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "464:19:63",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 12890,
                        "nodeType": "ExpressionStatement",
                        "src": "464:19:63"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "35403023",
                  "id": 12892,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "supply",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12885,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12884,
                        "mutability": "mutable",
                        "name": "mintAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12892,
                        "src": "429:18:63",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12883,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "429:7:63",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "428:20:63"
                  },
                  "returnParameters": {
                    "id": 12886,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "458:0:63"
                  },
                  "scope": 12905,
                  "src": "413:75:63",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 12903,
                    "nodeType": "Block",
                    "src": "557:39:63",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 12900,
                              "name": "redeemAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12894,
                              "src": "578:12:63",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 12899,
                            "name": "_redeem",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              9101
                            ],
                            "referencedDeclaration": 9101,
                            "src": "570:7:63",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256) returns (uint256)"
                            }
                          },
                          "id": 12901,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "570:21:63",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 12898,
                        "id": 12902,
                        "nodeType": "Return",
                        "src": "563:28:63"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "db006a75",
                  "id": 12904,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "redeem",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12895,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12894,
                        "mutability": "mutable",
                        "name": "redeemAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12904,
                        "src": "508:20:63",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12893,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "508:7:63",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "507:22:63"
                  },
                  "returnParameters": {
                    "id": 12898,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12897,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12904,
                        "src": "548:7:63",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12896,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "548:7:63",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "547:9:63"
                  },
                  "scope": 12905,
                  "src": "492:104:63",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 12906,
              "src": "128:470:63"
            }
          ],
          "src": "0:598:63"
        },
        "id": 63
      },
      "contracts/test/CompoundPrizePoolHarnessProxyFactory.sol": {
        "ast": {
          "absolutePath": "contracts/test/CompoundPrizePoolHarnessProxyFactory.sol",
          "exportedSymbols": {
            "CompoundPrizePoolHarnessProxyFactory": [
              12944
            ]
          },
          "id": 12945,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 12907,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "0:23:64"
            },
            {
              "absolutePath": "contracts/test/CompoundPrizePoolHarness.sol",
              "file": "./CompoundPrizePoolHarness.sol",
              "id": 12908,
              "nodeType": "ImportDirective",
              "scope": 12945,
              "sourceUnit": 12906,
              "src": "25:40:64",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/external/openzeppelin/ProxyFactory.sol",
              "file": "../external/openzeppelin/ProxyFactory.sol",
              "id": 12909,
              "nodeType": "ImportDirective",
              "scope": 12945,
              "sourceUnit": 6617,
              "src": "66:51:64",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 12911,
                    "name": "ProxyFactory",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 6616,
                    "src": "285:12:64",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ProxyFactory_$6616",
                      "typeString": "contract ProxyFactory"
                    }
                  },
                  "id": 12912,
                  "nodeType": "InheritanceSpecifier",
                  "src": "285:12:64"
                }
              ],
              "contractDependencies": [
                6616,
                12905
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 12910,
                "nodeType": "StructuredDocumentation",
                "src": "119:117:64",
                "text": "@title Compound Prize Pool Proxy Factory\n @notice Minimal proxy pattern for creating new Compound Prize Pools"
              },
              "fullyImplemented": true,
              "id": 12944,
              "linearizedBaseContracts": [
                12944,
                6616
              ],
              "name": "CompoundPrizePoolHarnessProxyFactory",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "documentation": {
                    "id": 12913,
                    "nodeType": "StructuredDocumentation",
                    "src": "303:63:64",
                    "text": "@notice Contract template for deploying proxied Prize Pools"
                  },
                  "functionSelector": "022ec095",
                  "id": 12915,
                  "mutability": "mutable",
                  "name": "instance",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 12944,
                  "src": "369:40:64",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_CompoundPrizePoolHarness_$12905",
                    "typeString": "contract CompoundPrizePoolHarness"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 12914,
                    "name": "CompoundPrizePoolHarness",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 12905,
                    "src": "369:24:64",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_CompoundPrizePoolHarness_$12905",
                      "typeString": "contract CompoundPrizePoolHarness"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 12925,
                    "nodeType": "Block",
                    "src": "518:52:64",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 12923,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 12919,
                            "name": "instance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12915,
                            "src": "524:8:64",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_CompoundPrizePoolHarness_$12905",
                              "typeString": "contract CompoundPrizePoolHarness"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 12921,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "535:28:64",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_creation_nonpayable$__$returns$_t_contract$_CompoundPrizePoolHarness_$12905_$",
                                "typeString": "function () returns (contract CompoundPrizePoolHarness)"
                              },
                              "typeName": {
                                "contractScope": null,
                                "id": 12920,
                                "name": "CompoundPrizePoolHarness",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 12905,
                                "src": "539:24:64",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_CompoundPrizePoolHarness_$12905",
                                  "typeString": "contract CompoundPrizePoolHarness"
                                }
                              }
                            },
                            "id": 12922,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "535:30:64",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_CompoundPrizePoolHarness_$12905",
                              "typeString": "contract CompoundPrizePoolHarness"
                            }
                          },
                          "src": "524:41:64",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_CompoundPrizePoolHarness_$12905",
                            "typeString": "contract CompoundPrizePoolHarness"
                          }
                        },
                        "id": 12924,
                        "nodeType": "ExpressionStatement",
                        "src": "524:41:64"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 12916,
                    "nodeType": "StructuredDocumentation",
                    "src": "414:79:64",
                    "text": "@notice Initializes the Factory with an instance of the Compound Prize Pool"
                  },
                  "id": 12926,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12917,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "508:2:64"
                  },
                  "returnParameters": {
                    "id": 12918,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "518:0:64"
                  },
                  "scope": 12944,
                  "src": "496:74:64",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 12942,
                    "nodeType": "Block",
                    "src": "785:80:64",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 12936,
                                      "name": "instance",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 12915,
                                      "src": "845:8:64",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_CompoundPrizePoolHarness_$12905",
                                        "typeString": "contract CompoundPrizePoolHarness"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_CompoundPrizePoolHarness_$12905",
                                        "typeString": "contract CompoundPrizePoolHarness"
                                      }
                                    ],
                                    "id": 12935,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "837:7:64",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 12934,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "837:7:64",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 12937,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "837:17:64",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "hexValue": "",
                                  "id": 12938,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "856:2:64",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                    "typeString": "literal_string \"\""
                                  },
                                  "value": ""
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                    "typeString": "literal_string \"\""
                                  }
                                ],
                                "id": 12933,
                                "name": "deployMinimal",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6615,
                                "src": "823:13:64",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_address_$",
                                  "typeString": "function (address,bytes memory) returns (address)"
                                }
                              },
                              "id": 12939,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "823:36:64",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 12932,
                            "name": "CompoundPrizePoolHarness",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12905,
                            "src": "798:24:64",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_CompoundPrizePoolHarness_$12905_$",
                              "typeString": "type(contract CompoundPrizePoolHarness)"
                            }
                          },
                          "id": 12940,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "798:62:64",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_CompoundPrizePoolHarness_$12905",
                            "typeString": "contract CompoundPrizePoolHarness"
                          }
                        },
                        "functionReturnParameters": 12931,
                        "id": 12941,
                        "nodeType": "Return",
                        "src": "791:69:64"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 12927,
                    "nodeType": "StructuredDocumentation",
                    "src": "574:146:64",
                    "text": "@notice Creates a new Compound Prize Pool as a proxy of the template instance\n @return A reference to the new proxied Compound Prize Pool"
                  },
                  "functionSelector": "efc81a8c",
                  "id": 12943,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "create",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12928,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "738:2:64"
                  },
                  "returnParameters": {
                    "id": 12931,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12930,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 12943,
                        "src": "759:24:64",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_CompoundPrizePoolHarness_$12905",
                          "typeString": "contract CompoundPrizePoolHarness"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 12929,
                          "name": "CompoundPrizePoolHarness",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 12905,
                          "src": "759:24:64",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_CompoundPrizePoolHarness_$12905",
                            "typeString": "contract CompoundPrizePoolHarness"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "758:26:64"
                  },
                  "scope": 12944,
                  "src": "723:142:64",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 12945,
              "src": "236:631:64"
            }
          ],
          "src": "0:868:64"
        },
        "id": 64
      },
      "contracts/test/Dai.sol": {
        "ast": {
          "absolutePath": "contracts/test/Dai.sol",
          "exportedSymbols": {
            "Dai": [
              13609
            ]
          },
          "id": 13610,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 12946,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:65"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol",
              "id": 12947,
              "nodeType": "ImportDirective",
              "scope": 13610,
              "sourceUnit": 1287,
              "src": "62:74:65",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol",
              "id": 12948,
              "nodeType": "ImportDirective",
              "scope": 13610,
              "sourceUnit": 3583,
              "src": "137:74:65",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/external/maker/DaiInterface.sol",
              "file": "../external/maker/DaiInterface.sol",
              "id": 12949,
              "nodeType": "ImportDirective",
              "scope": 13610,
              "sourceUnit": 6567,
              "src": "213:44:65",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 12950,
                    "name": "DaiInterface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 6566,
                    "src": "275:12:65",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_DaiInterface_$6566",
                      "typeString": "contract DaiInterface"
                    }
                  },
                  "id": 12951,
                  "nodeType": "InheritanceSpecifier",
                  "src": "275:12:65"
                }
              ],
              "contractDependencies": [
                1960,
                6566
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 13609,
              "linearizedBaseContracts": [
                13609,
                6566,
                1960
              ],
              "name": "Dai",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 12954,
                  "libraryName": {
                    "contractScope": null,
                    "id": 12952,
                    "name": "SafeMathUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1286,
                    "src": "298:19:65",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeMathUpgradeable_$1286",
                      "typeString": "library SafeMathUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "292:38:65",
                  "typeName": {
                    "id": 12953,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "322:7:65",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "id": 12957,
                  "libraryName": {
                    "contractScope": null,
                    "id": 12955,
                    "name": "AddressUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3582,
                    "src": "339:18:65",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_AddressUpgradeable_$3582",
                      "typeString": "library AddressUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "333:37:65",
                  "typeName": {
                    "id": 12956,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "362:7:65",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  }
                },
                {
                  "constant": false,
                  "id": 12961,
                  "mutability": "mutable",
                  "name": "_balances",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 13609,
                  "src": "374:46:65",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                    "typeString": "mapping(address => uint256)"
                  },
                  "typeName": {
                    "id": 12960,
                    "keyType": {
                      "id": 12958,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "383:7:65",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "374:28:65",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                      "typeString": "mapping(address => uint256)"
                    },
                    "valueType": {
                      "id": 12959,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "394:7:65",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 12967,
                  "mutability": "mutable",
                  "name": "_allowances",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 13609,
                  "src": "425:69:65",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                    "typeString": "mapping(address => mapping(address => uint256))"
                  },
                  "typeName": {
                    "id": 12966,
                    "keyType": {
                      "id": 12962,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "434:7:65",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "425:49:65",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                      "typeString": "mapping(address => mapping(address => uint256))"
                    },
                    "valueType": {
                      "id": 12965,
                      "keyType": {
                        "id": 12963,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "454:7:65",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "nodeType": "Mapping",
                      "src": "445:28:65",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                        "typeString": "mapping(address => uint256)"
                      },
                      "valueType": {
                        "id": 12964,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "465:7:65",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 12969,
                  "mutability": "mutable",
                  "name": "_totalSupply",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 13609,
                  "src": "499:28:65",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 12968,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "499:7:65",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 12971,
                  "mutability": "mutable",
                  "name": "_name",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 13609,
                  "src": "532:20:65",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_storage",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 12970,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "532:6:65",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 12973,
                  "mutability": "mutable",
                  "name": "_symbol",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 13609,
                  "src": "556:22:65",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_storage",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 12972,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "556:6:65",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "constant": false,
                  "id": 12975,
                  "mutability": "mutable",
                  "name": "_decimals",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 13609,
                  "src": "582:23:65",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 12974,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "582:5:65",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 13025,
                    "nodeType": "Block",
                    "src": "954:391:65",
                    "statements": [
                      {
                        "assignments": [
                          12982
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 12982,
                            "mutability": "mutable",
                            "name": "version",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 13025,
                            "src": "960:21:65",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_memory_ptr",
                              "typeString": "string"
                            },
                            "typeName": {
                              "id": 12981,
                              "name": "string",
                              "nodeType": "ElementaryTypeName",
                              "src": "960:6:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_storage_ptr",
                                "typeString": "string"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 12984,
                        "initialValue": {
                          "argumentTypes": null,
                          "hexValue": "31",
                          "id": 12983,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "string",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "984:3:65",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_stringliteral_c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6",
                            "typeString": "literal_string \"1\""
                          },
                          "value": "1"
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "960:27:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 12987,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 12985,
                            "name": "_name",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12971,
                            "src": "994:5:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_storage",
                              "typeString": "string storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "hexValue": "44616920537461626c65636f696e",
                            "id": 12986,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1002:16:65",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_stringliteral_0b1461ddc0c1d5ded79a1db0f74dae949050a7c0b28728c724b24958c27a328b",
                              "typeString": "literal_string \"Dai Stablecoin\""
                            },
                            "value": "Dai Stablecoin"
                          },
                          "src": "994:24:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage",
                            "typeString": "string storage ref"
                          }
                        },
                        "id": 12988,
                        "nodeType": "ExpressionStatement",
                        "src": "994:24:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 12991,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 12989,
                            "name": "_symbol",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12973,
                            "src": "1024:7:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_storage",
                              "typeString": "string storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "hexValue": "444149",
                            "id": 12990,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1034:5:65",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_stringliteral_a5e92f3efb6826155f1f728e162af9d7cda33a574a1153b58f03ea01cc37e568",
                              "typeString": "literal_string \"DAI\""
                            },
                            "value": "DAI"
                          },
                          "src": "1024:15:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage",
                            "typeString": "string storage ref"
                          }
                        },
                        "id": 12992,
                        "nodeType": "ExpressionStatement",
                        "src": "1024:15:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 12995,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 12993,
                            "name": "_decimals",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12975,
                            "src": "1045:9:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "hexValue": "3138",
                            "id": 12994,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1057:2:65",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_18_by_1",
                              "typeString": "int_const 18"
                            },
                            "value": "18"
                          },
                          "src": "1045:14:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "id": 12996,
                        "nodeType": "ExpressionStatement",
                        "src": "1045:14:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 13023,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 12997,
                            "name": "DOMAIN_SEPARATOR",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13482,
                            "src": "1066:16:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "hexValue": "454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429",
                                        "id": 13002,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "string",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "1132:84:65",
                                        "subdenomination": null,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_stringliteral_8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f",
                                          "typeString": "literal_string \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\""
                                        },
                                        "value": "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_stringliteral_8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f",
                                          "typeString": "literal_string \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\""
                                        }
                                      ],
                                      "id": 13001,
                                      "name": "keccak256",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -8,
                                      "src": "1122:9:65",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                        "typeString": "function (bytes memory) pure returns (bytes32)"
                                      }
                                    },
                                    "id": 13003,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "1122:95:65",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 13007,
                                            "name": "_name",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 12971,
                                            "src": "1243:5:65",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_string_storage",
                                              "typeString": "string storage ref"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_string_storage",
                                              "typeString": "string storage ref"
                                            }
                                          ],
                                          "id": 13006,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "nodeType": "ElementaryTypeNameExpression",
                                          "src": "1237:5:65",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                                            "typeString": "type(bytes storage pointer)"
                                          },
                                          "typeName": {
                                            "id": 13005,
                                            "name": "bytes",
                                            "nodeType": "ElementaryTypeName",
                                            "src": "1237:5:65",
                                            "typeDescriptions": {
                                              "typeIdentifier": null,
                                              "typeString": null
                                            }
                                          }
                                        },
                                        "id": 13008,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "typeConversion",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "1237:12:65",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes_storage_ptr",
                                          "typeString": "bytes storage pointer"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_bytes_storage_ptr",
                                          "typeString": "bytes storage pointer"
                                        }
                                      ],
                                      "id": 13004,
                                      "name": "keccak256",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -8,
                                      "src": "1227:9:65",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                        "typeString": "function (bytes memory) pure returns (bytes32)"
                                      }
                                    },
                                    "id": 13009,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "1227:23:65",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 13013,
                                            "name": "version",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 12982,
                                            "src": "1276:7:65",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_string_memory_ptr",
                                              "typeString": "string memory"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_string_memory_ptr",
                                              "typeString": "string memory"
                                            }
                                          ],
                                          "id": 13012,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "nodeType": "ElementaryTypeNameExpression",
                                          "src": "1270:5:65",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_type$_t_bytes_storage_ptr_$",
                                            "typeString": "type(bytes storage pointer)"
                                          },
                                          "typeName": {
                                            "id": 13011,
                                            "name": "bytes",
                                            "nodeType": "ElementaryTypeName",
                                            "src": "1270:5:65",
                                            "typeDescriptions": {
                                              "typeIdentifier": null,
                                              "typeString": null
                                            }
                                          }
                                        },
                                        "id": 13014,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "typeConversion",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "1270:14:65",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes_memory_ptr",
                                          "typeString": "bytes memory"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_bytes_memory_ptr",
                                          "typeString": "bytes memory"
                                        }
                                      ],
                                      "id": 13010,
                                      "name": "keccak256",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -8,
                                      "src": "1260:9:65",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                        "typeString": "function (bytes memory) pure returns (bytes32)"
                                      }
                                    },
                                    "id": 13015,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "1260:25:65",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 13016,
                                    "name": "chainId_",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 12978,
                                    "src": "1295:8:65",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 13019,
                                        "name": "this",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -28,
                                        "src": "1321:4:65",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_Dai_$13609",
                                          "typeString": "contract Dai"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_Dai_$13609",
                                          "typeString": "contract Dai"
                                        }
                                      ],
                                      "id": 13018,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "1313:7:65",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 13017,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "1313:7:65",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 13020,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "1313:13:65",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    },
                                    {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    },
                                    {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 12999,
                                    "name": "abi",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -1,
                                    "src": "1102:3:65",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_abi",
                                      "typeString": "abi"
                                    }
                                  },
                                  "id": 13000,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "memberName": "encode",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "1102:10:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
                                    "typeString": "function () pure returns (bytes memory)"
                                  }
                                },
                                "id": 13021,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "1102:232:65",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bytes_memory_ptr",
                                  "typeString": "bytes memory"
                                }
                              ],
                              "id": 12998,
                              "name": "keccak256",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -8,
                              "src": "1085:9:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                "typeString": "function (bytes memory) pure returns (bytes32)"
                              }
                            },
                            "id": 13022,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1085:255:65",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "src": "1066:274:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "id": 13024,
                        "nodeType": "ExpressionStatement",
                        "src": "1066:274:65"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 12976,
                    "nodeType": "StructuredDocumentation",
                    "src": "610:303:65",
                    "text": " @dev Sets the values for {name} and {symbol}, initializes {decimals} with\n a default value of 18.\n To select a different value for {decimals}, use {_setupDecimals}.\n All three of these values are immutable: they can only be set once during\n construction."
                  },
                  "id": 13026,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 12979,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 12978,
                        "mutability": "mutable",
                        "name": "chainId_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13026,
                        "src": "929:16:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 12977,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "929:7:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "928:18:65"
                  },
                  "returnParameters": {
                    "id": 12980,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "954:0:65"
                  },
                  "scope": 13609,
                  "src": "916:429:65",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 13034,
                    "nodeType": "Block",
                    "src": "1456:25:65",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 13032,
                          "name": "_name",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 12971,
                          "src": "1471:5:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage",
                            "typeString": "string storage ref"
                          }
                        },
                        "functionReturnParameters": 13031,
                        "id": 13033,
                        "nodeType": "Return",
                        "src": "1464:12:65"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 13027,
                    "nodeType": "StructuredDocumentation",
                    "src": "1349:52:65",
                    "text": " @dev Returns the name of the token."
                  },
                  "functionSelector": "06fdde03",
                  "id": 13035,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "name",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13028,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1417:2:65"
                  },
                  "returnParameters": {
                    "id": 13031,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13030,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13035,
                        "src": "1441:13:65",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 13029,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "1441:6:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1440:15:65"
                  },
                  "scope": 13609,
                  "src": "1404:77:65",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 13043,
                    "nodeType": "Block",
                    "src": "1641:27:65",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 13041,
                          "name": "_symbol",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 12973,
                          "src": "1656:7:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage",
                            "typeString": "string storage ref"
                          }
                        },
                        "functionReturnParameters": 13040,
                        "id": 13042,
                        "nodeType": "Return",
                        "src": "1649:14:65"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 13036,
                    "nodeType": "StructuredDocumentation",
                    "src": "1485:99:65",
                    "text": " @dev Returns the symbol of the token, usually a shorter version of the\n name."
                  },
                  "functionSelector": "95d89b41",
                  "id": 13044,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "symbol",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13037,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1602:2:65"
                  },
                  "returnParameters": {
                    "id": 13040,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13039,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13044,
                        "src": "1626:13:65",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 13038,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "1626:6:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1625:15:65"
                  },
                  "scope": 13609,
                  "src": "1587:81:65",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 13052,
                    "nodeType": "Block",
                    "src": "2323:29:65",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 13050,
                          "name": "_decimals",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 12975,
                          "src": "2338:9:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "functionReturnParameters": 13049,
                        "id": 13051,
                        "nodeType": "Return",
                        "src": "2331:16:65"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 13045,
                    "nodeType": "StructuredDocumentation",
                    "src": "1672:600:65",
                    "text": " @dev Returns the number of decimals used to get its user representation.\n For example, if `decimals` equals `2`, a balance of `505` tokens should\n be displayed to a user as `5,05` (`505 / 10 ** 2`).\n Tokens usually opt for a value of 18, imitating the relationship between\n Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is\n called.\n NOTE: This information is only used for _display_ purposes: it in\n no way affects any of the arithmetic of the contract, including\n {IERC20-balanceOf} and {IERC20-transfer}."
                  },
                  "functionSelector": "313ce567",
                  "id": 13053,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "decimals",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13046,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2292:2:65"
                  },
                  "returnParameters": {
                    "id": 13049,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13048,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13053,
                        "src": "2316:5:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 13047,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "2316:5:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2315:7:65"
                  },
                  "scope": 13609,
                  "src": "2275:77:65",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    1891
                  ],
                  "body": {
                    "id": 13062,
                    "nodeType": "Block",
                    "src": "2468:32:65",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 13060,
                          "name": "_totalSupply",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 12969,
                          "src": "2483:12:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 13059,
                        "id": 13061,
                        "nodeType": "Return",
                        "src": "2476:19:65"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 13054,
                    "nodeType": "StructuredDocumentation",
                    "src": "2356:47:65",
                    "text": " @dev See {IERC20-totalSupply}."
                  },
                  "functionSelector": "18160ddd",
                  "id": 13063,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "totalSupply",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 13056,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "2441:8:65"
                  },
                  "parameters": {
                    "id": 13055,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2426:2:65"
                  },
                  "returnParameters": {
                    "id": 13059,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13058,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13063,
                        "src": "2459:7:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13057,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2459:7:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2458:9:65"
                  },
                  "scope": 13609,
                  "src": "2406:94:65",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    1899
                  ],
                  "body": {
                    "id": 13076,
                    "nodeType": "Block",
                    "src": "2627:38:65",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 13072,
                            "name": "_balances",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12961,
                            "src": "2642:9:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                              "typeString": "mapping(address => uint256)"
                            }
                          },
                          "id": 13074,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 13073,
                            "name": "account",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13066,
                            "src": "2652:7:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "2642:18:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 13071,
                        "id": 13075,
                        "nodeType": "Return",
                        "src": "2635:25:65"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 13064,
                    "nodeType": "StructuredDocumentation",
                    "src": "2504:45:65",
                    "text": " @dev See {IERC20-balanceOf}."
                  },
                  "functionSelector": "70a08231",
                  "id": 13077,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "balanceOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 13068,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "2600:8:65"
                  },
                  "parameters": {
                    "id": 13067,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13066,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13077,
                        "src": "2571:15:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13065,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2571:7:65",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2570:17:65"
                  },
                  "returnParameters": {
                    "id": 13071,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13070,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13077,
                        "src": "2618:7:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13069,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2618:7:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2617:9:65"
                  },
                  "scope": 13609,
                  "src": "2552:113:65",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    1909
                  ],
                  "body": {
                    "id": 13097,
                    "nodeType": "Block",
                    "src": "2949:72:65",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 13089,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "2967:3:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 13090,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "2967:10:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13091,
                              "name": "recipient",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13080,
                              "src": "2979:9:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13092,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13082,
                              "src": "2990:6:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 13088,
                            "name": "_transfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13298,
                            "src": "2957:9:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 13093,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2957:40:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13094,
                        "nodeType": "ExpressionStatement",
                        "src": "2957:40:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 13095,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "3012:4:65",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 13087,
                        "id": 13096,
                        "nodeType": "Return",
                        "src": "3005:11:65"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 13078,
                    "nodeType": "StructuredDocumentation",
                    "src": "2669:185:65",
                    "text": " @dev See {IERC20-transfer}.\n Requirements:\n - `recipient` cannot be the zero address.\n - the caller must have a balance of at least `amount`."
                  },
                  "functionSelector": "a9059cbb",
                  "id": 13098,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "transfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 13084,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "2925:8:65"
                  },
                  "parameters": {
                    "id": 13083,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13080,
                        "mutability": "mutable",
                        "name": "recipient",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13098,
                        "src": "2875:17:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13079,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2875:7:65",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13082,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13098,
                        "src": "2894:14:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13081,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2894:7:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2874:35:65"
                  },
                  "returnParameters": {
                    "id": 13087,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13086,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13098,
                        "src": "2943:4:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 13085,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "2943:4:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2942:6:65"
                  },
                  "scope": 13609,
                  "src": "2857:164:65",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    1919
                  ],
                  "body": {
                    "id": 13115,
                    "nodeType": "Block",
                    "src": "3171:47:65",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 13109,
                              "name": "_allowances",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12967,
                              "src": "3186:11:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                "typeString": "mapping(address => mapping(address => uint256))"
                              }
                            },
                            "id": 13111,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 13110,
                              "name": "owner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13101,
                              "src": "3198:5:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "3186:18:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                              "typeString": "mapping(address => uint256)"
                            }
                          },
                          "id": 13113,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 13112,
                            "name": "spender",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13103,
                            "src": "3205:7:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "3186:27:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 13108,
                        "id": 13114,
                        "nodeType": "Return",
                        "src": "3179:34:65"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 13099,
                    "nodeType": "StructuredDocumentation",
                    "src": "3025:45:65",
                    "text": " @dev See {IERC20-allowance}."
                  },
                  "functionSelector": "dd62ed3e",
                  "id": 13116,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "allowance",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 13105,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "3144:8:65"
                  },
                  "parameters": {
                    "id": 13104,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13101,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13116,
                        "src": "3092:13:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13100,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3092:7:65",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13103,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13116,
                        "src": "3107:15:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13102,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3107:7:65",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3091:32:65"
                  },
                  "returnParameters": {
                    "id": 13108,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13107,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13116,
                        "src": "3162:7:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13106,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3162:7:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3161:9:65"
                  },
                  "scope": 13609,
                  "src": "3073:145:65",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    1929
                  ],
                  "body": {
                    "id": 13136,
                    "nodeType": "Block",
                    "src": "3435:69:65",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 13128,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "3452:3:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 13129,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "3452:10:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13130,
                              "name": "spender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13119,
                              "src": "3464:7:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13131,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13121,
                              "src": "3473:6:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 13127,
                            "name": "_approve",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13454,
                            "src": "3443:8:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 13132,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3443:37:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13133,
                        "nodeType": "ExpressionStatement",
                        "src": "3443:37:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 13134,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "3495:4:65",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 13126,
                        "id": 13135,
                        "nodeType": "Return",
                        "src": "3488:11:65"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 13117,
                    "nodeType": "StructuredDocumentation",
                    "src": "3222:121:65",
                    "text": " @dev See {IERC20-approve}.\n Requirements:\n - `spender` cannot be the zero address."
                  },
                  "functionSelector": "095ea7b3",
                  "id": 13137,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "approve",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 13123,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "3411:8:65"
                  },
                  "parameters": {
                    "id": 13122,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13119,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13137,
                        "src": "3363:15:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13118,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3363:7:65",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13121,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13137,
                        "src": "3380:14:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13120,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3380:7:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3362:33:65"
                  },
                  "returnParameters": {
                    "id": 13126,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13125,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13137,
                        "src": "3429:4:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 13124,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "3429:4:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3428:6:65"
                  },
                  "scope": 13609,
                  "src": "3346:158:65",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    6565
                  ],
                  "body": {
                    "id": 13174,
                    "nodeType": "Block",
                    "src": "4061:193:65",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 13151,
                              "name": "sender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13140,
                              "src": "4079:6:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13152,
                              "name": "recipient",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13142,
                              "src": "4087:9:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13153,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13144,
                              "src": "4098:6:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 13150,
                            "name": "_transfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13298,
                            "src": "4069:9:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 13154,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4069:36:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13155,
                        "nodeType": "ExpressionStatement",
                        "src": "4069:36:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 13157,
                              "name": "sender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13140,
                              "src": "4122:6:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 13158,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "4130:3:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 13159,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "4130:10:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 13167,
                                  "name": "amount",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 13144,
                                  "src": "4178:6:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "hexValue": "45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365",
                                  "id": 13168,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "4186:42:65",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_974d1b4421da69cc60b481194f0dad36a5bb4e23da810da7a7fb30cdba178330",
                                    "typeString": "literal_string \"ERC20: transfer amount exceeds allowance\""
                                  },
                                  "value": "ERC20: transfer amount exceeds allowance"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_stringliteral_974d1b4421da69cc60b481194f0dad36a5bb4e23da810da7a7fb30cdba178330",
                                    "typeString": "literal_string \"ERC20: transfer amount exceeds allowance\""
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 13160,
                                      "name": "_allowances",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 12967,
                                      "src": "4142:11:65",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                        "typeString": "mapping(address => mapping(address => uint256))"
                                      }
                                    },
                                    "id": 13162,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 13161,
                                      "name": "sender",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 13140,
                                      "src": "4154:6:65",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "4142:19:65",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                      "typeString": "mapping(address => uint256)"
                                    }
                                  },
                                  "id": 13165,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 13163,
                                      "name": "msg",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -15,
                                      "src": "4162:3:65",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_magic_message",
                                        "typeString": "msg"
                                      }
                                    },
                                    "id": 13164,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "sender",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": null,
                                    "src": "4162:10:65",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address_payable",
                                      "typeString": "address payable"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "4142:31:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 13166,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sub",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 1237,
                                "src": "4142:35:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_string_memory_ptr_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                  "typeString": "function (uint256,uint256,string memory) pure returns (uint256)"
                                }
                              },
                              "id": 13169,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "4142:87:65",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 13156,
                            "name": "_approve",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13454,
                            "src": "4113:8:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 13170,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4113:117:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13171,
                        "nodeType": "ExpressionStatement",
                        "src": "4113:117:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 13172,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "4245:4:65",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 13149,
                        "id": 13173,
                        "nodeType": "Return",
                        "src": "4238:11:65"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 13138,
                    "nodeType": "StructuredDocumentation",
                    "src": "3508:438:65",
                    "text": " @dev See {IERC20-transferFrom}.\n Emits an {Approval} event indicating the updated allowance. This is not\n required by the EIP. See the note at the beginning of {ERC20};\n Requirements:\n - `sender` and `recipient` cannot be the zero address.\n - `sender` must have a balance of at least `amount`.\n - the caller must have allowance for ``sender``'s tokens of at least\n `amount`."
                  },
                  "functionSelector": "23b872dd",
                  "id": 13175,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "transferFrom",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 13146,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "4037:8:65"
                  },
                  "parameters": {
                    "id": 13145,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13140,
                        "mutability": "mutable",
                        "name": "sender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13175,
                        "src": "3971:14:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13139,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3971:7:65",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13142,
                        "mutability": "mutable",
                        "name": "recipient",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13175,
                        "src": "3987:17:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13141,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3987:7:65",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13144,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13175,
                        "src": "4006:14:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13143,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4006:7:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3970:51:65"
                  },
                  "returnParameters": {
                    "id": 13149,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13148,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13175,
                        "src": "4055:4:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 13147,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "4055:4:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4054:6:65"
                  },
                  "scope": 13609,
                  "src": "3949:305:65",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 13202,
                    "nodeType": "Block",
                    "src": "4728:111:65",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 13186,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "4745:3:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 13187,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "4745:10:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13188,
                              "name": "spender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13178,
                              "src": "4757:7:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 13196,
                                  "name": "addedValue",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 13180,
                                  "src": "4803:10:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 13189,
                                      "name": "_allowances",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 12967,
                                      "src": "4766:11:65",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                        "typeString": "mapping(address => mapping(address => uint256))"
                                      }
                                    },
                                    "id": 13192,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 13190,
                                        "name": "msg",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -15,
                                        "src": "4778:3:65",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_magic_message",
                                          "typeString": "msg"
                                        }
                                      },
                                      "id": 13191,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "sender",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": null,
                                      "src": "4778:10:65",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address_payable",
                                        "typeString": "address payable"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "4766:23:65",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                      "typeString": "mapping(address => uint256)"
                                    }
                                  },
                                  "id": 13194,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 13193,
                                    "name": "spender",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 13178,
                                    "src": "4790:7:65",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "4766:32:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 13195,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "add",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 1113,
                                "src": "4766:36:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                  "typeString": "function (uint256,uint256) pure returns (uint256)"
                                }
                              },
                              "id": 13197,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "4766:48:65",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 13185,
                            "name": "_approve",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13454,
                            "src": "4736:8:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 13198,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4736:79:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13199,
                        "nodeType": "ExpressionStatement",
                        "src": "4736:79:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 13200,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "4830:4:65",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 13184,
                        "id": 13201,
                        "nodeType": "Return",
                        "src": "4823:11:65"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 13176,
                    "nodeType": "StructuredDocumentation",
                    "src": "4258:373:65",
                    "text": " @dev Atomically increases the allowance granted to `spender` by the caller.\n This is an alternative to {approve} that can be used as a mitigation for\n problems described in {IERC20-approve}.\n Emits an {Approval} event indicating the updated allowance.\n Requirements:\n - `spender` cannot be the zero address."
                  },
                  "functionSelector": "39509351",
                  "id": 13203,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "increaseAllowance",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13181,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13178,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13203,
                        "src": "4661:15:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13177,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4661:7:65",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13180,
                        "mutability": "mutable",
                        "name": "addedValue",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13203,
                        "src": "4678:18:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13179,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4678:7:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4660:37:65"
                  },
                  "returnParameters": {
                    "id": 13184,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13183,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13203,
                        "src": "4722:4:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 13182,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "4722:4:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4721:6:65"
                  },
                  "scope": 13609,
                  "src": "4634:205:65",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 13231,
                    "nodeType": "Block",
                    "src": "5408:157:65",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 13214,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "5425:3:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 13215,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "5425:10:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13216,
                              "name": "spender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13206,
                              "src": "5437:7:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 13224,
                                  "name": "subtractedValue",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 13208,
                                  "src": "5483:15:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "hexValue": "45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f",
                                  "id": 13225,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "5500:39:65",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_f8b476f7d28209d77d4a4ac1fe36b9f8259aa1bb6bddfa6e89de7e51615cf8a8",
                                    "typeString": "literal_string \"ERC20: decreased allowance below zero\""
                                  },
                                  "value": "ERC20: decreased allowance below zero"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_stringliteral_f8b476f7d28209d77d4a4ac1fe36b9f8259aa1bb6bddfa6e89de7e51615cf8a8",
                                    "typeString": "literal_string \"ERC20: decreased allowance below zero\""
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 13217,
                                      "name": "_allowances",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 12967,
                                      "src": "5446:11:65",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                        "typeString": "mapping(address => mapping(address => uint256))"
                                      }
                                    },
                                    "id": 13220,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 13218,
                                        "name": "msg",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -15,
                                        "src": "5458:3:65",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_magic_message",
                                          "typeString": "msg"
                                        }
                                      },
                                      "id": 13219,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "sender",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": null,
                                      "src": "5458:10:65",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address_payable",
                                        "typeString": "address payable"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "5446:23:65",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                      "typeString": "mapping(address => uint256)"
                                    }
                                  },
                                  "id": 13222,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 13221,
                                    "name": "spender",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 13206,
                                    "src": "5470:7:65",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "5446:32:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 13223,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "sub",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 1237,
                                "src": "5446:36:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_string_memory_ptr_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                  "typeString": "function (uint256,uint256,string memory) pure returns (uint256)"
                                }
                              },
                              "id": 13226,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5446:94:65",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 13213,
                            "name": "_approve",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13454,
                            "src": "5416:8:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 13227,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5416:125:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13228,
                        "nodeType": "ExpressionStatement",
                        "src": "5416:125:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 13229,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "5556:4:65",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 13212,
                        "id": 13230,
                        "nodeType": "Return",
                        "src": "5549:11:65"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 13204,
                    "nodeType": "StructuredDocumentation",
                    "src": "4843:463:65",
                    "text": " @dev Atomically decreases the allowance granted to `spender` by the caller.\n This is an alternative to {approve} that can be used as a mitigation for\n problems described in {IERC20-approve}.\n Emits an {Approval} event indicating the updated allowance.\n Requirements:\n - `spender` cannot be the zero address.\n - `spender` must have allowance for the caller of at least\n `subtractedValue`."
                  },
                  "functionSelector": "a457c2d7",
                  "id": 13232,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "decreaseAllowance",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13209,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13206,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13232,
                        "src": "5336:15:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13205,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5336:7:65",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13208,
                        "mutability": "mutable",
                        "name": "subtractedValue",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13232,
                        "src": "5353:23:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13207,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "5353:7:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5335:42:65"
                  },
                  "returnParameters": {
                    "id": 13212,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13211,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13232,
                        "src": "5402:4:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 13210,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "5402:4:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5401:6:65"
                  },
                  "scope": 13609,
                  "src": "5309:256:65",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 13297,
                    "nodeType": "Block",
                    "src": "6109:429:65",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 13248,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 13243,
                                "name": "sender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 13235,
                                "src": "6125:6:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 13246,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "6143:1:65",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 13245,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "6135:7:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 13244,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "6135:7:65",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 13247,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "6135:10:65",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "6125:20:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "45524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373",
                              "id": 13249,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "6147:39:65",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea",
                                "typeString": "literal_string \"ERC20: transfer from the zero address\""
                              },
                              "value": "ERC20: transfer from the zero address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea",
                                "typeString": "literal_string \"ERC20: transfer from the zero address\""
                              }
                            ],
                            "id": 13242,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "6117:7:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 13250,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6117:70:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13251,
                        "nodeType": "ExpressionStatement",
                        "src": "6117:70:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 13258,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 13253,
                                "name": "recipient",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 13237,
                                "src": "6203:9:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 13256,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "6224:1:65",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 13255,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "6216:7:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 13254,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "6216:7:65",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 13257,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "6216:10:65",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "6203:23:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "45524332303a207472616e7366657220746f20746865207a65726f2061646472657373",
                              "id": 13259,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "6228:37:65",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f",
                                "typeString": "literal_string \"ERC20: transfer to the zero address\""
                              },
                              "value": "ERC20: transfer to the zero address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f",
                                "typeString": "literal_string \"ERC20: transfer to the zero address\""
                              }
                            ],
                            "id": 13252,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "6195:7:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 13260,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6195:71:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13261,
                        "nodeType": "ExpressionStatement",
                        "src": "6195:71:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 13263,
                              "name": "sender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13235,
                              "src": "6296:6:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13264,
                              "name": "recipient",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13237,
                              "src": "6304:9:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13265,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13239,
                              "src": "6315:6:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 13262,
                            "name": "_beforeTokenTransfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13476,
                            "src": "6275:20:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 13266,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6275:47:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13267,
                        "nodeType": "ExpressionStatement",
                        "src": "6275:47:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 13278,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 13268,
                              "name": "_balances",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12961,
                              "src": "6331:9:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 13270,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 13269,
                              "name": "sender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13235,
                              "src": "6341:6:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "6331:17:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 13275,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 13239,
                                "src": "6373:6:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365",
                                "id": 13276,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "string",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "6381:40:65",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_stringliteral_4107e8a8b9e94bf8ff83080ddec1c0bffe897ebc2241b89d44f66b3d274088b6",
                                  "typeString": "literal_string \"ERC20: transfer amount exceeds balance\""
                                },
                                "value": "ERC20: transfer amount exceeds balance"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_4107e8a8b9e94bf8ff83080ddec1c0bffe897ebc2241b89d44f66b3d274088b6",
                                  "typeString": "literal_string \"ERC20: transfer amount exceeds balance\""
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 13271,
                                  "name": "_balances",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 12961,
                                  "src": "6351:9:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 13273,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 13272,
                                  "name": "sender",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 13235,
                                  "src": "6361:6:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "6351:17:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 13274,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1237,
                              "src": "6351:21:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_string_memory_ptr_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256,string memory) pure returns (uint256)"
                              }
                            },
                            "id": 13277,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "6351:71:65",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "6331:91:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 13279,
                        "nodeType": "ExpressionStatement",
                        "src": "6331:91:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 13289,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 13280,
                              "name": "_balances",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12961,
                              "src": "6430:9:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 13282,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 13281,
                              "name": "recipient",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13237,
                              "src": "6440:9:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "6430:20:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 13287,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 13239,
                                "src": "6478:6:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 13283,
                                  "name": "_balances",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 12961,
                                  "src": "6453:9:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 13285,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 13284,
                                  "name": "recipient",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 13237,
                                  "src": "6463:9:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "6453:20:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 13286,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1113,
                              "src": "6453:24:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 13288,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "6453:32:65",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "6430:55:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 13290,
                        "nodeType": "ExpressionStatement",
                        "src": "6430:55:65"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 13292,
                              "name": "sender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13235,
                              "src": "6507:6:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13293,
                              "name": "recipient",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13237,
                              "src": "6515:9:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13294,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13239,
                              "src": "6526:6:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 13291,
                            "name": "Transfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1950,
                            "src": "6498:8:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 13295,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6498:35:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13296,
                        "nodeType": "EmitStatement",
                        "src": "6493:40:65"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 13233,
                    "nodeType": "StructuredDocumentation",
                    "src": "5569:450:65",
                    "text": " @dev Moves tokens `amount` from `sender` to `recipient`.\n This is internal function is equivalent to {transfer}, and can be used to\n e.g. implement automatic token fees, slashing mechanisms, etc.\n Emits a {Transfer} event.\n Requirements:\n - `sender` cannot be the zero address.\n - `recipient` cannot be the zero address.\n - `sender` must have a balance of at least `amount`."
                  },
                  "id": 13298,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_transfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13240,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13235,
                        "mutability": "mutable",
                        "name": "sender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13298,
                        "src": "6041:14:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13234,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6041:7:65",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13237,
                        "mutability": "mutable",
                        "name": "recipient",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13298,
                        "src": "6057:17:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13236,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6057:7:65",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13239,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13298,
                        "src": "6076:14:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13238,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6076:7:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6040:51:65"
                  },
                  "returnParameters": {
                    "id": 13241,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6109:0:65"
                  },
                  "scope": 13609,
                  "src": "6022:516:65",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 13352,
                    "nodeType": "Block",
                    "src": "6861:293:65",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 13312,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 13307,
                                "name": "account",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 13301,
                                "src": "6877:7:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 13310,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "6896:1:65",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 13309,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "6888:7:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 13308,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "6888:7:65",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 13311,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "6888:10:65",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "6877:21:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "45524332303a206d696e7420746f20746865207a65726f2061646472657373",
                              "id": 13313,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "6900:33:65",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e",
                                "typeString": "literal_string \"ERC20: mint to the zero address\""
                              },
                              "value": "ERC20: mint to the zero address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e",
                                "typeString": "literal_string \"ERC20: mint to the zero address\""
                              }
                            ],
                            "id": 13306,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "6869:7:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 13314,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6869:65:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13315,
                        "nodeType": "ExpressionStatement",
                        "src": "6869:65:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 13319,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "6972:1:65",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 13318,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "6964:7:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 13317,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "6964:7:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 13320,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6964:10:65",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13321,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13301,
                              "src": "6976:7:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13322,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13303,
                              "src": "6985:6:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 13316,
                            "name": "_beforeTokenTransfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13476,
                            "src": "6943:20:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 13323,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6943:49:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13324,
                        "nodeType": "ExpressionStatement",
                        "src": "6943:49:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 13330,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 13325,
                            "name": "_totalSupply",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12969,
                            "src": "7001:12:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 13328,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 13303,
                                "src": "7033:6:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 13326,
                                "name": "_totalSupply",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 12969,
                                "src": "7016:12:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 13327,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1113,
                              "src": "7016:16:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 13329,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "7016:24:65",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "7001:39:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 13331,
                        "nodeType": "ExpressionStatement",
                        "src": "7001:39:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 13341,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 13332,
                              "name": "_balances",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12961,
                              "src": "7048:9:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 13334,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 13333,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13301,
                              "src": "7058:7:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "7048:18:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 13339,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 13303,
                                "src": "7092:6:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 13335,
                                  "name": "_balances",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 12961,
                                  "src": "7069:9:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 13337,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 13336,
                                  "name": "account",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 13301,
                                  "src": "7079:7:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "7069:18:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 13338,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1113,
                              "src": "7069:22:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 13340,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "7069:30:65",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "7048:51:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 13342,
                        "nodeType": "ExpressionStatement",
                        "src": "7048:51:65"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 13346,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "7129:1:65",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 13345,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "7121:7:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 13344,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "7121:7:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 13347,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7121:10:65",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13348,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13301,
                              "src": "7133:7:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13349,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13303,
                              "src": "7142:6:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 13343,
                            "name": "Transfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1950,
                            "src": "7112:8:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 13350,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7112:37:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13351,
                        "nodeType": "EmitStatement",
                        "src": "7107:42:65"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 13299,
                    "nodeType": "StructuredDocumentation",
                    "src": "6542:251:65",
                    "text": "@dev Creates `amount` tokens and assigns them to `account`, increasing\n the total supply.\n Emits a {Transfer} event with `from` set to the zero address.\n Requirements\n - `to` cannot be the zero address."
                  },
                  "id": 13353,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_mint",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13304,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13301,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13353,
                        "src": "6811:15:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13300,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6811:7:65",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13303,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13353,
                        "src": "6828:14:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13302,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6828:7:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6810:33:65"
                  },
                  "returnParameters": {
                    "id": 13305,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6861:0:65"
                  },
                  "scope": 13609,
                  "src": "6796:358:65",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 13408,
                    "nodeType": "Block",
                    "src": "7524:333:65",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 13367,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 13362,
                                "name": "account",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 13356,
                                "src": "7540:7:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 13365,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "7559:1:65",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 13364,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "7551:7:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 13363,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "7551:7:65",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 13366,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "7551:10:65",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "7540:21:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "45524332303a206275726e2066726f6d20746865207a65726f2061646472657373",
                              "id": 13368,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7563:35:65",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_b16788493b576042bb52c50ed56189e0b250db113c7bfb1c3897d25cf9632d7f",
                                "typeString": "literal_string \"ERC20: burn from the zero address\""
                              },
                              "value": "ERC20: burn from the zero address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_b16788493b576042bb52c50ed56189e0b250db113c7bfb1c3897d25cf9632d7f",
                                "typeString": "literal_string \"ERC20: burn from the zero address\""
                              }
                            ],
                            "id": 13361,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "7532:7:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 13369,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7532:67:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13370,
                        "nodeType": "ExpressionStatement",
                        "src": "7532:67:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 13372,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13356,
                              "src": "7629:7:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 13375,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "7646:1:65",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 13374,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "7638:7:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 13373,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "7638:7:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 13376,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7638:10:65",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13377,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13358,
                              "src": "7650:6:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 13371,
                            "name": "_beforeTokenTransfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13476,
                            "src": "7608:20:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 13378,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7608:49:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13379,
                        "nodeType": "ExpressionStatement",
                        "src": "7608:49:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 13390,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 13380,
                              "name": "_balances",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 12961,
                              "src": "7666:9:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 13382,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 13381,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13356,
                              "src": "7676:7:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "7666:18:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 13387,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 13358,
                                "src": "7710:6:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "45524332303a206275726e20616d6f756e7420657863656564732062616c616e6365",
                                "id": 13388,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "string",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "7718:36:65",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_stringliteral_149b126e7125232b4200af45303d04fba8b74653b1a295a6a561a528c33fefdd",
                                  "typeString": "literal_string \"ERC20: burn amount exceeds balance\""
                                },
                                "value": "ERC20: burn amount exceeds balance"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_149b126e7125232b4200af45303d04fba8b74653b1a295a6a561a528c33fefdd",
                                  "typeString": "literal_string \"ERC20: burn amount exceeds balance\""
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 13383,
                                  "name": "_balances",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 12961,
                                  "src": "7687:9:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 13385,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 13384,
                                  "name": "account",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 13356,
                                  "src": "7697:7:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "7687:18:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 13386,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1237,
                              "src": "7687:22:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_string_memory_ptr_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256,string memory) pure returns (uint256)"
                              }
                            },
                            "id": 13389,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "7687:68:65",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "7666:89:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 13391,
                        "nodeType": "ExpressionStatement",
                        "src": "7666:89:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 13397,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 13392,
                            "name": "_totalSupply",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12969,
                            "src": "7763:12:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 13395,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 13358,
                                "src": "7795:6:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 13393,
                                "name": "_totalSupply",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 12969,
                                "src": "7778:12:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 13394,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1135,
                              "src": "7778:16:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 13396,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "7778:24:65",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "7763:39:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 13398,
                        "nodeType": "ExpressionStatement",
                        "src": "7763:39:65"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 13400,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13356,
                              "src": "7824:7:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 13403,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "7841:1:65",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 13402,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "7833:7:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 13401,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "7833:7:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 13404,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7833:10:65",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13405,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13358,
                              "src": "7845:6:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 13399,
                            "name": "Transfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1950,
                            "src": "7815:8:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 13406,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7815:37:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13407,
                        "nodeType": "EmitStatement",
                        "src": "7810:42:65"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 13354,
                    "nodeType": "StructuredDocumentation",
                    "src": "7158:298:65",
                    "text": " @dev Destroys `amount` tokens from `account`, reducing the\n total supply.\n Emits a {Transfer} event with `to` set to the zero address.\n Requirements\n - `account` cannot be the zero address.\n - `account` must have at least `amount` tokens."
                  },
                  "id": 13409,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_burn",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13359,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13356,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13409,
                        "src": "7474:15:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13355,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7474:7:65",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13358,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13409,
                        "src": "7491:14:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13357,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7491:7:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7473:33:65"
                  },
                  "returnParameters": {
                    "id": 13360,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "7524:0:65"
                  },
                  "scope": 13609,
                  "src": "7459:398:65",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 13453,
                    "nodeType": "Block",
                    "src": "8347:247:65",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 13425,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 13420,
                                "name": "owner",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 13412,
                                "src": "8363:5:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 13423,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "8380:1:65",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 13422,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "8372:7:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 13421,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "8372:7:65",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 13424,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "8372:10:65",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "8363:19:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "45524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373",
                              "id": 13426,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "8384:38:65",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208",
                                "typeString": "literal_string \"ERC20: approve from the zero address\""
                              },
                              "value": "ERC20: approve from the zero address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208",
                                "typeString": "literal_string \"ERC20: approve from the zero address\""
                              }
                            ],
                            "id": 13419,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "8355:7:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 13427,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8355:68:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13428,
                        "nodeType": "ExpressionStatement",
                        "src": "8355:68:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 13435,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 13430,
                                "name": "spender",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 13414,
                                "src": "8439:7:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 13433,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "8458:1:65",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 13432,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "8450:7:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 13431,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "8450:7:65",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 13434,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "8450:10:65",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "8439:21:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "45524332303a20617070726f766520746f20746865207a65726f2061646472657373",
                              "id": 13436,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "8462:36:65",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029",
                                "typeString": "literal_string \"ERC20: approve to the zero address\""
                              },
                              "value": "ERC20: approve to the zero address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029",
                                "typeString": "literal_string \"ERC20: approve to the zero address\""
                              }
                            ],
                            "id": 13429,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "8431:7:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 13437,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8431:68:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13438,
                        "nodeType": "ExpressionStatement",
                        "src": "8431:68:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 13445,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 13439,
                                "name": "_allowances",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 12967,
                                "src": "8508:11:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                  "typeString": "mapping(address => mapping(address => uint256))"
                                }
                              },
                              "id": 13442,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 13440,
                                "name": "owner",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 13412,
                                "src": "8520:5:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "8508:18:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 13443,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 13441,
                              "name": "spender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13414,
                              "src": "8527:7:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "8508:27:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 13444,
                            "name": "amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13416,
                            "src": "8538:6:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "8508:36:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 13446,
                        "nodeType": "ExpressionStatement",
                        "src": "8508:36:65"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 13448,
                              "name": "owner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13412,
                              "src": "8566:5:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13449,
                              "name": "spender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13414,
                              "src": "8573:7:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13450,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13416,
                              "src": "8582:6:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 13447,
                            "name": "Approval",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1959,
                            "src": "8557:8:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 13451,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8557:32:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13452,
                        "nodeType": "EmitStatement",
                        "src": "8552:37:65"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 13410,
                    "nodeType": "StructuredDocumentation",
                    "src": "7861:400:65",
                    "text": " @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n This internal function is equivalent to `approve`, and can be used to\n e.g. set automatic allowances for certain subsystems, etc.\n Emits an {Approval} event.\n Requirements:\n - `owner` cannot be the zero address.\n - `spender` cannot be the zero address."
                  },
                  "id": 13454,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_approve",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13417,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13412,
                        "mutability": "mutable",
                        "name": "owner",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13454,
                        "src": "8282:13:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13411,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8282:7:65",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13414,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13454,
                        "src": "8297:15:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13413,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8297:7:65",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13416,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13454,
                        "src": "8314:14:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13415,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "8314:7:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8281:48:65"
                  },
                  "returnParameters": {
                    "id": 13418,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "8347:0:65"
                  },
                  "scope": 13609,
                  "src": "8264:330:65",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 13464,
                    "nodeType": "Block",
                    "src": "8957:34:65",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 13462,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 13460,
                            "name": "_decimals",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 12975,
                            "src": "8965:9:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 13461,
                            "name": "decimals_",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13457,
                            "src": "8977:9:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            }
                          },
                          "src": "8965:21:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "id": 13463,
                        "nodeType": "ExpressionStatement",
                        "src": "8965:21:65"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 13455,
                    "nodeType": "StructuredDocumentation",
                    "src": "8598:306:65",
                    "text": " @dev Sets {decimals} to a value other than the default one of 18.\n WARNING: This function should only be called from the constructor. Most\n applications that interact with token contracts will not expect\n {decimals} to ever change, and may work incorrectly if it does."
                  },
                  "id": 13465,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_setupDecimals",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13458,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13457,
                        "mutability": "mutable",
                        "name": "decimals_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13465,
                        "src": "8931:15:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 13456,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "8931:5:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8930:17:65"
                  },
                  "returnParameters": {
                    "id": 13459,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "8957:0:65"
                  },
                  "scope": 13609,
                  "src": "8907:84:65",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 13475,
                    "nodeType": "Block",
                    "src": "9650:3:65",
                    "statements": []
                  },
                  "documentation": {
                    "id": 13466,
                    "nodeType": "StructuredDocumentation",
                    "src": "8995:563:65",
                    "text": " @dev Hook that is called before any transfer of tokens. This includes\n minting and burning.\n Calling conditions:\n - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n will be to transferred to `to`.\n - when `from` is zero, `amount` tokens will be minted for `to`.\n - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n - `from` and `to` are never both zero.\n To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]."
                  },
                  "id": 13476,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_beforeTokenTransfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13473,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13468,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13476,
                        "src": "9591:12:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13467,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "9591:7:65",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13470,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13476,
                        "src": "9605:10:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13469,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "9605:7:65",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13472,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13476,
                        "src": "9617:14:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13471,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "9617:7:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9590:42:65"
                  },
                  "returnParameters": {
                    "id": 13474,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "9650:0:65"
                  },
                  "scope": 13609,
                  "src": "9561:92:65",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "functionSelector": "7ecebe00",
                  "id": 13480,
                  "mutability": "mutable",
                  "name": "nonces",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 13609,
                  "src": "9657:60:65",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                    "typeString": "mapping(address => uint256)"
                  },
                  "typeName": {
                    "id": 13479,
                    "keyType": {
                      "id": 13477,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "9666:7:65",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "9657:25:65",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                      "typeString": "mapping(address => uint256)"
                    },
                    "valueType": {
                      "id": 13478,
                      "name": "uint",
                      "nodeType": "ElementaryTypeName",
                      "src": "9677:4:65",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "3644e515",
                  "id": 13482,
                  "mutability": "mutable",
                  "name": "DOMAIN_SEPARATOR",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 13609,
                  "src": "9751:31:65",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 13481,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "9751:7:65",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": true,
                  "functionSelector": "30adf81f",
                  "id": 13485,
                  "mutability": "constant",
                  "name": "PERMIT_TYPEHASH",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 13609,
                  "src": "9928:108:65",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 13483,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "9928:7:65",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "307865613261613061316265313161303765643836643735356339333436376634663832333632623435323337316431626139346431373135313233353131616362",
                    "id": 13484,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "9970:66:65",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_105916522785188513640362517802612480037966763957092682311465172263008277174987_by_1",
                      "typeString": "int_const 1059...(70 digits omitted)...4987"
                    },
                    "value": "0xea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb"
                  },
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    6553
                  ],
                  "body": {
                    "id": 13594,
                    "nodeType": "Block",
                    "src": "10229:694:65",
                    "statements": [
                      {
                        "assignments": [
                          13506
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 13506,
                            "mutability": "mutable",
                            "name": "digest",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 13594,
                            "src": "10235:14:65",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            "typeName": {
                              "id": 13505,
                              "name": "bytes32",
                              "nodeType": "ElementaryTypeName",
                              "src": "10235:7:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 13525,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "1901",
                                  "id": 13510,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "10295:10:65",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541",
                                    "typeString": "literal_string \"\u0019\u0001\""
                                  },
                                  "value": "\u0019\u0001"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 13511,
                                  "name": "DOMAIN_SEPARATOR",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 13482,
                                  "src": "10315:16:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 13515,
                                          "name": "PERMIT_TYPEHASH",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 13485,
                                          "src": "10386:15:65",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 13516,
                                          "name": "holder",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 13487,
                                          "src": "10415:6:65",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 13517,
                                          "name": "spender",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 13489,
                                          "src": "10435:7:65",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 13518,
                                          "name": "nonce",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 13491,
                                          "src": "10456:5:65",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 13519,
                                          "name": "expiry",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 13493,
                                          "src": "10475:6:65",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 13520,
                                          "name": "allowed",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 13495,
                                          "src": "10495:7:65",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                          },
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          },
                                          {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                          },
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 13513,
                                          "name": "abi",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": -1,
                                          "src": "10362:3:65",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_magic_abi",
                                            "typeString": "abi"
                                          }
                                        },
                                        "id": 13514,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "memberName": "encode",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": null,
                                        "src": "10362:10:65",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$",
                                          "typeString": "function () pure returns (bytes memory)"
                                        }
                                      },
                                      "id": 13521,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "10362:152:65",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes memory"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_bytes_memory_ptr",
                                        "typeString": "bytes memory"
                                      }
                                    ],
                                    "id": 13512,
                                    "name": "keccak256",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -8,
                                    "src": "10341:9:65",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                                      "typeString": "function (bytes memory) pure returns (bytes32)"
                                    }
                                  },
                                  "id": 13522,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "10341:183:65",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541",
                                    "typeString": "literal_string \"\u0019\u0001\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  },
                                  {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 13508,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "10269:3:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 13509,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodePacked",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "10269:16:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function () pure returns (bytes memory)"
                                }
                              },
                              "id": 13523,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "10269:263:65",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 13507,
                            "name": "keccak256",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -8,
                            "src": "10252:9:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                              "typeString": "function (bytes memory) pure returns (bytes32)"
                            }
                          },
                          "id": 13524,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10252:286:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "10235:303:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 13532,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 13527,
                                "name": "holder",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 13487,
                                "src": "10553:6:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 13530,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "10571:1:65",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 13529,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "10563:7:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 13528,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "10563:7:65",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 13531,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "10563:10:65",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "10553:20:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4461692f696e76616c69642d616464726573732d30",
                              "id": 13533,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "10575:23:65",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_6cade1c7c8c98b461ad80d1311ad396c59d17ffb04ff0f7a511ced53dd9ceec1",
                                "typeString": "literal_string \"Dai/invalid-address-0\""
                              },
                              "value": "Dai/invalid-address-0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_6cade1c7c8c98b461ad80d1311ad396c59d17ffb04ff0f7a511ced53dd9ceec1",
                                "typeString": "literal_string \"Dai/invalid-address-0\""
                              }
                            ],
                            "id": 13526,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "10545:7:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 13534,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10545:54:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13535,
                        "nodeType": "ExpressionStatement",
                        "src": "10545:54:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 13544,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 13537,
                                "name": "holder",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 13487,
                                "src": "10613:6:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 13539,
                                    "name": "digest",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 13506,
                                    "src": "10633:6:65",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 13540,
                                    "name": "v",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 13497,
                                    "src": "10641:1:65",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint8",
                                      "typeString": "uint8"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 13541,
                                    "name": "r",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 13499,
                                    "src": "10644:1:65",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 13542,
                                    "name": "s",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 13501,
                                    "src": "10647:1:65",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    },
                                    {
                                      "typeIdentifier": "t_uint8",
                                      "typeString": "uint8"
                                    },
                                    {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    },
                                    {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  ],
                                  "id": 13538,
                                  "name": "ecrecover",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -6,
                                  "src": "10623:9:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_ecrecover_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$",
                                    "typeString": "function (bytes32,uint8,bytes32,bytes32) pure returns (address)"
                                  }
                                },
                                "id": 13543,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "10623:26:65",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "src": "10613:36:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4461692f696e76616c69642d7065726d6974",
                              "id": 13545,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "10651:20:65",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_e974ba7acb290ca076887e7ba12e7b1839924d20ca241ab20707d98be809b312",
                                "typeString": "literal_string \"Dai/invalid-permit\""
                              },
                              "value": "Dai/invalid-permit"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_e974ba7acb290ca076887e7ba12e7b1839924d20ca241ab20707d98be809b312",
                                "typeString": "literal_string \"Dai/invalid-permit\""
                              }
                            ],
                            "id": 13536,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "10605:7:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 13546,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10605:67:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13547,
                        "nodeType": "ExpressionStatement",
                        "src": "10605:67:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 13555,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 13551,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 13549,
                                  "name": "expiry",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 13493,
                                  "src": "10686:6:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 13550,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "10696:1:65",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "10686:11:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 13554,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 13552,
                                  "name": "now",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -17,
                                  "src": "10701:3:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "<=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 13553,
                                  "name": "expiry",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 13493,
                                  "src": "10708:6:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "10701:13:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "10686:28:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4461692f7065726d69742d65787069726564",
                              "id": 13556,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "10716:20:65",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_22f5fc5d7aaf9b3e6dfc2273ed4394be56ea60a0b5067b49b7f63dc922b30c7a",
                                "typeString": "literal_string \"Dai/permit-expired\""
                              },
                              "value": "Dai/permit-expired"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_22f5fc5d7aaf9b3e6dfc2273ed4394be56ea60a0b5067b49b7f63dc922b30c7a",
                                "typeString": "literal_string \"Dai/permit-expired\""
                              }
                            ],
                            "id": 13548,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "10678:7:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 13557,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10678:59:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13558,
                        "nodeType": "ExpressionStatement",
                        "src": "10678:59:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 13565,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 13560,
                                "name": "nonce",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 13491,
                                "src": "10751:5:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 13564,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "UnaryOperation",
                                "operator": "++",
                                "prefix": false,
                                "src": "10760:16:65",
                                "subExpression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 13561,
                                    "name": "nonces",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 13480,
                                    "src": "10760:6:65",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                      "typeString": "mapping(address => uint256)"
                                    }
                                  },
                                  "id": 13563,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 13562,
                                    "name": "holder",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 13487,
                                    "src": "10767:6:65",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "10760:14:65",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "10751:25:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4461692f696e76616c69642d6e6f6e6365",
                              "id": 13566,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "10778:19:65",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_56fdb16ed5471260b4f6bf21cd668c7795fa94d1be81d33f14e5ceb3647b779b",
                                "typeString": "literal_string \"Dai/invalid-nonce\""
                              },
                              "value": "Dai/invalid-nonce"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_56fdb16ed5471260b4f6bf21cd668c7795fa94d1be81d33f14e5ceb3647b779b",
                                "typeString": "literal_string \"Dai/invalid-nonce\""
                              }
                            ],
                            "id": 13559,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "10743:7:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 13567,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10743:55:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13568,
                        "nodeType": "ExpressionStatement",
                        "src": "10743:55:65"
                      },
                      {
                        "assignments": [
                          13570
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 13570,
                            "mutability": "mutable",
                            "name": "wad",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 13594,
                            "src": "10804:8:65",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 13569,
                              "name": "uint",
                              "nodeType": "ElementaryTypeName",
                              "src": "10804:4:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 13579,
                        "initialValue": {
                          "argumentTypes": null,
                          "condition": {
                            "argumentTypes": null,
                            "id": 13571,
                            "name": "allowed",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13495,
                            "src": "10815:7:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 13577,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "10836:1:65",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "id": 13578,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "Conditional",
                          "src": "10815:22:65",
                          "trueExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 13575,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "UnaryOperation",
                                "operator": "-",
                                "prefix": true,
                                "src": "10830:2:65",
                                "subExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "31",
                                  "id": 13574,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "10831:1:65",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_1_by_1",
                                    "typeString": "int_const 1"
                                  },
                                  "value": "1"
                                },
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_minus_1_by_1",
                                  "typeString": "int_const -1"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_minus_1_by_1",
                                  "typeString": "int_const -1"
                                }
                              ],
                              "id": 13573,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "10825:4:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint256_$",
                                "typeString": "type(uint256)"
                              },
                              "typeName": {
                                "id": 13572,
                                "name": "uint",
                                "nodeType": "ElementaryTypeName",
                                "src": "10825:4:65",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 13576,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "10825:8:65",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "10804:33:65"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 13586,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 13580,
                                "name": "_allowances",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 12967,
                                "src": "10843:11:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_uint256_$_$",
                                  "typeString": "mapping(address => mapping(address => uint256))"
                                }
                              },
                              "id": 13583,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 13581,
                                "name": "holder",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 13487,
                                "src": "10855:6:65",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "10843:19:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 13584,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 13582,
                              "name": "spender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13489,
                              "src": "10863:7:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "10843:28:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 13585,
                            "name": "wad",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13570,
                            "src": "10874:3:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "10843:34:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 13587,
                        "nodeType": "ExpressionStatement",
                        "src": "10843:34:65"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 13589,
                              "name": "holder",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13487,
                              "src": "10897:6:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13590,
                              "name": "spender",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13489,
                              "src": "10905:7:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13591,
                              "name": "wad",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13570,
                              "src": "10914:3:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 13588,
                            "name": "Approval",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1959,
                            "src": "10888:8:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 13592,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10888:30:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13593,
                        "nodeType": "EmitStatement",
                        "src": "10883:35:65"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "8fcbaf0c",
                  "id": 13595,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "permit",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 13503,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "10218:8:65"
                  },
                  "parameters": {
                    "id": 13502,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13487,
                        "mutability": "mutable",
                        "name": "holder",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13595,
                        "src": "10096:14:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13486,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "10096:7:65",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13489,
                        "mutability": "mutable",
                        "name": "spender",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13595,
                        "src": "10112:15:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13488,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "10112:7:65",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13491,
                        "mutability": "mutable",
                        "name": "nonce",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13595,
                        "src": "10129:13:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13490,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "10129:7:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13493,
                        "mutability": "mutable",
                        "name": "expiry",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13595,
                        "src": "10144:14:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13492,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "10144:7:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13495,
                        "mutability": "mutable",
                        "name": "allowed",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13595,
                        "src": "10164:12:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 13494,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "10164:4:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13497,
                        "mutability": "mutable",
                        "name": "v",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13595,
                        "src": "10178:7:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 13496,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "10178:5:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13499,
                        "mutability": "mutable",
                        "name": "r",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13595,
                        "src": "10187:9:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 13498,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "10187:7:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13501,
                        "mutability": "mutable",
                        "name": "s",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13595,
                        "src": "10198:9:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 13500,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "10198:7:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10090:118:65"
                  },
                  "returnParameters": {
                    "id": 13504,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "10229:0:65"
                  },
                  "scope": 13609,
                  "src": "10075:848:65",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 13607,
                    "nodeType": "Block",
                    "src": "10978:28:65",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 13603,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13597,
                              "src": "10990:2:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13604,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13599,
                              "src": "10994:6:65",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 13602,
                            "name": "_mint",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13353,
                            "src": "10984:5:65",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 13605,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10984:17:65",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13606,
                        "nodeType": "ExpressionStatement",
                        "src": "10984:17:65"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "40c10f19",
                  "id": 13608,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "mint",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13600,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13597,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13608,
                        "src": "10941:10:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13596,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "10941:7:65",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13599,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13608,
                        "src": "10953:14:65",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13598,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "10953:7:65",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10940:28:65"
                  },
                  "returnParameters": {
                    "id": 13601,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "10978:0:65"
                  },
                  "scope": 13609,
                  "src": "10927:79:65",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 13610,
              "src": "259:10749:65"
            }
          ],
          "src": "37:10972:65"
        },
        "id": 65
      },
      "contracts/test/ERC20Mintable.sol": {
        "ast": {
          "absolutePath": "contracts/test/ERC20Mintable.sol",
          "exportedSymbols": {
            "ERC20Mintable": [
              13680
            ]
          },
          "id": 13681,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 13611,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "0:23:66"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol",
              "id": 13612,
              "nodeType": "ImportDirective",
              "scope": 13681,
              "sourceUnit": 1883,
              "src": "25:78:66",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 13614,
                    "name": "ERC20Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1882,
                    "src": "361:16:66",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Upgradeable_$1882",
                      "typeString": "contract ERC20Upgradeable"
                    }
                  },
                  "id": 13615,
                  "nodeType": "InheritanceSpecifier",
                  "src": "361:16:66"
                }
              ],
              "contractDependencies": [
                1352,
                1882,
                1960,
                3627
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 13613,
                "nodeType": "StructuredDocumentation",
                "src": "105:229:66",
                "text": " @dev Extension of {ERC20} that adds a set of accounts with the {MinterRole},\n which have permission to mint (create) new tokens as they see fit.\n At construction, the deployer of the contract is the only minter."
              },
              "fullyImplemented": true,
              "id": 13680,
              "linearizedBaseContracts": [
                13680,
                1882,
                1960,
                3627,
                1352
              ],
              "name": "ERC20Mintable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 13627,
                    "nodeType": "Block",
                    "src": "448:45:66",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 13623,
                              "name": "_name",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13617,
                              "src": "471:5:66",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13624,
                              "name": "_symbol",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13619,
                              "src": "478:7:66",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 13622,
                            "name": "__ERC20_init",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1405,
                            "src": "458:12:66",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (string memory,string memory)"
                            }
                          },
                          "id": 13625,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "458:28:66",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13626,
                        "nodeType": "ExpressionStatement",
                        "src": "458:28:66"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 13628,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13620,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13617,
                        "mutability": "mutable",
                        "name": "_name",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13628,
                        "src": "397:19:66",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 13616,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "397:6:66",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13619,
                        "mutability": "mutable",
                        "name": "_symbol",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13628,
                        "src": "418:21:66",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 13618,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "418:6:66",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "396:44:66"
                  },
                  "returnParameters": {
                    "id": 13621,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "448:0:66"
                  },
                  "scope": 13680,
                  "src": "385:108:66",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 13645,
                    "nodeType": "Block",
                    "src": "698:60:66",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 13639,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13631,
                              "src": "714:7:66",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13640,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13633,
                              "src": "723:6:66",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 13638,
                            "name": "_mint",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1754,
                            "src": "708:5:66",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 13641,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "708:22:66",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13642,
                        "nodeType": "ExpressionStatement",
                        "src": "708:22:66"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 13643,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "747:4:66",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 13637,
                        "id": 13644,
                        "nodeType": "Return",
                        "src": "740:11:66"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 13629,
                    "nodeType": "StructuredDocumentation",
                    "src": "499:125:66",
                    "text": " @dev See {ERC20-_mint}.\n Requirements:\n - the caller must have the {MinterRole}."
                  },
                  "functionSelector": "40c10f19",
                  "id": 13646,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "mint",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13634,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13631,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13646,
                        "src": "643:15:66",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13630,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "643:7:66",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13633,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13646,
                        "src": "660:14:66",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13632,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "660:7:66",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "642:33:66"
                  },
                  "returnParameters": {
                    "id": 13637,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13636,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13646,
                        "src": "692:4:66",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 13635,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "692:4:66",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "691:6:66"
                  },
                  "scope": 13680,
                  "src": "629:129:66",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 13662,
                    "nodeType": "Block",
                    "src": "833:60:66",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 13656,
                              "name": "account",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13648,
                              "src": "849:7:66",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13657,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13650,
                              "src": "858:6:66",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 13655,
                            "name": "_burn",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1810,
                            "src": "843:5:66",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 13658,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "843:22:66",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13659,
                        "nodeType": "ExpressionStatement",
                        "src": "843:22:66"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 13660,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "882:4:66",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 13654,
                        "id": 13661,
                        "nodeType": "Return",
                        "src": "875:11:66"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "9dc29fac",
                  "id": 13663,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "burn",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13651,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13648,
                        "mutability": "mutable",
                        "name": "account",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13663,
                        "src": "778:15:66",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13647,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "778:7:66",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13650,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13663,
                        "src": "795:14:66",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13649,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "795:7:66",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "777:33:66"
                  },
                  "returnParameters": {
                    "id": 13654,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13653,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13663,
                        "src": "827:4:66",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 13652,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "827:4:66",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "826:6:66"
                  },
                  "scope": 13680,
                  "src": "764:129:66",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 13678,
                    "nodeType": "Block",
                    "src": "972:44:66",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 13673,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13665,
                              "src": "992:4:66",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13674,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13667,
                              "src": "998:2:66",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13675,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13669,
                              "src": "1002:6:66",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 13672,
                            "name": "_transfer",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1699,
                            "src": "982:9:66",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 13676,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "982:27:66",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13677,
                        "nodeType": "ExpressionStatement",
                        "src": "982:27:66"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "1c9c7903",
                  "id": 13679,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "masterTransfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13670,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13665,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13679,
                        "src": "923:12:66",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13664,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "923:7:66",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13667,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13679,
                        "src": "937:10:66",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13666,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "937:7:66",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13669,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13679,
                        "src": "949:14:66",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13668,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "949:7:66",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "922:42:66"
                  },
                  "returnParameters": {
                    "id": 13671,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "972:0:66"
                  },
                  "scope": 13680,
                  "src": "899:117:66",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                }
              ],
              "scope": 13681,
              "src": "335:683:66"
            }
          ],
          "src": "0:1019:66"
        },
        "id": 66
      },
      "contracts/test/ERC721Mintable.sol": {
        "ast": {
          "absolutePath": "contracts/test/ERC721Mintable.sol",
          "exportedSymbols": {
            "ERC721Mintable": [
              13721
            ]
          },
          "id": 13722,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 13682,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "0:23:67"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol",
              "id": 13683,
              "nodeType": "ImportDirective",
              "scope": 13722,
              "sourceUnit": 3147,
              "src": "25:80:67",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 13685,
                    "name": "ERC721Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3146,
                    "src": "192:17:67",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC721Upgradeable_$3146",
                      "typeString": "contract ERC721Upgradeable"
                    }
                  },
                  "id": 13686,
                  "nodeType": "InheritanceSpecifier",
                  "src": "192:17:67"
                }
              ],
              "contractDependencies": [
                919,
                931,
                1352,
                3146,
                3177,
                3204,
                3338,
                3627
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 13684,
                "nodeType": "StructuredDocumentation",
                "src": "107:57:67",
                "text": " @dev Extension of {ERC721} for Minting/Burning"
              },
              "fullyImplemented": true,
              "id": 13721,
              "linearizedBaseContracts": [
                13721,
                3146,
                3177,
                3204,
                3338,
                919,
                931,
                3627,
                1352
              ],
              "name": "ERC721Mintable",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 13694,
                    "nodeType": "Block",
                    "src": "239:48:67",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "45524320373231",
                              "id": 13690,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "263:9:67",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_652b7269ea17924fe6186defb3d6fd8ad2243a6f4c122cb93424996ab0c54e59",
                                "typeString": "literal_string \"ERC 721\""
                              },
                              "value": "ERC 721"
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4e4654",
                              "id": 13691,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "274:5:67",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_9c4138cd0a1311e4748f70d0fe3dc55f0f5f75e0f20db731225cbc3b8914016a",
                                "typeString": "literal_string \"NFT\""
                              },
                              "value": "NFT"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_stringliteral_652b7269ea17924fe6186defb3d6fd8ad2243a6f4c122cb93424996ab0c54e59",
                                "typeString": "literal_string \"ERC 721\""
                              },
                              {
                                "typeIdentifier": "t_stringliteral_9c4138cd0a1311e4748f70d0fe3dc55f0f5f75e0f20db731225cbc3b8914016a",
                                "typeString": "literal_string \"NFT\""
                              }
                            ],
                            "id": 13689,
                            "name": "__ERC721_init",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2275,
                            "src": "249:13:67",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (string memory,string memory)"
                            }
                          },
                          "id": 13692,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "249:31:67",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13693,
                        "nodeType": "ExpressionStatement",
                        "src": "249:31:67"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 13695,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13687,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "229:2:67"
                  },
                  "returnParameters": {
                    "id": 13688,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "239:0:67"
                  },
                  "scope": 13721,
                  "src": "217:70:67",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 13708,
                    "nodeType": "Block",
                    "src": "391:35:67",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 13704,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13698,
                              "src": "407:2:67",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13705,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13700,
                              "src": "411:7:67",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 13703,
                            "name": "_mint",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2875,
                            "src": "401:5:67",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 13706,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "401:18:67",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13707,
                        "nodeType": "ExpressionStatement",
                        "src": "401:18:67"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 13696,
                    "nodeType": "StructuredDocumentation",
                    "src": "293:43:67",
                    "text": " @dev See {ERC721-_mint}."
                  },
                  "functionSelector": "40c10f19",
                  "id": 13709,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "mint",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13701,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13698,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13709,
                        "src": "355:10:67",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13697,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "355:7:67",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13700,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13709,
                        "src": "367:15:67",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13699,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "367:7:67",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "354:29:67"
                  },
                  "returnParameters": {
                    "id": 13702,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "391:0:67"
                  },
                  "scope": 13721,
                  "src": "341:85:67",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 13719,
                    "nodeType": "Block",
                    "src": "518:31:67",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 13716,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13712,
                              "src": "534:7:67",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 13715,
                            "name": "_burn",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2944,
                            "src": "528:5:67",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 13717,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "528:14:67",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13718,
                        "nodeType": "ExpressionStatement",
                        "src": "528:14:67"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 13710,
                    "nodeType": "StructuredDocumentation",
                    "src": "432:43:67",
                    "text": " @dev See {ERC721-_burn}."
                  },
                  "functionSelector": "42966c68",
                  "id": 13720,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "burn",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13713,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13712,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13720,
                        "src": "494:15:67",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13711,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "494:7:67",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "493:17:67"
                  },
                  "returnParameters": {
                    "id": 13714,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "518:0:67"
                  },
                  "scope": 13721,
                  "src": "480:69:67",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                }
              ],
              "scope": 13722,
              "src": "165:386:67"
            }
          ],
          "src": "0:552:67"
        },
        "id": 67
      },
      "contracts/test/EchidnaTokenFaucet.sol": {
        "ast": {
          "absolutePath": "contracts/test/EchidnaTokenFaucet.sol",
          "exportedSymbols": {
            "EchidnaTokenFaucet": [
              13998
            ]
          },
          "id": 13999,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 13723,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:68"
            },
            {
              "absolutePath": "contracts/token-faucet/TokenFaucet.sol",
              "file": "../token-faucet/TokenFaucet.sol",
              "id": 13724,
              "nodeType": "ImportDirective",
              "scope": 13999,
              "sourceUnit": 15493,
              "src": "62:41:68",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/test/ERC20Mintable.sol",
              "file": "./ERC20Mintable.sol",
              "id": 13725,
              "nodeType": "ImportDirective",
              "scope": 13999,
              "sourceUnit": 13681,
              "src": "104:29:68",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [
                13680,
                15492
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 13998,
              "linearizedBaseContracts": [
                13998
              ],
              "name": "EchidnaTokenFaucet",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "functionSelector": "de5f72fd",
                  "id": 13727,
                  "mutability": "mutable",
                  "name": "faucet",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 13998,
                  "src": "168:25:68",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                    "typeString": "contract TokenFaucet"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 13726,
                    "name": "TokenFaucet",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 15492,
                    "src": "168:11:68",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                      "typeString": "contract TokenFaucet"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "38d52e0f",
                  "id": 13729,
                  "mutability": "mutable",
                  "name": "asset",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 13998,
                  "src": "197:26:68",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                    "typeString": "contract ERC20Mintable"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 13728,
                    "name": "ERC20Mintable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 13680,
                    "src": "197:13:68",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                      "typeString": "contract ERC20Mintable"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "functionSelector": "efa9a1ad",
                  "id": 13731,
                  "mutability": "mutable",
                  "name": "measure",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 13998,
                  "src": "227:28:68",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                    "typeString": "contract ERC20Mintable"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 13730,
                    "name": "ERC20Mintable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 13680,
                    "src": "227:13:68",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                      "typeString": "contract ERC20Mintable"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "id": 13733,
                  "mutability": "mutable",
                  "name": "totalAssetsDripped",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 13998,
                  "src": "260:26:68",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 13732,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "260:7:68",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 13735,
                  "mutability": "mutable",
                  "name": "totalAssetsClaimed",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 13998,
                  "src": "290:26:68",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 13734,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "290:7:68",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 13768,
                    "nodeType": "Block",
                    "src": "342:198:68",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 13744,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 13738,
                            "name": "asset",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13729,
                            "src": "348:5:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                              "typeString": "contract ERC20Mintable"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "417373657420546f6b656e",
                                "id": 13741,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "string",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "374:13:68",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_stringliteral_12ceeb6dcdf4596d95e00de9b7faf3537fd1db6ce957d115db101262c453b66f",
                                  "typeString": "literal_string \"Asset Token\""
                                },
                                "value": "Asset Token"
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "4153534554",
                                "id": 13742,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "string",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "389:7:68",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_stringliteral_e15c4f51c2d87708619e1fad01348904dc6e1167fc91b989e7d4af34e19ba89d",
                                  "typeString": "literal_string \"ASSET\""
                                },
                                "value": "ASSET"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_stringliteral_12ceeb6dcdf4596d95e00de9b7faf3537fd1db6ce957d115db101262c453b66f",
                                  "typeString": "literal_string \"Asset Token\""
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_e15c4f51c2d87708619e1fad01348904dc6e1167fc91b989e7d4af34e19ba89d",
                                  "typeString": "literal_string \"ASSET\""
                                }
                              ],
                              "id": 13740,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "356:17:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_creation_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$_t_contract$_ERC20Mintable_$13680_$",
                                "typeString": "function (string memory,string memory) returns (contract ERC20Mintable)"
                              },
                              "typeName": {
                                "contractScope": null,
                                "id": 13739,
                                "name": "ERC20Mintable",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 13680,
                                "src": "360:13:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                  "typeString": "contract ERC20Mintable"
                                }
                              }
                            },
                            "id": 13743,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "356:41:68",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                              "typeString": "contract ERC20Mintable"
                            }
                          },
                          "src": "348:49:68",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                            "typeString": "contract ERC20Mintable"
                          }
                        },
                        "id": 13745,
                        "nodeType": "ExpressionStatement",
                        "src": "348:49:68"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 13752,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 13746,
                            "name": "measure",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13731,
                            "src": "403:7:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                              "typeString": "contract ERC20Mintable"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "4d65617375726520546f6b656e",
                                "id": 13749,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "string",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "431:15:68",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_stringliteral_fb19dbbae7a6ad8e1c93a975eecb21c2db2b661a9b2d17e1bbe925522527c8c8",
                                  "typeString": "literal_string \"Measure Token\""
                                },
                                "value": "Measure Token"
                              },
                              {
                                "argumentTypes": null,
                                "hexValue": "4d454153",
                                "id": 13750,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "string",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "448:6:68",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_stringliteral_419b4dfe34508ed9f1f1c4a0b4c6d6e01f003466bafebccc9c8f1208320ba6de",
                                  "typeString": "literal_string \"MEAS\""
                                },
                                "value": "MEAS"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_stringliteral_fb19dbbae7a6ad8e1c93a975eecb21c2db2b661a9b2d17e1bbe925522527c8c8",
                                  "typeString": "literal_string \"Measure Token\""
                                },
                                {
                                  "typeIdentifier": "t_stringliteral_419b4dfe34508ed9f1f1c4a0b4c6d6e01f003466bafebccc9c8f1208320ba6de",
                                  "typeString": "literal_string \"MEAS\""
                                }
                              ],
                              "id": 13748,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "413:17:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_creation_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$_t_contract$_ERC20Mintable_$13680_$",
                                "typeString": "function (string memory,string memory) returns (contract ERC20Mintable)"
                              },
                              "typeName": {
                                "contractScope": null,
                                "id": 13747,
                                "name": "ERC20Mintable",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 13680,
                                "src": "417:13:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                  "typeString": "contract ERC20Mintable"
                                }
                              }
                            },
                            "id": 13751,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "413:42:68",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                              "typeString": "contract ERC20Mintable"
                            }
                          },
                          "src": "403:52:68",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                            "typeString": "contract ERC20Mintable"
                          }
                        },
                        "id": 13753,
                        "nodeType": "ExpressionStatement",
                        "src": "403:52:68"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 13758,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 13754,
                            "name": "faucet",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13727,
                            "src": "461:6:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                              "typeString": "contract TokenFaucet"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 13756,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "470:15:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_creation_nonpayable$__$returns$_t_contract$_TokenFaucet_$15492_$",
                                "typeString": "function () returns (contract TokenFaucet)"
                              },
                              "typeName": {
                                "contractScope": null,
                                "id": 13755,
                                "name": "TokenFaucet",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 15492,
                                "src": "474:11:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                  "typeString": "contract TokenFaucet"
                                }
                              }
                            },
                            "id": 13757,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "470:17:68",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                              "typeString": "contract TokenFaucet"
                            }
                          },
                          "src": "461:26:68",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                            "typeString": "contract TokenFaucet"
                          }
                        },
                        "id": 13759,
                        "nodeType": "ExpressionStatement",
                        "src": "461:26:68"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 13763,
                              "name": "asset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13729,
                              "src": "511:5:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                "typeString": "contract ERC20Mintable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13764,
                              "name": "measure",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13731,
                              "src": "518:7:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                "typeString": "contract ERC20Mintable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "31",
                              "id": 13765,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "527:7:68",
                              "subdenomination": "ether",
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_1000000000000000000_by_1",
                                "typeString": "int_const 1000000000000000000"
                              },
                              "value": "1"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                "typeString": "contract ERC20Mintable"
                              },
                              {
                                "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                "typeString": "contract ERC20Mintable"
                              },
                              {
                                "typeIdentifier": "t_rational_1000000000000000000_by_1",
                                "typeString": "int_const 1000000000000000000"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 13760,
                              "name": "faucet",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13727,
                              "src": "493:6:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                "typeString": "contract TokenFaucet"
                              }
                            },
                            "id": 13762,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "initialize",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 15049,
                            "src": "493:17:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_contract$_IERC20Upgradeable_$1960_$_t_contract$_IERC20Upgradeable_$1960_$_t_uint256_$returns$__$",
                              "typeString": "function (contract IERC20Upgradeable,contract IERC20Upgradeable,uint256) external"
                            }
                          },
                          "id": 13766,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "493:42:68",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13767,
                        "nodeType": "ExpressionStatement",
                        "src": "493:42:68"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 13769,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13736,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "332:2:68"
                  },
                  "returnParameters": {
                    "id": 13737,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "342:0:68"
                  },
                  "scope": 13998,
                  "src": "321:219:68",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 13811,
                    "nodeType": "Block",
                    "src": "589:231:68",
                    "statements": [
                      {
                        "assignments": [
                          13775
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 13775,
                            "mutability": "mutable",
                            "name": "actualAmount",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 13811,
                            "src": "595:20:68",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 13774,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "595:7:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 13790,
                        "initialValue": {
                          "argumentTypes": null,
                          "condition": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 13784,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 13776,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13771,
                              "src": "618:6:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": ">",
                            "rightExpression": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 13783,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 13779,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "632:7:68",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_uint256_$",
                                        "typeString": "type(uint256)"
                                      },
                                      "typeName": {
                                        "id": 13778,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "632:7:68",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_type$_t_uint256_$",
                                        "typeString": "type(uint256)"
                                      }
                                    ],
                                    "id": 13777,
                                    "name": "type",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -27,
                                    "src": "627:4:68",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_metatype_pure$__$returns$__$",
                                      "typeString": "function () pure"
                                    }
                                  },
                                  "id": 13780,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "627:13:68",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_meta_type_t_uint256",
                                    "typeString": "type(uint256)"
                                  }
                                },
                                "id": 13781,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "max",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "627:17:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "/",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "313030303030",
                                "id": 13782,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "647:6:68",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_100000_by_1",
                                  "typeString": "int_const 100000"
                                },
                                "value": "100000"
                              },
                              "src": "627:26:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "618:35:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseExpression": {
                            "argumentTypes": null,
                            "id": 13788,
                            "name": "amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13771,
                            "src": "674:6:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 13789,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "Conditional",
                          "src": "618:62:68",
                          "trueExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 13787,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 13785,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13771,
                              "src": "656:6:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "/",
                            "rightExpression": {
                              "argumentTypes": null,
                              "hexValue": "313030303030",
                              "id": 13786,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "665:6:68",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_100000_by_1",
                                "typeString": "int_const 100000"
                              },
                              "value": "100000"
                            },
                            "src": "656:15:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "595:85:68"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 13793,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 13791,
                            "name": "totalAssetsDripped",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13733,
                            "src": "686:18:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "+=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 13792,
                            "name": "actualAmount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13775,
                            "src": "708:12:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "686:34:68",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 13794,
                        "nodeType": "ExpressionStatement",
                        "src": "686:34:68"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 13798,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 13796,
                                "name": "totalAssetsDripped",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 13733,
                                "src": "733:18:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 13797,
                                "name": "actualAmount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 13775,
                                "src": "755:12:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "733:34:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            ],
                            "id": 13795,
                            "name": "assert",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -3,
                            "src": "726:6:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$",
                              "typeString": "function (bool) pure"
                            }
                          },
                          "id": 13799,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "726:42:68",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13800,
                        "nodeType": "ExpressionStatement",
                        "src": "726:42:68"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 13806,
                                  "name": "faucet",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 13727,
                                  "src": "793:6:68",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                    "typeString": "contract TokenFaucet"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                    "typeString": "contract TokenFaucet"
                                  }
                                ],
                                "id": 13805,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "785:7:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 13804,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "785:7:68",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 13807,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "785:15:68",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13808,
                              "name": "actualAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13775,
                              "src": "802:12:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 13801,
                              "name": "asset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13729,
                              "src": "774:5:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                "typeString": "contract ERC20Mintable"
                              }
                            },
                            "id": 13803,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "mint",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 13646,
                            "src": "774:10:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,uint256) external returns (bool)"
                            }
                          },
                          "id": 13809,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "774:41:68",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 13810,
                        "nodeType": "ExpressionStatement",
                        "src": "774:41:68"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "2879d7c7",
                  "id": 13812,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "dripAssets",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13772,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13771,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13812,
                        "src": "564:14:68",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13770,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "564:7:68",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "563:16:68"
                  },
                  "returnParameters": {
                    "id": 13773,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "589:0:68"
                  },
                  "scope": 13998,
                  "src": "544:276:68",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 13841,
                    "nodeType": "Block",
                    "src": "863:121:68",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 13820,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "892:3:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 13821,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "892:10:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13822,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13814,
                              "src": "904:6:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 13825,
                                  "name": "measure",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 13731,
                                  "src": "920:7:68",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                    "typeString": "contract ERC20Mintable"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                    "typeString": "contract ERC20Mintable"
                                  }
                                ],
                                "id": 13824,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "912:7:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 13823,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "912:7:68",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 13826,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "912:16:68",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 13829,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "938:1:68",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 13828,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "930:7:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 13827,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "930:7:68",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 13830,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "930:10:68",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 13817,
                              "name": "faucet",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13727,
                              "src": "869:6:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                "typeString": "contract TokenFaucet"
                              }
                            },
                            "id": 13819,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "beforeTokenMint",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 15439,
                            "src": "869:22:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$_t_address_$_t_address_$returns$__$",
                              "typeString": "function (address,uint256,address,address) external"
                            }
                          },
                          "id": 13831,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "869:72:68",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13832,
                        "nodeType": "ExpressionStatement",
                        "src": "869:72:68"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 13836,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "960:3:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 13837,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "960:10:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13838,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13814,
                              "src": "972:6:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 13833,
                              "name": "measure",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13731,
                              "src": "947:7:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                "typeString": "contract ERC20Mintable"
                              }
                            },
                            "id": 13835,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "mint",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 13646,
                            "src": "947:12:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,uint256) external returns (bool)"
                            }
                          },
                          "id": 13839,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "947:32:68",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 13840,
                        "nodeType": "ExpressionStatement",
                        "src": "947:32:68"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "a0712d68",
                  "id": 13842,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "mint",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13815,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13814,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13842,
                        "src": "838:14:68",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13813,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "838:7:68",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "837:16:68"
                  },
                  "returnParameters": {
                    "id": 13816,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "863:0:68"
                  },
                  "scope": 13998,
                  "src": "824:160:68",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 13888,
                    "nodeType": "Block",
                    "src": "1043:260:68",
                    "statements": [
                      {
                        "assignments": [
                          13850
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 13850,
                            "mutability": "mutable",
                            "name": "balance",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 13888,
                            "src": "1049:15:68",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 13849,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "1049:7:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 13856,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 13853,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "1085:3:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 13854,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "1085:10:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 13851,
                              "name": "measure",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13731,
                              "src": "1067:7:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                "typeString": "contract ERC20Mintable"
                              }
                            },
                            "id": 13852,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balanceOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1478,
                            "src": "1067:17:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) view external returns (uint256)"
                            }
                          },
                          "id": 13855,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1067:29:68",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1049:47:68"
                      },
                      {
                        "assignments": [
                          13858
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 13858,
                            "mutability": "mutable",
                            "name": "actualAmount",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 13888,
                            "src": "1102:20:68",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 13857,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "1102:7:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 13865,
                        "initialValue": {
                          "argumentTypes": null,
                          "condition": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 13861,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 13859,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13846,
                              "src": "1125:6:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": ">",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 13860,
                              "name": "balance",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13850,
                              "src": "1134:7:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "1125:16:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseExpression": {
                            "argumentTypes": null,
                            "id": 13863,
                            "name": "amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13846,
                            "src": "1154:6:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 13864,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "Conditional",
                          "src": "1125:35:68",
                          "trueExpression": {
                            "argumentTypes": null,
                            "id": 13862,
                            "name": "balance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13850,
                            "src": "1144:7:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1102:58:68"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 13869,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "1193:3:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 13870,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "1193:10:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13871,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13844,
                              "src": "1205:2:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13872,
                              "name": "actualAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13858,
                              "src": "1209:12:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 13875,
                                  "name": "measure",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 13731,
                                  "src": "1231:7:68",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                    "typeString": "contract ERC20Mintable"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                    "typeString": "contract ERC20Mintable"
                                  }
                                ],
                                "id": 13874,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "1223:7:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 13873,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "1223:7:68",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 13876,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1223:16:68",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 13866,
                              "name": "faucet",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13727,
                              "src": "1166:6:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                "typeString": "contract TokenFaucet"
                              }
                            },
                            "id": 13868,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "beforeTokenTransfer",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 15479,
                            "src": "1166:26:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_address_$returns$__$",
                              "typeString": "function (address,address,uint256,address) external"
                            }
                          },
                          "id": 13877,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1166:74:68",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13878,
                        "nodeType": "ExpressionStatement",
                        "src": "1166:74:68"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 13882,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "1269:3:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 13883,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "1269:10:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13884,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13844,
                              "src": "1281:2:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13885,
                              "name": "actualAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13858,
                              "src": "1285:12:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 13879,
                              "name": "measure",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13731,
                              "src": "1246:7:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                "typeString": "contract ERC20Mintable"
                              }
                            },
                            "id": 13881,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "masterTransfer",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 13679,
                            "src": "1246:22:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256) external"
                            }
                          },
                          "id": 13886,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1246:52:68",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13887,
                        "nodeType": "ExpressionStatement",
                        "src": "1246:52:68"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "a9059cbb",
                  "id": 13889,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "transfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13847,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13844,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13889,
                        "src": "1006:10:68",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 13843,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1006:7:68",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 13846,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13889,
                        "src": "1018:14:68",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13845,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1018:7:68",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1005:28:68"
                  },
                  "returnParameters": {
                    "id": 13848,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1043:0:68"
                  },
                  "scope": 13998,
                  "src": "988:315:68",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 13935,
                    "nodeType": "Block",
                    "src": "1346:254:68",
                    "statements": [
                      {
                        "assignments": [
                          13895
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 13895,
                            "mutability": "mutable",
                            "name": "balance",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 13935,
                            "src": "1352:15:68",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 13894,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "1352:7:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 13901,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 13898,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "1388:3:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 13899,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "1388:10:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 13896,
                              "name": "measure",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13731,
                              "src": "1370:7:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                "typeString": "contract ERC20Mintable"
                              }
                            },
                            "id": 13897,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balanceOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1478,
                            "src": "1370:17:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) view external returns (uint256)"
                            }
                          },
                          "id": 13900,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1370:29:68",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1352:47:68"
                      },
                      {
                        "assignments": [
                          13903
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 13903,
                            "mutability": "mutable",
                            "name": "actualAmount",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 13935,
                            "src": "1405:20:68",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 13902,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "1405:7:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 13910,
                        "initialValue": {
                          "argumentTypes": null,
                          "condition": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 13906,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 13904,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13891,
                              "src": "1428:6:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": ">",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 13905,
                              "name": "balance",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13895,
                              "src": "1437:7:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "1428:16:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "falseExpression": {
                            "argumentTypes": null,
                            "id": 13908,
                            "name": "amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13891,
                            "src": "1457:6:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 13909,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "Conditional",
                          "src": "1428:35:68",
                          "trueExpression": {
                            "argumentTypes": null,
                            "id": 13907,
                            "name": "balance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13895,
                            "src": "1447:7:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1405:58:68"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 13914,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "1496:3:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 13915,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "1496:10:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 13918,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "1516:1:68",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 13917,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "1508:7:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 13916,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "1508:7:68",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 13919,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1508:10:68",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13920,
                              "name": "actualAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13903,
                              "src": "1520:12:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 13923,
                                  "name": "measure",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 13731,
                                  "src": "1542:7:68",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                    "typeString": "contract ERC20Mintable"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                    "typeString": "contract ERC20Mintable"
                                  }
                                ],
                                "id": 13922,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "1534:7:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 13921,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "1534:7:68",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 13924,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1534:16:68",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 13911,
                              "name": "faucet",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13727,
                              "src": "1469:6:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                "typeString": "contract TokenFaucet"
                              }
                            },
                            "id": 13913,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "beforeTokenTransfer",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 15479,
                            "src": "1469:26:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_address_$returns$__$",
                              "typeString": "function (address,address,uint256,address) external"
                            }
                          },
                          "id": 13925,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1469:82:68",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13926,
                        "nodeType": "ExpressionStatement",
                        "src": "1469:82:68"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 13930,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "1570:3:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 13931,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "1570:10:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 13932,
                              "name": "actualAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13903,
                              "src": "1582:12:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 13927,
                              "name": "measure",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13731,
                              "src": "1557:7:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                "typeString": "contract ERC20Mintable"
                              }
                            },
                            "id": 13929,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "burn",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 13663,
                            "src": "1557:12:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,uint256) external returns (bool)"
                            }
                          },
                          "id": 13933,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1557:38:68",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 13934,
                        "nodeType": "ExpressionStatement",
                        "src": "1557:38:68"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "42966c68",
                  "id": 13936,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "burn",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13892,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13891,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13936,
                        "src": "1321:14:68",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 13890,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1321:7:68",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1320:16:68"
                  },
                  "returnParameters": {
                    "id": 13893,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1346:0:68"
                  },
                  "scope": 13998,
                  "src": "1307:293:68",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 13957,
                    "nodeType": "Block",
                    "src": "1630:131:68",
                    "statements": [
                      {
                        "assignments": [
                          13940
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 13940,
                            "mutability": "mutable",
                            "name": "claimed",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 13957,
                            "src": "1636:15:68",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 13939,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "1636:7:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 13946,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 13943,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "1667:3:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 13944,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "1667:10:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 13941,
                              "name": "faucet",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 13727,
                              "src": "1654:6:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                "typeString": "contract TokenFaucet"
                              }
                            },
                            "id": 13942,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "claim",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 15183,
                            "src": "1654:12:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) external returns (uint256)"
                            }
                          },
                          "id": 13945,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1654:24:68",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1636:42:68"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 13949,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 13947,
                            "name": "totalAssetsClaimed",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13735,
                            "src": "1684:18:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "+=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 13948,
                            "name": "claimed",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13940,
                            "src": "1706:7:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "1684:29:68",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 13950,
                        "nodeType": "ExpressionStatement",
                        "src": "1684:29:68"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 13954,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 13952,
                                "name": "totalAssetsClaimed",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 13735,
                                "src": "1726:18:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 13953,
                                "name": "claimed",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 13940,
                                "src": "1748:7:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "1726:29:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            ],
                            "id": 13951,
                            "name": "assert",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -3,
                            "src": "1719:6:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$",
                              "typeString": "function (bool) pure"
                            }
                          },
                          "id": 13955,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1719:37:68",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 13956,
                        "nodeType": "ExpressionStatement",
                        "src": "1719:37:68"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "4e71d92d",
                  "id": 13958,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "claim",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13937,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1618:2:68"
                  },
                  "returnParameters": {
                    "id": 13938,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1630:0:68"
                  },
                  "scope": 13998,
                  "src": "1604:157:68",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 13976,
                    "nodeType": "Block",
                    "src": "1938:77:68",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 13974,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "expression": {
                                "argumentTypes": null,
                                "id": 13964,
                                "name": "faucet",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 13727,
                                "src": "1951:6:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                  "typeString": "contract TokenFaucet"
                                }
                              },
                              "id": 13965,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "totalUnclaimed",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 15002,
                              "src": "1951:21:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_external_view$__$returns$_t_uint112_$",
                                "typeString": "function () view external returns (uint112)"
                              }
                            },
                            "id": 13966,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1951:23:68",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint112",
                              "typeString": "uint112"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 13971,
                                    "name": "faucet",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 13727,
                                    "src": "2002:6:68",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                      "typeString": "contract TokenFaucet"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                      "typeString": "contract TokenFaucet"
                                    }
                                  ],
                                  "id": 13970,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "1994:7:68",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 13969,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1994:7:68",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 13972,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "1994:15:68",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "id": 13967,
                                "name": "asset",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 13729,
                                "src": "1978:5:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                  "typeString": "contract ERC20Mintable"
                                }
                              },
                              "id": 13968,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "balanceOf",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1478,
                              "src": "1978:15:68",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                "typeString": "function (address) view external returns (uint256)"
                              }
                            },
                            "id": 13973,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1978:32:68",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "1951:59:68",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 13963,
                        "id": 13975,
                        "nodeType": "Return",
                        "src": "1944:66:68"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 13959,
                    "nodeType": "StructuredDocumentation",
                    "src": "1765:93:68",
                    "text": "@dev Invariant: total unclaimed tokens should never exceed the balance held by the faucet"
                  },
                  "functionSelector": "6cd8b16d",
                  "id": 13977,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "echidna_total_unclaimed_lte_balance",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13960,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1906:2:68"
                  },
                  "returnParameters": {
                    "id": 13963,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13962,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13977,
                        "src": "1932:4:68",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 13961,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "1932:4:68",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1931:6:68"
                  },
                  "scope": 13998,
                  "src": "1861:154:68",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 13996,
                    "nodeType": "Block",
                    "src": "2235:95:68",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 13994,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 13983,
                            "name": "totalAssetsDripped",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 13733,
                            "src": "2248:18:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "components": [
                              {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 13992,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 13984,
                                  "name": "totalAssetsClaimed",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 13735,
                                  "src": "2271:18:68",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "+",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 13989,
                                          "name": "faucet",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 13727,
                                          "src": "2316:6:68",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                            "typeString": "contract TokenFaucet"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                            "typeString": "contract TokenFaucet"
                                          }
                                        ],
                                        "id": 13988,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "2308:7:68",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_address_$",
                                          "typeString": "type(address)"
                                        },
                                        "typeName": {
                                          "id": 13987,
                                          "name": "address",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "2308:7:68",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      },
                                      "id": 13990,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "2308:15:68",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 13985,
                                      "name": "asset",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 13729,
                                      "src": "2292:5:68",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_ERC20Mintable_$13680",
                                        "typeString": "contract ERC20Mintable"
                                      }
                                    },
                                    "id": 13986,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "balanceOf",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1478,
                                    "src": "2292:15:68",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                      "typeString": "function (address) view external returns (uint256)"
                                    }
                                  },
                                  "id": 13991,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "2292:32:68",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "2271:53:68",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "id": 13993,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "2270:55:68",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "2248:77:68",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 13982,
                        "id": 13995,
                        "nodeType": "Return",
                        "src": "2241:84:68"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 13978,
                    "nodeType": "StructuredDocumentation",
                    "src": "2019:126:68",
                    "text": "@dev Invariant: the balance of the faucet plus claimed tokens should always equal the total tokens dripped into the faucet"
                  },
                  "functionSelector": "b107aea1",
                  "id": 13997,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "echidna_total_dripped_eq_claimed_plus_balance",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 13979,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2203:2:68"
                  },
                  "returnParameters": {
                    "id": 13982,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 13981,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 13997,
                        "src": "2229:4:68",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 13980,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "2229:4:68",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2228:6:68"
                  },
                  "scope": 13998,
                  "src": "2148:182:68",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 13999,
              "src": "135:2198:68"
            }
          ],
          "src": "37:2296:68"
        },
        "id": 68
      },
      "contracts/test/ExtendedSafeCastExposed.sol": {
        "ast": {
          "absolutePath": "contracts/test/ExtendedSafeCastExposed.sol",
          "exportedSymbols": {
            "ExtendedSafeCastExposed": [
              14028
            ]
          },
          "id": 14029,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 14000,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "0:23:69"
            },
            {
              "absolutePath": "contracts/utils/ExtendedSafeCast.sol",
              "file": "../utils/ExtendedSafeCast.sol",
              "id": 14001,
              "nodeType": "ImportDirective",
              "scope": 14029,
              "sourceUnit": 16321,
              "src": "25:39:69",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 14028,
              "linearizedBaseContracts": [
                14028
              ],
              "name": "ExtendedSafeCastExposed",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 14013,
                    "nodeType": "Block",
                    "src": "169:51:69",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 14010,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14003,
                              "src": "209:5:69",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 14008,
                              "name": "ExtendedSafeCast",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16320,
                              "src": "182:16:69",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_ExtendedSafeCast_$16320_$",
                                "typeString": "type(library ExtendedSafeCast)"
                              }
                            },
                            "id": 14009,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "toUint112",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16296,
                            "src": "182:26:69",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint112_$",
                              "typeString": "function (uint256) pure returns (uint112)"
                            }
                          },
                          "id": 14011,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "182:33:69",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint112",
                            "typeString": "uint112"
                          }
                        },
                        "functionReturnParameters": 14007,
                        "id": 14012,
                        "nodeType": "Return",
                        "src": "175:40:69"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "41d2aa64",
                  "id": 14014,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toUint112",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14004,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14003,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14014,
                        "src": "122:13:69",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14002,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "122:7:69",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "121:15:69"
                  },
                  "returnParameters": {
                    "id": 14007,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14006,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14014,
                        "src": "160:7:69",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint112",
                          "typeString": "uint112"
                        },
                        "typeName": {
                          "id": 14005,
                          "name": "uint112",
                          "nodeType": "ElementaryTypeName",
                          "src": "160:7:69",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint112",
                            "typeString": "uint112"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "159:9:69"
                  },
                  "scope": 14028,
                  "src": "103:117:69",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 14026,
                    "nodeType": "Block",
                    "src": "287:50:69",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 14023,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14016,
                              "src": "326:5:69",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 14021,
                              "name": "ExtendedSafeCast",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16320,
                              "src": "300:16:69",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_ExtendedSafeCast_$16320_$",
                                "typeString": "type(library ExtendedSafeCast)"
                              }
                            },
                            "id": 14022,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "toUint96",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16319,
                            "src": "300:25:69",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint96_$",
                              "typeString": "function (uint256) pure returns (uint96)"
                            }
                          },
                          "id": 14024,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "300:32:69",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint96",
                            "typeString": "uint96"
                          }
                        },
                        "functionReturnParameters": 14020,
                        "id": 14025,
                        "nodeType": "Return",
                        "src": "293:39:69"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "1cf887fc",
                  "id": 14027,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toUint96",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14017,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14016,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14027,
                        "src": "241:13:69",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14015,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "241:7:69",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "240:15:69"
                  },
                  "returnParameters": {
                    "id": 14020,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14019,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14027,
                        "src": "279:6:69",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint96",
                          "typeString": "uint96"
                        },
                        "typeName": {
                          "id": 14018,
                          "name": "uint96",
                          "nodeType": "ElementaryTypeName",
                          "src": "279:6:69",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint96",
                            "typeString": "uint96"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "278:8:69"
                  },
                  "scope": 14028,
                  "src": "223:114:69",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 14029,
              "src": "66:273:69"
            }
          ],
          "src": "0:339:69"
        },
        "id": 69
      },
      "contracts/test/MappedSinglyLinkedListExposed.sol": {
        "ast": {
          "absolutePath": "contracts/test/MappedSinglyLinkedListExposed.sol",
          "exportedSymbols": {
            "MappedSinglyLinkedListExposed": [
              14119
            ]
          },
          "id": 14120,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 14030,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "0:23:70"
            },
            {
              "absolutePath": "contracts/utils/MappedSinglyLinkedList.sol",
              "file": "../utils/MappedSinglyLinkedList.sol",
              "id": 14031,
              "nodeType": "ImportDirective",
              "scope": 14120,
              "sourceUnit": 16705,
              "src": "25:45:70",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 14119,
              "linearizedBaseContracts": [
                14119
              ],
              "name": "MappedSinglyLinkedListExposed",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 14034,
                  "libraryName": {
                    "contractScope": null,
                    "id": 14032,
                    "name": "MappedSinglyLinkedList",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 16704,
                    "src": "121:22:70",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_MappedSinglyLinkedList_$16704",
                      "typeString": "library MappedSinglyLinkedList"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "115:64:70",
                  "typeName": {
                    "contractScope": null,
                    "id": 14033,
                    "name": "MappedSinglyLinkedList.Mapping",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 16337,
                    "src": "148:30:70",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                      "typeString": "struct MappedSinglyLinkedList.Mapping"
                    }
                  }
                },
                {
                  "constant": false,
                  "id": 14036,
                  "mutability": "mutable",
                  "name": "list",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 14119,
                  "src": "183:35:70",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                    "typeString": "struct MappedSinglyLinkedList.Mapping"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 14035,
                    "name": "MappedSinglyLinkedList.Mapping",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 16337,
                    "src": "183:30:70",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                      "typeString": "struct MappedSinglyLinkedList.Mapping"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 14044,
                    "nodeType": "Block",
                    "src": "254:28:70",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 14039,
                              "name": "list",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14036,
                              "src": "260:4:70",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                              }
                            },
                            "id": 14041,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "initialize",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16360,
                            "src": "260:15:70",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Mapping_$16337_storage_ptr_$returns$__$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                              "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer)"
                            }
                          },
                          "id": 14042,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "260:17:70",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 14043,
                        "nodeType": "ExpressionStatement",
                        "src": "260:17:70"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "8129fc1c",
                  "id": 14045,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "initialize",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14037,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "242:2:70"
                  },
                  "returnParameters": {
                    "id": 14038,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "254:0:70"
                  },
                  "scope": 14119,
                  "src": "223:59:70",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 14055,
                    "nodeType": "Block",
                    "src": "351:37:70",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 14051,
                              "name": "list",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14036,
                              "src": "364:4:70",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                              }
                            },
                            "id": 14052,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "addressArray",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16646,
                            "src": "364:17:70",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_Mapping_$16337_storage_ptr_$returns$_t_array$_t_address_$dyn_memory_ptr_$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                              "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer) view returns (address[] memory)"
                            }
                          },
                          "id": 14053,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "364:19:70",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                            "typeString": "address[] memory"
                          }
                        },
                        "functionReturnParameters": 14050,
                        "id": 14054,
                        "nodeType": "Return",
                        "src": "357:26:70"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "3ce3a2d8",
                  "id": 14056,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "addressArray",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14046,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "307:2:70"
                  },
                  "returnParameters": {
                    "id": 14050,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14049,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14056,
                        "src": "333:16:70",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                          "typeString": "address[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 14047,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "333:7:70",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "id": 14048,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "333:9:70",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                            "typeString": "address[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "332:18:70"
                  },
                  "scope": 14119,
                  "src": "286:102:70",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 14068,
                    "nodeType": "Block",
                    "src": "453:39:70",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 14065,
                              "name": "addresses",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14059,
                              "src": "477:9:70",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                                "typeString": "address[] calldata"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                                "typeString": "address[] calldata"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 14062,
                              "name": "list",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14036,
                              "src": "459:4:70",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                              }
                            },
                            "id": 14064,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "addAddresses",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16427,
                            "src": "459:17:70",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Mapping_$16337_storage_ptr_$_t_array$_t_address_$dyn_memory_ptr_$returns$__$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                              "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer,address[] memory)"
                            }
                          },
                          "id": 14066,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "459:28:70",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 14067,
                        "nodeType": "ExpressionStatement",
                        "src": "459:28:70"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "3628731c",
                  "id": 14069,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "addAddresses",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14060,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14059,
                        "mutability": "mutable",
                        "name": "addresses",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14069,
                        "src": "414:28:70",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_calldata_ptr",
                          "typeString": "address[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 14057,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "414:7:70",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "id": 14058,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "414:9:70",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                            "typeString": "address[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "413:30:70"
                  },
                  "returnParameters": {
                    "id": 14061,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "453:0:70"
                  },
                  "scope": 14119,
                  "src": "392:100:70",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 14080,
                    "nodeType": "Block",
                    "src": "545:38:70",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 14077,
                              "name": "newAddress",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14071,
                              "src": "567:10:70",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 14074,
                              "name": "list",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14036,
                              "src": "551:4:70",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                              }
                            },
                            "id": 14076,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "addAddress",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16491,
                            "src": "551:15:70",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Mapping_$16337_storage_ptr_$_t_address_$returns$__$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                              "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer,address)"
                            }
                          },
                          "id": 14078,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "551:27:70",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 14079,
                        "nodeType": "ExpressionStatement",
                        "src": "551:27:70"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "38eada1c",
                  "id": 14081,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "addAddress",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14072,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14071,
                        "mutability": "mutable",
                        "name": "newAddress",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14081,
                        "src": "516:18:70",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 14070,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "516:7:70",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "515:20:70"
                  },
                  "returnParameters": {
                    "id": 14073,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "545:0:70"
                  },
                  "scope": 14119,
                  "src": "496:87:70",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 14095,
                    "nodeType": "Block",
                    "src": "654:48:70",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 14091,
                              "name": "prevAddress",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14083,
                              "src": "679:11:70",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 14092,
                              "name": "addr",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14085,
                              "src": "692:4:70",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 14088,
                              "name": "list",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14036,
                              "src": "660:4:70",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                              }
                            },
                            "id": 14090,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "removeAddress",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16552,
                            "src": "660:18:70",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Mapping_$16337_storage_ptr_$_t_address_$_t_address_$returns$__$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                              "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer,address,address)"
                            }
                          },
                          "id": 14093,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "660:37:70",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 14094,
                        "nodeType": "ExpressionStatement",
                        "src": "660:37:70"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "b6fac15a",
                  "id": 14096,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "removeAddress",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14086,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14083,
                        "mutability": "mutable",
                        "name": "prevAddress",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14096,
                        "src": "610:19:70",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 14082,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "610:7:70",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 14085,
                        "mutability": "mutable",
                        "name": "addr",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14096,
                        "src": "631:12:70",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 14084,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "631:7:70",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "609:35:70"
                  },
                  "returnParameters": {
                    "id": 14087,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "654:0:70"
                  },
                  "scope": 14119,
                  "src": "587:115:70",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 14108,
                    "nodeType": "Block",
                    "src": "767:37:70",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 14105,
                              "name": "addr",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14098,
                              "src": "794:4:70",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 14103,
                              "name": "list",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14036,
                              "src": "780:4:70",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                              }
                            },
                            "id": 14104,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "contains",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16584,
                            "src": "780:13:70",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_Mapping_$16337_storage_ptr_$_t_address_$returns$_t_bool_$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                              "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer,address) view returns (bool)"
                            }
                          },
                          "id": 14106,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "780:19:70",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 14102,
                        "id": 14107,
                        "nodeType": "Return",
                        "src": "773:26:70"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "5dbe47e8",
                  "id": 14109,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "contains",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14099,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14098,
                        "mutability": "mutable",
                        "name": "addr",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14109,
                        "src": "724:12:70",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 14097,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "724:7:70",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "723:14:70"
                  },
                  "returnParameters": {
                    "id": 14102,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14101,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14109,
                        "src": "761:4:70",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 14100,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "761:4:70",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "760:6:70"
                  },
                  "scope": 14119,
                  "src": "706:98:70",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 14117,
                    "nodeType": "Block",
                    "src": "837:26:70",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 14112,
                              "name": "list",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14036,
                              "src": "843:4:70",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage ref"
                              }
                            },
                            "id": 14114,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "clearAll",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16703,
                            "src": "843:13:70",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Mapping_$16337_storage_ptr_$returns$__$bound_to$_t_struct$_Mapping_$16337_storage_ptr_$",
                              "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer)"
                            }
                          },
                          "id": 14115,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "843:15:70",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 14116,
                        "nodeType": "ExpressionStatement",
                        "src": "843:15:70"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "ebb689a1",
                  "id": 14118,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "clearAll",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14110,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "825:2:70"
                  },
                  "returnParameters": {
                    "id": 14111,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "837:0:70"
                  },
                  "scope": 14119,
                  "src": "808:55:70",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 14120,
              "src": "72:794:70"
            }
          ],
          "src": "0:866:70"
        },
        "id": 70
      },
      "contracts/test/MultipleWinnersHarness.sol": {
        "ast": {
          "absolutePath": "contracts/test/MultipleWinnersHarness.sol",
          "exportedSymbols": {
            "MultipleWinnersHarness": [
              14158
            ]
          },
          "id": 14159,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 14121,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:71"
            },
            {
              "id": 14122,
              "literals": [
                "experimental",
                "ABIEncoderV2"
              ],
              "nodeType": "PragmaDirective",
              "src": "61:33:71"
            },
            {
              "absolutePath": "contracts/prize-strategy/multiple-winners/MultipleWinners.sol",
              "file": "../prize-strategy/multiple-winners/MultipleWinners.sol",
              "id": 14123,
              "nodeType": "ImportDirective",
              "scope": 14159,
              "sourceUnit": 12366,
              "src": "96:64:71",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 14125,
                    "name": "MultipleWinners",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 12365,
                    "src": "294:15:71",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_MultipleWinners_$12365",
                      "typeString": "contract MultipleWinners"
                    }
                  },
                  "id": 14126,
                  "nodeType": "InheritanceSpecifier",
                  "src": "294:15:71"
                }
              ],
              "contractDependencies": [
                130,
                931,
                1352,
                3627,
                11391,
                11841,
                12365,
                16234,
                16265
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 14124,
                "nodeType": "StructuredDocumentation",
                "src": "162:97:71",
                "text": "@title Creates a minimal proxy to the MultipleWinners prize strategy.  Very cheap to deploy."
              },
              "fullyImplemented": true,
              "id": 14158,
              "linearizedBaseContracts": [
                14158,
                12365,
                11841,
                11391,
                16234,
                16265,
                931,
                130,
                3627,
                1352
              ],
              "name": "MultipleWinnersHarness",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "functionSelector": "d18e81b3",
                  "id": 14128,
                  "mutability": "mutable",
                  "name": "currentTime",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 14158,
                  "src": "315:26:71",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 14127,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "315:7:71",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 14137,
                    "nodeType": "Block",
                    "src": "401:37:71",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14135,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 14133,
                            "name": "currentTime",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14128,
                            "src": "407:11:71",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 14134,
                            "name": "_currentTime",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14130,
                            "src": "421:12:71",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "407:26:71",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 14136,
                        "nodeType": "ExpressionStatement",
                        "src": "407:26:71"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "22f8e566",
                  "id": 14138,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setCurrentTime",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14131,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14130,
                        "mutability": "mutable",
                        "name": "_currentTime",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14138,
                        "src": "370:20:71",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14129,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "370:7:71",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "369:22:71"
                  },
                  "returnParameters": {
                    "id": 14132,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "401:0:71"
                  },
                  "scope": 14158,
                  "src": "346:92:71",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    10404
                  ],
                  "body": {
                    "id": 14146,
                    "nodeType": "Block",
                    "src": "507:29:71",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14144,
                          "name": "currentTime",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 14128,
                          "src": "520:11:71",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 14143,
                        "id": 14145,
                        "nodeType": "Return",
                        "src": "513:18:71"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 14147,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_currentTime",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 14140,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "475:8:71"
                  },
                  "parameters": {
                    "id": 14139,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "463:2:71"
                  },
                  "returnParameters": {
                    "id": 14143,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14142,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14147,
                        "src": "498:7:71",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14141,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "498:7:71",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "497:9:71"
                  },
                  "scope": 14158,
                  "src": "442:94:71",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 14156,
                    "nodeType": "Block",
                    "src": "591:36:71",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 14153,
                              "name": "randomNumber",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14149,
                              "src": "609:12:71",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 14152,
                            "name": "_distribute",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              12364
                            ],
                            "referencedDeclaration": 12364,
                            "src": "597:11:71",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 14154,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "597:25:71",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 14155,
                        "nodeType": "ExpressionStatement",
                        "src": "597:25:71"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "91c05b0b",
                  "id": 14157,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "distribute",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14150,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14149,
                        "mutability": "mutable",
                        "name": "randomNumber",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14157,
                        "src": "560:20:71",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14148,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "560:7:71",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "559:22:71"
                  },
                  "returnParameters": {
                    "id": 14151,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "591:0:71"
                  },
                  "scope": 14158,
                  "src": "540:87:71",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 14159,
              "src": "259:371:71"
            }
          ],
          "src": "37:593:71"
        },
        "id": 71
      },
      "contracts/test/MultipleWinnersHarnessProxyFactory.sol": {
        "ast": {
          "absolutePath": "contracts/test/MultipleWinnersHarnessProxyFactory.sol",
          "exportedSymbols": {
            "MultipleWinnersHarnessProxyFactory": [
              14194
            ]
          },
          "id": 14195,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 14160,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:72"
            },
            {
              "absolutePath": "contracts/test/MultipleWinnersHarness.sol",
              "file": "./MultipleWinnersHarness.sol",
              "id": 14161,
              "nodeType": "ImportDirective",
              "scope": 14195,
              "sourceUnit": 14159,
              "src": "62:38:72",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/external/openzeppelin/ProxyFactory.sol",
              "file": "../external/openzeppelin/ProxyFactory.sol",
              "id": 14162,
              "nodeType": "ImportDirective",
              "scope": 14195,
              "sourceUnit": 6617,
              "src": "101:51:72",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 14164,
                    "name": "ProxyFactory",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 6616,
                    "src": "298:12:72",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ProxyFactory_$6616",
                      "typeString": "contract ProxyFactory"
                    }
                  },
                  "id": 14165,
                  "nodeType": "InheritanceSpecifier",
                  "src": "298:12:72"
                }
              ],
              "contractDependencies": [
                6616,
                14158
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 14163,
                "nodeType": "StructuredDocumentation",
                "src": "154:97:72",
                "text": "@title Creates a minimal proxy to the MultipleWinners prize strategy.  Very cheap to deploy."
              },
              "fullyImplemented": true,
              "id": 14194,
              "linearizedBaseContracts": [
                14194,
                6616
              ],
              "name": "MultipleWinnersHarnessProxyFactory",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "functionSelector": "022ec095",
                  "id": 14167,
                  "mutability": "mutable",
                  "name": "instance",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 14194,
                  "src": "316:38:72",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_MultipleWinnersHarness_$14158",
                    "typeString": "contract MultipleWinnersHarness"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 14166,
                    "name": "MultipleWinnersHarness",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 14158,
                    "src": "316:22:72",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_MultipleWinnersHarness_$14158",
                      "typeString": "contract MultipleWinnersHarness"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 14176,
                    "nodeType": "Block",
                    "src": "381:50:72",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14174,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 14170,
                            "name": "instance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14167,
                            "src": "387:8:72",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_MultipleWinnersHarness_$14158",
                              "typeString": "contract MultipleWinnersHarness"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 14172,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "398:26:72",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_creation_nonpayable$__$returns$_t_contract$_MultipleWinnersHarness_$14158_$",
                                "typeString": "function () returns (contract MultipleWinnersHarness)"
                              },
                              "typeName": {
                                "contractScope": null,
                                "id": 14171,
                                "name": "MultipleWinnersHarness",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 14158,
                                "src": "402:22:72",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_MultipleWinnersHarness_$14158",
                                  "typeString": "contract MultipleWinnersHarness"
                                }
                              }
                            },
                            "id": 14173,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "398:28:72",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_MultipleWinnersHarness_$14158",
                              "typeString": "contract MultipleWinnersHarness"
                            }
                          },
                          "src": "387:39:72",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_MultipleWinnersHarness_$14158",
                            "typeString": "contract MultipleWinnersHarness"
                          }
                        },
                        "id": 14175,
                        "nodeType": "ExpressionStatement",
                        "src": "387:39:72"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 14177,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14168,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "371:2:72"
                  },
                  "returnParameters": {
                    "id": 14169,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "381:0:72"
                  },
                  "scope": 14194,
                  "src": "359:72:72",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 14192,
                    "nodeType": "Block",
                    "src": "495:78:72",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 14186,
                                      "name": "instance",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 14167,
                                      "src": "553:8:72",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_MultipleWinnersHarness_$14158",
                                        "typeString": "contract MultipleWinnersHarness"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_MultipleWinnersHarness_$14158",
                                        "typeString": "contract MultipleWinnersHarness"
                                      }
                                    ],
                                    "id": 14185,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "545:7:72",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 14184,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "545:7:72",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 14187,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "545:17:72",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "hexValue": "",
                                  "id": 14188,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "564:2:72",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                    "typeString": "literal_string \"\""
                                  },
                                  "value": ""
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                    "typeString": "literal_string \"\""
                                  }
                                ],
                                "id": 14183,
                                "name": "deployMinimal",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6615,
                                "src": "531:13:72",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_address_$",
                                  "typeString": "function (address,bytes memory) returns (address)"
                                }
                              },
                              "id": 14189,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "531:36:72",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 14182,
                            "name": "MultipleWinnersHarness",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14158,
                            "src": "508:22:72",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_MultipleWinnersHarness_$14158_$",
                              "typeString": "type(contract MultipleWinnersHarness)"
                            }
                          },
                          "id": 14190,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "508:60:72",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_MultipleWinnersHarness_$14158",
                            "typeString": "contract MultipleWinnersHarness"
                          }
                        },
                        "functionReturnParameters": 14181,
                        "id": 14191,
                        "nodeType": "Return",
                        "src": "501:67:72"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "efc81a8c",
                  "id": 14193,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "create",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14178,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "450:2:72"
                  },
                  "returnParameters": {
                    "id": 14181,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14180,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14193,
                        "src": "471:22:72",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_MultipleWinnersHarness_$14158",
                          "typeString": "contract MultipleWinnersHarness"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 14179,
                          "name": "MultipleWinnersHarness",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 14158,
                          "src": "471:22:72",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_MultipleWinnersHarness_$14158",
                            "typeString": "contract MultipleWinnersHarness"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "470:24:72"
                  },
                  "scope": 14194,
                  "src": "435:138:72",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 14195,
              "src": "251:325:72"
            }
          ],
          "src": "37:539:72"
        },
        "id": 72
      },
      "contracts/test/NFT.sol": {
        "ast": {
          "absolutePath": "contracts/test/NFT.sol",
          "exportedSymbols": {
            "NFT": [
              14239
            ]
          },
          "id": 14240,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 14196,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "0:23:73"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol",
              "id": 14197,
              "nodeType": "ImportDirective",
              "scope": 14240,
              "sourceUnit": 3147,
              "src": "24:80:73",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 14198,
                    "name": "ERC721Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3146,
                    "src": "122:17:73",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC721Upgradeable_$3146",
                      "typeString": "contract ERC721Upgradeable"
                    }
                  },
                  "id": 14199,
                  "nodeType": "InheritanceSpecifier",
                  "src": "122:17:73"
                }
              ],
              "contractDependencies": [
                919,
                931,
                1352,
                3146,
                3177,
                3204,
                3338,
                3627
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 14239,
              "linearizedBaseContracts": [
                14239,
                3146,
                3177,
                3204,
                3338,
                919,
                931,
                3627,
                1352
              ],
              "name": "NFT",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 14219,
                    "nodeType": "Block",
                    "src": "238:70:73",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 14209,
                              "name": "name_",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14201,
                              "src": "258:5:73",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 14210,
                              "name": "symbol_",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14203,
                              "src": "265:7:73",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 14208,
                            "name": "__ERC721_init",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2275,
                            "src": "244:13:73",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (string memory,string memory)"
                            }
                          },
                          "id": 14211,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "244:29:73",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 14212,
                        "nodeType": "ExpressionStatement",
                        "src": "244:29:73"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 14214,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "289:3:73",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 14215,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "289:10:73",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 14216,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "301:1:73",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 14213,
                            "name": "_safeMint",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              2787,
                              2816
                            ],
                            "referencedDeclaration": 2787,
                            "src": "279:9:73",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 14217,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "279:24:73",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 14218,
                        "nodeType": "ExpressionStatement",
                        "src": "279:24:73"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "4cd88b76",
                  "id": 14220,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 14206,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 14205,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "226:11:73",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "226:11:73"
                    }
                  ],
                  "name": "initialize",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14204,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14201,
                        "mutability": "mutable",
                        "name": "name_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14220,
                        "src": "170:19:73",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 14200,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "170:6:73",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 14203,
                        "mutability": "mutable",
                        "name": "symbol_",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14220,
                        "src": "191:21:73",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 14202,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "191:6:73",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "164:52:73"
                  },
                  "returnParameters": {
                    "id": 14207,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "238:0:73"
                  },
                  "scope": 14239,
                  "src": "144:164:73",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 14237,
                    "nodeType": "Block",
                    "src": "396:64:73",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 14232,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14222,
                              "src": "437:4:73",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 14233,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14224,
                              "src": "443:2:73",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 14234,
                              "name": "tokenId",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14226,
                              "src": "447:7:73",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 14229,
                              "name": "ERC721Upgradeable",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 3146,
                              "src": "402:17:73",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_ERC721Upgradeable_$3146_$",
                                "typeString": "type(contract ERC721Upgradeable)"
                              }
                            },
                            "id": 14231,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "safeTransferFrom",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 2657,
                            "src": "402:34:73",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 14235,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "402:53:73",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 14236,
                        "nodeType": "ExpressionStatement",
                        "src": "402:53:73"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "cb322d46",
                  "id": 14238,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "simulateSafeTransferFrom",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14227,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14222,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14238,
                        "src": "346:12:73",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 14221,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "346:7:73",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 14224,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14238,
                        "src": "360:10:73",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 14223,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "360:7:73",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 14226,
                        "mutability": "mutable",
                        "name": "tokenId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14238,
                        "src": "372:15:73",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14225,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "372:7:73",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "345:43:73"
                  },
                  "returnParameters": {
                    "id": 14228,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "396:0:73"
                  },
                  "scope": 14239,
                  "src": "312:148:73",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                }
              ],
              "scope": 14240,
              "src": "106:356:73"
            }
          ],
          "src": "0:462:73"
        },
        "id": 73
      },
      "contracts/test/PeriodicPrizeStrategyDistributorInterface.sol": {
        "ast": {
          "absolutePath": "contracts/test/PeriodicPrizeStrategyDistributorInterface.sol",
          "exportedSymbols": {
            "PeriodicPrizeStrategyDistributorInterface": [
              14248
            ]
          },
          "id": 14249,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 14241,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "0:23:74"
            },
            {
              "absolutePath": "contracts/prize-strategy/PeriodicPrizeStrategy.sol",
              "file": "../prize-strategy/PeriodicPrizeStrategy.sol",
              "id": 14242,
              "nodeType": "ImportDirective",
              "scope": 14249,
              "sourceUnit": 11392,
              "src": "25:53:74",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 14248,
              "linearizedBaseContracts": [
                14248
              ],
              "name": "PeriodicPrizeStrategyDistributorInterface",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "91c05b0b",
                  "id": 14247,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "distribute",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14245,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14244,
                        "mutability": "mutable",
                        "name": "randomNumber",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14247,
                        "src": "203:20:74",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14243,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "203:7:74",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "202:22:74"
                  },
                  "returnParameters": {
                    "id": 14246,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "233:0:74"
                  },
                  "scope": 14248,
                  "src": "183:51:74",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 14249,
              "src": "127:109:74"
            }
          ],
          "src": "0:236:74"
        },
        "id": 74
      },
      "contracts/test/PeriodicPrizeStrategyHarness.sol": {
        "ast": {
          "absolutePath": "contracts/test/PeriodicPrizeStrategyHarness.sol",
          "exportedSymbols": {
            "PeriodicPrizeStrategyHarness": [
              14331
            ]
          },
          "id": 14332,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 14250,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "0:23:75"
            },
            {
              "absolutePath": "contracts/prize-strategy/PeriodicPrizeStrategy.sol",
              "file": "../prize-strategy/PeriodicPrizeStrategy.sol",
              "id": 14251,
              "nodeType": "ImportDirective",
              "scope": 14332,
              "sourceUnit": 11392,
              "src": "25:53:75",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/test/PeriodicPrizeStrategyDistributorInterface.sol",
              "file": "./PeriodicPrizeStrategyDistributorInterface.sol",
              "id": 14252,
              "nodeType": "ImportDirective",
              "scope": 14332,
              "sourceUnit": 14249,
              "src": "79:57:75",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 14253,
                    "name": "PeriodicPrizeStrategy",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 11391,
                    "src": "226:21:75",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_PeriodicPrizeStrategy_$11391",
                      "typeString": "contract PeriodicPrizeStrategy"
                    }
                  },
                  "id": 14254,
                  "nodeType": "InheritanceSpecifier",
                  "src": "226:21:75"
                }
              ],
              "contractDependencies": [
                130,
                931,
                1352,
                3627,
                11391,
                16234,
                16265
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 14331,
              "linearizedBaseContracts": [
                14331,
                11391,
                16234,
                16265,
                931,
                130,
                3627,
                1352
              ],
              "name": "PeriodicPrizeStrategyHarness",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "id": 14256,
                  "mutability": "mutable",
                  "name": "distributor",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 14331,
                  "src": "253:53:75",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_PeriodicPrizeStrategyDistributorInterface_$14248",
                    "typeString": "contract PeriodicPrizeStrategyDistributorInterface"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 14255,
                    "name": "PeriodicPrizeStrategyDistributorInterface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 14248,
                    "src": "253:41:75",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_PeriodicPrizeStrategyDistributorInterface_$14248",
                      "typeString": "contract PeriodicPrizeStrategyDistributorInterface"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 14265,
                    "nodeType": "Block",
                    "src": "400:37:75",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14263,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 14261,
                            "name": "distributor",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14256,
                            "src": "406:11:75",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_PeriodicPrizeStrategyDistributorInterface_$14248",
                              "typeString": "contract PeriodicPrizeStrategyDistributorInterface"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 14262,
                            "name": "_distributor",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14258,
                            "src": "420:12:75",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_PeriodicPrizeStrategyDistributorInterface_$14248",
                              "typeString": "contract PeriodicPrizeStrategyDistributorInterface"
                            }
                          },
                          "src": "406:26:75",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_PeriodicPrizeStrategyDistributorInterface_$14248",
                            "typeString": "contract PeriodicPrizeStrategyDistributorInterface"
                          }
                        },
                        "id": 14264,
                        "nodeType": "ExpressionStatement",
                        "src": "406:26:75"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "75619ab5",
                  "id": 14266,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setDistributor",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14259,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14258,
                        "mutability": "mutable",
                        "name": "_distributor",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14266,
                        "src": "335:54:75",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_PeriodicPrizeStrategyDistributorInterface_$14248",
                          "typeString": "contract PeriodicPrizeStrategyDistributorInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 14257,
                          "name": "PeriodicPrizeStrategyDistributorInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 14248,
                          "src": "335:41:75",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_PeriodicPrizeStrategyDistributorInterface_$14248",
                            "typeString": "contract PeriodicPrizeStrategyDistributorInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "334:56:75"
                  },
                  "returnParameters": {
                    "id": 14260,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "400:0:75"
                  },
                  "scope": 14331,
                  "src": "311:126:75",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "constant": false,
                  "id": 14268,
                  "mutability": "mutable",
                  "name": "time",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 14331,
                  "src": "441:21:75",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 14267,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "441:7:75",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 14277,
                    "nodeType": "Block",
                    "src": "514:23:75",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14275,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 14273,
                            "name": "time",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14268,
                            "src": "520:4:75",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 14274,
                            "name": "_time",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14270,
                            "src": "527:5:75",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "520:12:75",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 14276,
                        "nodeType": "ExpressionStatement",
                        "src": "520:12:75"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "22f8e566",
                  "id": 14278,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setCurrentTime",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14271,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14270,
                        "mutability": "mutable",
                        "name": "_time",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14278,
                        "src": "490:13:75",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14269,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "490:7:75",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "489:15:75"
                  },
                  "returnParameters": {
                    "id": 14272,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "514:0:75"
                  },
                  "scope": 14331,
                  "src": "466:71:75",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    10404
                  ],
                  "body": {
                    "id": 14286,
                    "nodeType": "Block",
                    "src": "606:22:75",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14284,
                          "name": "time",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 14268,
                          "src": "619:4:75",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 14283,
                        "id": 14285,
                        "nodeType": "Return",
                        "src": "612:11:75"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 14287,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_currentTime",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 14280,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "574:8:75"
                  },
                  "parameters": {
                    "id": 14279,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "562:2:75"
                  },
                  "returnParameters": {
                    "id": 14283,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14282,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14287,
                        "src": "597:7:75",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14281,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "597:7:75",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "596:9:75"
                  },
                  "scope": 14331,
                  "src": "541:87:75",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 14306,
                    "nodeType": "Block",
                    "src": "700:74:75",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14298,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 14294,
                              "name": "rngRequest",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9748,
                              "src": "706:10:75",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_RngRequest_$9732_storage",
                                "typeString": "struct PeriodicPrizeStrategy.RngRequest storage ref"
                              }
                            },
                            "id": 14296,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "id",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 9727,
                            "src": "706:13:75",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 14297,
                            "name": "requestId",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14289,
                            "src": "722:9:75",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "src": "706:25:75",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "id": 14299,
                        "nodeType": "ExpressionStatement",
                        "src": "706:25:75"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14304,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 14300,
                              "name": "rngRequest",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 9748,
                              "src": "737:10:75",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_RngRequest_$9732_storage",
                                "typeString": "struct PeriodicPrizeStrategy.RngRequest storage ref"
                              }
                            },
                            "id": 14302,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "lockBlock",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 9729,
                            "src": "737:20:75",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 14303,
                            "name": "lockBlock",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14291,
                            "src": "760:9:75",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "src": "737:32:75",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "id": 14305,
                        "nodeType": "ExpressionStatement",
                        "src": "737:32:75"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "642d43db",
                  "id": 14307,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setRngRequest",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14292,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14289,
                        "mutability": "mutable",
                        "name": "requestId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14307,
                        "src": "655:16:75",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 14288,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "655:6:75",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 14291,
                        "mutability": "mutable",
                        "name": "lockBlock",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14307,
                        "src": "673:16:75",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 14290,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "673:6:75",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "654:36:75"
                  },
                  "returnParameters": {
                    "id": 14293,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "700:0:75"
                  },
                  "scope": 14331,
                  "src": "632:142:75",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    9929
                  ],
                  "body": {
                    "id": 14319,
                    "nodeType": "Block",
                    "src": "839:47:75",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 14316,
                              "name": "randomNumber",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14309,
                              "src": "868:12:75",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 14313,
                              "name": "distributor",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14256,
                              "src": "845:11:75",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_PeriodicPrizeStrategyDistributorInterface_$14248",
                                "typeString": "contract PeriodicPrizeStrategyDistributorInterface"
                              }
                            },
                            "id": 14315,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "distribute",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 14247,
                            "src": "845:22:75",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256) external"
                            }
                          },
                          "id": 14317,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "845:36:75",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 14318,
                        "nodeType": "ExpressionStatement",
                        "src": "845:36:75"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 14320,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_distribute",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 14311,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "830:8:75"
                  },
                  "parameters": {
                    "id": 14310,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14309,
                        "mutability": "mutable",
                        "name": "randomNumber",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14320,
                        "src": "799:20:75",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14308,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "799:7:75",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "798:22:75"
                  },
                  "returnParameters": {
                    "id": 14312,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "839:0:75"
                  },
                  "scope": 14331,
                  "src": "778:108:75",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 14329,
                    "nodeType": "Block",
                    "src": "972:41:75",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14327,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 14325,
                            "name": "beforeAwardListener",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 9767,
                            "src": "978:19:75",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                              "typeString": "contract BeforeAwardListenerInterface"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 14326,
                            "name": "listener",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14322,
                            "src": "1000:8:75",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                              "typeString": "contract BeforeAwardListenerInterface"
                            }
                          },
                          "src": "978:30:75",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                            "typeString": "contract BeforeAwardListenerInterface"
                          }
                        },
                        "id": 14328,
                        "nodeType": "ExpressionStatement",
                        "src": "978:30:75"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "f210a9f3",
                  "id": 14330,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "forceBeforeAwardListener",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14323,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14322,
                        "mutability": "mutable",
                        "name": "listener",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14330,
                        "src": "924:37:75",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                          "typeString": "contract BeforeAwardListenerInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 14321,
                          "name": "BeforeAwardListenerInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 9575,
                          "src": "924:28:75",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_BeforeAwardListenerInterface_$9575",
                            "typeString": "contract BeforeAwardListenerInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "923:39:75"
                  },
                  "returnParameters": {
                    "id": 14324,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "972:0:75"
                  },
                  "scope": 14331,
                  "src": "890:123:75",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 14332,
              "src": "185:830:75"
            }
          ],
          "src": "0:1015:75"
        },
        "id": 75
      },
      "contracts/test/PeriodicPrizeStrategyListenerStub.sol": {
        "ast": {
          "absolutePath": "contracts/test/PeriodicPrizeStrategyListenerStub.sol",
          "exportedSymbols": {
            "PeriodicPrizeStrategyListenerStub": [
              14351
            ]
          },
          "id": 14352,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 14333,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "0:23:76"
            },
            {
              "absolutePath": "contracts/prize-strategy/PeriodicPrizeStrategyListener.sol",
              "file": "../prize-strategy/PeriodicPrizeStrategyListener.sol",
              "id": 14334,
              "nodeType": "ImportDirective",
              "scope": 14352,
              "sourceUnit": 11420,
              "src": "25:61:76",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 14335,
                    "name": "PeriodicPrizeStrategyListener",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 11419,
                    "src": "181:29:76",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_PeriodicPrizeStrategyListener_$11419",
                      "typeString": "contract PeriodicPrizeStrategyListener"
                    }
                  },
                  "id": 14336,
                  "nodeType": "InheritanceSpecifier",
                  "src": "181:29:76"
                }
              ],
              "contractDependencies": [
                931,
                11419,
                11432
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 14351,
              "linearizedBaseContracts": [
                14351,
                11419,
                11432,
                931
              ],
              "name": "PeriodicPrizeStrategyListenerStub",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 14338,
                  "name": "Awarded",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 14337,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "229:2:76"
                  },
                  "src": "216:16:76"
                },
                {
                  "baseFunctions": [
                    11431
                  ],
                  "body": {
                    "id": 14349,
                    "nodeType": "Block",
                    "src": "337:25:76",
                    "statements": [
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 14346,
                            "name": "Awarded",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14338,
                            "src": "348:7:76",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 14347,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "348:9:76",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 14348,
                        "nodeType": "EmitStatement",
                        "src": "343:14:76"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "575072c6",
                  "id": 14350,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "afterPrizePoolAwarded",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 14344,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "328:8:76"
                  },
                  "parameters": {
                    "id": 14343,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14340,
                        "mutability": "mutable",
                        "name": "randomNumber",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14350,
                        "src": "267:20:76",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14339,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "267:7:76",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 14342,
                        "mutability": "mutable",
                        "name": "prizePeriodStartedAt",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14350,
                        "src": "289:28:76",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14341,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "289:7:76",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "266:52:76"
                  },
                  "returnParameters": {
                    "id": 14345,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "337:0:76"
                  },
                  "scope": 14351,
                  "src": "236:126:76",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 14352,
              "src": "135:229:76"
            }
          ],
          "src": "0:364:76"
        },
        "id": 76
      },
      "contracts/test/PrizePoolHarness.sol": {
        "ast": {
          "absolutePath": "contracts/test/PrizePoolHarness.sol",
          "exportedSymbols": {
            "PrizePoolHarness": [
              14488
            ]
          },
          "id": 14489,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 14353,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "0:23:77"
            },
            {
              "absolutePath": "contracts/prize-pool/PrizePool.sol",
              "file": "../prize-pool/PrizePool.sol",
              "id": 14354,
              "nodeType": "ImportDirective",
              "scope": 14489,
              "sourceUnit": 8752,
              "src": "25:37:77",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/test/YieldSourceStub.sol",
              "file": "./YieldSourceStub.sol",
              "id": 14355,
              "nodeType": "ImportDirective",
              "scope": 14489,
              "sourceUnit": 14925,
              "src": "63:31:77",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 14356,
                    "name": "PrizePool",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 8751,
                    "src": "125:9:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_PrizePool_$8751",
                      "typeString": "contract PrizePool"
                    }
                  },
                  "id": 14357,
                  "nodeType": "InheritanceSpecifier",
                  "src": "125:9:77"
                }
              ],
              "contractDependencies": [
                130,
                1352,
                3222,
                3627,
                4787,
                8751,
                8930,
                16206
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 14488,
              "linearizedBaseContracts": [
                14488,
                8751,
                3222,
                16206,
                4787,
                130,
                3627,
                1352,
                8930
              ],
              "name": "PrizePoolHarness",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "functionSelector": "d18e81b3",
                  "id": 14359,
                  "mutability": "mutable",
                  "name": "currentTime",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 14488,
                  "src": "140:26:77",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 14358,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "140:7:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "id": 14361,
                  "mutability": "mutable",
                  "name": "stubYieldSource",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 14488,
                  "src": "171:31:77",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_YieldSourceStub_$14924",
                    "typeString": "contract YieldSourceStub"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 14360,
                    "name": "YieldSourceStub",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 14924,
                    "src": "171:15:77",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_YieldSourceStub_$14924",
                      "typeString": "contract YieldSourceStub"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 14385,
                    "nodeType": "Block",
                    "src": "415:153:77",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 14376,
                              "name": "_reserveRegistry",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14363,
                              "src": "449:16:77",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                                "typeString": "contract RegistryInterface"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 14377,
                              "name": "_controlledTokens",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14366,
                              "src": "473:17:77",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                                "typeString": "contract ControlledTokenInterface[] memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 14378,
                              "name": "_maxExitFeeMantissa",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14368,
                              "src": "498:19:77",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                                "typeString": "contract RegistryInterface"
                              },
                              {
                                "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                                "typeString": "contract ControlledTokenInterface[] memory"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 14373,
                              "name": "PrizePool",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 8751,
                              "src": "421:9:77",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_PrizePool_$8751_$",
                                "typeString": "type(contract PrizePool)"
                              }
                            },
                            "id": 14375,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "initialize",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 6941,
                            "src": "421:20:77",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_RegistryInterface_$12458_$_t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr_$_t_uint256_$returns$__$",
                              "typeString": "function (contract RegistryInterface,contract ControlledTokenInterface[] memory,uint256)"
                            }
                          },
                          "id": 14379,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "421:102:77",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 14380,
                        "nodeType": "ExpressionStatement",
                        "src": "421:102:77"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14383,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 14381,
                            "name": "stubYieldSource",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14361,
                            "src": "529:15:77",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_YieldSourceStub_$14924",
                              "typeString": "contract YieldSourceStub"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 14382,
                            "name": "_stubYieldSource",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14370,
                            "src": "547:16:77",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_YieldSourceStub_$14924",
                              "typeString": "contract YieldSourceStub"
                            }
                          },
                          "src": "529:34:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_YieldSourceStub_$14924",
                            "typeString": "contract YieldSourceStub"
                          }
                        },
                        "id": 14384,
                        "nodeType": "ExpressionStatement",
                        "src": "529:34:77"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "610c75ea",
                  "id": 14386,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "initializeAll",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14371,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14363,
                        "mutability": "mutable",
                        "name": "_reserveRegistry",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14386,
                        "src": "235:34:77",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                          "typeString": "contract RegistryInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 14362,
                          "name": "RegistryInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 12458,
                          "src": "235:17:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_RegistryInterface_$12458",
                            "typeString": "contract RegistryInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 14366,
                        "mutability": "mutable",
                        "name": "_controlledTokens",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14386,
                        "src": "275:51:77",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_memory_ptr",
                          "typeString": "contract ControlledTokenInterface[]"
                        },
                        "typeName": {
                          "baseType": {
                            "contractScope": null,
                            "id": 14364,
                            "name": "ControlledTokenInterface",
                            "nodeType": "UserDefinedTypeName",
                            "referencedDeclaration": 15850,
                            "src": "275:24:77",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                              "typeString": "contract ControlledTokenInterface"
                            }
                          },
                          "id": 14365,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "275:26:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_ControlledTokenInterface_$15850_$dyn_storage_ptr",
                            "typeString": "contract ControlledTokenInterface[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 14368,
                        "mutability": "mutable",
                        "name": "_maxExitFeeMantissa",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14386,
                        "src": "332:27:77",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14367,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "332:7:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 14370,
                        "mutability": "mutable",
                        "name": "_stubYieldSource",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14386,
                        "src": "365:32:77",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_YieldSourceStub_$14924",
                          "typeString": "contract YieldSourceStub"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 14369,
                          "name": "YieldSourceStub",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 14924,
                          "src": "365:15:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_YieldSourceStub_$14924",
                            "typeString": "contract YieldSourceStub"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "229:172:77"
                  },
                  "returnParameters": {
                    "id": 14372,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "415:0:77"
                  },
                  "scope": 14488,
                  "src": "207:361:77",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 14395,
                    "nodeType": "Block",
                    "src": "617:30:77",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 14392,
                              "name": "mintAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14388,
                              "src": "631:10:77",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 14391,
                            "name": "_supply",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              14473
                            ],
                            "referencedDeclaration": 14473,
                            "src": "623:7:77",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 14393,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "623:19:77",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 14394,
                        "nodeType": "ExpressionStatement",
                        "src": "623:19:77"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "35403023",
                  "id": 14396,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "supply",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14389,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14388,
                        "mutability": "mutable",
                        "name": "mintAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14396,
                        "src": "588:18:77",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14387,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "588:7:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "587:20:77"
                  },
                  "returnParameters": {
                    "id": 14390,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "617:0:77"
                  },
                  "scope": 14488,
                  "src": "572:75:77",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 14405,
                    "nodeType": "Block",
                    "src": "698:32:77",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 14402,
                              "name": "redeemAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14398,
                              "src": "712:12:77",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 14401,
                            "name": "_redeem",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              14487
                            ],
                            "referencedDeclaration": 14487,
                            "src": "704:7:77",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256) returns (uint256)"
                            }
                          },
                          "id": 14403,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "704:21:77",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 14404,
                        "nodeType": "ExpressionStatement",
                        "src": "704:21:77"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "db006a75",
                  "id": 14406,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "redeem",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14399,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14398,
                        "mutability": "mutable",
                        "name": "redeemAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14406,
                        "src": "667:20:77",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14397,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "667:7:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "666:22:77"
                  },
                  "returnParameters": {
                    "id": 14400,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "698:0:77"
                  },
                  "scope": 14488,
                  "src": "651:79:77",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 14415,
                    "nodeType": "Block",
                    "src": "789:37:77",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14413,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 14411,
                            "name": "currentTime",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14359,
                            "src": "795:11:77",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 14412,
                            "name": "_currentTime",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14408,
                            "src": "809:12:77",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "795:26:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 14414,
                        "nodeType": "ExpressionStatement",
                        "src": "795:26:77"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "22f8e566",
                  "id": 14416,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setCurrentTime",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14409,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14408,
                        "mutability": "mutable",
                        "name": "_currentTime",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14416,
                        "src": "758:20:77",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14407,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "758:7:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "757:22:77"
                  },
                  "returnParameters": {
                    "id": 14410,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "789:0:77"
                  },
                  "scope": 14488,
                  "src": "734:92:77",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    8462
                  ],
                  "body": {
                    "id": 14424,
                    "nodeType": "Block",
                    "src": "895:29:77",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14422,
                          "name": "currentTime",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 14359,
                          "src": "908:11:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 14421,
                        "id": 14423,
                        "nodeType": "Return",
                        "src": "901:18:77"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 14425,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_currentTime",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 14418,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "863:8:77"
                  },
                  "parameters": {
                    "id": 14417,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "851:2:77"
                  },
                  "returnParameters": {
                    "id": 14421,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14420,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14425,
                        "src": "886:7:77",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14419,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "886:7:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "885:9:77"
                  },
                  "scope": 14488,
                  "src": "830:94:77",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8655
                  ],
                  "body": {
                    "id": 14438,
                    "nodeType": "Block",
                    "src": "1017:66:77",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 14435,
                              "name": "_externalToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14427,
                              "src": "1063:14:77",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 14433,
                              "name": "stubYieldSource",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14361,
                              "src": "1030:15:77",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_YieldSourceStub_$14924",
                                "typeString": "contract YieldSourceStub"
                              }
                            },
                            "id": 14434,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "canAwardExternal",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 14901,
                            "src": "1030:32:77",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_bool_$",
                              "typeString": "function (address) view external returns (bool)"
                            }
                          },
                          "id": 14436,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1030:48:77",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 14432,
                        "id": 14437,
                        "nodeType": "Return",
                        "src": "1023:55:77"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 14439,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_canAwardExternal",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 14429,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "988:8:77"
                  },
                  "parameters": {
                    "id": 14428,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14427,
                        "mutability": "mutable",
                        "name": "_externalToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14439,
                        "src": "955:22:77",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 14426,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "955:7:77",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "954:24:77"
                  },
                  "returnParameters": {
                    "id": 14432,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14431,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14439,
                        "src": "1011:4:77",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 14430,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "1011:4:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1010:6:77"
                  },
                  "scope": 14488,
                  "src": "928:155:77",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8661
                  ],
                  "body": {
                    "id": 14449,
                    "nodeType": "Block",
                    "src": "1156:41:77",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 14445,
                              "name": "stubYieldSource",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14361,
                              "src": "1169:15:77",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_YieldSourceStub_$14924",
                                "typeString": "contract YieldSourceStub"
                              }
                            },
                            "id": 14446,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "token",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 14906,
                            "src": "1169:21:77",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$__$returns$_t_contract$_IERC20Upgradeable_$1960_$",
                              "typeString": "function () view external returns (contract IERC20Upgradeable)"
                            }
                          },
                          "id": 14447,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1169:23:77",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "functionReturnParameters": 14444,
                        "id": 14448,
                        "nodeType": "Return",
                        "src": "1162:30:77"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 14450,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_token",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 14441,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "1114:8:77"
                  },
                  "parameters": {
                    "id": 14440,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1102:2:77"
                  },
                  "returnParameters": {
                    "id": 14444,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14443,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14450,
                        "src": "1137:17:77",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 14442,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "1137:17:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1136:19:77"
                  },
                  "scope": 14488,
                  "src": "1087:110:77",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8667
                  ],
                  "body": {
                    "id": 14460,
                    "nodeType": "Block",
                    "src": "1257:43:77",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 14456,
                              "name": "stubYieldSource",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14361,
                              "src": "1270:15:77",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_YieldSourceStub_$14924",
                                "typeString": "contract YieldSourceStub"
                              }
                            },
                            "id": 14457,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balance",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 14911,
                            "src": "1270:23:77",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$__$returns$_t_uint256_$",
                              "typeString": "function () external returns (uint256)"
                            }
                          },
                          "id": 14458,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1270:25:77",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 14455,
                        "id": 14459,
                        "nodeType": "Return",
                        "src": "1263:32:77"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 14461,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_balance",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 14452,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "1230:8:77"
                  },
                  "parameters": {
                    "id": 14451,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1218:2:77"
                  },
                  "returnParameters": {
                    "id": 14455,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14454,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14461,
                        "src": "1248:7:77",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14453,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1248:7:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1247:9:77"
                  },
                  "scope": 14488,
                  "src": "1201:99:77",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8673
                  ],
                  "body": {
                    "id": 14472,
                    "nodeType": "Block",
                    "src": "1359:52:77",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 14469,
                              "name": "mintAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14463,
                              "src": "1395:10:77",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 14467,
                              "name": "stubYieldSource",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14361,
                              "src": "1372:15:77",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_YieldSourceStub_$14924",
                                "typeString": "contract YieldSourceStub"
                              }
                            },
                            "id": 14468,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "supply",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 14916,
                            "src": "1372:22:77",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256) external"
                            }
                          },
                          "id": 14470,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1372:34:77",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "functionReturnParameters": 14466,
                        "id": 14471,
                        "nodeType": "Return",
                        "src": "1365:41:77"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 14473,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_supply",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 14465,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "1350:8:77"
                  },
                  "parameters": {
                    "id": 14464,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14463,
                        "mutability": "mutable",
                        "name": "mintAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14473,
                        "src": "1321:18:77",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14462,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1321:7:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1320:20:77"
                  },
                  "returnParameters": {
                    "id": 14466,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1359:0:77"
                  },
                  "scope": 14488,
                  "src": "1304:107:77",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    8681
                  ],
                  "body": {
                    "id": 14486,
                    "nodeType": "Block",
                    "src": "1490:54:77",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 14483,
                              "name": "redeemAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14475,
                              "src": "1526:12:77",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 14481,
                              "name": "stubYieldSource",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14361,
                              "src": "1503:15:77",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_YieldSourceStub_$14924",
                                "typeString": "contract YieldSourceStub"
                              }
                            },
                            "id": 14482,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "redeem",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 14923,
                            "src": "1503:22:77",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256) external returns (uint256)"
                            }
                          },
                          "id": 14484,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1503:36:77",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 14480,
                        "id": 14485,
                        "nodeType": "Return",
                        "src": "1496:43:77"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 14487,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_redeem",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 14477,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "1463:8:77"
                  },
                  "parameters": {
                    "id": 14476,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14475,
                        "mutability": "mutable",
                        "name": "redeemAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14487,
                        "src": "1432:20:77",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14474,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1432:7:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1431:22:77"
                  },
                  "returnParameters": {
                    "id": 14480,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14479,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14487,
                        "src": "1481:7:77",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14478,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1481:7:77",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1480:9:77"
                  },
                  "scope": 14488,
                  "src": "1415:129:77",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 14489,
              "src": "96:1450:77"
            }
          ],
          "src": "0:1547:77"
        },
        "id": 77
      },
      "contracts/test/PrizeSplitHarness.sol": {
        "ast": {
          "absolutePath": "contracts/test/PrizeSplitHarness.sol",
          "exportedSymbols": {
            "PrizeSplitHarness": [
              14597
            ]
          },
          "id": 14598,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 14490,
              "literals": [
                "solidity",
                "^",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "32:24:78"
            },
            {
              "id": 14491,
              "literals": [
                "experimental",
                "ABIEncoderV2"
              ],
              "nodeType": "PragmaDirective",
              "src": "57:33:78"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "id": 14492,
              "nodeType": "ImportDirective",
              "scope": 14598,
              "sourceUnit": 1961,
              "src": "92:79:78",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/token/ControlledToken.sol",
              "file": "../token/ControlledToken.sol",
              "id": 14493,
              "nodeType": "ImportDirective",
              "scope": 14598,
              "sourceUnit": 15811,
              "src": "173:38:78",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/prize-strategy/PrizeSplit.sol",
              "file": "../prize-strategy/PrizeSplit.sol",
              "id": 14494,
              "nodeType": "ImportDirective",
              "scope": 14598,
              "sourceUnit": 11842,
              "src": "212:42:78",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 14495,
                    "name": "PrizeSplit",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 11841,
                    "src": "333:10:78",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_PrizeSplit_$11841",
                      "typeString": "contract PrizeSplit"
                    }
                  },
                  "id": 14496,
                  "nodeType": "InheritanceSpecifier",
                  "src": "333:10:78"
                }
              ],
              "contractDependencies": [
                130,
                1352,
                3627,
                11841
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 14597,
              "linearizedBaseContracts": [
                14597,
                11841,
                130,
                3627,
                1352
              ],
              "name": "PrizeSplitHarness",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "id": 14499,
                  "mutability": "mutable",
                  "name": "externalErc20s",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 14597,
                  "src": "349:41:78",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_contract$_ControlledToken_$15810_$dyn_storage",
                    "typeString": "contract ControlledToken[]"
                  },
                  "typeName": {
                    "baseType": {
                      "contractScope": null,
                      "id": 14497,
                      "name": "ControlledToken",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 15810,
                      "src": "349:15:78",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ControlledToken_$15810",
                        "typeString": "contract ControlledToken"
                      }
                    },
                    "id": 14498,
                    "length": null,
                    "nodeType": "ArrayTypeName",
                    "src": "349:17:78",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_contract$_ControlledToken_$15810_$dyn_storage_ptr",
                      "typeString": "contract ControlledToken[]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 14505,
                    "nodeType": "Block",
                    "src": "417:27:78",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 14502,
                            "name": "__Ownable_init",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 29,
                            "src": "423:14:78",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 14503,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "423:16:78",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 14504,
                        "nodeType": "ExpressionStatement",
                        "src": "423:16:78"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 14506,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14500,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "407:2:78"
                  },
                  "returnParameters": {
                    "id": 14501,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "417:0:78"
                  },
                  "scope": 14597,
                  "src": "395:49:78",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 14533,
                    "nodeType": "Block",
                    "src": "510:115:78",
                    "statements": [
                      {
                        "body": {
                          "id": 14531,
                          "nodeType": "Block",
                          "src": "572:49:78",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 14526,
                                      "name": "tokens",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 14509,
                                      "src": "600:6:78",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_contract$_ControlledToken_$15810_$dyn_calldata_ptr",
                                        "typeString": "contract ControlledToken[] calldata"
                                      }
                                    },
                                    "id": 14528,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 14527,
                                      "name": "index",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 14513,
                                      "src": "607:5:78",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "600:13:78",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_ControlledToken_$15810",
                                      "typeString": "contract ControlledToken"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_ControlledToken_$15810",
                                      "typeString": "contract ControlledToken"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 14523,
                                    "name": "externalErc20s",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 14499,
                                    "src": "580:14:78",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_contract$_ControlledToken_$15810_$dyn_storage",
                                      "typeString": "contract ControlledToken[] storage ref"
                                    }
                                  },
                                  "id": 14525,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "push",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "580:19:78",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_arraypush_nonpayable$_t_contract$_ControlledToken_$15810_$returns$__$",
                                    "typeString": "function (contract ControlledToken)"
                                  }
                                },
                                "id": 14529,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "580:34:78",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 14530,
                              "nodeType": "ExpressionStatement",
                              "src": "580:34:78"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 14519,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 14516,
                            "name": "index",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14513,
                            "src": "540:5:78",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 14517,
                              "name": "tokens",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14509,
                              "src": "548:6:78",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_ControlledToken_$15810_$dyn_calldata_ptr",
                                "typeString": "contract ControlledToken[] calldata"
                              }
                            },
                            "id": 14518,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "548:13:78",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "540:21:78",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 14532,
                        "initializationExpression": {
                          "assignments": [
                            14513
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 14513,
                              "mutability": "mutable",
                              "name": "index",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 14532,
                              "src": "521:13:78",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 14512,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "521:7:78",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 14515,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 14514,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "537:1:78",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "521:17:78"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 14521,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "563:7:78",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 14520,
                              "name": "index",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14513,
                              "src": "563:5:78",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 14522,
                          "nodeType": "ExpressionStatement",
                          "src": "563:7:78"
                        },
                        "nodeType": "ForStatement",
                        "src": "516:105:78"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "a224cee7",
                  "id": 14534,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "initialize",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14510,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14509,
                        "mutability": "mutable",
                        "name": "tokens",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14534,
                        "src": "468:33:78",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_ControlledToken_$15810_$dyn_calldata_ptr",
                          "typeString": "contract ControlledToken[]"
                        },
                        "typeName": {
                          "baseType": {
                            "contractScope": null,
                            "id": 14507,
                            "name": "ControlledToken",
                            "nodeType": "UserDefinedTypeName",
                            "referencedDeclaration": 15810,
                            "src": "468:15:78",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledToken_$15810",
                              "typeString": "contract ControlledToken"
                            }
                          },
                          "id": 14508,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "468:17:78",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_ControlledToken_$15810_$dyn_storage_ptr",
                            "typeString": "contract ControlledToken[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "467:35:78"
                  },
                  "returnParameters": {
                    "id": 14511,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "510:0:78"
                  },
                  "scope": 14597,
                  "src": "448:177:78",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    11485
                  ],
                  "body": {
                    "id": 14568,
                    "nodeType": "Block",
                    "src": "728:205:78",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 14551,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint8",
                                  "typeString": "uint8"
                                },
                                "id": 14547,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 14545,
                                  "name": "tokenIndex",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 14540,
                                  "src": "742:10:78",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint8",
                                    "typeString": "uint8"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 14546,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "756:1:78",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "742:15:78",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint8",
                                  "typeString": "uint8"
                                },
                                "id": 14550,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 14548,
                                  "name": "tokenIndex",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 14540,
                                  "src": "761:10:78",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint8",
                                    "typeString": "uint8"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "31",
                                  "id": 14549,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "775:1:78",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_1_by_1",
                                    "typeString": "int_const 1"
                                  },
                                  "value": "1"
                                },
                                "src": "761:15:78",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "742:34:78",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5072697a6553706c69744861726e6573732f696e76616c69642d7072697a6573706c69742d746f6b656e2d74797065",
                              "id": 14552,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "778:49:78",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c40cf0cfc34b9ba4849a33319f9317301abe3406f2c3e4803bc992c66bb386c5",
                                "typeString": "literal_string \"PrizeSplitHarness/invalid-prizesplit-token-type\""
                              },
                              "value": "PrizeSplitHarness/invalid-prizesplit-token-type"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_c40cf0cfc34b9ba4849a33319f9317301abe3406f2c3e4803bc992c66bb386c5",
                                "typeString": "literal_string \"PrizeSplitHarness/invalid-prizesplit-token-type\""
                              }
                            ],
                            "id": 14544,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "734:7:78",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 14553,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "734:94:78",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 14554,
                        "nodeType": "ExpressionStatement",
                        "src": "734:94:78"
                      },
                      {
                        "assignments": [
                          14556
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 14556,
                            "mutability": "mutable",
                            "name": "_token",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 14568,
                            "src": "834:22:78",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledToken_$15810",
                              "typeString": "contract ControlledToken"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 14555,
                              "name": "ControlledToken",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 15810,
                              "src": "834:15:78",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ControlledToken_$15810",
                                "typeString": "contract ControlledToken"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 14560,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 14557,
                            "name": "externalErc20s",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14499,
                            "src": "859:14:78",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_contract$_ControlledToken_$15810_$dyn_storage",
                              "typeString": "contract ControlledToken[] storage ref"
                            }
                          },
                          "id": 14559,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 14558,
                            "name": "tokenIndex",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14540,
                            "src": "874:10:78",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "859:26:78",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ControlledToken_$15810",
                            "typeString": "contract ControlledToken"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "834:51:78"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 14564,
                              "name": "target",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14536,
                              "src": "913:6:78",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 14565,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14538,
                              "src": "921:6:78",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 14561,
                              "name": "_token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14556,
                              "src": "891:6:78",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ControlledToken_$15810",
                                "typeString": "contract ControlledToken"
                              }
                            },
                            "id": 14563,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "controllerMint",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 15715,
                            "src": "891:21:78",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256) external"
                            }
                          },
                          "id": 14566,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "891:37:78",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 14567,
                        "nodeType": "ExpressionStatement",
                        "src": "891:37:78"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 14569,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_awardPrizeSplitAmount",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 14542,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "711:8:78"
                  },
                  "parameters": {
                    "id": 14541,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14536,
                        "mutability": "mutable",
                        "name": "target",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14569,
                        "src": "661:14:78",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 14535,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "661:7:78",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 14538,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14569,
                        "src": "677:14:78",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14537,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "677:7:78",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 14540,
                        "mutability": "mutable",
                        "name": "tokenIndex",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14569,
                        "src": "693:16:78",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 14539,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "693:5:78",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "660:50:78"
                  },
                  "returnParameters": {
                    "id": 14543,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "728:0:78"
                  },
                  "scope": 14597,
                  "src": "629:304:78",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 14584,
                    "nodeType": "Block",
                    "src": "1005:85:78",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14580,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 14576,
                            "name": "prizeAmount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14571,
                            "src": "1011:11:78",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 14578,
                                "name": "prizeAmount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 14571,
                                "src": "1048:11:78",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 14577,
                              "name": "_distributePrizeSplits",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 11840,
                              "src": "1025:22:78",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$_t_uint256_$",
                                "typeString": "function (uint256) returns (uint256)"
                              }
                            },
                            "id": 14579,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1025:35:78",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "1011:49:78",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 14581,
                        "nodeType": "ExpressionStatement",
                        "src": "1011:49:78"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14582,
                          "name": "prizeAmount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 14571,
                          "src": "1074:11:78",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 14575,
                        "id": 14583,
                        "nodeType": "Return",
                        "src": "1067:18:78"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "91c05b0b",
                  "id": 14585,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "distribute",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14572,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14571,
                        "mutability": "mutable",
                        "name": "prizeAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14585,
                        "src": "957:19:78",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14570,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "957:7:78",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "956:21:78"
                  },
                  "returnParameters": {
                    "id": 14575,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14574,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14585,
                        "src": "996:7:78",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14573,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "996:7:78",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "995:9:78"
                  },
                  "scope": 14597,
                  "src": "937:153:78",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 14595,
                    "nodeType": "Block",
                    "src": "1174:17:78",
                    "statements": [
                      {
                        "expression": null,
                        "functionReturnParameters": 14593,
                        "id": 14594,
                        "nodeType": "Return",
                        "src": "1180:7:78"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "7cbab1c7",
                  "id": 14596,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "beforeTokenTransfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14592,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14587,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14596,
                        "src": "1123:12:78",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 14586,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1123:7:78",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 14589,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14596,
                        "src": "1137:10:78",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 14588,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1137:7:78",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 14591,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14596,
                        "src": "1149:14:78",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14590,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1149:7:78",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1122:42:78"
                  },
                  "returnParameters": {
                    "id": 14593,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1174:0:78"
                  },
                  "scope": 14597,
                  "src": "1094:97:78",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 14598,
              "src": "303:890:78"
            }
          ],
          "src": "32:1161:78"
        },
        "id": 78
      },
      "contracts/test/RNGServiceMock.sol": {
        "ast": {
          "absolutePath": "contracts/test/RNGServiceMock.sol",
          "exportedSymbols": {
            "RNGServiceMock": [
              14693
            ]
          },
          "id": 14694,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 14599,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "0:23:79"
            },
            {
              "absolutePath": "@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol",
              "file": "@pooltogether/pooltogether-rng-contracts/contracts/RNGInterface.sol",
              "id": 14600,
              "nodeType": "ImportDirective",
              "scope": 14694,
              "sourceUnit": 5532,
              "src": "25:77:79",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 14601,
                    "name": "RNGInterface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 5531,
                    "src": "131:12:79",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_RNGInterface_$5531",
                      "typeString": "contract RNGInterface"
                    }
                  },
                  "id": 14602,
                  "nodeType": "InheritanceSpecifier",
                  "src": "131:12:79"
                }
              ],
              "contractDependencies": [
                5531
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 14693,
              "linearizedBaseContracts": [
                14693,
                5531
              ],
              "name": "RNGServiceMock",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "id": 14604,
                  "mutability": "mutable",
                  "name": "random",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 14693,
                  "src": "149:23:79",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 14603,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "149:7:79",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 14606,
                  "mutability": "mutable",
                  "name": "feeToken",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 14693,
                  "src": "176:25:79",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 14605,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "176:7:79",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 14608,
                  "mutability": "mutable",
                  "name": "requestFee",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 14693,
                  "src": "205:27:79",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 14607,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "205:7:79",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    5498
                  ],
                  "body": {
                    "id": 14616,
                    "nodeType": "Block",
                    "src": "315:19:79",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "31",
                          "id": 14614,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "328:1:79",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_1_by_1",
                            "typeString": "int_const 1"
                          },
                          "value": "1"
                        },
                        "functionReturnParameters": 14613,
                        "id": 14615,
                        "nodeType": "Return",
                        "src": "321:8:79"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "19c2b4c3",
                  "id": 14617,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "getLastRequestId",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 14610,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "274:8:79"
                  },
                  "parameters": {
                    "id": 14609,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "262:2:79"
                  },
                  "returnParameters": {
                    "id": 14613,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14612,
                        "mutability": "mutable",
                        "name": "requestId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14617,
                        "src": "297:16:79",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 14611,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "297:6:79",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "296:18:79"
                  },
                  "scope": 14693,
                  "src": "237:97:79",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 14632,
                    "nodeType": "Block",
                    "src": "410:61:79",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14626,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 14624,
                            "name": "feeToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14606,
                            "src": "416:8:79",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 14625,
                            "name": "_feeToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14619,
                            "src": "427:9:79",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "416:20:79",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 14627,
                        "nodeType": "ExpressionStatement",
                        "src": "416:20:79"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14630,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 14628,
                            "name": "requestFee",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14608,
                            "src": "442:10:79",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 14629,
                            "name": "_requestFee",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14621,
                            "src": "455:11:79",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "442:24:79",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 14631,
                        "nodeType": "ExpressionStatement",
                        "src": "442:24:79"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "de1760fd",
                  "id": 14633,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setRequestFee",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14622,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14619,
                        "mutability": "mutable",
                        "name": "_feeToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14633,
                        "src": "361:17:79",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 14618,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "361:7:79",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 14621,
                        "mutability": "mutable",
                        "name": "_requestFee",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14633,
                        "src": "380:19:79",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14620,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "380:7:79",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "360:40:79"
                  },
                  "returnParameters": {
                    "id": 14623,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "410:0:79"
                  },
                  "scope": 14693,
                  "src": "338:133:79",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    5506
                  ],
                  "body": {
                    "id": 14646,
                    "nodeType": "Block",
                    "src": "622:40:79",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "id": 14642,
                              "name": "feeToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14606,
                              "src": "636:8:79",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 14643,
                              "name": "requestFee",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14608,
                              "src": "646:10:79",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 14644,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "635:22:79",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_address_$_t_uint256_$",
                            "typeString": "tuple(address,uint256)"
                          }
                        },
                        "functionReturnParameters": 14641,
                        "id": 14645,
                        "nodeType": "Return",
                        "src": "628:29:79"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 14634,
                    "nodeType": "StructuredDocumentation",
                    "src": "475:47:79",
                    "text": "@return _feeToken\n @return _requestFee"
                  },
                  "functionSelector": "0d37b537",
                  "id": 14647,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "getRequestFee",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 14636,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "559:8:79"
                  },
                  "parameters": {
                    "id": 14635,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "547:2:79"
                  },
                  "returnParameters": {
                    "id": 14641,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14638,
                        "mutability": "mutable",
                        "name": "_feeToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14647,
                        "src": "582:17:79",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 14637,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "582:7:79",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 14640,
                        "mutability": "mutable",
                        "name": "_requestFee",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14647,
                        "src": "601:19:79",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14639,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "601:7:79",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "581:40:79"
                  },
                  "scope": 14693,
                  "src": "525:137:79",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 14656,
                    "nodeType": "Block",
                    "src": "717:27:79",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14654,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 14652,
                            "name": "random",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14604,
                            "src": "723:6:79",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 14653,
                            "name": "_random",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14649,
                            "src": "732:7:79",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "723:16:79",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 14655,
                        "nodeType": "ExpressionStatement",
                        "src": "723:16:79"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "d6bfea28",
                  "id": 14657,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setRandomNumber",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14650,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14649,
                        "mutability": "mutable",
                        "name": "_random",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14657,
                        "src": "691:15:79",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14648,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "691:7:79",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "690:17:79"
                  },
                  "returnParameters": {
                    "id": 14651,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "717:0:79"
                  },
                  "scope": 14693,
                  "src": "666:78:79",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    5514
                  ],
                  "body": {
                    "id": 14669,
                    "nodeType": "Block",
                    "src": "822:24:79",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "hexValue": "31",
                              "id": 14665,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "836:1:79",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_1_by_1",
                                "typeString": "int_const 1"
                              },
                              "value": "1"
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "31",
                              "id": 14666,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "839:1:79",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_1_by_1",
                                "typeString": "int_const 1"
                              },
                              "value": "1"
                            }
                          ],
                          "id": 14667,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "835:6:79",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_rational_1_by_1_$_t_rational_1_by_1_$",
                            "typeString": "tuple(int_const 1,int_const 1)"
                          }
                        },
                        "functionReturnParameters": 14664,
                        "id": 14668,
                        "nodeType": "Return",
                        "src": "828:13:79"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "8678a7b2",
                  "id": 14670,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "requestRandomNumber",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 14659,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "788:8:79"
                  },
                  "parameters": {
                    "id": 14658,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "776:2:79"
                  },
                  "returnParameters": {
                    "id": 14664,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14661,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14670,
                        "src": "806:6:79",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 14660,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "806:6:79",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 14663,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14670,
                        "src": "814:6:79",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 14662,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "814:6:79",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "805:16:79"
                  },
                  "scope": 14693,
                  "src": "748:98:79",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    5522
                  ],
                  "body": {
                    "id": 14680,
                    "nodeType": "Block",
                    "src": "923:22:79",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 14678,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "936:4:79",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "functionReturnParameters": 14677,
                        "id": 14679,
                        "nodeType": "Return",
                        "src": "929:11:79"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "3a19b9bc",
                  "id": 14681,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "isRequestComplete",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 14674,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "894:8:79"
                  },
                  "parameters": {
                    "id": 14673,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14672,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14681,
                        "src": "877:6:79",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 14671,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "877:6:79",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "876:8:79"
                  },
                  "returnParameters": {
                    "id": 14677,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14676,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14681,
                        "src": "917:4:79",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 14675,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "917:4:79",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "916:6:79"
                  },
                  "scope": 14693,
                  "src": "850:95:79",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    5530
                  ],
                  "body": {
                    "id": 14691,
                    "nodeType": "Block",
                    "src": "1015:24:79",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14689,
                          "name": "random",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 14604,
                          "src": "1028:6:79",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 14688,
                        "id": 14690,
                        "nodeType": "Return",
                        "src": "1021:13:79"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "9d2a5f98",
                  "id": 14692,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "randomNumber",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 14685,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "988:8:79"
                  },
                  "parameters": {
                    "id": 14684,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14683,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14692,
                        "src": "971:6:79",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 14682,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "971:6:79",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "970:8:79"
                  },
                  "returnParameters": {
                    "id": 14688,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14687,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14692,
                        "src": "1006:7:79",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14686,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1006:7:79",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1005:9:79"
                  },
                  "scope": 14693,
                  "src": "949:90:79",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 14694,
              "src": "104:937:79"
            }
          ],
          "src": "0:1041:79"
        },
        "id": 79
      },
      "contracts/test/StakePrizePoolHarness.sol": {
        "ast": {
          "absolutePath": "contracts/test/StakePrizePoolHarness.sol",
          "exportedSymbols": {
            "StakePrizePoolHarness": [
              14736
            ]
          },
          "id": 14737,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 14695,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "0:23:80"
            },
            {
              "absolutePath": "contracts/prize-pool/stake/StakePrizePool.sol",
              "file": "../prize-pool/stake/StakePrizePool.sol",
              "id": 14696,
              "nodeType": "ImportDirective",
              "scope": 14737,
              "sourceUnit": 9279,
              "src": "25:48:80",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 14697,
                    "name": "StakePrizePool",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9278,
                    "src": "156:14:80",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_StakePrizePool_$9278",
                      "typeString": "contract StakePrizePool"
                    }
                  },
                  "id": 14698,
                  "nodeType": "InheritanceSpecifier",
                  "src": "156:14:80"
                }
              ],
              "contractDependencies": [
                130,
                1352,
                3222,
                3627,
                4787,
                8751,
                8930,
                9278,
                16206
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 14736,
              "linearizedBaseContracts": [
                14736,
                9278,
                8751,
                3222,
                16206,
                4787,
                130,
                3627,
                1352,
                8930
              ],
              "name": "StakePrizePoolHarness",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "functionSelector": "d18e81b3",
                  "id": 14700,
                  "mutability": "mutable",
                  "name": "currentTime",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 14736,
                  "src": "176:26:80",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 14699,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "176:7:80",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 14709,
                    "nodeType": "Block",
                    "src": "262:37:80",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14707,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 14705,
                            "name": "currentTime",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14700,
                            "src": "268:11:80",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 14706,
                            "name": "_currentTime",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14702,
                            "src": "282:12:80",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "268:26:80",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 14708,
                        "nodeType": "ExpressionStatement",
                        "src": "268:26:80"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "22f8e566",
                  "id": 14710,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setCurrentTime",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14703,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14702,
                        "mutability": "mutable",
                        "name": "_currentTime",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14710,
                        "src": "231:20:80",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14701,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "231:7:80",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "230:22:80"
                  },
                  "returnParameters": {
                    "id": 14704,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "262:0:80"
                  },
                  "scope": 14736,
                  "src": "207:92:80",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    8462
                  ],
                  "body": {
                    "id": 14718,
                    "nodeType": "Block",
                    "src": "368:29:80",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14716,
                          "name": "currentTime",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 14700,
                          "src": "381:11:80",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 14715,
                        "id": 14717,
                        "nodeType": "Return",
                        "src": "374:18:80"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 14719,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_currentTime",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 14712,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "336:8:80"
                  },
                  "parameters": {
                    "id": 14711,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "324:2:80"
                  },
                  "returnParameters": {
                    "id": 14715,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14714,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14719,
                        "src": "359:7:80",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14713,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "359:7:80",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "358:9:80"
                  },
                  "scope": 14736,
                  "src": "303:94:80",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 14724,
                    "nodeType": "Block",
                    "src": "446:32:80",
                    "statements": []
                  },
                  "documentation": null,
                  "functionSelector": "35403023",
                  "id": 14725,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "supply",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14722,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14721,
                        "mutability": "mutable",
                        "name": "mintAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14725,
                        "src": "417:18:80",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14720,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "417:7:80",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "416:20:80"
                  },
                  "returnParameters": {
                    "id": 14723,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "446:0:80"
                  },
                  "scope": 14736,
                  "src": "401:77:80",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 14734,
                    "nodeType": "Block",
                    "src": "547:30:80",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14732,
                          "name": "redeemAmount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 14727,
                          "src": "560:12:80",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 14731,
                        "id": 14733,
                        "nodeType": "Return",
                        "src": "553:19:80"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "db006a75",
                  "id": 14735,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "redeem",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14728,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14727,
                        "mutability": "mutable",
                        "name": "redeemAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14735,
                        "src": "498:20:80",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14726,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "498:7:80",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "497:22:80"
                  },
                  "returnParameters": {
                    "id": 14731,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14730,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14735,
                        "src": "538:7:80",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14729,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "538:7:80",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "537:9:80"
                  },
                  "scope": 14736,
                  "src": "482:95:80",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 14737,
              "src": "122:457:80"
            }
          ],
          "src": "0:579:80"
        },
        "id": 80
      },
      "contracts/test/StakePrizePoolHarnessProxyFactory.sol": {
        "ast": {
          "absolutePath": "contracts/test/StakePrizePoolHarnessProxyFactory.sol",
          "exportedSymbols": {
            "StakePrizePoolHarnessProxyFactory": [
              14775
            ]
          },
          "id": 14776,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 14738,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "0:23:81"
            },
            {
              "absolutePath": "contracts/test/StakePrizePoolHarness.sol",
              "file": "./StakePrizePoolHarness.sol",
              "id": 14739,
              "nodeType": "ImportDirective",
              "scope": 14776,
              "sourceUnit": 14737,
              "src": "25:37:81",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/external/openzeppelin/ProxyFactory.sol",
              "file": "../external/openzeppelin/ProxyFactory.sol",
              "id": 14740,
              "nodeType": "ImportDirective",
              "scope": 14776,
              "sourceUnit": 6617,
              "src": "63:51:81",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 14742,
                    "name": "ProxyFactory",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 6616,
                    "src": "273:12:81",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ProxyFactory_$6616",
                      "typeString": "contract ProxyFactory"
                    }
                  },
                  "id": 14743,
                  "nodeType": "InheritanceSpecifier",
                  "src": "273:12:81"
                }
              ],
              "contractDependencies": [
                6616,
                14736
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 14741,
                "nodeType": "StructuredDocumentation",
                "src": "116:111:81",
                "text": "@title Stake Prize Pool Proxy Factory\n @notice Minimal proxy pattern for creating new Stake Prize Pools"
              },
              "fullyImplemented": true,
              "id": 14775,
              "linearizedBaseContracts": [
                14775,
                6616
              ],
              "name": "StakePrizePoolHarnessProxyFactory",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "documentation": {
                    "id": 14744,
                    "nodeType": "StructuredDocumentation",
                    "src": "291:63:81",
                    "text": "@notice Contract template for deploying proxied Prize Pools"
                  },
                  "functionSelector": "022ec095",
                  "id": 14746,
                  "mutability": "mutable",
                  "name": "instance",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 14775,
                  "src": "357:37:81",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_StakePrizePoolHarness_$14736",
                    "typeString": "contract StakePrizePoolHarness"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 14745,
                    "name": "StakePrizePoolHarness",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 14736,
                    "src": "357:21:81",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_StakePrizePoolHarness_$14736",
                      "typeString": "contract StakePrizePoolHarness"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 14756,
                    "nodeType": "Block",
                    "src": "500:49:81",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14754,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 14750,
                            "name": "instance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14746,
                            "src": "506:8:81",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_StakePrizePoolHarness_$14736",
                              "typeString": "contract StakePrizePoolHarness"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 14752,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "517:25:81",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_creation_nonpayable$__$returns$_t_contract$_StakePrizePoolHarness_$14736_$",
                                "typeString": "function () returns (contract StakePrizePoolHarness)"
                              },
                              "typeName": {
                                "contractScope": null,
                                "id": 14751,
                                "name": "StakePrizePoolHarness",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 14736,
                                "src": "521:21:81",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_StakePrizePoolHarness_$14736",
                                  "typeString": "contract StakePrizePoolHarness"
                                }
                              }
                            },
                            "id": 14753,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "517:27:81",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_StakePrizePoolHarness_$14736",
                              "typeString": "contract StakePrizePoolHarness"
                            }
                          },
                          "src": "506:38:81",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_StakePrizePoolHarness_$14736",
                            "typeString": "contract StakePrizePoolHarness"
                          }
                        },
                        "id": 14755,
                        "nodeType": "ExpressionStatement",
                        "src": "506:38:81"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 14747,
                    "nodeType": "StructuredDocumentation",
                    "src": "399:76:81",
                    "text": "@notice Initializes the Factory with an instance of the Stake Prize Pool"
                  },
                  "id": 14757,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14748,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "490:2:81"
                  },
                  "returnParameters": {
                    "id": 14749,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "500:0:81"
                  },
                  "scope": 14775,
                  "src": "478:71:81",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 14773,
                    "nodeType": "Block",
                    "src": "755:77:81",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 14767,
                                      "name": "instance",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 14746,
                                      "src": "812:8:81",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_StakePrizePoolHarness_$14736",
                                        "typeString": "contract StakePrizePoolHarness"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_StakePrizePoolHarness_$14736",
                                        "typeString": "contract StakePrizePoolHarness"
                                      }
                                    ],
                                    "id": 14766,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "804:7:81",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 14765,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "804:7:81",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 14768,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "804:17:81",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "hexValue": "",
                                  "id": 14769,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "823:2:81",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                    "typeString": "literal_string \"\""
                                  },
                                  "value": ""
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                    "typeString": "literal_string \"\""
                                  }
                                ],
                                "id": 14764,
                                "name": "deployMinimal",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6615,
                                "src": "790:13:81",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_address_$",
                                  "typeString": "function (address,bytes memory) returns (address)"
                                }
                              },
                              "id": 14770,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "790:36:81",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 14763,
                            "name": "StakePrizePoolHarness",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14736,
                            "src": "768:21:81",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_StakePrizePoolHarness_$14736_$",
                              "typeString": "type(contract StakePrizePoolHarness)"
                            }
                          },
                          "id": 14771,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "768:59:81",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_StakePrizePoolHarness_$14736",
                            "typeString": "contract StakePrizePoolHarness"
                          }
                        },
                        "functionReturnParameters": 14762,
                        "id": 14772,
                        "nodeType": "Return",
                        "src": "761:66:81"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 14758,
                    "nodeType": "StructuredDocumentation",
                    "src": "553:140:81",
                    "text": "@notice Creates a new Stake Prize Pool as a proxy of the template instance\n @return A reference to the new proxied Stake Prize Pool"
                  },
                  "functionSelector": "efc81a8c",
                  "id": 14774,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "create",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14759,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "711:2:81"
                  },
                  "returnParameters": {
                    "id": 14762,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14761,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14774,
                        "src": "732:21:81",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_StakePrizePoolHarness_$14736",
                          "typeString": "contract StakePrizePoolHarness"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 14760,
                          "name": "StakePrizePoolHarness",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 14736,
                          "src": "732:21:81",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_StakePrizePoolHarness_$14736",
                            "typeString": "contract StakePrizePoolHarness"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "731:23:81"
                  },
                  "scope": 14775,
                  "src": "696:136:81",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 14776,
              "src": "227:607:81"
            }
          ],
          "src": "0:835:81"
        },
        "id": 81
      },
      "contracts/test/TokenFaucetHarness.sol": {
        "ast": {
          "absolutePath": "contracts/test/TokenFaucetHarness.sol",
          "exportedSymbols": {
            "TokenFaucetHarness": [
              14803
            ]
          },
          "id": 14804,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 14777,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "0:23:82"
            },
            {
              "id": 14778,
              "literals": [
                "experimental",
                "ABIEncoderV2"
              ],
              "nodeType": "PragmaDirective",
              "src": "24:33:82"
            },
            {
              "absolutePath": "contracts/token-faucet/TokenFaucet.sol",
              "file": "../token-faucet/TokenFaucet.sol",
              "id": 14779,
              "nodeType": "ImportDirective",
              "scope": 14804,
              "sourceUnit": 15493,
              "src": "59:41:82",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 14780,
                    "name": "TokenFaucet",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 15492,
                    "src": "180:11:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                      "typeString": "contract TokenFaucet"
                    }
                  },
                  "id": 14781,
                  "nodeType": "InheritanceSpecifier",
                  "src": "180:11:82"
                }
              ],
              "contractDependencies": [
                130,
                931,
                1352,
                3627,
                15492,
                16234,
                16265
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 14803,
              "linearizedBaseContracts": [
                14803,
                15492,
                16234,
                16265,
                931,
                130,
                3627,
                1352
              ],
              "name": "TokenFaucetHarness",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "id": 14783,
                  "mutability": "mutable",
                  "name": "time",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 14803,
                  "src": "197:20:82",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 14782,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "197:6:82",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 14792,
                    "nodeType": "Block",
                    "src": "269:23:82",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14790,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 14788,
                            "name": "time",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14783,
                            "src": "275:4:82",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 14789,
                            "name": "_time",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14785,
                            "src": "282:5:82",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "src": "275:12:82",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "id": 14791,
                        "nodeType": "ExpressionStatement",
                        "src": "275:12:82"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "644a9e71",
                  "id": 14793,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setCurrentTime",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14786,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14785,
                        "mutability": "mutable",
                        "name": "_time",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14793,
                        "src": "246:12:82",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 14784,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "246:6:82",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "245:14:82"
                  },
                  "returnParameters": {
                    "id": 14787,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "269:0:82"
                  },
                  "scope": 14803,
                  "src": "222:70:82",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    15491
                  ],
                  "body": {
                    "id": 14801,
                    "nodeType": "Block",
                    "src": "360:22:82",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14799,
                          "name": "time",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 14783,
                          "src": "373:4:82",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "functionReturnParameters": 14798,
                        "id": 14800,
                        "nodeType": "Return",
                        "src": "366:11:82"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 14802,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_currentTime",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 14795,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "329:8:82"
                  },
                  "parameters": {
                    "id": 14794,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "317:2:82"
                  },
                  "returnParameters": {
                    "id": 14798,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14797,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14802,
                        "src": "352:6:82",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 14796,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "352:6:82",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "351:8:82"
                  },
                  "scope": 14803,
                  "src": "296:86:82",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 14804,
              "src": "149:236:82"
            }
          ],
          "src": "0:385:82"
        },
        "id": 82
      },
      "contracts/test/YieldSourcePrizePoolHarness.sol": {
        "ast": {
          "absolutePath": "contracts/test/YieldSourcePrizePoolHarness.sol",
          "exportedSymbols": {
            "YieldSourcePrizePoolHarness": [
              14852
            ]
          },
          "id": 14853,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 14805,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "0:23:83"
            },
            {
              "absolutePath": "contracts/prize-pool/yield-source/YieldSourcePrizePool.sol",
              "file": "../prize-pool/yield-source/YieldSourcePrizePool.sol",
              "id": 14806,
              "nodeType": "ImportDirective",
              "scope": 14853,
              "sourceUnit": 9494,
              "src": "25:61:83",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 14807,
                    "name": "YieldSourcePrizePool",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9493,
                    "src": "175:20:83",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_YieldSourcePrizePool_$9493",
                      "typeString": "contract YieldSourcePrizePool"
                    }
                  },
                  "id": 14808,
                  "nodeType": "InheritanceSpecifier",
                  "src": "175:20:83"
                }
              ],
              "contractDependencies": [
                130,
                1352,
                3222,
                3627,
                4787,
                8751,
                8930,
                9493,
                16206
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 14852,
              "linearizedBaseContracts": [
                14852,
                9493,
                8751,
                3222,
                16206,
                4787,
                130,
                3627,
                1352,
                8930
              ],
              "name": "YieldSourcePrizePoolHarness",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "functionSelector": "d18e81b3",
                  "id": 14810,
                  "mutability": "mutable",
                  "name": "currentTime",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 14852,
                  "src": "201:26:83",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 14809,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "201:7:83",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 14819,
                    "nodeType": "Block",
                    "src": "287:37:83",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14817,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 14815,
                            "name": "currentTime",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14810,
                            "src": "293:11:83",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 14816,
                            "name": "_currentTime",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14812,
                            "src": "307:12:83",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "293:26:83",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 14818,
                        "nodeType": "ExpressionStatement",
                        "src": "293:26:83"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "22f8e566",
                  "id": 14820,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "setCurrentTime",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14813,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14812,
                        "mutability": "mutable",
                        "name": "_currentTime",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14820,
                        "src": "256:20:83",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14811,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "256:7:83",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "255:22:83"
                  },
                  "returnParameters": {
                    "id": 14814,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "287:0:83"
                  },
                  "scope": 14852,
                  "src": "232:92:83",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    8462
                  ],
                  "body": {
                    "id": 14828,
                    "nodeType": "Block",
                    "src": "393:29:83",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14826,
                          "name": "currentTime",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 14810,
                          "src": "406:11:83",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 14825,
                        "id": 14827,
                        "nodeType": "Return",
                        "src": "399:18:83"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 14829,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_currentTime",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 14822,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "361:8:83"
                  },
                  "parameters": {
                    "id": 14821,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "349:2:83"
                  },
                  "returnParameters": {
                    "id": 14825,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14824,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14829,
                        "src": "384:7:83",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14823,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "384:7:83",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "383:9:83"
                  },
                  "scope": 14852,
                  "src": "328:94:83",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 14838,
                    "nodeType": "Block",
                    "src": "471:30:83",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 14835,
                              "name": "mintAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14831,
                              "src": "485:10:83",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 14834,
                            "name": "_supply",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              9477
                            ],
                            "referencedDeclaration": 9477,
                            "src": "477:7:83",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 14836,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "477:19:83",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 14837,
                        "nodeType": "ExpressionStatement",
                        "src": "477:19:83"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "35403023",
                  "id": 14839,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "supply",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14832,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14831,
                        "mutability": "mutable",
                        "name": "mintAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14839,
                        "src": "442:18:83",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14830,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "442:7:83",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "441:20:83"
                  },
                  "returnParameters": {
                    "id": 14833,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "471:0:83"
                  },
                  "scope": 14852,
                  "src": "426:75:83",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 14850,
                    "nodeType": "Block",
                    "src": "570:39:83",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 14847,
                              "name": "redeemAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14841,
                              "src": "591:12:83",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 14846,
                            "name": "_redeem",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              9492
                            ],
                            "referencedDeclaration": 9492,
                            "src": "583:7:83",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$_t_uint256_$",
                              "typeString": "function (uint256) returns (uint256)"
                            }
                          },
                          "id": 14848,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "583:21:83",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 14845,
                        "id": 14849,
                        "nodeType": "Return",
                        "src": "576:28:83"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "db006a75",
                  "id": 14851,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "redeem",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14842,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14841,
                        "mutability": "mutable",
                        "name": "redeemAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14851,
                        "src": "521:20:83",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14840,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "521:7:83",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "520:22:83"
                  },
                  "returnParameters": {
                    "id": 14845,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14844,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14851,
                        "src": "561:7:83",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14843,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "561:7:83",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "560:9:83"
                  },
                  "scope": 14852,
                  "src": "505:104:83",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 14853,
              "src": "135:476:83"
            }
          ],
          "src": "0:612:83"
        },
        "id": 83
      },
      "contracts/test/YieldSourcePrizePoolHarnessProxyFactory.sol": {
        "ast": {
          "absolutePath": "contracts/test/YieldSourcePrizePoolHarnessProxyFactory.sol",
          "exportedSymbols": {
            "YieldSourcePrizePoolHarnessProxyFactory": [
              14891
            ]
          },
          "id": 14892,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 14854,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "0:23:84"
            },
            {
              "absolutePath": "contracts/test/YieldSourcePrizePoolHarness.sol",
              "file": "./YieldSourcePrizePoolHarness.sol",
              "id": 14855,
              "nodeType": "ImportDirective",
              "scope": 14892,
              "sourceUnit": 14853,
              "src": "25:43:84",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/external/openzeppelin/ProxyFactory.sol",
              "file": "../external/openzeppelin/ProxyFactory.sol",
              "id": 14856,
              "nodeType": "ImportDirective",
              "scope": 14892,
              "sourceUnit": 6617,
              "src": "69:51:84",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 14858,
                    "name": "ProxyFactory",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 6616,
                    "src": "297:12:84",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ProxyFactory_$6616",
                      "typeString": "contract ProxyFactory"
                    }
                  },
                  "id": 14859,
                  "nodeType": "InheritanceSpecifier",
                  "src": "297:12:84"
                }
              ],
              "contractDependencies": [
                6616,
                14852
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 14857,
                "nodeType": "StructuredDocumentation",
                "src": "122:123:84",
                "text": "@title YieldSource Prize Pool Proxy Factory\n @notice Minimal proxy pattern for creating new YieldSource Prize Pools"
              },
              "fullyImplemented": true,
              "id": 14891,
              "linearizedBaseContracts": [
                14891,
                6616
              ],
              "name": "YieldSourcePrizePoolHarnessProxyFactory",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "documentation": {
                    "id": 14860,
                    "nodeType": "StructuredDocumentation",
                    "src": "315:63:84",
                    "text": "@notice Contract template for deploying proxied Prize Pools"
                  },
                  "functionSelector": "022ec095",
                  "id": 14862,
                  "mutability": "mutable",
                  "name": "instance",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 14891,
                  "src": "381:43:84",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_YieldSourcePrizePoolHarness_$14852",
                    "typeString": "contract YieldSourcePrizePoolHarness"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 14861,
                    "name": "YieldSourcePrizePoolHarness",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 14852,
                    "src": "381:27:84",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_YieldSourcePrizePoolHarness_$14852",
                      "typeString": "contract YieldSourcePrizePoolHarness"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 14872,
                    "nodeType": "Block",
                    "src": "536:55:84",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 14870,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 14866,
                            "name": "instance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14862,
                            "src": "542:8:84",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_YieldSourcePrizePoolHarness_$14852",
                              "typeString": "contract YieldSourcePrizePoolHarness"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 14868,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "553:31:84",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_creation_nonpayable$__$returns$_t_contract$_YieldSourcePrizePoolHarness_$14852_$",
                                "typeString": "function () returns (contract YieldSourcePrizePoolHarness)"
                              },
                              "typeName": {
                                "contractScope": null,
                                "id": 14867,
                                "name": "YieldSourcePrizePoolHarness",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 14852,
                                "src": "557:27:84",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_YieldSourcePrizePoolHarness_$14852",
                                  "typeString": "contract YieldSourcePrizePoolHarness"
                                }
                              }
                            },
                            "id": 14869,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "553:33:84",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_YieldSourcePrizePoolHarness_$14852",
                              "typeString": "contract YieldSourcePrizePoolHarness"
                            }
                          },
                          "src": "542:44:84",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_YieldSourcePrizePoolHarness_$14852",
                            "typeString": "contract YieldSourcePrizePoolHarness"
                          }
                        },
                        "id": 14871,
                        "nodeType": "ExpressionStatement",
                        "src": "542:44:84"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 14863,
                    "nodeType": "StructuredDocumentation",
                    "src": "429:82:84",
                    "text": "@notice Initializes the Factory with an instance of the YieldSource Prize Pool"
                  },
                  "id": 14873,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14864,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "526:2:84"
                  },
                  "returnParameters": {
                    "id": 14865,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "536:0:84"
                  },
                  "scope": 14891,
                  "src": "514:77:84",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 14889,
                    "nodeType": "Block",
                    "src": "815:83:84",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 14883,
                                      "name": "instance",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 14862,
                                      "src": "878:8:84",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_YieldSourcePrizePoolHarness_$14852",
                                        "typeString": "contract YieldSourcePrizePoolHarness"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_YieldSourcePrizePoolHarness_$14852",
                                        "typeString": "contract YieldSourcePrizePoolHarness"
                                      }
                                    ],
                                    "id": 14882,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "870:7:84",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 14881,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "870:7:84",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 14884,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "870:17:84",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "hexValue": "",
                                  "id": 14885,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "889:2:84",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                    "typeString": "literal_string \"\""
                                  },
                                  "value": ""
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                    "typeString": "literal_string \"\""
                                  }
                                ],
                                "id": 14880,
                                "name": "deployMinimal",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6615,
                                "src": "856:13:84",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_address_$",
                                  "typeString": "function (address,bytes memory) returns (address)"
                                }
                              },
                              "id": 14886,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "856:36:84",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 14879,
                            "name": "YieldSourcePrizePoolHarness",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14852,
                            "src": "828:27:84",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_YieldSourcePrizePoolHarness_$14852_$",
                              "typeString": "type(contract YieldSourcePrizePoolHarness)"
                            }
                          },
                          "id": 14887,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "828:65:84",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_YieldSourcePrizePoolHarness_$14852",
                            "typeString": "contract YieldSourcePrizePoolHarness"
                          }
                        },
                        "functionReturnParameters": 14878,
                        "id": 14888,
                        "nodeType": "Return",
                        "src": "821:72:84"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 14874,
                    "nodeType": "StructuredDocumentation",
                    "src": "595:152:84",
                    "text": "@notice Creates a new YieldSource Prize Pool as a proxy of the template instance\n @return A reference to the new proxied YieldSource Prize Pool"
                  },
                  "functionSelector": "efc81a8c",
                  "id": 14890,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "create",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14875,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "765:2:84"
                  },
                  "returnParameters": {
                    "id": 14878,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14877,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14890,
                        "src": "786:27:84",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_YieldSourcePrizePoolHarness_$14852",
                          "typeString": "contract YieldSourcePrizePoolHarness"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 14876,
                          "name": "YieldSourcePrizePoolHarness",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 14852,
                          "src": "786:27:84",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_YieldSourcePrizePoolHarness_$14852",
                            "typeString": "contract YieldSourcePrizePoolHarness"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "785:29:84"
                  },
                  "scope": 14891,
                  "src": "750:148:84",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 14892,
              "src": "245:655:84"
            }
          ],
          "src": "0:901:84"
        },
        "id": 84
      },
      "contracts/test/YieldSourceStub.sol": {
        "ast": {
          "absolutePath": "contracts/test/YieldSourceStub.sol",
          "exportedSymbols": {
            "YieldSourceStub": [
              14924
            ]
          },
          "id": 14925,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 14893,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "0:23:85"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "id": 14894,
              "nodeType": "ImportDirective",
              "scope": 14925,
              "sourceUnit": 1961,
              "src": "25:79:85",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": null,
              "fullyImplemented": false,
              "id": 14924,
              "linearizedBaseContracts": [
                14924
              ],
              "name": "YieldSourceStub",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "6a3fd4f9",
                  "id": 14901,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "canAwardExternal",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14897,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14896,
                        "mutability": "mutable",
                        "name": "_externalToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14901,
                        "src": "162:22:85",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 14895,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "162:7:85",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "161:24:85"
                  },
                  "returnParameters": {
                    "id": 14900,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14899,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14901,
                        "src": "209:4:85",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 14898,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "209:4:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "208:6:85"
                  },
                  "scope": 14924,
                  "src": "136:79:85",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "fc0c546a",
                  "id": 14906,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "token",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14902,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "233:2:85"
                  },
                  "returnParameters": {
                    "id": 14905,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14904,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14906,
                        "src": "259:17:85",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 14903,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "259:17:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "258:19:85"
                  },
                  "scope": 14924,
                  "src": "219:59:85",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "b69ef8a8",
                  "id": 14911,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "balance",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14907,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "298:2:85"
                  },
                  "returnParameters": {
                    "id": 14910,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14909,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14911,
                        "src": "319:7:85",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14908,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "319:7:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "318:9:85"
                  },
                  "scope": 14924,
                  "src": "282:46:85",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "35403023",
                  "id": 14916,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "supply",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14914,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14913,
                        "mutability": "mutable",
                        "name": "mintAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14916,
                        "src": "348:18:85",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14912,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "348:7:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "347:20:85"
                  },
                  "returnParameters": {
                    "id": 14915,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "376:0:85"
                  },
                  "scope": 14924,
                  "src": "332:45:85",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": null,
                  "functionSelector": "db006a75",
                  "id": 14923,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "redeem",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 14919,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14918,
                        "mutability": "mutable",
                        "name": "redeemAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14923,
                        "src": "397:20:85",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14917,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "397:7:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "396:22:85"
                  },
                  "returnParameters": {
                    "id": 14922,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14921,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14923,
                        "src": "437:7:85",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14920,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "437:7:85",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "436:9:85"
                  },
                  "scope": 14924,
                  "src": "381:65:85",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 14925,
              "src": "106:342:85"
            }
          ],
          "src": "0:449:85"
        },
        "id": 85
      },
      "contracts/token-faucet/TokenFaucet.sol": {
        "ast": {
          "absolutePath": "contracts/token-faucet/TokenFaucet.sol",
          "exportedSymbols": {
            "TokenFaucet": [
              15492
            ]
          },
          "id": 15493,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 14926,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:86"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol",
              "id": 14927,
              "nodeType": "ImportDirective",
              "scope": 15493,
              "sourceUnit": 1287,
              "src": "62:74:86",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/utils/SafeCastUpgradeable.sol",
              "id": 14928,
              "nodeType": "ImportDirective",
              "scope": 15493,
              "sourceUnit": 5101,
              "src": "137:75:86",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "id": 14929,
              "nodeType": "ImportDirective",
              "scope": 15493,
              "sourceUnit": 1961,
              "src": "213:79:86",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol",
              "file": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol",
              "id": 14930,
              "nodeType": "ImportDirective",
              "scope": 15493,
              "sourceUnit": 1353,
              "src": "293:69:86",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@pooltogether/fixed-point/contracts/FixedPoint.sol",
              "file": "@pooltogether/fixed-point/contracts/FixedPoint.sol",
              "id": 14931,
              "nodeType": "ImportDirective",
              "scope": 15493,
              "sourceUnit": 5280,
              "src": "363:60:86",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol",
              "id": 14932,
              "nodeType": "ImportDirective",
              "scope": 15493,
              "sourceUnit": 131,
              "src": "424:75:86",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/utils/ExtendedSafeCast.sol",
              "file": "../utils/ExtendedSafeCast.sol",
              "id": 14933,
              "nodeType": "ImportDirective",
              "scope": 15493,
              "sourceUnit": 16321,
              "src": "501:39:86",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/token/TokenListener.sol",
              "file": "../token/TokenListener.sol",
              "id": 14934,
              "nodeType": "ImportDirective",
              "scope": 15493,
              "sourceUnit": 16235,
              "src": "541:36:86",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 14936,
                    "name": "OwnableUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 130,
                    "src": "950:18:86",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_OwnableUpgradeable_$130",
                      "typeString": "contract OwnableUpgradeable"
                    }
                  },
                  "id": 14937,
                  "nodeType": "InheritanceSpecifier",
                  "src": "950:18:86"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 14938,
                    "name": "TokenListener",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 16234,
                    "src": "970:13:86",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TokenListener_$16234",
                      "typeString": "contract TokenListener"
                    }
                  },
                  "id": 14939,
                  "nodeType": "InheritanceSpecifier",
                  "src": "970:13:86"
                }
              ],
              "contractDependencies": [
                130,
                931,
                1352,
                3627,
                16234,
                16265
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 14935,
                "nodeType": "StructuredDocumentation",
                "src": "579:300:86",
                "text": "@title Disburses a token at a fixed rate per second to holders of another token.\n @notice The tokens are dripped at a \"drip rate per second\".  This is the number of tokens that\n are dripped each second.  A user's share of the dripped tokens is based on how many 'measure' tokens they hold."
              },
              "fullyImplemented": true,
              "id": 15492,
              "linearizedBaseContracts": [
                15492,
                16234,
                16265,
                931,
                130,
                3627,
                1352
              ],
              "name": "TokenFaucet",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 14942,
                  "libraryName": {
                    "contractScope": null,
                    "id": 14940,
                    "name": "SafeMathUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1286,
                    "src": "994:19:86",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeMathUpgradeable_$1286",
                      "typeString": "library SafeMathUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "988:38:86",
                  "typeName": {
                    "id": 14941,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1018:7:86",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "id": 14945,
                  "libraryName": {
                    "contractScope": null,
                    "id": 14943,
                    "name": "SafeCastUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 5100,
                    "src": "1035:19:86",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeCastUpgradeable_$5100",
                      "typeString": "library SafeCastUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "1029:38:86",
                  "typeName": {
                    "id": 14944,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1059:7:86",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "id": 14948,
                  "libraryName": {
                    "contractScope": null,
                    "id": 14946,
                    "name": "ExtendedSafeCast",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 16320,
                    "src": "1076:16:86",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ExtendedSafeCast_$16320",
                      "typeString": "library ExtendedSafeCast"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "1070:35:86",
                  "typeName": {
                    "id": 14947,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1097:7:86",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 14956,
                  "name": "Initialized",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 14955,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14950,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "asset",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14956,
                        "src": "1132:31:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 14949,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "1132:17:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 14952,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "measure",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14956,
                        "src": "1169:33:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 14951,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "1169:17:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 14954,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "dripRatePerSecond",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14956,
                        "src": "1208:25:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14953,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1208:7:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1126:111:86"
                  },
                  "src": "1109:129:86"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 14960,
                  "name": "Dripped",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 14959,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14958,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "newTokens",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14960,
                        "src": "1261:17:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14957,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1261:7:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1255:27:86"
                  },
                  "src": "1242:41:86"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 14966,
                  "name": "Deposited",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 14965,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14962,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14966,
                        "src": "1308:20:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 14961,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1308:7:86",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 14964,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14966,
                        "src": "1334:14:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14963,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1334:7:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1302:50:86"
                  },
                  "src": "1287:66:86"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 14972,
                  "name": "Withdrawn",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 14971,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14968,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14972,
                        "src": "1378:18:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 14967,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1378:7:86",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 14970,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14972,
                        "src": "1402:14:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14969,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1402:7:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1372:48:86"
                  },
                  "src": "1357:64:86"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 14978,
                  "name": "Claimed",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 14977,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14974,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14978,
                        "src": "1444:20:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 14973,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1444:7:86",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 14976,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "newTokens",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14978,
                        "src": "1470:17:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14975,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1470:7:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1438:53:86"
                  },
                  "src": "1425:67:86"
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 14982,
                  "name": "DripRateChanged",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 14981,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 14980,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "dripRatePerSecond",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 14982,
                        "src": "1523:25:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 14979,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1523:7:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1517:35:86"
                  },
                  "src": "1496:57:86"
                },
                {
                  "canonicalName": "TokenFaucet.UserState",
                  "id": 14987,
                  "members": [
                    {
                      "constant": false,
                      "id": 14984,
                      "mutability": "mutable",
                      "name": "lastExchangeRateMantissa",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 14987,
                      "src": "1580:32:86",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint128",
                        "typeString": "uint128"
                      },
                      "typeName": {
                        "id": 14983,
                        "name": "uint128",
                        "nodeType": "ElementaryTypeName",
                        "src": "1580:7:86",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 14986,
                      "mutability": "mutable",
                      "name": "balance",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 14987,
                      "src": "1618:15:86",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint128",
                        "typeString": "uint128"
                      },
                      "typeName": {
                        "id": 14985,
                        "name": "uint128",
                        "nodeType": "ElementaryTypeName",
                        "src": "1618:7:86",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "UserState",
                  "nodeType": "StructDefinition",
                  "scope": 15492,
                  "src": "1557:81:86",
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 14988,
                    "nodeType": "StructuredDocumentation",
                    "src": "1642:45:86",
                    "text": "@notice The token that is being disbursed"
                  },
                  "functionSelector": "38d52e0f",
                  "id": 14990,
                  "mutability": "mutable",
                  "name": "asset",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 15492,
                  "src": "1690:30:86",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                    "typeString": "contract IERC20Upgradeable"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 14989,
                    "name": "IERC20Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1960,
                    "src": "1690:17:86",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                      "typeString": "contract IERC20Upgradeable"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 14991,
                    "nodeType": "StructuredDocumentation",
                    "src": "1725:82:86",
                    "text": "@notice The token that is user to measure a user's portion of disbursed tokens"
                  },
                  "functionSelector": "efa9a1ad",
                  "id": 14993,
                  "mutability": "mutable",
                  "name": "measure",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 15492,
                  "src": "1810:32:86",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                    "typeString": "contract IERC20Upgradeable"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 14992,
                    "name": "IERC20Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1960,
                    "src": "1810:17:86",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                      "typeString": "contract IERC20Upgradeable"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 14994,
                    "nodeType": "StructuredDocumentation",
                    "src": "1847:69:86",
                    "text": "@notice The total number of tokens that are disbursed each second"
                  },
                  "functionSelector": "187f3334",
                  "id": 14996,
                  "mutability": "mutable",
                  "name": "dripRatePerSecond",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 15492,
                  "src": "1919:32:86",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 14995,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1919:7:86",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 14997,
                    "nodeType": "StructuredDocumentation",
                    "src": "1956:81:86",
                    "text": "@notice The cumulative exchange rate of measure token supply : dripped tokens"
                  },
                  "functionSelector": "e318613e",
                  "id": 14999,
                  "mutability": "mutable",
                  "name": "exchangeRateMantissa",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 15492,
                  "src": "2040:35:86",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint112",
                    "typeString": "uint112"
                  },
                  "typeName": {
                    "id": 14998,
                    "name": "uint112",
                    "nodeType": "ElementaryTypeName",
                    "src": "2040:7:86",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint112",
                      "typeString": "uint112"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 15000,
                    "nodeType": "StructuredDocumentation",
                    "src": "2080:77:86",
                    "text": "@notice The total amount of tokens that have been dripped but not claimed"
                  },
                  "functionSelector": "c96f14b8",
                  "id": 15002,
                  "mutability": "mutable",
                  "name": "totalUnclaimed",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 15492,
                  "src": "2160:29:86",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint112",
                    "typeString": "uint112"
                  },
                  "typeName": {
                    "id": 15001,
                    "name": "uint112",
                    "nodeType": "ElementaryTypeName",
                    "src": "2160:7:86",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint112",
                      "typeString": "uint112"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 15003,
                    "nodeType": "StructuredDocumentation",
                    "src": "2194:63:86",
                    "text": "@notice The timestamp at which the tokens were last dripped"
                  },
                  "functionSelector": "d9772a25",
                  "id": 15005,
                  "mutability": "mutable",
                  "name": "lastDripTimestamp",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 15492,
                  "src": "2260:31:86",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint32",
                    "typeString": "uint32"
                  },
                  "typeName": {
                    "id": 15004,
                    "name": "uint32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2260:6:86",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint32",
                      "typeString": "uint32"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 15006,
                    "nodeType": "StructuredDocumentation",
                    "src": "2296:75:86",
                    "text": "@notice The data structure that tracks when a user last received tokens"
                  },
                  "functionSelector": "0ecc535f",
                  "id": 15010,
                  "mutability": "mutable",
                  "name": "userStates",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 15492,
                  "src": "2374:47:86",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UserState_$14987_storage_$",
                    "typeString": "mapping(address => struct TokenFaucet.UserState)"
                  },
                  "typeName": {
                    "id": 15009,
                    "keyType": {
                      "id": 15007,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "2382:7:86",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "2374:29:86",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UserState_$14987_storage_$",
                      "typeString": "mapping(address => struct TokenFaucet.UserState)"
                    },
                    "valueType": {
                      "contractScope": null,
                      "id": 15008,
                      "name": "UserState",
                      "nodeType": "UserDefinedTypeName",
                      "referencedDeclaration": 14987,
                      "src": "2393:9:86",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_UserState_$14987_storage_ptr",
                        "typeString": "struct TokenFaucet.UserState"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 15048,
                    "nodeType": "Block",
                    "src": "2804:239:86",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 15022,
                            "name": "__Ownable_init",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 29,
                            "src": "2810:14:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                              "typeString": "function ()"
                            }
                          },
                          "id": 15023,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2810:16:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15024,
                        "nodeType": "ExpressionStatement",
                        "src": "2810:16:86"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 15028,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 15025,
                            "name": "lastDripTimestamp",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15005,
                            "src": "2832:17:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 15026,
                              "name": "_currentTime",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15491,
                              "src": "2852:12:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                                "typeString": "function () view returns (uint32)"
                              }
                            },
                            "id": 15027,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "2852:14:86",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "src": "2832:34:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "id": 15029,
                        "nodeType": "ExpressionStatement",
                        "src": "2832:34:86"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 15032,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 15030,
                            "name": "asset",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14990,
                            "src": "2872:5:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                              "typeString": "contract IERC20Upgradeable"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 15031,
                            "name": "_asset",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15013,
                            "src": "2880:6:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                              "typeString": "contract IERC20Upgradeable"
                            }
                          },
                          "src": "2872:14:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "id": 15033,
                        "nodeType": "ExpressionStatement",
                        "src": "2872:14:86"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 15036,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 15034,
                            "name": "measure",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14993,
                            "src": "2892:7:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                              "typeString": "contract IERC20Upgradeable"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 15035,
                            "name": "_measure",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15015,
                            "src": "2902:8:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                              "typeString": "contract IERC20Upgradeable"
                            }
                          },
                          "src": "2892:18:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "id": 15037,
                        "nodeType": "ExpressionStatement",
                        "src": "2892:18:86"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15039,
                              "name": "_dripRatePerSecond",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15017,
                              "src": "2937:18:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 15038,
                            "name": "setDripRatePerSecond",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15339,
                            "src": "2916:20:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 15040,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2916:40:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15041,
                        "nodeType": "ExpressionStatement",
                        "src": "2916:40:86"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15043,
                              "name": "asset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14990,
                              "src": "2987:5:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15044,
                              "name": "measure",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14993,
                              "src": "3000:7:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15045,
                              "name": "dripRatePerSecond",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14996,
                              "src": "3015:17:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              },
                              {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 15042,
                            "name": "Initialized",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14956,
                            "src": "2968:11:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_contract$_IERC20Upgradeable_$1960_$_t_contract$_IERC20Upgradeable_$1960_$_t_uint256_$returns$__$",
                              "typeString": "function (contract IERC20Upgradeable,contract IERC20Upgradeable,uint256)"
                            }
                          },
                          "id": 15046,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2968:70:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15047,
                        "nodeType": "EmitStatement",
                        "src": "2963:75:86"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15011,
                    "nodeType": "StructuredDocumentation",
                    "src": "2426:237:86",
                    "text": "@notice Initializes a new Comptroller V2\n @param _asset The asset to disburse to users\n @param _measure The token to use to measure a users portion\n @param _dripRatePerSecond The amount of the asset to drip each second"
                  },
                  "functionSelector": "1794bb3c",
                  "id": 15049,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 15020,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 15019,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "2792:11:86",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "2792:11:86"
                    }
                  ],
                  "name": "initialize",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 15018,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15013,
                        "mutability": "mutable",
                        "name": "_asset",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15049,
                        "src": "2692:24:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 15012,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "2692:17:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15015,
                        "mutability": "mutable",
                        "name": "_measure",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15049,
                        "src": "2722:26:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 15014,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "2722:17:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15017,
                        "mutability": "mutable",
                        "name": "_dripRatePerSecond",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15049,
                        "src": "2754:26:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 15016,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2754:7:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2686:98:86"
                  },
                  "returnParameters": {
                    "id": 15021,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2804:0:86"
                  },
                  "scope": 15492,
                  "src": "2666:377:86",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 15076,
                    "nodeType": "Block",
                    "src": "3387:117:86",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 15055,
                            "name": "drip",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15312,
                            "src": "3393:4:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_uint256_$",
                              "typeString": "function () returns (uint256)"
                            }
                          },
                          "id": 15056,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3393:6:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 15057,
                        "nodeType": "ExpressionStatement",
                        "src": "3393:6:86"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 15061,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "3424:3:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 15062,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "3424:10:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 15065,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "3444:4:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                    "typeString": "contract TokenFaucet"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                    "typeString": "contract TokenFaucet"
                                  }
                                ],
                                "id": 15064,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "3436:7:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 15063,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "3436:7:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 15066,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3436:13:86",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15067,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15052,
                              "src": "3451:6:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 15058,
                              "name": "asset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14990,
                              "src": "3405:5:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            "id": 15060,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "transferFrom",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1941,
                            "src": "3405:18:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,address,uint256) external returns (bool)"
                            }
                          },
                          "id": 15068,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3405:53:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 15069,
                        "nodeType": "ExpressionStatement",
                        "src": "3405:53:86"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 15071,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "3480:3:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 15072,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "3480:10:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15073,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15052,
                              "src": "3492:6:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 15070,
                            "name": "Deposited",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14966,
                            "src": "3470:9:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 15074,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3470:29:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15075,
                        "nodeType": "EmitStatement",
                        "src": "3465:34:86"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15050,
                    "nodeType": "StructuredDocumentation",
                    "src": "3047:295:86",
                    "text": "@notice Safely deposits asset tokens into the faucet.  Must be pre-approved\n This should be used instead of transferring directly because the drip function must\n be called before receiving new assets.\n @param amount The amount of asset tokens to add (must be approved already)"
                  },
                  "functionSelector": "b6b55f25",
                  "id": 15077,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "deposit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 15053,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15052,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15077,
                        "src": "3362:14:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 15051,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3362:7:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3361:16:86"
                  },
                  "returnParameters": {
                    "id": 15054,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3387:0:86"
                  },
                  "scope": 15492,
                  "src": "3345:159:86",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 15126,
                    "nodeType": "Block",
                    "src": "3743:297:86",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 15087,
                            "name": "drip",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15312,
                            "src": "3749:4:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_uint256_$",
                              "typeString": "function () returns (uint256)"
                            }
                          },
                          "id": 15088,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3749:6:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 15089,
                        "nodeType": "ExpressionStatement",
                        "src": "3749:6:86"
                      },
                      {
                        "assignments": [
                          15091
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 15091,
                            "mutability": "mutable",
                            "name": "assetTotalSupply",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 15126,
                            "src": "3761:24:86",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 15090,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "3761:7:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 15099,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 15096,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "3812:4:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                    "typeString": "contract TokenFaucet"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                    "typeString": "contract TokenFaucet"
                                  }
                                ],
                                "id": 15095,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "3804:7:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 15094,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "3804:7:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 15097,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3804:13:86",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 15092,
                              "name": "asset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14990,
                              "src": "3788:5:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            "id": 15093,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balanceOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1899,
                            "src": "3788:15:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) view external returns (uint256)"
                            }
                          },
                          "id": 15098,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3788:30:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3761:57:86"
                      },
                      {
                        "assignments": [
                          15101
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 15101,
                            "mutability": "mutable",
                            "name": "availableTotalSupply",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 15126,
                            "src": "3824:28:86",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 15100,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "3824:7:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 15106,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15104,
                              "name": "totalUnclaimed",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15002,
                              "src": "3876:14:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint112",
                                "typeString": "uint112"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint112",
                                "typeString": "uint112"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 15102,
                              "name": "assetTotalSupply",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15091,
                              "src": "3855:16:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 15103,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sub",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1135,
                            "src": "3855:20:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 15105,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3855:36:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3824:67:86"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 15110,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 15108,
                                "name": "amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 15082,
                                "src": "3905:6:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 15109,
                                "name": "availableTotalSupply",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 15101,
                                "src": "3915:20:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "3905:30:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "546f6b656e4661756365742f696e73756666696369656e742d66756e6473",
                              "id": 15111,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3937:32:86",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_f79fd5bf85ddefed26d468df8b5359021c362dd9b4d1da6eb472aee1a43b4414",
                                "typeString": "literal_string \"TokenFaucet/insufficient-funds\""
                              },
                              "value": "TokenFaucet/insufficient-funds"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_f79fd5bf85ddefed26d468df8b5359021c362dd9b4d1da6eb472aee1a43b4414",
                                "typeString": "literal_string \"TokenFaucet/insufficient-funds\""
                              }
                            ],
                            "id": 15107,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "3897:7:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 15112,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3897:73:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15113,
                        "nodeType": "ExpressionStatement",
                        "src": "3897:73:86"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15117,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15080,
                              "src": "3991:2:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15118,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15082,
                              "src": "3995:6:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 15114,
                              "name": "asset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14990,
                              "src": "3976:5:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            "id": 15116,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "transfer",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1909,
                            "src": "3976:14:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,uint256) external returns (bool)"
                            }
                          },
                          "id": 15119,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3976:26:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 15120,
                        "nodeType": "ExpressionStatement",
                        "src": "3976:26:86"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15122,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15080,
                              "src": "4024:2:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15123,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15082,
                              "src": "4028:6:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 15121,
                            "name": "Withdrawn",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14972,
                            "src": "4014:9:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 15124,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4014:21:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15125,
                        "nodeType": "EmitStatement",
                        "src": "4009:26:86"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15078,
                    "nodeType": "StructuredDocumentation",
                    "src": "3508:165:86",
                    "text": "@notice Allows the owner to withdraw tokens that have not been dripped yet.\n @param to The address to withdraw to\n @param amount The amount to withdraw"
                  },
                  "functionSelector": "205c2878",
                  "id": 15127,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 15085,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 15084,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "3733:9:86",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "3733:9:86"
                    }
                  ],
                  "name": "withdrawTo",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 15083,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15080,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15127,
                        "src": "3696:10:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 15079,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3696:7:86",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15082,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15127,
                        "src": "3708:14:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 15081,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3708:7:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3695:28:86"
                  },
                  "returnParameters": {
                    "id": 15086,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3743:0:86"
                  },
                  "scope": 15492,
                  "src": "3676:364:86",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 15182,
                    "nodeType": "Block",
                    "src": "4258:296:86",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 15135,
                            "name": "drip",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15312,
                            "src": "4264:4:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_uint256_$",
                              "typeString": "function () returns (uint256)"
                            }
                          },
                          "id": 15136,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4264:6:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 15137,
                        "nodeType": "ExpressionStatement",
                        "src": "4264:6:86"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15139,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15130,
                              "src": "4301:4:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 15138,
                            "name": "_captureNewTokensForUser",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15410,
                            "src": "4276:24:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$_t_uint128_$",
                              "typeString": "function (address) returns (uint128)"
                            }
                          },
                          "id": 15140,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4276:30:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 15141,
                        "nodeType": "ExpressionStatement",
                        "src": "4276:30:86"
                      },
                      {
                        "assignments": [
                          15143
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 15143,
                            "mutability": "mutable",
                            "name": "balance",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 15182,
                            "src": "4312:15:86",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 15142,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "4312:7:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 15148,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 15144,
                              "name": "userStates",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15010,
                              "src": "4330:10:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UserState_$14987_storage_$",
                                "typeString": "mapping(address => struct TokenFaucet.UserState storage ref)"
                              }
                            },
                            "id": 15146,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 15145,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15130,
                              "src": "4341:4:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "4330:16:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_UserState_$14987_storage",
                              "typeString": "struct TokenFaucet.UserState storage ref"
                            }
                          },
                          "id": 15147,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "balance",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 14986,
                          "src": "4330:24:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "4312:42:86"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 15154,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 15149,
                                "name": "userStates",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 15010,
                                "src": "4360:10:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UserState_$14987_storage_$",
                                  "typeString": "mapping(address => struct TokenFaucet.UserState storage ref)"
                                }
                              },
                              "id": 15151,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 15150,
                                "name": "user",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 15130,
                                "src": "4371:4:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "4360:16:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_UserState_$14987_storage",
                                "typeString": "struct TokenFaucet.UserState storage ref"
                              }
                            },
                            "id": 15152,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "balance",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 14986,
                            "src": "4360:24:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 15153,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "4387:1:86",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "4360:28:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "id": 15155,
                        "nodeType": "ExpressionStatement",
                        "src": "4360:28:86"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 15166,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 15156,
                            "name": "totalUnclaimed",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15002,
                            "src": "4394:14:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint112",
                              "typeString": "uint112"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 15162,
                                    "name": "balance",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 15143,
                                    "src": "4439:7:86",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 15159,
                                        "name": "totalUnclaimed",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 15002,
                                        "src": "4419:14:86",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint112",
                                          "typeString": "uint112"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint112",
                                          "typeString": "uint112"
                                        }
                                      ],
                                      "id": 15158,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "4411:7:86",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_uint256_$",
                                        "typeString": "type(uint256)"
                                      },
                                      "typeName": {
                                        "id": 15157,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "4411:7:86",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 15160,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "4411:23:86",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 15161,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sub",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1135,
                                  "src": "4411:27:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256,uint256) pure returns (uint256)"
                                  }
                                },
                                "id": 15163,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "4411:36:86",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 15164,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "toUint112",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 16296,
                              "src": "4411:46:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint112_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256) pure returns (uint112)"
                              }
                            },
                            "id": 15165,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "4411:48:86",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint112",
                              "typeString": "uint112"
                            }
                          },
                          "src": "4394:65:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint112",
                            "typeString": "uint112"
                          }
                        },
                        "id": 15167,
                        "nodeType": "ExpressionStatement",
                        "src": "4394:65:86"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15171,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15130,
                              "src": "4480:4:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15172,
                              "name": "balance",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15143,
                              "src": "4486:7:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 15168,
                              "name": "asset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14990,
                              "src": "4465:5:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            "id": 15170,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "transfer",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1909,
                            "src": "4465:14:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,uint256) external returns (bool)"
                            }
                          },
                          "id": 15173,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4465:29:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 15174,
                        "nodeType": "ExpressionStatement",
                        "src": "4465:29:86"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15176,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15130,
                              "src": "4514:4:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15177,
                              "name": "balance",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15143,
                              "src": "4520:7:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 15175,
                            "name": "Claimed",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14978,
                            "src": "4506:7:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 15178,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4506:22:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15179,
                        "nodeType": "EmitStatement",
                        "src": "4501:27:86"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 15180,
                          "name": "balance",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 15143,
                          "src": "4542:7:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 15134,
                        "id": 15181,
                        "nodeType": "Return",
                        "src": "4535:14:86"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15128,
                    "nodeType": "StructuredDocumentation",
                    "src": "4044:155:86",
                    "text": "@notice Transfers all unclaimed tokens to the user\n @param user The user to claim tokens for\n @return The amount of tokens that were claimed."
                  },
                  "functionSelector": "1e83409a",
                  "id": 15183,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "claim",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 15131,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15130,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15183,
                        "src": "4217:12:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 15129,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "4217:7:86",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4216:14:86"
                  },
                  "returnParameters": {
                    "id": 15134,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15133,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15183,
                        "src": "4249:7:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 15132,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4249:7:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4248:9:86"
                  },
                  "scope": 15492,
                  "src": "4202:352:86",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 15311,
                    "nodeType": "Block",
                    "src": "4766:1179:86",
                    "statements": [
                      {
                        "assignments": [
                          15190
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 15190,
                            "mutability": "mutable",
                            "name": "currentTimestamp",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 15311,
                            "src": "4772:24:86",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 15189,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "4772:7:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 15193,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 15191,
                            "name": "_currentTime",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15491,
                            "src": "4799:12:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_uint32_$",
                              "typeString": "function () view returns (uint32)"
                            }
                          },
                          "id": 15192,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4799:14:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "4772:41:86"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          },
                          "id": 15199,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 15194,
                            "name": "lastDripTimestamp",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15005,
                            "src": "4868:17:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 15197,
                                "name": "currentTimestamp",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 15190,
                                "src": "4896:16:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 15196,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "4889:6:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_uint32_$",
                                "typeString": "type(uint32)"
                              },
                              "typeName": {
                                "id": 15195,
                                "name": "uint32",
                                "nodeType": "ElementaryTypeName",
                                "src": "4889:6:86",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 15198,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "4889:24:86",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "src": "4868:45:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 15203,
                        "nodeType": "IfStatement",
                        "src": "4864:74:86",
                        "trueBody": {
                          "id": 15202,
                          "nodeType": "Block",
                          "src": "4915:23:86",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 15200,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "4930:1:86",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "functionReturnParameters": 15188,
                              "id": 15201,
                              "nodeType": "Return",
                              "src": "4923:8:86"
                            }
                          ]
                        }
                      },
                      {
                        "assignments": [
                          15205
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 15205,
                            "mutability": "mutable",
                            "name": "assetTotalSupply",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 15311,
                            "src": "4944:24:86",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 15204,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "4944:7:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 15213,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 15210,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "4995:4:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                    "typeString": "contract TokenFaucet"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                    "typeString": "contract TokenFaucet"
                                  }
                                ],
                                "id": 15209,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "4987:7:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 15208,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "4987:7:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 15211,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "4987:13:86",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 15206,
                              "name": "asset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14990,
                              "src": "4971:5:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            "id": 15207,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balanceOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1899,
                            "src": "4971:15:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) view external returns (uint256)"
                            }
                          },
                          "id": 15212,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4971:30:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "4944:57:86"
                      },
                      {
                        "assignments": [
                          15215
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 15215,
                            "mutability": "mutable",
                            "name": "availableTotalSupply",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 15311,
                            "src": "5007:28:86",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 15214,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "5007:7:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 15220,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15218,
                              "name": "totalUnclaimed",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15002,
                              "src": "5059:14:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint112",
                                "typeString": "uint112"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint112",
                                "typeString": "uint112"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 15216,
                              "name": "assetTotalSupply",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15205,
                              "src": "5038:16:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 15217,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sub",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1135,
                            "src": "5038:20:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 15219,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5038:36:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "5007:67:86"
                      },
                      {
                        "assignments": [
                          15222
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 15222,
                            "mutability": "mutable",
                            "name": "newSeconds",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 15311,
                            "src": "5080:18:86",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 15221,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "5080:7:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 15227,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15225,
                              "name": "lastDripTimestamp",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15005,
                              "src": "5122:17:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint32",
                                "typeString": "uint32"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 15223,
                              "name": "currentTimestamp",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15190,
                              "src": "5101:16:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 15224,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sub",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1135,
                            "src": "5101:20:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 15226,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5101:39:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "5080:60:86"
                      },
                      {
                        "assignments": [
                          15229
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 15229,
                            "mutability": "mutable",
                            "name": "nextExchangeRateMantissa",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 15311,
                            "src": "5146:32:86",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 15228,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "5146:7:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 15231,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 15230,
                          "name": "exchangeRateMantissa",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 14999,
                          "src": "5181:20:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint112",
                            "typeString": "uint112"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "5146:55:86"
                      },
                      {
                        "assignments": [
                          15233
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 15233,
                            "mutability": "mutable",
                            "name": "newTokens",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 15311,
                            "src": "5207:17:86",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 15232,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "5207:7:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 15234,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "5207:17:86"
                      },
                      {
                        "assignments": [
                          15236
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 15236,
                            "mutability": "mutable",
                            "name": "measureTotalSupply",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 15311,
                            "src": "5230:26:86",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 15235,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "5230:7:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 15240,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 15237,
                              "name": "measure",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14993,
                              "src": "5259:7:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            "id": 15238,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "totalSupply",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1891,
                            "src": "5259:19:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$",
                              "typeString": "function () view external returns (uint256)"
                            }
                          },
                          "id": 15239,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5259:21:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "5230:50:86"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 15247,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 15243,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 15241,
                              "name": "measureTotalSupply",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15236,
                              "src": "5291:18:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": ">",
                            "rightExpression": {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 15242,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "5312:1:86",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            },
                            "src": "5291:22:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 15246,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 15244,
                              "name": "availableTotalSupply",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15215,
                              "src": "5317:20:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": ">",
                            "rightExpression": {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 15245,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "5340:1:86",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            },
                            "src": "5317:24:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "5291:50:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 15284,
                        "nodeType": "IfStatement",
                        "src": "5287:439:86",
                        "trueBody": {
                          "id": 15283,
                          "nodeType": "Block",
                          "src": "5343:383:86",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 15253,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 15248,
                                  "name": "newTokens",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 15233,
                                  "src": "5351:9:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 15251,
                                      "name": "dripRatePerSecond",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 14996,
                                      "src": "5378:17:86",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 15249,
                                      "name": "newSeconds",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 15222,
                                      "src": "5363:10:86",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 15250,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "mul",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1169,
                                    "src": "5363:14:86",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 15252,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "5363:33:86",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "5351:45:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 15254,
                              "nodeType": "ExpressionStatement",
                              "src": "5351:45:86"
                            },
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 15257,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 15255,
                                  "name": "newTokens",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 15233,
                                  "src": "5408:9:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": ">",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 15256,
                                  "name": "availableTotalSupply",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 15215,
                                  "src": "5420:20:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "5408:32:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 15263,
                              "nodeType": "IfStatement",
                              "src": "5404:89:86",
                              "trueBody": {
                                "id": 15262,
                                "nodeType": "Block",
                                "src": "5442:51:86",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 15260,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "id": 15258,
                                        "name": "newTokens",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 15233,
                                        "src": "5452:9:86",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "id": 15259,
                                        "name": "availableTotalSupply",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 15215,
                                        "src": "5464:20:86",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "5452:32:86",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 15261,
                                    "nodeType": "ExpressionStatement",
                                    "src": "5452:32:86"
                                  }
                                ]
                              }
                            },
                            {
                              "assignments": [
                                15265
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 15265,
                                  "mutability": "mutable",
                                  "name": "indexDeltaMantissa",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 15283,
                                  "src": "5500:26:86",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 15264,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "5500:7:86",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 15271,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 15268,
                                    "name": "newTokens",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 15233,
                                    "src": "5558:9:86",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 15269,
                                    "name": "measureTotalSupply",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 15236,
                                    "src": "5569:18:86",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 15266,
                                    "name": "FixedPoint",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 5279,
                                    "src": "5529:10:86",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_FixedPoint_$5279_$",
                                      "typeString": "type(library FixedPoint)"
                                    }
                                  },
                                  "id": 15267,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "calculateMantissa",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 5224,
                                  "src": "5529:28:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                    "typeString": "function (uint256,uint256) pure returns (uint256)"
                                  }
                                },
                                "id": 15270,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "5529:59:86",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "5500:88:86"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 15277,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 15272,
                                  "name": "nextExchangeRateMantissa",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 15229,
                                  "src": "5596:24:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 15275,
                                      "name": "indexDeltaMantissa",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 15265,
                                      "src": "5652:18:86",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 15273,
                                      "name": "nextExchangeRateMantissa",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 15229,
                                      "src": "5623:24:86",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 15274,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "add",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 1113,
                                    "src": "5623:28:86",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                      "typeString": "function (uint256,uint256) pure returns (uint256)"
                                    }
                                  },
                                  "id": 15276,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "5623:48:86",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "5596:75:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 15278,
                              "nodeType": "ExpressionStatement",
                              "src": "5596:75:86"
                            },
                            {
                              "eventCall": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 15280,
                                    "name": "newTokens",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 15233,
                                    "src": "5702:9:86",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 15279,
                                  "name": "Dripped",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 14960,
                                  "src": "5685:7:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$",
                                    "typeString": "function (uint256)"
                                  }
                                },
                                "id": 15281,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "5685:34:86",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 15282,
                              "nodeType": "EmitStatement",
                              "src": "5680:39:86"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 15289,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 15285,
                            "name": "exchangeRateMantissa",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14999,
                            "src": "5732:20:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint112",
                              "typeString": "uint112"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "expression": {
                                "argumentTypes": null,
                                "id": 15286,
                                "name": "nextExchangeRateMantissa",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 15229,
                                "src": "5755:24:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 15287,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "toUint112",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 16296,
                              "src": "5755:34:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint112_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256) pure returns (uint112)"
                              }
                            },
                            "id": 15288,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "5755:36:86",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint112",
                              "typeString": "uint112"
                            }
                          },
                          "src": "5732:59:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint112",
                            "typeString": "uint112"
                          }
                        },
                        "id": 15290,
                        "nodeType": "ExpressionStatement",
                        "src": "5732:59:86"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 15301,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 15291,
                            "name": "totalUnclaimed",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15002,
                            "src": "5797:14:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint112",
                              "typeString": "uint112"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 15297,
                                    "name": "newTokens",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 15233,
                                    "src": "5842:9:86",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 15294,
                                        "name": "totalUnclaimed",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 15002,
                                        "src": "5822:14:86",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint112",
                                          "typeString": "uint112"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint112",
                                          "typeString": "uint112"
                                        }
                                      ],
                                      "id": 15293,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "5814:7:86",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_uint256_$",
                                        "typeString": "type(uint256)"
                                      },
                                      "typeName": {
                                        "id": 15292,
                                        "name": "uint256",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "5814:7:86",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 15295,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "5814:23:86",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 15296,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "add",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1113,
                                  "src": "5814:27:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256,uint256) pure returns (uint256)"
                                  }
                                },
                                "id": 15298,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "5814:38:86",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 15299,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "toUint112",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 16296,
                              "src": "5814:48:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint112_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256) pure returns (uint112)"
                              }
                            },
                            "id": 15300,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "5814:50:86",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint112",
                              "typeString": "uint112"
                            }
                          },
                          "src": "5797:67:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint112",
                            "typeString": "uint112"
                          }
                        },
                        "id": 15302,
                        "nodeType": "ExpressionStatement",
                        "src": "5797:67:86"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 15307,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 15303,
                            "name": "lastDripTimestamp",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15005,
                            "src": "5870:17:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "expression": {
                                "argumentTypes": null,
                                "id": 15304,
                                "name": "currentTimestamp",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 15190,
                                "src": "5890:16:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 15305,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "toUint32",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 4859,
                              "src": "5890:25:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint32_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256) pure returns (uint32)"
                              }
                            },
                            "id": 15306,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "5890:27:86",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint32",
                              "typeString": "uint32"
                            }
                          },
                          "src": "5870:47:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "id": 15308,
                        "nodeType": "ExpressionStatement",
                        "src": "5870:47:86"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 15309,
                          "name": "newTokens",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 15233,
                          "src": "5931:9:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 15188,
                        "id": 15310,
                        "nodeType": "Return",
                        "src": "5924:16:86"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15184,
                    "nodeType": "StructuredDocumentation",
                    "src": "4558:164:86",
                    "text": "@notice Drips new tokens.\n @dev Should be called immediately before any measure token mints/transfers/burns\n @return The number of new tokens dripped."
                  },
                  "functionSelector": "9f678cca",
                  "id": 15312,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "drip",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 15185,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4738:2:86"
                  },
                  "returnParameters": {
                    "id": 15188,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15187,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15312,
                        "src": "4757:7:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 15186,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "4757:7:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4756:9:86"
                  },
                  "scope": 15492,
                  "src": "4725:1220:86",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 15338,
                    "nodeType": "Block",
                    "src": "6219:212:86",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 15323,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 15321,
                                "name": "_dripRatePerSecond",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 15315,
                                "src": "6233:18:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 15322,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "6254:1:86",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "6233:22:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "546f6b656e4661756365742f64726970526174652d67742d7a65726f",
                              "id": 15324,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "6257:30:86",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_987456317ebf1c7887e49cd95ca64a9acb2c93588a7009d32972322552298db3",
                                "typeString": "literal_string \"TokenFaucet/dripRate-gt-zero\""
                              },
                              "value": "TokenFaucet/dripRate-gt-zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_987456317ebf1c7887e49cd95ca64a9acb2c93588a7009d32972322552298db3",
                                "typeString": "literal_string \"TokenFaucet/dripRate-gt-zero\""
                              }
                            ],
                            "id": 15320,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "6225:7:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 15325,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6225:63:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15326,
                        "nodeType": "ExpressionStatement",
                        "src": "6225:63:86"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 15327,
                            "name": "drip",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15312,
                            "src": "6329:4:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_uint256_$",
                              "typeString": "function () returns (uint256)"
                            }
                          },
                          "id": 15328,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6329:6:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 15329,
                        "nodeType": "ExpressionStatement",
                        "src": "6329:6:86"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 15332,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 15330,
                            "name": "dripRatePerSecond",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14996,
                            "src": "6342:17:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 15331,
                            "name": "_dripRatePerSecond",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15315,
                            "src": "6362:18:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "6342:38:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 15333,
                        "nodeType": "ExpressionStatement",
                        "src": "6342:38:86"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15335,
                              "name": "dripRatePerSecond",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14996,
                              "src": "6408:17:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 15334,
                            "name": "DripRateChanged",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14982,
                            "src": "6392:15:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 15336,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6392:34:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15337,
                        "nodeType": "EmitStatement",
                        "src": "6387:39:86"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15313,
                    "nodeType": "StructuredDocumentation",
                    "src": "5949:192:86",
                    "text": "@notice Allows the owner to set the drip rate per second.  This is the number of tokens that are dripped each second.\n @param _dripRatePerSecond The new drip rate in tokens per second"
                  },
                  "functionSelector": "ca5baafc",
                  "id": 15339,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 15318,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 15317,
                        "name": "onlyOwner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 75,
                        "src": "6209:9:86",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "6209:9:86"
                    }
                  ],
                  "name": "setDripRatePerSecond",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 15316,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15315,
                        "mutability": "mutable",
                        "name": "_dripRatePerSecond",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15339,
                        "src": "6174:26:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 15314,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6174:7:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6173:28:86"
                  },
                  "returnParameters": {
                    "id": 15319,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6219:0:86"
                  },
                  "scope": 15492,
                  "src": "6144:287:86",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 15409,
                    "nodeType": "Block",
                    "src": "6756:667:86",
                    "statements": [
                      {
                        "assignments": [
                          15348
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 15348,
                            "mutability": "mutable",
                            "name": "userState",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 15409,
                            "src": "6762:27:86",
                            "stateVariable": false,
                            "storageLocation": "storage",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_UserState_$14987_storage_ptr",
                              "typeString": "struct TokenFaucet.UserState"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 15347,
                              "name": "UserState",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 14987,
                              "src": "6762:9:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_UserState_$14987_storage_ptr",
                                "typeString": "struct TokenFaucet.UserState"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 15352,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 15349,
                            "name": "userStates",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15010,
                            "src": "6792:10:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UserState_$14987_storage_$",
                              "typeString": "mapping(address => struct TokenFaucet.UserState storage ref)"
                            }
                          },
                          "id": 15351,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 15350,
                            "name": "user",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15342,
                            "src": "6803:4:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "6792:16:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_UserState_$14987_storage",
                            "typeString": "struct TokenFaucet.UserState storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "6762:46:86"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          },
                          "id": 15356,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 15353,
                            "name": "exchangeRateMantissa",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 14999,
                            "src": "6818:20:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint112",
                              "typeString": "uint112"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 15354,
                              "name": "userState",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15348,
                              "src": "6842:9:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_UserState_$14987_storage_ptr",
                                "typeString": "struct TokenFaucet.UserState storage pointer"
                              }
                            },
                            "id": 15355,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "lastExchangeRateMantissa",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 14984,
                            "src": "6842:34:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            }
                          },
                          "src": "6818:58:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 15360,
                        "nodeType": "IfStatement",
                        "src": "6814:128:86",
                        "trueBody": {
                          "id": 15359,
                          "nodeType": "Block",
                          "src": "6878:64:86",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 15357,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "6934:1:86",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "functionReturnParameters": 15346,
                              "id": 15358,
                              "nodeType": "Return",
                              "src": "6927:8:86"
                            }
                          ]
                        }
                      },
                      {
                        "assignments": [
                          15362
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 15362,
                            "mutability": "mutable",
                            "name": "deltaExchangeRateMantissa",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 15409,
                            "src": "6947:33:86",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 15361,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "6947:7:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 15371,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 15368,
                                "name": "userState",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 15348,
                                "src": "7017:9:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_UserState_$14987_storage_ptr",
                                  "typeString": "struct TokenFaucet.UserState storage pointer"
                                }
                              },
                              "id": 15369,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "lastExchangeRateMantissa",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 14984,
                              "src": "7017:34:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 15365,
                                  "name": "exchangeRateMantissa",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 14999,
                                  "src": "6991:20:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint112",
                                    "typeString": "uint112"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint112",
                                    "typeString": "uint112"
                                  }
                                ],
                                "id": 15364,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "6983:7:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_uint256_$",
                                  "typeString": "type(uint256)"
                                },
                                "typeName": {
                                  "id": 15363,
                                  "name": "uint256",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "6983:7:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 15366,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6983:29:86",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 15367,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sub",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1135,
                            "src": "6983:33:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 15370,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6983:69:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "6947:105:86"
                      },
                      {
                        "assignments": [
                          15373
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 15373,
                            "mutability": "mutable",
                            "name": "userMeasureBalance",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 15409,
                            "src": "7058:26:86",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 15372,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "7058:7:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 15378,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15376,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15342,
                              "src": "7105:4:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 15374,
                              "name": "measure",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14993,
                              "src": "7087:7:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            "id": 15375,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balanceOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1899,
                            "src": "7087:17:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) view external returns (uint256)"
                            }
                          },
                          "id": 15377,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7087:23:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "7058:52:86"
                      },
                      {
                        "assignments": [
                          15380
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 15380,
                            "mutability": "mutable",
                            "name": "newTokens",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 15409,
                            "src": "7116:17:86",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint128",
                              "typeString": "uint128"
                            },
                            "typeName": {
                              "id": 15379,
                              "name": "uint128",
                              "nodeType": "ElementaryTypeName",
                              "src": "7116:7:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint128",
                                "typeString": "uint128"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 15388,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 15383,
                                  "name": "userMeasureBalance",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 15373,
                                  "src": "7170:18:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 15384,
                                  "name": "deltaExchangeRateMantissa",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 15362,
                                  "src": "7190:25:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 15381,
                                  "name": "FixedPoint",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5279,
                                  "src": "7136:10:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_contract$_FixedPoint_$5279_$",
                                    "typeString": "type(library FixedPoint)"
                                  }
                                },
                                "id": 15382,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "multiplyUintByMantissa",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 5251,
                                "src": "7136:33:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                  "typeString": "function (uint256,uint256) pure returns (uint256)"
                                }
                              },
                              "id": 15385,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7136:80:86",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 15386,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "toUint128",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 4813,
                            "src": "7136:90:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256) pure returns (uint128)"
                            }
                          },
                          "id": 15387,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7136:92:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "7116:112:86"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 15405,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 15389,
                              "name": "userStates",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15010,
                              "src": "7235:10:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UserState_$14987_storage_$",
                                "typeString": "mapping(address => struct TokenFaucet.UserState storage ref)"
                              }
                            },
                            "id": 15391,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 15390,
                              "name": "user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15342,
                              "src": "7246:4:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "7235:16:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_UserState_$14987_storage",
                              "typeString": "struct TokenFaucet.UserState storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 15393,
                                "name": "exchangeRateMantissa",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 14999,
                                "src": "7298:20:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint112",
                                  "typeString": "uint112"
                                }
                              },
                              {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 15400,
                                        "name": "newTokens",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 15380,
                                        "src": "7366:9:86",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint128",
                                          "typeString": "uint128"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 15396,
                                              "name": "userState",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 15348,
                                              "src": "7343:9:86",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_struct$_UserState_$14987_storage_ptr",
                                                "typeString": "struct TokenFaucet.UserState storage pointer"
                                              }
                                            },
                                            "id": 15397,
                                            "isConstant": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "balance",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 14986,
                                            "src": "7343:17:86",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint128",
                                              "typeString": "uint128"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_uint128",
                                              "typeString": "uint128"
                                            }
                                          ],
                                          "id": 15395,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "nodeType": "ElementaryTypeNameExpression",
                                          "src": "7335:7:86",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_type$_t_uint256_$",
                                            "typeString": "type(uint256)"
                                          },
                                          "typeName": {
                                            "id": 15394,
                                            "name": "uint256",
                                            "nodeType": "ElementaryTypeName",
                                            "src": "7335:7:86",
                                            "typeDescriptions": {
                                              "typeIdentifier": null,
                                              "typeString": null
                                            }
                                          }
                                        },
                                        "id": 15398,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "typeConversion",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "7335:26:86",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 15399,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "add",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 1113,
                                      "src": "7335:30:86",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                        "typeString": "function (uint256,uint256) pure returns (uint256)"
                                      }
                                    },
                                    "id": 15401,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "7335:41:86",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 15402,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "toUint128",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 4813,
                                  "src": "7335:51:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256) pure returns (uint128)"
                                  }
                                },
                                "id": 15403,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "7335:53:86",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint112",
                                  "typeString": "uint112"
                                },
                                {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              ],
                              "id": 15392,
                              "name": "UserState",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 14987,
                              "src": "7254:9:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_struct$_UserState_$14987_storage_ptr_$",
                                "typeString": "type(struct TokenFaucet.UserState storage pointer)"
                              }
                            },
                            "id": 15404,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "structConstructorCall",
                            "lValueRequested": false,
                            "names": [
                              "lastExchangeRateMantissa",
                              "balance"
                            ],
                            "nodeType": "FunctionCall",
                            "src": "7254:141:86",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_UserState_$14987_memory_ptr",
                              "typeString": "struct TokenFaucet.UserState memory"
                            }
                          },
                          "src": "7235:160:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_UserState_$14987_storage",
                            "typeString": "struct TokenFaucet.UserState storage ref"
                          }
                        },
                        "id": 15406,
                        "nodeType": "ExpressionStatement",
                        "src": "7235:160:86"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 15407,
                          "name": "newTokens",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 15380,
                          "src": "7409:9:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "functionReturnParameters": 15346,
                        "id": 15408,
                        "nodeType": "Return",
                        "src": "7402:16:86"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15340,
                    "nodeType": "StructuredDocumentation",
                    "src": "6435:236:86",
                    "text": "@notice Captures new tokens for a user\n @dev This must be called before changes to the user's balance (i.e. before mint, transfer or burns)\n @param user The user to capture tokens for\n @return The number of new tokens"
                  },
                  "id": 15410,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_captureNewTokensForUser",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 15343,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15342,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15410,
                        "src": "6713:12:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 15341,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6713:7:86",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6707:22:86"
                  },
                  "returnParameters": {
                    "id": 15346,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15345,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15410,
                        "src": "6747:7:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint128",
                          "typeString": "uint128"
                        },
                        "typeName": {
                          "id": 15344,
                          "name": "uint128",
                          "nodeType": "ElementaryTypeName",
                          "src": "6747:7:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint128",
                            "typeString": "uint128"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6746:9:86"
                  },
                  "scope": 15492,
                  "src": "6674:749:86",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "private"
                },
                {
                  "baseFunctions": [
                    16252
                  ],
                  "body": {
                    "id": 15438,
                    "nodeType": "Block",
                    "src": "7715:98:86",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 15428,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 15423,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15417,
                            "src": "7725:5:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 15426,
                                "name": "measure",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 14993,
                                "src": "7742:7:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                  "typeString": "contract IERC20Upgradeable"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                  "typeString": "contract IERC20Upgradeable"
                                }
                              ],
                              "id": 15425,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "7734:7:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 15424,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "7734:7:86",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 15427,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "7734:16:86",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "7725:25:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 15437,
                        "nodeType": "IfStatement",
                        "src": "7721:88:86",
                        "trueBody": {
                          "id": 15436,
                          "nodeType": "Block",
                          "src": "7752:57:86",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "id": 15429,
                                  "name": "drip",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 15312,
                                  "src": "7760:4:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_uint256_$",
                                    "typeString": "function () returns (uint256)"
                                  }
                                },
                                "id": 15430,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "7760:6:86",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 15431,
                              "nodeType": "ExpressionStatement",
                              "src": "7760:6:86"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 15433,
                                    "name": "to",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 15413,
                                    "src": "7799:2:86",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "id": 15432,
                                  "name": "_captureNewTokensForUser",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 15410,
                                  "src": "7774:24:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$_t_uint128_$",
                                    "typeString": "function (address) returns (uint128)"
                                  }
                                },
                                "id": 15434,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "7774:28:86",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 15435,
                              "nodeType": "ExpressionStatement",
                              "src": "7774:28:86"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15411,
                    "nodeType": "StructuredDocumentation",
                    "src": "7427:167:86",
                    "text": "@notice Should be called before a user mints new \"measure\" tokens.\n @param to The user who is minting the tokens\n @param token The token they are minting"
                  },
                  "functionSelector": "4d7f3db0",
                  "id": 15439,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "beforeTokenMint",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 15421,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "7704:8:86"
                  },
                  "parameters": {
                    "id": 15420,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15413,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15439,
                        "src": "7627:10:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 15412,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7627:7:86",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15415,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15439,
                        "src": "7643:7:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 15414,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "7643:7:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15417,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15439,
                        "src": "7656:13:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 15416,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7656:7:86",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15419,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15439,
                        "src": "7675:7:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 15418,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7675:7:86",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7621:65:86"
                  },
                  "returnParameters": {
                    "id": 15422,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "7715:0:86"
                  },
                  "scope": 15492,
                  "src": "7597:216:86",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    16264
                  ],
                  "body": {
                    "id": 15478,
                    "nodeType": "Block",
                    "src": "8183:200:86",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 15464,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 15457,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 15452,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15448,
                              "src": "8235:5:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "==",
                            "rightExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 15455,
                                  "name": "measure",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 14993,
                                  "src": "8252:7:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                    "typeString": "contract IERC20Upgradeable"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                    "typeString": "contract IERC20Upgradeable"
                                  }
                                ],
                                "id": 15454,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "8244:7:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 15453,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "8244:7:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 15456,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "8244:16:86",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "src": "8235:25:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 15463,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 15458,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15442,
                              "src": "8264:4:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 15461,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "8280:1:86",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 15460,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "8272:7:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 15459,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "8272:7:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 15462,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "8272:10:86",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "src": "8264:18:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "8235:47:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 15477,
                        "nodeType": "IfStatement",
                        "src": "8231:148:86",
                        "trueBody": {
                          "id": 15476,
                          "nodeType": "Block",
                          "src": "8284:95:86",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "id": 15465,
                                  "name": "drip",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 15312,
                                  "src": "8292:4:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_uint256_$",
                                    "typeString": "function () returns (uint256)"
                                  }
                                },
                                "id": 15466,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "8292:6:86",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 15467,
                              "nodeType": "ExpressionStatement",
                              "src": "8292:6:86"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 15469,
                                    "name": "to",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 15444,
                                    "src": "8331:2:86",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "id": 15468,
                                  "name": "_captureNewTokensForUser",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 15410,
                                  "src": "8306:24:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$_t_uint128_$",
                                    "typeString": "function (address) returns (uint128)"
                                  }
                                },
                                "id": 15470,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "8306:28:86",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 15471,
                              "nodeType": "ExpressionStatement",
                              "src": "8306:28:86"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 15473,
                                    "name": "from",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 15442,
                                    "src": "8367:4:86",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "id": 15472,
                                  "name": "_captureNewTokensForUser",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 15410,
                                  "src": "8342:24:86",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$_t_uint128_$",
                                    "typeString": "function (address) returns (uint128)"
                                  }
                                },
                                "id": 15474,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "8342:30:86",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint128",
                                  "typeString": "uint128"
                                }
                              },
                              "id": 15475,
                              "nodeType": "ExpressionStatement",
                              "src": "8342:30:86"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15440,
                    "nodeType": "StructuredDocumentation",
                    "src": "7817:236:86",
                    "text": "@notice Should be called before \"measure\" tokens are transferred or burned\n @param from The user who is sending the tokens\n @param to The user who is receiving the tokens\n @param token The token token they are burning"
                  },
                  "functionSelector": "b2210957",
                  "id": 15479,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "beforeTokenTransfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 15450,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "8172:8:86"
                  },
                  "parameters": {
                    "id": 15449,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15442,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15479,
                        "src": "8090:12:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 15441,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8090:7:86",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15444,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15479,
                        "src": "8108:10:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 15443,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8108:7:86",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15446,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15479,
                        "src": "8124:7:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 15445,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "8124:7:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15448,
                        "mutability": "mutable",
                        "name": "token",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15479,
                        "src": "8137:13:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 15447,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8137:7:86",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8084:70:86"
                  },
                  "returnParameters": {
                    "id": 15451,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "8183:0:86"
                  },
                  "scope": 15492,
                  "src": "8056:327:86",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 15490,
                    "nodeType": "Block",
                    "src": "8572:44:86",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 15485,
                                "name": "block",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -4,
                                "src": "8585:5:86",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_block",
                                  "typeString": "block"
                                }
                              },
                              "id": 15486,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "timestamp",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "8585:15:86",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 15487,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "toUint32",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 4859,
                            "src": "8585:24:86",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint32_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256) pure returns (uint32)"
                            }
                          },
                          "id": 15488,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8585:26:86",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "functionReturnParameters": 15484,
                        "id": 15489,
                        "nodeType": "Return",
                        "src": "8578:33:86"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15480,
                    "nodeType": "StructuredDocumentation",
                    "src": "8387:119:86",
                    "text": "@notice returns the current time.  Allows for override in testing.\n @return The current time (block.timestamp)"
                  },
                  "id": 15491,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_currentTime",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 15481,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "8530:2:86"
                  },
                  "returnParameters": {
                    "id": 15484,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15483,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15491,
                        "src": "8564:6:86",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint32",
                          "typeString": "uint32"
                        },
                        "typeName": {
                          "id": 15482,
                          "name": "uint32",
                          "nodeType": "ElementaryTypeName",
                          "src": "8564:6:86",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint32",
                            "typeString": "uint32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8563:8:86"
                  },
                  "scope": 15492,
                  "src": "8509:107:86",
                  "stateMutability": "view",
                  "virtual": true,
                  "visibility": "internal"
                }
              ],
              "scope": 15493,
              "src": "926:7693:86"
            }
          ],
          "src": "37:8583:86"
        },
        "id": 86
      },
      "contracts/token-faucet/TokenFaucetProxyFactory.sol": {
        "ast": {
          "absolutePath": "contracts/token-faucet/TokenFaucetProxyFactory.sol",
          "exportedSymbols": {
            "TokenFaucetProxyFactory": [
              15621
            ]
          },
          "id": 15622,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 15494,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:87"
            },
            {
              "absolutePath": "contracts/token-faucet/TokenFaucet.sol",
              "file": "./TokenFaucet.sol",
              "id": 15495,
              "nodeType": "ImportDirective",
              "scope": 15622,
              "sourceUnit": 15493,
              "src": "62:27:87",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/external/openzeppelin/ProxyFactory.sol",
              "file": "../external/openzeppelin/ProxyFactory.sol",
              "id": 15496,
              "nodeType": "ImportDirective",
              "scope": 15622,
              "sourceUnit": 6617,
              "src": "90:51:87",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 15498,
                    "name": "ProxyFactory",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 6616,
                    "src": "294:12:87",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ProxyFactory_$6616",
                      "typeString": "contract ProxyFactory"
                    }
                  },
                  "id": 15499,
                  "nodeType": "InheritanceSpecifier",
                  "src": "294:12:87"
                }
              ],
              "contractDependencies": [
                6616,
                15492
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 15497,
                "nodeType": "StructuredDocumentation",
                "src": "143:115:87",
                "text": "@title Stake Prize Pool Proxy Factory\n @notice Minimal proxy pattern for creating new TokenFaucet contracts"
              },
              "fullyImplemented": true,
              "id": 15621,
              "linearizedBaseContracts": [
                15621,
                6616
              ],
              "name": "TokenFaucetProxyFactory",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "documentation": {
                    "id": 15500,
                    "nodeType": "StructuredDocumentation",
                    "src": "312:64:87",
                    "text": "@notice Contract template for deploying proxied Comptrollers"
                  },
                  "functionSelector": "022ec095",
                  "id": 15502,
                  "mutability": "mutable",
                  "name": "instance",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 15621,
                  "src": "379:27:87",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                    "typeString": "contract TokenFaucet"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 15501,
                    "name": "TokenFaucet",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 15492,
                    "src": "379:11:87",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                      "typeString": "contract TokenFaucet"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 15512,
                    "nodeType": "Block",
                    "src": "507:39:87",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 15510,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 15506,
                            "name": "instance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15502,
                            "src": "513:8:87",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                              "typeString": "contract TokenFaucet"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 15508,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "524:15:87",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_creation_nonpayable$__$returns$_t_contract$_TokenFaucet_$15492_$",
                                "typeString": "function () returns (contract TokenFaucet)"
                              },
                              "typeName": {
                                "contractScope": null,
                                "id": 15507,
                                "name": "TokenFaucet",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 15492,
                                "src": "528:11:87",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                  "typeString": "contract TokenFaucet"
                                }
                              }
                            },
                            "id": 15509,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "524:17:87",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                              "typeString": "contract TokenFaucet"
                            }
                          },
                          "src": "513:28:87",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                            "typeString": "contract TokenFaucet"
                          }
                        },
                        "id": 15511,
                        "nodeType": "ExpressionStatement",
                        "src": "513:28:87"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15503,
                    "nodeType": "StructuredDocumentation",
                    "src": "411:71:87",
                    "text": "@notice Initializes the Factory with an instance of the TokenFaucet"
                  },
                  "id": 15513,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 15504,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "497:2:87"
                  },
                  "returnParameters": {
                    "id": 15505,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "507:0:87"
                  },
                  "scope": 15621,
                  "src": "485:61:87",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 15554,
                    "nodeType": "Block",
                    "src": "983:235:87",
                    "statements": [
                      {
                        "assignments": [
                          15526
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 15526,
                            "mutability": "mutable",
                            "name": "tokenFaucet",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 15554,
                            "src": "989:23:87",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                              "typeString": "contract TokenFaucet"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 15525,
                              "name": "TokenFaucet",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 15492,
                              "src": "989:11:87",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                "typeString": "contract TokenFaucet"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 15536,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 15531,
                                      "name": "instance",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 15502,
                                      "src": "1049:8:87",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                        "typeString": "contract TokenFaucet"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                        "typeString": "contract TokenFaucet"
                                      }
                                    ],
                                    "id": 15530,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "1041:7:87",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 15529,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "1041:7:87",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 15532,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "1041:17:87",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "hexValue": "",
                                  "id": 15533,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "1060:2:87",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                    "typeString": "literal_string \"\""
                                  },
                                  "value": ""
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                    "typeString": "literal_string \"\""
                                  }
                                ],
                                "id": 15528,
                                "name": "deployMinimal",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6615,
                                "src": "1027:13:87",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_address_$",
                                  "typeString": "function (address,bytes memory) returns (address)"
                                }
                              },
                              "id": 15534,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1027:36:87",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 15527,
                            "name": "TokenFaucet",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15492,
                            "src": "1015:11:87",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_TokenFaucet_$15492_$",
                              "typeString": "type(contract TokenFaucet)"
                            }
                          },
                          "id": 15535,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1015:49:87",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                            "typeString": "contract TokenFaucet"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "989:75:87"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15540,
                              "name": "_asset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15516,
                              "src": "1100:6:87",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15541,
                              "name": "_measure",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15518,
                              "src": "1108:8:87",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15542,
                              "name": "_dripRatePerSecond",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15520,
                              "src": "1118:18:87",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              },
                              {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 15537,
                              "name": "tokenFaucet",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15526,
                              "src": "1070:11:87",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                "typeString": "contract TokenFaucet"
                              }
                            },
                            "id": 15539,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "initialize",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 15049,
                            "src": "1070:22:87",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_contract$_IERC20Upgradeable_$1960_$_t_contract$_IERC20Upgradeable_$1960_$_t_uint256_$returns$__$",
                              "typeString": "function (contract IERC20Upgradeable,contract IERC20Upgradeable,uint256) external"
                            }
                          },
                          "id": 15543,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1070:72:87",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15544,
                        "nodeType": "ExpressionStatement",
                        "src": "1070:72:87"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 15548,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "1178:3:87",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 15549,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "1178:10:87",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 15545,
                              "name": "tokenFaucet",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15526,
                              "src": "1148:11:87",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                "typeString": "contract TokenFaucet"
                              }
                            },
                            "id": 15547,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "transferOwnership",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 125,
                            "src": "1148:29:87",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address) external"
                            }
                          },
                          "id": 15550,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1148:41:87",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15551,
                        "nodeType": "ExpressionStatement",
                        "src": "1148:41:87"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 15552,
                          "name": "tokenFaucet",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 15526,
                          "src": "1202:11:87",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                            "typeString": "contract TokenFaucet"
                          }
                        },
                        "functionReturnParameters": 15524,
                        "id": 15553,
                        "nodeType": "Return",
                        "src": "1195:18:87"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15514,
                    "nodeType": "StructuredDocumentation",
                    "src": "550:287:87",
                    "text": "@notice Creates a new TokenFaucet\n @param _asset The asset to disburse to users\n @param _measure The token to use to measure a users portion\n @param _dripRatePerSecond The amount of the asset to drip each second\n @return A reference to the new proxied TokenFaucet"
                  },
                  "functionSelector": "ffe5725f",
                  "id": 15555,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "create",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 15521,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15516,
                        "mutability": "mutable",
                        "name": "_asset",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15555,
                        "src": "861:24:87",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 15515,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "861:17:87",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15518,
                        "mutability": "mutable",
                        "name": "_measure",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15555,
                        "src": "891:26:87",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 15517,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "891:17:87",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15520,
                        "mutability": "mutable",
                        "name": "_dripRatePerSecond",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15555,
                        "src": "923:26:87",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 15519,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "923:7:87",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "855:98:87"
                  },
                  "returnParameters": {
                    "id": 15524,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15523,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15555,
                        "src": "970:11:87",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                          "typeString": "contract TokenFaucet"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 15522,
                          "name": "TokenFaucet",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 15492,
                          "src": "970:11:87",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                            "typeString": "contract TokenFaucet"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "969:13:87"
                  },
                  "scope": 15621,
                  "src": "840:378:87",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 15589,
                    "nodeType": "Block",
                    "src": "1788:139:87",
                    "statements": [
                      {
                        "assignments": [
                          15570
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 15570,
                            "mutability": "mutable",
                            "name": "faucet",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 15589,
                            "src": "1794:18:87",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                              "typeString": "contract TokenFaucet"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 15569,
                              "name": "TokenFaucet",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 15492,
                              "src": "1794:11:87",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                "typeString": "contract TokenFaucet"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 15576,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15572,
                              "name": "_asset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15558,
                              "src": "1822:6:87",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15573,
                              "name": "_measure",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15560,
                              "src": "1830:8:87",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15574,
                              "name": "_dripRatePerSecond",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15562,
                              "src": "1840:18:87",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              },
                              {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 15571,
                            "name": "create",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15555,
                            "src": "1815:6:87",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20Upgradeable_$1960_$_t_contract$_IERC20Upgradeable_$1960_$_t_uint256_$returns$_t_contract$_TokenFaucet_$15492_$",
                              "typeString": "function (contract IERC20Upgradeable,contract IERC20Upgradeable,uint256) returns (contract TokenFaucet)"
                            }
                          },
                          "id": 15575,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1815:44:87",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                            "typeString": "contract TokenFaucet"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1794:65:87"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 15580,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "1885:3:87",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 15581,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "1885:10:87",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 15584,
                                  "name": "faucet",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 15570,
                                  "src": "1905:6:87",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                    "typeString": "contract TokenFaucet"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                    "typeString": "contract TokenFaucet"
                                  }
                                ],
                                "id": 15583,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "1897:7:87",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 15582,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "1897:7:87",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 15585,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1897:15:87",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15586,
                              "name": "_amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15564,
                              "src": "1914:7:87",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 15577,
                              "name": "_asset",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15558,
                              "src": "1865:6:87",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            "id": 15579,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "transferFrom",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1941,
                            "src": "1865:19:87",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,address,uint256) external returns (bool)"
                            }
                          },
                          "id": 15587,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1865:57:87",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 15588,
                        "nodeType": "ExpressionStatement",
                        "src": "1865:57:87"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15556,
                    "nodeType": "StructuredDocumentation",
                    "src": "1222:387:87",
                    "text": "@notice Creates a new TokenFaucet and immediately deposits funds\n @param _asset The asset to disburse to users\n @param _measure The token to use to measure a users portion\n @param _dripRatePerSecond The amount of the asset to drip each second\n @param _amount The amount of assets to deposit into the faucet\n @return A reference to the new proxied TokenFaucet"
                  },
                  "functionSelector": "244a79d6",
                  "id": 15590,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "createAndDeposit",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 15565,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15558,
                        "mutability": "mutable",
                        "name": "_asset",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15590,
                        "src": "1643:24:87",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 15557,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "1643:17:87",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15560,
                        "mutability": "mutable",
                        "name": "_measure",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15590,
                        "src": "1673:26:87",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 15559,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "1673:17:87",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15562,
                        "mutability": "mutable",
                        "name": "_dripRatePerSecond",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15590,
                        "src": "1705:26:87",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 15561,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1705:7:87",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15564,
                        "mutability": "mutable",
                        "name": "_amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15590,
                        "src": "1737:15:87",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 15563,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1737:7:87",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1637:119:87"
                  },
                  "returnParameters": {
                    "id": 15568,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15567,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15590,
                        "src": "1775:11:87",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                          "typeString": "contract TokenFaucet"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 15566,
                          "name": "TokenFaucet",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 15492,
                          "src": "1775:11:87",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                            "typeString": "contract TokenFaucet"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1774:13:87"
                  },
                  "scope": 15621,
                  "src": "1612:315:87",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 15619,
                    "nodeType": "Block",
                    "src": "2174:102:87",
                    "statements": [
                      {
                        "body": {
                          "id": 15617,
                          "nodeType": "Block",
                          "src": "2230:42:87",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 15614,
                                    "name": "user",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 15593,
                                    "src": "2260:4:87",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 15610,
                                      "name": "tokenFaucets",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 15596,
                                      "src": "2238:12:87",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_contract$_TokenFaucet_$15492_$dyn_calldata_ptr",
                                        "typeString": "contract TokenFaucet[] calldata"
                                      }
                                    },
                                    "id": 15612,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 15611,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 15600,
                                      "src": "2251:1:87",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "2238:15:87",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                                      "typeString": "contract TokenFaucet"
                                    }
                                  },
                                  "id": 15613,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "claim",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 15183,
                                  "src": "2238:21:87",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_address_$returns$_t_uint256_$",
                                    "typeString": "function (address) external returns (uint256)"
                                  }
                                },
                                "id": 15615,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "2238:27:87",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 15616,
                              "nodeType": "ExpressionStatement",
                              "src": "2238:27:87"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 15606,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 15603,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15600,
                            "src": "2200:1:87",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 15604,
                              "name": "tokenFaucets",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15596,
                              "src": "2204:12:87",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_contract$_TokenFaucet_$15492_$dyn_calldata_ptr",
                                "typeString": "contract TokenFaucet[] calldata"
                              }
                            },
                            "id": 15605,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "2204:19:87",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "2200:23:87",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 15618,
                        "initializationExpression": {
                          "assignments": [
                            15600
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 15600,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 15618,
                              "src": "2185:9:87",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 15599,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "2185:7:87",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 15602,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 15601,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "2197:1:87",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "2185:13:87"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 15608,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "2225:3:87",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 15607,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15600,
                              "src": "2225:1:87",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 15609,
                          "nodeType": "ExpressionStatement",
                          "src": "2225:3:87"
                        },
                        "nodeType": "ForStatement",
                        "src": "2180:92:87"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15591,
                    "nodeType": "StructuredDocumentation",
                    "src": "1931:162:87",
                    "text": "@notice Runs claim on all passed comptrollers for a user.\n @param user The user to claim for\n @param tokenFaucets The tokenFaucets to call claim on."
                  },
                  "functionSelector": "13e7e058",
                  "id": 15620,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "claimAll",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 15597,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15593,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15620,
                        "src": "2114:12:87",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 15592,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2114:7:87",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15596,
                        "mutability": "mutable",
                        "name": "tokenFaucets",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15620,
                        "src": "2128:35:87",
                        "stateVariable": false,
                        "storageLocation": "calldata",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_contract$_TokenFaucet_$15492_$dyn_calldata_ptr",
                          "typeString": "contract TokenFaucet[]"
                        },
                        "typeName": {
                          "baseType": {
                            "contractScope": null,
                            "id": 15594,
                            "name": "TokenFaucet",
                            "nodeType": "UserDefinedTypeName",
                            "referencedDeclaration": 15492,
                            "src": "2128:11:87",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TokenFaucet_$15492",
                              "typeString": "contract TokenFaucet"
                            }
                          },
                          "id": 15595,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "2128:13:87",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_contract$_TokenFaucet_$15492_$dyn_storage_ptr",
                            "typeString": "contract TokenFaucet[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2113:51:87"
                  },
                  "returnParameters": {
                    "id": 15598,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2174:0:87"
                  },
                  "scope": 15621,
                  "src": "2096:180:87",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 15622,
              "src": "258:2020:87"
            }
          ],
          "src": "37:2242:87"
        },
        "id": 87
      },
      "contracts/token/ControlledToken.sol": {
        "ast": {
          "absolutePath": "contracts/token/ControlledToken.sol",
          "exportedSymbols": {
            "ControlledToken": [
              15810
            ]
          },
          "id": 15811,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 15623,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:88"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/drafts/ERC20PermitUpgradeable.sol",
              "id": 15624,
              "nodeType": "ImportDirective",
              "scope": 15811,
              "sourceUnit": 581,
              "src": "62:79:88",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/token/TokenControllerInterface.sol",
              "file": "./TokenControllerInterface.sol",
              "id": 15625,
              "nodeType": "ImportDirective",
              "scope": 15811,
              "sourceUnit": 16207,
              "src": "143:40:88",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/token/ControlledTokenInterface.sol",
              "file": "./ControlledTokenInterface.sol",
              "id": 15626,
              "nodeType": "ImportDirective",
              "scope": 15811,
              "sourceUnit": 15851,
              "src": "184:40:88",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 15628,
                    "name": "ERC20PermitUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 580,
                    "src": "353:22:88",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20PermitUpgradeable_$580",
                      "typeString": "contract ERC20PermitUpgradeable"
                    }
                  },
                  "id": 15629,
                  "nodeType": "InheritanceSpecifier",
                  "src": "353:22:88"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 15630,
                    "name": "ControlledTokenInterface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 15850,
                    "src": "377:24:88",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ControlledTokenInterface_$15850",
                      "typeString": "contract ControlledTokenInterface"
                    }
                  },
                  "id": 15631,
                  "nodeType": "InheritanceSpecifier",
                  "src": "377:24:88"
                }
              ],
              "contractDependencies": [
                406,
                580,
                616,
                1352,
                1882,
                1960,
                3627,
                15850
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 15627,
                "nodeType": "StructuredDocumentation",
                "src": "226:99:88",
                "text": "@title Controlled ERC20 Token\n @notice ERC20 Tokens with a controller for minting & burning"
              },
              "fullyImplemented": true,
              "id": 15810,
              "linearizedBaseContracts": [
                15810,
                15850,
                580,
                406,
                616,
                1882,
                1960,
                3627,
                1352
              ],
              "name": "ControlledToken",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 15632,
                    "nodeType": "StructuredDocumentation",
                    "src": "407:48:88",
                    "text": "@dev Emitted when an instance is initialized"
                  },
                  "id": 15642,
                  "name": "Initialized",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 15641,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15634,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "_name",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15642,
                        "src": "481:12:88",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 15633,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "481:6:88",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15636,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "_symbol",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15642,
                        "src": "499:14:88",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 15635,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "499:6:88",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15638,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "_decimals",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15642,
                        "src": "519:15:88",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 15637,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "519:5:88",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15640,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "_controller",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15642,
                        "src": "540:36:88",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                          "typeString": "contract TokenControllerInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 15639,
                          "name": "TokenControllerInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16206,
                          "src": "540:24:88",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                            "typeString": "contract TokenControllerInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "475:105:88"
                  },
                  "src": "458:123:88"
                },
                {
                  "baseFunctions": [
                    15823
                  ],
                  "constant": false,
                  "documentation": {
                    "id": 15643,
                    "nodeType": "StructuredDocumentation",
                    "src": "585:75:88",
                    "text": "@notice Interface to the contract responsible for controlling mint/burn"
                  },
                  "functionSelector": "f77c4791",
                  "id": 15646,
                  "mutability": "mutable",
                  "name": "controller",
                  "nodeType": "VariableDeclaration",
                  "overrides": {
                    "id": 15645,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "695:8:88"
                  },
                  "scope": 15810,
                  "src": "663:51:88",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                    "typeString": "contract TokenControllerInterface"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 15644,
                    "name": "TokenControllerInterface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 16206,
                    "src": "663:24:88",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                      "typeString": "contract TokenControllerInterface"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 15697,
                    "nodeType": "Block",
                    "src": "1213:337:88",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 15669,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 15663,
                                    "name": "_controller",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 15655,
                                    "src": "1235:11:88",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                                      "typeString": "contract TokenControllerInterface"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                                      "typeString": "contract TokenControllerInterface"
                                    }
                                  ],
                                  "id": 15662,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "1227:7:88",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 15661,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1227:7:88",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 15664,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "1227:20:88",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 15667,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "1259:1:88",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 15666,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "1251:7:88",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 15665,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1251:7:88",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 15668,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "1251:10:88",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "1227:34:88",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "436f6e74726f6c6c6564546f6b656e2f636f6e74726f6c6c65722d6e6f742d7a65726f",
                              "id": 15670,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1263:37:88",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_d7a7764c7eba75a06639b6cc4395acd3a579def0686483a201eb6bb2e81805e7",
                                "typeString": "literal_string \"ControlledToken/controller-not-zero\""
                              },
                              "value": "ControlledToken/controller-not-zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_d7a7764c7eba75a06639b6cc4395acd3a579def0686483a201eb6bb2e81805e7",
                                "typeString": "literal_string \"ControlledToken/controller-not-zero\""
                              }
                            ],
                            "id": 15660,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1219:7:88",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 15671,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1219:82:88",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15672,
                        "nodeType": "ExpressionStatement",
                        "src": "1219:82:88"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15674,
                              "name": "_name",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15649,
                              "src": "1320:5:88",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15675,
                              "name": "_symbol",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15651,
                              "src": "1327:7:88",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            ],
                            "id": 15673,
                            "name": "__ERC20_init",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1405,
                            "src": "1307:12:88",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (string memory,string memory)"
                            }
                          },
                          "id": 15676,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1307:28:88",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15677,
                        "nodeType": "ExpressionStatement",
                        "src": "1307:28:88"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "506f6f6c546f67657468657220436f6e74726f6c6c6564546f6b656e",
                              "id": 15679,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1360:30:88",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_4c56e52e1e1083962e8a166de35adcba6701e0a029333db5a80367db0f67e330",
                                "typeString": "literal_string \"PoolTogether ControlledToken\""
                              },
                              "value": "PoolTogether ControlledToken"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_stringliteral_4c56e52e1e1083962e8a166de35adcba6701e0a029333db5a80367db0f67e330",
                                "typeString": "literal_string \"PoolTogether ControlledToken\""
                              }
                            ],
                            "id": 15678,
                            "name": "__ERC20Permit_init",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 453,
                            "src": "1341:18:88",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (string memory)"
                            }
                          },
                          "id": 15680,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1341:50:88",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15681,
                        "nodeType": "ExpressionStatement",
                        "src": "1341:50:88"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 15684,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 15682,
                            "name": "controller",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15646,
                            "src": "1397:10:88",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                              "typeString": "contract TokenControllerInterface"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 15683,
                            "name": "_controller",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15655,
                            "src": "1410:11:88",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                              "typeString": "contract TokenControllerInterface"
                            }
                          },
                          "src": "1397:24:88",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                            "typeString": "contract TokenControllerInterface"
                          }
                        },
                        "id": 15685,
                        "nodeType": "ExpressionStatement",
                        "src": "1397:24:88"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15687,
                              "name": "_decimals",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15653,
                              "src": "1442:9:88",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            ],
                            "id": 15686,
                            "name": "_setupDecimals",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1866,
                            "src": "1427:14:88",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint8_$returns$__$",
                              "typeString": "function (uint8)"
                            }
                          },
                          "id": 15688,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1427:25:88",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15689,
                        "nodeType": "ExpressionStatement",
                        "src": "1427:25:88"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15691,
                              "name": "_name",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15649,
                              "src": "1483:5:88",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15692,
                              "name": "_symbol",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15651,
                              "src": "1496:7:88",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15693,
                              "name": "_decimals",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15653,
                              "src": "1511:9:88",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15694,
                              "name": "_controller",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15655,
                              "src": "1528:11:88",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                                "typeString": "contract TokenControllerInterface"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              {
                                "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                                "typeString": "contract TokenControllerInterface"
                              }
                            ],
                            "id": 15690,
                            "name": "Initialized",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15642,
                            "src": "1464:11:88",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_uint8_$_t_contract$_TokenControllerInterface_$16206_$returns$__$",
                              "typeString": "function (string memory,string memory,uint8,contract TokenControllerInterface)"
                            }
                          },
                          "id": 15695,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1464:81:88",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15696,
                        "nodeType": "EmitStatement",
                        "src": "1459:86:88"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15647,
                    "nodeType": "StructuredDocumentation",
                    "src": "719:311:88",
                    "text": "@notice Initializes the Controlled Token with Token Details and the Controller\n @param _name The name of the Token\n @param _symbol The symbol for the Token\n @param _decimals The number of decimals for the Token\n @param _controller Address of the Controller contract for minting & burning"
                  },
                  "functionSelector": "de7ea79d",
                  "id": 15698,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 15658,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 15657,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "1199:11:88",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "1199:11:88"
                    }
                  ],
                  "name": "initialize",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 15656,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15649,
                        "mutability": "mutable",
                        "name": "_name",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15698,
                        "src": "1058:19:88",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 15648,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "1058:6:88",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15651,
                        "mutability": "mutable",
                        "name": "_symbol",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15698,
                        "src": "1083:21:88",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 15650,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "1083:6:88",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15653,
                        "mutability": "mutable",
                        "name": "_decimals",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15698,
                        "src": "1110:15:88",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 15652,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "1110:5:88",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15655,
                        "mutability": "mutable",
                        "name": "_controller",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15698,
                        "src": "1131:36:88",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                          "typeString": "contract TokenControllerInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 15654,
                          "name": "TokenControllerInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16206,
                          "src": "1131:24:88",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                            "typeString": "contract TokenControllerInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1052:119:88"
                  },
                  "returnParameters": {
                    "id": 15659,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1213:0:88"
                  },
                  "scope": 15810,
                  "src": "1033:517:88",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    15831
                  ],
                  "body": {
                    "id": 15714,
                    "nodeType": "Block",
                    "src": "1906:32:88",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15710,
                              "name": "_user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15701,
                              "src": "1918:5:88",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15711,
                              "name": "_amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15703,
                              "src": "1925:7:88",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 15709,
                            "name": "_mint",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1754,
                            "src": "1912:5:88",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 15712,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1912:21:88",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15713,
                        "nodeType": "ExpressionStatement",
                        "src": "1912:21:88"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15699,
                    "nodeType": "StructuredDocumentation",
                    "src": "1554:252:88",
                    "text": "@notice Allows the controller to mint tokens for a user account\n @dev May be overridden to provide more granular control over minting\n @param _user Address of the receiver of the minted tokens\n @param _amount Amount of tokens to mint"
                  },
                  "functionSelector": "5d7b0758",
                  "id": 15715,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 15707,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 15706,
                        "name": "onlyController",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15789,
                        "src": "1891:14:88",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "1891:14:88"
                    }
                  ],
                  "name": "controllerMint",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 15705,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "1882:8:88"
                  },
                  "parameters": {
                    "id": 15704,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15701,
                        "mutability": "mutable",
                        "name": "_user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15715,
                        "src": "1833:13:88",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 15700,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1833:7:88",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15703,
                        "mutability": "mutable",
                        "name": "_amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15715,
                        "src": "1848:15:88",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 15702,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1848:7:88",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1832:32:88"
                  },
                  "returnParameters": {
                    "id": 15708,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1906:0:88"
                  },
                  "scope": 15810,
                  "src": "1809:129:88",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    15839
                  ],
                  "body": {
                    "id": 15731,
                    "nodeType": "Block",
                    "src": "2300:32:88",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15727,
                              "name": "_user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15718,
                              "src": "2312:5:88",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15728,
                              "name": "_amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15720,
                              "src": "2319:7:88",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 15726,
                            "name": "_burn",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1810,
                            "src": "2306:5:88",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 15729,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2306:21:88",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15730,
                        "nodeType": "ExpressionStatement",
                        "src": "2306:21:88"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15716,
                    "nodeType": "StructuredDocumentation",
                    "src": "1942:258:88",
                    "text": "@notice Allows the controller to burn tokens from a user account\n @dev May be overridden to provide more granular control over burning\n @param _user Address of the holder account to burn tokens from\n @param _amount Amount of tokens to burn"
                  },
                  "functionSelector": "90596dd1",
                  "id": 15732,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 15724,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 15723,
                        "name": "onlyController",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15789,
                        "src": "2285:14:88",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "2285:14:88"
                    }
                  ],
                  "name": "controllerBurn",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 15722,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "2276:8:88"
                  },
                  "parameters": {
                    "id": 15721,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15718,
                        "mutability": "mutable",
                        "name": "_user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15732,
                        "src": "2227:13:88",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 15717,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2227:7:88",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15720,
                        "mutability": "mutable",
                        "name": "_amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15732,
                        "src": "2242:15:88",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 15719,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2242:7:88",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2226:32:88"
                  },
                  "returnParameters": {
                    "id": 15725,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2300:0:88"
                  },
                  "scope": 15810,
                  "src": "2203:129:88",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    15849
                  ],
                  "body": {
                    "id": 15772,
                    "nodeType": "Block",
                    "src": "2852:236:88",
                    "statements": [
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 15747,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 15745,
                            "name": "_operator",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15735,
                            "src": "2862:9:88",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 15746,
                            "name": "_user",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15737,
                            "src": "2875:5:88",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "2862:18:88",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 15766,
                        "nodeType": "IfStatement",
                        "src": "2858:199:88",
                        "trueBody": {
                          "id": 15765,
                          "nodeType": "Block",
                          "src": "2882:175:88",
                          "statements": [
                            {
                              "assignments": [
                                15749
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 15749,
                                  "mutability": "mutable",
                                  "name": "decreasedAllowance",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 15765,
                                  "src": "2890:26:88",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 15748,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2890:7:88",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 15758,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 15755,
                                    "name": "_amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 15739,
                                    "src": "2951:7:88",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "436f6e74726f6c6c6564546f6b656e2f657863656564732d616c6c6f77616e6365",
                                    "id": 15756,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "2960:35:88",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_b0c4652a69a8bbbd46ee4c9a0a8030631b18416300ff1eb644543b95256592cd",
                                      "typeString": "literal_string \"ControlledToken/exceeds-allowance\""
                                    },
                                    "value": "ControlledToken/exceeds-allowance"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_stringliteral_b0c4652a69a8bbbd46ee4c9a0a8030631b18416300ff1eb644543b95256592cd",
                                      "typeString": "literal_string \"ControlledToken/exceeds-allowance\""
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 15751,
                                        "name": "_user",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 15737,
                                        "src": "2929:5:88",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      },
                                      {
                                        "argumentTypes": null,
                                        "id": 15752,
                                        "name": "_operator",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 15735,
                                        "src": "2936:9:88",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        },
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "id": 15750,
                                      "name": "allowance",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1517,
                                      "src": "2919:9:88",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_uint256_$",
                                        "typeString": "function (address,address) view returns (uint256)"
                                      }
                                    },
                                    "id": 15753,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "2919:27:88",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 15754,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sub",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1237,
                                  "src": "2919:31:88",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$_t_string_memory_ptr_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256,uint256,string memory) pure returns (uint256)"
                                  }
                                },
                                "id": 15757,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "2919:77:88",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "2890:106:88"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 15760,
                                    "name": "_user",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 15737,
                                    "src": "3013:5:88",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 15761,
                                    "name": "_operator",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 15735,
                                    "src": "3020:9:88",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 15762,
                                    "name": "decreasedAllowance",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 15749,
                                    "src": "3031:18:88",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "id": 15759,
                                  "name": "_approve",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 1855,
                                  "src": "3004:8:88",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                                    "typeString": "function (address,address,uint256)"
                                  }
                                },
                                "id": 15763,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "3004:46:88",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 15764,
                              "nodeType": "ExpressionStatement",
                              "src": "3004:46:88"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15768,
                              "name": "_user",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15737,
                              "src": "3068:5:88",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15769,
                              "name": "_amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15739,
                              "src": "3075:7:88",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 15767,
                            "name": "_burn",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1810,
                            "src": "3062:5:88",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 15770,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3062:21:88",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15771,
                        "nodeType": "ExpressionStatement",
                        "src": "3062:21:88"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15733,
                    "nodeType": "StructuredDocumentation",
                    "src": "2336:393:88",
                    "text": "@notice Allows an operator via the controller to burn tokens on behalf of a user account\n @dev May be overridden to provide more granular control over operator-burning\n @param _operator Address of the operator performing the burn action via the controller contract\n @param _user Address of the holder account to burn tokens from\n @param _amount Amount of tokens to burn"
                  },
                  "functionSelector": "631b5dfb",
                  "id": 15773,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 15743,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 15742,
                        "name": "onlyController",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 15789,
                        "src": "2837:14:88",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "2837:14:88"
                    }
                  ],
                  "name": "controllerBurnFrom",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 15741,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "2828:8:88"
                  },
                  "parameters": {
                    "id": 15740,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15735,
                        "mutability": "mutable",
                        "name": "_operator",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15773,
                        "src": "2760:17:88",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 15734,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2760:7:88",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15737,
                        "mutability": "mutable",
                        "name": "_user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15773,
                        "src": "2779:13:88",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 15736,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2779:7:88",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15739,
                        "mutability": "mutable",
                        "name": "_amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15773,
                        "src": "2794:15:88",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 15738,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2794:7:88",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2759:51:88"
                  },
                  "returnParameters": {
                    "id": 15744,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2852:0:88"
                  },
                  "scope": 15810,
                  "src": "2732:356:88",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "external"
                },
                {
                  "body": {
                    "id": 15788,
                    "nodeType": "Block",
                    "src": "3198:97:88",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 15783,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [],
                                "expression": {
                                  "argumentTypes": [],
                                  "id": 15777,
                                  "name": "_msgSender",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 3611,
                                  "src": "3212:10:88",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_view$__$returns$_t_address_payable_$",
                                    "typeString": "function () view returns (address payable)"
                                  }
                                },
                                "id": 15778,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "3212:12:88",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 15781,
                                    "name": "controller",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 15646,
                                    "src": "3236:10:88",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                                      "typeString": "contract TokenControllerInterface"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                                      "typeString": "contract TokenControllerInterface"
                                    }
                                  ],
                                  "id": 15780,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "3228:7:88",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 15779,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "3228:7:88",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 15782,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "3228:19:88",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "src": "3212:35:88",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "436f6e74726f6c6c6564546f6b656e2f6f6e6c792d636f6e74726f6c6c6572",
                              "id": 15784,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3249:33:88",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_ef56e6eb544946d3498735fdd4428248a65a688b6ca702fa3dbce5b90141cb35",
                                "typeString": "literal_string \"ControlledToken/only-controller\""
                              },
                              "value": "ControlledToken/only-controller"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_ef56e6eb544946d3498735fdd4428248a65a688b6ca702fa3dbce5b90141cb35",
                                "typeString": "literal_string \"ControlledToken/only-controller\""
                              }
                            ],
                            "id": 15776,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "3204:7:88",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 15785,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3204:79:88",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15786,
                        "nodeType": "ExpressionStatement",
                        "src": "3204:79:88"
                      },
                      {
                        "id": 15787,
                        "nodeType": "PlaceholderStatement",
                        "src": "3289:1:88"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15774,
                    "nodeType": "StructuredDocumentation",
                    "src": "3092:79:88",
                    "text": "@dev Function modifier to ensure that the caller is the controller contract"
                  },
                  "id": 15789,
                  "name": "onlyController",
                  "nodeType": "ModifierDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 15775,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3198:0:88"
                  },
                  "src": "3174:121:88",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    1877
                  ],
                  "body": {
                    "id": 15808,
                    "nodeType": "Block",
                    "src": "3853:59:88",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15803,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15792,
                              "src": "3890:4:88",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15804,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15794,
                              "src": "3896:2:88",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15805,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15796,
                              "src": "3900:6:88",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 15800,
                              "name": "controller",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15646,
                              "src": "3859:10:88",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                                "typeString": "contract TokenControllerInterface"
                              }
                            },
                            "id": 15802,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "beforeTokenTransfer",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16205,
                            "src": "3859:30:88",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256) external"
                            }
                          },
                          "id": 15806,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3859:48:88",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15807,
                        "nodeType": "ExpressionStatement",
                        "src": "3859:48:88"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15790,
                    "nodeType": "StructuredDocumentation",
                    "src": "3299:453:88",
                    "text": "@dev Controller hook to provide notifications & rule validations on token transfers to the controller.\n This includes minting and burning.\n May be overridden to provide more granular control over operator-burning\n @param from Address of the account sending the tokens (address(0x0) on minting)\n @param to Address of the account receiving the tokens (address(0x0) on burning)\n @param amount Amount of tokens being transferred"
                  },
                  "id": 15809,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_beforeTokenTransfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 15798,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "3844:8:88"
                  },
                  "parameters": {
                    "id": 15797,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15792,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15809,
                        "src": "3785:12:88",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 15791,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3785:7:88",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15794,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15809,
                        "src": "3799:10:88",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 15793,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "3799:7:88",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15796,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15809,
                        "src": "3811:14:88",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 15795,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3811:7:88",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3784:42:88"
                  },
                  "returnParameters": {
                    "id": 15799,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3853:0:88"
                  },
                  "scope": 15810,
                  "src": "3755:157:88",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                }
              ],
              "scope": 15811,
              "src": "325:3589:88"
            }
          ],
          "src": "37:3878:88"
        },
        "id": 88
      },
      "contracts/token/ControlledTokenInterface.sol": {
        "ast": {
          "absolutePath": "contracts/token/ControlledTokenInterface.sol",
          "exportedSymbols": {
            "ControlledTokenInterface": [
              15850
            ]
          },
          "id": 15851,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 15812,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:89"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "id": 15813,
              "nodeType": "ImportDirective",
              "scope": 15851,
              "sourceUnit": 1961,
              "src": "62:79:89",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/token/TokenControllerInterface.sol",
              "file": "./TokenControllerInterface.sol",
              "id": 15814,
              "nodeType": "ImportDirective",
              "scope": 15851,
              "sourceUnit": 16207,
              "src": "143:40:89",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 15816,
                    "name": "IERC20Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1960,
                    "src": "322:17:89",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                      "typeString": "contract IERC20Upgradeable"
                    }
                  },
                  "id": 15817,
                  "nodeType": "InheritanceSpecifier",
                  "src": "322:17:89"
                }
              ],
              "contractDependencies": [
                1960
              ],
              "contractKind": "interface",
              "documentation": {
                "id": 15815,
                "nodeType": "StructuredDocumentation",
                "src": "185:99:89",
                "text": "@title Controlled ERC20 Token\n @notice ERC20 Tokens with a controller for minting & burning"
              },
              "fullyImplemented": false,
              "id": 15850,
              "linearizedBaseContracts": [
                15850,
                1960
              ],
              "name": "ControlledTokenInterface",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 15818,
                    "nodeType": "StructuredDocumentation",
                    "src": "345:75:89",
                    "text": "@notice Interface to the contract responsible for controlling mint/burn"
                  },
                  "functionSelector": "f77c4791",
                  "id": 15823,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "controller",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 15819,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "442:2:89"
                  },
                  "returnParameters": {
                    "id": 15822,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15821,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15823,
                        "src": "468:24:89",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                          "typeString": "contract TokenControllerInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 15820,
                          "name": "TokenControllerInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16206,
                          "src": "468:24:89",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                            "typeString": "contract TokenControllerInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "467:26:89"
                  },
                  "scope": 15850,
                  "src": "423:71:89",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 15824,
                    "nodeType": "StructuredDocumentation",
                    "src": "498:252:89",
                    "text": "@notice Allows the controller to mint tokens for a user account\n @dev May be overridden to provide more granular control over minting\n @param _user Address of the receiver of the minted tokens\n @param _amount Amount of tokens to mint"
                  },
                  "functionSelector": "5d7b0758",
                  "id": 15831,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "controllerMint",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 15829,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15826,
                        "mutability": "mutable",
                        "name": "_user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15831,
                        "src": "777:13:89",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 15825,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "777:7:89",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15828,
                        "mutability": "mutable",
                        "name": "_amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15831,
                        "src": "792:15:89",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 15827,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "792:7:89",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "776:32:89"
                  },
                  "returnParameters": {
                    "id": 15830,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "817:0:89"
                  },
                  "scope": 15850,
                  "src": "753:65:89",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 15832,
                    "nodeType": "StructuredDocumentation",
                    "src": "822:258:89",
                    "text": "@notice Allows the controller to burn tokens from a user account\n @dev May be overridden to provide more granular control over burning\n @param _user Address of the holder account to burn tokens from\n @param _amount Amount of tokens to burn"
                  },
                  "functionSelector": "90596dd1",
                  "id": 15839,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "controllerBurn",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 15837,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15834,
                        "mutability": "mutable",
                        "name": "_user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15839,
                        "src": "1107:13:89",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 15833,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1107:7:89",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15836,
                        "mutability": "mutable",
                        "name": "_amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15839,
                        "src": "1122:15:89",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 15835,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1122:7:89",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1106:32:89"
                  },
                  "returnParameters": {
                    "id": 15838,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1147:0:89"
                  },
                  "scope": 15850,
                  "src": "1083:65:89",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 15840,
                    "nodeType": "StructuredDocumentation",
                    "src": "1152:393:89",
                    "text": "@notice Allows an operator via the controller to burn tokens on behalf of a user account\n @dev May be overridden to provide more granular control over operator-burning\n @param _operator Address of the operator performing the burn action via the controller contract\n @param _user Address of the holder account to burn tokens from\n @param _amount Amount of tokens to burn"
                  },
                  "functionSelector": "631b5dfb",
                  "id": 15849,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "controllerBurnFrom",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 15847,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15842,
                        "mutability": "mutable",
                        "name": "_operator",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15849,
                        "src": "1576:17:89",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 15841,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1576:7:89",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15844,
                        "mutability": "mutable",
                        "name": "_user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15849,
                        "src": "1595:13:89",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 15843,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1595:7:89",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15846,
                        "mutability": "mutable",
                        "name": "_amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15849,
                        "src": "1610:15:89",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 15845,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1610:7:89",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1575:51:89"
                  },
                  "returnParameters": {
                    "id": 15848,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1635:0:89"
                  },
                  "scope": 15850,
                  "src": "1548:88:89",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 15851,
              "src": "284:1354:89"
            }
          ],
          "src": "37:1602:89"
        },
        "id": 89
      },
      "contracts/token/ControlledTokenProxyFactory.sol": {
        "ast": {
          "absolutePath": "contracts/token/ControlledTokenProxyFactory.sol",
          "exportedSymbols": {
            "ControlledTokenProxyFactory": [
              15889
            ]
          },
          "id": 15890,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 15852,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:90"
            },
            {
              "absolutePath": "contracts/token/ControlledToken.sol",
              "file": "./ControlledToken.sol",
              "id": 15853,
              "nodeType": "ImportDirective",
              "scope": 15890,
              "sourceUnit": 15811,
              "src": "62:31:90",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/external/openzeppelin/ProxyFactory.sol",
              "file": "../external/openzeppelin/ProxyFactory.sol",
              "id": 15854,
              "nodeType": "ImportDirective",
              "scope": 15890,
              "sourceUnit": 6617,
              "src": "94:51:90",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 15856,
                    "name": "ProxyFactory",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 6616,
                    "src": "304:12:90",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ProxyFactory_$6616",
                      "typeString": "contract ProxyFactory"
                    }
                  },
                  "id": 15857,
                  "nodeType": "InheritanceSpecifier",
                  "src": "304:12:90"
                }
              ],
              "contractDependencies": [
                6616,
                15810
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 15855,
                "nodeType": "StructuredDocumentation",
                "src": "147:117:90",
                "text": "@title Controlled ERC20 Token Factory\n @notice Minimal proxy pattern for creating new Controlled ERC20 Tokens"
              },
              "fullyImplemented": true,
              "id": 15889,
              "linearizedBaseContracts": [
                15889,
                6616
              ],
              "name": "ControlledTokenProxyFactory",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "documentation": {
                    "id": 15858,
                    "nodeType": "StructuredDocumentation",
                    "src": "322:58:90",
                    "text": "@notice Contract template for deploying proxied tokens"
                  },
                  "functionSelector": "022ec095",
                  "id": 15860,
                  "mutability": "mutable",
                  "name": "instance",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 15889,
                  "src": "383:31:90",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ControlledToken_$15810",
                    "typeString": "contract ControlledToken"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 15859,
                    "name": "ControlledToken",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 15810,
                    "src": "383:15:90",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ControlledToken_$15810",
                      "typeString": "contract ControlledToken"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 15870,
                    "nodeType": "Block",
                    "src": "526:43:90",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 15868,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 15864,
                            "name": "instance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15860,
                            "src": "532:8:90",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledToken_$15810",
                              "typeString": "contract ControlledToken"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 15866,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "543:19:90",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_creation_nonpayable$__$returns$_t_contract$_ControlledToken_$15810_$",
                                "typeString": "function () returns (contract ControlledToken)"
                              },
                              "typeName": {
                                "contractScope": null,
                                "id": 15865,
                                "name": "ControlledToken",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 15810,
                                "src": "547:15:90",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_ControlledToken_$15810",
                                  "typeString": "contract ControlledToken"
                                }
                              }
                            },
                            "id": 15867,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "543:21:90",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ControlledToken_$15810",
                              "typeString": "contract ControlledToken"
                            }
                          },
                          "src": "532:32:90",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ControlledToken_$15810",
                            "typeString": "contract ControlledToken"
                          }
                        },
                        "id": 15869,
                        "nodeType": "ExpressionStatement",
                        "src": "532:32:90"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15861,
                    "nodeType": "StructuredDocumentation",
                    "src": "419:82:90",
                    "text": "@notice Initializes the Factory with an instance of the Controlled ERC20 Token"
                  },
                  "id": 15871,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 15862,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "516:2:90"
                  },
                  "returnParameters": {
                    "id": 15863,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "526:0:90"
                  },
                  "scope": 15889,
                  "src": "504:65:90",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 15887,
                    "nodeType": "Block",
                    "src": "781:71:90",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 15881,
                                      "name": "instance",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 15860,
                                      "src": "832:8:90",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_ControlledToken_$15810",
                                        "typeString": "contract ControlledToken"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_ControlledToken_$15810",
                                        "typeString": "contract ControlledToken"
                                      }
                                    ],
                                    "id": 15880,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "824:7:90",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 15879,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "824:7:90",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 15882,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "824:17:90",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "hexValue": "",
                                  "id": 15883,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "843:2:90",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                    "typeString": "literal_string \"\""
                                  },
                                  "value": ""
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                    "typeString": "literal_string \"\""
                                  }
                                ],
                                "id": 15878,
                                "name": "deployMinimal",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6615,
                                "src": "810:13:90",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_address_$",
                                  "typeString": "function (address,bytes memory) returns (address)"
                                }
                              },
                              "id": 15884,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "810:36:90",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 15877,
                            "name": "ControlledToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 15810,
                            "src": "794:15:90",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_ControlledToken_$15810_$",
                              "typeString": "type(contract ControlledToken)"
                            }
                          },
                          "id": 15885,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "794:53:90",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ControlledToken_$15810",
                            "typeString": "contract ControlledToken"
                          }
                        },
                        "functionReturnParameters": 15876,
                        "id": 15886,
                        "nodeType": "Return",
                        "src": "787:60:90"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15872,
                    "nodeType": "StructuredDocumentation",
                    "src": "573:152:90",
                    "text": "@notice Creates a new Controlled ERC20 Token as a proxy of the template instance\n @return A reference to the new proxied Controlled ERC20 Token"
                  },
                  "functionSelector": "efc81a8c",
                  "id": 15888,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "create",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 15873,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "743:2:90"
                  },
                  "returnParameters": {
                    "id": 15876,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15875,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15888,
                        "src": "764:15:90",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ControlledToken_$15810",
                          "typeString": "contract ControlledToken"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 15874,
                          "name": "ControlledToken",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 15810,
                          "src": "764:15:90",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ControlledToken_$15810",
                            "typeString": "contract ControlledToken"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "763:17:90"
                  },
                  "scope": 15889,
                  "src": "728:124:90",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 15890,
              "src": "264:590:90"
            }
          ],
          "src": "37:818:90"
        },
        "id": 90
      },
      "contracts/token/Ticket.sol": {
        "ast": {
          "absolutePath": "contracts/token/Ticket.sol",
          "exportedSymbols": {
            "Ticket": [
              16140
            ]
          },
          "id": 16141,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 15891,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:91"
            },
            {
              "absolutePath": "sortition-sum-tree-factory/contracts/SortitionSumTreeFactory.sol",
              "file": "sortition-sum-tree-factory/contracts/SortitionSumTreeFactory.sol",
              "id": 15892,
              "nodeType": "ImportDirective",
              "scope": 16141,
              "sourceUnit": 25791,
              "src": "62:74:91",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@pooltogether/uniform-random-number/contracts/UniformRandomNumber.sol",
              "file": "@pooltogether/uniform-random-number/contracts/UniformRandomNumber.sol",
              "id": 15893,
              "nodeType": "ImportDirective",
              "scope": 16141,
              "sourceUnit": 5590,
              "src": "137:79:91",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/token/ControlledToken.sol",
              "file": "./ControlledToken.sol",
              "id": 15894,
              "nodeType": "ImportDirective",
              "scope": 16141,
              "sourceUnit": 15811,
              "src": "218:31:91",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/token/TicketInterface.sol",
              "file": "./TicketInterface.sol",
              "id": 15895,
              "nodeType": "ImportDirective",
              "scope": 16141,
              "sourceUnit": 16153,
              "src": "250:31:91",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 15896,
                    "name": "ControlledToken",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 15810,
                    "src": "302:15:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ControlledToken_$15810",
                      "typeString": "contract ControlledToken"
                    }
                  },
                  "id": 15897,
                  "nodeType": "InheritanceSpecifier",
                  "src": "302:15:91"
                },
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 15898,
                    "name": "TicketInterface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 16152,
                    "src": "319:15:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TicketInterface_$16152",
                      "typeString": "contract TicketInterface"
                    }
                  },
                  "id": 15899,
                  "nodeType": "InheritanceSpecifier",
                  "src": "319:15:91"
                }
              ],
              "contractDependencies": [
                406,
                580,
                616,
                1352,
                1882,
                1960,
                3627,
                15810,
                15850,
                16152
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": true,
              "id": 16140,
              "linearizedBaseContracts": [
                16140,
                16152,
                15810,
                15850,
                580,
                406,
                616,
                1882,
                1960,
                3627,
                1352
              ],
              "name": "Ticket",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 15902,
                  "libraryName": {
                    "contractScope": null,
                    "id": 15900,
                    "name": "SortitionSumTreeFactory",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 25790,
                    "src": "345:23:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SortitionSumTreeFactory_$25790",
                      "typeString": "library SortitionSumTreeFactory"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "339:76:91",
                  "typeName": {
                    "contractScope": null,
                    "id": 15901,
                    "name": "SortitionSumTreeFactory.SortitionSumTrees",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 25087,
                    "src": "373:41:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                      "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees"
                    }
                  }
                },
                {
                  "constant": true,
                  "id": 15907,
                  "mutability": "constant",
                  "name": "TREE_KEY",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 16140,
                  "src": "419:68:91",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 15903,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "419:7:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "hexValue": "506f6f6c546f6765746865722f5469636b6574",
                        "id": 15905,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "465:21:91",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_af45c4fb9ef70911e5444b8eedce607366e494224d52e6feab07fbd62a53b26f",
                          "typeString": "literal_string \"PoolTogether/Ticket\""
                        },
                        "value": "PoolTogether/Ticket"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_stringliteral_af45c4fb9ef70911e5444b8eedce607366e494224d52e6feab07fbd62a53b26f",
                          "typeString": "literal_string \"PoolTogether/Ticket\""
                        }
                      ],
                      "id": 15904,
                      "name": "keccak256",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": -8,
                      "src": "455:9:91",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                        "typeString": "function (bytes memory) pure returns (bytes32)"
                      }
                    },
                    "id": 15906,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "455:32:91",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "private"
                },
                {
                  "constant": true,
                  "id": 15910,
                  "mutability": "constant",
                  "name": "MAX_TREE_LEAVES",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 16140,
                  "src": "491:44:91",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 15908,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "491:7:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "35",
                    "id": 15909,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "534:1:91",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_5_by_1",
                      "typeString": "int_const 5"
                    },
                    "value": "5"
                  },
                  "visibility": "private"
                },
                {
                  "anonymous": false,
                  "documentation": {
                    "id": 15911,
                    "nodeType": "StructuredDocumentation",
                    "src": "540:48:91",
                    "text": "@dev Emitted when an instance is initialized"
                  },
                  "id": 15921,
                  "name": "Initialized",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 15920,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15913,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "_name",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15921,
                        "src": "614:12:91",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 15912,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "614:6:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15915,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "_symbol",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15921,
                        "src": "632:14:91",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 15914,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "632:6:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15917,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "_decimals",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15921,
                        "src": "652:15:91",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 15916,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "652:5:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15919,
                        "indexed": false,
                        "mutability": "mutable",
                        "name": "_controller",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15921,
                        "src": "673:36:91",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                          "typeString": "contract TokenControllerInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 15918,
                          "name": "TokenControllerInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16206,
                          "src": "673:24:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                            "typeString": "contract TokenControllerInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "608:105:91"
                  },
                  "src": "591:123:91"
                },
                {
                  "constant": false,
                  "id": 15923,
                  "mutability": "mutable",
                  "name": "sortitionSumTrees",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 16140,
                  "src": "744:68:91",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage",
                    "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 15922,
                    "name": "SortitionSumTreeFactory.SortitionSumTrees",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 25087,
                    "src": "744:41:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                      "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    15698
                  ],
                  "body": {
                    "id": 15974,
                    "nodeType": "Block",
                    "src": "1324:309:91",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 15947,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 15941,
                                    "name": "_controller",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 15932,
                                    "src": "1346:11:91",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                                      "typeString": "contract TokenControllerInterface"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                                      "typeString": "contract TokenControllerInterface"
                                    }
                                  ],
                                  "id": 15940,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "1338:7:91",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 15939,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1338:7:91",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 15942,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "1338:20:91",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 15945,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "1370:1:91",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 15944,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "1362:7:91",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 15943,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1362:7:91",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 15946,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "1362:10:91",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "1338:34:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5469636b65742f636f6e74726f6c6c65722d6e6f742d7a65726f",
                              "id": 15948,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1374:28:91",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_6fb6930046a703b597ca62d79453e36d3f474fb54fe10e59b953afc4b4ddc5ec",
                                "typeString": "literal_string \"Ticket/controller-not-zero\""
                              },
                              "value": "Ticket/controller-not-zero"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_6fb6930046a703b597ca62d79453e36d3f474fb54fe10e59b953afc4b4ddc5ec",
                                "typeString": "literal_string \"Ticket/controller-not-zero\""
                              }
                            ],
                            "id": 15938,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1330:7:91",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 15949,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1330:73:91",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15950,
                        "nodeType": "ExpressionStatement",
                        "src": "1330:73:91"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15954,
                              "name": "_name",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15926,
                              "src": "1436:5:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15955,
                              "name": "_symbol",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15928,
                              "src": "1443:7:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15956,
                              "name": "_decimals",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15930,
                              "src": "1452:9:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15957,
                              "name": "_controller",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15932,
                              "src": "1463:11:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                                "typeString": "contract TokenControllerInterface"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              {
                                "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                                "typeString": "contract TokenControllerInterface"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 15951,
                              "name": "ControlledToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15810,
                              "src": "1409:15:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_ControlledToken_$15810_$",
                                "typeString": "type(contract ControlledToken)"
                              }
                            },
                            "id": 15953,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "initialize",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 15698,
                            "src": "1409:26:91",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_uint8_$_t_contract$_TokenControllerInterface_$16206_$returns$__$",
                              "typeString": "function (string memory,string memory,uint8,contract TokenControllerInterface)"
                            }
                          },
                          "id": 15958,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1409:66:91",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15959,
                        "nodeType": "ExpressionStatement",
                        "src": "1409:66:91"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15963,
                              "name": "TREE_KEY",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15907,
                              "src": "1510:8:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15964,
                              "name": "MAX_TREE_LEAVES",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15910,
                              "src": "1520:15:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 15960,
                              "name": "sortitionSumTrees",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15923,
                              "src": "1481:17:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage",
                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees storage ref"
                              }
                            },
                            "id": 15962,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "createTree",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 25154,
                            "src": "1481:28:91",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_SortitionSumTrees_$25087_storage_ptr_$_t_bytes32_$_t_uint256_$returns$__$bound_to$_t_struct$_SortitionSumTrees_$25087_storage_ptr_$",
                              "typeString": "function (struct SortitionSumTreeFactory.SortitionSumTrees storage pointer,bytes32,uint256)"
                            }
                          },
                          "id": 15965,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1481:55:91",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15966,
                        "nodeType": "ExpressionStatement",
                        "src": "1481:55:91"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15968,
                              "name": "_name",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15926,
                              "src": "1566:5:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15969,
                              "name": "_symbol",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15928,
                              "src": "1579:7:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15970,
                              "name": "_decimals",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15930,
                              "src": "1594:9:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 15971,
                              "name": "_controller",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15932,
                              "src": "1611:11:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                                "typeString": "contract TokenControllerInterface"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              },
                              {
                                "typeIdentifier": "t_string_memory_ptr",
                                "typeString": "string memory"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              {
                                "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                                "typeString": "contract TokenControllerInterface"
                              }
                            ],
                            "id": 15967,
                            "name": "Initialized",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              15921
                            ],
                            "referencedDeclaration": 15921,
                            "src": "1547:11:91",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$_t_uint8_$_t_contract$_TokenControllerInterface_$16206_$returns$__$",
                              "typeString": "function (string memory,string memory,uint8,contract TokenControllerInterface)"
                            }
                          },
                          "id": 15972,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1547:81:91",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 15973,
                        "nodeType": "EmitStatement",
                        "src": "1542:86:91"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15924,
                    "nodeType": "StructuredDocumentation",
                    "src": "817:311:91",
                    "text": "@notice Initializes the Controlled Token with Token Details and the Controller\n @param _name The name of the Token\n @param _symbol The symbol for the Token\n @param _decimals The number of decimals for the Token\n @param _controller Address of the Controller contract for minting & burning"
                  },
                  "functionSelector": "de7ea79d",
                  "id": 15975,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [
                    {
                      "arguments": null,
                      "id": 15936,
                      "modifierName": {
                        "argumentTypes": null,
                        "id": 15935,
                        "name": "initializer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 1335,
                        "src": "1310:11:91",
                        "typeDescriptions": {
                          "typeIdentifier": "t_modifier$__$",
                          "typeString": "modifier ()"
                        }
                      },
                      "nodeType": "ModifierInvocation",
                      "src": "1310:11:91"
                    }
                  ],
                  "name": "initialize",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 15934,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "1297:8:91"
                  },
                  "parameters": {
                    "id": 15933,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15926,
                        "mutability": "mutable",
                        "name": "_name",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15975,
                        "src": "1156:19:91",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 15925,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "1156:6:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15928,
                        "mutability": "mutable",
                        "name": "_symbol",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15975,
                        "src": "1181:21:91",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 15927,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "1181:6:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15930,
                        "mutability": "mutable",
                        "name": "_decimals",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15975,
                        "src": "1208:15:91",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "typeName": {
                          "id": 15929,
                          "name": "uint8",
                          "nodeType": "ElementaryTypeName",
                          "src": "1208:5:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 15932,
                        "mutability": "mutable",
                        "name": "_controller",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15975,
                        "src": "1229:36:91",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                          "typeString": "contract TokenControllerInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 15931,
                          "name": "TokenControllerInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16206,
                          "src": "1229:24:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_TokenControllerInterface_$16206",
                            "typeString": "contract TokenControllerInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1150:119:91"
                  },
                  "returnParameters": {
                    "id": 15937,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1324:0:91"
                  },
                  "scope": 16140,
                  "src": "1131:502:91",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 15995,
                    "nodeType": "Block",
                    "src": "1753:77:91",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 15985,
                              "name": "TREE_KEY",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15907,
                              "src": "1792:8:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 15990,
                                      "name": "user",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 15978,
                                      "src": "1818:4:91",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    ],
                                    "id": 15989,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "1810:7:91",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_uint256_$",
                                      "typeString": "type(uint256)"
                                    },
                                    "typeName": {
                                      "id": 15988,
                                      "name": "uint256",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "1810:7:91",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 15991,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "1810:13:91",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 15987,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "1802:7:91",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_bytes32_$",
                                  "typeString": "type(bytes32)"
                                },
                                "typeName": {
                                  "id": 15986,
                                  "name": "bytes32",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "1802:7:91",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 15992,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1802:22:91",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 15983,
                              "name": "sortitionSumTrees",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 15923,
                              "src": "1766:17:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage",
                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees storage ref"
                              }
                            },
                            "id": 15984,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "stakeOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 25695,
                            "src": "1766:25:91",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_struct$_SortitionSumTrees_$25087_storage_ptr_$_t_bytes32_$_t_bytes32_$returns$_t_uint256_$bound_to$_t_struct$_SortitionSumTrees_$25087_storage_ptr_$",
                              "typeString": "function (struct SortitionSumTreeFactory.SortitionSumTrees storage pointer,bytes32,bytes32) view returns (uint256)"
                            }
                          },
                          "id": 15993,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1766:59:91",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 15982,
                        "id": 15994,
                        "nodeType": "Return",
                        "src": "1759:66:91"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15976,
                    "nodeType": "StructuredDocumentation",
                    "src": "1637:49:91",
                    "text": "@notice Returns the user's chance of winning."
                  },
                  "functionSelector": "885d194d",
                  "id": 15996,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "chanceOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 15979,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15978,
                        "mutability": "mutable",
                        "name": "user",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15996,
                        "src": "1707:12:91",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 15977,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1707:7:91",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1706:14:91"
                  },
                  "returnParameters": {
                    "id": 15982,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15981,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 15996,
                        "src": "1744:7:91",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 15980,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1744:7:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1743:9:91"
                  },
                  "scope": 16140,
                  "src": "1689:141:91",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    16151
                  ],
                  "body": {
                    "id": 16050,
                    "nodeType": "Block",
                    "src": "2129:301:91",
                    "statements": [
                      {
                        "assignments": [
                          16006
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 16006,
                            "mutability": "mutable",
                            "name": "bound",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 16050,
                            "src": "2135:13:91",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 16005,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "2135:7:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 16009,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 16007,
                            "name": "totalSupply",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1464,
                            "src": "2151:11:91",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$",
                              "typeString": "function () view returns (uint256)"
                            }
                          },
                          "id": 16008,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2151:13:91",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2135:29:91"
                      },
                      {
                        "assignments": [
                          16011
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 16011,
                            "mutability": "mutable",
                            "name": "selected",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 16050,
                            "src": "2170:16:91",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 16010,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "2170:7:91",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 16012,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2170:16:91"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 16015,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 16013,
                            "name": "bound",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 16006,
                            "src": "2196:5:91",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 16014,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "2205:1:91",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "2196:10:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 16046,
                          "nodeType": "Block",
                          "src": "2250:155:91",
                          "statements": [
                            {
                              "assignments": [
                                16025
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 16025,
                                  "mutability": "mutable",
                                  "name": "token",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 16046,
                                  "src": "2258:13:91",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 16024,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "2258:7:91",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 16031,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 16028,
                                    "name": "randomNumber",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 15999,
                                    "src": "2302:12:91",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 16029,
                                    "name": "bound",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 16006,
                                    "src": "2316:5:91",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 16026,
                                    "name": "UniformRandomNumber",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 5589,
                                    "src": "2274:19:91",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_UniformRandomNumber_$5589_$",
                                      "typeString": "type(library UniformRandomNumber)"
                                    }
                                  },
                                  "id": 16027,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "uniform",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 5588,
                                  "src": "2274:27:91",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                                    "typeString": "function (uint256,uint256) pure returns (uint256)"
                                  }
                                },
                                "id": 16030,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "2274:48:91",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "2258:64:91"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 16044,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 16032,
                                  "name": "selected",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16011,
                                  "src": "2330:8:91",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "arguments": [
                                            {
                                              "argumentTypes": null,
                                              "id": 16039,
                                              "name": "TREE_KEY",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 15907,
                                              "src": "2380:8:91",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_bytes32",
                                                "typeString": "bytes32"
                                              }
                                            },
                                            {
                                              "argumentTypes": null,
                                              "id": 16040,
                                              "name": "token",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 16025,
                                              "src": "2390:5:91",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            }
                                          ],
                                          "expression": {
                                            "argumentTypes": [
                                              {
                                                "typeIdentifier": "t_bytes32",
                                                "typeString": "bytes32"
                                              },
                                              {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 16037,
                                              "name": "sortitionSumTrees",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 15923,
                                              "src": "2357:17:91",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage",
                                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees storage ref"
                                              }
                                            },
                                            "id": 16038,
                                            "isConstant": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "draw",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 25653,
                                            "src": "2357:22:91",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_function_internal_view$_t_struct$_SortitionSumTrees_$25087_storage_ptr_$_t_bytes32_$_t_uint256_$returns$_t_bytes32_$bound_to$_t_struct$_SortitionSumTrees_$25087_storage_ptr_$",
                                              "typeString": "function (struct SortitionSumTreeFactory.SortitionSumTrees storage pointer,bytes32,uint256) view returns (bytes32)"
                                            }
                                          },
                                          "id": 16041,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "kind": "functionCall",
                                          "lValueRequested": false,
                                          "names": [],
                                          "nodeType": "FunctionCall",
                                          "src": "2357:39:91",
                                          "tryCall": false,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                          }
                                        ],
                                        "id": 16036,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "2349:7:91",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_uint256_$",
                                          "typeString": "type(uint256)"
                                        },
                                        "typeName": {
                                          "id": 16035,
                                          "name": "uint256",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "2349:7:91",
                                          "typeDescriptions": {
                                            "typeIdentifier": null,
                                            "typeString": null
                                          }
                                        }
                                      },
                                      "id": 16042,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "2349:48:91",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    ],
                                    "id": 16034,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "2341:7:91",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 16033,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "2341:7:91",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 16043,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "2341:57:91",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "src": "2330:68:91",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 16045,
                              "nodeType": "ExpressionStatement",
                              "src": "2330:68:91"
                            }
                          ]
                        },
                        "id": 16047,
                        "nodeType": "IfStatement",
                        "src": "2192:213:91",
                        "trueBody": {
                          "id": 16023,
                          "nodeType": "Block",
                          "src": "2208:36:91",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 16021,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 16016,
                                  "name": "selected",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16011,
                                  "src": "2216:8:91",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "30",
                                      "id": 16019,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "2235:1:91",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      },
                                      "value": "0"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      }
                                    ],
                                    "id": 16018,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "2227:7:91",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 16017,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "2227:7:91",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 16020,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "2227:10:91",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "src": "2216:21:91",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 16022,
                              "nodeType": "ExpressionStatement",
                              "src": "2216:21:91"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 16048,
                          "name": "selected",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 16011,
                          "src": "2417:8:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "functionReturnParameters": 16004,
                        "id": 16049,
                        "nodeType": "Return",
                        "src": "2410:15:91"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 15997,
                    "nodeType": "StructuredDocumentation",
                    "src": "1834:215:91",
                    "text": "@notice Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\n @param randomNumber The random number to use to select a user.\n @return The winner"
                  },
                  "functionSelector": "3b304147",
                  "id": 16051,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "draw",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 16001,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "2102:8:91"
                  },
                  "parameters": {
                    "id": 16000,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 15999,
                        "mutability": "mutable",
                        "name": "randomNumber",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16051,
                        "src": "2066:20:91",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 15998,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2066:7:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2065:22:91"
                  },
                  "returnParameters": {
                    "id": 16004,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16003,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16051,
                        "src": "2120:7:91",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16002,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2120:7:91",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2119:9:91"
                  },
                  "scope": 16140,
                  "src": "2052:378:91",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    15809
                  ],
                  "body": {
                    "id": 16138,
                    "nodeType": "Block",
                    "src": "2988:470:91",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 16065,
                              "name": "from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16054,
                              "src": "3021:4:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 16066,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16056,
                              "src": "3027:2:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 16067,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16058,
                              "src": "3031:6:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 16062,
                              "name": "super",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -25,
                              "src": "2994:5:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_super$_Ticket_$16140",
                                "typeString": "contract super Ticket"
                              }
                            },
                            "id": 16064,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "_beforeTokenTransfer",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 15809,
                            "src": "2994:26:91",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,address,uint256)"
                            }
                          },
                          "id": 16068,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2994:44:91",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 16069,
                        "nodeType": "ExpressionStatement",
                        "src": "2994:44:91"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 16072,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 16070,
                            "name": "from",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 16054,
                            "src": "3091:4:91",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 16071,
                            "name": "to",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 16056,
                            "src": "3099:2:91",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "3091:10:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 16075,
                        "nodeType": "IfStatement",
                        "src": "3087:37:91",
                        "trueBody": {
                          "id": 16074,
                          "nodeType": "Block",
                          "src": "3103:21:91",
                          "statements": [
                            {
                              "expression": null,
                              "functionReturnParameters": 16061,
                              "id": 16073,
                              "nodeType": "Return",
                              "src": "3111:7:91"
                            }
                          ]
                        }
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 16081,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 16076,
                            "name": "from",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 16054,
                            "src": "3134:4:91",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 16079,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "3150:1:91",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                }
                              ],
                              "id": 16078,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "3142:7:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 16077,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "3142:7:91",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 16080,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "3142:10:91",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "src": "3134:18:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 16106,
                        "nodeType": "IfStatement",
                        "src": "3130:164:91",
                        "trueBody": {
                          "id": 16105,
                          "nodeType": "Block",
                          "src": "3154:140:91",
                          "statements": [
                            {
                              "assignments": [
                                16083
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 16083,
                                  "mutability": "mutable",
                                  "name": "fromBalance",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 16105,
                                  "src": "3162:19:91",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 16082,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "3162:7:91",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 16090,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 16088,
                                    "name": "amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 16058,
                                    "src": "3204:6:91",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 16085,
                                        "name": "from",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 16054,
                                        "src": "3194:4:91",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "id": 16084,
                                      "name": "balanceOf",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1478,
                                      "src": "3184:9:91",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_uint256_$",
                                        "typeString": "function (address) view returns (uint256)"
                                      }
                                    },
                                    "id": 16086,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "3184:15:91",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 16087,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sub",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1135,
                                  "src": "3184:19:91",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256,uint256) pure returns (uint256)"
                                  }
                                },
                                "id": 16089,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "3184:27:91",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "3162:49:91"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 16094,
                                    "name": "TREE_KEY",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 15907,
                                    "src": "3241:8:91",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 16095,
                                    "name": "fromBalance",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 16083,
                                    "src": "3251:11:91",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 16100,
                                            "name": "from",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 16054,
                                            "src": "3280:4:91",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            }
                                          ],
                                          "id": 16099,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "nodeType": "ElementaryTypeNameExpression",
                                          "src": "3272:7:91",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_type$_t_uint256_$",
                                            "typeString": "type(uint256)"
                                          },
                                          "typeName": {
                                            "id": 16098,
                                            "name": "uint256",
                                            "nodeType": "ElementaryTypeName",
                                            "src": "3272:7:91",
                                            "typeDescriptions": {
                                              "typeIdentifier": null,
                                              "typeString": null
                                            }
                                          }
                                        },
                                        "id": 16101,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "typeConversion",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "3272:13:91",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "id": 16097,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "3264:7:91",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_bytes32_$",
                                        "typeString": "type(bytes32)"
                                      },
                                      "typeName": {
                                        "id": 16096,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3264:7:91",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 16102,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "3264:22:91",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 16091,
                                    "name": "sortitionSumTrees",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 15923,
                                    "src": "3219:17:91",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage",
                                      "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees storage ref"
                                    }
                                  },
                                  "id": 16093,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "set",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 25430,
                                  "src": "3219:21:91",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_SortitionSumTrees_$25087_storage_ptr_$_t_bytes32_$_t_uint256_$_t_bytes32_$returns$__$bound_to$_t_struct$_SortitionSumTrees_$25087_storage_ptr_$",
                                    "typeString": "function (struct SortitionSumTreeFactory.SortitionSumTrees storage pointer,bytes32,uint256,bytes32)"
                                  }
                                },
                                "id": 16103,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "3219:68:91",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 16104,
                              "nodeType": "ExpressionStatement",
                              "src": "3219:68:91"
                            }
                          ]
                        }
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          "id": 16112,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 16107,
                            "name": "to",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 16056,
                            "src": "3304:2:91",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 16110,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "3318:1:91",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                }
                              ],
                              "id": 16109,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "3310:7:91",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 16108,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "3310:7:91",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 16111,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "3310:10:91",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          },
                          "src": "3304:16:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 16137,
                        "nodeType": "IfStatement",
                        "src": "3300:154:91",
                        "trueBody": {
                          "id": 16136,
                          "nodeType": "Block",
                          "src": "3322:132:91",
                          "statements": [
                            {
                              "assignments": [
                                16114
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 16114,
                                  "mutability": "mutable",
                                  "name": "toBalance",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 16136,
                                  "src": "3330:17:91",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "typeName": {
                                    "id": 16113,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "3330:7:91",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 16121,
                              "initialValue": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 16119,
                                    "name": "amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 16058,
                                    "src": "3368:6:91",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 16116,
                                        "name": "to",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 16056,
                                        "src": "3360:2:91",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_address",
                                          "typeString": "address"
                                        }
                                      ],
                                      "id": 16115,
                                      "name": "balanceOf",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 1478,
                                      "src": "3350:9:91",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_uint256_$",
                                        "typeString": "function (address) view returns (uint256)"
                                      }
                                    },
                                    "id": 16117,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "3350:13:91",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 16118,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "add",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 1113,
                                  "src": "3350:17:91",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256,uint256) pure returns (uint256)"
                                  }
                                },
                                "id": 16120,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "3350:25:91",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "3330:45:91"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 16125,
                                    "name": "TREE_KEY",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 15907,
                                    "src": "3405:8:91",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "id": 16126,
                                    "name": "toBalance",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 16114,
                                    "src": "3415:9:91",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 16131,
                                            "name": "to",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 16056,
                                            "src": "3442:2:91",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_address",
                                              "typeString": "address"
                                            }
                                          ],
                                          "id": 16130,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "lValueRequested": false,
                                          "nodeType": "ElementaryTypeNameExpression",
                                          "src": "3434:7:91",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_type$_t_uint256_$",
                                            "typeString": "type(uint256)"
                                          },
                                          "typeName": {
                                            "id": 16129,
                                            "name": "uint256",
                                            "nodeType": "ElementaryTypeName",
                                            "src": "3434:7:91",
                                            "typeDescriptions": {
                                              "typeIdentifier": null,
                                              "typeString": null
                                            }
                                          }
                                        },
                                        "id": 16132,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "typeConversion",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "3434:11:91",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "id": 16128,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "3426:7:91",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_bytes32_$",
                                        "typeString": "type(bytes32)"
                                      },
                                      "typeName": {
                                        "id": 16127,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "3426:7:91",
                                        "typeDescriptions": {
                                          "typeIdentifier": null,
                                          "typeString": null
                                        }
                                      }
                                    },
                                    "id": 16133,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "3426:20:91",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    },
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 16122,
                                    "name": "sortitionSumTrees",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 15923,
                                    "src": "3383:17:91",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage",
                                      "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees storage ref"
                                    }
                                  },
                                  "id": 16124,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "set",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 25430,
                                  "src": "3383:21:91",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_SortitionSumTrees_$25087_storage_ptr_$_t_bytes32_$_t_uint256_$_t_bytes32_$returns$__$bound_to$_t_struct$_SortitionSumTrees_$25087_storage_ptr_$",
                                    "typeString": "function (struct SortitionSumTreeFactory.SortitionSumTrees storage pointer,bytes32,uint256,bytes32)"
                                  }
                                },
                                "id": 16134,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "3383:64:91",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 16135,
                              "nodeType": "ExpressionStatement",
                              "src": "3383:64:91"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 16052,
                    "nodeType": "StructuredDocumentation",
                    "src": "2434:453:91",
                    "text": "@dev Controller hook to provide notifications & rule validations on token transfers to the controller.\n This includes minting and burning.\n May be overridden to provide more granular control over operator-burning\n @param from Address of the account sending the tokens (address(0x0) on minting)\n @param to Address of the account receiving the tokens (address(0x0) on burning)\n @param amount Amount of tokens being transferred"
                  },
                  "id": 16139,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_beforeTokenTransfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 16060,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "2979:8:91"
                  },
                  "parameters": {
                    "id": 16059,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16054,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16139,
                        "src": "2920:12:91",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16053,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2920:7:91",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 16056,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16139,
                        "src": "2934:10:91",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16055,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2934:7:91",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 16058,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16139,
                        "src": "2946:14:91",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 16057,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2946:7:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2919:42:91"
                  },
                  "returnParameters": {
                    "id": 16061,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2988:0:91"
                  },
                  "scope": 16140,
                  "src": "2890:568:91",
                  "stateMutability": "nonpayable",
                  "virtual": true,
                  "visibility": "internal"
                }
              ],
              "scope": 16141,
              "src": "283:3178:91"
            }
          ],
          "src": "37:3424:91"
        },
        "id": 91
      },
      "contracts/token/TicketInterface.sol": {
        "ast": {
          "absolutePath": "contracts/token/TicketInterface.sol",
          "exportedSymbols": {
            "TicketInterface": [
              16152
            ]
          },
          "id": 16153,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 16142,
              "literals": [
                "solidity",
                ">=",
                "0.5",
                ".0",
                "<",
                "0.7",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:31:92"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": {
                "id": 16143,
                "nodeType": "StructuredDocumentation",
                "src": "70:74:92",
                "text": "@title Interface that allows a user to draw an address using an index"
              },
              "fullyImplemented": false,
              "id": 16152,
              "linearizedBaseContracts": [
                16152
              ],
              "name": "TicketInterface",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 16144,
                    "nodeType": "StructuredDocumentation",
                    "src": "174:215:92",
                    "text": "@notice Selects a user using a random number.  The random number will be uniformly bounded to the ticket totalSupply.\n @param randomNumber The random number to use to select a user.\n @return The winner"
                  },
                  "functionSelector": "3b304147",
                  "id": 16151,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "draw",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 16147,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16146,
                        "mutability": "mutable",
                        "name": "randomNumber",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16151,
                        "src": "406:20:92",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 16145,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "406:7:92",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "405:22:92"
                  },
                  "returnParameters": {
                    "id": 16150,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16149,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16151,
                        "src": "451:7:92",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16148,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "451:7:92",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "450:9:92"
                  },
                  "scope": 16152,
                  "src": "392:68:92",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 16153,
              "src": "144:318:92"
            }
          ],
          "src": "37:425:92"
        },
        "id": 92
      },
      "contracts/token/TicketProxyFactory.sol": {
        "ast": {
          "absolutePath": "contracts/token/TicketProxyFactory.sol",
          "exportedSymbols": {
            "TicketProxyFactory": [
              16192
            ]
          },
          "id": 16193,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 16154,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:93"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol",
              "file": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol",
              "id": 16155,
              "nodeType": "ImportDirective",
              "scope": 16193,
              "sourceUnit": 1353,
              "src": "62:69:93",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/token/Ticket.sol",
              "file": "./Ticket.sol",
              "id": 16156,
              "nodeType": "ImportDirective",
              "scope": 16193,
              "sourceUnit": 16141,
              "src": "133:22:93",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/external/openzeppelin/ProxyFactory.sol",
              "file": "../external/openzeppelin/ProxyFactory.sol",
              "id": 16157,
              "nodeType": "ImportDirective",
              "scope": 16193,
              "sourceUnit": 6617,
              "src": "156:51:93",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 16159,
                    "name": "ProxyFactory",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 6616,
                    "src": "357:12:93",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ProxyFactory_$6616",
                      "typeString": "contract ProxyFactory"
                    }
                  },
                  "id": 16160,
                  "nodeType": "InheritanceSpecifier",
                  "src": "357:12:93"
                }
              ],
              "contractDependencies": [
                6616,
                16140
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 16158,
                "nodeType": "StructuredDocumentation",
                "src": "209:117:93",
                "text": "@title Controlled ERC20 Token Factory\n @notice Minimal proxy pattern for creating new Controlled ERC20 Tokens"
              },
              "fullyImplemented": true,
              "id": 16192,
              "linearizedBaseContracts": [
                16192,
                6616
              ],
              "name": "TicketProxyFactory",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": false,
                  "documentation": {
                    "id": 16161,
                    "nodeType": "StructuredDocumentation",
                    "src": "375:58:93",
                    "text": "@notice Contract template for deploying proxied tokens"
                  },
                  "functionSelector": "022ec095",
                  "id": 16163,
                  "mutability": "mutable",
                  "name": "instance",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 16192,
                  "src": "436:22:93",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_Ticket_$16140",
                    "typeString": "contract Ticket"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 16162,
                    "name": "Ticket",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 16140,
                    "src": "436:6:93",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Ticket_$16140",
                      "typeString": "contract Ticket"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 16173,
                    "nodeType": "Block",
                    "src": "570:34:93",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 16171,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 16167,
                            "name": "instance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 16163,
                            "src": "576:8:93",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_Ticket_$16140",
                              "typeString": "contract Ticket"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [],
                            "expression": {
                              "argumentTypes": [],
                              "id": 16169,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "587:10:93",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_creation_nonpayable$__$returns$_t_contract$_Ticket_$16140_$",
                                "typeString": "function () returns (contract Ticket)"
                              },
                              "typeName": {
                                "contractScope": null,
                                "id": 16168,
                                "name": "Ticket",
                                "nodeType": "UserDefinedTypeName",
                                "referencedDeclaration": 16140,
                                "src": "591:6:93",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_Ticket_$16140",
                                  "typeString": "contract Ticket"
                                }
                              }
                            },
                            "id": 16170,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "587:12:93",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_Ticket_$16140",
                              "typeString": "contract Ticket"
                            }
                          },
                          "src": "576:23:93",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_Ticket_$16140",
                            "typeString": "contract Ticket"
                          }
                        },
                        "id": 16172,
                        "nodeType": "ExpressionStatement",
                        "src": "576:23:93"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 16164,
                    "nodeType": "StructuredDocumentation",
                    "src": "463:82:93",
                    "text": "@notice Initializes the Factory with an instance of the Controlled ERC20 Token"
                  },
                  "id": 16174,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 16165,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "560:2:93"
                  },
                  "returnParameters": {
                    "id": 16166,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "570:0:93"
                  },
                  "scope": 16192,
                  "src": "548:56:93",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 16190,
                    "nodeType": "Block",
                    "src": "807:62:93",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 16184,
                                      "name": "instance",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 16163,
                                      "src": "849:8:93",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_Ticket_$16140",
                                        "typeString": "contract Ticket"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_Ticket_$16140",
                                        "typeString": "contract Ticket"
                                      }
                                    ],
                                    "id": 16183,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "841:7:93",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 16182,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "841:7:93",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 16185,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "841:17:93",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "hexValue": "",
                                  "id": 16186,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "860:2:93",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                    "typeString": "literal_string \"\""
                                  },
                                  "value": ""
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                    "typeString": "literal_string \"\""
                                  }
                                ],
                                "id": 16181,
                                "name": "deployMinimal",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 6615,
                                "src": "827:13:93",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_memory_ptr_$returns$_t_address_$",
                                  "typeString": "function (address,bytes memory) returns (address)"
                                }
                              },
                              "id": 16187,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "827:36:93",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 16180,
                            "name": "Ticket",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 16140,
                            "src": "820:6:93",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_Ticket_$16140_$",
                              "typeString": "type(contract Ticket)"
                            }
                          },
                          "id": 16188,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "820:44:93",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_Ticket_$16140",
                            "typeString": "contract Ticket"
                          }
                        },
                        "functionReturnParameters": 16179,
                        "id": 16189,
                        "nodeType": "Return",
                        "src": "813:51:93"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 16175,
                    "nodeType": "StructuredDocumentation",
                    "src": "608:152:93",
                    "text": "@notice Creates a new Controlled ERC20 Token as a proxy of the template instance\n @return A reference to the new proxied Controlled ERC20 Token"
                  },
                  "functionSelector": "efc81a8c",
                  "id": 16191,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "create",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 16176,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "778:2:93"
                  },
                  "returnParameters": {
                    "id": 16179,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16178,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16191,
                        "src": "799:6:93",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_Ticket_$16140",
                          "typeString": "contract Ticket"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 16177,
                          "name": "Ticket",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16140,
                          "src": "799:6:93",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_Ticket_$16140",
                            "typeString": "contract Ticket"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "798:8:93"
                  },
                  "scope": 16192,
                  "src": "763:106:93",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 16193,
              "src": "326:545:93"
            }
          ],
          "src": "37:835:93"
        },
        "id": 93
      },
      "contracts/token/TokenControllerInterface.sol": {
        "ast": {
          "absolutePath": "contracts/token/TokenControllerInterface.sol",
          "exportedSymbols": {
            "TokenControllerInterface": [
              16206
            ]
          },
          "id": 16207,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 16194,
              "literals": [
                "solidity",
                ">=",
                "0.5",
                ".0",
                "<",
                "0.7",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:31:94"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "interface",
              "documentation": {
                "id": 16195,
                "nodeType": "StructuredDocumentation",
                "src": "70:207:94",
                "text": "@title Controlled ERC20 Token Interface\n @notice Required interface for Controlled ERC20 Tokens linked to a Prize Pool\n @dev Defines the spec required to be implemented by a Controlled ERC20 Token"
              },
              "fullyImplemented": false,
              "id": 16206,
              "linearizedBaseContracts": [
                16206
              ],
              "name": "TokenControllerInterface",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 16196,
                    "nodeType": "StructuredDocumentation",
                    "src": "317:374:94",
                    "text": "@dev Controller hook to provide notifications & rule validations on token transfers to the controller.\n This includes minting and burning.\n @param from Address of the account sending the tokens (address(0x0) on minting)\n @param to Address of the account receiving the tokens (address(0x0) on burning)\n @param amount Amount of tokens being transferred"
                  },
                  "functionSelector": "7cbab1c7",
                  "id": 16205,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "beforeTokenTransfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 16203,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16198,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16205,
                        "src": "723:12:94",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16197,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "723:7:94",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 16200,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16205,
                        "src": "737:10:94",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16199,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "737:7:94",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 16202,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16205,
                        "src": "749:14:94",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 16201,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "749:7:94",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "722:42:94"
                  },
                  "returnParameters": {
                    "id": 16204,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "773:0:94"
                  },
                  "scope": 16206,
                  "src": "694:80:94",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 16207,
              "src": "277:499:94"
            }
          ],
          "src": "37:740:94"
        },
        "id": 94
      },
      "contracts/token/TokenListener.sol": {
        "ast": {
          "absolutePath": "contracts/token/TokenListener.sol",
          "exportedSymbols": {
            "TokenListener": [
              16234
            ]
          },
          "id": 16235,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 16208,
              "literals": [
                "solidity",
                "^",
                "0.6",
                ".4"
              ],
              "nodeType": "PragmaDirective",
              "src": "0:23:95"
            },
            {
              "absolutePath": "contracts/token/TokenListenerInterface.sol",
              "file": "./TokenListenerInterface.sol",
              "id": 16209,
              "nodeType": "ImportDirective",
              "scope": 16235,
              "sourceUnit": 16266,
              "src": "25:38:95",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/token/TokenListenerLibrary.sol",
              "file": "./TokenListenerLibrary.sol",
              "id": 16210,
              "nodeType": "ImportDirective",
              "scope": 16235,
              "sourceUnit": 16272,
              "src": "64:36:95",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/Constants.sol",
              "file": "../Constants.sol",
              "id": 16211,
              "nodeType": "ImportDirective",
              "scope": 16235,
              "sourceUnit": 5633,
              "src": "101:26:95",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": true,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 16212,
                    "name": "TokenListenerInterface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 16265,
                    "src": "164:22:95",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_TokenListenerInterface_$16265",
                      "typeString": "contract TokenListenerInterface"
                    }
                  },
                  "id": 16213,
                  "nodeType": "InheritanceSpecifier",
                  "src": "164:22:95"
                }
              ],
              "contractDependencies": [
                931,
                16265
              ],
              "contractKind": "contract",
              "documentation": null,
              "fullyImplemented": false,
              "id": 16234,
              "linearizedBaseContracts": [
                16234,
                16265,
                931
              ],
              "name": "TokenListener",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "baseFunctions": [
                    930
                  ],
                  "body": {
                    "id": 16232,
                    "nodeType": "Block",
                    "src": "276:164:95",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "components": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 16229,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_bytes4",
                                  "typeString": "bytes4"
                                },
                                "id": 16224,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 16221,
                                  "name": "interfaceId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16215,
                                  "src": "297:11:95",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 16222,
                                    "name": "Constants",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 5632,
                                    "src": "312:9:95",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_Constants_$5632_$",
                                      "typeString": "type(library Constants)"
                                    }
                                  },
                                  "id": 16223,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "ERC165_INTERFACE_ID_ERC165",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 5628,
                                  "src": "312:36:95",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                "src": "297:51:95",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "||",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_bytes4",
                                  "typeString": "bytes4"
                                },
                                "id": 16228,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 16225,
                                  "name": "interfaceId",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16215,
                                  "src": "359:11:95",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 16226,
                                    "name": "TokenListenerLibrary",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 16271,
                                    "src": "374:20:95",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_contract$_TokenListenerLibrary_$16271_$",
                                      "typeString": "type(library TokenListenerLibrary)"
                                    }
                                  },
                                  "id": 16227,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "ERC165_INTERFACE_ID_TOKEN_LISTENER",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 16270,
                                  "src": "374:55:95",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                },
                                "src": "359:70:95",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "297:132:95",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            }
                          ],
                          "id": 16230,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "289:146:95",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 16220,
                        "id": 16231,
                        "nodeType": "Return",
                        "src": "282:153:95"
                      }
                    ]
                  },
                  "documentation": null,
                  "functionSelector": "01ffc9a7",
                  "id": 16233,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "supportsInterface",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 16217,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "247:8:95"
                  },
                  "parameters": {
                    "id": 16216,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16215,
                        "mutability": "mutable",
                        "name": "interfaceId",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16233,
                        "src": "218:18:95",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        },
                        "typeName": {
                          "id": 16214,
                          "name": "bytes4",
                          "nodeType": "ElementaryTypeName",
                          "src": "218:6:95",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes4",
                            "typeString": "bytes4"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "217:20:95"
                  },
                  "returnParameters": {
                    "id": 16220,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16219,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16233,
                        "src": "270:4:95",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 16218,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "270:4:95",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "269:6:95"
                  },
                  "scope": 16234,
                  "src": "191:249:95",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 16235,
              "src": "129:313:95"
            }
          ],
          "src": "0:443:95"
        },
        "id": 95
      },
      "contracts/token/TokenListenerInterface.sol": {
        "ast": {
          "absolutePath": "contracts/token/TokenListenerInterface.sol",
          "exportedSymbols": {
            "TokenListenerInterface": [
              16265
            ]
          },
          "id": 16266,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 16236,
              "literals": [
                "solidity",
                ">=",
                "0.5",
                ".0",
                "<",
                "0.7",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:31:96"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol",
              "id": 16237,
              "nodeType": "ImportDirective",
              "scope": 16266,
              "sourceUnit": 932,
              "src": "70:82:96",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 16239,
                    "name": "IERC165Upgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 931,
                    "src": "288:18:96",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC165Upgradeable_$931",
                      "typeString": "contract IERC165Upgradeable"
                    }
                  },
                  "id": 16240,
                  "nodeType": "InheritanceSpecifier",
                  "src": "288:18:96"
                }
              ],
              "contractDependencies": [
                931
              ],
              "contractKind": "interface",
              "documentation": {
                "id": 16238,
                "nodeType": "StructuredDocumentation",
                "src": "154:98:96",
                "text": "@title An interface that allows a contract to listen to token mint, transfer and burn events."
              },
              "fullyImplemented": false,
              "id": 16265,
              "linearizedBaseContracts": [
                16265,
                931
              ],
              "name": "TokenListenerInterface",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": null,
                  "documentation": {
                    "id": 16241,
                    "nodeType": "StructuredDocumentation",
                    "src": "311:298:96",
                    "text": "@notice Called when tokens are minted.\n @param to The address of the receiver of the minted tokens.\n @param amount The amount of tokens being minted\n @param controlledToken The address of the token that is being minted\n @param referrer The address that referred the minting."
                  },
                  "functionSelector": "4d7f3db0",
                  "id": 16252,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "beforeTokenMint",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 16250,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16243,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16252,
                        "src": "637:10:96",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16242,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "637:7:96",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 16245,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16252,
                        "src": "649:14:96",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 16244,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "649:7:96",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 16247,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16252,
                        "src": "665:23:96",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16246,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "665:7:96",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 16249,
                        "mutability": "mutable",
                        "name": "referrer",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16252,
                        "src": "690:16:96",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16248,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "690:7:96",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "636:71:96"
                  },
                  "returnParameters": {
                    "id": 16251,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "716:0:96"
                  },
                  "scope": 16265,
                  "src": "612:105:96",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "body": null,
                  "documentation": {
                    "id": 16253,
                    "nodeType": "StructuredDocumentation",
                    "src": "721:356:96",
                    "text": "@notice Called when tokens are transferred or burned.\n @param from The address of the sender of the token transfer\n @param to The address of the receiver of the token transfer.  Will be the zero address if burning.\n @param amount The amount of tokens transferred\n @param controlledToken The address of the token that was transferred"
                  },
                  "functionSelector": "b2210957",
                  "id": 16264,
                  "implemented": false,
                  "kind": "function",
                  "modifiers": [],
                  "name": "beforeTokenTransfer",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 16262,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16255,
                        "mutability": "mutable",
                        "name": "from",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16264,
                        "src": "1109:12:96",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16254,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1109:7:96",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 16257,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16264,
                        "src": "1123:10:96",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16256,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1123:7:96",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 16259,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16264,
                        "src": "1135:14:96",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 16258,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "1135:7:96",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 16261,
                        "mutability": "mutable",
                        "name": "controlledToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16264,
                        "src": "1151:23:96",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16260,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1151:7:96",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1108:67:96"
                  },
                  "returnParameters": {
                    "id": 16263,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1184:0:96"
                  },
                  "scope": 16265,
                  "src": "1080:105:96",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 16266,
              "src": "252:935:96"
            }
          ],
          "src": "37:1151:96"
        },
        "id": 96
      },
      "contracts/token/TokenListenerLibrary.sol": {
        "ast": {
          "absolutePath": "contracts/token/TokenListenerLibrary.sol",
          "exportedSymbols": {
            "TokenListenerLibrary": [
              16271
            ]
          },
          "id": 16272,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 16267,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "0:23:97"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": null,
              "fullyImplemented": true,
              "id": 16271,
              "linearizedBaseContracts": [
                16271
              ],
              "name": "TokenListenerLibrary",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": true,
                  "functionSelector": "b17b0ce3",
                  "id": 16270,
                  "mutability": "constant",
                  "name": "ERC165_INTERFACE_ID_TOKEN_LISTENER",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 16271,
                  "src": "319:70:97",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes4",
                    "typeString": "bytes4"
                  },
                  "typeName": {
                    "id": 16268,
                    "name": "bytes4",
                    "nodeType": "ElementaryTypeName",
                    "src": "319:6:97",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes4",
                      "typeString": "bytes4"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "hexValue": "30786666356533346537",
                    "id": 16269,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "number",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "379:10:97",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_rational_4284364007_by_1",
                      "typeString": "int_const 4284364007"
                    },
                    "value": "0xff5e34e7"
                  },
                  "visibility": "public"
                }
              ],
              "scope": 16272,
              "src": "25:367:97"
            }
          ],
          "src": "0:392:97"
        },
        "id": 97
      },
      "contracts/utils/ExtendedSafeCast.sol": {
        "ast": {
          "absolutePath": "contracts/utils/ExtendedSafeCast.sol",
          "exportedSymbols": {
            "ExtendedSafeCast": [
              16320
            ]
          },
          "id": 16321,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 16273,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:98"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": null,
              "fullyImplemented": true,
              "id": 16320,
              "linearizedBaseContracts": [
                16320
              ],
              "name": "ExtendedSafeCast",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "body": {
                    "id": 16295,
                    "nodeType": "Block",
                    "src": "324:106:98",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 16286,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 16282,
                                "name": "value",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16276,
                                "src": "338:5:98",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_rational_5192296858534827628530496329220096_by_1",
                                  "typeString": "int_const 5192...(26 digits omitted)...0096"
                                },
                                "id": 16285,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "32",
                                  "id": 16283,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "346:1:98",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_2_by_1",
                                    "typeString": "int_const 2"
                                  },
                                  "value": "2"
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "**",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "313132",
                                  "id": 16284,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "349:3:98",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_112_by_1",
                                    "typeString": "int_const 112"
                                  },
                                  "value": "112"
                                },
                                "src": "346:6:98",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_5192296858534827628530496329220096_by_1",
                                  "typeString": "int_const 5192...(26 digits omitted)...0096"
                                }
                              },
                              "src": "338:14:98",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "53616665436173743a2076616c756520646f65736e27742066697420696e20616e2075696e74313132",
                              "id": 16287,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "354:43:98",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_9edb76ad20070eb6dda457f73ad71fbec237d0b9d63a82e48acb4a39bee24b10",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in an uint112\""
                              },
                              "value": "SafeCast: value doesn't fit in an uint112"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_9edb76ad20070eb6dda457f73ad71fbec237d0b9d63a82e48acb4a39bee24b10",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in an uint112\""
                              }
                            ],
                            "id": 16281,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "330:7:98",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 16288,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "330:68:98",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 16289,
                        "nodeType": "ExpressionStatement",
                        "src": "330:68:98"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 16292,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16276,
                              "src": "419:5:98",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 16291,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "411:7:98",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint112_$",
                              "typeString": "type(uint112)"
                            },
                            "typeName": {
                              "id": 16290,
                              "name": "uint112",
                              "nodeType": "ElementaryTypeName",
                              "src": "411:7:98",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 16293,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "411:14:98",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint112",
                            "typeString": "uint112"
                          }
                        },
                        "functionReturnParameters": 16280,
                        "id": 16294,
                        "nodeType": "Return",
                        "src": "404:21:98"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 16274,
                    "nodeType": "StructuredDocumentation",
                    "src": "92:163:98",
                    "text": " @dev Converts an unsigned uint256 into a unsigned uint112.\n Requirements:\n - input must be less than or equal to maxUint112."
                  },
                  "id": 16296,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toUint112",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 16277,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16276,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16296,
                        "src": "277:13:98",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 16275,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "277:7:98",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "276:15:98"
                  },
                  "returnParameters": {
                    "id": 16280,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16279,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16296,
                        "src": "315:7:98",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint112",
                          "typeString": "uint112"
                        },
                        "typeName": {
                          "id": 16278,
                          "name": "uint112",
                          "nodeType": "ElementaryTypeName",
                          "src": "315:7:98",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint112",
                            "typeString": "uint112"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "314:9:98"
                  },
                  "scope": 16320,
                  "src": "258:172:98",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 16318,
                    "nodeType": "Block",
                    "src": "662:103:98",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 16309,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 16305,
                                "name": "value",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16299,
                                "src": "676:5:98",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "<",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_rational_79228162514264337593543950336_by_1",
                                  "typeString": "int_const 79228162514264337593543950336"
                                },
                                "id": 16308,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "32",
                                  "id": 16306,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "684:1:98",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_2_by_1",
                                    "typeString": "int_const 2"
                                  },
                                  "value": "2"
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "**",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "3936",
                                  "id": 16307,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "687:2:98",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_96_by_1",
                                    "typeString": "int_const 96"
                                  },
                                  "value": "96"
                                },
                                "src": "684:5:98",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_79228162514264337593543950336_by_1",
                                  "typeString": "int_const 79228162514264337593543950336"
                                }
                              },
                              "src": "676:13:98",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "53616665436173743a2076616c756520646f65736e27742066697420696e20616e2075696e743936",
                              "id": 16310,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "691:42:98",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_456d06b78a252f02b9728b04b039dfb6347e183d2d22d6eeb98555ad43c0281c",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in an uint96\""
                              },
                              "value": "SafeCast: value doesn't fit in an uint96"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_456d06b78a252f02b9728b04b039dfb6347e183d2d22d6eeb98555ad43c0281c",
                                "typeString": "literal_string \"SafeCast: value doesn't fit in an uint96\""
                              }
                            ],
                            "id": 16304,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "668:7:98",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 16311,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "668:66:98",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 16312,
                        "nodeType": "ExpressionStatement",
                        "src": "668:66:98"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 16315,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16299,
                              "src": "754:5:98",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 16314,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "747:6:98",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint96_$",
                              "typeString": "type(uint96)"
                            },
                            "typeName": {
                              "id": 16313,
                              "name": "uint96",
                              "nodeType": "ElementaryTypeName",
                              "src": "747:6:98",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 16316,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "747:13:98",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint96",
                            "typeString": "uint96"
                          }
                        },
                        "functionReturnParameters": 16303,
                        "id": 16317,
                        "nodeType": "Return",
                        "src": "740:20:98"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 16297,
                    "nodeType": "StructuredDocumentation",
                    "src": "434:161:98",
                    "text": " @dev Converts an unsigned uint256 into a unsigned uint96.\n Requirements:\n - input must be less than or equal to maxUint96."
                  },
                  "id": 16319,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "toUint96",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 16300,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16299,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16319,
                        "src": "616:13:98",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 16298,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "616:7:98",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "615:15:98"
                  },
                  "returnParameters": {
                    "id": 16303,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16302,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16319,
                        "src": "654:6:98",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint96",
                          "typeString": "uint96"
                        },
                        "typeName": {
                          "id": 16301,
                          "name": "uint96",
                          "nodeType": "ElementaryTypeName",
                          "src": "654:6:98",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint96",
                            "typeString": "uint96"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "653:8:98"
                  },
                  "scope": 16320,
                  "src": "598:167:98",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 16321,
              "src": "62:706:98"
            }
          ],
          "src": "37:731:98"
        },
        "id": 98
      },
      "contracts/utils/MappedSinglyLinkedList.sol": {
        "ast": {
          "absolutePath": "contracts/utils/MappedSinglyLinkedList.sol",
          "exportedSymbols": {
            "MappedSinglyLinkedList": [
              16704
            ]
          },
          "id": 16705,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 16322,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:99"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 16323,
                "nodeType": "StructuredDocumentation",
                "src": "62:235:99",
                "text": "@notice An efficient implementation of a singly linked list of addresses\n @dev A mapping(address => address) tracks the 'next' pointer.  A special address called the SENTINEL is used to denote the beginning and end of the list."
              },
              "fullyImplemented": true,
              "id": 16704,
              "linearizedBaseContracts": [
                16704
              ],
              "name": "MappedSinglyLinkedList",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": true,
                  "documentation": {
                    "id": 16324,
                    "nodeType": "StructuredDocumentation",
                    "src": "333:72:99",
                    "text": "@notice The special value address used to denote the end of the list"
                  },
                  "functionSelector": "f00cab43",
                  "id": 16330,
                  "mutability": "constant",
                  "name": "SENTINEL",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 16704,
                  "src": "408:47:99",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 16325,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "408:7:99",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "hexValue": "307831",
                        "id": 16328,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "451:3:99",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_1_by_1",
                          "typeString": "int_const 1"
                        },
                        "value": "0x1"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_rational_1_by_1",
                          "typeString": "int_const 1"
                        }
                      ],
                      "id": 16327,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "443:7:99",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_address_$",
                        "typeString": "type(address)"
                      },
                      "typeName": {
                        "id": 16326,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "443:7:99",
                        "typeDescriptions": {
                          "typeIdentifier": null,
                          "typeString": null
                        }
                      }
                    },
                    "id": 16329,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "443:12:99",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address_payable",
                      "typeString": "address payable"
                    }
                  },
                  "visibility": "public"
                },
                {
                  "canonicalName": "MappedSinglyLinkedList.Mapping",
                  "id": 16337,
                  "members": [
                    {
                      "constant": false,
                      "id": 16332,
                      "mutability": "mutable",
                      "name": "count",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 16337,
                      "src": "535:13:99",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 16331,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "535:7:99",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 16336,
                      "mutability": "mutable",
                      "name": "addressMap",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 16337,
                      "src": "555:38:99",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                        "typeString": "mapping(address => address)"
                      },
                      "typeName": {
                        "id": 16335,
                        "keyType": {
                          "id": 16333,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "563:7:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "Mapping",
                        "src": "555:27:99",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                          "typeString": "mapping(address => address)"
                        },
                        "valueType": {
                          "id": 16334,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "574:7:99",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "Mapping",
                  "nodeType": "StructDefinition",
                  "scope": 16704,
                  "src": "514:84:99",
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 16359,
                    "nodeType": "Block",
                    "src": "777:93:99",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 16347,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 16344,
                                  "name": "self",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16340,
                                  "src": "791:4:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                    "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                                  }
                                },
                                "id": 16345,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "count",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 16332,
                                "src": "791:10:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 16346,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "805:1:99",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "791:15:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "416c726561647920696e6974",
                              "id": 16348,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "808:14:99",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_9d09a1a54345ba4e8b6b25c19ae8f8d44c13cb2ee5d8256bd3c17c5e4ddcd6d1",
                                "typeString": "literal_string \"Already init\""
                              },
                              "value": "Already init"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_9d09a1a54345ba4e8b6b25c19ae8f8d44c13cb2ee5d8256bd3c17c5e4ddcd6d1",
                                "typeString": "literal_string \"Already init\""
                              }
                            ],
                            "id": 16343,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "783:7:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 16349,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "783:40:99",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 16350,
                        "nodeType": "ExpressionStatement",
                        "src": "783:40:99"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 16357,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 16351,
                                "name": "self",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16340,
                                "src": "829:4:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                  "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                                }
                              },
                              "id": 16354,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "addressMap",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 16336,
                              "src": "829:15:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                                "typeString": "mapping(address => address)"
                              }
                            },
                            "id": 16355,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 16353,
                              "name": "SENTINEL",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16330,
                              "src": "845:8:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "829:25:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 16356,
                            "name": "SENTINEL",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 16330,
                            "src": "857:8:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "829:36:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 16358,
                        "nodeType": "ExpressionStatement",
                        "src": "829:36:99"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 16338,
                    "nodeType": "StructuredDocumentation",
                    "src": "602:121:99",
                    "text": "@notice Initializes the list.\n @dev It is important that this is called so that the SENTINEL is correctly setup."
                  },
                  "id": 16360,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "initialize",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 16341,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16340,
                        "mutability": "mutable",
                        "name": "self",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16360,
                        "src": "746:20:99",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                          "typeString": "struct MappedSinglyLinkedList.Mapping"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 16339,
                          "name": "Mapping",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16337,
                          "src": "746:7:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                            "typeString": "struct MappedSinglyLinkedList.Mapping"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "745:22:99"
                  },
                  "returnParameters": {
                    "id": 16342,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "777:0:99"
                  },
                  "scope": 16704,
                  "src": "726:144:99",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 16372,
                    "nodeType": "Block",
                    "src": "943:43:99",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 16367,
                              "name": "self",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16362,
                              "src": "956:4:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                              }
                            },
                            "id": 16368,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "addressMap",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16336,
                            "src": "956:15:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                              "typeString": "mapping(address => address)"
                            }
                          },
                          "id": 16370,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 16369,
                            "name": "SENTINEL",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 16330,
                            "src": "972:8:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "956:25:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "functionReturnParameters": 16366,
                        "id": 16371,
                        "nodeType": "Return",
                        "src": "949:32:99"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 16373,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "start",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 16363,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16362,
                        "mutability": "mutable",
                        "name": "self",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16373,
                        "src": "889:20:99",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                          "typeString": "struct MappedSinglyLinkedList.Mapping"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 16361,
                          "name": "Mapping",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16337,
                          "src": "889:7:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                            "typeString": "struct MappedSinglyLinkedList.Mapping"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "888:22:99"
                  },
                  "returnParameters": {
                    "id": 16366,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16365,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16373,
                        "src": "934:7:99",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16364,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "934:7:99",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "933:9:99"
                  },
                  "scope": 16704,
                  "src": "874:112:99",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 16387,
                    "nodeType": "Block",
                    "src": "1075:42:99",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 16382,
                              "name": "self",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16375,
                              "src": "1088:4:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                              }
                            },
                            "id": 16383,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "addressMap",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16336,
                            "src": "1088:15:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                              "typeString": "mapping(address => address)"
                            }
                          },
                          "id": 16385,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 16384,
                            "name": "current",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 16377,
                            "src": "1104:7:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "1088:24:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "functionReturnParameters": 16381,
                        "id": 16386,
                        "nodeType": "Return",
                        "src": "1081:31:99"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 16388,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "next",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 16378,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16375,
                        "mutability": "mutable",
                        "name": "self",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16388,
                        "src": "1004:20:99",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                          "typeString": "struct MappedSinglyLinkedList.Mapping"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 16374,
                          "name": "Mapping",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16337,
                          "src": "1004:7:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                            "typeString": "struct MappedSinglyLinkedList.Mapping"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 16377,
                        "mutability": "mutable",
                        "name": "current",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16388,
                        "src": "1026:15:99",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16376,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1026:7:99",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1003:39:99"
                  },
                  "returnParameters": {
                    "id": 16381,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16380,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16388,
                        "src": "1066:7:99",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16379,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1066:7:99",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1065:9:99"
                  },
                  "scope": 16704,
                  "src": "990:127:99",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 16397,
                    "nodeType": "Block",
                    "src": "1183:26:99",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 16395,
                          "name": "SENTINEL",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 16330,
                          "src": "1196:8:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "functionReturnParameters": 16394,
                        "id": 16396,
                        "nodeType": "Return",
                        "src": "1189:15:99"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 16398,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "end",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 16391,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16390,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16398,
                        "src": "1134:15:99",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                          "typeString": "struct MappedSinglyLinkedList.Mapping"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 16389,
                          "name": "Mapping",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16337,
                          "src": "1134:7:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                            "typeString": "struct MappedSinglyLinkedList.Mapping"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1133:17:99"
                  },
                  "returnParameters": {
                    "id": 16394,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16393,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16398,
                        "src": "1174:7:99",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16392,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1174:7:99",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1173:9:99"
                  },
                  "scope": 16704,
                  "src": "1121:88:99",
                  "stateMutability": "pure",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 16426,
                    "nodeType": "Block",
                    "src": "1294:102:99",
                    "statements": [
                      {
                        "body": {
                          "id": 16424,
                          "nodeType": "Block",
                          "src": "1347:45:99",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 16418,
                                    "name": "self",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 16400,
                                    "src": "1366:4:99",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                      "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                                    }
                                  },
                                  {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "id": 16419,
                                      "name": "addresses",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 16403,
                                      "src": "1372:9:99",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                        "typeString": "address[] memory"
                                      }
                                    },
                                    "id": 16421,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 16420,
                                      "name": "i",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 16407,
                                      "src": "1382:1:99",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "1372:12:99",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                      "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                                    },
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "id": 16417,
                                  "name": "addAddress",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16491,
                                  "src": "1355:10:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_Mapping_$16337_storage_ptr_$_t_address_$returns$__$",
                                    "typeString": "function (struct MappedSinglyLinkedList.Mapping storage pointer,address)"
                                  }
                                },
                                "id": 16422,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "1355:30:99",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 16423,
                              "nodeType": "ExpressionStatement",
                              "src": "1355:30:99"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 16413,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 16410,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 16407,
                            "src": "1320:1:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 16411,
                              "name": "addresses",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16403,
                              "src": "1324:9:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                "typeString": "address[] memory"
                              }
                            },
                            "id": 16412,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "1324:16:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "1320:20:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 16425,
                        "initializationExpression": {
                          "assignments": [
                            16407
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 16407,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 16425,
                              "src": "1305:9:99",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 16406,
                                "name": "uint256",
                                "nodeType": "ElementaryTypeName",
                                "src": "1305:7:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 16409,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 16408,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1317:1:99",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "1305:13:99"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 16415,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "1342:3:99",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 16414,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16407,
                              "src": "1342:1:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 16416,
                          "nodeType": "ExpressionStatement",
                          "src": "1342:3:99"
                        },
                        "nodeType": "ForStatement",
                        "src": "1300:92:99"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 16427,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "addAddresses",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 16404,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16400,
                        "mutability": "mutable",
                        "name": "self",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16427,
                        "src": "1235:20:99",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                          "typeString": "struct MappedSinglyLinkedList.Mapping"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 16399,
                          "name": "Mapping",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16337,
                          "src": "1235:7:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                            "typeString": "struct MappedSinglyLinkedList.Mapping"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 16403,
                        "mutability": "mutable",
                        "name": "addresses",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16427,
                        "src": "1257:26:99",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                          "typeString": "address[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 16401,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "1257:7:99",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "id": 16402,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "1257:9:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                            "typeString": "address[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1234:50:99"
                  },
                  "returnParameters": {
                    "id": 16405,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1294:0:99"
                  },
                  "scope": 16704,
                  "src": "1213:183:99",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 16490,
                    "nodeType": "Block",
                    "src": "1668:300:99",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 16445,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                "id": 16438,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 16436,
                                  "name": "newAddress",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16432,
                                  "src": "1682:10:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "!=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 16437,
                                  "name": "SENTINEL",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16330,
                                  "src": "1696:8:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "src": "1682:22:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "&&",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                "id": 16444,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 16439,
                                  "name": "newAddress",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16432,
                                  "src": "1708:10:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "!=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "30",
                                      "id": 16442,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "1730:1:99",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      },
                                      "value": "0"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      }
                                    ],
                                    "id": 16441,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "1722:7:99",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 16440,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "1722:7:99",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 16443,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "1722:10:99",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "src": "1708:24:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "1682:50:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "496e76616c69642061646472657373",
                              "id": 16446,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1734:17:99",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_1462473b7a4b33d32b109b815fd2324d00c9e5839b707ecf16d0ab5744f99226",
                                "typeString": "literal_string \"Invalid address\""
                              },
                              "value": "Invalid address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_1462473b7a4b33d32b109b815fd2324d00c9e5839b707ecf16d0ab5744f99226",
                                "typeString": "literal_string \"Invalid address\""
                              }
                            ],
                            "id": 16435,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1674:7:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 16447,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1674:78:99",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 16448,
                        "nodeType": "ExpressionStatement",
                        "src": "1674:78:99"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 16458,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 16450,
                                    "name": "self",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 16430,
                                    "src": "1766:4:99",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                      "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                                    }
                                  },
                                  "id": 16451,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "addressMap",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 16336,
                                  "src": "1766:15:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                                    "typeString": "mapping(address => address)"
                                  }
                                },
                                "id": 16453,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 16452,
                                  "name": "newAddress",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16432,
                                  "src": "1782:10:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "1766:27:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 16456,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "1805:1:99",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 16455,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "1797:7:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 16454,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "1797:7:99",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 16457,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "1797:10:99",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "1766:41:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "416c7265616479206164646564",
                              "id": 16459,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1809:15:99",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_be44abcdf0f17dcecc81dbb326dea8fc2fb387da83cb1f59b06db7c477b2ec3b",
                                "typeString": "literal_string \"Already added\""
                              },
                              "value": "Already added"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_be44abcdf0f17dcecc81dbb326dea8fc2fb387da83cb1f59b06db7c477b2ec3b",
                                "typeString": "literal_string \"Already added\""
                              }
                            ],
                            "id": 16449,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1758:7:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 16460,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1758:67:99",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 16461,
                        "nodeType": "ExpressionStatement",
                        "src": "1758:67:99"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 16471,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 16462,
                                "name": "self",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16430,
                                "src": "1831:4:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                  "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                                }
                              },
                              "id": 16465,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "addressMap",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 16336,
                              "src": "1831:15:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                                "typeString": "mapping(address => address)"
                              }
                            },
                            "id": 16466,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 16464,
                              "name": "newAddress",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16432,
                              "src": "1847:10:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "1831:27:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 16467,
                                "name": "self",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16430,
                                "src": "1861:4:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                  "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                                }
                              },
                              "id": 16468,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "addressMap",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 16336,
                              "src": "1861:15:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                                "typeString": "mapping(address => address)"
                              }
                            },
                            "id": 16470,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 16469,
                              "name": "SENTINEL",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16330,
                              "src": "1877:8:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "1861:25:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "1831:55:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 16472,
                        "nodeType": "ExpressionStatement",
                        "src": "1831:55:99"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 16479,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 16473,
                                "name": "self",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16430,
                                "src": "1892:4:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                  "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                                }
                              },
                              "id": 16476,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "addressMap",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 16336,
                              "src": "1892:15:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                                "typeString": "mapping(address => address)"
                              }
                            },
                            "id": 16477,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 16475,
                              "name": "SENTINEL",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16330,
                              "src": "1908:8:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "1892:25:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 16478,
                            "name": "newAddress",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 16432,
                            "src": "1920:10:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "1892:38:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 16480,
                        "nodeType": "ExpressionStatement",
                        "src": "1892:38:99"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 16488,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 16481,
                              "name": "self",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16430,
                              "src": "1936:4:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                              }
                            },
                            "id": 16483,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "count",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16332,
                            "src": "1936:10:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 16487,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 16484,
                                "name": "self",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16430,
                                "src": "1949:4:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                  "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                                }
                              },
                              "id": 16485,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "count",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 16332,
                              "src": "1949:10:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "+",
                            "rightExpression": {
                              "argumentTypes": null,
                              "hexValue": "31",
                              "id": 16486,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1962:1:99",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_1_by_1",
                                "typeString": "int_const 1"
                              },
                              "value": "1"
                            },
                            "src": "1949:14:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "1936:27:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 16489,
                        "nodeType": "ExpressionStatement",
                        "src": "1936:27:99"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 16428,
                    "nodeType": "StructuredDocumentation",
                    "src": "1400:194:99",
                    "text": "@notice Adds an address to the front of the list.\n @param self The Mapping struct that this function is attached to\n @param newAddress The address to shift to the front of the list"
                  },
                  "id": 16491,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "addAddress",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 16433,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16430,
                        "mutability": "mutable",
                        "name": "self",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16491,
                        "src": "1617:20:99",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                          "typeString": "struct MappedSinglyLinkedList.Mapping"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 16429,
                          "name": "Mapping",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16337,
                          "src": "1617:7:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                            "typeString": "struct MappedSinglyLinkedList.Mapping"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 16432,
                        "mutability": "mutable",
                        "name": "newAddress",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16491,
                        "src": "1639:18:99",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16431,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1639:7:99",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1616:42:99"
                  },
                  "returnParameters": {
                    "id": 16434,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1668:0:99"
                  },
                  "scope": 16704,
                  "src": "1597:371:99",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 16551,
                    "nodeType": "Block",
                    "src": "2355:276:99",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "id": 16511,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                "id": 16504,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 16502,
                                  "name": "addr",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16498,
                                  "src": "2369:4:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "!=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 16503,
                                  "name": "SENTINEL",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16330,
                                  "src": "2377:8:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "src": "2369:16:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "&&",
                              "rightExpression": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                "id": 16510,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 16505,
                                  "name": "addr",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16498,
                                  "src": "2389:4:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "!=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "hexValue": "30",
                                      "id": 16508,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "number",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "2405:1:99",
                                      "subdenomination": null,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      },
                                      "value": "0"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_rational_0_by_1",
                                        "typeString": "int_const 0"
                                      }
                                    ],
                                    "id": 16507,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "2397:7:99",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 16506,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "2397:7:99",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 16509,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "2397:10:99",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "src": "2389:18:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "src": "2369:38:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "496e76616c69642061646472657373",
                              "id": 16512,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2409:17:99",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_1462473b7a4b33d32b109b815fd2324d00c9e5839b707ecf16d0ab5744f99226",
                                "typeString": "literal_string \"Invalid address\""
                              },
                              "value": "Invalid address"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_1462473b7a4b33d32b109b815fd2324d00c9e5839b707ecf16d0ab5744f99226",
                                "typeString": "literal_string \"Invalid address\""
                              }
                            ],
                            "id": 16501,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2361:7:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 16513,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2361:66:99",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 16514,
                        "nodeType": "ExpressionStatement",
                        "src": "2361:66:99"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 16521,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 16516,
                                    "name": "self",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 16494,
                                    "src": "2441:4:99",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                      "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                                    }
                                  },
                                  "id": 16517,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "addressMap",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 16336,
                                  "src": "2441:15:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                                    "typeString": "mapping(address => address)"
                                  }
                                },
                                "id": 16519,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 16518,
                                  "name": "prevAddress",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16496,
                                  "src": "2457:11:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "2441:28:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 16520,
                                "name": "addr",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16498,
                                "src": "2473:4:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "src": "2441:36:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "496e76616c6964207072657641646472657373",
                              "id": 16522,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2479:21:99",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_19b2883e19a6236648e9229d8fd115e14c2cf1b1acb5980ee1d4cfa30e6e9da1",
                                "typeString": "literal_string \"Invalid prevAddress\""
                              },
                              "value": "Invalid prevAddress"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_19b2883e19a6236648e9229d8fd115e14c2cf1b1acb5980ee1d4cfa30e6e9da1",
                                "typeString": "literal_string \"Invalid prevAddress\""
                              }
                            ],
                            "id": 16515,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2433:7:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 16523,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2433:68:99",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 16524,
                        "nodeType": "ExpressionStatement",
                        "src": "2433:68:99"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 16534,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 16525,
                                "name": "self",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16494,
                                "src": "2507:4:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                  "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                                }
                              },
                              "id": 16528,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "addressMap",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 16336,
                              "src": "2507:15:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                                "typeString": "mapping(address => address)"
                              }
                            },
                            "id": 16529,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 16527,
                              "name": "prevAddress",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16496,
                              "src": "2523:11:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "2507:28:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 16530,
                                "name": "self",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16494,
                                "src": "2538:4:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                  "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                                }
                              },
                              "id": 16531,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "addressMap",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 16336,
                              "src": "2538:15:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                                "typeString": "mapping(address => address)"
                              }
                            },
                            "id": 16533,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 16532,
                              "name": "addr",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16498,
                              "src": "2554:4:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "2538:21:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "2507:52:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 16535,
                        "nodeType": "ExpressionStatement",
                        "src": "2507:52:99"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 16540,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "UnaryOperation",
                          "operator": "delete",
                          "prefix": true,
                          "src": "2565:28:99",
                          "subExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 16536,
                                "name": "self",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16494,
                                "src": "2572:4:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                  "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                                }
                              },
                              "id": 16537,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "addressMap",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 16336,
                              "src": "2572:15:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                                "typeString": "mapping(address => address)"
                              }
                            },
                            "id": 16539,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 16538,
                              "name": "addr",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16498,
                              "src": "2588:4:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "2572:21:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 16541,
                        "nodeType": "ExpressionStatement",
                        "src": "2565:28:99"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 16549,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 16542,
                              "name": "self",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16494,
                              "src": "2599:4:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                              }
                            },
                            "id": 16544,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "count",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16332,
                            "src": "2599:10:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 16548,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 16545,
                                "name": "self",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16494,
                                "src": "2612:4:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                  "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                                }
                              },
                              "id": 16546,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "count",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 16332,
                              "src": "2612:10:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "-",
                            "rightExpression": {
                              "argumentTypes": null,
                              "hexValue": "31",
                              "id": 16547,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2625:1:99",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_1_by_1",
                                "typeString": "int_const 1"
                              },
                              "value": "1"
                            },
                            "src": "2612:14:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "2599:27:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 16550,
                        "nodeType": "ExpressionStatement",
                        "src": "2599:27:99"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 16492,
                    "nodeType": "StructuredDocumentation",
                    "src": "1972:291:99",
                    "text": "@notice Removes an address from the list\n @param self The Mapping struct that this function is attached to\n @param prevAddress The address that precedes the address to be removed.  This may be the SENTINEL if at the start.\n @param addr The address to remove from the list."
                  },
                  "id": 16552,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "removeAddress",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 16499,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16494,
                        "mutability": "mutable",
                        "name": "self",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16552,
                        "src": "2289:20:99",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                          "typeString": "struct MappedSinglyLinkedList.Mapping"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 16493,
                          "name": "Mapping",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16337,
                          "src": "2289:7:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                            "typeString": "struct MappedSinglyLinkedList.Mapping"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 16496,
                        "mutability": "mutable",
                        "name": "prevAddress",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16552,
                        "src": "2311:19:99",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16495,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2311:7:99",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 16498,
                        "mutability": "mutable",
                        "name": "addr",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16552,
                        "src": "2332:12:99",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16497,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2332:7:99",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2288:57:99"
                  },
                  "returnParameters": {
                    "id": 16500,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2355:0:99"
                  },
                  "scope": 16704,
                  "src": "2266:365:99",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 16583,
                    "nodeType": "Block",
                    "src": "2962:95:99",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 16581,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            },
                            "id": 16571,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 16564,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 16562,
                                "name": "addr",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16557,
                                "src": "2975:4:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "id": 16563,
                                "name": "SENTINEL",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16330,
                                "src": "2983:8:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "src": "2975:16:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "&&",
                            "rightExpression": {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              "id": 16570,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 16565,
                                "name": "addr",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16557,
                                "src": "2995:4:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "!=",
                              "rightExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "hexValue": "30",
                                    "id": 16568,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "3011:1:99",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 16567,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "3003:7:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 16566,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "3003:7:99",
                                    "typeDescriptions": {
                                      "typeIdentifier": null,
                                      "typeString": null
                                    }
                                  }
                                },
                                "id": 16569,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "3003:10:99",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address_payable",
                                  "typeString": "address payable"
                                }
                              },
                              "src": "2995:18:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "src": "2975:38:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 16580,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 16572,
                                  "name": "self",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16555,
                                  "src": "3017:4:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                    "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                                  }
                                },
                                "id": 16573,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "addressMap",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 16336,
                                "src": "3017:15:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                                  "typeString": "mapping(address => address)"
                                }
                              },
                              "id": 16575,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 16574,
                                "name": "addr",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16557,
                                "src": "3033:4:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "3017:21:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 16578,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "3050:1:99",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 16577,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "3042:7:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 16576,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "3042:7:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 16579,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3042:10:99",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "src": "3017:35:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "2975:77:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "functionReturnParameters": 16561,
                        "id": 16582,
                        "nodeType": "Return",
                        "src": "2968:84:99"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 16553,
                    "nodeType": "StructuredDocumentation",
                    "src": "2635:241:99",
                    "text": "@notice Determines whether the list contains the given address\n @param self The Mapping struct that this function is attached to\n @param addr The address to check\n @return True if the address is contained, false otherwise."
                  },
                  "id": 16584,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "contains",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 16558,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16555,
                        "mutability": "mutable",
                        "name": "self",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16584,
                        "src": "2897:20:99",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                          "typeString": "struct MappedSinglyLinkedList.Mapping"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 16554,
                          "name": "Mapping",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16337,
                          "src": "2897:7:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                            "typeString": "struct MappedSinglyLinkedList.Mapping"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 16557,
                        "mutability": "mutable",
                        "name": "addr",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16584,
                        "src": "2919:12:99",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16556,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2919:7:99",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2896:36:99"
                  },
                  "returnParameters": {
                    "id": 16561,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16560,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16584,
                        "src": "2956:4:99",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 16559,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "2956:4:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2955:6:99"
                  },
                  "scope": 16704,
                  "src": "2879:178:99",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 16645,
                    "nodeType": "Block",
                    "src": "3406:341:99",
                    "statements": [
                      {
                        "assignments": [
                          16597
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 16597,
                            "mutability": "mutable",
                            "name": "array",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 16645,
                            "src": "3412:22:99",
                            "stateVariable": false,
                            "storageLocation": "memory",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                              "typeString": "address[]"
                            },
                            "typeName": {
                              "baseType": {
                                "id": 16595,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "3412:7:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 16596,
                              "length": null,
                              "nodeType": "ArrayTypeName",
                              "src": "3412:9:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                                "typeString": "address[]"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 16604,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 16601,
                                "name": "self",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16587,
                                "src": "3451:4:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                  "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                                }
                              },
                              "id": 16602,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "count",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 16332,
                              "src": "3451:10:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 16600,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "NewExpression",
                            "src": "3437:13:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_address_$dyn_memory_ptr_$",
                              "typeString": "function (uint256) pure returns (address[] memory)"
                            },
                            "typeName": {
                              "baseType": {
                                "id": 16598,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "3441:7:99",
                                "stateMutability": "nonpayable",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 16599,
                              "length": null,
                              "nodeType": "ArrayTypeName",
                              "src": "3441:9:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                                "typeString": "address[]"
                              }
                            }
                          },
                          "id": 16603,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3437:25:99",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                            "typeString": "address[] memory"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3412:50:99"
                      },
                      {
                        "assignments": [
                          16606
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 16606,
                            "mutability": "mutable",
                            "name": "count",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 16645,
                            "src": "3468:13:99",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 16605,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "3468:7:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 16607,
                        "initialValue": null,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3468:13:99"
                      },
                      {
                        "assignments": [
                          16609
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 16609,
                            "mutability": "mutable",
                            "name": "currentAddress",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 16645,
                            "src": "3487:22:99",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 16608,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "3487:7:99",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 16614,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 16610,
                              "name": "self",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16587,
                              "src": "3512:4:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                              }
                            },
                            "id": 16611,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "addressMap",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16336,
                            "src": "3512:15:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                              "typeString": "mapping(address => address)"
                            }
                          },
                          "id": 16613,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 16612,
                            "name": "SENTINEL",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 16330,
                            "src": "3528:8:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "3512:25:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3487:50:99"
                      },
                      {
                        "body": {
                          "id": 16641,
                          "nodeType": "Block",
                          "src": "3610:115:99",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 16629,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 16625,
                                    "name": "array",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 16597,
                                    "src": "3618:5:99",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                      "typeString": "address[] memory"
                                    }
                                  },
                                  "id": 16627,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 16626,
                                    "name": "count",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 16606,
                                    "src": "3624:5:99",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "3618:12:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 16628,
                                  "name": "currentAddress",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16609,
                                  "src": "3633:14:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "src": "3618:29:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 16630,
                              "nodeType": "ExpressionStatement",
                              "src": "3618:29:99"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 16636,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 16631,
                                  "name": "currentAddress",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16609,
                                  "src": "3655:14:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 16632,
                                      "name": "self",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 16587,
                                      "src": "3672:4:99",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                        "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                                      }
                                    },
                                    "id": 16633,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "addressMap",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 16336,
                                    "src": "3672:15:99",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                                      "typeString": "mapping(address => address)"
                                    }
                                  },
                                  "id": 16635,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 16634,
                                    "name": "currentAddress",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 16609,
                                    "src": "3688:14:99",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "3672:31:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "src": "3655:48:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 16637,
                              "nodeType": "ExpressionStatement",
                              "src": "3655:48:99"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 16639,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "UnaryOperation",
                                "operator": "++",
                                "prefix": false,
                                "src": "3711:7:99",
                                "subExpression": {
                                  "argumentTypes": null,
                                  "id": 16638,
                                  "name": "count",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16606,
                                  "src": "3711:5:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 16640,
                              "nodeType": "ExpressionStatement",
                              "src": "3711:7:99"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 16624,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 16620,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 16615,
                              "name": "currentAddress",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16609,
                              "src": "3550:14:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 16618,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "3576:1:99",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 16617,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "3568:7:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 16616,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "3568:7:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 16619,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3568:10:99",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "src": "3550:28:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 16623,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 16621,
                              "name": "currentAddress",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16609,
                              "src": "3582:14:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 16622,
                              "name": "SENTINEL",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16330,
                              "src": "3600:8:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "src": "3582:26:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "3550:58:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 16642,
                        "nodeType": "WhileStatement",
                        "src": "3543:182:99"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 16643,
                          "name": "array",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 16597,
                          "src": "3737:5:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                            "typeString": "address[] memory"
                          }
                        },
                        "functionReturnParameters": 16592,
                        "id": 16644,
                        "nodeType": "Return",
                        "src": "3730:12:99"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 16585,
                    "nodeType": "StructuredDocumentation",
                    "src": "3061:257:99",
                    "text": "@notice Returns an address array of all the addresses in this list\n @dev Contains a for loop, so complexity is O(n) wrt the list size\n @param self The Mapping struct that this function is attached to\n @return An array of all the addresses"
                  },
                  "id": 16646,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "addressArray",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 16588,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16587,
                        "mutability": "mutable",
                        "name": "self",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16646,
                        "src": "3343:20:99",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                          "typeString": "struct MappedSinglyLinkedList.Mapping"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 16586,
                          "name": "Mapping",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16337,
                          "src": "3343:7:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                            "typeString": "struct MappedSinglyLinkedList.Mapping"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3342:22:99"
                  },
                  "returnParameters": {
                    "id": 16592,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16591,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16646,
                        "src": "3388:16:99",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                          "typeString": "address[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 16589,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "3388:7:99",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "id": 16590,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "3388:9:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                            "typeString": "address[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3387:18:99"
                  },
                  "scope": 16704,
                  "src": "3321:426:99",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 16702,
                    "nodeType": "Block",
                    "src": "3921:345:99",
                    "statements": [
                      {
                        "assignments": [
                          16653
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 16653,
                            "mutability": "mutable",
                            "name": "currentAddress",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 16702,
                            "src": "3927:22:99",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 16652,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "3927:7:99",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 16658,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 16654,
                              "name": "self",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16649,
                              "src": "3952:4:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                              }
                            },
                            "id": 16655,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "addressMap",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16336,
                            "src": "3952:15:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                              "typeString": "mapping(address => address)"
                            }
                          },
                          "id": 16657,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 16656,
                            "name": "SENTINEL",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 16330,
                            "src": "3968:8:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "3952:25:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3927:50:99"
                      },
                      {
                        "body": {
                          "id": 16686,
                          "nodeType": "Block",
                          "src": "4050:150:99",
                          "statements": [
                            {
                              "assignments": [
                                16670
                              ],
                              "declarations": [
                                {
                                  "constant": false,
                                  "id": 16670,
                                  "mutability": "mutable",
                                  "name": "nextAddress",
                                  "nodeType": "VariableDeclaration",
                                  "overrides": null,
                                  "scope": 16686,
                                  "src": "4058:19:99",
                                  "stateVariable": false,
                                  "storageLocation": "default",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  "typeName": {
                                    "id": 16669,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "4058:7:99",
                                    "stateMutability": "nonpayable",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "value": null,
                                  "visibility": "internal"
                                }
                              ],
                              "id": 16675,
                              "initialValue": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 16671,
                                    "name": "self",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 16649,
                                    "src": "4080:4:99",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                      "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                                    }
                                  },
                                  "id": 16672,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "addressMap",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 16336,
                                  "src": "4080:15:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                                    "typeString": "mapping(address => address)"
                                  }
                                },
                                "id": 16674,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 16673,
                                  "name": "currentAddress",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16653,
                                  "src": "4096:14:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "4080:31:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "nodeType": "VariableDeclarationStatement",
                              "src": "4058:53:99"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 16680,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "UnaryOperation",
                                "operator": "delete",
                                "prefix": true,
                                "src": "4119:38:99",
                                "subExpression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 16676,
                                      "name": "self",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 16649,
                                      "src": "4126:4:99",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                        "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                                      }
                                    },
                                    "id": 16677,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "addressMap",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 16336,
                                    "src": "4126:15:99",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                                      "typeString": "mapping(address => address)"
                                    }
                                  },
                                  "id": 16679,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 16678,
                                    "name": "currentAddress",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 16653,
                                    "src": "4142:14:99",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "4126:31:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 16681,
                              "nodeType": "ExpressionStatement",
                              "src": "4119:38:99"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 16684,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 16682,
                                  "name": "currentAddress",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16653,
                                  "src": "4165:14:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "id": 16683,
                                  "name": "nextAddress",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16670,
                                  "src": "4182:11:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "src": "4165:28:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              "id": 16685,
                              "nodeType": "ExpressionStatement",
                              "src": "4165:28:99"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "id": 16668,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 16664,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 16659,
                              "name": "currentAddress",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16653,
                              "src": "3990:14:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 16662,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "4016:1:99",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 16661,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "4008:7:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 16660,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "4008:7:99",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 16663,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "4008:10:99",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "src": "3990:28:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "&&",
                          "rightExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "id": 16667,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 16665,
                              "name": "currentAddress",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16653,
                              "src": "4022:14:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "!=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "id": 16666,
                              "name": "SENTINEL",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16330,
                              "src": "4040:8:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "src": "4022:26:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "src": "3990:58:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 16687,
                        "nodeType": "WhileStatement",
                        "src": "3983:217:99"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 16694,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 16688,
                                "name": "self",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16649,
                                "src": "4205:4:99",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                  "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                                }
                              },
                              "id": 16691,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "addressMap",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 16336,
                              "src": "4205:15:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_address_$",
                                "typeString": "mapping(address => address)"
                              }
                            },
                            "id": 16692,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 16690,
                              "name": "SENTINEL",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16330,
                              "src": "4221:8:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "4205:25:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 16693,
                            "name": "SENTINEL",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 16330,
                            "src": "4233:8:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "src": "4205:36:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 16695,
                        "nodeType": "ExpressionStatement",
                        "src": "4205:36:99"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 16700,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 16696,
                              "name": "self",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16649,
                              "src": "4247:4:99",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                                "typeString": "struct MappedSinglyLinkedList.Mapping storage pointer"
                              }
                            },
                            "id": 16698,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "count",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 16332,
                            "src": "4247:10:99",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 16699,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "4260:1:99",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "4247:14:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 16701,
                        "nodeType": "ExpressionStatement",
                        "src": "4247:14:99"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 16647,
                    "nodeType": "StructuredDocumentation",
                    "src": "3751:118:99",
                    "text": "@notice Removes every address from the list\n @param self The Mapping struct that this function is attached to"
                  },
                  "id": 16703,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "clearAll",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 16650,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16649,
                        "mutability": "mutable",
                        "name": "self",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16703,
                        "src": "3890:20:99",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                          "typeString": "struct MappedSinglyLinkedList.Mapping"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 16648,
                          "name": "Mapping",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 16337,
                          "src": "3890:7:99",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_Mapping_$16337_storage_ptr",
                            "typeString": "struct MappedSinglyLinkedList.Mapping"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3889:22:99"
                  },
                  "returnParameters": {
                    "id": 16651,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3921:0:99"
                  },
                  "scope": 16704,
                  "src": "3872:394:99",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 16705,
              "src": "297:3971:99"
            }
          ],
          "src": "37:4232:99"
        },
        "id": 99
      },
      "contracts/yield-source/CTokenYieldSource.sol": {
        "ast": {
          "absolutePath": "contracts/yield-source/CTokenYieldSource.sol",
          "exportedSymbols": {
            "CTokenYieldSource": [
              16998
            ]
          },
          "id": 16999,
          "license": "GPL-3.0",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 16706,
              "literals": [
                "solidity",
                "0.6",
                ".12"
              ],
              "nodeType": "PragmaDirective",
              "src": "37:23:100"
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol",
              "file": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol",
              "id": 16707,
              "nodeType": "ImportDirective",
              "scope": 16999,
              "sourceUnit": 1353,
              "src": "62:69:100",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol",
              "id": 16708,
              "nodeType": "ImportDirective",
              "scope": 16999,
              "sourceUnit": 1287,
              "src": "132:74:100",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "id": 16709,
              "nodeType": "ImportDirective",
              "scope": 16999,
              "sourceUnit": 1961,
              "src": "207:79:100",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@pooltogether/fixed-point/contracts/FixedPoint.sol",
              "file": "@pooltogether/fixed-point/contracts/FixedPoint.sol",
              "id": 16710,
              "nodeType": "ImportDirective",
              "scope": 16999,
              "sourceUnit": 5280,
              "src": "287:60:100",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "file": "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol",
              "id": 16711,
              "nodeType": "ImportDirective",
              "scope": 16999,
              "sourceUnit": 1961,
              "src": "348:79:100",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "@pooltogether/yield-source-interface/contracts/IYieldSource.sol",
              "file": "@pooltogether/yield-source-interface/contracts/IYieldSource.sol",
              "id": 16712,
              "nodeType": "ImportDirective",
              "scope": 16999,
              "sourceUnit": 5624,
              "src": "428:73:100",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "absolutePath": "contracts/external/compound/CTokenInterface.sol",
              "file": "../external/compound/CTokenInterface.sol",
              "id": 16713,
              "nodeType": "ImportDirective",
              "scope": 16999,
              "sourceUnit": 6512,
              "src": "503:50:100",
              "symbolAliases": [],
              "unitAlias": ""
            },
            {
              "abstract": false,
              "baseContracts": [
                {
                  "arguments": null,
                  "baseName": {
                    "contractScope": null,
                    "id": 16715,
                    "name": "IYieldSource",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 5623,
                    "src": "858:12:100",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IYieldSource_$5623",
                      "typeString": "contract IYieldSource"
                    }
                  },
                  "id": 16716,
                  "nodeType": "InheritanceSpecifier",
                  "src": "858:12:100"
                }
              ],
              "contractDependencies": [
                5623
              ],
              "contractKind": "contract",
              "documentation": {
                "id": 16714,
                "nodeType": "StructuredDocumentation",
                "src": "555:273:100",
                "text": "@title Defines the functions used to interact with a yield source.  The Prize Pool inherits this contract.\n @dev THIS CONTRACT IS EXPERIMENTAL!  USE AT YOUR OWN RISK\n @notice Prize Pools subclasses need to implement this interface so that yield can be generated."
              },
              "fullyImplemented": true,
              "id": 16998,
              "linearizedBaseContracts": [
                16998,
                5623
              ],
              "name": "CTokenYieldSource",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "id": 16719,
                  "libraryName": {
                    "contractScope": null,
                    "id": 16717,
                    "name": "SafeMathUpgradeable",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 1286,
                    "src": "881:19:100",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_SafeMathUpgradeable_$1286",
                      "typeString": "library SafeMathUpgradeable"
                    }
                  },
                  "nodeType": "UsingForDirective",
                  "src": "875:38:100",
                  "typeName": {
                    "id": 16718,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "905:7:100",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                },
                {
                  "anonymous": false,
                  "documentation": null,
                  "id": 16723,
                  "name": "CTokenYieldSourceInitialized",
                  "nodeType": "EventDefinition",
                  "parameters": {
                    "id": 16722,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16721,
                        "indexed": true,
                        "mutability": "mutable",
                        "name": "cToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16723,
                        "src": "952:22:100",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16720,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "952:7:100",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "951:24:100"
                  },
                  "src": "917:59:100"
                },
                {
                  "constant": false,
                  "functionSelector": "27e235e3",
                  "id": 16727,
                  "mutability": "mutable",
                  "name": "balances",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 16998,
                  "src": "980:43:100",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                    "typeString": "mapping(address => uint256)"
                  },
                  "typeName": {
                    "id": 16726,
                    "keyType": {
                      "id": 16724,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "988:7:100",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Mapping",
                    "src": "980:27:100",
                    "typeDescriptions": {
                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                      "typeString": "mapping(address => uint256)"
                    },
                    "valueType": {
                      "id": 16725,
                      "name": "uint256",
                      "nodeType": "ElementaryTypeName",
                      "src": "999:7:100",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "constant": false,
                  "documentation": {
                    "id": 16728,
                    "nodeType": "StructuredDocumentation",
                    "src": "1028:62:100",
                    "text": "@notice Interface for the Yield-bearing cToken by Compound"
                  },
                  "functionSelector": "69e527da",
                  "id": 16730,
                  "mutability": "mutable",
                  "name": "cToken",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 16998,
                  "src": "1093:29:100",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                    "typeString": "contract CTokenInterface"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 16729,
                    "name": "CTokenInterface",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 6511,
                    "src": "1093:15:100",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                      "typeString": "contract CTokenInterface"
                    }
                  },
                  "value": null,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 16747,
                    "nodeType": "Block",
                    "src": "1317:84:100",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 16738,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 16736,
                            "name": "cToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 16730,
                            "src": "1323:6:100",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                              "typeString": "contract CTokenInterface"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 16737,
                            "name": "_cToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 16733,
                            "src": "1332:7:100",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                              "typeString": "contract CTokenInterface"
                            }
                          },
                          "src": "1323:16:100",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                            "typeString": "contract CTokenInterface"
                          }
                        },
                        "id": 16739,
                        "nodeType": "ExpressionStatement",
                        "src": "1323:16:100"
                      },
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 16743,
                                  "name": "cToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16730,
                                  "src": "1388:6:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                    "typeString": "contract CTokenInterface"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                    "typeString": "contract CTokenInterface"
                                  }
                                ],
                                "id": 16742,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "1380:7:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 16741,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "1380:7:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 16744,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1380:15:100",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 16740,
                            "name": "CTokenYieldSourceInitialized",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 16723,
                            "src": "1351:28:100",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 16745,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1351:45:100",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 16746,
                        "nodeType": "EmitStatement",
                        "src": "1346:50:100"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 16731,
                    "nodeType": "StructuredDocumentation",
                    "src": "1127:128:100",
                    "text": "@notice Initializes the Yield Service with the Compound cToken\n @param _cToken Address of the Compound cToken interface"
                  },
                  "id": 16748,
                  "implemented": true,
                  "kind": "constructor",
                  "modifiers": [],
                  "name": "",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 16734,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16733,
                        "mutability": "mutable",
                        "name": "_cToken",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16748,
                        "src": "1276:23:100",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                          "typeString": "contract CTokenInterface"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 16732,
                          "name": "CTokenInterface",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 6511,
                          "src": "1276:15:100",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                            "typeString": "contract CTokenInterface"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1270:33:100"
                  },
                  "returnParameters": {
                    "id": 16735,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1317:0:100"
                  },
                  "scope": 16998,
                  "src": "1258:143:100",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "baseFunctions": [
                    5598
                  ],
                  "body": {
                    "id": 16758,
                    "nodeType": "Block",
                    "src": "1567:33:100",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 16755,
                            "name": "_tokenAddress",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 16769,
                            "src": "1580:13:100",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                              "typeString": "function () view returns (address)"
                            }
                          },
                          "id": 16756,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1580:15:100",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "functionReturnParameters": 16754,
                        "id": 16757,
                        "nodeType": "Return",
                        "src": "1573:22:100"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 16749,
                    "nodeType": "StructuredDocumentation",
                    "src": "1405:96:100",
                    "text": "@notice Returns the ERC20 asset token used for deposits.\n @return The ERC20 asset token"
                  },
                  "functionSelector": "c89039c5",
                  "id": 16759,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "depositToken",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 16751,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "1535:8:100"
                  },
                  "parameters": {
                    "id": 16750,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1525:2:100"
                  },
                  "returnParameters": {
                    "id": 16754,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16753,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16759,
                        "src": "1558:7:100",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16752,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1558:7:100",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1557:9:100"
                  },
                  "scope": 16998,
                  "src": "1504:96:100",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 16768,
                    "nodeType": "Block",
                    "src": "1661:37:100",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "expression": {
                              "argumentTypes": null,
                              "id": 16764,
                              "name": "cToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16730,
                              "src": "1674:6:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                "typeString": "contract CTokenInterface"
                              }
                            },
                            "id": 16765,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "underlying",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 6464,
                            "src": "1674:17:100",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$__$returns$_t_address_$",
                              "typeString": "function () view external returns (address)"
                            }
                          },
                          "id": 16766,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1674:19:100",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "functionReturnParameters": 16763,
                        "id": 16767,
                        "nodeType": "Return",
                        "src": "1667:26:100"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 16769,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_tokenAddress",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 16760,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1626:2:100"
                  },
                  "returnParameters": {
                    "id": 16763,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16762,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16769,
                        "src": "1652:7:100",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16761,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1652:7:100",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1651:9:100"
                  },
                  "scope": 16998,
                  "src": "1604:94:100",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 16779,
                    "nodeType": "Block",
                    "src": "1762:52:100",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 16775,
                                "name": "_tokenAddress",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16769,
                                "src": "1793:13:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                                  "typeString": "function () view returns (address)"
                                }
                              },
                              "id": 16776,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1793:15:100",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 16774,
                            "name": "IERC20Upgradeable",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 1960,
                            "src": "1775:17:100",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_contract$_IERC20Upgradeable_$1960_$",
                              "typeString": "type(contract IERC20Upgradeable)"
                            }
                          },
                          "id": 16777,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1775:34:100",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "functionReturnParameters": 16773,
                        "id": 16778,
                        "nodeType": "Return",
                        "src": "1768:41:100"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 16780,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_token",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 16770,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1717:2:100"
                  },
                  "returnParameters": {
                    "id": 16773,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16772,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16780,
                        "src": "1743:17:100",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                          "typeString": "contract IERC20Upgradeable"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 16771,
                          "name": "IERC20Upgradeable",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 1960,
                          "src": "1743:17:100",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                            "typeString": "contract IERC20Upgradeable"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1742:19:100"
                  },
                  "scope": 16998,
                  "src": "1702:112:100",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "baseFunctions": [
                    5606
                  ],
                  "body": {
                    "id": 16826,
                    "nodeType": "Block",
                    "src": "2046:234:100",
                    "statements": [
                      {
                        "assignments": [
                          16790
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 16790,
                            "mutability": "mutable",
                            "name": "totalUnderlying",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 16826,
                            "src": "2052:23:100",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 16789,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "2052:7:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 16798,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 16795,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "2113:4:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_CTokenYieldSource_$16998",
                                    "typeString": "contract CTokenYieldSource"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_CTokenYieldSource_$16998",
                                    "typeString": "contract CTokenYieldSource"
                                  }
                                ],
                                "id": 16794,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "2105:7:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 16793,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "2105:7:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 16796,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2105:13:100",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 16791,
                              "name": "cToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16730,
                              "src": "2078:6:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                "typeString": "contract CTokenInterface"
                              }
                            },
                            "id": 16792,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balanceOfUnderlying",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 6471,
                            "src": "2078:26:100",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) external returns (uint256)"
                            }
                          },
                          "id": 16797,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2078:41:100",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2052:67:100"
                      },
                      {
                        "assignments": [
                          16800
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 16800,
                            "mutability": "mutable",
                            "name": "total",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 16826,
                            "src": "2125:13:100",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 16799,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "2125:7:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 16808,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 16805,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "2166:4:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_CTokenYieldSource_$16998",
                                    "typeString": "contract CTokenYieldSource"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_CTokenYieldSource_$16998",
                                    "typeString": "contract CTokenYieldSource"
                                  }
                                ],
                                "id": 16804,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "2158:7:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 16803,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "2158:7:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 16806,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2158:13:100",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 16801,
                              "name": "cToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16730,
                              "src": "2141:6:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                "typeString": "contract CTokenInterface"
                              }
                            },
                            "id": 16802,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balanceOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 6503,
                            "src": "2141:16:100",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) view external returns (uint256)"
                            }
                          },
                          "id": 16807,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2141:31:100",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2125:47:100"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 16811,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 16809,
                            "name": "total",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 16800,
                            "src": "2182:5:100",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 16810,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "2191:1:100",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "2182:10:100",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": null,
                        "id": 16815,
                        "nodeType": "IfStatement",
                        "src": "2178:39:100",
                        "trueBody": {
                          "id": 16814,
                          "nodeType": "Block",
                          "src": "2194:23:100",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 16812,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "2209:1:100",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "functionReturnParameters": 16788,
                              "id": 16813,
                              "nodeType": "Return",
                              "src": "2202:8:100"
                            }
                          ]
                        }
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 16823,
                              "name": "total",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16800,
                              "src": "2269:5:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 16820,
                                  "name": "totalUnderlying",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16790,
                                  "src": "2248:15:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "id": 16816,
                                    "name": "balances",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 16727,
                                    "src": "2229:8:100",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                      "typeString": "mapping(address => uint256)"
                                    }
                                  },
                                  "id": 16818,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 16817,
                                    "name": "addr",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 16783,
                                    "src": "2238:4:100",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "2229:14:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 16819,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "mul",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 1169,
                                "src": "2229:18:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                  "typeString": "function (uint256,uint256) pure returns (uint256)"
                                }
                              },
                              "id": 16821,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2229:35:100",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 16822,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "div",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1191,
                            "src": "2229:39:100",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 16824,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2229:46:100",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 16788,
                        "id": 16825,
                        "nodeType": "Return",
                        "src": "2222:53:100"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 16781,
                    "nodeType": "StructuredDocumentation",
                    "src": "1818:151:100",
                    "text": "@notice Returns the total balance (in asset tokens).  This includes the deposits and interest.\n @return The underlying balance of asset tokens"
                  },
                  "functionSelector": "b99152d0",
                  "id": 16827,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "balanceOfToken",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 16785,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "2019:8:100"
                  },
                  "parameters": {
                    "id": 16784,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16783,
                        "mutability": "mutable",
                        "name": "addr",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16827,
                        "src": "1996:12:100",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16782,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1996:7:100",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1995:14:100"
                  },
                  "returnParameters": {
                    "id": 16788,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16787,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16827,
                        "src": "2037:7:100",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 16786,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2037:7:100",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2036:9:100"
                  },
                  "scope": 16998,
                  "src": "1972:308:100",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    5614
                  ],
                  "body": {
                    "id": 16905,
                    "nodeType": "Block",
                    "src": "2472:415:100",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 16839,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "2500:3:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 16840,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "2500:10:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 16843,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "2520:4:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_CTokenYieldSource_$16998",
                                    "typeString": "contract CTokenYieldSource"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_CTokenYieldSource_$16998",
                                    "typeString": "contract CTokenYieldSource"
                                  }
                                ],
                                "id": 16842,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "2512:7:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 16841,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "2512:7:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 16844,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2512:13:100",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 16845,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16830,
                              "src": "2527:6:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 16836,
                                "name": "_token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16780,
                                "src": "2478:6:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IERC20Upgradeable_$1960_$",
                                  "typeString": "function () view returns (contract IERC20Upgradeable)"
                                }
                              },
                              "id": 16837,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2478:8:100",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            "id": 16838,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "transferFrom",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1941,
                            "src": "2478:21:100",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,address,uint256) external returns (bool)"
                            }
                          },
                          "id": 16846,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2478:56:100",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 16847,
                        "nodeType": "ExpressionStatement",
                        "src": "2478:56:100"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 16856,
                                  "name": "cToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16730,
                                  "src": "2595:6:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                    "typeString": "contract CTokenInterface"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                    "typeString": "contract CTokenInterface"
                                  }
                                ],
                                "id": 16855,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "2587:7:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 16854,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "2587:7:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 16857,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2587:15:100",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 16858,
                              "name": "amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16830,
                              "src": "2604:6:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 16849,
                                      "name": "cToken",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 16730,
                                      "src": "2558:6:100",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                        "typeString": "contract CTokenInterface"
                                      }
                                    },
                                    "id": 16850,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "underlying",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 6464,
                                    "src": "2558:17:100",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_view$__$returns$_t_address_$",
                                      "typeString": "function () view external returns (address)"
                                    }
                                  },
                                  "id": 16851,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "2558:19:100",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "id": 16848,
                                "name": "IERC20Upgradeable",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 1960,
                                "src": "2540:17:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_contract$_IERC20Upgradeable_$1960_$",
                                  "typeString": "type(contract IERC20Upgradeable)"
                                }
                              },
                              "id": 16852,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2540:38:100",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            "id": 16853,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "approve",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1929,
                            "src": "2540:46:100",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,uint256) external returns (bool)"
                            }
                          },
                          "id": 16859,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2540:71:100",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 16860,
                        "nodeType": "ExpressionStatement",
                        "src": "2540:71:100"
                      },
                      {
                        "assignments": [
                          16862
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 16862,
                            "mutability": "mutable",
                            "name": "cTokenBalanceBefore",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 16905,
                            "src": "2617:27:100",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 16861,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "2617:7:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 16870,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 16867,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "2672:4:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_CTokenYieldSource_$16998",
                                    "typeString": "contract CTokenYieldSource"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_CTokenYieldSource_$16998",
                                    "typeString": "contract CTokenYieldSource"
                                  }
                                ],
                                "id": 16866,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "2664:7:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 16865,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "2664:7:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 16868,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2664:13:100",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 16863,
                              "name": "cToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16730,
                              "src": "2647:6:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                "typeString": "contract CTokenInterface"
                              }
                            },
                            "id": 16864,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balanceOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 6503,
                            "src": "2647:16:100",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) view external returns (uint256)"
                            }
                          },
                          "id": 16869,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2647:31:100",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2617:61:100"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 16877,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 16874,
                                    "name": "amount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 16830,
                                    "src": "2704:6:100",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 16872,
                                    "name": "cToken",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 16730,
                                    "src": "2692:6:100",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                      "typeString": "contract CTokenInterface"
                                    }
                                  },
                                  "id": 16873,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "mint",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 6488,
                                  "src": "2692:11:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$_t_uint256_$",
                                    "typeString": "function (uint256) external returns (uint256)"
                                  }
                                },
                                "id": 16875,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "2692:19:100",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 16876,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "2715:1:100",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "2692:24:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "43546f6b656e5969656c64536f757263652f6d696e742d6661696c6564",
                              "id": 16878,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2718:31:100",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_8fb9fd94d62e8c0694266df36e7d0c3dcf9c2207c23ad69f8c6aff1255f6fcc6",
                                "typeString": "literal_string \"CTokenYieldSource/mint-failed\""
                              },
                              "value": "CTokenYieldSource/mint-failed"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_8fb9fd94d62e8c0694266df36e7d0c3dcf9c2207c23ad69f8c6aff1255f6fcc6",
                                "typeString": "literal_string \"CTokenYieldSource/mint-failed\""
                              }
                            ],
                            "id": 16871,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "2684:7:100",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 16879,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2684:66:100",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 16880,
                        "nodeType": "ExpressionStatement",
                        "src": "2684:66:100"
                      },
                      {
                        "assignments": [
                          16882
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 16882,
                            "mutability": "mutable",
                            "name": "cTokenDiff",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 16905,
                            "src": "2756:18:100",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 16881,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "2756:7:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 16893,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 16891,
                              "name": "cTokenBalanceBefore",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16862,
                              "src": "2813:19:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 16887,
                                      "name": "this",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -28,
                                      "src": "2802:4:100",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_CTokenYieldSource_$16998",
                                        "typeString": "contract CTokenYieldSource"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_CTokenYieldSource_$16998",
                                        "typeString": "contract CTokenYieldSource"
                                      }
                                    ],
                                    "id": 16886,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "2794:7:100",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 16885,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "2794:7:100",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 16888,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "2794:13:100",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 16883,
                                  "name": "cToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16730,
                                  "src": "2777:6:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                    "typeString": "contract CTokenInterface"
                                  }
                                },
                                "id": 16884,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "balanceOf",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 6503,
                                "src": "2777:16:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                  "typeString": "function (address) view external returns (uint256)"
                                }
                              },
                              "id": 16889,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2777:31:100",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 16890,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sub",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1135,
                            "src": "2777:35:100",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 16892,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2777:56:100",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2756:77:100"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 16903,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 16894,
                              "name": "balances",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16727,
                              "src": "2839:8:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 16896,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 16895,
                              "name": "to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16832,
                              "src": "2848:2:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "2839:12:100",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 16901,
                                "name": "cTokenDiff",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16882,
                                "src": "2871:10:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 16897,
                                  "name": "balances",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16727,
                                  "src": "2854:8:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 16899,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "id": 16898,
                                  "name": "to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16832,
                                  "src": "2863:2:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "2854:12:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 16900,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "add",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1113,
                              "src": "2854:16:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 16902,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "2854:28:100",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "2839:43:100",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 16904,
                        "nodeType": "ExpressionStatement",
                        "src": "2839:43:100"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 16828,
                    "nodeType": "StructuredDocumentation",
                    "src": "2284:116:100",
                    "text": "@notice Supplies asset tokens to the yield source.\n @param amount The amount of asset tokens to be supplied"
                  },
                  "functionSelector": "87a6eeef",
                  "id": 16906,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "supplyTokenTo",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 16834,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "2463:8:100"
                  },
                  "parameters": {
                    "id": 16833,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16830,
                        "mutability": "mutable",
                        "name": "amount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16906,
                        "src": "2426:14:100",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 16829,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "2426:7:100",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 16832,
                        "mutability": "mutable",
                        "name": "to",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16906,
                        "src": "2442:10:100",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 16831,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "2442:7:100",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2425:28:100"
                  },
                  "returnParameters": {
                    "id": 16835,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2472:0:100"
                  },
                  "scope": 16998,
                  "src": "2403:484:100",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                },
                {
                  "baseFunctions": [
                    5622
                  ],
                  "body": {
                    "id": 16996,
                    "nodeType": "Block",
                    "src": "3166:506:100",
                    "statements": [
                      {
                        "assignments": [
                          16916
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 16916,
                            "mutability": "mutable",
                            "name": "cTokenBalanceBefore",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 16996,
                            "src": "3172:27:100",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 16915,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "3172:7:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 16924,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 16921,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "3227:4:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_CTokenYieldSource_$16998",
                                    "typeString": "contract CTokenYieldSource"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_CTokenYieldSource_$16998",
                                    "typeString": "contract CTokenYieldSource"
                                  }
                                ],
                                "id": 16920,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "3219:7:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 16919,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "3219:7:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 16922,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3219:13:100",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 16917,
                              "name": "cToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16730,
                              "src": "3202:6:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                "typeString": "contract CTokenInterface"
                              }
                            },
                            "id": 16918,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balanceOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 6503,
                            "src": "3202:16:100",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) view external returns (uint256)"
                            }
                          },
                          "id": 16923,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3202:31:100",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3172:61:100"
                      },
                      {
                        "assignments": [
                          16926
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 16926,
                            "mutability": "mutable",
                            "name": "balanceBefore",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 16996,
                            "src": "3239:21:100",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 16925,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "3239:7:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 16935,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "id": 16932,
                                  "name": "this",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -28,
                                  "src": "3290:4:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_CTokenYieldSource_$16998",
                                    "typeString": "contract CTokenYieldSource"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_contract$_CTokenYieldSource_$16998",
                                    "typeString": "contract CTokenYieldSource"
                                  }
                                ],
                                "id": 16931,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "3282:7:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 16930,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "3282:7:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": null,
                                    "typeString": null
                                  }
                                }
                              },
                              "id": 16933,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3282:13:100",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 16927,
                                "name": "_token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16780,
                                "src": "3263:6:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IERC20Upgradeable_$1960_$",
                                  "typeString": "function () view returns (contract IERC20Upgradeable)"
                                }
                              },
                              "id": 16928,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3263:8:100",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            "id": 16929,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "balanceOf",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1899,
                            "src": "3263:18:100",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                              "typeString": "function (address) view external returns (uint256)"
                            }
                          },
                          "id": 16934,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3263:33:100",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3239:57:100"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 16942,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "id": 16939,
                                    "name": "redeemAmount",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 16909,
                                    "src": "3334:12:100",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 16937,
                                    "name": "cToken",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 16730,
                                    "src": "3310:6:100",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                      "typeString": "contract CTokenInterface"
                                    }
                                  },
                                  "id": 16938,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "redeemUnderlying",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 6510,
                                  "src": "3310:23:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$returns$_t_uint256_$",
                                    "typeString": "function (uint256) external returns (uint256)"
                                  }
                                },
                                "id": 16940,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "3310:37:100",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 16941,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "3351:1:100",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "3310:42:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "43546f6b656e5969656c64536f757263652f72656465656d2d6661696c6564",
                              "id": 16943,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "3354:33:100",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_c30bf106aa7ed6c14083b31bfae72ab7a0af6a00cd40a001ed7e80601dbf0c8b",
                                "typeString": "literal_string \"CTokenYieldSource/redeem-failed\""
                              },
                              "value": "CTokenYieldSource/redeem-failed"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_c30bf106aa7ed6c14083b31bfae72ab7a0af6a00cd40a001ed7e80601dbf0c8b",
                                "typeString": "literal_string \"CTokenYieldSource/redeem-failed\""
                              }
                            ],
                            "id": 16936,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "3302:7:100",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 16944,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3302:86:100",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 16945,
                        "nodeType": "ExpressionStatement",
                        "src": "3302:86:100"
                      },
                      {
                        "assignments": [
                          16947
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 16947,
                            "mutability": "mutable",
                            "name": "cTokenDiff",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 16996,
                            "src": "3394:18:100",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 16946,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "3394:7:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 16958,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 16954,
                                      "name": "this",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -28,
                                      "src": "3464:4:100",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_CTokenYieldSource_$16998",
                                        "typeString": "contract CTokenYieldSource"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_CTokenYieldSource_$16998",
                                        "typeString": "contract CTokenYieldSource"
                                      }
                                    ],
                                    "id": 16953,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "3456:7:100",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 16952,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "3456:7:100",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 16955,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "3456:13:100",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 16950,
                                  "name": "cToken",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16730,
                                  "src": "3439:6:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_CTokenInterface_$6511",
                                    "typeString": "contract CTokenInterface"
                                  }
                                },
                                "id": 16951,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "balanceOf",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 6503,
                                "src": "3439:16:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                  "typeString": "function (address) view external returns (uint256)"
                                }
                              },
                              "id": 16956,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3439:31:100",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 16948,
                              "name": "cTokenBalanceBefore",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16916,
                              "src": "3415:19:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 16949,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sub",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1135,
                            "src": "3415:23:100",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 16957,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3415:56:100",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3394:77:100"
                      },
                      {
                        "assignments": [
                          16960
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 16960,
                            "mutability": "mutable",
                            "name": "diff",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 16996,
                            "src": "3477:12:100",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 16959,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "3477:7:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 16972,
                        "initialValue": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 16970,
                              "name": "balanceBefore",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16926,
                              "src": "3530:13:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "arguments": [
                                    {
                                      "argumentTypes": null,
                                      "id": 16966,
                                      "name": "this",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": -28,
                                      "src": "3519:4:100",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_CTokenYieldSource_$16998",
                                        "typeString": "contract CTokenYieldSource"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_contract$_CTokenYieldSource_$16998",
                                        "typeString": "contract CTokenYieldSource"
                                      }
                                    ],
                                    "id": 16965,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "lValueRequested": false,
                                    "nodeType": "ElementaryTypeNameExpression",
                                    "src": "3511:7:100",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_type$_t_address_$",
                                      "typeString": "type(address)"
                                    },
                                    "typeName": {
                                      "id": 16964,
                                      "name": "address",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "3511:7:100",
                                      "typeDescriptions": {
                                        "typeIdentifier": null,
                                        "typeString": null
                                      }
                                    }
                                  },
                                  "id": 16967,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "typeConversion",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "3511:13:100",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "arguments": [],
                                  "expression": {
                                    "argumentTypes": [],
                                    "id": 16961,
                                    "name": "_token",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 16780,
                                    "src": "3492:6:100",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IERC20Upgradeable_$1960_$",
                                      "typeString": "function () view returns (contract IERC20Upgradeable)"
                                    }
                                  },
                                  "id": 16962,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "3492:8:100",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                    "typeString": "contract IERC20Upgradeable"
                                  }
                                },
                                "id": 16963,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "balanceOf",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 1899,
                                "src": "3492:18:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                  "typeString": "function (address) view external returns (uint256)"
                                }
                              },
                              "id": 16968,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3492:33:100",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 16969,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sub",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1135,
                            "src": "3492:37:100",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 16971,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3492:52:100",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "3477:67:100"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 16984,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "id": 16973,
                              "name": "balances",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16727,
                              "src": "3550:8:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                "typeString": "mapping(address => uint256)"
                              }
                            },
                            "id": 16976,
                            "indexExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 16974,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "3559:3:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 16975,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "3559:10:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "nodeType": "IndexAccess",
                            "src": "3550:20:100",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 16982,
                                "name": "cTokenDiff",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16947,
                                "src": "3598:10:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "id": 16977,
                                  "name": "balances",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 16727,
                                  "src": "3573:8:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                                    "typeString": "mapping(address => uint256)"
                                  }
                                },
                                "id": 16980,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 16978,
                                    "name": "msg",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": -15,
                                    "src": "3582:3:100",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_magic_message",
                                      "typeString": "msg"
                                    }
                                  },
                                  "id": 16979,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "sender",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "3582:10:100",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address_payable",
                                    "typeString": "address payable"
                                  }
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "3573:20:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 16981,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sub",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 1135,
                              "src": "3573:24:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 16983,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "3573:36:100",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "3550:59:100",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 16985,
                        "nodeType": "ExpressionStatement",
                        "src": "3550:59:100"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 16989,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "3633:3:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 16990,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "3633:10:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 16991,
                              "name": "diff",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 16960,
                              "src": "3645:4:100",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 16986,
                                "name": "_token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 16780,
                                "src": "3615:6:100",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$__$returns$_t_contract$_IERC20Upgradeable_$1960_$",
                                  "typeString": "function () view returns (contract IERC20Upgradeable)"
                                }
                              },
                              "id": 16987,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3615:8:100",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20Upgradeable_$1960",
                                "typeString": "contract IERC20Upgradeable"
                              }
                            },
                            "id": 16988,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "transfer",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 1909,
                            "src": "3615:17:100",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,uint256) external returns (bool)"
                            }
                          },
                          "id": 16992,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3615:35:100",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 16993,
                        "nodeType": "ExpressionStatement",
                        "src": "3615:35:100"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 16994,
                          "name": "diff",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 16960,
                          "src": "3663:4:100",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "functionReturnParameters": 16914,
                        "id": 16995,
                        "nodeType": "Return",
                        "src": "3656:11:100"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 16907,
                    "nodeType": "StructuredDocumentation",
                    "src": "2891:193:100",
                    "text": "@notice Redeems asset tokens from the yield source.\n @param redeemAmount The amount of yield-bearing tokens to be redeemed\n @return The actual amount of tokens that were redeemed."
                  },
                  "functionSelector": "013054c2",
                  "id": 16997,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "redeemToken",
                  "nodeType": "FunctionDefinition",
                  "overrides": {
                    "id": 16911,
                    "nodeType": "OverrideSpecifier",
                    "overrides": [],
                    "src": "3139:8:100"
                  },
                  "parameters": {
                    "id": 16910,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16909,
                        "mutability": "mutable",
                        "name": "redeemAmount",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16997,
                        "src": "3108:20:100",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 16908,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3108:7:100",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3107:22:100"
                  },
                  "returnParameters": {
                    "id": 16914,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 16913,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 16997,
                        "src": "3157:7:100",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 16912,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "3157:7:100",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3156:9:100"
                  },
                  "scope": 16998,
                  "src": "3087:585:100",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "external"
                }
              ],
              "scope": 16999,
              "src": "828:2846:100"
            }
          ],
          "src": "37:3638:100"
        },
        "id": 100
      },
      "hardhat/console.sol": {
        "ast": {
          "absolutePath": "hardhat/console.sol",
          "exportedSymbols": {
            "console": [
              25062
            ]
          },
          "id": 25063,
          "license": "MIT",
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 17000,
              "literals": [
                "solidity",
                ">=",
                "0.4",
                ".22",
                "<",
                "0.9",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "32:33:101"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": null,
              "fullyImplemented": true,
              "id": 25062,
              "linearizedBaseContracts": [
                25062
              ],
              "name": "console",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "constant": true,
                  "id": 17006,
                  "mutability": "constant",
                  "name": "CONSOLE_ADDRESS",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 25062,
                  "src": "86:86:101",
                  "stateVariable": true,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 17001,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "86:7:101",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "hexValue": "307830303030303030303030303030303030303036333646366537333646366336353265366336663637",
                        "id": 17004,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "129:42:101",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        "value": "0x000000000000000000636F6e736F6c652e6c6f67"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 17003,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "121:7:101",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_address_$",
                        "typeString": "type(address)"
                      },
                      "typeName": {
                        "id": 17002,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "121:7:101",
                        "typeDescriptions": {
                          "typeIdentifier": null,
                          "typeString": null
                        }
                      }
                    },
                    "id": 17005,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "121:51:101",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17021,
                    "nodeType": "Block",
                    "src": "236:228:101",
                    "statements": [
                      {
                        "assignments": [
                          17012
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 17012,
                            "mutability": "mutable",
                            "name": "payloadLength",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 17021,
                            "src": "240:21:101",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 17011,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "240:7:101",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 17015,
                        "initialValue": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 17013,
                            "name": "payload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17008,
                            "src": "264:7:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes memory"
                            }
                          },
                          "id": 17014,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "length",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "264:14:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "240:38:101"
                      },
                      {
                        "assignments": [
                          17017
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 17017,
                            "mutability": "mutable",
                            "name": "consoleAddress",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 17021,
                            "src": "282:22:101",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            "typeName": {
                              "id": 17016,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "282:7:101",
                              "stateMutability": "nonpayable",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 17019,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 17018,
                          "name": "CONSOLE_ADDRESS",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 17006,
                          "src": "307:15:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "282:40:101"
                      },
                      {
                        "AST": {
                          "nodeType": "YulBlock",
                          "src": "335:126:101",
                          "statements": [
                            {
                              "nodeType": "YulVariableDeclaration",
                              "src": "340:36:101",
                              "value": {
                                "arguments": [
                                  {
                                    "name": "payload",
                                    "nodeType": "YulIdentifier",
                                    "src": "364:7:101"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "373:2:101",
                                    "type": "",
                                    "value": "32"
                                  }
                                ],
                                "functionName": {
                                  "name": "add",
                                  "nodeType": "YulIdentifier",
                                  "src": "360:3:101"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "360:16:101"
                              },
                              "variables": [
                                {
                                  "name": "payloadStart",
                                  "nodeType": "YulTypedName",
                                  "src": "344:12:101",
                                  "type": ""
                                }
                              ]
                            },
                            {
                              "nodeType": "YulVariableDeclaration",
                              "src": "380:77:101",
                              "value": {
                                "arguments": [
                                  {
                                    "arguments": [],
                                    "functionName": {
                                      "name": "gas",
                                      "nodeType": "YulIdentifier",
                                      "src": "400:3:101"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "400:5:101"
                                  },
                                  {
                                    "name": "consoleAddress",
                                    "nodeType": "YulIdentifier",
                                    "src": "407:14:101"
                                  },
                                  {
                                    "name": "payloadStart",
                                    "nodeType": "YulIdentifier",
                                    "src": "423:12:101"
                                  },
                                  {
                                    "name": "payloadLength",
                                    "nodeType": "YulIdentifier",
                                    "src": "437:13:101"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "452:1:101",
                                    "type": "",
                                    "value": "0"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "455:1:101",
                                    "type": "",
                                    "value": "0"
                                  }
                                ],
                                "functionName": {
                                  "name": "staticcall",
                                  "nodeType": "YulIdentifier",
                                  "src": "389:10:101"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "389:68:101"
                              },
                              "variables": [
                                {
                                  "name": "r",
                                  "nodeType": "YulTypedName",
                                  "src": "384:1:101",
                                  "type": ""
                                }
                              ]
                            }
                          ]
                        },
                        "evmVersion": "istanbul",
                        "externalReferences": [
                          {
                            "declaration": 17017,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "407:14:101",
                            "valueSize": 1
                          },
                          {
                            "declaration": 17008,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "364:7:101",
                            "valueSize": 1
                          },
                          {
                            "declaration": 17012,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "437:13:101",
                            "valueSize": 1
                          }
                        ],
                        "id": 17020,
                        "nodeType": "InlineAssembly",
                        "src": "326:135:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17022,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "_sendLogPayload",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17009,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17008,
                        "mutability": "mutable",
                        "name": "payload",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17022,
                        "src": "201:20:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 17007,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "201:5:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "200:22:101"
                  },
                  "returnParameters": {
                    "id": 17010,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "236:0:101"
                  },
                  "scope": 25062,
                  "src": "176:288:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "private"
                },
                {
                  "body": {
                    "id": 17032,
                    "nodeType": "Block",
                    "src": "496:57:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672829",
                                  "id": 17028,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "540:7:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_51973ec9d4c1929bdd5b149c064d46aee47e92a7e2bb5f7a20c7b9cfb0d13b39",
                                    "typeString": "literal_string \"log()\""
                                  },
                                  "value": "log()"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_51973ec9d4c1929bdd5b149c064d46aee47e92a7e2bb5f7a20c7b9cfb0d13b39",
                                    "typeString": "literal_string \"log()\""
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17026,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "516:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17027,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "516:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17029,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "516:32:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17025,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "500:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17030,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "500:49:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17031,
                        "nodeType": "ExpressionStatement",
                        "src": "500:49:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17033,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17023,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "479:2:101"
                  },
                  "returnParameters": {
                    "id": 17024,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "496:0:101"
                  },
                  "scope": 25062,
                  "src": "467:86:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17046,
                    "nodeType": "Block",
                    "src": "594:64:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728696e7429",
                                  "id": 17041,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "638:10:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_4e0c1d1dcf573259576e2a7e591d366143f88fb7f7e57df09852da9c36797f2e",
                                    "typeString": "literal_string \"log(int)\""
                                  },
                                  "value": "log(int)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17042,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17035,
                                  "src": "650:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_4e0c1d1dcf573259576e2a7e591d366143f88fb7f7e57df09852da9c36797f2e",
                                    "typeString": "literal_string \"log(int)\""
                                  },
                                  {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17039,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "614:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17040,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "614:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17043,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "614:39:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17038,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "598:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17044,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "598:56:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17045,
                        "nodeType": "ExpressionStatement",
                        "src": "598:56:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17047,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logInt",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17036,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17035,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17047,
                        "src": "572:6:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        },
                        "typeName": {
                          "id": 17034,
                          "name": "int",
                          "nodeType": "ElementaryTypeName",
                          "src": "572:3:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_int256",
                            "typeString": "int256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "571:8:101"
                  },
                  "returnParameters": {
                    "id": 17037,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "594:0:101"
                  },
                  "scope": 25062,
                  "src": "556:102:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17060,
                    "nodeType": "Block",
                    "src": "701:65:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e7429",
                                  "id": 17055,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "745:11:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_f5b1bba92d8f98cf25e27c94d7fc7cbfbae95a49dfe5ab0cdf64ddd7181bb984",
                                    "typeString": "literal_string \"log(uint)\""
                                  },
                                  "value": "log(uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17056,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17049,
                                  "src": "758:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_f5b1bba92d8f98cf25e27c94d7fc7cbfbae95a49dfe5ab0cdf64ddd7181bb984",
                                    "typeString": "literal_string \"log(uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17053,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "721:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17054,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "721:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17057,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "721:40:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17052,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "705:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17058,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "705:57:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17059,
                        "nodeType": "ExpressionStatement",
                        "src": "705:57:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17061,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logUint",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17050,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17049,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17061,
                        "src": "678:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17048,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "678:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "677:9:101"
                  },
                  "returnParameters": {
                    "id": 17051,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "701:0:101"
                  },
                  "scope": 25062,
                  "src": "661:105:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17074,
                    "nodeType": "Block",
                    "src": "820:67:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e6729",
                                  "id": 17069,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "864:13:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_41304facd9323d75b11bcdd609cb38effffdb05710f7caf0e9b16c6d9d709f50",
                                    "typeString": "literal_string \"log(string)\""
                                  },
                                  "value": "log(string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17070,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17063,
                                  "src": "879:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_41304facd9323d75b11bcdd609cb38effffdb05710f7caf0e9b16c6d9d709f50",
                                    "typeString": "literal_string \"log(string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17067,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "840:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17068,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "840:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17071,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "840:42:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17066,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "824:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17072,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "824:59:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17073,
                        "nodeType": "ExpressionStatement",
                        "src": "824:59:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17075,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logString",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17064,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17063,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17075,
                        "src": "788:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 17062,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "788:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "787:18:101"
                  },
                  "returnParameters": {
                    "id": 17065,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "820:0:101"
                  },
                  "scope": 25062,
                  "src": "769:118:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17088,
                    "nodeType": "Block",
                    "src": "930:65:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c29",
                                  "id": 17083,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "974:11:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_32458eed3feca62a69292a55ca8a755ae4e6cdc57a38d15c298330064467fdd7",
                                    "typeString": "literal_string \"log(bool)\""
                                  },
                                  "value": "log(bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17084,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17077,
                                  "src": "987:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_32458eed3feca62a69292a55ca8a755ae4e6cdc57a38d15c298330064467fdd7",
                                    "typeString": "literal_string \"log(bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17081,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "950:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17082,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "950:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17085,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "950:40:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17080,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "934:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17086,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "934:57:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17087,
                        "nodeType": "ExpressionStatement",
                        "src": "934:57:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17089,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBool",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17078,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17077,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17089,
                        "src": "907:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 17076,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "907:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "906:9:101"
                  },
                  "returnParameters": {
                    "id": 17079,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "930:0:101"
                  },
                  "scope": 25062,
                  "src": "890:105:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17102,
                    "nodeType": "Block",
                    "src": "1044:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286164647265737329",
                                  "id": 17097,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "1088:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_2c2ecbc2212ac38c2f9ec89aa5fcef7f532a5db24dbf7cad1f48bc82843b7428",
                                    "typeString": "literal_string \"log(address)\""
                                  },
                                  "value": "log(address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17098,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17091,
                                  "src": "1104:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_2c2ecbc2212ac38c2f9ec89aa5fcef7f532a5db24dbf7cad1f48bc82843b7428",
                                    "typeString": "literal_string \"log(address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17095,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "1064:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17096,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "1064:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17099,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1064:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17094,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "1048:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17100,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1048:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17101,
                        "nodeType": "ExpressionStatement",
                        "src": "1048:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17103,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logAddress",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17092,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17091,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17103,
                        "src": "1018:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 17090,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "1018:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1017:12:101"
                  },
                  "returnParameters": {
                    "id": 17093,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1044:0:101"
                  },
                  "scope": 25062,
                  "src": "998:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17116,
                    "nodeType": "Block",
                    "src": "1164:66:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728627974657329",
                                  "id": 17111,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "1208:12:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_0be77f5642494da7d212b92a3472c4f471abb24e17467f41788e7de7915d6238",
                                    "typeString": "literal_string \"log(bytes)\""
                                  },
                                  "value": "log(bytes)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17112,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17105,
                                  "src": "1222:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_0be77f5642494da7d212b92a3472c4f471abb24e17467f41788e7de7915d6238",
                                    "typeString": "literal_string \"log(bytes)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17109,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "1184:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17110,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "1184:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17113,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1184:41:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17108,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "1168:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17114,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1168:58:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17115,
                        "nodeType": "ExpressionStatement",
                        "src": "1168:58:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17117,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17106,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17105,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17117,
                        "src": "1133:15:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes"
                        },
                        "typeName": {
                          "id": 17104,
                          "name": "bytes",
                          "nodeType": "ElementaryTypeName",
                          "src": "1133:5:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_storage_ptr",
                            "typeString": "bytes"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1132:17:101"
                  },
                  "returnParameters": {
                    "id": 17107,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1164:0:101"
                  },
                  "scope": 25062,
                  "src": "1115:115:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17130,
                    "nodeType": "Block",
                    "src": "1277:67:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672862797465733129",
                                  "id": 17125,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "1321:13:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_6e18a1285e3dfba09579e846ff83d5e4ffae1b869c8fc4323752bab794e41041",
                                    "typeString": "literal_string \"log(bytes1)\""
                                  },
                                  "value": "log(bytes1)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17126,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17119,
                                  "src": "1336:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes1",
                                    "typeString": "bytes1"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_6e18a1285e3dfba09579e846ff83d5e4ffae1b869c8fc4323752bab794e41041",
                                    "typeString": "literal_string \"log(bytes1)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes1",
                                    "typeString": "bytes1"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17123,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "1297:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17124,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "1297:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17127,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1297:42:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17122,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "1281:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17128,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1281:59:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17129,
                        "nodeType": "ExpressionStatement",
                        "src": "1281:59:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17131,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes1",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17120,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17119,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17131,
                        "src": "1252:9:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes1",
                          "typeString": "bytes1"
                        },
                        "typeName": {
                          "id": 17118,
                          "name": "bytes1",
                          "nodeType": "ElementaryTypeName",
                          "src": "1252:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes1",
                            "typeString": "bytes1"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1251:11:101"
                  },
                  "returnParameters": {
                    "id": 17121,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1277:0:101"
                  },
                  "scope": 25062,
                  "src": "1233:111:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17144,
                    "nodeType": "Block",
                    "src": "1391:67:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672862797465733229",
                                  "id": 17139,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "1435:13:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_e9b622960ff3a0e86d35e876bfeba445fab6c5686604aa116c47c1e106921224",
                                    "typeString": "literal_string \"log(bytes2)\""
                                  },
                                  "value": "log(bytes2)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17140,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17133,
                                  "src": "1450:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes2",
                                    "typeString": "bytes2"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_e9b622960ff3a0e86d35e876bfeba445fab6c5686604aa116c47c1e106921224",
                                    "typeString": "literal_string \"log(bytes2)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes2",
                                    "typeString": "bytes2"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17137,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "1411:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17138,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "1411:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17141,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1411:42:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17136,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "1395:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17142,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1395:59:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17143,
                        "nodeType": "ExpressionStatement",
                        "src": "1395:59:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17145,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes2",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17134,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17133,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17145,
                        "src": "1366:9:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes2",
                          "typeString": "bytes2"
                        },
                        "typeName": {
                          "id": 17132,
                          "name": "bytes2",
                          "nodeType": "ElementaryTypeName",
                          "src": "1366:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes2",
                            "typeString": "bytes2"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1365:11:101"
                  },
                  "returnParameters": {
                    "id": 17135,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1391:0:101"
                  },
                  "scope": 25062,
                  "src": "1347:111:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17158,
                    "nodeType": "Block",
                    "src": "1505:67:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672862797465733329",
                                  "id": 17153,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "1549:13:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_2d8349266851a1d92746f90a9696920643311d6bf462d9fa11e69718a636cbee",
                                    "typeString": "literal_string \"log(bytes3)\""
                                  },
                                  "value": "log(bytes3)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17154,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17147,
                                  "src": "1564:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes3",
                                    "typeString": "bytes3"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_2d8349266851a1d92746f90a9696920643311d6bf462d9fa11e69718a636cbee",
                                    "typeString": "literal_string \"log(bytes3)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes3",
                                    "typeString": "bytes3"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17151,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "1525:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17152,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "1525:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17155,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1525:42:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17150,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "1509:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17156,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1509:59:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17157,
                        "nodeType": "ExpressionStatement",
                        "src": "1509:59:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17159,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes3",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17148,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17147,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17159,
                        "src": "1480:9:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes3",
                          "typeString": "bytes3"
                        },
                        "typeName": {
                          "id": 17146,
                          "name": "bytes3",
                          "nodeType": "ElementaryTypeName",
                          "src": "1480:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes3",
                            "typeString": "bytes3"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1479:11:101"
                  },
                  "returnParameters": {
                    "id": 17149,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1505:0:101"
                  },
                  "scope": 25062,
                  "src": "1461:111:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17172,
                    "nodeType": "Block",
                    "src": "1619:67:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672862797465733429",
                                  "id": 17167,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "1663:13:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_e05f48d17f80c0f06e82dc14f4be9f0f654dde2e722a8d8796ad7e07f5308d55",
                                    "typeString": "literal_string \"log(bytes4)\""
                                  },
                                  "value": "log(bytes4)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17168,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17161,
                                  "src": "1678:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_e05f48d17f80c0f06e82dc14f4be9f0f654dde2e722a8d8796ad7e07f5308d55",
                                    "typeString": "literal_string \"log(bytes4)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes4",
                                    "typeString": "bytes4"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17165,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "1639:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17166,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "1639:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17169,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1639:42:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17164,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "1623:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17170,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1623:59:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17171,
                        "nodeType": "ExpressionStatement",
                        "src": "1623:59:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17173,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes4",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17162,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17161,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17173,
                        "src": "1594:9:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes4",
                          "typeString": "bytes4"
                        },
                        "typeName": {
                          "id": 17160,
                          "name": "bytes4",
                          "nodeType": "ElementaryTypeName",
                          "src": "1594:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes4",
                            "typeString": "bytes4"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1593:11:101"
                  },
                  "returnParameters": {
                    "id": 17163,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1619:0:101"
                  },
                  "scope": 25062,
                  "src": "1575:111:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17186,
                    "nodeType": "Block",
                    "src": "1733:67:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672862797465733529",
                                  "id": 17181,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "1777:13:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_a684808d222f8a67c08dd13085391d5e9d1825d9fb6e2da44a91b1a07d07401a",
                                    "typeString": "literal_string \"log(bytes5)\""
                                  },
                                  "value": "log(bytes5)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17182,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17175,
                                  "src": "1792:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes5",
                                    "typeString": "bytes5"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_a684808d222f8a67c08dd13085391d5e9d1825d9fb6e2da44a91b1a07d07401a",
                                    "typeString": "literal_string \"log(bytes5)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes5",
                                    "typeString": "bytes5"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17179,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "1753:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17180,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "1753:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17183,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1753:42:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17178,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "1737:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17184,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1737:59:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17185,
                        "nodeType": "ExpressionStatement",
                        "src": "1737:59:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17187,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes5",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17176,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17175,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17187,
                        "src": "1708:9:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes5",
                          "typeString": "bytes5"
                        },
                        "typeName": {
                          "id": 17174,
                          "name": "bytes5",
                          "nodeType": "ElementaryTypeName",
                          "src": "1708:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes5",
                            "typeString": "bytes5"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1707:11:101"
                  },
                  "returnParameters": {
                    "id": 17177,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1733:0:101"
                  },
                  "scope": 25062,
                  "src": "1689:111:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17200,
                    "nodeType": "Block",
                    "src": "1847:67:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672862797465733629",
                                  "id": 17195,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "1891:13:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_ae84a5910824668818be6031303edf0f6f3694b35d5e6f9683950d57ef12d330",
                                    "typeString": "literal_string \"log(bytes6)\""
                                  },
                                  "value": "log(bytes6)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17196,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17189,
                                  "src": "1906:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes6",
                                    "typeString": "bytes6"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_ae84a5910824668818be6031303edf0f6f3694b35d5e6f9683950d57ef12d330",
                                    "typeString": "literal_string \"log(bytes6)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes6",
                                    "typeString": "bytes6"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17193,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "1867:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17194,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "1867:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17197,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1867:42:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17192,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "1851:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17198,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1851:59:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17199,
                        "nodeType": "ExpressionStatement",
                        "src": "1851:59:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17201,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes6",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17190,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17189,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17201,
                        "src": "1822:9:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes6",
                          "typeString": "bytes6"
                        },
                        "typeName": {
                          "id": 17188,
                          "name": "bytes6",
                          "nodeType": "ElementaryTypeName",
                          "src": "1822:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes6",
                            "typeString": "bytes6"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1821:11:101"
                  },
                  "returnParameters": {
                    "id": 17191,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1847:0:101"
                  },
                  "scope": 25062,
                  "src": "1803:111:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17214,
                    "nodeType": "Block",
                    "src": "1961:67:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672862797465733729",
                                  "id": 17209,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "2005:13:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_4ed57e28813457436949e4ec0a834b3c8262cd6cebd21953ee0da3400ce2de29",
                                    "typeString": "literal_string \"log(bytes7)\""
                                  },
                                  "value": "log(bytes7)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17210,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17203,
                                  "src": "2020:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes7",
                                    "typeString": "bytes7"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_4ed57e28813457436949e4ec0a834b3c8262cd6cebd21953ee0da3400ce2de29",
                                    "typeString": "literal_string \"log(bytes7)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes7",
                                    "typeString": "bytes7"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17207,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "1981:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17208,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "1981:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17211,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "1981:42:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17206,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "1965:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17212,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1965:59:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17213,
                        "nodeType": "ExpressionStatement",
                        "src": "1965:59:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17215,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes7",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17204,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17203,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17215,
                        "src": "1936:9:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes7",
                          "typeString": "bytes7"
                        },
                        "typeName": {
                          "id": 17202,
                          "name": "bytes7",
                          "nodeType": "ElementaryTypeName",
                          "src": "1936:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes7",
                            "typeString": "bytes7"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1935:11:101"
                  },
                  "returnParameters": {
                    "id": 17205,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1961:0:101"
                  },
                  "scope": 25062,
                  "src": "1917:111:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17228,
                    "nodeType": "Block",
                    "src": "2075:67:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672862797465733829",
                                  "id": 17223,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "2119:13:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_4f84252e5b28e1a0064346c7cd13650e2dd6020728ca468281bb2a28b42654b3",
                                    "typeString": "literal_string \"log(bytes8)\""
                                  },
                                  "value": "log(bytes8)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17224,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17217,
                                  "src": "2134:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes8",
                                    "typeString": "bytes8"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_4f84252e5b28e1a0064346c7cd13650e2dd6020728ca468281bb2a28b42654b3",
                                    "typeString": "literal_string \"log(bytes8)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes8",
                                    "typeString": "bytes8"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17221,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "2095:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17222,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "2095:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17225,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2095:42:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17220,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "2079:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17226,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2079:59:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17227,
                        "nodeType": "ExpressionStatement",
                        "src": "2079:59:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17229,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes8",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17218,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17217,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17229,
                        "src": "2050:9:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes8",
                          "typeString": "bytes8"
                        },
                        "typeName": {
                          "id": 17216,
                          "name": "bytes8",
                          "nodeType": "ElementaryTypeName",
                          "src": "2050:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes8",
                            "typeString": "bytes8"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2049:11:101"
                  },
                  "returnParameters": {
                    "id": 17219,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2075:0:101"
                  },
                  "scope": 25062,
                  "src": "2031:111:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17242,
                    "nodeType": "Block",
                    "src": "2189:67:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672862797465733929",
                                  "id": 17237,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "2233:13:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_90bd8cd0463fe91d31e59db57ee4cf8d778374c422b4b50e841266d9c2cc6667",
                                    "typeString": "literal_string \"log(bytes9)\""
                                  },
                                  "value": "log(bytes9)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17238,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17231,
                                  "src": "2248:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes9",
                                    "typeString": "bytes9"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_90bd8cd0463fe91d31e59db57ee4cf8d778374c422b4b50e841266d9c2cc6667",
                                    "typeString": "literal_string \"log(bytes9)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes9",
                                    "typeString": "bytes9"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17235,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "2209:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17236,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "2209:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17239,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2209:42:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17234,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "2193:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17240,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2193:59:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17241,
                        "nodeType": "ExpressionStatement",
                        "src": "2193:59:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17243,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes9",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17232,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17231,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17243,
                        "src": "2164:9:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes9",
                          "typeString": "bytes9"
                        },
                        "typeName": {
                          "id": 17230,
                          "name": "bytes9",
                          "nodeType": "ElementaryTypeName",
                          "src": "2164:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes9",
                            "typeString": "bytes9"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2163:11:101"
                  },
                  "returnParameters": {
                    "id": 17233,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2189:0:101"
                  },
                  "scope": 25062,
                  "src": "2145:111:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17256,
                    "nodeType": "Block",
                    "src": "2305:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286279746573313029",
                                  "id": 17251,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "2349:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_013d178bb749cf32d0f7243763667360eb91576261efe5ed9be72b4a2800fd66",
                                    "typeString": "literal_string \"log(bytes10)\""
                                  },
                                  "value": "log(bytes10)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17252,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17245,
                                  "src": "2365:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes10",
                                    "typeString": "bytes10"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_013d178bb749cf32d0f7243763667360eb91576261efe5ed9be72b4a2800fd66",
                                    "typeString": "literal_string \"log(bytes10)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes10",
                                    "typeString": "bytes10"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17249,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "2325:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17250,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "2325:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17253,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2325:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17248,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "2309:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17254,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2309:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17255,
                        "nodeType": "ExpressionStatement",
                        "src": "2309:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17257,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes10",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17246,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17245,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17257,
                        "src": "2279:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes10",
                          "typeString": "bytes10"
                        },
                        "typeName": {
                          "id": 17244,
                          "name": "bytes10",
                          "nodeType": "ElementaryTypeName",
                          "src": "2279:7:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes10",
                            "typeString": "bytes10"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2278:12:101"
                  },
                  "returnParameters": {
                    "id": 17247,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2305:0:101"
                  },
                  "scope": 25062,
                  "src": "2259:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17270,
                    "nodeType": "Block",
                    "src": "2422:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286279746573313129",
                                  "id": 17265,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "2466:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_04004a2e5bef8ca2e7ffd661b519aec3d9c1b8d0aa1e11656aab73b2726922d9",
                                    "typeString": "literal_string \"log(bytes11)\""
                                  },
                                  "value": "log(bytes11)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17266,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17259,
                                  "src": "2482:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes11",
                                    "typeString": "bytes11"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_04004a2e5bef8ca2e7ffd661b519aec3d9c1b8d0aa1e11656aab73b2726922d9",
                                    "typeString": "literal_string \"log(bytes11)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes11",
                                    "typeString": "bytes11"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17263,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "2442:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17264,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "2442:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17267,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2442:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17262,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "2426:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17268,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2426:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17269,
                        "nodeType": "ExpressionStatement",
                        "src": "2426:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17271,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes11",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17260,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17259,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17271,
                        "src": "2396:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes11",
                          "typeString": "bytes11"
                        },
                        "typeName": {
                          "id": 17258,
                          "name": "bytes11",
                          "nodeType": "ElementaryTypeName",
                          "src": "2396:7:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes11",
                            "typeString": "bytes11"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2395:12:101"
                  },
                  "returnParameters": {
                    "id": 17261,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2422:0:101"
                  },
                  "scope": 25062,
                  "src": "2376:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17284,
                    "nodeType": "Block",
                    "src": "2539:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286279746573313229",
                                  "id": 17279,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "2583:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_86a06abd704b9e5bab2216d456863046355f2def5304d8276c140d0d454fddf2",
                                    "typeString": "literal_string \"log(bytes12)\""
                                  },
                                  "value": "log(bytes12)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17280,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17273,
                                  "src": "2599:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes12",
                                    "typeString": "bytes12"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_86a06abd704b9e5bab2216d456863046355f2def5304d8276c140d0d454fddf2",
                                    "typeString": "literal_string \"log(bytes12)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes12",
                                    "typeString": "bytes12"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17277,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "2559:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17278,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "2559:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17281,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2559:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17276,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "2543:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17282,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2543:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17283,
                        "nodeType": "ExpressionStatement",
                        "src": "2543:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17285,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes12",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17274,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17273,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17285,
                        "src": "2513:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes12",
                          "typeString": "bytes12"
                        },
                        "typeName": {
                          "id": 17272,
                          "name": "bytes12",
                          "nodeType": "ElementaryTypeName",
                          "src": "2513:7:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes12",
                            "typeString": "bytes12"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2512:12:101"
                  },
                  "returnParameters": {
                    "id": 17275,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2539:0:101"
                  },
                  "scope": 25062,
                  "src": "2493:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17298,
                    "nodeType": "Block",
                    "src": "2656:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286279746573313329",
                                  "id": 17293,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "2700:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_94529e34a43ac6de2c3a0df402eee6114eb0f2ad065baefde0230cd3cf90e2ec",
                                    "typeString": "literal_string \"log(bytes13)\""
                                  },
                                  "value": "log(bytes13)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17294,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17287,
                                  "src": "2716:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes13",
                                    "typeString": "bytes13"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_94529e34a43ac6de2c3a0df402eee6114eb0f2ad065baefde0230cd3cf90e2ec",
                                    "typeString": "literal_string \"log(bytes13)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes13",
                                    "typeString": "bytes13"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17291,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "2676:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17292,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "2676:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17295,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2676:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17290,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "2660:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17296,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2660:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17297,
                        "nodeType": "ExpressionStatement",
                        "src": "2660:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17299,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes13",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17288,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17287,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17299,
                        "src": "2630:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes13",
                          "typeString": "bytes13"
                        },
                        "typeName": {
                          "id": 17286,
                          "name": "bytes13",
                          "nodeType": "ElementaryTypeName",
                          "src": "2630:7:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes13",
                            "typeString": "bytes13"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2629:12:101"
                  },
                  "returnParameters": {
                    "id": 17289,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2656:0:101"
                  },
                  "scope": 25062,
                  "src": "2610:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17312,
                    "nodeType": "Block",
                    "src": "2773:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286279746573313429",
                                  "id": 17307,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "2817:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_9266f07faf32c88bbdb01ce418243acbc1c63e15d6e3afa16078186ba711f278",
                                    "typeString": "literal_string \"log(bytes14)\""
                                  },
                                  "value": "log(bytes14)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17308,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17301,
                                  "src": "2833:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes14",
                                    "typeString": "bytes14"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_9266f07faf32c88bbdb01ce418243acbc1c63e15d6e3afa16078186ba711f278",
                                    "typeString": "literal_string \"log(bytes14)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes14",
                                    "typeString": "bytes14"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17305,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "2793:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17306,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "2793:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17309,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2793:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17304,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "2777:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17310,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2777:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17311,
                        "nodeType": "ExpressionStatement",
                        "src": "2777:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17313,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes14",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17302,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17301,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17313,
                        "src": "2747:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes14",
                          "typeString": "bytes14"
                        },
                        "typeName": {
                          "id": 17300,
                          "name": "bytes14",
                          "nodeType": "ElementaryTypeName",
                          "src": "2747:7:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes14",
                            "typeString": "bytes14"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2746:12:101"
                  },
                  "returnParameters": {
                    "id": 17303,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2773:0:101"
                  },
                  "scope": 25062,
                  "src": "2727:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17326,
                    "nodeType": "Block",
                    "src": "2890:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286279746573313529",
                                  "id": 17321,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "2934:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_da9574e0bf3f23e09c3d85c9f5226065bb36281f2a5d78c7e38f6ffd58919606",
                                    "typeString": "literal_string \"log(bytes15)\""
                                  },
                                  "value": "log(bytes15)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17322,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17315,
                                  "src": "2950:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes15",
                                    "typeString": "bytes15"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_da9574e0bf3f23e09c3d85c9f5226065bb36281f2a5d78c7e38f6ffd58919606",
                                    "typeString": "literal_string \"log(bytes15)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes15",
                                    "typeString": "bytes15"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17319,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "2910:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17320,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "2910:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17323,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "2910:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17318,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "2894:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17324,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2894:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17325,
                        "nodeType": "ExpressionStatement",
                        "src": "2894:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17327,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes15",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17316,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17315,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17327,
                        "src": "2864:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes15",
                          "typeString": "bytes15"
                        },
                        "typeName": {
                          "id": 17314,
                          "name": "bytes15",
                          "nodeType": "ElementaryTypeName",
                          "src": "2864:7:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes15",
                            "typeString": "bytes15"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2863:12:101"
                  },
                  "returnParameters": {
                    "id": 17317,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2890:0:101"
                  },
                  "scope": 25062,
                  "src": "2844:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17340,
                    "nodeType": "Block",
                    "src": "3007:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286279746573313629",
                                  "id": 17335,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "3051:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_665c61046af0adc4969f9d2f111b654775bd58f112b63e5ce7dfff29c000e9f3",
                                    "typeString": "literal_string \"log(bytes16)\""
                                  },
                                  "value": "log(bytes16)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17336,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17329,
                                  "src": "3067:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes16",
                                    "typeString": "bytes16"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_665c61046af0adc4969f9d2f111b654775bd58f112b63e5ce7dfff29c000e9f3",
                                    "typeString": "literal_string \"log(bytes16)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes16",
                                    "typeString": "bytes16"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17333,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "3027:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17334,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "3027:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17337,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3027:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17332,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "3011:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17338,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3011:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17339,
                        "nodeType": "ExpressionStatement",
                        "src": "3011:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17341,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes16",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17330,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17329,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17341,
                        "src": "2981:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes16",
                          "typeString": "bytes16"
                        },
                        "typeName": {
                          "id": 17328,
                          "name": "bytes16",
                          "nodeType": "ElementaryTypeName",
                          "src": "2981:7:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes16",
                            "typeString": "bytes16"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2980:12:101"
                  },
                  "returnParameters": {
                    "id": 17331,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3007:0:101"
                  },
                  "scope": 25062,
                  "src": "2961:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17354,
                    "nodeType": "Block",
                    "src": "3124:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286279746573313729",
                                  "id": 17349,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "3168:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_339f673a0c008974259a0022c9b150cc5d1af8c58584412fe373d84bd08d4ea3",
                                    "typeString": "literal_string \"log(bytes17)\""
                                  },
                                  "value": "log(bytes17)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17350,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17343,
                                  "src": "3184:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes17",
                                    "typeString": "bytes17"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_339f673a0c008974259a0022c9b150cc5d1af8c58584412fe373d84bd08d4ea3",
                                    "typeString": "literal_string \"log(bytes17)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes17",
                                    "typeString": "bytes17"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17347,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "3144:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17348,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "3144:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17351,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3144:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17346,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "3128:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17352,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3128:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17353,
                        "nodeType": "ExpressionStatement",
                        "src": "3128:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17355,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes17",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17344,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17343,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17355,
                        "src": "3098:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes17",
                          "typeString": "bytes17"
                        },
                        "typeName": {
                          "id": 17342,
                          "name": "bytes17",
                          "nodeType": "ElementaryTypeName",
                          "src": "3098:7:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes17",
                            "typeString": "bytes17"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3097:12:101"
                  },
                  "returnParameters": {
                    "id": 17345,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3124:0:101"
                  },
                  "scope": 25062,
                  "src": "3078:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17368,
                    "nodeType": "Block",
                    "src": "3241:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286279746573313829",
                                  "id": 17363,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "3285:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c4d23d9af6458d5ddc7cb8128a2f36bf147c9db4fe277dfe0fe7be41def62116",
                                    "typeString": "literal_string \"log(bytes18)\""
                                  },
                                  "value": "log(bytes18)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17364,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17357,
                                  "src": "3301:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes18",
                                    "typeString": "bytes18"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_c4d23d9af6458d5ddc7cb8128a2f36bf147c9db4fe277dfe0fe7be41def62116",
                                    "typeString": "literal_string \"log(bytes18)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes18",
                                    "typeString": "bytes18"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17361,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "3261:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17362,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "3261:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17365,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3261:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17360,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "3245:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17366,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3245:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17367,
                        "nodeType": "ExpressionStatement",
                        "src": "3245:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17369,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes18",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17358,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17357,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17369,
                        "src": "3215:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes18",
                          "typeString": "bytes18"
                        },
                        "typeName": {
                          "id": 17356,
                          "name": "bytes18",
                          "nodeType": "ElementaryTypeName",
                          "src": "3215:7:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes18",
                            "typeString": "bytes18"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3214:12:101"
                  },
                  "returnParameters": {
                    "id": 17359,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3241:0:101"
                  },
                  "scope": 25062,
                  "src": "3195:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17382,
                    "nodeType": "Block",
                    "src": "3358:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286279746573313929",
                                  "id": 17377,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "3402:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_5e6b5a33524ca650028e2fad735b4ab50285bba37658119d2da303bee98aeada",
                                    "typeString": "literal_string \"log(bytes19)\""
                                  },
                                  "value": "log(bytes19)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17378,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17371,
                                  "src": "3418:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes19",
                                    "typeString": "bytes19"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_5e6b5a33524ca650028e2fad735b4ab50285bba37658119d2da303bee98aeada",
                                    "typeString": "literal_string \"log(bytes19)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes19",
                                    "typeString": "bytes19"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17375,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "3378:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17376,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "3378:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17379,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3378:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17374,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "3362:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17380,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3362:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17381,
                        "nodeType": "ExpressionStatement",
                        "src": "3362:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17383,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes19",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17372,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17371,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17383,
                        "src": "3332:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes19",
                          "typeString": "bytes19"
                        },
                        "typeName": {
                          "id": 17370,
                          "name": "bytes19",
                          "nodeType": "ElementaryTypeName",
                          "src": "3332:7:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes19",
                            "typeString": "bytes19"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3331:12:101"
                  },
                  "returnParameters": {
                    "id": 17373,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3358:0:101"
                  },
                  "scope": 25062,
                  "src": "3312:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17396,
                    "nodeType": "Block",
                    "src": "3475:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286279746573323029",
                                  "id": 17391,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "3519:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_5188e3e9b3f117a223e2e428d0e13d089f3a53913e479000b94b85266ecf8231",
                                    "typeString": "literal_string \"log(bytes20)\""
                                  },
                                  "value": "log(bytes20)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17392,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17385,
                                  "src": "3535:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes20",
                                    "typeString": "bytes20"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_5188e3e9b3f117a223e2e428d0e13d089f3a53913e479000b94b85266ecf8231",
                                    "typeString": "literal_string \"log(bytes20)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes20",
                                    "typeString": "bytes20"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17389,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "3495:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17390,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "3495:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17393,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3495:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17388,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "3479:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17394,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3479:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17395,
                        "nodeType": "ExpressionStatement",
                        "src": "3479:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17397,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes20",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17386,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17385,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17397,
                        "src": "3449:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes20",
                          "typeString": "bytes20"
                        },
                        "typeName": {
                          "id": 17384,
                          "name": "bytes20",
                          "nodeType": "ElementaryTypeName",
                          "src": "3449:7:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes20",
                            "typeString": "bytes20"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3448:12:101"
                  },
                  "returnParameters": {
                    "id": 17387,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3475:0:101"
                  },
                  "scope": 25062,
                  "src": "3429:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17410,
                    "nodeType": "Block",
                    "src": "3592:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286279746573323129",
                                  "id": 17405,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "3636:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_e9da35608192a6b38ad5ef62cf738886973b011b8cdb7e81cdd51b4c3dfe8ad7",
                                    "typeString": "literal_string \"log(bytes21)\""
                                  },
                                  "value": "log(bytes21)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17406,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17399,
                                  "src": "3652:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes21",
                                    "typeString": "bytes21"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_e9da35608192a6b38ad5ef62cf738886973b011b8cdb7e81cdd51b4c3dfe8ad7",
                                    "typeString": "literal_string \"log(bytes21)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes21",
                                    "typeString": "bytes21"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17403,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "3612:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17404,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "3612:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17407,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3612:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17402,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "3596:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17408,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3596:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17409,
                        "nodeType": "ExpressionStatement",
                        "src": "3596:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17411,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes21",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17400,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17399,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17411,
                        "src": "3566:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes21",
                          "typeString": "bytes21"
                        },
                        "typeName": {
                          "id": 17398,
                          "name": "bytes21",
                          "nodeType": "ElementaryTypeName",
                          "src": "3566:7:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes21",
                            "typeString": "bytes21"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3565:12:101"
                  },
                  "returnParameters": {
                    "id": 17401,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3592:0:101"
                  },
                  "scope": 25062,
                  "src": "3546:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17424,
                    "nodeType": "Block",
                    "src": "3709:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286279746573323229",
                                  "id": 17419,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "3753:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_d5fae89c25bed6f12b105f52db0a0ff6f5c8313613e12eccd3059bb7f7ea6575",
                                    "typeString": "literal_string \"log(bytes22)\""
                                  },
                                  "value": "log(bytes22)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17420,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17413,
                                  "src": "3769:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes22",
                                    "typeString": "bytes22"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_d5fae89c25bed6f12b105f52db0a0ff6f5c8313613e12eccd3059bb7f7ea6575",
                                    "typeString": "literal_string \"log(bytes22)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes22",
                                    "typeString": "bytes22"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17417,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "3729:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17418,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "3729:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17421,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3729:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17416,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "3713:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17422,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3713:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17423,
                        "nodeType": "ExpressionStatement",
                        "src": "3713:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17425,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes22",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17414,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17413,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17425,
                        "src": "3683:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes22",
                          "typeString": "bytes22"
                        },
                        "typeName": {
                          "id": 17412,
                          "name": "bytes22",
                          "nodeType": "ElementaryTypeName",
                          "src": "3683:7:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes22",
                            "typeString": "bytes22"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3682:12:101"
                  },
                  "returnParameters": {
                    "id": 17415,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3709:0:101"
                  },
                  "scope": 25062,
                  "src": "3663:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17438,
                    "nodeType": "Block",
                    "src": "3826:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286279746573323329",
                                  "id": 17433,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "3870:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_aba1cf0dcd316c862bc06d4cf532375fed11c1e0897ba81a04ee0b22d3f14061",
                                    "typeString": "literal_string \"log(bytes23)\""
                                  },
                                  "value": "log(bytes23)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17434,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17427,
                                  "src": "3886:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes23",
                                    "typeString": "bytes23"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_aba1cf0dcd316c862bc06d4cf532375fed11c1e0897ba81a04ee0b22d3f14061",
                                    "typeString": "literal_string \"log(bytes23)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes23",
                                    "typeString": "bytes23"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17431,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "3846:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17432,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "3846:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17435,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3846:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17430,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "3830:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17436,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3830:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17437,
                        "nodeType": "ExpressionStatement",
                        "src": "3830:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17439,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes23",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17428,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17427,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17439,
                        "src": "3800:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes23",
                          "typeString": "bytes23"
                        },
                        "typeName": {
                          "id": 17426,
                          "name": "bytes23",
                          "nodeType": "ElementaryTypeName",
                          "src": "3800:7:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes23",
                            "typeString": "bytes23"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3799:12:101"
                  },
                  "returnParameters": {
                    "id": 17429,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3826:0:101"
                  },
                  "scope": 25062,
                  "src": "3780:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17452,
                    "nodeType": "Block",
                    "src": "3943:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286279746573323429",
                                  "id": 17447,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "3987:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_f1b35b3488a5452bceb48624d6ba2a791e58f0e9c0f4b86b8f51186ec7a7edf4",
                                    "typeString": "literal_string \"log(bytes24)\""
                                  },
                                  "value": "log(bytes24)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17448,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17441,
                                  "src": "4003:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes24",
                                    "typeString": "bytes24"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_f1b35b3488a5452bceb48624d6ba2a791e58f0e9c0f4b86b8f51186ec7a7edf4",
                                    "typeString": "literal_string \"log(bytes24)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes24",
                                    "typeString": "bytes24"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17445,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "3963:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17446,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "3963:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17449,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "3963:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17444,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "3947:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17450,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "3947:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17451,
                        "nodeType": "ExpressionStatement",
                        "src": "3947:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17453,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes24",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17442,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17441,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17453,
                        "src": "3917:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes24",
                          "typeString": "bytes24"
                        },
                        "typeName": {
                          "id": 17440,
                          "name": "bytes24",
                          "nodeType": "ElementaryTypeName",
                          "src": "3917:7:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes24",
                            "typeString": "bytes24"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "3916:12:101"
                  },
                  "returnParameters": {
                    "id": 17443,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "3943:0:101"
                  },
                  "scope": 25062,
                  "src": "3897:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17466,
                    "nodeType": "Block",
                    "src": "4060:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286279746573323529",
                                  "id": 17461,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "4104:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_0b84bc580db9be1295ee23dff6122da1f70381c83abf9a74953cca11238eda25",
                                    "typeString": "literal_string \"log(bytes25)\""
                                  },
                                  "value": "log(bytes25)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17462,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17455,
                                  "src": "4120:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes25",
                                    "typeString": "bytes25"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_0b84bc580db9be1295ee23dff6122da1f70381c83abf9a74953cca11238eda25",
                                    "typeString": "literal_string \"log(bytes25)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes25",
                                    "typeString": "bytes25"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17459,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "4080:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17460,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "4080:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17463,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "4080:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17458,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "4064:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17464,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4064:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17465,
                        "nodeType": "ExpressionStatement",
                        "src": "4064:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17467,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes25",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17456,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17455,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17467,
                        "src": "4034:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes25",
                          "typeString": "bytes25"
                        },
                        "typeName": {
                          "id": 17454,
                          "name": "bytes25",
                          "nodeType": "ElementaryTypeName",
                          "src": "4034:7:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes25",
                            "typeString": "bytes25"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4033:12:101"
                  },
                  "returnParameters": {
                    "id": 17457,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4060:0:101"
                  },
                  "scope": 25062,
                  "src": "4014:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17480,
                    "nodeType": "Block",
                    "src": "4177:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286279746573323629",
                                  "id": 17475,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "4221:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_f8b149f18dc341f1a56e26c6c24a5233eec3bbb2ab017e9e86e663aae743965b",
                                    "typeString": "literal_string \"log(bytes26)\""
                                  },
                                  "value": "log(bytes26)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17476,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17469,
                                  "src": "4237:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes26",
                                    "typeString": "bytes26"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_f8b149f18dc341f1a56e26c6c24a5233eec3bbb2ab017e9e86e663aae743965b",
                                    "typeString": "literal_string \"log(bytes26)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes26",
                                    "typeString": "bytes26"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17473,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "4197:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17474,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "4197:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17477,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "4197:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17472,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "4181:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17478,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4181:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17479,
                        "nodeType": "ExpressionStatement",
                        "src": "4181:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17481,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes26",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17470,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17469,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17481,
                        "src": "4151:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes26",
                          "typeString": "bytes26"
                        },
                        "typeName": {
                          "id": 17468,
                          "name": "bytes26",
                          "nodeType": "ElementaryTypeName",
                          "src": "4151:7:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes26",
                            "typeString": "bytes26"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4150:12:101"
                  },
                  "returnParameters": {
                    "id": 17471,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4177:0:101"
                  },
                  "scope": 25062,
                  "src": "4131:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17494,
                    "nodeType": "Block",
                    "src": "4294:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286279746573323729",
                                  "id": 17489,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "4338:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_3a3757dda92e8e238aa23ff7f6f62e31074f6acccca8986ec1286b5a835236b6",
                                    "typeString": "literal_string \"log(bytes27)\""
                                  },
                                  "value": "log(bytes27)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17490,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17483,
                                  "src": "4354:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes27",
                                    "typeString": "bytes27"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_3a3757dda92e8e238aa23ff7f6f62e31074f6acccca8986ec1286b5a835236b6",
                                    "typeString": "literal_string \"log(bytes27)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes27",
                                    "typeString": "bytes27"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17487,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "4314:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17488,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "4314:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17491,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "4314:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17486,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "4298:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17492,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4298:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17493,
                        "nodeType": "ExpressionStatement",
                        "src": "4298:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17495,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes27",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17484,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17483,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17495,
                        "src": "4268:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes27",
                          "typeString": "bytes27"
                        },
                        "typeName": {
                          "id": 17482,
                          "name": "bytes27",
                          "nodeType": "ElementaryTypeName",
                          "src": "4268:7:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes27",
                            "typeString": "bytes27"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4267:12:101"
                  },
                  "returnParameters": {
                    "id": 17485,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4294:0:101"
                  },
                  "scope": 25062,
                  "src": "4248:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17508,
                    "nodeType": "Block",
                    "src": "4411:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286279746573323829",
                                  "id": 17503,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "4455:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c82aeaee74a6ddec4ccd5cfe60e816752c02c70838f0908bd4a6e82866b3a042",
                                    "typeString": "literal_string \"log(bytes28)\""
                                  },
                                  "value": "log(bytes28)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17504,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17497,
                                  "src": "4471:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes28",
                                    "typeString": "bytes28"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_c82aeaee74a6ddec4ccd5cfe60e816752c02c70838f0908bd4a6e82866b3a042",
                                    "typeString": "literal_string \"log(bytes28)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes28",
                                    "typeString": "bytes28"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17501,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "4431:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17502,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "4431:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17505,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "4431:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17500,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "4415:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17506,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4415:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17507,
                        "nodeType": "ExpressionStatement",
                        "src": "4415:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17509,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes28",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17498,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17497,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17509,
                        "src": "4385:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes28",
                          "typeString": "bytes28"
                        },
                        "typeName": {
                          "id": 17496,
                          "name": "bytes28",
                          "nodeType": "ElementaryTypeName",
                          "src": "4385:7:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes28",
                            "typeString": "bytes28"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4384:12:101"
                  },
                  "returnParameters": {
                    "id": 17499,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4411:0:101"
                  },
                  "scope": 25062,
                  "src": "4365:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17522,
                    "nodeType": "Block",
                    "src": "4528:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286279746573323929",
                                  "id": 17517,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "4572:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_4b69c3d5f782ef1bdb62d5bb42d4987f16799030ba447bb153d465bd3a3a5667",
                                    "typeString": "literal_string \"log(bytes29)\""
                                  },
                                  "value": "log(bytes29)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17518,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17511,
                                  "src": "4588:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes29",
                                    "typeString": "bytes29"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_4b69c3d5f782ef1bdb62d5bb42d4987f16799030ba447bb153d465bd3a3a5667",
                                    "typeString": "literal_string \"log(bytes29)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes29",
                                    "typeString": "bytes29"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17515,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "4548:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17516,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "4548:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17519,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "4548:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17514,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "4532:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17520,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4532:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17521,
                        "nodeType": "ExpressionStatement",
                        "src": "4532:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17523,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes29",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17512,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17511,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17523,
                        "src": "4502:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes29",
                          "typeString": "bytes29"
                        },
                        "typeName": {
                          "id": 17510,
                          "name": "bytes29",
                          "nodeType": "ElementaryTypeName",
                          "src": "4502:7:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes29",
                            "typeString": "bytes29"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4501:12:101"
                  },
                  "returnParameters": {
                    "id": 17513,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4528:0:101"
                  },
                  "scope": 25062,
                  "src": "4482:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17536,
                    "nodeType": "Block",
                    "src": "4645:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286279746573333029",
                                  "id": 17531,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "4689:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_ee12c4edbd73d98174a6bf3454562c4874f59cb381176b662ca65f625f97d6ad",
                                    "typeString": "literal_string \"log(bytes30)\""
                                  },
                                  "value": "log(bytes30)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17532,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17525,
                                  "src": "4705:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes30",
                                    "typeString": "bytes30"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_ee12c4edbd73d98174a6bf3454562c4874f59cb381176b662ca65f625f97d6ad",
                                    "typeString": "literal_string \"log(bytes30)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes30",
                                    "typeString": "bytes30"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17529,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "4665:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17530,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "4665:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17533,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "4665:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17528,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "4649:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17534,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4649:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17535,
                        "nodeType": "ExpressionStatement",
                        "src": "4649:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17537,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes30",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17526,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17525,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17537,
                        "src": "4619:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes30",
                          "typeString": "bytes30"
                        },
                        "typeName": {
                          "id": 17524,
                          "name": "bytes30",
                          "nodeType": "ElementaryTypeName",
                          "src": "4619:7:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes30",
                            "typeString": "bytes30"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4618:12:101"
                  },
                  "returnParameters": {
                    "id": 17527,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4645:0:101"
                  },
                  "scope": 25062,
                  "src": "4599:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17550,
                    "nodeType": "Block",
                    "src": "4762:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286279746573333129",
                                  "id": 17545,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "4806:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c2854d92a0707e582e2710f9c9d3f148fdcf7e7da3b4270c2cfa3e223a2c50ce",
                                    "typeString": "literal_string \"log(bytes31)\""
                                  },
                                  "value": "log(bytes31)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17546,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17539,
                                  "src": "4822:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes31",
                                    "typeString": "bytes31"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_c2854d92a0707e582e2710f9c9d3f148fdcf7e7da3b4270c2cfa3e223a2c50ce",
                                    "typeString": "literal_string \"log(bytes31)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes31",
                                    "typeString": "bytes31"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17543,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "4782:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17544,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "4782:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17547,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "4782:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17542,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "4766:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17548,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4766:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17549,
                        "nodeType": "ExpressionStatement",
                        "src": "4766:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17551,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes31",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17540,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17539,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17551,
                        "src": "4736:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes31",
                          "typeString": "bytes31"
                        },
                        "typeName": {
                          "id": 17538,
                          "name": "bytes31",
                          "nodeType": "ElementaryTypeName",
                          "src": "4736:7:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes31",
                            "typeString": "bytes31"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4735:12:101"
                  },
                  "returnParameters": {
                    "id": 17541,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4762:0:101"
                  },
                  "scope": 25062,
                  "src": "4716:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17564,
                    "nodeType": "Block",
                    "src": "4879:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286279746573333229",
                                  "id": 17559,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "4923:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_27b7cf8513ac6b65cae720183e1e60e67f8a9d92c01286c19d51d4e30aa269da",
                                    "typeString": "literal_string \"log(bytes32)\""
                                  },
                                  "value": "log(bytes32)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17560,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17553,
                                  "src": "4939:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_27b7cf8513ac6b65cae720183e1e60e67f8a9d92c01286c19d51d4e30aa269da",
                                    "typeString": "literal_string \"log(bytes32)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bytes32",
                                    "typeString": "bytes32"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17557,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "4899:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17558,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "4899:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17561,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "4899:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17556,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "4883:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17562,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4883:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17563,
                        "nodeType": "ExpressionStatement",
                        "src": "4883:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17565,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "logBytes32",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17554,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17553,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17565,
                        "src": "4853:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 17552,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "4853:7:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4852:12:101"
                  },
                  "returnParameters": {
                    "id": 17555,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4879:0:101"
                  },
                  "scope": 25062,
                  "src": "4833:114:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17578,
                    "nodeType": "Block",
                    "src": "4986:65:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e7429",
                                  "id": 17573,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "5030:11:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_f5b1bba92d8f98cf25e27c94d7fc7cbfbae95a49dfe5ab0cdf64ddd7181bb984",
                                    "typeString": "literal_string \"log(uint)\""
                                  },
                                  "value": "log(uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17574,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17567,
                                  "src": "5043:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_f5b1bba92d8f98cf25e27c94d7fc7cbfbae95a49dfe5ab0cdf64ddd7181bb984",
                                    "typeString": "literal_string \"log(uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17571,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "5006:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17572,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "5006:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17575,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5006:40:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17570,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "4990:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17576,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4990:57:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17577,
                        "nodeType": "ExpressionStatement",
                        "src": "4990:57:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17579,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17568,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17567,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17579,
                        "src": "4963:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17566,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "4963:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "4962:9:101"
                  },
                  "returnParameters": {
                    "id": 17569,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "4986:0:101"
                  },
                  "scope": 25062,
                  "src": "4950:101:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17592,
                    "nodeType": "Block",
                    "src": "5099:67:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e6729",
                                  "id": 17587,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "5143:13:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_41304facd9323d75b11bcdd609cb38effffdb05710f7caf0e9b16c6d9d709f50",
                                    "typeString": "literal_string \"log(string)\""
                                  },
                                  "value": "log(string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17588,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17581,
                                  "src": "5158:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_41304facd9323d75b11bcdd609cb38effffdb05710f7caf0e9b16c6d9d709f50",
                                    "typeString": "literal_string \"log(string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17585,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "5119:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17586,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "5119:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17589,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5119:42:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17584,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "5103:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17590,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5103:59:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17591,
                        "nodeType": "ExpressionStatement",
                        "src": "5103:59:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17593,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17582,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17581,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17593,
                        "src": "5067:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 17580,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "5067:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5066:18:101"
                  },
                  "returnParameters": {
                    "id": 17583,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "5099:0:101"
                  },
                  "scope": 25062,
                  "src": "5054:112:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17606,
                    "nodeType": "Block",
                    "src": "5205:65:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c29",
                                  "id": 17601,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "5249:11:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_32458eed3feca62a69292a55ca8a755ae4e6cdc57a38d15c298330064467fdd7",
                                    "typeString": "literal_string \"log(bool)\""
                                  },
                                  "value": "log(bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17602,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17595,
                                  "src": "5262:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_32458eed3feca62a69292a55ca8a755ae4e6cdc57a38d15c298330064467fdd7",
                                    "typeString": "literal_string \"log(bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17599,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "5225:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17600,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "5225:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17603,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5225:40:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17598,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "5209:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17604,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5209:57:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17605,
                        "nodeType": "ExpressionStatement",
                        "src": "5209:57:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17607,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17596,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17595,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17607,
                        "src": "5182:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 17594,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "5182:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5181:9:101"
                  },
                  "returnParameters": {
                    "id": 17597,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "5205:0:101"
                  },
                  "scope": 25062,
                  "src": "5169:101:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17620,
                    "nodeType": "Block",
                    "src": "5312:68:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f67286164647265737329",
                                  "id": 17615,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "5356:14:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_2c2ecbc2212ac38c2f9ec89aa5fcef7f532a5db24dbf7cad1f48bc82843b7428",
                                    "typeString": "literal_string \"log(address)\""
                                  },
                                  "value": "log(address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17616,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17609,
                                  "src": "5372:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_2c2ecbc2212ac38c2f9ec89aa5fcef7f532a5db24dbf7cad1f48bc82843b7428",
                                    "typeString": "literal_string \"log(address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17613,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "5332:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17614,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "5332:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17617,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5332:43:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17612,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "5316:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17618,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5316:60:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17619,
                        "nodeType": "ExpressionStatement",
                        "src": "5316:60:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17621,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17610,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17609,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17621,
                        "src": "5286:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 17608,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5286:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5285:12:101"
                  },
                  "returnParameters": {
                    "id": 17611,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "5312:0:101"
                  },
                  "scope": 25062,
                  "src": "5273:107:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17637,
                    "nodeType": "Block",
                    "src": "5428:74:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c75696e7429",
                                  "id": 17631,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "5472:16:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_6c0f69806b714804c91bc48c3b408dde7373841a86e55c9ea3ee0c5945b4bc32",
                                    "typeString": "literal_string \"log(uint,uint)\""
                                  },
                                  "value": "log(uint,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17632,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17623,
                                  "src": "5490:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17633,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17625,
                                  "src": "5494:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_6c0f69806b714804c91bc48c3b408dde7373841a86e55c9ea3ee0c5945b4bc32",
                                    "typeString": "literal_string \"log(uint,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17629,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "5448:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17630,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "5448:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17634,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5448:49:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17628,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "5432:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17635,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5432:66:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17636,
                        "nodeType": "ExpressionStatement",
                        "src": "5432:66:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17638,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17626,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17623,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17638,
                        "src": "5396:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17622,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "5396:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17625,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17638,
                        "src": "5405:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17624,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "5405:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5395:18:101"
                  },
                  "returnParameters": {
                    "id": 17627,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "5428:0:101"
                  },
                  "scope": 25062,
                  "src": "5383:119:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17654,
                    "nodeType": "Block",
                    "src": "5559:76:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c737472696e6729",
                                  "id": 17648,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "5603:18:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_0fa3f345ed69310615f27bede4ec80a963e2134dd287fa93c82b0c1eefe029a8",
                                    "typeString": "literal_string \"log(uint,string)\""
                                  },
                                  "value": "log(uint,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17649,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17640,
                                  "src": "5623:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17650,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17642,
                                  "src": "5627:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_0fa3f345ed69310615f27bede4ec80a963e2134dd287fa93c82b0c1eefe029a8",
                                    "typeString": "literal_string \"log(uint,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17646,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "5579:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17647,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "5579:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17651,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5579:51:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17645,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "5563:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17652,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5563:68:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17653,
                        "nodeType": "ExpressionStatement",
                        "src": "5563:68:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17655,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17643,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17640,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17655,
                        "src": "5518:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17639,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "5518:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17642,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17655,
                        "src": "5527:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 17641,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "5527:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5517:27:101"
                  },
                  "returnParameters": {
                    "id": 17644,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "5559:0:101"
                  },
                  "scope": 25062,
                  "src": "5505:130:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17671,
                    "nodeType": "Block",
                    "src": "5683:74:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c626f6f6c29",
                                  "id": 17665,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "5727:16:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_1e6dd4ecaf57d2ec6eb02f2f993c53040200a16451fba718b7e8b170825fd172",
                                    "typeString": "literal_string \"log(uint,bool)\""
                                  },
                                  "value": "log(uint,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17666,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17657,
                                  "src": "5745:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17667,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17659,
                                  "src": "5749:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_1e6dd4ecaf57d2ec6eb02f2f993c53040200a16451fba718b7e8b170825fd172",
                                    "typeString": "literal_string \"log(uint,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17663,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "5703:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17664,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "5703:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17668,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5703:49:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17662,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "5687:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17669,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5687:66:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17670,
                        "nodeType": "ExpressionStatement",
                        "src": "5687:66:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17672,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17660,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17657,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17672,
                        "src": "5651:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17656,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "5651:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17659,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17672,
                        "src": "5660:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 17658,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "5660:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5650:18:101"
                  },
                  "returnParameters": {
                    "id": 17661,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "5683:0:101"
                  },
                  "scope": 25062,
                  "src": "5638:119:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17688,
                    "nodeType": "Block",
                    "src": "5808:77:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c6164647265737329",
                                  "id": 17682,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "5852:19:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_58eb860cb5df2c2db83667a7ce62ef14d1323e0f3e304ea316fb64cd2c6fd3b2",
                                    "typeString": "literal_string \"log(uint,address)\""
                                  },
                                  "value": "log(uint,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17683,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17674,
                                  "src": "5873:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17684,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17676,
                                  "src": "5877:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_58eb860cb5df2c2db83667a7ce62ef14d1323e0f3e304ea316fb64cd2c6fd3b2",
                                    "typeString": "literal_string \"log(uint,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17680,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "5828:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17681,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "5828:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17685,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5828:52:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17679,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "5812:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17686,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5812:69:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17687,
                        "nodeType": "ExpressionStatement",
                        "src": "5812:69:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17689,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17677,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17674,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17689,
                        "src": "5773:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17673,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "5773:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17676,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17689,
                        "src": "5782:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 17675,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "5782:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5772:21:101"
                  },
                  "returnParameters": {
                    "id": 17678,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "5808:0:101"
                  },
                  "scope": 25062,
                  "src": "5760:125:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17705,
                    "nodeType": "Block",
                    "src": "5942:76:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c75696e7429",
                                  "id": 17699,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "5986:18:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_9710a9d00d210736b1ce918b483e56000e2885769da8118b2fbf9fe33949d3bd",
                                    "typeString": "literal_string \"log(string,uint)\""
                                  },
                                  "value": "log(string,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17700,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17691,
                                  "src": "6006:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17701,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17693,
                                  "src": "6010:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_9710a9d00d210736b1ce918b483e56000e2885769da8118b2fbf9fe33949d3bd",
                                    "typeString": "literal_string \"log(string,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17697,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "5962:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17698,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "5962:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17702,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "5962:51:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17696,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "5946:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17703,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5946:68:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17704,
                        "nodeType": "ExpressionStatement",
                        "src": "5946:68:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17706,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17694,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17691,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17706,
                        "src": "5901:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 17690,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "5901:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17693,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17706,
                        "src": "5919:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17692,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "5919:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5900:27:101"
                  },
                  "returnParameters": {
                    "id": 17695,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "5942:0:101"
                  },
                  "scope": 25062,
                  "src": "5888:130:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17722,
                    "nodeType": "Block",
                    "src": "6084:78:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c737472696e6729",
                                  "id": 17716,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "6128:20:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_4b5c4277d556d03fbf5ee534fba41dc13982b44f2fa82f1d48fdd8b5b5b692ac",
                                    "typeString": "literal_string \"log(string,string)\""
                                  },
                                  "value": "log(string,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17717,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17708,
                                  "src": "6150:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17718,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17710,
                                  "src": "6154:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_4b5c4277d556d03fbf5ee534fba41dc13982b44f2fa82f1d48fdd8b5b5b692ac",
                                    "typeString": "literal_string \"log(string,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17714,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "6104:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17715,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "6104:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17719,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6104:53:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17713,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "6088:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17720,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6088:70:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17721,
                        "nodeType": "ExpressionStatement",
                        "src": "6088:70:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17723,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17711,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17708,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17723,
                        "src": "6034:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 17707,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "6034:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17710,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17723,
                        "src": "6052:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 17709,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "6052:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6033:36:101"
                  },
                  "returnParameters": {
                    "id": 17712,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6084:0:101"
                  },
                  "scope": 25062,
                  "src": "6021:141:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17739,
                    "nodeType": "Block",
                    "src": "6219:76:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c626f6f6c29",
                                  "id": 17733,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "6263:18:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c3b556354c088fbb43886eb83c2a04bc7089663f964d22be308197a236f5b870",
                                    "typeString": "literal_string \"log(string,bool)\""
                                  },
                                  "value": "log(string,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17734,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17725,
                                  "src": "6283:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17735,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17727,
                                  "src": "6287:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_c3b556354c088fbb43886eb83c2a04bc7089663f964d22be308197a236f5b870",
                                    "typeString": "literal_string \"log(string,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17731,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "6239:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17732,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "6239:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17736,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6239:51:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17730,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "6223:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17737,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6223:68:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17738,
                        "nodeType": "ExpressionStatement",
                        "src": "6223:68:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17740,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17728,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17725,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17740,
                        "src": "6178:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 17724,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "6178:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17727,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17740,
                        "src": "6196:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 17726,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "6196:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6177:27:101"
                  },
                  "returnParameters": {
                    "id": 17729,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6219:0:101"
                  },
                  "scope": 25062,
                  "src": "6165:130:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17756,
                    "nodeType": "Block",
                    "src": "6355:79:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c6164647265737329",
                                  "id": 17750,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "6399:21:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_319af333460570a1937bf195dd33445c0d0951c59127da6f1f038b9fdce3fd72",
                                    "typeString": "literal_string \"log(string,address)\""
                                  },
                                  "value": "log(string,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17751,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17742,
                                  "src": "6422:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17752,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17744,
                                  "src": "6426:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_319af333460570a1937bf195dd33445c0d0951c59127da6f1f038b9fdce3fd72",
                                    "typeString": "literal_string \"log(string,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17748,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "6375:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17749,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "6375:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17753,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6375:54:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17747,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "6359:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17754,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6359:71:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17755,
                        "nodeType": "ExpressionStatement",
                        "src": "6359:71:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17757,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17745,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17742,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17757,
                        "src": "6311:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 17741,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "6311:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17744,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17757,
                        "src": "6329:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 17743,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6329:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6310:30:101"
                  },
                  "returnParameters": {
                    "id": 17746,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6355:0:101"
                  },
                  "scope": 25062,
                  "src": "6298:136:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17773,
                    "nodeType": "Block",
                    "src": "6482:74:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c75696e7429",
                                  "id": 17767,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "6526:16:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_364b6a921e139cbe48176ce2b1f6700c7e568330bc5da26f60350cc33cf2a299",
                                    "typeString": "literal_string \"log(bool,uint)\""
                                  },
                                  "value": "log(bool,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17768,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17759,
                                  "src": "6544:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17769,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17761,
                                  "src": "6548:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_364b6a921e139cbe48176ce2b1f6700c7e568330bc5da26f60350cc33cf2a299",
                                    "typeString": "literal_string \"log(bool,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17765,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "6502:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17766,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "6502:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17770,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6502:49:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17764,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "6486:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17771,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6486:66:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17772,
                        "nodeType": "ExpressionStatement",
                        "src": "6486:66:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17774,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17762,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17759,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17774,
                        "src": "6450:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 17758,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "6450:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17761,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17774,
                        "src": "6459:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17760,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "6459:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6449:18:101"
                  },
                  "returnParameters": {
                    "id": 17763,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6482:0:101"
                  },
                  "scope": 25062,
                  "src": "6437:119:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17790,
                    "nodeType": "Block",
                    "src": "6613:76:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c737472696e6729",
                                  "id": 17784,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "6657:18:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_8feac5256a5b88d7ca0173065b796567ecbc9d75ec022fa0f044eb427f962b84",
                                    "typeString": "literal_string \"log(bool,string)\""
                                  },
                                  "value": "log(bool,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17785,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17776,
                                  "src": "6677:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17786,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17778,
                                  "src": "6681:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_8feac5256a5b88d7ca0173065b796567ecbc9d75ec022fa0f044eb427f962b84",
                                    "typeString": "literal_string \"log(bool,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17782,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "6633:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17783,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "6633:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17787,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6633:51:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17781,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "6617:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17788,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6617:68:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17789,
                        "nodeType": "ExpressionStatement",
                        "src": "6617:68:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17791,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17779,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17776,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17791,
                        "src": "6572:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 17775,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "6572:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17778,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17791,
                        "src": "6581:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 17777,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "6581:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6571:27:101"
                  },
                  "returnParameters": {
                    "id": 17780,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6613:0:101"
                  },
                  "scope": 25062,
                  "src": "6559:130:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17807,
                    "nodeType": "Block",
                    "src": "6737:74:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c626f6f6c29",
                                  "id": 17801,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "6781:16:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_2a110e83227fbe26ff7524076f2091da3e9aa01d70b93677da53b41d22f4fb15",
                                    "typeString": "literal_string \"log(bool,bool)\""
                                  },
                                  "value": "log(bool,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17802,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17793,
                                  "src": "6799:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17803,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17795,
                                  "src": "6803:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_2a110e83227fbe26ff7524076f2091da3e9aa01d70b93677da53b41d22f4fb15",
                                    "typeString": "literal_string \"log(bool,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17799,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "6757:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17800,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "6757:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17804,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6757:49:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17798,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "6741:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17805,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6741:66:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17806,
                        "nodeType": "ExpressionStatement",
                        "src": "6741:66:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17808,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17796,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17793,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17808,
                        "src": "6705:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 17792,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "6705:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17795,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17808,
                        "src": "6714:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 17794,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "6714:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6704:18:101"
                  },
                  "returnParameters": {
                    "id": 17797,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6737:0:101"
                  },
                  "scope": 25062,
                  "src": "6692:119:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17824,
                    "nodeType": "Block",
                    "src": "6862:77:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c6164647265737329",
                                  "id": 17818,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "6906:19:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_853c4849443241e2249adafa4f69c8bb738b0f17c7a0a9d9997450cd71db4d55",
                                    "typeString": "literal_string \"log(bool,address)\""
                                  },
                                  "value": "log(bool,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17819,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17810,
                                  "src": "6927:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17820,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17812,
                                  "src": "6931:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_853c4849443241e2249adafa4f69c8bb738b0f17c7a0a9d9997450cd71db4d55",
                                    "typeString": "literal_string \"log(bool,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17816,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "6882:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17817,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "6882:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17821,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6882:52:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17815,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "6866:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17822,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6866:69:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17823,
                        "nodeType": "ExpressionStatement",
                        "src": "6866:69:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17825,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17813,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17810,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17825,
                        "src": "6827:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 17809,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "6827:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17812,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17825,
                        "src": "6836:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 17811,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6836:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6826:21:101"
                  },
                  "returnParameters": {
                    "id": 17814,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6862:0:101"
                  },
                  "scope": 25062,
                  "src": "6814:125:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17841,
                    "nodeType": "Block",
                    "src": "6990:77:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c75696e7429",
                                  "id": 17835,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "7034:19:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_2243cfa3a64f0f85afef83b08ba731ebd8a4b1053fdc66eb414b069452c9f133",
                                    "typeString": "literal_string \"log(address,uint)\""
                                  },
                                  "value": "log(address,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17836,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17827,
                                  "src": "7055:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17837,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17829,
                                  "src": "7059:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_2243cfa3a64f0f85afef83b08ba731ebd8a4b1053fdc66eb414b069452c9f133",
                                    "typeString": "literal_string \"log(address,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17833,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "7010:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17834,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "7010:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17838,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7010:52:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17832,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "6994:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17839,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6994:69:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17840,
                        "nodeType": "ExpressionStatement",
                        "src": "6994:69:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17842,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17830,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17827,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17842,
                        "src": "6955:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 17826,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6955:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17829,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17842,
                        "src": "6967:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17828,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "6967:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6954:21:101"
                  },
                  "returnParameters": {
                    "id": 17831,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "6990:0:101"
                  },
                  "scope": 25062,
                  "src": "6942:125:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17858,
                    "nodeType": "Block",
                    "src": "7127:79:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c737472696e6729",
                                  "id": 17852,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "7171:21:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_759f86bbdd0758679ecefbd32ea620068b2339dddd9e45ee0fa567ee6c81f0ab",
                                    "typeString": "literal_string \"log(address,string)\""
                                  },
                                  "value": "log(address,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17853,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17844,
                                  "src": "7194:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17854,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17846,
                                  "src": "7198:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_759f86bbdd0758679ecefbd32ea620068b2339dddd9e45ee0fa567ee6c81f0ab",
                                    "typeString": "literal_string \"log(address,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17850,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "7147:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17851,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "7147:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17855,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7147:54:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17849,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "7131:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17856,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7131:71:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17857,
                        "nodeType": "ExpressionStatement",
                        "src": "7131:71:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17859,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17847,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17844,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17859,
                        "src": "7083:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 17843,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7083:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17846,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17859,
                        "src": "7095:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 17845,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "7095:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7082:30:101"
                  },
                  "returnParameters": {
                    "id": 17848,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "7127:0:101"
                  },
                  "scope": 25062,
                  "src": "7070:136:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17875,
                    "nodeType": "Block",
                    "src": "7257:77:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c626f6f6c29",
                                  "id": 17869,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "7301:19:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_75b605d31a3bf49c8d814696c7c66216d3a7e81348c450078f032e425592f72b",
                                    "typeString": "literal_string \"log(address,bool)\""
                                  },
                                  "value": "log(address,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17870,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17861,
                                  "src": "7322:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17871,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17863,
                                  "src": "7326:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_75b605d31a3bf49c8d814696c7c66216d3a7e81348c450078f032e425592f72b",
                                    "typeString": "literal_string \"log(address,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17867,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "7277:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17868,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "7277:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17872,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7277:52:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17866,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "7261:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17873,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7261:69:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17874,
                        "nodeType": "ExpressionStatement",
                        "src": "7261:69:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17876,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17864,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17861,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17876,
                        "src": "7222:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 17860,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7222:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17863,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17876,
                        "src": "7234:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 17862,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "7234:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7221:21:101"
                  },
                  "returnParameters": {
                    "id": 17865,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "7257:0:101"
                  },
                  "scope": 25062,
                  "src": "7209:125:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17892,
                    "nodeType": "Block",
                    "src": "7388:80:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c6164647265737329",
                                  "id": 17886,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "7432:22:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_daf0d4aa9a5679e832ac921da67b43572b4326ee2565442d3ed255b48cfb5161",
                                    "typeString": "literal_string \"log(address,address)\""
                                  },
                                  "value": "log(address,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17887,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17878,
                                  "src": "7456:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17888,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17880,
                                  "src": "7460:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_daf0d4aa9a5679e832ac921da67b43572b4326ee2565442d3ed255b48cfb5161",
                                    "typeString": "literal_string \"log(address,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17884,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "7408:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17885,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "7408:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17889,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7408:55:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17883,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "7392:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17890,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7392:72:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17891,
                        "nodeType": "ExpressionStatement",
                        "src": "7392:72:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17893,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17881,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17878,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17893,
                        "src": "7350:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 17877,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7350:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17880,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17893,
                        "src": "7362:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 17879,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7362:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7349:24:101"
                  },
                  "returnParameters": {
                    "id": 17882,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "7388:0:101"
                  },
                  "scope": 25062,
                  "src": "7337:131:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17912,
                    "nodeType": "Block",
                    "src": "7525:83:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c75696e742c75696e7429",
                                  "id": 17905,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "7569:21:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_e7820a7400e33a94b0ae6f00adee99b97ebef8b77c9e38dd555c2f6b541dee17",
                                    "typeString": "literal_string \"log(uint,uint,uint)\""
                                  },
                                  "value": "log(uint,uint,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17906,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17895,
                                  "src": "7592:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17907,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17897,
                                  "src": "7596:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17908,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17899,
                                  "src": "7600:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_e7820a7400e33a94b0ae6f00adee99b97ebef8b77c9e38dd555c2f6b541dee17",
                                    "typeString": "literal_string \"log(uint,uint,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17903,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "7545:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17904,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "7545:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17909,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7545:58:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17902,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "7529:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17910,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7529:75:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17911,
                        "nodeType": "ExpressionStatement",
                        "src": "7529:75:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17913,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17900,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17895,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17913,
                        "src": "7484:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17894,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "7484:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17897,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17913,
                        "src": "7493:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17896,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "7493:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17899,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17913,
                        "src": "7502:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17898,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "7502:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7483:27:101"
                  },
                  "returnParameters": {
                    "id": 17901,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "7525:0:101"
                  },
                  "scope": 25062,
                  "src": "7471:137:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17932,
                    "nodeType": "Block",
                    "src": "7674:85:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c75696e742c737472696e6729",
                                  "id": 17925,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "7718:23:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_7d690ee617a4217569e96b85c815115b0eee15407adaa46490ed719a45458699",
                                    "typeString": "literal_string \"log(uint,uint,string)\""
                                  },
                                  "value": "log(uint,uint,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17926,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17915,
                                  "src": "7743:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17927,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17917,
                                  "src": "7747:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17928,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17919,
                                  "src": "7751:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_7d690ee617a4217569e96b85c815115b0eee15407adaa46490ed719a45458699",
                                    "typeString": "literal_string \"log(uint,uint,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17923,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "7694:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17924,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "7694:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17929,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7694:60:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17922,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "7678:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17930,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7678:77:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17931,
                        "nodeType": "ExpressionStatement",
                        "src": "7678:77:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17933,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17920,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17915,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17933,
                        "src": "7624:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17914,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "7624:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17917,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17933,
                        "src": "7633:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17916,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "7633:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17919,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17933,
                        "src": "7642:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 17918,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "7642:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7623:36:101"
                  },
                  "returnParameters": {
                    "id": 17921,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "7674:0:101"
                  },
                  "scope": 25062,
                  "src": "7611:148:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17952,
                    "nodeType": "Block",
                    "src": "7816:83:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c75696e742c626f6f6c29",
                                  "id": 17945,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "7860:21:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_67570ff704783f5d282b26317dc28aeb4fe23c085020ec6e580604c709916fa8",
                                    "typeString": "literal_string \"log(uint,uint,bool)\""
                                  },
                                  "value": "log(uint,uint,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17946,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17935,
                                  "src": "7883:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17947,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17937,
                                  "src": "7887:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17948,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17939,
                                  "src": "7891:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_67570ff704783f5d282b26317dc28aeb4fe23c085020ec6e580604c709916fa8",
                                    "typeString": "literal_string \"log(uint,uint,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17943,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "7836:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17944,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "7836:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17949,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7836:58:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17942,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "7820:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17950,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7820:75:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17951,
                        "nodeType": "ExpressionStatement",
                        "src": "7820:75:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17953,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17940,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17935,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17953,
                        "src": "7775:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17934,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "7775:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17937,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17953,
                        "src": "7784:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17936,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "7784:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17939,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17953,
                        "src": "7793:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 17938,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "7793:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7774:27:101"
                  },
                  "returnParameters": {
                    "id": 17941,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "7816:0:101"
                  },
                  "scope": 25062,
                  "src": "7762:137:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17972,
                    "nodeType": "Block",
                    "src": "7959:86:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c75696e742c6164647265737329",
                                  "id": 17965,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "8003:24:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_be33491b8b53b7f3deae2959d1f4b0a22e6967a778c50f03dc188de84a207616",
                                    "typeString": "literal_string \"log(uint,uint,address)\""
                                  },
                                  "value": "log(uint,uint,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17966,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17955,
                                  "src": "8029:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17967,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17957,
                                  "src": "8033:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17968,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17959,
                                  "src": "8037:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_be33491b8b53b7f3deae2959d1f4b0a22e6967a778c50f03dc188de84a207616",
                                    "typeString": "literal_string \"log(uint,uint,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17963,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "7979:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17964,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "7979:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17969,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7979:61:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17962,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "7963:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17970,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "7963:78:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17971,
                        "nodeType": "ExpressionStatement",
                        "src": "7963:78:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17973,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17960,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17955,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17973,
                        "src": "7915:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17954,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "7915:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17957,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17973,
                        "src": "7924:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17956,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "7924:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17959,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17973,
                        "src": "7933:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 17958,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7933:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7914:30:101"
                  },
                  "returnParameters": {
                    "id": 17961,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "7959:0:101"
                  },
                  "scope": 25062,
                  "src": "7902:143:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 17992,
                    "nodeType": "Block",
                    "src": "8111:85:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c737472696e672c75696e7429",
                                  "id": 17985,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "8155:23:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_5b6de83ff0d95cd44df8bb8bfd95aa0a6291cab3b8502d85b1dcfd35a64c81cd",
                                    "typeString": "literal_string \"log(uint,string,uint)\""
                                  },
                                  "value": "log(uint,string,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17986,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17975,
                                  "src": "8180:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17987,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17977,
                                  "src": "8184:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 17988,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17979,
                                  "src": "8188:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_5b6de83ff0d95cd44df8bb8bfd95aa0a6291cab3b8502d85b1dcfd35a64c81cd",
                                    "typeString": "literal_string \"log(uint,string,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 17983,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "8131:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 17984,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "8131:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 17989,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "8131:60:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 17982,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "8115:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 17990,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8115:77:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 17991,
                        "nodeType": "ExpressionStatement",
                        "src": "8115:77:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 17993,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 17980,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17975,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17993,
                        "src": "8061:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17974,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "8061:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17977,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17993,
                        "src": "8070:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 17976,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "8070:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17979,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 17993,
                        "src": "8088:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17978,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "8088:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8060:36:101"
                  },
                  "returnParameters": {
                    "id": 17981,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "8111:0:101"
                  },
                  "scope": 25062,
                  "src": "8048:148:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18012,
                    "nodeType": "Block",
                    "src": "8271:87:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c737472696e672c737472696e6729",
                                  "id": 18005,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "8315:25:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_3f57c295245f8891b303347a08039155dde08dde601649242724a0ce876bcc65",
                                    "typeString": "literal_string \"log(uint,string,string)\""
                                  },
                                  "value": "log(uint,string,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18006,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17995,
                                  "src": "8342:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18007,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17997,
                                  "src": "8346:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18008,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 17999,
                                  "src": "8350:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_3f57c295245f8891b303347a08039155dde08dde601649242724a0ce876bcc65",
                                    "typeString": "literal_string \"log(uint,string,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18003,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "8291:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18004,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "8291:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18009,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "8291:62:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18002,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "8275:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18010,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8275:79:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18011,
                        "nodeType": "ExpressionStatement",
                        "src": "8275:79:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18013,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18000,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 17995,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18013,
                        "src": "8212:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 17994,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "8212:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17997,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18013,
                        "src": "8221:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 17996,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "8221:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 17999,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18013,
                        "src": "8239:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 17998,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "8239:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8211:45:101"
                  },
                  "returnParameters": {
                    "id": 18001,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "8271:0:101"
                  },
                  "scope": 25062,
                  "src": "8199:159:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18032,
                    "nodeType": "Block",
                    "src": "8424:85:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c737472696e672c626f6f6c29",
                                  "id": 18025,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "8468:23:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_46a7d0ce13c2c26d158d9defa8ce488dbeb81d3c852592fb370bd45953199485",
                                    "typeString": "literal_string \"log(uint,string,bool)\""
                                  },
                                  "value": "log(uint,string,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18026,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18015,
                                  "src": "8493:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18027,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18017,
                                  "src": "8497:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18028,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18019,
                                  "src": "8501:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_46a7d0ce13c2c26d158d9defa8ce488dbeb81d3c852592fb370bd45953199485",
                                    "typeString": "literal_string \"log(uint,string,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18023,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "8444:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18024,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "8444:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18029,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "8444:60:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18022,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "8428:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18030,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8428:77:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18031,
                        "nodeType": "ExpressionStatement",
                        "src": "8428:77:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18033,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18020,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18015,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18033,
                        "src": "8374:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18014,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "8374:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18017,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18033,
                        "src": "8383:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18016,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "8383:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18019,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18033,
                        "src": "8401:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18018,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "8401:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8373:36:101"
                  },
                  "returnParameters": {
                    "id": 18021,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "8424:0:101"
                  },
                  "scope": 25062,
                  "src": "8361:148:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18052,
                    "nodeType": "Block",
                    "src": "8578:88:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c737472696e672c6164647265737329",
                                  "id": 18045,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "8622:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_1f90f24a472e5198a9eef41600323c8a476ef0a1db1496125f7d053a74d474ac",
                                    "typeString": "literal_string \"log(uint,string,address)\""
                                  },
                                  "value": "log(uint,string,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18046,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18035,
                                  "src": "8650:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18047,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18037,
                                  "src": "8654:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18048,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18039,
                                  "src": "8658:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_1f90f24a472e5198a9eef41600323c8a476ef0a1db1496125f7d053a74d474ac",
                                    "typeString": "literal_string \"log(uint,string,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18043,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "8598:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18044,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "8598:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18049,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "8598:63:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18042,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "8582:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18050,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8582:80:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18051,
                        "nodeType": "ExpressionStatement",
                        "src": "8582:80:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18053,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18040,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18035,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18053,
                        "src": "8525:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18034,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "8525:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18037,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18053,
                        "src": "8534:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18036,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "8534:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18039,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18053,
                        "src": "8552:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18038,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "8552:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8524:39:101"
                  },
                  "returnParameters": {
                    "id": 18041,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "8578:0:101"
                  },
                  "scope": 25062,
                  "src": "8512:154:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18072,
                    "nodeType": "Block",
                    "src": "8723:83:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c626f6f6c2c75696e7429",
                                  "id": 18065,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "8767:21:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_5a4d9922ab81f1126dafac21c1ce3fb483db2e4898341fe0758315eb5f3054d6",
                                    "typeString": "literal_string \"log(uint,bool,uint)\""
                                  },
                                  "value": "log(uint,bool,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18066,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18055,
                                  "src": "8790:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18067,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18057,
                                  "src": "8794:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18068,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18059,
                                  "src": "8798:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_5a4d9922ab81f1126dafac21c1ce3fb483db2e4898341fe0758315eb5f3054d6",
                                    "typeString": "literal_string \"log(uint,bool,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18063,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "8743:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18064,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "8743:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18069,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "8743:58:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18062,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "8727:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18070,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8727:75:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18071,
                        "nodeType": "ExpressionStatement",
                        "src": "8727:75:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18073,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18060,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18055,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18073,
                        "src": "8682:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18054,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "8682:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18057,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18073,
                        "src": "8691:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18056,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "8691:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18059,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18073,
                        "src": "8700:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18058,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "8700:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8681:27:101"
                  },
                  "returnParameters": {
                    "id": 18061,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "8723:0:101"
                  },
                  "scope": 25062,
                  "src": "8669:137:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18092,
                    "nodeType": "Block",
                    "src": "8872:85:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c626f6f6c2c737472696e6729",
                                  "id": 18085,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "8916:23:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_8b0e14fe247223cbba6a19a2fac250db70b4f126d0f3f63ac9c3f080885b9f82",
                                    "typeString": "literal_string \"log(uint,bool,string)\""
                                  },
                                  "value": "log(uint,bool,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18086,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18075,
                                  "src": "8941:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18087,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18077,
                                  "src": "8945:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18088,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18079,
                                  "src": "8949:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_8b0e14fe247223cbba6a19a2fac250db70b4f126d0f3f63ac9c3f080885b9f82",
                                    "typeString": "literal_string \"log(uint,bool,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18083,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "8892:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18084,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "8892:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18089,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "8892:60:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18082,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "8876:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18090,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "8876:77:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18091,
                        "nodeType": "ExpressionStatement",
                        "src": "8876:77:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18093,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18080,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18075,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18093,
                        "src": "8822:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18074,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "8822:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18077,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18093,
                        "src": "8831:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18076,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "8831:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18079,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18093,
                        "src": "8840:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18078,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "8840:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8821:36:101"
                  },
                  "returnParameters": {
                    "id": 18081,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "8872:0:101"
                  },
                  "scope": 25062,
                  "src": "8809:148:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18112,
                    "nodeType": "Block",
                    "src": "9014:83:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c626f6f6c2c626f6f6c29",
                                  "id": 18105,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "9058:21:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_d5ceace024d24c243571d0b2393ca9fb37aa961a0e028332e72cd7dfb84c0971",
                                    "typeString": "literal_string \"log(uint,bool,bool)\""
                                  },
                                  "value": "log(uint,bool,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18106,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18095,
                                  "src": "9081:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18107,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18097,
                                  "src": "9085:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18108,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18099,
                                  "src": "9089:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_d5ceace024d24c243571d0b2393ca9fb37aa961a0e028332e72cd7dfb84c0971",
                                    "typeString": "literal_string \"log(uint,bool,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18103,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "9034:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18104,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "9034:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18109,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "9034:58:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18102,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "9018:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18110,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9018:75:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18111,
                        "nodeType": "ExpressionStatement",
                        "src": "9018:75:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18113,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18100,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18095,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18113,
                        "src": "8973:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18094,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "8973:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18097,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18113,
                        "src": "8982:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18096,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "8982:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18099,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18113,
                        "src": "8991:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18098,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "8991:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8972:27:101"
                  },
                  "returnParameters": {
                    "id": 18101,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "9014:0:101"
                  },
                  "scope": 25062,
                  "src": "8960:137:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18132,
                    "nodeType": "Block",
                    "src": "9157:86:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c626f6f6c2c6164647265737329",
                                  "id": 18125,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "9201:24:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_424effbf6346b3a7c79debdbad20f804c7961e0193d509136d2bb7c09c7ff9b2",
                                    "typeString": "literal_string \"log(uint,bool,address)\""
                                  },
                                  "value": "log(uint,bool,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18126,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18115,
                                  "src": "9227:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18127,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18117,
                                  "src": "9231:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18128,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18119,
                                  "src": "9235:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_424effbf6346b3a7c79debdbad20f804c7961e0193d509136d2bb7c09c7ff9b2",
                                    "typeString": "literal_string \"log(uint,bool,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18123,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "9177:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18124,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "9177:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18129,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "9177:61:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18122,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "9161:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18130,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9161:78:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18131,
                        "nodeType": "ExpressionStatement",
                        "src": "9161:78:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18133,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18120,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18115,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18133,
                        "src": "9113:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18114,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "9113:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18117,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18133,
                        "src": "9122:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18116,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "9122:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18119,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18133,
                        "src": "9131:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18118,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "9131:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9112:30:101"
                  },
                  "returnParameters": {
                    "id": 18121,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "9157:0:101"
                  },
                  "scope": 25062,
                  "src": "9100:143:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18152,
                    "nodeType": "Block",
                    "src": "9303:86:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c616464726573732c75696e7429",
                                  "id": 18145,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "9347:24:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_884343aaf095a99f79852cd574543144a9a04148c5eb5687826e5e86a2554617",
                                    "typeString": "literal_string \"log(uint,address,uint)\""
                                  },
                                  "value": "log(uint,address,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18146,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18135,
                                  "src": "9373:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18147,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18137,
                                  "src": "9377:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18148,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18139,
                                  "src": "9381:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_884343aaf095a99f79852cd574543144a9a04148c5eb5687826e5e86a2554617",
                                    "typeString": "literal_string \"log(uint,address,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18143,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "9323:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18144,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "9323:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18149,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "9323:61:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18142,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "9307:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18150,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9307:78:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18151,
                        "nodeType": "ExpressionStatement",
                        "src": "9307:78:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18153,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18140,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18135,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18153,
                        "src": "9259:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18134,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "9259:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18137,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18153,
                        "src": "9268:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18136,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "9268:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18139,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18153,
                        "src": "9280:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18138,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "9280:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9258:30:101"
                  },
                  "returnParameters": {
                    "id": 18141,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "9303:0:101"
                  },
                  "scope": 25062,
                  "src": "9246:143:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18172,
                    "nodeType": "Block",
                    "src": "9458:88:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c616464726573732c737472696e6729",
                                  "id": 18165,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "9502:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_ce83047b6eeeca52b57db5064e316bb4dc615477077814d1a191d68a4818cbed",
                                    "typeString": "literal_string \"log(uint,address,string)\""
                                  },
                                  "value": "log(uint,address,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18166,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18155,
                                  "src": "9530:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18167,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18157,
                                  "src": "9534:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18168,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18159,
                                  "src": "9538:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_ce83047b6eeeca52b57db5064e316bb4dc615477077814d1a191d68a4818cbed",
                                    "typeString": "literal_string \"log(uint,address,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18163,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "9478:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18164,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "9478:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18169,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "9478:63:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18162,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "9462:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18170,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9462:80:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18171,
                        "nodeType": "ExpressionStatement",
                        "src": "9462:80:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18173,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18160,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18155,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18173,
                        "src": "9405:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18154,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "9405:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18157,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18173,
                        "src": "9414:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18156,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "9414:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18159,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18173,
                        "src": "9426:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18158,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "9426:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9404:39:101"
                  },
                  "returnParameters": {
                    "id": 18161,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "9458:0:101"
                  },
                  "scope": 25062,
                  "src": "9392:154:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18192,
                    "nodeType": "Block",
                    "src": "9606:86:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c616464726573732c626f6f6c29",
                                  "id": 18185,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "9650:24:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_7ad0128e41690364edd967a051c6d9cea9f7c322246c5ed2ebc0083265828a80",
                                    "typeString": "literal_string \"log(uint,address,bool)\""
                                  },
                                  "value": "log(uint,address,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18186,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18175,
                                  "src": "9676:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18187,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18177,
                                  "src": "9680:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18188,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18179,
                                  "src": "9684:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_7ad0128e41690364edd967a051c6d9cea9f7c322246c5ed2ebc0083265828a80",
                                    "typeString": "literal_string \"log(uint,address,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18183,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "9626:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18184,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "9626:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18189,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "9626:61:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18182,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "9610:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18190,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9610:78:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18191,
                        "nodeType": "ExpressionStatement",
                        "src": "9610:78:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18193,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18180,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18175,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18193,
                        "src": "9562:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18174,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "9562:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18177,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18193,
                        "src": "9571:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18176,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "9571:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18179,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18193,
                        "src": "9583:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18178,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "9583:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9561:30:101"
                  },
                  "returnParameters": {
                    "id": 18181,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "9606:0:101"
                  },
                  "scope": 25062,
                  "src": "9549:143:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18212,
                    "nodeType": "Block",
                    "src": "9755:89:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c616464726573732c6164647265737329",
                                  "id": 18205,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "9799:27:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_7d77a61be18c592527fe1ce89d591c1badea18ef3198dacc513c5ba08449fd7b",
                                    "typeString": "literal_string \"log(uint,address,address)\""
                                  },
                                  "value": "log(uint,address,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18206,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18195,
                                  "src": "9828:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18207,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18197,
                                  "src": "9832:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18208,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18199,
                                  "src": "9836:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_7d77a61be18c592527fe1ce89d591c1badea18ef3198dacc513c5ba08449fd7b",
                                    "typeString": "literal_string \"log(uint,address,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18203,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "9775:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18204,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "9775:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18209,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "9775:64:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18202,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "9759:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18210,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9759:81:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18211,
                        "nodeType": "ExpressionStatement",
                        "src": "9759:81:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18213,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18200,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18195,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18213,
                        "src": "9708:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18194,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "9708:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18197,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18213,
                        "src": "9717:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18196,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "9717:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18199,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18213,
                        "src": "9729:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18198,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "9729:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9707:33:101"
                  },
                  "returnParameters": {
                    "id": 18201,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "9755:0:101"
                  },
                  "scope": 25062,
                  "src": "9695:149:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18232,
                    "nodeType": "Block",
                    "src": "9910:85:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c75696e742c75696e7429",
                                  "id": 18225,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "9954:23:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_969cdd03749f5aa30c7fce9178272cdca616cb2cc28128d3b9824be8046f827e",
                                    "typeString": "literal_string \"log(string,uint,uint)\""
                                  },
                                  "value": "log(string,uint,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18226,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18215,
                                  "src": "9979:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18227,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18217,
                                  "src": "9983:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18228,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18219,
                                  "src": "9987:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_969cdd03749f5aa30c7fce9178272cdca616cb2cc28128d3b9824be8046f827e",
                                    "typeString": "literal_string \"log(string,uint,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18223,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "9930:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18224,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "9930:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18229,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "9930:60:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18222,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "9914:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18230,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "9914:77:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18231,
                        "nodeType": "ExpressionStatement",
                        "src": "9914:77:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18233,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18220,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18215,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18233,
                        "src": "9860:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18214,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "9860:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18217,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18233,
                        "src": "9878:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18216,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "9878:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18219,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18233,
                        "src": "9887:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18218,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "9887:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9859:36:101"
                  },
                  "returnParameters": {
                    "id": 18221,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "9910:0:101"
                  },
                  "scope": 25062,
                  "src": "9847:148:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18252,
                    "nodeType": "Block",
                    "src": "10070:87:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c75696e742c737472696e6729",
                                  "id": 18245,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "10114:25:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_a3f5c739d439f7a3912e960230088fb752539d00203d48771c643a12b26892ec",
                                    "typeString": "literal_string \"log(string,uint,string)\""
                                  },
                                  "value": "log(string,uint,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18246,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18235,
                                  "src": "10141:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18247,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18237,
                                  "src": "10145:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18248,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18239,
                                  "src": "10149:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_a3f5c739d439f7a3912e960230088fb752539d00203d48771c643a12b26892ec",
                                    "typeString": "literal_string \"log(string,uint,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18243,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "10090:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18244,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "10090:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18249,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "10090:62:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18242,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "10074:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18250,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10074:79:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18251,
                        "nodeType": "ExpressionStatement",
                        "src": "10074:79:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18253,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18240,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18235,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18253,
                        "src": "10011:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18234,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "10011:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18237,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18253,
                        "src": "10029:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18236,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "10029:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18239,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18253,
                        "src": "10038:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18238,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "10038:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10010:45:101"
                  },
                  "returnParameters": {
                    "id": 18241,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "10070:0:101"
                  },
                  "scope": 25062,
                  "src": "9998:159:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18272,
                    "nodeType": "Block",
                    "src": "10223:85:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c75696e742c626f6f6c29",
                                  "id": 18265,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "10267:23:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_f102ee05f3b79d3bc2ba0350401e35479d9f95705fb40abfaeb49d12355695b3",
                                    "typeString": "literal_string \"log(string,uint,bool)\""
                                  },
                                  "value": "log(string,uint,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18266,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18255,
                                  "src": "10292:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18267,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18257,
                                  "src": "10296:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18268,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18259,
                                  "src": "10300:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_f102ee05f3b79d3bc2ba0350401e35479d9f95705fb40abfaeb49d12355695b3",
                                    "typeString": "literal_string \"log(string,uint,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18263,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "10243:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18264,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "10243:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18269,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "10243:60:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18262,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "10227:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18270,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10227:77:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18271,
                        "nodeType": "ExpressionStatement",
                        "src": "10227:77:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18273,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18260,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18255,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18273,
                        "src": "10173:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18254,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "10173:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18257,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18273,
                        "src": "10191:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18256,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "10191:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18259,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18273,
                        "src": "10200:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18258,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "10200:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10172:36:101"
                  },
                  "returnParameters": {
                    "id": 18261,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "10223:0:101"
                  },
                  "scope": 25062,
                  "src": "10160:148:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18292,
                    "nodeType": "Block",
                    "src": "10377:88:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c75696e742c6164647265737329",
                                  "id": 18285,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "10421:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_e3849f79a3c07bea1bae0837bfeee5da2531684b262865f1541a60df4fcd512a",
                                    "typeString": "literal_string \"log(string,uint,address)\""
                                  },
                                  "value": "log(string,uint,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18286,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18275,
                                  "src": "10449:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18287,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18277,
                                  "src": "10453:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18288,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18279,
                                  "src": "10457:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_e3849f79a3c07bea1bae0837bfeee5da2531684b262865f1541a60df4fcd512a",
                                    "typeString": "literal_string \"log(string,uint,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18283,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "10397:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18284,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "10397:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18289,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "10397:63:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18282,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "10381:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18290,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10381:80:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18291,
                        "nodeType": "ExpressionStatement",
                        "src": "10381:80:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18293,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18280,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18275,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18293,
                        "src": "10324:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18274,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "10324:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18277,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18293,
                        "src": "10342:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18276,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "10342:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18279,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18293,
                        "src": "10351:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18278,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "10351:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10323:39:101"
                  },
                  "returnParameters": {
                    "id": 18281,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "10377:0:101"
                  },
                  "scope": 25062,
                  "src": "10311:154:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18312,
                    "nodeType": "Block",
                    "src": "10540:87:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c737472696e672c75696e7429",
                                  "id": 18305,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "10584:25:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_f362ca59af8dc58335601f00e8a4f3f8cd0c03c9716c1459118a41613b5e0147",
                                    "typeString": "literal_string \"log(string,string,uint)\""
                                  },
                                  "value": "log(string,string,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18306,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18295,
                                  "src": "10611:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18307,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18297,
                                  "src": "10615:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18308,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18299,
                                  "src": "10619:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_f362ca59af8dc58335601f00e8a4f3f8cd0c03c9716c1459118a41613b5e0147",
                                    "typeString": "literal_string \"log(string,string,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18303,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "10560:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18304,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "10560:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18309,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "10560:62:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18302,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "10544:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18310,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10544:79:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18311,
                        "nodeType": "ExpressionStatement",
                        "src": "10544:79:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18313,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18300,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18295,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18313,
                        "src": "10481:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18294,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "10481:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18297,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18313,
                        "src": "10499:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18296,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "10499:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18299,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18313,
                        "src": "10517:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18298,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "10517:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10480:45:101"
                  },
                  "returnParameters": {
                    "id": 18301,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "10540:0:101"
                  },
                  "scope": 25062,
                  "src": "10468:159:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18332,
                    "nodeType": "Block",
                    "src": "10711:89:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c737472696e672c737472696e6729",
                                  "id": 18325,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "10755:27:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_2ced7cef693312206c21f0e92e3b54e2e16bf33db5eec350c78866822c665e1f",
                                    "typeString": "literal_string \"log(string,string,string)\""
                                  },
                                  "value": "log(string,string,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18326,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18315,
                                  "src": "10784:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18327,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18317,
                                  "src": "10788:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18328,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18319,
                                  "src": "10792:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_2ced7cef693312206c21f0e92e3b54e2e16bf33db5eec350c78866822c665e1f",
                                    "typeString": "literal_string \"log(string,string,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18323,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "10731:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18324,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "10731:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18329,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "10731:64:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18322,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "10715:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18330,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10715:81:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18331,
                        "nodeType": "ExpressionStatement",
                        "src": "10715:81:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18333,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18320,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18315,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18333,
                        "src": "10643:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18314,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "10643:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18317,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18333,
                        "src": "10661:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18316,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "10661:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18319,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18333,
                        "src": "10679:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18318,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "10679:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10642:54:101"
                  },
                  "returnParameters": {
                    "id": 18321,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "10711:0:101"
                  },
                  "scope": 25062,
                  "src": "10630:170:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18352,
                    "nodeType": "Block",
                    "src": "10875:87:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c737472696e672c626f6f6c29",
                                  "id": 18345,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "10919:25:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_b0e0f9b5ad960213f9ab262d120ce4ec3edffc58d1ad51b99628a777e82d8acb",
                                    "typeString": "literal_string \"log(string,string,bool)\""
                                  },
                                  "value": "log(string,string,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18346,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18335,
                                  "src": "10946:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18347,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18337,
                                  "src": "10950:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18348,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18339,
                                  "src": "10954:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_b0e0f9b5ad960213f9ab262d120ce4ec3edffc58d1ad51b99628a777e82d8acb",
                                    "typeString": "literal_string \"log(string,string,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18343,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "10895:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18344,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "10895:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18349,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "10895:62:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18342,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "10879:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18350,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10879:79:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18351,
                        "nodeType": "ExpressionStatement",
                        "src": "10879:79:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18353,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18340,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18335,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18353,
                        "src": "10816:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18334,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "10816:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18337,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18353,
                        "src": "10834:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18336,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "10834:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18339,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18353,
                        "src": "10852:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18338,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "10852:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10815:45:101"
                  },
                  "returnParameters": {
                    "id": 18341,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "10875:0:101"
                  },
                  "scope": 25062,
                  "src": "10803:159:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18372,
                    "nodeType": "Block",
                    "src": "11040:90:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c737472696e672c6164647265737329",
                                  "id": 18365,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "11084:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_95ed0195ee22a092ad93d352c33e8dc78b91f0c01eab9cff270af55b2ae65768",
                                    "typeString": "literal_string \"log(string,string,address)\""
                                  },
                                  "value": "log(string,string,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18366,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18355,
                                  "src": "11114:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18367,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18357,
                                  "src": "11118:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18368,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18359,
                                  "src": "11122:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_95ed0195ee22a092ad93d352c33e8dc78b91f0c01eab9cff270af55b2ae65768",
                                    "typeString": "literal_string \"log(string,string,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18363,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "11060:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18364,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "11060:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18369,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "11060:65:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18362,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "11044:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18370,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "11044:82:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18371,
                        "nodeType": "ExpressionStatement",
                        "src": "11044:82:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18373,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18360,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18355,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18373,
                        "src": "10978:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18354,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "10978:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18357,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18373,
                        "src": "10996:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18356,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "10996:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18359,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18373,
                        "src": "11014:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18358,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "11014:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "10977:48:101"
                  },
                  "returnParameters": {
                    "id": 18361,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "11040:0:101"
                  },
                  "scope": 25062,
                  "src": "10965:165:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18392,
                    "nodeType": "Block",
                    "src": "11196:85:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c626f6f6c2c75696e7429",
                                  "id": 18385,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "11240:23:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_291bb9d00defdc1b95c66c8b4bc10ef714a549c4f22fb190fe687dc5e85a4db1",
                                    "typeString": "literal_string \"log(string,bool,uint)\""
                                  },
                                  "value": "log(string,bool,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18386,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18375,
                                  "src": "11265:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18387,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18377,
                                  "src": "11269:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18388,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18379,
                                  "src": "11273:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_291bb9d00defdc1b95c66c8b4bc10ef714a549c4f22fb190fe687dc5e85a4db1",
                                    "typeString": "literal_string \"log(string,bool,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18383,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "11216:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18384,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "11216:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18389,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "11216:60:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18382,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "11200:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18390,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "11200:77:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18391,
                        "nodeType": "ExpressionStatement",
                        "src": "11200:77:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18393,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18380,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18375,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18393,
                        "src": "11146:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18374,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "11146:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18377,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18393,
                        "src": "11164:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18376,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "11164:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18379,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18393,
                        "src": "11173:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18378,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "11173:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11145:36:101"
                  },
                  "returnParameters": {
                    "id": 18381,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "11196:0:101"
                  },
                  "scope": 25062,
                  "src": "11133:148:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18412,
                    "nodeType": "Block",
                    "src": "11356:87:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c626f6f6c2c737472696e6729",
                                  "id": 18405,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "11400:25:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_e298f47d872a89293d316b9b936000a26f83eda2ba3171b2f9f16e2bf618c3e7",
                                    "typeString": "literal_string \"log(string,bool,string)\""
                                  },
                                  "value": "log(string,bool,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18406,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18395,
                                  "src": "11427:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18407,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18397,
                                  "src": "11431:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18408,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18399,
                                  "src": "11435:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_e298f47d872a89293d316b9b936000a26f83eda2ba3171b2f9f16e2bf618c3e7",
                                    "typeString": "literal_string \"log(string,bool,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18403,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "11376:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18404,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "11376:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18409,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "11376:62:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18402,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "11360:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18410,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "11360:79:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18411,
                        "nodeType": "ExpressionStatement",
                        "src": "11360:79:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18413,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18400,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18395,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18413,
                        "src": "11297:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18394,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "11297:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18397,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18413,
                        "src": "11315:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18396,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "11315:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18399,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18413,
                        "src": "11324:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18398,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "11324:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11296:45:101"
                  },
                  "returnParameters": {
                    "id": 18401,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "11356:0:101"
                  },
                  "scope": 25062,
                  "src": "11284:159:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18432,
                    "nodeType": "Block",
                    "src": "11509:85:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c626f6f6c2c626f6f6c29",
                                  "id": 18425,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "11553:23:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_850b7ad637241a873b861925ccffb71aaffb030b1df8850f324c9804bc7b443d",
                                    "typeString": "literal_string \"log(string,bool,bool)\""
                                  },
                                  "value": "log(string,bool,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18426,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18415,
                                  "src": "11578:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18427,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18417,
                                  "src": "11582:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18428,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18419,
                                  "src": "11586:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_850b7ad637241a873b861925ccffb71aaffb030b1df8850f324c9804bc7b443d",
                                    "typeString": "literal_string \"log(string,bool,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18423,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "11529:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18424,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "11529:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18429,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "11529:60:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18422,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "11513:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18430,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "11513:77:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18431,
                        "nodeType": "ExpressionStatement",
                        "src": "11513:77:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18433,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18420,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18415,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18433,
                        "src": "11459:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18414,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "11459:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18417,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18433,
                        "src": "11477:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18416,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "11477:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18419,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18433,
                        "src": "11486:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18418,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "11486:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11458:36:101"
                  },
                  "returnParameters": {
                    "id": 18421,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "11509:0:101"
                  },
                  "scope": 25062,
                  "src": "11446:148:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18452,
                    "nodeType": "Block",
                    "src": "11663:88:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c626f6f6c2c6164647265737329",
                                  "id": 18445,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "11707:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_932bbb385d479707ff387e3bb2d8968a7b4115e938510c531aa15b50507fc27f",
                                    "typeString": "literal_string \"log(string,bool,address)\""
                                  },
                                  "value": "log(string,bool,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18446,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18435,
                                  "src": "11735:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18447,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18437,
                                  "src": "11739:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18448,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18439,
                                  "src": "11743:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_932bbb385d479707ff387e3bb2d8968a7b4115e938510c531aa15b50507fc27f",
                                    "typeString": "literal_string \"log(string,bool,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18443,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "11683:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18444,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "11683:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18449,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "11683:63:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18442,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "11667:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18450,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "11667:80:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18451,
                        "nodeType": "ExpressionStatement",
                        "src": "11667:80:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18453,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18440,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18435,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18453,
                        "src": "11610:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18434,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "11610:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18437,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18453,
                        "src": "11628:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18436,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "11628:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18439,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18453,
                        "src": "11637:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18438,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "11637:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11609:39:101"
                  },
                  "returnParameters": {
                    "id": 18441,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "11663:0:101"
                  },
                  "scope": 25062,
                  "src": "11597:154:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18472,
                    "nodeType": "Block",
                    "src": "11820:88:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c616464726573732c75696e7429",
                                  "id": 18465,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "11864:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_07c81217b9c48682941345dce61bbd916a12dd883642c9077891090a71c93a13",
                                    "typeString": "literal_string \"log(string,address,uint)\""
                                  },
                                  "value": "log(string,address,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18466,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18455,
                                  "src": "11892:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18467,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18457,
                                  "src": "11896:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18468,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18459,
                                  "src": "11900:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_07c81217b9c48682941345dce61bbd916a12dd883642c9077891090a71c93a13",
                                    "typeString": "literal_string \"log(string,address,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18463,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "11840:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18464,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "11840:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18469,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "11840:63:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18462,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "11824:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18470,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "11824:80:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18471,
                        "nodeType": "ExpressionStatement",
                        "src": "11824:80:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18473,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18460,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18455,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18473,
                        "src": "11767:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18454,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "11767:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18457,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18473,
                        "src": "11785:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18456,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "11785:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18459,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18473,
                        "src": "11797:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18458,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "11797:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11766:39:101"
                  },
                  "returnParameters": {
                    "id": 18461,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "11820:0:101"
                  },
                  "scope": 25062,
                  "src": "11754:154:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18492,
                    "nodeType": "Block",
                    "src": "11986:90:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c616464726573732c737472696e6729",
                                  "id": 18485,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "12030:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_e0e9ad4f87059a51cce5555e129ca819f7e5d52e9c65a4e175882207ee47d634",
                                    "typeString": "literal_string \"log(string,address,string)\""
                                  },
                                  "value": "log(string,address,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18486,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18475,
                                  "src": "12060:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18487,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18477,
                                  "src": "12064:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18488,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18479,
                                  "src": "12068:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_e0e9ad4f87059a51cce5555e129ca819f7e5d52e9c65a4e175882207ee47d634",
                                    "typeString": "literal_string \"log(string,address,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18483,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "12006:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18484,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "12006:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18489,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "12006:65:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18482,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "11990:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18490,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "11990:82:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18491,
                        "nodeType": "ExpressionStatement",
                        "src": "11990:82:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18493,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18480,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18475,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18493,
                        "src": "11924:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18474,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "11924:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18477,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18493,
                        "src": "11942:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18476,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "11942:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18479,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18493,
                        "src": "11954:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18478,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "11954:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "11923:48:101"
                  },
                  "returnParameters": {
                    "id": 18481,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "11986:0:101"
                  },
                  "scope": 25062,
                  "src": "11911:165:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18512,
                    "nodeType": "Block",
                    "src": "12145:88:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c616464726573732c626f6f6c29",
                                  "id": 18505,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "12189:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c91d5ed4480e0b3323f998bcee9594aa98173c7324b015a4713a7c8429afd0b8",
                                    "typeString": "literal_string \"log(string,address,bool)\""
                                  },
                                  "value": "log(string,address,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18506,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18495,
                                  "src": "12217:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18507,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18497,
                                  "src": "12221:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18508,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18499,
                                  "src": "12225:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_c91d5ed4480e0b3323f998bcee9594aa98173c7324b015a4713a7c8429afd0b8",
                                    "typeString": "literal_string \"log(string,address,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18503,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "12165:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18504,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "12165:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18509,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "12165:63:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18502,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "12149:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18510,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12149:80:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18511,
                        "nodeType": "ExpressionStatement",
                        "src": "12149:80:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18513,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18500,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18495,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18513,
                        "src": "12092:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18494,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "12092:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18497,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18513,
                        "src": "12110:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18496,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "12110:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18499,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18513,
                        "src": "12122:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18498,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "12122:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12091:39:101"
                  },
                  "returnParameters": {
                    "id": 18501,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "12145:0:101"
                  },
                  "scope": 25062,
                  "src": "12079:154:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18532,
                    "nodeType": "Block",
                    "src": "12305:91:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c616464726573732c6164647265737329",
                                  "id": 18525,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "12349:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_fcec75e0902c9d61eded5d9f2eed16d5b0f2cd255fe6fa77733f59e1063823e8",
                                    "typeString": "literal_string \"log(string,address,address)\""
                                  },
                                  "value": "log(string,address,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18526,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18515,
                                  "src": "12380:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18527,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18517,
                                  "src": "12384:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18528,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18519,
                                  "src": "12388:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_fcec75e0902c9d61eded5d9f2eed16d5b0f2cd255fe6fa77733f59e1063823e8",
                                    "typeString": "literal_string \"log(string,address,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18523,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "12325:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18524,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "12325:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18529,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "12325:66:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18522,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "12309:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18530,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12309:83:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18531,
                        "nodeType": "ExpressionStatement",
                        "src": "12309:83:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18533,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18520,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18515,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18533,
                        "src": "12249:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18514,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "12249:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18517,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18533,
                        "src": "12267:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18516,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "12267:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18519,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18533,
                        "src": "12279:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18518,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "12279:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12248:42:101"
                  },
                  "returnParameters": {
                    "id": 18521,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "12305:0:101"
                  },
                  "scope": 25062,
                  "src": "12236:160:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18552,
                    "nodeType": "Block",
                    "src": "12453:83:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c75696e742c75696e7429",
                                  "id": 18545,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "12497:21:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_3b5c03e061c862e366b964ce1ef4845511d610b73a90137eb2b2afa3099b1a4e",
                                    "typeString": "literal_string \"log(bool,uint,uint)\""
                                  },
                                  "value": "log(bool,uint,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18546,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18535,
                                  "src": "12520:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18547,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18537,
                                  "src": "12524:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18548,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18539,
                                  "src": "12528:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_3b5c03e061c862e366b964ce1ef4845511d610b73a90137eb2b2afa3099b1a4e",
                                    "typeString": "literal_string \"log(bool,uint,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18543,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "12473:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18544,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "12473:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18549,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "12473:58:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18542,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "12457:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18550,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12457:75:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18551,
                        "nodeType": "ExpressionStatement",
                        "src": "12457:75:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18553,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18540,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18535,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18553,
                        "src": "12412:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18534,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "12412:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18537,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18553,
                        "src": "12421:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18536,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "12421:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18539,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18553,
                        "src": "12430:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18538,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "12430:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12411:27:101"
                  },
                  "returnParameters": {
                    "id": 18541,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "12453:0:101"
                  },
                  "scope": 25062,
                  "src": "12399:137:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18572,
                    "nodeType": "Block",
                    "src": "12602:85:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c75696e742c737472696e6729",
                                  "id": 18565,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "12646:23:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c8397eb0de34bc3ec2853d625c1649c0c0abb20941c30ba650cc738adade018f",
                                    "typeString": "literal_string \"log(bool,uint,string)\""
                                  },
                                  "value": "log(bool,uint,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18566,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18555,
                                  "src": "12671:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18567,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18557,
                                  "src": "12675:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18568,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18559,
                                  "src": "12679:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_c8397eb0de34bc3ec2853d625c1649c0c0abb20941c30ba650cc738adade018f",
                                    "typeString": "literal_string \"log(bool,uint,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18563,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "12622:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18564,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "12622:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18569,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "12622:60:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18562,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "12606:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18570,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12606:77:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18571,
                        "nodeType": "ExpressionStatement",
                        "src": "12606:77:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18573,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18560,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18555,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18573,
                        "src": "12552:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18554,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "12552:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18557,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18573,
                        "src": "12561:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18556,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "12561:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18559,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18573,
                        "src": "12570:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18558,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "12570:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12551:36:101"
                  },
                  "returnParameters": {
                    "id": 18561,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "12602:0:101"
                  },
                  "scope": 25062,
                  "src": "12539:148:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18592,
                    "nodeType": "Block",
                    "src": "12744:83:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c75696e742c626f6f6c29",
                                  "id": 18585,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "12788:21:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_1badc9eb6813ec769c33a3918f278565b7e2e9ed34d2ae2d50d951cc0f602ae0",
                                    "typeString": "literal_string \"log(bool,uint,bool)\""
                                  },
                                  "value": "log(bool,uint,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18586,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18575,
                                  "src": "12811:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18587,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18577,
                                  "src": "12815:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18588,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18579,
                                  "src": "12819:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_1badc9eb6813ec769c33a3918f278565b7e2e9ed34d2ae2d50d951cc0f602ae0",
                                    "typeString": "literal_string \"log(bool,uint,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18583,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "12764:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18584,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "12764:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18589,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "12764:58:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18582,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "12748:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18590,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12748:75:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18591,
                        "nodeType": "ExpressionStatement",
                        "src": "12748:75:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18593,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18580,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18575,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18593,
                        "src": "12703:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18574,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "12703:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18577,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18593,
                        "src": "12712:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18576,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "12712:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18579,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18593,
                        "src": "12721:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18578,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "12721:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12702:27:101"
                  },
                  "returnParameters": {
                    "id": 18581,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "12744:0:101"
                  },
                  "scope": 25062,
                  "src": "12690:137:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18612,
                    "nodeType": "Block",
                    "src": "12887:86:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c75696e742c6164647265737329",
                                  "id": 18605,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "12931:24:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c4d23507f52009aec241457bf26dc51305bd2896aa08c5b47f04709554b39440",
                                    "typeString": "literal_string \"log(bool,uint,address)\""
                                  },
                                  "value": "log(bool,uint,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18606,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18595,
                                  "src": "12957:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18607,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18597,
                                  "src": "12961:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18608,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18599,
                                  "src": "12965:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_c4d23507f52009aec241457bf26dc51305bd2896aa08c5b47f04709554b39440",
                                    "typeString": "literal_string \"log(bool,uint,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18603,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "12907:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18604,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "12907:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18609,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "12907:61:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18602,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "12891:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18610,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12891:78:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18611,
                        "nodeType": "ExpressionStatement",
                        "src": "12891:78:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18613,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18600,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18595,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18613,
                        "src": "12843:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18594,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "12843:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18597,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18613,
                        "src": "12852:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18596,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "12852:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18599,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18613,
                        "src": "12861:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18598,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "12861:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12842:30:101"
                  },
                  "returnParameters": {
                    "id": 18601,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "12887:0:101"
                  },
                  "scope": 25062,
                  "src": "12830:143:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18632,
                    "nodeType": "Block",
                    "src": "13039:85:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c737472696e672c75696e7429",
                                  "id": 18625,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "13083:23:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c0382aac3e9b237c9c8f246cdb8152d44351aaafa72d99e3640be65f754ac807",
                                    "typeString": "literal_string \"log(bool,string,uint)\""
                                  },
                                  "value": "log(bool,string,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18626,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18615,
                                  "src": "13108:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18627,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18617,
                                  "src": "13112:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18628,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18619,
                                  "src": "13116:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_c0382aac3e9b237c9c8f246cdb8152d44351aaafa72d99e3640be65f754ac807",
                                    "typeString": "literal_string \"log(bool,string,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18623,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "13059:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18624,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "13059:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18629,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "13059:60:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18622,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "13043:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18630,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13043:77:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18631,
                        "nodeType": "ExpressionStatement",
                        "src": "13043:77:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18633,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18620,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18615,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18633,
                        "src": "12989:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18614,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "12989:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18617,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18633,
                        "src": "12998:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18616,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "12998:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18619,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18633,
                        "src": "13016:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18618,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "13016:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "12988:36:101"
                  },
                  "returnParameters": {
                    "id": 18621,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "13039:0:101"
                  },
                  "scope": 25062,
                  "src": "12976:148:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18652,
                    "nodeType": "Block",
                    "src": "13199:87:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c737472696e672c737472696e6729",
                                  "id": 18645,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "13243:25:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_b076847f8b4aee0cfbf46ec501532f9f3c85a581aff135287ff8e917c0a39102",
                                    "typeString": "literal_string \"log(bool,string,string)\""
                                  },
                                  "value": "log(bool,string,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18646,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18635,
                                  "src": "13270:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18647,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18637,
                                  "src": "13274:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18648,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18639,
                                  "src": "13278:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_b076847f8b4aee0cfbf46ec501532f9f3c85a581aff135287ff8e917c0a39102",
                                    "typeString": "literal_string \"log(bool,string,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18643,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "13219:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18644,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "13219:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18649,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "13219:62:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18642,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "13203:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18650,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13203:79:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18651,
                        "nodeType": "ExpressionStatement",
                        "src": "13203:79:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18653,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18640,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18635,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18653,
                        "src": "13140:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18634,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "13140:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18637,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18653,
                        "src": "13149:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18636,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "13149:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18639,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18653,
                        "src": "13167:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18638,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "13167:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "13139:45:101"
                  },
                  "returnParameters": {
                    "id": 18641,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "13199:0:101"
                  },
                  "scope": 25062,
                  "src": "13127:159:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18672,
                    "nodeType": "Block",
                    "src": "13352:85:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c737472696e672c626f6f6c29",
                                  "id": 18665,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "13396:23:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_dbb4c2477dacc98e0e5b96fd6ca6bf0ae1f82dd042439d9f53f8d963bef43eaa",
                                    "typeString": "literal_string \"log(bool,string,bool)\""
                                  },
                                  "value": "log(bool,string,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18666,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18655,
                                  "src": "13421:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18667,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18657,
                                  "src": "13425:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18668,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18659,
                                  "src": "13429:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_dbb4c2477dacc98e0e5b96fd6ca6bf0ae1f82dd042439d9f53f8d963bef43eaa",
                                    "typeString": "literal_string \"log(bool,string,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18663,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "13372:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18664,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "13372:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18669,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "13372:60:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18662,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "13356:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18670,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13356:77:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18671,
                        "nodeType": "ExpressionStatement",
                        "src": "13356:77:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18673,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18660,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18655,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18673,
                        "src": "13302:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18654,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "13302:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18657,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18673,
                        "src": "13311:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18656,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "13311:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18659,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18673,
                        "src": "13329:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18658,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "13329:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "13301:36:101"
                  },
                  "returnParameters": {
                    "id": 18661,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "13352:0:101"
                  },
                  "scope": 25062,
                  "src": "13289:148:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18692,
                    "nodeType": "Block",
                    "src": "13506:88:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c737472696e672c6164647265737329",
                                  "id": 18685,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "13550:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_9591b953c9b1d0af9d1e3bc0f6ea9aa5b0e1af8c702f85b36e21b9b2d7e4da79",
                                    "typeString": "literal_string \"log(bool,string,address)\""
                                  },
                                  "value": "log(bool,string,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18686,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18675,
                                  "src": "13578:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18687,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18677,
                                  "src": "13582:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18688,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18679,
                                  "src": "13586:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_9591b953c9b1d0af9d1e3bc0f6ea9aa5b0e1af8c702f85b36e21b9b2d7e4da79",
                                    "typeString": "literal_string \"log(bool,string,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18683,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "13526:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18684,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "13526:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18689,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "13526:63:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18682,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "13510:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18690,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13510:80:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18691,
                        "nodeType": "ExpressionStatement",
                        "src": "13510:80:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18693,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18680,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18675,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18693,
                        "src": "13453:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18674,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "13453:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18677,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18693,
                        "src": "13462:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18676,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "13462:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18679,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18693,
                        "src": "13480:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18678,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "13480:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "13452:39:101"
                  },
                  "returnParameters": {
                    "id": 18681,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "13506:0:101"
                  },
                  "scope": 25062,
                  "src": "13440:154:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18712,
                    "nodeType": "Block",
                    "src": "13651:83:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c626f6f6c2c75696e7429",
                                  "id": 18705,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "13695:21:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_b01365bbae43503e22260bcc9cf23ffef37ffc9f6c1580737fe2489955065877",
                                    "typeString": "literal_string \"log(bool,bool,uint)\""
                                  },
                                  "value": "log(bool,bool,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18706,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18695,
                                  "src": "13718:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18707,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18697,
                                  "src": "13722:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18708,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18699,
                                  "src": "13726:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_b01365bbae43503e22260bcc9cf23ffef37ffc9f6c1580737fe2489955065877",
                                    "typeString": "literal_string \"log(bool,bool,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18703,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "13671:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18704,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "13671:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18709,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "13671:58:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18702,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "13655:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18710,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13655:75:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18711,
                        "nodeType": "ExpressionStatement",
                        "src": "13655:75:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18713,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18700,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18695,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18713,
                        "src": "13610:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18694,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "13610:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18697,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18713,
                        "src": "13619:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18696,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "13619:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18699,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18713,
                        "src": "13628:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18698,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "13628:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "13609:27:101"
                  },
                  "returnParameters": {
                    "id": 18701,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "13651:0:101"
                  },
                  "scope": 25062,
                  "src": "13597:137:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18732,
                    "nodeType": "Block",
                    "src": "13800:85:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c626f6f6c2c737472696e6729",
                                  "id": 18725,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "13844:23:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_2555fa465662416fc443b21c515f245dc550a66f7c658773f7bd7ad91c82f2cc",
                                    "typeString": "literal_string \"log(bool,bool,string)\""
                                  },
                                  "value": "log(bool,bool,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18726,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18715,
                                  "src": "13869:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18727,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18717,
                                  "src": "13873:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18728,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18719,
                                  "src": "13877:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_2555fa465662416fc443b21c515f245dc550a66f7c658773f7bd7ad91c82f2cc",
                                    "typeString": "literal_string \"log(bool,bool,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18723,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "13820:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18724,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "13820:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18729,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "13820:60:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18722,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "13804:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18730,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13804:77:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18731,
                        "nodeType": "ExpressionStatement",
                        "src": "13804:77:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18733,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18720,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18715,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18733,
                        "src": "13750:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18714,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "13750:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18717,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18733,
                        "src": "13759:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18716,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "13759:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18719,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18733,
                        "src": "13768:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18718,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "13768:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "13749:36:101"
                  },
                  "returnParameters": {
                    "id": 18721,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "13800:0:101"
                  },
                  "scope": 25062,
                  "src": "13737:148:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18752,
                    "nodeType": "Block",
                    "src": "13942:83:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c626f6f6c2c626f6f6c29",
                                  "id": 18745,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "13986:21:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_50709698278bb02f656e4ac53a2ae8ef0ec4064d340360a5fa4d933e9a742590",
                                    "typeString": "literal_string \"log(bool,bool,bool)\""
                                  },
                                  "value": "log(bool,bool,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18746,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18735,
                                  "src": "14009:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18747,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18737,
                                  "src": "14013:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18748,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18739,
                                  "src": "14017:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_50709698278bb02f656e4ac53a2ae8ef0ec4064d340360a5fa4d933e9a742590",
                                    "typeString": "literal_string \"log(bool,bool,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18743,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "13962:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18744,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "13962:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18749,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "13962:58:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18742,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "13946:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18750,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "13946:75:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18751,
                        "nodeType": "ExpressionStatement",
                        "src": "13946:75:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18753,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18740,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18735,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18753,
                        "src": "13901:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18734,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "13901:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18737,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18753,
                        "src": "13910:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18736,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "13910:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18739,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18753,
                        "src": "13919:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18738,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "13919:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "13900:27:101"
                  },
                  "returnParameters": {
                    "id": 18741,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "13942:0:101"
                  },
                  "scope": 25062,
                  "src": "13888:137:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18772,
                    "nodeType": "Block",
                    "src": "14085:86:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c626f6f6c2c6164647265737329",
                                  "id": 18765,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "14129:24:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_1078f68da6ddbbe80f829fe8d54d1f2c6347e1ee4ec5a2a7a3a330ada9eccf81",
                                    "typeString": "literal_string \"log(bool,bool,address)\""
                                  },
                                  "value": "log(bool,bool,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18766,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18755,
                                  "src": "14155:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18767,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18757,
                                  "src": "14159:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18768,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18759,
                                  "src": "14163:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_1078f68da6ddbbe80f829fe8d54d1f2c6347e1ee4ec5a2a7a3a330ada9eccf81",
                                    "typeString": "literal_string \"log(bool,bool,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18763,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "14105:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18764,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "14105:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18769,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "14105:61:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18762,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "14089:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18770,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14089:78:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18771,
                        "nodeType": "ExpressionStatement",
                        "src": "14089:78:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18773,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18760,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18755,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18773,
                        "src": "14041:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18754,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "14041:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18757,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18773,
                        "src": "14050:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18756,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "14050:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18759,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18773,
                        "src": "14059:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18758,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "14059:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "14040:30:101"
                  },
                  "returnParameters": {
                    "id": 18761,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "14085:0:101"
                  },
                  "scope": 25062,
                  "src": "14028:143:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18792,
                    "nodeType": "Block",
                    "src": "14231:86:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c616464726573732c75696e7429",
                                  "id": 18785,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "14275:24:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_eb704bafbd89369a907d48394b6acdacf482ae42cc2aaedd1cc37e89b4054b3d",
                                    "typeString": "literal_string \"log(bool,address,uint)\""
                                  },
                                  "value": "log(bool,address,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18786,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18775,
                                  "src": "14301:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18787,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18777,
                                  "src": "14305:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18788,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18779,
                                  "src": "14309:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_eb704bafbd89369a907d48394b6acdacf482ae42cc2aaedd1cc37e89b4054b3d",
                                    "typeString": "literal_string \"log(bool,address,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18783,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "14251:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18784,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "14251:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18789,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "14251:61:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18782,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "14235:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18790,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14235:78:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18791,
                        "nodeType": "ExpressionStatement",
                        "src": "14235:78:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18793,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18780,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18775,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18793,
                        "src": "14187:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18774,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "14187:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18777,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18793,
                        "src": "14196:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18776,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "14196:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18779,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18793,
                        "src": "14208:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18778,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "14208:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "14186:30:101"
                  },
                  "returnParameters": {
                    "id": 18781,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "14231:0:101"
                  },
                  "scope": 25062,
                  "src": "14174:143:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18812,
                    "nodeType": "Block",
                    "src": "14386:88:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c616464726573732c737472696e6729",
                                  "id": 18805,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "14430:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_de9a927090b15ed84eefc0c471675a23ce67fd75011b1652fe17ca2dd0dcd06d",
                                    "typeString": "literal_string \"log(bool,address,string)\""
                                  },
                                  "value": "log(bool,address,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18806,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18795,
                                  "src": "14458:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18807,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18797,
                                  "src": "14462:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18808,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18799,
                                  "src": "14466:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_de9a927090b15ed84eefc0c471675a23ce67fd75011b1652fe17ca2dd0dcd06d",
                                    "typeString": "literal_string \"log(bool,address,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18803,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "14406:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18804,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "14406:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18809,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "14406:63:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18802,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "14390:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18810,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14390:80:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18811,
                        "nodeType": "ExpressionStatement",
                        "src": "14390:80:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18813,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18800,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18795,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18813,
                        "src": "14333:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18794,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "14333:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18797,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18813,
                        "src": "14342:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18796,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "14342:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18799,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18813,
                        "src": "14354:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18798,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "14354:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "14332:39:101"
                  },
                  "returnParameters": {
                    "id": 18801,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "14386:0:101"
                  },
                  "scope": 25062,
                  "src": "14320:154:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18832,
                    "nodeType": "Block",
                    "src": "14534:86:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c616464726573732c626f6f6c29",
                                  "id": 18825,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "14578:24:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_18c9c746c9d0e38e4dc234ee76e678bbaa4e473eca3dce0969637d7f01e4a908",
                                    "typeString": "literal_string \"log(bool,address,bool)\""
                                  },
                                  "value": "log(bool,address,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18826,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18815,
                                  "src": "14604:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18827,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18817,
                                  "src": "14608:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18828,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18819,
                                  "src": "14612:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_18c9c746c9d0e38e4dc234ee76e678bbaa4e473eca3dce0969637d7f01e4a908",
                                    "typeString": "literal_string \"log(bool,address,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18823,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "14554:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18824,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "14554:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18829,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "14554:61:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18822,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "14538:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18830,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14538:78:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18831,
                        "nodeType": "ExpressionStatement",
                        "src": "14538:78:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18833,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18820,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18815,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18833,
                        "src": "14490:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18814,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "14490:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18817,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18833,
                        "src": "14499:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18816,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "14499:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18819,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18833,
                        "src": "14511:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18818,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "14511:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "14489:30:101"
                  },
                  "returnParameters": {
                    "id": 18821,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "14534:0:101"
                  },
                  "scope": 25062,
                  "src": "14477:143:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18852,
                    "nodeType": "Block",
                    "src": "14683:89:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c616464726573732c6164647265737329",
                                  "id": 18845,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "14727:27:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_d2763667477f08a6a3f8ce84e1cc1aeb5e67ee2996f5f36e8939da2b8b8f0265",
                                    "typeString": "literal_string \"log(bool,address,address)\""
                                  },
                                  "value": "log(bool,address,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18846,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18835,
                                  "src": "14756:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18847,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18837,
                                  "src": "14760:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18848,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18839,
                                  "src": "14764:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_d2763667477f08a6a3f8ce84e1cc1aeb5e67ee2996f5f36e8939da2b8b8f0265",
                                    "typeString": "literal_string \"log(bool,address,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18843,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "14703:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18844,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "14703:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18849,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "14703:64:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18842,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "14687:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18850,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14687:81:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18851,
                        "nodeType": "ExpressionStatement",
                        "src": "14687:81:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18853,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18840,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18835,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18853,
                        "src": "14636:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18834,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "14636:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18837,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18853,
                        "src": "14645:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18836,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "14645:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18839,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18853,
                        "src": "14657:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18838,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "14657:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "14635:33:101"
                  },
                  "returnParameters": {
                    "id": 18841,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "14683:0:101"
                  },
                  "scope": 25062,
                  "src": "14623:149:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18872,
                    "nodeType": "Block",
                    "src": "14832:86:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c75696e742c75696e7429",
                                  "id": 18865,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "14876:24:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_8786135eae1a8e4736031518026bd3bd30886c3cc8d3e8bdedd6faea426de5ea",
                                    "typeString": "literal_string \"log(address,uint,uint)\""
                                  },
                                  "value": "log(address,uint,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18866,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18855,
                                  "src": "14902:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18867,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18857,
                                  "src": "14906:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18868,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18859,
                                  "src": "14910:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_8786135eae1a8e4736031518026bd3bd30886c3cc8d3e8bdedd6faea426de5ea",
                                    "typeString": "literal_string \"log(address,uint,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18863,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "14852:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18864,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "14852:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18869,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "14852:61:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18862,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "14836:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18870,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14836:78:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18871,
                        "nodeType": "ExpressionStatement",
                        "src": "14836:78:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18873,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18860,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18855,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18873,
                        "src": "14788:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18854,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "14788:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18857,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18873,
                        "src": "14800:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18856,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "14800:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18859,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18873,
                        "src": "14809:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18858,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "14809:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "14787:30:101"
                  },
                  "returnParameters": {
                    "id": 18861,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "14832:0:101"
                  },
                  "scope": 25062,
                  "src": "14775:143:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18892,
                    "nodeType": "Block",
                    "src": "14987:88:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c75696e742c737472696e6729",
                                  "id": 18885,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "15031:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_baf968498a2094de432bd16841b992056c14db9f313a6b44c3156c2b5f1dc2b4",
                                    "typeString": "literal_string \"log(address,uint,string)\""
                                  },
                                  "value": "log(address,uint,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18886,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18875,
                                  "src": "15059:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18887,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18877,
                                  "src": "15063:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18888,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18879,
                                  "src": "15067:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_baf968498a2094de432bd16841b992056c14db9f313a6b44c3156c2b5f1dc2b4",
                                    "typeString": "literal_string \"log(address,uint,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18883,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "15007:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18884,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "15007:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18889,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "15007:63:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18882,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "14991:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18890,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "14991:80:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18891,
                        "nodeType": "ExpressionStatement",
                        "src": "14991:80:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18893,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18880,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18875,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18893,
                        "src": "14934:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18874,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "14934:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18877,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18893,
                        "src": "14946:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18876,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "14946:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18879,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18893,
                        "src": "14955:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18878,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "14955:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "14933:39:101"
                  },
                  "returnParameters": {
                    "id": 18881,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "14987:0:101"
                  },
                  "scope": 25062,
                  "src": "14921:154:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18912,
                    "nodeType": "Block",
                    "src": "15135:86:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c75696e742c626f6f6c29",
                                  "id": 18905,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "15179:24:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_e54ae1445cd51f09e801fc5885e33c709102997417d3d9b6f543f7724468b4e4",
                                    "typeString": "literal_string \"log(address,uint,bool)\""
                                  },
                                  "value": "log(address,uint,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18906,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18895,
                                  "src": "15205:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18907,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18897,
                                  "src": "15209:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18908,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18899,
                                  "src": "15213:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_e54ae1445cd51f09e801fc5885e33c709102997417d3d9b6f543f7724468b4e4",
                                    "typeString": "literal_string \"log(address,uint,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18903,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "15155:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18904,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "15155:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18909,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "15155:61:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18902,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "15139:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18910,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "15139:78:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18911,
                        "nodeType": "ExpressionStatement",
                        "src": "15139:78:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18913,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18900,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18895,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18913,
                        "src": "15091:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18894,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15091:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18897,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18913,
                        "src": "15103:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18896,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "15103:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18899,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18913,
                        "src": "15112:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18898,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "15112:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15090:30:101"
                  },
                  "returnParameters": {
                    "id": 18901,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "15135:0:101"
                  },
                  "scope": 25062,
                  "src": "15078:143:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18932,
                    "nodeType": "Block",
                    "src": "15284:89:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c75696e742c6164647265737329",
                                  "id": 18925,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "15328:27:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_97eca3948a309251ff02cc4a3cb96f84ac4b6b4bdc56e86c9f0131c9b70c6259",
                                    "typeString": "literal_string \"log(address,uint,address)\""
                                  },
                                  "value": "log(address,uint,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18926,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18915,
                                  "src": "15357:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18927,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18917,
                                  "src": "15361:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18928,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18919,
                                  "src": "15365:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_97eca3948a309251ff02cc4a3cb96f84ac4b6b4bdc56e86c9f0131c9b70c6259",
                                    "typeString": "literal_string \"log(address,uint,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18923,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "15304:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18924,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "15304:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18929,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "15304:64:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18922,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "15288:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18930,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "15288:81:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18931,
                        "nodeType": "ExpressionStatement",
                        "src": "15288:81:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18933,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18920,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18915,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18933,
                        "src": "15237:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18914,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15237:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18917,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18933,
                        "src": "15249:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18916,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "15249:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18919,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18933,
                        "src": "15258:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18918,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15258:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15236:33:101"
                  },
                  "returnParameters": {
                    "id": 18921,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "15284:0:101"
                  },
                  "scope": 25062,
                  "src": "15224:149:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18952,
                    "nodeType": "Block",
                    "src": "15442:88:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c737472696e672c75696e7429",
                                  "id": 18945,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "15486:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_1cdaf28a630ff01c83e1629295cea6793da60638603e831a5c07be53dbee3597",
                                    "typeString": "literal_string \"log(address,string,uint)\""
                                  },
                                  "value": "log(address,string,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18946,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18935,
                                  "src": "15514:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18947,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18937,
                                  "src": "15518:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18948,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18939,
                                  "src": "15522:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_1cdaf28a630ff01c83e1629295cea6793da60638603e831a5c07be53dbee3597",
                                    "typeString": "literal_string \"log(address,string,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18943,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "15462:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18944,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "15462:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18949,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "15462:63:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18942,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "15446:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18950,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "15446:80:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18951,
                        "nodeType": "ExpressionStatement",
                        "src": "15446:80:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18953,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18940,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18935,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18953,
                        "src": "15389:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18934,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15389:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18937,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18953,
                        "src": "15401:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18936,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "15401:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18939,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18953,
                        "src": "15419:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18938,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "15419:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15388:39:101"
                  },
                  "returnParameters": {
                    "id": 18941,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "15442:0:101"
                  },
                  "scope": 25062,
                  "src": "15376:154:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18972,
                    "nodeType": "Block",
                    "src": "15608:90:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c737472696e672c737472696e6729",
                                  "id": 18965,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "15652:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_fb77226597c11cd0c52945168d7176a06b9af41edea6a51823db111f35573158",
                                    "typeString": "literal_string \"log(address,string,string)\""
                                  },
                                  "value": "log(address,string,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18966,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18955,
                                  "src": "15682:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18967,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18957,
                                  "src": "15686:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18968,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18959,
                                  "src": "15690:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_fb77226597c11cd0c52945168d7176a06b9af41edea6a51823db111f35573158",
                                    "typeString": "literal_string \"log(address,string,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18963,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "15628:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18964,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "15628:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18969,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "15628:65:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18962,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "15612:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18970,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "15612:82:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18971,
                        "nodeType": "ExpressionStatement",
                        "src": "15612:82:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18973,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18960,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18955,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18973,
                        "src": "15546:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18954,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15546:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18957,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18973,
                        "src": "15558:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18956,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "15558:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18959,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18973,
                        "src": "15576:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18958,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "15576:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15545:48:101"
                  },
                  "returnParameters": {
                    "id": 18961,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "15608:0:101"
                  },
                  "scope": 25062,
                  "src": "15533:165:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 18992,
                    "nodeType": "Block",
                    "src": "15767:88:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c737472696e672c626f6f6c29",
                                  "id": 18985,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "15811:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_cf020fb14f49566c5748de1f455c699a10a4ed1d7cf32f9adb28d22878df1b96",
                                    "typeString": "literal_string \"log(address,string,bool)\""
                                  },
                                  "value": "log(address,string,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18986,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18975,
                                  "src": "15839:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18987,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18977,
                                  "src": "15843:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 18988,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18979,
                                  "src": "15847:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_cf020fb14f49566c5748de1f455c699a10a4ed1d7cf32f9adb28d22878df1b96",
                                    "typeString": "literal_string \"log(address,string,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18983,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "15787:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 18984,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "15787:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 18989,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "15787:63:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 18982,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "15771:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 18990,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "15771:80:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18991,
                        "nodeType": "ExpressionStatement",
                        "src": "15771:80:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 18993,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 18980,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18975,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18993,
                        "src": "15714:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18974,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15714:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18977,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18993,
                        "src": "15726:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18976,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "15726:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18979,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18993,
                        "src": "15744:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 18978,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "15744:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15713:39:101"
                  },
                  "returnParameters": {
                    "id": 18981,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "15767:0:101"
                  },
                  "scope": 25062,
                  "src": "15701:154:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19012,
                    "nodeType": "Block",
                    "src": "15927:91:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c737472696e672c6164647265737329",
                                  "id": 19005,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "15971:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_f08744e82875525f1ef885a48453f58e96cac98a5d32bd6d8c38e4977aede231",
                                    "typeString": "literal_string \"log(address,string,address)\""
                                  },
                                  "value": "log(address,string,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19006,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18995,
                                  "src": "16002:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19007,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18997,
                                  "src": "16006:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19008,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18999,
                                  "src": "16010:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_f08744e82875525f1ef885a48453f58e96cac98a5d32bd6d8c38e4977aede231",
                                    "typeString": "literal_string \"log(address,string,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19003,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "15947:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19004,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "15947:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19009,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "15947:66:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19002,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "15931:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19010,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "15931:83:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19011,
                        "nodeType": "ExpressionStatement",
                        "src": "15931:83:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19013,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19000,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 18995,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19013,
                        "src": "15871:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18994,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15871:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18997,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19013,
                        "src": "15883:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 18996,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "15883:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 18999,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19013,
                        "src": "15901:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 18998,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "15901:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "15870:42:101"
                  },
                  "returnParameters": {
                    "id": 19001,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "15927:0:101"
                  },
                  "scope": 25062,
                  "src": "15858:160:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19032,
                    "nodeType": "Block",
                    "src": "16078:86:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c626f6f6c2c75696e7429",
                                  "id": 19025,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "16122:24:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_2c468d157d9cb3bd4f3bc977d201b067de313f8e774b0377d5c5b2b5c9426095",
                                    "typeString": "literal_string \"log(address,bool,uint)\""
                                  },
                                  "value": "log(address,bool,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19026,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19015,
                                  "src": "16148:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19027,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19017,
                                  "src": "16152:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19028,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19019,
                                  "src": "16156:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_2c468d157d9cb3bd4f3bc977d201b067de313f8e774b0377d5c5b2b5c9426095",
                                    "typeString": "literal_string \"log(address,bool,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19023,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "16098:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19024,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "16098:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19029,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "16098:61:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19022,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "16082:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19030,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16082:78:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19031,
                        "nodeType": "ExpressionStatement",
                        "src": "16082:78:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19033,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19020,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19015,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19033,
                        "src": "16034:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19014,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "16034:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19017,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19033,
                        "src": "16046:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19016,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "16046:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19019,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19033,
                        "src": "16055:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19018,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "16055:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "16033:30:101"
                  },
                  "returnParameters": {
                    "id": 19021,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "16078:0:101"
                  },
                  "scope": 25062,
                  "src": "16021:143:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19052,
                    "nodeType": "Block",
                    "src": "16233:88:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c626f6f6c2c737472696e6729",
                                  "id": 19045,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "16277:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_212255cc5ff4a2d867f69451c60f51c24e41784276f4ceffe8ec3af322690750",
                                    "typeString": "literal_string \"log(address,bool,string)\""
                                  },
                                  "value": "log(address,bool,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19046,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19035,
                                  "src": "16305:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19047,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19037,
                                  "src": "16309:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19048,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19039,
                                  "src": "16313:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_212255cc5ff4a2d867f69451c60f51c24e41784276f4ceffe8ec3af322690750",
                                    "typeString": "literal_string \"log(address,bool,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19043,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "16253:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19044,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "16253:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19049,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "16253:63:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19042,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "16237:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19050,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16237:80:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19051,
                        "nodeType": "ExpressionStatement",
                        "src": "16237:80:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19053,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19040,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19035,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19053,
                        "src": "16180:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19034,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "16180:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19037,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19053,
                        "src": "16192:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19036,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "16192:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19039,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19053,
                        "src": "16201:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19038,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "16201:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "16179:39:101"
                  },
                  "returnParameters": {
                    "id": 19041,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "16233:0:101"
                  },
                  "scope": 25062,
                  "src": "16167:154:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19072,
                    "nodeType": "Block",
                    "src": "16381:86:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c626f6f6c2c626f6f6c29",
                                  "id": 19065,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "16425:24:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_eb830c92a079b46f3abcb83e519f578cffe7387941b6885067265feec096d279",
                                    "typeString": "literal_string \"log(address,bool,bool)\""
                                  },
                                  "value": "log(address,bool,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19066,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19055,
                                  "src": "16451:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19067,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19057,
                                  "src": "16455:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19068,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19059,
                                  "src": "16459:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_eb830c92a079b46f3abcb83e519f578cffe7387941b6885067265feec096d279",
                                    "typeString": "literal_string \"log(address,bool,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19063,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "16401:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19064,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "16401:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19069,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "16401:61:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19062,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "16385:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19070,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16385:78:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19071,
                        "nodeType": "ExpressionStatement",
                        "src": "16385:78:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19073,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19060,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19055,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19073,
                        "src": "16337:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19054,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "16337:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19057,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19073,
                        "src": "16349:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19056,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "16349:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19059,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19073,
                        "src": "16358:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19058,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "16358:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "16336:30:101"
                  },
                  "returnParameters": {
                    "id": 19061,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "16381:0:101"
                  },
                  "scope": 25062,
                  "src": "16324:143:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19092,
                    "nodeType": "Block",
                    "src": "16530:89:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c626f6f6c2c6164647265737329",
                                  "id": 19085,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "16574:27:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_f11699ed537119f000a51ba9fbd5bb55b3990a1a718acbe99659bd1bc84dc18d",
                                    "typeString": "literal_string \"log(address,bool,address)\""
                                  },
                                  "value": "log(address,bool,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19086,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19075,
                                  "src": "16603:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19087,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19077,
                                  "src": "16607:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19088,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19079,
                                  "src": "16611:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_f11699ed537119f000a51ba9fbd5bb55b3990a1a718acbe99659bd1bc84dc18d",
                                    "typeString": "literal_string \"log(address,bool,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19083,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "16550:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19084,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "16550:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19089,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "16550:64:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19082,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "16534:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19090,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16534:81:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19091,
                        "nodeType": "ExpressionStatement",
                        "src": "16534:81:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19093,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19080,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19075,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19093,
                        "src": "16483:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19074,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "16483:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19077,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19093,
                        "src": "16495:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19076,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "16495:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19079,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19093,
                        "src": "16504:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19078,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "16504:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "16482:33:101"
                  },
                  "returnParameters": {
                    "id": 19081,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "16530:0:101"
                  },
                  "scope": 25062,
                  "src": "16470:149:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19112,
                    "nodeType": "Block",
                    "src": "16682:89:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c616464726573732c75696e7429",
                                  "id": 19105,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "16726:27:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_6c366d7295b93bbfacc4df0ea28f0eef60efacfffd447f8f2823cbe5b2fedb07",
                                    "typeString": "literal_string \"log(address,address,uint)\""
                                  },
                                  "value": "log(address,address,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19106,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19095,
                                  "src": "16755:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19107,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19097,
                                  "src": "16759:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19108,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19099,
                                  "src": "16763:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_6c366d7295b93bbfacc4df0ea28f0eef60efacfffd447f8f2823cbe5b2fedb07",
                                    "typeString": "literal_string \"log(address,address,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19103,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "16702:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19104,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "16702:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19109,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "16702:64:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19102,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "16686:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19110,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16686:81:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19111,
                        "nodeType": "ExpressionStatement",
                        "src": "16686:81:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19113,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19100,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19095,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19113,
                        "src": "16635:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19094,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "16635:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19097,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19113,
                        "src": "16647:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19096,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "16647:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19099,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19113,
                        "src": "16659:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19098,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "16659:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "16634:33:101"
                  },
                  "returnParameters": {
                    "id": 19101,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "16682:0:101"
                  },
                  "scope": 25062,
                  "src": "16622:149:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19132,
                    "nodeType": "Block",
                    "src": "16843:91:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c616464726573732c737472696e6729",
                                  "id": 19125,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "16887:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_007150be50a4671a6be318012e9cd2eabb1e1bc8869b45c34abbaa04d81c8eee",
                                    "typeString": "literal_string \"log(address,address,string)\""
                                  },
                                  "value": "log(address,address,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19126,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19115,
                                  "src": "16918:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19127,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19117,
                                  "src": "16922:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19128,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19119,
                                  "src": "16926:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_007150be50a4671a6be318012e9cd2eabb1e1bc8869b45c34abbaa04d81c8eee",
                                    "typeString": "literal_string \"log(address,address,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19123,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "16863:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19124,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "16863:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19129,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "16863:66:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19122,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "16847:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19130,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16847:83:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19131,
                        "nodeType": "ExpressionStatement",
                        "src": "16847:83:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19133,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19120,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19115,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19133,
                        "src": "16787:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19114,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "16787:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19117,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19133,
                        "src": "16799:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19116,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "16799:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19119,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19133,
                        "src": "16811:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19118,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "16811:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "16786:42:101"
                  },
                  "returnParameters": {
                    "id": 19121,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "16843:0:101"
                  },
                  "scope": 25062,
                  "src": "16774:160:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19152,
                    "nodeType": "Block",
                    "src": "16997:89:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c616464726573732c626f6f6c29",
                                  "id": 19145,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "17041:27:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_f2a6628622808c8bbef4f3e513ab11e708a8f5073988f2f7988e111aa26586dc",
                                    "typeString": "literal_string \"log(address,address,bool)\""
                                  },
                                  "value": "log(address,address,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19146,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19135,
                                  "src": "17070:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19147,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19137,
                                  "src": "17074:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19148,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19139,
                                  "src": "17078:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_f2a6628622808c8bbef4f3e513ab11e708a8f5073988f2f7988e111aa26586dc",
                                    "typeString": "literal_string \"log(address,address,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19143,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "17017:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19144,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "17017:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19149,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "17017:64:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19142,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "17001:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19150,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "17001:81:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19151,
                        "nodeType": "ExpressionStatement",
                        "src": "17001:81:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19153,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19140,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19135,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19153,
                        "src": "16950:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19134,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "16950:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19137,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19153,
                        "src": "16962:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19136,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "16962:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19139,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19153,
                        "src": "16974:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19138,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "16974:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "16949:33:101"
                  },
                  "returnParameters": {
                    "id": 19141,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "16997:0:101"
                  },
                  "scope": 25062,
                  "src": "16937:149:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19172,
                    "nodeType": "Block",
                    "src": "17152:92:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c616464726573732c6164647265737329",
                                  "id": 19165,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "17196:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_018c84c25fb680b5bcd4e1ab1848682497c9dd3b635564a91c36ce3d1414c830",
                                    "typeString": "literal_string \"log(address,address,address)\""
                                  },
                                  "value": "log(address,address,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19166,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19155,
                                  "src": "17228:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19167,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19157,
                                  "src": "17232:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19168,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19159,
                                  "src": "17236:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_018c84c25fb680b5bcd4e1ab1848682497c9dd3b635564a91c36ce3d1414c830",
                                    "typeString": "literal_string \"log(address,address,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19163,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "17172:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19164,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "17172:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19169,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "17172:67:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19162,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "17156:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19170,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "17156:84:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19171,
                        "nodeType": "ExpressionStatement",
                        "src": "17156:84:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19173,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19160,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19155,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19173,
                        "src": "17102:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19154,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "17102:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19157,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19173,
                        "src": "17114:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19156,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "17114:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19159,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19173,
                        "src": "17126:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19158,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "17126:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "17101:36:101"
                  },
                  "returnParameters": {
                    "id": 19161,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "17152:0:101"
                  },
                  "scope": 25062,
                  "src": "17089:155:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19195,
                    "nodeType": "Block",
                    "src": "17310:92:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c75696e742c75696e742c75696e7429",
                                  "id": 19187,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "17354:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_5ca0ad3ec7f731e4661cde447171efd221faf44c50b57eba4cc4965c1f89c0b6",
                                    "typeString": "literal_string \"log(uint,uint,uint,uint)\""
                                  },
                                  "value": "log(uint,uint,uint,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19188,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19175,
                                  "src": "17382:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19189,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19177,
                                  "src": "17386:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19190,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19179,
                                  "src": "17390:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19191,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19181,
                                  "src": "17394:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_5ca0ad3ec7f731e4661cde447171efd221faf44c50b57eba4cc4965c1f89c0b6",
                                    "typeString": "literal_string \"log(uint,uint,uint,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19185,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "17330:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19186,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "17330:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19192,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "17330:67:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19184,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "17314:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19193,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "17314:84:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19194,
                        "nodeType": "ExpressionStatement",
                        "src": "17314:84:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19196,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19182,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19175,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19196,
                        "src": "17260:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19174,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "17260:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19177,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19196,
                        "src": "17269:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19176,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "17269:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19179,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19196,
                        "src": "17278:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19178,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "17278:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19181,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19196,
                        "src": "17287:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19180,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "17287:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "17259:36:101"
                  },
                  "returnParameters": {
                    "id": 19183,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "17310:0:101"
                  },
                  "scope": 25062,
                  "src": "17247:155:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19218,
                    "nodeType": "Block",
                    "src": "17477:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c75696e742c75696e742c737472696e6729",
                                  "id": 19210,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "17521:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_78ad7a0c8cf57ba0e3b9e892fd6558ba40a5d4c84ef5c8c5e36bfc8d7f23b0c5",
                                    "typeString": "literal_string \"log(uint,uint,uint,string)\""
                                  },
                                  "value": "log(uint,uint,uint,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19211,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19198,
                                  "src": "17551:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19212,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19200,
                                  "src": "17555:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19213,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19202,
                                  "src": "17559:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19214,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19204,
                                  "src": "17563:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_78ad7a0c8cf57ba0e3b9e892fd6558ba40a5d4c84ef5c8c5e36bfc8d7f23b0c5",
                                    "typeString": "literal_string \"log(uint,uint,uint,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19208,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "17497:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19209,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "17497:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19215,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "17497:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19207,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "17481:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19216,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "17481:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19217,
                        "nodeType": "ExpressionStatement",
                        "src": "17481:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19219,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19205,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19198,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19219,
                        "src": "17418:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19197,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "17418:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19200,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19219,
                        "src": "17427:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19199,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "17427:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19202,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19219,
                        "src": "17436:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19201,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "17436:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19204,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19219,
                        "src": "17445:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19203,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "17445:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "17417:45:101"
                  },
                  "returnParameters": {
                    "id": 19206,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "17477:0:101"
                  },
                  "scope": 25062,
                  "src": "17405:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19241,
                    "nodeType": "Block",
                    "src": "17637:92:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c75696e742c75696e742c626f6f6c29",
                                  "id": 19233,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "17681:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_6452b9cbdf8b8479d7ee301237b2d6dfa173fc92538628ab30d643fb4351918f",
                                    "typeString": "literal_string \"log(uint,uint,uint,bool)\""
                                  },
                                  "value": "log(uint,uint,uint,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19234,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19221,
                                  "src": "17709:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19235,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19223,
                                  "src": "17713:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19236,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19225,
                                  "src": "17717:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19237,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19227,
                                  "src": "17721:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_6452b9cbdf8b8479d7ee301237b2d6dfa173fc92538628ab30d643fb4351918f",
                                    "typeString": "literal_string \"log(uint,uint,uint,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19231,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "17657:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19232,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "17657:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19238,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "17657:67:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19230,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "17641:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19239,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "17641:84:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19240,
                        "nodeType": "ExpressionStatement",
                        "src": "17641:84:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19242,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19228,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19221,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19242,
                        "src": "17587:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19220,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "17587:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19223,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19242,
                        "src": "17596:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19222,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "17596:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19225,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19242,
                        "src": "17605:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19224,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "17605:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19227,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19242,
                        "src": "17614:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19226,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "17614:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "17586:36:101"
                  },
                  "returnParameters": {
                    "id": 19229,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "17637:0:101"
                  },
                  "scope": 25062,
                  "src": "17574:155:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19264,
                    "nodeType": "Block",
                    "src": "17798:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c75696e742c75696e742c6164647265737329",
                                  "id": 19256,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "17842:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_e0853f69a5584c9e0aa87ddae9bd870cf5164166d612d334644e66176c1213ba",
                                    "typeString": "literal_string \"log(uint,uint,uint,address)\""
                                  },
                                  "value": "log(uint,uint,uint,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19257,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19244,
                                  "src": "17873:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19258,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19246,
                                  "src": "17877:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19259,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19248,
                                  "src": "17881:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19260,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19250,
                                  "src": "17885:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_e0853f69a5584c9e0aa87ddae9bd870cf5164166d612d334644e66176c1213ba",
                                    "typeString": "literal_string \"log(uint,uint,uint,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19254,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "17818:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19255,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "17818:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19261,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "17818:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19253,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "17802:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19262,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "17802:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19263,
                        "nodeType": "ExpressionStatement",
                        "src": "17802:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19265,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19251,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19244,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19265,
                        "src": "17745:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19243,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "17745:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19246,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19265,
                        "src": "17754:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19245,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "17754:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19248,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19265,
                        "src": "17763:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19247,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "17763:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19250,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19265,
                        "src": "17772:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19249,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "17772:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "17744:39:101"
                  },
                  "returnParameters": {
                    "id": 19252,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "17798:0:101"
                  },
                  "scope": 25062,
                  "src": "17732:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19287,
                    "nodeType": "Block",
                    "src": "17968:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c75696e742c737472696e672c75696e7429",
                                  "id": 19279,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "18012:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_3894163d4e8f3eec101fb8e2c1029563bd05d05ee1d1790a46910ebbbdc3072e",
                                    "typeString": "literal_string \"log(uint,uint,string,uint)\""
                                  },
                                  "value": "log(uint,uint,string,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19280,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19267,
                                  "src": "18042:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19281,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19269,
                                  "src": "18046:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19282,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19271,
                                  "src": "18050:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19283,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19273,
                                  "src": "18054:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_3894163d4e8f3eec101fb8e2c1029563bd05d05ee1d1790a46910ebbbdc3072e",
                                    "typeString": "literal_string \"log(uint,uint,string,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19277,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "17988:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19278,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "17988:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19284,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "17988:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19276,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "17972:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19285,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "17972:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19286,
                        "nodeType": "ExpressionStatement",
                        "src": "17972:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19288,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19274,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19267,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19288,
                        "src": "17909:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19266,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "17909:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19269,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19288,
                        "src": "17918:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19268,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "17918:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19271,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19288,
                        "src": "17927:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19270,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "17927:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19273,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19288,
                        "src": "17945:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19272,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "17945:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "17908:45:101"
                  },
                  "returnParameters": {
                    "id": 19275,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "17968:0:101"
                  },
                  "scope": 25062,
                  "src": "17896:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19310,
                    "nodeType": "Block",
                    "src": "18146:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c75696e742c737472696e672c737472696e6729",
                                  "id": 19302,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "18190:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_7c032a3207958e3d969ab52b045e7a59226129ee4b9e813f7071f9a5e80813f6",
                                    "typeString": "literal_string \"log(uint,uint,string,string)\""
                                  },
                                  "value": "log(uint,uint,string,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19303,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19290,
                                  "src": "18222:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19304,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19292,
                                  "src": "18226:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19305,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19294,
                                  "src": "18230:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19306,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19296,
                                  "src": "18234:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_7c032a3207958e3d969ab52b045e7a59226129ee4b9e813f7071f9a5e80813f6",
                                    "typeString": "literal_string \"log(uint,uint,string,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19300,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "18166:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19301,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "18166:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19307,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "18166:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19299,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "18150:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19308,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "18150:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19309,
                        "nodeType": "ExpressionStatement",
                        "src": "18150:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19311,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19297,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19290,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19311,
                        "src": "18078:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19289,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "18078:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19292,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19311,
                        "src": "18087:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19291,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "18087:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19294,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19311,
                        "src": "18096:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19293,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "18096:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19296,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19311,
                        "src": "18114:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19295,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "18114:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18077:54:101"
                  },
                  "returnParameters": {
                    "id": 19298,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "18146:0:101"
                  },
                  "scope": 25062,
                  "src": "18065:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19333,
                    "nodeType": "Block",
                    "src": "18317:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c75696e742c737472696e672c626f6f6c29",
                                  "id": 19325,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "18361:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_b22eaf06d72d481cf9b94b8f4d5fb89cf08bbfd924ee166a250ac94617be65b9",
                                    "typeString": "literal_string \"log(uint,uint,string,bool)\""
                                  },
                                  "value": "log(uint,uint,string,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19326,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19313,
                                  "src": "18391:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19327,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19315,
                                  "src": "18395:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19328,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19317,
                                  "src": "18399:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19329,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19319,
                                  "src": "18403:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_b22eaf06d72d481cf9b94b8f4d5fb89cf08bbfd924ee166a250ac94617be65b9",
                                    "typeString": "literal_string \"log(uint,uint,string,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19323,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "18337:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19324,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "18337:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19330,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "18337:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19322,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "18321:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19331,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "18321:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19332,
                        "nodeType": "ExpressionStatement",
                        "src": "18321:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19334,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19320,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19313,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19334,
                        "src": "18258:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19312,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "18258:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19315,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19334,
                        "src": "18267:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19314,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "18267:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19317,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19334,
                        "src": "18276:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19316,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "18276:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19319,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19334,
                        "src": "18294:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19318,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "18294:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18257:45:101"
                  },
                  "returnParameters": {
                    "id": 19321,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "18317:0:101"
                  },
                  "scope": 25062,
                  "src": "18245:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19356,
                    "nodeType": "Block",
                    "src": "18489:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c75696e742c737472696e672c6164647265737329",
                                  "id": 19348,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "18533:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_433285a23ec6b1f0f76da64682232527561857544109f80e3e5d46b0e16980e7",
                                    "typeString": "literal_string \"log(uint,uint,string,address)\""
                                  },
                                  "value": "log(uint,uint,string,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19349,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19336,
                                  "src": "18566:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19350,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19338,
                                  "src": "18570:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19351,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19340,
                                  "src": "18574:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19352,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19342,
                                  "src": "18578:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_433285a23ec6b1f0f76da64682232527561857544109f80e3e5d46b0e16980e7",
                                    "typeString": "literal_string \"log(uint,uint,string,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19346,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "18509:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19347,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "18509:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19353,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "18509:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19345,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "18493:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19354,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "18493:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19355,
                        "nodeType": "ExpressionStatement",
                        "src": "18493:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19357,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19343,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19336,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19357,
                        "src": "18427:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19335,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "18427:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19338,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19357,
                        "src": "18436:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19337,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "18436:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19340,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19357,
                        "src": "18445:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19339,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "18445:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19342,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19357,
                        "src": "18463:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19341,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "18463:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18426:48:101"
                  },
                  "returnParameters": {
                    "id": 19344,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "18489:0:101"
                  },
                  "scope": 25062,
                  "src": "18414:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19379,
                    "nodeType": "Block",
                    "src": "18652:92:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c75696e742c626f6f6c2c75696e7429",
                                  "id": 19371,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "18696:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_6c647c8c5fed6e02ad4f1c7bfb891e58ba00758f5d6cb92966fd0684c5b3fc8d",
                                    "typeString": "literal_string \"log(uint,uint,bool,uint)\""
                                  },
                                  "value": "log(uint,uint,bool,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19372,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19359,
                                  "src": "18724:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19373,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19361,
                                  "src": "18728:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19374,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19363,
                                  "src": "18732:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19375,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19365,
                                  "src": "18736:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_6c647c8c5fed6e02ad4f1c7bfb891e58ba00758f5d6cb92966fd0684c5b3fc8d",
                                    "typeString": "literal_string \"log(uint,uint,bool,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19369,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "18672:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19370,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "18672:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19376,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "18672:67:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19368,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "18656:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19377,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "18656:84:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19378,
                        "nodeType": "ExpressionStatement",
                        "src": "18656:84:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19380,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19366,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19359,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19380,
                        "src": "18602:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19358,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "18602:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19361,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19380,
                        "src": "18611:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19360,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "18611:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19363,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19380,
                        "src": "18620:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19362,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "18620:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19365,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19380,
                        "src": "18629:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19364,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "18629:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18601:36:101"
                  },
                  "returnParameters": {
                    "id": 19367,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "18652:0:101"
                  },
                  "scope": 25062,
                  "src": "18589:155:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19402,
                    "nodeType": "Block",
                    "src": "18819:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c75696e742c626f6f6c2c737472696e6729",
                                  "id": 19394,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "18863:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_efd9cbeee79713372dd0a748a26a3fb36cbe4eb4e01a37fbde0cde0e101fc85a",
                                    "typeString": "literal_string \"log(uint,uint,bool,string)\""
                                  },
                                  "value": "log(uint,uint,bool,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19395,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19382,
                                  "src": "18893:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19396,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19384,
                                  "src": "18897:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19397,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19386,
                                  "src": "18901:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19398,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19388,
                                  "src": "18905:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_efd9cbeee79713372dd0a748a26a3fb36cbe4eb4e01a37fbde0cde0e101fc85a",
                                    "typeString": "literal_string \"log(uint,uint,bool,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19392,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "18839:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19393,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "18839:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19399,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "18839:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19391,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "18823:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19400,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "18823:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19401,
                        "nodeType": "ExpressionStatement",
                        "src": "18823:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19403,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19389,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19382,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19403,
                        "src": "18760:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19381,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "18760:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19384,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19403,
                        "src": "18769:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19383,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "18769:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19386,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19403,
                        "src": "18778:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19385,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "18778:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19388,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19403,
                        "src": "18787:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19387,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "18787:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18759:45:101"
                  },
                  "returnParameters": {
                    "id": 19390,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "18819:0:101"
                  },
                  "scope": 25062,
                  "src": "18747:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19425,
                    "nodeType": "Block",
                    "src": "18979:92:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c75696e742c626f6f6c2c626f6f6c29",
                                  "id": 19417,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "19023:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_94be3bb13e096cdbc5a1999a524e3b6664a32da7e2c2954ae0e2b792a0dd1f41",
                                    "typeString": "literal_string \"log(uint,uint,bool,bool)\""
                                  },
                                  "value": "log(uint,uint,bool,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19418,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19405,
                                  "src": "19051:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19419,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19407,
                                  "src": "19055:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19420,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19409,
                                  "src": "19059:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19421,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19411,
                                  "src": "19063:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_94be3bb13e096cdbc5a1999a524e3b6664a32da7e2c2954ae0e2b792a0dd1f41",
                                    "typeString": "literal_string \"log(uint,uint,bool,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19415,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "18999:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19416,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "18999:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19422,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "18999:67:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19414,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "18983:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19423,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "18983:84:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19424,
                        "nodeType": "ExpressionStatement",
                        "src": "18983:84:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19426,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19412,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19405,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19426,
                        "src": "18929:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19404,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "18929:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19407,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19426,
                        "src": "18938:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19406,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "18938:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19409,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19426,
                        "src": "18947:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19408,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "18947:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19411,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19426,
                        "src": "18956:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19410,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "18956:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "18928:36:101"
                  },
                  "returnParameters": {
                    "id": 19413,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "18979:0:101"
                  },
                  "scope": 25062,
                  "src": "18916:155:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19448,
                    "nodeType": "Block",
                    "src": "19140:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c75696e742c626f6f6c2c6164647265737329",
                                  "id": 19440,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "19184:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_e117744fcc46e4484cabd18d640497b4a9d76b7f775e79fe9a95e42427bd8976",
                                    "typeString": "literal_string \"log(uint,uint,bool,address)\""
                                  },
                                  "value": "log(uint,uint,bool,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19441,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19428,
                                  "src": "19215:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19442,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19430,
                                  "src": "19219:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19443,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19432,
                                  "src": "19223:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19444,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19434,
                                  "src": "19227:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_e117744fcc46e4484cabd18d640497b4a9d76b7f775e79fe9a95e42427bd8976",
                                    "typeString": "literal_string \"log(uint,uint,bool,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19438,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "19160:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19439,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "19160:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19445,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "19160:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19437,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "19144:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19446,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "19144:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19447,
                        "nodeType": "ExpressionStatement",
                        "src": "19144:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19449,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19435,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19428,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19449,
                        "src": "19087:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19427,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "19087:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19430,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19449,
                        "src": "19096:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19429,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "19096:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19432,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19449,
                        "src": "19105:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19431,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "19105:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19434,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19449,
                        "src": "19114:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19433,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "19114:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19086:39:101"
                  },
                  "returnParameters": {
                    "id": 19436,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "19140:0:101"
                  },
                  "scope": 25062,
                  "src": "19074:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19471,
                    "nodeType": "Block",
                    "src": "19304:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c75696e742c616464726573732c75696e7429",
                                  "id": 19463,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "19348:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_610ba8c0cae1123f7f8ad76791afd86dc185a4f1fe79a263112118ddb5231e9f",
                                    "typeString": "literal_string \"log(uint,uint,address,uint)\""
                                  },
                                  "value": "log(uint,uint,address,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19464,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19451,
                                  "src": "19379:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19465,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19453,
                                  "src": "19383:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19466,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19455,
                                  "src": "19387:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19467,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19457,
                                  "src": "19391:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_610ba8c0cae1123f7f8ad76791afd86dc185a4f1fe79a263112118ddb5231e9f",
                                    "typeString": "literal_string \"log(uint,uint,address,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19461,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "19324:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19462,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "19324:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19468,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "19324:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19460,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "19308:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19469,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "19308:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19470,
                        "nodeType": "ExpressionStatement",
                        "src": "19308:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19472,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19458,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19451,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19472,
                        "src": "19251:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19450,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "19251:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19453,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19472,
                        "src": "19260:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19452,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "19260:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19455,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19472,
                        "src": "19269:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19454,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "19269:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19457,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19472,
                        "src": "19281:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19456,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "19281:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19250:39:101"
                  },
                  "returnParameters": {
                    "id": 19459,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "19304:0:101"
                  },
                  "scope": 25062,
                  "src": "19238:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19494,
                    "nodeType": "Block",
                    "src": "19477:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c75696e742c616464726573732c737472696e6729",
                                  "id": 19486,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "19521:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_d6a2d1de1bf5c0a47e82220cd592c8fb4a4a43f17ecab471044861ef70454227",
                                    "typeString": "literal_string \"log(uint,uint,address,string)\""
                                  },
                                  "value": "log(uint,uint,address,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19487,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19474,
                                  "src": "19554:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19488,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19476,
                                  "src": "19558:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19489,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19478,
                                  "src": "19562:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19490,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19480,
                                  "src": "19566:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_d6a2d1de1bf5c0a47e82220cd592c8fb4a4a43f17ecab471044861ef70454227",
                                    "typeString": "literal_string \"log(uint,uint,address,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19484,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "19497:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19485,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "19497:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19491,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "19497:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19483,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "19481:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19492,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "19481:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19493,
                        "nodeType": "ExpressionStatement",
                        "src": "19481:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19495,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19481,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19474,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19495,
                        "src": "19415:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19473,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "19415:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19476,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19495,
                        "src": "19424:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19475,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "19424:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19478,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19495,
                        "src": "19433:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19477,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "19433:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19480,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19495,
                        "src": "19445:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19479,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "19445:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19414:48:101"
                  },
                  "returnParameters": {
                    "id": 19482,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "19477:0:101"
                  },
                  "scope": 25062,
                  "src": "19402:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19517,
                    "nodeType": "Block",
                    "src": "19643:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c75696e742c616464726573732c626f6f6c29",
                                  "id": 19509,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "19687:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_a8e820ae9dc5fd5a845e5dabf2b296e5588fe5a0d8101de14323ebe3e8e2b6c0",
                                    "typeString": "literal_string \"log(uint,uint,address,bool)\""
                                  },
                                  "value": "log(uint,uint,address,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19510,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19497,
                                  "src": "19718:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19511,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19499,
                                  "src": "19722:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19512,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19501,
                                  "src": "19726:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19513,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19503,
                                  "src": "19730:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_a8e820ae9dc5fd5a845e5dabf2b296e5588fe5a0d8101de14323ebe3e8e2b6c0",
                                    "typeString": "literal_string \"log(uint,uint,address,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19507,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "19663:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19508,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "19663:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19514,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "19663:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19506,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "19647:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19515,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "19647:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19516,
                        "nodeType": "ExpressionStatement",
                        "src": "19647:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19518,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19504,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19497,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19518,
                        "src": "19590:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19496,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "19590:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19499,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19518,
                        "src": "19599:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19498,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "19599:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19501,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19518,
                        "src": "19608:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19500,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "19608:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19503,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19518,
                        "src": "19620:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19502,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "19620:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19589:39:101"
                  },
                  "returnParameters": {
                    "id": 19505,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "19643:0:101"
                  },
                  "scope": 25062,
                  "src": "19577:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19540,
                    "nodeType": "Block",
                    "src": "19810:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c75696e742c616464726573732c6164647265737329",
                                  "id": 19532,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "19854:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_ca939b20e9284d76bbbc091d0d45d06f650171230ac4f1f35652b8b6e1579811",
                                    "typeString": "literal_string \"log(uint,uint,address,address)\""
                                  },
                                  "value": "log(uint,uint,address,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19533,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19520,
                                  "src": "19888:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19534,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19522,
                                  "src": "19892:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19535,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19524,
                                  "src": "19896:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19536,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19526,
                                  "src": "19900:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_ca939b20e9284d76bbbc091d0d45d06f650171230ac4f1f35652b8b6e1579811",
                                    "typeString": "literal_string \"log(uint,uint,address,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19530,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "19830:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19531,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "19830:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19537,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "19830:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19529,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "19814:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19538,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "19814:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19539,
                        "nodeType": "ExpressionStatement",
                        "src": "19814:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19541,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19527,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19520,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19541,
                        "src": "19754:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19519,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "19754:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19522,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19541,
                        "src": "19763:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19521,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "19763:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19524,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19541,
                        "src": "19772:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19523,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "19772:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19526,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19541,
                        "src": "19784:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19525,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "19784:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19753:42:101"
                  },
                  "returnParameters": {
                    "id": 19528,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "19810:0:101"
                  },
                  "scope": 25062,
                  "src": "19741:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19563,
                    "nodeType": "Block",
                    "src": "19983:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c737472696e672c75696e742c75696e7429",
                                  "id": 19555,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "20027:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c0043807b5f951e0375253205c951c6e6a6b19b5de111342e8f6be7c7f284628",
                                    "typeString": "literal_string \"log(uint,string,uint,uint)\""
                                  },
                                  "value": "log(uint,string,uint,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19556,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19543,
                                  "src": "20057:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19557,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19545,
                                  "src": "20061:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19558,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19547,
                                  "src": "20065:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19559,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19549,
                                  "src": "20069:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_c0043807b5f951e0375253205c951c6e6a6b19b5de111342e8f6be7c7f284628",
                                    "typeString": "literal_string \"log(uint,string,uint,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19553,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "20003:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19554,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "20003:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19560,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "20003:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19552,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "19987:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19561,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "19987:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19562,
                        "nodeType": "ExpressionStatement",
                        "src": "19987:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19564,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19550,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19543,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19564,
                        "src": "19924:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19542,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "19924:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19545,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19564,
                        "src": "19933:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19544,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "19933:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19547,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19564,
                        "src": "19951:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19546,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "19951:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19549,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19564,
                        "src": "19960:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19548,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "19960:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "19923:45:101"
                  },
                  "returnParameters": {
                    "id": 19551,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "19983:0:101"
                  },
                  "scope": 25062,
                  "src": "19911:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19586,
                    "nodeType": "Block",
                    "src": "20161:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c737472696e672c75696e742c737472696e6729",
                                  "id": 19578,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "20205:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_a2bc0c99cedfd873182e8eb1e68799dc8925c663b8ce2430858586fba62fe313",
                                    "typeString": "literal_string \"log(uint,string,uint,string)\""
                                  },
                                  "value": "log(uint,string,uint,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19579,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19566,
                                  "src": "20237:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19580,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19568,
                                  "src": "20241:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19581,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19570,
                                  "src": "20245:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19582,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19572,
                                  "src": "20249:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_a2bc0c99cedfd873182e8eb1e68799dc8925c663b8ce2430858586fba62fe313",
                                    "typeString": "literal_string \"log(uint,string,uint,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19576,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "20181:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19577,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "20181:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19583,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "20181:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19575,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "20165:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19584,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "20165:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19585,
                        "nodeType": "ExpressionStatement",
                        "src": "20165:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19587,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19573,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19566,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19587,
                        "src": "20093:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19565,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "20093:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19568,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19587,
                        "src": "20102:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19567,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "20102:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19570,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19587,
                        "src": "20120:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19569,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "20120:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19572,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19587,
                        "src": "20129:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19571,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "20129:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20092:54:101"
                  },
                  "returnParameters": {
                    "id": 19574,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "20161:0:101"
                  },
                  "scope": 25062,
                  "src": "20080:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19609,
                    "nodeType": "Block",
                    "src": "20332:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c737472696e672c75696e742c626f6f6c29",
                                  "id": 19601,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "20376:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_875a6e2ed2444d0d09e264b06717914212d8a793bea0f48b5633e707ac53784d",
                                    "typeString": "literal_string \"log(uint,string,uint,bool)\""
                                  },
                                  "value": "log(uint,string,uint,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19602,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19589,
                                  "src": "20406:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19603,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19591,
                                  "src": "20410:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19604,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19593,
                                  "src": "20414:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19605,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19595,
                                  "src": "20418:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_875a6e2ed2444d0d09e264b06717914212d8a793bea0f48b5633e707ac53784d",
                                    "typeString": "literal_string \"log(uint,string,uint,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19599,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "20352:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19600,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "20352:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19606,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "20352:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19598,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "20336:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19607,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "20336:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19608,
                        "nodeType": "ExpressionStatement",
                        "src": "20336:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19610,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19596,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19589,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19610,
                        "src": "20273:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19588,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "20273:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19591,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19610,
                        "src": "20282:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19590,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "20282:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19593,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19610,
                        "src": "20300:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19592,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "20300:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19595,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19610,
                        "src": "20309:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19594,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "20309:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20272:45:101"
                  },
                  "returnParameters": {
                    "id": 19597,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "20332:0:101"
                  },
                  "scope": 25062,
                  "src": "20260:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19632,
                    "nodeType": "Block",
                    "src": "20504:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c737472696e672c75696e742c6164647265737329",
                                  "id": 19624,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "20548:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_ab7bd9fd9b149127bbb235a3e1bec9a2e844f3968bdc1f48944c4b1973dacfda",
                                    "typeString": "literal_string \"log(uint,string,uint,address)\""
                                  },
                                  "value": "log(uint,string,uint,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19625,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19612,
                                  "src": "20581:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19626,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19614,
                                  "src": "20585:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19627,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19616,
                                  "src": "20589:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19628,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19618,
                                  "src": "20593:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_ab7bd9fd9b149127bbb235a3e1bec9a2e844f3968bdc1f48944c4b1973dacfda",
                                    "typeString": "literal_string \"log(uint,string,uint,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19622,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "20524:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19623,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "20524:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19629,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "20524:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19621,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "20508:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19630,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "20508:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19631,
                        "nodeType": "ExpressionStatement",
                        "src": "20508:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19633,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19619,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19612,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19633,
                        "src": "20442:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19611,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "20442:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19614,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19633,
                        "src": "20451:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19613,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "20451:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19616,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19633,
                        "src": "20469:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19615,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "20469:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19618,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19633,
                        "src": "20478:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19617,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "20478:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20441:48:101"
                  },
                  "returnParameters": {
                    "id": 19620,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "20504:0:101"
                  },
                  "scope": 25062,
                  "src": "20429:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19655,
                    "nodeType": "Block",
                    "src": "20685:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c737472696e672c737472696e672c75696e7429",
                                  "id": 19647,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "20729:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_76ec635e4702367bf449b895743175fa2654af8170b6d9c20dd183616d0a192b",
                                    "typeString": "literal_string \"log(uint,string,string,uint)\""
                                  },
                                  "value": "log(uint,string,string,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19648,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19635,
                                  "src": "20761:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19649,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19637,
                                  "src": "20765:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19650,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19639,
                                  "src": "20769:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19651,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19641,
                                  "src": "20773:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_76ec635e4702367bf449b895743175fa2654af8170b6d9c20dd183616d0a192b",
                                    "typeString": "literal_string \"log(uint,string,string,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19645,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "20705:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19646,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "20705:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19652,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "20705:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19644,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "20689:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19653,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "20689:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19654,
                        "nodeType": "ExpressionStatement",
                        "src": "20689:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19656,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19642,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19635,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19656,
                        "src": "20617:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19634,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "20617:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19637,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19656,
                        "src": "20626:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19636,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "20626:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19639,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19656,
                        "src": "20644:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19638,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "20644:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19641,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19656,
                        "src": "20662:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19640,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "20662:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20616:54:101"
                  },
                  "returnParameters": {
                    "id": 19643,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "20685:0:101"
                  },
                  "scope": 25062,
                  "src": "20604:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19678,
                    "nodeType": "Block",
                    "src": "20874:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c737472696e672c737472696e672c737472696e6729",
                                  "id": 19670,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "20918:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_57dd0a119927787a0c91b48333e191a1b3a4082dcb6efc912e2ba5b047e15156",
                                    "typeString": "literal_string \"log(uint,string,string,string)\""
                                  },
                                  "value": "log(uint,string,string,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19671,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19658,
                                  "src": "20952:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19672,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19660,
                                  "src": "20956:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19673,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19662,
                                  "src": "20960:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19674,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19664,
                                  "src": "20964:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_57dd0a119927787a0c91b48333e191a1b3a4082dcb6efc912e2ba5b047e15156",
                                    "typeString": "literal_string \"log(uint,string,string,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19668,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "20894:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19669,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "20894:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19675,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "20894:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19667,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "20878:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19676,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "20878:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19677,
                        "nodeType": "ExpressionStatement",
                        "src": "20878:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19679,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19665,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19658,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19679,
                        "src": "20797:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19657,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "20797:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19660,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19679,
                        "src": "20806:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19659,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "20806:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19662,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19679,
                        "src": "20824:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19661,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "20824:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19664,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19679,
                        "src": "20842:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19663,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "20842:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20796:63:101"
                  },
                  "returnParameters": {
                    "id": 19666,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "20874:0:101"
                  },
                  "scope": 25062,
                  "src": "20784:188:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19701,
                    "nodeType": "Block",
                    "src": "21056:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c737472696e672c737472696e672c626f6f6c29",
                                  "id": 19693,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "21100:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_12862b98fdb7950b0e6908443bc9d7894b44d5616424da5cdb6206a848affcbc",
                                    "typeString": "literal_string \"log(uint,string,string,bool)\""
                                  },
                                  "value": "log(uint,string,string,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19694,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19681,
                                  "src": "21132:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19695,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19683,
                                  "src": "21136:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19696,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19685,
                                  "src": "21140:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19697,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19687,
                                  "src": "21144:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_12862b98fdb7950b0e6908443bc9d7894b44d5616424da5cdb6206a848affcbc",
                                    "typeString": "literal_string \"log(uint,string,string,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19691,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "21076:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19692,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "21076:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19698,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "21076:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19690,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "21060:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19699,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21060:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19700,
                        "nodeType": "ExpressionStatement",
                        "src": "21060:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19702,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19688,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19681,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19702,
                        "src": "20988:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19680,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "20988:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19683,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19702,
                        "src": "20997:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19682,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "20997:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19685,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19702,
                        "src": "21015:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19684,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "21015:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19687,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19702,
                        "src": "21033:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19686,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "21033:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "20987:54:101"
                  },
                  "returnParameters": {
                    "id": 19689,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "21056:0:101"
                  },
                  "scope": 25062,
                  "src": "20975:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19724,
                    "nodeType": "Block",
                    "src": "21239:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c737472696e672c737472696e672c6164647265737329",
                                  "id": 19716,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "21283:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_cc988aa0514d1ed8be70a6bf2bdff4972e3f3420811b4adbd40f9b75b873fded",
                                    "typeString": "literal_string \"log(uint,string,string,address)\""
                                  },
                                  "value": "log(uint,string,string,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19717,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19704,
                                  "src": "21318:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19718,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19706,
                                  "src": "21322:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19719,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19708,
                                  "src": "21326:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19720,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19710,
                                  "src": "21330:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_cc988aa0514d1ed8be70a6bf2bdff4972e3f3420811b4adbd40f9b75b873fded",
                                    "typeString": "literal_string \"log(uint,string,string,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19714,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "21259:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19715,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "21259:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19721,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "21259:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19713,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "21243:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19722,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21243:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19723,
                        "nodeType": "ExpressionStatement",
                        "src": "21243:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19725,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19711,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19704,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19725,
                        "src": "21168:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19703,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "21168:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19706,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19725,
                        "src": "21177:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19705,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "21177:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19708,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19725,
                        "src": "21195:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19707,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "21195:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19710,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19725,
                        "src": "21213:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19709,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "21213:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21167:57:101"
                  },
                  "returnParameters": {
                    "id": 19712,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "21239:0:101"
                  },
                  "scope": 25062,
                  "src": "21155:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19747,
                    "nodeType": "Block",
                    "src": "21413:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c737472696e672c626f6f6c2c75696e7429",
                                  "id": 19739,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "21457:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_a4b48a7f4bdefee99950b35e5da7ba9724c3954e445cc3077000bce7a4265081",
                                    "typeString": "literal_string \"log(uint,string,bool,uint)\""
                                  },
                                  "value": "log(uint,string,bool,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19740,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19727,
                                  "src": "21487:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19741,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19729,
                                  "src": "21491:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19742,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19731,
                                  "src": "21495:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19743,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19733,
                                  "src": "21499:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_a4b48a7f4bdefee99950b35e5da7ba9724c3954e445cc3077000bce7a4265081",
                                    "typeString": "literal_string \"log(uint,string,bool,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19737,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "21433:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19738,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "21433:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19744,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "21433:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19736,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "21417:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19745,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21417:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19746,
                        "nodeType": "ExpressionStatement",
                        "src": "21417:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19748,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19734,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19727,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19748,
                        "src": "21354:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19726,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "21354:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19729,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19748,
                        "src": "21363:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19728,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "21363:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19731,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19748,
                        "src": "21381:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19730,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "21381:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19733,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19748,
                        "src": "21390:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19732,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "21390:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21353:45:101"
                  },
                  "returnParameters": {
                    "id": 19735,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "21413:0:101"
                  },
                  "scope": 25062,
                  "src": "21341:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19770,
                    "nodeType": "Block",
                    "src": "21591:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c737472696e672c626f6f6c2c737472696e6729",
                                  "id": 19762,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "21635:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_8d489ca064b1083bafb8388fd8f3d44c2255dbe322f7a52abe786a76257d06e4",
                                    "typeString": "literal_string \"log(uint,string,bool,string)\""
                                  },
                                  "value": "log(uint,string,bool,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19763,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19750,
                                  "src": "21667:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19764,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19752,
                                  "src": "21671:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19765,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19754,
                                  "src": "21675:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19766,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19756,
                                  "src": "21679:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_8d489ca064b1083bafb8388fd8f3d44c2255dbe322f7a52abe786a76257d06e4",
                                    "typeString": "literal_string \"log(uint,string,bool,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19760,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "21611:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19761,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "21611:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19767,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "21611:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19759,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "21595:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19768,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21595:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19769,
                        "nodeType": "ExpressionStatement",
                        "src": "21595:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19771,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19757,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19750,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19771,
                        "src": "21523:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19749,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "21523:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19752,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19771,
                        "src": "21532:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19751,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "21532:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19754,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19771,
                        "src": "21550:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19753,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "21550:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19756,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19771,
                        "src": "21559:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19755,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "21559:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21522:54:101"
                  },
                  "returnParameters": {
                    "id": 19758,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "21591:0:101"
                  },
                  "scope": 25062,
                  "src": "21510:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19793,
                    "nodeType": "Block",
                    "src": "21762:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c737472696e672c626f6f6c2c626f6f6c29",
                                  "id": 19785,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "21806:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_51bc2bc161debf765eefa84d88e06440adeb87045d559377a9edb97406168b2a",
                                    "typeString": "literal_string \"log(uint,string,bool,bool)\""
                                  },
                                  "value": "log(uint,string,bool,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19786,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19773,
                                  "src": "21836:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19787,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19775,
                                  "src": "21840:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19788,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19777,
                                  "src": "21844:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19789,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19779,
                                  "src": "21848:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_51bc2bc161debf765eefa84d88e06440adeb87045d559377a9edb97406168b2a",
                                    "typeString": "literal_string \"log(uint,string,bool,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19783,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "21782:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19784,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "21782:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19790,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "21782:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19782,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "21766:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19791,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21766:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19792,
                        "nodeType": "ExpressionStatement",
                        "src": "21766:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19794,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19780,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19773,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19794,
                        "src": "21703:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19772,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "21703:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19775,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19794,
                        "src": "21712:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19774,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "21712:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19777,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19794,
                        "src": "21730:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19776,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "21730:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19779,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19794,
                        "src": "21739:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19778,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "21739:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21702:45:101"
                  },
                  "returnParameters": {
                    "id": 19781,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "21762:0:101"
                  },
                  "scope": 25062,
                  "src": "21690:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19816,
                    "nodeType": "Block",
                    "src": "21934:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c737472696e672c626f6f6c2c6164647265737329",
                                  "id": 19808,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "21978:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_796f28a06ededa438107c0866560412d4d4337e29da4c7300f50c49a73c18829",
                                    "typeString": "literal_string \"log(uint,string,bool,address)\""
                                  },
                                  "value": "log(uint,string,bool,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19809,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19796,
                                  "src": "22011:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19810,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19798,
                                  "src": "22015:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19811,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19800,
                                  "src": "22019:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19812,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19802,
                                  "src": "22023:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_796f28a06ededa438107c0866560412d4d4337e29da4c7300f50c49a73c18829",
                                    "typeString": "literal_string \"log(uint,string,bool,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19806,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "21954:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19807,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "21954:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19813,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "21954:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19805,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "21938:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19814,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "21938:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19815,
                        "nodeType": "ExpressionStatement",
                        "src": "21938:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19817,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19803,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19796,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19817,
                        "src": "21872:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19795,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "21872:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19798,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19817,
                        "src": "21881:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19797,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "21881:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19800,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19817,
                        "src": "21899:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19799,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "21899:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19802,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19817,
                        "src": "21908:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19801,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "21908:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "21871:48:101"
                  },
                  "returnParameters": {
                    "id": 19804,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "21934:0:101"
                  },
                  "scope": 25062,
                  "src": "21859:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19839,
                    "nodeType": "Block",
                    "src": "22109:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c737472696e672c616464726573732c75696e7429",
                                  "id": 19831,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "22153:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_98e7f3f3a2c39a91982b0a3ae7f29043579abd563fc10531c052f92c3317af43",
                                    "typeString": "literal_string \"log(uint,string,address,uint)\""
                                  },
                                  "value": "log(uint,string,address,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19832,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19819,
                                  "src": "22186:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19833,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19821,
                                  "src": "22190:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19834,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19823,
                                  "src": "22194:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19835,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19825,
                                  "src": "22198:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_98e7f3f3a2c39a91982b0a3ae7f29043579abd563fc10531c052f92c3317af43",
                                    "typeString": "literal_string \"log(uint,string,address,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19829,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "22129:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19830,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "22129:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19836,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "22129:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19828,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "22113:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19837,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22113:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19838,
                        "nodeType": "ExpressionStatement",
                        "src": "22113:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19840,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19826,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19819,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19840,
                        "src": "22047:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19818,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "22047:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19821,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19840,
                        "src": "22056:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19820,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "22056:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19823,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19840,
                        "src": "22074:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19822,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22074:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19825,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19840,
                        "src": "22086:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19824,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "22086:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22046:48:101"
                  },
                  "returnParameters": {
                    "id": 19827,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "22109:0:101"
                  },
                  "scope": 25062,
                  "src": "22034:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19862,
                    "nodeType": "Block",
                    "src": "22293:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c737472696e672c616464726573732c737472696e6729",
                                  "id": 19854,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "22337:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_f898577fdc87bf80b54b2b838f8b58bf5a74554c7beeb61b98f3c2b7d59f31e2",
                                    "typeString": "literal_string \"log(uint,string,address,string)\""
                                  },
                                  "value": "log(uint,string,address,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19855,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19842,
                                  "src": "22372:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19856,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19844,
                                  "src": "22376:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19857,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19846,
                                  "src": "22380:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19858,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19848,
                                  "src": "22384:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_f898577fdc87bf80b54b2b838f8b58bf5a74554c7beeb61b98f3c2b7d59f31e2",
                                    "typeString": "literal_string \"log(uint,string,address,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19852,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "22313:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19853,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "22313:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19859,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "22313:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19851,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "22297:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19860,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22297:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19861,
                        "nodeType": "ExpressionStatement",
                        "src": "22297:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19863,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19849,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19842,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19863,
                        "src": "22222:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19841,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "22222:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19844,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19863,
                        "src": "22231:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19843,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "22231:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19846,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19863,
                        "src": "22249:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19845,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22249:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19848,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19863,
                        "src": "22261:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19847,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "22261:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22221:57:101"
                  },
                  "returnParameters": {
                    "id": 19850,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "22293:0:101"
                  },
                  "scope": 25062,
                  "src": "22209:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19885,
                    "nodeType": "Block",
                    "src": "22470:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c737472696e672c616464726573732c626f6f6c29",
                                  "id": 19877,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "22514:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_f93fff378483bab1a84a8ae346090ff91e793863821a5430c45153390c3262e1",
                                    "typeString": "literal_string \"log(uint,string,address,bool)\""
                                  },
                                  "value": "log(uint,string,address,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19878,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19865,
                                  "src": "22547:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19879,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19867,
                                  "src": "22551:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19880,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19869,
                                  "src": "22555:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19881,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19871,
                                  "src": "22559:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_f93fff378483bab1a84a8ae346090ff91e793863821a5430c45153390c3262e1",
                                    "typeString": "literal_string \"log(uint,string,address,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19875,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "22490:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19876,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "22490:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19882,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "22490:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19874,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "22474:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19883,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22474:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19884,
                        "nodeType": "ExpressionStatement",
                        "src": "22474:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19886,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19872,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19865,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19886,
                        "src": "22408:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19864,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "22408:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19867,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19886,
                        "src": "22417:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19866,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "22417:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19869,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19886,
                        "src": "22435:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19868,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22435:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19871,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19886,
                        "src": "22447:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19870,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "22447:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22407:48:101"
                  },
                  "returnParameters": {
                    "id": 19873,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "22470:0:101"
                  },
                  "scope": 25062,
                  "src": "22395:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19908,
                    "nodeType": "Block",
                    "src": "22648:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c737472696e672c616464726573732c6164647265737329",
                                  "id": 19900,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "22692:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_7fa5458bb859a8b444c46f9915b7879afe7e200298580a00c5813ecf5c0a77cb",
                                    "typeString": "literal_string \"log(uint,string,address,address)\""
                                  },
                                  "value": "log(uint,string,address,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19901,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19888,
                                  "src": "22728:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19902,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19890,
                                  "src": "22732:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19903,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19892,
                                  "src": "22736:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19904,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19894,
                                  "src": "22740:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_7fa5458bb859a8b444c46f9915b7879afe7e200298580a00c5813ecf5c0a77cb",
                                    "typeString": "literal_string \"log(uint,string,address,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19898,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "22668:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19899,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "22668:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19905,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "22668:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19897,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "22652:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19906,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22652:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19907,
                        "nodeType": "ExpressionStatement",
                        "src": "22652:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19909,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19895,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19888,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19909,
                        "src": "22583:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19887,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "22583:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19890,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19909,
                        "src": "22592:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19889,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "22592:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19892,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19909,
                        "src": "22610:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19891,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22610:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19894,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19909,
                        "src": "22622:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19893,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "22622:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22582:51:101"
                  },
                  "returnParameters": {
                    "id": 19896,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "22648:0:101"
                  },
                  "scope": 25062,
                  "src": "22570:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19931,
                    "nodeType": "Block",
                    "src": "22814:92:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c626f6f6c2c75696e742c75696e7429",
                                  "id": 19923,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "22858:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_56828da42a6ecdc94480e6d223af96b676cdc4ca9a00b1d88a7646ef1e12541e",
                                    "typeString": "literal_string \"log(uint,bool,uint,uint)\""
                                  },
                                  "value": "log(uint,bool,uint,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19924,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19911,
                                  "src": "22886:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19925,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19913,
                                  "src": "22890:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19926,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19915,
                                  "src": "22894:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19927,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19917,
                                  "src": "22898:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_56828da42a6ecdc94480e6d223af96b676cdc4ca9a00b1d88a7646ef1e12541e",
                                    "typeString": "literal_string \"log(uint,bool,uint,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19921,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "22834:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19922,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "22834:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19928,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "22834:67:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19920,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "22818:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19929,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22818:84:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19930,
                        "nodeType": "ExpressionStatement",
                        "src": "22818:84:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19932,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19918,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19911,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19932,
                        "src": "22764:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19910,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "22764:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19913,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19932,
                        "src": "22773:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19912,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "22773:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19915,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19932,
                        "src": "22782:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19914,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "22782:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19917,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19932,
                        "src": "22791:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19916,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "22791:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22763:36:101"
                  },
                  "returnParameters": {
                    "id": 19919,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "22814:0:101"
                  },
                  "scope": 25062,
                  "src": "22751:155:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19954,
                    "nodeType": "Block",
                    "src": "22981:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c626f6f6c2c75696e742c737472696e6729",
                                  "id": 19946,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "23025:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_e8ddbc56b4712607102717eb35a3ee6aa0309358d07a4257a282d4a44ceb2f63",
                                    "typeString": "literal_string \"log(uint,bool,uint,string)\""
                                  },
                                  "value": "log(uint,bool,uint,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19947,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19934,
                                  "src": "23055:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19948,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19936,
                                  "src": "23059:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19949,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19938,
                                  "src": "23063:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19950,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19940,
                                  "src": "23067:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_e8ddbc56b4712607102717eb35a3ee6aa0309358d07a4257a282d4a44ceb2f63",
                                    "typeString": "literal_string \"log(uint,bool,uint,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19944,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "23001:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19945,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "23001:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19951,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "23001:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19943,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "22985:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19952,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "22985:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19953,
                        "nodeType": "ExpressionStatement",
                        "src": "22985:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19955,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19941,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19934,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19955,
                        "src": "22922:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19933,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "22922:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19936,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19955,
                        "src": "22931:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19935,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "22931:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19938,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19955,
                        "src": "22940:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19937,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "22940:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19940,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19955,
                        "src": "22949:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 19939,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "22949:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "22921:45:101"
                  },
                  "returnParameters": {
                    "id": 19942,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "22981:0:101"
                  },
                  "scope": 25062,
                  "src": "22909:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 19977,
                    "nodeType": "Block",
                    "src": "23141:92:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c626f6f6c2c75696e742c626f6f6c29",
                                  "id": 19969,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "23185:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_d2abc4fdef6f35f3785755f2ca3a26416b52c0c4c5ad8b27342fc84a56532f2f",
                                    "typeString": "literal_string \"log(uint,bool,uint,bool)\""
                                  },
                                  "value": "log(uint,bool,uint,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19970,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19957,
                                  "src": "23213:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19971,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19959,
                                  "src": "23217:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19972,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19961,
                                  "src": "23221:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19973,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19963,
                                  "src": "23225:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_d2abc4fdef6f35f3785755f2ca3a26416b52c0c4c5ad8b27342fc84a56532f2f",
                                    "typeString": "literal_string \"log(uint,bool,uint,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19967,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "23161:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19968,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "23161:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19974,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "23161:67:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19966,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "23145:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19975,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "23145:84:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19976,
                        "nodeType": "ExpressionStatement",
                        "src": "23145:84:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 19978,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19964,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19957,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19978,
                        "src": "23091:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19956,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "23091:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19959,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19978,
                        "src": "23100:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19958,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "23100:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19961,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19978,
                        "src": "23109:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19960,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "23109:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19963,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 19978,
                        "src": "23118:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19962,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "23118:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23090:36:101"
                  },
                  "returnParameters": {
                    "id": 19965,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "23141:0:101"
                  },
                  "scope": 25062,
                  "src": "23078:155:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20000,
                    "nodeType": "Block",
                    "src": "23302:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c626f6f6c2c75696e742c6164647265737329",
                                  "id": 19992,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "23346:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_4f40058ea8927b23c60661eeb28f54d3ce10f5f6cdd8e3ce445d34409ceb50a3",
                                    "typeString": "literal_string \"log(uint,bool,uint,address)\""
                                  },
                                  "value": "log(uint,bool,uint,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19993,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19980,
                                  "src": "23377:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19994,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19982,
                                  "src": "23381:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19995,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19984,
                                  "src": "23385:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 19996,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 19986,
                                  "src": "23389:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_4f40058ea8927b23c60661eeb28f54d3ce10f5f6cdd8e3ce445d34409ceb50a3",
                                    "typeString": "literal_string \"log(uint,bool,uint,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 19990,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "23322:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 19991,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "23322:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 19997,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "23322:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 19989,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "23306:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 19998,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "23306:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 19999,
                        "nodeType": "ExpressionStatement",
                        "src": "23306:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20001,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 19987,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 19980,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20001,
                        "src": "23249:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19979,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "23249:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19982,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20001,
                        "src": "23258:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 19981,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "23258:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19984,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20001,
                        "src": "23267:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 19983,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "23267:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 19986,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20001,
                        "src": "23276:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 19985,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "23276:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23248:39:101"
                  },
                  "returnParameters": {
                    "id": 19988,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "23302:0:101"
                  },
                  "scope": 25062,
                  "src": "23236:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20023,
                    "nodeType": "Block",
                    "src": "23472:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c626f6f6c2c737472696e672c75696e7429",
                                  "id": 20015,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "23516:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_915fdb28841654f5e04882ad0aa4f5de28bd90db1a700dae8b1eb5e67e36a012",
                                    "typeString": "literal_string \"log(uint,bool,string,uint)\""
                                  },
                                  "value": "log(uint,bool,string,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20016,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20003,
                                  "src": "23546:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20017,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20005,
                                  "src": "23550:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20018,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20007,
                                  "src": "23554:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20019,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20009,
                                  "src": "23558:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_915fdb28841654f5e04882ad0aa4f5de28bd90db1a700dae8b1eb5e67e36a012",
                                    "typeString": "literal_string \"log(uint,bool,string,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20013,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "23492:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20014,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "23492:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20020,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "23492:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20012,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "23476:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20021,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "23476:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20022,
                        "nodeType": "ExpressionStatement",
                        "src": "23476:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20024,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20010,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20003,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20024,
                        "src": "23413:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20002,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "23413:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20005,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20024,
                        "src": "23422:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20004,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "23422:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20007,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20024,
                        "src": "23431:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20006,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "23431:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20009,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20024,
                        "src": "23449:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20008,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "23449:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23412:45:101"
                  },
                  "returnParameters": {
                    "id": 20011,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "23472:0:101"
                  },
                  "scope": 25062,
                  "src": "23400:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20046,
                    "nodeType": "Block",
                    "src": "23650:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c626f6f6c2c737472696e672c737472696e6729",
                                  "id": 20038,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "23694:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_a433fcfd538cd0e077747fbb2c5a6453c1804c6ad4af653273e0d14ab4a0566a",
                                    "typeString": "literal_string \"log(uint,bool,string,string)\""
                                  },
                                  "value": "log(uint,bool,string,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20039,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20026,
                                  "src": "23726:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20040,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20028,
                                  "src": "23730:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20041,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20030,
                                  "src": "23734:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20042,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20032,
                                  "src": "23738:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_a433fcfd538cd0e077747fbb2c5a6453c1804c6ad4af653273e0d14ab4a0566a",
                                    "typeString": "literal_string \"log(uint,bool,string,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20036,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "23670:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20037,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "23670:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20043,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "23670:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20035,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "23654:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20044,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "23654:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20045,
                        "nodeType": "ExpressionStatement",
                        "src": "23654:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20047,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20033,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20026,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20047,
                        "src": "23582:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20025,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "23582:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20028,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20047,
                        "src": "23591:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20027,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "23591:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20030,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20047,
                        "src": "23600:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20029,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "23600:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20032,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20047,
                        "src": "23618:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20031,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "23618:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23581:54:101"
                  },
                  "returnParameters": {
                    "id": 20034,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "23650:0:101"
                  },
                  "scope": 25062,
                  "src": "23569:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20069,
                    "nodeType": "Block",
                    "src": "23821:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c626f6f6c2c737472696e672c626f6f6c29",
                                  "id": 20061,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "23865:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_346eb8c74221bcb2c0a69b8dde628b7e6175c4f090782c8f07996b251212e22d",
                                    "typeString": "literal_string \"log(uint,bool,string,bool)\""
                                  },
                                  "value": "log(uint,bool,string,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20062,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20049,
                                  "src": "23895:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20063,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20051,
                                  "src": "23899:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20064,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20053,
                                  "src": "23903:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20065,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20055,
                                  "src": "23907:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_346eb8c74221bcb2c0a69b8dde628b7e6175c4f090782c8f07996b251212e22d",
                                    "typeString": "literal_string \"log(uint,bool,string,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20059,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "23841:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20060,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "23841:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20066,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "23841:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20058,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "23825:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20067,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "23825:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20068,
                        "nodeType": "ExpressionStatement",
                        "src": "23825:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20070,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20056,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20049,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20070,
                        "src": "23762:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20048,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "23762:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20051,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20070,
                        "src": "23771:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20050,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "23771:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20053,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20070,
                        "src": "23780:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20052,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "23780:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20055,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20070,
                        "src": "23798:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20054,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "23798:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23761:45:101"
                  },
                  "returnParameters": {
                    "id": 20057,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "23821:0:101"
                  },
                  "scope": 25062,
                  "src": "23749:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20092,
                    "nodeType": "Block",
                    "src": "23993:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c626f6f6c2c737472696e672c6164647265737329",
                                  "id": 20084,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "24037:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_496e2bb45f5cdd3680c3e807c53955b9de163e898851c7844433c0a9c91dcd9d",
                                    "typeString": "literal_string \"log(uint,bool,string,address)\""
                                  },
                                  "value": "log(uint,bool,string,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20085,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20072,
                                  "src": "24070:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20086,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20074,
                                  "src": "24074:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20087,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20076,
                                  "src": "24078:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20088,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20078,
                                  "src": "24082:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_496e2bb45f5cdd3680c3e807c53955b9de163e898851c7844433c0a9c91dcd9d",
                                    "typeString": "literal_string \"log(uint,bool,string,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20082,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "24013:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20083,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "24013:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20089,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "24013:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20081,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "23997:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20090,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "23997:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20091,
                        "nodeType": "ExpressionStatement",
                        "src": "23997:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20093,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20079,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20072,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20093,
                        "src": "23931:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20071,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "23931:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20074,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20093,
                        "src": "23940:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20073,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "23940:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20076,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20093,
                        "src": "23949:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20075,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "23949:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20078,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20093,
                        "src": "23967:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20077,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "23967:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "23930:48:101"
                  },
                  "returnParameters": {
                    "id": 20080,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "23993:0:101"
                  },
                  "scope": 25062,
                  "src": "23918:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20115,
                    "nodeType": "Block",
                    "src": "24156:92:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c626f6f6c2c626f6f6c2c75696e7429",
                                  "id": 20107,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "24200:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_bd25ad5987e2f3e90d5ff2c9e0dad802782e9040e45e823722ccf598278cf7ed",
                                    "typeString": "literal_string \"log(uint,bool,bool,uint)\""
                                  },
                                  "value": "log(uint,bool,bool,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20108,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20095,
                                  "src": "24228:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20109,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20097,
                                  "src": "24232:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20110,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20099,
                                  "src": "24236:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20111,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20101,
                                  "src": "24240:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_bd25ad5987e2f3e90d5ff2c9e0dad802782e9040e45e823722ccf598278cf7ed",
                                    "typeString": "literal_string \"log(uint,bool,bool,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20105,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "24176:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20106,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "24176:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20112,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "24176:67:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20104,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "24160:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20113,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "24160:84:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20114,
                        "nodeType": "ExpressionStatement",
                        "src": "24160:84:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20116,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20102,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20095,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20116,
                        "src": "24106:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20094,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "24106:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20097,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20116,
                        "src": "24115:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20096,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "24115:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20099,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20116,
                        "src": "24124:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20098,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "24124:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20101,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20116,
                        "src": "24133:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20100,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "24133:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24105:36:101"
                  },
                  "returnParameters": {
                    "id": 20103,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "24156:0:101"
                  },
                  "scope": 25062,
                  "src": "24093:155:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20138,
                    "nodeType": "Block",
                    "src": "24323:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c626f6f6c2c626f6f6c2c737472696e6729",
                                  "id": 20130,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "24367:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_318ae59b506d4efe5cd02b34be9f24009f0134ab1136defc4789a09e425a8861",
                                    "typeString": "literal_string \"log(uint,bool,bool,string)\""
                                  },
                                  "value": "log(uint,bool,bool,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20131,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20118,
                                  "src": "24397:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20132,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20120,
                                  "src": "24401:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20133,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20122,
                                  "src": "24405:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20134,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20124,
                                  "src": "24409:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_318ae59b506d4efe5cd02b34be9f24009f0134ab1136defc4789a09e425a8861",
                                    "typeString": "literal_string \"log(uint,bool,bool,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20128,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "24343:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20129,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "24343:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20135,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "24343:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20127,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "24327:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20136,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "24327:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20137,
                        "nodeType": "ExpressionStatement",
                        "src": "24327:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20139,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20125,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20118,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20139,
                        "src": "24264:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20117,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "24264:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20120,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20139,
                        "src": "24273:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20119,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "24273:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20122,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20139,
                        "src": "24282:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20121,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "24282:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20124,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20139,
                        "src": "24291:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20123,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "24291:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24263:45:101"
                  },
                  "returnParameters": {
                    "id": 20126,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "24323:0:101"
                  },
                  "scope": 25062,
                  "src": "24251:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20161,
                    "nodeType": "Block",
                    "src": "24483:92:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c626f6f6c2c626f6f6c2c626f6f6c29",
                                  "id": 20153,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "24527:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_4e6c5315e6998332ba87ae2545bc72447c94349a51e999446a98bfab04167b32",
                                    "typeString": "literal_string \"log(uint,bool,bool,bool)\""
                                  },
                                  "value": "log(uint,bool,bool,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20154,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20141,
                                  "src": "24555:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20155,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20143,
                                  "src": "24559:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20156,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20145,
                                  "src": "24563:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20157,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20147,
                                  "src": "24567:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_4e6c5315e6998332ba87ae2545bc72447c94349a51e999446a98bfab04167b32",
                                    "typeString": "literal_string \"log(uint,bool,bool,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20151,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "24503:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20152,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "24503:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20158,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "24503:67:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20150,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "24487:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20159,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "24487:84:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20160,
                        "nodeType": "ExpressionStatement",
                        "src": "24487:84:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20162,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20148,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20141,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20162,
                        "src": "24433:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20140,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "24433:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20143,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20162,
                        "src": "24442:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20142,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "24442:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20145,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20162,
                        "src": "24451:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20144,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "24451:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20147,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20162,
                        "src": "24460:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20146,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "24460:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24432:36:101"
                  },
                  "returnParameters": {
                    "id": 20149,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "24483:0:101"
                  },
                  "scope": 25062,
                  "src": "24420:155:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20184,
                    "nodeType": "Block",
                    "src": "24644:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c626f6f6c2c626f6f6c2c6164647265737329",
                                  "id": 20176,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "24688:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_5306225d3f6a0c340e12a634d8571b24a659d0fdcb96dd45e3bd062feb68355b",
                                    "typeString": "literal_string \"log(uint,bool,bool,address)\""
                                  },
                                  "value": "log(uint,bool,bool,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20177,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20164,
                                  "src": "24719:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20178,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20166,
                                  "src": "24723:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20179,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20168,
                                  "src": "24727:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20180,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20170,
                                  "src": "24731:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_5306225d3f6a0c340e12a634d8571b24a659d0fdcb96dd45e3bd062feb68355b",
                                    "typeString": "literal_string \"log(uint,bool,bool,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20174,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "24664:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20175,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "24664:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20181,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "24664:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20173,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "24648:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20182,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "24648:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20183,
                        "nodeType": "ExpressionStatement",
                        "src": "24648:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20185,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20171,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20164,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20185,
                        "src": "24591:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20163,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "24591:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20166,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20185,
                        "src": "24600:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20165,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "24600:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20168,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20185,
                        "src": "24609:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20167,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "24609:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20170,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20185,
                        "src": "24618:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20169,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "24618:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24590:39:101"
                  },
                  "returnParameters": {
                    "id": 20172,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "24644:0:101"
                  },
                  "scope": 25062,
                  "src": "24578:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20207,
                    "nodeType": "Block",
                    "src": "24808:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c626f6f6c2c616464726573732c75696e7429",
                                  "id": 20199,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "24852:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_41b5ef3bc57cb6072d9bbab757f04e68fb78a6a8b29741a7b963761abce32fb1",
                                    "typeString": "literal_string \"log(uint,bool,address,uint)\""
                                  },
                                  "value": "log(uint,bool,address,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20200,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20187,
                                  "src": "24883:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20201,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20189,
                                  "src": "24887:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20202,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20191,
                                  "src": "24891:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20203,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20193,
                                  "src": "24895:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_41b5ef3bc57cb6072d9bbab757f04e68fb78a6a8b29741a7b963761abce32fb1",
                                    "typeString": "literal_string \"log(uint,bool,address,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20197,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "24828:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20198,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "24828:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20204,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "24828:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20196,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "24812:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20205,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "24812:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20206,
                        "nodeType": "ExpressionStatement",
                        "src": "24812:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20208,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20194,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20187,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20208,
                        "src": "24755:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20186,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "24755:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20189,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20208,
                        "src": "24764:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20188,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "24764:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20191,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20208,
                        "src": "24773:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20190,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "24773:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20193,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20208,
                        "src": "24785:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20192,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "24785:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24754:39:101"
                  },
                  "returnParameters": {
                    "id": 20195,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "24808:0:101"
                  },
                  "scope": 25062,
                  "src": "24742:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20230,
                    "nodeType": "Block",
                    "src": "24981:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c626f6f6c2c616464726573732c737472696e6729",
                                  "id": 20222,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "25025:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_a230761e3811ae33e11d91e6667cf79e7e0ce8023ec276bdd69859f68587933c",
                                    "typeString": "literal_string \"log(uint,bool,address,string)\""
                                  },
                                  "value": "log(uint,bool,address,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20223,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20210,
                                  "src": "25058:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20224,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20212,
                                  "src": "25062:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20225,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20214,
                                  "src": "25066:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20226,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20216,
                                  "src": "25070:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_a230761e3811ae33e11d91e6667cf79e7e0ce8023ec276bdd69859f68587933c",
                                    "typeString": "literal_string \"log(uint,bool,address,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20220,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "25001:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20221,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "25001:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20227,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "25001:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20219,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "24985:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20228,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "24985:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20229,
                        "nodeType": "ExpressionStatement",
                        "src": "24985:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20231,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20217,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20210,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20231,
                        "src": "24919:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20209,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "24919:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20212,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20231,
                        "src": "24928:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20211,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "24928:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20214,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20231,
                        "src": "24937:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20213,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "24937:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20216,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20231,
                        "src": "24949:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20215,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "24949:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "24918:48:101"
                  },
                  "returnParameters": {
                    "id": 20218,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "24981:0:101"
                  },
                  "scope": 25062,
                  "src": "24906:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20253,
                    "nodeType": "Block",
                    "src": "25147:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c626f6f6c2c616464726573732c626f6f6c29",
                                  "id": 20245,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "25191:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_91fb124272873b32f25c28f6935451e3d46ffd78ac8ebaaa0e096a7942db5445",
                                    "typeString": "literal_string \"log(uint,bool,address,bool)\""
                                  },
                                  "value": "log(uint,bool,address,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20246,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20233,
                                  "src": "25222:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20247,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20235,
                                  "src": "25226:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20248,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20237,
                                  "src": "25230:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20249,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20239,
                                  "src": "25234:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_91fb124272873b32f25c28f6935451e3d46ffd78ac8ebaaa0e096a7942db5445",
                                    "typeString": "literal_string \"log(uint,bool,address,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20243,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "25167:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20244,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "25167:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20250,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "25167:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20242,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "25151:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20251,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "25151:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20252,
                        "nodeType": "ExpressionStatement",
                        "src": "25151:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20254,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20240,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20233,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20254,
                        "src": "25094:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20232,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "25094:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20235,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20254,
                        "src": "25103:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20234,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "25103:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20237,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20254,
                        "src": "25112:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20236,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "25112:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20239,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20254,
                        "src": "25124:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20238,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "25124:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "25093:39:101"
                  },
                  "returnParameters": {
                    "id": 20241,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "25147:0:101"
                  },
                  "scope": 25062,
                  "src": "25081:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20276,
                    "nodeType": "Block",
                    "src": "25314:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c626f6f6c2c616464726573732c6164647265737329",
                                  "id": 20268,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "25358:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_86edc10cd85187c3b3f180e68e570c794e768808cdffe5158045d6f841ae33f2",
                                    "typeString": "literal_string \"log(uint,bool,address,address)\""
                                  },
                                  "value": "log(uint,bool,address,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20269,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20256,
                                  "src": "25392:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20270,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20258,
                                  "src": "25396:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20271,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20260,
                                  "src": "25400:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20272,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20262,
                                  "src": "25404:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_86edc10cd85187c3b3f180e68e570c794e768808cdffe5158045d6f841ae33f2",
                                    "typeString": "literal_string \"log(uint,bool,address,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20266,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "25334:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20267,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "25334:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20273,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "25334:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20265,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "25318:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20274,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "25318:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20275,
                        "nodeType": "ExpressionStatement",
                        "src": "25318:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20277,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20263,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20256,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20277,
                        "src": "25258:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20255,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "25258:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20258,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20277,
                        "src": "25267:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20257,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "25267:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20260,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20277,
                        "src": "25276:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20259,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "25276:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20262,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20277,
                        "src": "25288:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20261,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "25288:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "25257:42:101"
                  },
                  "returnParameters": {
                    "id": 20264,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "25314:0:101"
                  },
                  "scope": 25062,
                  "src": "25245:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20299,
                    "nodeType": "Block",
                    "src": "25481:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c616464726573732c75696e742c75696e7429",
                                  "id": 20291,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "25525:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_ca9a3eb4a61979ee5cc1814fa8df2504ab7831148afaa3d4c17622578eab7412",
                                    "typeString": "literal_string \"log(uint,address,uint,uint)\""
                                  },
                                  "value": "log(uint,address,uint,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20292,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20279,
                                  "src": "25556:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20293,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20281,
                                  "src": "25560:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20294,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20283,
                                  "src": "25564:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20295,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20285,
                                  "src": "25568:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_ca9a3eb4a61979ee5cc1814fa8df2504ab7831148afaa3d4c17622578eab7412",
                                    "typeString": "literal_string \"log(uint,address,uint,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20289,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "25501:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20290,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "25501:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20296,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "25501:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20288,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "25485:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20297,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "25485:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20298,
                        "nodeType": "ExpressionStatement",
                        "src": "25485:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20300,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20286,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20279,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20300,
                        "src": "25428:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20278,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "25428:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20281,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20300,
                        "src": "25437:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20280,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "25437:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20283,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20300,
                        "src": "25449:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20282,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "25449:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20285,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20300,
                        "src": "25458:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20284,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "25458:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "25427:39:101"
                  },
                  "returnParameters": {
                    "id": 20287,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "25481:0:101"
                  },
                  "scope": 25062,
                  "src": "25415:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20322,
                    "nodeType": "Block",
                    "src": "25654:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c616464726573732c75696e742c737472696e6729",
                                  "id": 20314,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "25698:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_3ed3bd282d1a27244fa4d3668aff783448c1a1864ff920057fa9f1c8144bb10b",
                                    "typeString": "literal_string \"log(uint,address,uint,string)\""
                                  },
                                  "value": "log(uint,address,uint,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20315,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20302,
                                  "src": "25731:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20316,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20304,
                                  "src": "25735:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20317,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20306,
                                  "src": "25739:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20318,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20308,
                                  "src": "25743:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_3ed3bd282d1a27244fa4d3668aff783448c1a1864ff920057fa9f1c8144bb10b",
                                    "typeString": "literal_string \"log(uint,address,uint,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20312,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "25674:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20313,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "25674:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20319,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "25674:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20311,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "25658:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20320,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "25658:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20321,
                        "nodeType": "ExpressionStatement",
                        "src": "25658:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20323,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20309,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20302,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20323,
                        "src": "25592:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20301,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "25592:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20304,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20323,
                        "src": "25601:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20303,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "25601:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20306,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20323,
                        "src": "25613:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20305,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "25613:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20308,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20323,
                        "src": "25622:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20307,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "25622:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "25591:48:101"
                  },
                  "returnParameters": {
                    "id": 20310,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "25654:0:101"
                  },
                  "scope": 25062,
                  "src": "25579:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20345,
                    "nodeType": "Block",
                    "src": "25820:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c616464726573732c75696e742c626f6f6c29",
                                  "id": 20337,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "25864:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_19f67369d42bc0582d07ae744348ad46b79a6c16f354e3d3fb3c6bff2ecfa9f8",
                                    "typeString": "literal_string \"log(uint,address,uint,bool)\""
                                  },
                                  "value": "log(uint,address,uint,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20338,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20325,
                                  "src": "25895:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20339,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20327,
                                  "src": "25899:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20340,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20329,
                                  "src": "25903:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20341,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20331,
                                  "src": "25907:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_19f67369d42bc0582d07ae744348ad46b79a6c16f354e3d3fb3c6bff2ecfa9f8",
                                    "typeString": "literal_string \"log(uint,address,uint,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20335,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "25840:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20336,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "25840:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20342,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "25840:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20334,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "25824:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20343,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "25824:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20344,
                        "nodeType": "ExpressionStatement",
                        "src": "25824:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20346,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20332,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20325,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20346,
                        "src": "25767:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20324,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "25767:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20327,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20346,
                        "src": "25776:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20326,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "25776:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20329,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20346,
                        "src": "25788:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20328,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "25788:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20331,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20346,
                        "src": "25797:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20330,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "25797:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "25766:39:101"
                  },
                  "returnParameters": {
                    "id": 20333,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "25820:0:101"
                  },
                  "scope": 25062,
                  "src": "25754:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20368,
                    "nodeType": "Block",
                    "src": "25987:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c616464726573732c75696e742c6164647265737329",
                                  "id": 20360,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "26031:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_fdb2ecd415c75df8f66285a054607fa1335126fb1d8930dfc21744a3de7298e3",
                                    "typeString": "literal_string \"log(uint,address,uint,address)\""
                                  },
                                  "value": "log(uint,address,uint,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20361,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20348,
                                  "src": "26065:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20362,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20350,
                                  "src": "26069:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20363,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20352,
                                  "src": "26073:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20364,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20354,
                                  "src": "26077:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_fdb2ecd415c75df8f66285a054607fa1335126fb1d8930dfc21744a3de7298e3",
                                    "typeString": "literal_string \"log(uint,address,uint,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20358,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "26007:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20359,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "26007:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20365,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "26007:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20357,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "25991:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20366,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "25991:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20367,
                        "nodeType": "ExpressionStatement",
                        "src": "25991:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20369,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20355,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20348,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20369,
                        "src": "25931:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20347,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "25931:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20350,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20369,
                        "src": "25940:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20349,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "25940:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20352,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20369,
                        "src": "25952:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20351,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "25952:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20354,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20369,
                        "src": "25961:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20353,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "25961:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "25930:42:101"
                  },
                  "returnParameters": {
                    "id": 20356,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "25987:0:101"
                  },
                  "scope": 25062,
                  "src": "25918:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20391,
                    "nodeType": "Block",
                    "src": "26163:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c616464726573732c737472696e672c75696e7429",
                                  "id": 20383,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "26207:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_a0c414e8ba2ea65b865dd0bf68b2357e81261b47f237c68a4a8a63051bbef2eb",
                                    "typeString": "literal_string \"log(uint,address,string,uint)\""
                                  },
                                  "value": "log(uint,address,string,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20384,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20371,
                                  "src": "26240:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20385,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20373,
                                  "src": "26244:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20386,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20375,
                                  "src": "26248:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20387,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20377,
                                  "src": "26252:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_a0c414e8ba2ea65b865dd0bf68b2357e81261b47f237c68a4a8a63051bbef2eb",
                                    "typeString": "literal_string \"log(uint,address,string,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20381,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "26183:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20382,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "26183:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20388,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "26183:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20380,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "26167:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20389,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "26167:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20390,
                        "nodeType": "ExpressionStatement",
                        "src": "26167:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20392,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20378,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20371,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20392,
                        "src": "26101:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20370,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "26101:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20373,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20392,
                        "src": "26110:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20372,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "26110:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20375,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20392,
                        "src": "26122:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20374,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "26122:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20377,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20392,
                        "src": "26140:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20376,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "26140:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "26100:48:101"
                  },
                  "returnParameters": {
                    "id": 20379,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "26163:0:101"
                  },
                  "scope": 25062,
                  "src": "26088:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20414,
                    "nodeType": "Block",
                    "src": "26347:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c616464726573732c737472696e672c737472696e6729",
                                  "id": 20406,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "26391:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_8d778624e1d83269ce0415864bb54677b540f778c6b8503cf9035bc7517326f1",
                                    "typeString": "literal_string \"log(uint,address,string,string)\""
                                  },
                                  "value": "log(uint,address,string,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20407,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20394,
                                  "src": "26426:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20408,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20396,
                                  "src": "26430:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20409,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20398,
                                  "src": "26434:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20410,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20400,
                                  "src": "26438:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_8d778624e1d83269ce0415864bb54677b540f778c6b8503cf9035bc7517326f1",
                                    "typeString": "literal_string \"log(uint,address,string,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20404,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "26367:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20405,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "26367:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20411,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "26367:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20403,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "26351:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20412,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "26351:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20413,
                        "nodeType": "ExpressionStatement",
                        "src": "26351:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20415,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20401,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20394,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20415,
                        "src": "26276:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20393,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "26276:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20396,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20415,
                        "src": "26285:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20395,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "26285:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20398,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20415,
                        "src": "26297:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20397,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "26297:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20400,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20415,
                        "src": "26315:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20399,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "26315:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "26275:57:101"
                  },
                  "returnParameters": {
                    "id": 20402,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "26347:0:101"
                  },
                  "scope": 25062,
                  "src": "26263:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20437,
                    "nodeType": "Block",
                    "src": "26524:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c616464726573732c737472696e672c626f6f6c29",
                                  "id": 20429,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "26568:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_22a479a660b74b7598155f369ed227a5a93527fbdb04ff6f78fbf35fa23aacbf",
                                    "typeString": "literal_string \"log(uint,address,string,bool)\""
                                  },
                                  "value": "log(uint,address,string,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20430,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20417,
                                  "src": "26601:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20431,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20419,
                                  "src": "26605:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20432,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20421,
                                  "src": "26609:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20433,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20423,
                                  "src": "26613:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_22a479a660b74b7598155f369ed227a5a93527fbdb04ff6f78fbf35fa23aacbf",
                                    "typeString": "literal_string \"log(uint,address,string,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20427,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "26544:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20428,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "26544:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20434,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "26544:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20426,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "26528:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20435,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "26528:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20436,
                        "nodeType": "ExpressionStatement",
                        "src": "26528:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20438,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20424,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20417,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20438,
                        "src": "26462:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20416,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "26462:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20419,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20438,
                        "src": "26471:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20418,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "26471:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20421,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20438,
                        "src": "26483:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20420,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "26483:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20423,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20438,
                        "src": "26501:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20422,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "26501:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "26461:48:101"
                  },
                  "returnParameters": {
                    "id": 20425,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "26524:0:101"
                  },
                  "scope": 25062,
                  "src": "26449:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20460,
                    "nodeType": "Block",
                    "src": "26702:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c616464726573732c737472696e672c6164647265737329",
                                  "id": 20452,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "26746:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_cbe58efddc067d74914c3479914810966ae688ac66ca2bbcae69cd9d0395796f",
                                    "typeString": "literal_string \"log(uint,address,string,address)\""
                                  },
                                  "value": "log(uint,address,string,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20453,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20440,
                                  "src": "26782:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20454,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20442,
                                  "src": "26786:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20455,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20444,
                                  "src": "26790:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20456,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20446,
                                  "src": "26794:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_cbe58efddc067d74914c3479914810966ae688ac66ca2bbcae69cd9d0395796f",
                                    "typeString": "literal_string \"log(uint,address,string,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20450,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "26722:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20451,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "26722:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20457,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "26722:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20449,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "26706:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20458,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "26706:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20459,
                        "nodeType": "ExpressionStatement",
                        "src": "26706:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20461,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20447,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20440,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20461,
                        "src": "26637:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20439,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "26637:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20442,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20461,
                        "src": "26646:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20441,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "26646:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20444,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20461,
                        "src": "26658:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20443,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "26658:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20446,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20461,
                        "src": "26676:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20445,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "26676:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "26636:51:101"
                  },
                  "returnParameters": {
                    "id": 20448,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "26702:0:101"
                  },
                  "scope": 25062,
                  "src": "26624:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20483,
                    "nodeType": "Block",
                    "src": "26871:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c616464726573732c626f6f6c2c75696e7429",
                                  "id": 20475,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "26915:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_7b08e8ebd6be8a04c54551194ba5143f1a555d43fe60d53843383a9915eeccb2",
                                    "typeString": "literal_string \"log(uint,address,bool,uint)\""
                                  },
                                  "value": "log(uint,address,bool,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20476,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20463,
                                  "src": "26946:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20477,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20465,
                                  "src": "26950:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20478,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20467,
                                  "src": "26954:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20479,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20469,
                                  "src": "26958:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_7b08e8ebd6be8a04c54551194ba5143f1a555d43fe60d53843383a9915eeccb2",
                                    "typeString": "literal_string \"log(uint,address,bool,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20473,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "26891:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20474,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "26891:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20480,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "26891:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20472,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "26875:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20481,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "26875:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20482,
                        "nodeType": "ExpressionStatement",
                        "src": "26875:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20484,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20470,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20463,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20484,
                        "src": "26818:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20462,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "26818:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20465,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20484,
                        "src": "26827:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20464,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "26827:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20467,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20484,
                        "src": "26839:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20466,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "26839:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20469,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20484,
                        "src": "26848:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20468,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "26848:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "26817:39:101"
                  },
                  "returnParameters": {
                    "id": 20471,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "26871:0:101"
                  },
                  "scope": 25062,
                  "src": "26805:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20506,
                    "nodeType": "Block",
                    "src": "27044:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c616464726573732c626f6f6c2c737472696e6729",
                                  "id": 20498,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "27088:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_63f0e24221aeb6c531ea500a191ac35497bf48695fb29864fe57726a12d605c6",
                                    "typeString": "literal_string \"log(uint,address,bool,string)\""
                                  },
                                  "value": "log(uint,address,bool,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20499,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20486,
                                  "src": "27121:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20500,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20488,
                                  "src": "27125:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20501,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20490,
                                  "src": "27129:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20502,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20492,
                                  "src": "27133:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_63f0e24221aeb6c531ea500a191ac35497bf48695fb29864fe57726a12d605c6",
                                    "typeString": "literal_string \"log(uint,address,bool,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20496,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "27064:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20497,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "27064:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20503,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "27064:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20495,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "27048:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20504,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "27048:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20505,
                        "nodeType": "ExpressionStatement",
                        "src": "27048:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20507,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20493,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20486,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20507,
                        "src": "26982:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20485,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "26982:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20488,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20507,
                        "src": "26991:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20487,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "26991:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20490,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20507,
                        "src": "27003:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20489,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "27003:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20492,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20507,
                        "src": "27012:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20491,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "27012:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "26981:48:101"
                  },
                  "returnParameters": {
                    "id": 20494,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "27044:0:101"
                  },
                  "scope": 25062,
                  "src": "26969:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20529,
                    "nodeType": "Block",
                    "src": "27210:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c616464726573732c626f6f6c2c626f6f6c29",
                                  "id": 20521,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "27254:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_7e27410dc86ab22a92f2a269c9cf538b707bde3ac248f933df1f4d0b76947d32",
                                    "typeString": "literal_string \"log(uint,address,bool,bool)\""
                                  },
                                  "value": "log(uint,address,bool,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20522,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20509,
                                  "src": "27285:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20523,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20511,
                                  "src": "27289:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20524,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20513,
                                  "src": "27293:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20525,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20515,
                                  "src": "27297:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_7e27410dc86ab22a92f2a269c9cf538b707bde3ac248f933df1f4d0b76947d32",
                                    "typeString": "literal_string \"log(uint,address,bool,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20519,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "27230:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20520,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "27230:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20526,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "27230:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20518,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "27214:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20527,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "27214:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20528,
                        "nodeType": "ExpressionStatement",
                        "src": "27214:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20530,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20516,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20509,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20530,
                        "src": "27157:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20508,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "27157:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20511,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20530,
                        "src": "27166:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20510,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "27166:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20513,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20530,
                        "src": "27178:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20512,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "27178:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20515,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20530,
                        "src": "27187:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20514,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "27187:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "27156:39:101"
                  },
                  "returnParameters": {
                    "id": 20517,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "27210:0:101"
                  },
                  "scope": 25062,
                  "src": "27144:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20552,
                    "nodeType": "Block",
                    "src": "27377:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c616464726573732c626f6f6c2c6164647265737329",
                                  "id": 20544,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "27421:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_b6313094a820841f3156e32d271c63cceded7f62875d471e1e87ef33ec252789",
                                    "typeString": "literal_string \"log(uint,address,bool,address)\""
                                  },
                                  "value": "log(uint,address,bool,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20545,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20532,
                                  "src": "27455:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20546,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20534,
                                  "src": "27459:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20547,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20536,
                                  "src": "27463:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20548,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20538,
                                  "src": "27467:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_b6313094a820841f3156e32d271c63cceded7f62875d471e1e87ef33ec252789",
                                    "typeString": "literal_string \"log(uint,address,bool,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20542,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "27397:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20543,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "27397:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20549,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "27397:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20541,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "27381:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20550,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "27381:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20551,
                        "nodeType": "ExpressionStatement",
                        "src": "27381:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20553,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20539,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20532,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20553,
                        "src": "27321:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20531,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "27321:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20534,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20553,
                        "src": "27330:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20533,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "27330:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20536,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20553,
                        "src": "27342:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20535,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "27342:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20538,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20553,
                        "src": "27351:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20537,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "27351:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "27320:42:101"
                  },
                  "returnParameters": {
                    "id": 20540,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "27377:0:101"
                  },
                  "scope": 25062,
                  "src": "27308:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20575,
                    "nodeType": "Block",
                    "src": "27547:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c616464726573732c616464726573732c75696e7429",
                                  "id": 20567,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "27591:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_9a3cbf9603c94c357c6f62b7a32789d9ca5caa81518d1277c9ca986a5650734b",
                                    "typeString": "literal_string \"log(uint,address,address,uint)\""
                                  },
                                  "value": "log(uint,address,address,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20568,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20555,
                                  "src": "27625:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20569,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20557,
                                  "src": "27629:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20570,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20559,
                                  "src": "27633:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20571,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20561,
                                  "src": "27637:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_9a3cbf9603c94c357c6f62b7a32789d9ca5caa81518d1277c9ca986a5650734b",
                                    "typeString": "literal_string \"log(uint,address,address,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20565,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "27567:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20566,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "27567:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20572,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "27567:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20564,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "27551:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20573,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "27551:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20574,
                        "nodeType": "ExpressionStatement",
                        "src": "27551:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20576,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20562,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20555,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20576,
                        "src": "27491:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20554,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "27491:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20557,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20576,
                        "src": "27500:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20556,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "27500:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20559,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20576,
                        "src": "27512:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20558,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "27512:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20561,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20576,
                        "src": "27524:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20560,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "27524:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "27490:42:101"
                  },
                  "returnParameters": {
                    "id": 20563,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "27547:0:101"
                  },
                  "scope": 25062,
                  "src": "27478:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20598,
                    "nodeType": "Block",
                    "src": "27726:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c616464726573732c616464726573732c737472696e6729",
                                  "id": 20590,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "27770:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_7943dc6627d308affd474fe50b563bcfbf09518236383b806f11730459213622",
                                    "typeString": "literal_string \"log(uint,address,address,string)\""
                                  },
                                  "value": "log(uint,address,address,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20591,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20578,
                                  "src": "27806:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20592,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20580,
                                  "src": "27810:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20593,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20582,
                                  "src": "27814:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20594,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20584,
                                  "src": "27818:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_7943dc6627d308affd474fe50b563bcfbf09518236383b806f11730459213622",
                                    "typeString": "literal_string \"log(uint,address,address,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20588,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "27746:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20589,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "27746:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20595,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "27746:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20587,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "27730:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20596,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "27730:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20597,
                        "nodeType": "ExpressionStatement",
                        "src": "27730:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20599,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20585,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20578,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20599,
                        "src": "27661:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20577,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "27661:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20580,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20599,
                        "src": "27670:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20579,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "27670:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20582,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20599,
                        "src": "27682:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20581,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "27682:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20584,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20599,
                        "src": "27694:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20583,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "27694:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "27660:51:101"
                  },
                  "returnParameters": {
                    "id": 20586,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "27726:0:101"
                  },
                  "scope": 25062,
                  "src": "27648:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20621,
                    "nodeType": "Block",
                    "src": "27898:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c616464726573732c616464726573732c626f6f6c29",
                                  "id": 20613,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "27942:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_01550b04ea9916da7bc495d1b5ca5c4bd8d92ef3a98e2cca5a948cec5011f38c",
                                    "typeString": "literal_string \"log(uint,address,address,bool)\""
                                  },
                                  "value": "log(uint,address,address,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20614,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20601,
                                  "src": "27976:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20615,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20603,
                                  "src": "27980:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20616,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20605,
                                  "src": "27984:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20617,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20607,
                                  "src": "27988:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_01550b04ea9916da7bc495d1b5ca5c4bd8d92ef3a98e2cca5a948cec5011f38c",
                                    "typeString": "literal_string \"log(uint,address,address,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20611,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "27918:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20612,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "27918:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20618,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "27918:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20610,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "27902:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20619,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "27902:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20620,
                        "nodeType": "ExpressionStatement",
                        "src": "27902:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20622,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20608,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20601,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20622,
                        "src": "27842:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20600,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "27842:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20603,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20622,
                        "src": "27851:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20602,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "27851:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20605,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20622,
                        "src": "27863:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20604,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "27863:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20607,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20622,
                        "src": "27875:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20606,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "27875:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "27841:42:101"
                  },
                  "returnParameters": {
                    "id": 20609,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "27898:0:101"
                  },
                  "scope": 25062,
                  "src": "27829:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20644,
                    "nodeType": "Block",
                    "src": "28071:101:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f672875696e742c616464726573732c616464726573732c6164647265737329",
                                  "id": 20636,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "28115:35:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_554745f9e6550eea6000ea2febc94de95d453100d5d60359e62cd398b366bfc4",
                                    "typeString": "literal_string \"log(uint,address,address,address)\""
                                  },
                                  "value": "log(uint,address,address,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20637,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20624,
                                  "src": "28152:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20638,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20626,
                                  "src": "28156:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20639,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20628,
                                  "src": "28160:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20640,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20630,
                                  "src": "28164:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_554745f9e6550eea6000ea2febc94de95d453100d5d60359e62cd398b366bfc4",
                                    "typeString": "literal_string \"log(uint,address,address,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20634,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "28091:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20635,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "28091:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20641,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "28091:76:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20633,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "28075:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20642,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "28075:93:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20643,
                        "nodeType": "ExpressionStatement",
                        "src": "28075:93:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20645,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20631,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20624,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20645,
                        "src": "28012:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20623,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "28012:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20626,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20645,
                        "src": "28021:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20625,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28021:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20628,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20645,
                        "src": "28033:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20627,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28033:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20630,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20645,
                        "src": "28045:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20629,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28045:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28011:45:101"
                  },
                  "returnParameters": {
                    "id": 20632,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "28071:0:101"
                  },
                  "scope": 25062,
                  "src": "27999:173:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20667,
                    "nodeType": "Block",
                    "src": "28247:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c75696e742c75696e742c75696e7429",
                                  "id": 20659,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "28291:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_08ee5666d6bd329d27af528e563bb238dedf631fe471effe31c7123dcb5164f2",
                                    "typeString": "literal_string \"log(string,uint,uint,uint)\""
                                  },
                                  "value": "log(string,uint,uint,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20660,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20647,
                                  "src": "28321:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20661,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20649,
                                  "src": "28325:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20662,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20651,
                                  "src": "28329:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20663,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20653,
                                  "src": "28333:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_08ee5666d6bd329d27af528e563bb238dedf631fe471effe31c7123dcb5164f2",
                                    "typeString": "literal_string \"log(string,uint,uint,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20657,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "28267:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20658,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "28267:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20664,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "28267:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20656,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "28251:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20665,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "28251:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20666,
                        "nodeType": "ExpressionStatement",
                        "src": "28251:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20668,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20654,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20647,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20668,
                        "src": "28188:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20646,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "28188:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20649,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20668,
                        "src": "28206:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20648,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "28206:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20651,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20668,
                        "src": "28215:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20650,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "28215:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20653,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20668,
                        "src": "28224:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20652,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "28224:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28187:45:101"
                  },
                  "returnParameters": {
                    "id": 20655,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "28247:0:101"
                  },
                  "scope": 25062,
                  "src": "28175:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20690,
                    "nodeType": "Block",
                    "src": "28425:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c75696e742c75696e742c737472696e6729",
                                  "id": 20682,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "28469:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_a54ed4bdd39588715cd10f1b9730ac9f0db064013c8dc11e216fa2ef3a5948b8",
                                    "typeString": "literal_string \"log(string,uint,uint,string)\""
                                  },
                                  "value": "log(string,uint,uint,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20683,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20670,
                                  "src": "28501:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20684,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20672,
                                  "src": "28505:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20685,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20674,
                                  "src": "28509:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20686,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20676,
                                  "src": "28513:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_a54ed4bdd39588715cd10f1b9730ac9f0db064013c8dc11e216fa2ef3a5948b8",
                                    "typeString": "literal_string \"log(string,uint,uint,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20680,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "28445:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20681,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "28445:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20687,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "28445:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20679,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "28429:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20688,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "28429:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20689,
                        "nodeType": "ExpressionStatement",
                        "src": "28429:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20691,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20677,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20670,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20691,
                        "src": "28357:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20669,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "28357:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20672,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20691,
                        "src": "28375:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20671,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "28375:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20674,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20691,
                        "src": "28384:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20673,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "28384:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20676,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20691,
                        "src": "28393:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20675,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "28393:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28356:54:101"
                  },
                  "returnParameters": {
                    "id": 20678,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "28425:0:101"
                  },
                  "scope": 25062,
                  "src": "28344:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20713,
                    "nodeType": "Block",
                    "src": "28596:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c75696e742c75696e742c626f6f6c29",
                                  "id": 20705,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "28640:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_f73c7e3dc5b5cecd5787e08e359612e609c17649291b138c8f184ee441526f2d",
                                    "typeString": "literal_string \"log(string,uint,uint,bool)\""
                                  },
                                  "value": "log(string,uint,uint,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20706,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20693,
                                  "src": "28670:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20707,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20695,
                                  "src": "28674:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20708,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20697,
                                  "src": "28678:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20709,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20699,
                                  "src": "28682:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_f73c7e3dc5b5cecd5787e08e359612e609c17649291b138c8f184ee441526f2d",
                                    "typeString": "literal_string \"log(string,uint,uint,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20703,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "28616:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20704,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "28616:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20710,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "28616:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20702,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "28600:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20711,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "28600:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20712,
                        "nodeType": "ExpressionStatement",
                        "src": "28600:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20714,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20700,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20693,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20714,
                        "src": "28537:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20692,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "28537:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20695,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20714,
                        "src": "28555:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20694,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "28555:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20697,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20714,
                        "src": "28564:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20696,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "28564:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20699,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20714,
                        "src": "28573:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20698,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "28573:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28536:45:101"
                  },
                  "returnParameters": {
                    "id": 20701,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "28596:0:101"
                  },
                  "scope": 25062,
                  "src": "28524:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20736,
                    "nodeType": "Block",
                    "src": "28768:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c75696e742c75696e742c6164647265737329",
                                  "id": 20728,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "28812:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_bed728bf5bf9afc41a2cff142cfc289808bbba64cbab683d8e6689e6f6f14abc",
                                    "typeString": "literal_string \"log(string,uint,uint,address)\""
                                  },
                                  "value": "log(string,uint,uint,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20729,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20716,
                                  "src": "28845:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20730,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20718,
                                  "src": "28849:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20731,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20720,
                                  "src": "28853:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20732,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20722,
                                  "src": "28857:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_bed728bf5bf9afc41a2cff142cfc289808bbba64cbab683d8e6689e6f6f14abc",
                                    "typeString": "literal_string \"log(string,uint,uint,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20726,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "28788:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20727,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "28788:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20733,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "28788:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20725,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "28772:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20734,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "28772:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20735,
                        "nodeType": "ExpressionStatement",
                        "src": "28772:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20737,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20723,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20716,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20737,
                        "src": "28706:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20715,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "28706:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20718,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20737,
                        "src": "28724:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20717,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "28724:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20720,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20737,
                        "src": "28733:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20719,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "28733:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20722,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20737,
                        "src": "28742:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20721,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "28742:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28705:48:101"
                  },
                  "returnParameters": {
                    "id": 20724,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "28768:0:101"
                  },
                  "scope": 25062,
                  "src": "28693:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20759,
                    "nodeType": "Block",
                    "src": "28949:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c75696e742c737472696e672c75696e7429",
                                  "id": 20751,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "28993:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_a0c4b225a555b1198e8b1e32117070e759cad9a7266d99901b8a7fd2482d0e2f",
                                    "typeString": "literal_string \"log(string,uint,string,uint)\""
                                  },
                                  "value": "log(string,uint,string,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20752,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20739,
                                  "src": "29025:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20753,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20741,
                                  "src": "29029:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20754,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20743,
                                  "src": "29033:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20755,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20745,
                                  "src": "29037:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_a0c4b225a555b1198e8b1e32117070e759cad9a7266d99901b8a7fd2482d0e2f",
                                    "typeString": "literal_string \"log(string,uint,string,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20749,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "28969:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20750,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "28969:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20756,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "28969:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20748,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "28953:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20757,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "28953:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20758,
                        "nodeType": "ExpressionStatement",
                        "src": "28953:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20760,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20746,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20739,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20760,
                        "src": "28881:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20738,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "28881:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20741,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20760,
                        "src": "28899:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20740,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "28899:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20743,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20760,
                        "src": "28908:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20742,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "28908:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20745,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20760,
                        "src": "28926:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20744,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "28926:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "28880:54:101"
                  },
                  "returnParameters": {
                    "id": 20747,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "28949:0:101"
                  },
                  "scope": 25062,
                  "src": "28868:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20782,
                    "nodeType": "Block",
                    "src": "29138:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c75696e742c737472696e672c737472696e6729",
                                  "id": 20774,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "29182:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_6c98dae27db048edb14bb31b4326832aa1fb54be52caaf49d1cecb59aa297c07",
                                    "typeString": "literal_string \"log(string,uint,string,string)\""
                                  },
                                  "value": "log(string,uint,string,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20775,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20762,
                                  "src": "29216:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20776,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20764,
                                  "src": "29220:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20777,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20766,
                                  "src": "29224:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20778,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20768,
                                  "src": "29228:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_6c98dae27db048edb14bb31b4326832aa1fb54be52caaf49d1cecb59aa297c07",
                                    "typeString": "literal_string \"log(string,uint,string,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20772,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "29158:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20773,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "29158:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20779,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "29158:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20771,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "29142:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20780,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "29142:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20781,
                        "nodeType": "ExpressionStatement",
                        "src": "29142:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20783,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20769,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20762,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20783,
                        "src": "29061:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20761,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "29061:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20764,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20783,
                        "src": "29079:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20763,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "29079:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20766,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20783,
                        "src": "29088:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20765,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "29088:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20768,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20783,
                        "src": "29106:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20767,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "29106:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "29060:63:101"
                  },
                  "returnParameters": {
                    "id": 20770,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "29138:0:101"
                  },
                  "scope": 25062,
                  "src": "29048:188:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20805,
                    "nodeType": "Block",
                    "src": "29320:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c75696e742c737472696e672c626f6f6c29",
                                  "id": 20797,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "29364:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_e99f82cf29cb9d7551a843a55617f00569395570d3a9816be530f7c6197ec7c8",
                                    "typeString": "literal_string \"log(string,uint,string,bool)\""
                                  },
                                  "value": "log(string,uint,string,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20798,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20785,
                                  "src": "29396:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20799,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20787,
                                  "src": "29400:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20800,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20789,
                                  "src": "29404:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20801,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20791,
                                  "src": "29408:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_e99f82cf29cb9d7551a843a55617f00569395570d3a9816be530f7c6197ec7c8",
                                    "typeString": "literal_string \"log(string,uint,string,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20795,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "29340:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20796,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "29340:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20802,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "29340:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20794,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "29324:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20803,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "29324:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20804,
                        "nodeType": "ExpressionStatement",
                        "src": "29324:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20806,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20792,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20785,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20806,
                        "src": "29252:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20784,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "29252:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20787,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20806,
                        "src": "29270:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20786,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "29270:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20789,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20806,
                        "src": "29279:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20788,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "29279:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20791,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20806,
                        "src": "29297:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20790,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "29297:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "29251:54:101"
                  },
                  "returnParameters": {
                    "id": 20793,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "29320:0:101"
                  },
                  "scope": 25062,
                  "src": "29239:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20828,
                    "nodeType": "Block",
                    "src": "29503:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c75696e742c737472696e672c6164647265737329",
                                  "id": 20820,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "29547:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_bb7235e9977380af5de9932c5c28e18d22806b4b0a15ac7e98086e795e59b31c",
                                    "typeString": "literal_string \"log(string,uint,string,address)\""
                                  },
                                  "value": "log(string,uint,string,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20821,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20808,
                                  "src": "29582:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20822,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20810,
                                  "src": "29586:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20823,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20812,
                                  "src": "29590:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20824,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20814,
                                  "src": "29594:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_bb7235e9977380af5de9932c5c28e18d22806b4b0a15ac7e98086e795e59b31c",
                                    "typeString": "literal_string \"log(string,uint,string,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20818,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "29523:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20819,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "29523:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20825,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "29523:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20817,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "29507:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20826,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "29507:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20827,
                        "nodeType": "ExpressionStatement",
                        "src": "29507:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20829,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20815,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20808,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20829,
                        "src": "29432:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20807,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "29432:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20810,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20829,
                        "src": "29450:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20809,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "29450:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20812,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20829,
                        "src": "29459:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20811,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "29459:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20814,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20829,
                        "src": "29477:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20813,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "29477:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "29431:57:101"
                  },
                  "returnParameters": {
                    "id": 20816,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "29503:0:101"
                  },
                  "scope": 25062,
                  "src": "29419:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20851,
                    "nodeType": "Block",
                    "src": "29677:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c75696e742c626f6f6c2c75696e7429",
                                  "id": 20843,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "29721:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_550e6ef516f1b3b5be9432b068022af744a919b7f9554b6605ddb59dad27875f",
                                    "typeString": "literal_string \"log(string,uint,bool,uint)\""
                                  },
                                  "value": "log(string,uint,bool,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20844,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20831,
                                  "src": "29751:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20845,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20833,
                                  "src": "29755:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20846,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20835,
                                  "src": "29759:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20847,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20837,
                                  "src": "29763:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_550e6ef516f1b3b5be9432b068022af744a919b7f9554b6605ddb59dad27875f",
                                    "typeString": "literal_string \"log(string,uint,bool,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20841,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "29697:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20842,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "29697:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20848,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "29697:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20840,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "29681:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20849,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "29681:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20850,
                        "nodeType": "ExpressionStatement",
                        "src": "29681:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20852,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20838,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20831,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20852,
                        "src": "29618:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20830,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "29618:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20833,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20852,
                        "src": "29636:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20832,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "29636:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20835,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20852,
                        "src": "29645:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20834,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "29645:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20837,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20852,
                        "src": "29654:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20836,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "29654:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "29617:45:101"
                  },
                  "returnParameters": {
                    "id": 20839,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "29677:0:101"
                  },
                  "scope": 25062,
                  "src": "29605:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20874,
                    "nodeType": "Block",
                    "src": "29855:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c75696e742c626f6f6c2c737472696e6729",
                                  "id": 20866,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "29899:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_76cc6064a225b36730abdd64aa9dcb74a19c97e79a6eaa7e7a7381b59d8b3f68",
                                    "typeString": "literal_string \"log(string,uint,bool,string)\""
                                  },
                                  "value": "log(string,uint,bool,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20867,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20854,
                                  "src": "29931:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20868,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20856,
                                  "src": "29935:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20869,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20858,
                                  "src": "29939:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20870,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20860,
                                  "src": "29943:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_76cc6064a225b36730abdd64aa9dcb74a19c97e79a6eaa7e7a7381b59d8b3f68",
                                    "typeString": "literal_string \"log(string,uint,bool,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20864,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "29875:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20865,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "29875:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20871,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "29875:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20863,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "29859:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20872,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "29859:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20873,
                        "nodeType": "ExpressionStatement",
                        "src": "29859:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20875,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20861,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20854,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20875,
                        "src": "29787:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20853,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "29787:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20856,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20875,
                        "src": "29805:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20855,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "29805:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20858,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20875,
                        "src": "29814:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20857,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "29814:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20860,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20875,
                        "src": "29823:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20859,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "29823:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "29786:54:101"
                  },
                  "returnParameters": {
                    "id": 20862,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "29855:0:101"
                  },
                  "scope": 25062,
                  "src": "29774:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20897,
                    "nodeType": "Block",
                    "src": "30026:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c75696e742c626f6f6c2c626f6f6c29",
                                  "id": 20889,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "30070:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_e37ff3d07873d5117abd74fe9be70fdadf355b74510a6f7507b0edd4a0032d7f",
                                    "typeString": "literal_string \"log(string,uint,bool,bool)\""
                                  },
                                  "value": "log(string,uint,bool,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20890,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20877,
                                  "src": "30100:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20891,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20879,
                                  "src": "30104:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20892,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20881,
                                  "src": "30108:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20893,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20883,
                                  "src": "30112:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_e37ff3d07873d5117abd74fe9be70fdadf355b74510a6f7507b0edd4a0032d7f",
                                    "typeString": "literal_string \"log(string,uint,bool,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20887,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "30046:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20888,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "30046:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20894,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "30046:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20886,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "30030:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20895,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "30030:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20896,
                        "nodeType": "ExpressionStatement",
                        "src": "30030:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20898,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20884,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20877,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20898,
                        "src": "29967:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20876,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "29967:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20879,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20898,
                        "src": "29985:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20878,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "29985:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20881,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20898,
                        "src": "29994:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20880,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "29994:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20883,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20898,
                        "src": "30003:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20882,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "30003:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "29966:45:101"
                  },
                  "returnParameters": {
                    "id": 20885,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "30026:0:101"
                  },
                  "scope": 25062,
                  "src": "29954:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20920,
                    "nodeType": "Block",
                    "src": "30198:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c75696e742c626f6f6c2c6164647265737329",
                                  "id": 20912,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "30242:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_e5549d91ec2998207f70463fe94a71d0edc39b13b219ff8feb87dd990a616539",
                                    "typeString": "literal_string \"log(string,uint,bool,address)\""
                                  },
                                  "value": "log(string,uint,bool,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20913,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20900,
                                  "src": "30275:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20914,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20902,
                                  "src": "30279:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20915,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20904,
                                  "src": "30283:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20916,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20906,
                                  "src": "30287:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_e5549d91ec2998207f70463fe94a71d0edc39b13b219ff8feb87dd990a616539",
                                    "typeString": "literal_string \"log(string,uint,bool,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20910,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "30218:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20911,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "30218:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20917,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "30218:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20909,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "30202:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20918,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "30202:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20919,
                        "nodeType": "ExpressionStatement",
                        "src": "30202:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20921,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20907,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20900,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20921,
                        "src": "30136:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20899,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "30136:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20902,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20921,
                        "src": "30154:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20901,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "30154:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20904,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20921,
                        "src": "30163:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20903,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "30163:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20906,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20921,
                        "src": "30172:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20905,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "30172:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30135:48:101"
                  },
                  "returnParameters": {
                    "id": 20908,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "30198:0:101"
                  },
                  "scope": 25062,
                  "src": "30123:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20943,
                    "nodeType": "Block",
                    "src": "30373:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c75696e742c616464726573732c75696e7429",
                                  "id": 20935,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "30417:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_58497afe9e509136f5cf2fb1db9876437d9cbd769be5985b518ff094427e4f75",
                                    "typeString": "literal_string \"log(string,uint,address,uint)\""
                                  },
                                  "value": "log(string,uint,address,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20936,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20923,
                                  "src": "30450:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20937,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20925,
                                  "src": "30454:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20938,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20927,
                                  "src": "30458:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20939,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20929,
                                  "src": "30462:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_58497afe9e509136f5cf2fb1db9876437d9cbd769be5985b518ff094427e4f75",
                                    "typeString": "literal_string \"log(string,uint,address,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20933,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "30393:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20934,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "30393:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20940,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "30393:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20932,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "30377:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20941,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "30377:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20942,
                        "nodeType": "ExpressionStatement",
                        "src": "30377:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20944,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20930,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20923,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20944,
                        "src": "30311:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20922,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "30311:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20925,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20944,
                        "src": "30329:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20924,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "30329:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20927,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20944,
                        "src": "30338:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20926,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "30338:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20929,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20944,
                        "src": "30350:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20928,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "30350:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30310:48:101"
                  },
                  "returnParameters": {
                    "id": 20931,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "30373:0:101"
                  },
                  "scope": 25062,
                  "src": "30298:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20966,
                    "nodeType": "Block",
                    "src": "30557:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c75696e742c616464726573732c737472696e6729",
                                  "id": 20958,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "30601:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_3254c2e85e824e7dd0b3e2e602f95218ed23a331406e197386693086d91053c0",
                                    "typeString": "literal_string \"log(string,uint,address,string)\""
                                  },
                                  "value": "log(string,uint,address,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20959,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20946,
                                  "src": "30636:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20960,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20948,
                                  "src": "30640:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20961,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20950,
                                  "src": "30644:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20962,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20952,
                                  "src": "30648:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_3254c2e85e824e7dd0b3e2e602f95218ed23a331406e197386693086d91053c0",
                                    "typeString": "literal_string \"log(string,uint,address,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20956,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "30577:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20957,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "30577:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20963,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "30577:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20955,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "30561:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20964,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "30561:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20965,
                        "nodeType": "ExpressionStatement",
                        "src": "30561:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20967,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20953,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20946,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20967,
                        "src": "30486:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20945,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "30486:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20948,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20967,
                        "src": "30504:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20947,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "30504:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20950,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20967,
                        "src": "30513:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20949,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "30513:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20952,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20967,
                        "src": "30525:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20951,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "30525:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30485:57:101"
                  },
                  "returnParameters": {
                    "id": 20954,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "30557:0:101"
                  },
                  "scope": 25062,
                  "src": "30473:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 20989,
                    "nodeType": "Block",
                    "src": "30734:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c75696e742c616464726573732c626f6f6c29",
                                  "id": 20981,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "30778:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_1106a8f7a9fdb0743cc8f33bcf28da92f358b488bfc5eb2426dcc116571bae10",
                                    "typeString": "literal_string \"log(string,uint,address,bool)\""
                                  },
                                  "value": "log(string,uint,address,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20982,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20969,
                                  "src": "30811:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20983,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20971,
                                  "src": "30815:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20984,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20973,
                                  "src": "30819:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 20985,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20975,
                                  "src": "30823:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_1106a8f7a9fdb0743cc8f33bcf28da92f358b488bfc5eb2426dcc116571bae10",
                                    "typeString": "literal_string \"log(string,uint,address,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 20979,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "30754:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 20980,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "30754:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 20986,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "30754:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 20978,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "30738:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 20987,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "30738:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 20988,
                        "nodeType": "ExpressionStatement",
                        "src": "30738:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 20990,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20976,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20969,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20990,
                        "src": "30672:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20968,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "30672:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20971,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20990,
                        "src": "30690:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20970,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "30690:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20973,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20990,
                        "src": "30699:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20972,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "30699:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20975,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 20990,
                        "src": "30711:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 20974,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "30711:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30671:48:101"
                  },
                  "returnParameters": {
                    "id": 20977,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "30734:0:101"
                  },
                  "scope": 25062,
                  "src": "30659:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21012,
                    "nodeType": "Block",
                    "src": "30912:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c75696e742c616464726573732c6164647265737329",
                                  "id": 21004,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "30956:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_eac892812ad5b43e056a005de5f4269f3430ecb19d3374f0e27d055022fbb381",
                                    "typeString": "literal_string \"log(string,uint,address,address)\""
                                  },
                                  "value": "log(string,uint,address,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21005,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20992,
                                  "src": "30992:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21006,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20994,
                                  "src": "30996:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21007,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20996,
                                  "src": "31000:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21008,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 20998,
                                  "src": "31004:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_eac892812ad5b43e056a005de5f4269f3430ecb19d3374f0e27d055022fbb381",
                                    "typeString": "literal_string \"log(string,uint,address,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21002,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "30932:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21003,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "30932:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21009,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "30932:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21001,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "30916:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21010,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "30916:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21011,
                        "nodeType": "ExpressionStatement",
                        "src": "30916:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21013,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 20999,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 20992,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21013,
                        "src": "30847:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 20991,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "30847:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20994,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21013,
                        "src": "30865:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 20993,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "30865:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20996,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21013,
                        "src": "30874:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20995,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "30874:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 20998,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21013,
                        "src": "30886:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 20997,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "30886:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "30846:51:101"
                  },
                  "returnParameters": {
                    "id": 21000,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "30912:0:101"
                  },
                  "scope": 25062,
                  "src": "30834:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21035,
                    "nodeType": "Block",
                    "src": "31096:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c737472696e672c75696e742c75696e7429",
                                  "id": 21027,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "31140:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_d5cf17d093c9068e0703e037cea1f6c3048599508dc7985106a94aa34c08c926",
                                    "typeString": "literal_string \"log(string,string,uint,uint)\""
                                  },
                                  "value": "log(string,string,uint,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21028,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21015,
                                  "src": "31172:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21029,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21017,
                                  "src": "31176:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21030,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21019,
                                  "src": "31180:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21031,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21021,
                                  "src": "31184:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_d5cf17d093c9068e0703e037cea1f6c3048599508dc7985106a94aa34c08c926",
                                    "typeString": "literal_string \"log(string,string,uint,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21025,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "31116:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21026,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "31116:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21032,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "31116:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21024,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "31100:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21033,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "31100:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21034,
                        "nodeType": "ExpressionStatement",
                        "src": "31100:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21036,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21022,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21015,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21036,
                        "src": "31028:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21014,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "31028:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21017,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21036,
                        "src": "31046:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21016,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "31046:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21019,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21036,
                        "src": "31064:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 21018,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "31064:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21021,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21036,
                        "src": "31073:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 21020,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "31073:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "31027:54:101"
                  },
                  "returnParameters": {
                    "id": 21023,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "31096:0:101"
                  },
                  "scope": 25062,
                  "src": "31015:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21058,
                    "nodeType": "Block",
                    "src": "31285:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c737472696e672c75696e742c737472696e6729",
                                  "id": 21050,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "31329:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_8d142cdddf40ab944834474e14a37534e67dcf2f6ffd68fd3d894f907fb76a0a",
                                    "typeString": "literal_string \"log(string,string,uint,string)\""
                                  },
                                  "value": "log(string,string,uint,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21051,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21038,
                                  "src": "31363:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21052,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21040,
                                  "src": "31367:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21053,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21042,
                                  "src": "31371:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21054,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21044,
                                  "src": "31375:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_8d142cdddf40ab944834474e14a37534e67dcf2f6ffd68fd3d894f907fb76a0a",
                                    "typeString": "literal_string \"log(string,string,uint,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21048,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "31305:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21049,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "31305:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21055,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "31305:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21047,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "31289:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21056,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "31289:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21057,
                        "nodeType": "ExpressionStatement",
                        "src": "31289:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21059,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21045,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21038,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21059,
                        "src": "31208:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21037,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "31208:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21040,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21059,
                        "src": "31226:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21039,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "31226:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21042,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21059,
                        "src": "31244:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 21041,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "31244:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21044,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21059,
                        "src": "31253:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21043,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "31253:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "31207:63:101"
                  },
                  "returnParameters": {
                    "id": 21046,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "31285:0:101"
                  },
                  "scope": 25062,
                  "src": "31195:188:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21081,
                    "nodeType": "Block",
                    "src": "31467:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c737472696e672c75696e742c626f6f6c29",
                                  "id": 21073,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "31511:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_e65658ca6578795ac405c3487ab68ec21d76f9a79d734a9ab869db5d96b4556b",
                                    "typeString": "literal_string \"log(string,string,uint,bool)\""
                                  },
                                  "value": "log(string,string,uint,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21074,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21061,
                                  "src": "31543:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21075,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21063,
                                  "src": "31547:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21076,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21065,
                                  "src": "31551:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21077,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21067,
                                  "src": "31555:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_e65658ca6578795ac405c3487ab68ec21d76f9a79d734a9ab869db5d96b4556b",
                                    "typeString": "literal_string \"log(string,string,uint,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21071,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "31487:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21072,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "31487:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21078,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "31487:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21070,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "31471:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21079,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "31471:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21080,
                        "nodeType": "ExpressionStatement",
                        "src": "31471:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21082,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21068,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21061,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21082,
                        "src": "31399:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21060,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "31399:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21063,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21082,
                        "src": "31417:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21062,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "31417:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21065,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21082,
                        "src": "31435:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 21064,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "31435:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21067,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21082,
                        "src": "31444:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21066,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "31444:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "31398:54:101"
                  },
                  "returnParameters": {
                    "id": 21069,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "31467:0:101"
                  },
                  "scope": 25062,
                  "src": "31386:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21104,
                    "nodeType": "Block",
                    "src": "31650:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c737472696e672c75696e742c6164647265737329",
                                  "id": 21096,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "31694:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_5d4f46805293f3e84ba6dbfe353f76b3d1f1cfb2ff1e8024fb2adb45e2b7a128",
                                    "typeString": "literal_string \"log(string,string,uint,address)\""
                                  },
                                  "value": "log(string,string,uint,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21097,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21084,
                                  "src": "31729:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21098,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21086,
                                  "src": "31733:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21099,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21088,
                                  "src": "31737:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21100,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21090,
                                  "src": "31741:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_5d4f46805293f3e84ba6dbfe353f76b3d1f1cfb2ff1e8024fb2adb45e2b7a128",
                                    "typeString": "literal_string \"log(string,string,uint,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21094,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "31670:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21095,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "31670:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21101,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "31670:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21093,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "31654:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21102,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "31654:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21103,
                        "nodeType": "ExpressionStatement",
                        "src": "31654:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21105,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21091,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21084,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21105,
                        "src": "31579:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21083,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "31579:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21086,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21105,
                        "src": "31597:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21085,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "31597:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21088,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21105,
                        "src": "31615:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 21087,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "31615:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21090,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21105,
                        "src": "31624:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21089,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "31624:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "31578:57:101"
                  },
                  "returnParameters": {
                    "id": 21092,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "31650:0:101"
                  },
                  "scope": 25062,
                  "src": "31566:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21127,
                    "nodeType": "Block",
                    "src": "31842:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c737472696e672c737472696e672c75696e7429",
                                  "id": 21119,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "31886:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_9fd009f5f31a16d665d9be327a4a2b17dc428108ae31e46ab875e747b5ee155f",
                                    "typeString": "literal_string \"log(string,string,string,uint)\""
                                  },
                                  "value": "log(string,string,string,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21120,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21107,
                                  "src": "31920:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21121,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21109,
                                  "src": "31924:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21122,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21111,
                                  "src": "31928:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21123,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21113,
                                  "src": "31932:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_9fd009f5f31a16d665d9be327a4a2b17dc428108ae31e46ab875e747b5ee155f",
                                    "typeString": "literal_string \"log(string,string,string,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21117,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "31862:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21118,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "31862:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21124,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "31862:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21116,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "31846:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21125,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "31846:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21126,
                        "nodeType": "ExpressionStatement",
                        "src": "31846:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21128,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21114,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21107,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21128,
                        "src": "31765:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21106,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "31765:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21109,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21128,
                        "src": "31783:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21108,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "31783:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21111,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21128,
                        "src": "31801:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21110,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "31801:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21113,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21128,
                        "src": "31819:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 21112,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "31819:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "31764:63:101"
                  },
                  "returnParameters": {
                    "id": 21115,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "31842:0:101"
                  },
                  "scope": 25062,
                  "src": "31752:188:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21150,
                    "nodeType": "Block",
                    "src": "32042:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c737472696e672c737472696e672c737472696e6729",
                                  "id": 21142,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "32086:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_de68f20a8e88f68d54c5aa294860ee37b58680632686e2f1101e4e042a2cbcbe",
                                    "typeString": "literal_string \"log(string,string,string,string)\""
                                  },
                                  "value": "log(string,string,string,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21143,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21130,
                                  "src": "32122:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21144,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21132,
                                  "src": "32126:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21145,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21134,
                                  "src": "32130:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21146,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21136,
                                  "src": "32134:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_de68f20a8e88f68d54c5aa294860ee37b58680632686e2f1101e4e042a2cbcbe",
                                    "typeString": "literal_string \"log(string,string,string,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21140,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "32062:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21141,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "32062:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21147,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "32062:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21139,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "32046:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21148,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "32046:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21149,
                        "nodeType": "ExpressionStatement",
                        "src": "32046:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21151,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21137,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21130,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21151,
                        "src": "31956:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21129,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "31956:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21132,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21151,
                        "src": "31974:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21131,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "31974:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21134,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21151,
                        "src": "31992:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21133,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "31992:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21136,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21151,
                        "src": "32010:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21135,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "32010:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "31955:72:101"
                  },
                  "returnParameters": {
                    "id": 21138,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "32042:0:101"
                  },
                  "scope": 25062,
                  "src": "31943:199:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21173,
                    "nodeType": "Block",
                    "src": "32235:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c737472696e672c737472696e672c626f6f6c29",
                                  "id": 21165,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "32279:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_2c1754ed9d3bc50669c3e71e3115dc4403f3cff35aa9b6b58799f80b5496f332",
                                    "typeString": "literal_string \"log(string,string,string,bool)\""
                                  },
                                  "value": "log(string,string,string,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21166,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21153,
                                  "src": "32313:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21167,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21155,
                                  "src": "32317:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21168,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21157,
                                  "src": "32321:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21169,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21159,
                                  "src": "32325:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_2c1754ed9d3bc50669c3e71e3115dc4403f3cff35aa9b6b58799f80b5496f332",
                                    "typeString": "literal_string \"log(string,string,string,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21163,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "32255:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21164,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "32255:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21170,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "32255:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21162,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "32239:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21171,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "32239:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21172,
                        "nodeType": "ExpressionStatement",
                        "src": "32239:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21174,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21160,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21153,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21174,
                        "src": "32158:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21152,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "32158:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21155,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21174,
                        "src": "32176:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21154,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "32176:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21157,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21174,
                        "src": "32194:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21156,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "32194:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21159,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21174,
                        "src": "32212:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21158,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "32212:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "32157:63:101"
                  },
                  "returnParameters": {
                    "id": 21161,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "32235:0:101"
                  },
                  "scope": 25062,
                  "src": "32145:188:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21196,
                    "nodeType": "Block",
                    "src": "32429:101:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c737472696e672c737472696e672c6164647265737329",
                                  "id": 21188,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "32473:35:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_6d572f449cf1e446ea3ace51a34ce30628f4f1588a39dc5d550cefb210c5bb16",
                                    "typeString": "literal_string \"log(string,string,string,address)\""
                                  },
                                  "value": "log(string,string,string,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21189,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21176,
                                  "src": "32510:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21190,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21178,
                                  "src": "32514:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21191,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21180,
                                  "src": "32518:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21192,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21182,
                                  "src": "32522:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_6d572f449cf1e446ea3ace51a34ce30628f4f1588a39dc5d550cefb210c5bb16",
                                    "typeString": "literal_string \"log(string,string,string,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21186,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "32449:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21187,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "32449:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21193,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "32449:76:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21185,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "32433:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21194,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "32433:93:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21195,
                        "nodeType": "ExpressionStatement",
                        "src": "32433:93:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21197,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21183,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21176,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21197,
                        "src": "32349:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21175,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "32349:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21178,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21197,
                        "src": "32367:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21177,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "32367:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21180,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21197,
                        "src": "32385:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21179,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "32385:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21182,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21197,
                        "src": "32403:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21181,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "32403:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "32348:66:101"
                  },
                  "returnParameters": {
                    "id": 21184,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "32429:0:101"
                  },
                  "scope": 25062,
                  "src": "32336:194:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21219,
                    "nodeType": "Block",
                    "src": "32614:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c737472696e672c626f6f6c2c75696e7429",
                                  "id": 21211,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "32658:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_86818a7aa9bc994aa800ce554e865f0047fd8aaa8799a458e8fea2db0986c5c1",
                                    "typeString": "literal_string \"log(string,string,bool,uint)\""
                                  },
                                  "value": "log(string,string,bool,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21212,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21199,
                                  "src": "32690:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21213,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21201,
                                  "src": "32694:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21214,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21203,
                                  "src": "32698:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21215,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21205,
                                  "src": "32702:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_86818a7aa9bc994aa800ce554e865f0047fd8aaa8799a458e8fea2db0986c5c1",
                                    "typeString": "literal_string \"log(string,string,bool,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21209,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "32634:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21210,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "32634:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21216,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "32634:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21208,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "32618:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21217,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "32618:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21218,
                        "nodeType": "ExpressionStatement",
                        "src": "32618:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21220,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21206,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21199,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21220,
                        "src": "32546:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21198,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "32546:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21201,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21220,
                        "src": "32564:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21200,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "32564:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21203,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21220,
                        "src": "32582:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21202,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "32582:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21205,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21220,
                        "src": "32591:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 21204,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "32591:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "32545:54:101"
                  },
                  "returnParameters": {
                    "id": 21207,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "32614:0:101"
                  },
                  "scope": 25062,
                  "src": "32533:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21242,
                    "nodeType": "Block",
                    "src": "32803:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c737472696e672c626f6f6c2c737472696e6729",
                                  "id": 21234,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "32847:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_5e84b0ea51a130c3c7e1443097f28cb5c541ea8487836ae7cb1ca9c6e683699b",
                                    "typeString": "literal_string \"log(string,string,bool,string)\""
                                  },
                                  "value": "log(string,string,bool,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21235,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21222,
                                  "src": "32881:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21236,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21224,
                                  "src": "32885:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21237,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21226,
                                  "src": "32889:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21238,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21228,
                                  "src": "32893:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_5e84b0ea51a130c3c7e1443097f28cb5c541ea8487836ae7cb1ca9c6e683699b",
                                    "typeString": "literal_string \"log(string,string,bool,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21232,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "32823:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21233,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "32823:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21239,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "32823:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21231,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "32807:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21240,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "32807:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21241,
                        "nodeType": "ExpressionStatement",
                        "src": "32807:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21243,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21229,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21222,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21243,
                        "src": "32726:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21221,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "32726:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21224,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21243,
                        "src": "32744:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21223,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "32744:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21226,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21243,
                        "src": "32762:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21225,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "32762:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21228,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21243,
                        "src": "32771:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21227,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "32771:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "32725:63:101"
                  },
                  "returnParameters": {
                    "id": 21230,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "32803:0:101"
                  },
                  "scope": 25062,
                  "src": "32713:188:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21265,
                    "nodeType": "Block",
                    "src": "32985:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c737472696e672c626f6f6c2c626f6f6c29",
                                  "id": 21257,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "33029:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_40785869c0ea63ca2ccbcf7415552989c2f1ce04f151eb3b2bd695c64d21af10",
                                    "typeString": "literal_string \"log(string,string,bool,bool)\""
                                  },
                                  "value": "log(string,string,bool,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21258,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21245,
                                  "src": "33061:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21259,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21247,
                                  "src": "33065:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21260,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21249,
                                  "src": "33069:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21261,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21251,
                                  "src": "33073:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_40785869c0ea63ca2ccbcf7415552989c2f1ce04f151eb3b2bd695c64d21af10",
                                    "typeString": "literal_string \"log(string,string,bool,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21255,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "33005:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21256,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "33005:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21262,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "33005:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21254,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "32989:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21263,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "32989:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21264,
                        "nodeType": "ExpressionStatement",
                        "src": "32989:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21266,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21252,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21245,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21266,
                        "src": "32917:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21244,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "32917:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21247,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21266,
                        "src": "32935:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21246,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "32935:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21249,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21266,
                        "src": "32953:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21248,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "32953:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21251,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21266,
                        "src": "32962:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21250,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "32962:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "32916:54:101"
                  },
                  "returnParameters": {
                    "id": 21253,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "32985:0:101"
                  },
                  "scope": 25062,
                  "src": "32904:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21288,
                    "nodeType": "Block",
                    "src": "33168:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c737472696e672c626f6f6c2c6164647265737329",
                                  "id": 21280,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "33212:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c371c7db0a4b104babdbdf00d079eb75cb5aa1d401c4fb726c8e5559029df84d",
                                    "typeString": "literal_string \"log(string,string,bool,address)\""
                                  },
                                  "value": "log(string,string,bool,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21281,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21268,
                                  "src": "33247:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21282,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21270,
                                  "src": "33251:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21283,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21272,
                                  "src": "33255:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21284,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21274,
                                  "src": "33259:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_c371c7db0a4b104babdbdf00d079eb75cb5aa1d401c4fb726c8e5559029df84d",
                                    "typeString": "literal_string \"log(string,string,bool,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21278,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "33188:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21279,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "33188:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21285,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "33188:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21277,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "33172:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21286,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "33172:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21287,
                        "nodeType": "ExpressionStatement",
                        "src": "33172:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21289,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21275,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21268,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21289,
                        "src": "33097:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21267,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "33097:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21270,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21289,
                        "src": "33115:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21269,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "33115:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21272,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21289,
                        "src": "33133:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21271,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "33133:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21274,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21289,
                        "src": "33142:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21273,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "33142:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33096:57:101"
                  },
                  "returnParameters": {
                    "id": 21276,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "33168:0:101"
                  },
                  "scope": 25062,
                  "src": "33084:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21311,
                    "nodeType": "Block",
                    "src": "33354:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c737472696e672c616464726573732c75696e7429",
                                  "id": 21303,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "33398:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_4a81a56a33247069679e8b6a463a3b29deb4b1020ce6e03b978132074cad28c2",
                                    "typeString": "literal_string \"log(string,string,address,uint)\""
                                  },
                                  "value": "log(string,string,address,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21304,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21291,
                                  "src": "33433:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21305,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21293,
                                  "src": "33437:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21306,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21295,
                                  "src": "33441:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21307,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21297,
                                  "src": "33445:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_4a81a56a33247069679e8b6a463a3b29deb4b1020ce6e03b978132074cad28c2",
                                    "typeString": "literal_string \"log(string,string,address,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21301,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "33374:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21302,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "33374:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21308,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "33374:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21300,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "33358:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21309,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "33358:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21310,
                        "nodeType": "ExpressionStatement",
                        "src": "33358:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21312,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21298,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21291,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21312,
                        "src": "33283:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21290,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "33283:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21293,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21312,
                        "src": "33301:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21292,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "33301:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21295,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21312,
                        "src": "33319:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21294,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "33319:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21297,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21312,
                        "src": "33331:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 21296,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "33331:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33282:57:101"
                  },
                  "returnParameters": {
                    "id": 21299,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "33354:0:101"
                  },
                  "scope": 25062,
                  "src": "33270:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21334,
                    "nodeType": "Block",
                    "src": "33549:101:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c737472696e672c616464726573732c737472696e6729",
                                  "id": 21326,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "33593:35:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_eb1bff805ef136c60bfed230c7b932a14c6f7a62608edeaf56f8f2c0575d25b6",
                                    "typeString": "literal_string \"log(string,string,address,string)\""
                                  },
                                  "value": "log(string,string,address,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21327,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21314,
                                  "src": "33630:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21328,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21316,
                                  "src": "33634:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21329,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21318,
                                  "src": "33638:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21330,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21320,
                                  "src": "33642:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_eb1bff805ef136c60bfed230c7b932a14c6f7a62608edeaf56f8f2c0575d25b6",
                                    "typeString": "literal_string \"log(string,string,address,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21324,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "33569:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21325,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "33569:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21331,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "33569:76:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21323,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "33553:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21332,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "33553:93:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21333,
                        "nodeType": "ExpressionStatement",
                        "src": "33553:93:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21335,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21321,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21314,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21335,
                        "src": "33469:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21313,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "33469:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21316,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21335,
                        "src": "33487:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21315,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "33487:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21318,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21335,
                        "src": "33505:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21317,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "33505:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21320,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21335,
                        "src": "33517:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21319,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "33517:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33468:66:101"
                  },
                  "returnParameters": {
                    "id": 21322,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "33549:0:101"
                  },
                  "scope": 25062,
                  "src": "33456:194:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21357,
                    "nodeType": "Block",
                    "src": "33737:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c737472696e672c616464726573732c626f6f6c29",
                                  "id": 21349,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "33781:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_5ccd4e373eb6ae26626c8607ae861c55cda5fd321363edde7e6328e09072ba63",
                                    "typeString": "literal_string \"log(string,string,address,bool)\""
                                  },
                                  "value": "log(string,string,address,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21350,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21337,
                                  "src": "33816:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21351,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21339,
                                  "src": "33820:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21352,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21341,
                                  "src": "33824:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21353,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21343,
                                  "src": "33828:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_5ccd4e373eb6ae26626c8607ae861c55cda5fd321363edde7e6328e09072ba63",
                                    "typeString": "literal_string \"log(string,string,address,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21347,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "33757:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21348,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "33757:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21354,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "33757:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21346,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "33741:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21355,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "33741:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21356,
                        "nodeType": "ExpressionStatement",
                        "src": "33741:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21358,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21344,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21337,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21358,
                        "src": "33666:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21336,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "33666:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21339,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21358,
                        "src": "33684:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21338,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "33684:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21341,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21358,
                        "src": "33702:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21340,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "33702:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21343,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21358,
                        "src": "33714:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21342,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "33714:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33665:57:101"
                  },
                  "returnParameters": {
                    "id": 21345,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "33737:0:101"
                  },
                  "scope": 25062,
                  "src": "33653:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21380,
                    "nodeType": "Block",
                    "src": "33926:102:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c737472696e672c616464726573732c6164647265737329",
                                  "id": 21372,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "33970:36:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_439c7befd1b6bfcb9bd001c1f3a991ef43c070f0ace0c190dd9f16d7ae338a5d",
                                    "typeString": "literal_string \"log(string,string,address,address)\""
                                  },
                                  "value": "log(string,string,address,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21373,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21360,
                                  "src": "34008:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21374,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21362,
                                  "src": "34012:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21375,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21364,
                                  "src": "34016:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21376,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21366,
                                  "src": "34020:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_439c7befd1b6bfcb9bd001c1f3a991ef43c070f0ace0c190dd9f16d7ae338a5d",
                                    "typeString": "literal_string \"log(string,string,address,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21370,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "33946:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21371,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "33946:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21377,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "33946:77:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21369,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "33930:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21378,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "33930:94:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21379,
                        "nodeType": "ExpressionStatement",
                        "src": "33930:94:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21381,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21367,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21360,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21381,
                        "src": "33852:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21359,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "33852:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21362,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21381,
                        "src": "33870:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21361,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "33870:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21364,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21381,
                        "src": "33888:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21363,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "33888:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21366,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21381,
                        "src": "33900:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21365,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "33900:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "33851:60:101"
                  },
                  "returnParameters": {
                    "id": 21368,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "33926:0:101"
                  },
                  "scope": 25062,
                  "src": "33839:189:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21403,
                    "nodeType": "Block",
                    "src": "34103:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c626f6f6c2c75696e742c75696e7429",
                                  "id": 21395,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "34147:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_5dbff038873b5f716761e9dcaab0713a903ceaebb2ba8c30b199c4dc534f7701",
                                    "typeString": "literal_string \"log(string,bool,uint,uint)\""
                                  },
                                  "value": "log(string,bool,uint,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21396,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21383,
                                  "src": "34177:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21397,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21385,
                                  "src": "34181:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21398,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21387,
                                  "src": "34185:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21399,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21389,
                                  "src": "34189:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_5dbff038873b5f716761e9dcaab0713a903ceaebb2ba8c30b199c4dc534f7701",
                                    "typeString": "literal_string \"log(string,bool,uint,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21393,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "34123:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21394,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "34123:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21400,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "34123:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21392,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "34107:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21401,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "34107:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21402,
                        "nodeType": "ExpressionStatement",
                        "src": "34107:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21404,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21390,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21383,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21404,
                        "src": "34044:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21382,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "34044:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21385,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21404,
                        "src": "34062:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21384,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "34062:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21387,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21404,
                        "src": "34071:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 21386,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "34071:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21389,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21404,
                        "src": "34080:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 21388,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "34080:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "34043:45:101"
                  },
                  "returnParameters": {
                    "id": 21391,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "34103:0:101"
                  },
                  "scope": 25062,
                  "src": "34031:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21426,
                    "nodeType": "Block",
                    "src": "34281:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c626f6f6c2c75696e742c737472696e6729",
                                  "id": 21418,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "34325:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_42b9a2274d0e9ab9211da679bc79f433c4055060036260a350e95cf10b9004ee",
                                    "typeString": "literal_string \"log(string,bool,uint,string)\""
                                  },
                                  "value": "log(string,bool,uint,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21419,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21406,
                                  "src": "34357:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21420,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21408,
                                  "src": "34361:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21421,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21410,
                                  "src": "34365:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21422,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21412,
                                  "src": "34369:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_42b9a2274d0e9ab9211da679bc79f433c4055060036260a350e95cf10b9004ee",
                                    "typeString": "literal_string \"log(string,bool,uint,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21416,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "34301:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21417,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "34301:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21423,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "34301:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21415,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "34285:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21424,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "34285:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21425,
                        "nodeType": "ExpressionStatement",
                        "src": "34285:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21427,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21413,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21406,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21427,
                        "src": "34213:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21405,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "34213:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21408,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21427,
                        "src": "34231:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21407,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "34231:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21410,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21427,
                        "src": "34240:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 21409,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "34240:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21412,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21427,
                        "src": "34249:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21411,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "34249:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "34212:54:101"
                  },
                  "returnParameters": {
                    "id": 21414,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "34281:0:101"
                  },
                  "scope": 25062,
                  "src": "34200:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21449,
                    "nodeType": "Block",
                    "src": "34452:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c626f6f6c2c75696e742c626f6f6c29",
                                  "id": 21441,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "34496:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_3cc5b5d38fa67d61ad4f760e2dab344ea54d36d39a7b72ff747c1e117e2289bb",
                                    "typeString": "literal_string \"log(string,bool,uint,bool)\""
                                  },
                                  "value": "log(string,bool,uint,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21442,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21429,
                                  "src": "34526:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21443,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21431,
                                  "src": "34530:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21444,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21433,
                                  "src": "34534:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21445,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21435,
                                  "src": "34538:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_3cc5b5d38fa67d61ad4f760e2dab344ea54d36d39a7b72ff747c1e117e2289bb",
                                    "typeString": "literal_string \"log(string,bool,uint,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21439,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "34472:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21440,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "34472:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21446,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "34472:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21438,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "34456:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21447,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "34456:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21448,
                        "nodeType": "ExpressionStatement",
                        "src": "34456:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21450,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21436,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21429,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21450,
                        "src": "34393:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21428,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "34393:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21431,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21450,
                        "src": "34411:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21430,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "34411:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21433,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21450,
                        "src": "34420:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 21432,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "34420:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21435,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21450,
                        "src": "34429:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21434,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "34429:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "34392:45:101"
                  },
                  "returnParameters": {
                    "id": 21437,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "34452:0:101"
                  },
                  "scope": 25062,
                  "src": "34380:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21472,
                    "nodeType": "Block",
                    "src": "34624:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c626f6f6c2c75696e742c6164647265737329",
                                  "id": 21464,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "34668:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_71d3850da171f493bcf1bd9faa0694f71484214d8459bca427251a9ad3e9bbd6",
                                    "typeString": "literal_string \"log(string,bool,uint,address)\""
                                  },
                                  "value": "log(string,bool,uint,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21465,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21452,
                                  "src": "34701:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21466,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21454,
                                  "src": "34705:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21467,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21456,
                                  "src": "34709:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21468,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21458,
                                  "src": "34713:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_71d3850da171f493bcf1bd9faa0694f71484214d8459bca427251a9ad3e9bbd6",
                                    "typeString": "literal_string \"log(string,bool,uint,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21462,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "34644:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21463,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "34644:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21469,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "34644:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21461,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "34628:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21470,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "34628:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21471,
                        "nodeType": "ExpressionStatement",
                        "src": "34628:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21473,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21459,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21452,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21473,
                        "src": "34562:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21451,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "34562:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21454,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21473,
                        "src": "34580:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21453,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "34580:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21456,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21473,
                        "src": "34589:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 21455,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "34589:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21458,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21473,
                        "src": "34598:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21457,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "34598:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "34561:48:101"
                  },
                  "returnParameters": {
                    "id": 21460,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "34624:0:101"
                  },
                  "scope": 25062,
                  "src": "34549:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21495,
                    "nodeType": "Block",
                    "src": "34805:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c626f6f6c2c737472696e672c75696e7429",
                                  "id": 21487,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "34849:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_34cb308d42fc37e3a239bcd0d717cf3713a336733737bee1d82ac9061e969d72",
                                    "typeString": "literal_string \"log(string,bool,string,uint)\""
                                  },
                                  "value": "log(string,bool,string,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21488,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21475,
                                  "src": "34881:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21489,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21477,
                                  "src": "34885:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21490,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21479,
                                  "src": "34889:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21491,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21481,
                                  "src": "34893:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_34cb308d42fc37e3a239bcd0d717cf3713a336733737bee1d82ac9061e969d72",
                                    "typeString": "literal_string \"log(string,bool,string,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21485,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "34825:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21486,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "34825:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21492,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "34825:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21484,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "34809:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21493,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "34809:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21494,
                        "nodeType": "ExpressionStatement",
                        "src": "34809:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21496,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21482,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21475,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21496,
                        "src": "34737:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21474,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "34737:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21477,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21496,
                        "src": "34755:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21476,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "34755:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21479,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21496,
                        "src": "34764:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21478,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "34764:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21481,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21496,
                        "src": "34782:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 21480,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "34782:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "34736:54:101"
                  },
                  "returnParameters": {
                    "id": 21483,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "34805:0:101"
                  },
                  "scope": 25062,
                  "src": "34724:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21518,
                    "nodeType": "Block",
                    "src": "34994:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c626f6f6c2c737472696e672c737472696e6729",
                                  "id": 21510,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "35038:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_a826caebc65f4a71211c1c7fd8dc9bdd856d7ef7dbeef42d8af156e9f73bc47d",
                                    "typeString": "literal_string \"log(string,bool,string,string)\""
                                  },
                                  "value": "log(string,bool,string,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21511,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21498,
                                  "src": "35072:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21512,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21500,
                                  "src": "35076:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21513,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21502,
                                  "src": "35080:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21514,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21504,
                                  "src": "35084:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_a826caebc65f4a71211c1c7fd8dc9bdd856d7ef7dbeef42d8af156e9f73bc47d",
                                    "typeString": "literal_string \"log(string,bool,string,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21508,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "35014:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21509,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "35014:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21515,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "35014:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21507,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "34998:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21516,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "34998:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21517,
                        "nodeType": "ExpressionStatement",
                        "src": "34998:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21519,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21505,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21498,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21519,
                        "src": "34917:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21497,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "34917:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21500,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21519,
                        "src": "34935:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21499,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "34935:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21502,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21519,
                        "src": "34944:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21501,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "34944:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21504,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21519,
                        "src": "34962:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21503,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "34962:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "34916:63:101"
                  },
                  "returnParameters": {
                    "id": 21506,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "34994:0:101"
                  },
                  "scope": 25062,
                  "src": "34904:188:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21541,
                    "nodeType": "Block",
                    "src": "35176:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c626f6f6c2c737472696e672c626f6f6c29",
                                  "id": 21533,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "35220:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_3f8a701d00386d6ad9c7b7a930805b985bcbbe108e894a7d5cb9493e87e57e8b",
                                    "typeString": "literal_string \"log(string,bool,string,bool)\""
                                  },
                                  "value": "log(string,bool,string,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21534,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21521,
                                  "src": "35252:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21535,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21523,
                                  "src": "35256:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21536,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21525,
                                  "src": "35260:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21537,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21527,
                                  "src": "35264:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_3f8a701d00386d6ad9c7b7a930805b985bcbbe108e894a7d5cb9493e87e57e8b",
                                    "typeString": "literal_string \"log(string,bool,string,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21531,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "35196:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21532,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "35196:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21538,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "35196:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21530,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "35180:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21539,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "35180:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21540,
                        "nodeType": "ExpressionStatement",
                        "src": "35180:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21542,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21528,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21521,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21542,
                        "src": "35108:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21520,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "35108:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21523,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21542,
                        "src": "35126:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21522,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "35126:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21525,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21542,
                        "src": "35135:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21524,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "35135:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21527,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21542,
                        "src": "35153:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21526,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "35153:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "35107:54:101"
                  },
                  "returnParameters": {
                    "id": 21529,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "35176:0:101"
                  },
                  "scope": 25062,
                  "src": "35095:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21564,
                    "nodeType": "Block",
                    "src": "35359:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c626f6f6c2c737472696e672c6164647265737329",
                                  "id": 21556,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "35403:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_e0625b292fa5cbc865b55f61713cbbe0ce7abb244ec2df45291ea19c30ddfaf8",
                                    "typeString": "literal_string \"log(string,bool,string,address)\""
                                  },
                                  "value": "log(string,bool,string,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21557,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21544,
                                  "src": "35438:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21558,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21546,
                                  "src": "35442:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21559,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21548,
                                  "src": "35446:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21560,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21550,
                                  "src": "35450:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_e0625b292fa5cbc865b55f61713cbbe0ce7abb244ec2df45291ea19c30ddfaf8",
                                    "typeString": "literal_string \"log(string,bool,string,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21554,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "35379:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21555,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "35379:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21561,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "35379:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21553,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "35363:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21562,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "35363:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21563,
                        "nodeType": "ExpressionStatement",
                        "src": "35363:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21565,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21551,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21544,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21565,
                        "src": "35288:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21543,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "35288:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21546,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21565,
                        "src": "35306:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21545,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "35306:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21548,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21565,
                        "src": "35315:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21547,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "35315:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21550,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21565,
                        "src": "35333:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21549,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "35333:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "35287:57:101"
                  },
                  "returnParameters": {
                    "id": 21552,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "35359:0:101"
                  },
                  "scope": 25062,
                  "src": "35275:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21587,
                    "nodeType": "Block",
                    "src": "35533:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c626f6f6c2c626f6f6c2c75696e7429",
                                  "id": 21579,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "35577:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_807531e8eafdd7a15a803e586dd9a01b2aa8ae2cdd52f093775c0dcb0c977edf",
                                    "typeString": "literal_string \"log(string,bool,bool,uint)\""
                                  },
                                  "value": "log(string,bool,bool,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21580,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21567,
                                  "src": "35607:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21581,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21569,
                                  "src": "35611:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21582,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21571,
                                  "src": "35615:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21583,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21573,
                                  "src": "35619:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_807531e8eafdd7a15a803e586dd9a01b2aa8ae2cdd52f093775c0dcb0c977edf",
                                    "typeString": "literal_string \"log(string,bool,bool,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21577,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "35553:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21578,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "35553:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21584,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "35553:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21576,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "35537:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21585,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "35537:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21586,
                        "nodeType": "ExpressionStatement",
                        "src": "35537:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21588,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21574,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21567,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21588,
                        "src": "35474:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21566,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "35474:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21569,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21588,
                        "src": "35492:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21568,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "35492:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21571,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21588,
                        "src": "35501:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21570,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "35501:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21573,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21588,
                        "src": "35510:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 21572,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "35510:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "35473:45:101"
                  },
                  "returnParameters": {
                    "id": 21575,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "35533:0:101"
                  },
                  "scope": 25062,
                  "src": "35461:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21610,
                    "nodeType": "Block",
                    "src": "35711:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c626f6f6c2c626f6f6c2c737472696e6729",
                                  "id": 21602,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "35755:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_9d22d5dd5fa6b44920526f32944af8a0b12651bcfe7d5e4d9330573146eaf058",
                                    "typeString": "literal_string \"log(string,bool,bool,string)\""
                                  },
                                  "value": "log(string,bool,bool,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21603,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21590,
                                  "src": "35787:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21604,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21592,
                                  "src": "35791:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21605,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21594,
                                  "src": "35795:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21606,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21596,
                                  "src": "35799:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_9d22d5dd5fa6b44920526f32944af8a0b12651bcfe7d5e4d9330573146eaf058",
                                    "typeString": "literal_string \"log(string,bool,bool,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21600,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "35731:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21601,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "35731:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21607,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "35731:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21599,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "35715:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21608,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "35715:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21609,
                        "nodeType": "ExpressionStatement",
                        "src": "35715:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21611,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21597,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21590,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21611,
                        "src": "35643:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21589,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "35643:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21592,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21611,
                        "src": "35661:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21591,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "35661:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21594,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21611,
                        "src": "35670:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21593,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "35670:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21596,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21611,
                        "src": "35679:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21595,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "35679:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "35642:54:101"
                  },
                  "returnParameters": {
                    "id": 21598,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "35711:0:101"
                  },
                  "scope": 25062,
                  "src": "35630:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21633,
                    "nodeType": "Block",
                    "src": "35882:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c626f6f6c2c626f6f6c2c626f6f6c29",
                                  "id": 21625,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "35926:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_895af8c5b50078ceec3119054e20583155eeb3e1a8f56b8ed56efbec57456ad2",
                                    "typeString": "literal_string \"log(string,bool,bool,bool)\""
                                  },
                                  "value": "log(string,bool,bool,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21626,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21613,
                                  "src": "35956:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21627,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21615,
                                  "src": "35960:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21628,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21617,
                                  "src": "35964:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21629,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21619,
                                  "src": "35968:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_895af8c5b50078ceec3119054e20583155eeb3e1a8f56b8ed56efbec57456ad2",
                                    "typeString": "literal_string \"log(string,bool,bool,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21623,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "35902:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21624,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "35902:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21630,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "35902:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21622,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "35886:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21631,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "35886:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21632,
                        "nodeType": "ExpressionStatement",
                        "src": "35886:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21634,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21620,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21613,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21634,
                        "src": "35823:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21612,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "35823:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21615,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21634,
                        "src": "35841:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21614,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "35841:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21617,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21634,
                        "src": "35850:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21616,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "35850:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21619,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21634,
                        "src": "35859:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21618,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "35859:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "35822:45:101"
                  },
                  "returnParameters": {
                    "id": 21621,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "35882:0:101"
                  },
                  "scope": 25062,
                  "src": "35810:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21656,
                    "nodeType": "Block",
                    "src": "36054:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c626f6f6c2c626f6f6c2c6164647265737329",
                                  "id": 21648,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "36098:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_7190a529624f3e9168945b9053b9648f6439313f31cad0801b50f9dc38a45d4d",
                                    "typeString": "literal_string \"log(string,bool,bool,address)\""
                                  },
                                  "value": "log(string,bool,bool,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21649,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21636,
                                  "src": "36131:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21650,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21638,
                                  "src": "36135:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21651,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21640,
                                  "src": "36139:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21652,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21642,
                                  "src": "36143:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_7190a529624f3e9168945b9053b9648f6439313f31cad0801b50f9dc38a45d4d",
                                    "typeString": "literal_string \"log(string,bool,bool,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21646,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "36074:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21647,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "36074:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21653,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "36074:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21645,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "36058:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21654,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "36058:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21655,
                        "nodeType": "ExpressionStatement",
                        "src": "36058:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21657,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21643,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21636,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21657,
                        "src": "35992:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21635,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "35992:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21638,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21657,
                        "src": "36010:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21637,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "36010:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21640,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21657,
                        "src": "36019:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21639,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "36019:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21642,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21657,
                        "src": "36028:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21641,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "36028:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "35991:48:101"
                  },
                  "returnParameters": {
                    "id": 21644,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "36054:0:101"
                  },
                  "scope": 25062,
                  "src": "35979:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21679,
                    "nodeType": "Block",
                    "src": "36229:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c626f6f6c2c616464726573732c75696e7429",
                                  "id": 21671,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "36273:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_28df4e96d50017c69e64253ea877c992512b689fb9fed17cf6af78f104f1200b",
                                    "typeString": "literal_string \"log(string,bool,address,uint)\""
                                  },
                                  "value": "log(string,bool,address,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21672,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21659,
                                  "src": "36306:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21673,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21661,
                                  "src": "36310:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21674,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21663,
                                  "src": "36314:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21675,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21665,
                                  "src": "36318:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_28df4e96d50017c69e64253ea877c992512b689fb9fed17cf6af78f104f1200b",
                                    "typeString": "literal_string \"log(string,bool,address,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21669,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "36249:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21670,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "36249:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21676,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "36249:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21668,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "36233:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21677,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "36233:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21678,
                        "nodeType": "ExpressionStatement",
                        "src": "36233:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21680,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21666,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21659,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21680,
                        "src": "36167:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21658,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "36167:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21661,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21680,
                        "src": "36185:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21660,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "36185:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21663,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21680,
                        "src": "36194:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21662,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "36194:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21665,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21680,
                        "src": "36206:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 21664,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "36206:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "36166:48:101"
                  },
                  "returnParameters": {
                    "id": 21667,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "36229:0:101"
                  },
                  "scope": 25062,
                  "src": "36154:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21702,
                    "nodeType": "Block",
                    "src": "36413:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c626f6f6c2c616464726573732c737472696e6729",
                                  "id": 21694,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "36457:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_2d8e33a4e52268aad313274a8446eec6f40466a28da2456a8f12d83b298c13ef",
                                    "typeString": "literal_string \"log(string,bool,address,string)\""
                                  },
                                  "value": "log(string,bool,address,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21695,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21682,
                                  "src": "36492:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21696,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21684,
                                  "src": "36496:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21697,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21686,
                                  "src": "36500:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21698,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21688,
                                  "src": "36504:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_2d8e33a4e52268aad313274a8446eec6f40466a28da2456a8f12d83b298c13ef",
                                    "typeString": "literal_string \"log(string,bool,address,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21692,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "36433:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21693,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "36433:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21699,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "36433:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21691,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "36417:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21700,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "36417:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21701,
                        "nodeType": "ExpressionStatement",
                        "src": "36417:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21703,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21689,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21682,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21703,
                        "src": "36342:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21681,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "36342:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21684,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21703,
                        "src": "36360:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21683,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "36360:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21686,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21703,
                        "src": "36369:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21685,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "36369:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21688,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21703,
                        "src": "36381:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21687,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "36381:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "36341:57:101"
                  },
                  "returnParameters": {
                    "id": 21690,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "36413:0:101"
                  },
                  "scope": 25062,
                  "src": "36329:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21725,
                    "nodeType": "Block",
                    "src": "36590:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c626f6f6c2c616464726573732c626f6f6c29",
                                  "id": 21717,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "36634:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_958c28c6e7bd79de7ce7f6f112cbcb194d9e383764dfb947492ee1374ff5c482",
                                    "typeString": "literal_string \"log(string,bool,address,bool)\""
                                  },
                                  "value": "log(string,bool,address,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21718,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21705,
                                  "src": "36667:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21719,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21707,
                                  "src": "36671:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21720,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21709,
                                  "src": "36675:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21721,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21711,
                                  "src": "36679:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_958c28c6e7bd79de7ce7f6f112cbcb194d9e383764dfb947492ee1374ff5c482",
                                    "typeString": "literal_string \"log(string,bool,address,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21715,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "36610:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21716,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "36610:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21722,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "36610:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21714,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "36594:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21723,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "36594:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21724,
                        "nodeType": "ExpressionStatement",
                        "src": "36594:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21726,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21712,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21705,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21726,
                        "src": "36528:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21704,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "36528:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21707,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21726,
                        "src": "36546:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21706,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "36546:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21709,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21726,
                        "src": "36555:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21708,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "36555:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21711,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21726,
                        "src": "36567:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21710,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "36567:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "36527:48:101"
                  },
                  "returnParameters": {
                    "id": 21713,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "36590:0:101"
                  },
                  "scope": 25062,
                  "src": "36515:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21748,
                    "nodeType": "Block",
                    "src": "36768:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c626f6f6c2c616464726573732c6164647265737329",
                                  "id": 21740,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "36812:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_33e9dd1deb33816160eb59d86987de501b214bedbbe3c70103eff4092834b53d",
                                    "typeString": "literal_string \"log(string,bool,address,address)\""
                                  },
                                  "value": "log(string,bool,address,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21741,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21728,
                                  "src": "36848:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21742,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21730,
                                  "src": "36852:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21743,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21732,
                                  "src": "36856:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21744,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21734,
                                  "src": "36860:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_33e9dd1deb33816160eb59d86987de501b214bedbbe3c70103eff4092834b53d",
                                    "typeString": "literal_string \"log(string,bool,address,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21738,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "36788:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21739,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "36788:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21745,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "36788:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21737,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "36772:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21746,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "36772:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21747,
                        "nodeType": "ExpressionStatement",
                        "src": "36772:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21749,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21735,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21728,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21749,
                        "src": "36703:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21727,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "36703:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21730,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21749,
                        "src": "36721:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21729,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "36721:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21732,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21749,
                        "src": "36730:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21731,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "36730:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21734,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21749,
                        "src": "36742:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21733,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "36742:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "36702:51:101"
                  },
                  "returnParameters": {
                    "id": 21736,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "36768:0:101"
                  },
                  "scope": 25062,
                  "src": "36690:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21771,
                    "nodeType": "Block",
                    "src": "36946:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c616464726573732c75696e742c75696e7429",
                                  "id": 21763,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "36990:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_daa394bd4914eaece965f4173c7699746dff411e470b03385f052bd7b13f1bd3",
                                    "typeString": "literal_string \"log(string,address,uint,uint)\""
                                  },
                                  "value": "log(string,address,uint,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21764,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21751,
                                  "src": "37023:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21765,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21753,
                                  "src": "37027:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21766,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21755,
                                  "src": "37031:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21767,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21757,
                                  "src": "37035:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_daa394bd4914eaece965f4173c7699746dff411e470b03385f052bd7b13f1bd3",
                                    "typeString": "literal_string \"log(string,address,uint,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21761,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "36966:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21762,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "36966:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21768,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "36966:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21760,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "36950:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21769,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "36950:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21770,
                        "nodeType": "ExpressionStatement",
                        "src": "36950:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21772,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21758,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21751,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21772,
                        "src": "36884:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21750,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "36884:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21753,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21772,
                        "src": "36902:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21752,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "36902:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21755,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21772,
                        "src": "36914:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 21754,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "36914:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21757,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21772,
                        "src": "36923:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 21756,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "36923:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "36883:48:101"
                  },
                  "returnParameters": {
                    "id": 21759,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "36946:0:101"
                  },
                  "scope": 25062,
                  "src": "36871:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21794,
                    "nodeType": "Block",
                    "src": "37130:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c616464726573732c75696e742c737472696e6729",
                                  "id": 21786,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "37174:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_4c55f234d048f08e770926729ee5d8a9c70d6b9a607ce037165c7e0f36155a98",
                                    "typeString": "literal_string \"log(string,address,uint,string)\""
                                  },
                                  "value": "log(string,address,uint,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21787,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21774,
                                  "src": "37209:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21788,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21776,
                                  "src": "37213:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21789,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21778,
                                  "src": "37217:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21790,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21780,
                                  "src": "37221:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_4c55f234d048f08e770926729ee5d8a9c70d6b9a607ce037165c7e0f36155a98",
                                    "typeString": "literal_string \"log(string,address,uint,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21784,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "37150:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21785,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "37150:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21791,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "37150:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21783,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "37134:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21792,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "37134:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21793,
                        "nodeType": "ExpressionStatement",
                        "src": "37134:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21795,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21781,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21774,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21795,
                        "src": "37059:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21773,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "37059:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21776,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21795,
                        "src": "37077:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21775,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "37077:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21778,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21795,
                        "src": "37089:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 21777,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "37089:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21780,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21795,
                        "src": "37098:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21779,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "37098:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "37058:57:101"
                  },
                  "returnParameters": {
                    "id": 21782,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "37130:0:101"
                  },
                  "scope": 25062,
                  "src": "37046:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21817,
                    "nodeType": "Block",
                    "src": "37307:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c616464726573732c75696e742c626f6f6c29",
                                  "id": 21809,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "37351:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_5ac1c13c91f65a91284d9d77ba7484e75b0a3dd9b57a01fd497babb7d6ebc554",
                                    "typeString": "literal_string \"log(string,address,uint,bool)\""
                                  },
                                  "value": "log(string,address,uint,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21810,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21797,
                                  "src": "37384:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21811,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21799,
                                  "src": "37388:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21812,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21801,
                                  "src": "37392:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21813,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21803,
                                  "src": "37396:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_5ac1c13c91f65a91284d9d77ba7484e75b0a3dd9b57a01fd497babb7d6ebc554",
                                    "typeString": "literal_string \"log(string,address,uint,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21807,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "37327:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21808,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "37327:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21814,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "37327:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21806,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "37311:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21815,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "37311:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21816,
                        "nodeType": "ExpressionStatement",
                        "src": "37311:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21818,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21804,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21797,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21818,
                        "src": "37245:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21796,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "37245:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21799,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21818,
                        "src": "37263:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21798,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "37263:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21801,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21818,
                        "src": "37275:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 21800,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "37275:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21803,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21818,
                        "src": "37284:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21802,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "37284:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "37244:48:101"
                  },
                  "returnParameters": {
                    "id": 21805,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "37307:0:101"
                  },
                  "scope": 25062,
                  "src": "37232:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21840,
                    "nodeType": "Block",
                    "src": "37485:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c616464726573732c75696e742c6164647265737329",
                                  "id": 21832,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "37529:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_a366ec808c8af1aa091e8102642939a99436cf04d3dfac2ae23c299404f821b2",
                                    "typeString": "literal_string \"log(string,address,uint,address)\""
                                  },
                                  "value": "log(string,address,uint,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21833,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21820,
                                  "src": "37565:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21834,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21822,
                                  "src": "37569:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21835,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21824,
                                  "src": "37573:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21836,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21826,
                                  "src": "37577:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_a366ec808c8af1aa091e8102642939a99436cf04d3dfac2ae23c299404f821b2",
                                    "typeString": "literal_string \"log(string,address,uint,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21830,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "37505:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21831,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "37505:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21837,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "37505:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21829,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "37489:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21838,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "37489:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21839,
                        "nodeType": "ExpressionStatement",
                        "src": "37489:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21841,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21827,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21820,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21841,
                        "src": "37420:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21819,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "37420:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21822,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21841,
                        "src": "37438:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21821,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "37438:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21824,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21841,
                        "src": "37450:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 21823,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "37450:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21826,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21841,
                        "src": "37459:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21825,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "37459:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "37419:51:101"
                  },
                  "returnParameters": {
                    "id": 21828,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "37485:0:101"
                  },
                  "scope": 25062,
                  "src": "37407:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21863,
                    "nodeType": "Block",
                    "src": "37672:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c616464726573732c737472696e672c75696e7429",
                                  "id": 21855,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "37716:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_8f624be9ea3983abac9c65ced8f562a492ebb84e6f74cd40f35387eff4d66349",
                                    "typeString": "literal_string \"log(string,address,string,uint)\""
                                  },
                                  "value": "log(string,address,string,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21856,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21843,
                                  "src": "37751:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21857,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21845,
                                  "src": "37755:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21858,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21847,
                                  "src": "37759:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21859,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21849,
                                  "src": "37763:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_8f624be9ea3983abac9c65ced8f562a492ebb84e6f74cd40f35387eff4d66349",
                                    "typeString": "literal_string \"log(string,address,string,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21853,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "37692:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21854,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "37692:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21860,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "37692:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21852,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "37676:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21861,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "37676:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21862,
                        "nodeType": "ExpressionStatement",
                        "src": "37676:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21864,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21850,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21843,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21864,
                        "src": "37601:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21842,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "37601:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21845,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21864,
                        "src": "37619:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21844,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "37619:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21847,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21864,
                        "src": "37631:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21846,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "37631:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21849,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21864,
                        "src": "37649:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 21848,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "37649:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "37600:57:101"
                  },
                  "returnParameters": {
                    "id": 21851,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "37672:0:101"
                  },
                  "scope": 25062,
                  "src": "37588:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21886,
                    "nodeType": "Block",
                    "src": "37867:101:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c616464726573732c737472696e672c737472696e6729",
                                  "id": 21878,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "37911:35:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_245986f22170901865e76245a48ee28ce0127ca357f6ad576a72190e1d358797",
                                    "typeString": "literal_string \"log(string,address,string,string)\""
                                  },
                                  "value": "log(string,address,string,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21879,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21866,
                                  "src": "37948:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21880,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21868,
                                  "src": "37952:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21881,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21870,
                                  "src": "37956:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21882,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21872,
                                  "src": "37960:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_245986f22170901865e76245a48ee28ce0127ca357f6ad576a72190e1d358797",
                                    "typeString": "literal_string \"log(string,address,string,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21876,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "37887:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21877,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "37887:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21883,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "37887:76:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21875,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "37871:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21884,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "37871:93:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21885,
                        "nodeType": "ExpressionStatement",
                        "src": "37871:93:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21887,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21873,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21866,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21887,
                        "src": "37787:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21865,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "37787:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21868,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21887,
                        "src": "37805:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21867,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "37805:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21870,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21887,
                        "src": "37817:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21869,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "37817:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21872,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21887,
                        "src": "37835:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21871,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "37835:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "37786:66:101"
                  },
                  "returnParameters": {
                    "id": 21874,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "37867:0:101"
                  },
                  "scope": 25062,
                  "src": "37774:194:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21909,
                    "nodeType": "Block",
                    "src": "38055:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c616464726573732c737472696e672c626f6f6c29",
                                  "id": 21901,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "38099:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_5f15d28c15ddff15fba1c00f6a4975ae6af8b36c9b2a875bf59bd45049046154",
                                    "typeString": "literal_string \"log(string,address,string,bool)\""
                                  },
                                  "value": "log(string,address,string,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21902,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21889,
                                  "src": "38134:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21903,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21891,
                                  "src": "38138:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21904,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21893,
                                  "src": "38142:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21905,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21895,
                                  "src": "38146:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_5f15d28c15ddff15fba1c00f6a4975ae6af8b36c9b2a875bf59bd45049046154",
                                    "typeString": "literal_string \"log(string,address,string,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21899,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "38075:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21900,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "38075:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21906,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "38075:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21898,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "38059:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21907,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "38059:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21908,
                        "nodeType": "ExpressionStatement",
                        "src": "38059:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21910,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21896,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21889,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21910,
                        "src": "37984:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21888,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "37984:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21891,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21910,
                        "src": "38002:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21890,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "38002:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21893,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21910,
                        "src": "38014:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21892,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "38014:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21895,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21910,
                        "src": "38032:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21894,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "38032:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "37983:57:101"
                  },
                  "returnParameters": {
                    "id": 21897,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "38055:0:101"
                  },
                  "scope": 25062,
                  "src": "37971:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21932,
                    "nodeType": "Block",
                    "src": "38244:102:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c616464726573732c737472696e672c6164647265737329",
                                  "id": 21924,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "38288:36:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_aabc9a311ab49789834b120d81155a7fee846a9f0d4f740bbeb970770190c82d",
                                    "typeString": "literal_string \"log(string,address,string,address)\""
                                  },
                                  "value": "log(string,address,string,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21925,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21912,
                                  "src": "38326:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21926,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21914,
                                  "src": "38330:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21927,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21916,
                                  "src": "38334:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21928,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21918,
                                  "src": "38338:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_aabc9a311ab49789834b120d81155a7fee846a9f0d4f740bbeb970770190c82d",
                                    "typeString": "literal_string \"log(string,address,string,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21922,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "38264:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21923,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "38264:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21929,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "38264:77:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21921,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "38248:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21930,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "38248:94:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21931,
                        "nodeType": "ExpressionStatement",
                        "src": "38248:94:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21933,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21919,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21912,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21933,
                        "src": "38170:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21911,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "38170:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21914,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21933,
                        "src": "38188:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21913,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "38188:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21916,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21933,
                        "src": "38200:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21915,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "38200:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21918,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21933,
                        "src": "38218:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21917,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "38218:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "38169:60:101"
                  },
                  "returnParameters": {
                    "id": 21920,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "38244:0:101"
                  },
                  "scope": 25062,
                  "src": "38157:189:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21955,
                    "nodeType": "Block",
                    "src": "38424:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c616464726573732c626f6f6c2c75696e7429",
                                  "id": 21947,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "38468:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c5d1bb8ba57e795e9925065473f653a381a99be37bdcfbeaf49f38097f35af7f",
                                    "typeString": "literal_string \"log(string,address,bool,uint)\""
                                  },
                                  "value": "log(string,address,bool,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21948,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21935,
                                  "src": "38501:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21949,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21937,
                                  "src": "38505:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21950,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21939,
                                  "src": "38509:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21951,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21941,
                                  "src": "38513:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_c5d1bb8ba57e795e9925065473f653a381a99be37bdcfbeaf49f38097f35af7f",
                                    "typeString": "literal_string \"log(string,address,bool,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21945,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "38444:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21946,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "38444:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21952,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "38444:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21944,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "38428:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21953,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "38428:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21954,
                        "nodeType": "ExpressionStatement",
                        "src": "38428:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21956,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21942,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21935,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21956,
                        "src": "38362:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21934,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "38362:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21937,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21956,
                        "src": "38380:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21936,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "38380:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21939,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21956,
                        "src": "38392:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21938,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "38392:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21941,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21956,
                        "src": "38401:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 21940,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "38401:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "38361:48:101"
                  },
                  "returnParameters": {
                    "id": 21943,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "38424:0:101"
                  },
                  "scope": 25062,
                  "src": "38349:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 21978,
                    "nodeType": "Block",
                    "src": "38608:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c616464726573732c626f6f6c2c737472696e6729",
                                  "id": 21970,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "38652:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_0454c0793d4a41e5f630eb9a887926f8a67ff9e817a5feb968698354ac9d22fb",
                                    "typeString": "literal_string \"log(string,address,bool,string)\""
                                  },
                                  "value": "log(string,address,bool,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21971,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21958,
                                  "src": "38687:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21972,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21960,
                                  "src": "38691:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21973,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21962,
                                  "src": "38695:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21974,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21964,
                                  "src": "38699:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_0454c0793d4a41e5f630eb9a887926f8a67ff9e817a5feb968698354ac9d22fb",
                                    "typeString": "literal_string \"log(string,address,bool,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21968,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "38628:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21969,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "38628:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21975,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "38628:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21967,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "38612:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21976,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "38612:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 21977,
                        "nodeType": "ExpressionStatement",
                        "src": "38612:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 21979,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21965,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21958,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21979,
                        "src": "38537:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21957,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "38537:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21960,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21979,
                        "src": "38555:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21959,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "38555:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21962,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21979,
                        "src": "38567:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21961,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "38567:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21964,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 21979,
                        "src": "38576:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21963,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "38576:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "38536:57:101"
                  },
                  "returnParameters": {
                    "id": 21966,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "38608:0:101"
                  },
                  "scope": 25062,
                  "src": "38524:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22001,
                    "nodeType": "Block",
                    "src": "38785:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c616464726573732c626f6f6c2c626f6f6c29",
                                  "id": 21993,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "38829:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_79884c2bc85eb73c854df1610df373a05f191b834f79cd47a7ab28be2308c039",
                                    "typeString": "literal_string \"log(string,address,bool,bool)\""
                                  },
                                  "value": "log(string,address,bool,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21994,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21981,
                                  "src": "38862:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21995,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21983,
                                  "src": "38866:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21996,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21985,
                                  "src": "38870:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 21997,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 21987,
                                  "src": "38874:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_79884c2bc85eb73c854df1610df373a05f191b834f79cd47a7ab28be2308c039",
                                    "typeString": "literal_string \"log(string,address,bool,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 21991,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "38805:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 21992,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "38805:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 21998,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "38805:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 21990,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "38789:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 21999,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "38789:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22000,
                        "nodeType": "ExpressionStatement",
                        "src": "38789:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22002,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 21988,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 21981,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22002,
                        "src": "38723:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 21980,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "38723:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21983,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22002,
                        "src": "38741:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 21982,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "38741:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21985,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22002,
                        "src": "38753:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21984,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "38753:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 21987,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22002,
                        "src": "38762:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 21986,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "38762:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "38722:48:101"
                  },
                  "returnParameters": {
                    "id": 21989,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "38785:0:101"
                  },
                  "scope": 25062,
                  "src": "38710:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22024,
                    "nodeType": "Block",
                    "src": "38963:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c616464726573732c626f6f6c2c6164647265737329",
                                  "id": 22016,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "39007:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_223603bd064d72559a7d519ad0f1c6a8da707a49f5718dfa23a5ccb01bf9ab76",
                                    "typeString": "literal_string \"log(string,address,bool,address)\""
                                  },
                                  "value": "log(string,address,bool,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22017,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22004,
                                  "src": "39043:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22018,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22006,
                                  "src": "39047:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22019,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22008,
                                  "src": "39051:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22020,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22010,
                                  "src": "39055:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_223603bd064d72559a7d519ad0f1c6a8da707a49f5718dfa23a5ccb01bf9ab76",
                                    "typeString": "literal_string \"log(string,address,bool,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22014,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "38983:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22015,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "38983:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22021,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "38983:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22013,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "38967:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22022,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "38967:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22023,
                        "nodeType": "ExpressionStatement",
                        "src": "38967:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22025,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22011,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22004,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22025,
                        "src": "38898:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22003,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "38898:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22006,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22025,
                        "src": "38916:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22005,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "38916:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22008,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22025,
                        "src": "38928:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22007,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "38928:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22010,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22025,
                        "src": "38937:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22009,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "38937:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "38897:51:101"
                  },
                  "returnParameters": {
                    "id": 22012,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "38963:0:101"
                  },
                  "scope": 25062,
                  "src": "38885:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22047,
                    "nodeType": "Block",
                    "src": "39144:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c616464726573732c616464726573732c75696e7429",
                                  "id": 22039,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "39188:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_6eb7943d4272e495e7f5cdeb25ef89b9c3c1042d5c1e0e6e11a8fdc842ff5e02",
                                    "typeString": "literal_string \"log(string,address,address,uint)\""
                                  },
                                  "value": "log(string,address,address,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22040,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22027,
                                  "src": "39224:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22041,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22029,
                                  "src": "39228:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22042,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22031,
                                  "src": "39232:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22043,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22033,
                                  "src": "39236:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_6eb7943d4272e495e7f5cdeb25ef89b9c3c1042d5c1e0e6e11a8fdc842ff5e02",
                                    "typeString": "literal_string \"log(string,address,address,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22037,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "39164:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22038,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "39164:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22044,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "39164:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22036,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "39148:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22045,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "39148:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22046,
                        "nodeType": "ExpressionStatement",
                        "src": "39148:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22048,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22034,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22027,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22048,
                        "src": "39079:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22026,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "39079:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22029,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22048,
                        "src": "39097:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22028,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "39097:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22031,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22048,
                        "src": "39109:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22030,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "39109:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22033,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22048,
                        "src": "39121:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22032,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "39121:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "39078:51:101"
                  },
                  "returnParameters": {
                    "id": 22035,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "39144:0:101"
                  },
                  "scope": 25062,
                  "src": "39066:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22070,
                    "nodeType": "Block",
                    "src": "39334:102:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c616464726573732c616464726573732c737472696e6729",
                                  "id": 22062,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "39378:36:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_800a1c6756a402b6162ca8653fd8e87e2c52d1c019c876e92eb2980479636a76",
                                    "typeString": "literal_string \"log(string,address,address,string)\""
                                  },
                                  "value": "log(string,address,address,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22063,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22050,
                                  "src": "39416:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22064,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22052,
                                  "src": "39420:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22065,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22054,
                                  "src": "39424:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22066,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22056,
                                  "src": "39428:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_800a1c6756a402b6162ca8653fd8e87e2c52d1c019c876e92eb2980479636a76",
                                    "typeString": "literal_string \"log(string,address,address,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22060,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "39354:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22061,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "39354:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22067,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "39354:77:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22059,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "39338:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22068,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "39338:94:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22069,
                        "nodeType": "ExpressionStatement",
                        "src": "39338:94:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22071,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22057,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22050,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22071,
                        "src": "39260:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22049,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "39260:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22052,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22071,
                        "src": "39278:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22051,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "39278:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22054,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22071,
                        "src": "39290:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22053,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "39290:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22056,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22071,
                        "src": "39302:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22055,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "39302:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "39259:60:101"
                  },
                  "returnParameters": {
                    "id": 22058,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "39334:0:101"
                  },
                  "scope": 25062,
                  "src": "39247:189:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22093,
                    "nodeType": "Block",
                    "src": "39517:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c616464726573732c616464726573732c626f6f6c29",
                                  "id": 22085,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "39561:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_b59dbd60587b4eeae521d5427cbc88bff32729f88aff059e7deb0a3a4320aaf4",
                                    "typeString": "literal_string \"log(string,address,address,bool)\""
                                  },
                                  "value": "log(string,address,address,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22086,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22073,
                                  "src": "39597:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22087,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22075,
                                  "src": "39601:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22088,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22077,
                                  "src": "39605:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22089,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22079,
                                  "src": "39609:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_b59dbd60587b4eeae521d5427cbc88bff32729f88aff059e7deb0a3a4320aaf4",
                                    "typeString": "literal_string \"log(string,address,address,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22083,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "39537:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22084,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "39537:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22090,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "39537:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22082,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "39521:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22091,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "39521:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22092,
                        "nodeType": "ExpressionStatement",
                        "src": "39521:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22094,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22080,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22073,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22094,
                        "src": "39452:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22072,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "39452:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22075,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22094,
                        "src": "39470:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22074,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "39470:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22077,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22094,
                        "src": "39482:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22076,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "39482:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22079,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22094,
                        "src": "39494:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22078,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "39494:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "39451:51:101"
                  },
                  "returnParameters": {
                    "id": 22081,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "39517:0:101"
                  },
                  "scope": 25062,
                  "src": "39439:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22116,
                    "nodeType": "Block",
                    "src": "39701:103:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728737472696e672c616464726573732c616464726573732c6164647265737329",
                                  "id": 22108,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "39745:37:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_ed8f28f6f4b5d54b1d37f705e543f556805f28b9d1bb3aef0ef7e57ef4992d15",
                                    "typeString": "literal_string \"log(string,address,address,address)\""
                                  },
                                  "value": "log(string,address,address,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22109,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22096,
                                  "src": "39784:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22110,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22098,
                                  "src": "39788:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22111,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22100,
                                  "src": "39792:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22112,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22102,
                                  "src": "39796:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_ed8f28f6f4b5d54b1d37f705e543f556805f28b9d1bb3aef0ef7e57ef4992d15",
                                    "typeString": "literal_string \"log(string,address,address,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22106,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "39721:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22107,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "39721:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22113,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "39721:78:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22105,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "39705:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22114,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "39705:95:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22115,
                        "nodeType": "ExpressionStatement",
                        "src": "39705:95:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22117,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22103,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22096,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22117,
                        "src": "39633:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22095,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "39633:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22098,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22117,
                        "src": "39651:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22097,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "39651:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22100,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22117,
                        "src": "39663:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22099,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "39663:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22102,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22117,
                        "src": "39675:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22101,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "39675:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "39632:54:101"
                  },
                  "returnParameters": {
                    "id": 22104,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "39701:0:101"
                  },
                  "scope": 25062,
                  "src": "39620:184:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22139,
                    "nodeType": "Block",
                    "src": "39870:92:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c75696e742c75696e742c75696e7429",
                                  "id": 22131,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "39914:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_32dfa524f720faf836764864b46011dc5eb74e494d57e12b294a68048585d558",
                                    "typeString": "literal_string \"log(bool,uint,uint,uint)\""
                                  },
                                  "value": "log(bool,uint,uint,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22132,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22119,
                                  "src": "39942:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22133,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22121,
                                  "src": "39946:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22134,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22123,
                                  "src": "39950:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22135,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22125,
                                  "src": "39954:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_32dfa524f720faf836764864b46011dc5eb74e494d57e12b294a68048585d558",
                                    "typeString": "literal_string \"log(bool,uint,uint,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22129,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "39890:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22130,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "39890:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22136,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "39890:67:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22128,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "39874:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22137,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "39874:84:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22138,
                        "nodeType": "ExpressionStatement",
                        "src": "39874:84:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22140,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22126,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22119,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22140,
                        "src": "39820:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22118,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "39820:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22121,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22140,
                        "src": "39829:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22120,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "39829:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22123,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22140,
                        "src": "39838:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22122,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "39838:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22125,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22140,
                        "src": "39847:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22124,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "39847:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "39819:36:101"
                  },
                  "returnParameters": {
                    "id": 22127,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "39870:0:101"
                  },
                  "scope": 25062,
                  "src": "39807:155:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22162,
                    "nodeType": "Block",
                    "src": "40037:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c75696e742c75696e742c737472696e6729",
                                  "id": 22154,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "40081:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_da0666c89b01999f5c8980ce90fe9d0a367a350fd8d2ec7d1f94587b6281ebd3",
                                    "typeString": "literal_string \"log(bool,uint,uint,string)\""
                                  },
                                  "value": "log(bool,uint,uint,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22155,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22142,
                                  "src": "40111:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22156,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22144,
                                  "src": "40115:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22157,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22146,
                                  "src": "40119:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22158,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22148,
                                  "src": "40123:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_da0666c89b01999f5c8980ce90fe9d0a367a350fd8d2ec7d1f94587b6281ebd3",
                                    "typeString": "literal_string \"log(bool,uint,uint,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22152,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "40057:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22153,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "40057:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22159,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "40057:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22151,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "40041:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22160,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "40041:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22161,
                        "nodeType": "ExpressionStatement",
                        "src": "40041:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22163,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22149,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22142,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22163,
                        "src": "39978:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22141,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "39978:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22144,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22163,
                        "src": "39987:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22143,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "39987:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22146,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22163,
                        "src": "39996:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22145,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "39996:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22148,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22163,
                        "src": "40005:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22147,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "40005:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "39977:45:101"
                  },
                  "returnParameters": {
                    "id": 22150,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "40037:0:101"
                  },
                  "scope": 25062,
                  "src": "39965:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22185,
                    "nodeType": "Block",
                    "src": "40197:92:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c75696e742c75696e742c626f6f6c29",
                                  "id": 22177,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "40241:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_a41d81dec511172fa866e067fea22fe074eb6260a116ec078e2e0e79a7fd8ef2",
                                    "typeString": "literal_string \"log(bool,uint,uint,bool)\""
                                  },
                                  "value": "log(bool,uint,uint,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22178,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22165,
                                  "src": "40269:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22179,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22167,
                                  "src": "40273:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22180,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22169,
                                  "src": "40277:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22181,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22171,
                                  "src": "40281:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_a41d81dec511172fa866e067fea22fe074eb6260a116ec078e2e0e79a7fd8ef2",
                                    "typeString": "literal_string \"log(bool,uint,uint,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22175,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "40217:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22176,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "40217:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22182,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "40217:67:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22174,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "40201:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22183,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "40201:84:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22184,
                        "nodeType": "ExpressionStatement",
                        "src": "40201:84:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22186,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22172,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22165,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22186,
                        "src": "40147:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22164,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "40147:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22167,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22186,
                        "src": "40156:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22166,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "40156:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22169,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22186,
                        "src": "40165:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22168,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "40165:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22171,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22186,
                        "src": "40174:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22170,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "40174:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "40146:36:101"
                  },
                  "returnParameters": {
                    "id": 22173,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "40197:0:101"
                  },
                  "scope": 25062,
                  "src": "40134:155:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22208,
                    "nodeType": "Block",
                    "src": "40358:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c75696e742c75696e742c6164647265737329",
                                  "id": 22200,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "40402:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_f161b2216765f7746c6d62a843721a4e56fa83880464de0ff958770fd9704e33",
                                    "typeString": "literal_string \"log(bool,uint,uint,address)\""
                                  },
                                  "value": "log(bool,uint,uint,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22201,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22188,
                                  "src": "40433:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22202,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22190,
                                  "src": "40437:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22203,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22192,
                                  "src": "40441:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22204,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22194,
                                  "src": "40445:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_f161b2216765f7746c6d62a843721a4e56fa83880464de0ff958770fd9704e33",
                                    "typeString": "literal_string \"log(bool,uint,uint,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22198,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "40378:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22199,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "40378:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22205,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "40378:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22197,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "40362:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22206,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "40362:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22207,
                        "nodeType": "ExpressionStatement",
                        "src": "40362:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22209,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22195,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22188,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22209,
                        "src": "40305:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22187,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "40305:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22190,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22209,
                        "src": "40314:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22189,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "40314:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22192,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22209,
                        "src": "40323:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22191,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "40323:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22194,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22209,
                        "src": "40332:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22193,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "40332:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "40304:39:101"
                  },
                  "returnParameters": {
                    "id": 22196,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "40358:0:101"
                  },
                  "scope": 25062,
                  "src": "40292:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22231,
                    "nodeType": "Block",
                    "src": "40528:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c75696e742c737472696e672c75696e7429",
                                  "id": 22223,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "40572:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_4180011b79de474cdb825b6c4cfbc6d05927b06d92ab7c90ba7ff48d251e1813",
                                    "typeString": "literal_string \"log(bool,uint,string,uint)\""
                                  },
                                  "value": "log(bool,uint,string,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22224,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22211,
                                  "src": "40602:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22225,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22213,
                                  "src": "40606:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22226,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22215,
                                  "src": "40610:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22227,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22217,
                                  "src": "40614:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_4180011b79de474cdb825b6c4cfbc6d05927b06d92ab7c90ba7ff48d251e1813",
                                    "typeString": "literal_string \"log(bool,uint,string,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22221,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "40548:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22222,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "40548:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22228,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "40548:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22220,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "40532:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22229,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "40532:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22230,
                        "nodeType": "ExpressionStatement",
                        "src": "40532:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22232,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22218,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22211,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22232,
                        "src": "40469:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22210,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "40469:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22213,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22232,
                        "src": "40478:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22212,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "40478:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22215,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22232,
                        "src": "40487:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22214,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "40487:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22217,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22232,
                        "src": "40505:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22216,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "40505:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "40468:45:101"
                  },
                  "returnParameters": {
                    "id": 22219,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "40528:0:101"
                  },
                  "scope": 25062,
                  "src": "40456:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22254,
                    "nodeType": "Block",
                    "src": "40706:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c75696e742c737472696e672c737472696e6729",
                                  "id": 22246,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "40750:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_d32a654812cf9bc5514c83d6adb00987a26a725c531c254b4dfe4eef4cdfc8ee",
                                    "typeString": "literal_string \"log(bool,uint,string,string)\""
                                  },
                                  "value": "log(bool,uint,string,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22247,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22234,
                                  "src": "40782:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22248,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22236,
                                  "src": "40786:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22249,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22238,
                                  "src": "40790:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22250,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22240,
                                  "src": "40794:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_d32a654812cf9bc5514c83d6adb00987a26a725c531c254b4dfe4eef4cdfc8ee",
                                    "typeString": "literal_string \"log(bool,uint,string,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22244,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "40726:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22245,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "40726:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22251,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "40726:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22243,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "40710:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22252,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "40710:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22253,
                        "nodeType": "ExpressionStatement",
                        "src": "40710:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22255,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22241,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22234,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22255,
                        "src": "40638:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22233,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "40638:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22236,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22255,
                        "src": "40647:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22235,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "40647:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22238,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22255,
                        "src": "40656:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22237,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "40656:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22240,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22255,
                        "src": "40674:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22239,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "40674:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "40637:54:101"
                  },
                  "returnParameters": {
                    "id": 22242,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "40706:0:101"
                  },
                  "scope": 25062,
                  "src": "40625:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22277,
                    "nodeType": "Block",
                    "src": "40877:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c75696e742c737472696e672c626f6f6c29",
                                  "id": 22269,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "40921:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_91d2f813beb255a90e7ea595fb27355b60d93c3f818aac6b4c27388d34e0ea16",
                                    "typeString": "literal_string \"log(bool,uint,string,bool)\""
                                  },
                                  "value": "log(bool,uint,string,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22270,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22257,
                                  "src": "40951:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22271,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22259,
                                  "src": "40955:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22272,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22261,
                                  "src": "40959:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22273,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22263,
                                  "src": "40963:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_91d2f813beb255a90e7ea595fb27355b60d93c3f818aac6b4c27388d34e0ea16",
                                    "typeString": "literal_string \"log(bool,uint,string,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22267,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "40897:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22268,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "40897:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22274,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "40897:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22266,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "40881:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22275,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "40881:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22276,
                        "nodeType": "ExpressionStatement",
                        "src": "40881:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22278,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22264,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22257,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22278,
                        "src": "40818:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22256,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "40818:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22259,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22278,
                        "src": "40827:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22258,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "40827:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22261,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22278,
                        "src": "40836:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22260,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "40836:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22263,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22278,
                        "src": "40854:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22262,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "40854:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "40817:45:101"
                  },
                  "returnParameters": {
                    "id": 22265,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "40877:0:101"
                  },
                  "scope": 25062,
                  "src": "40805:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22300,
                    "nodeType": "Block",
                    "src": "41049:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c75696e742c737472696e672c6164647265737329",
                                  "id": 22292,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "41093:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_a5c70d29969a9ad21bdf8986348e5dc44eea151f64e0f90231a45219c4d0e3d5",
                                    "typeString": "literal_string \"log(bool,uint,string,address)\""
                                  },
                                  "value": "log(bool,uint,string,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22293,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22280,
                                  "src": "41126:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22294,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22282,
                                  "src": "41130:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22295,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22284,
                                  "src": "41134:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22296,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22286,
                                  "src": "41138:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_a5c70d29969a9ad21bdf8986348e5dc44eea151f64e0f90231a45219c4d0e3d5",
                                    "typeString": "literal_string \"log(bool,uint,string,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22290,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "41069:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22291,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "41069:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22297,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "41069:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22289,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "41053:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22298,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "41053:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22299,
                        "nodeType": "ExpressionStatement",
                        "src": "41053:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22301,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22287,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22280,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22301,
                        "src": "40987:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22279,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "40987:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22282,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22301,
                        "src": "40996:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22281,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "40996:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22284,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22301,
                        "src": "41005:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22283,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "41005:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22286,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22301,
                        "src": "41023:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22285,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "41023:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "40986:48:101"
                  },
                  "returnParameters": {
                    "id": 22288,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "41049:0:101"
                  },
                  "scope": 25062,
                  "src": "40974:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22323,
                    "nodeType": "Block",
                    "src": "41212:92:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c75696e742c626f6f6c2c75696e7429",
                                  "id": 22315,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "41256:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_d3de5593988099d08808f80d2a972ea3da18ecd746f0a3e437c530efaad65aa0",
                                    "typeString": "literal_string \"log(bool,uint,bool,uint)\""
                                  },
                                  "value": "log(bool,uint,bool,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22316,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22303,
                                  "src": "41284:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22317,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22305,
                                  "src": "41288:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22318,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22307,
                                  "src": "41292:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22319,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22309,
                                  "src": "41296:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_d3de5593988099d08808f80d2a972ea3da18ecd746f0a3e437c530efaad65aa0",
                                    "typeString": "literal_string \"log(bool,uint,bool,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22313,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "41232:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22314,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "41232:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22320,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "41232:67:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22312,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "41216:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22321,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "41216:84:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22322,
                        "nodeType": "ExpressionStatement",
                        "src": "41216:84:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22324,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22310,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22303,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22324,
                        "src": "41162:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22302,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "41162:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22305,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22324,
                        "src": "41171:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22304,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "41171:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22307,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22324,
                        "src": "41180:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22306,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "41180:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22309,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22324,
                        "src": "41189:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22308,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "41189:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "41161:36:101"
                  },
                  "returnParameters": {
                    "id": 22311,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "41212:0:101"
                  },
                  "scope": 25062,
                  "src": "41149:155:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22346,
                    "nodeType": "Block",
                    "src": "41379:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c75696e742c626f6f6c2c737472696e6729",
                                  "id": 22338,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "41423:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_b6d569d433e69694879a799e3777d59bc29ee89dcbaf739de9b283882fd259ad",
                                    "typeString": "literal_string \"log(bool,uint,bool,string)\""
                                  },
                                  "value": "log(bool,uint,bool,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22339,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22326,
                                  "src": "41453:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22340,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22328,
                                  "src": "41457:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22341,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22330,
                                  "src": "41461:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22342,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22332,
                                  "src": "41465:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_b6d569d433e69694879a799e3777d59bc29ee89dcbaf739de9b283882fd259ad",
                                    "typeString": "literal_string \"log(bool,uint,bool,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22336,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "41399:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22337,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "41399:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22343,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "41399:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22335,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "41383:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22344,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "41383:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22345,
                        "nodeType": "ExpressionStatement",
                        "src": "41383:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22347,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22333,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22326,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22347,
                        "src": "41320:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22325,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "41320:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22328,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22347,
                        "src": "41329:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22327,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "41329:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22330,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22347,
                        "src": "41338:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22329,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "41338:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22332,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22347,
                        "src": "41347:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22331,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "41347:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "41319:45:101"
                  },
                  "returnParameters": {
                    "id": 22334,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "41379:0:101"
                  },
                  "scope": 25062,
                  "src": "41307:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22369,
                    "nodeType": "Block",
                    "src": "41539:92:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c75696e742c626f6f6c2c626f6f6c29",
                                  "id": 22361,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "41583:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_9e01f7417c5ff66a2399364b03788fbf8437045d38acf377fab727a3440df7be",
                                    "typeString": "literal_string \"log(bool,uint,bool,bool)\""
                                  },
                                  "value": "log(bool,uint,bool,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22362,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22349,
                                  "src": "41611:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22363,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22351,
                                  "src": "41615:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22364,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22353,
                                  "src": "41619:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22365,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22355,
                                  "src": "41623:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_9e01f7417c5ff66a2399364b03788fbf8437045d38acf377fab727a3440df7be",
                                    "typeString": "literal_string \"log(bool,uint,bool,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22359,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "41559:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22360,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "41559:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22366,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "41559:67:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22358,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "41543:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22367,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "41543:84:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22368,
                        "nodeType": "ExpressionStatement",
                        "src": "41543:84:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22370,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22356,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22349,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22370,
                        "src": "41489:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22348,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "41489:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22351,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22370,
                        "src": "41498:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22350,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "41498:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22353,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22370,
                        "src": "41507:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22352,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "41507:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22355,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22370,
                        "src": "41516:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22354,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "41516:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "41488:36:101"
                  },
                  "returnParameters": {
                    "id": 22357,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "41539:0:101"
                  },
                  "scope": 25062,
                  "src": "41476:155:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22392,
                    "nodeType": "Block",
                    "src": "41700:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c75696e742c626f6f6c2c6164647265737329",
                                  "id": 22384,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "41744:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_4267c7f8f9987b1bc934e31e016f4d182f67ab95e55c5567fbc71b4f01a83f4b",
                                    "typeString": "literal_string \"log(bool,uint,bool,address)\""
                                  },
                                  "value": "log(bool,uint,bool,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22385,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22372,
                                  "src": "41775:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22386,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22374,
                                  "src": "41779:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22387,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22376,
                                  "src": "41783:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22388,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22378,
                                  "src": "41787:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_4267c7f8f9987b1bc934e31e016f4d182f67ab95e55c5567fbc71b4f01a83f4b",
                                    "typeString": "literal_string \"log(bool,uint,bool,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22382,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "41720:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22383,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "41720:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22389,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "41720:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22381,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "41704:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22390,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "41704:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22391,
                        "nodeType": "ExpressionStatement",
                        "src": "41704:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22393,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22379,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22372,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22393,
                        "src": "41647:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22371,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "41647:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22374,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22393,
                        "src": "41656:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22373,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "41656:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22376,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22393,
                        "src": "41665:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22375,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "41665:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22378,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22393,
                        "src": "41674:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22377,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "41674:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "41646:39:101"
                  },
                  "returnParameters": {
                    "id": 22380,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "41700:0:101"
                  },
                  "scope": 25062,
                  "src": "41634:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22415,
                    "nodeType": "Block",
                    "src": "41864:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c75696e742c616464726573732c75696e7429",
                                  "id": 22407,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "41908:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_caa5236acb25f4f5a01ec5f570d99d895d397c7e9fd20ed31c9c33fa8a17f26d",
                                    "typeString": "literal_string \"log(bool,uint,address,uint)\""
                                  },
                                  "value": "log(bool,uint,address,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22408,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22395,
                                  "src": "41939:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22409,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22397,
                                  "src": "41943:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22410,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22399,
                                  "src": "41947:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22411,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22401,
                                  "src": "41951:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_caa5236acb25f4f5a01ec5f570d99d895d397c7e9fd20ed31c9c33fa8a17f26d",
                                    "typeString": "literal_string \"log(bool,uint,address,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22405,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "41884:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22406,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "41884:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22412,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "41884:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22404,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "41868:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22413,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "41868:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22414,
                        "nodeType": "ExpressionStatement",
                        "src": "41868:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22416,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22402,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22395,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22416,
                        "src": "41811:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22394,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "41811:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22397,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22416,
                        "src": "41820:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22396,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "41820:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22399,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22416,
                        "src": "41829:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22398,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "41829:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22401,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22416,
                        "src": "41841:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22400,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "41841:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "41810:39:101"
                  },
                  "returnParameters": {
                    "id": 22403,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "41864:0:101"
                  },
                  "scope": 25062,
                  "src": "41798:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22438,
                    "nodeType": "Block",
                    "src": "42037:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c75696e742c616464726573732c737472696e6729",
                                  "id": 22430,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "42081:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_180913415ccbde45e0d2184e3dd2387bed86df0066bd73fcb896bc02a6226689",
                                    "typeString": "literal_string \"log(bool,uint,address,string)\""
                                  },
                                  "value": "log(bool,uint,address,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22431,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22418,
                                  "src": "42114:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22432,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22420,
                                  "src": "42118:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22433,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22422,
                                  "src": "42122:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22434,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22424,
                                  "src": "42126:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_180913415ccbde45e0d2184e3dd2387bed86df0066bd73fcb896bc02a6226689",
                                    "typeString": "literal_string \"log(bool,uint,address,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22428,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "42057:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22429,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "42057:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22435,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "42057:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22427,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "42041:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22436,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "42041:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22437,
                        "nodeType": "ExpressionStatement",
                        "src": "42041:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22439,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22425,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22418,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22439,
                        "src": "41975:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22417,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "41975:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22420,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22439,
                        "src": "41984:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22419,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "41984:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22422,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22439,
                        "src": "41993:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22421,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "41993:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22424,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22439,
                        "src": "42005:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22423,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "42005:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "41974:48:101"
                  },
                  "returnParameters": {
                    "id": 22426,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "42037:0:101"
                  },
                  "scope": 25062,
                  "src": "41962:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22461,
                    "nodeType": "Block",
                    "src": "42203:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c75696e742c616464726573732c626f6f6c29",
                                  "id": 22453,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "42247:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_65adf4082cd731bd1252f957eddeecdbdcf11e48975b5ac20d902fcb218153fa",
                                    "typeString": "literal_string \"log(bool,uint,address,bool)\""
                                  },
                                  "value": "log(bool,uint,address,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22454,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22441,
                                  "src": "42278:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22455,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22443,
                                  "src": "42282:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22456,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22445,
                                  "src": "42286:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22457,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22447,
                                  "src": "42290:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_65adf4082cd731bd1252f957eddeecdbdcf11e48975b5ac20d902fcb218153fa",
                                    "typeString": "literal_string \"log(bool,uint,address,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22451,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "42223:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22452,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "42223:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22458,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "42223:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22450,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "42207:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22459,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "42207:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22460,
                        "nodeType": "ExpressionStatement",
                        "src": "42207:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22462,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22448,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22441,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22462,
                        "src": "42150:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22440,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "42150:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22443,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22462,
                        "src": "42159:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22442,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "42159:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22445,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22462,
                        "src": "42168:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22444,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "42168:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22447,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22462,
                        "src": "42180:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22446,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "42180:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "42149:39:101"
                  },
                  "returnParameters": {
                    "id": 22449,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "42203:0:101"
                  },
                  "scope": 25062,
                  "src": "42137:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22484,
                    "nodeType": "Block",
                    "src": "42370:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c75696e742c616464726573732c6164647265737329",
                                  "id": 22476,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "42414:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_8a2f90aa07fc9781ea213028ce9aef0a44d6a31a77e2f4d54d97a0d808348d5d",
                                    "typeString": "literal_string \"log(bool,uint,address,address)\""
                                  },
                                  "value": "log(bool,uint,address,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22477,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22464,
                                  "src": "42448:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22478,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22466,
                                  "src": "42452:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22479,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22468,
                                  "src": "42456:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22480,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22470,
                                  "src": "42460:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_8a2f90aa07fc9781ea213028ce9aef0a44d6a31a77e2f4d54d97a0d808348d5d",
                                    "typeString": "literal_string \"log(bool,uint,address,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22474,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "42390:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22475,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "42390:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22481,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "42390:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22473,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "42374:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22482,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "42374:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22483,
                        "nodeType": "ExpressionStatement",
                        "src": "42374:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22485,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22471,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22464,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22485,
                        "src": "42314:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22463,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "42314:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22466,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22485,
                        "src": "42323:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22465,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "42323:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22468,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22485,
                        "src": "42332:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22467,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "42332:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22470,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22485,
                        "src": "42344:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22469,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "42344:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "42313:42:101"
                  },
                  "returnParameters": {
                    "id": 22472,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "42370:0:101"
                  },
                  "scope": 25062,
                  "src": "42301:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22507,
                    "nodeType": "Block",
                    "src": "42543:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c737472696e672c75696e742c75696e7429",
                                  "id": 22499,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "42587:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_8e4ae86e71c7c77322d634e39fba7bc2a7e4fbe918bce10fe47326050a13b7c9",
                                    "typeString": "literal_string \"log(bool,string,uint,uint)\""
                                  },
                                  "value": "log(bool,string,uint,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22500,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22487,
                                  "src": "42617:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22501,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22489,
                                  "src": "42621:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22502,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22491,
                                  "src": "42625:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22503,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22493,
                                  "src": "42629:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_8e4ae86e71c7c77322d634e39fba7bc2a7e4fbe918bce10fe47326050a13b7c9",
                                    "typeString": "literal_string \"log(bool,string,uint,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22497,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "42563:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22498,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "42563:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22504,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "42563:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22496,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "42547:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22505,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "42547:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22506,
                        "nodeType": "ExpressionStatement",
                        "src": "42547:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22508,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22494,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22487,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22508,
                        "src": "42484:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22486,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "42484:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22489,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22508,
                        "src": "42493:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22488,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "42493:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22491,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22508,
                        "src": "42511:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22490,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "42511:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22493,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22508,
                        "src": "42520:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22492,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "42520:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "42483:45:101"
                  },
                  "returnParameters": {
                    "id": 22495,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "42543:0:101"
                  },
                  "scope": 25062,
                  "src": "42471:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22530,
                    "nodeType": "Block",
                    "src": "42721:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c737472696e672c75696e742c737472696e6729",
                                  "id": 22522,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "42765:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_77a1abed9f9fbc44023408083dd5c1cf42b0b566799470c6ab535b12d0f8f649",
                                    "typeString": "literal_string \"log(bool,string,uint,string)\""
                                  },
                                  "value": "log(bool,string,uint,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22523,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22510,
                                  "src": "42797:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22524,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22512,
                                  "src": "42801:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22525,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22514,
                                  "src": "42805:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22526,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22516,
                                  "src": "42809:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_77a1abed9f9fbc44023408083dd5c1cf42b0b566799470c6ab535b12d0f8f649",
                                    "typeString": "literal_string \"log(bool,string,uint,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22520,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "42741:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22521,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "42741:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22527,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "42741:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22519,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "42725:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22528,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "42725:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22529,
                        "nodeType": "ExpressionStatement",
                        "src": "42725:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22531,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22517,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22510,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22531,
                        "src": "42653:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22509,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "42653:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22512,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22531,
                        "src": "42662:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22511,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "42662:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22514,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22531,
                        "src": "42680:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22513,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "42680:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22516,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22531,
                        "src": "42689:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22515,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "42689:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "42652:54:101"
                  },
                  "returnParameters": {
                    "id": 22518,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "42721:0:101"
                  },
                  "scope": 25062,
                  "src": "42640:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22553,
                    "nodeType": "Block",
                    "src": "42892:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c737472696e672c75696e742c626f6f6c29",
                                  "id": 22545,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "42936:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_20bbc9af7c6bae926ffd73678c9130310d497610a5c76e6e2ae48edff96f38a8",
                                    "typeString": "literal_string \"log(bool,string,uint,bool)\""
                                  },
                                  "value": "log(bool,string,uint,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22546,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22533,
                                  "src": "42966:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22547,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22535,
                                  "src": "42970:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22548,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22537,
                                  "src": "42974:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22549,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22539,
                                  "src": "42978:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_20bbc9af7c6bae926ffd73678c9130310d497610a5c76e6e2ae48edff96f38a8",
                                    "typeString": "literal_string \"log(bool,string,uint,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22543,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "42912:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22544,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "42912:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22550,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "42912:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22542,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "42896:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22551,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "42896:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22552,
                        "nodeType": "ExpressionStatement",
                        "src": "42896:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22554,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22540,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22533,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22554,
                        "src": "42833:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22532,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "42833:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22535,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22554,
                        "src": "42842:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22534,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "42842:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22537,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22554,
                        "src": "42860:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22536,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "42860:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22539,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22554,
                        "src": "42869:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22538,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "42869:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "42832:45:101"
                  },
                  "returnParameters": {
                    "id": 22541,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "42892:0:101"
                  },
                  "scope": 25062,
                  "src": "42820:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22576,
                    "nodeType": "Block",
                    "src": "43064:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c737472696e672c75696e742c6164647265737329",
                                  "id": 22568,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "43108:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_5b22b938264abfc98de8ea025ac5bd87df03cbffd23b96cdfe194e0ef6fb136a",
                                    "typeString": "literal_string \"log(bool,string,uint,address)\""
                                  },
                                  "value": "log(bool,string,uint,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22569,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22556,
                                  "src": "43141:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22570,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22558,
                                  "src": "43145:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22571,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22560,
                                  "src": "43149:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22572,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22562,
                                  "src": "43153:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_5b22b938264abfc98de8ea025ac5bd87df03cbffd23b96cdfe194e0ef6fb136a",
                                    "typeString": "literal_string \"log(bool,string,uint,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22566,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "43084:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22567,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "43084:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22573,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "43084:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22565,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "43068:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22574,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "43068:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22575,
                        "nodeType": "ExpressionStatement",
                        "src": "43068:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22577,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22563,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22556,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22577,
                        "src": "43002:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22555,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "43002:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22558,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22577,
                        "src": "43011:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22557,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "43011:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22560,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22577,
                        "src": "43029:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22559,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "43029:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22562,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22577,
                        "src": "43038:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22561,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "43038:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "43001:48:101"
                  },
                  "returnParameters": {
                    "id": 22564,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "43064:0:101"
                  },
                  "scope": 25062,
                  "src": "42989:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22599,
                    "nodeType": "Block",
                    "src": "43245:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c737472696e672c737472696e672c75696e7429",
                                  "id": 22591,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "43289:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_5ddb259214a75c0fc75757e8e19b1cf1c4ec17a5eef635b4715f04b86884d5df",
                                    "typeString": "literal_string \"log(bool,string,string,uint)\""
                                  },
                                  "value": "log(bool,string,string,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22592,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22579,
                                  "src": "43321:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22593,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22581,
                                  "src": "43325:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22594,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22583,
                                  "src": "43329:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22595,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22585,
                                  "src": "43333:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_5ddb259214a75c0fc75757e8e19b1cf1c4ec17a5eef635b4715f04b86884d5df",
                                    "typeString": "literal_string \"log(bool,string,string,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22589,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "43265:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22590,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "43265:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22596,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "43265:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22588,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "43249:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22597,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "43249:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22598,
                        "nodeType": "ExpressionStatement",
                        "src": "43249:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22600,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22586,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22579,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22600,
                        "src": "43177:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22578,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "43177:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22581,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22600,
                        "src": "43186:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22580,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "43186:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22583,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22600,
                        "src": "43204:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22582,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "43204:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22585,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22600,
                        "src": "43222:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22584,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "43222:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "43176:54:101"
                  },
                  "returnParameters": {
                    "id": 22587,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "43245:0:101"
                  },
                  "scope": 25062,
                  "src": "43164:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22622,
                    "nodeType": "Block",
                    "src": "43434:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c737472696e672c737472696e672c737472696e6729",
                                  "id": 22614,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "43478:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_1762e32af9fa924f818d8f4a6c92011d30129df73749081e0b95feea819a17c9",
                                    "typeString": "literal_string \"log(bool,string,string,string)\""
                                  },
                                  "value": "log(bool,string,string,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22615,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22602,
                                  "src": "43512:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22616,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22604,
                                  "src": "43516:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22617,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22606,
                                  "src": "43520:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22618,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22608,
                                  "src": "43524:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_1762e32af9fa924f818d8f4a6c92011d30129df73749081e0b95feea819a17c9",
                                    "typeString": "literal_string \"log(bool,string,string,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22612,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "43454:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22613,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "43454:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22619,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "43454:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22611,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "43438:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22620,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "43438:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22621,
                        "nodeType": "ExpressionStatement",
                        "src": "43438:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22623,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22609,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22602,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22623,
                        "src": "43357:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22601,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "43357:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22604,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22623,
                        "src": "43366:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22603,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "43366:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22606,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22623,
                        "src": "43384:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22605,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "43384:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22608,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22623,
                        "src": "43402:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22607,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "43402:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "43356:63:101"
                  },
                  "returnParameters": {
                    "id": 22610,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "43434:0:101"
                  },
                  "scope": 25062,
                  "src": "43344:188:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22645,
                    "nodeType": "Block",
                    "src": "43616:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c737472696e672c737472696e672c626f6f6c29",
                                  "id": 22637,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "43660:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_1e4b87e52d13efc5b368defba0463e423637ec55125c6230945d005f817198d1",
                                    "typeString": "literal_string \"log(bool,string,string,bool)\""
                                  },
                                  "value": "log(bool,string,string,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22638,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22625,
                                  "src": "43692:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22639,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22627,
                                  "src": "43696:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22640,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22629,
                                  "src": "43700:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22641,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22631,
                                  "src": "43704:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_1e4b87e52d13efc5b368defba0463e423637ec55125c6230945d005f817198d1",
                                    "typeString": "literal_string \"log(bool,string,string,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22635,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "43636:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22636,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "43636:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22642,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "43636:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22634,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "43620:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22643,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "43620:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22644,
                        "nodeType": "ExpressionStatement",
                        "src": "43620:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22646,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22632,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22625,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22646,
                        "src": "43548:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22624,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "43548:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22627,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22646,
                        "src": "43557:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22626,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "43557:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22629,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22646,
                        "src": "43575:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22628,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "43575:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22631,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22646,
                        "src": "43593:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22630,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "43593:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "43547:54:101"
                  },
                  "returnParameters": {
                    "id": 22633,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "43616:0:101"
                  },
                  "scope": 25062,
                  "src": "43535:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22668,
                    "nodeType": "Block",
                    "src": "43799:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c737472696e672c737472696e672c6164647265737329",
                                  "id": 22660,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "43843:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_97d394d89551bd441d1340d1c3dcc3b6160871bf042c6884bcb4049b2fa2bdb5",
                                    "typeString": "literal_string \"log(bool,string,string,address)\""
                                  },
                                  "value": "log(bool,string,string,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22661,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22648,
                                  "src": "43878:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22662,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22650,
                                  "src": "43882:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22663,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22652,
                                  "src": "43886:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22664,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22654,
                                  "src": "43890:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_97d394d89551bd441d1340d1c3dcc3b6160871bf042c6884bcb4049b2fa2bdb5",
                                    "typeString": "literal_string \"log(bool,string,string,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22658,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "43819:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22659,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "43819:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22665,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "43819:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22657,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "43803:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22666,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "43803:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22667,
                        "nodeType": "ExpressionStatement",
                        "src": "43803:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22669,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22655,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22648,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22669,
                        "src": "43728:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22647,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "43728:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22650,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22669,
                        "src": "43737:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22649,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "43737:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22652,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22669,
                        "src": "43755:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22651,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "43755:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22654,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22669,
                        "src": "43773:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22653,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "43773:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "43727:57:101"
                  },
                  "returnParameters": {
                    "id": 22656,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "43799:0:101"
                  },
                  "scope": 25062,
                  "src": "43715:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22691,
                    "nodeType": "Block",
                    "src": "43973:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c737472696e672c626f6f6c2c75696e7429",
                                  "id": 22683,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "44017:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_8d6f9ca539d16169f184b68d5f2cbc34ada538d6737083559aa5a96068582055",
                                    "typeString": "literal_string \"log(bool,string,bool,uint)\""
                                  },
                                  "value": "log(bool,string,bool,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22684,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22671,
                                  "src": "44047:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22685,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22673,
                                  "src": "44051:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22686,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22675,
                                  "src": "44055:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22687,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22677,
                                  "src": "44059:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_8d6f9ca539d16169f184b68d5f2cbc34ada538d6737083559aa5a96068582055",
                                    "typeString": "literal_string \"log(bool,string,bool,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22681,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "43993:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22682,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "43993:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22688,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "43993:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22680,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "43977:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22689,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "43977:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22690,
                        "nodeType": "ExpressionStatement",
                        "src": "43977:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22692,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22678,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22671,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22692,
                        "src": "43914:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22670,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "43914:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22673,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22692,
                        "src": "43923:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22672,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "43923:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22675,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22692,
                        "src": "43941:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22674,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "43941:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22677,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22692,
                        "src": "43950:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22676,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "43950:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "43913:45:101"
                  },
                  "returnParameters": {
                    "id": 22679,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "43973:0:101"
                  },
                  "scope": 25062,
                  "src": "43901:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22714,
                    "nodeType": "Block",
                    "src": "44151:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c737472696e672c626f6f6c2c737472696e6729",
                                  "id": 22706,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "44195:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_483d0416329d0c81c68975a0cac822497c590c00f8ae8be66af490d0f9215468",
                                    "typeString": "literal_string \"log(bool,string,bool,string)\""
                                  },
                                  "value": "log(bool,string,bool,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22707,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22694,
                                  "src": "44227:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22708,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22696,
                                  "src": "44231:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22709,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22698,
                                  "src": "44235:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22710,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22700,
                                  "src": "44239:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_483d0416329d0c81c68975a0cac822497c590c00f8ae8be66af490d0f9215468",
                                    "typeString": "literal_string \"log(bool,string,bool,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22704,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "44171:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22705,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "44171:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22711,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "44171:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22703,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "44155:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22712,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "44155:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22713,
                        "nodeType": "ExpressionStatement",
                        "src": "44155:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22715,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22701,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22694,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22715,
                        "src": "44083:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22693,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "44083:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22696,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22715,
                        "src": "44092:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22695,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "44092:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22698,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22715,
                        "src": "44110:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22697,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "44110:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22700,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22715,
                        "src": "44119:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22699,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "44119:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "44082:54:101"
                  },
                  "returnParameters": {
                    "id": 22702,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "44151:0:101"
                  },
                  "scope": 25062,
                  "src": "44070:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22737,
                    "nodeType": "Block",
                    "src": "44322:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c737472696e672c626f6f6c2c626f6f6c29",
                                  "id": 22729,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "44366:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_dc5e935b9ccf45ff13b5900aeaf3a593df3e9479fc07e9c213f5fcaa0951e91f",
                                    "typeString": "literal_string \"log(bool,string,bool,bool)\""
                                  },
                                  "value": "log(bool,string,bool,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22730,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22717,
                                  "src": "44396:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22731,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22719,
                                  "src": "44400:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22732,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22721,
                                  "src": "44404:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22733,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22723,
                                  "src": "44408:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_dc5e935b9ccf45ff13b5900aeaf3a593df3e9479fc07e9c213f5fcaa0951e91f",
                                    "typeString": "literal_string \"log(bool,string,bool,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22727,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "44342:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22728,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "44342:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22734,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "44342:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22726,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "44326:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22735,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "44326:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22736,
                        "nodeType": "ExpressionStatement",
                        "src": "44326:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22738,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22724,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22717,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22738,
                        "src": "44263:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22716,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "44263:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22719,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22738,
                        "src": "44272:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22718,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "44272:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22721,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22738,
                        "src": "44290:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22720,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "44290:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22723,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22738,
                        "src": "44299:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22722,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "44299:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "44262:45:101"
                  },
                  "returnParameters": {
                    "id": 22725,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "44322:0:101"
                  },
                  "scope": 25062,
                  "src": "44250:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22760,
                    "nodeType": "Block",
                    "src": "44494:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c737472696e672c626f6f6c2c6164647265737329",
                                  "id": 22752,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "44538:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_538e06ab06366b189ea53da7c11628ee5730bc373b0bc64719bea1a2afab03c5",
                                    "typeString": "literal_string \"log(bool,string,bool,address)\""
                                  },
                                  "value": "log(bool,string,bool,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22753,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22740,
                                  "src": "44571:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22754,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22742,
                                  "src": "44575:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22755,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22744,
                                  "src": "44579:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22756,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22746,
                                  "src": "44583:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_538e06ab06366b189ea53da7c11628ee5730bc373b0bc64719bea1a2afab03c5",
                                    "typeString": "literal_string \"log(bool,string,bool,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22750,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "44514:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22751,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "44514:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22757,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "44514:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22749,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "44498:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22758,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "44498:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22759,
                        "nodeType": "ExpressionStatement",
                        "src": "44498:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22761,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22747,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22740,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22761,
                        "src": "44432:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22739,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "44432:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22742,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22761,
                        "src": "44441:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22741,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "44441:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22744,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22761,
                        "src": "44459:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22743,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "44459:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22746,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22761,
                        "src": "44468:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22745,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "44468:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "44431:48:101"
                  },
                  "returnParameters": {
                    "id": 22748,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "44494:0:101"
                  },
                  "scope": 25062,
                  "src": "44419:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22783,
                    "nodeType": "Block",
                    "src": "44669:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c737472696e672c616464726573732c75696e7429",
                                  "id": 22775,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "44713:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_1b0b955b558cd224468bb20ba92b23519cb59fe363a105b00d7a815c1673c4ca",
                                    "typeString": "literal_string \"log(bool,string,address,uint)\""
                                  },
                                  "value": "log(bool,string,address,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22776,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22763,
                                  "src": "44746:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22777,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22765,
                                  "src": "44750:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22778,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22767,
                                  "src": "44754:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22779,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22769,
                                  "src": "44758:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_1b0b955b558cd224468bb20ba92b23519cb59fe363a105b00d7a815c1673c4ca",
                                    "typeString": "literal_string \"log(bool,string,address,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22773,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "44689:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22774,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "44689:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22780,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "44689:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22772,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "44673:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22781,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "44673:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22782,
                        "nodeType": "ExpressionStatement",
                        "src": "44673:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22784,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22770,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22763,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22784,
                        "src": "44607:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22762,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "44607:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22765,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22784,
                        "src": "44616:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22764,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "44616:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22767,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22784,
                        "src": "44634:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22766,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "44634:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22769,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22784,
                        "src": "44646:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22768,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "44646:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "44606:48:101"
                  },
                  "returnParameters": {
                    "id": 22771,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "44669:0:101"
                  },
                  "scope": 25062,
                  "src": "44594:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22806,
                    "nodeType": "Block",
                    "src": "44853:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c737472696e672c616464726573732c737472696e6729",
                                  "id": 22798,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "44897:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_12d6c788fea4d6144f2607e1e8821bec55a5c2dfdc4cece41a536f7b7831e7a7",
                                    "typeString": "literal_string \"log(bool,string,address,string)\""
                                  },
                                  "value": "log(bool,string,address,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22799,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22786,
                                  "src": "44932:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22800,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22788,
                                  "src": "44936:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22801,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22790,
                                  "src": "44940:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22802,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22792,
                                  "src": "44944:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_12d6c788fea4d6144f2607e1e8821bec55a5c2dfdc4cece41a536f7b7831e7a7",
                                    "typeString": "literal_string \"log(bool,string,address,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22796,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "44873:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22797,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "44873:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22803,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "44873:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22795,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "44857:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22804,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "44857:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22805,
                        "nodeType": "ExpressionStatement",
                        "src": "44857:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22807,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22793,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22786,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22807,
                        "src": "44782:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22785,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "44782:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22788,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22807,
                        "src": "44791:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22787,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "44791:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22790,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22807,
                        "src": "44809:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22789,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "44809:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22792,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22807,
                        "src": "44821:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22791,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "44821:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "44781:57:101"
                  },
                  "returnParameters": {
                    "id": 22794,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "44853:0:101"
                  },
                  "scope": 25062,
                  "src": "44769:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22829,
                    "nodeType": "Block",
                    "src": "45030:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c737472696e672c616464726573732c626f6f6c29",
                                  "id": 22821,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "45074:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_6dd434ca1fa26d491bcd72b7fe69eb72d41cae8eadbda5a7f985734e1b80c67d",
                                    "typeString": "literal_string \"log(bool,string,address,bool)\""
                                  },
                                  "value": "log(bool,string,address,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22822,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22809,
                                  "src": "45107:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22823,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22811,
                                  "src": "45111:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22824,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22813,
                                  "src": "45115:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22825,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22815,
                                  "src": "45119:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_6dd434ca1fa26d491bcd72b7fe69eb72d41cae8eadbda5a7f985734e1b80c67d",
                                    "typeString": "literal_string \"log(bool,string,address,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22819,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "45050:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22820,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "45050:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22826,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "45050:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22818,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "45034:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22827,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "45034:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22828,
                        "nodeType": "ExpressionStatement",
                        "src": "45034:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22830,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22816,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22809,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22830,
                        "src": "44968:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22808,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "44968:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22811,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22830,
                        "src": "44977:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22810,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "44977:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22813,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22830,
                        "src": "44995:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22812,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "44995:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22815,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22830,
                        "src": "45007:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22814,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "45007:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "44967:48:101"
                  },
                  "returnParameters": {
                    "id": 22817,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "45030:0:101"
                  },
                  "scope": 25062,
                  "src": "44955:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22852,
                    "nodeType": "Block",
                    "src": "45208:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c737472696e672c616464726573732c6164647265737329",
                                  "id": 22844,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "45252:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_2b2b18dc50ecc75180f201de41eca533fbda0c7bf525c06b5b8e87bc1d010822",
                                    "typeString": "literal_string \"log(bool,string,address,address)\""
                                  },
                                  "value": "log(bool,string,address,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22845,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22832,
                                  "src": "45288:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22846,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22834,
                                  "src": "45292:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22847,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22836,
                                  "src": "45296:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22848,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22838,
                                  "src": "45300:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_2b2b18dc50ecc75180f201de41eca533fbda0c7bf525c06b5b8e87bc1d010822",
                                    "typeString": "literal_string \"log(bool,string,address,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22842,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "45228:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22843,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "45228:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22849,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "45228:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22841,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "45212:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22850,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "45212:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22851,
                        "nodeType": "ExpressionStatement",
                        "src": "45212:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22853,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22839,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22832,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22853,
                        "src": "45143:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22831,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "45143:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22834,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22853,
                        "src": "45152:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22833,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "45152:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22836,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22853,
                        "src": "45170:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22835,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "45170:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22838,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22853,
                        "src": "45182:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22837,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "45182:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "45142:51:101"
                  },
                  "returnParameters": {
                    "id": 22840,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "45208:0:101"
                  },
                  "scope": 25062,
                  "src": "45130:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22875,
                    "nodeType": "Block",
                    "src": "45374:92:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c626f6f6c2c75696e742c75696e7429",
                                  "id": 22867,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "45418:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_4667de8ece32e91ade336fb6d8a14a500512d40e1162a34636a5bca908b16e6a",
                                    "typeString": "literal_string \"log(bool,bool,uint,uint)\""
                                  },
                                  "value": "log(bool,bool,uint,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22868,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22855,
                                  "src": "45446:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22869,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22857,
                                  "src": "45450:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22870,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22859,
                                  "src": "45454:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22871,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22861,
                                  "src": "45458:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_4667de8ece32e91ade336fb6d8a14a500512d40e1162a34636a5bca908b16e6a",
                                    "typeString": "literal_string \"log(bool,bool,uint,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22865,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "45394:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22866,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "45394:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22872,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "45394:67:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22864,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "45378:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22873,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "45378:84:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22874,
                        "nodeType": "ExpressionStatement",
                        "src": "45378:84:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22876,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22862,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22855,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22876,
                        "src": "45324:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22854,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "45324:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22857,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22876,
                        "src": "45333:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22856,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "45333:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22859,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22876,
                        "src": "45342:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22858,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "45342:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22861,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22876,
                        "src": "45351:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22860,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "45351:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "45323:36:101"
                  },
                  "returnParameters": {
                    "id": 22863,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "45374:0:101"
                  },
                  "scope": 25062,
                  "src": "45311:155:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22898,
                    "nodeType": "Block",
                    "src": "45541:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c626f6f6c2c75696e742c737472696e6729",
                                  "id": 22890,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "45585:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_50618937639b3b1cb3bbe247efb1fae4eb9a85d1e66ac66dfc77c62561966adc",
                                    "typeString": "literal_string \"log(bool,bool,uint,string)\""
                                  },
                                  "value": "log(bool,bool,uint,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22891,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22878,
                                  "src": "45615:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22892,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22880,
                                  "src": "45619:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22893,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22882,
                                  "src": "45623:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22894,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22884,
                                  "src": "45627:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_50618937639b3b1cb3bbe247efb1fae4eb9a85d1e66ac66dfc77c62561966adc",
                                    "typeString": "literal_string \"log(bool,bool,uint,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22888,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "45561:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22889,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "45561:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22895,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "45561:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22887,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "45545:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22896,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "45545:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22897,
                        "nodeType": "ExpressionStatement",
                        "src": "45545:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22899,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22885,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22878,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22899,
                        "src": "45482:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22877,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "45482:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22880,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22899,
                        "src": "45491:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22879,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "45491:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22882,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22899,
                        "src": "45500:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22881,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "45500:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22884,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22899,
                        "src": "45509:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22883,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "45509:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "45481:45:101"
                  },
                  "returnParameters": {
                    "id": 22886,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "45541:0:101"
                  },
                  "scope": 25062,
                  "src": "45469:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22921,
                    "nodeType": "Block",
                    "src": "45701:92:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c626f6f6c2c75696e742c626f6f6c29",
                                  "id": 22913,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "45745:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_ab5cc1c47d926d79461c86216768f32b6ec0ac12d51c1eb543ea3bd1cfec0110",
                                    "typeString": "literal_string \"log(bool,bool,uint,bool)\""
                                  },
                                  "value": "log(bool,bool,uint,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22914,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22901,
                                  "src": "45773:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22915,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22903,
                                  "src": "45777:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22916,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22905,
                                  "src": "45781:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22917,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22907,
                                  "src": "45785:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_ab5cc1c47d926d79461c86216768f32b6ec0ac12d51c1eb543ea3bd1cfec0110",
                                    "typeString": "literal_string \"log(bool,bool,uint,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22911,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "45721:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22912,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "45721:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22918,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "45721:67:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22910,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "45705:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22919,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "45705:84:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22920,
                        "nodeType": "ExpressionStatement",
                        "src": "45705:84:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22922,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22908,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22901,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22922,
                        "src": "45651:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22900,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "45651:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22903,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22922,
                        "src": "45660:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22902,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "45660:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22905,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22922,
                        "src": "45669:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22904,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "45669:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22907,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22922,
                        "src": "45678:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22906,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "45678:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "45650:36:101"
                  },
                  "returnParameters": {
                    "id": 22909,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "45701:0:101"
                  },
                  "scope": 25062,
                  "src": "45638:155:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22944,
                    "nodeType": "Block",
                    "src": "45862:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c626f6f6c2c75696e742c6164647265737329",
                                  "id": 22936,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "45906:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_0bff950dc175e3e278946e4adb75fffc4ee67cda33555121dd293b95b27a39a7",
                                    "typeString": "literal_string \"log(bool,bool,uint,address)\""
                                  },
                                  "value": "log(bool,bool,uint,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22937,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22924,
                                  "src": "45937:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22938,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22926,
                                  "src": "45941:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22939,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22928,
                                  "src": "45945:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22940,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22930,
                                  "src": "45949:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_0bff950dc175e3e278946e4adb75fffc4ee67cda33555121dd293b95b27a39a7",
                                    "typeString": "literal_string \"log(bool,bool,uint,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22934,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "45882:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22935,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "45882:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22941,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "45882:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22933,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "45866:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22942,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "45866:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22943,
                        "nodeType": "ExpressionStatement",
                        "src": "45866:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22945,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22931,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22924,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22945,
                        "src": "45809:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22923,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "45809:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22926,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22945,
                        "src": "45818:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22925,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "45818:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22928,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22945,
                        "src": "45827:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22927,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "45827:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22930,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22945,
                        "src": "45836:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 22929,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "45836:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "45808:39:101"
                  },
                  "returnParameters": {
                    "id": 22932,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "45862:0:101"
                  },
                  "scope": 25062,
                  "src": "45796:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22967,
                    "nodeType": "Block",
                    "src": "46032:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c626f6f6c2c737472696e672c75696e7429",
                                  "id": 22959,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "46076:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_178b4685db1dff62c4ee472c2e6bf50abba0dc230768235e43c6259152d1244e",
                                    "typeString": "literal_string \"log(bool,bool,string,uint)\""
                                  },
                                  "value": "log(bool,bool,string,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22960,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22947,
                                  "src": "46106:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22961,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22949,
                                  "src": "46110:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22962,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22951,
                                  "src": "46114:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22963,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22953,
                                  "src": "46118:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_178b4685db1dff62c4ee472c2e6bf50abba0dc230768235e43c6259152d1244e",
                                    "typeString": "literal_string \"log(bool,bool,string,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22957,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "46052:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22958,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "46052:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22964,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "46052:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22956,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "46036:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22965,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "46036:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22966,
                        "nodeType": "ExpressionStatement",
                        "src": "46036:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22968,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22954,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22947,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22968,
                        "src": "45973:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22946,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "45973:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22949,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22968,
                        "src": "45982:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22948,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "45982:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22951,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22968,
                        "src": "45991:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22950,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "45991:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22953,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22968,
                        "src": "46009:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 22952,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "46009:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "45972:45:101"
                  },
                  "returnParameters": {
                    "id": 22955,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "46032:0:101"
                  },
                  "scope": 25062,
                  "src": "45960:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 22990,
                    "nodeType": "Block",
                    "src": "46210:96:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c626f6f6c2c737472696e672c737472696e6729",
                                  "id": 22982,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "46254:30:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_6d1e87518c98344bc3efd52648f61de340bda51607aec409d641f3467caafaaf",
                                    "typeString": "literal_string \"log(bool,bool,string,string)\""
                                  },
                                  "value": "log(bool,bool,string,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22983,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22970,
                                  "src": "46286:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22984,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22972,
                                  "src": "46290:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22985,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22974,
                                  "src": "46294:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 22986,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22976,
                                  "src": "46298:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_6d1e87518c98344bc3efd52648f61de340bda51607aec409d641f3467caafaaf",
                                    "typeString": "literal_string \"log(bool,bool,string,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 22980,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "46230:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 22981,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "46230:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 22987,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "46230:71:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 22979,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "46214:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 22988,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "46214:88:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 22989,
                        "nodeType": "ExpressionStatement",
                        "src": "46214:88:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 22991,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 22977,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22970,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22991,
                        "src": "46142:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22969,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "46142:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22972,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22991,
                        "src": "46151:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22971,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "46151:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22974,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22991,
                        "src": "46160:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22973,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "46160:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22976,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 22991,
                        "src": "46178:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22975,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "46178:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "46141:54:101"
                  },
                  "returnParameters": {
                    "id": 22978,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "46210:0:101"
                  },
                  "scope": 25062,
                  "src": "46129:177:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23013,
                    "nodeType": "Block",
                    "src": "46381:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c626f6f6c2c737472696e672c626f6f6c29",
                                  "id": 23005,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "46425:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_b857163a2b7b8273ed53cefa410aa148f1833bdfc22da11e1e2fb89c6e625d02",
                                    "typeString": "literal_string \"log(bool,bool,string,bool)\""
                                  },
                                  "value": "log(bool,bool,string,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23006,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22993,
                                  "src": "46455:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23007,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22995,
                                  "src": "46459:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23008,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22997,
                                  "src": "46463:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23009,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 22999,
                                  "src": "46467:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_b857163a2b7b8273ed53cefa410aa148f1833bdfc22da11e1e2fb89c6e625d02",
                                    "typeString": "literal_string \"log(bool,bool,string,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23003,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "46401:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23004,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "46401:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23010,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "46401:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23002,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "46385:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23011,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "46385:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23012,
                        "nodeType": "ExpressionStatement",
                        "src": "46385:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23014,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23000,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 22993,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23014,
                        "src": "46322:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22992,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "46322:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22995,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23014,
                        "src": "46331:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22994,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "46331:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22997,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23014,
                        "src": "46340:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 22996,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "46340:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 22999,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23014,
                        "src": "46358:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 22998,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "46358:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "46321:45:101"
                  },
                  "returnParameters": {
                    "id": 23001,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "46381:0:101"
                  },
                  "scope": 25062,
                  "src": "46309:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23036,
                    "nodeType": "Block",
                    "src": "46553:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c626f6f6c2c737472696e672c6164647265737329",
                                  "id": 23028,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "46597:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_f9ad2b893873fa31c02b102aa30743b2e44c102daa588ea9d1eb1f2baf23d202",
                                    "typeString": "literal_string \"log(bool,bool,string,address)\""
                                  },
                                  "value": "log(bool,bool,string,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23029,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23016,
                                  "src": "46630:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23030,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23018,
                                  "src": "46634:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23031,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23020,
                                  "src": "46638:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23032,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23022,
                                  "src": "46642:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_f9ad2b893873fa31c02b102aa30743b2e44c102daa588ea9d1eb1f2baf23d202",
                                    "typeString": "literal_string \"log(bool,bool,string,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23026,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "46573:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23027,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "46573:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23033,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "46573:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23025,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "46557:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23034,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "46557:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23035,
                        "nodeType": "ExpressionStatement",
                        "src": "46557:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23037,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23023,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23016,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23037,
                        "src": "46491:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23015,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "46491:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23018,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23037,
                        "src": "46500:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23017,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "46500:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23020,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23037,
                        "src": "46509:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 23019,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "46509:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23022,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23037,
                        "src": "46527:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23021,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "46527:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "46490:48:101"
                  },
                  "returnParameters": {
                    "id": 23024,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "46553:0:101"
                  },
                  "scope": 25062,
                  "src": "46478:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23059,
                    "nodeType": "Block",
                    "src": "46716:92:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c626f6f6c2c626f6f6c2c75696e7429",
                                  "id": 23051,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "46760:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c248834dff84ca4bcbda9cf249a0d5da3bd0a58b4562085082654d4d9851b501",
                                    "typeString": "literal_string \"log(bool,bool,bool,uint)\""
                                  },
                                  "value": "log(bool,bool,bool,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23052,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23039,
                                  "src": "46788:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23053,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23041,
                                  "src": "46792:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23054,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23043,
                                  "src": "46796:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23055,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23045,
                                  "src": "46800:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_c248834dff84ca4bcbda9cf249a0d5da3bd0a58b4562085082654d4d9851b501",
                                    "typeString": "literal_string \"log(bool,bool,bool,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23049,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "46736:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23050,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "46736:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23056,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "46736:67:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23048,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "46720:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23057,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "46720:84:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23058,
                        "nodeType": "ExpressionStatement",
                        "src": "46720:84:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23060,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23046,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23039,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23060,
                        "src": "46666:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23038,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "46666:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23041,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23060,
                        "src": "46675:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23040,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "46675:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23043,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23060,
                        "src": "46684:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23042,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "46684:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23045,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23060,
                        "src": "46693:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23044,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "46693:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "46665:36:101"
                  },
                  "returnParameters": {
                    "id": 23047,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "46716:0:101"
                  },
                  "scope": 25062,
                  "src": "46653:155:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23082,
                    "nodeType": "Block",
                    "src": "46883:94:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c626f6f6c2c626f6f6c2c737472696e6729",
                                  "id": 23074,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "46927:28:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_2ae408d4d030305a0361ad07c397f2b9653613b220d82459c7aeb9a6bab96c15",
                                    "typeString": "literal_string \"log(bool,bool,bool,string)\""
                                  },
                                  "value": "log(bool,bool,bool,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23075,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23062,
                                  "src": "46957:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23076,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23064,
                                  "src": "46961:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23077,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23066,
                                  "src": "46965:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23078,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23068,
                                  "src": "46969:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_2ae408d4d030305a0361ad07c397f2b9653613b220d82459c7aeb9a6bab96c15",
                                    "typeString": "literal_string \"log(bool,bool,bool,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23072,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "46903:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23073,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "46903:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23079,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "46903:69:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23071,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "46887:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23080,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "46887:86:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23081,
                        "nodeType": "ExpressionStatement",
                        "src": "46887:86:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23083,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23069,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23062,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23083,
                        "src": "46824:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23061,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "46824:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23064,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23083,
                        "src": "46833:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23063,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "46833:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23066,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23083,
                        "src": "46842:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23065,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "46842:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23068,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23083,
                        "src": "46851:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 23067,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "46851:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "46823:45:101"
                  },
                  "returnParameters": {
                    "id": 23070,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "46883:0:101"
                  },
                  "scope": 25062,
                  "src": "46811:166:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23105,
                    "nodeType": "Block",
                    "src": "47043:92:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c626f6f6c2c626f6f6c2c626f6f6c29",
                                  "id": 23097,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "47087:26:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_3b2a5ce0ddf7b166153a4354c81efba12a817983a38c6bc3b58fd91ce816d99f",
                                    "typeString": "literal_string \"log(bool,bool,bool,bool)\""
                                  },
                                  "value": "log(bool,bool,bool,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23098,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23085,
                                  "src": "47115:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23099,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23087,
                                  "src": "47119:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23100,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23089,
                                  "src": "47123:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23101,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23091,
                                  "src": "47127:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_3b2a5ce0ddf7b166153a4354c81efba12a817983a38c6bc3b58fd91ce816d99f",
                                    "typeString": "literal_string \"log(bool,bool,bool,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23095,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "47063:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23096,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "47063:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23102,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "47063:67:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23094,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "47047:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23103,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "47047:84:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23104,
                        "nodeType": "ExpressionStatement",
                        "src": "47047:84:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23106,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23092,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23085,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23106,
                        "src": "46993:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23084,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "46993:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23087,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23106,
                        "src": "47002:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23086,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "47002:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23089,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23106,
                        "src": "47011:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23088,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "47011:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23091,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23106,
                        "src": "47020:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23090,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "47020:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "46992:36:101"
                  },
                  "returnParameters": {
                    "id": 23093,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "47043:0:101"
                  },
                  "scope": 25062,
                  "src": "46980:155:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23128,
                    "nodeType": "Block",
                    "src": "47204:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c626f6f6c2c626f6f6c2c6164647265737329",
                                  "id": 23120,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "47248:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_8c329b1a1752dedfc6b781d23096b49b7f905d62405e6e3f0ab0344786ff69f4",
                                    "typeString": "literal_string \"log(bool,bool,bool,address)\""
                                  },
                                  "value": "log(bool,bool,bool,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23121,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23108,
                                  "src": "47279:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23122,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23110,
                                  "src": "47283:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23123,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23112,
                                  "src": "47287:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23124,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23114,
                                  "src": "47291:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_8c329b1a1752dedfc6b781d23096b49b7f905d62405e6e3f0ab0344786ff69f4",
                                    "typeString": "literal_string \"log(bool,bool,bool,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23118,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "47224:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23119,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "47224:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23125,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "47224:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23117,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "47208:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23126,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "47208:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23127,
                        "nodeType": "ExpressionStatement",
                        "src": "47208:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23129,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23115,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23108,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23129,
                        "src": "47151:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23107,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "47151:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23110,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23129,
                        "src": "47160:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23109,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "47160:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23112,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23129,
                        "src": "47169:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23111,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "47169:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23114,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23129,
                        "src": "47178:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23113,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "47178:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "47150:39:101"
                  },
                  "returnParameters": {
                    "id": 23116,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "47204:0:101"
                  },
                  "scope": 25062,
                  "src": "47138:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23151,
                    "nodeType": "Block",
                    "src": "47368:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c626f6f6c2c616464726573732c75696e7429",
                                  "id": 23143,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "47412:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_609386e78fd5b0eaf4b919077203f18b1606ddf72247d9e5eef9238918f7cf5e",
                                    "typeString": "literal_string \"log(bool,bool,address,uint)\""
                                  },
                                  "value": "log(bool,bool,address,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23144,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23131,
                                  "src": "47443:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23145,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23133,
                                  "src": "47447:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23146,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23135,
                                  "src": "47451:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23147,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23137,
                                  "src": "47455:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_609386e78fd5b0eaf4b919077203f18b1606ddf72247d9e5eef9238918f7cf5e",
                                    "typeString": "literal_string \"log(bool,bool,address,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23141,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "47388:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23142,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "47388:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23148,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "47388:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23140,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "47372:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23149,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "47372:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23150,
                        "nodeType": "ExpressionStatement",
                        "src": "47372:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23152,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23138,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23131,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23152,
                        "src": "47315:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23130,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "47315:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23133,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23152,
                        "src": "47324:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23132,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "47324:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23135,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23152,
                        "src": "47333:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23134,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "47333:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23137,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23152,
                        "src": "47345:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23136,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "47345:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "47314:39:101"
                  },
                  "returnParameters": {
                    "id": 23139,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "47368:0:101"
                  },
                  "scope": 25062,
                  "src": "47302:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23174,
                    "nodeType": "Block",
                    "src": "47541:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c626f6f6c2c616464726573732c737472696e6729",
                                  "id": 23166,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "47585:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_a0a479635c05dee438b610769de0f667f2e93ee267e4cd4badf3dd44eb6271d2",
                                    "typeString": "literal_string \"log(bool,bool,address,string)\""
                                  },
                                  "value": "log(bool,bool,address,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23167,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23154,
                                  "src": "47618:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23168,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23156,
                                  "src": "47622:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23169,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23158,
                                  "src": "47626:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23170,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23160,
                                  "src": "47630:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_a0a479635c05dee438b610769de0f667f2e93ee267e4cd4badf3dd44eb6271d2",
                                    "typeString": "literal_string \"log(bool,bool,address,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23164,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "47561:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23165,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "47561:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23171,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "47561:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23163,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "47545:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23172,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "47545:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23173,
                        "nodeType": "ExpressionStatement",
                        "src": "47545:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23175,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23161,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23154,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23175,
                        "src": "47479:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23153,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "47479:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23156,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23175,
                        "src": "47488:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23155,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "47488:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23158,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23175,
                        "src": "47497:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23157,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "47497:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23160,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23175,
                        "src": "47509:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 23159,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "47509:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "47478:48:101"
                  },
                  "returnParameters": {
                    "id": 23162,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "47541:0:101"
                  },
                  "scope": 25062,
                  "src": "47466:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23197,
                    "nodeType": "Block",
                    "src": "47707:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c626f6f6c2c616464726573732c626f6f6c29",
                                  "id": 23189,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "47751:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c0a302d8f11e8919127c20f396068f7014b94967efb042778db9b27b68ee1eaf",
                                    "typeString": "literal_string \"log(bool,bool,address,bool)\""
                                  },
                                  "value": "log(bool,bool,address,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23190,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23177,
                                  "src": "47782:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23191,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23179,
                                  "src": "47786:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23192,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23181,
                                  "src": "47790:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23193,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23183,
                                  "src": "47794:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_c0a302d8f11e8919127c20f396068f7014b94967efb042778db9b27b68ee1eaf",
                                    "typeString": "literal_string \"log(bool,bool,address,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23187,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "47727:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23188,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "47727:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23194,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "47727:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23186,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "47711:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23195,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "47711:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23196,
                        "nodeType": "ExpressionStatement",
                        "src": "47711:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23198,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23184,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23177,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23198,
                        "src": "47654:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23176,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "47654:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23179,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23198,
                        "src": "47663:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23178,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "47663:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23181,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23198,
                        "src": "47672:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23180,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "47672:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23183,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23198,
                        "src": "47684:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23182,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "47684:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "47653:39:101"
                  },
                  "returnParameters": {
                    "id": 23185,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "47707:0:101"
                  },
                  "scope": 25062,
                  "src": "47641:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23220,
                    "nodeType": "Block",
                    "src": "47874:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c626f6f6c2c616464726573732c6164647265737329",
                                  "id": 23212,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "47918:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_f4880ea4063b4f7e3c68468bb4a7a3f1502aa7497bce4fb0ba02ec0450f047f4",
                                    "typeString": "literal_string \"log(bool,bool,address,address)\""
                                  },
                                  "value": "log(bool,bool,address,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23213,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23200,
                                  "src": "47952:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23214,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23202,
                                  "src": "47956:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23215,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23204,
                                  "src": "47960:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23216,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23206,
                                  "src": "47964:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_f4880ea4063b4f7e3c68468bb4a7a3f1502aa7497bce4fb0ba02ec0450f047f4",
                                    "typeString": "literal_string \"log(bool,bool,address,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23210,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "47894:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23211,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "47894:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23217,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "47894:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23209,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "47878:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23218,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "47878:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23219,
                        "nodeType": "ExpressionStatement",
                        "src": "47878:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23221,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23207,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23200,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23221,
                        "src": "47818:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23199,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "47818:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23202,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23221,
                        "src": "47827:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23201,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "47827:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23204,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23221,
                        "src": "47836:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23203,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "47836:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23206,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23221,
                        "src": "47848:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23205,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "47848:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "47817:42:101"
                  },
                  "returnParameters": {
                    "id": 23208,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "47874:0:101"
                  },
                  "scope": 25062,
                  "src": "47805:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23243,
                    "nodeType": "Block",
                    "src": "48041:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c616464726573732c75696e742c75696e7429",
                                  "id": 23235,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "48085:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_9bfe72bcae17311bf78638487cb2635e8b5b6f81761042494681e890b65ae4df",
                                    "typeString": "literal_string \"log(bool,address,uint,uint)\""
                                  },
                                  "value": "log(bool,address,uint,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23236,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23223,
                                  "src": "48116:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23237,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23225,
                                  "src": "48120:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23238,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23227,
                                  "src": "48124:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23239,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23229,
                                  "src": "48128:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_9bfe72bcae17311bf78638487cb2635e8b5b6f81761042494681e890b65ae4df",
                                    "typeString": "literal_string \"log(bool,address,uint,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23233,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "48061:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23234,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "48061:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23240,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "48061:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23232,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "48045:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23241,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "48045:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23242,
                        "nodeType": "ExpressionStatement",
                        "src": "48045:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23244,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23230,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23223,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23244,
                        "src": "47988:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23222,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "47988:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23225,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23244,
                        "src": "47997:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23224,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "47997:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23227,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23244,
                        "src": "48009:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23226,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "48009:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23229,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23244,
                        "src": "48018:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23228,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "48018:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "47987:39:101"
                  },
                  "returnParameters": {
                    "id": 23231,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "48041:0:101"
                  },
                  "scope": 25062,
                  "src": "47975:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23266,
                    "nodeType": "Block",
                    "src": "48214:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c616464726573732c75696e742c737472696e6729",
                                  "id": 23258,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "48258:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_a0685833a55270d98fa68e8c0a0f64fe3e03f6cdaeaebd8f87342de905392f45",
                                    "typeString": "literal_string \"log(bool,address,uint,string)\""
                                  },
                                  "value": "log(bool,address,uint,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23259,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23246,
                                  "src": "48291:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23260,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23248,
                                  "src": "48295:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23261,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23250,
                                  "src": "48299:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23262,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23252,
                                  "src": "48303:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_a0685833a55270d98fa68e8c0a0f64fe3e03f6cdaeaebd8f87342de905392f45",
                                    "typeString": "literal_string \"log(bool,address,uint,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23256,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "48234:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23257,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "48234:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23263,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "48234:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23255,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "48218:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23264,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "48218:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23265,
                        "nodeType": "ExpressionStatement",
                        "src": "48218:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23267,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23253,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23246,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23267,
                        "src": "48152:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23245,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "48152:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23248,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23267,
                        "src": "48161:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23247,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "48161:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23250,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23267,
                        "src": "48173:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23249,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "48173:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23252,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23267,
                        "src": "48182:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 23251,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "48182:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "48151:48:101"
                  },
                  "returnParameters": {
                    "id": 23254,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "48214:0:101"
                  },
                  "scope": 25062,
                  "src": "48139:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23289,
                    "nodeType": "Block",
                    "src": "48380:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c616464726573732c75696e742c626f6f6c29",
                                  "id": 23281,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "48424:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_ee8d8672273fdba9089296874ea62335af7f94273edab558dd69c0c81ad5275f",
                                    "typeString": "literal_string \"log(bool,address,uint,bool)\""
                                  },
                                  "value": "log(bool,address,uint,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23282,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23269,
                                  "src": "48455:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23283,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23271,
                                  "src": "48459:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23284,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23273,
                                  "src": "48463:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23285,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23275,
                                  "src": "48467:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_ee8d8672273fdba9089296874ea62335af7f94273edab558dd69c0c81ad5275f",
                                    "typeString": "literal_string \"log(bool,address,uint,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23279,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "48400:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23280,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "48400:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23286,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "48400:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23278,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "48384:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23287,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "48384:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23288,
                        "nodeType": "ExpressionStatement",
                        "src": "48384:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23290,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23276,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23269,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23290,
                        "src": "48327:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23268,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "48327:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23271,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23290,
                        "src": "48336:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23270,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "48336:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23273,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23290,
                        "src": "48348:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23272,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "48348:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23275,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23290,
                        "src": "48357:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23274,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "48357:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "48326:39:101"
                  },
                  "returnParameters": {
                    "id": 23277,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "48380:0:101"
                  },
                  "scope": 25062,
                  "src": "48314:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23312,
                    "nodeType": "Block",
                    "src": "48547:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c616464726573732c75696e742c6164647265737329",
                                  "id": 23304,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "48591:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_68f158b5f9bd826807d19c20c2d71bd298a10503195154a299bf8d64baa18687",
                                    "typeString": "literal_string \"log(bool,address,uint,address)\""
                                  },
                                  "value": "log(bool,address,uint,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23305,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23292,
                                  "src": "48625:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23306,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23294,
                                  "src": "48629:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23307,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23296,
                                  "src": "48633:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23308,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23298,
                                  "src": "48637:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_68f158b5f9bd826807d19c20c2d71bd298a10503195154a299bf8d64baa18687",
                                    "typeString": "literal_string \"log(bool,address,uint,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23302,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "48567:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23303,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "48567:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23309,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "48567:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23301,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "48551:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23310,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "48551:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23311,
                        "nodeType": "ExpressionStatement",
                        "src": "48551:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23313,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23299,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23292,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23313,
                        "src": "48491:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23291,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "48491:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23294,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23313,
                        "src": "48500:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23293,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "48500:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23296,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23313,
                        "src": "48512:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23295,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "48512:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23298,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23313,
                        "src": "48521:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23297,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "48521:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "48490:42:101"
                  },
                  "returnParameters": {
                    "id": 23300,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "48547:0:101"
                  },
                  "scope": 25062,
                  "src": "48478:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23335,
                    "nodeType": "Block",
                    "src": "48723:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c616464726573732c737472696e672c75696e7429",
                                  "id": 23327,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "48767:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_0b99fc2207222410afd35c7faf7feba54ff2367ba89f893584c27ce75693de6e",
                                    "typeString": "literal_string \"log(bool,address,string,uint)\""
                                  },
                                  "value": "log(bool,address,string,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23328,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23315,
                                  "src": "48800:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23329,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23317,
                                  "src": "48804:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23330,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23319,
                                  "src": "48808:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23331,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23321,
                                  "src": "48812:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_0b99fc2207222410afd35c7faf7feba54ff2367ba89f893584c27ce75693de6e",
                                    "typeString": "literal_string \"log(bool,address,string,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23325,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "48743:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23326,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "48743:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23332,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "48743:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23324,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "48727:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23333,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "48727:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23334,
                        "nodeType": "ExpressionStatement",
                        "src": "48727:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23336,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23322,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23315,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23336,
                        "src": "48661:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23314,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "48661:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23317,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23336,
                        "src": "48670:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23316,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "48670:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23319,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23336,
                        "src": "48682:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 23318,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "48682:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23321,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23336,
                        "src": "48700:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23320,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "48700:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "48660:48:101"
                  },
                  "returnParameters": {
                    "id": 23323,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "48723:0:101"
                  },
                  "scope": 25062,
                  "src": "48648:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23358,
                    "nodeType": "Block",
                    "src": "48907:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c616464726573732c737472696e672c737472696e6729",
                                  "id": 23350,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "48951:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_a73c1db639dbf1382c9113eacdf5b14a7ccd81fc001ac60393623936011bf49d",
                                    "typeString": "literal_string \"log(bool,address,string,string)\""
                                  },
                                  "value": "log(bool,address,string,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23351,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23338,
                                  "src": "48986:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23352,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23340,
                                  "src": "48990:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23353,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23342,
                                  "src": "48994:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23354,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23344,
                                  "src": "48998:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_a73c1db639dbf1382c9113eacdf5b14a7ccd81fc001ac60393623936011bf49d",
                                    "typeString": "literal_string \"log(bool,address,string,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23348,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "48927:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23349,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "48927:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23355,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "48927:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23347,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "48911:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23356,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "48911:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23357,
                        "nodeType": "ExpressionStatement",
                        "src": "48911:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23359,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23345,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23338,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23359,
                        "src": "48836:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23337,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "48836:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23340,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23359,
                        "src": "48845:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23339,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "48845:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23342,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23359,
                        "src": "48857:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 23341,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "48857:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23344,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23359,
                        "src": "48875:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 23343,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "48875:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "48835:57:101"
                  },
                  "returnParameters": {
                    "id": 23346,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "48907:0:101"
                  },
                  "scope": 25062,
                  "src": "48823:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23381,
                    "nodeType": "Block",
                    "src": "49084:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c616464726573732c737472696e672c626f6f6c29",
                                  "id": 23373,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "49128:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_e2bfd60b4f6acdab0603dda631b69bf37ab7cbf71bc5953f9ed72c1f2a76f7dc",
                                    "typeString": "literal_string \"log(bool,address,string,bool)\""
                                  },
                                  "value": "log(bool,address,string,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23374,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23361,
                                  "src": "49161:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23375,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23363,
                                  "src": "49165:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23376,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23365,
                                  "src": "49169:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23377,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23367,
                                  "src": "49173:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_e2bfd60b4f6acdab0603dda631b69bf37ab7cbf71bc5953f9ed72c1f2a76f7dc",
                                    "typeString": "literal_string \"log(bool,address,string,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23371,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "49104:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23372,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "49104:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23378,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "49104:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23370,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "49088:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23379,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "49088:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23380,
                        "nodeType": "ExpressionStatement",
                        "src": "49088:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23382,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23368,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23361,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23382,
                        "src": "49022:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23360,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "49022:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23363,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23382,
                        "src": "49031:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23362,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "49031:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23365,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23382,
                        "src": "49043:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 23364,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "49043:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23367,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23382,
                        "src": "49061:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23366,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "49061:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "49021:48:101"
                  },
                  "returnParameters": {
                    "id": 23369,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "49084:0:101"
                  },
                  "scope": 25062,
                  "src": "49009:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23404,
                    "nodeType": "Block",
                    "src": "49262:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c616464726573732c737472696e672c6164647265737329",
                                  "id": 23396,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "49306:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_6f7c603e9035cbc7959bb3d44ec862ddc6711eecebd67d54ceb0010f42f85654",
                                    "typeString": "literal_string \"log(bool,address,string,address)\""
                                  },
                                  "value": "log(bool,address,string,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23397,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23384,
                                  "src": "49342:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23398,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23386,
                                  "src": "49346:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23399,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23388,
                                  "src": "49350:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23400,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23390,
                                  "src": "49354:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_6f7c603e9035cbc7959bb3d44ec862ddc6711eecebd67d54ceb0010f42f85654",
                                    "typeString": "literal_string \"log(bool,address,string,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23394,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "49282:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23395,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "49282:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23401,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "49282:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23393,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "49266:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23402,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "49266:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23403,
                        "nodeType": "ExpressionStatement",
                        "src": "49266:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23405,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23391,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23384,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23405,
                        "src": "49197:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23383,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "49197:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23386,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23405,
                        "src": "49206:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23385,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "49206:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23388,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23405,
                        "src": "49218:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 23387,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "49218:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23390,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23405,
                        "src": "49236:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23389,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "49236:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "49196:51:101"
                  },
                  "returnParameters": {
                    "id": 23392,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "49262:0:101"
                  },
                  "scope": 25062,
                  "src": "49184:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23427,
                    "nodeType": "Block",
                    "src": "49431:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c616464726573732c626f6f6c2c75696e7429",
                                  "id": 23419,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "49475:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_4cb60fd1171fb665e1565124463601e5c451a362c8efbc6e1fcfbffbbb9850d9",
                                    "typeString": "literal_string \"log(bool,address,bool,uint)\""
                                  },
                                  "value": "log(bool,address,bool,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23420,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23407,
                                  "src": "49506:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23421,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23409,
                                  "src": "49510:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23422,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23411,
                                  "src": "49514:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23423,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23413,
                                  "src": "49518:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_4cb60fd1171fb665e1565124463601e5c451a362c8efbc6e1fcfbffbbb9850d9",
                                    "typeString": "literal_string \"log(bool,address,bool,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23417,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "49451:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23418,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "49451:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23424,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "49451:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23416,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "49435:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23425,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "49435:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23426,
                        "nodeType": "ExpressionStatement",
                        "src": "49435:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23428,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23414,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23407,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23428,
                        "src": "49378:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23406,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "49378:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23409,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23428,
                        "src": "49387:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23408,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "49387:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23411,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23428,
                        "src": "49399:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23410,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "49399:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23413,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23428,
                        "src": "49408:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23412,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "49408:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "49377:39:101"
                  },
                  "returnParameters": {
                    "id": 23415,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "49431:0:101"
                  },
                  "scope": 25062,
                  "src": "49365:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23450,
                    "nodeType": "Block",
                    "src": "49604:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c616464726573732c626f6f6c2c737472696e6729",
                                  "id": 23442,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "49648:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_4a66cb34796065525d301a5b87b440b55f1936e34dd66e2f2039307bc4e3ea59",
                                    "typeString": "literal_string \"log(bool,address,bool,string)\""
                                  },
                                  "value": "log(bool,address,bool,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23443,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23430,
                                  "src": "49681:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23444,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23432,
                                  "src": "49685:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23445,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23434,
                                  "src": "49689:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23446,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23436,
                                  "src": "49693:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_4a66cb34796065525d301a5b87b440b55f1936e34dd66e2f2039307bc4e3ea59",
                                    "typeString": "literal_string \"log(bool,address,bool,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23440,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "49624:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23441,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "49624:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23447,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "49624:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23439,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "49608:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23448,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "49608:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23449,
                        "nodeType": "ExpressionStatement",
                        "src": "49608:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23451,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23437,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23430,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23451,
                        "src": "49542:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23429,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "49542:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23432,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23451,
                        "src": "49551:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23431,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "49551:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23434,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23451,
                        "src": "49563:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23433,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "49563:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23436,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23451,
                        "src": "49572:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 23435,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "49572:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "49541:48:101"
                  },
                  "returnParameters": {
                    "id": 23438,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "49604:0:101"
                  },
                  "scope": 25062,
                  "src": "49529:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23473,
                    "nodeType": "Block",
                    "src": "49770:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c616464726573732c626f6f6c2c626f6f6c29",
                                  "id": 23465,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "49814:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_6a9c478bc98300d44308882e2e0b5864f2536a2939cb77105f503738b5832577",
                                    "typeString": "literal_string \"log(bool,address,bool,bool)\""
                                  },
                                  "value": "log(bool,address,bool,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23466,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23453,
                                  "src": "49845:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23467,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23455,
                                  "src": "49849:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23468,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23457,
                                  "src": "49853:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23469,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23459,
                                  "src": "49857:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_6a9c478bc98300d44308882e2e0b5864f2536a2939cb77105f503738b5832577",
                                    "typeString": "literal_string \"log(bool,address,bool,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23463,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "49790:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23464,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "49790:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23470,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "49790:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23462,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "49774:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23471,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "49774:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23472,
                        "nodeType": "ExpressionStatement",
                        "src": "49774:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23474,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23460,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23453,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23474,
                        "src": "49717:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23452,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "49717:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23455,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23474,
                        "src": "49726:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23454,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "49726:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23457,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23474,
                        "src": "49738:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23456,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "49738:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23459,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23474,
                        "src": "49747:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23458,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "49747:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "49716:39:101"
                  },
                  "returnParameters": {
                    "id": 23461,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "49770:0:101"
                  },
                  "scope": 25062,
                  "src": "49704:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23496,
                    "nodeType": "Block",
                    "src": "49937:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c616464726573732c626f6f6c2c6164647265737329",
                                  "id": 23488,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "49981:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_1c41a336759f1c2fe1d8b137296b2dfbdcfe7114fc53f203852c2835c09f8870",
                                    "typeString": "literal_string \"log(bool,address,bool,address)\""
                                  },
                                  "value": "log(bool,address,bool,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23489,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23476,
                                  "src": "50015:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23490,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23478,
                                  "src": "50019:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23491,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23480,
                                  "src": "50023:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23492,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23482,
                                  "src": "50027:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_1c41a336759f1c2fe1d8b137296b2dfbdcfe7114fc53f203852c2835c09f8870",
                                    "typeString": "literal_string \"log(bool,address,bool,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23486,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "49957:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23487,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "49957:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23493,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "49957:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23485,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "49941:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23494,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "49941:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23495,
                        "nodeType": "ExpressionStatement",
                        "src": "49941:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23497,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23483,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23476,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23497,
                        "src": "49881:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23475,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "49881:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23478,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23497,
                        "src": "49890:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23477,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "49890:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23480,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23497,
                        "src": "49902:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23479,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "49902:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23482,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23497,
                        "src": "49911:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23481,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "49911:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "49880:42:101"
                  },
                  "returnParameters": {
                    "id": 23484,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "49937:0:101"
                  },
                  "scope": 25062,
                  "src": "49868:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23519,
                    "nodeType": "Block",
                    "src": "50107:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c616464726573732c616464726573732c75696e7429",
                                  "id": 23511,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "50151:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_5284bd6c2d02d32d79d43dcd0793be5ced63bf4e51bea38208974f6d8ca5def7",
                                    "typeString": "literal_string \"log(bool,address,address,uint)\""
                                  },
                                  "value": "log(bool,address,address,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23512,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23499,
                                  "src": "50185:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23513,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23501,
                                  "src": "50189:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23514,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23503,
                                  "src": "50193:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23515,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23505,
                                  "src": "50197:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_5284bd6c2d02d32d79d43dcd0793be5ced63bf4e51bea38208974f6d8ca5def7",
                                    "typeString": "literal_string \"log(bool,address,address,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23509,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "50127:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23510,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "50127:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23516,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "50127:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23508,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "50111:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23517,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "50111:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23518,
                        "nodeType": "ExpressionStatement",
                        "src": "50111:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23520,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23506,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23499,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23520,
                        "src": "50051:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23498,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "50051:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23501,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23520,
                        "src": "50060:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23500,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "50060:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23503,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23520,
                        "src": "50072:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23502,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "50072:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23505,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23520,
                        "src": "50084:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23504,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "50084:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "50050:42:101"
                  },
                  "returnParameters": {
                    "id": 23507,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "50107:0:101"
                  },
                  "scope": 25062,
                  "src": "50038:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23542,
                    "nodeType": "Block",
                    "src": "50286:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c616464726573732c616464726573732c737472696e6729",
                                  "id": 23534,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "50330:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_d812a167fb7ec8cf55a11f06ff411238f0a431de331592d8a735c8c8481f7432",
                                    "typeString": "literal_string \"log(bool,address,address,string)\""
                                  },
                                  "value": "log(bool,address,address,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23535,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23522,
                                  "src": "50366:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23536,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23524,
                                  "src": "50370:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23537,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23526,
                                  "src": "50374:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23538,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23528,
                                  "src": "50378:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_d812a167fb7ec8cf55a11f06ff411238f0a431de331592d8a735c8c8481f7432",
                                    "typeString": "literal_string \"log(bool,address,address,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23532,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "50306:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23533,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "50306:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23539,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "50306:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23531,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "50290:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23540,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "50290:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23541,
                        "nodeType": "ExpressionStatement",
                        "src": "50290:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23543,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23529,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23522,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23543,
                        "src": "50221:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23521,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "50221:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23524,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23543,
                        "src": "50230:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23523,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "50230:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23526,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23543,
                        "src": "50242:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23525,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "50242:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23528,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23543,
                        "src": "50254:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 23527,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "50254:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "50220:51:101"
                  },
                  "returnParameters": {
                    "id": 23530,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "50286:0:101"
                  },
                  "scope": 25062,
                  "src": "50208:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23565,
                    "nodeType": "Block",
                    "src": "50458:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c616464726573732c616464726573732c626f6f6c29",
                                  "id": 23557,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "50502:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_46600be071bbf2a7e3a3cb4fd0e6efe39e86453e4c4a27c400470867be7afd9e",
                                    "typeString": "literal_string \"log(bool,address,address,bool)\""
                                  },
                                  "value": "log(bool,address,address,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23558,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23545,
                                  "src": "50536:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23559,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23547,
                                  "src": "50540:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23560,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23549,
                                  "src": "50544:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23561,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23551,
                                  "src": "50548:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_46600be071bbf2a7e3a3cb4fd0e6efe39e86453e4c4a27c400470867be7afd9e",
                                    "typeString": "literal_string \"log(bool,address,address,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23555,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "50478:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23556,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "50478:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23562,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "50478:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23554,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "50462:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23563,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "50462:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23564,
                        "nodeType": "ExpressionStatement",
                        "src": "50462:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23566,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23552,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23545,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23566,
                        "src": "50402:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23544,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "50402:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23547,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23566,
                        "src": "50411:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23546,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "50411:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23549,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23566,
                        "src": "50423:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23548,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "50423:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23551,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23566,
                        "src": "50435:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23550,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "50435:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "50401:42:101"
                  },
                  "returnParameters": {
                    "id": 23553,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "50458:0:101"
                  },
                  "scope": 25062,
                  "src": "50389:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23588,
                    "nodeType": "Block",
                    "src": "50631:101:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728626f6f6c2c616464726573732c616464726573732c6164647265737329",
                                  "id": 23580,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "50675:35:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_1d14d00189540d88098b9fe614aa8c0efbe231c1a0fee05e7d705c0342377123",
                                    "typeString": "literal_string \"log(bool,address,address,address)\""
                                  },
                                  "value": "log(bool,address,address,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23581,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23568,
                                  "src": "50712:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23582,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23570,
                                  "src": "50716:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23583,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23572,
                                  "src": "50720:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23584,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23574,
                                  "src": "50724:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_1d14d00189540d88098b9fe614aa8c0efbe231c1a0fee05e7d705c0342377123",
                                    "typeString": "literal_string \"log(bool,address,address,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23578,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "50651:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23579,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "50651:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23585,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "50651:76:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23577,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "50635:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23586,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "50635:93:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23587,
                        "nodeType": "ExpressionStatement",
                        "src": "50635:93:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23589,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23575,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23568,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23589,
                        "src": "50572:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23567,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "50572:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23570,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23589,
                        "src": "50581:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23569,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "50581:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23572,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23589,
                        "src": "50593:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23571,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "50593:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23574,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23589,
                        "src": "50605:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23573,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "50605:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "50571:45:101"
                  },
                  "returnParameters": {
                    "id": 23576,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "50631:0:101"
                  },
                  "scope": 25062,
                  "src": "50559:173:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23611,
                    "nodeType": "Block",
                    "src": "50801:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c75696e742c75696e742c75696e7429",
                                  "id": 23603,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "50845:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_3d0e9de46a80fe11d0044e9599dfddd0e8b842cabe189638f7090f19867918c1",
                                    "typeString": "literal_string \"log(address,uint,uint,uint)\""
                                  },
                                  "value": "log(address,uint,uint,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23604,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23591,
                                  "src": "50876:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23605,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23593,
                                  "src": "50880:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23606,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23595,
                                  "src": "50884:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23607,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23597,
                                  "src": "50888:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_3d0e9de46a80fe11d0044e9599dfddd0e8b842cabe189638f7090f19867918c1",
                                    "typeString": "literal_string \"log(address,uint,uint,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23601,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "50821:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23602,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "50821:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23608,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "50821:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23600,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "50805:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23609,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "50805:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23610,
                        "nodeType": "ExpressionStatement",
                        "src": "50805:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23612,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23598,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23591,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23612,
                        "src": "50748:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23590,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "50748:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23593,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23612,
                        "src": "50760:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23592,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "50760:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23595,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23612,
                        "src": "50769:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23594,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "50769:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23597,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23612,
                        "src": "50778:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23596,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "50778:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "50747:39:101"
                  },
                  "returnParameters": {
                    "id": 23599,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "50801:0:101"
                  },
                  "scope": 25062,
                  "src": "50735:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23634,
                    "nodeType": "Block",
                    "src": "50974:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c75696e742c75696e742c737472696e6729",
                                  "id": 23626,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "51018:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_89340dab4d23e956541beb32775ccfee8376ba263886dd811a646420a3a403a3",
                                    "typeString": "literal_string \"log(address,uint,uint,string)\""
                                  },
                                  "value": "log(address,uint,uint,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23627,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23614,
                                  "src": "51051:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23628,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23616,
                                  "src": "51055:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23629,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23618,
                                  "src": "51059:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23630,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23620,
                                  "src": "51063:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_89340dab4d23e956541beb32775ccfee8376ba263886dd811a646420a3a403a3",
                                    "typeString": "literal_string \"log(address,uint,uint,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23624,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "50994:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23625,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "50994:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23631,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "50994:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23623,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "50978:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23632,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "50978:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23633,
                        "nodeType": "ExpressionStatement",
                        "src": "50978:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23635,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23621,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23614,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23635,
                        "src": "50912:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23613,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "50912:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23616,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23635,
                        "src": "50924:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23615,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "50924:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23618,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23635,
                        "src": "50933:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23617,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "50933:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23620,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23635,
                        "src": "50942:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 23619,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "50942:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "50911:48:101"
                  },
                  "returnParameters": {
                    "id": 23622,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "50974:0:101"
                  },
                  "scope": 25062,
                  "src": "50899:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23657,
                    "nodeType": "Block",
                    "src": "51140:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c75696e742c75696e742c626f6f6c29",
                                  "id": 23649,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "51184:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_ec4ba8a24543362f628480c68bc2d6749e97ab33d46530db336a528c77e48393",
                                    "typeString": "literal_string \"log(address,uint,uint,bool)\""
                                  },
                                  "value": "log(address,uint,uint,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23650,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23637,
                                  "src": "51215:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23651,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23639,
                                  "src": "51219:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23652,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23641,
                                  "src": "51223:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23653,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23643,
                                  "src": "51227:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_ec4ba8a24543362f628480c68bc2d6749e97ab33d46530db336a528c77e48393",
                                    "typeString": "literal_string \"log(address,uint,uint,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23647,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "51160:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23648,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "51160:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23654,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "51160:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23646,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "51144:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23655,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "51144:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23656,
                        "nodeType": "ExpressionStatement",
                        "src": "51144:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23658,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23644,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23637,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23658,
                        "src": "51087:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23636,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "51087:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23639,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23658,
                        "src": "51099:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23638,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "51099:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23641,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23658,
                        "src": "51108:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23640,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "51108:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23643,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23658,
                        "src": "51117:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23642,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "51117:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "51086:39:101"
                  },
                  "returnParameters": {
                    "id": 23645,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "51140:0:101"
                  },
                  "scope": 25062,
                  "src": "51074:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23680,
                    "nodeType": "Block",
                    "src": "51307:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c75696e742c75696e742c6164647265737329",
                                  "id": 23672,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "51351:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_1ef634347c2e4a2aa1a4e4e13d33bf0169f02bc4d10ff6168ca604cf3134d957",
                                    "typeString": "literal_string \"log(address,uint,uint,address)\""
                                  },
                                  "value": "log(address,uint,uint,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23673,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23660,
                                  "src": "51385:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23674,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23662,
                                  "src": "51389:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23675,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23664,
                                  "src": "51393:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23676,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23666,
                                  "src": "51397:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_1ef634347c2e4a2aa1a4e4e13d33bf0169f02bc4d10ff6168ca604cf3134d957",
                                    "typeString": "literal_string \"log(address,uint,uint,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23670,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "51327:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23671,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "51327:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23677,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "51327:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23669,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "51311:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23678,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "51311:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23679,
                        "nodeType": "ExpressionStatement",
                        "src": "51311:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23681,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23667,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23660,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23681,
                        "src": "51251:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23659,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "51251:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23662,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23681,
                        "src": "51263:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23661,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "51263:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23664,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23681,
                        "src": "51272:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23663,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "51272:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23666,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23681,
                        "src": "51281:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23665,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "51281:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "51250:42:101"
                  },
                  "returnParameters": {
                    "id": 23668,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "51307:0:101"
                  },
                  "scope": 25062,
                  "src": "51238:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23703,
                    "nodeType": "Block",
                    "src": "51483:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c75696e742c737472696e672c75696e7429",
                                  "id": 23695,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "51527:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_f512cf9b6f6b16313e82164dab4a017b25c36dde729112fd1b69de438557701b",
                                    "typeString": "literal_string \"log(address,uint,string,uint)\""
                                  },
                                  "value": "log(address,uint,string,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23696,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23683,
                                  "src": "51560:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23697,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23685,
                                  "src": "51564:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23698,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23687,
                                  "src": "51568:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23699,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23689,
                                  "src": "51572:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_f512cf9b6f6b16313e82164dab4a017b25c36dde729112fd1b69de438557701b",
                                    "typeString": "literal_string \"log(address,uint,string,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23693,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "51503:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23694,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "51503:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23700,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "51503:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23692,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "51487:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23701,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "51487:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23702,
                        "nodeType": "ExpressionStatement",
                        "src": "51487:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23704,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23690,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23683,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23704,
                        "src": "51421:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23682,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "51421:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23685,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23704,
                        "src": "51433:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23684,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "51433:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23687,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23704,
                        "src": "51442:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 23686,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "51442:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23689,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23704,
                        "src": "51460:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23688,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "51460:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "51420:48:101"
                  },
                  "returnParameters": {
                    "id": 23691,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "51483:0:101"
                  },
                  "scope": 25062,
                  "src": "51408:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23726,
                    "nodeType": "Block",
                    "src": "51667:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c75696e742c737472696e672c737472696e6729",
                                  "id": 23718,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "51711:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_7e56c693294848e354fd0e0f30db9c459984681d518306ec606cfd6f328a5ba0",
                                    "typeString": "literal_string \"log(address,uint,string,string)\""
                                  },
                                  "value": "log(address,uint,string,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23719,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23706,
                                  "src": "51746:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23720,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23708,
                                  "src": "51750:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23721,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23710,
                                  "src": "51754:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23722,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23712,
                                  "src": "51758:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_7e56c693294848e354fd0e0f30db9c459984681d518306ec606cfd6f328a5ba0",
                                    "typeString": "literal_string \"log(address,uint,string,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23716,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "51687:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23717,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "51687:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23723,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "51687:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23715,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "51671:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23724,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "51671:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23725,
                        "nodeType": "ExpressionStatement",
                        "src": "51671:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23727,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23713,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23706,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23727,
                        "src": "51596:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23705,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "51596:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23708,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23727,
                        "src": "51608:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23707,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "51608:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23710,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23727,
                        "src": "51617:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 23709,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "51617:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23712,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23727,
                        "src": "51635:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 23711,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "51635:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "51595:57:101"
                  },
                  "returnParameters": {
                    "id": 23714,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "51667:0:101"
                  },
                  "scope": 25062,
                  "src": "51583:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23749,
                    "nodeType": "Block",
                    "src": "51844:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c75696e742c737472696e672c626f6f6c29",
                                  "id": 23741,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "51888:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_a4024f1195637e9b9bd0fa746905cf1693b1e0cd3e1c717a1cbc5279763b256a",
                                    "typeString": "literal_string \"log(address,uint,string,bool)\""
                                  },
                                  "value": "log(address,uint,string,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23742,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23729,
                                  "src": "51921:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23743,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23731,
                                  "src": "51925:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23744,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23733,
                                  "src": "51929:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23745,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23735,
                                  "src": "51933:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_a4024f1195637e9b9bd0fa746905cf1693b1e0cd3e1c717a1cbc5279763b256a",
                                    "typeString": "literal_string \"log(address,uint,string,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23739,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "51864:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23740,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "51864:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23746,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "51864:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23738,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "51848:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23747,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "51848:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23748,
                        "nodeType": "ExpressionStatement",
                        "src": "51848:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23750,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23736,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23729,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23750,
                        "src": "51782:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23728,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "51782:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23731,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23750,
                        "src": "51794:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23730,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "51794:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23733,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23750,
                        "src": "51803:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 23732,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "51803:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23735,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23750,
                        "src": "51821:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23734,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "51821:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "51781:48:101"
                  },
                  "returnParameters": {
                    "id": 23737,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "51844:0:101"
                  },
                  "scope": 25062,
                  "src": "51769:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23772,
                    "nodeType": "Block",
                    "src": "52022:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c75696e742c737472696e672c6164647265737329",
                                  "id": 23764,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "52066:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_dc792604099307de53721f0c554f3059214ac3d8d1f6cd01cd16cf188835e809",
                                    "typeString": "literal_string \"log(address,uint,string,address)\""
                                  },
                                  "value": "log(address,uint,string,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23765,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23752,
                                  "src": "52102:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23766,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23754,
                                  "src": "52106:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23767,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23756,
                                  "src": "52110:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23768,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23758,
                                  "src": "52114:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_dc792604099307de53721f0c554f3059214ac3d8d1f6cd01cd16cf188835e809",
                                    "typeString": "literal_string \"log(address,uint,string,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23762,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "52042:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23763,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "52042:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23769,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "52042:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23761,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "52026:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23770,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "52026:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23771,
                        "nodeType": "ExpressionStatement",
                        "src": "52026:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23773,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23759,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23752,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23773,
                        "src": "51957:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23751,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "51957:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23754,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23773,
                        "src": "51969:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23753,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "51969:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23756,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23773,
                        "src": "51978:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 23755,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "51978:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23758,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23773,
                        "src": "51996:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23757,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "51996:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "51956:51:101"
                  },
                  "returnParameters": {
                    "id": 23760,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "52022:0:101"
                  },
                  "scope": 25062,
                  "src": "51944:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23795,
                    "nodeType": "Block",
                    "src": "52191:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c75696e742c626f6f6c2c75696e7429",
                                  "id": 23787,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "52235:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_698f43923a9354f67c861ae1c111970990b11c7f948743e5f44d6ea901e7f1a2",
                                    "typeString": "literal_string \"log(address,uint,bool,uint)\""
                                  },
                                  "value": "log(address,uint,bool,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23788,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23775,
                                  "src": "52266:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23789,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23777,
                                  "src": "52270:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23790,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23779,
                                  "src": "52274:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23791,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23781,
                                  "src": "52278:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_698f43923a9354f67c861ae1c111970990b11c7f948743e5f44d6ea901e7f1a2",
                                    "typeString": "literal_string \"log(address,uint,bool,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23785,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "52211:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23786,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "52211:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23792,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "52211:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23784,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "52195:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23793,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "52195:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23794,
                        "nodeType": "ExpressionStatement",
                        "src": "52195:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23796,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23782,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23775,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23796,
                        "src": "52138:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23774,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "52138:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23777,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23796,
                        "src": "52150:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23776,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "52150:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23779,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23796,
                        "src": "52159:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23778,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "52159:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23781,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23796,
                        "src": "52168:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23780,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "52168:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "52137:39:101"
                  },
                  "returnParameters": {
                    "id": 23783,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "52191:0:101"
                  },
                  "scope": 25062,
                  "src": "52125:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23818,
                    "nodeType": "Block",
                    "src": "52364:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c75696e742c626f6f6c2c737472696e6729",
                                  "id": 23810,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "52408:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_8e8e4e75a8ccb3f0e11ad74335eebf7a17a78463e99c3b077ff34193a8918f3f",
                                    "typeString": "literal_string \"log(address,uint,bool,string)\""
                                  },
                                  "value": "log(address,uint,bool,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23811,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23798,
                                  "src": "52441:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23812,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23800,
                                  "src": "52445:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23813,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23802,
                                  "src": "52449:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23814,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23804,
                                  "src": "52453:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_8e8e4e75a8ccb3f0e11ad74335eebf7a17a78463e99c3b077ff34193a8918f3f",
                                    "typeString": "literal_string \"log(address,uint,bool,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23808,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "52384:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23809,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "52384:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23815,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "52384:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23807,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "52368:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23816,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "52368:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23817,
                        "nodeType": "ExpressionStatement",
                        "src": "52368:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23819,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23805,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23798,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23819,
                        "src": "52302:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23797,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "52302:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23800,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23819,
                        "src": "52314:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23799,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "52314:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23802,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23819,
                        "src": "52323:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23801,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "52323:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23804,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23819,
                        "src": "52332:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 23803,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "52332:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "52301:48:101"
                  },
                  "returnParameters": {
                    "id": 23806,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "52364:0:101"
                  },
                  "scope": 25062,
                  "src": "52289:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23841,
                    "nodeType": "Block",
                    "src": "52530:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c75696e742c626f6f6c2c626f6f6c29",
                                  "id": 23833,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "52574:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_fea1d55aec42c422504acea77de45574d2fa3abd9dc9c6288741e19c3bd9849b",
                                    "typeString": "literal_string \"log(address,uint,bool,bool)\""
                                  },
                                  "value": "log(address,uint,bool,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23834,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23821,
                                  "src": "52605:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23835,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23823,
                                  "src": "52609:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23836,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23825,
                                  "src": "52613:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23837,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23827,
                                  "src": "52617:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_fea1d55aec42c422504acea77de45574d2fa3abd9dc9c6288741e19c3bd9849b",
                                    "typeString": "literal_string \"log(address,uint,bool,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23831,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "52550:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23832,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "52550:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23838,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "52550:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23830,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "52534:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23839,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "52534:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23840,
                        "nodeType": "ExpressionStatement",
                        "src": "52534:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23842,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23828,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23821,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23842,
                        "src": "52477:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23820,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "52477:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23823,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23842,
                        "src": "52489:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23822,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "52489:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23825,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23842,
                        "src": "52498:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23824,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "52498:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23827,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23842,
                        "src": "52507:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23826,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "52507:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "52476:39:101"
                  },
                  "returnParameters": {
                    "id": 23829,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "52530:0:101"
                  },
                  "scope": 25062,
                  "src": "52464:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23864,
                    "nodeType": "Block",
                    "src": "52697:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c75696e742c626f6f6c2c6164647265737329",
                                  "id": 23856,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "52741:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_23e5497254e625e6c33a3fa3eb47ff18f6bac3345da52f847bd5571820febf2d",
                                    "typeString": "literal_string \"log(address,uint,bool,address)\""
                                  },
                                  "value": "log(address,uint,bool,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23857,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23844,
                                  "src": "52775:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23858,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23846,
                                  "src": "52779:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23859,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23848,
                                  "src": "52783:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23860,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23850,
                                  "src": "52787:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_23e5497254e625e6c33a3fa3eb47ff18f6bac3345da52f847bd5571820febf2d",
                                    "typeString": "literal_string \"log(address,uint,bool,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23854,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "52717:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23855,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "52717:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23861,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "52717:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23853,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "52701:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23862,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "52701:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23863,
                        "nodeType": "ExpressionStatement",
                        "src": "52701:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23865,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23851,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23844,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23865,
                        "src": "52641:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23843,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "52641:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23846,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23865,
                        "src": "52653:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23845,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "52653:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23848,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23865,
                        "src": "52662:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23847,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "52662:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23850,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23865,
                        "src": "52671:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23849,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "52671:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "52640:42:101"
                  },
                  "returnParameters": {
                    "id": 23852,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "52697:0:101"
                  },
                  "scope": 25062,
                  "src": "52628:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23887,
                    "nodeType": "Block",
                    "src": "52867:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c75696e742c616464726573732c75696e7429",
                                  "id": 23879,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "52911:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_a5d98768f8145ad77f2cf1b1f44790c3edb28c68feadee43b01883b75311ac0e",
                                    "typeString": "literal_string \"log(address,uint,address,uint)\""
                                  },
                                  "value": "log(address,uint,address,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23880,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23867,
                                  "src": "52945:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23881,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23869,
                                  "src": "52949:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23882,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23871,
                                  "src": "52953:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23883,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23873,
                                  "src": "52957:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_a5d98768f8145ad77f2cf1b1f44790c3edb28c68feadee43b01883b75311ac0e",
                                    "typeString": "literal_string \"log(address,uint,address,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23877,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "52887:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23878,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "52887:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23884,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "52887:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23876,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "52871:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23885,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "52871:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23886,
                        "nodeType": "ExpressionStatement",
                        "src": "52871:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23888,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23874,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23867,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23888,
                        "src": "52811:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23866,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "52811:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23869,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23888,
                        "src": "52823:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23868,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "52823:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23871,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23888,
                        "src": "52832:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23870,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "52832:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23873,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23888,
                        "src": "52844:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23872,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "52844:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "52810:42:101"
                  },
                  "returnParameters": {
                    "id": 23875,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "52867:0:101"
                  },
                  "scope": 25062,
                  "src": "52798:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23910,
                    "nodeType": "Block",
                    "src": "53046:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c75696e742c616464726573732c737472696e6729",
                                  "id": 23902,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "53090:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_5d71f39ef468709ab1c82c125aa1311ff96f65f56794c27c7babe5651379e4b4",
                                    "typeString": "literal_string \"log(address,uint,address,string)\""
                                  },
                                  "value": "log(address,uint,address,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23903,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23890,
                                  "src": "53126:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23904,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23892,
                                  "src": "53130:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23905,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23894,
                                  "src": "53134:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23906,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23896,
                                  "src": "53138:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_5d71f39ef468709ab1c82c125aa1311ff96f65f56794c27c7babe5651379e4b4",
                                    "typeString": "literal_string \"log(address,uint,address,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23900,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "53066:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23901,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "53066:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23907,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "53066:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23899,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "53050:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23908,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "53050:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23909,
                        "nodeType": "ExpressionStatement",
                        "src": "53050:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23911,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23897,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23890,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23911,
                        "src": "52981:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23889,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "52981:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23892,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23911,
                        "src": "52993:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23891,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "52993:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23894,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23911,
                        "src": "53002:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23893,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "53002:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23896,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23911,
                        "src": "53014:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 23895,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "53014:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "52980:51:101"
                  },
                  "returnParameters": {
                    "id": 23898,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "53046:0:101"
                  },
                  "scope": 25062,
                  "src": "52968:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23933,
                    "nodeType": "Block",
                    "src": "53218:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c75696e742c616464726573732c626f6f6c29",
                                  "id": 23925,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "53262:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_f181a1e98aefbb6e5d63ca72f24da9aa3686f47d72314c12e70fa7843b309ee6",
                                    "typeString": "literal_string \"log(address,uint,address,bool)\""
                                  },
                                  "value": "log(address,uint,address,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23926,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23913,
                                  "src": "53296:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23927,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23915,
                                  "src": "53300:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23928,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23917,
                                  "src": "53304:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23929,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23919,
                                  "src": "53308:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_f181a1e98aefbb6e5d63ca72f24da9aa3686f47d72314c12e70fa7843b309ee6",
                                    "typeString": "literal_string \"log(address,uint,address,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23923,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "53238:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23924,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "53238:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23930,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "53238:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23922,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "53222:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23931,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "53222:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23932,
                        "nodeType": "ExpressionStatement",
                        "src": "53222:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23934,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23920,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23913,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23934,
                        "src": "53162:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23912,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "53162:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23915,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23934,
                        "src": "53174:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23914,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "53174:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23917,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23934,
                        "src": "53183:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23916,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "53183:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23919,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23934,
                        "src": "53195:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 23918,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "53195:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "53161:42:101"
                  },
                  "returnParameters": {
                    "id": 23921,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "53218:0:101"
                  },
                  "scope": 25062,
                  "src": "53149:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23956,
                    "nodeType": "Block",
                    "src": "53391:101:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c75696e742c616464726573732c6164647265737329",
                                  "id": 23948,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "53435:35:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_ec24846f1ed52bfa5dc64139c1bf8b03f991fdd5156eccb50dfe44ca5a2ca40e",
                                    "typeString": "literal_string \"log(address,uint,address,address)\""
                                  },
                                  "value": "log(address,uint,address,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23949,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23936,
                                  "src": "53472:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23950,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23938,
                                  "src": "53476:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23951,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23940,
                                  "src": "53480:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23952,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23942,
                                  "src": "53484:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_ec24846f1ed52bfa5dc64139c1bf8b03f991fdd5156eccb50dfe44ca5a2ca40e",
                                    "typeString": "literal_string \"log(address,uint,address,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23946,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "53411:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23947,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "53411:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23953,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "53411:76:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23945,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "53395:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23954,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "53395:93:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23955,
                        "nodeType": "ExpressionStatement",
                        "src": "53395:93:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23957,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23943,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23936,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23957,
                        "src": "53332:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23935,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "53332:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23938,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23957,
                        "src": "53344:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23937,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "53344:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23940,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23957,
                        "src": "53353:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23939,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "53353:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23942,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23957,
                        "src": "53365:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23941,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "53365:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "53331:45:101"
                  },
                  "returnParameters": {
                    "id": 23944,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "53391:0:101"
                  },
                  "scope": 25062,
                  "src": "53319:173:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 23979,
                    "nodeType": "Block",
                    "src": "53570:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c737472696e672c75696e742c75696e7429",
                                  "id": 23971,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "53614:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_a4c92a60ad8c7136a44d442238a838fba251b421248205a77f1a522d55c988af",
                                    "typeString": "literal_string \"log(address,string,uint,uint)\""
                                  },
                                  "value": "log(address,string,uint,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23972,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23959,
                                  "src": "53647:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23973,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23961,
                                  "src": "53651:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23974,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23963,
                                  "src": "53655:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23975,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23965,
                                  "src": "53659:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_a4c92a60ad8c7136a44d442238a838fba251b421248205a77f1a522d55c988af",
                                    "typeString": "literal_string \"log(address,string,uint,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23969,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "53590:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23970,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "53590:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23976,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "53590:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23968,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "53574:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 23977,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "53574:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 23978,
                        "nodeType": "ExpressionStatement",
                        "src": "53574:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 23980,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23966,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23959,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23980,
                        "src": "53508:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23958,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "53508:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23961,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23980,
                        "src": "53520:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 23960,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "53520:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23963,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23980,
                        "src": "53538:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23962,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "53538:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23965,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 23980,
                        "src": "53547:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23964,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "53547:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "53507:48:101"
                  },
                  "returnParameters": {
                    "id": 23967,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "53570:0:101"
                  },
                  "scope": 25062,
                  "src": "53495:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24002,
                    "nodeType": "Block",
                    "src": "53754:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c737472696e672c75696e742c737472696e6729",
                                  "id": 23994,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "53798:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_5d1365c94e45374e792b786edc547d0277c401db24a4303b5dd1e8a93df0829e",
                                    "typeString": "literal_string \"log(address,string,uint,string)\""
                                  },
                                  "value": "log(address,string,uint,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23995,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23982,
                                  "src": "53833:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23996,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23984,
                                  "src": "53837:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23997,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23986,
                                  "src": "53841:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 23998,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 23988,
                                  "src": "53845:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_5d1365c94e45374e792b786edc547d0277c401db24a4303b5dd1e8a93df0829e",
                                    "typeString": "literal_string \"log(address,string,uint,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 23992,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "53774:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 23993,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "53774:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 23999,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "53774:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 23991,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "53758:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24000,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "53758:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24001,
                        "nodeType": "ExpressionStatement",
                        "src": "53758:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24003,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 23989,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 23982,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24003,
                        "src": "53683:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 23981,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "53683:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23984,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24003,
                        "src": "53695:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 23983,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "53695:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23986,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24003,
                        "src": "53713:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 23985,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "53713:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 23988,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24003,
                        "src": "53722:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 23987,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "53722:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "53682:57:101"
                  },
                  "returnParameters": {
                    "id": 23990,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "53754:0:101"
                  },
                  "scope": 25062,
                  "src": "53670:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24025,
                    "nodeType": "Block",
                    "src": "53931:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c737472696e672c75696e742c626f6f6c29",
                                  "id": 24017,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "53975:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_7e250d5bf3975165268961c2b6dbe143f053bed03d903630f547f1fbab28b895",
                                    "typeString": "literal_string \"log(address,string,uint,bool)\""
                                  },
                                  "value": "log(address,string,uint,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24018,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24005,
                                  "src": "54008:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24019,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24007,
                                  "src": "54012:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24020,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24009,
                                  "src": "54016:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24021,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24011,
                                  "src": "54020:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_7e250d5bf3975165268961c2b6dbe143f053bed03d903630f547f1fbab28b895",
                                    "typeString": "literal_string \"log(address,string,uint,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24015,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "53951:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24016,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "53951:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24022,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "53951:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24014,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "53935:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24023,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "53935:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24024,
                        "nodeType": "ExpressionStatement",
                        "src": "53935:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24026,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24012,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24005,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24026,
                        "src": "53869:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24004,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "53869:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24007,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24026,
                        "src": "53881:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24006,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "53881:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24009,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24026,
                        "src": "53899:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 24008,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "53899:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24011,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24026,
                        "src": "53908:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24010,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "53908:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "53868:48:101"
                  },
                  "returnParameters": {
                    "id": 24013,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "53931:0:101"
                  },
                  "scope": 25062,
                  "src": "53856:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24048,
                    "nodeType": "Block",
                    "src": "54109:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c737472696e672c75696e742c6164647265737329",
                                  "id": 24040,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "54153:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_dfd7d80b4150ea6b0b2772758d6e66d8c7f141bfd7de11119a8fee2a703664e4",
                                    "typeString": "literal_string \"log(address,string,uint,address)\""
                                  },
                                  "value": "log(address,string,uint,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24041,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24028,
                                  "src": "54189:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24042,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24030,
                                  "src": "54193:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24043,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24032,
                                  "src": "54197:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24044,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24034,
                                  "src": "54201:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_dfd7d80b4150ea6b0b2772758d6e66d8c7f141bfd7de11119a8fee2a703664e4",
                                    "typeString": "literal_string \"log(address,string,uint,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24038,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "54129:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24039,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "54129:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24045,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "54129:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24037,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "54113:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24046,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "54113:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24047,
                        "nodeType": "ExpressionStatement",
                        "src": "54113:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24049,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24035,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24028,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24049,
                        "src": "54044:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24027,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "54044:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24030,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24049,
                        "src": "54056:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24029,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "54056:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24032,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24049,
                        "src": "54074:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 24031,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "54074:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24034,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24049,
                        "src": "54083:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24033,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "54083:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "54043:51:101"
                  },
                  "returnParameters": {
                    "id": 24036,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "54109:0:101"
                  },
                  "scope": 25062,
                  "src": "54031:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24071,
                    "nodeType": "Block",
                    "src": "54296:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c737472696e672c737472696e672c75696e7429",
                                  "id": 24063,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "54340:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_a14fd039ae37435afa9d1674d6d48b37ffbd5da4cd9166a3f673f5f0db01a4c5",
                                    "typeString": "literal_string \"log(address,string,string,uint)\""
                                  },
                                  "value": "log(address,string,string,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24064,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24051,
                                  "src": "54375:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24065,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24053,
                                  "src": "54379:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24066,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24055,
                                  "src": "54383:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24067,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24057,
                                  "src": "54387:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_a14fd039ae37435afa9d1674d6d48b37ffbd5da4cd9166a3f673f5f0db01a4c5",
                                    "typeString": "literal_string \"log(address,string,string,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24061,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "54316:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24062,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "54316:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24068,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "54316:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24060,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "54300:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24069,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "54300:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24070,
                        "nodeType": "ExpressionStatement",
                        "src": "54300:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24072,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24058,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24051,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24072,
                        "src": "54225:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24050,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "54225:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24053,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24072,
                        "src": "54237:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24052,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "54237:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24055,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24072,
                        "src": "54255:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24054,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "54255:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24057,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24072,
                        "src": "54273:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 24056,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "54273:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "54224:57:101"
                  },
                  "returnParameters": {
                    "id": 24059,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "54296:0:101"
                  },
                  "scope": 25062,
                  "src": "54212:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24094,
                    "nodeType": "Block",
                    "src": "54491:101:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c737472696e672c737472696e672c737472696e6729",
                                  "id": 24086,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "54535:35:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_5d02c50b371ad9a1f5c638dc99b5e9b545011f148f0be5233c530a4b2a12665c",
                                    "typeString": "literal_string \"log(address,string,string,string)\""
                                  },
                                  "value": "log(address,string,string,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24087,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24074,
                                  "src": "54572:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24088,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24076,
                                  "src": "54576:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24089,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24078,
                                  "src": "54580:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24090,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24080,
                                  "src": "54584:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_5d02c50b371ad9a1f5c638dc99b5e9b545011f148f0be5233c530a4b2a12665c",
                                    "typeString": "literal_string \"log(address,string,string,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24084,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "54511:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24085,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "54511:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24091,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "54511:76:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24083,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "54495:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24092,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "54495:93:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24093,
                        "nodeType": "ExpressionStatement",
                        "src": "54495:93:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24095,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24081,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24074,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24095,
                        "src": "54411:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24073,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "54411:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24076,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24095,
                        "src": "54423:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24075,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "54423:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24078,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24095,
                        "src": "54441:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24077,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "54441:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24080,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24095,
                        "src": "54459:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24079,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "54459:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "54410:66:101"
                  },
                  "returnParameters": {
                    "id": 24082,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "54491:0:101"
                  },
                  "scope": 25062,
                  "src": "54398:194:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24117,
                    "nodeType": "Block",
                    "src": "54679:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c737472696e672c737472696e672c626f6f6c29",
                                  "id": 24109,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "54723:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_35a5071fa9f4610e50772083182f21e949e7a02301a3936e315dd1c4fc39a9ed",
                                    "typeString": "literal_string \"log(address,string,string,bool)\""
                                  },
                                  "value": "log(address,string,string,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24110,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24097,
                                  "src": "54758:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24111,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24099,
                                  "src": "54762:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24112,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24101,
                                  "src": "54766:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24113,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24103,
                                  "src": "54770:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_35a5071fa9f4610e50772083182f21e949e7a02301a3936e315dd1c4fc39a9ed",
                                    "typeString": "literal_string \"log(address,string,string,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24107,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "54699:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24108,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "54699:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24114,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "54699:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24106,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "54683:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24115,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "54683:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24116,
                        "nodeType": "ExpressionStatement",
                        "src": "54683:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24118,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24104,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24097,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24118,
                        "src": "54608:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24096,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "54608:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24099,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24118,
                        "src": "54620:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24098,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "54620:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24101,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24118,
                        "src": "54638:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24100,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "54638:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24103,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24118,
                        "src": "54656:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24102,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "54656:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "54607:57:101"
                  },
                  "returnParameters": {
                    "id": 24105,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "54679:0:101"
                  },
                  "scope": 25062,
                  "src": "54595:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24140,
                    "nodeType": "Block",
                    "src": "54868:102:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c737472696e672c737472696e672c6164647265737329",
                                  "id": 24132,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "54912:36:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_a04e2f87a739673cc9223810c24b00b35c6b2c9f3ef123cc82866752e1fa816f",
                                    "typeString": "literal_string \"log(address,string,string,address)\""
                                  },
                                  "value": "log(address,string,string,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24133,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24120,
                                  "src": "54950:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24134,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24122,
                                  "src": "54954:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24135,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24124,
                                  "src": "54958:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24136,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24126,
                                  "src": "54962:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_a04e2f87a739673cc9223810c24b00b35c6b2c9f3ef123cc82866752e1fa816f",
                                    "typeString": "literal_string \"log(address,string,string,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24130,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "54888:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24131,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "54888:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24137,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "54888:77:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24129,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "54872:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24138,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "54872:94:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24139,
                        "nodeType": "ExpressionStatement",
                        "src": "54872:94:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24141,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24127,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24120,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24141,
                        "src": "54794:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24119,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "54794:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24122,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24141,
                        "src": "54806:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24121,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "54806:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24124,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24141,
                        "src": "54824:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24123,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "54824:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24126,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24141,
                        "src": "54842:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24125,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "54842:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "54793:60:101"
                  },
                  "returnParameters": {
                    "id": 24128,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "54868:0:101"
                  },
                  "scope": 25062,
                  "src": "54781:189:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24163,
                    "nodeType": "Block",
                    "src": "55048:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c737472696e672c626f6f6c2c75696e7429",
                                  "id": 24155,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "55092:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_e720521cc58e36659b0c45689a38054bd7300ff30d5ec0cfec7bae3dc2e9689a",
                                    "typeString": "literal_string \"log(address,string,bool,uint)\""
                                  },
                                  "value": "log(address,string,bool,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24156,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24143,
                                  "src": "55125:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24157,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24145,
                                  "src": "55129:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24158,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24147,
                                  "src": "55133:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24159,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24149,
                                  "src": "55137:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_e720521cc58e36659b0c45689a38054bd7300ff30d5ec0cfec7bae3dc2e9689a",
                                    "typeString": "literal_string \"log(address,string,bool,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24153,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "55068:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24154,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "55068:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24160,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "55068:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24152,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "55052:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24161,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "55052:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24162,
                        "nodeType": "ExpressionStatement",
                        "src": "55052:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24164,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24150,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24143,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24164,
                        "src": "54986:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24142,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "54986:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24145,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24164,
                        "src": "54998:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24144,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "54998:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24147,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24164,
                        "src": "55016:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24146,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "55016:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24149,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24164,
                        "src": "55025:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 24148,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "55025:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "54985:48:101"
                  },
                  "returnParameters": {
                    "id": 24151,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "55048:0:101"
                  },
                  "scope": 25062,
                  "src": "54973:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24186,
                    "nodeType": "Block",
                    "src": "55232:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c737472696e672c626f6f6c2c737472696e6729",
                                  "id": 24178,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "55276:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_bc0b61fe9497b47eb6a51a5a6a4bf26b32ddcbc9407ccae8cc7de64b3e3d84cc",
                                    "typeString": "literal_string \"log(address,string,bool,string)\""
                                  },
                                  "value": "log(address,string,bool,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24179,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24166,
                                  "src": "55311:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24180,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24168,
                                  "src": "55315:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24181,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24170,
                                  "src": "55319:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24182,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24172,
                                  "src": "55323:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_bc0b61fe9497b47eb6a51a5a6a4bf26b32ddcbc9407ccae8cc7de64b3e3d84cc",
                                    "typeString": "literal_string \"log(address,string,bool,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24176,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "55252:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24177,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "55252:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24183,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "55252:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24175,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "55236:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24184,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "55236:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24185,
                        "nodeType": "ExpressionStatement",
                        "src": "55236:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24187,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24173,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24166,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24187,
                        "src": "55161:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24165,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "55161:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24168,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24187,
                        "src": "55173:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24167,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "55173:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24170,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24187,
                        "src": "55191:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24169,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "55191:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24172,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24187,
                        "src": "55200:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24171,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "55200:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "55160:57:101"
                  },
                  "returnParameters": {
                    "id": 24174,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "55232:0:101"
                  },
                  "scope": 25062,
                  "src": "55148:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24209,
                    "nodeType": "Block",
                    "src": "55409:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c737472696e672c626f6f6c2c626f6f6c29",
                                  "id": 24201,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "55453:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_5f1d5c9f0de8c048364058d1d6842804ada33dbc34bf9eaff8f2be978f384e08",
                                    "typeString": "literal_string \"log(address,string,bool,bool)\""
                                  },
                                  "value": "log(address,string,bool,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24202,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24189,
                                  "src": "55486:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24203,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24191,
                                  "src": "55490:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24204,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24193,
                                  "src": "55494:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24205,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24195,
                                  "src": "55498:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_5f1d5c9f0de8c048364058d1d6842804ada33dbc34bf9eaff8f2be978f384e08",
                                    "typeString": "literal_string \"log(address,string,bool,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24199,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "55429:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24200,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "55429:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24206,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "55429:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24198,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "55413:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24207,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "55413:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24208,
                        "nodeType": "ExpressionStatement",
                        "src": "55413:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24210,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24196,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24189,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24210,
                        "src": "55347:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24188,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "55347:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24191,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24210,
                        "src": "55359:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24190,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "55359:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24193,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24210,
                        "src": "55377:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24192,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "55377:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24195,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24210,
                        "src": "55386:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24194,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "55386:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "55346:48:101"
                  },
                  "returnParameters": {
                    "id": 24197,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "55409:0:101"
                  },
                  "scope": 25062,
                  "src": "55334:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24232,
                    "nodeType": "Block",
                    "src": "55587:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c737472696e672c626f6f6c2c6164647265737329",
                                  "id": 24224,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "55631:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_205871c2f2d320acdd350939b5fc035cc20b1a9cc058fb26f1c9fb3d2ba59970",
                                    "typeString": "literal_string \"log(address,string,bool,address)\""
                                  },
                                  "value": "log(address,string,bool,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24225,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24212,
                                  "src": "55667:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24226,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24214,
                                  "src": "55671:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24227,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24216,
                                  "src": "55675:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24228,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24218,
                                  "src": "55679:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_205871c2f2d320acdd350939b5fc035cc20b1a9cc058fb26f1c9fb3d2ba59970",
                                    "typeString": "literal_string \"log(address,string,bool,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24222,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "55607:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24223,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "55607:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24229,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "55607:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24221,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "55591:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24230,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "55591:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24231,
                        "nodeType": "ExpressionStatement",
                        "src": "55591:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24233,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24219,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24212,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24233,
                        "src": "55522:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24211,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "55522:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24214,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24233,
                        "src": "55534:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24213,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "55534:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24216,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24233,
                        "src": "55552:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24215,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "55552:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24218,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24233,
                        "src": "55561:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24217,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "55561:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "55521:51:101"
                  },
                  "returnParameters": {
                    "id": 24220,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "55587:0:101"
                  },
                  "scope": 25062,
                  "src": "55509:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24255,
                    "nodeType": "Block",
                    "src": "55768:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c737472696e672c616464726573732c75696e7429",
                                  "id": 24247,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "55812:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_8c1933a9a9c61e3dc8d3ebdfa929712b21dab3dcf7188e7d35cbf8aaaf476582",
                                    "typeString": "literal_string \"log(address,string,address,uint)\""
                                  },
                                  "value": "log(address,string,address,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24248,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24235,
                                  "src": "55848:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24249,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24237,
                                  "src": "55852:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24250,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24239,
                                  "src": "55856:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24251,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24241,
                                  "src": "55860:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_8c1933a9a9c61e3dc8d3ebdfa929712b21dab3dcf7188e7d35cbf8aaaf476582",
                                    "typeString": "literal_string \"log(address,string,address,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24245,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "55788:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24246,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "55788:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24252,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "55788:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24244,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "55772:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24253,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "55772:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24254,
                        "nodeType": "ExpressionStatement",
                        "src": "55772:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24256,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24242,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24235,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24256,
                        "src": "55703:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24234,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "55703:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24237,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24256,
                        "src": "55715:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24236,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "55715:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24239,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24256,
                        "src": "55733:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24238,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "55733:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24241,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24256,
                        "src": "55745:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 24240,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "55745:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "55702:51:101"
                  },
                  "returnParameters": {
                    "id": 24243,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "55768:0:101"
                  },
                  "scope": 25062,
                  "src": "55690:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24278,
                    "nodeType": "Block",
                    "src": "55958:102:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c737472696e672c616464726573732c737472696e6729",
                                  "id": 24270,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "56002:36:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_f7e3624510fc5618feb98a49f5d4404e3749dacbdc916c267fea7b2051a08dea",
                                    "typeString": "literal_string \"log(address,string,address,string)\""
                                  },
                                  "value": "log(address,string,address,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24271,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24258,
                                  "src": "56040:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24272,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24260,
                                  "src": "56044:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24273,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24262,
                                  "src": "56048:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24274,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24264,
                                  "src": "56052:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_f7e3624510fc5618feb98a49f5d4404e3749dacbdc916c267fea7b2051a08dea",
                                    "typeString": "literal_string \"log(address,string,address,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24268,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "55978:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24269,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "55978:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24275,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "55978:77:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24267,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "55962:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24276,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "55962:94:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24277,
                        "nodeType": "ExpressionStatement",
                        "src": "55962:94:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24279,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24265,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24258,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24279,
                        "src": "55884:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24257,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "55884:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24260,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24279,
                        "src": "55896:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24259,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "55896:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24262,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24279,
                        "src": "55914:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24261,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "55914:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24264,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24279,
                        "src": "55926:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24263,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "55926:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "55883:60:101"
                  },
                  "returnParameters": {
                    "id": 24266,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "55958:0:101"
                  },
                  "scope": 25062,
                  "src": "55871:189:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24301,
                    "nodeType": "Block",
                    "src": "56141:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c737472696e672c616464726573732c626f6f6c29",
                                  "id": 24293,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "56185:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_0df12b7620e0bad204ac79fe9930fef9b9a40702161764a681594d50d657b081",
                                    "typeString": "literal_string \"log(address,string,address,bool)\""
                                  },
                                  "value": "log(address,string,address,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24294,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24281,
                                  "src": "56221:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24295,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24283,
                                  "src": "56225:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24296,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24285,
                                  "src": "56229:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24297,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24287,
                                  "src": "56233:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_0df12b7620e0bad204ac79fe9930fef9b9a40702161764a681594d50d657b081",
                                    "typeString": "literal_string \"log(address,string,address,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24291,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "56161:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24292,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "56161:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24298,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "56161:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24290,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "56145:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24299,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "56145:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24300,
                        "nodeType": "ExpressionStatement",
                        "src": "56145:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24302,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24288,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24281,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24302,
                        "src": "56076:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24280,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "56076:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24283,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24302,
                        "src": "56088:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24282,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "56088:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24285,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24302,
                        "src": "56106:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24284,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "56106:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24287,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24302,
                        "src": "56118:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24286,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "56118:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "56075:51:101"
                  },
                  "returnParameters": {
                    "id": 24289,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "56141:0:101"
                  },
                  "scope": 25062,
                  "src": "56063:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24324,
                    "nodeType": "Block",
                    "src": "56325:103:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c737472696e672c616464726573732c6164647265737329",
                                  "id": 24316,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "56369:37:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_0d36fa2022fafb45586a59914be3ad4c57b76e89535385dcff89c28c80605121",
                                    "typeString": "literal_string \"log(address,string,address,address)\""
                                  },
                                  "value": "log(address,string,address,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24317,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24304,
                                  "src": "56408:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24318,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24306,
                                  "src": "56412:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24319,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24308,
                                  "src": "56416:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24320,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24310,
                                  "src": "56420:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_0d36fa2022fafb45586a59914be3ad4c57b76e89535385dcff89c28c80605121",
                                    "typeString": "literal_string \"log(address,string,address,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24314,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "56345:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24315,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "56345:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24321,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "56345:78:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24313,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "56329:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24322,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "56329:95:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24323,
                        "nodeType": "ExpressionStatement",
                        "src": "56329:95:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24325,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24311,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24304,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24325,
                        "src": "56257:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24303,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "56257:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24306,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24325,
                        "src": "56269:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24305,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "56269:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24308,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24325,
                        "src": "56287:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24307,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "56287:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24310,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24325,
                        "src": "56299:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24309,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "56299:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "56256:54:101"
                  },
                  "returnParameters": {
                    "id": 24312,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "56325:0:101"
                  },
                  "scope": 25062,
                  "src": "56244:184:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24347,
                    "nodeType": "Block",
                    "src": "56497:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c626f6f6c2c75696e742c75696e7429",
                                  "id": 24339,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "56541:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c210a01e60a7d88137859e75abc2d14430087408747ac6787f0acb2f0f8bfd59",
                                    "typeString": "literal_string \"log(address,bool,uint,uint)\""
                                  },
                                  "value": "log(address,bool,uint,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24340,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24327,
                                  "src": "56572:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24341,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24329,
                                  "src": "56576:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24342,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24331,
                                  "src": "56580:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24343,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24333,
                                  "src": "56584:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_c210a01e60a7d88137859e75abc2d14430087408747ac6787f0acb2f0f8bfd59",
                                    "typeString": "literal_string \"log(address,bool,uint,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24337,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "56517:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24338,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "56517:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24344,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "56517:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24336,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "56501:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24345,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "56501:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24346,
                        "nodeType": "ExpressionStatement",
                        "src": "56501:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24348,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24334,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24327,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24348,
                        "src": "56444:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24326,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "56444:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24329,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24348,
                        "src": "56456:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24328,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "56456:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24331,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24348,
                        "src": "56465:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 24330,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "56465:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24333,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24348,
                        "src": "56474:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 24332,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "56474:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "56443:39:101"
                  },
                  "returnParameters": {
                    "id": 24335,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "56497:0:101"
                  },
                  "scope": 25062,
                  "src": "56431:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24370,
                    "nodeType": "Block",
                    "src": "56670:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c626f6f6c2c75696e742c737472696e6729",
                                  "id": 24362,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "56714:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_9b588eccef132ec49572951d33e9b0d1b814d54c82133831f78cdc5d923bc6e6",
                                    "typeString": "literal_string \"log(address,bool,uint,string)\""
                                  },
                                  "value": "log(address,bool,uint,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24363,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24350,
                                  "src": "56747:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24364,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24352,
                                  "src": "56751:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24365,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24354,
                                  "src": "56755:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24366,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24356,
                                  "src": "56759:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_9b588eccef132ec49572951d33e9b0d1b814d54c82133831f78cdc5d923bc6e6",
                                    "typeString": "literal_string \"log(address,bool,uint,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24360,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "56690:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24361,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "56690:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24367,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "56690:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24359,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "56674:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24368,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "56674:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24369,
                        "nodeType": "ExpressionStatement",
                        "src": "56674:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24371,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24357,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24350,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24371,
                        "src": "56608:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24349,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "56608:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24352,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24371,
                        "src": "56620:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24351,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "56620:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24354,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24371,
                        "src": "56629:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 24353,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "56629:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24356,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24371,
                        "src": "56638:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24355,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "56638:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "56607:48:101"
                  },
                  "returnParameters": {
                    "id": 24358,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "56670:0:101"
                  },
                  "scope": 25062,
                  "src": "56595:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24393,
                    "nodeType": "Block",
                    "src": "56836:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c626f6f6c2c75696e742c626f6f6c29",
                                  "id": 24385,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "56880:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_85cdc5af22f2a2b52749c228b5bc379bac815d0d3575c2899b6657bce00fab33",
                                    "typeString": "literal_string \"log(address,bool,uint,bool)\""
                                  },
                                  "value": "log(address,bool,uint,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24386,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24373,
                                  "src": "56911:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24387,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24375,
                                  "src": "56915:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24388,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24377,
                                  "src": "56919:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24389,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24379,
                                  "src": "56923:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_85cdc5af22f2a2b52749c228b5bc379bac815d0d3575c2899b6657bce00fab33",
                                    "typeString": "literal_string \"log(address,bool,uint,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24383,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "56856:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24384,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "56856:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24390,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "56856:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24382,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "56840:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24391,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "56840:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24392,
                        "nodeType": "ExpressionStatement",
                        "src": "56840:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24394,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24380,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24373,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24394,
                        "src": "56783:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24372,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "56783:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24375,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24394,
                        "src": "56795:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24374,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "56795:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24377,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24394,
                        "src": "56804:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 24376,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "56804:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24379,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24394,
                        "src": "56813:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24378,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "56813:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "56782:39:101"
                  },
                  "returnParameters": {
                    "id": 24381,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "56836:0:101"
                  },
                  "scope": 25062,
                  "src": "56770:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24416,
                    "nodeType": "Block",
                    "src": "57003:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c626f6f6c2c75696e742c6164647265737329",
                                  "id": 24408,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "57047:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_0d8ce61ee7d058fd1e588343a35fb1aff71b8e7f74d553220d0e20088cb908bf",
                                    "typeString": "literal_string \"log(address,bool,uint,address)\""
                                  },
                                  "value": "log(address,bool,uint,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24409,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24396,
                                  "src": "57081:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24410,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24398,
                                  "src": "57085:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24411,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24400,
                                  "src": "57089:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24412,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24402,
                                  "src": "57093:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_0d8ce61ee7d058fd1e588343a35fb1aff71b8e7f74d553220d0e20088cb908bf",
                                    "typeString": "literal_string \"log(address,bool,uint,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24406,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "57023:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24407,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "57023:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24413,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "57023:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24405,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "57007:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24414,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "57007:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24415,
                        "nodeType": "ExpressionStatement",
                        "src": "57007:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24417,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24403,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24396,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24417,
                        "src": "56947:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24395,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "56947:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24398,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24417,
                        "src": "56959:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24397,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "56959:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24400,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24417,
                        "src": "56968:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 24399,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "56968:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24402,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24417,
                        "src": "56977:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24401,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "56977:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "56946:42:101"
                  },
                  "returnParameters": {
                    "id": 24404,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "57003:0:101"
                  },
                  "scope": 25062,
                  "src": "56934:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24439,
                    "nodeType": "Block",
                    "src": "57179:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c626f6f6c2c737472696e672c75696e7429",
                                  "id": 24431,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "57223:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_9e127b6e4348bc33b3ea7f05f6479d3e1b1fe2b3727e1f4ba94b6a36e7abac9b",
                                    "typeString": "literal_string \"log(address,bool,string,uint)\""
                                  },
                                  "value": "log(address,bool,string,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24432,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24419,
                                  "src": "57256:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24433,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24421,
                                  "src": "57260:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24434,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24423,
                                  "src": "57264:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24435,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24425,
                                  "src": "57268:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_9e127b6e4348bc33b3ea7f05f6479d3e1b1fe2b3727e1f4ba94b6a36e7abac9b",
                                    "typeString": "literal_string \"log(address,bool,string,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24429,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "57199:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24430,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "57199:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24436,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "57199:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24428,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "57183:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24437,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "57183:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24438,
                        "nodeType": "ExpressionStatement",
                        "src": "57183:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24440,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24426,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24419,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24440,
                        "src": "57117:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24418,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "57117:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24421,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24440,
                        "src": "57129:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24420,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "57129:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24423,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24440,
                        "src": "57138:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24422,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "57138:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24425,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24440,
                        "src": "57156:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 24424,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "57156:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "57116:48:101"
                  },
                  "returnParameters": {
                    "id": 24427,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "57179:0:101"
                  },
                  "scope": 25062,
                  "src": "57104:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24462,
                    "nodeType": "Block",
                    "src": "57363:99:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c626f6f6c2c737472696e672c737472696e6729",
                                  "id": 24454,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "57407:33:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_475c5c33f91155b7a0e86c9fac7985c60ab58f4bfb411ee9b31d994a7fc95d1f",
                                    "typeString": "literal_string \"log(address,bool,string,string)\""
                                  },
                                  "value": "log(address,bool,string,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24455,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24442,
                                  "src": "57442:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24456,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24444,
                                  "src": "57446:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24457,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24446,
                                  "src": "57450:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24458,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24448,
                                  "src": "57454:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_475c5c33f91155b7a0e86c9fac7985c60ab58f4bfb411ee9b31d994a7fc95d1f",
                                    "typeString": "literal_string \"log(address,bool,string,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24452,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "57383:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24453,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "57383:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24459,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "57383:74:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24451,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "57367:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24460,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "57367:91:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24461,
                        "nodeType": "ExpressionStatement",
                        "src": "57367:91:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24463,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24449,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24442,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24463,
                        "src": "57292:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24441,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "57292:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24444,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24463,
                        "src": "57304:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24443,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "57304:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24446,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24463,
                        "src": "57313:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24445,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "57313:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24448,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24463,
                        "src": "57331:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24447,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "57331:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "57291:57:101"
                  },
                  "returnParameters": {
                    "id": 24450,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "57363:0:101"
                  },
                  "scope": 25062,
                  "src": "57279:183:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24485,
                    "nodeType": "Block",
                    "src": "57540:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c626f6f6c2c737472696e672c626f6f6c29",
                                  "id": 24477,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "57584:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_50ad461db24803fc9b2ba76f072192e0a4d8fbb3667a50c400f504443380890f",
                                    "typeString": "literal_string \"log(address,bool,string,bool)\""
                                  },
                                  "value": "log(address,bool,string,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24478,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24465,
                                  "src": "57617:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24479,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24467,
                                  "src": "57621:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24480,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24469,
                                  "src": "57625:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24481,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24471,
                                  "src": "57629:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_50ad461db24803fc9b2ba76f072192e0a4d8fbb3667a50c400f504443380890f",
                                    "typeString": "literal_string \"log(address,bool,string,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24475,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "57560:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24476,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "57560:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24482,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "57560:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24474,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "57544:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24483,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "57544:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24484,
                        "nodeType": "ExpressionStatement",
                        "src": "57544:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24486,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24472,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24465,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24486,
                        "src": "57478:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24464,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "57478:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24467,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24486,
                        "src": "57490:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24466,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "57490:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24469,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24486,
                        "src": "57499:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24468,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "57499:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24471,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24486,
                        "src": "57517:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24470,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "57517:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "57477:48:101"
                  },
                  "returnParameters": {
                    "id": 24473,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "57540:0:101"
                  },
                  "scope": 25062,
                  "src": "57465:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24508,
                    "nodeType": "Block",
                    "src": "57718:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c626f6f6c2c737472696e672c6164647265737329",
                                  "id": 24500,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "57762:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_19fd495659df511498cf8dde03672830bd109ef2d9b9bec18e72190917c328bc",
                                    "typeString": "literal_string \"log(address,bool,string,address)\""
                                  },
                                  "value": "log(address,bool,string,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24501,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24488,
                                  "src": "57798:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24502,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24490,
                                  "src": "57802:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24503,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24492,
                                  "src": "57806:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24504,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24494,
                                  "src": "57810:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_19fd495659df511498cf8dde03672830bd109ef2d9b9bec18e72190917c328bc",
                                    "typeString": "literal_string \"log(address,bool,string,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24498,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "57738:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24499,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "57738:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24505,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "57738:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24497,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "57722:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24506,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "57722:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24507,
                        "nodeType": "ExpressionStatement",
                        "src": "57722:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24509,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24495,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24488,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24509,
                        "src": "57653:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24487,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "57653:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24490,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24509,
                        "src": "57665:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24489,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "57665:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24492,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24509,
                        "src": "57674:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24491,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "57674:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24494,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24509,
                        "src": "57692:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24493,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "57692:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "57652:51:101"
                  },
                  "returnParameters": {
                    "id": 24496,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "57718:0:101"
                  },
                  "scope": 25062,
                  "src": "57640:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24531,
                    "nodeType": "Block",
                    "src": "57887:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c626f6f6c2c626f6f6c2c75696e7429",
                                  "id": 24523,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "57931:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_cfb587569c9e063cd7daed07e27d9193980aad24c48787cb6531c47fa694e463",
                                    "typeString": "literal_string \"log(address,bool,bool,uint)\""
                                  },
                                  "value": "log(address,bool,bool,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24524,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24511,
                                  "src": "57962:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24525,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24513,
                                  "src": "57966:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24526,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24515,
                                  "src": "57970:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24527,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24517,
                                  "src": "57974:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_cfb587569c9e063cd7daed07e27d9193980aad24c48787cb6531c47fa694e463",
                                    "typeString": "literal_string \"log(address,bool,bool,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24521,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "57907:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24522,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "57907:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24528,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "57907:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24520,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "57891:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24529,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "57891:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24530,
                        "nodeType": "ExpressionStatement",
                        "src": "57891:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24532,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24518,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24511,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24532,
                        "src": "57834:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24510,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "57834:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24513,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24532,
                        "src": "57846:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24512,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "57846:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24515,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24532,
                        "src": "57855:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24514,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "57855:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24517,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24532,
                        "src": "57864:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 24516,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "57864:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "57833:39:101"
                  },
                  "returnParameters": {
                    "id": 24519,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "57887:0:101"
                  },
                  "scope": 25062,
                  "src": "57821:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24554,
                    "nodeType": "Block",
                    "src": "58060:97:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c626f6f6c2c626f6f6c2c737472696e6729",
                                  "id": 24546,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "58104:31:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_dfc4a2e8c56809b44edbbc6d92d0a8441e551ad5387596bf8b629c56d9a91300",
                                    "typeString": "literal_string \"log(address,bool,bool,string)\""
                                  },
                                  "value": "log(address,bool,bool,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24547,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24534,
                                  "src": "58137:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24548,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24536,
                                  "src": "58141:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24549,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24538,
                                  "src": "58145:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24550,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24540,
                                  "src": "58149:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_dfc4a2e8c56809b44edbbc6d92d0a8441e551ad5387596bf8b629c56d9a91300",
                                    "typeString": "literal_string \"log(address,bool,bool,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24544,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "58080:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24545,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "58080:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24551,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "58080:72:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24543,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "58064:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24552,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "58064:89:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24553,
                        "nodeType": "ExpressionStatement",
                        "src": "58064:89:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24555,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24541,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24534,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24555,
                        "src": "57998:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24533,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "57998:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24536,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24555,
                        "src": "58010:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24535,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "58010:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24538,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24555,
                        "src": "58019:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24537,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "58019:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24540,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24555,
                        "src": "58028:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24539,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "58028:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "57997:48:101"
                  },
                  "returnParameters": {
                    "id": 24542,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "58060:0:101"
                  },
                  "scope": 25062,
                  "src": "57985:172:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24577,
                    "nodeType": "Block",
                    "src": "58226:95:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c626f6f6c2c626f6f6c2c626f6f6c29",
                                  "id": 24569,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "58270:29:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_cac434792b973db16714db96d2aeda353b2253f27255abe42b9960b2dc550634",
                                    "typeString": "literal_string \"log(address,bool,bool,bool)\""
                                  },
                                  "value": "log(address,bool,bool,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24570,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24557,
                                  "src": "58301:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24571,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24559,
                                  "src": "58305:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24572,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24561,
                                  "src": "58309:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24573,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24563,
                                  "src": "58313:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_cac434792b973db16714db96d2aeda353b2253f27255abe42b9960b2dc550634",
                                    "typeString": "literal_string \"log(address,bool,bool,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24567,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "58246:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24568,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "58246:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24574,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "58246:70:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24566,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "58230:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24575,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "58230:87:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24576,
                        "nodeType": "ExpressionStatement",
                        "src": "58230:87:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24578,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24564,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24557,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24578,
                        "src": "58173:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24556,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "58173:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24559,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24578,
                        "src": "58185:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24558,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "58185:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24561,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24578,
                        "src": "58194:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24560,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "58194:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24563,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24578,
                        "src": "58203:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24562,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "58203:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "58172:39:101"
                  },
                  "returnParameters": {
                    "id": 24565,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "58226:0:101"
                  },
                  "scope": 25062,
                  "src": "58160:161:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24600,
                    "nodeType": "Block",
                    "src": "58393:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c626f6f6c2c626f6f6c2c6164647265737329",
                                  "id": 24592,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "58437:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_cf394485abbd1f04b85b0f2c1a2cfc07e3d51c1c6f28386bf16d9e45161e8953",
                                    "typeString": "literal_string \"log(address,bool,bool,address)\""
                                  },
                                  "value": "log(address,bool,bool,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24593,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24580,
                                  "src": "58471:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24594,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24582,
                                  "src": "58475:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24595,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24584,
                                  "src": "58479:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24596,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24586,
                                  "src": "58483:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_cf394485abbd1f04b85b0f2c1a2cfc07e3d51c1c6f28386bf16d9e45161e8953",
                                    "typeString": "literal_string \"log(address,bool,bool,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24590,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "58413:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24591,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "58413:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24597,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "58413:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24589,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "58397:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24598,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "58397:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24599,
                        "nodeType": "ExpressionStatement",
                        "src": "58397:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24601,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24587,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24580,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24601,
                        "src": "58337:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24579,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "58337:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24582,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24601,
                        "src": "58349:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24581,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "58349:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24584,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24601,
                        "src": "58358:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24583,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "58358:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24586,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24601,
                        "src": "58367:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24585,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "58367:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "58336:42:101"
                  },
                  "returnParameters": {
                    "id": 24588,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "58393:0:101"
                  },
                  "scope": 25062,
                  "src": "58324:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24623,
                    "nodeType": "Block",
                    "src": "58563:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c626f6f6c2c616464726573732c75696e7429",
                                  "id": 24615,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "58607:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_dc7116d2e67ccd625262e6814a6f82f2367beea9919409c81fcbb94bea1b6b84",
                                    "typeString": "literal_string \"log(address,bool,address,uint)\""
                                  },
                                  "value": "log(address,bool,address,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24616,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24603,
                                  "src": "58641:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24617,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24605,
                                  "src": "58645:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24618,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24607,
                                  "src": "58649:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24619,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24609,
                                  "src": "58653:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_dc7116d2e67ccd625262e6814a6f82f2367beea9919409c81fcbb94bea1b6b84",
                                    "typeString": "literal_string \"log(address,bool,address,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24613,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "58583:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24614,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "58583:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24620,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "58583:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24612,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "58567:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24621,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "58567:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24622,
                        "nodeType": "ExpressionStatement",
                        "src": "58567:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24624,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24610,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24603,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24624,
                        "src": "58507:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24602,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "58507:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24605,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24624,
                        "src": "58519:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24604,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "58519:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24607,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24624,
                        "src": "58528:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24606,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "58528:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24609,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24624,
                        "src": "58540:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 24608,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "58540:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "58506:42:101"
                  },
                  "returnParameters": {
                    "id": 24611,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "58563:0:101"
                  },
                  "scope": 25062,
                  "src": "58494:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24646,
                    "nodeType": "Block",
                    "src": "58742:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c626f6f6c2c616464726573732c737472696e6729",
                                  "id": 24638,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "58786:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_2dd778e616be9386b5911da1a074bbaf979640681783fca6396ea75c8caf6453",
                                    "typeString": "literal_string \"log(address,bool,address,string)\""
                                  },
                                  "value": "log(address,bool,address,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24639,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24626,
                                  "src": "58822:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24640,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24628,
                                  "src": "58826:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24641,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24630,
                                  "src": "58830:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24642,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24632,
                                  "src": "58834:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_2dd778e616be9386b5911da1a074bbaf979640681783fca6396ea75c8caf6453",
                                    "typeString": "literal_string \"log(address,bool,address,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24636,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "58762:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24637,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "58762:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24643,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "58762:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24635,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "58746:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24644,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "58746:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24645,
                        "nodeType": "ExpressionStatement",
                        "src": "58746:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24647,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24633,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24626,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24647,
                        "src": "58677:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24625,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "58677:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24628,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24647,
                        "src": "58689:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24627,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "58689:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24630,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24647,
                        "src": "58698:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24629,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "58698:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24632,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24647,
                        "src": "58710:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24631,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "58710:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "58676:51:101"
                  },
                  "returnParameters": {
                    "id": 24634,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "58742:0:101"
                  },
                  "scope": 25062,
                  "src": "58664:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24669,
                    "nodeType": "Block",
                    "src": "58914:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c626f6f6c2c616464726573732c626f6f6c29",
                                  "id": 24661,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "58958:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_a6f50b0f122c916fe81861751b94bdddb5e453947768e8af206397bb510790b1",
                                    "typeString": "literal_string \"log(address,bool,address,bool)\""
                                  },
                                  "value": "log(address,bool,address,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24662,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24649,
                                  "src": "58992:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24663,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24651,
                                  "src": "58996:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24664,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24653,
                                  "src": "59000:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24665,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24655,
                                  "src": "59004:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_a6f50b0f122c916fe81861751b94bdddb5e453947768e8af206397bb510790b1",
                                    "typeString": "literal_string \"log(address,bool,address,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24659,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "58934:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24660,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "58934:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24666,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "58934:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24658,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "58918:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24667,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "58918:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24668,
                        "nodeType": "ExpressionStatement",
                        "src": "58918:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24670,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24656,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24649,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24670,
                        "src": "58858:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24648,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "58858:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24651,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24670,
                        "src": "58870:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24650,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "58870:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24653,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24670,
                        "src": "58879:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24652,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "58879:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24655,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24670,
                        "src": "58891:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24654,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "58891:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "58857:42:101"
                  },
                  "returnParameters": {
                    "id": 24657,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "58914:0:101"
                  },
                  "scope": 25062,
                  "src": "58845:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24692,
                    "nodeType": "Block",
                    "src": "59087:101:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c626f6f6c2c616464726573732c6164647265737329",
                                  "id": 24684,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "59131:35:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_660375ddb58761b4ce952ec7e1ae63efe9f8e9e69831fd72875968fec9046e35",
                                    "typeString": "literal_string \"log(address,bool,address,address)\""
                                  },
                                  "value": "log(address,bool,address,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24685,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24672,
                                  "src": "59168:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24686,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24674,
                                  "src": "59172:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24687,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24676,
                                  "src": "59176:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24688,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24678,
                                  "src": "59180:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_660375ddb58761b4ce952ec7e1ae63efe9f8e9e69831fd72875968fec9046e35",
                                    "typeString": "literal_string \"log(address,bool,address,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24682,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "59107:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24683,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "59107:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24689,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "59107:76:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24681,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "59091:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24690,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "59091:93:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24691,
                        "nodeType": "ExpressionStatement",
                        "src": "59091:93:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24693,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24679,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24672,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24693,
                        "src": "59028:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24671,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "59028:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24674,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24693,
                        "src": "59040:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24673,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "59040:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24676,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24693,
                        "src": "59049:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24675,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "59049:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24678,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24693,
                        "src": "59061:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24677,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "59061:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "59027:45:101"
                  },
                  "returnParameters": {
                    "id": 24680,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "59087:0:101"
                  },
                  "scope": 25062,
                  "src": "59015:173:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24715,
                    "nodeType": "Block",
                    "src": "59260:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c616464726573732c75696e742c75696e7429",
                                  "id": 24707,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "59304:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_54fdf3e4fb94f9bebc9a1c60d5b71090f9817e68730b5af20b69dff283044ed6",
                                    "typeString": "literal_string \"log(address,address,uint,uint)\""
                                  },
                                  "value": "log(address,address,uint,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24708,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24695,
                                  "src": "59338:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24709,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24697,
                                  "src": "59342:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24710,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24699,
                                  "src": "59346:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24711,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24701,
                                  "src": "59350:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_54fdf3e4fb94f9bebc9a1c60d5b71090f9817e68730b5af20b69dff283044ed6",
                                    "typeString": "literal_string \"log(address,address,uint,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24705,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "59280:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24706,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "59280:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24712,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "59280:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24704,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "59264:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24713,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "59264:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24714,
                        "nodeType": "ExpressionStatement",
                        "src": "59264:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24716,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24702,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24695,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24716,
                        "src": "59204:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24694,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "59204:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24697,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24716,
                        "src": "59216:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24696,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "59216:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24699,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24716,
                        "src": "59228:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 24698,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "59228:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24701,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24716,
                        "src": "59237:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 24700,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "59237:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "59203:42:101"
                  },
                  "returnParameters": {
                    "id": 24703,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "59260:0:101"
                  },
                  "scope": 25062,
                  "src": "59191:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24738,
                    "nodeType": "Block",
                    "src": "59439:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c616464726573732c75696e742c737472696e6729",
                                  "id": 24730,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "59483:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_9dd12eadc51edb79b050f95e9310706b305e500a52025b74b024df3cbcb53815",
                                    "typeString": "literal_string \"log(address,address,uint,string)\""
                                  },
                                  "value": "log(address,address,uint,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24731,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24718,
                                  "src": "59519:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24732,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24720,
                                  "src": "59523:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24733,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24722,
                                  "src": "59527:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24734,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24724,
                                  "src": "59531:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_9dd12eadc51edb79b050f95e9310706b305e500a52025b74b024df3cbcb53815",
                                    "typeString": "literal_string \"log(address,address,uint,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24728,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "59459:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24729,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "59459:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24735,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "59459:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24727,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "59443:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24736,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "59443:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24737,
                        "nodeType": "ExpressionStatement",
                        "src": "59443:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24739,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24725,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24718,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24739,
                        "src": "59374:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24717,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "59374:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24720,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24739,
                        "src": "59386:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24719,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "59386:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24722,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24739,
                        "src": "59398:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 24721,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "59398:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24724,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24739,
                        "src": "59407:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24723,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "59407:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "59373:51:101"
                  },
                  "returnParameters": {
                    "id": 24726,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "59439:0:101"
                  },
                  "scope": 25062,
                  "src": "59361:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24761,
                    "nodeType": "Block",
                    "src": "59611:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c616464726573732c75696e742c626f6f6c29",
                                  "id": 24753,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "59655:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_c2f688eccc5824e4375e54ae0df7ae9f757b0758319e26fa7dcc6a4450e1d411",
                                    "typeString": "literal_string \"log(address,address,uint,bool)\""
                                  },
                                  "value": "log(address,address,uint,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24754,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24741,
                                  "src": "59689:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24755,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24743,
                                  "src": "59693:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24756,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24745,
                                  "src": "59697:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24757,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24747,
                                  "src": "59701:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_c2f688eccc5824e4375e54ae0df7ae9f757b0758319e26fa7dcc6a4450e1d411",
                                    "typeString": "literal_string \"log(address,address,uint,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24751,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "59631:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24752,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "59631:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24758,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "59631:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24750,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "59615:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24759,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "59615:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24760,
                        "nodeType": "ExpressionStatement",
                        "src": "59615:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24762,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24748,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24741,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24762,
                        "src": "59555:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24740,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "59555:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24743,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24762,
                        "src": "59567:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24742,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "59567:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24745,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24762,
                        "src": "59579:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 24744,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "59579:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24747,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24762,
                        "src": "59588:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24746,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "59588:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "59554:42:101"
                  },
                  "returnParameters": {
                    "id": 24749,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "59611:0:101"
                  },
                  "scope": 25062,
                  "src": "59542:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24784,
                    "nodeType": "Block",
                    "src": "59784:101:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c616464726573732c75696e742c6164647265737329",
                                  "id": 24776,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "59828:35:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_d6c65276d9b81968c5dbc7d91412af8260979b88b9036d81153645629a214556",
                                    "typeString": "literal_string \"log(address,address,uint,address)\""
                                  },
                                  "value": "log(address,address,uint,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24777,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24764,
                                  "src": "59865:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24778,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24766,
                                  "src": "59869:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24779,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24768,
                                  "src": "59873:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24780,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24770,
                                  "src": "59877:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_d6c65276d9b81968c5dbc7d91412af8260979b88b9036d81153645629a214556",
                                    "typeString": "literal_string \"log(address,address,uint,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24774,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "59804:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24775,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "59804:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24781,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "59804:76:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24773,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "59788:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24782,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "59788:93:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24783,
                        "nodeType": "ExpressionStatement",
                        "src": "59788:93:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24785,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24771,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24764,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24785,
                        "src": "59725:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24763,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "59725:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24766,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24785,
                        "src": "59737:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24765,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "59737:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24768,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24785,
                        "src": "59749:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 24767,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "59749:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24770,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24785,
                        "src": "59758:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24769,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "59758:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "59724:45:101"
                  },
                  "returnParameters": {
                    "id": 24772,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "59784:0:101"
                  },
                  "scope": 25062,
                  "src": "59712:173:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24807,
                    "nodeType": "Block",
                    "src": "59966:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c616464726573732c737472696e672c75696e7429",
                                  "id": 24799,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "60010:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_04289300eaed00bb9d0d7894f7439ff06a8c4040945c0625e94f6f0c87fb11ba",
                                    "typeString": "literal_string \"log(address,address,string,uint)\""
                                  },
                                  "value": "log(address,address,string,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24800,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24787,
                                  "src": "60046:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24801,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24789,
                                  "src": "60050:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24802,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24791,
                                  "src": "60054:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24803,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24793,
                                  "src": "60058:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_04289300eaed00bb9d0d7894f7439ff06a8c4040945c0625e94f6f0c87fb11ba",
                                    "typeString": "literal_string \"log(address,address,string,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24797,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "59986:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24798,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "59986:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24804,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "59986:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24796,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "59970:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24805,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "59970:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24806,
                        "nodeType": "ExpressionStatement",
                        "src": "59970:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24808,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24794,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24787,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24808,
                        "src": "59901:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24786,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "59901:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24789,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24808,
                        "src": "59913:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24788,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "59913:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24791,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24808,
                        "src": "59925:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24790,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "59925:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24793,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24808,
                        "src": "59943:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 24792,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "59943:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "59900:51:101"
                  },
                  "returnParameters": {
                    "id": 24795,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "59966:0:101"
                  },
                  "scope": 25062,
                  "src": "59888:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24830,
                    "nodeType": "Block",
                    "src": "60156:102:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c616464726573732c737472696e672c737472696e6729",
                                  "id": 24822,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "60200:36:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_21bdaf25c85279ffda21e4e2b9f685ff585c62a37c0ebe7ae25670fd06df3aa1",
                                    "typeString": "literal_string \"log(address,address,string,string)\""
                                  },
                                  "value": "log(address,address,string,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24823,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24810,
                                  "src": "60238:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24824,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24812,
                                  "src": "60242:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24825,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24814,
                                  "src": "60246:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24826,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24816,
                                  "src": "60250:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_21bdaf25c85279ffda21e4e2b9f685ff585c62a37c0ebe7ae25670fd06df3aa1",
                                    "typeString": "literal_string \"log(address,address,string,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24820,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "60176:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24821,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "60176:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24827,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "60176:77:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24819,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "60160:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24828,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "60160:94:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24829,
                        "nodeType": "ExpressionStatement",
                        "src": "60160:94:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24831,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24817,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24810,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24831,
                        "src": "60082:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24809,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "60082:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24812,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24831,
                        "src": "60094:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24811,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "60094:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24814,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24831,
                        "src": "60106:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24813,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "60106:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24816,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24831,
                        "src": "60124:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24815,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "60124:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "60081:60:101"
                  },
                  "returnParameters": {
                    "id": 24818,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "60156:0:101"
                  },
                  "scope": 25062,
                  "src": "60069:189:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24853,
                    "nodeType": "Block",
                    "src": "60339:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c616464726573732c737472696e672c626f6f6c29",
                                  "id": 24845,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "60383:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_6f1a594e70810560eaae5bbc82bc991f1120ac326ec142f6fb212682169447fd",
                                    "typeString": "literal_string \"log(address,address,string,bool)\""
                                  },
                                  "value": "log(address,address,string,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24846,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24833,
                                  "src": "60419:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24847,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24835,
                                  "src": "60423:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24848,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24837,
                                  "src": "60427:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24849,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24839,
                                  "src": "60431:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_6f1a594e70810560eaae5bbc82bc991f1120ac326ec142f6fb212682169447fd",
                                    "typeString": "literal_string \"log(address,address,string,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24843,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "60359:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24844,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "60359:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24850,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "60359:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24842,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "60343:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24851,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "60343:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24852,
                        "nodeType": "ExpressionStatement",
                        "src": "60343:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24854,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24840,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24833,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24854,
                        "src": "60274:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24832,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "60274:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24835,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24854,
                        "src": "60286:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24834,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "60286:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24837,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24854,
                        "src": "60298:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24836,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "60298:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24839,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24854,
                        "src": "60316:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24838,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "60316:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "60273:51:101"
                  },
                  "returnParameters": {
                    "id": 24841,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "60339:0:101"
                  },
                  "scope": 25062,
                  "src": "60261:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24876,
                    "nodeType": "Block",
                    "src": "60523:103:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c616464726573732c737472696e672c6164647265737329",
                                  "id": 24868,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "60567:37:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_8f736d1685010d3a1ac02ed96109cdd5141fd92077c14203bc63442ad9b6a687",
                                    "typeString": "literal_string \"log(address,address,string,address)\""
                                  },
                                  "value": "log(address,address,string,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24869,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24856,
                                  "src": "60606:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24870,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24858,
                                  "src": "60610:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24871,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24860,
                                  "src": "60614:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24872,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24862,
                                  "src": "60618:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_8f736d1685010d3a1ac02ed96109cdd5141fd92077c14203bc63442ad9b6a687",
                                    "typeString": "literal_string \"log(address,address,string,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24866,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "60543:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24867,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "60543:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24873,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "60543:78:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24865,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "60527:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24874,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "60527:95:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24875,
                        "nodeType": "ExpressionStatement",
                        "src": "60527:95:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24877,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24863,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24856,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24877,
                        "src": "60455:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24855,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "60455:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24858,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24877,
                        "src": "60467:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24857,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "60467:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24860,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24877,
                        "src": "60479:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24859,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "60479:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24862,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24877,
                        "src": "60497:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24861,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "60497:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "60454:54:101"
                  },
                  "returnParameters": {
                    "id": 24864,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "60523:0:101"
                  },
                  "scope": 25062,
                  "src": "60442:184:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24899,
                    "nodeType": "Block",
                    "src": "60698:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c616464726573732c626f6f6c2c75696e7429",
                                  "id": 24891,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "60742:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_95d65f110e4042ee84d162cfc6d17a44c2f2784259e33c97679d21e7a95a841e",
                                    "typeString": "literal_string \"log(address,address,bool,uint)\""
                                  },
                                  "value": "log(address,address,bool,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24892,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24879,
                                  "src": "60776:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24893,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24881,
                                  "src": "60780:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24894,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24883,
                                  "src": "60784:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24895,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24885,
                                  "src": "60788:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_95d65f110e4042ee84d162cfc6d17a44c2f2784259e33c97679d21e7a95a841e",
                                    "typeString": "literal_string \"log(address,address,bool,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24889,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "60718:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24890,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "60718:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24896,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "60718:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24888,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "60702:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24897,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "60702:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24898,
                        "nodeType": "ExpressionStatement",
                        "src": "60702:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24900,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24886,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24879,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24900,
                        "src": "60642:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24878,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "60642:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24881,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24900,
                        "src": "60654:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24880,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "60654:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24883,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24900,
                        "src": "60666:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24882,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "60666:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24885,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24900,
                        "src": "60675:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 24884,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "60675:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "60641:42:101"
                  },
                  "returnParameters": {
                    "id": 24887,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "60698:0:101"
                  },
                  "scope": 25062,
                  "src": "60629:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24922,
                    "nodeType": "Block",
                    "src": "60877:100:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c616464726573732c626f6f6c2c737472696e6729",
                                  "id": 24914,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "60921:34:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_aa6540c8e9a40f69e022e01a14ab22c94aae4999f1d7a246236f464d7c933b88",
                                    "typeString": "literal_string \"log(address,address,bool,string)\""
                                  },
                                  "value": "log(address,address,bool,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24915,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24902,
                                  "src": "60957:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24916,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24904,
                                  "src": "60961:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24917,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24906,
                                  "src": "60965:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24918,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24908,
                                  "src": "60969:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_aa6540c8e9a40f69e022e01a14ab22c94aae4999f1d7a246236f464d7c933b88",
                                    "typeString": "literal_string \"log(address,address,bool,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24912,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "60897:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24913,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "60897:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24919,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "60897:75:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24911,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "60881:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24920,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "60881:92:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24921,
                        "nodeType": "ExpressionStatement",
                        "src": "60881:92:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24923,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24909,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24902,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24923,
                        "src": "60812:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24901,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "60812:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24904,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24923,
                        "src": "60824:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24903,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "60824:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24906,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24923,
                        "src": "60836:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24905,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "60836:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24908,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24923,
                        "src": "60845:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24907,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "60845:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "60811:51:101"
                  },
                  "returnParameters": {
                    "id": 24910,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "60877:0:101"
                  },
                  "scope": 25062,
                  "src": "60799:178:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24945,
                    "nodeType": "Block",
                    "src": "61049:98:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c616464726573732c626f6f6c2c626f6f6c29",
                                  "id": 24937,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "61093:32:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_2cd4134aedbc2cd722f2b9715dc3acb74b16b253590361dd98a4d6cb66119b65",
                                    "typeString": "literal_string \"log(address,address,bool,bool)\""
                                  },
                                  "value": "log(address,address,bool,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24938,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24925,
                                  "src": "61127:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24939,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24927,
                                  "src": "61131:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24940,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24929,
                                  "src": "61135:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24941,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24931,
                                  "src": "61139:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_2cd4134aedbc2cd722f2b9715dc3acb74b16b253590361dd98a4d6cb66119b65",
                                    "typeString": "literal_string \"log(address,address,bool,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24935,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "61069:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24936,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "61069:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24942,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "61069:73:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24934,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "61053:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24943,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "61053:90:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24944,
                        "nodeType": "ExpressionStatement",
                        "src": "61053:90:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24946,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24932,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24925,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24946,
                        "src": "60993:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24924,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "60993:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24927,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24946,
                        "src": "61005:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24926,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "61005:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24929,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24946,
                        "src": "61017:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24928,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "61017:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24931,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24946,
                        "src": "61026:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24930,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "61026:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "60992:42:101"
                  },
                  "returnParameters": {
                    "id": 24933,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "61049:0:101"
                  },
                  "scope": 25062,
                  "src": "60980:167:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24968,
                    "nodeType": "Block",
                    "src": "61222:101:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c616464726573732c626f6f6c2c6164647265737329",
                                  "id": 24960,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "61266:35:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_9f1bc36e6c1a1385bfe3a230338e478ee5447b81d25d35962aff021b2c578b9c",
                                    "typeString": "literal_string \"log(address,address,bool,address)\""
                                  },
                                  "value": "log(address,address,bool,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24961,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24948,
                                  "src": "61303:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24962,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24950,
                                  "src": "61307:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24963,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24952,
                                  "src": "61311:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24964,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24954,
                                  "src": "61315:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_9f1bc36e6c1a1385bfe3a230338e478ee5447b81d25d35962aff021b2c578b9c",
                                    "typeString": "literal_string \"log(address,address,bool,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24958,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "61242:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24959,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "61242:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24965,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "61242:76:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24957,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "61226:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24966,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "61226:93:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24967,
                        "nodeType": "ExpressionStatement",
                        "src": "61226:93:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24969,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24955,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24948,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24969,
                        "src": "61163:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24947,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "61163:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24950,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24969,
                        "src": "61175:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24949,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "61175:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24952,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24969,
                        "src": "61187:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 24951,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "61187:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24954,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24969,
                        "src": "61196:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24953,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "61196:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "61162:45:101"
                  },
                  "returnParameters": {
                    "id": 24956,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "61222:0:101"
                  },
                  "scope": 25062,
                  "src": "61150:173:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 24991,
                    "nodeType": "Block",
                    "src": "61398:101:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c616464726573732c616464726573732c75696e7429",
                                  "id": 24983,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "61442:35:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_ed5eac8706392442fff9f76d5de4d50b9cc22387f3f19d447470771094406028",
                                    "typeString": "literal_string \"log(address,address,address,uint)\""
                                  },
                                  "value": "log(address,address,address,uint)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24984,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24971,
                                  "src": "61479:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24985,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24973,
                                  "src": "61483:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24986,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24975,
                                  "src": "61487:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 24987,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24977,
                                  "src": "61491:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_ed5eac8706392442fff9f76d5de4d50b9cc22387f3f19d447470771094406028",
                                    "typeString": "literal_string \"log(address,address,address,uint)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 24981,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "61418:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 24982,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "61418:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 24988,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "61418:76:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 24980,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "61402:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 24989,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "61402:93:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 24990,
                        "nodeType": "ExpressionStatement",
                        "src": "61402:93:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 24992,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 24978,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24971,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24992,
                        "src": "61339:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24970,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "61339:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24973,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24992,
                        "src": "61351:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24972,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "61351:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24975,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24992,
                        "src": "61363:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24974,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "61363:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24977,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 24992,
                        "src": "61375:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 24976,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "61375:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "61338:45:101"
                  },
                  "returnParameters": {
                    "id": 24979,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "61398:0:101"
                  },
                  "scope": 25062,
                  "src": "61326:173:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 25014,
                    "nodeType": "Block",
                    "src": "61583:103:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c616464726573732c616464726573732c737472696e6729",
                                  "id": 25006,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "61627:37:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_f808da2086fed855c3e15d9dbfed3b17a93ed9a59947aae6ab05b7e18576f025",
                                    "typeString": "literal_string \"log(address,address,address,string)\""
                                  },
                                  "value": "log(address,address,address,string)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 25007,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24994,
                                  "src": "61666:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 25008,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24996,
                                  "src": "61670:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 25009,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 24998,
                                  "src": "61674:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 25010,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 25000,
                                  "src": "61678:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_f808da2086fed855c3e15d9dbfed3b17a93ed9a59947aae6ab05b7e18576f025",
                                    "typeString": "literal_string \"log(address,address,address,string)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_string_memory_ptr",
                                    "typeString": "string memory"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 25004,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "61603:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 25005,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "61603:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 25011,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "61603:78:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 25003,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "61587:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 25012,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "61587:95:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 25013,
                        "nodeType": "ExpressionStatement",
                        "src": "61587:95:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 25015,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 25001,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 24994,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25015,
                        "src": "61515:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24993,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "61515:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24996,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25015,
                        "src": "61527:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24995,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "61527:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 24998,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25015,
                        "src": "61539:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 24997,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "61539:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25000,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25015,
                        "src": "61551:16:101",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string"
                        },
                        "typeName": {
                          "id": 24999,
                          "name": "string",
                          "nodeType": "ElementaryTypeName",
                          "src": "61551:6:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_storage_ptr",
                            "typeString": "string"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "61514:54:101"
                  },
                  "returnParameters": {
                    "id": 25002,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "61583:0:101"
                  },
                  "scope": 25062,
                  "src": "61502:184:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 25037,
                    "nodeType": "Block",
                    "src": "61761:101:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c616464726573732c616464726573732c626f6f6c29",
                                  "id": 25029,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "61805:35:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_0e378994a4cd2663acfd73a7ad4e09d196e4fb7ee05b7cdf0708eb30271e2afb",
                                    "typeString": "literal_string \"log(address,address,address,bool)\""
                                  },
                                  "value": "log(address,address,address,bool)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 25030,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 25017,
                                  "src": "61842:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 25031,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 25019,
                                  "src": "61846:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 25032,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 25021,
                                  "src": "61850:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 25033,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 25023,
                                  "src": "61854:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_0e378994a4cd2663acfd73a7ad4e09d196e4fb7ee05b7cdf0708eb30271e2afb",
                                    "typeString": "literal_string \"log(address,address,address,bool)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 25027,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "61781:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 25028,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "61781:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 25034,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "61781:76:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 25026,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "61765:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 25035,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "61765:93:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 25036,
                        "nodeType": "ExpressionStatement",
                        "src": "61765:93:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 25038,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 25024,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 25017,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25038,
                        "src": "61702:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 25016,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "61702:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25019,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25038,
                        "src": "61714:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 25018,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "61714:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25021,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25038,
                        "src": "61726:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 25020,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "61726:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25023,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25038,
                        "src": "61738:7:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 25022,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "61738:4:101",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "61701:45:101"
                  },
                  "returnParameters": {
                    "id": 25025,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "61761:0:101"
                  },
                  "scope": 25062,
                  "src": "61689:173:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 25060,
                    "nodeType": "Block",
                    "src": "61940:104:101",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [
                                {
                                  "argumentTypes": null,
                                  "hexValue": "6c6f6728616464726573732c616464726573732c616464726573732c6164647265737329",
                                  "id": 25052,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "61984:38:101",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_665bf1345e006aa321c0b6b71bed55ce0d6cdd812632f8c43114f62c55ffa0b5",
                                    "typeString": "literal_string \"log(address,address,address,address)\""
                                  },
                                  "value": "log(address,address,address,address)"
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 25053,
                                  "name": "p0",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 25040,
                                  "src": "62024:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 25054,
                                  "name": "p1",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 25042,
                                  "src": "62028:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 25055,
                                  "name": "p2",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 25044,
                                  "src": "62032:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                {
                                  "argumentTypes": null,
                                  "id": 25056,
                                  "name": "p3",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 25046,
                                  "src": "62036:2:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_665bf1345e006aa321c0b6b71bed55ce0d6cdd812632f8c43114f62c55ffa0b5",
                                    "typeString": "literal_string \"log(address,address,address,address)\""
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  },
                                  {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 25050,
                                  "name": "abi",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": -1,
                                  "src": "61960:3:101",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_magic_abi",
                                    "typeString": "abi"
                                  }
                                },
                                "id": 25051,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "encodeWithSignature",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": null,
                                "src": "61960:23:101",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                                  "typeString": "function (string memory) pure returns (bytes memory)"
                                }
                              },
                              "id": 25057,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "61960:79:101",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes_memory_ptr",
                                "typeString": "bytes memory"
                              }
                            ],
                            "id": 25049,
                            "name": "_sendLogPayload",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 17022,
                            "src": "61944:15:101",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_view$_t_bytes_memory_ptr_$returns$__$",
                              "typeString": "function (bytes memory) view"
                            }
                          },
                          "id": 25058,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "61944:96:101",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 25059,
                        "nodeType": "ExpressionStatement",
                        "src": "61944:96:101"
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 25061,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "log",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 25047,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 25040,
                        "mutability": "mutable",
                        "name": "p0",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25061,
                        "src": "61878:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 25039,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "61878:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25042,
                        "mutability": "mutable",
                        "name": "p1",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25061,
                        "src": "61890:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 25041,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "61890:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25044,
                        "mutability": "mutable",
                        "name": "p2",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25061,
                        "src": "61902:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 25043,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "61902:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25046,
                        "mutability": "mutable",
                        "name": "p3",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25061,
                        "src": "61914:10:101",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "typeName": {
                          "id": 25045,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "61914:7:101",
                          "stateMutability": "nonpayable",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "61877:48:101"
                  },
                  "returnParameters": {
                    "id": 25048,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "61940:0:101"
                  },
                  "scope": 25062,
                  "src": "61865:179:101",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                }
              ],
              "scope": 25063,
              "src": "67:61980:101"
            }
          ],
          "src": "32:62016:101"
        },
        "id": 101
      },
      "sortition-sum-tree-factory/contracts/SortitionSumTreeFactory.sol": {
        "ast": {
          "absolutePath": "sortition-sum-tree-factory/contracts/SortitionSumTreeFactory.sol",
          "exportedSymbols": {
            "SortitionSumTreeFactory": [
              25790
            ]
          },
          "id": 25791,
          "license": null,
          "nodeType": "SourceUnit",
          "nodes": [
            {
              "id": 25064,
              "literals": [
                "solidity",
                "^",
                "0.6",
                ".0"
              ],
              "nodeType": "PragmaDirective",
              "src": "153:23:102"
            },
            {
              "abstract": false,
              "baseContracts": [],
              "contractDependencies": [],
              "contractKind": "library",
              "documentation": {
                "id": 25065,
                "nodeType": "StructuredDocumentation",
                "src": "178:172:102",
                "text": "  @title SortitionSumTreeFactory\n  @author Enrique Piqueras - <epiquerass@gmail.com>\n  @dev A factory of trees that keep track of staked values for sortition."
              },
              "fullyImplemented": true,
              "id": 25790,
              "linearizedBaseContracts": [
                25790
              ],
              "name": "SortitionSumTreeFactory",
              "nodeType": "ContractDefinition",
              "nodes": [
                {
                  "canonicalName": "SortitionSumTreeFactory.SortitionSumTree",
                  "id": 25082,
                  "members": [
                    {
                      "constant": false,
                      "id": 25067,
                      "mutability": "mutable",
                      "name": "K",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 25082,
                      "src": "442:6:102",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 25066,
                        "name": "uint",
                        "nodeType": "ElementaryTypeName",
                        "src": "442:4:102",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 25070,
                      "mutability": "mutable",
                      "name": "stack",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 25082,
                      "src": "690:12:102",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                        "typeString": "uint256[]"
                      },
                      "typeName": {
                        "baseType": {
                          "id": 25068,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "690:4:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 25069,
                        "length": null,
                        "nodeType": "ArrayTypeName",
                        "src": "690:6:102",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                          "typeString": "uint256[]"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 25073,
                      "mutability": "mutable",
                      "name": "nodes",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 25082,
                      "src": "712:12:102",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                        "typeString": "uint256[]"
                      },
                      "typeName": {
                        "baseType": {
                          "id": 25071,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "712:4:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 25072,
                        "length": null,
                        "nodeType": "ArrayTypeName",
                        "src": "712:6:102",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                          "typeString": "uint256[]"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 25077,
                      "mutability": "mutable",
                      "name": "IDsToNodeIndexes",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 25082,
                      "src": "878:41:102",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                        "typeString": "mapping(bytes32 => uint256)"
                      },
                      "typeName": {
                        "id": 25076,
                        "keyType": {
                          "id": 25074,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "886:7:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "nodeType": "Mapping",
                        "src": "878:24:102",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                          "typeString": "mapping(bytes32 => uint256)"
                        },
                        "valueType": {
                          "id": 25075,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "897:4:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 25081,
                      "mutability": "mutable",
                      "name": "nodeIndexesToIDs",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 25082,
                      "src": "929:41:102",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_uint256_$_t_bytes32_$",
                        "typeString": "mapping(uint256 => bytes32)"
                      },
                      "typeName": {
                        "id": 25080,
                        "keyType": {
                          "id": 25078,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "937:4:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "Mapping",
                        "src": "929:24:102",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint256_$_t_bytes32_$",
                          "typeString": "mapping(uint256 => bytes32)"
                        },
                        "valueType": {
                          "id": 25079,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "945:7:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "SortitionSumTree",
                  "nodeType": "StructDefinition",
                  "scope": 25790,
                  "src": "408:569:102",
                  "visibility": "public"
                },
                {
                  "canonicalName": "SortitionSumTreeFactory.SortitionSumTrees",
                  "id": 25087,
                  "members": [
                    {
                      "constant": false,
                      "id": 25086,
                      "mutability": "mutable",
                      "name": "sortitionSumTrees",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 25087,
                      "src": "1037:54:102",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_SortitionSumTree_$25082_storage_$",
                        "typeString": "mapping(bytes32 => struct SortitionSumTreeFactory.SortitionSumTree)"
                      },
                      "typeName": {
                        "id": 25085,
                        "keyType": {
                          "id": 25083,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "1045:7:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "nodeType": "Mapping",
                        "src": "1037:36:102",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_SortitionSumTree_$25082_storage_$",
                          "typeString": "mapping(bytes32 => struct SortitionSumTreeFactory.SortitionSumTree)"
                        },
                        "valueType": {
                          "contractScope": null,
                          "id": 25084,
                          "name": "SortitionSumTree",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 25082,
                          "src": "1056:16:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                            "typeString": "struct SortitionSumTreeFactory.SortitionSumTree"
                          }
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "name": "SortitionSumTrees",
                  "nodeType": "StructDefinition",
                  "scope": 25790,
                  "src": "1002:96:102",
                  "visibility": "public"
                },
                {
                  "body": {
                    "id": 25153,
                    "nodeType": "Block",
                    "src": "1408:308:102",
                    "statements": [
                      {
                        "assignments": [
                          25098
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 25098,
                            "mutability": "mutable",
                            "name": "tree",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 25153,
                            "src": "1418:29:102",
                            "stateVariable": false,
                            "storageLocation": "storage",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                              "typeString": "struct SortitionSumTreeFactory.SortitionSumTree"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 25097,
                              "name": "SortitionSumTree",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 25082,
                              "src": "1418:16:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTree"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 25103,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 25099,
                              "name": "self",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 25090,
                              "src": "1450:4:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees storage pointer"
                              }
                            },
                            "id": 25100,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sortitionSumTrees",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 25086,
                            "src": "1450:22:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_SortitionSumTree_$25082_storage_$",
                              "typeString": "mapping(bytes32 => struct SortitionSumTreeFactory.SortitionSumTree storage ref)"
                            }
                          },
                          "id": 25102,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 25101,
                            "name": "_key",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 25092,
                            "src": "1473:4:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "1450:28:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage",
                            "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "1418:60:102"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 25108,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 25105,
                                  "name": "tree",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 25098,
                                  "src": "1496:4:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                    "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                  }
                                },
                                "id": 25106,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "K",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 25067,
                                "src": "1496:6:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "==",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 25107,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "1506:1:102",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "src": "1496:11:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "5472656520616c7265616479206578697374732e",
                              "id": 25109,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1509:22:102",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_d0a0d3bdf9b72d57d52d87a107c7e8bd35b43ac12e36465ad00d8eecdc4ad172",
                                "typeString": "literal_string \"Tree already exists.\""
                              },
                              "value": "Tree already exists."
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_d0a0d3bdf9b72d57d52d87a107c7e8bd35b43ac12e36465ad00d8eecdc4ad172",
                                "typeString": "literal_string \"Tree already exists.\""
                              }
                            ],
                            "id": 25104,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1488:7:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 25110,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1488:44:102",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 25111,
                        "nodeType": "ExpressionStatement",
                        "src": "1488:44:102"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 25115,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "argumentTypes": null,
                                "id": 25113,
                                "name": "_K",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 25094,
                                "src": "1550:2:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">",
                              "rightExpression": {
                                "argumentTypes": null,
                                "hexValue": "31",
                                "id": 25114,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "1555:1:102",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_1_by_1",
                                  "typeString": "int_const 1"
                                },
                                "value": "1"
                              },
                              "src": "1550:6:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "hexValue": "4b206d7573742062652067726561746572207468616e206f6e652e",
                              "id": 25116,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "string",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1558:29:102",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_stringliteral_0a1aea8344306e142923cc693e83bf0501de5b502cb7053b2b441d16f55f916e",
                                "typeString": "literal_string \"K must be greater than one.\""
                              },
                              "value": "K must be greater than one."
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              {
                                "typeIdentifier": "t_stringliteral_0a1aea8344306e142923cc693e83bf0501de5b502cb7053b2b441d16f55f916e",
                                "typeString": "literal_string \"K must be greater than one.\""
                              }
                            ],
                            "id": 25112,
                            "name": "require",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              -18,
                              -18
                            ],
                            "referencedDeclaration": -18,
                            "src": "1542:7:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                              "typeString": "function (bool,string memory) pure"
                            }
                          },
                          "id": 25117,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1542:46:102",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 25118,
                        "nodeType": "ExpressionStatement",
                        "src": "1542:46:102"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 25123,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 25119,
                              "name": "tree",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 25098,
                              "src": "1598:4:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                              }
                            },
                            "id": 25121,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "K",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 25067,
                            "src": "1598:6:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "id": 25122,
                            "name": "_K",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 25094,
                            "src": "1607:2:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "1598:11:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 25124,
                        "nodeType": "ExpressionStatement",
                        "src": "1598:11:102"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 25133,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 25125,
                              "name": "tree",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 25098,
                              "src": "1619:4:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                              }
                            },
                            "id": 25127,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "stack",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 25070,
                            "src": "1619:10:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                              "typeString": "uint256[] storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 25131,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "1643:1:102",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                }
                              ],
                              "id": 25130,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "1632:10:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_uint256_$dyn_memory_ptr_$",
                                "typeString": "function (uint256) pure returns (uint256[] memory)"
                              },
                              "typeName": {
                                "baseType": {
                                  "id": 25128,
                                  "name": "uint",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "1636:4:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 25129,
                                "length": null,
                                "nodeType": "ArrayTypeName",
                                "src": "1636:6:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                                  "typeString": "uint256[]"
                                }
                              }
                            },
                            "id": 25132,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1632:13:102",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                              "typeString": "uint256[] memory"
                            }
                          },
                          "src": "1619:26:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                            "typeString": "uint256[] storage ref"
                          }
                        },
                        "id": 25134,
                        "nodeType": "ExpressionStatement",
                        "src": "1619:26:102"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 25143,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 25135,
                              "name": "tree",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 25098,
                              "src": "1655:4:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                              }
                            },
                            "id": 25137,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberName": "nodes",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 25073,
                            "src": "1655:10:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                              "typeString": "uint256[] storage ref"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 25141,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "1679:1:102",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                }
                              ],
                              "id": 25140,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "1668:10:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_uint256_$dyn_memory_ptr_$",
                                "typeString": "function (uint256) pure returns (uint256[] memory)"
                              },
                              "typeName": {
                                "baseType": {
                                  "id": 25138,
                                  "name": "uint",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "1672:4:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 25139,
                                "length": null,
                                "nodeType": "ArrayTypeName",
                                "src": "1672:6:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                                  "typeString": "uint256[]"
                                }
                              }
                            },
                            "id": 25142,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "1668:13:102",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                              "typeString": "uint256[] memory"
                            }
                          },
                          "src": "1655:26:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                            "typeString": "uint256[] storage ref"
                          }
                        },
                        "id": 25144,
                        "nodeType": "ExpressionStatement",
                        "src": "1655:26:102"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 25150,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "1707:1:102",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 25145,
                                "name": "tree",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 25098,
                                "src": "1691:4:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                  "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                }
                              },
                              "id": 25148,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "nodes",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 25073,
                              "src": "1691:10:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                "typeString": "uint256[] storage ref"
                              }
                            },
                            "id": 25149,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "push",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "1691:15:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_arraypush_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 25151,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "1691:18:102",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 25152,
                        "nodeType": "ExpressionStatement",
                        "src": "1691:18:102"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 25088,
                    "nodeType": "StructuredDocumentation",
                    "src": "1124:195:102",
                    "text": "  @dev Create a sortition sum tree at the specified key.\n  @param _key The key of the new tree.\n  @param _K The number of children each node in the tree should have."
                  },
                  "id": 25154,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "createTree",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 25095,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 25090,
                        "mutability": "mutable",
                        "name": "self",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25154,
                        "src": "1344:30:102",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                          "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 25089,
                          "name": "SortitionSumTrees",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 25087,
                          "src": "1344:17:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                            "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25092,
                        "mutability": "mutable",
                        "name": "_key",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25154,
                        "src": "1376:12:102",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 25091,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "1376:7:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25094,
                        "mutability": "mutable",
                        "name": "_K",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25154,
                        "src": "1390:7:102",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 25093,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "1390:4:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "1343:55:102"
                  },
                  "returnParameters": {
                    "id": 25096,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "1408:0:102"
                  },
                  "scope": 25790,
                  "src": "1324:392:102",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 25429,
                    "nodeType": "Block",
                    "src": "2143:2674:102",
                    "statements": [
                      {
                        "assignments": [
                          25167
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 25167,
                            "mutability": "mutable",
                            "name": "tree",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 25429,
                            "src": "2153:29:102",
                            "stateVariable": false,
                            "storageLocation": "storage",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                              "typeString": "struct SortitionSumTreeFactory.SortitionSumTree"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 25166,
                              "name": "SortitionSumTree",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 25082,
                              "src": "2153:16:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTree"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 25172,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 25168,
                              "name": "self",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 25157,
                              "src": "2185:4:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees storage pointer"
                              }
                            },
                            "id": 25169,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sortitionSumTrees",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 25086,
                            "src": "2185:22:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_SortitionSumTree_$25082_storage_$",
                              "typeString": "mapping(bytes32 => struct SortitionSumTreeFactory.SortitionSumTree storage ref)"
                            }
                          },
                          "id": 25171,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 25170,
                            "name": "_key",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 25159,
                            "src": "2208:4:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "2185:28:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage",
                            "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2153:60:102"
                      },
                      {
                        "assignments": [
                          25174
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 25174,
                            "mutability": "mutable",
                            "name": "treeIndex",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 25429,
                            "src": "2223:14:102",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 25173,
                              "name": "uint",
                              "nodeType": "ElementaryTypeName",
                              "src": "2223:4:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 25179,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 25175,
                              "name": "tree",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 25167,
                              "src": "2240:4:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                              }
                            },
                            "id": 25176,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "IDsToNodeIndexes",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 25077,
                            "src": "2240:21:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                              "typeString": "mapping(bytes32 => uint256)"
                            }
                          },
                          "id": 25178,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 25177,
                            "name": "_ID",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 25163,
                            "src": "2262:3:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "2240:26:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2223:43:102"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 25182,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 25180,
                            "name": "treeIndex",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 25174,
                            "src": "2281:9:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 25181,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "2294:1:102",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "2281:14:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 25427,
                          "nodeType": "Block",
                          "src": "3836:975:102",
                          "statements": [
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 25331,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 25329,
                                  "name": "_value",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 25161,
                                  "src": "3872:6:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "==",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 25330,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "3882:1:102",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "3872:11:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": {
                                "condition": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 25381,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 25376,
                                    "name": "_value",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 25161,
                                    "src": "4384:6:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "!=",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "baseExpression": {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 25377,
                                        "name": "tree",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 25167,
                                        "src": "4394:4:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                          "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                        }
                                      },
                                      "id": 25378,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "nodes",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 25073,
                                      "src": "4394:10:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                        "typeString": "uint256[] storage ref"
                                      }
                                    },
                                    "id": 25380,
                                    "indexExpression": {
                                      "argumentTypes": null,
                                      "id": 25379,
                                      "name": "treeIndex",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 25174,
                                      "src": "4405:9:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "4394:21:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "4384:31:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "falseBody": null,
                                "id": 25425,
                                "nodeType": "IfStatement",
                                "src": "4380:421:102",
                                "trueBody": {
                                  "id": 25424,
                                  "nodeType": "Block",
                                  "src": "4417:384:102",
                                  "statements": [
                                    {
                                      "assignments": [
                                        25383
                                      ],
                                      "declarations": [
                                        {
                                          "constant": false,
                                          "id": 25383,
                                          "mutability": "mutable",
                                          "name": "plusOrMinus",
                                          "nodeType": "VariableDeclaration",
                                          "overrides": null,
                                          "scope": 25424,
                                          "src": "4483:16:102",
                                          "stateVariable": false,
                                          "storageLocation": "default",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                          },
                                          "typeName": {
                                            "id": 25382,
                                            "name": "bool",
                                            "nodeType": "ElementaryTypeName",
                                            "src": "4483:4:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_bool",
                                              "typeString": "bool"
                                            }
                                          },
                                          "value": null,
                                          "visibility": "internal"
                                        }
                                      ],
                                      "id": 25390,
                                      "initialValue": {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "id": 25389,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "baseExpression": {
                                            "argumentTypes": null,
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 25384,
                                              "name": "tree",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 25167,
                                              "src": "4502:4:102",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                              }
                                            },
                                            "id": 25385,
                                            "isConstant": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "nodes",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 25073,
                                            "src": "4502:10:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                              "typeString": "uint256[] storage ref"
                                            }
                                          },
                                          "id": 25387,
                                          "indexExpression": {
                                            "argumentTypes": null,
                                            "id": 25386,
                                            "name": "treeIndex",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 25174,
                                            "src": "4513:9:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "nodeType": "IndexAccess",
                                          "src": "4502:21:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "<=",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "id": 25388,
                                          "name": "_value",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25161,
                                          "src": "4527:6:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "src": "4502:31:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        }
                                      },
                                      "nodeType": "VariableDeclarationStatement",
                                      "src": "4483:50:102"
                                    },
                                    {
                                      "assignments": [
                                        25392
                                      ],
                                      "declarations": [
                                        {
                                          "constant": false,
                                          "id": 25392,
                                          "mutability": "mutable",
                                          "name": "plusOrMinusValue",
                                          "nodeType": "VariableDeclaration",
                                          "overrides": null,
                                          "scope": 25424,
                                          "src": "4551:21:102",
                                          "stateVariable": false,
                                          "storageLocation": "default",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          "typeName": {
                                            "id": 25391,
                                            "name": "uint",
                                            "nodeType": "ElementaryTypeName",
                                            "src": "4551:4:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "value": null,
                                          "visibility": "internal"
                                        }
                                      ],
                                      "id": 25407,
                                      "initialValue": {
                                        "argumentTypes": null,
                                        "condition": {
                                          "argumentTypes": null,
                                          "id": 25393,
                                          "name": "plusOrMinus",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25383,
                                          "src": "4575:11:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                          }
                                        },
                                        "falseExpression": {
                                          "argumentTypes": null,
                                          "commonType": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          "id": 25405,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftExpression": {
                                            "argumentTypes": null,
                                            "baseExpression": {
                                              "argumentTypes": null,
                                              "expression": {
                                                "argumentTypes": null,
                                                "id": 25400,
                                                "name": "tree",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 25167,
                                                "src": "4622:4:102",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                                  "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                                }
                                              },
                                              "id": 25401,
                                              "isConstant": false,
                                              "isLValue": true,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "memberName": "nodes",
                                              "nodeType": "MemberAccess",
                                              "referencedDeclaration": 25073,
                                              "src": "4622:10:102",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                                "typeString": "uint256[] storage ref"
                                              }
                                            },
                                            "id": 25403,
                                            "indexExpression": {
                                              "argumentTypes": null,
                                              "id": 25402,
                                              "name": "treeIndex",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 25174,
                                              "src": "4633:9:102",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "isConstant": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "nodeType": "IndexAccess",
                                            "src": "4622:21:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "nodeType": "BinaryOperation",
                                          "operator": "-",
                                          "rightExpression": {
                                            "argumentTypes": null,
                                            "id": 25404,
                                            "name": "_value",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 25161,
                                            "src": "4646:6:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "src": "4622:30:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "id": 25406,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "nodeType": "Conditional",
                                        "src": "4575:77:102",
                                        "trueExpression": {
                                          "argumentTypes": null,
                                          "commonType": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          "id": 25399,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "leftExpression": {
                                            "argumentTypes": null,
                                            "id": 25394,
                                            "name": "_value",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 25161,
                                            "src": "4589:6:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "nodeType": "BinaryOperation",
                                          "operator": "-",
                                          "rightExpression": {
                                            "argumentTypes": null,
                                            "baseExpression": {
                                              "argumentTypes": null,
                                              "expression": {
                                                "argumentTypes": null,
                                                "id": 25395,
                                                "name": "tree",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 25167,
                                                "src": "4598:4:102",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                                  "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                                }
                                              },
                                              "id": 25396,
                                              "isConstant": false,
                                              "isLValue": true,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "memberName": "nodes",
                                              "nodeType": "MemberAccess",
                                              "referencedDeclaration": 25073,
                                              "src": "4598:10:102",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                                "typeString": "uint256[] storage ref"
                                              }
                                            },
                                            "id": 25398,
                                            "indexExpression": {
                                              "argumentTypes": null,
                                              "id": 25397,
                                              "name": "treeIndex",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 25174,
                                              "src": "4609:9:102",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "isConstant": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "nodeType": "IndexAccess",
                                            "src": "4598:21:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "src": "4589:30:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "VariableDeclarationStatement",
                                      "src": "4551:101:102"
                                    },
                                    {
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 25414,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                          "argumentTypes": null,
                                          "baseExpression": {
                                            "argumentTypes": null,
                                            "expression": {
                                              "argumentTypes": null,
                                              "id": 25408,
                                              "name": "tree",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 25167,
                                              "src": "4670:4:102",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                              }
                                            },
                                            "id": 25411,
                                            "isConstant": false,
                                            "isLValue": true,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "memberName": "nodes",
                                            "nodeType": "MemberAccess",
                                            "referencedDeclaration": 25073,
                                            "src": "4670:10:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                              "typeString": "uint256[] storage ref"
                                            }
                                          },
                                          "id": 25412,
                                          "indexExpression": {
                                            "argumentTypes": null,
                                            "id": 25410,
                                            "name": "treeIndex",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 25174,
                                            "src": "4681:9:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": true,
                                          "nodeType": "IndexAccess",
                                          "src": "4670:21:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                          "argumentTypes": null,
                                          "id": 25413,
                                          "name": "_value",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25161,
                                          "src": "4694:6:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "src": "4670:30:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 25415,
                                      "nodeType": "ExpressionStatement",
                                      "src": "4670:30:102"
                                    },
                                    {
                                      "expression": {
                                        "argumentTypes": null,
                                        "arguments": [
                                          {
                                            "argumentTypes": null,
                                            "id": 25417,
                                            "name": "self",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 25157,
                                            "src": "4733:4:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                                              "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees storage pointer"
                                            }
                                          },
                                          {
                                            "argumentTypes": null,
                                            "id": 25418,
                                            "name": "_key",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 25159,
                                            "src": "4739:4:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_bytes32",
                                              "typeString": "bytes32"
                                            }
                                          },
                                          {
                                            "argumentTypes": null,
                                            "id": 25419,
                                            "name": "treeIndex",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 25174,
                                            "src": "4745:9:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          {
                                            "argumentTypes": null,
                                            "id": 25420,
                                            "name": "plusOrMinus",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 25383,
                                            "src": "4756:11:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_bool",
                                              "typeString": "bool"
                                            }
                                          },
                                          {
                                            "argumentTypes": null,
                                            "id": 25421,
                                            "name": "plusOrMinusValue",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 25392,
                                            "src": "4769:16:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": [
                                            {
                                              "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                                              "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees storage pointer"
                                            },
                                            {
                                              "typeIdentifier": "t_bytes32",
                                              "typeString": "bytes32"
                                            },
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            },
                                            {
                                              "typeIdentifier": "t_bool",
                                              "typeString": "bool"
                                            },
                                            {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          ],
                                          "id": 25416,
                                          "name": "updateParents",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25789,
                                          "src": "4719:13:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_SortitionSumTrees_$25087_storage_ptr_$_t_bytes32_$_t_uint256_$_t_bool_$_t_uint256_$returns$__$",
                                            "typeString": "function (struct SortitionSumTreeFactory.SortitionSumTrees storage pointer,bytes32,uint256,bool,uint256)"
                                          }
                                        },
                                        "id": 25422,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "kind": "functionCall",
                                        "lValueRequested": false,
                                        "names": [],
                                        "nodeType": "FunctionCall",
                                        "src": "4719:67:102",
                                        "tryCall": false,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_tuple$__$",
                                          "typeString": "tuple()"
                                        }
                                      },
                                      "id": 25423,
                                      "nodeType": "ExpressionStatement",
                                      "src": "4719:67:102"
                                    }
                                  ]
                                }
                              },
                              "id": 25426,
                              "nodeType": "IfStatement",
                              "src": "3868:933:102",
                              "trueBody": {
                                "id": 25375,
                                "nodeType": "Block",
                                "src": "3885:489:102",
                                "statements": [
                                  {
                                    "assignments": [
                                      25333
                                    ],
                                    "declarations": [
                                      {
                                        "constant": false,
                                        "id": 25333,
                                        "mutability": "mutable",
                                        "name": "value",
                                        "nodeType": "VariableDeclaration",
                                        "overrides": null,
                                        "scope": 25375,
                                        "src": "3993:10:102",
                                        "stateVariable": false,
                                        "storageLocation": "default",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "typeName": {
                                          "id": 25332,
                                          "name": "uint",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "3993:4:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "value": null,
                                        "visibility": "internal"
                                      }
                                    ],
                                    "id": 25338,
                                    "initialValue": {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 25334,
                                          "name": "tree",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25167,
                                          "src": "4006:4:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                            "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                          }
                                        },
                                        "id": 25335,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "nodes",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 25073,
                                        "src": "4006:10:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                          "typeString": "uint256[] storage ref"
                                        }
                                      },
                                      "id": 25337,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 25336,
                                        "name": "treeIndex",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 25174,
                                        "src": "4017:9:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "4006:21:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "VariableDeclarationStatement",
                                    "src": "3993:34:102"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 25345,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "baseExpression": {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 25339,
                                            "name": "tree",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 25167,
                                            "src": "4045:4:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                              "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                            }
                                          },
                                          "id": 25342,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "nodes",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 25073,
                                          "src": "4045:10:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                            "typeString": "uint256[] storage ref"
                                          }
                                        },
                                        "id": 25343,
                                        "indexExpression": {
                                          "argumentTypes": null,
                                          "id": 25341,
                                          "name": "treeIndex",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25174,
                                          "src": "4056:9:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": true,
                                        "nodeType": "IndexAccess",
                                        "src": "4045:21:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "hexValue": "30",
                                        "id": 25344,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "number",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "4069:1:102",
                                        "subdenomination": null,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_rational_0_by_1",
                                          "typeString": "int_const 0"
                                        },
                                        "value": "0"
                                      },
                                      "src": "4045:25:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 25346,
                                    "nodeType": "ExpressionStatement",
                                    "src": "4045:25:102"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 25352,
                                          "name": "treeIndex",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25174,
                                          "src": "4139:9:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "expression": {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 25347,
                                            "name": "tree",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 25167,
                                            "src": "4123:4:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                              "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                            }
                                          },
                                          "id": 25350,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "stack",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 25070,
                                          "src": "4123:10:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                            "typeString": "uint256[] storage ref"
                                          }
                                        },
                                        "id": 25351,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "push",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": null,
                                        "src": "4123:15:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_arraypush_nonpayable$_t_uint256_$returns$__$",
                                          "typeString": "function (uint256)"
                                        }
                                      },
                                      "id": 25353,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "4123:26:102",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 25354,
                                    "nodeType": "ExpressionStatement",
                                    "src": "4123:26:102"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 25359,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "UnaryOperation",
                                      "operator": "delete",
                                      "prefix": true,
                                      "src": "4200:33:102",
                                      "subExpression": {
                                        "argumentTypes": null,
                                        "baseExpression": {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 25355,
                                            "name": "tree",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 25167,
                                            "src": "4207:4:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                              "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                            }
                                          },
                                          "id": 25356,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "IDsToNodeIndexes",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 25077,
                                          "src": "4207:21:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                                            "typeString": "mapping(bytes32 => uint256)"
                                          }
                                        },
                                        "id": 25358,
                                        "indexExpression": {
                                          "argumentTypes": null,
                                          "id": 25357,
                                          "name": "_ID",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25163,
                                          "src": "4229:3:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                          }
                                        },
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": true,
                                        "nodeType": "IndexAccess",
                                        "src": "4207:26:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 25360,
                                    "nodeType": "ExpressionStatement",
                                    "src": "4200:33:102"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 25365,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "UnaryOperation",
                                      "operator": "delete",
                                      "prefix": true,
                                      "src": "4251:39:102",
                                      "subExpression": {
                                        "argumentTypes": null,
                                        "baseExpression": {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 25361,
                                            "name": "tree",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 25167,
                                            "src": "4258:4:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                              "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                            }
                                          },
                                          "id": 25362,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "nodeIndexesToIDs",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 25081,
                                          "src": "4258:21:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_mapping$_t_uint256_$_t_bytes32_$",
                                            "typeString": "mapping(uint256 => bytes32)"
                                          }
                                        },
                                        "id": 25364,
                                        "indexExpression": {
                                          "argumentTypes": null,
                                          "id": 25363,
                                          "name": "treeIndex",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25174,
                                          "src": "4280:9:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": true,
                                        "nodeType": "IndexAccess",
                                        "src": "4258:32:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        }
                                      },
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 25366,
                                    "nodeType": "ExpressionStatement",
                                    "src": "4251:39:102"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 25368,
                                          "name": "self",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25157,
                                          "src": "4323:4:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                                            "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees storage pointer"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 25369,
                                          "name": "_key",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25159,
                                          "src": "4329:4:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 25370,
                                          "name": "treeIndex",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25174,
                                          "src": "4335:9:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "hexValue": "66616c7365",
                                          "id": 25371,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "bool",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "4346:5:102",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                          },
                                          "value": "false"
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 25372,
                                          "name": "value",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25333,
                                          "src": "4353:5:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                                            "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees storage pointer"
                                          },
                                          {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                          },
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                          },
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "id": 25367,
                                        "name": "updateParents",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 25789,
                                        "src": "4309:13:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_SortitionSumTrees_$25087_storage_ptr_$_t_bytes32_$_t_uint256_$_t_bool_$_t_uint256_$returns$__$",
                                          "typeString": "function (struct SortitionSumTreeFactory.SortitionSumTrees storage pointer,bytes32,uint256,bool,uint256)"
                                        }
                                      },
                                      "id": 25373,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "4309:50:102",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 25374,
                                    "nodeType": "ExpressionStatement",
                                    "src": "4309:50:102"
                                  }
                                ]
                              }
                            }
                          ]
                        },
                        "id": 25428,
                        "nodeType": "IfStatement",
                        "src": "2277:2534:102",
                        "trueBody": {
                          "id": 25328,
                          "nodeType": "Block",
                          "src": "2297:1533:102",
                          "statements": [
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 25185,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 25183,
                                  "name": "_value",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 25161,
                                  "src": "2336:6:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "!=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 25184,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "2346:1:102",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "src": "2336:11:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 25327,
                              "nodeType": "IfStatement",
                              "src": "2332:1488:102",
                              "trueBody": {
                                "id": 25326,
                                "nodeType": "Block",
                                "src": "2349:1471:102",
                                "statements": [
                                  {
                                    "condition": {
                                      "argumentTypes": null,
                                      "commonType": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      },
                                      "id": 25190,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftExpression": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 25186,
                                            "name": "tree",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 25167,
                                            "src": "2446:4:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                              "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                            }
                                          },
                                          "id": 25187,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "stack",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 25070,
                                          "src": "2446:10:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                            "typeString": "uint256[] storage ref"
                                          }
                                        },
                                        "id": 25188,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "length",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": null,
                                        "src": "2446:17:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "BinaryOperation",
                                      "operator": "==",
                                      "rightExpression": {
                                        "argumentTypes": null,
                                        "hexValue": "30",
                                        "id": 25189,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "number",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "2467:1:102",
                                        "subdenomination": null,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_rational_0_by_1",
                                          "typeString": "int_const 0"
                                        },
                                        "value": "0"
                                      },
                                      "src": "2446:22:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "falseBody": {
                                      "id": 25300,
                                      "nodeType": "Block",
                                      "src": "3338:256:102",
                                      "statements": [
                                        {
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 25283,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftHandSide": {
                                              "argumentTypes": null,
                                              "id": 25274,
                                              "name": "treeIndex",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 25174,
                                              "src": "3440:9:102",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "nodeType": "Assignment",
                                            "operator": "=",
                                            "rightHandSide": {
                                              "argumentTypes": null,
                                              "baseExpression": {
                                                "argumentTypes": null,
                                                "expression": {
                                                  "argumentTypes": null,
                                                  "id": 25275,
                                                  "name": "tree",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 25167,
                                                  "src": "3452:4:102",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                                    "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                                  }
                                                },
                                                "id": 25276,
                                                "isConstant": false,
                                                "isLValue": true,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "stack",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 25070,
                                                "src": "3452:10:102",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                                  "typeString": "uint256[] storage ref"
                                                }
                                              },
                                              "id": 25282,
                                              "indexExpression": {
                                                "argumentTypes": null,
                                                "commonType": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                },
                                                "id": 25281,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                  "argumentTypes": null,
                                                  "expression": {
                                                    "argumentTypes": null,
                                                    "expression": {
                                                      "argumentTypes": null,
                                                      "id": 25277,
                                                      "name": "tree",
                                                      "nodeType": "Identifier",
                                                      "overloadedDeclarations": [],
                                                      "referencedDeclaration": 25167,
                                                      "src": "3463:4:102",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                                        "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                                      }
                                                    },
                                                    "id": 25278,
                                                    "isConstant": false,
                                                    "isLValue": true,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "stack",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": 25070,
                                                    "src": "3463:10:102",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                                      "typeString": "uint256[] storage ref"
                                                    }
                                                  },
                                                  "id": 25279,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "memberName": "length",
                                                  "nodeType": "MemberAccess",
                                                  "referencedDeclaration": null,
                                                  "src": "3463:17:102",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "-",
                                                "rightExpression": {
                                                  "argumentTypes": null,
                                                  "hexValue": "31",
                                                  "id": 25280,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": true,
                                                  "kind": "number",
                                                  "lValueRequested": false,
                                                  "nodeType": "Literal",
                                                  "src": "3483:1:102",
                                                  "subdenomination": null,
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_rational_1_by_1",
                                                    "typeString": "int_const 1"
                                                  },
                                                  "value": "1"
                                                },
                                                "src": "3463:21:102",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "isConstant": false,
                                              "isLValue": true,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "nodeType": "IndexAccess",
                                              "src": "3452:33:102",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "src": "3440:45:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 25284,
                                          "nodeType": "ExpressionStatement",
                                          "src": "3440:45:102"
                                        },
                                        {
                                          "expression": {
                                            "argumentTypes": null,
                                            "arguments": [],
                                            "expression": {
                                              "argumentTypes": [],
                                              "expression": {
                                                "argumentTypes": null,
                                                "expression": {
                                                  "argumentTypes": null,
                                                  "id": 25285,
                                                  "name": "tree",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 25167,
                                                  "src": "3507:4:102",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                                    "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                                  }
                                                },
                                                "id": 25288,
                                                "isConstant": false,
                                                "isLValue": true,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "stack",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 25070,
                                                "src": "3507:10:102",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                                  "typeString": "uint256[] storage ref"
                                                }
                                              },
                                              "id": 25289,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "memberName": "pop",
                                              "nodeType": "MemberAccess",
                                              "referencedDeclaration": null,
                                              "src": "3507:14:102",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_function_arraypop_nonpayable$__$returns$__$",
                                                "typeString": "function ()"
                                              }
                                            },
                                            "id": 25290,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "3507:16:102",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_tuple$__$",
                                              "typeString": "tuple()"
                                            }
                                          },
                                          "id": 25291,
                                          "nodeType": "ExpressionStatement",
                                          "src": "3507:16:102"
                                        },
                                        {
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 25298,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftHandSide": {
                                              "argumentTypes": null,
                                              "baseExpression": {
                                                "argumentTypes": null,
                                                "expression": {
                                                  "argumentTypes": null,
                                                  "id": 25292,
                                                  "name": "tree",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 25167,
                                                  "src": "3545:4:102",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                                    "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                                  }
                                                },
                                                "id": 25295,
                                                "isConstant": false,
                                                "isLValue": true,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "nodes",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 25073,
                                                "src": "3545:10:102",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                                  "typeString": "uint256[] storage ref"
                                                }
                                              },
                                              "id": 25296,
                                              "indexExpression": {
                                                "argumentTypes": null,
                                                "id": 25294,
                                                "name": "treeIndex",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 25174,
                                                "src": "3556:9:102",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "isConstant": false,
                                              "isLValue": true,
                                              "isPure": false,
                                              "lValueRequested": true,
                                              "nodeType": "IndexAccess",
                                              "src": "3545:21:102",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "nodeType": "Assignment",
                                            "operator": "=",
                                            "rightHandSide": {
                                              "argumentTypes": null,
                                              "id": 25297,
                                              "name": "_value",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 25161,
                                              "src": "3569:6:102",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "src": "3545:30:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 25299,
                                          "nodeType": "ExpressionStatement",
                                          "src": "3545:30:102"
                                        }
                                      ]
                                    },
                                    "id": 25301,
                                    "nodeType": "IfStatement",
                                    "src": "2442:1152:102",
                                    "trueBody": {
                                      "id": 25273,
                                      "nodeType": "Block",
                                      "src": "2470:862:102",
                                      "statements": [
                                        {
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 25195,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftHandSide": {
                                              "argumentTypes": null,
                                              "id": 25191,
                                              "name": "treeIndex",
                                              "nodeType": "Identifier",
                                              "overloadedDeclarations": [],
                                              "referencedDeclaration": 25174,
                                              "src": "2571:9:102",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "nodeType": "Assignment",
                                            "operator": "=",
                                            "rightHandSide": {
                                              "argumentTypes": null,
                                              "expression": {
                                                "argumentTypes": null,
                                                "expression": {
                                                  "argumentTypes": null,
                                                  "id": 25192,
                                                  "name": "tree",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 25167,
                                                  "src": "2583:4:102",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                                    "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                                  }
                                                },
                                                "id": 25193,
                                                "isConstant": false,
                                                "isLValue": true,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "nodes",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 25073,
                                                "src": "2583:10:102",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                                  "typeString": "uint256[] storage ref"
                                                }
                                              },
                                              "id": 25194,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "memberName": "length",
                                              "nodeType": "MemberAccess",
                                              "referencedDeclaration": null,
                                              "src": "2583:17:102",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              }
                                            },
                                            "src": "2571:29:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_uint256",
                                              "typeString": "uint256"
                                            }
                                          },
                                          "id": 25196,
                                          "nodeType": "ExpressionStatement",
                                          "src": "2571:29:102"
                                        },
                                        {
                                          "expression": {
                                            "argumentTypes": null,
                                            "arguments": [
                                              {
                                                "argumentTypes": null,
                                                "id": 25202,
                                                "name": "_value",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 25161,
                                                "src": "2638:6:102",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              }
                                            ],
                                            "expression": {
                                              "argumentTypes": [
                                                {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              ],
                                              "expression": {
                                                "argumentTypes": null,
                                                "expression": {
                                                  "argumentTypes": null,
                                                  "id": 25197,
                                                  "name": "tree",
                                                  "nodeType": "Identifier",
                                                  "overloadedDeclarations": [],
                                                  "referencedDeclaration": 25167,
                                                  "src": "2622:4:102",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                                    "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                                  }
                                                },
                                                "id": 25200,
                                                "isConstant": false,
                                                "isLValue": true,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "nodes",
                                                "nodeType": "MemberAccess",
                                                "referencedDeclaration": 25073,
                                                "src": "2622:10:102",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                                  "typeString": "uint256[] storage ref"
                                                }
                                              },
                                              "id": 25201,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "memberName": "push",
                                              "nodeType": "MemberAccess",
                                              "referencedDeclaration": null,
                                              "src": "2622:15:102",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_function_arraypush_nonpayable$_t_uint256_$returns$__$",
                                                "typeString": "function (uint256)"
                                              }
                                            },
                                            "id": 25203,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "kind": "functionCall",
                                            "lValueRequested": false,
                                            "names": [],
                                            "nodeType": "FunctionCall",
                                            "src": "2622:23:102",
                                            "tryCall": false,
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_tuple$__$",
                                              "typeString": "tuple()"
                                            }
                                          },
                                          "id": 25204,
                                          "nodeType": "ExpressionStatement",
                                          "src": "2622:23:102"
                                        },
                                        {
                                          "condition": {
                                            "argumentTypes": null,
                                            "commonType": {
                                              "typeIdentifier": "t_bool",
                                              "typeString": "bool"
                                            },
                                            "id": 25217,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftExpression": {
                                              "argumentTypes": null,
                                              "commonType": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              },
                                              "id": 25207,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "leftExpression": {
                                                "argumentTypes": null,
                                                "id": 25205,
                                                "name": "treeIndex",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 25174,
                                                "src": "2757:9:102",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "nodeType": "BinaryOperation",
                                              "operator": "!=",
                                              "rightExpression": {
                                                "argumentTypes": null,
                                                "hexValue": "31",
                                                "id": 25206,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "number",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "2770:1:102",
                                                "subdenomination": null,
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_rational_1_by_1",
                                                  "typeString": "int_const 1"
                                                },
                                                "value": "1"
                                              },
                                              "src": "2757:14:102",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                              }
                                            },
                                            "nodeType": "BinaryOperation",
                                            "operator": "&&",
                                            "rightExpression": {
                                              "argumentTypes": null,
                                              "commonType": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                              },
                                              "id": 25216,
                                              "isConstant": false,
                                              "isLValue": false,
                                              "isPure": false,
                                              "lValueRequested": false,
                                              "leftExpression": {
                                                "argumentTypes": null,
                                                "commonType": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                },
                                                "id": 25214,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "leftExpression": {
                                                  "argumentTypes": null,
                                                  "components": [
                                                    {
                                                      "argumentTypes": null,
                                                      "commonType": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      },
                                                      "id": 25210,
                                                      "isConstant": false,
                                                      "isLValue": false,
                                                      "isPure": false,
                                                      "lValueRequested": false,
                                                      "leftExpression": {
                                                        "argumentTypes": null,
                                                        "id": 25208,
                                                        "name": "treeIndex",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 25174,
                                                        "src": "2776:9:102",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_uint256",
                                                          "typeString": "uint256"
                                                        }
                                                      },
                                                      "nodeType": "BinaryOperation",
                                                      "operator": "-",
                                                      "rightExpression": {
                                                        "argumentTypes": null,
                                                        "hexValue": "31",
                                                        "id": 25209,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": true,
                                                        "kind": "number",
                                                        "lValueRequested": false,
                                                        "nodeType": "Literal",
                                                        "src": "2788:1:102",
                                                        "subdenomination": null,
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_rational_1_by_1",
                                                          "typeString": "int_const 1"
                                                        },
                                                        "value": "1"
                                                      },
                                                      "src": "2776:13:102",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      }
                                                    }
                                                  ],
                                                  "id": 25211,
                                                  "isConstant": false,
                                                  "isInlineArray": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "nodeType": "TupleExpression",
                                                  "src": "2775:15:102",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                },
                                                "nodeType": "BinaryOperation",
                                                "operator": "%",
                                                "rightExpression": {
                                                  "argumentTypes": null,
                                                  "expression": {
                                                    "argumentTypes": null,
                                                    "id": 25212,
                                                    "name": "tree",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 25167,
                                                    "src": "2793:4:102",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                                      "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                                    }
                                                  },
                                                  "id": 25213,
                                                  "isConstant": false,
                                                  "isLValue": true,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "memberName": "K",
                                                  "nodeType": "MemberAccess",
                                                  "referencedDeclaration": 25067,
                                                  "src": "2793:6:102",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                },
                                                "src": "2775:24:102",
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_uint256",
                                                  "typeString": "uint256"
                                                }
                                              },
                                              "nodeType": "BinaryOperation",
                                              "operator": "==",
                                              "rightExpression": {
                                                "argumentTypes": null,
                                                "hexValue": "30",
                                                "id": 25215,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "number",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "2803:1:102",
                                                "subdenomination": null,
                                                "typeDescriptions": {
                                                  "typeIdentifier": "t_rational_0_by_1",
                                                  "typeString": "int_const 0"
                                                },
                                                "value": "0"
                                              },
                                              "src": "2775:29:102",
                                              "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                              }
                                            },
                                            "src": "2757:47:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_bool",
                                              "typeString": "bool"
                                            }
                                          },
                                          "falseBody": null,
                                          "id": 25272,
                                          "nodeType": "IfStatement",
                                          "src": "2753:561:102",
                                          "trueBody": {
                                            "id": 25271,
                                            "nodeType": "Block",
                                            "src": "2806:508:102",
                                            "statements": [
                                              {
                                                "assignments": [
                                                  25219
                                                ],
                                                "declarations": [
                                                  {
                                                    "constant": false,
                                                    "id": 25219,
                                                    "mutability": "mutable",
                                                    "name": "parentIndex",
                                                    "nodeType": "VariableDeclaration",
                                                    "overrides": null,
                                                    "scope": 25271,
                                                    "src": "2851:16:102",
                                                    "stateVariable": false,
                                                    "storageLocation": "default",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_uint256",
                                                      "typeString": "uint256"
                                                    },
                                                    "typeName": {
                                                      "id": 25218,
                                                      "name": "uint",
                                                      "nodeType": "ElementaryTypeName",
                                                      "src": "2851:4:102",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      }
                                                    },
                                                    "value": null,
                                                    "visibility": "internal"
                                                  }
                                                ],
                                                "id": 25224,
                                                "initialValue": {
                                                  "argumentTypes": null,
                                                  "commonType": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  },
                                                  "id": 25223,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "leftExpression": {
                                                    "argumentTypes": null,
                                                    "id": 25220,
                                                    "name": "treeIndex",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 25174,
                                                    "src": "2870:9:102",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_uint256",
                                                      "typeString": "uint256"
                                                    }
                                                  },
                                                  "nodeType": "BinaryOperation",
                                                  "operator": "/",
                                                  "rightExpression": {
                                                    "argumentTypes": null,
                                                    "expression": {
                                                      "argumentTypes": null,
                                                      "id": 25221,
                                                      "name": "tree",
                                                      "nodeType": "Identifier",
                                                      "overloadedDeclarations": [],
                                                      "referencedDeclaration": 25167,
                                                      "src": "2882:4:102",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                                        "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                                      }
                                                    },
                                                    "id": 25222,
                                                    "isConstant": false,
                                                    "isLValue": true,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "K",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": 25067,
                                                    "src": "2882:6:102",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_uint256",
                                                      "typeString": "uint256"
                                                    }
                                                  },
                                                  "src": "2870:18:102",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                },
                                                "nodeType": "VariableDeclarationStatement",
                                                "src": "2851:37:102"
                                              },
                                              {
                                                "assignments": [
                                                  25226
                                                ],
                                                "declarations": [
                                                  {
                                                    "constant": false,
                                                    "id": 25226,
                                                    "mutability": "mutable",
                                                    "name": "parentID",
                                                    "nodeType": "VariableDeclaration",
                                                    "overrides": null,
                                                    "scope": 25271,
                                                    "src": "2914:16:102",
                                                    "stateVariable": false,
                                                    "storageLocation": "default",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_bytes32",
                                                      "typeString": "bytes32"
                                                    },
                                                    "typeName": {
                                                      "id": 25225,
                                                      "name": "bytes32",
                                                      "nodeType": "ElementaryTypeName",
                                                      "src": "2914:7:102",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes32",
                                                        "typeString": "bytes32"
                                                      }
                                                    },
                                                    "value": null,
                                                    "visibility": "internal"
                                                  }
                                                ],
                                                "id": 25231,
                                                "initialValue": {
                                                  "argumentTypes": null,
                                                  "baseExpression": {
                                                    "argumentTypes": null,
                                                    "expression": {
                                                      "argumentTypes": null,
                                                      "id": 25227,
                                                      "name": "tree",
                                                      "nodeType": "Identifier",
                                                      "overloadedDeclarations": [],
                                                      "referencedDeclaration": 25167,
                                                      "src": "2933:4:102",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                                        "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                                      }
                                                    },
                                                    "id": 25228,
                                                    "isConstant": false,
                                                    "isLValue": true,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "nodeIndexesToIDs",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": 25081,
                                                    "src": "2933:21:102",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_mapping$_t_uint256_$_t_bytes32_$",
                                                      "typeString": "mapping(uint256 => bytes32)"
                                                    }
                                                  },
                                                  "id": 25230,
                                                  "indexExpression": {
                                                    "argumentTypes": null,
                                                    "id": 25229,
                                                    "name": "parentIndex",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 25219,
                                                    "src": "2955:11:102",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_uint256",
                                                      "typeString": "uint256"
                                                    }
                                                  },
                                                  "isConstant": false,
                                                  "isLValue": true,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "nodeType": "IndexAccess",
                                                  "src": "2933:34:102",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes32",
                                                    "typeString": "bytes32"
                                                  }
                                                },
                                                "nodeType": "VariableDeclarationStatement",
                                                "src": "2914:53:102"
                                              },
                                              {
                                                "assignments": [
                                                  25233
                                                ],
                                                "declarations": [
                                                  {
                                                    "constant": false,
                                                    "id": 25233,
                                                    "mutability": "mutable",
                                                    "name": "newIndex",
                                                    "nodeType": "VariableDeclaration",
                                                    "overrides": null,
                                                    "scope": 25271,
                                                    "src": "2993:13:102",
                                                    "stateVariable": false,
                                                    "storageLocation": "default",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_uint256",
                                                      "typeString": "uint256"
                                                    },
                                                    "typeName": {
                                                      "id": 25232,
                                                      "name": "uint",
                                                      "nodeType": "ElementaryTypeName",
                                                      "src": "2993:4:102",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      }
                                                    },
                                                    "value": null,
                                                    "visibility": "internal"
                                                  }
                                                ],
                                                "id": 25237,
                                                "initialValue": {
                                                  "argumentTypes": null,
                                                  "commonType": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  },
                                                  "id": 25236,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "leftExpression": {
                                                    "argumentTypes": null,
                                                    "id": 25234,
                                                    "name": "treeIndex",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 25174,
                                                    "src": "3009:9:102",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_uint256",
                                                      "typeString": "uint256"
                                                    }
                                                  },
                                                  "nodeType": "BinaryOperation",
                                                  "operator": "+",
                                                  "rightExpression": {
                                                    "argumentTypes": null,
                                                    "hexValue": "31",
                                                    "id": 25235,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": true,
                                                    "kind": "number",
                                                    "lValueRequested": false,
                                                    "nodeType": "Literal",
                                                    "src": "3021:1:102",
                                                    "subdenomination": null,
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_rational_1_by_1",
                                                      "typeString": "int_const 1"
                                                    },
                                                    "value": "1"
                                                  },
                                                  "src": "3009:13:102",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                },
                                                "nodeType": "VariableDeclarationStatement",
                                                "src": "2993:29:102"
                                              },
                                              {
                                                "expression": {
                                                  "argumentTypes": null,
                                                  "arguments": [
                                                    {
                                                      "argumentTypes": null,
                                                      "baseExpression": {
                                                        "argumentTypes": null,
                                                        "expression": {
                                                          "argumentTypes": null,
                                                          "id": 25243,
                                                          "name": "tree",
                                                          "nodeType": "Identifier",
                                                          "overloadedDeclarations": [],
                                                          "referencedDeclaration": 25167,
                                                          "src": "3064:4:102",
                                                          "typeDescriptions": {
                                                            "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                                            "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                                          }
                                                        },
                                                        "id": 25244,
                                                        "isConstant": false,
                                                        "isLValue": true,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "nodes",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 25073,
                                                        "src": "3064:10:102",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                                          "typeString": "uint256[] storage ref"
                                                        }
                                                      },
                                                      "id": 25246,
                                                      "indexExpression": {
                                                        "argumentTypes": null,
                                                        "id": 25245,
                                                        "name": "parentIndex",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 25219,
                                                        "src": "3075:11:102",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_uint256",
                                                          "typeString": "uint256"
                                                        }
                                                      },
                                                      "isConstant": false,
                                                      "isLValue": true,
                                                      "isPure": false,
                                                      "lValueRequested": false,
                                                      "nodeType": "IndexAccess",
                                                      "src": "3064:23:102",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      }
                                                    }
                                                  ],
                                                  "expression": {
                                                    "argumentTypes": [
                                                      {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      }
                                                    ],
                                                    "expression": {
                                                      "argumentTypes": null,
                                                      "expression": {
                                                        "argumentTypes": null,
                                                        "id": 25238,
                                                        "name": "tree",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 25167,
                                                        "src": "3048:4:102",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                                          "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                                        }
                                                      },
                                                      "id": 25241,
                                                      "isConstant": false,
                                                      "isLValue": true,
                                                      "isPure": false,
                                                      "lValueRequested": false,
                                                      "memberName": "nodes",
                                                      "nodeType": "MemberAccess",
                                                      "referencedDeclaration": 25073,
                                                      "src": "3048:10:102",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                                        "typeString": "uint256[] storage ref"
                                                      }
                                                    },
                                                    "id": 25242,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "lValueRequested": false,
                                                    "memberName": "push",
                                                    "nodeType": "MemberAccess",
                                                    "referencedDeclaration": null,
                                                    "src": "3048:15:102",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_function_arraypush_nonpayable$_t_uint256_$returns$__$",
                                                      "typeString": "function (uint256)"
                                                    }
                                                  },
                                                  "id": 25247,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "kind": "functionCall",
                                                  "lValueRequested": false,
                                                  "names": [],
                                                  "nodeType": "FunctionCall",
                                                  "src": "3048:40:102",
                                                  "tryCall": false,
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_tuple$__$",
                                                    "typeString": "tuple()"
                                                  }
                                                },
                                                "id": 25248,
                                                "nodeType": "ExpressionStatement",
                                                "src": "3048:40:102"
                                              },
                                              {
                                                "expression": {
                                                  "argumentTypes": null,
                                                  "id": 25253,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "nodeType": "UnaryOperation",
                                                  "operator": "delete",
                                                  "prefix": true,
                                                  "src": "3114:41:102",
                                                  "subExpression": {
                                                    "argumentTypes": null,
                                                    "baseExpression": {
                                                      "argumentTypes": null,
                                                      "expression": {
                                                        "argumentTypes": null,
                                                        "id": 25249,
                                                        "name": "tree",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 25167,
                                                        "src": "3121:4:102",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                                          "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                                        }
                                                      },
                                                      "id": 25250,
                                                      "isConstant": false,
                                                      "isLValue": true,
                                                      "isPure": false,
                                                      "lValueRequested": false,
                                                      "memberName": "nodeIndexesToIDs",
                                                      "nodeType": "MemberAccess",
                                                      "referencedDeclaration": 25081,
                                                      "src": "3121:21:102",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_mapping$_t_uint256_$_t_bytes32_$",
                                                        "typeString": "mapping(uint256 => bytes32)"
                                                      }
                                                    },
                                                    "id": 25252,
                                                    "indexExpression": {
                                                      "argumentTypes": null,
                                                      "id": 25251,
                                                      "name": "parentIndex",
                                                      "nodeType": "Identifier",
                                                      "overloadedDeclarations": [],
                                                      "referencedDeclaration": 25219,
                                                      "src": "3143:11:102",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      }
                                                    },
                                                    "isConstant": false,
                                                    "isLValue": true,
                                                    "isPure": false,
                                                    "lValueRequested": true,
                                                    "nodeType": "IndexAccess",
                                                    "src": "3121:34:102",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_bytes32",
                                                      "typeString": "bytes32"
                                                    }
                                                  },
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_tuple$__$",
                                                    "typeString": "tuple()"
                                                  }
                                                },
                                                "id": 25254,
                                                "nodeType": "ExpressionStatement",
                                                "src": "3114:41:102"
                                              },
                                              {
                                                "expression": {
                                                  "argumentTypes": null,
                                                  "id": 25261,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "leftHandSide": {
                                                    "argumentTypes": null,
                                                    "baseExpression": {
                                                      "argumentTypes": null,
                                                      "expression": {
                                                        "argumentTypes": null,
                                                        "id": 25255,
                                                        "name": "tree",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 25167,
                                                        "src": "3181:4:102",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                                          "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                                        }
                                                      },
                                                      "id": 25258,
                                                      "isConstant": false,
                                                      "isLValue": true,
                                                      "isPure": false,
                                                      "lValueRequested": false,
                                                      "memberName": "IDsToNodeIndexes",
                                                      "nodeType": "MemberAccess",
                                                      "referencedDeclaration": 25077,
                                                      "src": "3181:21:102",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                                                        "typeString": "mapping(bytes32 => uint256)"
                                                      }
                                                    },
                                                    "id": 25259,
                                                    "indexExpression": {
                                                      "argumentTypes": null,
                                                      "id": 25257,
                                                      "name": "parentID",
                                                      "nodeType": "Identifier",
                                                      "overloadedDeclarations": [],
                                                      "referencedDeclaration": 25226,
                                                      "src": "3203:8:102",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes32",
                                                        "typeString": "bytes32"
                                                      }
                                                    },
                                                    "isConstant": false,
                                                    "isLValue": true,
                                                    "isPure": false,
                                                    "lValueRequested": true,
                                                    "nodeType": "IndexAccess",
                                                    "src": "3181:31:102",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_uint256",
                                                      "typeString": "uint256"
                                                    }
                                                  },
                                                  "nodeType": "Assignment",
                                                  "operator": "=",
                                                  "rightHandSide": {
                                                    "argumentTypes": null,
                                                    "id": 25260,
                                                    "name": "newIndex",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 25233,
                                                    "src": "3215:8:102",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_uint256",
                                                      "typeString": "uint256"
                                                    }
                                                  },
                                                  "src": "3181:42:102",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                  }
                                                },
                                                "id": 25262,
                                                "nodeType": "ExpressionStatement",
                                                "src": "3181:42:102"
                                              },
                                              {
                                                "expression": {
                                                  "argumentTypes": null,
                                                  "id": 25269,
                                                  "isConstant": false,
                                                  "isLValue": false,
                                                  "isPure": false,
                                                  "lValueRequested": false,
                                                  "leftHandSide": {
                                                    "argumentTypes": null,
                                                    "baseExpression": {
                                                      "argumentTypes": null,
                                                      "expression": {
                                                        "argumentTypes": null,
                                                        "id": 25263,
                                                        "name": "tree",
                                                        "nodeType": "Identifier",
                                                        "overloadedDeclarations": [],
                                                        "referencedDeclaration": 25167,
                                                        "src": "3249:4:102",
                                                        "typeDescriptions": {
                                                          "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                                          "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                                        }
                                                      },
                                                      "id": 25266,
                                                      "isConstant": false,
                                                      "isLValue": true,
                                                      "isPure": false,
                                                      "lValueRequested": false,
                                                      "memberName": "nodeIndexesToIDs",
                                                      "nodeType": "MemberAccess",
                                                      "referencedDeclaration": 25081,
                                                      "src": "3249:21:102",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_mapping$_t_uint256_$_t_bytes32_$",
                                                        "typeString": "mapping(uint256 => bytes32)"
                                                      }
                                                    },
                                                    "id": 25267,
                                                    "indexExpression": {
                                                      "argumentTypes": null,
                                                      "id": 25265,
                                                      "name": "newIndex",
                                                      "nodeType": "Identifier",
                                                      "overloadedDeclarations": [],
                                                      "referencedDeclaration": 25233,
                                                      "src": "3271:8:102",
                                                      "typeDescriptions": {
                                                        "typeIdentifier": "t_uint256",
                                                        "typeString": "uint256"
                                                      }
                                                    },
                                                    "isConstant": false,
                                                    "isLValue": true,
                                                    "isPure": false,
                                                    "lValueRequested": true,
                                                    "nodeType": "IndexAccess",
                                                    "src": "3249:31:102",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_bytes32",
                                                      "typeString": "bytes32"
                                                    }
                                                  },
                                                  "nodeType": "Assignment",
                                                  "operator": "=",
                                                  "rightHandSide": {
                                                    "argumentTypes": null,
                                                    "id": 25268,
                                                    "name": "parentID",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 25226,
                                                    "src": "3283:8:102",
                                                    "typeDescriptions": {
                                                      "typeIdentifier": "t_bytes32",
                                                      "typeString": "bytes32"
                                                    }
                                                  },
                                                  "src": "3249:42:102",
                                                  "typeDescriptions": {
                                                    "typeIdentifier": "t_bytes32",
                                                    "typeString": "bytes32"
                                                  }
                                                },
                                                "id": 25270,
                                                "nodeType": "ExpressionStatement",
                                                "src": "3249:42:102"
                                              }
                                            ]
                                          }
                                        }
                                      ]
                                    }
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 25308,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "baseExpression": {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 25302,
                                            "name": "tree",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 25167,
                                            "src": "3642:4:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                              "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                            }
                                          },
                                          "id": 25305,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "IDsToNodeIndexes",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 25077,
                                          "src": "3642:21:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                                            "typeString": "mapping(bytes32 => uint256)"
                                          }
                                        },
                                        "id": 25306,
                                        "indexExpression": {
                                          "argumentTypes": null,
                                          "id": 25304,
                                          "name": "_ID",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25163,
                                          "src": "3664:3:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                          }
                                        },
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": true,
                                        "nodeType": "IndexAccess",
                                        "src": "3642:26:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "id": 25307,
                                        "name": "treeIndex",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 25174,
                                        "src": "3671:9:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "3642:38:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 25309,
                                    "nodeType": "ExpressionStatement",
                                    "src": "3642:38:102"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 25316,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "baseExpression": {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 25310,
                                            "name": "tree",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 25167,
                                            "src": "3698:4:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                              "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                            }
                                          },
                                          "id": 25313,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "nodeIndexesToIDs",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 25081,
                                          "src": "3698:21:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_mapping$_t_uint256_$_t_bytes32_$",
                                            "typeString": "mapping(uint256 => bytes32)"
                                          }
                                        },
                                        "id": 25314,
                                        "indexExpression": {
                                          "argumentTypes": null,
                                          "id": 25312,
                                          "name": "treeIndex",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25174,
                                          "src": "3720:9:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": true,
                                        "nodeType": "IndexAccess",
                                        "src": "3698:32:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "id": 25315,
                                        "name": "_ID",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 25163,
                                        "src": "3733:3:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bytes32",
                                          "typeString": "bytes32"
                                        }
                                      },
                                      "src": "3698:38:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                      }
                                    },
                                    "id": 25317,
                                    "nodeType": "ExpressionStatement",
                                    "src": "3698:38:102"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "arguments": [
                                        {
                                          "argumentTypes": null,
                                          "id": 25319,
                                          "name": "self",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25157,
                                          "src": "3769:4:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                                            "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees storage pointer"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 25320,
                                          "name": "_key",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25159,
                                          "src": "3775:4:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 25321,
                                          "name": "treeIndex",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25174,
                                          "src": "3781:9:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        {
                                          "argumentTypes": null,
                                          "hexValue": "74727565",
                                          "id": 25322,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "bool",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "3792:4:102",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                          },
                                          "value": "true"
                                        },
                                        {
                                          "argumentTypes": null,
                                          "id": 25323,
                                          "name": "_value",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25161,
                                          "src": "3798:6:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                                            "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees storage pointer"
                                          },
                                          {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                          },
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          },
                                          {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                          },
                                          {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        ],
                                        "id": 25318,
                                        "name": "updateParents",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 25789,
                                        "src": "3755:13:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_SortitionSumTrees_$25087_storage_ptr_$_t_bytes32_$_t_uint256_$_t_bool_$_t_uint256_$returns$__$",
                                          "typeString": "function (struct SortitionSumTreeFactory.SortitionSumTrees storage pointer,bytes32,uint256,bool,uint256)"
                                        }
                                      },
                                      "id": 25324,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "functionCall",
                                      "lValueRequested": false,
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "3755:50:102",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_tuple$__$",
                                        "typeString": "tuple()"
                                      }
                                    },
                                    "id": 25325,
                                    "nodeType": "ExpressionStatement",
                                    "src": "3755:50:102"
                                  }
                                ]
                              }
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 25155,
                    "nodeType": "StructuredDocumentation",
                    "src": "1722:322:102",
                    "text": "  @dev Set a value of a tree.\n  @param _key The key of the tree.\n  @param _value The new value.\n  @param _ID The ID of the value.\n  `O(log_k(n))` where\n  `k` is the maximum number of childs per node in the tree,\n   and `n` is the maximum number of nodes ever appended."
                  },
                  "id": 25430,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "set",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 25164,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 25157,
                        "mutability": "mutable",
                        "name": "self",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25430,
                        "src": "2062:30:102",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                          "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 25156,
                          "name": "SortitionSumTrees",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 25087,
                          "src": "2062:17:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                            "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25159,
                        "mutability": "mutable",
                        "name": "_key",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25430,
                        "src": "2094:12:102",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 25158,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "2094:7:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25161,
                        "mutability": "mutable",
                        "name": "_value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25430,
                        "src": "2108:11:102",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 25160,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "2108:4:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25163,
                        "mutability": "mutable",
                        "name": "_ID",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25430,
                        "src": "2121:11:102",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 25162,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "2121:7:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "2061:72:102"
                  },
                  "returnParameters": {
                    "id": 25165,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "2143:0:102"
                  },
                  "scope": 25790,
                  "src": "2049:2768:102",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 25556,
                    "nodeType": "Block",
                    "src": "5619:824:102",
                    "statements": [
                      {
                        "assignments": [
                          25450
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 25450,
                            "mutability": "mutable",
                            "name": "tree",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 25556,
                            "src": "5629:29:102",
                            "stateVariable": false,
                            "storageLocation": "storage",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                              "typeString": "struct SortitionSumTreeFactory.SortitionSumTree"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 25449,
                              "name": "SortitionSumTree",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 25082,
                              "src": "5629:16:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTree"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 25455,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 25451,
                              "name": "self",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 25433,
                              "src": "5661:4:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees storage pointer"
                              }
                            },
                            "id": 25452,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sortitionSumTrees",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 25086,
                            "src": "5661:22:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_SortitionSumTree_$25082_storage_$",
                              "typeString": "mapping(bytes32 => struct SortitionSumTreeFactory.SortitionSumTree storage ref)"
                            }
                          },
                          "id": 25454,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 25453,
                            "name": "_key",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 25435,
                            "src": "5684:4:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "5661:28:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage",
                            "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "5629:60:102"
                      },
                      {
                        "body": {
                          "id": 25486,
                          "nodeType": "Block",
                          "src": "5778:137:102",
                          "statements": [
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 25478,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 25474,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "components": [
                                      {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "id": 25471,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 25468,
                                            "name": "tree",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 25450,
                                            "src": "5797:4:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                              "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                            }
                                          },
                                          "id": 25469,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "K",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 25067,
                                          "src": "5797:6:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "*",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "id": 25470,
                                          "name": "i",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25457,
                                          "src": "5806:1:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "src": "5797:10:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "id": 25472,
                                    "isConstant": false,
                                    "isInlineArray": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "TupleExpression",
                                    "src": "5796:12:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "+",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "hexValue": "31",
                                    "id": 25473,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "5811:1:102",
                                    "subdenomination": null,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_1_by_1",
                                      "typeString": "int_const 1"
                                    },
                                    "value": "1"
                                  },
                                  "src": "5796:16:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": ">=",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 25475,
                                      "name": "tree",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 25450,
                                      "src": "5816:4:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                        "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                      }
                                    },
                                    "id": 25476,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "nodes",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 25073,
                                    "src": "5816:10:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                      "typeString": "uint256[] storage ref"
                                    }
                                  },
                                  "id": 25477,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "length",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": null,
                                  "src": "5816:17:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "5796:37:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": null,
                              "id": 25485,
                              "nodeType": "IfStatement",
                              "src": "5792:113:102",
                              "trueBody": {
                                "id": 25484,
                                "nodeType": "Block",
                                "src": "5835:70:102",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 25481,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "id": 25479,
                                        "name": "startIndex",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 25442,
                                        "src": "5853:10:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "id": 25480,
                                        "name": "i",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 25457,
                                        "src": "5866:1:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "5853:14:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 25482,
                                    "nodeType": "ExpressionStatement",
                                    "src": "5853:14:102"
                                  },
                                  {
                                    "id": 25483,
                                    "nodeType": "Break",
                                    "src": "5885:5:102"
                                  }
                                ]
                              }
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 25464,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 25460,
                            "name": "i",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 25457,
                            "src": "5750:1:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 25461,
                                "name": "tree",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 25450,
                                "src": "5754:4:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                  "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                }
                              },
                              "id": 25462,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "nodes",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 25073,
                              "src": "5754:10:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                "typeString": "uint256[] storage ref"
                              }
                            },
                            "id": 25463,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "5754:17:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "5750:21:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 25487,
                        "initializationExpression": {
                          "assignments": [
                            25457
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 25457,
                              "mutability": "mutable",
                              "name": "i",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 25487,
                              "src": "5738:6:102",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 25456,
                                "name": "uint",
                                "nodeType": "ElementaryTypeName",
                                "src": "5738:4:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 25459,
                          "initialValue": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 25458,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "5747:1:102",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "5738:10:102"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 25466,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "5773:3:102",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 25465,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 25457,
                              "src": "5773:1:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 25467,
                          "nodeType": "ExpressionStatement",
                          "src": "5773:3:102"
                        },
                        "nodeType": "ForStatement",
                        "src": "5733:182:102"
                      },
                      {
                        "assignments": [
                          25489
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 25489,
                            "mutability": "mutable",
                            "name": "loopStartIndex",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 25556,
                            "src": "5952:19:102",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 25488,
                              "name": "uint",
                              "nodeType": "ElementaryTypeName",
                              "src": "5952:4:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 25493,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 25492,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 25490,
                            "name": "startIndex",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 25442,
                            "src": "5974:10:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "+",
                          "rightExpression": {
                            "argumentTypes": null,
                            "id": 25491,
                            "name": "_cursor",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 25437,
                            "src": "5987:7:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "5974:20:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "5952:42:102"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 25513,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 25494,
                            "name": "values",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 25445,
                            "src": "6004:6:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                              "typeString": "uint256[] memory"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "condition": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 25504,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "id": 25500,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "id": 25498,
                                      "name": "loopStartIndex",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 25489,
                                      "src": "6024:14:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "+",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "id": 25499,
                                      "name": "_count",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 25439,
                                      "src": "6041:6:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "src": "6024:23:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": ">",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 25501,
                                        "name": "tree",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 25450,
                                        "src": "6050:4:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                          "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                        }
                                      },
                                      "id": 25502,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "nodes",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 25073,
                                      "src": "6050:10:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                        "typeString": "uint256[] storage ref"
                                      }
                                    },
                                    "id": 25503,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "length",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": null,
                                    "src": "6050:17:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "6024:43:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "falseExpression": {
                                  "argumentTypes": null,
                                  "id": 25510,
                                  "name": "_count",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 25439,
                                  "src": "6107:6:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 25511,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "Conditional",
                                "src": "6024:89:102",
                                "trueExpression": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 25509,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 25505,
                                        "name": "tree",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 25450,
                                        "src": "6070:4:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                          "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                        }
                                      },
                                      "id": 25506,
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "nodes",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 25073,
                                      "src": "6070:10:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                        "typeString": "uint256[] storage ref"
                                      }
                                    },
                                    "id": 25507,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "length",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": null,
                                    "src": "6070:17:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "-",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 25508,
                                    "name": "loopStartIndex",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 25489,
                                    "src": "6090:14:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "6070:34:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "id": 25497,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "NewExpression",
                              "src": "6013:10:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_uint256_$dyn_memory_ptr_$",
                                "typeString": "function (uint256) pure returns (uint256[] memory)"
                              },
                              "typeName": {
                                "baseType": {
                                  "id": 25495,
                                  "name": "uint",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "6017:4:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "id": 25496,
                                "length": null,
                                "nodeType": "ArrayTypeName",
                                "src": "6017:6:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                                  "typeString": "uint256[]"
                                }
                              }
                            },
                            "id": 25512,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "6013:101:102",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                              "typeString": "uint256[] memory"
                            }
                          },
                          "src": "6004:110:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                            "typeString": "uint256[] memory"
                          }
                        },
                        "id": 25514,
                        "nodeType": "ExpressionStatement",
                        "src": "6004:110:102"
                      },
                      {
                        "assignments": [
                          25516
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 25516,
                            "mutability": "mutable",
                            "name": "valuesIndex",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 25556,
                            "src": "6124:16:102",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 25515,
                              "name": "uint",
                              "nodeType": "ElementaryTypeName",
                              "src": "6124:4:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 25518,
                        "initialValue": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 25517,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "6143:1:102",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "6124:20:102"
                      },
                      {
                        "body": {
                          "id": 25554,
                          "nodeType": "Block",
                          "src": "6212:225:102",
                          "statements": [
                            {
                              "condition": {
                                "argumentTypes": null,
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 25533,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "argumentTypes": null,
                                  "id": 25531,
                                  "name": "valuesIndex",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 25516,
                                  "src": "6230:11:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "<",
                                "rightExpression": {
                                  "argumentTypes": null,
                                  "id": 25532,
                                  "name": "_count",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 25439,
                                  "src": "6244:6:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "6230:20:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "falseBody": {
                                "id": 25552,
                                "nodeType": "Block",
                                "src": "6357:70:102",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 25549,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "id": 25547,
                                        "name": "hasMore",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 25447,
                                        "src": "6375:7:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "hexValue": "74727565",
                                        "id": 25548,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "kind": "bool",
                                        "lValueRequested": false,
                                        "nodeType": "Literal",
                                        "src": "6385:4:102",
                                        "subdenomination": null,
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_bool",
                                          "typeString": "bool"
                                        },
                                        "value": "true"
                                      },
                                      "src": "6375:14:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_bool",
                                        "typeString": "bool"
                                      }
                                    },
                                    "id": 25550,
                                    "nodeType": "ExpressionStatement",
                                    "src": "6375:14:102"
                                  },
                                  {
                                    "id": 25551,
                                    "nodeType": "Break",
                                    "src": "6407:5:102"
                                  }
                                ]
                              },
                              "id": 25553,
                              "nodeType": "IfStatement",
                              "src": "6226:201:102",
                              "trueBody": {
                                "id": 25546,
                                "nodeType": "Block",
                                "src": "6252:99:102",
                                "statements": [
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 25541,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "leftHandSide": {
                                        "argumentTypes": null,
                                        "baseExpression": {
                                          "argumentTypes": null,
                                          "id": 25534,
                                          "name": "values",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25445,
                                          "src": "6270:6:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                                            "typeString": "uint256[] memory"
                                          }
                                        },
                                        "id": 25536,
                                        "indexExpression": {
                                          "argumentTypes": null,
                                          "id": 25535,
                                          "name": "valuesIndex",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25516,
                                          "src": "6277:11:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": true,
                                        "nodeType": "IndexAccess",
                                        "src": "6270:19:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "nodeType": "Assignment",
                                      "operator": "=",
                                      "rightHandSide": {
                                        "argumentTypes": null,
                                        "baseExpression": {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 25537,
                                            "name": "tree",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 25450,
                                            "src": "6292:4:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                              "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                            }
                                          },
                                          "id": 25538,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "nodes",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 25073,
                                          "src": "6292:10:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                            "typeString": "uint256[] storage ref"
                                          }
                                        },
                                        "id": 25540,
                                        "indexExpression": {
                                          "argumentTypes": null,
                                          "id": 25539,
                                          "name": "j",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25520,
                                          "src": "6303:1:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "nodeType": "IndexAccess",
                                        "src": "6292:13:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "src": "6270:35:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 25542,
                                    "nodeType": "ExpressionStatement",
                                    "src": "6270:35:102"
                                  },
                                  {
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 25544,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "UnaryOperation",
                                      "operator": "++",
                                      "prefix": false,
                                      "src": "6323:13:102",
                                      "subExpression": {
                                        "argumentTypes": null,
                                        "id": 25543,
                                        "name": "valuesIndex",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 25516,
                                        "src": "6323:11:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "id": 25545,
                                    "nodeType": "ExpressionStatement",
                                    "src": "6323:13:102"
                                  }
                                ]
                              }
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 25527,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 25523,
                            "name": "j",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 25520,
                            "src": "6184:1:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 25524,
                                "name": "tree",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 25450,
                                "src": "6188:4:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                  "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                }
                              },
                              "id": 25525,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "nodes",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 25073,
                              "src": "6188:10:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                "typeString": "uint256[] storage ref"
                              }
                            },
                            "id": 25526,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "6188:17:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "6184:21:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 25555,
                        "initializationExpression": {
                          "assignments": [
                            25520
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 25520,
                              "mutability": "mutable",
                              "name": "j",
                              "nodeType": "VariableDeclaration",
                              "overrides": null,
                              "scope": 25555,
                              "src": "6159:6:102",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "typeName": {
                                "id": 25519,
                                "name": "uint",
                                "nodeType": "ElementaryTypeName",
                                "src": "6159:4:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "value": null,
                              "visibility": "internal"
                            }
                          ],
                          "id": 25522,
                          "initialValue": {
                            "argumentTypes": null,
                            "id": 25521,
                            "name": "loopStartIndex",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 25489,
                            "src": "6168:14:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "6159:23:102"
                        },
                        "loopExpression": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 25529,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "++",
                            "prefix": false,
                            "src": "6207:3:102",
                            "subExpression": {
                              "argumentTypes": null,
                              "id": 25528,
                              "name": "j",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 25520,
                              "src": "6207:1:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 25530,
                          "nodeType": "ExpressionStatement",
                          "src": "6207:3:102"
                        },
                        "nodeType": "ForStatement",
                        "src": "6154:283:102"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 25431,
                    "nodeType": "StructuredDocumentation",
                    "src": "4849:559:102",
                    "text": "  @dev Query the leaves of a tree. Note that if `startIndex == 0`, the tree is empty and the root node will be returned.\n  @param _key The key of the tree to get the leaves from.\n  @param _cursor The pagination cursor.\n  @param _count The number of items to return.\n  @return startIndex The index at which leaves start\n  @return values The values of the returned leaves\n  @return hasMore Whether there are more for pagination.\n  `O(n)` where\n  `n` is the maximum number of nodes ever appended."
                  },
                  "id": 25557,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "queryLeafs",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 25440,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 25433,
                        "mutability": "mutable",
                        "name": "self",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25557,
                        "src": "5442:30:102",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                          "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 25432,
                          "name": "SortitionSumTrees",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 25087,
                          "src": "5442:17:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                            "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25435,
                        "mutability": "mutable",
                        "name": "_key",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25557,
                        "src": "5482:12:102",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 25434,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "5482:7:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25437,
                        "mutability": "mutable",
                        "name": "_cursor",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25557,
                        "src": "5504:12:102",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 25436,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "5504:4:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25439,
                        "mutability": "mutable",
                        "name": "_count",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25557,
                        "src": "5526:11:102",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 25438,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "5526:4:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5432:111:102"
                  },
                  "returnParameters": {
                    "id": 25448,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 25442,
                        "mutability": "mutable",
                        "name": "startIndex",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25557,
                        "src": "5566:15:102",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 25441,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "5566:4:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25445,
                        "mutability": "mutable",
                        "name": "values",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25557,
                        "src": "5583:20:102",
                        "stateVariable": false,
                        "storageLocation": "memory",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr",
                          "typeString": "uint256[]"
                        },
                        "typeName": {
                          "baseType": {
                            "id": 25443,
                            "name": "uint",
                            "nodeType": "ElementaryTypeName",
                            "src": "5583:4:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 25444,
                          "length": null,
                          "nodeType": "ArrayTypeName",
                          "src": "5583:6:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr",
                            "typeString": "uint256[]"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25447,
                        "mutability": "mutable",
                        "name": "hasMore",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25557,
                        "src": "5605:12:102",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 25446,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "5605:4:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "5565:53:102"
                  },
                  "scope": 25790,
                  "src": "5413:1030:102",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 25652,
                    "nodeType": "Block",
                    "src": "6986:764:102",
                    "statements": [
                      {
                        "assignments": [
                          25570
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 25570,
                            "mutability": "mutable",
                            "name": "tree",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 25652,
                            "src": "6996:29:102",
                            "stateVariable": false,
                            "storageLocation": "storage",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                              "typeString": "struct SortitionSumTreeFactory.SortitionSumTree"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 25569,
                              "name": "SortitionSumTree",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 25082,
                              "src": "6996:16:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTree"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 25575,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 25571,
                              "name": "self",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 25560,
                              "src": "7028:4:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees storage pointer"
                              }
                            },
                            "id": 25572,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sortitionSumTrees",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 25086,
                            "src": "7028:22:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_SortitionSumTree_$25082_storage_$",
                              "typeString": "mapping(bytes32 => struct SortitionSumTreeFactory.SortitionSumTree storage ref)"
                            }
                          },
                          "id": 25574,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 25573,
                            "name": "_key",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 25562,
                            "src": "7051:4:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "7028:28:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage",
                            "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "6996:60:102"
                      },
                      {
                        "assignments": [
                          25577
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 25577,
                            "mutability": "mutable",
                            "name": "treeIndex",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 25652,
                            "src": "7066:14:102",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 25576,
                              "name": "uint",
                              "nodeType": "ElementaryTypeName",
                              "src": "7066:4:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 25579,
                        "initialValue": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 25578,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "7083:1:102",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "7066:18:102"
                      },
                      {
                        "assignments": [
                          25581
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 25581,
                            "mutability": "mutable",
                            "name": "currentDrawnNumber",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 25652,
                            "src": "7094:23:102",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 25580,
                              "name": "uint",
                              "nodeType": "ElementaryTypeName",
                              "src": "7094:4:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 25588,
                        "initialValue": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 25587,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 25582,
                            "name": "_drawnNumber",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 25564,
                            "src": "7120:12:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "%",
                          "rightExpression": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 25583,
                                "name": "tree",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 25570,
                                "src": "7135:4:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                  "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                }
                              },
                              "id": 25584,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "nodes",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 25073,
                              "src": "7135:10:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                "typeString": "uint256[] storage ref"
                              }
                            },
                            "id": 25586,
                            "indexExpression": {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 25585,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7146:1:102",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "7135:13:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "7120:28:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "7094:54:102"
                      },
                      {
                        "body": {
                          "body": {
                            "id": 25642,
                            "nodeType": "Block",
                            "src": "7292:396:102",
                            "statements": [
                              {
                                "assignments": [
                                  25612
                                ],
                                "declarations": [
                                  {
                                    "constant": false,
                                    "id": 25612,
                                    "mutability": "mutable",
                                    "name": "nodeIndex",
                                    "nodeType": "VariableDeclaration",
                                    "overrides": null,
                                    "scope": 25642,
                                    "src": "7333:14:102",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "typeName": {
                                      "id": 25611,
                                      "name": "uint",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "7333:4:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "value": null,
                                    "visibility": "internal"
                                  }
                                ],
                                "id": 25620,
                                "initialValue": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 25619,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "components": [
                                      {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "id": 25616,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "expression": {
                                            "argumentTypes": null,
                                            "id": 25613,
                                            "name": "tree",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 25570,
                                            "src": "7351:4:102",
                                            "typeDescriptions": {
                                              "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                              "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                            }
                                          },
                                          "id": 25614,
                                          "isConstant": false,
                                          "isLValue": true,
                                          "isPure": false,
                                          "lValueRequested": false,
                                          "memberName": "K",
                                          "nodeType": "MemberAccess",
                                          "referencedDeclaration": 25067,
                                          "src": "7351:6:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "*",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "id": 25615,
                                          "name": "treeIndex",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25577,
                                          "src": "7360:9:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "src": "7351:18:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "id": 25617,
                                    "isConstant": false,
                                    "isInlineArray": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "TupleExpression",
                                    "src": "7350:20:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "+",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 25618,
                                    "name": "i",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 25601,
                                    "src": "7373:1:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "7350:24:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "VariableDeclarationStatement",
                                "src": "7333:41:102"
                              },
                              {
                                "assignments": [
                                  25622
                                ],
                                "declarations": [
                                  {
                                    "constant": false,
                                    "id": 25622,
                                    "mutability": "mutable",
                                    "name": "nodeValue",
                                    "nodeType": "VariableDeclaration",
                                    "overrides": null,
                                    "scope": 25642,
                                    "src": "7392:14:102",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "typeName": {
                                      "id": 25621,
                                      "name": "uint",
                                      "nodeType": "ElementaryTypeName",
                                      "src": "7392:4:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "value": null,
                                    "visibility": "internal"
                                  }
                                ],
                                "id": 25627,
                                "initialValue": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 25623,
                                      "name": "tree",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 25570,
                                      "src": "7409:4:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                        "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                      }
                                    },
                                    "id": 25624,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "nodes",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 25073,
                                    "src": "7409:10:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                      "typeString": "uint256[] storage ref"
                                    }
                                  },
                                  "id": 25626,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 25625,
                                    "name": "nodeIndex",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 25612,
                                    "src": "7420:9:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "IndexAccess",
                                  "src": "7409:21:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "VariableDeclarationStatement",
                                "src": "7392:38:102"
                              },
                              {
                                "condition": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 25630,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "id": 25628,
                                    "name": "currentDrawnNumber",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 25581,
                                    "src": "7453:18:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": ">=",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 25629,
                                    "name": "nodeValue",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 25622,
                                    "src": "7475:9:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "7453:31:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bool",
                                    "typeString": "bool"
                                  }
                                },
                                "falseBody": {
                                  "id": 25640,
                                  "nodeType": "Block",
                                  "src": "7565:109:102",
                                  "statements": [
                                    {
                                      "expression": {
                                        "argumentTypes": null,
                                        "id": 25637,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                          "argumentTypes": null,
                                          "id": 25635,
                                          "name": "treeIndex",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25577,
                                          "src": "7607:9:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                          "argumentTypes": null,
                                          "id": 25636,
                                          "name": "nodeIndex",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25612,
                                          "src": "7619:9:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "src": "7607:21:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 25638,
                                      "nodeType": "ExpressionStatement",
                                      "src": "7607:21:102"
                                    },
                                    {
                                      "id": 25639,
                                      "nodeType": "Break",
                                      "src": "7650:5:102"
                                    }
                                  ]
                                },
                                "id": 25641,
                                "nodeType": "IfStatement",
                                "src": "7449:225:102",
                                "trueBody": {
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 25633,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftHandSide": {
                                      "argumentTypes": null,
                                      "id": 25631,
                                      "name": "currentDrawnNumber",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 25581,
                                      "src": "7486:18:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "Assignment",
                                    "operator": "-=",
                                    "rightHandSide": {
                                      "argumentTypes": null,
                                      "id": 25632,
                                      "name": "nodeValue",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 25622,
                                      "src": "7508:9:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "src": "7486:31:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 25634,
                                  "nodeType": "ExpressionStatement",
                                  "src": "7486:31:102"
                                }
                              }
                            ]
                          },
                          "condition": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 25607,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "id": 25604,
                              "name": "i",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 25601,
                              "src": "7274:1:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "<=",
                            "rightExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 25605,
                                "name": "tree",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 25570,
                                "src": "7279:4:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                  "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                }
                              },
                              "id": 25606,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "K",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 25067,
                              "src": "7279:6:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "7274:11:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "id": 25643,
                          "initializationExpression": {
                            "assignments": [
                              25601
                            ],
                            "declarations": [
                              {
                                "constant": false,
                                "id": 25601,
                                "mutability": "mutable",
                                "name": "i",
                                "nodeType": "VariableDeclaration",
                                "overrides": null,
                                "scope": 25643,
                                "src": "7262:6:102",
                                "stateVariable": false,
                                "storageLocation": "default",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "typeName": {
                                  "id": 25600,
                                  "name": "uint",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "7262:4:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "value": null,
                                "visibility": "internal"
                              }
                            ],
                            "id": 25603,
                            "initialValue": {
                              "argumentTypes": null,
                              "hexValue": "31",
                              "id": 25602,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7271:1:102",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_1_by_1",
                                "typeString": "int_const 1"
                              },
                              "value": "1"
                            },
                            "nodeType": "VariableDeclarationStatement",
                            "src": "7262:10:102"
                          },
                          "loopExpression": {
                            "expression": {
                              "argumentTypes": null,
                              "id": 25609,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "UnaryOperation",
                              "operator": "++",
                              "prefix": false,
                              "src": "7287:3:102",
                              "subExpression": {
                                "argumentTypes": null,
                                "id": 25608,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 25601,
                                "src": "7287:1:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 25610,
                            "nodeType": "ExpressionStatement",
                            "src": "7287:3:102"
                          },
                          "nodeType": "ForStatement",
                          "src": "7257:431:102"
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 25599,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 25595,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "argumentTypes": null,
                              "components": [
                                {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 25592,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 25589,
                                      "name": "tree",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 25570,
                                      "src": "7167:4:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                        "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                      }
                                    },
                                    "id": 25590,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "K",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 25067,
                                    "src": "7167:6:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "*",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "id": 25591,
                                    "name": "treeIndex",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 25577,
                                    "src": "7176:9:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "7167:18:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "id": 25593,
                              "isConstant": false,
                              "isInlineArray": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "TupleExpression",
                              "src": "7166:20:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "+",
                            "rightExpression": {
                              "argumentTypes": null,
                              "hexValue": "31",
                              "id": 25594,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "7189:1:102",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_1_by_1",
                                "typeString": "int_const 1"
                              },
                              "value": "1"
                            },
                            "src": "7166:24:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "<",
                          "rightExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 25596,
                                "name": "tree",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 25570,
                                "src": "7193:4:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                  "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                }
                              },
                              "id": 25597,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "nodes",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 25073,
                              "src": "7193:10:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                "typeString": "uint256[] storage ref"
                              }
                            },
                            "id": 25598,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "7193:17:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "7166:44:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 25644,
                        "nodeType": "WhileStatement",
                        "src": "7159:529:102"
                      },
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 25650,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "argumentTypes": null,
                            "id": 25645,
                            "name": "ID",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 25567,
                            "src": "7706:2:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "argumentTypes": null,
                            "baseExpression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 25646,
                                "name": "tree",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 25570,
                                "src": "7711:4:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                  "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                }
                              },
                              "id": 25647,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "nodeIndexesToIDs",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 25081,
                              "src": "7711:21:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_mapping$_t_uint256_$_t_bytes32_$",
                                "typeString": "mapping(uint256 => bytes32)"
                              }
                            },
                            "id": 25649,
                            "indexExpression": {
                              "argumentTypes": null,
                              "id": 25648,
                              "name": "treeIndex",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 25577,
                              "src": "7733:9:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "IndexAccess",
                            "src": "7711:32:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "src": "7706:37:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "id": 25651,
                        "nodeType": "ExpressionStatement",
                        "src": "7706:37:102"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 25558,
                    "nodeType": "StructuredDocumentation",
                    "src": "6449:419:102",
                    "text": "  @dev Draw an ID from a tree using a number. Note that this function reverts if the sum of all values in the tree is 0.\n  @param _key The key of the tree.\n  @param _drawnNumber The drawn number.\n  @return ID The drawn ID.\n  `O(k * log_k(n))` where\n  `k` is the maximum number of childs per node in the tree,\n   and `n` is the maximum number of nodes ever appended."
                  },
                  "id": 25653,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "draw",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 25565,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 25560,
                        "mutability": "mutable",
                        "name": "self",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25653,
                        "src": "6887:30:102",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                          "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 25559,
                          "name": "SortitionSumTrees",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 25087,
                          "src": "6887:17:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                            "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25562,
                        "mutability": "mutable",
                        "name": "_key",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25653,
                        "src": "6919:12:102",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 25561,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "6919:7:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25564,
                        "mutability": "mutable",
                        "name": "_drawnNumber",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25653,
                        "src": "6933:17:102",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 25563,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "6933:4:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6886:65:102"
                  },
                  "returnParameters": {
                    "id": 25568,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 25567,
                        "mutability": "mutable",
                        "name": "ID",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25653,
                        "src": "6974:10:102",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 25566,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "6974:7:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "6973:12:102"
                  },
                  "scope": 25790,
                  "src": "6873:877:102",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 25694,
                    "nodeType": "Block",
                    "src": "8052:214:102",
                    "statements": [
                      {
                        "assignments": [
                          25666
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 25666,
                            "mutability": "mutable",
                            "name": "tree",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 25694,
                            "src": "8062:29:102",
                            "stateVariable": false,
                            "storageLocation": "storage",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                              "typeString": "struct SortitionSumTreeFactory.SortitionSumTree"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 25665,
                              "name": "SortitionSumTree",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 25082,
                              "src": "8062:16:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTree"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 25671,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 25667,
                              "name": "self",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 25656,
                              "src": "8094:4:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees storage pointer"
                              }
                            },
                            "id": 25668,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sortitionSumTrees",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 25086,
                            "src": "8094:22:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_SortitionSumTree_$25082_storage_$",
                              "typeString": "mapping(bytes32 => struct SortitionSumTreeFactory.SortitionSumTree storage ref)"
                            }
                          },
                          "id": 25670,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 25669,
                            "name": "_key",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 25658,
                            "src": "8117:4:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "8094:28:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage",
                            "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "8062:60:102"
                      },
                      {
                        "assignments": [
                          25673
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 25673,
                            "mutability": "mutable",
                            "name": "treeIndex",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 25694,
                            "src": "8132:14:102",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 25672,
                              "name": "uint",
                              "nodeType": "ElementaryTypeName",
                              "src": "8132:4:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 25678,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 25674,
                              "name": "tree",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 25666,
                              "src": "8149:4:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                              }
                            },
                            "id": 25675,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "IDsToNodeIndexes",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 25077,
                            "src": "8149:21:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_uint256_$",
                              "typeString": "mapping(bytes32 => uint256)"
                            }
                          },
                          "id": 25677,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 25676,
                            "name": "_ID",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 25660,
                            "src": "8171:3:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "8149:26:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "8132:43:102"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 25681,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 25679,
                            "name": "treeIndex",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 25673,
                            "src": "8190:9:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 25680,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "8203:1:102",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "8190:14:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 25691,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftHandSide": {
                              "argumentTypes": null,
                              "id": 25686,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 25663,
                              "src": "8230:5:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "Assignment",
                            "operator": "=",
                            "rightHandSide": {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 25687,
                                  "name": "tree",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 25666,
                                  "src": "8238:4:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                    "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                  }
                                },
                                "id": 25688,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "nodes",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 25073,
                                "src": "8238:10:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                  "typeString": "uint256[] storage ref"
                                }
                              },
                              "id": 25690,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 25689,
                                "name": "treeIndex",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 25673,
                                "src": "8249:9:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "8238:21:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "8230:29:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 25692,
                          "nodeType": "ExpressionStatement",
                          "src": "8230:29:102"
                        },
                        "id": 25693,
                        "nodeType": "IfStatement",
                        "src": "8186:73:102",
                        "trueBody": {
                          "expression": {
                            "argumentTypes": null,
                            "id": 25684,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftHandSide": {
                              "argumentTypes": null,
                              "id": 25682,
                              "name": "value",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 25663,
                              "src": "8206:5:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "Assignment",
                            "operator": "=",
                            "rightHandSide": {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 25683,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "8214:1:102",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            },
                            "src": "8206:9:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 25685,
                          "nodeType": "ExpressionStatement",
                          "src": "8206:9:102"
                        }
                      }
                    ]
                  },
                  "documentation": {
                    "id": 25654,
                    "nodeType": "StructuredDocumentation",
                    "src": "7756:181:102",
                    "text": "@dev Gets a specified ID's associated value.\n  @param _key The key of the tree.\n  @param _ID The ID of the value.\n  @return value The associated value."
                  },
                  "id": 25695,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "stakeOf",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 25661,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 25656,
                        "mutability": "mutable",
                        "name": "self",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25695,
                        "src": "7959:30:102",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                          "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 25655,
                          "name": "SortitionSumTrees",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 25087,
                          "src": "7959:17:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                            "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25658,
                        "mutability": "mutable",
                        "name": "_key",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25695,
                        "src": "7991:12:102",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 25657,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "7991:7:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25660,
                        "mutability": "mutable",
                        "name": "_ID",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25695,
                        "src": "8005:11:102",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 25659,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "8005:7:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "7958:59:102"
                  },
                  "returnParameters": {
                    "id": 25664,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 25663,
                        "mutability": "mutable",
                        "name": "value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25695,
                        "src": "8040:10:102",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 25662,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "8040:4:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8039:12:102"
                  },
                  "scope": 25790,
                  "src": "7942:324:102",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 25726,
                    "nodeType": "Block",
                    "src": "8362:198:102",
                    "statements": [
                      {
                        "assignments": [
                          25705
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 25705,
                            "mutability": "mutable",
                            "name": "tree",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 25726,
                            "src": "8372:29:102",
                            "stateVariable": false,
                            "storageLocation": "storage",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                              "typeString": "struct SortitionSumTreeFactory.SortitionSumTree"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 25704,
                              "name": "SortitionSumTree",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 25082,
                              "src": "8372:16:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTree"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 25710,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 25706,
                              "name": "self",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 25697,
                              "src": "8404:4:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees storage pointer"
                              }
                            },
                            "id": 25707,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sortitionSumTrees",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 25086,
                            "src": "8404:22:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_SortitionSumTree_$25082_storage_$",
                              "typeString": "mapping(bytes32 => struct SortitionSumTreeFactory.SortitionSumTree storage ref)"
                            }
                          },
                          "id": 25709,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 25708,
                            "name": "_key",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 25699,
                            "src": "8427:4:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "8404:28:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage",
                            "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "8372:60:102"
                      },
                      {
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 25715,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 25711,
                                "name": "tree",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 25705,
                                "src": "8446:4:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                  "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                }
                              },
                              "id": 25712,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "nodes",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 25073,
                              "src": "8446:10:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                "typeString": "uint256[] storage ref"
                              }
                            },
                            "id": 25713,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "length",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "8446:17:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 25714,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "8467:1:102",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "8446:22:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 25724,
                          "nodeType": "Block",
                          "src": "8509:45:102",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "baseExpression": {
                                  "argumentTypes": null,
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 25719,
                                    "name": "tree",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 25705,
                                    "src": "8530:4:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                      "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                    }
                                  },
                                  "id": 25720,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "nodes",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 25073,
                                  "src": "8530:10:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                    "typeString": "uint256[] storage ref"
                                  }
                                },
                                "id": 25722,
                                "indexExpression": {
                                  "argumentTypes": null,
                                  "hexValue": "30",
                                  "id": 25721,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "8541:1:102",
                                  "subdenomination": null,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                },
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "nodeType": "IndexAccess",
                                "src": "8530:13:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "functionReturnParameters": 25703,
                              "id": 25723,
                              "nodeType": "Return",
                              "src": "8523:20:102"
                            }
                          ]
                        },
                        "id": 25725,
                        "nodeType": "IfStatement",
                        "src": "8442:112:102",
                        "trueBody": {
                          "id": 25718,
                          "nodeType": "Block",
                          "src": "8470:33:102",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "hexValue": "30",
                                "id": 25716,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "8491:1:102",
                                "subdenomination": null,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_0_by_1",
                                  "typeString": "int_const 0"
                                },
                                "value": "0"
                              },
                              "functionReturnParameters": 25703,
                              "id": 25717,
                              "nodeType": "Return",
                              "src": "8484:8:102"
                            }
                          ]
                        }
                      }
                    ]
                  },
                  "documentation": null,
                  "id": 25727,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "total",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 25700,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 25697,
                        "mutability": "mutable",
                        "name": "self",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25727,
                        "src": "8287:30:102",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                          "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 25696,
                          "name": "SortitionSumTrees",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 25087,
                          "src": "8287:17:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                            "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25699,
                        "mutability": "mutable",
                        "name": "_key",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25727,
                        "src": "8319:12:102",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 25698,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "8319:7:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8286:46:102"
                  },
                  "returnParameters": {
                    "id": 25703,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 25702,
                        "mutability": "mutable",
                        "name": "",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25727,
                        "src": "8356:4:102",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 25701,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "8356:4:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "8355:6:102"
                  },
                  "scope": 25790,
                  "src": "8272:288:102",
                  "stateMutability": "view",
                  "virtual": false,
                  "visibility": "internal"
                },
                {
                  "body": {
                    "id": 25788,
                    "nodeType": "Block",
                    "src": "9169:338:102",
                    "statements": [
                      {
                        "assignments": [
                          25742
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 25742,
                            "mutability": "mutable",
                            "name": "tree",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 25788,
                            "src": "9179:29:102",
                            "stateVariable": false,
                            "storageLocation": "storage",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                              "typeString": "struct SortitionSumTreeFactory.SortitionSumTree"
                            },
                            "typeName": {
                              "contractScope": null,
                              "id": 25741,
                              "name": "SortitionSumTree",
                              "nodeType": "UserDefinedTypeName",
                              "referencedDeclaration": 25082,
                              "src": "9179:16:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTree"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 25747,
                        "initialValue": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 25743,
                              "name": "self",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 25730,
                              "src": "9211:4:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                                "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees storage pointer"
                              }
                            },
                            "id": 25744,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sortitionSumTrees",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 25086,
                            "src": "9211:22:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_bytes32_$_t_struct$_SortitionSumTree_$25082_storage_$",
                              "typeString": "mapping(bytes32 => struct SortitionSumTreeFactory.SortitionSumTree storage ref)"
                            }
                          },
                          "id": 25746,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 25745,
                            "name": "_key",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 25732,
                            "src": "9234:4:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "9211:28:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage",
                            "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage ref"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "9179:60:102"
                      },
                      {
                        "assignments": [
                          25749
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 25749,
                            "mutability": "mutable",
                            "name": "parentIndex",
                            "nodeType": "VariableDeclaration",
                            "overrides": null,
                            "scope": 25788,
                            "src": "9250:16:102",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 25748,
                              "name": "uint",
                              "nodeType": "ElementaryTypeName",
                              "src": "9250:4:102",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "value": null,
                            "visibility": "internal"
                          }
                        ],
                        "id": 25751,
                        "initialValue": {
                          "argumentTypes": null,
                          "id": 25750,
                          "name": "_treeIndex",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 25734,
                          "src": "9269:10:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "9250:29:102"
                      },
                      {
                        "body": {
                          "id": 25786,
                          "nodeType": "Block",
                          "src": "9314:187:102",
                          "statements": [
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 25763,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "id": 25755,
                                  "name": "parentIndex",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 25749,
                                  "src": "9328:11:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 25762,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "argumentTypes": null,
                                    "components": [
                                      {
                                        "argumentTypes": null,
                                        "commonType": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        },
                                        "id": 25758,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                          "argumentTypes": null,
                                          "id": 25756,
                                          "name": "parentIndex",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25749,
                                          "src": "9343:11:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_uint256",
                                            "typeString": "uint256"
                                          }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "-",
                                        "rightExpression": {
                                          "argumentTypes": null,
                                          "hexValue": "31",
                                          "id": 25757,
                                          "isConstant": false,
                                          "isLValue": false,
                                          "isPure": true,
                                          "kind": "number",
                                          "lValueRequested": false,
                                          "nodeType": "Literal",
                                          "src": "9357:1:102",
                                          "subdenomination": null,
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_rational_1_by_1",
                                            "typeString": "int_const 1"
                                          },
                                          "value": "1"
                                        },
                                        "src": "9343:15:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "id": 25759,
                                    "isConstant": false,
                                    "isInlineArray": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "TupleExpression",
                                    "src": "9342:17:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "/",
                                  "rightExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 25760,
                                      "name": "tree",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 25742,
                                      "src": "9362:4:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                        "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                      }
                                    },
                                    "id": 25761,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "K",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 25067,
                                    "src": "9362:6:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "src": "9342:26:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "9328:40:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 25764,
                              "nodeType": "ExpressionStatement",
                              "src": "9328:40:102"
                            },
                            {
                              "expression": {
                                "argumentTypes": null,
                                "id": 25784,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "argumentTypes": null,
                                  "baseExpression": {
                                    "argumentTypes": null,
                                    "expression": {
                                      "argumentTypes": null,
                                      "id": 25765,
                                      "name": "tree",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 25742,
                                      "src": "9382:4:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                        "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                      }
                                    },
                                    "id": 25768,
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberName": "nodes",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 25073,
                                    "src": "9382:10:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                      "typeString": "uint256[] storage ref"
                                    }
                                  },
                                  "id": 25769,
                                  "indexExpression": {
                                    "argumentTypes": null,
                                    "id": 25767,
                                    "name": "parentIndex",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 25749,
                                    "src": "9393:11:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "nodeType": "IndexAccess",
                                  "src": "9382:23:102",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "argumentTypes": null,
                                  "condition": {
                                    "argumentTypes": null,
                                    "id": 25770,
                                    "name": "_plusOrMinus",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 25736,
                                    "src": "9408:12:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bool",
                                      "typeString": "bool"
                                    }
                                  },
                                  "falseExpression": {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "id": 25782,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 25777,
                                          "name": "tree",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25742,
                                          "src": "9458:4:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                            "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                          }
                                        },
                                        "id": 25778,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "nodes",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 25073,
                                        "src": "9458:10:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                          "typeString": "uint256[] storage ref"
                                        }
                                      },
                                      "id": 25780,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 25779,
                                        "name": "parentIndex",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 25749,
                                        "src": "9469:11:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "9458:23:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "-",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "id": 25781,
                                      "name": "_value",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 25738,
                                      "src": "9484:6:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "src": "9458:32:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 25783,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "nodeType": "Conditional",
                                  "src": "9408:82:102",
                                  "trueExpression": {
                                    "argumentTypes": null,
                                    "commonType": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    },
                                    "id": 25776,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "leftExpression": {
                                      "argumentTypes": null,
                                      "baseExpression": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 25771,
                                          "name": "tree",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": 25742,
                                          "src": "9423:4:102",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_SortitionSumTree_$25082_storage_ptr",
                                            "typeString": "struct SortitionSumTreeFactory.SortitionSumTree storage pointer"
                                          }
                                        },
                                        "id": 25772,
                                        "isConstant": false,
                                        "isLValue": true,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "nodes",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": 25073,
                                        "src": "9423:10:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_array$_t_uint256_$dyn_storage",
                                          "typeString": "uint256[] storage ref"
                                        }
                                      },
                                      "id": 25774,
                                      "indexExpression": {
                                        "argumentTypes": null,
                                        "id": 25773,
                                        "name": "parentIndex",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 25749,
                                        "src": "9434:11:102",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "isConstant": false,
                                      "isLValue": true,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "nodeType": "IndexAccess",
                                      "src": "9423:23:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "nodeType": "BinaryOperation",
                                    "operator": "+",
                                    "rightExpression": {
                                      "argumentTypes": null,
                                      "id": 25775,
                                      "name": "_value",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 25738,
                                      "src": "9449:6:102",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_uint256",
                                        "typeString": "uint256"
                                      }
                                    },
                                    "src": "9423:32:102",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "9382:108:102",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 25785,
                              "nodeType": "ExpressionStatement",
                              "src": "9382:108:102"
                            }
                          ]
                        },
                        "condition": {
                          "argumentTypes": null,
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 25754,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "argumentTypes": null,
                            "id": 25752,
                            "name": "parentIndex",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 25749,
                            "src": "9296:11:102",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "!=",
                          "rightExpression": {
                            "argumentTypes": null,
                            "hexValue": "30",
                            "id": 25753,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "9311:1:102",
                            "subdenomination": null,
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "9296:16:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 25787,
                        "nodeType": "WhileStatement",
                        "src": "9289:212:102"
                      }
                    ]
                  },
                  "documentation": {
                    "id": 25728,
                    "nodeType": "StructuredDocumentation",
                    "src": "8585:453:102",
                    "text": "  @dev Update all the parents of a node.\n  @param _key The key of the tree to update.\n  @param _treeIndex The index of the node to start from.\n  @param _plusOrMinus Wether to add (true) or substract (false).\n  @param _value The value to add or substract.\n  `O(log_k(n))` where\n  `k` is the maximum number of childs per node in the tree,\n   and `n` is the maximum number of nodes ever appended."
                  },
                  "id": 25789,
                  "implemented": true,
                  "kind": "function",
                  "modifiers": [],
                  "name": "updateParents",
                  "nodeType": "FunctionDefinition",
                  "overrides": null,
                  "parameters": {
                    "id": 25739,
                    "nodeType": "ParameterList",
                    "parameters": [
                      {
                        "constant": false,
                        "id": 25730,
                        "mutability": "mutable",
                        "name": "self",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25789,
                        "src": "9066:30:102",
                        "stateVariable": false,
                        "storageLocation": "storage",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                          "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees"
                        },
                        "typeName": {
                          "contractScope": null,
                          "id": 25729,
                          "name": "SortitionSumTrees",
                          "nodeType": "UserDefinedTypeName",
                          "referencedDeclaration": 25087,
                          "src": "9066:17:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_SortitionSumTrees_$25087_storage_ptr",
                            "typeString": "struct SortitionSumTreeFactory.SortitionSumTrees"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25732,
                        "mutability": "mutable",
                        "name": "_key",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25789,
                        "src": "9098:12:102",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        "typeName": {
                          "id": 25731,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "9098:7:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25734,
                        "mutability": "mutable",
                        "name": "_treeIndex",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25789,
                        "src": "9112:15:102",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 25733,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "9112:4:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25736,
                        "mutability": "mutable",
                        "name": "_plusOrMinus",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25789,
                        "src": "9129:17:102",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "typeName": {
                          "id": 25735,
                          "name": "bool",
                          "nodeType": "ElementaryTypeName",
                          "src": "9129:4:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      },
                      {
                        "constant": false,
                        "id": 25738,
                        "mutability": "mutable",
                        "name": "_value",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 25789,
                        "src": "9148:11:102",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 25737,
                          "name": "uint",
                          "nodeType": "ElementaryTypeName",
                          "src": "9148:4:102",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "src": "9065:95:102"
                  },
                  "returnParameters": {
                    "id": 25740,
                    "nodeType": "ParameterList",
                    "parameters": [],
                    "src": "9169:0:102"
                  },
                  "scope": 25790,
                  "src": "9043:464:102",
                  "stateMutability": "nonpayable",
                  "virtual": false,
                  "visibility": "private"
                }
              ],
              "scope": 25791,
              "src": "351:9158:102"
            }
          ],
          "src": "153:9357:102"
        },
        "id": 102
      }
    }
  }
}
